{"created_by":"Tampermonkey","version":"1","scripts":[{"name":"AC-baidu-重定向优化百度搜狗谷歌必应搜索_favicon_双列","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_prototypes":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["baidu.com","google.com","google.com.hk","google.com.jp","bing.com","duckduckgo.com","dogedoge.com","so.com"],"orig_excludes":["*://*.google*/sorry*","https://zhidao.baidu.com/*","https://*.zhidao.baidu.com/*","https://www.baidu.com/img/*","https://lens.google.com/*"],"orig_includes":["*://ipv6.baidu.com/*","*://www.baidu.com/*","*://www1.baidu.com/*","*://m.baidu.com/*","*://xueshu.baidu.com/s*","*://www.so.com/s?*","*://*.bing.com/*","*://encrypted.google.*/search*","*://*.google*/search*","*://*.google*/webhp*","*://*.zhihu.com/*","*://*duckduckgo.com/*","*://*.dogedoge.com/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-body","use_blockers":[],"use_connects":[],"use_excludes":["/(^[^:\\/#\\?]*:\\/\\/([^#\\?\\/]*\\.)?www\\.zhihu\\.com(:[0-9]{1,5})?\\/.*$)/","*://cn.bing.com/academic/*"],"use_includes":[],"use_matches":[]},"run_at":null,"tab_types":null,"unwrap":null},"storage":{"ts":1675000712186,"data":{"Config":"s{\"isRedirectEnable\":true,\"isAdsEnable\":true,\"isAutopage\":true,\"isBlockEnable\":true,\"isBlockDisplay\":false,\"isBlockBtnNotDisplay\":false,\"AdsStyleEnable\":true,\"baidu\":{\"name\":\"baidu\",\"AdsStyleMode\":\"3\",\"HuYanMode\":false,\"defaultBgUrl\":\"\",\"BgFit\":true},\"google\":{\"name\":\"google\",\"AdsStyleMode\":\"3\",\"HuYanMode\":false,\"defaultBgUrl\":\"\",\"BgFit\":true},\"bing\":{\"name\":\"bing\",\"AdsStyleMode\":\"3\",\"HuYanMode\":false,\"defaultBgUrl\":\"\",\"BgFit\":true},\"duck\":{\"name\":\"duck\",\"AdsStyleMode\":\"3\",\"HuYanMode\":false},\"doge\":{\"name\":\"doge\",\"AdsStyleMode\":\"3\",\"HuYanMode\":false},\"sogou\":{\"name\":\"sogou\",\"AdsStyleMode\":\"1\",\"HuYanMode\":false},\"zhihu\":{\"name\":\"zhihu\",\"AdsStyleMode\":\"0\",\"HuYanMode\":false},\"other\":{\"name\":\"other\",\"AdsStyleMode\":\"0\",\"HuYanMode\":false},\"Style_BaiduLite\":false,\"defaultHuYanColor\":\"#DEF1EF\",\"isUserColorEnable\":true,\"isFaviconEnable\":true,\"defaultFaviconUrl\":\"https://ae01.alicdn.com/kf/HTB1dRY0X8OD3KVjSZFFq6An9pXay.jpg\",\"doDisableSug\":true,\"isRightDisplayEnable\":true,\"isCounterEnable\":false,\"isALineEnable\":false,\"isUserStyleEnable\":false,\"normalizeDuck\":true,\"acceptLicense\":true,\"isEnLang\":false,\"isGooleInBaiduModeEnable\":false,\"UserBlockList\":[],\"UserStyleText\":\"/**计数器的颜色样式*/\\ndiv .AC-CounterT{\\n background: #FD9999;\\n}\\n/**百度样式区域**/\\nbody[baidu] {\\n position: relative;\\n \\n /**右侧栏的样式-其实不开启更好看一些*/\\n #content_right{\\n padding: 20px 15px 15px !important;\\n border-radius: 5px;\\n background-color: #FFFFFF66;\\n box-sizing: border-box;\\n box-shadow: 0 0 20px 2px rgba(0, 0, 0, .1);\\n -webkit-box-shadow: 0 0 20px 2px rgba(0, 0, 0, .1);\\n -moz-box-shadow: 0 0 20px 2px rgba(0, 0, 0, .1);\\n }\\n &:before{\\n position: fixed;\\n width: 100%;\\n height: 100%;\\n top: 0;\\n left: 0;\\n content: '';\\n background-image: url('https://img.tujidu.com/image/620210010b2cd.jpg');\\n background-size: 100% auto;\\n opacity: 0.6; /*背景图透明度=0.8,最大1*/\\n }\\n \\n /**隐藏首页的大图标-修复可能导致外援样式异常**/\\n #s_lg_img_new{\\n display:none !important;\\n }\\n \\n #wrapper #s_tab {\\n background-color: rgba(248, 248, 248, 0.4);\\n }\\n \\n #content_left>.c-container{\\n border-radius: 5px;\\n background-color: rgba(255,255,255, 0.6) !important; /*百度搜索块体的颜色;透明度=0.1,最大1*/\\n \\n h3{\\n background-color: rgba(248,248,248, 0.6) !important; /*百度搜索块体 - 标题的颜色;透明度=0.1,最大1*/\\n }\\n }\\n}\\nbody[google] {\\n\\n &:before {\\n position: fixed;\\n width: 100%;\\n height: 100%;\\n top: 0;\\n left: 0;\\n content: '';\\n background-image: url('https://img.tujidu.com/image/620210010b2cd.jpg');\\n background-size: 100% auto;\\n opacity: 0.8; /*背景图透明度=0.8,最大1*/\\n }\\n \\n #rso .g, .sfbg, .f6F9Be, .k8XOCe {\\n background-color: rgba(248,248,248, 0.6) !important; \\n }\\n \\n .sfbg{\\n margin-top: -10px;\\n }\\n \\n .yg51vc{\\n background-color: transparent !important; \\n }\\n}\\n\\n\",\"oldVersion\":\"26.04\",\"lastSaveTime\":1675000635073}"}},"enabled":true,"position":1,"file_url":"https://greasyfork.org/scripts/14178-ac-baidu-%E9%87%8D%E5%AE%9A%E5%90%91%E4%BC%98%E5%8C%96%E7%99%BE%E5%BA%A6%E6%90%9C%E7%8B%97%E8%B0%B7%E6%AD%8C%E6%90%9C%E7%B4%A2-%E5%8E%BB%E5%B9%BF%E5%91%8A-favicon-%E5%8F%8C%E5%88%97/code/AC-baidu:%E9%87%8D%E5%AE%9A%E5%90%91%E4%BC%98%E5%8C%96%E7%99%BE%E5%BA%A6%E6%90%9C%E7%8B%97%E8%B0%B7%E6%AD%8C%E6%90%9C%E7%B4%A2_%E5%8E%BB%E5%B9%BF%E5%91%8A_favicon_%E5%8F%8C%E5%88%97.user.js","uuid":"def11364-95c4-4033-9905-252c997ba732","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgQUMtYmFpZHUt6YeN5a6a5ZCR5LyY5YyW55m+5bqm5pCc54uX6LC35q2M5b+F5bqU5pCc57SiX2Zhdmljb25f5Y+M5YiXCi8vIEBuYW1lOmVuICAgIEFDLWJhaWR1LWdvb2dsZV9zb2dvdV9iaW5nX1JlZGlyZWN0UmVtb3ZlX2Zhdmljb25fYWRhd2F5X1R3b0xpbmUKLy8gQG5hbWU6emggICAgQUMtYmFpZHUt6YeN5a6a5ZCR5LyY5YyW55m+5bqm5pCc54uX6LC35q2M5b+F5bqU5pCc57SiX2Zhdmljb25f5Y+M5YiXCi8vIEBuYW1lOmphICAgIEFDLWJhaWR1LemHjeWumuWQkeacgOmBqeWMlkJhaWR144Gu5pCc54uX44GuR29vZ2xl44GuQmluZ+aknOe0oue1kOaenOOBruODquODgOOCpOODrOOCr+ODiOmZpOWOuytmYXZpY29uCi8vIEBkZXNjcmlwdGlvbiAgMS7nuZ7pgY7nmb7luqbjgIHmkJzni5fjgIHosLfmrYzjgIHlpb3mkJzmkJzntKLntZDmnpzkuK3nmoToh6rlt7HnmoTot7PovYnpj4jmjqXvvIznm7TmjqXoqKrllY/ljp/lp4vntrLpoIEt5Y+N5q2j6YO96IO955yL5oeCIDIu5paw5aKe6Ieq5a6a5LmJ572R56uZ5oum5oiq5Yqf6IO9IDPmt7vliqBGYXZpY29u5pi+56S6IDQu6aG16Z2iQ1NTIDUu5re75Yqg6K6h5pWwIDYu5byA5YWz6YCJ5oup5Lul5LiK5Yqf6IO9IDcu6Ieq5Yqo57+76aG15Yqf6IO9Ci8vIEBkZXNjcmlwdGlvbjplbiAgMS5ieXBhc3MgdGhlIHJlZGlyZWN0IGxpbmsgYXQgYmFpZHVcc29nb3VcZ29vZ2xlXGhhb3NvdTsgMi5yZW1vdmUgYWRzIGF0IGJhaWR1OyAzLmFkZCBGYXZpY29uIGZvciBlYWNoIHdlYnNpdGU7IDQucmVuZGVyIHlvdXIgb3duIHN0eWxlOyA1LmNvdW50ZXI7IDYuU3dpdGNoIHRvIGhhbmRsZSBhbGwgNy5BdXRvIFBhZ2VyCi8vIEBkZXNjcmlwdGlvbjpqYSAgMS7ov4Llm55CYWlkdeOAgVNvZ29144CBR29vZ2xl44CBSGFvc2915qSc57Si5qSc57Si57WQ5p6c44Gu5Lit44Gu6Ieq5YiG44Gu6YG356e744Oq44Oz44KvOyAyLkJhaWR144Gu5L2Z5YiG44Gq5bqD5ZGK44KS5Y+W44KK6Zmk44GPOyAzLuOCs+ODoeODs+ODiOOCkui/veWKoDsgNC7jg5rjg7zjgrjjga7jgqvjgrnjgr/jg6BDU1A7IDUu44Kr44Km44Oz44OI44KS6L+95YqgOyA2LuOCueOCpOODg+ODgeOBr+S7peS4iuOBruapn+iDveOCkumBuOaKnuOBl+OBvuOBmTsgNy7oh6rli5Xjg5rjg7zjgrjjgoHjgY/jgoouCi8vIEBpY29uICAgIGh0dHBzOi8vYWUwMS5hbGljZG4uY29tL2tmL0hhYzFhNTgwNTVjNTA0N2NkYjkxMzQ5ZTkxYWEyMDhkNWsuanBnCi8vIEBhdXRob3IgICAgQUMKLy8gQGxpY2Vuc2UgICAgR1BMLTMuMC1vbmx5Ci8vIEBjcmVhdGUgICAgIDIwMTUtMTEtMjUKLy8gQHJ1bi1hdCAgICAgZG9jdW1lbnQtYm9keQovLyBAdmVyc2lvbiAgICAyNi4wNAovLyBAY29ubmVjdCAgICBiYWlkdS5jb20KLy8gQGNvbm5lY3QgICAgZ29vZ2xlLmNvbQovLyBAY29ubmVjdCAgICBnb29nbGUuY29tLmhrCi8vIEBjb25uZWN0ICAgIGdvb2dsZS5jb20uanAKLy8gQGNvbm5lY3QgICAgYmluZy5jb20KLy8gQGNvbm5lY3QgICAgZHVja2R1Y2tnby5jb20KLy8gQGNvbm5lY3QgICAgZG9nZWRvZ2UuY29tCi8vIEBjb25uZWN0ICAgIHNvLmNvbQovLyBAaW5jbHVkZSAgICAqOi8vaXB2Ni5iYWlkdS5jb20vKgovLyBAaW5jbHVkZSAgICAqOi8vd3d3LmJhaWR1LmNvbS8qCi8vIEBpbmNsdWRlICAgICo6Ly93d3cxLmJhaWR1LmNvbS8qCi8vIEBpbmNsdWRlICAgICo6Ly9tLmJhaWR1LmNvbS8qCi8vIEBpbmNsdWRlICAgICo6Ly94dWVzaHUuYmFpZHUuY29tL3MqCi8vIEBpbmNsdWRlICAgICo6Ly93d3cuc28uY29tL3M/KgovLyBAaW5jbHVkZSAgICAqOi8vKi5iaW5nLmNvbS8qCi8vIEBpbmNsdWRlICAgICo6Ly9lbmNyeXB0ZWQuZ29vZ2xlLiovc2VhcmNoKgovLyBAaW5jbHVkZSAgICAqOi8vKi5nb29nbGUqL3NlYXJjaCoKLy8gQGluY2x1ZGUgICAgKjovLyouZ29vZ2xlKi93ZWJocCoKLy8gQGluY2x1ZGUgICAgKjovLyouemhpaHUuY29tLyoKLy8gQGluY2x1ZGUgICAgKjovLypkdWNrZHVja2dvLmNvbS8qCi8vIEBpbmNsdWRlICAgICo6Ly8qLmRvZ2Vkb2dlLmNvbS8qCi8vIEBleGNsdWRlICAgICo6Ly8qLmdvb2dsZSovc29ycnkqCi8vIEBleGNsdWRlICAgIGh0dHBzOi8vemhpZGFvLmJhaWR1LmNvbS8qCi8vIEBleGNsdWRlICAgIGh0dHBzOi8vKi56aGlkYW8uYmFpZHUuY29tLyoKLy8gQGV4Y2x1ZGUgICAgaHR0cHM6Ly93d3cuYmFpZHUuY29tL2ltZy8qCi8vIEBleGNsdWRlICAgIGh0dHBzOi8vbGVucy5nb29nbGUuY29tLyoKLy8gQHN1cHBvcnRVUkwgIGh0dHBzOi8vYWMudHVqaWR1LmNvbS8KLy8gQGhvbWUtdXJsICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1UVy9zY3JpcHRzLzE0MTc4Ci8vIEBob21lLXVybDIgIGh0dHBzOi8vZ2l0aHViLmNvbS9sYW5ncmVuMTM1My9HTV9zY3JpcHQKLy8gQGhvbWVwYWdlVVJMICBodHRwczovL2dyZWFzeWZvcmsub3JnL3poLVRXL3NjcmlwdHMvMTQxNzgKLy8gQGNvcHlyaWdodCAgMjAxNS0yMDIyLCBBQwovLyBAbGFzdG1vZGlmaWVkICAyMDIyLTEyLTA3Ci8vIEBmZWVkYmFjay11cmwgIGh0dHBzOi8vZ2l0aHViLmNvbS9sYW5ncmVuMTM1My9HTV9zY3JpcHQKLy8gQG5vdGUgICAgMjAyMi4xMi0wNy1WMjYuMDQg5L+u5aSN5b+F5bqU6ZSZ5L2N6Zeu6aKY77yb5LyY5YyW6LC35q2M5Y+M5YiX5Yqo55S76Zeu6aKYCi8vIEBub3RlICAgIDIwMjIuMDgtMjMtVjI2LjAzIOS/ruWkjeWboOiDjOaZr+WbvuW8lei1t+eahOeci+S4jea4heWtl+eahOmXrumimDvkv67lpI3nmb7luqbljZXliJfplJnkvY3pl67popg75L+u5aSNZ29vZ2xl6Ieq5a6a5LmJ5oyJ6ZKu5LiN5Y+v6KeBCi8vIEBub3RlICAgIDIwMjIuMDgtMjMtVjI2LjAyIOWKoOW/q+S7o+eggeaJp+ihjOmAn+W6pu+8m+WHj+WwkeWKqOeUu+aSleijgu+8m+abv+aNokNETueahG1kNeW6kwovLyBAbm90ZSAgICAyMDIyLjA4LTIyLVYyNi4wMSDlm6DnlLLnmYzmiYvmnK/lkozlhazlj7jkuovliqHlgZzmm7TkuoYy5Liq5pyI77yM55uu5YmN6KGl5LiK77yM5o6o6I2Q5pu05paw44CCIDEu5L+u5aSN55m+5bqm5Yqg6L2957yT5oWi55qE6Zeu6aKY77ybMi7kv67lpI3osLfmrYzmoLflvI/liqDovb3pobrluo/lvILluLjnmoTpl67popjvvJszLuaVtOS9k+S8mOWMluagt+W8j+WKoOi9veaXtumXtO+8jOabtOa1geeVheS6hgovLyBAbm90ZSAgICAyMDIyLjA2LTE4LVYyNS4wOSDkv67lpI3lj6/og73lh7rnjrDnmoTohJrmnKzlj4LmlbDor7vlj5blpLHotKXlr7zoh7TnmoTohJrmnKzkuI3miafooYznmoTlvILluLggJiDkv67lpI0g5oum5oiq6KeE5YiZ54m55q6K5Y+C5pWw55qE6Zeu6aKYICYg5pu05o2iQ0RO5Zyw5Z2ACi8vIEBub3RlICAgIDIwMjIuMDYtMTYtVjI1LjA2IOS8mOWMlumHjeWumuWQkemAu+i+ke+8jOmDqOWIhue9keermeWPqumcgOimgeeojeS9nOWkhOeQhu+8jOS4jeeUqOWBmuaOpeWPo+ivt+axguS6hu+8jOaEn+iwouS8l+WkmuaQnOe0ouW8leaTjueahOeJiOacrOi/reS7o+abtOaWsAovLyBAbm90ZSAgICAyMDIyLjA0LTA4LVYyNS4wNSDkuLvopoHkv67lpI1CbG9ja+WKn+iDve+8m+WFtuasoeS8mOWMluagt+W8j+WKoOi9vemAn+W6pi3lh4/lsJHmkpXoo4LmhJ8KLy8gQG5vdGUgICAgMjAyMi4wMy0wNy1WMjUuMDQg5L+u5aSN6LC35q2M44CB5b+F5bqU5qC35byP6Zeu6aKY77yb5L+u5aSN5bm25LyY5YyW5oum5oiq5Yqf6IO9Ci8vIEBub3RlICAgIDIwMjIuMDEtMjktVjI1LjAyIOS/ruWkjeiwt+atjOOAgeeZvuW6puOAgeW/heW6lOeahOmDqOWIhuagt+W8j+mUmeS9jeeahOmXrumimAovLyBAbm90ZSAgICAyMDIxLjEyLTA2LVYyNS4wMSDkv67lpI3nmb7luqbmoLflvI/lgY/lt6YgJiDkv67lpI3osLfmrYzmoLflvI/mmL7npLoKLy8gQG5vdGUgICAgMjAyMS4xMC0zMS1WMjQuMjkgZml4ZWQgTGVzcyByZXF1aXJlbWVudCBmb3IgZmFzdGVyIExvYWQKLy8gQG5vdGUgICAgMjAyMS4xMC0yOS1WMjQuMjcg56e76Zmk5b+F5bqU6IO96YCJ5oup55qE5bm/5ZGK77yb5aKe5Yqg6Ieq5a6a5LmJ5qC35byPbGVzc+eahOaUr+aMgQovLyBAbm90ZSAgICAyMDIxLjA5LTAyLVYyNC4yNiDkv67lpI3lv4XlupTlpJpmYXZpY29u77yM5L+u5aSN55m+5bqm55m+56eR6Zeu6aKY77yb5L+u5aSN6LC35q2M5LiA5Liq5bCP6Zeu6aKYCi8vIEBub3RlICAgIDIwMjEuMDctMTYtVjI0LjI1IOS/ruWkjeS4gOS4qmJ1Z++8m+WFvOWuueeZvuW6puS4i+aQnOe0ouiCoeelqHRhZ++8mwovLyBAbm90ZSAgICAyMDIxLjA2LTE1LVYyNC4yNCDmm7TmjaJjZG7lnLDlnYAKLy8gQG5vdGUgICAgMjAxNy4wNS4xMiAtPiAyMDIxLjA2LTE1ICYmIFY4LjYgLT4gVjI0LjI0IOWQhOenjeWQhOagt+eahOWOhuWPsuabtOaWsOiusOW9le+8jOS7juS4gOS4queJiOacrOi/reS7o+WIsOWPpuS4gOS4queJiOacrAovLyBAbm90ZSAgICAyMDE3LjA1LjEyLVY4LjQg5paw5aKe77ya6buY6K6k5bGP6JS96LC35q2M55qE5a6J5YWo5pCc57Si5Yqf6IO9Ci8vIEBub3RlICAgIDIwMTcuMDUuMDUtVjguMyDkv67lpI1pbmNsdWRl6IyD5Zu05aSq5bCP5a+86Ie055qE55m+5bqm55+l6YGT55qE5bGP6JS96Zeu6aKYCi8vIEBub3RlICAgIDIwMTcuMDUuMDQtVjguMiDnu4jkuo7kv67lpI3kuobnmb7luqbnn6XpgZPlm77niYfmm7/mjaLkuobmloflrZfnmoTov5nkuKrlpKdCVUc7IOmhuuS+v+WkhOeQhuS6hnN1cGVyYXBpLnpoaWRhby5iYWlkdS5jb207IOaWsOWinuiwt+atjOaQnOe0oue7k+aenOmHjeWumuWQkeWOu+mZpAovLyBAbm90ZSAgICAyMDE3LjA1LjA0LVY4LjEg57uI5LqO5L+u5aSN5LqG55m+5bqm55+l6YGT5Zu+54mH5pu/5o2i5LqG5paH5a2X55qE6L+Z5Liq5aSnQlVH77yM6aG65L6/5aSE55CG5LqGc3VwZXJhcGkuemhpZGFvLmJhaWR1LmNvbQovLyBAbm90ZSAgICAyMDE3LjA1LjA0LVY4LjAg57uI5LqO5L+u5aSN5LqG55m+5bqm55+l6YGT5Zu+54mH5pu/5o2i5LqG5paH5a2X55qE6L+Z5Liq5aSnQlVH77yM5b6F5rWL6K+VCi8vIEBub3RlICAgIDIwMTcuMDMuMjgtVjcuNiDkv67lpI3lnKhWaW9sZW50TW9ua2V55LiK55qE5LiN5pSv5oyB55qE6Zeu6aKYCi8vIEBub3RlICAgIDIwMTcuMDMuMjgtVjcuNSDlsJ3or5Xkv67lpI1jaHJvbWXkuIrnmoTpl67popgKLy8gQG5vdGUgICAgMjAxNy4wMy4yMS1WNy40IOWwneivleWkhOeQhkVkZ2XkuIrkuI3mlK/mjIHnmoTpl67popjvvIznu5Pmnpzlj5HnjrDmmK9FZGdl5pys6Lqr55qEVGFtcGVyTW9ua2V55pSv5oyB5pyJ6Zeu6aKYCi8vIEBub3RlICAgIDIwMTcuMDMuMTktVjcuMyDkv67lpI3miZPlvIDnmb7luqbkuYvlkI7lho3mrKHngrnlh7vigJznmb7luqbkuIDkuIvigJ3lr7zoh7TnmoTml6Dms5Xmm7TmlrDph43lrprlkJHpl67popgKLy8gQG5vdGUgICAgMjAxNy4wMy4xOS1WNy4yIOacquefpeWOn+WboGNocm9tZeeahE11dGF0aW9uT2JzZXJ2ZXLml6Dms5Xkvb/nlKjkuobvvIznu6fnu63lm57lvZLku6XliY3nmoRET01Ob2RlSW5zZXJ0ZWQKLy8gQG5vdGUgICAgMjAxNy4wMi4xNy1WNy4wIOS/ruWkjeaQnOeLl+eahOaQnOe0oue7k+aenOmHjeWumuWQkemXrumimCvmlLnkuKrlkI3lrZcKLy8gQG5vdGUgICAgMjAxNy4wMi4xNy1WNi45IOS/ruWkjeaQnOeLl+eahOaQnOe0oue7k+aenOmHjeWumuWQkemXrumimAovLyBAbm90ZSAgICAyMDE2LjEwLjI3LVY2Ljcg5L+u5aSN5LqG5Lul5YmN55qE6YeN5aSN6K+35rGC77yM546w5Zyo55qE6K+35rGC5pWw5bqU6K+l5bCP5LqG5b6I5aSa77yM572R57uc5Lmf5bCx5LiN5Y2h5LqG77yM5oSf6KeJ6JCM6JCM5ZOSCi8vIEBub3RlICAgIDIwMTYuMDQuMjQtVjYuNiDmgaLlpI3ku6XliY3nmoTniYjmnKzvvIzlm6DkuLrlhbzlrrnmgKfpl67popgKLy8gQG5vdGUgICAgMjAxNS4xMi4wMS1WNS4wIOWKoOWFpeaQnOeLl+eahOaUr+aMge+8jOS9huaYr+aUr+aMgeS4jeaYr+W+iOWlvQovLyBAbm90ZSAgICAyMDE1LjExLjI1LVYyLjAg5LyY5YyW77yM5bey57uP5piv55yf5a6e5Zyw5Z2A55qE5LiN5YaN5bCd6K+V6I635Y+WCi8vIEBub3RlICAgIDIwMTUuMTEuMjUtVjEuMCDlrozmiJDljrvmjonnmb7luqbph43lrprlkJHnmoTlip/og70KLy8gQHJlc291cmNlICBiYWlkdUNvbW1vblN0eWxlICAgaHR0cDovL2liYWlkdS50dWppZHUuY29tL25ld2Nzcy9iYWlkdUNvbW1vblN0eWxlLmxlc3M/dD0yNi4wNAovLyBAcmVzb3VyY2UgIGJhaWR1T25lUGFnZVN0eWxlICBodHRwOi8vaWJhaWR1LnR1amlkdS5jb20vbmV3Y3NzL2JhaWR1T25lUGFnZVN0eWxlLmxlc3M/dD0yNi4wNAovLyBAcmVzb3VyY2UgIGJhaWR1VHdvUGFnZVN0eWxlICBodHRwOi8vaWJhaWR1LnR1amlkdS5jb20vbmV3Y3NzL2JhaWR1VHdvUGFnZVN0eWxlLmxlc3M/dD0yNi4wNAovLyBAcmVzb3VyY2UgIGdvb2dsZUNvbW1vblN0eWxlICBodHRwOi8vaWJhaWR1LnR1amlkdS5jb20vbmV3Y3NzL2dvb2dsZUNvbW1vblN0eWxlLmxlc3M/dD0yNi4wNAovLyBAcmVzb3VyY2UgIGdvb2dsZU9uZVBhZ2VTdHlsZSBodHRwOi8vaWJhaWR1LnR1amlkdS5jb20vbmV3Y3NzL2dvb2dsZU9uZVBhZ2VTdHlsZS5sZXNzP3Q9MjYuMDQKLy8gQHJlc291cmNlICBnb29nbGVUd29QYWdlU3R5bGUgaHR0cDovL2liYWlkdS50dWppZHUuY29tL25ld2Nzcy9nb29nbGVUd29QYWdlU3R5bGUubGVzcz90PTI2LjA0Ci8vIEByZXNvdXJjZSAgYmluZ0NvbW1vblN0eWxlICAgIGh0dHA6Ly9pYmFpZHUudHVqaWR1LmNvbS9uZXdjc3MvYmluZ0NvbW1vblN0eWxlLmxlc3M/dD0yNi4wNAovLyBAcmVzb3VyY2UgIGJpbmdPbmVQYWdlU3R5bGUgICBodHRwOi8vaWJhaWR1LnR1amlkdS5jb20vbmV3Y3NzL2JpbmdPbmVQYWdlU3R5bGUubGVzcz90PTI2LjA0Ci8vIEByZXNvdXJjZSAgYmluZ1R3b1BhZ2VTdHlsZSAgIGh0dHA6Ly9pYmFpZHUudHVqaWR1LmNvbS9uZXdjc3MvYmluZ1R3b1BhZ2VTdHlsZS5sZXNzP3Q9MjYuMDQKLy8gQHJlc291cmNlICBkdWNrQ29tbW9uU3R5bGUgICAgaHR0cDovL2liYWlkdS50dWppZHUuY29tL25ld2Nzcy9kdWNrQ29tbW9uU3R5bGUubGVzcz90PTI2LjAxCi8vIEByZXNvdXJjZSAgZHVja09uZVBhZ2VTdHlsZSAgIGh0dHA6Ly9pYmFpZHUudHVqaWR1LmNvbS9uZXdjc3MvZHVja09uZVBhZ2VTdHlsZS5sZXNzP3Q9MjYuMDEKLy8gQHJlc291cmNlICBkdWNrVHdvUGFnZVN0eWxlICAgaHR0cDovL2liYWlkdS50dWppZHUuY29tL25ld2Nzcy9kdWNrVHdvUGFnZVN0eWxlLmxlc3M/dD0yNi4wMQovLyBAcmVzb3VyY2UgIGRvZ2VDb21tb25TdHlsZSAgICBodHRwOi8vaWJhaWR1LnR1amlkdS5jb20vbmV3Y3NzL2RvZ2VDb21tb25TdHlsZS5sZXNzP3Q9MjYuMDEKLy8gQHJlc291cmNlICBkb2dlT25lUGFnZVN0eWxlICAgaHR0cDovL2liYWlkdS50dWppZHUuY29tL25ld2Nzcy9kb2dlT25lUGFnZVN0eWxlLmxlc3M/dD0yNi4wMQovLyBAcmVzb3VyY2UgIGRvZ2VUd29QYWdlU3R5bGUgICBodHRwOi8vaWJhaWR1LnR1amlkdS5jb20vbmV3Y3NzL2RvZ2VUd29QYWdlU3R5bGUubGVzcz90PTI2LjAxCi8vIEByZXNvdXJjZSAgTWFpbkh1WWFuU3R5bGUgICAgIGh0dHA6Ly9pYmFpZHUudHVqaWR1LmNvbS9uZXdjc3MvSHVZYW5TdHlsZS5sZXNzP3Q9MjYuMDIKLy8gQHJlc291cmNlICBCZ0F1dG9GaXQgICAgICAgICAgaHR0cDovL2liYWlkdS50dWppZHUuY29tL25ld2Nzcy9CZ0F1dG9GaXQubGVzcz90PTI2LjAzCi8vIEByZXNvdXJjZSAgYmFpZHVMaXRlU3R5bGUgICAgIGh0dHBzOi8vZ2l0Y29kZS5uZXQvLS9zbmlwcGV0cy8xOTA2L3Jhdy9tYXN0ZXIvTGl0ZVN0eWxlLmNzcz9pbmxpbmU9ZmFsc2UKLy8gQHJlcXVpcmUgaHR0cHM6Ly9jZG4uc3RhdGljZmlsZS5vcmcvdnVlLzIuNi4xNC92dWUubWluLmpzCi8vIEByZXF1aXJlIGh0dHBzOi8vY2RuLnN0YXRpY2ZpbGUub3JnL2xlc3MuanMvNC4xLjIvbGVzcy5taW4uanMKLy8gQHJlcXVpcmUgaHR0cHM6Ly9saWIuYmFvbWl0dS5jb20vdnVlLzIuNi4xNC92dWUubWluLmpzCi8vIEByZXF1aXJlIGh0dHBzOi8vbGliLmJhb21pdHUuY29tL2xlc3MuanMvNC4xLjIvbGVzcy5taW4uanMKLy8gQHJlcXVpcmUgaHR0cHM6Ly9saWIuYmFvbWl0dS5jb20vbWQ1LXdhc20vMS4yLjAvbWQ1LXdhc20ubWluLmpzCi8vIEBncmFudCAgICBHTV9nZXRWYWx1ZQovLyBAZ3JhbnQgICAgR00uZ2V0VmFsdWUKLy8gQGdyYW50ICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICBHTS5zZXRWYWx1ZQovLyBAZ3JhbnQgICAgR01fYWRkU3R5bGUKLy8gQGdyYW50ICAgIEdNX2dldFJlc291cmNlVVJMCi8vIEBncmFudCAgICBHTV9saXN0VmFsdWVzCi8vIEBncmFudCAgICBHTS5nZXRSZXNvdXJjZVVybAovLyBAZ3JhbnQgICAgR01feG1saHR0cFJlcXVlc3QKLy8gQGdyYW50ICAgIEdNX2dldFJlc291cmNlVGV4dAovLyBAZ3JhbnQgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZAovLyBAZ3JhbnQgICAgdW5zYWZlV2luZG93Ci8vIEBuYW1lc3BhY2UgMTM1MzQ2NDUzOUBxcS5jb20KLy8gPT0vVXNlclNjcmlwdD09Ci8vIGNhbGMoWDEodncpICsgWDIocHgpKSAtPiBCKHB4KSDkvb/nlKggaHR0cDovL3d3dy55dW5zdWFuLmluZm8vbWF0cml4Y29tcHV0YXRpb25zL3NvbHZlbGluZWFyc3lzdGVtcy5odG1sIOi/m+ihjOiuoeeulwohZnVuY3Rpb24gKCkgewogIGxldCBpc2RlYnVnID0gZmFsc2U7IC8vIOiwg+ivleaXpeW/l+eUqAogIGxldCBpc0xvY2FsRGVidWcgPSBmYWxzZTsgLy8g5Yqg6L295pys5Zyw6LWE5rqQ55SoCiAgbGV0IGRlYnVnID0gaXNkZWJ1ZyA/IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSkgOiAoKT0+e30KICBsZXQgYWNDc3NMb2FkRmxhZyA9IGZhbHNlOwoKICBsZXQgaW5FeHRNb2RlID0gdHlwZW9mIChpc0V4dGVuc2lvbikgIT09ICJ1bmRlZmluZWQiOwogIGxldCBpbkdNTW9kZSA9IHR5cGVvZiAoR01faW5mby5zY3JpcHRIYW5kbGVyKSAhPT0gInVuZGVmaW5lZCI7IC8vID0gIkdyZWFzZW1vbmtleSIgfHwgIlRhbXBlcm1vbmtleSIgfHwgIlZpb2xlbnRNb25rZXkiCiAgLy8gaW5FeHRNb2RlICYgaW5HTU1vZGUKICAvLyB0cnVlICAgIHRydWUgPeaJqeWxleS4i+eahEdN5Luj56CBIOS4jeaJp+ihjAogIC8vIHRydWUgICAgZmFsc2U95omp5bGV5LiL5Luj56CBIOaJp+ihjAogIC8vIGZhbHNlICB0cnVlID3ku4VHTeS7o+eggSDmiafooYwKICAvLyBmYWxzZSAgZmFsc2U95byC5bi4IOS9huaYr+i/mOaYr+imgeaJp+ihjOS7o+eggQogIGRlYnVnKCLnqIvluo/lvIDlp4siKTsKICBpZiAoaW5FeHRNb2RlID09PSB0cnVlICYmIGluR01Nb2RlID09PSB0cnVlIHx8IHR5cGVvZih3aW5kb3cuQUM2NjZJbml0KSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgIGNvbnNvbGUubG9nKCLmianlsZXmqKHlvI8t6ISa5pys5LiN5ZCv55SoIik7CiAgICByZXR1cm47CiAgfQogIHdpbmRvdy5BQzY2NkluaXQgPSB0cnVlCiAgaWYgKHR5cGVvZiAoR00pID09PSAidW5kZWZpbmVkIikgewogICAgLy8g6L+Z5Liq5pivVmlvbGVudE1vbmtleeeahOaUr+aMgemAiemhuQogICAgR00gPSB7fTsKICAgIEdNLnNldFZhbHVlID0gR01fc2V0VmFsdWU7CiAgICBHTS5nZXRWYWx1ZSA9IEdNX2dldFZhbHVlOwogIH0KICAvLyDlop7liqDkuobkuIDkuKpjc3PnmoTnvJPlhrLlsYLvvIzkv53or4HlpJrmrKFDU1Pmk43kvZzkuI3lr7zoh7TpobXpnaLljaHpob/vvIzlh4/lsJHph43mjpLnmoTmrKHmlbAKICBjbGFzcyBGbHVzaERvbUZyYWdtZW50IHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLmluaXQoKQogICAgfQoKICAgIGluaXQoKSB7CiAgICAgIHRoaXMubGVuZ3RoID0gMAoKICAgICAgdGhpcy5mcmFnbWVudEhlYWQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CiAgICAgIHRoaXMuZnJhZ21lbnRCb2R5ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgICB0aGlzLmZyYWdtZW50RE9NID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwoKICAgICAgdGhpcy5yZWxvYWRMaXN0ID0gW10gLy8g5omA5pyJ6ZyA6KaB5Yqo5oCB5Yi35paw55qE6YO95Zyo6L+Z6YeM6Z2iCiAgICB9CgogICAgX3JlbW92ZVJlbG9hZCgpIHsKICAgICAgdGhpcy5yZWxvYWRMaXN0Lm1hcChzZWxlY3RvciA9PiB7CiAgICAgICAgc2FmZVJlbW92ZShzZWxlY3RvcikKICAgICAgfSkKICAgIH0KCiAgICBfc2luZ2xlSW5zZXJ0KG5vZGUsIHRvRG9tLCBjaGVja0RvbSkgewogICAgICBpZihub2RlKSB7CiAgICAgICAgY29uc3QgeyBkYXRhc2V0OiB7IHhjbGFzczogc2VsZWN0b3IgPSAnJyB9ID0ge30sIHRhZ05hbWUgPSAnJyB9ID0gbm9kZQogICAgICAgIGlmKHRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1NUWUxFJykgewogICAgICAgICAgaWYoc2VsZWN0b3IpIHsKICAgICAgICAgICAgaWYoY2hlY2tEb20ucXVlcnlTZWxlY3RvcihzZWxlY3RvcikpIHJldHVybgogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcign5Ye6546w5rKh5pyJ5qC35byP55qE6IqC54K5Jywgbm9kZSkKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRvRG9tLmFwcGVuZENoaWxkKG5vZGUpCgogICAgICAgIHRoaXMubGVuZ3RoICs9IDEKICAgICAgICBkZWJ1Zygn5aKe5Yqg6IqC54K5Jywgbm9kZSkKICAgICAgICBkZWJ1Zygn6ZW/5bqm5Y+Y5YyWJywgdGhpcy5sZW5ndGgpCiAgICAgIH0KICAgIH0KICAgIAogICAgLy8g5aaC5p6cQ1NT5bey57uP5a2Y5Zyo5LqG77yM6YKj5LmI5bCx5LiN5YaN5re75Yqg5LqGCiAgICBfZHJvcE11bHRpQ1NTKGZyYWdtZW50KSB7CiAgICAgIGNvbnN0IG5ld0ZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CiAgICAgIFsuLi5mcmFnbWVudC5jaGlsZE5vZGVzXS5tYXAobm9kZSA9PiB7CiAgICAgICAgdGhpcy5fc2luZ2xlSW5zZXJ0KG5vZGUsIG5ld0ZyYWcsIGRvY3VtZW50KQogICAgICB9KQogICAgICByZXR1cm4gbmV3RnJhZwogICAgfQoKICAgIGZsdXNoKCkgewogICAgICBpZih0aGlzLmxlbmd0aCA+IDApIHsgLy8g5pyJ5pWw5o2u77yM5omN6L+b6KGMZmx1c2jvvIzlkKbliJnmsqHmnInlv4XopoEKICAgICAgICB0aGlzLl9yZW1vdmVSZWxvYWQoKQogICAgICAgIAogICAgICAgIC8vIE1BUksg5L+d6K+B57q/56iL5a6J5YWo77yM5bCG546w5pyJ5pWw5o2u5pqC5a2Y77yM54S25ZCO55Sf5oiQ5paw55qE6IqC54K577yM6YG/5YWN5YW25LuWanPmj5LlhaXlkI7kuKLlpLEKICAgICAgICBjb25zdCBjdXJCb2R5RnJhZyA9IHRoaXMuZnJhZ21lbnRCb2R5CiAgICAgICAgY29uc3QgY3VySGVhZEZyYWcgPSB0aGlzLmZyYWdtZW50SGVhZAogICAgICAgIGNvbnN0IGN1ckRvbUZyYWcgPSB0aGlzLmZyYWdtZW50RE9NCiAgICAgICAgCiAgICAgICAgdGhpcy5pbml0KCkKCiAgICAgICAgLy8g5pWw5o2u5riF6ZmkCiAgICAgICAgY29uc3QgbmV3Qm9keUZyYWcgPSB0aGlzLl9kcm9wTXVsdGlDU1MoY3VyQm9keUZyYWcpCiAgICAgICAgY29uc3QgbmV3SGVhZEZyYWcgPSB0aGlzLl9kcm9wTXVsdGlDU1MoY3VySGVhZEZyYWcpCiAgICAgICAgY29uc3QgbmV3RG9tRnJhZyA9IHRoaXMuX2Ryb3BNdWx0aUNTUyhjdXJEb21GcmFnKQoKICAgICAgICBkZWJ1Zygn5pWw5o2uZmx1c2gxJywgbmV3Qm9keUZyYWcuY2hpbGRyZW4ubGVuZ3RoKQogICAgICAgIGRlYnVnKCfmlbDmja5mbHVzaDInLCBuZXdIZWFkRnJhZy5jaGlsZHJlbi5sZW5ndGgpCiAgICAgICAgZGVidWcoJ+aVsOaNrmZsdXNoMycsIG5ld0RvbUZyYWcuY2hpbGRyZW4ubGVuZ3RoKQoKICAgICAgICBzYWZlV2FpdEZ1bmMoImJvZHkiLCBib2R5ID0+IHsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobmV3Qm9keUZyYWcpCiAgICAgICAgfSkKICAgICAgICBzYWZlV2FpdEZ1bmMoImhlYWQiLCBib2R5ID0+IHsKICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobmV3SGVhZEZyYWcpCiAgICAgICAgfSkKICAgICAgICBkb2N1bWVudC5pbnNlcnRCZWZvcmUobmV3RG9tRnJhZywgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KQogICAgICB9CiAgICB9CgogICAgYXBwZW5kQ2hpbGQobm9kZSwgdG8gPSAnaGVhZCcsIGNvbmZpZyA9IHsKICAgICAgaXNSZWxvYWQ6IGZhbHNlCiAgICB9KSB7CiAgICAgIHJldHVybiB0aGlzLmluc2VydChub2RlLCB0bywgY29uZmlnKQogICAgfQoKICAgIGluc2VydChub2RlLCB0byA9ICdoZWFkJywgY29uZmlnPSB7CiAgICAgIGlzUmVsb2FkOiBmYWxzZQogICAgfSkgewogICAgICAKICAgICAgaWYgKHRvID09PSAnYm9keScpIHsKICAgICAgICB0aGlzLl9zaW5nbGVJbnNlcnQobm9kZSwgdGhpcy5mcmFnbWVudEJvZHksIHRoaXMuZnJhZ21lbnRCb2R5KQogICAgICB9IGVsc2UgaWYodG8gPT09ICdoZWFkJykgewogICAgICAgIHRoaXMuX3NpbmdsZUluc2VydChub2RlLCB0aGlzLmZyYWdtZW50SGVhZCwgdGhpcy5mcmFnbWVudEhlYWQpCiAgICAgIH0gZWxzZSBpZih0byA9PT0gJ0RPTScpIHsKICAgICAgICB0aGlzLl9zaW5nbGVJbnNlcnQobm9kZSwgdGhpcy5mcmFnbWVudERPTSwgdGhpcy5mcmFnbWVudERPTSkKICAgICAgfSBlbHNlewogICAgICAgIGNvbnNvbGUuZXJyb3IoJ+S4jeaUr+aMgeeahOiKgueCueaTjeS9nCcpCiAgICAgICAgcmV0dXJuCiAgICAgIH0KCiAgICAgIGNvbnN0IHsgaXNSZWxvYWQgfSA9IGNvbmZpZwogICAgICBpZihpc1JlbG9hZCkgewogICAgICAgIGNvbnN0IHsgY2xhc3NMaXN0ID0gW10gfSA9IG5vZGUKICAgICAgICBpZihjbGFzc0xpc3QubGVuZ3RoKSB7CiAgICAgICAgICB0aGlzLnJlbG9hZExpc3QucHVzaCgnLicgKyBbLi4uKG5vZGUuY2xhc3NMaXN0IHx8IFtdKV0uam9pbignLicpKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCflvILluLjnmoRyZWxvYWTlj4LmlbDvvIzmsqHmnIljbGFzc0xpc3QnLCBub2RlKQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGhpcwogICAgfQogIH0KCiAgZnVuY3Rpb24gc2FmZVJlbW92ZShjc3NTZWxlY3Rvciwgd2l0aEFuaSA9IGZhbHNlKSB7CiAgICBzYWZlRnVuY3Rpb24oKCkgPT4gewogICAgICBsZXQgcmVtb3ZlTm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGNzc1NlbGVjdG9yKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1vdmVOb2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGFuaVJlbW92ZShyZW1vdmVOb2Rlc1tpXSwgd2l0aEFuaSkKICAgICAgfQogICAgfSkKICB9CiAgCiAgZnVuY3Rpb24gYW5pUmVtb3ZlKG5vZGUsIHdpdGhBbmkpIHsKICAgIGlmKHdpdGhBbmkpIHsKICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKCdhbmlEZWxldGUnKQogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBub2RlLnJlbW92ZSgpOwogICAgICB9LCAyMDApCiAgICB9IGVsc2UgewogICAgICBub2RlLnJlbW92ZSgpOwogICAgfQogIH0KICAKICBmdW5jdGlvbiBzYWZlRnVuY3Rpb24oZnVuYywgZmFpbENiKSB7CiAgICB0cnkgewogICAgICBmdW5jKCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGZhaWxDYiAmJiBmYWlsQ2IoKQogICAgfQogIH0KCiAgLyoqCiAgICogQHBhcmFtIGNhbGxiYWNrIOWbnuiwg+WHveaVsO+8jOmcgOimgei/lOWbnuaYr+WQpue7k+adn1RydWXjgIFGYWxzZeOAgeWQpuWImeebuOW9k+S6juWumuaXtuWZqAogICAqIGNhbGxiYWNrIHJldHVybjoKICAgKiAgdHJ1ZSA9IOWAkuiuoeaXtgogICAqICBmYWxzZSA9IOiuoeaXtuWZqAogICAqICBub25lID0g6K6h5pe25ZmoCiAgICogQHBhcmFtIHBlcmlvZCDlkajmnJ/vvIzlpoI6MjAwbXMKICAgKiBAcGFyYW0gcnVuTm93IOeri+WNs+aJp+ihjAogICAqLwogIGZ1bmN0aW9uIFJBRkludGVydmFsKGNhbGxiYWNrLCBwZXJpb2QgPSA1MCwgcnVuTm93ID0gZmFsc2UpIHsKICAgIHZhciBzaG91bGRGaW5pc2ggPSBmYWxzZQogICAgdmFyIGludF9pZCA9IG51bGwKICAgIGlmKHJ1bk5vdykgewogICAgICBzaG91bGRGaW5pc2ggPSBjYWxsYmFjaygpCiAgICAgIGlmIChzaG91bGRGaW5pc2gpIHJldHVybgogICAgfQogICAgaW50X2lkID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICBzaG91bGRGaW5pc2ggPSBjYWxsYmFjaygpCiAgICAgIHNob3VsZEZpbmlzaCAmJiBjbGVhckludGVydmFsKGludF9pZCkKICAgIH0sIHBlcmlvZCkKICB9CgogIGZ1bmN0aW9uIHNhZmVXYWl0RnVuYyhzZWxlY3RvciwgY2FsbGJhY2tGdW5jLCB0aW1lLCBub3RDbGVhcikgewogICAgdGltZSA9IHRpbWUgfHwgNjA7CiAgICBub3RDbGVhciA9IG5vdENsZWFyIHx8IGZhbHNlOwogICAgbGV0IGRvQ2xlYXIgPSAhbm90Q2xlYXI7CiAgICBSQUZJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgIGlmICgodHlwZW9mIChzZWxlY3RvcikgPT09ICJzdHJpbmciICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpICE9IG51bGwpKSB7CiAgICAgICAgY2FsbGJhY2tGdW5jKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpKTsKICAgICAgICBpZiAoZG9DbGVhcikgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIChzZWxlY3RvcikgPT09ICJmdW5jdGlvbiIgJiYgKHNlbGVjdG9yKCkgIT0gbnVsbCB8fCAoc2VsZWN0b3IoKSB8fCBbXSkubGVuZ3RoID4gMCkpIHsKICAgICAgICBjYWxsYmFja0Z1bmMoc2VsZWN0b3IoKVswXSk7CiAgICAgICAgaWYgKGRvQ2xlYXIpIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9LCB0aW1lLCB0cnVlKTsKICB9CiAgCiAgKGZ1bmN0aW9uICgpIHsKICAgIGRlYnVnKCLnqIvluo/miafooYwiKTsKICAgIGxldCBuZWVkRGlzcGxheU5ld0Z1biA9IHRydWU7IC8vIOacrOasoeabtOaWsOaYr+WQpuacieaWsOWKn+iDvemcgOimgeWxleekugogICAgaWYgKHdpbmRvdy5Ob2RlTGlzdCAmJiAhTm9kZUxpc3QucHJvdG90eXBlLmZvckVhY2gpIHsKICAgICAgTm9kZUxpc3QucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgICAgICB0aGlzQXJnID0gdGhpc0FyZyB8fCB3aW5kb3c7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHRoaXNbaV0sIGksIHRoaXMpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoJ0FDLemHjeWumuWQkeiEmuacrOiuvue9ricsIGZ1bmN0aW9uKCkgewogICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc3AtYWMtY29udGVudCIpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgfSk7CiAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCfohJrmnKzph43nva4gLSDkv67lpI3ohJrmnKwnLCBmdW5jdGlvbigpIHsKICAgICAgR01fc2V0VmFsdWUoJ0NvbmZpZycsICd7fScpOwogICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnQUNDb25maWcnLCAne30nKTsKICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICB9KTsKICAgIC8vIGxldCBSZWRpcmVjdE1hcCA9IG5ldyBNYXAoKTsKICAgIGxldCBBQ0NvbmZpZyA9IHt9OwogICAgbGV0IERCQ29uZmlnID0ge307IC8vIOS7heS9nOS4uuaZrumAmkFDQ29uZmln55qE5Y6f5aeL5aSH5Lu977yM5Zyo5YW25LuW6Z2e5YWz6ZSu5L2N572u5pe26L+b6KGM5L+d5a2Y5L2/55SoCiAgICAvKuWtmOWcqOWvueacquWIneWni+WMluWPmOmHj+eahOWIneWni+WMlui1i+WAvC3ml6DpnIDmi4Xlv4Pov63ku6Plhbzlrrnpl67popgqLwogICAgbGV0IERlZmF1bHRDb25maWcgPSB7CiAgICAgIGlzUmVkaXJlY3RFbmFibGU6IGZhbHNlLCAgLy8g5piv5ZCm5byA5ZCv6YeN5a6a5ZCR5Yqf6IO9CiAgICAgIGlzQWRzRW5hYmxlOiBmYWxzZSwgLy8g5piv5ZCm5byA5ZCv5Y675bm/5ZGK5qih5byPCiAgICAgIGlzQXV0b3BhZ2U6IHRydWUsICAvLyDmmK/lkKblvIDlkK/oh6rliqjnv7vpobXlip/og70KICAgICAgaXNCbG9ja0VuYWJsZTogZmFsc2UsIC8vIOaYr+WQpuW8gOWQr+WOu+aLpuaIquaooeW8jwogICAgICBpc0Jsb2NrRGlzcGxheTogZmFsc2UsIC8vIOaYr+WQpuWIoOmZpOW3suaLpuaIqueahOadoeebrgogICAgICBpc0Jsb2NrQnRuTm90RGlzcGxheTogZmFsc2UsIC8vIOaYr+WQpuaYvuekumJsb2Nr5oyJ6ZKuCiAgICAgIEFkc1N0eWxlRW5hYmxlOiB0cnVlLCAvLyDmmK/lkKblvIDlkK/oh6rlrprkuYnmoLflvI/mqKHlvI8KCiAgICAgIGJhaWR1OiB7CiAgICAgICAgbmFtZTogJ2JhaWR1JywgIC8vIENTUyBsb2FkIOeahOWJjee8gOagh+W/lwogICAgICAgIEFkc1N0eWxlTW9kZTogJzEnLCAvLyAwLeS4jeW4pmNzc++8mzEt5Y2V5YiX6Z2g5bem77ybMi3ljZXliJflsYXkuK3vvJszLeWPjOWIl+WxheS4rQogICAgICAgIEh1WWFuTW9kZTogZmFsc2UsIC8vIOaKpOecvOaooeW8jy3nmb7luqYKICAgICAgICBkZWZhdWx0QmdVcmw6ICcnLCAvLyDpu5jorqTog4zmma/lm74KICAgICAgICBCZ0ZpdDogdHJ1ZSwKICAgICAgfSwKICAgICAgZ29vZ2xlOiB7CiAgICAgICAgbmFtZTogJ2dvb2dsZScsCiAgICAgICAgQWRzU3R5bGVNb2RlOiAnMycsIC8vIDAt5LiN5bimY3Nz77ybMS3ljZXliJfpnaDlt6bvvJsyLeWNleWIl+WxheS4re+8mzMt5Y+M5YiX5bGF5LitCiAgICAgICAgSHVZYW5Nb2RlOiBmYWxzZSwgLy8g5oqk55y85qih5byPLeiwt+atjAogICAgICAgIGRlZmF1bHRCZ1VybDogJycsIC8vIOm7mOiupOiDjOaZr+WbvgogICAgICAgIEJnRml0OiB0cnVlLAogICAgICB9LAogICAgICBiaW5nOiB7CiAgICAgICAgbmFtZTogJ2JpbmcnLAogICAgICAgIEFkc1N0eWxlTW9kZTogJzMnLCAvLyAwLeS4jeW4pmNzc++8mzEt5Y2V5YiX6Z2g5bem77ybMi3ljZXliJflsYXkuK3vvJszLeWPjOWIl+WxheS4rQogICAgICAgIEh1WWFuTW9kZTogZmFsc2UsIC8vIOaKpOecvOaooeW8jy3lv4XlupQKICAgICAgICBkZWZhdWx0QmdVcmw6ICcnLCAvLyDpu5jorqTog4zmma/lm74KICAgICAgICBCZ0ZpdDogdHJ1ZSwKICAgICAgfSwKICAgICAgZHVjazogewogICAgICAgIG5hbWU6ICdkdWNrJywKICAgICAgICBBZHNTdHlsZU1vZGU6ICczJywgLy8gMC3kuI3luKZjc3PvvJsxLeWNleWIl+mdoOW3pu+8mzIt5Y2V5YiX5bGF5Lit77ybMy3lj4zliJflsYXkuK0KICAgICAgICBIdVlhbk1vZGU6IGZhbHNlLCAvLyDmiqTnnLzmqKHlvI8tRHVja0dPR08KICAgICAgfSwKICAgICAgZG9nZTogewogICAgICAgIG5hbWU6ICdkb2dlJywKICAgICAgICBBZHNTdHlsZU1vZGU6ICczJywgLy8gMC3kuI3luKZjc3PvvJsxLeWNleWIl+mdoOW3pu+8mzIt5Y2V5YiX5bGF5Lit77ybMy3lj4zliJflsYXkuK0KICAgICAgICBIdVlhbk1vZGU6IGZhbHNlLCAvLyDmiqTnnLzmqKHlvI8tRHVja0dPR08KICAgICAgfSwKICAgICAgc29nb3U6IHsKICAgICAgICBuYW1lOiAnc29nb3UnLAogICAgICAgIEFkc1N0eWxlTW9kZTogJzEnLCAvLyAwLeS4jeW4pmNzc++8mzEt5Y2V5YiX6Z2g5bem77ybMi3ljZXliJflsYXkuK3vvJszLeWPjOWIl+WxheS4rQogICAgICAgIEh1WWFuTW9kZTogZmFsc2UsIC8vIOaKpOecvOaooeW8jy3mkJzni5cKICAgICAgfSwKICAgICAgemhpaHU6IHsKICAgICAgICBuYW1lOiAnemhpaHUnLAogICAgICAgIEFkc1N0eWxlTW9kZTogJzAnLCAvLyAwLeS4jeW4pmNzc++8mzEt5Y2V5YiX6Z2g5bem77ybMi3ljZXliJflsYXkuK3vvJszLeWPjOWIl+WxheS4rQogICAgICAgIEh1WWFuTW9kZTogZmFsc2UsIC8vIOaKpOecvOaooeW8jy3mkJzni5cKICAgICAgfSwKICAgICAgb3RoZXI6IHsKICAgICAgICBuYW1lOiAnb3RoZXInLAogICAgICAgIEFkc1N0eWxlTW9kZTogJzAnLCAvLyAwLeS4jeW4pmNzc++8mzEt5Y2V5YiX6Z2g5bem77ybMi3ljZXliJflsYXkuK3vvJszLeWPjOWIl+WxheS4rQogICAgICAgIEh1WWFuTW9kZTogZmFsc2UsIC8vIOaKpOecvOaooeW8jy3mkJzni5cKICAgICAgfSwKCiAgICAgIFN0eWxlX0JhaWR1TGl0ZTogZmFsc2UsIC8vIEJhaWR1X0xpdGXmoLflvI/ooagKCiAgICAgIGRlZmF1bHRIdVlhbkNvbG9yOiAiI0RFRjFFRiIsCiAgICAgIGlzVXNlckNvbG9yRW5hYmxlOiB0cnVlLCAvLyDmmK/lkKblvIDlkK9mYXZpY29u5Zu+5qCH5Yqf6IO9CiAgICAgIGlzRmF2aWNvbkVuYWJsZTogdHJ1ZSwgLy8g5piv5ZCm5byA5ZCvZmF2aWNvbuWbvuagh+WKn+iDvQogICAgICBkZWZhdWx0RmF2aWNvblVybDogImh0dHBzOi8vYWUwMS5hbGljZG4uY29tL2tmL0hUQjFkUlkwWDhPRDNLVmpTWkZGcTZBbjlwWGF5LmpwZyIsIC8vIOm7mOiupOWbvuagh+WcsOWdgAogICAgICBkb0Rpc2FibGVTdWc6IHRydWUsIC8vIOaYr+WQpuemgeatoueZvuW6puaQnOe0oumihOa1iwogICAgICBpc1JpZ2h0RGlzcGxheUVuYWJsZTogdHJ1ZSwgLy8g5piv5ZCm5byA5ZCv5Y+z5L6n6L655qCPCiAgICAgIGlzQ291bnRlckVuYWJsZTogZmFsc2UsIC8vIOaYr+WQpuaYvuekuuiuoeaVsOWZqAogICAgICBpc0FMaW5lRW5hYmxlOiBmYWxzZSwgLy8g5piv5ZCm56aB5q2i5LiL5YiS57q/CiAgICAgIGlzVXNlclN0eWxlRW5hYmxlOiBmYWxzZSwgLy8g5piv5ZCm5byA5ZCv6Ieq5a6a5LmJ5qC35byPCiAgICAgIG5vcm1hbGl6ZUR1Y2s6IHRydWUsIC8vIOaYr+WQpuaMieeFp+W4uOeUqOS5oOaDr+WOu+mFjee9rkR1Y2tEdWNrR28KICAgICAgYWNjZXB0TGljZW5zZTogZmFsc2UsCiAgICAgIGlzRW5MYW5nOiBmYWxzZSwKICAgICAgaXNHb29sZUluQmFpZHVNb2RlRW5hYmxlOiBmYWxzZSwgLy8g5piv5ZCm5byA5ZCv6LC35q2M5pCc57Si57uT5p6c6aG155qE55m+5bqm5Zu+5qCH5pi+56S6CiAgICAgIFVzZXJCbG9ja0xpc3Q6IFtdLAogICAgICBVc2VyU3R5bGVUZXh0OgogICAgICAgIGAvKirorqHmlbDlmajnmoTpopzoibLmoLflvI8qLwpkaXYgLkFDLUNvdW50ZXJUewogIGJhY2tncm91bmQ6ICNGRDk5OTk7Cn0KLyoq55m+5bqm5qC35byP5Yy65Z+fKiovCmJvZHlbYmFpZHVdIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgCiAgLyoq5Y+z5L6n5qCP55qE5qC35byPLeWFtuWunuS4jeW8gOWQr+abtOWlveeci+S4gOS6myovCiAgI2NvbnRlbnRfcmlnaHR7CiAgICBwYWRkaW5nOiAyMHB4IDE1cHggMTVweCAhaW1wb3J0YW50OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjY2OwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGJveC1zaGFkb3c6IDAgMCAyMHB4IDJweCByZ2JhKDAsIDAsIDAsIC4xKTsKICAgIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDIwcHggMnB4IHJnYmEoMCwgMCwgMCwgLjEpOwogICAgLW1vei1ib3gtc2hhZG93OiAwIDAgMjBweCAycHggcmdiYSgwLCAwLCAwLCAuMSk7CiAgfQogICY6YmVmb3JlewogICAgcG9zaXRpb246IGZpeGVkOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICB0b3A6IDA7CiAgICBsZWZ0OiAwOwogICAgY29udGVudDogJyc7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2h0dHBzOi8vaW1nLnR1amlkdS5jb20vaW1hZ2UvNjIwMjEwMDEwYjJjZC5qcGcnKTsKICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSBhdXRvOwogICAgb3BhY2l0eTogMC42OyAvKuiDjOaZr+WbvumAj+aYjuW6pj0wLjjvvIzmnIDlpKcxKi8KICB9CiAgCiAgLyoq6ZqQ6JeP6aaW6aG155qE5aSn5Zu+5qCHLeS/ruWkjeWPr+iDveWvvOiHtOWkluaPtOagt+W8j+W8guW4uCoqLwogICNzX2xnX2ltZ19uZXd7CiAgICBkaXNwbGF5Om5vbmUgIWltcG9ydGFudDsKICB9CiAgCiAgI3dyYXBwZXIgI3NfdGFiIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjQ4LCAyNDgsIDI0OCwgMC40KTsKICB9CiAgCiAgI2NvbnRlbnRfbGVmdD4uYy1jb250YWluZXJ7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LCAwLjYpICFpbXBvcnRhbnQ7IC8q55m+5bqm5pCc57Si5Z2X5L2T55qE6aKc6Imy77yb6YCP5piO5bqmPTAuMe+8jOacgOWkpzEqLwogICAgCiAgICBoM3sKICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNDgsMjQ4LDI0OCwgMC42KSAhaW1wb3J0YW50OyAvKueZvuW6puaQnOe0ouWdl+S9kyAtIOagh+mimOeahOminOiJsu+8m+mAj+aYjuW6pj0wLjHvvIzmnIDlpKcxKi8KICAgIH0KICB9Cn0KYm9keVtnb29nbGVdIHsKCiAgJjpiZWZvcmUgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICB0b3A6IDA7CiAgICBsZWZ0OiAwOwogICAgY29udGVudDogJyc7CiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2h0dHBzOi8vaW1nLnR1amlkdS5jb20vaW1hZ2UvNjIwMjEwMDEwYjJjZC5qcGcnKTsKICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSBhdXRvOwogICAgb3BhY2l0eTogMC44OyAvKuiDjOaZr+WbvumAj+aYjuW6pj0wLjjvvIzmnIDlpKcxKi8KICB9CiAgCiAgI3JzbyAuZywgLnNmYmcsIC5mNkY5QmUsIC5rOFhPQ2UgewogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNDgsMjQ4LDI0OCwgMC42KSAhaW1wb3J0YW50OyAKICB9CiAgCiAgLnNmYmd7CiAgICBtYXJnaW4tdG9wOiAtMTBweDsKICB9CiAgCiAgLnlnNTF2Y3sKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7IAogIH0KfQoKYCwKICAgICAgb2xkVmVyc2lvbjogIiIsCiAgICAgIGxhc3RTYXZlVGltZTogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICB9OwogICAgbGV0IENPTlNUID0gewogICAgICBoYXNOZXdGdW5jTmVlZERpc3BsYXk6IHRydWUsCiAgICAgIHNvcnRJbmRleDogMSwKICAgICAgaXNHb29nbGVJbWFnZVVybDogZmFsc2UsCiAgICAgIGlzR29vZ2xlU3BlY2lhbDogZmFsc2UsIC8vIOWIpOaWreaYr+WQpuWtmOWcqCNyc28+Lmc7IHRydWU95a2Y5ZyoCiAgICAgIHVzZUl0ZW06IHt9LAogICAgICBmc0JhaWR1OiBudWxsLAogICAgICBmbHVzaE5vZGU6IG5ldyBGbHVzaERvbUZyYWdtZW50KCksCiAgICB9OwoKICAgIHZhciBjdXJTaXRlID0gewogICAgICBTaXRlVHlwZUlEOiAxLCAgLy8g5b2T5YmN56uZ54K555qESUQKICAgICAgTWFpblR5cGU6ICIiLCAgICAvLyDkuLvkvZPoioLngrnvvIzlvojlpJrkuKrnmoTniLboioLngrkKICAgICAgU3R5cGVfTm9ybWFsOiAiIiwgLy8g6YeN5a6a5ZCR6YCJ5oup5Zmo77yM5Y+q5pyJ55m+5bqmLeaQnOeLly3lpb3mkJwKICAgICAgRmF2aWNvblR5cGU6ICIiLCAgLy8gZmF2aWNvbueahOWfn+WQjeajgOafpeWZqGNpdGXvvIznlKjkuo7ojrflj5Zob3N055SoCiAgICAgIEZhdmljb25BZGRUbzogIiIsIC8vIGZhdmljb27pgInmi6nlmajvvIznlKjkuo7mj5LlhaXliLB0aXRsZeS5i+WJjeeahAogICAgICBDb3VudGVyVHlwZTogIiIsICAvLyDorqHmlbDlmajmt7vliqDnmoTkvY3nva7vvIzkuIDoiKzlkoxmYXZpY29u5L2N572u5LiA6Ie0CiAgICAgIEJsb2NrVHlwZTogIiIsICAvLyDlsY/olL3mjInpkq7nmoTkvY3nva7vvIzkuIDoiKzlnKh0aXRsZeS5i+WQjgogICAgICBHTVN0eWxlTGlzdDoge30sCiAgICB9OwogICAgbGV0IERCU2l0ZSA9IHsKICAgICAgYmFpZHU6IHsKICAgICAgICBTaXRlVHlwZUlEOiAxLAogICAgICAgIE1haW5UeXBlOiAiI2NvbnRlbnRfbGVmdD4uYy1jb250YWluZXIiLAogICAgICAgIFN0eXBlX05vcm1hbDogImgzLnQ+YSwgLmMtY29udGFpbmVyIGFydGljbGUgYSIsCiAgICAgICAgRmF2aWNvblR5cGU6ICIuYy1zaG93dXJsLCAuYy10aXRsZSBhIiwKICAgICAgICBGYXZpY29uQWRkVG86ICJoMyIsCiAgICAgICAgQ291bnRlclR5cGU6ICIjY29udGVudF9sZWZ0PiNkb3VibGU+ZGl2W3NyY2lkXSAqW2NsYXNzfj10XSxbY2xhc3N+PW9wX2Jlc3RfYW5zd2VyX3F1ZXN0aW9uXSwjY29udGVudF9sZWZ0PmRpdltzcmNpZF0gKltjbGFzc349dF0sW2NsYXNzfj1vcF9iZXN0X2Fuc3dlcl9xdWVzdGlvbl0iLAogICAgICAgIEJsb2NrVHlwZTogImgzIGEiLAogICAgICAgIHBhZ2VyOiB7CiAgICAgICAgICBuZXh0TGluazogJy8vZGl2W0BpZD0icGFnZSJdLy9hW2NvbnRhaW5zKHRleHQoKSwi5LiL5LiA6aG1IildW0BocmVmXScsCiAgICAgICAgICBwYWdlRWxlbWVudDogImNzcztkaXYjY29udGVudF9sZWZ0ID4gKiIsCiAgICAgICAgICBIVF9pbnNlcnQ6IFsiY3NzO2RpdiNjb250ZW50X2xlZnQiLCAyXSwgLy8gMSA9IGJlZm9yZWJlZ2luOyAyID0gYmVmb3JlZW5kCiAgICAgICAgICByZXBsYWNlRTogImNzczsjcGFnZSIsCiAgICAgICAgICBzdHlsaXNoOiAiLmF1dG9wYWdlcml6ZV9wYWdlX2luZm8sIGRpdi5zcC1zZXBhcmF0b3Ige21hcmdpbi1ib3R0b206IDEwcHggIWltcG9ydGFudDt9LmMtaW1nLWJvcmRlcntkaXNwbGF5Om5vbmV9IiwKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHNvZ291OiB7CiAgICAgICAgU2l0ZVR5cGVJRDogMiwKICAgICAgICBNYWluVHlwZTogIiNtYWluIC5yZXN1bHRzPmRpdiIsCiAgICAgICAgU3R5cGVfTm9ybWFsOiAiaDMucHQ+YSwgaDMudnJUaXRsZT5hIiwKICAgICAgICBGYXZpY29uVHlwZTogImNpdGVbaWQqPSdjYWNoZXJlc3VsdF9pbmZvXyddIiwKICAgICAgICBGYXZpY29uQWRkVG86ICJoMyIsCiAgICAgICAgQ291bnRlclR5cGU6ICIucmVzdWx0cz5kaXYiLAogICAgICAgIEJsb2NrVHlwZTogImgzIGEiLAogICAgICAgIHBhZ2VyOiB7CiAgICAgICAgICBuZXh0TGluazogIi8vZGl2W0BpZD1cInBhZ2ViYXJfY29udGFpbmVyXCJdLy9hW0BpZD1cInNvZ291X25leHRcIl0iLAogICAgICAgICAgcGFnZUVsZW1lbnQ6ICIvL2RpdltAY2xhc3M9XCJyZXN1bHRzXCJdL2RpdiIsCiAgICAgICAgICBIVF9pbnNlcnQ6IFsiLy9kaXZbQGNsYXNzPVwicmVzdWx0c1wiXSIsIDJdLCAvLyAxID0gYmVmb3JlYmVnaW47IDIgPSBiZWZvcmVlbmQKICAgICAgICAgIHJlcGxhY2VFOiAiaWQoXCJwYWdlYmFyX2NvbnRhaW5lclwiKSIKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGhhb3NvdTogewogICAgICAgIFNpdGVUeXBlSUQ6IDMsCiAgICAgICAgTWFpblR5cGU6ICIucmVzLWxpc3QiLAogICAgICAgIFN0eXBlX05vcm1hbDogImgzPmEiLAogICAgICAgIEZhdmljb25UeXBlOiAiY2l0ZSIsCiAgICAgICAgRmF2aWNvbkFkZFRvOiAiaDMiLAogICAgICAgIENvdW50ZXJUeXBlOiAiLnJlc3VsdHM+ZGl2IiwKICAgICAgICBCbG9ja1R5cGU6ICJoMyBhIiwKICAgICAgICBwYWdlcjogewogICAgICAgICAgbmV4dExpbms6ICIvL2RpdltAaWQ9J3BhZ2UnXS8vYVt0ZXh0KCk9J+S4i+S4gOmhtT4nXSB8IGlkKCdzbmV4dCcpIiwKICAgICAgICAgIHBhZ2VFbGVtZW50OiAiLy9kaXZbQGlkPSdjb250YWluZXInXS9kaXYiLAogICAgICAgICAgSFRfaW5zZXJ0OiBbIi8vZGl2W0BpZD0nY29udGFpbmVyJ10iLCAyXSwgLy8gMSA9IGJlZm9yZWJlZ2luOyAyID0gYmVmb3JlZW5kCiAgICAgICAgICByZXBsYWNlRTogImlkKCdwYWdlJykiCiAgICAgICAgfQogICAgICB9LAogICAgICBnb29nbGU6IHsKICAgICAgICBTaXRlVHlwZUlEOiA0LAogICAgICAgIE1haW5UeXBlOiAiI3JzbyAuZyIsCiAgICAgICAgRmF2aWNvblR5cGU6ICIuaVVoMzAiLAogICAgICAgIEZhdmljb25BZGRUbzogImgzIiwKICAgICAgICBDb3VudGVyVHlwZTogIiNyc28gLmcgaDMsLl95RT5kaXZbY2xhc3N+PV9ra10gaDMiLAogICAgICAgIEJsb2NrVHlwZTogIiNyc28gYVtwaW5nXSIsCiAgICAgICAgcGFnZXI6IHsKICAgICAgICAgIG5leHRMaW5rOiAiaWQoJ3BubmV4dCcpfGlkKCduYXZiYXIgbmF2Y250IG5hdicpLy90ZFtzcGFuXS9mb2xsb3dpbmctc2libGluZzo6dGRbMV0vYXxpZCgnbm4nKS9wYXJlbnQ6OmEiLAogICAgICAgICAgcGFnZUVsZW1lbnQ6ICJpZCgncnNvJyl8aWQoJ2NlbnRlcl9jb2wnKS9zdHlsZVtjb250YWlucyguLCdyZWxhdGl2ZScpXVtpZCgncnNvJyldIiwKICAgICAgICAgIEhUX2luc2VydDogWyJjc3M7I3JlcyIsIDJdLCAvLyAxID0gYmVmb3JlYmVnaW47IDIgPSBiZWZvcmVlbmQKICAgICAgICAgIHJlcGxhY2VFOiAnLy9kaXZbQGlkPSJuYXZjbnQiXSB8IC8vZGl2W0BpZD0icmNudCJdLy9kaXZbQHJvbGU9Im5hdmlnYXRpb24iXScsCiAgICAgICAgfQogICAgICB9LAogICAgICBiaW5nOiB7CiAgICAgICAgU2l0ZVR5cGVJRDogNSwKICAgICAgICBNYWluVHlwZTogIiNiX3Jlc3VsdHM+bGkiLAogICAgICAgIEZhdmljb25UeXBlOiAiLmJfYXR0cmlidXRpb24+Y2l0ZSIsCiAgICAgICAgRmF2aWNvbkFkZFRvOiAiaDIiLAogICAgICAgIENvdW50ZXJUeXBlOiAiI2JfcmVzdWx0cz5saVtjbGFzc349Yl9hbnNdIGgyLCNiX3Jlc3VsdHM+bGlbY2xhc3N+PWJfYWxnb10gaDIiLAogICAgICAgIEJsb2NrVHlwZTogImgyIGEiLAogICAgICAgIHBhZ2VyOiB7CiAgICAgICAgICBuZXh0TGluazogIi8vYVtjb250YWlucyhAY2xhc3MsXCJzYl9wYWdOXCIpXSIsCiAgICAgICAgICBwYWdlRWxlbWVudDogImlkKFwiYl9yZXN1bHRzXCIpL2xpW25vdChjb250YWlucyhAY2xhc3MsXCJiX3BhZ1wiKSBvciBjb250YWlucyhAY2xhc3MsXCJiX2FucyBiX3RvcFwiKSldIiwKICAgICAgICAgIEhUX2luc2VydDogWyJpZChcImJfcmVzdWx0c1wiKS9saVtAY2xhc3M9XCJiX3BhZ1wiXSIsIDFdLCAvLyAxID0gYmVmb3JlYmVnaW47IDIgPSBiZWZvcmVlbmQKICAgICAgICAgIHJlcGxhY2VFOiAiaWQoXCJiX3Jlc3VsdHNcIikvL25hdltAcm9sZT1cIm5hdmlnYXRpb25cIl0iLAogICAgICAgIH0KICAgICAgfSwKICAgICAgZHVjazogewogICAgICAgIFNpdGVUeXBlSUQ6IDEwLAogICAgICAgIE1haW5UeXBlOiAiI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5ucm4tcmVhY3QtZGl2IiwKICAgICAgICBGYXZpY29uVHlwZTogIi5ucm4tcmVhY3QtZGl2IC5yZXN1bHRfX3VybF9fZG9tYWluIiwKICAgICAgICBGYXZpY29uQWRkVG86ICJoMiIsCiAgICAgICAgQ291bnRlclR5cGU6ICIjbGlua3Nfd3JhcHBlciAjbGlua3MgLm5ybi1yZWFjdC1kaXYgaDIiLAogICAgICAgIEJsb2NrVHlwZTogImgyIGEiLAogICAgICAgIHBhZ2VyOiB7CiAgICAgICAgICBuZXh0TGluazogIi8vYVtjb250YWlucyhAY2xhc3MsXCJzYl9wYWdOXCIpXSIsCiAgICAgICAgICBwYWdlRWxlbWVudDogImlkKFwiYl9yZXN1bHRzXCIpL2xpW25vdChjb250YWlucyhAY2xhc3MsXCJiX3BhZ1wiKSBvciBjb250YWlucyhAY2xhc3MsXCJiX2FucyBiX3RvcFwiKSldIiwKICAgICAgICAgIEhUX2luc2VydDogWyJpZChcImJfcmVzdWx0c1wiKS9saVtAY2xhc3M9XCJiX3BhZ1wiXSIsIDFdLCAvLyAxID0gYmVmb3JlYmVnaW47IDIgPSBiZWZvcmVlbmQKICAgICAgICAgIHJlcGxhY2VFOiAiaWQoXCJiX3Jlc3VsdHNcIikvL25hdltAcm9sZT1cIm5hdmlnYXRpb25cIl0iLAogICAgICAgIH0KICAgICAgfSwKICAgICAgZG9nZTogewogICAgICAgIFNpdGVUeXBlSUQ6IDExLAogICAgICAgIE1haW5UeXBlOiAiI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAiLAogICAgICAgIEZhdmljb25UeXBlOiAiLnJlc3VsdHNfbGlua3NfZGVlcCAucmVzdWx0X191cmxfX2RvbWFpbiIsCiAgICAgICAgRmF2aWNvbkFkZFRvOiAiaDIiLAogICAgICAgIENvdW50ZXJUeXBlOiAiI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAgaDIiLAogICAgICAgIEJsb2NrVHlwZTogImgyIGEiLAogICAgICAgIHBhZ2VyOiB7CiAgICAgICAgICBuZXh0TGluazogIi8vYVtjb250YWlucyhAY2xhc3MsXCJzYl9wYWdOXCIpXSIsCiAgICAgICAgICBwYWdlRWxlbWVudDogImlkKFwiYl9yZXN1bHRzXCIpL2xpW25vdChjb250YWlucyhAY2xhc3MsXCJiX3BhZ1wiKSBvciBjb250YWlucyhAY2xhc3MsXCJiX2FucyBiX3RvcFwiKSldIiwKICAgICAgICAgIEhUX2luc2VydDogWyJpZChcImJfcmVzdWx0c1wiKS9saVtAY2xhc3M9XCJiX3BhZ1wiXSIsIDFdLCAvLyAxID0gYmVmb3JlYmVnaW47IDIgPSBiZWZvcmVlbmQKICAgICAgICAgIHJlcGxhY2VFOiAiaWQoXCJiX3Jlc3VsdHNcIikvL25hdltAcm9sZT1cIm5hdmlnYXRpb25cIl0iLAogICAgICAgIH0KICAgICAgfSwKICAgICAgbUJhaWR1OiB7CiAgICAgICAgU2l0ZVR5cGVJRDogNiwKICAgICAgICBNYWluVHlwZTogIiNiX3Jlc3VsdHM+bGkiLAogICAgICAgIEZhdmljb25UeXBlOiAiLmJfYXR0cmlidXRpb24+Y2l0ZSIsCiAgICAgICAgRmF2aWNvbkFkZFRvOiAiaDIiLAogICAgICAgIENvdW50ZXJUeXBlOiAiI2JfcmVzdWx0cz5saVtjbGFzc349Yl9hbnNdPmgyLCNiX3Jlc3VsdHM+bGlbY2xhc3N+PWJfYWxnb10+aDIsI2JfcmVzdWx0cz5saVtjbGFzc349Yl9hbGdvXT5oMiIsCiAgICAgICAgQmxvY2tUeXBlOiAiaDIgYSIsCiAgICAgIH0sCiAgICAgIHpoaWh1OiB7CiAgICAgICAgU2l0ZVR5cGVJRDogNywKICAgICAgfSwKICAgICAgYmFpZHVfeHVlc2h1OiB7CiAgICAgICAgU2l0ZVR5cGVJRDogOCwKICAgICAgICBNYWluVHlwZTogIiNjb250ZW50X2xlZnQgLnJlc3VsdCIsCiAgICAgICAgU3R5cGVfTm9ybWFsOiAiaDMudD5hLCAjcmVzdWx0cyAuYy1jb250YWluZXI+LmMtYmxvY2thIiwKICAgICAgICBGYXZpY29uVHlwZTogIi5yZXN1bHQtb3AsIC5jLXNob3d1cmwiLCAvLyBiYWlkdSDkvLzkuY7opoHmlLnniYjkuobvvJ8KICAgICAgICBGYXZpY29uQWRkVG86ICJoMyIsCiAgICAgICAgQ291bnRlclR5cGU6ICIjY29udGVudF9sZWZ0PiNkb3VibGU+ZGl2W3NyY2lkXSAqW2NsYXNzfj10XSxbY2xhc3N+PW9wX2Jlc3RfYW5zd2VyX3F1ZXN0aW9uXSwjY29udGVudF9sZWZ0PmRpdltzcmNpZF0gKltjbGFzc349dF0sW2NsYXNzfj1vcF9iZXN0X2Fuc3dlcl9xdWVzdGlvbl0iLAogICAgICAgIEJsb2NrVHlwZTogImgzIGEiLAogICAgICB9LAogICAgICBvdGhlcjogewogICAgICAgIFNpdGVUeXBlSUQ6IDksCiAgICAgIH0KICAgIH07CiAgICAvLyBmdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQgPSB0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl0gfHwgb1siQEBpdGVyYXRvciJdOyBpZiAoIWl0KSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09ICJudW1iZXIiKSB7IGlmIChpdCkgbyA9IGl0OyB2YXIgaSA9IDA7IHZhciBGID0gZnVuY3Rpb24gRigpIHt9OyByZXR1cm4geyBzOiBGLCBuOiBmdW5jdGlvbiBuKCkgeyBpZiAoaSA+PSBvLmxlbmd0aCkgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9OyByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG9baSsrXSB9OyB9LCBlOiBmdW5jdGlvbiBlKF9lKSB7IHRocm93IF9lOyB9LCBmOiBGIH07IH0gdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOyB9IHZhciBub3JtYWxDb21wbGV0aW9uID0gdHJ1ZSwgZGlkRXJyID0gZmFsc2UsIGVycjsgcmV0dXJuIHsgczogZnVuY3Rpb24gcygpIHsgaXQgPSBpdC5jYWxsKG8pOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0LnJldHVybiAhPSBudWxsKSBpdC5yZXR1cm4oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfQogICAgLy8KICAgIC8vIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gInN0cmluZyIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSAiT2JqZWN0IiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gIk1hcCIgfHwgbiA9PT0gIlNldCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9CiAgICAvLwogICAgLy8gZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9CgogICAgbGV0IFNpdGVUeXBlID0gewogICAgICBCQUlEVTogREJTaXRlLmJhaWR1LlNpdGVUeXBlSUQsCiAgICAgIE1CQUlEVTogREJTaXRlLm1CYWlkdS5TaXRlVHlwZUlELAogICAgICBTT0dPVTogREJTaXRlLnNvZ291LlNpdGVUeXBlSUQsCiAgICAgIFNPOiBEQlNpdGUuaGFvc291LlNpdGVUeXBlSUQsCiAgICAgIEdPT0dMRTogREJTaXRlLmdvb2dsZS5TaXRlVHlwZUlELAogICAgICBCSU5HOiBEQlNpdGUuYmluZy5TaXRlVHlwZUlELAogICAgICBEVUNLOiBEQlNpdGUuZHVjay5TaXRlVHlwZUlELAogICAgICBET0dFOiBEQlNpdGUuZG9nZS5TaXRlVHlwZUlELAogICAgICBaSElIVTogREJTaXRlLnpoaWh1LlNpdGVUeXBlSUQsCiAgICAgIEJBSURVX1hVRVNIVTogREJTaXRlLmJhaWR1X3h1ZXNodS5TaXRlVHlwZUlELAogICAgICBPVEhFUlM6IDgKICAgIH07CiAgICBsZXQgb3RoZXJEYXRhID0gewogICAgICBvdGhlcjogewogICAgICAgIGN1clRhYjogMSwgLy8g5bGV56S656ys5LqMcGFuZWwKICAgICAgICBzaG93QmxvY2tMaXN0QXJlYTogZmFsc2UsIC8vIGJsb2NrTGlzdOWxleekuuS9jXRleHRhcmVhCiAgICAgICAgYWRkQmxvY2tJdGVtOiAiIiwgICAgIC8vIOeUqOaIt+aJi+WKqOi+k+WFpeeahOaLpuaIquinhOWImQogICAgICAgIGN1ckhvc3RzOiBbXSwgICAgICAgICAvLyDlrZjmlL7lt7Lnu4/orr/pl67nmoRob3N0c+aVsOaNruWGheWuuQogICAgICAgIGZhdmljb25MaXN0TWFwOiB7IH0sIC8vIGZhdmljb27nmoTpgY3ljobooaggLT4gLkFDLWZhdmljb25UU3R5bGUKICAgICAgICBpc0Jsb2NrQ2hlY2tpbmc6IGZhbHNlLCAvLyDlvZPliY1CbG9ja+WKn+iDveaYr+WQpui/mOWcqOaJp+ihjOS4re+8jOmBv+WFjeWkmuasoeaJp+ihjO+8jOWvvOiHtOmhtemdouWNoemhvwogICAgICB9CiAgICB9OyAgLy8g5Yiw5pe25YCZ5oyC6L295Yiwb3RoZXLkuIoKICAgIGxldCBBbGxEYXRhID0gewogICAgICBBQ0NvbmZpZzoge30sCiAgICAgIG90aGVyOiBvdGhlckRhdGEub3RoZXIsCiAgICAgIENPTlNUOiBDT05TVCwKICAgICAgbGFuOiB7CiAgICAgICAgdXNlOiB7fSwKICAgICAgICB6aF9jbjogewogICAgICAgICAgbWVudV90ZXh0OiAi6Ieq5a6a5LmJIiwKICAgICAgICAgIGN1ckxhbmc6ICJ6aF9jbiIsCiAgICAgICAgICBmaWVsZHNldF9wYW5lbDogewogICAgICAgICAgICBwYW5lbF90aXRsZTogIkFDLemHjeWumuWQkeiuvue9riAiICsgR01faW5mby5zY3JpcHQudmVyc2lvbiArIChpbkV4dE1vZGU/ICdFeHQnOicnKSwKICAgICAgICAgICAgc2V0dGluZ19wYW5lbDogewogICAgICAgICAgICAgIHJlZGlyZWN0X3RleHQ6ICLkuLvlip/og70t5aSE55CG6YeN5a6a5ZCRIiwKICAgICAgICAgICAgICByZWRpcmVjdF90aXRsZTogIumHjeWumuWQkeWKn+iDveeahOW8gOWQr+S4juWQpiIsCiAgICAgICAgICAgICAgdXNlRW5fdGV4dDogIkVuLUxhbmd1YWdlIiwKICAgICAgICAgICAgICB1c2VFbl90aXRsZTogIlVzaW5nIEVuZ2xpc2ggbGFuZ3VhZ2UgdG8gZGlzcGxheSIsCiAgICAgICAgICAgICAgYWRzX3RleHQ6ICLpmYTliqAxLeWOu+W5v+WRiuWKn+iDvSIsCiAgICAgICAgICAgICAgYWRzX3RpdGxlOiAi5Y676Zmk6YOo5YiG6aG16Z2i55qE5bm/5ZGK5L+h5oGv77yM6L+Y5L2g5LiA5Liq5bmy5YeA5pW05rSB55qE6aG16Z2iIiwKICAgICAgICAgICAgICBhdXRvcGFnZV90ZXh0OiAi6Ieq5Yqo57+76aG1IiwKICAgICAgICAgICAgICBhdXRvcGFnZV90aXRsZTogIuiHquWKqOe/u+mhtSIsCiAgICAgICAgICAgICAgYmxvY2tlbmFibGVfdGV4dDogIumZhOWKoDIt6Ieq5Li75oum5oiq5Z+f5ZCNIiwKICAgICAgICAgICAgICBibG9ja2VuYWJsZV90aXRsZTogIueCueWHu+mhtemdomJsb2Nr5oyJ6ZKu5re75Yqg5L2g5oOz6KaB6ZqQ6JeP55qE5Zyw5Z2A77yM6ISa5pys5bCG6Ieq5Yqo6ZqQ6JeP6YOo5YiG57uT5p6c5Li65bCP5qiq5bmF77yMRElZ5oyJ6ZKu5Lit54K55Ye76KGo5qC85YaF5a655Y+v5Lul5Y+W5raI6ZqQ6JePIiwKICAgICAgICAgICAgICBibG9ja0RpeUJ0bl90ZXh0OiAiRElZIiwKICAgICAgICAgICAgICBibG9ja0RpeUJ0bl90aXRsZTogIuiHquWumuS5iUJMT0NLIiwKICAgICAgICAgICAgICBibG9ja0F1dG9SZW1vdmVfdGV4dDogIumakOiXj+e7k+aenCIsCiAgICAgICAgICAgICAgYmxvY2tBdXRvUmVtb3ZlX3RpdGxlOiAi6Ieq5Yqo6ZqQ6JeP5bey57uP5bGP6JS955qE5Z+f5ZCNIiwKICAgICAgICAgICAgICBibG9ja0J0blNob3dfdGV4dDogIumakOiXjydibG9jayfmjInpkq4iLAogICAgICAgICAgICAgIGJsb2NrQnRuU2hvd190aXRsZTogIumakOiXj+aOiWJsb2Nr5oyJ6ZKu55qE5pi+56S6IiwKCiAgICAgICAgICAgICAgdXNlclN0eWxlX3RleHQ6ICLpmYTliqAzLeiHquWumuS5ieagt+W8jyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JhaWR1X2xhYmxlOiAi5bGV5byA55m+5bqm6K6+572uPj4iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iYWlkdV9vcmlnaW46ICLnmb7luqYt5Y6f5aeL5qih5byPIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmFpZHVfaHV5YW46ICLnmb7luqYt5oqk55y85qih5byPIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmFpZHVfYmFpZHVMaXRlOiAi55m+5bqmTGl0Zeagt+W8jyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JhaWR1XzFsaW5lOiAi5Y2V5YiXIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmFpZHVfMWxpbmVfZW50ZXI6ICLljZXliJflsYXkuK0iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iYWlkdV8ybGluZTogIuWPjOWIlyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JhaWR1XzNsaW5lOiAi5LiJ5YiXIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmFpZHVfNGxpbmU6ICLlm5vliJciLAoKICAgICAgICAgICAgICB1c2VyU3R5bGVfZ29vZ2xlX2xhYmxlOiAi5bGV5byA6LC35q2M6K6+572uPj4iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9nb29nbGVfb3JpZ2luOiAi6LC35q2MLeWOn+Wni+aooeW8jyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2dvb2dsZV9odXlhbjogIuiwt+atjC3miqTnnLzmqKHlvI8iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9nb29nbGVfZ29vZ2xlTGl0ZTogIuiwt+atjC3kvKroo4Xnmb7luqYiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9nb29nbGVfMWxpbmU6ICLljZXliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9nb29nbGVfMWxpbmVfZW50ZXI6ICLljZXliJflsYXkuK0iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9nb29nbGVfMmxpbmU6ICLlj4zliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9nb29nbGVfM2xpbmU6ICLkuInliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9nb29nbGVfNGxpbmU6ICLlm5vliJciLAoKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmluZ19sYWJsZTogIuWxleW8gOW/heW6lOiuvue9rj4+IiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmluZ19vcmlnaW46ICLlv4XlupQt5Y6f5aeL5qih5byPIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmluZ19odXlhbjogIuW/heW6lC3miqTnnLzmqKHlvI8iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iaW5nXzFsaW5lOiAi5Y2V5YiXIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmluZ18xbGluZV9lbnRlcjogIuWNleWIl+WxheS4rSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JpbmdfMmxpbmU6ICLlj4zliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iaW5nXzNsaW5lOiAi5LiJ5YiXIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmluZ180bGluZTogIuWbm+WIlyIsCgogICAgICAgICAgICAgIHVzZXJTdHlsZV9zb2dvdV9sYWJsZTogIuWxleW8gOaQnOeLl+iuvue9rj4+IiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfc29nb3Vfb3JpZ2luOiAi5pCc54uXLeWOn+Wni+aooeW8jyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX3NvZ291X2h1eWFuOiAi5pCc54uXLeaKpOecvOaooeW8jyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX3NvZ291XzFsaW5lOiAi5Y2V5YiXIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfc29nb3VfMWxpbmVfZW50ZXI6ICLljZXliJflsYXkuK0iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9zb2dvdV8ybGluZTogIuWPjOWIlyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX3NvZ291XzNsaW5lOiAi5LiJ5YiXIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfc29nb3VfNGxpbmU6ICLlm5vliJciLAoKICAgICAgICAgICAgICB1c2VyU3R5bGVfZHVja19sYWJsZTogIuWxleW8gOm4rem4reaQnOiuvue9rj4+IiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZHVja19vcmlnaW46ICLpuK3puK0t5Y6f5aeL5qih5byPIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZHVja19odXlhbjogIum4rem4rS3miqTnnLzmqKHlvI8iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrX25vcm1hbDogIum4rem4rS3luLjop4HphY3nva4iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrXzFsaW5lOiAi5Y2V5YiXIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZHVja18xbGluZV9lbnRlcjogIuWNleWIl+WxheS4rSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2R1Y2tfMmxpbmU6ICLlj4zliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrXzNsaW5lOiAi5LiJ5YiXIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZHVja180bGluZTogIuWbm+WIlyIsCgogICAgICAgICAgICAgIHVzZXJTdHlsZV9kb2dlX2xhYmxlOiAi5bGV5byA5aSa5ZCJ6K6+572uPj4iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kb2dlX29yaWdpbjogIuWkmuWQiS3ljp/lp4vmqKHlvI8iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kb2dlX2h1eWFuOiAi5aSa5ZCJLeaKpOecvOaooeW8jyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2Vfbm9ybWFsOiAi5aSa5ZCJLeW4uOingemFjee9riIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2VfMWxpbmU6ICLljZXliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kb2dlXzFsaW5lX2VudGVyOiAi5Y2V5YiX5bGF5LitIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZG9nZV8ybGluZTogIuWPjOWIlyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2VfM2xpbmU6ICLkuInliJciLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kb2dlXzRsaW5lOiAi5Zub5YiXIiwKCiAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlX3RleHQ6ICLog4zmma/lm77vvJoiLAogICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZV90ZXh0X2hpbnQ6ICLlm77niYfpnIDopoHlhYHorrjot6jln5/vvIzlu7rorq7kvb/nlKjlm77luooiLAogICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZUF1dG9GaXRfdGV4dDogIuiHquWKqOS8mOWMliIsCiAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlQXV0b0ZpdF90ZXh0X2hpbnQ6ICLmnInog4zmma/lm77ml7bvvIzoh6rliqjkvJjljJbpobXpnaLmlYjmnpwiLAoKICAgICAgICAgICAgICBodXlhbk1vZGVfdGV4dDogIumZhOWKoDQt5oqk55y86aKc6Imy6YWN572uLeiHquWumuS5iTPkuK3pnIDlr7nlupTlvIDlkK8iLAogICAgICAgICAgICAgIGh1eWFuTW9kZV90aXRsZTogIu+8gemcgOimgeWcqOiHquWumuS5ieagt+W8j+S4reWQr+eUqOaKpOecvOaooeW8jyIsCiAgICAgICAgICAgICAgaHV5YW5Db2xvcl90ZXh0OiAi6buY6K6k5oqk55y86aKc6Imy77yaIiwKICAgICAgICAgICAgICBodXlhbkNvbG9yX3RpdGxlOiAi6Ieq5a6a5LmJ55qE5oqk55y86aKc6Imy77yaIiwKICAgICAgICAgICAgICBodXlhbkNvbG9yTW9yZV90ZXh0OiAi5pu05aSa6aKc6Imy6YCJ5oupIiwKCiAgICAgICAgICAgICAgZmF2aWNvbl90ZXh0OiAi6ZmE5YqgNS1GYXZpY29u5Yqf6IO9IiwKICAgICAgICAgICAgICBmYXZpY29uX3RpdGxlOiAiQUMt5re75YqgRmF2aWNvbiIsCiAgICAgICAgICAgICAgZmF2aWNvbl9kZWZhdWx0SWNvbl90ZXh0OiAiRmF2aWNvbum7mOiupOWbvuagh++8miIsCgogICAgICAgICAgICAgIHNlYXJjaE9yaWdpbl90ZXh0OiAi6ZmE5YqgNi3np7vpmaTnmb7luqbmkJzntKLpooTmtYso5paH5a2X6Ieq5Yqo5pCc57SiKSIsCiAgICAgICAgICAgICAgc2VhcmNoT3JpZ2luX3RpdGxlOiAiQUMt56e76Zmk5pCc57Si6aKE5rWLIiwKCiAgICAgICAgICAgICAgc2hvd1JpZ2h0X3RleHQ6ICLpmYTliqA3LeaYvuekuuWPs+S+p+agjyIsCiAgICAgICAgICAgICAgc2hvd0NvdW50ZXJfdGV4dDogIumZhOWKoDgt57yW5Y+35Yqf6IO9IiwKICAgICAgICAgICAgICBoaW50U2hvd0NvdW50ZXJfdGV4dDogIuWPr+iDveS8muWvvOiHtOWbvueJh+WKoOi9veW8guW4uCIsCiAgICAgICAgICAgICAgc2hvd0FMaW5lX3RleHQ6ICLpmYTliqA5LeaWh+Wtl+S4i+WIkue6vyIsCiAgICAgICAgICAgICAgc2hvd1VzZXJTdHlsZV90ZXh0OiAi6ZmE5YqgMTAt6Ieq5a6a5LmJ5qC35byPIOaUr+aMgUxlc3MuanMiLAoKICAgICAgICAgICAgICBjb250YWN0TWVfdGV4dDogIuiBlOezu+S9nOiAhSzmj5Dlu7rorq4s5a+75rGC5biu5YqpLOiHquWumuS5ieagt+W8jyzohJrmnKzlrprliLbngrnmiJEiLAogICAgICAgICAgICAgIGNvbnRhY3RNZV91cmw6ICJodHRwczovL2dpdGh1Yi5jb20vbGFuZ3JlbjEzNTMvR01fc2NyaXB0IiwKCiAgICAgICAgICAgICAgc2V0dGluZ19wYW5lbF9zZWNvbmQ6IHsKICAgICAgICAgICAgICAgIGJhY2tCdG5fdGV4dDogIjwt6L+U5ZueIiwKICAgICAgICAgICAgICAgIGJsb2NrTGFiZWxfdGV4dDogIiDmi6bmiKrliJfooaggIOaDs+imgeeUn+aViOeahOivnemcgOimgeaJi+WKqOS/neWtmCIsCiAgICAgICAgICAgICAgICBibG9ja0VkaXRCdG5fdGV4dDogIue8lui+keWIl+ihqCIsCiAgICAgICAgICAgICAgICBibG9ja0VkaXRCdG5FbmRfdGV4dDogIue7k+adn+e8lui+kSIsCiAgICAgICAgICAgICAgICBhZGRCbG9ja0xhYmVsX3RleHQ6ICLlhajljLnphY3mi6bmiKrvvJoiLAogICAgICAgICAgICAgICAgYWRkQnRuTGFiZWxfdGV4dDogIua3u+WKoCIsCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBjYW5jZWxCdG5fdGV4dDogIuWPlua2iCIsCiAgICAgICAgICAgICAgb2tCdG5fdGV4dDogIuS/neWtmCIsCiAgICAgICAgICAgICAgcmVzZXRCdG5fdGV4dDogIumHjee9riIsCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGVuOiB7CiAgICAgICAgICBtZW51X3RleHQ6ICJDVVNUT00iLAogICAgICAgICAgY3VyTGFuZzogImVuIiwKICAgICAgICAgIGZpZWxkc2V0X3BhbmVsOiB7CiAgICAgICAgICAgIHBhbmVsX3RpdGxlOiAiQUMgUmVkaXJlY3QgU2V0dGluZ3MgIiArIEdNX2luZm8uc2NyaXB0LnZlcnNpb24gKyAoaW5FeHRNb2RlPyAnRXh0JzonJyksCiAgICAgICAgICAgIHNldHRpbmdfcGFuZWw6IHsKICAgICAgICAgICAgICByZWRpcmVjdF90ZXh0OiAiTWFpbi1EZWFsIFJlZGlyZWN0IiwKICAgICAgICAgICAgICByZWRpcmVjdF90aXRsZTogIlR1cm4gb24gb3Igb2ZmIHJlZGlyZWN0IiwKICAgICAgICAgICAgICB1c2VFbl90ZXh0OiAiRW4tTGFuZ3VhZ2UiLAogICAgICAgICAgICAgIHVzZUVuX3RpdGxlOiAi5L2/55So6Iux5paH5pi+56S66aG16Z2iIiwKICAgICAgICAgICAgICBhZHNfdGV4dDogIkFkZDEtUmVtb3ZlIEFkcyIsCiAgICAgICAgICAgICAgYWRzX3RpdGxlOiAiUmVtb3ZlIHRoZSBhZHMgb24gdGhlIHBhZ2UsIGFuZCByZXR1cm4geW91IGEgY2xlYW4gcGFnZSIsCiAgICAgICAgICAgICAgYXV0b3BhZ2VfdGV4dDogIkF1dG8gUGFnZXIiLAogICAgICAgICAgICAgIGF1dG9wYWdlX3RpdGxlOiAiQXV0byBQYWdlciIsCiAgICAgICAgICAgICAgYmxvY2tlbmFibGVfdGV4dDogIkFkZDItQmxvY2sgaG9zdCIsCiAgICAgICAgICAgICAgYmxvY2tlbmFibGVfdGl0bGU6ICJDbGljayB0aGUgQmxvY2sgYnV0dG9uIHRvIGFkZCB0aGUgYWRkcmVzcyB3aGljaCB5b3Ugd2FudCB0byBoaWRlLiBUaGUgc2NyaXB0IHdpbGwgaGlkZSBpdCB3aXRoIHNtYWxsIGJhbm5lciBhdXRvbWF0aWNhbGx5LiBESVkgYnV0dG9uIGZvciBlZGl0dGluZyB0aGUgaGlkaW5nIGxpc3QiLAogICAgICAgICAgICAgIGJsb2NrRGl5QnRuX3RleHQ6ICJESVkiLAogICAgICAgICAgICAgIGJsb2NrRGl5QnRuX3RpdGxlOiAiRWRpdCBCTE9DSyIsCiAgICAgICAgICAgICAgYmxvY2tBdXRvUmVtb3ZlX3RleHQ6ICJBdXRvIHJlbW92ZSIsCiAgICAgICAgICAgICAgYmxvY2tBdXRvUmVtb3ZlX3RpdGxlOiAicmVtb3ZlIHRoZSBibG9jayByZXN1bHRzIGF1dG9tYXRpY2FsbHkiLAogICAgICAgICAgICAgIGJsb2NrQnRuU2hvd190ZXh0OiAiSGlkZSAnQmxvY2snIGJ1dHRvbiIsCiAgICAgICAgICAgICAgYmxvY2tCdG5TaG93X3RpdGxlOiAiSGlkZSAnQmxvY2snIGJ1dHRvbiIsCgogICAgICAgICAgICAgIHVzZXJTdHlsZV90ZXh0OiAiQWRkMy1DdXN0b21TdHlsZSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JhaWR1X2xhYmxlOiAiRXhwYW5kIEJhaWR1IFNldHRpbmdzPj4iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iYWlkdV9vcmlnaW46ICJCYWlkdS1PcmlnaW4iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iYWlkdV9odXlhbjogIkJhaWR1LUV5ZVNhdmUiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iYWlkdV9iYWlkdUxpdGU6ICJCYWlkdUxpdGVTdHlsZSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JhaWR1XzFsaW5lOiAiU2luZ2xlUm93IiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmFpZHVfMWxpbmVfZW50ZXI6ICJTaW5nbGVDZW50ZXIiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iYWlkdV8ybGluZTogIlR3byIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JhaWR1XzNsaW5lOiAiVGhyZWUiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iYWlkdV80bGluZTogIkZvdXIiLAoKICAgICAgICAgICAgICB1c2VyU3R5bGVfZ29vZ2xlX2xhYmxlOiAiRXhwYW5kIEdvb2dsZSBTZXR0aW5ncz4+IiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZ29vZ2xlX29yaWdpbjogIkdvb2dsZS1PcmlnaW4iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9nb29nbGVfaHV5YW46ICJHb29nbGUtRXllU2F2ZSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2dvb2dsZV9nb29nbGVMaXRlOiAiRmFrZSBCYWlkdSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2dvb2dsZV8xbGluZTogIlNpbmdsZVJvdyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2dvb2dsZV8xbGluZV9lbnRlcjogIlNpbmdsZUNlbnRlciIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2dvb2dsZV8ybGluZTogIlR3byIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2dvb2dsZV8zbGluZTogIlRocmVlIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZ29vZ2xlXzRsaW5lOiAiRm91ciIsCgogICAgICAgICAgICAgIHVzZXJTdHlsZV9iaW5nX2xhYmxlOiAiRXhwYW5kIEJpbmcgU2V0dGluZ3M+PiIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2Jpbmdfb3JpZ2luOiAiQmluZy1PcmlnaW4iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iaW5nX2h1eWFuOiAiQmluZy1FeWVTYXZlIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmluZ18xbGluZTogIlNpbmdsZVJvdyIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2JpbmdfMWxpbmVfZW50ZXI6ICJTaW5nbGVDZW50ZXIiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9iaW5nXzJsaW5lOiAiVHdvIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmluZ18zbGluZTogIlRocmVlIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfYmluZ180bGluZTogIkZvdXIiLAoKICAgICAgICAgICAgICB1c2VyU3R5bGVfc29nb3VfbGFibGU6ICJFeHBhbmQgU29Hb3UgU2V0dGluZ3M+PiIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX3NvZ291X29yaWdpbjogIlNvR291LU9yaWdpbiIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX3NvZ291X2h1eWFuOiAiU29Hb3UtRXllU2F2ZSIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX3NvZ291XzFsaW5lOiAiU2luZ2xlUm93IiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfc29nb3VfMWxpbmVfZW50ZXI6ICJTaW5nbGVDZW50ZXIiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9zb2dvdV8ybGluZTogIlR3byIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX3NvZ291XzNsaW5lOiAiVGhyZWUiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9zb2dvdV80bGluZTogIkZvdXIiLAoKICAgICAgICAgICAgICB1c2VyU3R5bGVfZHVja19sYWJsZTogIkV4cGFuZCBEdWNrRHVja0dvIFNldHRpbmdzPj4iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrX29yaWdpbjogIkR1Y2tEdWNrLU9yaWdpbiIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2R1Y2tfaHV5YW46ICJEdWNrRHVjay1FeWVTYXZlIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZHVja19ub3JtYWw6ICJEdWNrRHVjay1Ob3JtYWwiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrXzFsaW5lOiAiU2luZ2xlUm93IiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZHVja18xbGluZV9lbnRlcjogIlNpbmdsZUNlbnRlciIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2R1Y2tfMmxpbmU6ICJUd28iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrXzNsaW5lOiAiVGhyZWUiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kdWNrXzRsaW5lOiAiRm91ciIsCgogICAgICAgICAgICAgIHVzZXJTdHlsZV9kb2dlX2xhYmxlOiAiRXhwYW5kIERvZ2VEb2dlIFNldHRpbmdzPj4iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kb2dlX29yaWdpbjogIkRvZ2VEb2dlLU9yaWdpbiIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2VfaHV5YW46ICJEb2dlRG9nZS1FeWVTYXZlIiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZG9nZV9ub3JtYWw6ICJEb2dlRG9nZS1Ob3JtYWwiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kb2dlXzFsaW5lOiAiU2luZ2xlUm93IiwKICAgICAgICAgICAgICB1c2VyU3R5bGVfZG9nZV8xbGluZV9lbnRlcjogIlNpbmdsZUNlbnRlciIsCiAgICAgICAgICAgICAgdXNlclN0eWxlX2RvZ2VfMmxpbmU6ICJUd28iLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kb2dlXzNsaW5lOiAiVGhyZWUiLAogICAgICAgICAgICAgIHVzZXJTdHlsZV9kb2dlXzRsaW5lOiAiRm91ciIsCgogICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZV90ZXh0OiAiYmFja2dyb3VuZCBJbWFnZe+8miIsCiAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlX3RleHRfaGludDogIm9ubHkgQ09SUyBJbWFnZSBpcyBhbGxvd2VkIiwKICAgICAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2VBdXRvRml0X3RleHQ6ICJBdXRvIEZpdO+8miIsCiAgICAgICAgICAgICAgYmFja2dyb3VuZEltYWdlQXV0b0ZpdF90ZXh0X2hpbnQ6ICJwYWdlIGF1dG8gZml0IHdoZW4gQmcgaXMgbm90IG51bGwiLAoKICAgICAgICAgICAgICBodXlhbk1vZGVfdGV4dDogIkFkZDQtRXllU2F2ZSBDb2xvciBTZXR0aW5nLU5lZWQgb3BlbmVkIGluIEFkZDMiLAogICAgICAgICAgICAgIGh1eWFuTW9kZV90aXRsZTogIu+8gU9wZW4gRXllU2F2ZSBNb2RlIGluIEN1c3RvbVN0eWxlIGlzIE11c3QiLAogICAgICAgICAgICAgIGh1eWFuQ29sb3JfdGV4dDogIkRlZmF1bHQgRXllU2F2ZSBDb2xvcu+8miIsCiAgICAgICAgICAgICAgaHV5YW5Db2xvcl90aXRsZTogIlRoZSBjb2xvciBvZiBFeWVTYXZl77yaIiwKICAgICAgICAgICAgICBodXlhbkNvbG9yTW9yZV90ZXh0OiAiTW9yZSBDb2xvciIsCgogICAgICAgICAgICAgIGZhdmljb25fdGV4dDogIkFkZDUtRmF2aWNvbi5GdW5jIiwKICAgICAgICAgICAgICBmYXZpY29uX3RpdGxlOiAiQUMtQWRkRmF2aWNvbiIsCiAgICAgICAgICAgICAgZmF2aWNvbl9kZWZhdWx0SWNvbl90ZXh0OiAiRmF2aWNvbkZhaWxlZEltZ++8mu+8miIsCgogICAgICAgICAgICAgIHNlYXJjaE9yaWdpbl90ZXh0OiAiQUMtUmVtb3ZlIEJhaWR1IEF1dG9QcmVkaWN0IGluIHRleHQgc2VhcmNoIiwKICAgICAgICAgICAgICBzZWFyY2hPcmlnaW5fdGl0bGU6ICJBZGQ2LVJlbW92ZSBCYWlkdSBBdXRvUHJlZGljdCBpbiB0ZXh0IHNlYXJjaCIsCgogICAgICAgICAgICAgIHNob3dSaWdodF90ZXh0OiAiQWRkNy1SaWdodCBTaWRlIENvbHVtbiIsCiAgICAgICAgICAgICAgc2hvd0NvdW50ZXJfdGV4dDogIkFkZDgtTnVtRnVuYyIsCiAgICAgICAgICAgICAgaGludFNob3dDb3VudGVyX3RleHQ6ICJNYXkgQ2F1c2UgaW1hZ2UgbG9hZCBwcm9ibGVtIiwKICAgICAgICAgICAgICBzaG93QUxpbmVfdGV4dDogIkFkZDktVGV4dFVuZGVyTGluZSIsCiAgICAgICAgICAgICAgc2hvd1VzZXJTdHlsZV90ZXh0OiAiQWRkMTAtWW91ciBvd24gU3R5bGUgc3VwcG9ydCBMZXNzLmpzIiwKCiAgICAgICAgICAgICAgY29udGFjdE1lX3RleHQ6ICJGb3IgY29udGFjdCB0aGUgd3JpdHRlciwgc3VnZ2VzdHMsIGFzayBmb3IgaGVscCB0aGVuIGNsaWNrIG1lIiwKICAgICAgICAgICAgICBjb250YWN0TWVfdXJsOiAiaHR0cHM6Ly9naXRodWIuY29tL2xhbmdyZW4xMzUzL0dNX3NjcmlwdC8iLAoKICAgICAgICAgICAgICBzZXR0aW5nX3BhbmVsX3NlY29uZDogewogICAgICAgICAgICAgICAgYmFja0J0bl90ZXh0OiAiPC1CYWNrIiwKICAgICAgICAgICAgICAgIGJsb2NrTGFiZWxfdGV4dDogIiZuYnNwO0Jsb2NrIExpc3QmbmJzcDsmbmJzcDtDbGljayBTYXZlIEJ1dHRvbiBpZiB5b3Ugd2FudCB3byBzYXZlIHRoZSBsaXN0IiwKICAgICAgICAgICAgICAgIGJsb2NrRWRpdEJ0bl90ZXh0OiAiRWRpdCBMaXN0IiwKICAgICAgICAgICAgICAgIGJsb2NrRWRpdEJ0bkVuZF90ZXh0OiAiRW5kIEVkaXQiLAogICAgICAgICAgICAgICAgYWRkQmxvY2tMYWJlbF90ZXh0OiAiQWRkIEJsb2NrIGl0ZW3vvJoiLAogICAgICAgICAgICAgICAgYWRkQnRuTGFiZWxfdGV4dDogIkFkZCIsCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBjYW5jZWxCdG5fdGV4dDogIkNhbmNlbCIsCiAgICAgICAgICAgICAgb2tCdG5fdGV4dDogIlNhdmUiLAogICAgICAgICAgICAgIHJlc2V0QnRuX3RleHQ6ICJSZXNldCIsCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBsZXQgdnVlVk0gPSBudWxsOwogICAgLyoq5Yid5aeL5YyW5omA5pyJ55qE6K6+572uKiovCiAgICBQcm9taXNlLmFsbChbR00uZ2V0VmFsdWUoIkNvbmZpZyIpXSkudGhlbihmdW5jdGlvbiAoZGF0YSkgewogICAgICBsZXQgcmVzID0gZGF0YVswXQogICAgICBpZiAocmVzICYmIChyZXMgIT09ICd1bmRlZmluZWQnICYmIHJlcyAhPT0gJ251bGwnKSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICBBQ0NvbmZpZyA9IEpTT04ucGFyc2UocmVzKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBBQ0NvbmZpZyA9IHJlczsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgQUNDb25maWcgPSBEZWZhdWx0Q29uZmlnOwogICAgICB9CiAgICAgIGNvbnN0IGxvY2FsRGF0YSA9IGxvY2FsU3RvcmFnZS5BQ0NvbmZpZzsgLy8g5bCP5b+D6ZqQ56eB5qih5byPCiAgICAgIGlmKGxvY2FsRGF0YSAmJiBsb2NhbERhdGEubGVuZ3RoID4gMTApIHsgLy8g6YG/5YWN6YeN572u5Li6ICd7fScg5a+86Ie055qE6K+v5YikCiAgICAgICAgdHJ5ewogICAgICAgICAgQUNDb25maWcgPSBKU09OLnBhcnNlKGxvY2FsRGF0YSk7CiAgICAgICAgfWNhdGNoIChlKXt9CiAgICAgIH0KICAgICAgZm9yICh2YXIga2V5IGluIERlZmF1bHRDb25maWcpIHsKICAgICAgICBpZiAodHlwZW9mIChBQ0NvbmZpZ1trZXldKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgIEFDQ29uZmlnW2tleV0gPSBEZWZhdWx0Q29uZmlnW2tleV07CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChBQ0NvbmZpZy5pc1VzZXJTdHlsZUVuYWJsZSA9PT0gZmFsc2UgJiYgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gQUNDb25maWcubGFzdFNhdmVUaW1lID4gMjU5MjAwMDAwMCkpIHsgLy8g5aSn57qmMzDlpKnml7bpl7QKICAgICAgICAvLyDlpoLmnpznlKjmiLflj5bmtojkuoborr7nva7vvIzlubbkuJTplb/ml7bpl7QoMzDlpKkp5rKh5pyJ6L+b6KGM6L+H5aSE55CG77yM6YKj5LmI55u05o6l5bCG5pWw5o2u572u56m6IC0+IOeUqOS6juWIt+aWsOaVsOaNrgogICAgICAgIGNvbnNvbGUubG9nKCJhYy1iYWlkdSBjc3MgcmVzZXQgZm9yIHRpbWUiKTsKICAgICAgICBBQ0NvbmZpZy5sYXN0U2F2ZVRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICBBQ0NvbmZpZy5Vc2VyU3R5bGVUZXh0ID0gRGVmYXVsdENvbmZpZy5Vc2VyU3R5bGVUZXh0OwogICAgICAgIEFDU2V0VmFsdWUoIkNvbmZpZyIsIEpTT04uc3RyaW5naWZ5KHRoaXMuQUNDb25maWcpKQogICAgICB9CiAgICAgIEFsbERhdGEuQUNDb25maWcgPSBBQ0NvbmZpZzsKICAgICAgREJDb25maWcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEFDQ29uZmlnKSk7IC8vIOaaguaXtuS9nOS4uuS4gOS4quWOn+Wni+S/neWtmAogICAgICBBbGxEYXRhLmxhbi51c2UgPSBBQ0NvbmZpZy5pc0VuTGFuZyA/IEFsbERhdGEubGFuLmVuIDogQWxsRGF0YS5sYW4uemhfY247CiAgICAgIC8vIOWIneWni+WMluWujOaIkOS5i+WQjuaJjeiDveiwg+eUqOato+W4uOWHveaVsAogICAgICBjYWxsYmFjaygpOwogICAgfSkuY2F0Y2goZnVuY3Rpb24gKGV4Y2VwdCkgewogICAgICBjb25zb2xlLmxvZyhleGNlcHQpOwogICAgfSk7CgogICAgZnVuY3Rpb24gUmVnX0dldChIVE1MLCByZWcpIHsKICAgICAgbGV0IFJlZ0UgPSBuZXcgUmVnRXhwKHJlZyk7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIFJlZ0UuZXhlYyhIVE1MKVsxXTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiAiIjsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIEFDU2V0VmFsdWUoa2V5LCB2YWx1ZSkgewogICAgICBHTV9zZXRWYWx1ZShrZXksIHZhbHVlKTsKICAgICAgaWYoa2V5ID09PSAnQ29uZmlnJyl7CiAgICAgICAgaWYgKHZhbHVlKSBsb2NhbFN0b3JhZ2UuQUNDb25maWcgPSB2YWx1ZTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGdldEVsZW1lbnRCeVhwYXRoKGUsIHQsIHIpIHsKICAgICAgciA9IHIgfHwgZG9jdW1lbnQsIHQgPSB0IHx8IHI7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIHIuZXZhbHVhdGUoZSwgdCwgbnVsbCwgWFBhdGhSZXN1bHQuRklSU1RfT1JERVJFRF9OT0RFX1RZUEUsIG51bGwpLnNpbmdsZU5vZGVWYWx1ZTsKICAgICAgfSBjYXRjaCAodCkgewogICAgICAgIHJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIuaXoOaViOeahHhwYXRoIik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBnZXRBbGxFbGVtZW50c0J5WHBhdGgoeHBhdGgsIGNvbnRleHROb2RlKSB7CiAgICAgIHZhciBkb2MgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGRvY3VtZW50OwogICAgICBjb250ZXh0Tm9kZSA9IGNvbnRleHROb2RlIHx8IGRvYzsKICAgICAgdmFyIHJlc3VsdCA9IFtdOwoKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcXVlcnkgPSBkb2MuZXZhbHVhdGUoeHBhdGgsIGNvbnRleHROb2RlLCBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlcnkuc25hcHNob3RMZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIG5vZGUgPSBxdWVyeS5zbmFwc2hvdEl0ZW0oaSk7IC8vaWYgbm9kZSBpcyBhbiBlbGVtZW50IG5vZGUKCiAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkgcmVzdWx0LnB1c2gobm9kZSk7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgeHBhdGg6ICR7eHBhdGh9YCk7CiAgICAgIH0gLy9AdHMtaWdub3JlCiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZWxlY3QgbXVsdGlwbGUgZWxlbWVudHMgYnkgY3NzIHNlbGVjdG9yCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3NzIGNzcyBvZiBkb20KICAgICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gY29udGV4dE5vZGUgZG9tIGNvbnRleHROb2RlCiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnRbXX0gYW4gYXJyYXkgb2YgTm9kZXMKICAgICAqLwoKICAgIGZ1bmN0aW9uIGdldEFsbEVsZW1lbnRzQnlDU1MoY3NzKSB7CiAgICAgIHZhciBjb250ZXh0Tm9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZG9jdW1lbnQ7CiAgICAgIHJldHVybiBbXS5zbGljZS5jYWxsKGNvbnRleHROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoY3NzKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvcgogICAgICogQHBhcmFtIHtJU2VsZWN0b3JGdW5jdGlvbn0gc2VsZWN0b3IgY3NzIHNlbGVjdG9yIG9yIHhwYXRoIHNlbGVjdG9yCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR8RG9jdW1lbnR8RG9jdW1lbnRGcmFnbWVudH0gY29udGV4dE5vZGUgY29udGV4dE5vZGUgc3BlY2lmaWVzIHRoZSBjb250ZXh0IG5vZGUgZm9yIHRoZSBxdWVyeSAoc2VlIHRoZSBYUGF0aCBzcGVjaWZpY2F0aW9uKS4gSXQncyBjb21tb24gdG8gcGFzcyBkb2N1bWVudCBhcyB0aGUgY29udGV4dCBub2RlLgogICAgICogQHBhcmFtIHtEb2N1bWVudH0gZG9jIHRoZSBkb2N1bWVudCB0byBzZWxlY3QgZnJvbQogICAgICogQHBhcmFtIHtXaW5kb3d9IHdpbiB3aW5kb3cgb2YgdGhlIGJyb3dzZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBfY3BsaW5rIGN1cnJlbnQgcGFnZSBsaW5rCiAgICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnRbXX0gYW4gYXJyYXkgb2Ygbm9kZXMKICAgICAqLwoKICAgIGZ1bmN0aW9uIGdldEFsbEVsZW1lbnRzKHNlbGVjdG9yKSB7CiAgICAgIHZhciBjb250ZXh0Tm9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkOwogICAgICB2YXIgZG9jID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBkb2N1bWVudDsKICAgICAgdmFyIHdpbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogd2luZG93OwoKICAgICAgdmFyIF9jcGxpbmsgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiBhcmd1bWVudHNbNF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1s0XSA6IHVuZGVmaW5lZDsKCiAgICAgIGlmICghc2VsZWN0b3IpIHJldHVybiBbXTsgLy9AdHMtaWdub3JlCgogICAgICBjb250ZXh0Tm9kZSA9IGNvbnRleHROb2RlIHx8IGRvYzsKCiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgaWYgKHNlbGVjdG9yLnNlYXJjaCgvXmNzczsvaSkgPT09IDApIHsKICAgICAgICAgIHJldHVybiBnZXRBbGxFbGVtZW50c0J5Q1NTKHNlbGVjdG9yLnNsaWNlKDQpLCBjb250ZXh0Tm9kZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBnZXRBbGxFbGVtZW50c0J5WHBhdGgoc2VsZWN0b3IsIGNvbnRleHROb2RlLCBkb2MpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgcXVlcnkgPSBzZWxlY3Rvcihkb2MsIHdpbiwgX2NwbGluayk7CgogICAgICAgIGlmICghQXJyYXkuaXNBcnJheShxdWVyeSkpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV3JvbmcgdHlwZSBpcyByZXR1cm5lZCBieSBnZXRBbGxFbGVtZW50cycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gcXVlcnk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgY29uc3QgdGhyb3R0bGUgPSAoY2FsbGJhY2ssIHdhaXQgPSAxMDApID0+IHsKICAgICAgbGV0IGl0ID0gMAogICAgICBsZXQgcHJlVCA9IDAKICAgICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHsKICAgICAgICBjb25zdCBub3dUID0gKyBuZXcgRGF0ZSgpCiAgICAgICAgaWYobm93VCAtIHByZVQgPiB3YWl0KSB7CiAgICAgICAgICBwcmVUID0gbm93VAogICAgICAgICAgY2xlYXJUaW1lb3V0KGl0KQoKICAgICAgICAgIGl0ID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpCiAgICAgICAgICAgIGNsZWFyVGltZW91dChpdCkKICAgICAgICAgIH0sIHdhaXQpCiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY2FsbGJhY2soKSB7CiAgICAgIGlmIChBQ0NvbmZpZy5vbGRWZXJzaW9uID09PSBHTV9pbmZvLnNjcmlwdC52ZXJzaW9uKSB7CiAgICAgICAgQ09OU1QuaGFzTmV3RnVuY05lZWREaXNwbGF5ID0gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgQ09OU1QuaGFzTmV3RnVuY05lZWREaXNwbGF5ID0gbmVlZERpc3BsYXlOZXdGdW47CiAgICAgIH0KCiAgICAgICFmdW5jdGlvbigpIHsKICAgICAgICAvKioKICAgICAgICAgKiDov5vooYzkuI3ph43lpI3mj5LlhaXvvIzmj5LlhaXlkI7miafooYzlm57osIPlh73mlbAKICAgICAgICAgKiBAcGFyYW0gZGF0YSDlvoXmj5LlhaXmlbDmja4KICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sg5Zue6LCD5Ye95pWwCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYWNwdXNoKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICAvLyDlpoLmnpzmmK/lnoPlnL7mlbDmja7vvIzpgqPkuYjlj6/ku6XkuKLlvIPnmoQKICAgICAgICAgIGlmICghZGF0YSkgcmV0dXJuOwogICAgICAgICAgLy8g5aaC5p6c5pWw5o2u5Lit5pyJ5Zue6L2m77yM6YKj5pWw5o2u5Lmf5piv5peg5pWI55qE5q2j5paH6ICM5beyCiAgICAgICAgICBpZiAoZGF0YS5yZXBsYWNlKC8oe3x9fCx8XCt877yafOOAgnxcbikvKSAhPT0gZGF0YSkgcmV0dXJuOwogICAgICAgICAgaWYgKHRoaXMuZmluZEluZGV4KG0gPT4gbSA9PT0gZGF0YSkgPCAwKSB7CiAgICAgICAgICAgIHRoaXMucHVzaChkYXRhKTsKICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sodGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGFjcmVtb3ZlKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICBsZXQgZGVsSWQgPSB0aGlzLmZpbmRJbmRleChtID0+IG0gPT09IGRhdGEpOwogICAgICAgICAgaWYgKGRlbElkID49IDApIHsKICAgICAgICAgICAgdGhpcy5zcGxpY2UoZGVsSWQsIDEpOwogICAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayh0aGlzKTsKICAgICAgICAgIH0gLy8g5Yig6ZmkZGVsSWTnmoTmlbDmja7vvIzliKDpmaTkuIDkuKoKICAgICAgICB9CiAgICAgICAgLy8g6YG/5YWN5rGh5p+T5YWo5bGA5Y6f5Z6L6ZO+CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFDQ29uZmlnLlVzZXJCbG9ja0xpc3QsICdhY3B1c2gnLCB7dmFsdWU6IGFjcHVzaH0pCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFDQ29uZmlnLlVzZXJCbG9ja0xpc3QsICdhY3JlbW92ZScsIHt2YWx1ZTogYWNyZW1vdmV9KQogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvdGhlckRhdGEub3RoZXIuY3VySG9zdHMsICdhY3B1c2gnLCB7dmFsdWU6IGFjcHVzaH0pCiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG90aGVyRGF0YS5vdGhlci5jdXJIb3N0cywgJ2FjcmVtb3ZlJywge3ZhbHVlOiBhY3JlbW92ZX0pCiAgICAgIH0oKTsKCiAgICAgICFhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodHlwZW9mIEdNX2dldFJlc291cmNlVGV4dCA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIEdNLmdldFJlc291cmNlVGV4dCA9IEdNX2dldFJlc291cmNlVGV4dCA9IGFzeW5jIGZ1bmN0aW9uKGFSZXNvdXJjZU5hbWUpIHsKICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IChhd2FpdCBmZXRjaChhd2FpdCBHTS5nZXRSZXNvdXJjZVVybChhUmVzb3VyY2VOYW1lKSkpLnRleHQoKTsKICAgICAgICAgICAgbGV0IHNhdmVSZXMgPSBhd2FpdCBHTS5nZXRWYWx1ZShhUmVzb3VyY2VOYW1lKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiAoc2F2ZVJlcykgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgR00uc2V0VmFsdWUoYVJlc291cmNlTmFtZSwgcmVzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gc2F2ZVJlczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobG9jYXRpb24uaG9zdC5pbmNsdWRlcygieHVlc2h1LmJhaWR1LmNvbSIpKSB7CiAgICAgICAgICBjdXJTaXRlID0gREJTaXRlLmJhaWR1X3h1ZXNodTsKICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLmhvc3QuaW5jbHVkZXMoIi5iYWlkdS5jb20iKSkgewogICAgICAgICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQucmVwbGFjZSgvKGFuZHJvaWR8bW9iaWxlfGlwaG9uZSkvaWdtLCAiIikgIT09IG5hdmlnYXRvci51c2VyQWdlbnQpIHsKICAgICAgICAgICAgY3VyU2l0ZSA9IERCU2l0ZS5tQmFpZHU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdXJTaXRlID0gREJTaXRlLmJhaWR1OwogICAgICAgICAgfQogICAgICAgICAgQ09OU1QudXNlSXRlbSA9IEFDQ29uZmlnLmJhaWR1OwogICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24uaG9zdC5pbmNsdWRlcygiemhpaHUuY29tIikpIHsKICAgICAgICAgIGN1clNpdGUgPSBEQlNpdGUuemhpaHU7CiAgICAgICAgICBDT05TVC51c2VJdGVtID0gQUNDb25maWcuemhpaHU7CiAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbi5ob3N0LmluY2x1ZGVzKCJzb2dvdSIpKSB7CiAgICAgICAgICBjdXJTaXRlID0gREJTaXRlLnNvZ291OwogICAgICAgICAgQ09OU1QudXNlSXRlbSA9IEFDQ29uZmlnLnNvZ291OwogICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24uaG9zdC5pbmNsdWRlcygic28uY29tIikpIHsKICAgICAgICAgIGN1clNpdGUgPSBEQlNpdGUuaGFvc291OwogICAgICAgICAgQ09OU1QudXNlSXRlbSA9IEFDQ29uZmlnLm90aGVyOwogICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24uaG9zdC5pbmNsdWRlcygiZ29vZ2xlIikpIHsKICAgICAgICAgIGN1clNpdGUgPSBEQlNpdGUuZ29vZ2xlOwogICAgICAgICAgQ09OU1QudXNlSXRlbSA9IEFDQ29uZmlnLmdvb2dsZTsKICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLmhvc3QuaW5jbHVkZXMoImJpbmciKSkgewogICAgICAgICAgY3VyU2l0ZSA9IERCU2l0ZS5iaW5nOwogICAgICAgICAgQ09OU1QudXNlSXRlbSA9IEFDQ29uZmlnLmJpbmc7CiAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbi5ob3N0LmluY2x1ZGVzKCJkdWNrZHVja2dvIikpIHsKICAgICAgICAgIGN1clNpdGUgPSBEQlNpdGUuZHVjazsKICAgICAgICAgIENPTlNULnVzZUl0ZW0gPSBBQ0NvbmZpZy5kdWNrOwogICAgICAgIH0gZWxzZSBpZiAobG9jYXRpb24uaG9zdC5pbmNsdWRlcygiZG9nZWRvZ2UiKSkgewogICAgICAgICAgY3VyU2l0ZSA9IERCU2l0ZS5kb2dlOwogICAgICAgICAgQ09OU1QudXNlSXRlbSA9IEFDQ29uZmlnLmRvZ2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1clNpdGUgPSBEQlNpdGUub3RoZXI7CiAgICAgICAgICBDT05TVC51c2VJdGVtID0gQUNDb25maWcub3RoZXI7CiAgICAgICAgfQogICAgICAgIGN1clNpdGUucGFnZU51bSA9IDE7IC8vIOW9k+WJjemhteaVsAogICAgICAgIGN1clNpdGUucGFnZUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICBjdXJTaXRlLnBhZ2VVcmwgPSAiIjsKICAgICAgICBjdXJTaXRlLkdNU3R5bGVMaXN0ID0ge30KICAgICAgICBpZiAoCiAgICAgICAgICAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5HT09HTEUgJiYgbG9jYXRpb24uaHJlZi5yZXBsYWNlKC90Ym09KGlzY2h8bGNsfHNob3B8ZmxtKS8sICIiKSAhPT0gbG9jYXRpb24uaHJlZikgfHwKICAgICAgICAgIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkJJTkcgJiYgbG9jYXRpb24uaHJlZi5yZXBsYWNlKC9pbWFnZXNcL3NlYXJjaC8sICIiKSAhPT0gbG9jYXRpb24uaHJlZikKICAgICAgICApIHsKICAgICAgICAgIC8vIOWbvueJh+ermSDjgIHlnLDlm77nq5njgIHotK3niannq5kKICAgICAgICAgIGNvbnNvbGUubG9nKCLnibnmrornq5ks5LiN5Yqg6L295qC35byP77yM5LiN5re75YqgbWVudSIpOwogICAgICAgICAgQ09OU1QuaXNHb29nbGVJbWFnZVVybCA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5CQUlEVV9YVUVTSFUpIHsKICAgICAgICAgIENPTlNULnVzZUl0ZW0uQWRzU3R5bGVNb2RlID0gMjsgLy8g5Y2V5YiX5bGF5Lit5Y2z5Y+vCiAgICAgICAgfQoKICAgICAgICAvLyDpooTliqDovb1HTVJlc291cmNl55qEQ1NT562JCiAgICAgICAgcHJlTG9hZEdNU3R5bGUoKQogICAgICAgIAogICAgICAgIENPTlNULmZzQmFpZHUgPSBGU0JhaWR1KCk7CiAgICAgICAgCiAgICAgICAgaWYgKEFDQ29uZmlnLkFkc1N0eWxlRW5hYmxlKSB7CiAgICAgICAgICBDT05TVC5mc0JhaWR1LmluaXQoKSAvLyDmt7vliqDorr7nva7pobkt5Y2V5Y+M5YiX5pi+56S6CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKCtDT05TVC51c2VJdGVtLkFkc1N0eWxlTW9kZSA+IDApIHsgLy8g6Z2e5Y6f5aeL5qih5byP77yM6YKj5LmI5Y+v5Lul5Yqg6L295Zu+54mHCiAgICAgICAgICBpZihDT05TVC51c2VJdGVtLmRlZmF1bHRCZ1VybCAmJiBDT05TVC51c2VJdGVtLmRlZmF1bHRCZ1VybC50cmltKCkpIHsKICAgICAgICAgICAgY2hhbmdlU2l0ZUJhY2tncm91bmQoQ09OU1QudXNlSXRlbS5kZWZhdWx0QmdVcmwpCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjb25zb2xlLmxvZygiJWNbQUMtUmVkaXJlY3RdICVjTGV0IE1lIEludHJvZHVjZSB5b3UgYSBWZXJ5IEdvb2QgU2VhcmNoIEVuZ2luZe+8miVjICVzICVjU2VhcmNoIEVuZ2luZS4iLCAiZm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjpjb3JuZmxvd2VyYmx1ZSIsICJjb2xvcjowIiwgImZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6ZGFya29yYW5nZSIsIENPTlNULnVzZUl0ZW0ubmFtZS5yZXBsYWNlKENPTlNULnVzZUl0ZW0ubmFtZVswXSwgQ09OU1QudXNlSXRlbS5uYW1lWzBdLnRvVXBwZXJDYXNlKCkpLCAiZm9udC13ZWlnaHQ6bm9ybWFsO2NvbG9yOjAiKTsKCiAgICAgICAgbGV0IFNpdGVCbG9jayA9IHsKICAgICAgICAgIC8qKgogICAgICAgICAgICog5Yid5aeL5YyWQmxvY2vmoLflvI8KICAgICAgICAgICAqLwogICAgICAgICAgaW5pdFN0eWxlOiBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgQ09OU1QuZmx1c2hOb2RlLmluc2VydChhd2FpdCBjcmVhdGVfQ1NTX05vZGUoImJ1dHRvbi5naGhpZGVyLmdoaGJbYWMtdXNlci1hbHRlcj0nMSddOjpiZWZvcmV7Y29udGVudDon5Y+W5raIIC0gJzt9I3NwLWFjLWNvbnRhaW5lciAuYWMtYmxvY2staXRlbXtjb2xvcjojQUFBO21hcmdpbi1sZWZ0OjQ4cHg7fSNzcC1hYy1jb250YWluZXIgLmFjLWJsb2NrLWl0ZW1kZWx7ZmxvYXQ6cmlnaHQ7bWFyZ2luLWxlZnQ6MDtwYWRkaW5nOjAgMjBweDtjdXJzb3I6cG9pbnRlcjt9I3NwLWFjLWNvbnRhaW5lciAuYWMtYmxvY2staXRlbWRlbDpob3Zlcntjb2xvcjpyZWQ7fSNzcC1hYy1jb250YWluZXIgLmFjLWJsb2NrLWhpZ2h7Y29sb3I6IzAwMDt9LmFjLWJsb2NrTGlzdCBsaTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNhM2NhZmY7Y29sb3I6d2hpdGUgIWltcG9ydGFudDtjdXJzb3I6cG9pbnRlcjt9ICpbYWMtbmVlZGhpZGVdICp7ZGlzcGxheTpub25lfSAqW2FjLW5lZWRoaWRlXSAuYmxvY2tTaG93e2Rpc3BsYXk6dW5zZXQ7Y3Vyc29yOnBvaW50ZXI7fSAqW2FjLW5lZWRoaWRlXSAuYmxvY2tTaG93OmhvdmVye2JvcmRlcjoxcHggc29saWQgI0RERH1idXR0b24uZ2hoaWRlcntjb2xvcjojNTU1O2JhY2tncm91bmQtY29sb3I6I2ZjZmNmYztmb250LWZhbWlseTpzYW5zLXNlcmlmO21hcmdpbjphdXRvIDJweDtib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzoycHggM3B4fWJ1dHRvbi5naGhpZGVye2ZvbnQtc2l6ZToxMnB4fWJ1dHRvbi5naGhpZGVyOmhvdmVye2NvbG9yOiMwMDZhZmY7YmFja2dyb3VuZDojZmZmfSIsCiAgICAgICAgICAgICAgIkFDLUJsb2NrU3R5bGUiKSkKICAgICAgICAgIH0sCiAgICAgICAgICAvKioKICAgICAgICAgICAqIOWIneWni+WMluWxj+iUveaMiemSruWKoOi9vQogICAgICAgICAgICovCiAgICAgICAgICBpbml0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgbGV0IGNoZWNrTm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGN1clNpdGUuTWFpblR5cGUgKyAiOm5vdChbYmhhbmRsZV0pIik7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hlY2tOb2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxldCBjdXJOb2RlID0gY2hlY2tOb2Rlc1tpXTsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgbGV0IGZhdmljb25Ob2RlID0gY3VyTm9kZS5xdWVyeVNlbGVjdG9yKGN1clNpdGUuRmF2aWNvblR5cGUpOwogICAgICAgICAgICAgICAgbGV0IGhvc3QgPSBnZXROb2RlSG9zdChmYXZpY29uTm9kZSkuY3VySG9zdDsKICAgICAgICAgICAgICAgIGxldCBmYU5vZGUgPSBjdXJOb2RlLnF1ZXJ5U2VsZWN0b3IoY3VyU2l0ZS5CbG9ja1R5cGUpOwogICAgICAgICAgICAgICAgbGV0IG5vZGVTdHlsZSA9ICJkaXNwbGF5OnVuc2V0OyI7CiAgICAgICAgICAgICAgICBpZiAoQUNDb25maWcuaXNCbG9ja0J0bk5vdERpc3BsYXkpIHsKICAgICAgICAgICAgICAgICAgbm9kZVN0eWxlID0gImRpc3BsYXk6bm9uZTsiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8g6YG/5YWN54i26IqC54K55Ye6546w5Lik5LiqYmxvY2vmjInpkq4KICAgICAgICAgICAgICAgIGlmICghZmFOb2RlLmhhc0F0dHJpYnV0ZSgnaGFzSW5zZXJ0JykpIHsKICAgICAgICAgICAgICAgICAgZmFOb2RlLmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJlbmQiLCBgPGJ1dHRvbiBzdHlsZT0nJHsgbm9kZVN0eWxlIH0nIGNsYXNzPSdnaGhpZGVyIGdoaGInIGhyZWY9IiR7IGZhdmljb25Ob2RlLmhyZWYgfHwgZmF2aWNvbk5vZGUuaW5uZXJUZXh0IH0iIG1ldGE9IiR7IGhvc3QgfSIgZGF0YS1ob3N0PSIkeyBob3N0IH0iIHRpdGxlPSckeyB0aGlzLmdldEJsb2NrQnRuVGl0bGUoaG9zdCkgfSc+YmxvY2s8L2J1dHRvbj5gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZhTm9kZS5zZXRBdHRyaWJ1dGUoImhhc0luc2VydCIsICIxIik7CiAgICAgICAgICAgICAgICBjdXJOb2RlLnNldEF0dHJpYnV0ZSgiYmhhbmRsZSIsICIxIik7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29uc3QgZmFpbGVkX2NvdW50ID0gKyhjdXJOb2RlLmdldEF0dHJpYnV0ZSgnZmFpbGVkX2NvdW50JykgfHwgMSkKICAgICAgICAgICAgICAgIGN1ck5vZGUuc2V0QXR0cmlidXRlKCdmYWlsZWRfY291bnQnLCBmYWlsZWRfY291bnQgKyAxKQogICAgICAgICAgICAgICAgaWYgKGZhaWxlZF9jb3VudCA+IDMpIHsKICAgICAgICAgICAgICAgICAgY3VyTm9kZS5zZXRBdHRyaWJ1dGUoImJoYW5kbGUiLCAiMSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmluaXRMaXN0ZW5lcigpOwogICAgICAgICAgICB0aGlzLnJlbmRlckRpc3BsYXkoKTsKICAgICAgICAgIH0sCiAgICAgICAgICBnZXRCbG9ja0J0blRpdGxlKGhvc3QpIHsKICAgICAgICAgICAgcmV0dXJuIGDngrnlh7vljbPlj6/lsY/olL0gJHsgaG9zdCB9IOaUvuW8gO+8jOmcgOimgeWcqOiHquWumuS5ieS4reaJi+WKqOmFjee9ruaUvuW8gGA7CiAgICAgICAgICB9LAogICAgICAgICAgaW5pdExpc3RlbmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgbGV0IGNoZWNrTm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b24uZ2hoaWRlcjpub3QoW2FjRW52XSkiKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGVja05vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgY2hlY2tOb2Rlc1tpXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIHRoaXMuZG9IaWRlRW52KTsKICAgICAgICAgICAgICBjaGVja05vZGVzW2ldLnNldEF0dHJpYnV0ZSgiYWNFbnYiLCAiMCIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgZG9IaWRlRW52OiBmdW5jdGlvbihlbnYpIHsKICAgICAgICAgICAgLy8g5YWI5o+S5YWl5pWw5o2uLS0t6K6w5b6X6L+Y6KaB5YaZ5YWl5a2Y5YKoCiAgICAgICAgICAgIGxldCBub2RlID0gZW52LnNvdXJjZVRhcmdldCB8fCBlbnYudGFyZ2V0OwogICAgICAgICAgICBsZXQgaG9zdCA9IG5vZGUuZGF0YXNldC5ob3N0OwogICAgICAgICAgICBpZiAoK25vZGUuZ2V0QXR0cmlidXRlKCJhYy11c2VyLWFsdGVyIikgPT09IDEpIHsKICAgICAgICAgICAgICAvLyDlt7Lnu4/lsY/olL3kuYvlkI7vvIzlho3mrKHngrnlh7tibG9ja+W6lOivpeaYr+WPlua2iOeKtuaAgQogICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCJhYy11c2VyLWFsdGVyIik7CiAgICAgICAgICAgICAgQUNDb25maWcuVXNlckJsb2NrTGlzdC5hY3JlbW92ZShob3N0KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyDmraPluLjlsY/olL3mk43kvZwKICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgiYWMtdXNlci1hbHRlciIpOwogICAgICAgICAgICAgIEFDQ29uZmlnLlVzZXJCbG9ja0xpc3QuYWNwdXNoKGhvc3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIERCQ29uZmlnLlVzZXJCbG9ja0xpc3QgPSBBQ0NvbmZpZy5Vc2VyQmxvY2tMaXN0OwogICAgICAgICAgICBBQ1NldFZhbHVlKCJDb25maWciLCBKU09OLnN0cmluZ2lmeShEQkNvbmZpZykpOyAvLyDngrnlh7vkuIDmrKHvvIzkv53lrZjkuIDmrKEKICAgICAgICAgICAgZW52LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgfSwKICAgICAgICAgIC8vIOWIt+aWsOaYvuekuuaViOaenC0t6ICX5pe25pON5L2cCiAgICAgICAgICByZW5kZXJEaXNwbGF5OiB0aHJvdHRsZShmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8g5aKe5YqgY2hlY2tpbmfkuK3nmoTmo4Dmn6XvvIzpgb/lhY3lpJrmrKHph43lpI3osIPnlKjvvIzlh4/lsJFjcHXmtojogJcKICAgICAgICAgICAgaWYgKG90aGVyRGF0YS5vdGhlci5pc0Jsb2NrQ2hlY2tpbmcpIHJldHVybgogICAgICAgICAgICBvdGhlckRhdGEub3RoZXIuaXNCbG9ja0NoZWNraW5nID0gdHJ1ZQoKICAgICAgICAgICAgbGV0IGNoZWNrTm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGN1clNpdGUuTWFpblR5cGUpOwogICAgICAgICAgICBsZXQgeyBtZDU6IG1kNV90YWcgPSAnJywgbGlzdDogcmVnTGlzdCA9IFtdIH0gPSAodnVlVk0gJiYgdnVlVk0uY2FsY19ibG9ja19kYXRhKSB8fCB7fTsgLy8g5L2/55SoVnVl55qEY29tcHV0ZWTlsZ7mgKforqHnrpfnmoTmlbDmja7lgLzvvIzkuIDoiKzmoLnmnKzkuI3mm7TmlrAKICAgICAgICAgICAgbGV0IGZsYWcgPSAiYWMtbmVlZGhpZGUiOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoZWNrTm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgbGV0IGN1ck5vZGUgPSBjaGVja05vZGVzW2ldOwogICAgICAgICAgICAgICAgbGV0IHsgY3VySG9zdCwgY3VyVXJsIH0gPSBnZXROb2RlSG9zdChjdXJOb2RlLnF1ZXJ5U2VsZWN0b3IoY3VyU2l0ZS5GYXZpY29uVHlwZSkpOwogICAgICAgICAgICAgICAgY3VyVXJsID0gY3VyVXJsIHx8ICIiOwogICAgICAgICAgICAgICAgaWYgKGN1ckhvc3QgPT09IG51bGwpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgbGV0IEJsb2NrQnRuID0gY3VyTm9kZS5xdWVyeVNlbGVjdG9yKCIuZ2hoaWRlci5naGhiIik7CiAgICAgICAgICAgICAgICBCbG9ja0J0bi5kYXRhc2V0Lmhvc3QgPSBCbG9ja0J0bi5kYXRhc2V0Lm1ldGEgPSBjdXJIb3N0OwogICAgICAgICAgICAgICAgQmxvY2tCdG4udGl0bGUgPSB0aGlzLmdldEJsb2NrQnRuVGl0bGUoY3VySG9zdCk7CiAgICAgICAgICAgICAgICBpZiAoY3VyTm9kZS5xdWVyeVNlbGVjdG9yKCJidXR0b25bYWMtdXNlci1hbHRlcl0iKSAhPSBudWxsKSBjb250aW51ZTsgLy8g55So5oi35omL5Yqo54K56L+H5pi+56S655qE77yM6YKj5LmI6Lez6L+HY2hlY2sKCiAgICAgICAgICAgICAgICAvLyDlh4/lsJHmlbDmja7orqHnrpcKICAgICAgICAgICAgICAgIGlmIChjdXJOb2RlLmRhdGFzZXQubWQ1ICYmIGN1ck5vZGUuZGF0YXNldC5tZDUgPT09IG1kNV90YWcpIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiAoY3VyVXJsICYmIHJlZ0xpc3QuZmluZEluZGV4KG9uZSA9PiB7CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uZS50ZXN0KGN1ckhvc3QpIHx8IG9uZS50ZXN0KGN1clVybCk7IC8vIOiAl+aXtuaTjeS9nAogICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uZSA9PT0gY3VySG9zdDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkgPj0gMCkgewogICAgICAgICAgICAgICAgICAvLyDlj6rmo4Dmn6XlnKjlsY/olL3ooajkuK3nmoTmlbDmja4KICAgICAgICAgICAgICAgICAgaWYgKCFjdXJOb2RlLmhhc0F0dHJpYnV0ZShmbGFnKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChBQ0NvbmZpZy5pc0Jsb2NrRGlzcGxheSkgeyAvLyDlr7nkuo7kuI3mmL7npLrnmoTmlbDmja7lj6/ku6Xov5vooYznp7vpmaTmk43kvZwKICAgICAgICAgICAgICAgICAgICAgIGN1ck5vZGUucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGV0IGN1clRpdGxlID0gY3VyTm9kZS5xdWVyeVNlbGVjdG9yKGN1clNpdGUuQmxvY2tUeXBlKTsKICAgICAgICAgICAgICAgICAgICBjdXJUaXRsZSA9IGN1clRpdGxlLmlubmVyVGV4dCB8fCBjdXJUaXRsZS50ZXh0Q29udGVudDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGN1ck5vZGUuaGFzQXR0cmlidXRlKGZsYWcpKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5Yay56qB5LqG77yB77yB77yBIik7CiAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGN1ck5vZGUuc2V0QXR0cmlidXRlKGZsYWcsICIxIik7CiAgICAgICAgICAgICAgICAgICAgY3VyTm9kZS5pbnNlcnRBZGphY2VudEhUTUwoImFmdGVyQmVnaW4iLCBgPHNwYW4gY2xhc3M9ImJsb2NrU2hvdyIgdGl0bGU9IuWmguaenOmcgOimgeS4gOebtOaYvuekuu+8jOivt+WcqOiHquWumuS5ieS4rURJWeebruW9leenu+mZpOacrOWcsOWdgCI+JHsgY3VyVGl0bGUgfSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAtYmxvY2sgYnkgJHsgY3VySG9zdCB9PC9zcGFuPmApOwoKICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24oeGN1cikgewogICAgICAgICAgICAgICAgICAgICAgLy8g5bey57uP5bGP6JS95LmL5ZCO55qE5YaF5a6577yM54K55Ye75LiA5LiL5pi+56S65Y6f5aeL5YaF5a65CiAgICAgICAgICAgICAgICAgICAgICB4Y3VyLnF1ZXJ5U2VsZWN0b3IoIi5ibG9ja1Nob3ciKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKGVudikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcigiYnV0dG9uLmdoaGlkZXIiKS5zZXRBdHRyaWJ1dGUoImFjLXVzZXItYWx0ZXIiLCAiMSIpOyAvLyDov5nkuKrlsZ7mgKfnlKjkuo7kv53mjIHlnKhET03mm7TmlrDml7bvvIzmjInpkq7kuI3lj5gKICAgICAgICAgICAgICAgICAgICAgICAgeGN1ci5yZW1vdmVBdHRyaWJ1dGUoZmxhZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVGdW5jdGlvbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB4Y3VyLnF1ZXJ5U2VsZWN0b3IoIi5ibG9ja1Nob3ciKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudi5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pKGN1ck5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBjdXJOb2RlLnJlbW92ZUF0dHJpYnV0ZShmbGFnKTsKICAgICAgICAgICAgICAgICAgc2FmZUZ1bmN0aW9uKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGN1ck5vZGUucXVlcnlTZWxlY3RvcigiLmJsb2NrU2hvdyIpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGN1ck5vZGUuZGF0YXNldC5tZDUgPSBtZDVfdGFnCiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgb3RoZXJEYXRhLm90aGVyLmlzQmxvY2tDaGVja2luZyA9IGZhbHNlCiAgICAgICAgICB9LCA1MCkKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBwcmVMb2FkR01TdHlsZSgpIHsKICAgICAgICAgIGZ1bmN0aW9uIGxvYWRSZXNvdXJjZShyZXNvdXJjZU5hbWUpIHsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IEdNX2dldFJlc291cmNlVGV4dChyZXNvdXJjZU5hbWUpCiAgICAgICAgICAgIGN1clNpdGUuR01TdHlsZUxpc3RbcmVzb3VyY2VOYW1lXSA9IGRhdGEKICAgICAgICAgIH0KICAgICAgICAgIGxvYWRSZXNvdXJjZShDT05TVC51c2VJdGVtLm5hbWUgKyAiQ29tbW9uU3R5bGUiKQogICAgICAgICAgbG9hZFJlc291cmNlKENPTlNULnVzZUl0ZW0ubmFtZSArICJPbmVQYWdlU3R5bGUiKQogICAgICAgICAgbG9hZFJlc291cmNlKENPTlNULnVzZUl0ZW0ubmFtZSArICJUd29QYWdlU3R5bGUiKQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gYWRkU3R5bGUoY3NzKSB7IC8v5re75YqgQ1NT55qE5Luj56CBLS1jb3B555qECiAgICAgICAgICBsZXQgcGkgPSBkb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oCiAgICAgICAgICAgICd4bWwtc3R5bGVzaGVldCcsCiAgICAgICAgICAgICd0eXBlPSJ0ZXh0L2NzcyIgbXVzdD0iZmFsc2UiIGhyZWY9ImRhdGE6dGV4dC9jc3M7dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChjc3MpICsgJyInCiAgICAgICAgICApOwogICAgICAgICAgcmV0dXJuIGRvY3VtZW50Lmluc2VydEJlZm9yZShwaSwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTsKICAgICAgICB9CgogICAgICAgIGlmIChBQ0NvbmZpZy5pc0Fkc0VuYWJsZSkgewogICAgICAgICAgLy8gZGlzcGxheeW3sue7j+aXoOazlemakOiXj+S7luS7rOS6hu+8jOmcgOimgeeUqOe7neWvueeahOmakOiXjwogICAgICAgICAgQ09OU1QuZmx1c2hOb2RlLmluc2VydChhd2FpdCBjcmVhdGVfQ1NTX05vZGUoIiNib3R0b21hZHN7ZGlzcGxheTpub25lO30gI2NvbnRlbnRfbGVmdD5kaXY6bm90KFtpZF0pPmRpdltjbWF0Y2hpZF0sICNjb250ZW50X2xlZnQ+ZGl2W2lkKj0nMzAwJ106bm90KFtjbGFzcyo9J3Jlc3VsdCddKSwjY29udGVudF9yaWdodCB0ZD5kaXY6bm90KFtpZF0pLCNjb250ZW50X3JpZ2h0PmJye3Bvc2l0aW9uOmFic29sdXRlO3RvcDotNjY2NnB4O30iLCAnQUMtQWRzU3R5bGUnKSkKICAgICAgICB9CiAgICAgICAgaWYoQUNDb25maWcuaXNGYXZpY29uRW5hYmxlKSB7CiAgICAgICAgICBDT05TVC5mbHVzaE5vZGUuaW5zZXJ0KGF3YWl0IGNyZWF0ZV9DU1NfTm9kZSgiaDM6OmJlZm9yZSwgaDI6OmJlZm9yZSB7Y29udGVudDogJyAnO2Rpc3BsYXk6aW5saW5lLWJsb2NrfSIsICJBQy1TdHlsZS1GYXZpY29uIikpCiAgICAgICAgfQogICAgICAgIGlmIChBQ0NvbmZpZy5pc0Jsb2NrRW5hYmxlKSB7CiAgICAgICAgICBTaXRlQmxvY2suaW5pdFN0eWxlKCkgLy8g5Yid5aeL5YyW5oum5oiq5qC35byPCiAgICAgICAgfQogICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkdPT0dMRSAmJiBBQ0NvbmZpZy5pc0dvb2xlSW5CYWlkdU1vZGVFbmFibGUpIHsKICAgICAgICAgIHNhZmVXYWl0RnVuYygiI2xvZ28gaW1nLCAjbG9nb2NvbnQgaW1nIiwgZnVuY3Rpb24obm9kZSkgewogICAgICAgICAgICBsZXQgZmFOb2RlID0gbm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgIGZhTm9kZS5jbGFzc0xpc3QuYWRkKCJiYWlkdSIpOwogICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgic3JjIik7CiAgICAgICAgICAgIG5vZGUuc3JjID0gImh0dHBzOi8vcGljLnJtYi5iZHN0YXRpYy5jb20vYzg2MjU1ZTgwMjg2OTYxMzlkM2UzZTRiYjQ0YzA0N2IucG5nIjsKICAgICAgICAgICAgbm9kZS53aWR0aCA9ICIxMjUiOwogICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgiaGVpZ2h0Iik7CiAgICAgICAgICB9KTsKICAgICAgICAgIHNhZmVXYWl0RnVuYygiI21haW4gLmxvZ28gaW1nW2FsdD0nR29vZ2xlJ10iLCBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCJzcmNzZXQiKTsKICAgICAgICAgICAgbm9kZS5zcmMgPSAiaHR0cHM6Ly9waWMucm1iLmJkc3RhdGljLmNvbS9jODYyNTVlODAyODY5NjEzOWQzZTNlNGJiNDRjMDQ3Yi5wbmciOwogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwgIjQwIik7CiAgICAgICAgICB9LCAzMDApOwogICAgICAgICAgc2FmZVdhaXRGdW5jKCJmb3JtW3JvbGU9J3NlYXJjaCddIC5sb2dvIGltZyIsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoInNyY3NldCIpOwogICAgICAgICAgICBub2RlLnNyYyA9ICJodHRwczovL3BpYy5ybWIuYmRzdGF0aWMuY29tL2M4NjI1NWU4MDI4Njk2MTM5ZDNlM2U0YmI0NGMwNDdiLnBuZyI7CiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCAiNDAiKTsKICAgICAgICAgIH0sIDMwMCk7CiAgICAgICAgICBkb2N1bWVudC50aXRsZSA9IGRvY3VtZW50LnRpdGxlLnJlcGxhY2UoL15Hb29nbGUvLCAi55m+5bqm5LiA5LiL77yM5L2g5bCx55+l6YGTIikKICAgICAgICAgICAgLnJlcGxhY2UoLyAtIEdvb2dsZSDmkJzntKIvLCAiX+eZvuW6puaQnOe0oiIpCiAgICAgICAgICAgIC5yZXBsYWNlKC8gLSBHb29nbGUgU2VhcmNoLywgIl/nmb7luqbmkJzntKIiKTsKICAgICAgICAgIHNhZmVXYWl0RnVuYygiaGVhZCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBsZXQgbGlua1RhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImxpbmtbdHlwZT0naW1hZ2UveC1pY29uJ10iKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7CiAgICAgICAgICAgIGxpbmtUYXJnZXQudHlwZSA9ICdpbWFnZS94LWljb24nOwogICAgICAgICAgICBsaW5rVGFyZ2V0LnJlbCA9ICdzaG9ydGN1dCBpY29uJzsKICAgICAgICAgICAgbGlua1RhcmdldC5ocmVmID0gJ2h0dHBzOi8vd3d3LmJhaWR1LmNvbS9mYXZpY29uLmljbyc7CiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGlua1RhcmdldCk7CiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5EVUNLKSB7CiAgICAgICAgICBhZGRTdHlsZSA9IEFDX2FkZFN0eWxlIC8vIOWFvOWuuUR1Y2vnmoRDU1DlkIzmupDop4TliJkKICAgICAgICAgIGlmIChBQ0NvbmZpZy5ub3JtYWxpemVEdWNrKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIERERy5zZXR0aW5ncy5zZXQoImtuIiwgMSwgeyAgLy8g5paw56qX5Y+j5omT5byA6aG16Z2iCiAgICAgICAgICAgICAgICAgIHNhdmVUb0Nsb3VkOiB0cnVlLAogICAgICAgICAgICAgICAgICBmb3JjZVRoZW1lOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIERERy5zZXR0aW5ncy5zZXQoImthdiIsIDEsIHsgLy8g6L+e57ut5pi+56S65pCc57Si57uT5p6cCiAgICAgICAgICAgICAgICAgIHNhdmVUb0Nsb3VkOiB0cnVlLAogICAgICAgICAgICAgICAgICBmb3JjZVRoZW1lOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCA1MDAwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgIT09IFNpdGVUeXBlLk9USEVSUykgewogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLCBNYWluQ2FsbGJhY2ssIGZhbHNlKTsKICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBNYWluQ2FsbGJhY2ssIGZhbHNlKTsKICAgICAgICAgICAgc2FmZVdhaXRGdW5jKCJib2R5IiwgKCkgPT4gewogICAgICAgICAgICAgICFkb2N1bWVudC5ib2R5Lmhhc0F0dHJpYnV0ZShDT05TVC51c2VJdGVtLm5hbWUpICYmIGRvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKENPTlNULnVzZUl0ZW0ubmFtZSwgIjEiKTsKICAgICAgICAgICAgICAhZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoQ09OU1QudXNlSXRlbS5uYW1lKSAmJiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoQ09OU1QudXNlSXRlbS5uYW1lKTsKICAgICAgICAgICAgICBpZiAoQUNDb25maWcuQWRzU3R5bGVFbmFibGUpIHsgLy8g5Y2V54us5LiN6ZyA6KaB5a6a5pe25ZmoLemgu+e5geinpuWPkS3ovb3lhaVjc3MKICAgICAgICAgICAgICAgIENPTlNULmZzQmFpZHUuaW5pdCgpOwogICAgICAgICAgICAgICAgQWRkQ3VzdG9tU3R5bGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgSW5zZXJ0U2V0dGluZ01lbnVDU1MoKQogICAgICAgICAgICAgIHJhcGlkRGVhbCgpIC8vIOmihOWFiOaJp+ihjOS4gOasoe+8jOS/neivgeivpeWHveaVsOS4jeW7tui/n++8jOmBv+WFjeagt+W8j+aPkuWFpeacieW7tui/nwogICAgICAgICAgICB9KQogICAgICAgICAgICBpZiAoQUNDb25maWcuaXNBZHNFbmFibGUpIHsgLy8g5YWI5p2l56e76Zmk5aSa5L2Z55qE5bm/5ZGK5YaF5a65CiAgICAgICAgICAgICAgcmVtb3ZlQURfYmFpZHVfc29nb3UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBDT05TVC5mbHVzaE5vZGUuZmx1c2goKQogICAgICAgICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgICAgQ09OU1QuZmx1c2hOb2RlLmZsdXNoKCkKICAgICAgICAgICAgfSwgMjAwKQogICAgICAgICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuYm9keSkgewogICAgICAgICAgICAgICAgcmFwaWREZWFsKCk7IC8vIOWumuacn+iwg+eUqO+8jOmBv+WFjeacieaXtuWAmURPTeaPkuWFpeayoeacieaJp+ihjOWvvOiHtOeahOmXrumimAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgODAwKTsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgSW5zZXJ0U2V0dGluZ01lbnUoKTsgLy8g562J5b6FbWVudeagt+W8j+WKoOi9ve+8jOW7tui/n+aPkuWFpW1lbnUKICAgICAgICAgICAgICBTaG93U2V0dGluZygpOwogICAgICAgICAgICB9LCAyMDApCiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgICAgfQogICAgICAgIHNhZmVXYWl0RnVuYygiI3NwLWFjLWNvbnRlbnQiLCBmdW5jdGlvbihjaGVja05vZGUpIHsKICAgICAgICAgIHZhciBvcHRpb25zID0gewogICAgICAgICAgICBlbDogY2hlY2tOb2RlLAogICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgLi4uQWxsRGF0YSwKICAgICAgICAgICAgICAgIExpdmVDb25maWc6IHsKICAgICAgICAgICAgICAgICAgY3NzX2hhc19lcnJvcjogZmFsc2UKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICByZXNldENTU190ZXh0OiAn6YeN572uQ1NTJywKICAgICAgICAgICAgICAgIGNhbGNfYmxvY2tfZGF0YToge30KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG1ldGhvZHM6IHsKICAgICAgICAgICAgICBhc3luYyBsYWJlbFNob3dIaWRlRW52KGUpIHsKICAgICAgICAgICAgICAgIGxldCBjdXIgPSBlLnNyY0VsZW1lbnQgfHwgZS50YXJnZXQ7CiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gY3VyLnBhcmVudE5vZGUuY2xhc3NOYW1lLnJlcGxhY2UoImNvbnRhaW5lci1sYWJlbCAiLCAiIik7CiAgICAgICAgICAgICAgICBDT05TVC5mbHVzaE5vZGUuaW5zZXJ0KGF3YWl0IGNyZWF0ZV9DU1NfTm9kZSgiLlhYPmxhYmVsLC5YWD5icntkaXNwbGF5OnVuc2V0ICFpbXBvcnRhbnQ7fS5YWD4ubGFiZWxfaGlkZXtkaXNwbGF5Om5vbmUgIWltcG9ydGFudDt9Ii5yZXBsYWNlKC9YWC9nbSwgY2xhc3NOYW1lKSwKICAgICAgICAgICAgICAgICAgIkFDLVNob3dIaWRlSXRlbS0iICsgY2xhc3NOYW1lKSwgJ2JvZHknKQogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHN5bmNUb0Jsb2NrTGlzdChlbnYpIHsKICAgICAgICAgICAgICAgIHRoaXMuQUNDb25maWcuVXNlckJsb2NrTGlzdCA9IGVudi50YXJnZXQudmFsdWUuc3BsaXQoIlxuIikuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gJycpOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgcmVtb3ZlQUJsb2NrTGlzdEl0ZW0oZSkgewogICAgICAgICAgICAgICAgLy8g54K55Ye756e76Zmk5p+Q5LiqaG9zdOaVsOaNruaXtgogICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGUuc3JjRWxlbWVudCB8fCBlLnRhcmdldDsKICAgICAgICAgICAgICAgIGlmICh0YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAibGFiZWwiKSB7CiAgICAgICAgICAgICAgICAgIGxldCBob3N0ID0gdGFyZ2V0LmRhdGFzZXQuaG9zdDsKICAgICAgICAgICAgICAgICAgQUNDb25maWcuVXNlckJsb2NrTGlzdC5hY3JlbW92ZShob3N0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGNrQWRkUnVsZSgpIHsKICAgICAgICAgICAgICAgIC8vIOaJi+WKqOWinuWKoOenu+mZpOinhOWImQogICAgICAgICAgICAgICAgQUNDb25maWcuVXNlckJsb2NrTGlzdC5hY3B1c2godGhpcy5vdGhlci5hZGRCbG9ja0l0ZW0pOwogICAgICAgICAgICAgICAgdGhpcy5vdGhlci5hZGRCbG9ja0l0ZW0gPSAiIjsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGxvYWRDdXN0b21TdHlsZSgpIHsKICAgICAgICAgICAgICAgIGxlc3MucmVuZGVyKEFDQ29uZmlnLlVzZXJTdHlsZVRleHQsIGFzeW5jIChlLCBjc3MpID0+IHsKICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLkxpdmVDb25maWcuY3NzX2hhc19lcnJvciA9IHRydWUKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLkxpdmVDb25maWcuY3NzX2hhc19lcnJvciA9IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgY3NzID0gY3NzLmNzcyB8fCAnJwogICAgICAgICAgICAgICAgICAgIENPTlNULmZsdXNoTm9kZS5pbnNlcnQoYXdhaXQgY3JlYXRlX0NTU19Ob2RlKGNzcywgIkFDLXVzZXJTdHlsZSIpLCAnaGVhZCcsIHsKICAgICAgICAgICAgICAgICAgICAgIGlzUmVsb2FkOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBzYXZlQ29uZmlnKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMub3RoZXIuY3VyVGFiID09PSAxICYmICF0aGlzLkFDQ29uZmlnLmFjY2VwdExpY2Vuc2UpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5vdGhlci5jdXJUYWIgPSAzCiAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5BQ0NvbmZpZy5hY2NlcHRMaWNlbnNlID0gdHJ1ZQoKICAgICAgICAgICAgICAgIHRoaXMuQUNDb25maWcubGFzdFNhdmVUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICBBQ1NldFZhbHVlKCJDb25maWciLCBKU09OLnN0cmluZ2lmeSh0aGlzLkFDQ29uZmlnKSk7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuQUNDb25maWcuZG9EaXNhYmxlU3VnKSB7CiAgICAgICAgICAgICAgICAgIGFjU2V0Q29va2llKCJPUklHSU4iLCAxLCAid3d3LmJhaWR1LmNvbSIsIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gODY0MDAwMDApOwogICAgICAgICAgICAgICAgICBhY1NldENvb2tpZSgiSVNTVyIsIDEsIG51bGwsIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gODY0MDAwMDApOwogICAgICAgICAgICAgICAgICBhY1NldENvb2tpZSgiSVNTVyIsIDEsICJ3d3cuYmFpZHUuY29tIiwgbmV3IERhdGUoKS5nZXRUaW1lKCkgLSA4NjQwMDAwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgY2hhbmdlUmVzZXRUZXh0KCkgewogICAgICAgICAgICAgICAgdGhpcy5sYW4uemhfY24uZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5yZXNldEJ0bl90ZXh0ID0gJ+WPjOWHu+mHjee9ricKICAgICAgICAgICAgICAgIHRoaXMubGFuLmVuLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwucmVzZXRCdG5fdGV4dCA9ICdEQmwgY2xpY2sgdG8gUmVzZXQnCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICByZXNldENvbmZpZygpIHsKICAgICAgICAgICAgICAgIC8vIOaYvuekuuS4uuWPjOWHu+mHjee9rgogICAgICAgICAgICAgICAgQUNTZXRWYWx1ZSgiQ29uZmlnIiwgJ3t9Jyk7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgY2xvc2VQYW5lbCgpIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzcC1hYy1jb250ZW50Iikuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHJlc2V0Q1NTKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzZXRDU1NfdGV4dC5pbmNsdWRlcygn6YeN572uQ1NTJykpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldENTU190ZXh0ID0gJ+ehruiupOmHjee9ricKICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNldENTU190ZXh0LmluY2x1ZGVzKCfnoa7orqTph43nva4nKSkgewogICAgICAgICAgICAgICAgICB0aGlzLkFDQ29uZmlnLlVzZXJTdHlsZVRleHQgPSBEZWZhdWx0Q29uZmlnLlVzZXJTdHlsZVRleHQKICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldENTU190ZXh0ID0gJ+mHjee9rkNTUycKICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkQ3VzdG9tU3R5bGUoKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgdXNlVGhpc0h1eWFuQ29sb3IoZW52KSB7CiAgICAgICAgICAgICAgICB0aGlzLkFDQ29uZmlnLmRlZmF1bHRIdVlhbkNvbG9yID0gZW52LnRhcmdldC52YWx1ZSB8fCBlbnYudGFyZ2V0LmRhdGFzZXQudmFsdWU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLkFDQ29uZmlnLmRlZmF1bHRIdVlhbkNvbG9yKTsKICAgICAgICAgICAgICAgIENPTlNULmZzQmFpZHUubG9hZEh1WWFuU3R5bGUodGhpcy5BQ0NvbmZpZy5kZWZhdWx0SHVZYW5Db2xvcik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBjb21wdXRlZDogewogICAgICAgICAgICAgIGdldEJsb2NrTGlzdCgpIHsgLy8g5Lya6Ieq5Yqo55qEcmVuZGVy5YiwaHRtbOS4iuWOu++8jOS4jeeUqOaJi+WKqOWOu+a4suafk+S4gOmBjQogICAgICAgICAgICAgICAgbGV0IGluc0hUTUwgPSAiIjsKICAgICAgICAgICAgICAgIGxldCB7IGxpc3Q6IFVzZXJCbG9ja1JlZ0xpc3QgfSA9IHRoaXMuY2FsX1VzZXJCbG9ja0xpc3RSZWdleDsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5BQ0NvbmZpZy5Vc2VyQmxvY2tMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgIGxldCBpbnNDbGFzcyA9IHRoaXMub3RoZXIuY3VySG9zdHMuZmluZEluZGV4KG0gPT4gewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXQgW2N1ckhvc3QsIGN1clVybF0gPSBtLnNwbGl0KCIjIyMiKTsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVc2VyQmxvY2tSZWdMaXN0W2ldLnRlc3QoY3VySG9zdCkgfHwgVXNlckJsb2NrUmVnTGlzdFtpXS50ZXN0KGN1clVybCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtIHx8ICcnKS5pbmNsdWRlcyh0aGlzLkFDQ29uZmlnLlVzZXJCbG9ja0xpc3RbaV0pCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9KSA+PSAwID8gIiBhYy1ibG9jay1oaWdoIiA6ICIiOyAvLyDlpoLmnpzlvZPliY3pobXpnaLlrZjlnKjvvIzliJnpq5jkuq4KICAgICAgICAgICAgICAgICAgaW5zSFRNTCArPSBgPGxpPjxsYWJlbCBjbGFzcz0iYWMtYmxvY2staXRlbSR7IGluc0NsYXNzIH0iIGRhdGEtaG9zdD0iJHsgdGhpcy5BQ0NvbmZpZy5Vc2VyQmxvY2tMaXN0W2ldIH0iPiR7IHRoaXMuQUNDb25maWcuVXNlckJsb2NrTGlzdFtpXSB9PC9sYWJlbD48bGFiZWwgY2xhc3M9ImFjLWJsb2NrLWl0ZW0gYWMtYmxvY2staXRlbWRlbCIgZGF0YS1ob3N0PSIkeyB0aGlzLkFDQ29uZmlnLlVzZXJCbG9ja0xpc3RbaV0gfSI+eDwvbGFiZWw+PC9saT5cbmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gaW5zSFRNTDsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGNhbF9kaXlCbG9ja0xpc3RCdG4oKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vdGhlci5zaG93QmxvY2tMaXN0QXJlYSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuc2V0dGluZ19wYW5lbF9zZWNvbmQuYmxvY2tFZGl0QnRuRW5kX3RleHQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuc2V0dGluZ19wYW5lbF9zZWNvbmQuYmxvY2tFZGl0QnRuX3RleHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBhc3luYyBjYWxfVXNlckJsb2NrTGlzdFJlZ2V4KCkgewogICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBbXTsKICAgICAgICAgICAgICAgIHRoaXMuQUNDb25maWcuVXNlckJsb2NrTGlzdC5mb3JFYWNoKG9uZSA9PiB7CiAgICAgICAgICAgICAgICAgIHNhZmVGdW5jdGlvbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgb25lICE9PSBudWxsICYmIGxpc3QucHVzaChuZXcgUmVnRXhwKG9uZS5yZXBsYWNlKCIqIiwgIi4qIikpKTsKICAgICAgICAgICAgICAgICAgfSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGxpc3QucHVzaChvbmUpOwogICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoaXMub3RoZXIuYWRkQmxvY2tJdGVtKSAhPT0gInVuZGVmaW5lZCIgJiYgdGhpcy5vdGhlci5hZGRCbG9ja0l0ZW0gIT09ICIiKSB7CiAgICAgICAgICAgICAgICAgIHNhZmVGdW5jdGlvbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKG5ldyBSZWdFeHAodGhpcy5vdGhlci5hZGRCbG9ja0l0ZW0ucmVwbGFjZSgiKiIsICIuKiIpKSk7CiAgICAgICAgICAgICAgICAgIH0sICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBsaXN0LnB1c2godGhpcy5vdGhlci5hZGRCbG9ja0l0ZW0pOwogICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5jYWxjX2Jsb2NrX2RhdGEgPSB7CiAgICAgICAgICAgICAgICAgIG1kNTogYXdhaXQgbWQ1V0FTTShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUobGlzdC5qb2luKCc9PScpKSksIC8vIOe8lueggeiZveeEtuaciemXrumimO+8jOS9huaYr+iuoeeul21kNei2s+Wkn+eUqOS6hgogICAgICAgICAgICAgICAgICBsaXN0CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jYWxjX2Jsb2NrX2RhdGEKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIEFkc1N0eWxlTW9kZUNoYW5nZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgIHYxOiBDT05TVC51c2VJdGVtLkFkc1N0eWxlTW9kZSwKICAgICAgICAgICAgICAgICAgdjI6IENPTlNULnVzZUl0ZW0uSHVZYW5Nb2RlLAogICAgICAgICAgICAgICAgICB2MzogQUNDb25maWcuU3R5bGVfQmFpZHVMaXRlLAogICAgICAgICAgICAgICAgICB2NDogQUNDb25maWcuaXNGYXZpY29uRW5hYmxlLAogICAgICAgICAgICAgICAgICB2NTogQ09OU1QuaXNHb29nbGVTcGVjaWFsLAogICAgICAgICAgICAgICAgICB2NjogQUNDb25maWcuaXNSaWdodERpc3BsYXlFbmFibGUsCiAgICAgICAgICAgICAgICAgIHY3OiBDT05TVC51c2VJdGVtLkJnRml0LAogICAgICAgICAgICAgICAgICB2ODogQUNDb25maWcuQWRzU3R5bGVFbmFibGUsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgVXNlclN0eWxlRW5hYmxlQ2hhbmdlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgdjE6IEFDQ29uZmlnLmlzVXNlclN0eWxlRW5hYmxlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBsYW5DaGFuZ2UoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICB2MTogQUNDb25maWcuaXNFbkxhbmcKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBpc1NhdmVCdXR0b25DYW5CZVNlZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpc0VsZW1lbnRWaXNpYmxlKHRoaXMuJHJlZnMuYm90dG9tU2F2ZUJ1dHRvbikKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHdhdGNoOiB7CiAgICAgICAgICAgICAgJ290aGVyLmZhdmljb25MaXN0TWFwJzogewogICAgICAgICAgICAgICAgaW1tZWRpYXRlOiB0cnVlLAogICAgICAgICAgICAgICAgZGVlcDogdHJ1ZSwKICAgICAgICAgICAgICAgIGFzeW5jIGhhbmRsZXIodmFsKSB7CiAgICAgICAgICAgICAgICAgIGlmKCFBQ0NvbmZpZy5pc0Zhdmljb25FbmFibGUpIHJldHVybgogICAgICAgICAgICAgICAgICAvLyDpgY3ljobmiYDmnInnmoTmlbDmja7vvIznhLblkI7nlJ/miJDmlrDnmoTmlbDmja7lhoXlrrkKICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZUNTUyA9ICcqW2RhdGEtZmF2aWNvbi10XTpiZWZvcmV7d2lkdGg6IDE2cHg7IGhlaWdodDogMTZweDsgbWFyZ2luLXJpZ2h0OiA0cHg7IGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlOyB2ZXJ0aWNhbC1hbGlnbjogdGV4dC10b3A7fScKICAgICAgICAgICAgICAgICAgY29uc3QgY3NzID0gT2JqZWN0LmVudHJpZXModmFsKS5yZWR1Y2UoKHByZUNTUywgY3VyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgWywgeyB0YWdOYW1lID0gJycsIHVybCA9ICcnIH1dID0gY3VyCiAgICAgICAgICAgICAgICAgICAgbGV0IG5vd0NTUyA9ICcnCiAgICAgICAgICAgICAgICAgICAgaWYgKHVybCkgewogICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cueHR3aW5kLmNvbS9hcGkvaW5kZXgucGhwP3VybD0/Pz8/IOaMguS6huOAguOAguOAggogICAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9zdGF0aWNzLmRuc3BvZC5jbi9wcm94eV9mYXZpY29uL18vZmF2aWNvbj9kb21haW49c2luYS5jbgogICAgICAgICAgICAgICAgICAgICAgLy8gd3d3Lmdvb2dsZS5jb20vczIvZmF2aWNvbnM/ZG9tYWluPTc2NDM1MDE3Ny5sb2Z0ZXIuY29tCiAgICAgICAgICAgICAgICAgICAgICAvL+WmguaenOWcsOWdgOS4jeato+ehru+8jOmCo+S5iOS4ouW8gwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1nVXJsID0gImh0dHBzOi8vZmF2aWNvbi55YW5kZXgubmV0L2Zhdmljb24vdjIvIiArIHVybCArICI/c2l6ZT0zMiIKICAgICAgICAgICAgICAgICAgICAgIG5vd0NTUyA9IHRhZ05hbWUgKyBgW2RhdGEtZmF2aWNvbi10PSckeyB1cmwgfSddOmJlZm9yZXtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJyR7IGltZ1VybCB9Jyk7fWAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZUNTUyArIG5vd0NTUwogICAgICAgICAgICAgICAgICB9LCBiYXNlQ1NTKQogICAgICAgICAgICAgICAgICBDT05TVC5mbHVzaE5vZGUuaW5zZXJ0KGF3YWl0IGNyZWF0ZV9DU1NfTm9kZShjc3MsICdBQy1mYXZpY29uVFN0eWxlJyksICdoZWFkJywgewogICAgICAgICAgICAgICAgICAgIGlzUmVsb2FkOiB0cnVlCiAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAnQUNDb25maWcuaXNBTGluZUVuYWJsZSc6IHsKICAgICAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGFzeW5jIGhhbmRsZXIoaXNFbmFibGUpIHsKICAgICAgICAgICAgICAgICAgLy8g5Yqo5oCB5LiL5YiS57q/CiAgICAgICAgICAgICAgICAgIGlmICghaXNFbmFibGUpIHsKICAgICAgICAgICAgICAgICAgICBDT05TVC5mbHVzaE5vZGUuaW5zZXJ0KGF3YWl0IGNyZWF0ZV9DU1NfTm9kZSgiYSxhIGVte3RleHQtZGVjb3JhdGlvbjpub25lICFpbXBvcnRhbnR9IiwgIkFDLU5vTGluZSIpKQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNhZmVSZW1vdmUoInN0eWxlW2NsYXNzPSdBQy1Ob0xpbmUnXSIpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIC8vIOW9k+WJjeermeeCueeahOaKpOecvOaooeW8j+WPmOabtAogICAgICAgICAgICAgICdDT05TVC51c2VJdGVtLkh1WWFuTW9kZSc6IHsKICAgICAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGhhbmRsZXIodmFsKSB7CiAgICAgICAgICAgICAgICAgIGlmICh2YWwpIENPTlNULmZzQmFpZHUubG9hZEh1WWFuU3R5bGUoKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgLy8g5b2T5YmN56uZ54K555qE6IOM5pmv5Zu+54mH5Zyw5Z2A5pu05o2iCiAgICAgICAgICAgICAgJ0NPTlNULnVzZUl0ZW0uZGVmYXVsdEJnVXJsJzogewogICAgICAgICAgICAgICAgaGFuZGxlcihpbWFnZVVybCkgewogICAgICAgICAgICAgICAgICBjaGFuZ2VTaXRlQmFja2dyb3VuZChpbWFnZVVybCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGNhbGNfYmxvY2tfZGF0YTogewogICAgICAgICAgICAgICAgaGFuZGxlcigpIHsKICAgICAgICAgICAgICAgICAgU2l0ZUJsb2NrLnJlbmRlckRpc3BsYXkoKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgQWRzU3R5bGVNb2RlQ2hhbmdlOiB7CiAgICAgICAgICAgICAgICBoYW5kbGVyKGN1clZhbCwgcHJlVmFsKSB7CiAgICAgICAgICAgICAgICAgIC8vIOWmguaenOaVsOaNruecn+eahOWPmOS6hu+8jOmCo+S5iOiwg+eUqOWQjue7reabtOaWsO+8jOWmguaenOayoeWPmO+8jOmCo+S5iOi3s+i/hwogICAgICAgICAgICAgICAgICB0cnl7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VyU3RyID0gSlNPTi5zdHJpbmdpZnkoY3VyVmFsKQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZVN0ciA9IEpTT04uc3RyaW5naWZ5KHByZVZhbCkKICAgICAgICAgICAgICAgICAgICBpZihjdXJTdHIgPT09IHByZVN0cikgcmV0dXJuCiAgICAgICAgICAgICAgICAgIH1jYXRjaCAoZSl7fQogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgLy8g6ZyA6KaB5YWI5Yig6Zmk5Y6f5pyJ55qE6IqC54K55pWw5o2uCiAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyByZXMsIG5vZGUgfSA9IGNoZWNrRG9jbWVudEhhc05vZGUoIkFDLSIpCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcykgbm9kZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBzYWZlUmVtb3ZlKCJzdHlsZVtjbGFzcz0nQUMtU3R5bGUtZXhwYW5kJ10sc3R5bGVbY2xhc3M9J0FDLVR3b1BhZ2VFeFN0eWxlJ10sc3R5bGVbY2xhc3M9J0FDLVRocmVlUGFnZUV4U3R5bGUnXSxzdHlsZVtjbGFzcz0nQUMtRm91clBhZ2VFeFN0eWxlJ10sc3R5bGVbY2xhc3M9J0FDLXN0eWxlLWxvZ28nXSxzdHlsZVtjbGFzcz0nQUMtYmFpZHVMaXRlU3R5bGUnXSxzdHlsZVtjbGFzcyo9J0h1WWFuU3R5bGUtRmlsZSddIik7CiAgICAgICAgICAgICAgICAgIGFjQ3NzTG9hZEZsYWcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgaWYoQUNDb25maWcuQWRzU3R5bGVFbmFibGUpIHsKICAgICAgICAgICAgICAgICAgICBDT05TVC5mc0JhaWR1LmluaXQoKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBVc2VyU3R5bGVFbmFibGVDaGFuZ2UoKSB7CiAgICAgICAgICAgICAgICBpZiAoQUNDb25maWcuaXNVc2VyU3R5bGVFbmFibGUpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkQ3VzdG9tU3R5bGUoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHNhZmVSZW1vdmUoInN0eWxlW2NsYXNzPSdBQy11c2VyU3R5bGUnXSIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBsYW5DaGFuZ2UoKSB7CiAgICAgICAgICAgICAgICBBbGxEYXRhLmxhbi51c2UgPSBBQ0NvbmZpZy5pc0VuTGFuZyA/IEFsbERhdGEubGFuLmVuIDogQWxsRGF0YS5sYW4uemhfY247CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjbXl1c2VyIikucmVtb3ZlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9OwogICAgICAgICAgaWYgKHR5cGVvZiAoVnVlKSAhPSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgIGlmICgrVnVlLnZlcnNpb24uY2hhckF0KDApID09PSAyKSB7CiAgICAgICAgICAgICAgICB2dWVWTSA9IG5ldyBWdWUob3B0aW9ucyk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZ1ZVZNID0gVnVlLmNyZWF0ZUFwcChvcHRpb25zKS5tb3VudChjaGVja05vZGUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIlZ1ZSDmnKrlrozmiJDliJ3lp4vljJYtLeeoi+W6j+aXoOazleacieaViOaJp+ihjCIpOwogICAgICAgICAgfQogICAgICAgIH0sIDI1MCk7CgogICAgICAgIGZ1bmN0aW9uIE1haW5DYWxsYmFjayhlKSB7CiAgICAgICAgICBpZiAoZS50YXJnZXQgIT0gbnVsbCAmJiB0eXBlb2YgKGUudGFyZ2V0LmNsYXNzTmFtZSkgPT09ICJzdHJpbmciICYmIGUudGFyZ2V0LmNsYXNzTmFtZS50b1VwcGVyQ2FzZSgpLmluZGV4T2YoIkFDLSIpID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gLy/lsY/olL3mjonlm6DkuLrlop7liqBjc3Plr7zoh7TnmoTop6blj5FpbnNlcnTliqjkvZwKICAgICAgICB9CgogICAgICAgIC8q5Lul5LiL5Luj56CB5aSn6YOo5YiG5p2l5rqQ5LqOU3VwcmVQcmVsb2FkZXIg5oSf6LCiIHN3ZHloICYmIHl3emhhaXFpICYmIE5MRiDku6Xlj4ogbWFjaDYg5aSn5L2sKi8KCiAgICAgICAgLyoKICAgICAgICBTdXBlcl9wcmVsb2FkZXJQbHVzX29uZV9OZXc6IFByZWxvYWQgYW5kIEF1dG9wYWdlci4KICAgICAgICBDb3B5cmlnaHQgKEMpIDIwMjAgTWFjaDYKCiAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAzLgoKICAgICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGFjX3NwZnVuYyhlKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKCLov5nph4zmnInpl67popgiKQogICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIHZhciB0LCByID0gZS5jdXJyZW50VGFyZ2V0OwogICAgICAgICAgY29uc3QgVHdlZW4gPSB7CiAgICAgICAgICAgICAgTGluZWFyOiBmdW5jdGlvbiBMaW5lYXIoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgcmV0dXJuIHIgKiBlIC8gbiArIHQ7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBRdWFkOiB7CiAgICAgICAgICAgICAgICBlYXNlSW46IGZ1bmN0aW9uIGVhc2VJbihlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiByICogKGUgLz0gbikgKiBlICsgdDsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBlYXNlT3V0OiBmdW5jdGlvbiBlYXNlT3V0KGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIC1yICogKGUgLz0gbikgKiAoZSAtIDIpICsgdDsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBlYXNlSW5PdXQ6IGZ1bmN0aW9uIGVhc2VJbk91dChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiAoZSAvPSBuIC8gMikgPCAxID8gciAvIDIgKiBlICogZSArIHQgOiAtciAvIDIgKiAoLS1lICogKGUgLSAyKSAtIDEpICsgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIEN1YmljOiB7CiAgICAgICAgICAgICAgICBlYXNlSW46IGZ1bmN0aW9uIGVhc2VJbihlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiByICogKGUgLz0gbikgKiBlICogZSArIHQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZWFzZU91dDogZnVuY3Rpb24gZWFzZU91dChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiByICogKChlID0gZSAvIG4gLSAxKSAqIGUgKiBlICsgMSkgKyB0OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGVhc2VJbk91dDogZnVuY3Rpb24gZWFzZUluT3V0KGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIChlIC89IG4gLyAyKSA8IDEgPyByIC8gMiAqIGUgKiBlICogZSArIHQgOiByIC8gMiAqICgoZSAtPSAyKSAqIGUgKiBlICsgMikgKyB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgUXVhcnQ6IHsKICAgICAgICAgICAgICAgIGVhc2VJbjogZnVuY3Rpb24gZWFzZUluKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgKiAoZSAvPSBuKSAqIGUgKiBlICogZSArIHQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZWFzZU91dDogZnVuY3Rpb24gZWFzZU91dChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiAtciAqICgoZSA9IGUgLyBuIC0gMSkgKiBlICogZSAqIGUgLSAxKSArIHQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZWFzZUluT3V0OiBmdW5jdGlvbiBlYXNlSW5PdXQoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICByZXR1cm4gKGUgLz0gbiAvIDIpIDwgMSA/IHIgLyAyICogZSAqIGUgKiBlICogZSArIHQgOiAtciAvIDIgKiAoKGUgLT0gMikgKiBlICogZSAqIGUgLSAyKSArIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBRdWludDogewogICAgICAgICAgICAgICAgZWFzZUluOiBmdW5jdGlvbiBlYXNlSW4oZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICByZXR1cm4gciAqIChlIC89IG4pICogZSAqIGUgKiBlICogZSArIHQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZWFzZU91dDogZnVuY3Rpb24gZWFzZU91dChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiByICogKChlID0gZSAvIG4gLSAxKSAqIGUgKiBlICogZSAqIGUgKyAxKSArIHQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZWFzZUluT3V0OiBmdW5jdGlvbiBlYXNlSW5PdXQoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICByZXR1cm4gKGUgLz0gbiAvIDIpIDwgMSA/IHIgLyAyICogZSAqIGUgKiBlICogZSAqIGUgKyB0IDogciAvIDIgKiAoKGUgLT0gMikgKiBlICogZSAqIGUgKiBlICsgMikgKyB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgU2luZTogewogICAgICAgICAgICAgICAgZWFzZUluOiBmdW5jdGlvbiBlYXNlSW4oZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICByZXR1cm4gLXIgKiBNYXRoLmNvcyhlIC8gbiAqIChNYXRoLlBJIC8gMikpICsgciArIHQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZWFzZU91dDogZnVuY3Rpb24gZWFzZU91dChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiByICogTWF0aC5zaW4oZSAvIG4gKiAoTWF0aC5QSSAvIDIpKSArIHQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZWFzZUluT3V0OiBmdW5jdGlvbiBlYXNlSW5PdXQoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICByZXR1cm4gLXIgLyAyICogKE1hdGguY29zKE1hdGguUEkgKiBlIC8gbikgLSAxKSArIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBFeHBvOiB7CiAgICAgICAgICAgICAgICBlYXNlSW46IGZ1bmN0aW9uIGVhc2VJbihlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiAwID09IGUgPyB0IDogciAqIE1hdGgucG93KDIsIDEwICogKGUgLyBuIC0gMSkpICsgdDsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBlYXNlT3V0OiBmdW5jdGlvbiBlYXNlT3V0KGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPT0gbiA/IHQgKyByIDogciAqICgxIC0gTWF0aC5wb3coMiwgLTEwICogZSAvIG4pKSArIHQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZWFzZUluT3V0OiBmdW5jdGlvbiBlYXNlSW5PdXQoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PSBlID8gdCA6IGUgPT0gbiA/IHQgKyByIDogKGUgLz0gbiAvIDIpIDwgMSA/IHIgLyAyICogTWF0aC5wb3coMiwgMTAgKiAoZSAtIDEpKSArIHQgOiByIC8gMiAqICgyIC0gTWF0aC5wb3coMiwgLTEwICogLS1lKSkgKyB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgQ2lyYzogewogICAgICAgICAgICAgICAgZWFzZUluOiBmdW5jdGlvbiBlYXNlSW4oZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICByZXR1cm4gLXIgKiAoTWF0aC5zcXJ0KDEgLSAoZSAvPSBuKSAqIGUpIC0gMSkgKyB0OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGVhc2VPdXQ6IGZ1bmN0aW9uIGVhc2VPdXQoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICByZXR1cm4gciAqIE1hdGguc3FydCgxIC0gKGUgPSBlIC8gbiAtIDEpICogZSkgKyB0OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGVhc2VJbk91dDogZnVuY3Rpb24gZWFzZUluT3V0KGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIChlIC89IG4gLyAyKSA8IDEgPyAtciAvIDIgKiAoTWF0aC5zcXJ0KDEgLSBlICogZSkgLSAxKSArIHQgOiByIC8gMiAqIChNYXRoLnNxcnQoMSAtIChlIC09IDIpICogZSkgKyAxKSArIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBFbGFzdGljOiB7CiAgICAgICAgICAgICAgICBlYXNlSW46IGZ1bmN0aW9uIGVhc2VJbihlLCB0LCByLCBuLCBhLCBvKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiAwID09IGUgPyB0IDogMSA9PSAoZSAvPSBuKSA/IHQgKyByIDogKG8gfHwgKG8gPSAuMyAqIG4pLCAhYSB8fCBhIDwgTWF0aC5hYnMocikgPyAoYSA9IHIsCiAgICAgICAgICAgICAgICAgICAgaSA9IG8gLyA0KSA6IGkgPSBvIC8gKDIgKiBNYXRoLlBJKSAqIE1hdGguYXNpbihyIC8gYSksIC1hICogTWF0aC5wb3coMiwgMTAgKiAoZSAtPSAxKSkgKiBNYXRoLnNpbigoZSAqIG4gLSBpKSAqICgyICogTWF0aC5QSSkgLyBvKSArIHQpOwogICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBlYXNlT3V0OiBmdW5jdGlvbiBlYXNlT3V0KGUsIHQsIHIsIG4sIGEsIG8pIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT0gZSA/IHQgOiAxID09IChlIC89IG4pID8gdCArIHIgOiAobyB8fCAobyA9IC4zICogbiksICFhIHx8IGEgPCBNYXRoLmFicyhyKSA/IChhID0gciwKICAgICAgICAgICAgICAgICAgICBpID0gbyAvIDQpIDogaSA9IG8gLyAoMiAqIE1hdGguUEkpICogTWF0aC5hc2luKHIgLyBhKSwgYSAqIE1hdGgucG93KDIsIC0xMCAqIGUpICogTWF0aC5zaW4oKGUgKiBuIC0gaSkgKiAoMiAqIE1hdGguUEkpIC8gbykgKyByICsgdCk7CiAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGVhc2VJbk91dDogZnVuY3Rpb24gZWFzZUluT3V0KGUsIHQsIHIsIG4sIGEsIG8pIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT0gZSA/IHQgOiAyID09IChlIC89IG4gLyAyKSA/IHQgKyByIDogKG8gfHwgKG8gPSBuICogKC4zICogMS41KSksICFhIHx8IGEgPCBNYXRoLmFicyhyKSA/IChhID0gciwKICAgICAgICAgICAgICAgICAgICBpID0gbyAvIDQpIDogaSA9IG8gLyAoMiAqIE1hdGguUEkpICogTWF0aC5hc2luKHIgLyBhKSwgZSA8IDEgPyBhICogTWF0aC5wb3coMiwgMTAgKiAoZSAtPSAxKSkgKiBNYXRoLnNpbigoZSAqIG4gLSBpKSAqICgyICogTWF0aC5QSSkgLyBvKSAqIC0uNSArIHQgOiBhICogTWF0aC5wb3coMiwgLTEwICogKGUgLT0gMSkpICogTWF0aC5zaW4oKGUgKiBuIC0gaSkgKiAoMiAqIE1hdGguUEkpIC8gbykgKiAuNSArIHIgKyB0KTsKICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBCYWNrOiB7CiAgICAgICAgICAgICAgICBlYXNlSW46IGZ1bmN0aW9uIGVhc2VJbihlLCB0LCByLCBuLCBhKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsID09IGEgJiYgKGEgPSAxLjcwMTU4KSwgciAqIChlIC89IG4pICogZSAqICgoYSArIDEpICogZSAtIGEpICsgdDsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBlYXNlT3V0OiBmdW5jdGlvbiBlYXNlT3V0KGUsIHQsIHIsIG4sIGEpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gYSAmJiAoYSA9IDEuNzAxNTgpLCByICogKChlID0gZSAvIG4gLSAxKSAqIGUgKiAoKGEgKyAxKSAqIGUgKyBhKSArIDEpICsgdDsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBlYXNlSW5PdXQ6IGZ1bmN0aW9uIGVhc2VJbk91dChlLCB0LCByLCBuLCBhKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsID09IGEgJiYgKGEgPSAxLjcwMTU4KSwgKGUgLz0gbiAvIDIpIDwgMSA/IHIgLyAyICogKGUgKiBlICogKCgxICsgKGEgKj0gMS41MjUpKSAqIGUgLSBhKSkgKyB0IDogciAvIDIgKiAoKGUgLT0gMikgKiBlICogKCgxICsgKGEgKj0gMS41MjUpKSAqIGUgKyBhKSArIDIpICsgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIEJvdW5jZTogewogICAgICAgICAgICAgICAgZWFzZUluOiBmdW5jdGlvbiBlYXNlSW4oZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICByZXR1cm4gciAtIFR3ZWVuLkJvdW5jZS5lYXNlT3V0KG4gLSBlLCAwLCByLCBuKSArIHQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZWFzZU91dDogZnVuY3Rpb24gZWFzZU91dChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiAoZSAvPSBuKSA8IDEgLyAyLjc1ID8gciAqICg3LjU2MjUgKiBlICogZSkgKyB0IDogZSA8IDIgLyAyLjc1ID8gciAqICg3LjU2MjUgKiAoZSAtPSAxLjUgLyAyLjc1KSAqIGUgKyAuNzUpICsgdCA6IGUgPCAyLjUgLyAyLjc1ID8gciAqICg3LjU2MjUgKiAoZSAtPSAyLjI1IC8gMi43NSkgKiBlICsgLjkzNzUpICsgdCA6IHIgKiAoNy41NjI1ICogKGUgLT0gMi42MjUgLyAyLjc1KSAqIGUgKyAuOTg0Mzc1KSArIHQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZWFzZUluT3V0OiBmdW5jdGlvbiBlYXNlSW5PdXQoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICByZXR1cm4gZSA8IG4gLyAyID8gLjUgKiBUd2Vlbi5Cb3VuY2UuZWFzZUluKDIgKiBlLCAwLCByLCBuKSArIHQgOiAuNSAqIFR3ZWVuLkJvdW5jZS5lYXNlT3V0KDIgKiBlIC0gbiwgMCwgciwgbikgKyAuNSAqIHIgKyB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IFR3ZWVuTSA9IFsiTGluZWFyIiwgIlF1YWQiLCAiQ3ViaWMiLCAiUXVhcnQiLCAiUXVpbnQiLCAiU2luZSIsICJFeHBvIiwgIkNpcmMiLCAiRWxhc3RpYyIsICJCYWNrIiwgIkJvdW5jZSJdOwogICAgICAgICAgY29uc3QgVHdlZW5FYXNlID0gWyJlYXNlSW4iLCAiZWFzZU91dCIsICJlYXNlSW5PdXQiXTsKICAgICAgICAgIHZhciBwcmVmcyA9IHsKICAgICAgICAgICAgc19tZXRob2Q6IDMsCiAgICAgICAgICAgIHNfZWFzZTogMiwKICAgICAgICAgICAgc19GUFM6IDYwLAogICAgICAgICAgICBzX2R1cmF0aW9uOiAzMzMsCiAgICAgICAgICB9OwoKICAgICAgICAgIGZ1bmN0aW9uIGdldFJlbGF0aXZlRGl2KGUpIHsKICAgICAgICAgICAgdmFyIHQgPSByLmlkOwogICAgICAgICAgICByZXR1cm4gKHQgPSB0LnJlcGxhY2UoLyhzcC1zZXBhcmF0b3ItKSguKykvLCAoZnVuY3Rpb24odCwgciwgbikgewogICAgICAgICAgICAgIHJldHVybiByICsgU3RyaW5nKE51bWJlcihuKSArICgicHJlIiA9PSBlID8gLTEgOiAxKSk7CiAgICAgICAgICAgIH0pKSkgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KSA6IG51bGw7CiAgICAgICAgICB9CgogICAgICAgICAgZnVuY3Rpb24gc3BfdHJhbnNpdGlvbihlLCB0KSB7CiAgICAgICAgICAgIHZhciByID0gc3BfdHJhbnNpdGlvbi5Ud2VlbkY7CiAgICAgICAgICAgIHIgfHwgKHIgPSAociA9IFR3ZWVuW1R3ZWVuTVtwcmVmcy5zX21ldGhvZF1dKVtUd2VlbkVhc2VbcHJlZnMuc19lYXNlXV0gfHwgciwgc3BfdHJhbnNpdGlvbi5Ud2VlbkYgPSByKTsKICAgICAgICAgICAgdmFyIG4gPSAxZTMgLyBwcmVmcy5zX0ZQUywgYSA9IDAsIG8gPSBlLCBpID0gdCAtIGUsIHMgPSBNYXRoLmNlaWwocHJlZnMuc19kdXJhdGlvbiAvIG4pLAogICAgICAgICAgICAgIGMgPSB3aW5kb3cuc2Nyb2xsWDsKICAgICAgICAgICAgIWZ1bmN0aW9uIHRyYW5zaXRpb24oKSB7CiAgICAgICAgICAgICAgdmFyIGUgPSBNYXRoLmNlaWwocihhLCBvLCBpLCBzKSk7CiAgICAgICAgICAgICAgd2luZG93LnNjcm9sbChjLCBlKSwgYSA8IHMgJiYgKGErKywgc2V0VGltZW91dCh0cmFuc2l0aW9uLCBuKSk7CiAgICAgICAgICAgIH0oKTsKICAgICAgICAgIH0KCiAgICAgICAgICBmdW5jdGlvbiBzY3JvbGxJdChlLCB0KSB7CiAgICAgICAgICAgIHNwX3RyYW5zaXRpb24oZSwgdCk7CiAgICAgICAgICB9CgogICAgICAgICAgc3dpdGNoIChlLnRhcmdldC5pZCkgewogICAgICAgICAgICBjYXNlICJzcC1zcC1nb3RvcCI6CiAgICAgICAgICAgICAgc2Nyb2xsSXQod2luZG93LnNjcm9sbFksIDApOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAic3Atc3AtZ29wcmUiOgogICAgICAgICAgICAgIHZhciBuID0gZ2V0UmVsYXRpdmVEaXYoInByZSIpOwogICAgICAgICAgICAgIGlmICghbikgcmV0dXJuOwogICAgICAgICAgICAgIHQgPSB3aW5kb3cuc2Nyb2xsWTsKICAgICAgICAgICAgICB2YXIgYSA9IG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wOwogICAgICAgICAgICAgIGEgPSB0IC0gKHIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gYSk7CiAgICAgICAgICAgICAgc2Nyb2xsSXQodCwgYSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICJzcC1zcC1nb25leHQiOgogICAgICAgICAgICAgIHZhciBvID0gZ2V0UmVsYXRpdmVEaXYoIm5leHQiKTsKICAgICAgICAgICAgICBpZiAoIW8pIHJldHVybjsKICAgICAgICAgICAgICB0ID0gd2luZG93LnNjcm9sbFk7CiAgICAgICAgICAgICAgdmFyIGkgPSBvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDsKICAgICAgICAgICAgICBpID0gdCArICgtci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBpKTsKICAgICAgICAgICAgICBzY3JvbGxJdCh0LCBpKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgInNwLXNwLWdvYm90dG9tIjoKICAgICAgICAgICAgICBzY3JvbGxJdCh3aW5kb3cuc2Nyb2xsWSwgTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbEhlaWdodCwgZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHdpbmRvd3Njcm9sbChmbiA9ICgpID0+IHsKICAgICAgICB9KSB7CiAgICAgICAgICBzYWZlV2FpdEZ1bmMoKCkgPT4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAoKSA9PiB7CiAgICAgICAgICAgIHZhciBiZWZvcmVTY3JvbGxUb3AgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wCiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgdmFyIGFmdGVyU2Nyb2xsVG9wID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwKICAgICAgICAgICAgICAgIGRlbHRhID0gYWZ0ZXJTY3JvbGxUb3AgLSBiZWZvcmVTY3JvbGxUb3A7CiAgICAgICAgICAgICAgaWYgKGRlbHRhID09PSAwKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgZm4oZGVsdGEgPiAwID8gImRvd24iIDogInVwIiwgZSk7CiAgICAgICAgICAgICAgYmVmb3JlU2Nyb2xsVG9wID0gYWZ0ZXJTY3JvbGxUb3A7CiAgICAgICAgICAgIH0sIGZhbHNlKTsKICAgICAgICAgIH0pCiAgICAgICAgfQoKICAgICAgICAvLyAy56eS5ZCO5omN57uR5a6a5rua5Yqo5LqL5Lu2CiAgICAgICAgc2FmZVdhaXRGdW5jKCdib2R5JywgKCkgPT4gewogICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIHdpbmRvd3Njcm9sbChhc3luYyBmdW5jdGlvbihkaXJlY3Rpb24sIGUpIHsKICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAiZG93biIpIHsgLy8g5LiL5ruR5omN5YeG5aSH57+76aG1CiAgICAgICAgICAgICAgICBsZXQgc3BsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NwLWZ3LWFfZW5hYmxlIik7CiAgICAgICAgICAgICAgICAvLyDlvIDlkK/lkI7vvIzkuJTlnKjpnZ7vvIhzdXByZXByZWxvYWRlcuWQr+eUqO+8ieaXtuWdh+WPrwogICAgICAgICAgICAgICAgaWYgKEFDQ29uZmlnLmlzQXV0b3BhZ2UgPT09IHRydWUgJiYgIShzcGwgJiYgc3BsLmNoZWNrZWQgPT09IHRydWUpKSB7CiAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxUb3AgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgICAgbGV0IHNjcm9sbERlbHRhID0gNjY2OwogICAgICAgICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5HT09HTEUpIHNjcm9sbERlbHRhID0gMTAyNDsgLy8g5q+V56uf6LC35q2M5Yqg6L2957yT5oWi55qE6Zeu6aKYCiAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IDw9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgKyBzY3JvbGxUb3AgKyBzY3JvbGxEZWx0YSAmJiBjdXJTaXRlLnBhZ2VMb2FkaW5nID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIGN1clNpdGUucGFnZUxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkRVQ0spIHsgLy8g5Y+v5Lul55So5bey5pyJ55qE5pa55rOV5p2l5a6e546w5LqGCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFDQ29uZmlnLm5vcm1hbGl6ZUR1Y2sgfHwgK0FDQ29uZmlnLmR1Y2suQWRzU3R5bGVNb2RlID49IDMpIHsgIC8vIOWmguaenOayoeacieW8gOWQr++8jOmCo+S5iOaJi+WKqOe/u+mhtSB8fCDlpoLmnpzmmK/lj4zliJfnmoTml7blgJnvvIzkvLzkuY7lubbkuI3kvJroh6rliqjop6blj5Hnv7vpobXmlYjmnpwKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2xpbmtzIC5yZXN1bHQtLW1vcmUgYSIpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyU2l0ZS5wYWdlTG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCA1MDAwKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgU2hvd1BhZ2VyLmxvYWRNb3JlUGFnZSgpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clNpdGUucGFnZXIgJiYgY3VyU2l0ZS5wYWdlci5zdHlsaXNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIENPTlNULmZsdXNoTm9kZS5pbnNlcnQoYXdhaXQgY3JlYXRlX0NTU19Ob2RlKGN1clNpdGUucGFnZXIuc3R5bGlzaCwgIkFDLXBhZ2VyLXN0eWxpc2giKSkKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwgMjAwMCkKICAgICAgICB9KQogICAgICAgIHZhciBTaG93UGFnZXIgPSB7CiAgICAgICAgICBnZXRGdWxsSHJlZjogZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoZSA9PT0gbnVsbCkgcmV0dXJuICcnOwogICAgICAgICAgICAic3RyaW5nIiAhPSB0eXBlb2YgZSAmJiAoZSA9IGUuZ2V0QXR0cmlidXRlKCJocmVmIikpOwogICAgICAgICAgICB2YXIgdCA9IHRoaXMuZ2V0RnVsbEhyZWYuYTsKICAgICAgICAgICAgcmV0dXJuIHQgfHwgKHRoaXMuZ2V0RnVsbEhyZWYuYSA9IHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIikpLCB0LmhyZWYgPSBlLCB0LmhyZWY7CiAgICAgICAgICB9LAogICAgICAgICAgY3JlYXRlRG9jdW1lbnRCeVN0cmluZzogZnVuY3Rpb24oc3RyKSB7CiAgICAgICAgICAgIC8vIHN0cmluZ+i9rOS4ukRPTQogICAgICAgICAgICBpZiAoIXN0cikgewogICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIltBQy1TY3JpcHRdIiwgJ05vIHN0cmluZyBmb3VuZCB0byBiZSBjb252ZXJ0ZWQgdG8gRE9NJyk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lICE9PSAnSFRNTCcpIHsKICAgICAgICAgICAgICByZXR1cm4gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhzdHIsICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKipAdHlwZSB7SFRNTERvY3VtZW50fSAqLwoKCiAgICAgICAgICAgIHZhciBkb2M7CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIC8vIGZpcmVmb3ggYW5kIGNocm9tZSAzMCvvvIxPcGVyYSAxMiDkvJrmiqXplJkKICAgICAgICAgICAgICBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHN0ciwgJ3RleHQvaHRtbCcpOwogICAgICAgICAgICB9IGNhdGNoIChleCkge30KCiAgICAgICAgICAgIGlmIChkb2MpIHsKICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KSB7CiAgICAgICAgICAgICAgZG9jID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCdzdXBlclByZWxvYWRlcicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAvL0B0cy1pZ25vcmUKICAgICAgICAgICAgICAgIGRvYyA9IGRvY3VtZW50LmNsb25lTm9kZShmYWxzZSk7CiAgICAgICAgICAgICAgICBkb2MuYXBwZW5kQ2hpbGQoZG9jLmltcG9ydE5vZGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBmYWxzZSkpOwogICAgICAgICAgICAgICAgZG9jLmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlRWxlbWVudCgnaGVhZCcpKTsKICAgICAgICAgICAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUVsZW1lbnQoJ2JvZHknKSk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFkb2MpIHJldHVybjsKICAgICAgICAgICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICB2YXIgZnJhZ21lbnQgPSByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoc3RyKTsKICAgICAgICAgICAgZG9jLmJvZHkuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpOwogICAgICAgICAgICB2YXIgaGVhZENoaWxkTmFtZXMgPSB7CiAgICAgICAgICAgICAgVElUTEU6IHRydWUsCiAgICAgICAgICAgICAgTUVUQTogdHJ1ZSwKICAgICAgICAgICAgICBMSU5LOiB0cnVlLAogICAgICAgICAgICAgIFNUWUxFOiB0cnVlLAogICAgICAgICAgICAgIEJBU0U6IHRydWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGNoaWxkOwogICAgICAgICAgICB2YXIgYm9keSA9IGRvYy5ib2R5OwogICAgICAgICAgICB2YXIgYmNoaWxkcyA9IGJvZHkuY2hpbGROb2RlczsKCiAgICAgICAgICAgIGZvciAodmFyIGkgPSBiY2hpbGRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgLy8g56e76ZmkaGVhZOeahOWtkOWFg+e0oAogICAgICAgICAgICAgIGNoaWxkID0gYmNoaWxkc1tpXTsKICAgICAgICAgICAgICBpZiAoaGVhZENoaWxkTmFtZXNbY2hpbGQubm9kZU5hbWVdKSBib2R5LnJlbW92ZUNoaWxkKGNoaWxkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgIH0sCiAgICAgICAgICBsb2FkTW9yZVBhZ2U6IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoY3VyU2l0ZS5wYWdlcikgewogICAgICAgICAgICAgIGxldCBjdXJQYWdlRWxlID0gZ2V0RWxlbWVudEJ5WHBhdGgoY3VyU2l0ZS5wYWdlci5uZXh0TGluayk7CiAgICAgICAgICAgICAgdmFyIHVybCA9IHRoaXMuZ2V0RnVsbEhyZWYoY3VyUGFnZUVsZSk7CiAgICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuR09PR0xFKSB7CiAgICAgICAgICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdtYWNpbnRvc2gnKSkgewogICAgICAgICAgICAgICAgICAvLyBNQVJLIOS4uuS6huWFvOWuueeZvuW6puWcqHNhZmFyaeS4i+eahAogICAgICAgICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZSgnaHR0cHM6Ly8nLCAnaHR0cDovLycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAodXJsID09PSAnJykgcmV0dXJuOwogICAgICAgICAgICAgIHZhciBzZXBJbWdzID0gewogICAgICAgICAgICAgICAgdG9wOiAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCWUFBQUFXQ0FZQUFBREV0R3c3QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFXdEpSRUZVZU5yY2xFMHJSR0VVeDhjMUdVcFJKSVZJWkdkaFpDVnIzOEdHaGFJMFpYd0NrbGlnbENoWkVjdkp4aGRnWVdPakxFVXBtL0V5aUx6emUrbzhkVHpkTzNQbGpvVlR2N3JQYzgvNWQrNjU1NXhZckVoV29wNmJvZGE1KzZsOXdqV2NXcEYrV0licUNKSjloRlJjRHIzUUFJa0loS3VnejVQRGZrU2l4a3BoejVhaUFucWdFOHJnV1J4R29TT1B5Qmtzd1F1VXd5c2N3NEhybUZDWkw4S3QvSkFnN21FRlBFbW80RmRQd2swQlVjc2R6SWFwMFRROHFNQVB1SUNjRWpMbmQrVmpTamNmSk5nSWMvRGtaR1N5bVlHc25LOUVaTXJ4ZTRNRmFOR2laakMyZlQ1elEzcDdRREsxZFIyR1NsanppY2xBdlJVZThuSFlWQTRqanZDNDNOZkF1ay9zbUIyUU5xY3NXeEtjTGJBS1RGblMwaFdENm4yN0ZkNkZMcWlESTVpUW1ROWpwaVZUMHNOSjZhWWQ3ZEFFM1FIQmJpblNBWDVKV1dheHVMbzhGMzVqaC9iQks5WSsvci9DbDZwTGNubmE4TnZ1REdNbnNscGJaUnBYWllULzNyNEVHQUNaTDNaTDJhZk5GQUFBQUFCSlJVNUVya0pnZ2c9PSIsCiAgICAgICAgICAgICAgICBib3R0b206ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJZQUFBQVdDQVlBQUFERXRHdzdBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQVhGSlJFRlVlTnJNMWM4ckJHRWN4L0ZkdENFa0xxWXRwZHdrS1NVSFVoeHdJVGRLK1ozeU0yY09MbkozOUNjNDRTZ0hTY21Kd2xGeHNJZGxDU2NPNi8ydDc2T25wNTJkWFR0Ym5ubzFNOCtQejg0K3p6TXprY2cvS0Ezb1JUek0wQTRjSTRWVGRJVVZQSU0zcFBHTzVhQUJKVGtHeDFCcWpZbUZGWnhXN25uQndYbVhvZ1dYNmJFR2MyakVJVTcra05XRFVTU3daeXFuZFN2SjNOMWcyQm0wb0x0QjJqK3c3clFQNE1wcVh6UlQwWVJhUFcvQnRoTWVkWUxzNjBIc29FMnZxOUJzUHdBSmE4WEZMVWEwZlVydlJPby9zYVQxUTlhZEdpbWRsdDh5ajZUVDZRNmQydmFpZGE5WVJidFA2RXFtQlpDNWZIQTZYK0FBejFid0VjNmNmazkrb2FaTTROb1pKTDcwK0oyaFRhWnROcGV0MDQxeks4eVAvTWdsK3JPRjFlbXIwVU0xeG5BZkVQeUlTZDBKbm82dnR4K1F1TTZQWjIybHBPN2RiRVYyU2l2NnJQZUlqTnMxSGRZQzdpeGZHK1lCcWRUVkRxUEl2NmlJV3ZPN2lYR1VGeEFxaTcyUHJhSjlJSDhFR0FDUWNZallSZDVHSHdBQUFBQkpSVTVFcmtKZ2dnPT0iLAogICAgICAgICAgICAgICAgcHJlOiAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCWUFBQUFXQ0FZQUFBREV0R3c3QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFTbEpSRUZVZU5waVlCak9vQmlJcndKeEZSQXpVc3ZRVmlEK0NNVC9nZmdURVBkUnk5QlBVRU5oK0FzUTkxSmlhQXVTUzlIeFozSU5iOEhpMHYrVXVyd0Y2cUwvUk9CdlFOeERyS0Zma1RUK0ErSm5RUHdCS2ZKQS9MOUlhbjdpYzdrTUVIY0M4UTgwRjNVQWNSc1F2NGJ5MzBJTmFVSlQ5d2VhV2hTUURSVUI0dVZZdkxrWWlBV0FPQm9wdkVGQmxBckVQRUE4RzR1ZTlVQXNBVE00RVl1Q0pVZ0tNdEFNTG9TS0N3UHhYQ3g2YzFpZ0NsVFFnbVVaVlBOckhNRUd5M21nWUNrQ1lpWWdUa0NTVjRVWnZBMklqWUJZRElndlFiUHZPeUpURUNpZDV3SHhieUEyQnVMM1FMd1JXWUVzRUp2ZzBJd2VGRVU0MUlFTWxnY3hXSkFFSDBNeEplQXNqTUZFcTZKdytCcjhCaW1WZk1DVERFa0c3RUJjQThUM29XVUp4NERWWXdBQkJnQ2Fubm5TemJnd0lRQUFBQUJKUlU1RXJrSmdnZz09IiwKICAgICAgICAgICAgICAgIG5leHQ6ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJZQUFBQVdDQVlBQUFERXRHdzdBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQVQxSlJFRlVlTnJjMWIxS0EwRVloZUVsL2lBUkZGRWtLbDZEMFVLOENyRVZyQ3dFZXhGQ3RCSWxSV0lqc2ZFaUxMMEZLenM3UVVXeE0ycGlGTVVrdmhQT3dMQXMyVEd1Q243d2tObGw1akM3K3cwSmd2OWF2ZGpBT2JiUW4xVHdDdTdRd2hXVzR4YWtQSU9ITUt6eEdDYVNDbTZpb1hITFowSHFwejdLcndSUEl2dk52QmxNMnpZeU5ZOGNNamhESG85ZkNCekVybklxS05qZ1JTeHB2SUFCYk9MZXMyTUtXSGZ1WGRoWGNSMmF2S3JKNHpHaEk5Z0xoUWJxOVhhWmdHTzFrdXRJT3pJSHBLcDdOYXdoallPSU5TZVk2bEZ3SGFjdzE3UDZOVFdIZDR4cW5OYmNTODNMT2J0c2FDUGJFVytnWFVXOE9Ec3dDMjd4b09zbjNPRERtZk9Hc3M5WEx1RTU0akdqdlBxR3V1RzFtRkR6WklmZE5IeW5uZGU3RGJXMXI1RHdUc3RKSFAyaUU1NVlxRDM2ZWJYWkR2cis3TC9zVTRBQkFJcFZaV25vQTVHa0FBQUFBRWxGVGtTdVFtQ0MiLAogICAgICAgICAgICAgICAgbmV4dF9ncmF5OiAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCWUFBQUFXQ0FZQUFBREV0R3c3QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF0eEpSRUZVZU5yY2xjOUwybUVjeDcvNk5iVlpxUlZqN3BJT2xJVXVaMUhNZ3YwQkRjcVQ3SnJza0gxM0VMUEJGN2VUdnoxMEh6bldRQmxCUklmQlhJZkJMbXFYc2N2WVpXUEtyTU5JVTlBcG1ycjM0L3c2aTBvdk1aancrSDArei9OOFh0K1BuL2ZuODBoUi8rV0hZUmhCSXBGd1JLUFJ6L0Y0L0tuRDRSQjI4eEgwQWg0Y0hIeW9VQ2pzSXBGSUlaUEpIa21sMG05WWZuMlpENzhYY0wxZUg2clZhbElNQ21NVXRxS2JENy9IYk5ReGFxMTVveGNIL2xYcGNtWGd0bmgydS8ybVhDNi9EcUUrc1N4TGxVcWxuaUUwVFZQQllKQXFGb3Q2K0dWOVB0K1BKdGhtczgwc0xTMnhFb25raGxncy9qZ3dNT0JjWFYzTjVmUDVybENjcDliWDF5V0xpNHVlY3JrOFU2bFVzaERZM3dSYkxKWUZHS1pzTmtzcTRONzgvTHdZOWhPbjA1azVPanFpK1B6VEdlUHhlRndaVWw2dmQ4aGtNdmtQRGc2c1pKMk01ZVhscjF3cVV1MmtBNUpPcHkySUFPK29POWZXMW41bU1wazJuRGptY2prS05VMjVYQzY1Mld4MnBWSXA2NW1YSjJueWpVUHBxYWtwTlp4dUE4WTVUODdPenNvYmpjWUhwVktwR2hzYmUxQ3RWa1hZcXhRS2hUZHF0ZnFMMVdyMUpwUEp4eHlVNUxxL3Z6OGFDb1g4VFREYXRZaUZoRjZ2eHg1dEFKd204T1BqNDhtNXVibUtTcVVhQVd3U2E5ZVF3NkpHby9sdU5Cb05oNGVIYkFlMEpoQUlOc0xoOExOQUlKQ2l1ZGh4QitRaDJsdWRUaWZEQVFMdkkzQUljaCtSa2w4akpscmhDYk9xZ2ZvTG1EZXBPRi9CZkdOcmEyc0ZGWkZ0dnFnek1iRllqQWl5cDlWcWg0VkM0Y1RKeVltUTkwZXBJUUp0SFJPMWJBNWFSaEF2ZG5aMkdJL0g4N2NFejVZUGdlT1MyUnNmSHg5Qjd1K2dPaTY4eVFBdFlYOXpkM2VYZ1pDbmEvczhCeTV5cEdVVXpoT0lTSGdPOUJmV1h3RzZjaFo2SWJpVmM2THduc0ZnR0lWQWVwTHpqazRyWVcxemUzdWJjYnZkNTNmalpWMkZhcUdRNjNmVDA5UERNTzlpOUJFb29uMEo5Um0vMzM5eG0zZHIyZjM5ZlZMWDd3RnZvTVZ2b1lXZlJ5SVJGbmREL1ovOG5mMFdZQUE4RUMxWi9aTm00Z0FBQUFCSlJVNUVya0pnZ2c9PSIsCiAgICAgICAgICAgICAgICBwcmVfZ3JheTogImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQllBQUFBV0NBWUFBQURFdEd3N0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBc2xKUkVGVWVOcmNsVHRNV21FVXh6L3V2VHpsSVVocE5NUjBhR05qck5IU21IVHFSSnlhZHVqUURiU0dSd0pVYVlDbURpenFVRXc2T0RWTkdnYnBZQ2ZTcEZJTkNRekZSOW95TVhSc1hGQ3NBWGtJS05ML1I3Z0dXeE9zU2RQRWs1emMzTytlODd2bis1OXp2MHZJcGJTSmlRbXl1Ym41TEJLSnBOYlgxMSs0WEM1QnV4eTJYWUROWmlNT2gyT1c0emlQVENiVGk4WGlrZUhoNFNzU2llUVRYbkl4c04xdUoxYXJkVllnRURnUER3K1Y5WHFkMUdvMU1jdXlnN0F1dVZ5K3NyYTI5bmRnVkVuR3g4ZG5oRUtoczFxdEtnRS9lWFo4ZkN6QytxMysvbjZ0U3FWYVNTUVM1d003blU1aU1wbG1zRjFYcFZJNUJlWHQ2T2hJQkZrR0FlOVNLcFYvd05tektqV2J6UlQ2dEZ3dUs4NkNVcVBya0lWV1BqUXdNS0JXS0JTbjRPenYwTEd4c1JtUlNEU0ZTanVhMERvOFRSV0FTK0I1K0I2OGcvSWhpeENOdlFQTjFXanVpZVpzUy9mMWFOUTB3ekJ1YUNxbFVDUVJ0VnI5RXMxSzRrVkRXSk5oclFqQUlpcU1sa3FsZTgwNEZua2pCb09oRXp2NHZyR3hrVzJBTFJhTEZycStRb0FWMm5FOHRMZTNkekVZREU1dmIyOTM5dlgxUGNCa2lLVlNhUTFqRm9yRllxK05ScU11bTgzZWJzWXptSnE3c0d1NHhoa0t4c0RmQi9BeG5PODYwZXYxb2VYbFpVOGdFTWdtazBrRnFtdzhvOWRVS2lXZm41OHZoTVBoNTRoN1MrT3BRWE5TTEJZZmVqeWVSMXl6dzlkYlJvbjA5UFM4VzExZG5mTDVmSmw4UGsrMFdpM2hrNXZ5Q05CWTR2VjZmMEltOStqb0tKTk9wODE4bzhHNzBhaDRhV25wSXpTS1lDYS9kWGQzQitQeHVITnljakt6czdOekFtczErcUZReStWeWREUnowV2pVcGRQcDN0QjhURk0wRkFxRkd4WFB6YzE5cGxKck5KcXJhTW9YdDl0TnQzU3VjK1RnNElDZUpmbUZoUVZMb1ZBd29LRzdmci8vQjhjSEFMNkZ5OVpGRGluYUcvcjV3Nzd5YTh5L09oRXZLUmhqdEl1cDJZTVRlQmIzbVhZNTNIbkFtTmtQKy92N056SFRUd0FPNGY3OWYvdWQvUkpnQU9MY1JOWnFMb2pNQUFBQUFFbEZUa1N1UW1DQyIsCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBDT05TVC5mbHVzaE5vZGUuaW5zZXJ0KGF3YWl0IGNyZWF0ZV9DU1NfTm9kZSgiLnNwLXNlcGFyYXRvcntsaW5lLWhlaWdodDoxLjggIWltcG9ydGFudDtvcGFjaXR5OjEgIWltcG9ydGFudDtwb3NpdGlvbjpyZWxhdGl2ZSAhaW1wb3J0YW50O2Zsb2F0Om5vbmUgIWltcG9ydGFudDt0b3A6MCAhaW1wb3J0YW50O2xlZnQ6MCAhaW1wb3J0YW50O21pbi13aWR0aDozNjZweDt3aWR0aDphdXRvO3RleHQtYWxpZ246Y2VudGVyICFpbXBvcnRhbnQ7Zm9udC1zaXplOjE0cHggIWltcG9ydGFudDtkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnQ7cGFkZGluZzozcHggMCAhaW1wb3J0YW50O21hcmdpbjo1cHggMTBweCA4cHg7Y2xlYXI6Ym90aCAhaW1wb3J0YW50O2JvcmRlci1zdHlsZTpzb2xpZCAhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojY2NjY2NjICFpbXBvcnRhbnQ7Ym9yZGVyLXdpZHRoOjFweCAhaW1wb3J0YW50Oy1tb3otYm9yZGVyLXJhZGl1czozMHB4ICFpbXBvcnRhbnQ7Ym9yZGVyLXJhZGl1czozMHB4ICFpbXBvcnRhbnQ7YmFja2dyb3VuZC1jb2xvcjojZmZmZmZmICFpbXBvcnRhbnQ7fS5zcC1zZXBhcmF0b3I6aG92ZXJ7Ym94LXNoYWRvdzowIDAgMTFweCByZ2JhKDMzLDMzLDMzLDAuMik7fSNzcC1zZXBhcmF0b3ItaG92ZXJ7ZGlzcGxheTpub25lO30uc3Atc2VwYXJhdG9yOmhvdmVyICNzcC1zZXBhcmF0b3ItaG92ZXJ7ZGlzcGxheTpibG9jazt9LnNwLXNlcGFyYXRvciAuc3Atc29tZWluZm97cG9zaXRpb246YWJzb2x1dGUgIWltcG9ydGFudDtyaWdodDoxMHB4ICFpbXBvcnRhbnQ7Zm9udC1zaXplOjEycHggIWltcG9ydGFudDtmb250LXN0eWxlOml0YWxpYyAhaW1wb3J0YW50O2JhY2tncm91bmQ6bm9uZSAhaW1wb3J0YW50O30uc3Atc2VwYXJhdG9yIHNwYW57dmVydGljYWwtYWxpZ246IG1pZGRsZTtjdXJzb3I6IHBvaW50ZXI7cGFkZGluZzogMDttYXJnaW46IDAgNXB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6MjJweDtoZWlnaHQ6MjJweDt9LnNwLXNlcGFyYXRvciBhe21hcmdpbjowIDIwcHggMCAtNnB4ICFpbXBvcnRhbnQ7ZGlzcGxheTppbmxpbmUgIWltcG9ydGFudDt0ZXh0LXNoYWRvdzojZmZmIDAgMXB4IDAgIWltcG9ydGFudDtiYWNrZ3JvdW5kOm5vbmUgIWltcG9ydGFudDtjb2xvcjojNTk1OTU5ICFpbXBvcnRhbnQ7fS5zcC1zZXBhcmF0b3IgaW5wdXR7cGFkZGluZzowICFpbXBvcnRhbnQ7bGluZS1oZWlnaHQ6MjNweCAhaW1wb3J0YW50O30uc3Atc2VwYXJhdG9yIC5zcC1tZC1zcGFue2ZvbnQtd2VpZ2h0OmJvbGQgIWltcG9ydGFudDttYXJnaW46MCAyMHB4ICFpbXBvcnRhbnQ7fSNzcC1zcC1tZC1udW1iZXJ7d2lkdGg6NmNoICFpbXBvcnRhbnQ7dmVydGljYWwtYWxpZ246bWlkZGxlICFpbXBvcnRhbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2sgIWltcG9ydGFudDt0ZXh0LWFsaWduOmxlZnQgIWltcG9ydGFudDt9IiArCiAgICAgICAgICAgICAgICBgLmFjX3NwX3RvcHtiYWNrZ3JvdW5kLWltYWdlOnVybCgnJHsgc2VwSW1ncy50b3AgfScpfWAgKwogICAgICAgICAgICAgICAgYC5hY19zcF9wcmV7YmFja2dyb3VuZC1pbWFnZTp1cmwoJyR7IHNlcEltZ3MucHJlIH0nKX1gICsKICAgICAgICAgICAgICAgIGAuYWNfc3BfbmV4dHtiYWNrZ3JvdW5kLWltYWdlOnVybCgnJHsgc2VwSW1ncy5uZXh0IH0nKX1gICsKICAgICAgICAgICAgICAgIGAuYWNfc3BfYm90dG9te2JhY2tncm91bmQtaW1hZ2U6dXJsKCckeyBzZXBJbWdzLmJvdHRvbSB9Jyl9YCArCiAgICAgICAgICAgICAgICBgLmFjX3NwX25leHRfZ3JheXtiYWNrZ3JvdW5kLWltYWdlOnVybCgnJHsgc2VwSW1ncy5uZXh0X2dyYXkgfScpfWAgKwogICAgICAgICAgICAgICAgYC5hY19zcF9wcmVfZ3JheXtiYWNrZ3JvdW5kLWltYWdlOnVybCgnJHsgc2VwSW1ncy5wcmVfZ3JheSB9Jyl9YCwKICAgICAgICAgICAgICAgICJBQy1QcmVsb2FkIikpCiAgICAgICAgICAgICAgaWYgKGN1clNpdGUucGFnZVVybCA9PT0gdXJsKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJbQUMtU2NyaXB0XSIsICLnv7vpobXliLDovr7lupXpg6jkuoYgLSDmiJbogIXlvILluLggLSDlh7rnjrDlvILluLjor7fnm7TmjqXlj43ppojkvZzogIXkv67mlLkiKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9Ly8g5LiN5Lya6YeN5aSN5Yqg6L2955u45ZCM55qE6aG16Z2iCiAgICAgICAgICAgICAgY29uc29sZS5sb2coIuWKoOi9vee/u+mhteWcsOWdgO+8miIgKyB1cmwpCiAgICAgICAgICAgICAgY3VyU2l0ZS5wYWdlVXJsID0gdXJsOwogICAgICAgICAgICAgIC8vIOWvuXVybOeahOaVsOaNrui/m+ihjOivu+WPlgogICAgICAgICAgICAgIGN1clNpdGUucGFnZXIuc3RhcnRGaWx0ZXIgJiYgY3VyU2l0ZS5wYWdlci5zdGFydEZpbHRlcigpOwogICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDUwMDAsCiAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0JvZHkgPSBTaG93UGFnZXIuY3JlYXRlRG9jdW1lbnRCeVN0cmluZyhyZXNwb25zZS5yZXNwb25zZVRleHQpOwoKICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZUVsZW1zID0gZ2V0QWxsRWxlbWVudHMoY3VyU2l0ZS5wYWdlci5wYWdlRWxlbWVudCwgbmV3Qm9keSwgbmV3Qm9keSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0RWxlbXMgPSBnZXRBbGxFbGVtZW50cygnLy9zY3JpcHQnLCBuZXdCb2R5LCBuZXdCb2R5KTsKCiAgICAgICAgICAgICAgICAgICAgbGV0IHRvRWxlbWVudCA9IGdldEFsbEVsZW1lbnRzKGN1clNpdGUucGFnZXIuSFRfaW5zZXJ0WzBdKVswXTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFnZUVsZW1zLmxlbmd0aCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyDlpITnkIbmnIDlkI7kuIDkuKrnv7vpobXmjInpkq4KICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXh0RXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjc3Atc3AtZ29uZXh0Iik7CiAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RFID0gbmV4dEVzW25leHRFcy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEUuY2xhc3NMaXN0LnJlcGxhY2UoImFjX3NwX25leHRfZ3JheSIsICJhY19zcF9uZXh0Iik7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDmj5LlhaXnv7vpobXmjInpkq7lhYPntKAKICAgICAgICAgICAgICAgICAgICAgIGN1clNpdGUucGFnZU51bSsrOwogICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZFRvID0gImJlZm9yZWVuZCI7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyU2l0ZS5wYWdlci5IVF9pbnNlcnRbMV0gPT09IDEpIGFkZFRvID0gImJlZm9yZWJlZ2luIjsKICAgICAgICAgICAgICAgICAgICAgIHRvRWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwoYWRkVG8sIGA8ZGl2IGNsYXNzPSdzcC1zZXBhcmF0b3IgQUMnIGlkPSdzcC1zZXBhcmF0b3ItQUNYJz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0nc3Atc3AtbmV4dGxpbmsnIHRhcmdldD0nX2JsYW5rJz48Yj7nrKwgPHNwYW4gc3R5bGU9J2NvbG9yOiM1OTU5NTkhaW1wb3J0YW50Oyc+QUNYPC9zcGFuPiDpobU8L2I+PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJzcC1zcC1nb3RvcCIgY2xhc3M9J2FjX3NwX3RvcCcgdGl0bGU9J+WOu+WIsOmhtumDqCc+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJzcC1zcC1nb3ByZSIgY2xhc3M9JyR7IGN1clNpdGUucGFnZU51bSA8PSAyID8gImFjX3NwX3ByZV9ncmF5IiA6ICJhY19zcF9wcmUiIH0nIHRpdGxlPSfkuIrmu5rkuIDpobUnID48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InNwLXNwLWdvbmV4dCIgY2xhc3M9J2FjX3NwX25leHRfZ3JheScgdGl0bGU9J+S4i+a7muS4gOmhtSc+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJzcC1zcC1nb2JvdHRvbSIgY2xhc3M9J2FjX3NwX2JvdHRvbScgdGl0bGU9J+WOu+WIsOW6lemDqCcgPjwvc3Bhbj48L2Rpdj5gCiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9BQ1gvZ20sIGN1clNpdGUucGFnZU51bSkpOwogICAgICAgICAgICAgICAgICAgICAgLy8g5o+S5YWl5paw6aG16Z2i5YWD57SgCiAgICAgICAgICAgICAgICAgICAgICBwYWdlRWxlbXMuZm9yRWFjaChmdW5jdGlvbihvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdG9FbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudChhZGRUbywgb25lKTsKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnNwLXNlcGFyYXRvci5BQzpub3QoW2JpbmRdKSIpLmZvckVhY2goZnVuY3Rpb24ocGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBlci5zZXRBdHRyaWJ1dGUoImJpbmQiLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGVyLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYWNfc3BmdW5jKTsKICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgIC8vIOaPkuWFpXNjcmlwdHMgJiBzdHlsZSAtIOS/neivgWpz5Yqg6L29CiAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5HT09HTEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjcmlwdFRleHQgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RWxlbXMuZm9yRWFjaCgob25lKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGV4dCArPSBvbmUuaW5uZXJIVE1MOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdE5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0Tm9kZS5pbm5lckhUTUwgPSBzY3JpcHRUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICB0b0VsZW1lbnQuYXBwZW5kQ2hpbGQoc2NyaXB0Tm9kZSkKICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAvLyDmm7/mjaLlvoXmm7/mjaLlhYPntKAKICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJTaXRlLnBhZ2VyLnJlcGxhY2VFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9yaUUgPSBnZXRBbGxFbGVtZW50cyhjdXJTaXRlLnBhZ2VyLnJlcGxhY2VFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVwRSA9IGdldEFsbEVsZW1lbnRzKGN1clNpdGUucGFnZXIucmVwbGFjZUUsIG5ld0JvZHksIG5ld0JvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlFLmxlbmd0aCA9PT0gcmVwRS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlFLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAi57+76aG1Leabv+aNoue/u+mhteWFg+e0oCAncmVwbGFjZUUnIOWkseaViCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yaUUubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpRVtpXS5vdXRlckhUTUwgPSByZXBFW2ldLm91dGVySFRNTDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgY3VyU2l0ZS5wYWdlTG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG9uZXJyb3I6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICBjdXJTaXRlLnBhZ2VMb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgfTsKCiAgICAgICAgYXN5bmMgZnVuY3Rpb24gQWRkQ3VzdG9tU3R5bGUoKSB7CiAgICAgICAgICBpZiAoQUNDb25maWcuaXNVc2VyU3R5bGVFbmFibGUpIHsKICAgICAgICAgICAgbGVzcy5yZW5kZXIoQUNDb25maWcuVXNlclN0eWxlVGV4dCwgYXN5bmMoZSwgY3NzKSA9PiB7CiAgICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICBjc3MgPSBjc3MuY3NzIHx8ICcnCiAgICAgICAgICAgICAgICBDT05TVC5mbHVzaE5vZGUuaW5zZXJ0KGF3YWl0IGNyZWF0ZV9DU1NfTm9kZShjc3MsICJBQy11c2VyU3R5bGUiKSwgJ2hlYWQnLCB7CiAgICAgICAgICAgICAgICAgIGlzUmVsb2FkOiB0cnVlCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyDkuLrkuobmlrnkvr/osIPmlbTmoLflvI/lkozmn6XnnIvmlYjmnpzvvIzmmoLml7bkuI3np7vpmaQKICAgICAgICAgICAgLy8gc2FmZVJlbW92ZSgic3R5bGVbY2xhc3M9J0FDLXVzZXJTdHlsZSddIikKICAgICAgICAgIH0KICAgICAgICAgIENPTlNULmZsdXNoTm9kZS5pbnNlcnQoYXdhaXQgY3JlYXRlX0NTU19Ob2RlKCIub3ByLXJlY29tbWVuZHMtbWVyZ2UtaW1ndGV4dHtkaXNwbGF5Om5vbmUhaW1wb3J0YW50O30iICsgLy8g56e76Zmk55m+5bqm5rWP6KeI5Zmo5o6o5bm/CiAgICAgICAgICAgICIucmVzX3RvcF9iYW5uZXJ7ZGlzcGxheTpub25lIWltcG9ydGFudDt9IiArIC8vIOenu+mZpOWPr+iDveeahOeZvuW6pkhUVFBT5Yqr5oyB5pi+56S66Zeu6aKYCiAgICAgICAgICAgICIuaGVhZEJsb2NrLCBib2R5PmRpdi5yZXN1bHQtb3B7ZGlzcGxheTpub25lO30iIC8vIOenu+mZpOeZvuW6pueahOaQnOe0oue7k+aenOmhtumDqOS4gOadoeeahOW7uuiuruaWh+WtlyAmIOenu+mZpOWPr+iDveWHuueOsOeahOeZveWxj+eOsOixoQogICAgICAgICAgICAsICJBQy1zcGVjaWFsLUJBSURVIikpCgogICAgICAgICAgLy8g5re75YqgIOiHquWumuS5ieeahOWKqOeUuwogICAgICAgICAgY29uc3QgYW5pU3R5bGUgPSBgQGtleWZyYW1lcyBhbmlfbGVmdFRvcmlnaHQgewogICAgMCUgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMzJweCk7CiAgICAgICAgb3BhY2l0eTogMC4yOwogICAgfQogICAgMjAlIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICB9CiAgICAzMCUgewogICAgICAgIG9wYWNpdHk6IDAuODsKICAgIH0KICAgIDEwMCUgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICB9Cn0KLyogYW5pICovCkBrZXlmcmFtZXMgYW5pX2JvdHRvbVRvdG9wIHsKICAgIDAlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMzJweCk7CiAgICAgICAgb3BhY2l0eTogMC4yOwogICAgfQogICAgMjAlIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICB9CiAgICAzMCUgewogICAgICAgIG9wYWNpdHk6IDAuODsKICAgIH0KICAgIDEwMCUgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICB9Cn0KQC13ZWJraXQta2V5ZnJhbWVzIGFuaV90b3BUb2J1dHRvbSB7CiAgICAwJSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0zMnB4KTsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICB9CiAgICAyMCUgewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgIH0KICAgIDMwJSB7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgfQogICAgMTAwJSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgIH0KfQpALXdlYmtpdC1rZXlmcmFtZXMgYW5pX2hpZGVUb1Nob3cgewogICAgMCUgewogICAgICAgIGRpc3BsYXk6bm9uZTsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICB9CiAgICAyMCUgewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgIH0KICAgIDMwJSB7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgfQogICAgMTAwJSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgIH0KfQpALXdlYmtpdC1rZXlmcmFtZXMgYW5pX3Nob3dUb0hpZGUgewogICAgMCUgewogICAgICAgIGRpc3BsYXk6bm9uZTsKICAgICAgICBvcGFjaXR5OiAxOwogICAgfQogICAgMjAlIHsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICB9CiAgICAzMCUgewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgIH0KICAgIDEwMCUgewogICAgICAgIG9wYWNpdHk6IDAuMzsKICAgIH0KfQouYW5pRGVsZXRle3RyYW5zaXRpb246IGFsbCAwLjE1cyBjdWJpYy1iZXppZXIoMC40LCAwLCAxLCAxKTtvcGFjaXR5OiAwLjF9CmA7CiAgICAgICAgICBDT05TVC5mbHVzaE5vZGUuaW5zZXJ0KGF3YWl0IGNyZWF0ZV9DU1NfTm9kZShhbmlTdHlsZSwgIkFDLUFuaW1hdGlvblN0eWxlIikpCiAgICAgICAgfQoKICAgICAgICAvKirov5nkuJzopb/ku6XlkI7kvJrnlKjkuIoqKi8KICAgICAgICBmdW5jdGlvbiBnZXRTZWFyY2hWYWx1ZSgpIHsKICAgICAgICAgIGxldCBrdmwgPSBsb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpLnNwbGl0KCImIik7CiAgICAgICAgICBsZXQgc2VhcmNoViA9ICIiOwogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrdmwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IHZhbHVlID0ga3ZsW2ldLnJlcGxhY2UoL14od2R8cXVlcnl8cSk9LywgIiIpOwogICAgICAgICAgICBpZiAodmFsdWUgIT09IGt2bFtpXSkgewogICAgICAgICAgICAgIHNlYXJjaFYgPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgLy8gICcrJyDnmb7luqbjgIHmkJzni5fjgIHlv4XlupTjgIHosLfmrYzjgIHlpb3mkJwKICAgICAgICAgIHNlYXJjaFYgPSBzZWFyY2hWLnJlcGxhY2UoIisiLCAiICIpOwogICAgICAgICAgcmV0dXJuIHNlYXJjaFY7CiAgICAgICAgfQoKICAgICAgICBhc3luYyBmdW5jdGlvbiByYXBpZERlYWwoKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEICE9PSBTaXRlVHlwZS5PVEhFUlMpIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKEFDQ29uZmlnLmlzQWRzRW5hYmxlKSB7IC8vIOenu+mZpOWkmuS9meeahOW5v+WRiuWGheWuuQogICAgICAgICAgICAgICAgICByZW1vdmVBRF9iYWlkdV9zb2dvdSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgUmVkaXJlY3RIYW5kbGUoKTsgLy8g5aSE55CG5Li76YeN5a6a5ZCRCiAgICAgICAgICAgICAgICBpZiAoQUNDb25maWcuaXNGYXZpY29uRW5hYmxlICYmIHR5cGVvZiAoY3VyU2l0ZS5GYXZpY29uVHlwZSkgIT09ICd1bmRlZmluZWQnKSB7IC8vIOaYvuekumZhdmljb27lm77moIcKICAgICAgICAgICAgICAgICAgLy8g5bu26L+fMuenkuWKoOi9ve+8jOWHj+WwkeWPr+iDveWHuueOsOeahOmXrumimAogICAgICAgICAgICAgICAgICBhZGRGYXZpY29uKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoY3VyU2l0ZS5GYXZpY29uVHlwZSkpOyAvLyDmt7vliqBGYXZpY29u5pi+56S6CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzYWZlUmVtb3ZlKCIuQUMtZmF2aWNvblRTdHlsZSIpOwogICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGN1clNpdGUuRmF2aWNvblR5cGUpLmZvckVhY2goKG9uZSkgPT4gewogICAgICAgICAgICAgICAgICAgIG9uZS5yZW1vdmVBdHRyaWJ1dGUoImFjX2Zhdmljb25zdGF0dXMiKTsKICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChBQ0NvbmZpZy5pc0NvdW50ZXJFbmFibGUpIHsKICAgICAgICAgICAgICAgICAgLy8g5bu26L+f5Yqg6L2977yM6YG/5YWN6aG16Z2i5Ye6546wanPpl67popgKICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgYWRkQ291bnRlcihkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGN1clNpdGUuQ291bnRlclR5cGUpKTsgLy8g5pi+56S66K6h5pWw5ZmoCiAgICAgICAgICAgICAgICAgIH0sIDgwMCkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5BQy1Db3VudGVyVCIpLmZvckVhY2gob25lID0+IHsKICAgICAgICAgICAgICAgICAgICBvbmUucGFyZW50RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ1NvcnRJbmRleCcpOwogICAgICAgICAgICAgICAgICAgIG9uZS5yZW1vdmUoKQogICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKEFDQ29uZmlnLmRvRGlzYWJsZVN1ZykgeyAvLyDkuI3lkK/nlKjnp7vliqjpooTmtYtb6buY6K6kXQogICAgICAgICAgICAgICAgICBhY1NldENvb2tpZSgiT1JJR0lOIiwgMiwgInd3dy5iYWlkdS5jb20iKTsKICAgICAgICAgICAgICAgICAgYWNTZXRDb29raWUoIklTU1ciLCAxKTsKICAgICAgICAgICAgICAgICAgYWNTZXRDb29raWUoIklTU1ciLCAxLCAid3d3LmJhaWR1LmNvbSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gaWYoQ09OU1QudXNlSXRlbS5IdVlhbk1vZGUgPT09IGZhbHNlICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInN0eWxlW2NsYXNzKj0nZGFya3JlYWRlciddIikgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gICBDT05TVC51c2VJdGVtLkh1WWFuTW9kZSA9IHRydWU7CiAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICBpZiAoQUNDb25maWcuaXNCbG9ja0VuYWJsZSAmJiBjdXJTaXRlLlNpdGVUeXBlSUQgIT09IFNpdGVUeXBlLlNPR09VKSB7IC8vIOWQr+eUqOWxj+iUveWKn+iDvS0g5a+55q+P5LiA5Liq5paw5aKe55qE5Zyw5Z2A6YO96KaB5aSE55CGCiAgICAgICAgICAgICAgICAgIC8vIOW7tui/n+aJp+ihjO+8jOWHj+WwkemhtemdouaNn+iAlwogICAgICAgICAgICAgICAgICBTaXRlQmxvY2suaW5pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmJvZHkpIHsKICAgICAgICAgICAgICAgICAgaWYgKCFBQ0NvbmZpZy5pc1JpZ2h0RGlzcGxheUVuYWJsZSkgeyAvLyDlj7PkvqfmoI/mmL7npLoKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoInNob3dSaWdodCIpCiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93UmlnaHQnKSkgewogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgic2hvd1JpZ2h0IikKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5CQUlEVSAmJiBsb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCJ0bj1uZXdzIikpIHsKICAgICAgICAgICAgICAgICAgICBpZighZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ25ld3MnKSkgZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUoIm5ld3MiLCAiMSIpOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQXR0cmlidXRlKCJuZXdzIik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSkKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gYWNTZXRDb29raWUoY25hbWUsIGN2YWx1ZSwgZG9tYWluLCBleGRheXMpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGV4ZGF5cyA9IGV4ZGF5cyB8fCAzMDsKICAgICAgICAgICAgbGV0IGQgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICBkb21haW4gPSAoZG9tYWluID8gImRvbWFpbj0iICsgZG9tYWluIDogIiIpICsgIjsiOwogICAgICAgICAgICBkLnNldFRpbWUoZC5nZXRUaW1lKCkgKyAoZXhkYXlzICogMjQgKiA2MCAqIDYwICogMTAwMCkpOwogICAgICAgICAgICBsZXQgZXhwaXJlcyA9ICJleHBpcmVzPSIgKyBkLnRvVVRDU3RyaW5nKCk7CiAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNuYW1lICsgIj0iICsgY3ZhbHVlICsgIjsgIiArIGRvbWFpbiArIGV4cGlyZXMgKyAiO3BhdGg9LztTYW1lU2l0ZT1Ob25lO1NlY3VyZSI7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBpc0JhaWR1TGluayA9IOaYr+WQpuS4uuacquWkhOeQhuS5i+WJjeeahOeZvuW6pumTvuaOpQogICAgICAgICAqICovCiAgICAgICAgZnVuY3Rpb24gZ2V0Tm9kZUhvc3Qoc2l0ZXRwTm9kZSkgewogICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuQkFJRFUpIHsKICAgICAgICAgICAgY29uc3QgaHJlZiA9IHNpdGV0cE5vZGUuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgICAgICAgICAgIGlmIChocmVmICE9IG51bGwgJiYgIWhyZWYuaW5jbHVkZXMoImJhaWR1LmNvbS9saW5rIikpIHsKICAgICAgICAgICAgICAvLyDlt7Lnu4/op6PmnpDlh7rmnaXkuoYKICAgICAgICAgICAgICByZXR1cm4geyBjdXJIb3N0OiBnZXRUZXh0SG9zdChocmVmKSwgY3VyVXJsOiBocmVmIH07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY29uc3QgaG9zdCA9IGdldFRleHRIb3N0KHNpdGV0cE5vZGUuaW5uZXJUZXh0IHx8IHNpdGV0cE5vZGUudGV4dENvbnRlbnQpCiAgICAgICAgICAgICAgcmV0dXJuIHsgY3VySG9zdDogaG9zdCwgY3VyVXJsOiBob3N0LCBpc0JhaWR1TGluazogdHJ1ZSB9OyAvLyDmnKrooqvop6Plr4YKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChzaXRldHBOb2RlIGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQpIHsKICAgICAgICAgICAgcmV0dXJuIHsgY3VySG9zdDogc2l0ZXRwTm9kZS5ob3N0LCBjdXJVcmw6IHNpdGV0cE5vZGUuaHJlZiB9OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29uc3QgaG9zdCA9IGdldFRleHRIb3N0KHNpdGV0cE5vZGUuaW5uZXJUZXh0IHx8IHNpdGV0cE5vZGUudGV4dENvbnRlbnQpCiAgICAgICAgICAgIHJldHVybiB7IGN1ckhvc3Q6IGhvc3QsIGN1clVybDogaG9zdCB9OwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gUmVkaXJlY3RIYW5kbGUoKSB7CiAgICAgICAgICAvLyDlpITnkIbkuLvph43lrprlkJEKICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLk9USEVSUyB8fCBjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLlNPR09VKSByZXR1cm47CiAgICAgICAgICBpZiAoQUNDb25maWcuaXNSZWRpcmVjdEVuYWJsZSkgewogICAgICAgICAgICBpZiAoY3VyU2l0ZS5TdHlwZV9Ob3JtYWwpIHsgLy8g5aaC5p6c5a6a5LmJ5LqG77yM6YKj5LmI5bCx5Y675aSE55CG6YeN5a6a5ZCRCiAgICAgICAgICAgICAgLy8g55m+5bqm5pCc54uX5Y676YeN5a6a5ZCRCiAgICAgICAgICAgICAgcmVzZXRVUkxOb3JtYWwoKTsKICAgICAgICAgICAgICBpZiAoY2hlY2tJU0JhaWR1TWFpbigpKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuc19mb3JtIC5pbmRleC1sb2dvLXNyY1tzcmMqPSdnaWYnXSwgLnNfZm9ybSAuaW5kZXgtbG9nby1zcmNuZXdbc3JjKj0nZ2lmJ10iKS5mb3JFYWNoKGZ1bmN0aW9uKHBlcikgewogICAgICAgICAgICAgICAgICBwZXIuc3JjID0gImh0dHBzOi8vcGljLnJtYi5iZHN0YXRpYy5jb20vYzg2MjU1ZTgwMjg2OTYxMzlkM2UzZTRiYjQ0YzA0N2IucG5nIjsKICAgICAgICAgICAgICAgICAgLy8g56We5aWH55qE55m+5bqm55m+5a625Y+3CiAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vaW1nc2EuYmFpZHUuY29tL2ZleC9waWMvaXRlbS84NzE4MzY3YWRhYjQ0YWVkY2M5MWFiMmJiZTFjODcwMWEwOGJmYjI2LmpwZwogICAgICAgICAgICAgICAgICAvLyBodHRwczovL2JhaWR1Lm50YW93LmNvbS9uZXdjc3MvYmFpZHUucG5nCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuR09PR0xFKSByZW1vdmVPbk1vdXNlRG93bkZ1bmMoKTsgLy8g56e76Zmkb25Nb3VzZURvd27kuovku7bvvIzosLfmrYzljrvph43lrprlkJEKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuTUJBSURVKSByZW1vdmVNb2JpbGVCYWlkdURpcmVjdExpbmsoKTsgLy8g5aSE55CG55m+5bqm5omL5py654mI5pys55qE6YeN5a6a5ZCR5Zyw5Z2ACiAgICAgICAgICAgIHJlbW92ZVJlZGlyZWN0TGlua1RhcmdldCgpOyAvLyDlj6rnp7vpmaTnn6XkuY7nmoTph43lrprlkJHpl67popggJiDnmb7luqblrabmnK/ph43lrprlkJHpl67popgKICAgICAgICAgICAgc2FmZVJlbW92ZSgiLnJlc190b3BfYmFubmVyIik7IC8vIOenu+mZpOeZvuW6puWPr+iDveaYvuekuueahOWKq+aMgQogICAgICAgICAgfQoKICAgICAgICAgIHRyeSB7IC8vIOaUvuWFpeW8guW4uOaNleiOt++8jOmYsuatoueUseS6jmh0bWzmj5LlhaXov4fmhaLlr7zoh7TnmoRqc+e7iOatogogICAgICAgICAgICBpZiAoIUFDQ29uZmlnLkFkc1N0eWxlRW5hYmxlKSB7CiAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiaW5wdXRbbmFtZSo9J3NwLWFjLWFfZm9yY2Vfc3R5bGVfJ10iKS5mb3JFYWNoKHBlciA9PiB7CiAgICAgICAgICAgICAgICBwZXIuc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgcGVyLnBhcmVudE5vZGUuc2V0QXR0cmlidXRlKCJ0aXRsZSIsICLor7flvIDlkK/oh6rlrprkuYnmoLflvI8iKQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWUqPSdzcC1hYy1hX2ZvcmNlX3N0eWxlXyddIikuZm9yRWFjaChwZXIgPT4gewogICAgICAgICAgICAgICAgcGVyLnJlbW92ZUF0dHJpYnV0ZSgiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICAgIHBlci5wYXJlbnROb2RlLnNldEF0dHJpYnV0ZSgidGl0bGUiLCAiQUMt6Ieq5a6a5LmJ5qC35byP5YaF5a65IikKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIUFDQ29uZmlnLmlzQmxvY2tFbmFibGUpIHsKICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjc3AtYWMtcmVtb3ZlQmxvY2ssICNzcC1hYy1ibG9ja0J0bkRpc3BsYXkiKS5mb3JFYWNoKHBlciA9PiB7CiAgICAgICAgICAgICAgICBwZXIuc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgcGVyLnBhcmVudE5vZGUuc2V0QXR0cmlidXRlKCJ0aXRsZSIsICLor7flvIDlkK/mi6bmiKrlip/og70iKQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIiNzcC1hYy1yZW1vdmVCbG9jaywgI3NwLWFjLWJsb2NrQnRuRGlzcGxheSIpLmZvckVhY2gocGVyID0+IHsKICAgICAgICAgICAgICAgIHBlci5yZW1vdmVBdHRyaWJ1dGUoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICBwZXIucGFyZW50Tm9kZS5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgIkFDLeiHquS4u+aLpuaIquWKn+iDvSIpCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIEFDdG9nZ2xlU2V0dGluZ0Rpc3BsYXkoZSkgewogICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIC8vIOaYvuekuu+8n+makOiXj+iuvue9rueVjOmdogogICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5pZnJhbWUtZmF0aGVyIGlmcmFtZSIpID09PSBudWxsKSB7CiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5pZnJhbWUtZmF0aGVyIikuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVlbmQiLCAiPGlmcmFtZSBzcmM9J2h0dHBzOi8vZ2hidG5zLmNvbS9naXRodWItYnRuLmh0bWw/dXNlcj1sYW5ncmVuMTM1MyZyZXBvPUdNX3NjcmlwdCZ0eXBlPXN0YXImY291bnQ9dHJ1ZScgZnJhbWVib3JkZXI9JzAnIHNjcm9sbGluZz0nMCcgc3R5bGU9J2hlaWdodDogMjBweDttYXgtd2lkdGg6IDEwOHB4O3BhZGRpbmctbGVmdDo1cHg7Ym94LXNpemluZzogYm9yZGVyLWJveDttYXJnaW4tYm90dG9tOiAtNXB4O2Rpc3BsYXk6dW5zZXQgIWltcG9ydGFudDsnPjwvaWZyYW1lPiIpOwogICAgICAgICAgfQogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzcC1hYy1jb250ZW50Iikuc3R5bGUuZGlzcGxheSA9PT0gJ2Jsb2NrJykgewogICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzcC1hYy1jb250ZW50Iikuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBEQkNvbmZpZy5vbGRWZXJzaW9uID0gQUNDb25maWcub2xkVmVyc2lvbiA9IEdNX2luZm8uc2NyaXB0LnZlcnNpb247IC8vIOWPqumcgOimgeWGmeWHuuS4gOmDqOWIhueahOWFs+mUruaVsOaNruWNs+WPrwogICAgICAgICAgICAgIEFDU2V0VmFsdWUoIkNvbmZpZyIsIEpTT04uc3RyaW5naWZ5KERCQ29uZmlnKSk7CiAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmFjLW5ld3ZlcnNpb25EaXNwbGF5Iikuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc3AtYWMtY29udGVudCIpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCAxMDApOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gU2hvd1NldHRpbmcoKSB7CiAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5PVEhFUlMpIHJldHVybjsKICAgICAgICAgIC8vIOWmguaenOS4jeWtmOWcqOeahOivne+8jOmCo+S5iOiHquW3seWIm+W7uuS4gOS4qi1jb3B5IGZyb20gc3VwZXJQcmVsb2FkCiAgICAgICAgICBpZiAoZG9jdW1lbnQuYm9keSAhPT0gbnVsbCAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc3AtYWMtY29udGFpbmVyIikgPT09IG51bGwpIHsKICAgICAgICAgICAgbGV0IENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICBDb250YWluZXIuaWQgPSAic3AtYWMtY29udGFpbmVyIjsKICAgICAgICAgICAgQ29udGFpbmVyLmlubmVySFRNTCA9CiAgICAgICAgICAgICAgYDxkaXYgaWQ9InNwLWFjLWNvbnRlbnQiIHN0eWxlPSJkaXNwbGF5OiBub25lOyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvaHRtbCI+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJzcC1hYy1tYWluIj4KICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGlkPSJzcC1hYy1hdXRvcGFnZXItZmllbGQiIHN0eWxlPSJkaXNwbGF5OmJsb2NrOyI+CiAgICAgICAgICAgICAgICAgICAgPGxlZ2VuZCBjbGFzcz0iaWZyYW1lLWZhdGhlciI+CiAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9ImxpbmtocmVmIiBocmVmPSJodHRwczovL3d3dy5udGFvdy5jb20vYWJvdXRzY3JpcHQuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiIHYtdGV4dD0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5wYW5lbF90aXRsZSI+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGVnZW5kPgogICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ic2V0dGluZy1tYWluIiB2LXNob3c9Im90aGVyLmN1clRhYiA9PT0gMSI+CiAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5yZWRpcmVjdF90aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJzcC1hYy1yZWRpcmVjdCIgbmFtZT0ic3AtYWMtYV9zZXBhcmF0b3IiIHR5cGU9ImNoZWNrYm94IiAgdi1tb2RlbD0iQUNDb25maWcuaXNSZWRpcmVjdEVuYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnJlZGlyZWN0X3RleHQgfX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ic3AtYWMtaXNFbkxhbmciIG5hbWU9InNwLWFjLWFfZm9yY2UiIHR5cGU9ImNoZWNrYm94IiB2LW1vZGVsPSJBQ0NvbmZpZy5pc0VuTGFuZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZUVuX3RleHQgfX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InNwLWFjLXNhdmVidXR0b24iIEBjbGljaz0ic2F2ZUNvbmZpZyIgY2xhc3M9InNwLWFjLXNwYW5idXR0b24gZW5kYnV0dG9uIiA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5va0J0bl90ZXh0IiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlO2Zsb2F0OiByaWdodDttYXJnaW4tdG9wOiAtNnB4OyIgdi10ZXh0PSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwub2tCdG5fdGV4dCI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0ic3AtYWMtcmVzZXRidXR0b24iIEBjbGljaz0iY2hhbmdlUmVzZXRUZXh0IiBAZGJsY2xpY2s9InJlc2V0Q29uZmlnIiBjbGFzcz0ic3AtYWMtc3BhbmJ1dHRvbiBlbmRidXR0b24iIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnJlc2V0QnRuX3RleHQiIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7ZmxvYXQ6IHJpZ2h0O21hcmdpbi10b3A6IC02cHg7IiB2LXRleHQ9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5yZXNldEJ0bl90ZXh0Ij48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgOnRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuYWRzX3RpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9InNwLWFjLWFkcyIgbmFtZT0ic3AtYWMtYV9mb3JjZSIgdHlwZT0iY2hlY2tib3giIHYtbW9kZWw9IkFDQ29uZmlnLmlzQWRzRW5hYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuYWRzX3RleHQgfX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmF1dG9wYWdlX3RpdGxlIiBjbGFzcz0iIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9InNwLWFjLWlzQXV0b3BhZ2UiIG5hbWU9InNwLWFjLWFfZm9yY2UiIHR5cGU9ImNoZWNrYm94IiB2LW1vZGVsPSJBQ0NvbmZpZy5pc0F1dG9wYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuYXV0b3BhZ2VfdGV4dCB9fQogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuYmxvY2tlbmFibGVfdGl0bGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ic3AtYWMtYmxvY2siIG5hbWU9InNwLWFjLWFfZm9yY2UiIHR5cGU9ImNoZWNrYm94IiB2LW1vZGVsPSJBQ0NvbmZpZy5pc0Jsb2NrRW5hYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuYmxvY2tlbmFibGVfdGV4dCB9fQogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0ic3AtYWMtYmxvY2tkaXlidXR0b24iIGNsYXNzPSJzcC1hYy1zcGFuYnV0dG9uIiBAY2xpY2s9Im90aGVyLmN1clRhYiA9IDIiIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmJsb2NrRGl5QnRuX3RpdGxlIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDVweDtjb2xvcjogIzg4ODg4ODsiIHYtdGV4dD0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmJsb2NrRGl5QnRuX3RleHQiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmJsb2NrZW5hYmxlX3RleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5ibG9ja0F1dG9SZW1vdmVfdGl0bGUiIHYtbW9kZWw9IkFDQ29uZmlnLmlzQmxvY2tEaXNwbGF5IiBpZD0ic3AtYWMtcmVtb3ZlQmxvY2siIHR5cGU9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuYmxvY2tBdXRvUmVtb3ZlX3RleHQgfX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmJsb2NrQnRuU2hvd190aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmJsb2NrQnRuU2hvd190aXRsZSIgIHYtbW9kZWw9IkFDQ29uZmlnLmlzQmxvY2tCdG5Ob3REaXNwbGF5IiBpZD0ic3AtYWMtYmxvY2tCdG5EaXNwbGF5IiB0eXBlPSJjaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmJsb2NrQnRuU2hvd190ZXh0IH19CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgOnRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX3RleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ic3AtYWMtc3R5bGUiIG5hbWU9InNwLWFjLWFfZm9yY2UiIHR5cGU9ImNoZWNrYm94IiB2LW1vZGVsPSJBQ0NvbmZpZy5BZHNTdHlsZUVuYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV90ZXh0IH19CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLeeZvuW6puagt+W8jy0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbnRhaW5lci1sYWJlbCBiYWlkdSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJsYWJlbF9oaWRlIiB2LXRleHQ9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfYmFpZHVfbGFibGUiIEBjbGljaz0ibGFiZWxTaG93SGlkZUVudiI+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9Im1hcmdpbi1sZWZ0OjIwcHgiPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2JhaWR1IiB2YWx1ZT0iMCIgdi1tb2RlbD0iQUNDb25maWcuYmFpZHUuQWRzU3R5bGVNb2RlIiB0eXBlPSJyYWRpbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9iYWlkdV9vcmlnaW4gfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgIG5hbWU9J3NwLWFjLWh1eWFuX3N0eWxlX2JhaWR1JyB0eXBlPSdjaGVja2JveCcgdi1tb2RlbD0iQUNDb25maWcuYmFpZHUuSHVZYW5Nb2RlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JhaWR1X2h1eWFuIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9IiI+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfYmFpZHVsaXRlIiB0eXBlPSJjaGVja2JveCIgdi1tb2RlbD0iQUNDb25maWcuU3R5bGVfQmFpZHVMaXRlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JhaWR1X2JhaWR1TGl0ZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0ibWFyZ2luLWxlZnQ6MjBweCI+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfYmFpZHUiIHZhbHVlPSIxIiB2LW1vZGVsPSJBQ0NvbmZpZy5iYWlkdS5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JhaWR1XzFsaW5lIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfYmFpZHUiIHZhbHVlPSIyIiB0eXBlPSJyYWRpbyIgdi1tb2RlbD0iQUNDb25maWcuYmFpZHUuQWRzU3R5bGVNb2RlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JhaWR1XzFsaW5lX2VudGVyIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfYmFpZHUiIHZhbHVlPSIzIiB0eXBlPSJyYWRpbyIgdi1tb2RlbD0iQUNDb25maWcuYmFpZHUuQWRzU3R5bGVNb2RlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JhaWR1XzJsaW5lIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfYmFpZHUiIHZhbHVlPSI0IiB0eXBlPSJyYWRpbyIgdi1tb2RlbD0iQUNDb25maWcuYmFpZHUuQWRzU3R5bGVNb2RlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JhaWR1XzNsaW5lIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfYmFpZHUiIHZhbHVlPSI1IiB0eXBlPSJyYWRpbyIgdi1tb2RlbD0iQUNDb25maWcuYmFpZHUuQWRzU3R5bGVNb2RlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JhaWR1XzRsaW5lIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJkaXNwbGF5LWJsb2NrIiBzdHlsZT0ibWFyZ2luOiAzcHggMCAzcHggMjVweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmJhY2tncm91bmRJbWFnZV90ZXh0IH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgOnBsYWNlaG9sZGVyPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuYmFja2dyb3VuZEltYWdlX3RleHRfaGludCIgOnRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuYmFja2dyb3VuZEltYWdlX3RleHRfaGludCIgaWQ9InNwLWFjLWJhY2tncm91bmRJbWFnZSIgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9iZ0ltZyIgdi1tb2RlbD0iQUNDb25maWcuYmFpZHUuZGVmYXVsdEJnVXJsIiBzdHlsZT0id2lkdGg6NTUlO21hcmdpbi10b3A6LTAuM2VtOyIgdHlwZT0iaW5wdXQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmJhY2tncm91bmRJbWFnZUF1dG9GaXRfdGV4dF9oaW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJzcC1hYy1hX2F1dG9GaXRTU3R5bGUiIHYtbW9kZWw9IkFDQ29uZmlnLmJhaWR1LkJnRml0IiA6ZGlzYWJsZWQ9IiFBQ0NvbmZpZy5iYWlkdS5kZWZhdWx0QmdVcmwgfHwgIUFDQ29uZmlnLkFkc1N0eWxlRW5hYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmJhY2tncm91bmRJbWFnZUF1dG9GaXRfdGV4dCB9fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLeeZvuW6puagt+W8jy0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJoZWlnaHQ6IDFweDt3aWR0aDoyNjdweDttYXJnaW4tbGVmdDoyNXB4O2JhY2tncm91bmQtY29sb3I6I2Q4ZDhkODttYXJnaW4tdG9wOjFweDsiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLeiwt+atjOagt+W8jy0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbnRhaW5lci1sYWJlbCBnb29nbGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibGFiZWxfaGlkZSIgdi10ZXh0PSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2dvb2dsZV9sYWJsZSIgQGNsaWNrPSJsYWJlbFNob3dIaWRlRW52Ij48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0ibWFyZ2luLWxlZnQ6MjBweCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfZ29vZ2xlIiB2YWx1ZT0iMCIgdHlwZT0icmFkaW8iIHYtbW9kZWw9IkFDQ29uZmlnLmdvb2dsZS5BZHNTdHlsZU1vZGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZ29vZ2xlX29yaWdpbiB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9nb29nbGVfaHV5YW4iPjxpbnB1dCBuYW1lPSJzcC1hYy1odXlhbl9zdHlsZV9nb29nbGUiIHYtbW9kZWw9IkFDQ29uZmlnLmdvb2dsZS5IdVlhbk1vZGUiIHR5cGU9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2dvb2dsZV9odXlhbiB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9nb29nbGVfZ29vZ2xlTGl0ZSIgc3R5bGU9IiI+PGlucHV0IG5hbWU9InNwLWFjLWdvb2dsZV9pbl9iYWlkdW1vZGUiIHYtbW9kZWw9IkFDQ29uZmlnLmlzR29vbGVJbkJhaWR1TW9kZUVuYWJsZSIgdHlwZT0iY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZ29vZ2xlX2dvb2dsZUxpdGUgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9Im1hcmdpbi1sZWZ0OjIwcHgiPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2dvb2dsZSIgdmFsdWU9IjEiIHYtbW9kZWw9IkFDQ29uZmlnLmdvb2dsZS5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2dvb2dsZV8xbGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2dvb2dsZSIgdmFsdWU9IjIiIHYtbW9kZWw9IkFDQ29uZmlnLmdvb2dsZS5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIiBjaGVja2VkPSIiPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZ29vZ2xlXzFsaW5lX2VudGVyIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfZ29vZ2xlIiB2YWx1ZT0iMyIgdi1tb2RlbD0iQUNDb25maWcuZ29vZ2xlLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZ29vZ2xlXzJsaW5lIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfZ29vZ2xlIiB2YWx1ZT0iNCIgdi1tb2RlbD0iQUNDb25maWcuZ29vZ2xlLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZ29vZ2xlXzNsaW5lIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfZ29vZ2xlIiB2YWx1ZT0iNSIgdi1tb2RlbD0iQUNDb25maWcuZ29vZ2xlLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZ29vZ2xlXzRsaW5lIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJkaXNwbGF5LWJsb2NrIiBzdHlsZT0ibWFyZ2luOiAzcHggMCAzcHggMjVweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmJhY2tncm91bmRJbWFnZV90ZXh0IH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgOnBsYWNlaG9sZGVyPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuYmFja2dyb3VuZEltYWdlX3RleHRfaGludCIgaWQ9InNwLWFjLWJhY2tncm91bmRJbWFnZSIgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9iZ0ltZyIgdi1tb2RlbD0iQUNDb25maWcuZ29vZ2xlLmRlZmF1bHRCZ1VybCIgc3R5bGU9IndpZHRoOjU1JTttYXJnaW4tdG9wOi0wLjNlbTsiIHR5cGU9ImlucHV0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5iYWNrZ3JvdW5kSW1hZ2VBdXRvRml0X3RleHRfaGludCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ic3AtYWMtYV9hdXRvRml0U1N0eWxlIiB2LW1vZGVsPSJBQ0NvbmZpZy5nb29nbGUuQmdGaXQiIDpkaXNhYmxlZD0iIUFDQ29uZmlnLmdvb2dsZS5kZWZhdWx0QmdVcmwgfHwgIUFDQ29uZmlnLkFkc1N0eWxlRW5hYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmJhY2tncm91bmRJbWFnZUF1dG9GaXRfdGV4dCB9fSAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLeiwt+atjOagt+W8jy0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJoZWlnaHQ6IDFweDt3aWR0aDoyNjdweDttYXJnaW4tbGVmdDoyNXB4O2JhY2tncm91bmQtY29sb3I6I2Q4ZDhkODttYXJnaW4tdG9wOjFweDsiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLeW/heW6lOagt+W8jy0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbnRhaW5lci1sYWJlbCBiaW5nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImxhYmVsX2hpZGUiIHYtdGV4dD0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9iaW5nX2xhYmxlIiBAY2xpY2s9ImxhYmVsU2hvd0hpZGVFbnYiPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJtYXJnaW4tbGVmdDoyMHB4Ij48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9iaW5nIiB2LW1vZGVsPSJBQ0NvbmZpZy5iaW5nLkFkc1N0eWxlTW9kZSIgdmFsdWU9IjAiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2Jpbmdfb3JpZ2luIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgOnRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JpbmdfaHV5YW4iPjxpbnB1dCBuYW1lPSJzcC1hYy1odXlhbl9zdHlsZV9iaW5nIiB2LW1vZGVsPSJBQ0NvbmZpZy5iaW5nLkh1WWFuTW9kZSIgdHlwZT0iY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfYmluZ19odXlhbiB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0ibWFyZ2luLWxlZnQ6MjBweCI+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfYmluZyIgdi1tb2RlbD0iQUNDb25maWcuYmluZy5BZHNTdHlsZU1vZGUiIHZhbHVlPSIxIiB0eXBlPSJyYWRpbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9iaW5nXzFsaW5lIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfYmluZyIgdmFsdWU9IjIiIHYtbW9kZWw9IkFDQ29uZmlnLmJpbmcuQWRzU3R5bGVNb2RlIiB0eXBlPSJyYWRpbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9iaW5nXzFsaW5lX2VudGVyIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfYmluZyIgdmFsdWU9IjMiIHYtbW9kZWw9IkFDQ29uZmlnLmJpbmcuQWRzU3R5bGVNb2RlIiB0eXBlPSJyYWRpbyIgY2hlY2tlZD0iIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JpbmdfMmxpbmUgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9iaW5nIiB2YWx1ZT0iNCIgdi1tb2RlbD0iQUNDb25maWcuYmluZy5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JpbmdfM2xpbmUgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9iaW5nIiB2YWx1ZT0iNSIgdi1tb2RlbD0iQUNDb25maWcuYmluZy5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2JpbmdfNGxpbmUgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImRpc3BsYXktYmxvY2siIHN0eWxlPSJtYXJnaW46IDNweCAwIDNweCAyNXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuYmFja2dyb3VuZEltYWdlX3RleHQgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCA6cGxhY2Vob2xkZXI9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5iYWNrZ3JvdW5kSW1hZ2VfdGV4dF9oaW50IiBpZD0ic3AtYWMtYmFja2dyb3VuZEltYWdlIiBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2JnSW1nIiB2LW1vZGVsPSJBQ0NvbmZpZy5iaW5nLmRlZmF1bHRCZ1VybCIgc3R5bGU9IndpZHRoOjU1JTttYXJnaW4tdG9wOi0wLjNlbTsiIHR5cGU9ImlucHV0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5iYWNrZ3JvdW5kSW1hZ2VBdXRvRml0X3RleHRfaGludCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ic3AtYWMtYV9hdXRvRml0U1N0eWxlIiB2LW1vZGVsPSJBQ0NvbmZpZy5iaW5nLkJnRml0IiA6ZGlzYWJsZWQ9IiFBQ0NvbmZpZy5iaW5nLmRlZmF1bHRCZ1VybCB8fCAhQUNDb25maWcuQWRzU3R5bGVFbmFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuYmFja2dyb3VuZEltYWdlQXV0b0ZpdF90ZXh0IH19ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS3lv4XlupTmoLflvI8tLS0tLS0tLS0tLS0tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImhlaWdodDogMXB4O3dpZHRoOjI2N3B4O21hcmdpbi1sZWZ0OjI1cHg7YmFja2dyb3VuZC1jb2xvcjojZDhkOGQ4O21hcmdpbi10b3A6MXB4OyI+PC9kaXY+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7ISZuZGFzaDsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1O+aQnOeLl+agt+W8jyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyZuZGFzaDsmZ3Q7LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbnRhaW5lci1sYWJlbCBzb2dvdSI+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibGFiZWxfaGlkZSIgdi10ZXh0PSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX3NvZ291X2xhYmxlIiBAY2xpY2s9ImxhYmVsU2hvd0hpZGVFbnYiPjwvbGFiZWw+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0ibWFyZ2luLWxlZnQ6MjBweCI+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfc29nb3UiIHYtbW9kZWw9IkFDQ29uZmlnLnNvZ291LkFkc1N0eWxlTW9kZSIgdmFsdWU9IjAiIHR5cGU9InJhZGlvIj4tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9zb2dvdV9vcmlnaW4gfX0tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9zb2dvdV9odXlhbiI+PGlucHV0IG5hbWU9InNwLWFjLWh1eWFuX3N0eWxlX3NvZ291IiB2LW1vZGVsPSJBQ0NvbmZpZy5zb2dvdS5IdVlhbk1vZGUiIHR5cGU9ImNoZWNrYm94Ij4tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9zb2dvdV9odXlhbiB9fS0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPi0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0ibWFyZ2luLWxlZnQ6MjBweCI+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX3NvZ291IiB2YWx1ZT0iMSIgdi1tb2RlbD0iQUNDb25maWcuc29nb3UuQWRzU3R5bGVNb2RlIiB0eXBlPSJyYWRpbyI+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfc29nb3VfMWxpbmUgfX0tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX3NvZ291IiB2YWx1ZT0iMiIgdi1tb2RlbD0iQUNDb25maWcuc29nb3UuQWRzU3R5bGVNb2RlIiB0eXBlPSJyYWRpbyI+LS0+CjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfc29nb3VfMWxpbmVfZW50ZXIgfX0tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX3NvZ291IiB2YWx1ZT0iMyIgdi1tb2RlbD0iQUNDb25maWcuc29nb3UuQWRzU3R5bGVNb2RlIiB0eXBlPSJyYWRpbyIgY2hlY2tlZD0iIj4tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9zb2dvdV8ybGluZSB9fS0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPi0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfc29nb3UiIHZhbHVlPSI0IiB2LW1vZGVsPSJBQ0NvbmZpZy5zb2dvdS5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIj4tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9zb2dvdV8zbGluZSB9fS0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPi0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfc29nb3UiIHZhbHVlPSI1IiB2LW1vZGVsPSJBQ0NvbmZpZy5zb2dvdS5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIj4tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9zb2dvdV80bGluZSB9fS0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPi0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4tLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICZsdDshJm5kYXNoOyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU75pCc54uX5qC35byPJiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7JiM0NTsmIzQ1OyYjNDU7Jm5kYXNoOyZndDstLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iaGVpZ2h0OiAxcHg7d2lkdGg6MjY3cHg7bWFyZ2luLWxlZnQ6MjVweDtiYWNrZ3JvdW5kLWNvbG9yOiNkOGQ4ZDg7bWFyZ2luLXRvcDoxcHg7Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS3puK3puK3mkJzmoLflvI8tLS0tLS0tLS0tLS0tLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb250YWluZXItbGFiZWwgZHVjayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJsYWJlbF9oaWRlIiB2LXRleHQ9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZHVja19sYWJsZSIgQGNsaWNrPSJsYWJlbFNob3dIaWRlRW52Ij48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0ibWFyZ2luLWxlZnQ6MjBweCI+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfZHVjayIgdi1tb2RlbD0iQUNDb25maWcuZHVjay5BZHNTdHlsZU1vZGUiIHZhbHVlPSIwIiB0eXBlPSJyYWRpbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9kdWNrX29yaWdpbiB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9kdWNrX2h1eWFuIj48aW5wdXQgbmFtZT0ic3AtYWMtaHV5YW5fc3R5bGVfZHVjayIgdi1tb2RlbD0iQUNDb25maWcuZHVjay5IdVlhbk1vZGUiIHR5cGU9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2R1Y2tfaHV5YW4gfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgOnRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2R1Y2tfbm9ybWFsIiBzdHlsZT0iIj48aW5wdXQgdi1tb2RlbD0iQUNDb25maWcubm9ybWFsaXplRHVjayIgdHlwZT0iY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZHVja19ub3JtYWwgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9Im1hcmdpbi1sZWZ0OjIwcHgiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2R1Y2siIHZhbHVlPSIxIiB2LW1vZGVsPSJBQ0NvbmZpZy5kdWNrLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZHVja18xbGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2R1Y2siIHZhbHVlPSIyIiB2LW1vZGVsPSJBQ0NvbmZpZy5kdWNrLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZHVja18xbGluZV9lbnRlciB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2R1Y2siIHZhbHVlPSIzIiB2LW1vZGVsPSJBQ0NvbmZpZy5kdWNrLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iIGNoZWNrZWQ9IiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9kdWNrXzJsaW5lIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfZHVjayIgdmFsdWU9IjQiIHYtbW9kZWw9IkFDQ29uZmlnLmR1Y2suQWRzU3R5bGVNb2RlIiB0eXBlPSJyYWRpbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9kdWNrXzNsaW5lIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IG5hbWU9InNwLWFjLWFfZm9yY2Vfc3R5bGVfZHVjayIgdmFsdWU9IjUiIHYtbW9kZWw9IkFDQ29uZmlnLmR1Y2suQWRzU3R5bGVNb2RlIiB0eXBlPSJyYWRpbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9kdWNrXzRsaW5lIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0t6bit6bit5pCc5qC35byPLS0tLS0tLS0tLS0tLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImhlaWdodDogMXB4O3dpZHRoOjI2N3B4O21hcmdpbi1sZWZ0OjI1cHg7YmFja2dyb3VuZC1jb2xvcjojZDhkOGQ4O21hcmdpbi10b3A6MXB4OyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0t5aSa5ZCJ5qC35byPLS0tLS0tLS0tLS0tLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29udGFpbmVyLWxhYmVsIGRvZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibGFiZWxfaGlkZSIgdi10ZXh0PSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2RvZ2VfbGFibGUiIEBjbGljaz0ibGFiZWxTaG93SGlkZUVudiI+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9Im1hcmdpbi1sZWZ0OjIwcHgiPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2RvZ2UiIHYtbW9kZWw9IkFDQ29uZmlnLmRvZ2UuQWRzU3R5bGVNb2RlIiB2YWx1ZT0iMCIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZG9nZV9vcmlnaW4gfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZG9nZV9odXlhbiI+PGlucHV0IG5hbWU9InNwLWFjLWh1eWFuX3N0eWxlX2RvZ2UiIHYtbW9kZWw9IkFDQ29uZmlnLmRvZ2UuSHVZYW5Nb2RlIiB0eXBlPSJjaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9kb2dlX2h1eWFuIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnVzZXJTdHlsZV9kb2dlX25vcm1hbCIgc3R5bGU9IiI+PGlucHV0IHYtbW9kZWw9IkFDQ29uZmlnLm5vcm1hbGl6ZURvZ2UiIHR5cGU9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2RvZ2Vfbm9ybWFsIH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJtYXJnaW4tbGVmdDoyMHB4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9kb2dlIiB2YWx1ZT0iMSIgdi1tb2RlbD0iQUNDb25maWcuZG9nZS5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2RvZ2VfMWxpbmUgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9kb2dlIiB2YWx1ZT0iMiIgdi1tb2RlbD0iQUNDb25maWcuZG9nZS5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwudXNlclN0eWxlX2RvZ2VfMWxpbmVfZW50ZXIgfX0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgbmFtZT0ic3AtYWMtYV9mb3JjZV9zdHlsZV9kb2dlIiB2YWx1ZT0iMyIgdi1tb2RlbD0iQUNDb25maWcuZG9nZS5BZHNTdHlsZU1vZGUiIHR5cGU9InJhZGlvIiBjaGVja2VkPSIiPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZG9nZV8ybGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2RvZ2UiIHZhbHVlPSI0IiB2LW1vZGVsPSJBQ0NvbmZpZy5kb2dlLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZG9nZV8zbGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCBuYW1lPSJzcC1hYy1hX2ZvcmNlX3N0eWxlX2RvZ2UiIHZhbHVlPSI1IiB2LW1vZGVsPSJBQ0NvbmZpZy5kb2dlLkFkc1N0eWxlTW9kZSIgdHlwZT0icmFkaW8iPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC51c2VyU3R5bGVfZG9nZV80bGluZSB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS3lpJrlkInmoLflvI8tLS0tLS0tLS0tLS0tLT4KICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLeaKpOecvOaooeW8j+iuvue9ri0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgOnRpdGxlPSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuaHV5YW5Nb2RlX3RpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9InNwLWFjLXVzZXJjb2xvciIgdi1tb2RlbD0iQUNDb25maWcuaXNVc2VyQ29sb3JFbmFibGUiIG5hbWU9InNwLWFjLWFfZm9yY2UiIHR5cGU9ImNoZWNrYm94IiBjaGVja2VkPSIiPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5odXlhbk1vZGVfdGV4dCB9fQogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJtZW51LWJveC1jb250YWluZXIiIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmh1eWFuTW9kZV90aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJtYXJnaW4tbGVmdDoyMHB4OyIgdi10ZXh0PSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuaHV5YW5Db2xvcl90ZXh0Ij48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3AtYWMtbWVudWh1eWFuQ29sb3IiIEBpbnB1dC5zdG9wPSJ1c2VUaGlzSHV5YW5Db2xvciIgdi1tb2RlbD0iQUNDb25maWcuZGVmYXVsdEh1WWFuQ29sb3IiIHR5cGU9ImNvbG9yIiA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5odXlhbkNvbG9yX3RpdGxlIiBzdHlsZT0iY3Vyc29yOiBwb2ludGVyO21hcmdpbi10b3A6LTAuMDVyZW07aGVpZ2h0OjIzcHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Im1lbnUtYm94LXNtYWxsIiBkYXRhLXZhbHVlPSIjREVGMUVGIiBAY2xpY2suc3RvcD0idXNlVGhpc0h1eWFuQ29sb3IiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiNERUYxRUY7Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0ibWVudS1ib3gtc21hbGwiIGRhdGEtdmFsdWU9IiNGM0YyRUUiIEBjbGljay5zdG9wPSJ1c2VUaGlzSHV5YW5Db2xvciIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6I0YzRjJFRTsiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJtZW51LWJveC1zbWFsbCIgZGF0YS12YWx1ZT0iI0U1RTVFNSIgQGNsaWNrLnN0b3A9InVzZVRoaXNIdXlhbkNvbG9yIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojRTVFNUU1OyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImxpbmtocmVmIiBkYXRhLWhyZWY9Imh0dHBzOi8vd3d3Lm50YW93LmNvbS9jb2xvcnBpY2tlci5odG1sIiBzdHlsZT0iY3Vyc29yOnBvaW50ZXI7bWFyZ2luLXJpZ2h0OiAxMHB4OyIgb25jbGljaz0id2luZG93Lm9wZW4odGhpcy5kYXRhc2V0LmhyZWYpIiB2LXRleHQ9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5odXlhbkNvbG9yTW9yZV90ZXh0Ij48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDwhLS0tLS0tLS0tLS0tRmF2aWNvbuWbvuagh+iuvue9ri0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmZhdmljb25fdGl0bGUiIHYtbW9kZWw9IkFDQ29uZmlnLmlzRmF2aWNvbkVuYWJsZSIgaWQ9InNwLWFjLWZhdmljb24iIG5hbWU9InNwLWFjLWFfZm9yY2UiIHR5cGU9ImNoZWNrYm94IiBjaGVja2VkPSIiPgogICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5mYXZpY29uX3RleHQgfX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9Im1hcmdpbi1sZWZ0OjIwcHg7IiB2LXRleHQ9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5mYXZpY29uX2RlZmF1bHRJY29uX3RleHQiPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJzcC1hYy1mYXZpY29uVXJsIiBuYW1lPSJzcC1hYy1hX2ZvcmNlIiB2LW1vZGVsPSJBQ0NvbmZpZy5kZWZhdWx0RmF2aWNvblVybCIgdmFsdWU9Imh0dHBzOi8vYWUwMS5hbGljZG4uY29tL2tmL0hUQjFkUlkwWDhPRDNLVmpTWkZGcTZBbjlwWGF5LmpwZyIgc3R5bGU9IndpZHRoOjU1JTttYXJnaW4tdG9wOi0wLjNlbTsiIHR5cGU9ImlucHV0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLeenu+mZpOeZvuW6puaQnOe0oumihOa1iy0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnNlYXJjaE9yaWdpbl90aXRsZSIgdi1tb2RlbD0iQUNDb25maWcuZG9EaXNhYmxlU3VnIiBpZD0ic3AtYWMtc3VnX29yaWdpbiIgbmFtZT0ic3AtYWMtYV9mb3JjZSIgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQ9IiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnNlYXJjaE9yaWdpbl90ZXh0IH19CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS3pmYTliqA344CBOOOAgTktLS0tLS0tLS0tLS0tLT4KICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ic3AtYWMtcmlnaHQiIHYtbW9kZWw9IkFDQ29uZmlnLmlzUmlnaHREaXNwbGF5RW5hYmxlIiB0eXBlPSJjaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnNob3dSaWdodF90ZXh0IH19CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9InNwLWFjLWNvdW50ZXIiIHYtbW9kZWw9IkFDQ29uZmlnLmlzQ291bnRlckVuYWJsZSIgbmFtZT0ic3AtYWMtYV9mb3JjZSIgdHlwZT0iY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmhpbnRTaG93Q291bnRlcl90ZXh0Ij57eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuc2hvd0NvdW50ZXJfdGV4dCB9fTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0ic3AtYWMtYWxpbmUiIHYtbW9kZWw9IkFDQ29uZmlnLmlzQUxpbmVFbmFibGUiIG5hbWU9InNwLWFjLWFfZm9yY2UiIHR5cGU9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuc2hvd0FMaW5lX3RleHQgfX0KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLeiHquWumuS5ieagt+W8j+WGheWuuS0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJzcC1hYy11c2Vyc3R5bGUiIHYtbW9kZWw9IkFDQ29uZmlnLmlzVXNlclN0eWxlRW5hYmxlIiBuYW1lPSJzcC1hYy1hX2ZvcmNlIiB0eXBlPSJjaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnNob3dVc2VyU3R5bGVfdGV4dCB9fQogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgdi1pZj0iTGl2ZUNvbmZpZy5jc3NfaGFzX2Vycm9yIiBzdHlsZT0iY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5lcnJvcjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzcC1hYy1zcGFuYnV0dG9uIiBAY2xpY2s9InJlc2V0Q1NTIiB0aXRsZT0iUmVzZXQgQ1NTIiB2LXRleHQ9InJlc2V0Q1NTX3RleHQiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0ic3AtYWMtdXNlcnN0eWxlVEVYVCIgdi1tb2RlbD0iQUNDb25maWcuVXNlclN0eWxlVGV4dCIgQGtleXVwPSJsb2FkQ3VzdG9tU3R5bGUiIEBjaGFuZ2U9ImxvYWRDdXN0b21TdHlsZSIgQHBhc3RlPSJsb2FkQ3VzdG9tU3R5bGUiIG5hbWU9InNwLWFjLWFfZm9yY2UiIHN0eWxlPSJ3aWR0aDo4NSU7aGVpZ2h0OiA2NnB4O21hcmdpbi1sZWZ0OjMwcHg7IiB0eXBlPSJpbnB1dCIgPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0ibGlua2hyZWYiIHRhcmdldD0iX2JsYW5rIiA6aHJlZj0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmNvbnRhY3RNZV91cmwiIHYtdGV4dD0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmNvbnRhY3RNZV90ZXh0Ij48L2E+CiAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS3mi6bmiKrln5/lkI3orr7nva5wYW5lbC0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ic2V0dGluZy1zZWNvbmQiIHYtc2hvdz0ib3RoZXIuY3VyVGFiID09PSAyIj4KICAgICAgICAgICAgICAgICAgICAgIDxsaSBzdHlsZT0nbWFyZ2luLWJvdHRvbTogOHB4ICFpbXBvcnRhbnQ7Jz4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSdzcC1hYy1ibG9ja2RpeWJ1dHRvbi1iYWNrJyBAY2xpY2s9Im90aGVyLmN1clRhYj0xLG90aGVyLnNob3dCbG9ja0xpc3RBcmVhID0gZmFsc2UiIGNsYXNzPSdzcC1hYy1zcGFuYnV0dG9uJz57eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuc2V0dGluZ19wYW5lbF9zZWNvbmQuYmFja0J0bl90ZXh0IH19PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICB7eyBsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwuc2V0dGluZ19wYW5lbF9zZWNvbmQuYmxvY2tMYWJlbF90ZXh0IH19fQogICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgIDxsaSBzdHlsZT0nbWFyZ2luLWJvdHRvbTogOHB4ICFpbXBvcnRhbnQ7Jz4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9J3NwLWFjLWJsb2NrZGl5YnV0dG9uLWRpeWxpc3QnIGNsYXNzPSdzcC1hYy1zcGFuYnV0dG9uJyBAY2xpY2s9Im90aGVyLnNob3dCbG9ja0xpc3RBcmVhID0gIW90aGVyLnNob3dCbG9ja0xpc3RBcmVhIiB2LXRleHQ9ImNhbF9kaXlCbG9ja0xpc3RCdG4iPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9J2FjLWJsb2NrTGlzdCcgQGNsaWNrPSJyZW1vdmVBQmxvY2tMaXN0SXRlbSIgc3R5bGU9J21heC1oZWlnaHQ6NjB2aDtvdmVyZmxvdy15OiBzY3JvbGw7Jz4KICAgICAgICAgICAgICAgICAgICAgICAgPHVsIHYtc2hvdz0iIW90aGVyLnNob3dCbG9ja0xpc3RBcmVhIiB2LWh0bWw9ImdldEJsb2NrTGlzdCI+PC91bD4KICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9J2FjLWJsb2NrQm94Q29uJyBzdHlsZT0nbWF4LWhlaWdodDogNjB2aDt0ZXh0LWFsaWduOiBjZW50ZXI7bWFyZ2luLWxlZnQ6IDI2cHg7Jz4KICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHYtc2hvdz0ib3RoZXIuc2hvd0Jsb2NrTGlzdEFyZWEiICBAa2V5dXA9InN5bmNUb0Jsb2NrTGlzdCIgQGNoYW5nZT0ic3luY1RvQmxvY2tMaXN0IiBAcGFzdGU9InN5bmNUb0Jsb2NrTGlzdCIgcm93cz0iMjAiIHYtdGV4dD0iQUNDb25maWcuVXNlckJsb2NrTGlzdC5qb2luKCdcXG4nKSI+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5zZXR0aW5nX3BhbmVsX3NlY29uZC5hZGRCbG9ja0xhYmVsX3RleHQgfX08aW5wdXQgY2xhc3M9InNwLWFjLWFkZFJ1bGVPbmUiIEBrZXl1cC5lbnRlcj0iY2tBZGRSdWxlIiB2LW1vZGVsPSJvdGhlci5hZGRCbG9ja0l0ZW0iIHN0eWxlPSd3aWR0aDo1NSU7Jz4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9J3NwLWFjLWFkZFJ1bGVidXR0b24nIGNsYXNzPSdzcC1hYy1zcGFuYnV0dG9uIGVuZGJ1dHRvbicgQGNsaWNrPSJja0FkZFJ1bGUiIHN0eWxlPSdwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDtsaW5lLWhlaWdodDogMTdweDsnIHYtdGV4dD0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLnNldHRpbmdfcGFuZWxfc2Vjb25kLmFkZEJ0bkxhYmVsX3RleHQiPuaWsOWinjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICA8dWwgdi1zaG93PSJvdGhlci5jdXJUYWIgPT09IDMiIHN0eWxlPSJ3aWR0aDogMzAwcHgiPgogICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9J3NwLWFjLWJsb2NrZGl5YnV0dG9uLWJhY2snIEBjbGljaz0ib3RoZXIuY3VyVGFiPTEiIGNsYXNzPSdzcC1hYy1zcGFuYnV0dG9uJz7ov5Tlm548L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj7kvb/nlKjor7TmmI7vvJo8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+LTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+MS4g5pys6ISa5pys5LiN5YyF5ZCr5Lu75L2V5bm/5ZGK5YaF5a6577yM5Lmf5peg5oSP5LqO56C05Z2P572R56uZ546w5pyJ5Yqf6IO955qE5a6M5pW05oCn77yM5LuF5biM5pyb6YCa6L+H5LiA5Lqb5pi+56S65pWI5p6c55qE5Y+Y5pu06IO95pu05aW955qE55WZ5a2Y5a+55bqU572R56uZ546w5pyJ55qE55So5oi377yM5LiA5a6a56iL5bqm5LiK5pu05aW95Zyw5L+d6K+B5LqG55uu5qCH572R56uZ55qE5pel5rS744CCPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuIOWQjOaXtuacrOiEmuacrOS4reaJgOacieWKn+iDveWdh+S4uuWtpuS5oOWSjOeglOeptndlYuWJjeerr+aKgOacr+eahOWPkeWxleiAjOW8gOWPke+8jOW4jOacm+S4uuWtpuS5oOWJjeerr+aKgOacr+eahOeglOeptuS6uuWRmOaPkOS+m+S4gOS4quabtOWlveeahOWPguiAg+S7o+egge+8jOS/g+i/m3dlYuWJjeerr+aKgOacr+eahOWPkeWxle+8jOS+v+S6juaKgOacr+eahOWtpuS5oOWSjOS6pOa1ge+8jOS7heeUqOS6juWtpuS5oOeglOeptuS9v+eUqO+8jOaXoOaEj+S6juaNn+Wus+S7u+S9lee9keermeWIqeebiu+8jOS4jeS9v+eUqOS7u+S9leebiOWIqeaWueahiOaIluWPguS4juS7u+S9leebiOWIqee7hOe7h+OAggogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuIOWboOS9v+eUqOacrOiEmuacrOW8lei1t+eahOaIluS4juacrOiEmuacrOacieWFs+eahOS7u+S9leS6ieiuru+8jOWQhOaWueW6lOWPi+WlveWNj+WVhuino+WGs++8jOacrOiEmuacrOWvueS9v+eUqOacrOiEmuacrOaJgOaPkOS+m+eahOi9r+S7tuaXtuWPr+iDveWvueeUqOaIt+iHquW3seaIluS7luS6uumAoOaIkOeahOS7u+S9leW9ouW8j+eahOaNn+WkseWSjOS8pOWus+S4jeaJv+aLheS7u+S9lei0o+S7u+OAguWmgueUqOaIt+S4i+i9veOAgeWuieijheWSjOS9v+eUqOacrOS6p+WTgeS4reaJgOaPkOS+m+eahOi9r+S7tu+8jOWNs+ihqOaYjueUqOaIt+S/oeS7u+acrOS9nOiAheWPiuWFtuebuOWFs+WNj+iuruWSjOWFjei0o+WjsOaYjuOAggogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLeS/neWtmOOAgeWPlua2iOaMiemSri0tLS0tLS0tLS0tLS0tPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJzcC1hYy1jYW5jZWxidXR0b24iIGNsYXNzPSJzcC1hYy1zcGFuYnV0dG9uIGVuZGJ1dHRvbiIgQGNsaWNrPSJjbG9zZVBhbmVsIiA6dGl0bGU9Imxhbi51c2UuZmllbGRzZXRfcGFuZWwuc2V0dGluZ19wYW5lbC5jYW5jZWxCdG5fdGV4dCIgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTtmbG9hdDogbGVmdDsiIHYtdGV4dD0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLmNhbmNlbEJ0bl90ZXh0Ij48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InNwLWFjLXNhdmVidXR0b24iIHJlZj0iYm90dG9tU2F2ZUJ1dHRvbiIgQGNsaWNrPSJzYXZlQ29uZmlnIiBjbGFzcz0ic3AtYWMtc3BhbmJ1dHRvbiBlbmRidXR0b24iIDp0aXRsZT0ibGFuLnVzZS5maWVsZHNldF9wYW5lbC5zZXR0aW5nX3BhbmVsLm9rQnRuX3RleHQiIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7ZmxvYXQ6IHJpZ2h0OyIgdi10ZXh0PSJsYW4udXNlLmZpZWxkc2V0X3BhbmVsLnNldHRpbmdfcGFuZWwub2tCdG5fdGV4dCI+PC9zcGFuPgogICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+YDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKENvbnRhaW5lcik7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYm9keSAjc3AtYWMtY29udGFpbmVyIikuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsgLy8g6Zi75q2i54K55Ye76Ieq6Lqr55qE5pe25YCZ5YWz6ZetCiAgICAgICAgICAgIH0sIGZhbHNlKTsKICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYm9keSIpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgIHNhZmVGdW5jdGlvbigoKSA9PiB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc3AtYWMtY29udGVudCIpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfSwgZmFsc2UpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGlzRWxlbWVudFZpc2libGUoZG9tKSB7CiAgICAgICAgICBjb25zdCBzY3JUb3AgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOwogICAgICAgICAgcmV0dXJuICEoc2NyVG9wID4gKGRvbS5vZmZzZXRUb3AgKyBkb20ub2Zmc2V0SGVpZ2h0KSB8fCAoc2NyVG9wICsgd2luZG93LmlubmVySGVpZ2h0KSA8IGRvbS5vZmZzZXRUb3ApOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlTW9iaWxlQmFpZHVEaXJlY3RMaW5rKCkgewogICAgICAgICAgbGV0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiI3BhZ2UgI3BhZ2UtYmQgI3Jlc3VsdHMgLnJlc3VsdDpub3QoW2FjX3JlZGlyZWN0U3RhdHVzXSkiKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGN1ck5vZGUgPSBub2Rlc1tpXTsKICAgICAgICAgICAgc2FmZUZ1bmN0aW9uKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGxldCBjdXJEYXRhID0gSlNPTi5wYXJzZShjdXJOb2RlLmRhdGFzZXQubG9nLnJlcGxhY2UoLycvZ20sICJcIiIpKTsKICAgICAgICAgICAgICBsZXQgdHJ1ZUxpbmsgPSBjdXJEYXRhLm11OwogICAgICAgICAgICAgIGN1ck5vZGUucXVlcnlTZWxlY3RvcigiYXJ0aWNsZSIpLnNldEF0dHJpYnV0ZSgicmwtbGluay1ocmVmIiwgdHJ1ZUxpbmspOwogICAgICAgICAgICAgIGN1ck5vZGUucXVlcnlTZWxlY3RvckFsbCgiYSIpLmZvckVhY2goZnVuY3Rpb24ocGVyKSB7CiAgICAgICAgICAgICAgICBwZXIuc2V0QXR0cmlidXRlKCJocmVmIiwgdHJ1ZUxpbmspOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY3VyTm9kZS5zZXRBdHRyaWJ1dGUoImFjX3JlZGlyZWN0U3RhdHVzIiwgIjEiKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJlbW92ZU9uTW91c2VEb3duRnVuYygpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxldCByZXN1bHROb2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5nIC5yYyBhLCAjcnMsICNyc28gLmcgYSIpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGV0IG9uZSA9IHJlc3VsdE5vZGVzW2ldOwogICAgICAgICAgICAgIG9uZS5zZXRBdHRyaWJ1dGUoIm9ubW91c2Vkb3duIiwgIiIpOyAvLyDosLfmrYzljrvph43lrprlkJHlubLmibAKICAgICAgICAgICAgICBvbmUuc2V0QXR0cmlidXRlKCJ0YXJnZXQiLCAiX2JsYW5rIik7IC8vIOiwt+atjOmTvuaOpeaWsOagh+etvuaJk+W8gAogICAgICAgICAgICB9CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlUmVkaXJlY3RMaW5rVGFyZ2V0KCkgewogICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuWkhJSFUpIHsKICAgICAgICAgICAgbGV0IG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLlJpY2hUZXh0IGFbaHJlZio9Jy8vbGluay56aGlodS5jb20vP3RhcmdldCddIik7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsZXQgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KG5vZGVzW2ldLmhyZWYucmVwbGFjZSgvaHR0cHM/OlwvXC9saW5rXC56aGlodVwuY29tXC9cP3RhcmdldD0vLCAiIikpOwogICAgICAgICAgICAgIG5vZGVzW2ldLmhyZWYgPSB1cmw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5CQUlEVV9YVUVTSFUpIHsKICAgICAgICAgICAgbGV0IHhub2RlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImFbaHJlZio9J3NjX3Z1cmw9aHR0cCddIik7CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBpIDwgeG5vZGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgbGV0IHh1cmwgPSBnZXRVcmxBdHRyaWJ1dGUoeG5vZGVzW2pdLmhyZWYsICJzY192dXJsIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgeG5vZGVzW2pdLmhyZWYgPSB4dXJsOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyDmj5Dlj5Z1cmzlhYPntKDnmoTlj4LmlbDlgLwKICAgICAgICBmdW5jdGlvbiBnZXRVcmxBdHRyaWJ1dGUodXJsLCBhdHRyaWJ1dGUsIG5lZWREZWNvZGUpIHsKICAgICAgICAgIGxldCBzZWFyY2hWYWx1ZVMgPSAodXJsLnN1YnN0cigxKSArICIiKS5zcGxpdCgiJiIpOwogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWFyY2hWYWx1ZVMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGtleV92YWx1ZSA9IHNlYXJjaFZhbHVlU1tpXS5zcGxpdCgiPSIpOwogICAgICAgICAgICBsZXQgcmVnID0gbmV3IFJlZ0V4cCgiXiIgKyBhdHRyaWJ1dGUgKyAiJCIpOwogICAgICAgICAgICBpZiAocmVnLnRlc3Qoa2V5X3ZhbHVlWzBdKSkgewogICAgICAgICAgICAgIGxldCBzZWFyY2hXb3JkcyA9IGtleV92YWx1ZVsxXTsKICAgICAgICAgICAgICByZXR1cm4gbmVlZERlY29kZSA/IGRlY29kZVVSSUNvbXBvbmVudChzZWFyY2hXb3JkcykgOiBzZWFyY2hXb3JkczsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVzZXRVUkxOb3JtYWwoKSB7CiAgICAgICAgICBjb25zdCBtYWluTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoY3VyU2l0ZS5NYWluVHlwZSkKCiAgICAgICAgICAvLyDms6jmhI/mnInph43lpI3nmoTlnLDlnYDvvIzlsL3ph4/lr7nph43lpI3lnLDlnYDov5vooYzljrvph40KICAgICAgICAgIHZhciBoYXNEZWFsSHJlZlNldCA9IG5ldyBTZXQoKTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFpbkxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLy8g5q2k5pa55rOV5piv5byC5q2l77yM5pWF5Zyo57uT5p2f55qE5pe25YCZ5L2/55SoaeS8muWHuumXrumimC3kuKXph40hCiAgICAgICAgICAgIC8vIOmHh+eUqOmXreWMheeahOaWueazleadpei/m+ihjOaVsOaNrueahOS8oOmAkgogICAgICAgICAgICBjb25zdCBjdXJOb2RlID0gbWFpbkxpc3RbaV07CgogICAgICAgICAgICBpZiAoY3VyTm9kZSAhPT0gbnVsbCAmJiBjdXJOb2RlLmdldEF0dHJpYnV0ZSgiYWNfcmVkaXJlY3RTdGF0dXMiKSA9PT0gbnVsbCkgewogICAgICAgICAgICAgIGN1ck5vZGUuc2V0QXR0cmlidXRlKCJhY19yZWRpcmVjdFN0YXR1cyIsICIwIik7CgogICAgICAgICAgICAgIGNvbnN0IGxpbmtOb2RlID0gY3VyTm9kZS5xdWVyeVNlbGVjdG9yKGN1clNpdGUuU3R5cGVfTm9ybWFsKTsKICAgICAgICAgICAgICBpZihsaW5rTm9kZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIC8vIOi3s+i/h+eJueauiumTvuaOpeeahOWkhOeQhgogICAgICAgICAgICAgIGlmKGxpbmtOb2RlLmhyZWYgJiYgKGxpbmtOb2RlLmhyZWYuc3RhcnRzV2l0aCgnamF2YXNjcmlwdCcpIHx8IGxpbmtOb2RlLmhyZWYuc3RhcnRzV2l0aCgnIycpKSkgewogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgbGV0IGxpbmtIcmVmID0gbGlua05vZGUuaHJlZjsKICAgICAgICAgICAgICBsZXQgbGVuMSA9IGhhc0RlYWxIcmVmU2V0LnNpemU7CiAgICAgICAgICAgICAgaGFzRGVhbEhyZWZTZXQuYWRkKGxpbmtIcmVmKTsKICAgICAgICAgICAgICBsZXQgbGVuMiA9IGhhc0RlYWxIcmVmU2V0LnNpemU7CiAgICAgICAgICAgICAgaWYgKGxlbjEgPT09IGxlbjIpIGNvbnRpbnVlOyAvLyDor7TmmI7mlbDmja7lt7Lnu4/lpITnkIbov4fvvIzlrZjlnKjnm7jlkIznmoTorrDlvZUKICAgICAgICAgICAgICBjb25zdCBkZWFsQXR0ckxpbmsgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAvLyDlpoLmnpzlvZPliY3oioLngrnlrZjlnKhtdeWPguaVsO+8jOaIluiAhWxpbmvoioLngrnlrZjlnKhkYXRhLW1kdXJs77yM6YKj5LmI5bCx566X5oiQ5YqfCiAgICAgICAgICAgICAgICBsZXQgdHJ1ZUxpbmsgPSBjdXJOb2RlLmdldEF0dHJpYnV0ZSgnbXUnKSB8fCBsaW5rTm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbWR1cmwnKQogICAgICAgICAgICAgICAgaWYodHJ1ZUxpbmsgJiYgIXRydWVMaW5rLmluY2x1ZGVzKCdub3VybCcpKSB7CiAgICAgICAgICAgICAgICAgIHRydWVMaW5rID0gZ2V0QmFpZHVFbmNvZGluZ0hhbmRsZSh0cnVlTGluaykKICAgICAgICAgICAgICAgICAgRGVhbFJlZGlyZWN0KG51bGwsIGxpbmtIcmVmLCB0cnVlTGluayk7CiAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGdldEJhaWR1RW5jb2RpbmdIYW5kbGUgPSAobGlua1VybCkgPT4gewogICAgICAgICAgICAgICAgbGV0IHJlc0xpbmsgPSBsaW5rVXJsCiAgICAgICAgICAgICAgICBpZihjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkJBSURVICYmIGxpbmtVcmwuaW5jbHVkZXMoJ2JhaWR1LmNvbScpKSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IFssIGZpcnN0ID0gJyddID0gLyhpZT1bXiZdKykvLmV4ZWMobG9jYXRpb24uc2VhcmNoKSB8fCBbXQogICAgICAgICAgICAgICAgICByZXNMaW5rID0gbGlua1VybC5yZXBsYWNlKC8oaWU9W14mXSspLywgZmlyc3QpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzTGluawogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZihkZWFsQXR0ckxpbmsoKSkgewogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8g6LWw5o6l5Y+j6YeN5a6a5ZCR5aSE55CGCiAgICAgICAgICAgICAgaWYgKGxpbmtIcmVmLmluY2x1ZGVzKCJ3d3cuYmFpZHUuY29tL2xpbmsiKSB8fAogICAgICAgICAgICAgICAgbGlua0hyZWYuaW5jbHVkZXMoIm0uYmFpZHUuY29tL2Zyb20iKSB8fAogICAgICAgICAgICAgICAgbGlua0hyZWYuaW5jbHVkZXMoInd3dy5zb2dvdS5jb20vbGluayIpIHx8CiAgICAgICAgICAgICAgICBsaW5rSHJlZi5pbmNsdWRlcygic28uY29tL2xpbmsiKSkgewogICAgICAgICAgICAgICAgKGZ1bmN0aW9uKGNfY3Vybm9kZSwgY19jdXJocmVmKSB7CiAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBjX2N1cmhyZWYucmVwbGFjZSgvXmh0dHA6LywgImh0dHBzOiIpOwogICAgICAgICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5CQUlEVSAmJiAhdXJsLmluY2x1ZGVzKCJlcWlkIikpIHsKICAgICAgICAgICAgICAgICAgICAvLyDlpoLmnpzmmK/nmb7luqbvvIzlubbkuJTmsqHmnInluKbmnInop6PmnpDlj4LmlbDvvIzpgqPkuYjmiYvliqjluKbkuIoKICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAiJndkPSZlcWlkPSI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgbGV0IGdtUmVxdWVzdE5vZGUgPSBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgICAgICAgICAgICAgLy8gZnJvbTogImFjeGhyIiwKICAgICAgICAgICAgICAgICAgICBleHREYXRhOiBjX2N1cmhyZWYsIC8vIOeUqOS6juaJqeWxlQogICAgICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgIkFjY2VwdCI6ICIqLyoiLCAiUmVmZXJlciI6IGNfY3VyaHJlZi5yZXBsYWNlKC9eaHR0cDovLCAiaHR0cHM6IikgfSwKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDgwMDAsCiAgICAgICAgICAgICAgICAgICAgb25yZWFkeXN0YXRlY2hhbmdlOiBmdW5jdGlvbihyZXNwb25zZSkgeyAvLyBNQVJLIOacieaXtuWAmei/meS4quWHveaVsOagueacrOS4jei/m+adpSAtIOiwg+ivleeahOmXrumimCAtIHRpbWVvdXQKICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5yZXNwb25zZVRleHQgfHwgcmVzcG9uc2UucmVzcG9uc2VIZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOeUseS6juaYr+eJueauiui/lOWbni3lubbkuJTlpb3mkJwt5pCc54uXLeeZvuW6pumDveaYr+i/meS4quagvOW8j++8jOaVheaPkOWHugogICAgICAgICAgICAgICAgICAgICAgICBEZWFsUmVkaXJlY3QoZ21SZXF1ZXN0Tm9kZSwgY19jdXJocmVmLCByZXNwb25zZS5yZXNwb25zZVRleHQsICJVUkw9JyhbXiddKyknIikKICAgICAgICAgICAgICAgICAgICAgICAgLy8g6L+Z5Liq5piv5Zyo5LiK6Z2i5peg5rOV5aSE55CG55qE5oOF5Ya15LiL77yM5aSH55So55qEIHRtLWZpbmFsdXJsZGhkZyAgdG0tZmluYWx1cmxtZmRoCgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UucmVzcG9uc2VIZWFkZXJzLmluY2x1ZGVzKCJ0bS1maW5hbHVybCIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlbFVSTCA9IFJlZ19HZXQocmVzcG9uc2UucmVzcG9uc2VIZWFkZXJzLCAidG0tZmluYWx1cmxcXHcrOiAoW15cXHNdKykiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsVVJMID09PSBudWxsIHx8IHJlbFVSTCA9PT0gIiIgfHwgcmVsVVJMLmluY2x1ZGVzKCJ3d3cuYmFpZHUuY29tL3NlYXJjaC9lcnJvciIpKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgRGVhbFJlZGlyZWN0KGdtUmVxdWVzdE5vZGUsIGNfY3VyaHJlZiwgcmVsVVJMKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KShjdXJOb2RlLCBsaW5rSHJlZik7IC8v5Lyg6YCS5pen55qE572R5Z2A6L+H5Y6777yM6K+75L2cY19jdXJocmVmCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8vIGN1ck5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwgKCk9PiB7CiAgICAgICAgICAgICAgLy8gICBjb25zdCBBQktleSA9IFJlZGlyZWN0TWFwLmdldChjdXJOb2RlLmhyZWYpOyAvLyDljp/lp4sgLT4g5LmL5ZCO55qE6ZO+5o6lCiAgICAgICAgICAgICAgLy8gICBpZihBQktleSkgY3VyTm9kZS5ocmVmID0gQUJLZXk7CiAgICAgICAgICAgICAgLy8gfSkKICAgICAgICAgICAgICAvLyBjdXJOb2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgKCk9PiB7CiAgICAgICAgICAgICAgLy8gICBjb25zdCBCQUtleSA9IFJlZGlyZWN0TWFwLmdldChjdXJOb2RlLmhyZWYpOyAvLyDkuYvlkI7nmoTov57mjqUgLT4g5Y6f5aeLCiAgICAgICAgICAgICAgLy8gICBpZihCQUtleSkgY3VyTm9kZS5ocmVmID0gQkFLZXk7CiAgICAgICAgICAgICAgLy8gfSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGhhc0RlYWxIcmVmU2V0LnNpemUgPiAwICYmIG1haW5MaXN0Lmxlbmd0aCAtIGhhc0RlYWxIcmVmU2V0LnNpemUgPiAwKSBjb25zb2xlLmxvZygi5Lii5byD5o6JIiwgbWFpbkxpc3QubGVuZ3RoIC0gaGFzRGVhbEhyZWZTZXQuc2l6ZSwgIuS4qumHjeWkjemTvuaOpSIpOwogICAgICAgIH0KCiAgICAgICAgdmFyIERlYWxSZWRpcmVjdCA9IGZ1bmN0aW9uKHJlcXVlc3QsIGN1ck5vZGVIcmVmLCByZXNwVGV4dCwgUmVnVGV4dCkgewogICAgICAgICAgaWYgKHJlc3BUZXh0ID09PSBudWxsIHx8IHR5cGVvZiAocmVzcFRleHQpID09PSAidW5kZWZpbmVkIikgcmV0dXJuOwogICAgICAgICAgbGV0IHJlc3VsdFJlc3BvbnNlVXJsID0gIiI7CiAgICAgICAgICBpZiAoUmVnVGV4dCAhPSBudWxsKSB7CiAgICAgICAgICAgIHJlc3VsdFJlc3BvbnNlVXJsID0gUmVnX0dldChyZXNwVGV4dCwgUmVnVGV4dCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXN1bHRSZXNwb25zZVVybCA9IHJlc3BUZXh0OwogICAgICAgICAgfQogICAgICAgICAgaWYgKHJlc3VsdFJlc3BvbnNlVXJsICE9PSBudWxsICYmIHJlc3VsdFJlc3BvbnNlVXJsICE9PSAiIiAmJiAhcmVzdWx0UmVzcG9uc2VVcmwuaW5jbHVkZXMoInd3dy5iYWlkdS5jb20vbGluayIpKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuU09HT1UpIGN1ck5vZGVIcmVmID0gY3VyTm9kZUhyZWYucmVwbGFjZSgvXmh0dHBzOlwvXC93d3cuc29nb3UuY29tLywgIiIpOwogICAgICAgICAgICAgIGxldCBob3N0ID0gZ2V0VGV4dEhvc3QocmVzdWx0UmVzcG9uc2VVcmwpOwogICAgICAgICAgICAgIC8vIFJlZGlyZWN0TWFwLnNldChjdXJOb2RlSHJlZiwgcmVzdWx0UmVzcG9uc2VVcmwpOyAvLyDov5vooYzkuIDkuKrmlbDmja7lhbPogZQKICAgICAgICAgICAgICAvLyBSZWRpcmVjdE1hcC5zZXQocmVzdWx0UmVzcG9uc2VVcmwsIGN1ck5vZGVIcmVmKTsgLy8g6L+b6KGM5LiA5Liq5pWw5o2u5YWz6IGUCiAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiKltocmVmKj0nIiArIGN1ck5vZGVIcmVmICsgIiddIikuZm9yRWFjaChwZXIgPT4gewogICAgICAgICAgICAgICAgbGV0IGNoYW5nZU5vZGUgPSBwZXI7CgogICAgICAgICAgICAgICAgY2hhbmdlTm9kZS5zZXRBdHRyaWJ1dGUoImFjX3JlZGlyZWN0U3RhdHVzIiwgIjIiKTsKICAgICAgICAgICAgICAgIGNoYW5nZU5vZGUuaHJlZiA9IHJlc3VsdFJlc3BvbnNlVXJsOwogICAgICAgICAgICAgICAgLy8gY2hhbmdlTm9kZS5zZXRBdHRyaWJ1dGUoImRhdGEtb3JpaHJlZiIsIGNoYW5nZU5vZGUuaHJlZik7CiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlTm9kZS5oYXNBdHRyaWJ1dGUoIm1ldGEiKSkgewogICAgICAgICAgICAgICAgICBjaGFuZ2VOb2RlLnNldEF0dHJpYnV0ZSgibWV0YSIsIGhvc3QpOwogICAgICAgICAgICAgICAgICBjaGFuZ2VOb2RlLmRhdGFzZXQuaG9zdCA9IGhvc3Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlTm9kZS50ZXh0ICYmIGNoYW5nZU5vZGUudGV4dC5sZW5ndGggPCAxMCAmJiAhY2hhbmdlTm9kZS50ZXh0LmluY2x1ZGVzKGhvc3QpCiAgICAgICAgICAgICAgICAgIC8vIOS4jeiDveaYr3JlZGlyZWN0IHVybCDkuI3og73mmK9oMlxoM+S4i+ebtOWxnumTvuaOpQogICAgICAgICAgICAgICAgICAmJiAhY2hhbmdlTm9kZS5wYXJlbnRFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygiaCIpKSB7CiAgICAgICAgICAgICAgICAgIGNoYW5nZU5vZGUuaW5zZXJ0QWRqYWNlbnRIVE1MKCJiZWZvcmVFbmQiLCAiJm5ic3A7LSZuYnNwOyIgKyBob3N0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICBvdGhlckRhdGEub3RoZXIuY3VySG9zdHMuYWNwdXNoKGhvc3QgKyAiIyMjIiArIHJlc3VsdFJlc3BvbnNlVXJsKTsKICAgICAgICAgICAgICByZXF1ZXN0ICYmIHJlcXVlc3QuYWJvcnQoKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlQURfYmFpZHVfc29nb3UoKSB7IC8vIOenu+mZpOe9keermeiHquacieW5v+WRigogICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuQkFJRFUgfHwgY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5NQkFJRFUpIHsKICAgICAgICAgICAgLyoqKirnp7vpmaRQQ+aooeW8j+S4iueahOmDqOWIhuW5v+WRiioqKiovCiAgICAgICAgICAgIC8vIOenu+mZpHNoYWRvd0RPTeW5v+WRiu+8m+aQnOe0ouWFs+mUruWtl++8mua3mOWune+8m+eEtuWQjueCueWHu+aQnOe0ouahhu+8jOW5v+WRiuS8muWkmuasoemHjeeOsHNoYWRvd2RvbQogICAgICAgICAgICBzYWZlRnVuY3Rpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgJCgnLmMtY29udGFpbmVyID4+PiAuYy1jb250YWluZXInKS5oYXMoJy5mMTM+c3BhbjpzdGFydHMtd2l0aCgi5bm/5ZGKIiknKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyDnp7vpmaTlj7PkvqfmoI/lub/lkYoKICAgICAgICAgICAgc2FmZVJlbW92ZV94cGF0aCgiaWQoJ2NvbnRlbnRfcmlnaHQnKS9kaXZbLi8vYVtzdGFydHMtd2l0aCh0ZXh0KCksICflub/lkYonKV1dIiwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAvLyDnp7vpmaTmoIflh4blub/lkYoKICAgICAgICAgICAgc2FmZVJlbW92ZV94cGF0aCgiaWQoJ2NvbnRlbnRfbGVmdCcpL2RpdlsuLy9zcGFuW2NvbnRhaW5zKHRleHQoKSwgJ+W5v+WRiicpXV0iLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgIC8vIOenu+mZpOagh+WHhuW5v+WRiiAtIOaWsAogICAgICAgICAgICBzYWZlUmVtb3ZlX3hwYXRoKCJpZCgnY29udGVudF9sZWZ0JykvZGl2Wy4vL2FbdGV4dCgpPSflub/lkYonXV0iLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgIC8vIOenu+mZpOWPs+S+p+agj+mhtumDqC3lupXpg6jml6DnlKjlub/lkYoKICAgICAgICAgICAgc2FmZVJlbW92ZV94cGF0aCgiaWQoJ2NvbnRlbnRfcmlnaHQnKS9iciIsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgc2FmZVJlbW92ZV94cGF0aCgiaWQoJ2NvbnRlbnRfcmlnaHQnKS9kaXZbbm90KEBpZCldIiwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAvLyDnp7vpmaTpobbpg6jlj6/og73lh7rnjrDnmoQgIuS4uuaCqOaOqOiNkCIKICAgICAgICAgICAgc2FmZVJlbW92ZV94cGF0aCgiaWQoJ2NvbnRlbnRfbGVmdCcpLy9kaXZbY29udGFpbnMoQGNsYXNzLCAnX3JzJyldIiwgZmFsc2UsIHRydWUpOwoKICAgICAgICAgICAgLyoqKirnp7vpmaRNb2JpbGXmqKHlvI/kuIrnmoTpg6jliIblub/lkYoqKioqLwogICAgICAgICAgICBzYWZlUmVtb3ZlX3hwYXRoKCJpZCgncGFnZS1iZCcpL2Rpdltub3QoY29udGFpbnMoQGNsYXNzLCAncmVzdWx0JykpXSIsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgc2FmZVJlbW92ZV94cGF0aCgiaWQoJ3BhZ2UtYmQnKS9kaXZbbm90KEBjbGFzcyldIiwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICBzYWZlUmVtb3ZlX3hwYXRoKCIvL2RpdltAY2xhc3M9J25hLWxpa2UtY29udGFpbmVyJ10iLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgIC8vIHNhZmVGdW5jdGlvbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vICAgJCgnI3BhZ2UtYmQgI3Jlc3VsdHM+ZGl2Om5vdChbY2xhc3MqPSJyZXN1bHQiXSknKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8gfSk7CiAgICAgICAgICAgIC8vIHNhZmVGdW5jdGlvbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vICAgJCgnI3BhZ2UtYmQgI3Jlc3VsdHM+ZGl2Om5vdChbY2xhc3NdKScpLnJlbW92ZSgpOwogICAgICAgICAgICAvLyB9KTsKICAgICAgICAgIH0gZWxzZSBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5TTykgewogICAgICAgICAgICBzYWZlUmVtb3ZlKCIjc29fa3ctYWQiKTsKICAgICAgICAgICAgc2FmZVJlbW92ZSgiI20tc3ByZWFkLWxlZnQiKTsKICAgICAgICAgICAgLy8g56e76Zmk5pCc57Si5Lit5bqV6YOo5bm/5ZGKCiAgICAgICAgICAgIHNhZmVSZW1vdmUoIiNtLXNwcmVhZC1ib3R0b20iKTsKICAgICAgICAgICAgLy8g56e76Zmk5Y+z5L6n5qCP6aG26YOo5bm/5ZGKCiAgICAgICAgICAgIHNhZmVSZW1vdmVfeHBhdGgoImlkKCdyaWdodHRvcF9ib3gnKS8vbGlbLi8vc3Bhbltjb250YWlucyh0ZXh0KCksICflub/lkYonKV1dIiwgZmFsc2UsIHRydWUpOwogICAgICAgICAgfSBlbHNlIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkJJTkcpIHsKICAgICAgICAgICAgc2FmZVJlbW92ZSgiLmJfYWQiKTsKICAgICAgICAgICAgc2FmZVJlbW92ZV94cGF0aCgiaWQoJ2JfcmVzdWx0cycpL2xpWy4vZGl2W0BjbGFzcz0nYWRfZmxzJ11dIiwgdHJ1ZSk7CiAgICAgICAgICB9IGVsc2UgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuR09PR0xFKSB7CiAgICAgICAgICAgIHNhZmVSZW1vdmUoIiNib3R0b21hZHMiKTsKICAgICAgICAgICAgc2FmZVJlbW92ZSgnZGl2W2FyaWEtbGFiZWw9IuW5v+WRiiJdJywgZmFsc2UsIHRydWUpOwogICAgICAgICAgICBzYWZlUmVtb3ZlKCdkaXZbYXJpYS1sYWJlbD0iQWRzIl0nLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBhZGRDb3VudGVyKGNpdGVMaXN0KSB7CiAgICAgICAgICBsZXQgY3NzVGV4dCA9ICJmb250LXN0eWxlOm5vcm1hbDtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjE7bWFyZ2luLXJpZ2h0OjRweDtkaXNwbGF5OmlubGluZS1ibG9jaztjb2xvcjp3aGl0ZTtmb250LWZhbWlseTon5b6u6L2v6ZuF6buRJztmb250LXNpemU6MTZweDt0ZXh0LWFsaWduOmNlbnRlcjt3aWR0aDoyMnB4O2xpbmUtaGVpZ2h0OjIycHg7Ym9yZGVyLXJhZGl1czo1MCU7IjsKICAgICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2l0ZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGN1ciA9IGNpdGVMaXN0W2ldCiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY3VyLmdldEF0dHJpYnV0ZSgnU29ydEluZGV4Jyk7CiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gbnVsbCB8fCB0eXBlb2YgKGluZGV4KSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgICBjdXIuc2V0QXR0cmlidXRlKCdTb3J0SW5kZXgnLCBDT05TVC5zb3J0SW5kZXgpOwogICAgICAgICAgICAgIGN1ci5pbm5lciA9IGN1ci5pbm5lckhUTUw7CiAgICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9ICI8ZW0gY2xhc3M9J0FDLUNvdW50ZXJUJyBzdHlsZT0iICsgY3NzVGV4dCArICI+IiArIENPTlNULnNvcnRJbmRleCArICI8L2VtPiI7CiAgICAgICAgICAgICAgY3VyLmlubmVySFRNTCA9IGRpdi5pbm5lckhUTUwgKyBjdXIuaW5uZXI7CiAgICAgICAgICAgICAgQ09OU1Quc29ydEluZGV4Kys7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY29uc3QgY3VyQ291bnRlciA9IGN1ci5xdWVyeVNlbGVjdG9yKCIuQUMtQ291bnRlclQiKQogICAgICAgICAgICAgIGNvbnN0IG9yaUluZGV4ID0gY3VyQ291bnRlci5pbm5lclRleHQKICAgICAgICAgICAgICBjb25zdCBjaGVja1ZhbHVlID0gKGkgKyAxKSAlIDEwMDsKICAgICAgICAgICAgICAvLyDmlbDmja7lgLzkuI3lkIwKICAgICAgICAgICAgICAvLyDmlbDmja7msqHmnInooqvnv7vor5EKICAgICAgICAgICAgICBpZiAoK2luZGV4ICE9PSBjaGVja1ZhbHVlICYmICEvXlxkKyQvLnRlc3Qob3JpSW5kZXgpKSB7IC8vIOaMiemcgOabtOaWsAogICAgICAgICAgICAgICAgY3VyQ291bnRlci5pbm5lclRleHQgPSBjaGVja1ZhbHVlOwogICAgICAgICAgICAgICAgY3VyLnNldEF0dHJpYnV0ZSgnU29ydEluZGV4JywgY2hlY2tWYWx1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgSG9zdFJlZyA9IG5ldyBSZWdFeHAoLyhodHRwcz86XC9cLyk/KFteL1xzXSspL2kpOwoKICAgICAgICBmdW5jdGlvbiBnZXRUZXh0SG9zdChzYmVmb3JlKSB7CiAgICAgICAgICBzYmVmb3JlID0gKHNiZWZvcmUgJiYgc2JlZm9yZS50cmltKCkpLnJlcGxhY2UoL1xzLVxzXGR7NH0tXGR7MSwyfS1cZHsxLDJ9LywgIiIpIHx8ICIiOwogICAgICAgICAgbGV0IHNlbmQ7CiAgICAgICAgICBsZXQgcmVzdWx0ID0gc2JlZm9yZS5zcGxpdCgnLScpOwogICAgICAgICAgLy8gLS3mkJzni5fnmb7luqbkuJPnlKjvvJvlpoLmnpznrKzkuIDkuKrmmK/kuK3mlofnmoTor53vvIzlnLDlnYDlsLHmmK/nrKzkuozkuKoKICAgICAgICAgIGlmICgocmVzdWx0Lmxlbmd0aCA+IDEgJiYgbmV3IFJlZ0V4cCgiW1xcdTRFMDAtXFx1OUZGRl0rIiwgImciKS50ZXN0KHNiZWZvcmUpKSAmJiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5CQUlEVSB8fCBjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLlNPR09VKSkgewogICAgICAgICAgICBzYmVmb3JlID0gcmVzdWx0WzFdOwogICAgICAgICAgfQogICAgICAgICAgLy8g5q2k5pe2c2JlZm9yZeWHoOS5juaYr+etieS6jue9keWdgOS6hu+8jOS9huaYr+acieaXtuWAmeS8muacieWkmueahOepuuagvO+8jOWkmueahOWGheWuue+8jOWkmueahOWJjee8gGh0dHDvvIzlpJrkvZnnmoTot6/lvoQKICAgICAgICAgIGxldCByZXMgPSBIb3N0UmVnLmV4ZWMoc2JlZm9yZSk7CiAgICAgICAgICBzZW5kID0gKHJlcyAmJiByZXNbMl0udHJpbSgpKSB8fCAiIjsKICAgICAgICAgIC8vIHNlbmQgPSBzYmVmb3JlLnJlcGxhY2UoLyhcL1teL10qfFxzKikvLCAiIikucmVwbGFjZSgvPFtePl0qPi9nLCAiIikucmVwbGFjZSgvaHR0cHM/OlwvXC8vZywgIiIpLnJlcGxhY2UoLzxcLz9zdHJvbmc+L2csICIiKS5yZXBsYWNlKC88XC8/Yj4vZywgIiIpLnJlcGxhY2UoLzw/Pj8vZywgIiIpLnJlcGxhY2UoLyggfFwvKS4qL2csICIiKS5yZXBsYWNlKC9cLlwuLiovLCAiIik7CiAgICAgICAgICBpZiAoc2VuZCA9PT0gIiIpIHJldHVybiBudWxsOwogICAgICAgICAgaWYgKHNlbmQuaW5kZXhPZigiLiIpIDwgMCkgcmV0dXJuIG51bGw7CiAgICAgICAgICBpZiAoc2VuZC5pbmRleE9mKCLihrUiKSA+PSAwKSByZXR1cm4gbnVsbDsKICAgICAgICAgIHJldHVybiBzZW5kLnRyaW0oKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGFkZEZhdmljb24oY2l0ZUxpc3QpIHsKICAgICAgICAgIGNvbnN0IGluc2VydExpc3QgPSBbXQogICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCAhPT0gU2l0ZVR5cGUuRE9HRSkgewogICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY2l0ZUxpc3QubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGNpdGVMaXN0W2luZGV4XS5nZXRBdHRyaWJ1dGUoImFjX2Zhdmljb25TdGF0dXMiKSkgewogICAgICAgICAgICAgICAgbGV0IGN1ck5vZGUgPSBjaXRlTGlzdFtpbmRleF07CiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0Tm9kZSA9IGN1ck5vZGU7CiAgICAgICAgICAgICAgICBsZXQgeyBjdXJIb3N0LCBjdXJVcmwgfSA9IGdldE5vZGVIb3N0KHRhcmdldE5vZGUpOwogICAgICAgICAgICAgICAgaWYgKCFjdXJIb3N0KSB7IC8vIOi3s+i/h+ino+S4jeWHuuadpeeahOWcsOWdgAogICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIG90aGVyRGF0YS5vdGhlci5jdXJIb3N0cy5hY3B1c2goY3VySG9zdCArICIjIyMiICsgY3VyVXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBmYXZpY29uVXJsID0gY3VySG9zdDsKICAgICAgICAgICAgICAgIGxldCBJSSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKDsgSUkgPD0gNTsgSUkrKykgewogICAgICAgICAgICAgICAgICB0YXJnZXROb2RlID0gdGFyZ2V0Tm9kZS5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Tm9kZSAhPSBudWxsICYmIHRhcmdldE5vZGUucXVlcnlTZWxlY3RvcihjdXJTaXRlLkZhdmljb25BZGRUbykgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Tm9kZS5wYXJlbnROb2RlLmhhc0F0dHJpYnV0ZSgndHBsJykgJiYgdGFyZ2V0Tm9kZS5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgndHBsJykuaW5jbHVkZXMoJ3N0b2NrJykpIHsKICAgICAgICAgICAgICAgICAgY3VyTm9kZS5zZXRBdHRyaWJ1dGUoImFjX2Zhdmljb25TdGF0dXMiLCAiLTMiKTsKICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coaW5kZXgrIi4iK2Zhdmljb25VcmwrIi0tIitJSSk7CiAgICAgICAgICAgICAgICBpZiAoSUkgPD0gNSkgewogICAgICAgICAgICAgICAgICAvLyDlhYjnlKjniLboioLngrnliKTmlq3kuIDkuIvmmK/lkKblrZjlnKhpbWcKICAgICAgICAgICAgICAgICAgbGV0IHRtcEhUTUwgPSB0YXJnZXROb2RlLmlubmVySFRNTDsKICAgICAgICAgICAgICAgICAgbGV0IHBvcyA9IHRtcEhUTUwuaW5kZXhPZigiZmF2LXVybCIpCiAgICAgICAgICAgICAgICAgICAgJiB0bXBIVE1MLmluZGV4T2YoIndyX2ZhdiIpCiAgICAgICAgICAgICAgICAgICAgJiB0bXBIVE1MLmluZGV4T2YoImZhdnVybCIpCiAgICAgICAgICAgICAgICAgICAgJiB0bXBIVE1MLmluZGV4T2YoInRpdC1pY28iKQogICAgICAgICAgICAgICAgICAgICYgdG1wSFRNTC5pbmRleE9mKCJpbWdfZmF2IHJtc19pbWciKQogICAgICAgICAgICAgICAgICAgICYgdG1wSFRNTC5pbmRleE9mKCJjLXRvb2wtIikKICAgICAgICAgICAgICAgICAgICAmIHRtcEhUTUwuaW5kZXhPZigic3BhbiBjbGFzcz1cImMtaWNvbiBjLWljb24tIikKICAgICAgICAgICAgICAgICAgICAmIHRtcEhUTUwuaW5kZXhPZigiaW1nIGNsYXNzPVwieEEzM0djIik7CiAgICAgICAgICAgICAgICAgIC8v5LuW6Ieq5bex5bey57uP5YGa5LqGZmF2aWNvbuS6hgogICAgICAgICAgICAgICAgICBpZiAocG9zID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygi5bey5pyJ5Zu+54mH77yaIik7CiAgICAgICAgICAgICAgICAgICAgY3VyTm9kZS5zZXRBdHRyaWJ1dGUoImFjX2Zhdmljb25TdGF0dXMiLCAiLTIiKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB0YXJnZXROb2RlID0gdGFyZ2V0Tm9kZS5xdWVyeVNlbGVjdG9yKGN1clNpdGUuRmF2aWNvbkFkZFRvKTsKICAgICAgICAgICAgICAgICAgbGV0IGhvc3QgPSBmYXZpY29uVXJsLnJlcGxhY2UoL1teLl0rXC4oW14uXSspXC4oW14uXSspLywgIiQxLiQyIik7CgogICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldE5vZGUuaGFzQXR0cmlidXRlKCJkYXRhLWZhdmljb24tdCIpICYmIGhvc3QubGVuZ3RoID49IDMpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZmF2aWNvblVybCA9IGN1ck5vZGUuaHJlZiB8fCBob3N0CiAgICAgICAgICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuQkFJRFUgJiYgZmF2aWNvblVybC5pbmNsdWRlcygiYmFpZHUuY29tL2xpbmsiKSkgewogICAgICAgICAgICAgICAgICAgICAgZmF2aWNvblVybCA9IGhvc3QKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRhcmdldE5vZGUuc2V0QXR0cmlidXRlKCdkYXRhLWZhdmljb24tdCcsIGZhdmljb25VcmwpCiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0TGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgIHRhZ05hbWU6IHRhcmdldE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpLAogICAgICAgICAgICAgICAgICAgICAgdXJsOiBmYXZpY29uVXJsCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIGNoZWNrTm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjbGlua3Nfd3JhcHBlciAjbGlua3MgLm5ybi1yZWFjdC1kaXYiKTsKICAgICAgICAgICAgZm9yIChsZXQgZmFOb2RlIG9mIGNoZWNrTm9kZXMpIHsKICAgICAgICAgICAgICBsZXQgZmF2aWNvbk5vZGUgPSBmYU5vZGUucXVlcnlTZWxlY3RvcigiLnJlc3VsdF9faWNvbiBpbWciKTsKICAgICAgICAgICAgICBsZXQgYmVmb3JlTm9kZSA9IGZhTm9kZS5xdWVyeVNlbGVjdG9yKCIucmVzdWx0X190aXRsZSBhIik7CiAgICAgICAgICAgICAgaWYgKGZhdmljb25Ob2RlICYmIGJlZm9yZU5vZGUpIHsKICAgICAgICAgICAgICAgIGZhdmljb25Ob2RlLnN0eWxlID0gInZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4tcmlnaHQ6NXB4OyI7CiAgICAgICAgICAgICAgICBiZWZvcmVOb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGZhdmljb25Ob2RlLCBiZWZvcmVOb2RlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChpbnNlcnRMaXN0Lmxlbmd0aCkgewogICAgICAgICAgICBpbnNlcnRMaXN0Lm1hcChvbmUgPT4gewogICAgICAgICAgICAgIGlmICh2dWVWTSkgewogICAgICAgICAgICAgICAgdnVlVk0uJHNldCh2dWVWTS5vdGhlci5mYXZpY29uTGlzdE1hcCwgb25lLnVybCwgb25lKSAvLyDkuYvlkI7nmoTmm7TmlrDnlKjov5nkuKogLSDnlKjkuo7op6blj5F3YXRjaAogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyDmraTml7bov5jmsqHmnIl2dWVWTQogICAgICAgICAgICAgICAgb3RoZXJEYXRhLm90aGVyLmZhdmljb25MaXN0TWFwW29uZS51cmxdID0gb25lIC8vIOWIneWni+WMlueahOabtOaWsOeUqOi/meS4qgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXN5bmMgZnVuY3Rpb24gSW5zZXJ0U2V0dGluZ01lbnVDU1MoKSB7CiAgICAgICAgICAvKiLoh6rlrprkuYki5oyJ6ZKu5pWI5p6cKi8KICAgICAgICAgIENPTlNULmZsdXNoTm9kZS5pbnNlcnQoYXdhaXQgY3JlYXRlX0NTU19Ob2RlKCIuYWNoaWRle2Rpc3BsYXk6bm9uZTt9IC5uZXdGdW5jSGlnaExpZ2h0e2NvbG9yOnJlZDtmb250LXdlaWdodDogMTAwO2JhY2tncm91bmQtY29sb3I6IHllbGxvdztmb250LXdlaWdodDogNjAwO30jc3AtYWMtY29udGFpbmVyIGxhYmVse2Rpc3BsYXk6aW5saW5lO30jdXt3aWR0aDozMTlweH0jdSAjbXl1c2Vye2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjogMTNweCAtMTBweCAwIDI0cHg7fS5zaXRlLXdyYXBwZXIgI215dXNlciwuc29nb3Utc2V0LWJveCAjbXl1c2VyLCNnYncgI215dXNlcnttYXJnaW4tcmlnaHQ6MTVweDt9ICNteXVzZXIsI215dXNlciAubXl1c2VyY29uZmlne3BhZGRpbmc6MDttYXJnaW46MH0jbXl1c2Vye2Rpc3BsYXk6aW5saW5lLWJsb2NrO30jbXl1c2VyIC5teXVzZXJjb25maWd7ZGlzcGxheTppbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6MS41O2JhY2tncm91bmQ6IzRlNmVmMjtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjZweDtib3JkZXI6MnB4IHNvbGlkICNFNUU1RTU7fSNteXVzZXIgLm15dXNlcmNvbmZpZ3tib3gtc2hhZG93OjAgMCAxMHB4IDNweCByZ2JhKDAsMCwwLC4xKTtib3JkZXItcmFkaXVzOiA2cHh9I215dXNlciAubXl1c2VyY29uZmlnOmhvdmVye2JhY2tncm91bmQ6IzQ2NjJkOSAhaW1wb3J0YW50O2NvbG9yOiNmZmY7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyOjJweCBzb2xpZCAjNzNBNkY4O31ib2R5W2RvZ2VdICNoZWFkZXJ7bWF4LXdpZHRoOiB1bnNldDt9Ym9keVtkb2dlXSAjbXl1c2Vye3Bvc2l0aW9uOiBhYnNvbHV0ZTtyaWdodDogNDBweDt9IiwKICAgICAgICAgICAgIkFDLU1FTlVfQnRuIikpCiAgICAgICAgICAvKuiHquWumuS5iemhtemdouWGheWuueaViOaenCovCiAgICAgICAgICBDT05TVC5mbHVzaE5vZGUuaW5zZXJ0KGF3YWl0IGNyZWF0ZV9DU1NfTm9kZSgnYm9keVtiYWlkdV0gI3NwLWFjLWNvbnRhaW5lciAuY29udGFpbmVyLWxhYmVsOm5vdChbY2xhc3MqPSJiYWlkdSJdKT5sYWJlbDpub3QoW2NsYXNzPSJsYWJlbF9oaWRlIl0pLFxuJyArCiAgICAgICAgICAgICcgIGJvZHlbZ29vZ2xlXSAjc3AtYWMtY29udGFpbmVyIC5jb250YWluZXItbGFiZWw6bm90KFtjbGFzcyo9Imdvb2dsZSJdKT5sYWJlbDpub3QoW2NsYXNzPSJsYWJlbF9oaWRlIl0pLFxuJyArCiAgICAgICAgICAgICcgIGJvZHlbYmluZ10gI3NwLWFjLWNvbnRhaW5lciAuY29udGFpbmVyLWxhYmVsOm5vdChbY2xhc3MqPSJiaW5nIl0pPmxhYmVsOm5vdChbY2xhc3M9ImxhYmVsX2hpZGUiXSksXG4nICsKICAgICAgICAgICAgJyAgYm9keVtzb2dvdV0gI3NwLWFjLWNvbnRhaW5lciAuY29udGFpbmVyLWxhYmVsOm5vdChbY2xhc3MqPSJzb2dvdSJdKT5sYWJlbDpub3QoW2NsYXNzPSJsYWJlbF9oaWRlIl0pLFxuJyArCiAgICAgICAgICAgICcgIGJvZHlbZHVja10gI3NwLWFjLWNvbnRhaW5lciAuY29udGFpbmVyLWxhYmVsOm5vdChbY2xhc3MqPSJkdWNrIl0pPmxhYmVsOm5vdChbY2xhc3M9ImxhYmVsX2hpZGUiXSksXG4nICsKICAgICAgICAgICAgJyAgYm9keVtkb2dlXSAjc3AtYWMtY29udGFpbmVyIC5jb250YWluZXItbGFiZWw6bm90KFtjbGFzcyo9ImRvZ2UiXSk+bGFiZWw6bm90KFtjbGFzcz0ibGFiZWxfaGlkZSJdKSxcbicgKwogICAgICAgICAgICAnICBib2R5W2JhaWR1XSAjc3AtYWMtY29udGFpbmVyIC5jb250YWluZXItbGFiZWw6bm90KFtjbGFzcyo9ImJhaWR1Il0pPmJyLFxuJyArCiAgICAgICAgICAgICcgIGJvZHlbZ29vZ2xlXSAjc3AtYWMtY29udGFpbmVyIC5jb250YWluZXItbGFiZWw6bm90KFtjbGFzcyo9Imdvb2dsZSJdKT5icixcbicgKwogICAgICAgICAgICAnICBib2R5W2JpbmddICNzcC1hYy1jb250YWluZXIgLmNvbnRhaW5lci1sYWJlbDpub3QoW2NsYXNzKj0iYmluZyJdKT5icixcbicgKwogICAgICAgICAgICAnICBib2R5W2R1Y2tdICNzcC1hYy1jb250YWluZXIgLmNvbnRhaW5lci1sYWJlbDpub3QoW2NsYXNzKj0iZHVjayJdKT5icixcbicgKwogICAgICAgICAgICAnICBib2R5W2RvZ2VdICNzcC1hYy1jb250YWluZXIgLmNvbnRhaW5lci1sYWJlbDpub3QoW2NsYXNzKj0iZG9nZSJdKT5icixcbicgKwogICAgICAgICAgICAnICBib2R5W3NvZ291XSAjc3AtYWMtY29udGFpbmVyIC5jb250YWluZXItbGFiZWw6bm90KFtjbGFzcyo9InNvZ291Il0pPmJyLFxuJyArCiAgICAgICAgICAgICcgIGJvZHlbYmFpZHVdICNzcC1hYy1jb250YWluZXIgLmNvbnRhaW5lci1sYWJlbFtjbGFzcyo9ImJhaWR1Il0+LmxhYmVsX2hpZGUsXG4nICsKICAgICAgICAgICAgJyAgYm9keVtnb29nbGVdICNzcC1hYy1jb250YWluZXIgLmNvbnRhaW5lci1sYWJlbFtjbGFzcyo9Imdvb2dsZSJdPi5sYWJlbF9oaWRlLFxuJyArCiAgICAgICAgICAgICcgIGJvZHlbYmluZ10gI3NwLWFjLWNvbnRhaW5lciAuY29udGFpbmVyLWxhYmVsW2NsYXNzKj0iYmluZyJdPi5sYWJlbF9oaWRlLFxuJyArCiAgICAgICAgICAgICcgIGJvZHlbc29nb3VdICNzcC1hYy1jb250YWluZXIgLmNvbnRhaW5lci1sYWJlbFtjbGFzcyo9InNvZ291Il0+LmxhYmVsX2hpZGUsXG4nICsKICAgICAgICAgICAgJyAgYm9keVtkdWNrXSAjc3AtYWMtY29udGFpbmVyIC5jb250YWluZXItbGFiZWxbY2xhc3MqPSJkdWNrIl0+LmxhYmVsX2hpZGUsXG4nICsKICAgICAgICAgICAgJyAgYm9keVtkb2dlXSAjc3AtYWMtY29udGFpbmVyIC5jb250YWluZXItbGFiZWxbY2xhc3MqPSJkb2dlIl0+LmxhYmVsX2hpZGVcbicgKyAvLyDms6jmhI/lsL7pg6jpgJflj7cKICAgICAgICAgICAgJ3snICsKICAgICAgICAgICAgJ2Rpc3BsYXk6bm9uZTtcbicgKwogICAgICAgICAgICAnfSNzcC1hYy1jb250YWluZXIgLmRpc3BsYXktYmxvY2t7ZGlzcGxheTpibG9jazt9I3NwLWFjLWNvbnRhaW5lciAubGFiZWxfaGlkZXtjdXJzb3I6cG9pbnRlcjttYXJnaW4tbGVmdDo4JTtjb2xvcjpibHVlfSNzcC1hYy1jb250YWluZXIgLmxpbmtocmVmLCNzcC1hYy1jb250YWluZXIgLmxhYmVsX2hpZGU6aG92ZXJ7Y29sb3I6cmVkfSNzcC1hYy1jb250YWluZXIgLmxpbmtocmVmOmhvdmVye2ZvbnQtd2VpZ2h0OmJvbGR9I3NwLWFjLWNvbnRhaW5lciBsYWJlbC5tZW51LWJveC1zbWFsbHttYXgtd2lkdGg6MTZweDttYXgtaGVpZ2h0OjE2cHg7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2t9LkFDLUNvdW50ZXJUe2JhY2tncm91bmQ6I0ZEOTk5OX1ib2R5ICAjc3AtYWMtY29udGFpbmVye3Bvc2l0aW9uOmZpeGVkO3RvcDozLjl2dztyaWdodDo4Ljh2d30jc3AtYWMtY29udGFpbmVye3otaW5kZXg6OTk5OTk5O3RleHQtYWxpZ246bGVmdDtiYWNrZ3JvdW5kLWNvbG9yOndoaXRlfSNzcC1hYy1jb250YWluZXIgKntmb250LXNpemU6MTNweDtjb2xvcjpibGFjaztmbG9hdDpub25lfSNzcC1hYy1tYWluLWhlYWR7cG9zaXRpb246cmVsYXRpdmU7dG9wOjA7bGVmdDowfSNzcC1hYy1zcGFuLWluZm97cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MXB4O3RvcDowO2ZvbnQtc2l6ZToxMHB4O2xpbmUtaGVpZ2h0OjEwcHg7YmFja2dyb3VuZDpub25lO2ZvbnQtc3R5bGU6aXRhbGljO2NvbG9yOiM1YTVhNWE7dGV4dC1zaGFkb3c6d2hpdGUgMHB4IDFweCAxcHh9I3NwLWFjLWNvbnRhaW5lciBpbnB1dHt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7ZGlzcGxheTppbmxpbmUtYmxvY2s7b3V0bGluZTpub25lO2hlaWdodDphdXRvO3BhZGRpbmc6MHB4O21hcmdpbi1ib3R0b206MHB4O21hcmdpbi10b3A6MHB4fSNzcC1hYy1jb250YWluZXIgaW5wdXRbdHlwZT0ibnVtYmVyIl17d2lkdGg6NTBweDt0ZXh0LWFsaWduOmxlZnR9I3NwLWFjLWNvbnRhaW5lciBpbnB1dFt0eXBlPSJjaGVja2JveCJde2JvcmRlcjoxcHggc29saWQgI0I0QjRCNDtwYWRkaW5nOjFweDttYXJnaW46M3B4O3dpZHRoOjEzcHg7aGVpZ2h0OjEzcHg7YmFja2dyb3VuZDpub25lO2N1cnNvcjpwb2ludGVyO3Zpc2liaWxpdHk6dmlzaWJsZTtwb3NpdGlvbjpzdGF0aWN9I3NwLWFjLWNvbnRhaW5lciBpbnB1dFt0eXBlPSJidXR0b24iXXtib3JkZXI6MXB4IHNvbGlkICNjY2M7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDpub25lO3dpZHRoOmF1dG87aGVpZ2h0OmF1dG99I3NwLWFjLWNvbnRhaW5lciBsaXtsaXN0LXN0eWxlOm5vbmU7bWFyZ2luOjNweCAwO2JvcmRlcjpub25lO2Zsb2F0Om5vbmU7Y3Vyc29yOmRlZmF1bHQ7fSNzcC1hYy1jb250YWluZXIgZmllbGRzZXR7Ym9yZGVyOjJweCBncm9vdmUgI2NjYzstbW96LWJvcmRlci1yYWRpdXM6M3B4O2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmc6NHB4IDlweCA2cHggOXB4O21hcmdpbjoycHg7ZGlzcGxheTpibG9jazt3aWR0aDphdXRvO2hlaWdodDphdXRvfSNzcC1hYy1jb250YWluZXIgbGVnZW5ke2xpbmUtaGVpZ2h0OjIwcHg7bWFyZ2luLWJvdHRvbTowcHh9I3NwLWFjLWNvbnRhaW5lciBmaWVsZHNldCA+IHVse3BhZGRpbmc6MDttYXJnaW46MH0jc3AtYWMtY29udGFpbmVyIHVsI3NwLWFjLWFfdXNlaWZyYW1lLWV4dGVuZHtwYWRkaW5nLWxlZnQ6NDBweH0jc3AtYWMtcmVjdHtwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6MDtsZWZ0OjA7ZmxvYXQ6cmlnaHQ7aGVpZ2h0OjEwcHg7d2lkdGg6MTBweDtwYWRkaW5nOjA7bWFyZ2luOjA7LW1vei1ib3JkZXItcmFkaXVzOjNweDtib3JkZXItcmFkaXVzOjNweDtib3JkZXI6MXB4IHNvbGlkIHdoaXRlOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDVweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4zKSwwIDAgM3B4IHJnYmEoMCwwLDAsMC44KTstbW96LWJveC1zaGFkb3c6aW5zZXQgMCA1cHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuMyksMCAwIDNweCByZ2JhKDAsMCwwLDAuOCk7Ym94LXNoYWRvdzppbnNldCAwIDVweCAwIHJnYmEoMjU1LDI1NSwyNTUsMC4zKSwwIDAgM3B4IHJnYmEoMCwwLDAsMC44KTtvcGFjaXR5OjAuOH0jc3AtYWMtZG90LCNzcC1hYy1jdXItbW9kZXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4Ojk5OTk7d2lkdGg6NXB4O2hlaWdodDo1cHg7cGFkZGluZzowOy1tb3otYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHg7Ym9yZGVyOjFweCBzb2xpZCB3aGl0ZTtvcGFjaXR5OjE7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgLTJweCAxcHggcmdiYSgwLDAsMCwwLjMpLGluc2V0IDAgMnB4IDFweCByZ2JhKDI1NSwyNTUsMjU1LDAuMyksMHB4IDFweCAycHggcmdiYSgwLDAsMCwwLjkpOy1tb3otYm94LXNoYWRvdzppbnNldCAwIC0ycHggMXB4IHJnYmEoMCwwLDAsMC4zKSxpbnNldCAwIDJweCAxcHggcmdiYSgyNTUsMjU1LDI1NSwwLjMpLDBweCAxcHggMnB4IHJnYmEoMCwwLDAsMC45KTtib3gtc2hhZG93Omluc2V0IDAgLTJweCAxcHggcmdiYSgwLDAsMCwwLjMpLGluc2V0IDAgMnB4IDFweCByZ2JhKDI1NSwyNTUsMjU1LDAuMyksMHB4IDFweCAycHggcmdiYSgwLDAsMCwwLjkpfSNzcC1hYy1kb3R7cmlnaHQ6LTNweDt0b3A6LTNweH0jc3AtYWMtY3VyLW1vZGV7bGVmdDotM3B4O3RvcDotM3B4O3dpZHRoOjZweDtoZWlnaHQ6NnB4fSNzcC1hYy1jb250ZW50e3BhZGRpbmc6MDttYXJnaW46MHB4Oy1tb3otYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHg7Ym9yZGVyOjFweCBzb2xpZCAjQTBBMEEwOy13ZWJraXQtYm94LXNoYWRvdzotMnB4IDJweCA1cHggcmdiYSgwLDAsMCwwLjMpOy1tb3otYm94LXNoYWRvdzotMnB4IDJweCA1cHggcmdiYSgwLDAsMCwwLjMpO2JveC1zaGFkb3c6LTJweCAycHggNXB4IHJnYmEoMCwwLDAsMC4zKX0jc3AtYWMtbWFpbntwYWRkaW5nOjVweDtib3JkZXI6MXB4IHNvbGlkIHdoaXRlOy1tb3otYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHg7YmFja2dyb3VuZC1jb2xvcjojRjJGMkY3O2JhY2tncm91bmQ6LW1vei1saW5lYXItZ3JhZGllbnQodG9wLCNGQ0ZDRkMsI0YyRjJGNyAxMDAlKTtiYWNrZ3JvdW5kOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLDAgMCwwIDEwMCUsZnJvbSgjRkNGQ0ZDKSx0bygjRjJGMkY3KSl9I3NwLWFjLWZvb3R7cG9zaXRpb246cmVsYXRpdmU7bGVmdDowO3JpZ2h0OjA7bWluLWhlaWdodDoyMHB4fSNzcC1hYy1zYXZlYnV0dG9ue3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjJweH0jc3AtYWMtY29udGFpbmVyIC5lbmRidXR0b257bWFyZ2luLXRvcDo4cHh9I3NwLWFjLWNvbnRhaW5lciAuc3AtYWMtc3BhbmJ1dHRvbnt1c2VyLXNlbGVjdDogbm9uZTtib3JkZXI6MXB4IHNvbGlkICNjY2M7LW1vei1ib3JkZXItcmFkaXVzOjNweDtib3JkZXItcmFkaXVzOjNweDtwYWRkaW5nOjJweCAzcHg7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjojRjlGOUY5Oy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDEwcHggNXB4IHdoaXRlOy1tb3otYm94LXNoYWRvdzppbnNldCAwIDEwcHggNXB4IHdoaXRlO2JveC1zaGFkb3c6aW5zZXQgMCAxMHB4IDVweCB3aGl0ZX0jc3AtYWMtY29udGFpbmVyIC5zcC1hYy1zcGFuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I0RERH1sYWJlbFtjbGFzcz0ibmV3RnVuYyJde2NvbG9yOmJsdWV9JywKICAgICAgICAgICAgIkFDLU1FTlVfUGFnZSIpKQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gSW5zZXJ0U2V0dGluZ01lbnUoKSB7CiAgICAgICAgICBpZiAoKGN1clNpdGUuU2l0ZVR5cGVJRCAhPT0gU2l0ZVR5cGUuT1RIRVJTKSAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjbXl1c2VyIikgPT09IG51bGwpIHsKICAgICAgICAgICAgLy9iYWlkdTsgZ29vZ2xlOyBiaW5nOyDmkJzni5cKICAgICAgICAgICAgc2FmZVdhaXRGdW5jKCIjdSwgI2diPmRpdj5kaXY+ZGl2LCAjYl9oZWFkZXI+I2lkX2gsIC50b3AtYmFyIC5zb2dvdS1zZXQtYm94LCAjaGVhZGVyX3dyYXBwZXIgLmpzLWhsLWJ1dHRvbiwgYm9keVtkb2dlXSAjaGVhZGVyX3dyYXBwZXIgI2hlYWRlciIsIHBhcmVudCA9PiB7CiAgICAgICAgICAgICAgcGFyZW50LnN0eWxlID0gIndpZHRoOiBhdXRvOyI7CiAgICAgICAgICAgICAgbGV0IHVzZXJBZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgICAgdXNlckFkaXYuaWQgPSAibXl1c2VyIjsKICAgICAgICAgICAgICB1c2VyQWRpdi5pbm5lckhUTUwgPSBgPGlucHV0IHR5cGU9J3N1Ym1pdCcgY2xhc3M9J215dXNlcmNvbmZpZycgdmFsdWU9JyR7IEFsbERhdGEubGFuLnVzZS5tZW51X3RleHQgfScvPjxzcGFuIGNsYXNzPSdhYy1uZXd2ZXJzaW9uRGlzcGxheScgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6IHJlZDtmbG9hdDogbGVmdDtoZWlnaHQ6IDhweDt3aWR0aDogOHB4O2JvcmRlci1yYWRpdXM6IDRweDtkaXNwbGF5OiR7IChDT05TVC5oYXNOZXdGdW5jTmVlZERpc3BsYXkgPyAidW5zZXQiIDogIm5vbmUiKSB9Jz4mbmJzcDs8L3NwYW4+YDsKICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHVzZXJBZGl2LCBwYXJlbnQuY2hpbGROb2Rlc1swXSk7CiAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI215dXNlciAubXl1c2VyY29uZmlnIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQUN0b2dnbGVTZXR0aW5nRGlzcGxheShlKTsKICAgICAgICAgICAgICB9LCB0cnVlKTsKICAgICAgICAgICAgfSwgMzAwKQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSgpOyAvLyDor7vlj5bkuKrkurrorr7nva7kv6Hmga8KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZV9DU1NfTm9kZShjc3MsIGNsYXNzTmFtZSA9ICcnLCBpbml0VHlwZSA9ICJ0ZXh0L2NzcyIpIHsKICAgICAgICBsZXQgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgaWYgKGNsYXNzTmFtZSkgewogICAgICAgICAgY3NzTm9kZS5jbGFzc05hbWUgPSBjbGFzc05hbWUKICAgICAgICAgIGNvbnN0IHhjbGFzcyA9ICcuJyArIGNsYXNzTmFtZS5zcGxpdCgnICcpLmpvaW4oJy4nKQogICAgICAgICAgY3NzTm9kZS5kYXRhc2V0LnhjbGFzcyA9IHhjbGFzcwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyDpkojlr7lsZXNz6L+b6KGM5Y2V54us5aSE55CGCiAgICAgICAgaWYoaW5pdFR5cGUuaW5jbHVkZXMoJ2xlc3MnKSkgewogICAgICAgICAgLy8gcGFyc2VIVE1MIOiAl+aXtiDmsqHlv4XopoEKICAgICAgICAgIGNvbnN0IHsgY3NzOiByZW5kZXJDU1MgPSAnJyB9ID0gYXdhaXQgbGVzcy5yZW5kZXIoY3NzKTsKICAgICAgICAgIGNzcyA9IHJlbmRlckNTUwogICAgICAgICAgaW5pdFR5cGUgPSAidGV4dC9jc3MiCiAgICAgICAgfQoKICAgICAgICBjc3NOb2RlLnNldEF0dHJpYnV0ZSgidHlwZSIsIGluaXRUeXBlKTsKICAgICAgICBjc3NOb2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpCiAgICAgICAgCiAgICAgICAgcmV0dXJuIGNzc05vZGUKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gQUNfYWRkU3R5bGUoY3NzLCBjbGFzc05hbWUsIGFkZFRvVGFyZ2V0LCBpc1JlbG9hZCA9IGZhbHNlLCBpbml0VHlwZSA9ICJ0ZXh0L2NzcyIpIHsgLy8g5re75YqgQ1NT5Luj56CB77yM5LiN6ICD6JmR5paH5pys6L295YWl5pe26Ze077yM5Y+q5omn6KGM5LiA5qyhLeaXoOiuuuaIkOWKn+S4juWQpu+8jOW4puaciWNsYXNzTmFtZQogICAgICAgIFJBRkludGVydmFsKGFzeW5jICgpID0+IHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogYWRkVG9UYXJnZXTov5nph4zkuI3opoHkvb/nlKhoZWFk5qCH562+LGhlYWTmoIfnrb7nmoRjc3PkvJrlnKhodG1s6L295YWl5pe25Yqg6L2977yMCiAgICAgICAgICAgKiBodG1s5Yqg6L295ZCO5Ly85LmO5LiN5Lya5YaN5qyh5Yqg6L2977yMYm9keeS8muiHquWKqOWKoOi9vQogICAgICAgICAgICogKiovCiAgICAgICAgICBsZXQgYWRkVG8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGFkZFRvVGFyZ2V0KTsKICAgICAgICAgIGlmICh0eXBlb2YgKGFkZFRvVGFyZ2V0KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIGFkZFRvID0gKGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICAgICAgLy8g5aaC5p6c5rKh5pyJ55uu5qCH6IqC54K5KOWImeebtOaOpeWKoCkgfHwg5pyJ55uu5qCH6IqC54K55LiU5om+5Yiw5LqG6IqC54K5KOi/m+ihjOaWsOWinikKICAgICAgICAgIGlmICh0eXBlb2YgKGFkZFRvVGFyZ2V0KSA9PT0gInVuZGVmaW5lZCIgfHwgKHR5cGVvZiAoYWRkVG9UYXJnZXQpICE9ICJ1bmRlZmluZWQiICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYWRkVG9UYXJnZXQpICE9IG51bGwpKSB7CiAgICAgICAgICAgIC8vIGNsZWFySW50ZXJ2YWwodG91dCk7CiAgICAgICAgICAgIC8vIOWmguaenHRydWUg5by66KGM6KaG55uW77yM5LiN566h5pyJ5rKh5pyJLS3lhYjliKDpmaQKICAgICAgICAgICAgLy8g5aaC5p6cZmFsc2XvvIzkuI3opobnm5bvvIzkvYbmmK/lpoLmnpzmnInnmoTor53vvIzopoHpgIDlh7rvvIzkuI3lrZjlnKjliJnmlrDlop4tLeaXoOmcgOWIoOmZpAogICAgICAgICAgICBpZiAoaXNSZWxvYWQgPT09IHRydWUpIHsKICAgICAgICAgICAgICBzYWZlUmVtb3ZlKCIuIiArIGNsYXNzTmFtZSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZWxvYWQgPT09IGZhbHNlICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi4iICsgY2xhc3NOYW1lKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgLy8g6IqC54K55a2Y5ZyoICYmIOS4jeWHhuWkh+imhueblgogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZXQgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkgY3NzTm9kZS5jbGFzc05hbWUgPSBjbGFzc05hbWU7CgogICAgICAgICAgICAvLyDpkojlr7lsZXNz6L+b6KGM5Y2V54us5aSE55CGCiAgICAgICAgICAgIGlmKGluaXRUeXBlLmluY2x1ZGVzKCdsZXNzJykpIHsKICAgICAgICAgICAgICAvLyBwYXJzZUhUTUwg6ICX5pe2IOayoeW/heimgQogICAgICAgICAgICAgIGNvbnN0IHsgY3NzOiByZW5kZXJDU1MgPSAnJyB9ID0gYXdhaXQgbGVzcy5yZW5kZXIoY3NzKTsKICAgICAgICAgICAgICBjc3MgPSByZW5kZXJDU1MKICAgICAgICAgICAgICBpbml0VHlwZSA9ICJ0ZXh0L2NzcyIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY3NzTm9kZS5zZXRBdHRyaWJ1dGUoInR5cGUiLCBpbml0VHlwZSk7CiAgICAgICAgICAgIGNzc05vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSkKCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgZGVidWcoJ+aJp+ihjOa3u+WKoOagt+W8j++8micsIGNsYXNzTmFtZSkKICAgICAgICAgICAgICBhZGRUby5hcHBlbmRDaGlsZChjc3NOb2RlKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUubWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSwgMjAsIHRydWUpOwogICAgICB9CgogICAgICAvLyDkuI3opoHliqjnlLvkuobvvIzlhY3lvpfmmL7npLrljaHpob8KICAgICAgZnVuY3Rpb24gYW5pUmVtb3ZlKG5vZGUsIHdpdGhBbmkpIHsKICAgICAgICAvLyBpZih3aXRoQW5pKSB7CiAgICAgICAgLy8gICBub2RlLmNsYXNzTGlzdC5hZGQoJ2FuaURlbGV0ZScpCiAgICAgICAgLy8gICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAvLyAgICAgbm9kZS5yZW1vdmUoKTsKICAgICAgICAvLyAgIH0sIDQwMCkKICAgICAgICAvLyB9IGVsc2UgewogICAgICAgICAgbm9kZS5yZW1vdmUoKTsKICAgICAgICAvLyB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGhpZGVOb2RlKG5vZGUpIHsKICAgICAgICBpZihub2RlLmhhc0F0dHJpYnV0ZSgnYWMtYWQtaGlkZScpKSByZXR1cm4KICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnYWMtYWQtaGlkZScsICcxJykKICAgICAgICBub2RlLnN0eWxlID0gJ2Rpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsnCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNhZmVSZW1vdmVfeHBhdGgoeHBhdGhTZWxlY3RvciwgaXNIaWRlPWZhbHNlLCB3aXRoQW5pID0gZmFsc2UpIHsKICAgICAgICBzYWZlRnVuY3Rpb24oKCkgPT4gewogICAgICAgICAgbGV0IHJlbW92ZU5vZGVzID0gZ2V0QWxsRWxlbWVudHMoeHBhdGhTZWxlY3Rvcik7CiAgICAgICAgICBpZihpc0hpZGUpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW1vdmVOb2Rlcy5sZW5ndGg7IGkrKyl7CiAgICAgICAgICAgICAgaGlkZU5vZGUocmVtb3ZlTm9kZXNbaV0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3ZlTm9kZXMubGVuZ3RoOyBpKyspewogICAgICAgICAgICAgIGFuaVJlbW92ZShyZW1vdmVOb2Rlc1tpXSwgd2l0aEFuaSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGNoZWNrSVNCYWlkdU1haW4oKSB7IC8vIOmmlumhtT10cnVlO+mdnummlumhtT1mYWxzZQogICAgICAgIC8vIOWmguaenOaYr+eZvuW6piAmJiAg5rKh5pyJKOeZvuW6puaQnOe0oue7k+aenOeahOagh+W/ly1b5a2Y5ZyoXeeZvuW6pueahOWGheWuuSkgcmV0dXJuOwogICAgICAgIHJldHVybiAhKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuQkFJRFUgJiYgIShsb2NhdGlvbi5ocmVmLnJlcGxhY2UoLygmfFw/KSh3ZHx3b3JkKT0vLCAiIikgIT09IGxvY2F0aW9uLmhyZWYgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2NvbnRlbnRfbGVmdCIpIHx8CiAgICAgICAgICAgICgoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2t3IikgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2t3IikuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpKSB8fCAiIikgIT09ICIiKQogICAgICAgICkKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIOajgOafpWRvY3VtZW5055qE5a2Q6IqC54K55piv5ZCm5ZCr5pyJ5YWD57SgCiAgICAgICAqIEBwYXJhbSBub2RlQ2xhc3Mg5b6F5qOA5p+l5YWD57SgCiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUfEYKICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGNoZWNrRG9jbWVudEhhc05vZGUobm9kZUNsYXNzKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb2N1bWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoZG9jdW1lbnQuY2hpbGROb2Rlc1tpXS5kYXRhICYmIGRvY3VtZW50LmNoaWxkTm9kZXNbaV0uZGF0YS5pbmRleE9mKG5vZGVDbGFzcykgPiAwKQogICAgICAgICAgICByZXR1cm4geyByZXM6IHRydWUsIG5vZGU6IGRvY3VtZW50LmNoaWxkTm9kZXNbaV0sIGluZGV4OiBpIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHJlczogZmFsc2UsIG5vZGU6IG51bGwsIGluZGV4OiAtMSB9OwogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBjaGFuZ2VTaXRlQmFja2dyb3VuZChpbWFnZVVybCkgeyAvLyDov5nkuKrlm77niYflnLDlnYDlj6/og73kuLrvvJrliqjmgIHlm77niYfov5Tlm57jgIHpnZnmgIHot6jln5/lm77niYcKICAgICAgICBjb25zdCBjc3MgPSBgYm9keTpiZWZvcmV7cG9zaXRpb246IGZpeGVkO3dpZHRoOiAxMDAlO2hlaWdodDogMTAwJTt0b3A6IDA7bGVmdDogMDtjb250ZW50OiAnJztiYWNrZ3JvdW5kLWltYWdlOiB1cmwoJyR7aW1hZ2VVcmx9Jyk7YmFja2dyb3VuZC1zaXplOiAxMDAlIGF1dG87b3BhY2l0eTogMC42O2AKICAgICAgICBDT05TVC5mbHVzaE5vZGUuaW5zZXJ0KGF3YWl0IGNyZWF0ZV9DU1NfTm9kZShjc3MsICdBQy1CYWNrR3JvdW5kSW1hZ2UnKSwgJ2hlYWQnLCB7CiAgICAgICAgICBpc1JlbG9hZDogdHJ1ZQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGFzeW5jR01IdHRwUmVxdWVzdEdldCh1cmwpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgICAgdGltZW91dDogNTAwMCwKICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICAgIGNvbnN0IHsgcmVzcG9uc2VUZXh0ID0gJycgfSA9IHJlc3BvbnNlCiAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZVRleHQpCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uZXJyb3I6IGZ1bmN0aW9uKGVycikgewogICAgICAgICAgICAgIHJlamVjdChlcnIpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pCiAgICAgICAgfSkgCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIEZTQmFpZHUoKSB7IC8vIHRoYW5rcyBmb3IgY29kZSBmcm9tIOa1rueUn0DmnKrmrYcgQHBhZ2UgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1UVy9zY3JpcHRzLzMxNjQyCiAgICAgICAgLy8gZGVidWcoIuWIneWni+WMlkZTQkFJRFUiKTsKCiAgICAgICAgY29uc3QgU3R5bGVNYW5nZXIgPSB7CiAgICAgICAgICAvKioKICAgICAgICAgICAqIOWvvOWFpWNzc+WGheWuueS4uuOAkOaWh+acrOagvOW8j+OAke+8ge+8ge+8gQogICAgICAgICAgICogQHBhcmFtIGRhdGEgY3Nz5YaF5a65CiAgICAgICAgICAgKiBAcGFyYW0gdG9DbGFzc05hbWUg6aKE5pyf55qE57G75ZCNCiAgICAgICAgICAgKi8KICAgICAgICAgIGltcG9ydFN0eWxlOiBhc3luYyAoZGF0YSwgdG9DbGFzc05hbWUsIHVzZU5vcm1hbENTUyA9IGZhbHNlLCBtdXN0TG9hZCA9IGZhbHNlKSA9PiB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgKGRhdGEpID09PSAidW5kZWZpbmVkIiB8fCBkYXRhID09PSBudWxsKSB7CiAgICAgICAgICAgICAgLy8g6L+Z5Liq5bGF54S25ZyoVk3kuIrlh7rpl67popjkuobvvIzlvojlpYfmgKoKICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJHTV9nZXRSZXNvdXJjZVRleHTojrflj5blhoXlrrnmlbDmja7lvILluLjvvJoiLCB0b0NsYXNzTmFtZSk7CiAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoZGF0YS5zdGFydHNXaXRoKCdodHRwJykpIHsKICAgICAgICAgICAgICAvLyDnvZHlnYDlvIDlpLTnmoTvvIzpgqPkuYjlsJ3or5XljrvliqDovb3mlbDmja7ljrsKICAgICAgICAgICAgICBkYXRhID0gYXdhaXQgYXN5bmNHTUh0dHBSZXF1ZXN0R2V0KGRhdGEpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8g5pmu6YCa5rWP6KeI5Zmo5qih5byPLS3kvYbmmK/kvLzkuY7moLflvI/liqDovb3nmoTkvJjlhYjnuqfkvY7kuo5oZWFk5Lit55qEc3R5bGXkvJjlhYjnuqcKICAgICAgICAgICAgaWYgKCF1c2VOb3JtYWxDU1MgJiYgY3VyU2l0ZS5TaXRlVHlwZUlEICE9PSBTaXRlVHlwZS5EVUNLKSB7IC8vIER1Y2vmi5Lnu53kuoblpJbpg6jmoLflvI/mj5LlhaUKICAgICAgICAgICAgICAvLyDpgJrov4dtdXN05Y+C5pWw5p2l5Yik5a6ac3R5bGXmmK/lkKbliqDovb0KICAgICAgICAgICAgICAvLyBkYXRhID0gZGF0YS5yZXBsYWNlKC9iYWlkdS5jb20jXCQjL2lnbSwgJycpOwogICAgICAgICAgICAgIGNvbnN0IHsgY3NzOiByZW5kZXJDU1MgPSAnJyB9ID0gYXdhaXQgbGVzcy5yZW5kZXIoZGF0YSk7CiAgICAgICAgICAgICAgZGF0YSA9IHJlbmRlckNTUyB8fCBkYXRhCiAgICAgICAgICAgICAgaWYgKGRhdGEuaW5kZXhPZigiaHR0cCIpICE9PSAwKSBkYXRhID0gImRhdGE6dGV4dC9jc3M7dXRmLTgsIiArIGVuY29kZVVSSUNvbXBvbmVudChkYXRhKTsKICAgICAgICAgICAgICB2YXIge3Jlcyx9ID0gY2hlY2tEb2NtZW50SGFzTm9kZSh0b0NsYXNzTmFtZSk7CiAgICAgICAgICAgICAgaWYgKCFyZXMpIHsKICAgICAgICAgICAgICAgIGxldCBwaSA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigKICAgICAgICAgICAgICAgICAgInhtbC1zdHlsZXNoZWV0IiwKICAgICAgICAgICAgICAgICAgYHR5cGU9InRleHQvY3NzIiBtdXN0PSIke211c3RMb2FkfSIgY2xhc3M9IiR7dG9DbGFzc05hbWV9IiBocmVmPSIke2RhdGF9ImAKICAgICAgICAgICAgICAgICk7IC8vIOazqOaEj+W/hemhu+imgeWPjOW8leWPtwogICAgICAgICAgICAgICAgZGVidWcoJ2ltcG9ydOaJp+ihjOa3u+WKoOagt+W8jyBkb2luZycsIHRvQ2xhc3NOYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuIHBpCiAgICAgICAgICAgICAgICAvLyBkb2N1bWVudC5hcHBlbmRDaGlsZChwaSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8qICoqKioqKioqKirlpJrph43moLflvI8t5YW85a65ZWRnZSAmJiDpu5HlpJzohJrmnKwqKioqKioqKioqKiogKi8KICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY3JlYXRlX0NTU19Ob2RlKGRhdGEsIHRvQ2xhc3NOYW1lKQogICAgICAgICAgICAgIC8vIEFDX2FkZFN0eWxlKGRhdGEsIHRvQ2xhc3NOYW1lLCAiaGVhZCIsIGZhbHNlLCAibGVzcyIpOwogICAgICAgICAgICAgIC8qICoqKioqKioqKirlpJrph43moLflvI8t5YW85a65ZWRnZSAmJiDpu5HlpJzohJrmnKwqKioqKioqKioqKiogKi8KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGxvYWRTdHlsZTogYXN5bmMgZnVuY3Rpb24gKHN0eWxlTmFtZSwgaW5zQ2xhc3NOYW1lLCBzZXRVcmwsIHVzZU5vcm1hbENTUyA9IGZhbHNlLCBtdXN0TG9hZCA9IGZhbHNlKSB7CiAgICAgICAgICAgIC8vIOWFqOmDqOmHh+eUqHRleHQvY3Nz55qE5YaF5a655p2l6L295YWlCiAgICAgICAgICAgIC8vIOWmguaenOaYr2RlYnVn5qih5byP44CC5oiW6ICF5pivZ23mqKHlvI8KICAgICAgICAgICAgaWYgKGlzTG9jYWxEZWJ1ZykgewogICAgICAgICAgICAgIGRlYnVnKCLmnKzlnLAt5Yqg6L295qC35byP77yaIiArIGluc0NsYXNzTmFtZSk7CiAgICAgICAgICAgICAgc2V0VXJsID0gc2V0VXJsIHx8ICJodHRwOi8vZGVidWcuYmFpZHUuY29tLyIgKyBzdHlsZU5hbWUgKyAiLmxlc3MiOwogICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmltcG9ydFN0eWxlKHNldFVybCwgIkFDLSIgKyBpbnNDbGFzc05hbWUsIHVzZU5vcm1hbENTUywgbXVzdExvYWQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGRlYnVnKCLliqDovb3moLflvI/vvJoiICsgaW5zQ2xhc3NOYW1lKTsKICAgICAgICAgICAgICAvLyBUYW1wZXJNb25rZXkgKyBHcmVhc2VNb25rZXkgPCA0LjAgKyBWaW9sZW50TW9ua2V5ICg0LjBHcmVhc2VNb25rZXnkuI3mlK/mjIFHZXRSZXNvdXJjZeaWueazlSkKICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IGN1clNpdGUuR01TdHlsZUxpc3Rbc3R5bGVOYW1lXSB8fCBhd2FpdCBHTV9nZXRSZXNvdXJjZVRleHQoc3R5bGVOYW1lKQogICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmltcG9ydFN0eWxlKHN0eWxlLCAiQUMtIiArIGluc0NsYXNzTmFtZSwgdXNlTm9ybWFsQ1NTLCBtdXN0TG9hZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvL+WKoOi9veaKpOecvOaooeW8j+agt+W8jwogICAgICAgICAgbG9hZEh1WWFuU3R5bGU6IGFzeW5jIGZ1bmN0aW9uIChjb2xvcikgewogICAgICAgICAgICBpZiAoQUNDb25maWcuaXNVc2VyQ29sb3JFbmFibGUpIHsKICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yIHx8IEFDQ29uZmlnLmRlZmF1bHRIdVlhbkNvbG9yIHx8ICIjRkZGRkZGIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yIHx8ICIjRkZGRkZGIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29sb3IuaW5kZXhPZigiIyIpICE9PSAwIHx8IGNvbG9yLmxlbmd0aCA8IDcpIHJldHVybjsKICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBHTV9nZXRSZXNvdXJjZVRleHQoIk1haW5IdVlhblN0eWxlIikKICAgICAgICAgICAgLnJlcGxhY2UoLyNhYWEoYSopL2lnbSwgY29sb3IpCiAgICAgICAgICAgIC5yZXBsYWNlKC8jYmJiKGIqKS9pZ20sIHRoaXMuTGlnaHRlcihjb2xvciwgLTQwKSkKICAgICAgICAgICAgLnJlcGxhY2UoLyNjY2MoYyopL2lnbSwgdGhpcy5MaWdodGVyKGNvbG9yLCA0NSkpOwogICAgICAgICAgICBDT05TVC5mbHVzaE5vZGUuaW5zZXJ0KGF3YWl0IGNyZWF0ZV9DU1NfTm9kZShzdHlsZSwgIkFDLSIgKyBDT05TVC51c2VJdGVtLm5hbWUgKyAiSHVZYW5TdHlsZS1GaWxlIiksICdoZWFkJywgewogICAgICAgICAgICAgIGlzUmVsb2FkOiB0cnVlCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9LAogICAgICAgICAgY2xpcDI1NTogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSA+IDI1NSkgcmV0dXJuIDI1NTsKICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkgcmV0dXJuIDA7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgIH0sCiAgICAgICAgICBMaWdodGVyOiBmdW5jdGlvbiAob3JpUkdCLCBkZWx0YVkpIHsKICAgICAgICAgICAgLy8g5oyJ5q+U5L6L57yp5pS+ICsgMS9kZWx0YVkKICAgICAgICAgICAgLy8gSEVYIDIgUkdCCiAgICAgICAgICAgIGxldCByZ2IgPSBvcmlSR0IucmVwbGFjZSgiIyIsICIiKTsKICAgICAgICAgICAgbGV0IFIgPSBwYXJzZUludCgiMHgiICsgcmdiLnN1YnN0cigwLCAyKSk7CiAgICAgICAgICAgIGxldCBHID0gcGFyc2VJbnQoIjB4IiArIHJnYi5zdWJzdHIoMiwgMikpOwogICAgICAgICAgICBsZXQgQiA9IHBhcnNlSW50KCIweCIgKyByZ2Iuc3Vic3RyKDQsIDIpKTsKICAgICAgICAgICAgLy8gUkdCIDIgWVVWCiAgICAgICAgICAgIGxldCBZID0gKCg2NiAqIFIgKyAxMjkgKiBHICsgMjUgKiBCICsgMTI4KSA+PiA4KSArIDE2OwogICAgICAgICAgICBsZXQgVSA9ICgoLTM4ICogUiAtIDc0ICogRyArIDExMiAqIEIgKyAxMjgpID4+IDgpICsgMTI4OwogICAgICAgICAgICBsZXQgViA9ICgoMTEyICogUiAtIDk0ICogRyAtIDE4ICogQiArIDEyOCkgPj4gOCkgKyAxMjg7CiAgICAgICAgICAgIFkgPSBZICogKDEgKyAxLjAgLyBkZWx0YVkpOy8vIOaPkOmrmOS6ruW6pgogICAgICAgICAgICAvLyBZVVYgMiBSR0IKICAgICAgICAgICAgUiA9IHRoaXMuY2xpcDI1NSgoMjk4ICogKFkgLSAxNikgKyA0MDkgKiAoViAtIDEyOCkgKyAxMjgpID4+IDgpOwogICAgICAgICAgICBHID0gdGhpcy5jbGlwMjU1KCgyOTggKiAoWSAtIDE2KSAtIDEwMCAqIChVIC0gMTI4KSAtIDIwOCAqIChWIC0gMTI4KSArIDEyOCkgPj4gOCk7CiAgICAgICAgICAgIEIgPSB0aGlzLmNsaXAyNTUoKDI5OCAqIChZIC0gMTYpICsgNTE2ICogKFUgLSAxMjgpICsgMTI4KSA+PiA4KTsKICAgICAgICAgICAgcmV0dXJuICIjIiArICgoUiA8PCAxNikgKyAoRyA8PCA4KSArIEIpLnRvU3RyaW5nKDE2KTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb2FkQmFpZHVMaXRlU3R5bGU6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGF3YWl0IHRoaXMubG9hZFN0eWxlKCJiYWlkdUxpdGVTdHlsZSIsICJiYWlkdUxpdGVTdHlsZSIpOwogICAgICAgICAgICB0aGlzLmZsdXNoRG9tLmluc2VydChub2RlLCAnRE9NJykKICAgICAgICAgIH0sCiAgICAgICAgICBsb2FkQmdJbWFnZTogYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmKENPTlNULnVzZUl0ZW0uZGVmYXVsdEJnVXJsICYmIENPTlNULnVzZUl0ZW0uZGVmYXVsdEJnVXJsLnRyaW0oKSkgewogICAgICAgICAgICAgIGNoYW5nZVNpdGVCYWNrZ3JvdW5kKENPTlNULnVzZUl0ZW0uZGVmYXVsdEJnVXJsKQogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgbG9hZEJnQXV0b0ZpdDogYXN5bmMgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBhd2FpdCB0aGlzLmxvYWRTdHlsZSgiQmdBdXRvRml0IiwgIkJnQXV0b0ZpdCIpOwogICAgICAgICAgICB0aGlzLmZsdXNoRG9tLmluc2VydChub2RlLCAnRE9NJykKICAgICAgICAgIH0sCiAgICAgICAgICAvL+WKoOi9veaZrumAmuagt+W8jwogICAgICAgICAgbG9hZENvbW1vblN0eWxlOiBhc3luYyBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBhd2FpdCB0aGlzLmxvYWRTdHlsZShDT05TVC51c2VJdGVtLm5hbWUgKyAiQ29tbW9uU3R5bGUiLCBDT05TVC51c2VJdGVtLm5hbWUgKyAiQ29tbW9uU3R5bGUiKTsKICAgICAgICAgICAgdGhpcy5mbHVzaERvbS5pbnNlcnQobm9kZSwgJ0RPTScpCiAgICAgICAgICB9LAogICAgICAgICAgLy/liqDovb3ljZXpobXmoLflvI8KICAgICAgICAgIGxvYWRPbmVQYWdlU3R5bGU6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGF3YWl0IHRoaXMubG9hZFN0eWxlKENPTlNULnVzZUl0ZW0ubmFtZSArICJPbmVQYWdlU3R5bGUiLCBDT05TVC51c2VJdGVtLm5hbWUgKyAiT25lUGFnZVN0eWxlIik7CiAgICAgICAgICAgIHRoaXMuZmx1c2hEb20uaW5zZXJ0KG5vZGUsICdET00nKQogICAgICAgICAgfSwKICAgICAgICAgIC8v5Yqg6L295Y+M6aG15qC35byPCiAgICAgICAgICBsb2FkVHdvUGFnZVN0eWxlOiBhc3luYyBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBhd2FpdCB0aGlzLmxvYWRTdHlsZShDT05TVC51c2VJdGVtLm5hbWUgKyAiVHdvUGFnZVN0eWxlIiwgQ09OU1QudXNlSXRlbS5uYW1lICsgIlR3b1BhZ2VTdHlsZSIpOwogICAgICAgICAgICB0aGlzLmZsdXNoRG9tLmluc2VydChub2RlLCAnRE9NJykKICAgICAgICAgICAgbGV0IGNzc0hlYWQgPSAiIjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuQkFJRFUgfHwgY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5NQkFJRFUpIGNzc0hlYWQgPSAiI2NvbnRhaW5lciAjY29udGVudF9sZWZ0LCBib2R5W25ld3NdICNjb250YWluZXIgI2NvbnRlbnRfbGVmdD5kaXY6bm90KFtjbGFzc10pOm5vdChbaWRdKSI7CiAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkdPT0dMRSkgY3NzSGVhZCA9ICIuc3JnLCAjcnNvLCAjcnNvPmRpdjpub3QoLmcpLCAja3Atd3AtdGFiLW92ZXJ2aWV3IjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuQklORykgY3NzSGVhZCA9ICIjYl9jb250ZW50ICNiX3Jlc3VsdHMiOwogICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5TT0dPVSkgY3NzSGVhZCA9ICIjbWFpbiAucmVzdWx0cyI7CiAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkRVQ0spIGNzc0hlYWQgPSAiI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW4gI2xpbmtzIjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuRE9HRSkgY3NzSGVhZCA9ICIjbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tbWFpbiAjbGlua3MiOwogICAgICAgICAgICBjb25zdCBub2RlMiA9IGF3YWl0IGNyZWF0ZV9DU1NfTm9kZShjc3NIZWFkICsgIntncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCBtaW5tYXgoNTAlLDFmcikpO2dyaWQtdGVtcGxhdGUtYXJlYXM6J3htYWluIHhtYWluJzt9LkFDLnNwLXNlcGFyYXRvcntncmlkLWNvbHVtbi1zdGFydDogMTtncmlkLWNvbHVtbi1lbmQ6IHhtYWluLWVuZDt9IiwKICAgICAgICAgICAgICAiQUMtVHdvUGFnZUV4U3R5bGUiKTsKICAgICAgICAgICAgdGhpcy5mbHVzaERvbS5pbnNlcnQobm9kZTIsICdoZWFkJykKICAgICAgICAgIH0sCiAgICAgICAgICAvLyDliqDovb3kuInliJfmoLflvI8KICAgICAgICAgIGxvYWRUaHJlZVBhZ2VTdHlsZTogYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBsZXQgY3NzSGVhZCA9ICIiOwogICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5CQUlEVSB8fCBjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLk1CQUlEVSkgY3NzSGVhZCA9ICIjY29udGFpbmVyICNjb250ZW50X2xlZnQsIGJvZHlbbmV3c10gI2NvbnRhaW5lciAjY29udGVudF9sZWZ0PmRpdjpub3QoW2NsYXNzXSk6bm90KFtpZF0pIjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuR09PR0xFKSBjc3NIZWFkID0gIi5zcmcsICNyc28sICNyc28+ZGl2Om5vdCguZyksICNrcC13cC10YWItb3ZlcnZpZXciOwogICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5CSU5HKSBjc3NIZWFkID0gIiNiX2NvbnRlbnQgI2JfcmVzdWx0cyI7CiAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLlNPR09VKSBjc3NIZWFkID0gIiNtYWluIC5yZXN1bHRzIjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuRFVDSykgY3NzSGVhZCA9ICIjbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tbWFpbiAjbGlua3MiOwogICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5ET0dFKSBjc3NIZWFkID0gIiNsaW5rc193cmFwcGVyIC5yZXN1bHRzLS1tYWluICNsaW5rcyI7CiAgICAgICAgICAgIGNvbnN0IG5vZGUyID0gYXdhaXQgY3JlYXRlX0NTU19Ob2RlKGNzc0hlYWQgKyAie2dyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDMsIG1pbm1heCgzMy4zJSwxZnIpKTtncmlkLXRlbXBsYXRlLWFyZWFzOid4bWFpbiB4bWFpbiB4bWFpbic7fSIsCiAgICAgICAgICAgICAgIkFDLVRocmVlUGFnZUV4U3R5bGUiKTsKICAgICAgICAgICAgdGhpcy5mbHVzaERvbS5pbnNlcnQobm9kZTIsICdoZWFkJykKICAgICAgICAgIH0sCiAgICAgICAgICAvLyDliqDovb3lm5vliJfmoLflvI8KICAgICAgICAgIGxvYWRGb3VyUGFnZVN0eWxlOiBhc3luYyBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGxldCBjc3NIZWFkID0gIiI7CiAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkJBSURVIHx8IGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuTUJBSURVKSBjc3NIZWFkID0gIiNjb250YWluZXIgI2NvbnRlbnRfbGVmdCwgYm9keVtuZXdzXSAjY29udGFpbmVyICNjb250ZW50X2xlZnQ+ZGl2Om5vdChbY2xhc3NdKTpub3QoW2lkXSkiOwogICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5HT09HTEUpIGNzc0hlYWQgPSAiLnNyZywgI3JzbywgI3Jzbz5kaXY6bm90KC5nKSwgI2twLXdwLXRhYi1vdmVydmlldyI7CiAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkJJTkcpIGNzc0hlYWQgPSAiI2JfY29udGVudCAjYl9yZXN1bHRzIjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuU09HT1UpIGNzc0hlYWQgPSAiI21haW4gLnJlc3VsdHMiOwogICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5ET0dFKSBjc3NIZWFkID0gIiNsaW5rc193cmFwcGVyIC5yZXN1bHRzLS1tYWluICNsaW5rcyI7CiAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgPT09IFNpdGVUeXBlLkRPR0UpIGNzc0hlYWQgPSAiI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW4gI2xpbmtzIjsKICAgICAgICAgICAgY29uc3Qgbm9kZTIgPSBhd2FpdCBjcmVhdGVfQ1NTX05vZGUoY3NzSGVhZCArICJ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNCwgbWlubWF4KDI1JSwxZnIpKTtncmlkLXRlbXBsYXRlLWFyZWFzOid4bWFpbiB4bWFpbiB4bWFpbiB4bWFpbic7fSIsCiAgICAgICAgICAgICAgIkFDLUZvdXJQYWdlRXhTdHlsZSIpOwogICAgICAgICAgICB0aGlzLmZsdXNoRG9tLmluc2VydChub2RlMiwgJ2hlYWQnKQogICAgICAgICAgfSwKICAgICAgICAgIC8vIOiwt+atjCArIOWkmuWIl+aooeW8j++8mk1BUksg6L+Z5Liq6ZyA6KaB5pu06auY55qE6L+Q6KGM6aKR546HCiAgICAgICAgICBnb29nbGVUd29MaW5lQ2hhbmdlOiBhc3luYyBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuR09PR0xFICYmIENPTlNULnVzZUl0ZW0uQWRzU3R5bGVNb2RlID49IDMpIHsKICAgICAgICAgICAgICBsZXQgbm9kZUxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuc3JnLCAjcnNvLCAjcnNvPmRpdiIpCgogICAgICAgICAgICAgIC8vIOWvueS6jui/meS6m+Wdl++8jOmDveWIpOWumuS4gOS4i+e7k+aehO+8jOWmguaenOWtkOiKgueCueS4rWRpduaVsOmHj+S4jei2szLkuKrnmoTvvIzpgqPkuYjkuKLlvINncmlk5biD5bGACiAgICAgICAgICAgICAgaWYgKG5vZGVMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIG5vZGVMaXN0LmZvckVhY2goKG5vZGUpID0+IHsKICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXMKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkRGl2Q291bnQgPSAwCiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnRElWJykgY2hpbGREaXZDb3VudCsrCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRGl2Q291bnQgPj0gMikgewogICAgICAgICAgICAgICAgICAgIG5vZGUuc3R5bGUuZGlzcGxheSAhPT0gJ2dyaWQnID8gbm9kZS5zdHlsZS5kaXNwbGF5ID0gJ2dyaWQnIDogJycKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBub2RlLnN0eWxlLmRpc3BsYXkgIT09ICd1bnNldCcgPyBub2RlLnN0eWxlLmRpc3BsYXkgPSAndW5zZXQnIDogJycKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIC8vIOeJueauiuWFg+e0oOS4gOihjOWkhOeQhgogICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIiNyc28+ZGl2Om5vdCguZyk+ZGl2W2pzbW9kZWxdIikuZm9yRWFjaChvbmUgPT4gewogICAgICAgICAgICAgICAgb25lLnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheSA9ICJ1bnNldCIKICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgIENPTlNULmZsdXNoTm9kZS5pbnNlcnQoYXdhaXQgY3JlYXRlX0NTU19Ob2RlKCcjcnNvPmRpdntkaXNwbGF5OiBncmlkO30nLCAiQUMtR29vZ2xlR3JpZERlbHRhLVN0eWxlIikpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBsb2FkUGxhaW5Ub0NTUzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvY3VtZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsZXQgY3VyTm9kZSA9IGRvY3VtZW50LmNoaWxkTm9kZXNbaV07CiAgICAgICAgICAgICAgaWYgKGN1ck5vZGUuZGVsKSBjdXJOb2RlLnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNhZmVSZW1vdmUoInN0eWxlW2NsYXNzKj0nQUMnXVtkZWw9JzEnXSIpOwogICAgICAgICAgfSwKICAgICAgICAgIC8vIOemgeatoueLrOeri+eahOagt+W8j+WKoOi9vQogICAgICAgICAgbG9hZENTU1RvUGxhaW46IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb2N1bWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGV0IGN1ck5vZGUgPSBkb2N1bWVudC5jaGlsZE5vZGVzW2ldOwogICAgICAgICAgICAgIC8vIOWmguaenOaYr+WtmOWcqGNzc++8jCDkuJTpnZ7lv4XpobvmlbDmja4KICAgICAgICAgICAgICBpZiAoY3VyTm9kZS50YXJnZXQgPT09ICJ4bWwtc3R5bGVzaGVldCIgJiYgY3VyTm9kZS5kYXRhLmluZGV4T2YoIm11c3Q9XCJ0cnVlIikgPCAwKSB7CiAgICAgICAgICAgICAgICBjdXJOb2RlLmRhdGEgPSAiIjsKICAgICAgICAgICAgICAgIGN1ck5vZGUuZGVsID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvLyDlr7nkuo5lZGdl5ZKMc2FmYXJp6YO954m55q6K5aSE55CG5LiA5LiL5ZCnCiAgICAgICAgICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVkZ2UiKSA+IDAgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInNhZmFyaSIpID4gMCkgewogICAgICAgICAgICAgICAgICBjdXJOb2RlLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgY29uc3QgQ29udHJvbE1hbmFnZXIgPSB7CiAgICAgICAgICAuLi5TdHlsZU1hbmdlciwKICAgICAgICAgIC8v5bGF5Lit5pi+56S6IC0tLSDlv4XpobvmmK/nmb7luqblkozosLfmrYznmoTmkJzntKLnu5PmnpzpobXpnaLvvIzlhbbku5bpobXpnaLkuI3og73liqDovb3nmoQtLeW3sue7j+mAmui/h+iEmuacrGluY2x1ZGXmoIfnrb7pmZDliLbkuobkuIDpg6jliIYKICAgICAgICAgIGNlbnRlckRpc3BsYXk6IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8g5aaC5p6c5piv55m+5bqmICYmICgo5Zyw5Z2A5pu/5o2iLT7ljIXlkKt3ZOWFs+mUruivjVvmm7/mjaLkuYvlkI7kuI3nrYkt5piv55m+5bqm57uT5p6c6aG16Z2iXSkgfHwg5pyJ5Y+z6L655qCPLeiCr+WumuaYr+eZvuW6puaQnOe0oue7k+aenOmhtSB8fCB2YWx1ZeS4reWtmOWcqOaQnOe0ouWGheWuuSkgcmV0dXJuOwogICAgICAgICAgICBpZiAoIWNoZWNrSVNCYWlkdU1haW4oKSkgewogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdub3QgZ29vZCBBdCBCYWlkdScpCiAgICAgICAgICAgICAgdGhpcy5sb2FkQ1NTVG9QbGFpbigpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmZsdXNoRG9tLmluc2VydChhd2FpdCBjcmVhdGVfQ1NTX05vZGUoIi5taW5pZGl2ICNsb2dvIGltZ3t3aWR0aDogMTAwcHg7aGVpZ2h0OiB1bnNldDttYXJnaW4tdG9wOiAwLjNyZW07fSBib2R5LnB1cmVjc3MtbW9kZTpiZWZvcmV7ZGlzcGxheTogbm9uZTt9IiwgIkFDLXN0eWxlLWxvZ28iKSkKICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHBhcnNlSW50KENPTlNULnVzZUl0ZW0uQWRzU3R5bGVNb2RlIHx8IC0xKTsKICAgICAgICAgICAgaWYgKGFjQ3NzTG9hZEZsYWcgPT09IGZhbHNlICYmIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5BQ0V4dGVuc2lvbiIpID09PSBudWxsKSB7CiAgICAgICAgICAgICAgZGVidWcoImlu5qC35byP5Y2z5bCG5Yqg6L29OiIgKyByZXN1bHQpOwogICAgICAgICAgICAgIGxldCBleHBhbmRTdHlsZSA9ICIjd3JhcHBlciAjcnMsICN3cmFwcGVyICNjb250ZW50X2xlZnQgLnJlc3VsdCwgI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCA+IC5jLWNvbnRhaW5lcnttaW4td2lkdGg6NjcwcHg7fS5jLXNwYW4xOHt3aWR0aDo3OCUhaW1wb3J0YW50O21pbi13aWR0aDo1NTBweDt9LmMtc3BhbjI0e3dpZHRoOiBhdXRvIWltcG9ydGFudDt9IjsKICAgICAgICAgICAgICBpZiAocmVzdWx0ID09PSAxKSB7IC8vIOWNleWIl+aooeW8jwogICAgICAgICAgICAgICAgdGhpcy5mbHVzaERvbS5pbnNlcnQoYXdhaXQgY3JlYXRlX0NTU19Ob2RlKGV4cGFuZFN0eWxlLCAiQUMtU3R5bGUtZXhwYW5kIikpCiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRDb21tb25TdHlsZSgpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSAyKSB7Ly/ljZXpobXlsYXkuK0KICAgICAgICAgICAgICAgIHRoaXMuZmx1c2hEb20uaW5zZXJ0KGF3YWl0IGNyZWF0ZV9DU1NfTm9kZShleHBhbmRTdHlsZSwgIkFDLVN0eWxlLWV4cGFuZCIpKQogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkQ29tbW9uU3R5bGUoKTsKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZE9uZVBhZ2VTdHlsZSgpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSAzKSB7IC8v5Y+M6aG15bGF5LitCiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRDb21tb25TdHlsZSgpOwogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkVHdvUGFnZVN0eWxlKCk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT09IDQpIHsgLy8g5LiJ5YiXCiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRDb21tb25TdHlsZSgpOwogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkVHdvUGFnZVN0eWxlKCk7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRUaHJlZVBhZ2VTdHlsZSgpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSA1KSB7IC8vIOWbm+WIlwogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkQ29tbW9uU3R5bGUoKTsKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFR3b1BhZ2VTdHlsZSgpOwogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRm91clBhZ2VTdHlsZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBhY0Nzc0xvYWRGbGFnID0gdHJ1ZTsKICAgICAgICAgICAgICBkZWJ1ZygiaW7moLflvI/ov5DooYznu5PmnZ8iKTsKICAgICAgICAgICAgICBpZiAoY3VyU2l0ZS5TaXRlVHlwZUlEID09PSBTaXRlVHlwZS5CQUlEVSAmJiBBQ0NvbmZpZy5TdHlsZV9CYWlkdUxpdGUgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgIC8vIEFDX2FkZFN0eWxlKEdNX2dldFJlc291cmNlVGV4dCgiYmFpZHVMaXRlU3R5bGUiKSwgIkFDLWJhaWR1TGl0ZVN0eWxlIiwgImhlYWQiKQogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkQmFpZHVMaXRlU3R5bGUoKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHNhZmVXYWl0RnVuYygnYm9keScsIGFzeW5jICgpID0+IHsKICAgICAgICAgICAgICAgIGlmKHJlc3VsdCA+IDApIHsgLy8g6Z2e5Y6f5aeL5qih5byP5LiLCiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZEJnSW1hZ2UoKQogICAgICAgICAgICAgICAgICBDT05TVC51c2VJdGVtLmRlZmF1bHRCZ1VybCAmJiBDT05TVC51c2VJdGVtLkJnRml0ICYmIGF3YWl0IHRoaXMubG9hZEJnQXV0b0ZpdCgpCiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgncHVyZWNzcy1tb2RlJykKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgncHVyZWNzcy1tb2RlJykKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgIHRoaXMuZmx1c2hEb20uZmx1c2goKQogICAgICAgICAgICAgIC8vIGZsdXNo5a6M5oiQ5LmL5ZCO77yM562J5LiA562J5Y+Y5pu077yM5riy5p+T5beu5LiN5aSa5LmL5ZCO5YaN5Yi35pawCiAgICAgICAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdvb2dsZVR3b0xpbmVDaGFuZ2UoKQogICAgICAgICAgICAgIH0sIDYwMCkKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmxvYWRQbGFpblRvQ1NTKCk7CiAgICAgICAgICAgIGlmIChjdXJTaXRlLlNpdGVUeXBlSUQgIT09IFNpdGVUeXBlLkJBSURVICYmIGN1clNpdGUuU2l0ZVR5cGVJRCAhPT0gU2l0ZVR5cGUuQkFJRFVfWFVFU0hVICYmIGN1clNpdGUuU2l0ZVR5cGVJRCAhPT0gU2l0ZVR5cGUuR09PR0xFICYmIGN1clNpdGUuU2l0ZVR5cGVJRCAhPT0gU2l0ZVR5cGUuQklORyAmJiBjdXJTaXRlLlNpdGVUeXBlSUQgIT09IFNpdGVUeXBlLlNPR09VICYmIGN1clNpdGUuU2l0ZVR5cGVJRCAhPT0gU2l0ZVR5cGUuRFVDSyAmJiBjdXJTaXRlLlNpdGVUeXBlSUQgIT09IFNpdGVUeXBlLkRPR0UpIHJldHVybjsKCiAgICAgICAgICAgIC8vIOWmguaenOaYr+iwt+atjCAmJiAo5Zyw5Z2A5pu/5o2iLT7mmK/osLfmrYzlm77lg4/pobXpnaIgfHwg5piv5Zyw5Zu+6aG16Z2iKVvmm7/mjaLopoHlj5hdIHJldHVybjsKICAgICAgICAgICAgaWYgKGN1clNpdGUuU2l0ZVR5cGVJRCA9PT0gU2l0ZVR5cGUuR09PR0xFICYmIGxvY2F0aW9uLmhyZWYucmVwbGFjZSgvdGJtPShpc2NofGxjbHxzaG9wfGZsbSkvLCAiIikgIT09IGxvY2F0aW9uLmhyZWYpIHsKICAgICAgICAgICAgICB0aGlzLmxvYWRDU1NUb1BsYWluKCk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICB0aGlzLmh1eWFuQ2hlY2tBbmRMb2FkKCkKICAgICAgICAgICAgdGhpcy5mbHVzaENoZWNrQW5kTG9hZCgpCiAgICAgICAgICB9LAogICAgICAgICAgZmx1c2hEb206IG5ldyBGbHVzaERvbUZyYWdtZW50KCksCiAgICAgICAgICBodXlhblRpbWVyOiAwLAogICAgICAgICAgZmx1c2hUaW1lcjogMCwKICAgICAgICAgIGh1eWFuQ2hlY2tBbmRMb2FkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLyoq5oqk55y8U3R5bGXmnIDlkI7ovb3lhaUqKi8KICAgICAgICAgICAgaWYgKENPTlNULnVzZUl0ZW0uSHVZYW5Nb2RlID09PSB0cnVlKXsKICAgICAgICAgICAgICB0aGlzLmxvYWRIdVlhblN0eWxlKCkKICAgICAgICAgICAgfQogICAgICAgICAgICBpZighdGhpcy5odXlhblRpbWVyKSB7CiAgICAgICAgICAgICAgdGhpcy5odXlhblRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInN0eWxlW2NsYXNzKj0nZGFya3JlYWRlciddIikgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICB0aGlzLmxvYWRIdVlhblN0eWxlKCkKICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmh1eWFuVGltZXIpCiAgICAgICAgICAgICAgICAgIHRoaXMuaHV5YW5UaW1lciA9IDAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LCAxMDApCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBmbHVzaENoZWNrQW5kTG9hZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmKCF0aGlzLmZsdXNoVGltZXIpIHsKICAgICAgICAgICAgICB0aGlzLmZsdXNoVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoRG9tLmZsdXNoKCkKICAgICAgICAgICAgICB9LCA2MDApCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmIChDT05TVC5pc0dvb2dsZUltYWdlVXJsKSByZXR1cm47CiAgICAgICAgICAgIHRoaXMuY2VudGVyRGlzcGxheSgpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIENvbnRyb2xNYW5hZ2VyCiAgICAgIH0KICAgIH0KICB9KSgpOwp9KCk7Cg==","resources":[{"meta":{"name":"baiduCommonStyle.less","url":"http://ibaidu.tujidu.com/newcss/baiduCommonStyle.less?t=26.04","ts":1670421065925,"mimetype":"text/plain"},"source":"LyoqU3RvcmUgQmFpZHVDb21tb25TdHlsZSoqLw0KaWZyYW1lOm5vdChbc3JjKj0nY2hyb21lJ10pLA0KLnJlc190b3BfYmFubmVyICNmb290LA0KI3BhZ2UgLmZrLA0KI2hlYWQgLmhlYWRCbG9jaywNCiNyc190b3BfbmV3LA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCA+IHRhYmxlLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAuYy1yZWNvbW1lbmQsDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5sZWZ0QmxvY2ssDQojd3JhcHBlciAjY29udGVudF9sZWZ0IC5ycmVjb20tYnRuLXBhcmVudCwNCiNkZW1vLA0KI3dyYXBwZXIgI2dvdG9QYWdlLA0KYm9keSA+IGRpdi5yZXN1bHQtb3AsDQoucnJlY29tLWNvbnRhaW5lciwNCi5jaHVud2FuLXdyYXBwZXIgew0KICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7DQp9DQoNCmJvZHlbYmFpZHVdIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsNCiAgLyp0cmFuc2l0aW9uOiBhbGwgZWFzZS1vdXQgMC44czsqLw0KfQ0KDQojYWxhX2ltZ19yZXN1bHRzIHsNCiAgb3ZlcmZsb3c6IGhpZGRlbjsNCn0NCg0KYm9keSBhLA0KYm9keSBhIGVtLA0KI3UgYSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLnJlc3VsdCBoMyBhIGVtew0KICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQp9DQoNCmJvZHkgYTpob3ZlciwNCmJvZHkgYTpob3ZlciBlbSB7DQogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCn0NCg0KI3dyYXBwZXIgI3NfdGFiIHsNCiAgYm9yZGVyLWJvdHRvbTogI2UwZTBlMCAxcHggc29saWQ7DQogIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7DQp9DQoNCmJvZHkgI2hlYWQgew0KICB0b3A6IDA7DQogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjQ4LCAyNDgsIDI0OCwgMC40KTsNCiAgYm9yZGVyLWJvdHRvbTogbm9uZTsNCiAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpDQp9DQoNCmZvcm0uZm0gew0KICBiYWNrZ3JvdW5kLWNvbG9yOiB1bnNldDsNCg0KICAuc19idG4gew0KICAgIGJhY2tncm91bmQ6ICMzNDc2ZDI7DQogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzNDc2ZDI7DQoNCiAgICAmOmhvdmVyIHsNCiAgICAgIGJhY2tncm91bmQ6ICM0RjdGYkY7DQogICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzM0NzZkMjsNCiAgICB9DQogIH0NCg0KICAuYmRzdWcgbGkgew0KICAgIHdpZHRoOiBhdXRvOw0KICAgIGNvbG9yOiAjMDAwOw0KICAgIGZvbnQ6IDE1cHggYXJpYWw7DQogICAgbGluZS1oZWlnaHQ6IDI2cHg7DQogIH0NCg0KICAuc19pcHRfd3IuYmcgew0KICAgIGJhY2tncm91bmQ6ICNmZmY7DQogICAgd2lkdGg6IDY2JTsNCiAgICBtaW4td2lkdGg6IDU3MHB4Ow0KICB9DQoNCn0NCg0KI2NvbnRlbnRfbGVmdCAubmV3LXBtZCAuYy1zcGFuOSwNCiNjb250ZW50X2xlZnQgLm5ldy1wbWQgLmMtc3BhbjEwIHsNCiAgd2lkdGg6IHVuc2V0Ow0KICBmbG9hdDogdW5zZXQ7DQp9DQoNCi8qKipmaXggMmsrIHByb2JsZW0qKiovDQojaGVhZCAuaGVhZF93cmFwcGVyIHsNCiAgd2lkdGg6IHVuc2V0OyAvKmVkaXQ6IGZpeCBiYWlkdSBiYW5uZXIgcG9zaXRpb24qLw0KfQ0KDQojd3JhcHBlciAjc190YWIgYiB7DQogIGNvbG9yOiAjMzQ3NmQyOw0KICBib3JkZXItYm90dG9tOiAzcHggIzM0NzZkMiBzb2xpZDsNCn0NCg0KI3dyYXBwZXIgLmhlYWRfbnVtc19jb250X291dGVyIC5zZWFyY2hfdG9vbF9jb250ZXIsDQojd3JhcHBlciAuaGVhZF9udW1zX2NvbnRfb3V0ZXIgLm51bXMgew0KICB3aWR0aDogNjMwcHg7DQp9DQoNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgew0KICBhbmltYXRpb24tbmFtZTogYW5pX3RvcFRvYnV0dG9tOw0KICBhbmltYXRpb24tZHVyYXRpb246IC4xczsNCiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsNCn0NCg0KI2hlYWQgLmhlYWRfd3JhcHBlciB7DQogIGFuaW1hdGlvbi1uYW1lOiBhbmlfbGVmdFRvcmlnaHQ7DQogIGFuaW1hdGlvbi1kdXJhdGlvbjogMC4yczsNCiAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsNCn0NCg0KI3dyYXBwZXIgI3JzLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0LA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0LW9wLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCA+IC5jLWNvbnRhaW5lciB7DQogIHdpZHRoOiA2NzBweDsNCiAgcGFkZGluZzogMCA4cHggMTVweCAyMHB4Ow0KICBtYXJnaW4tdG9wOiAwOw0KICBtYXJnaW4tbGVmdDogMDsNCiAgbWFyZ2luLWJvdHRvbTogMzBweDsNCiAgYm9yZGVyLXJhZGl1czogMDsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsNCiAgYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpOw0KICANCiAgZGl2W2NsYXNzKj0nc2luZ2xlLWNhcmQtd3JhcHBlciddIHsNCiAgICB3aWR0aDogOTglOw0KICB9DQp9DQoNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgPiAuYy1jb250YWluZXI6aG92ZXIsDQojd3JhcHBlciAjY29udGVudF9sZWZ0ID4gLnJlc3VsdDpob3ZlciwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgPiAucmVzdWx0LW9wOmhvdmVyLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCA+IC5jLWNvbnRhaW5lcjpob3ZlciBhcnRpY2xlIHsNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAuMyk7DQogIGJveC1zaGFkb3c6IDAgMCAxcHggZ3JleTsNCn0NCg0KI3dyYXBwZXIgI3JzW2FjLW5lZWRoaWRlXSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgPiAucmVzdWx0W2FjLW5lZWRoaWRlXSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgPiAucmVzdWx0LW9wW2FjLW5lZWRoaWRlXSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgPiAuYy1jb250YWluZXJbYWMtbmVlZGhpZGVdIHsNCiAgcGFkZGluZzogNXB4Ow0KICBwYWRkaW5nLWxlZnQ6IDE1cHg7DQp9DQoNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgPiAucmVzdWx0W3RwbD0nc29mdCddIC5vcC1zb2Z0LXRpdGxlLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCA+IC5yZXN1bHQgaDNbY2xhc3N+PSd0J10sDQojd3JhcHBlciAjY29udGVudF9sZWZ0ID4gLmMtY29udGFpbmVyIGgzW2NsYXNzfj0ndCddIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsNCiAgbWFyZ2luOiAwcHggLThweCAxMHB4IC0yMHB4Ow0KICBwYWRkaW5nOiA4cHggMjBweCA1cHg7DQogIGJvcmRlci1yYWRpdXM6IDVweCA1cHggMCAwOw0KfQ0KDQojd3JhcHBlciAjY29udGVudF9sZWZ0IHsNCiAgLmYxMyBhLA0KICAuZjEzIGVtLA0KICAuYy1zcGFuMTggYSwNCiAgLnN1YkxpbmtfZmFjdG9yeSBhLA0KICAuc3ViTGlua19hbnN3ZXIgYSwNCiAgLmMtdGFicy1jb250ZW50IGEsDQogIC5vcF9vZmZpY2FsX3dlaWJvX2NvbnRlbnQgYSwNCiAgLm9wX29mZmljYWxfd2VpYm9fcHogYSwNCiAgLm9wX3RpZWJhMl90YWJsaW5rc19jb250YWluZXIgYSwNCiAgLm9wLXRpZWJhLWdlbmVyYWwtcmlnaHQsDQogIC5vcF9kcTAxX3RpdGxlLA0KICAub3BfZHEwMV90YWJsZSBhLA0KICAub3BfZHEwMV9tb3JlbGluayBhLA0KICAub3AtdGllYmEtZ2VuZXJhbC1tYWlucGwgYSwNCiAgLm9wLXNlLWxpc3Rlbi1yZWNvbW1lbmQsDQogIC5jLW9mZnNldCA+IGRpdiBhIHsNCiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQogICAgY29sb3I6ICMzNDc2ZDI7DQoNCiAgICAmOmhvdmVyIHsNCiAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lICFpbXBvcnRhbnQ7DQogICAgfQ0KICB9DQp9DQoNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLmYxMyBhIHsNCiAgY29sb3I6ICMwMDgwMDA7DQp9DQoNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLmMtc3BhbjE4LA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAuYy1zcGFuMjQgew0KICB3aWR0aDogMTAwJTsNCiAgbWluLXdpZHRoOiB1bnNldDsNCn0NCg0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCB7DQoNCiAgLm9wX2ppbmd5YW5fbGlzdCwNCiAgLnNlX2NvbV9pcnJlZ3VsYXJfZ2FsbGVyeSB1bCBsaSwNCiAgLnJlc3VsdCAub3AtaW1nLWFkZHJlc3MtbGluay10eXBlIHsNCiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogICAgbWFyZ2luLWxlZnQ6IDEwcHg7DQogIH0NCg0KICAuYy1ib3JkZXIgew0KICAgIHdpZHRoOiBhdXRvOw0KICAgIGJvcmRlcjogbm9uZTsNCiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDsNCiAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50Ow0KICAgIGJveC1zaGFkb3c6IDAgMCAwIHRyYW5zcGFyZW50Ow0KICB9DQp9DQoNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgew0KICAub3Atc29mdC10aXRsZSwNCiAgLnJlc3VsdCwNCiAgLnJlc3VsdC1vcCwNCiAgJiA+IC5jLWNvbnRhaW5lciB7DQoNCiAgICBoM1tjbGFzc349J3QnXSB7DQogICAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgIH0NCg0KICAgIGEgew0KICAgICAgY29sb3I6ICMzNDc2ZDI7DQogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQoNCiAgICAgIGVtIHsNCiAgICAgICAgY29sb3I6ICNmNzMxMzE7DQogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgICAgfQ0KDQogICAgICAmOnZpc2l0ZWQgew0KICAgICAgICBjb2xvcjogIzY2MDA5OTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICBhLCBhOnZpc2l0ZWQgew0KICAgICAgJjphZnRlciB7DQogICAgICAgIGNvbnRlbnQ6ICIiOw0KICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7DQogICAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjMzQ3NmQyOw0KICAgICAgICBib3R0b206IC0ycHg7DQogICAgICAgIGxlZnQ6IDEwMCU7DQogICAgICAgIHdpZHRoOiAwOw0KICAgICAgICB0cmFuc2l0aW9uOiB3aWR0aCAzNTBtcywgbGVmdCAzNTBtczsNCiAgICAgIH0NCg0KICAgICAgJjpob3ZlcjphZnRlciB7DQogICAgICAgIGxlZnQ6IDA7DQogICAgICAgIHdpZHRoOiAxMDAlOw0KICAgICAgICB0cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCB7DQogIC5jLWdyb3VwLXdyYXBwZXIgew0KICAgIHBhZGRpbmc6IDMwcHg7DQogICAgbWFyZ2luOiAwIDAgMjBweCAwOw0KICAgIG1pbi13aWR0aDogNjEwcHg7DQoNCiAgICAmPiAuYy1jb250YWluZXIgew0KICAgICAgbWluLXdpZHRoOiB1bnNldDsNCiAgICB9DQoNCiAgICAuYy1ncm91cCB7DQogICAgICBtYXJnaW46IDA7DQogICAgICBwYWRkaW5nLXRvcDogMTBweDsNCiAgICB9DQogIH0NCn0NCg0KI3dyYXBwZXIgI3JzIHsNCiAgcGFkZGluZzogdW5zZXQ7DQogIG1hcmdpbjogMjBweDsNCiAgYm9yZGVyLXJhZGl1czogNXB4Ow0KICB6LWluZGV4OiAxOw0KDQogIC5uZXctcG1kIHsNCiAgICBwYWRkaW5nOiAyMHB4Ow0KICB9DQoNCiAgLnR0IHsNCiAgICBtYXJnaW46IC0yMHB4IC0yMHB4IDVweCAtMjBweDsNCiAgICBwYWRkaW5nOiAxNXB4IDIwcHg7DQogICAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsNCiAgICBib3JkZXItcmFkaXVzOiA1cHggNXB4IDBweCAwcHg7DQogIH0NCg0KICB0YWJsZSB7DQogICAgd2lkdGg6IDYzMHB4Ow0KICAgIHBhZGRpbmc6IDVweCAxNXB4Ow0KDQogICAgdHIgYSB7DQogICAgICBtYXJnaW4tdG9wOiA1cHg7DQogICAgICBtYXJnaW4tYm90dG9tOiA1cHg7DQogICAgICBjb2xvcjogIzM0NzZkMjsNCiAgICB9DQoNCiAgICB0ciBhOmhvdmVyIHsNCiAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOw0KICAgIH0NCiAgfQ0KfQ0KDQoud3JhcHBlcl9uZXcgI2Zvcm0gLmJkc3VnLW5ldyB7DQogIHBhZGRpbmctcmlnaHQ6IDExcHg7DQp9DQoNCiN3cmFwcGVyICNwYWdlIHsNCiAgbWluLXdpZHRoOiA3MTBweDsNCiAgaGVpZ2h0OiA0MHB4Ow0KICBsaW5lLWhlaWdodDogNDBweDsNCiAgcGFkZGluZy10b3A6IDVweDsNCiAgbWFyZ2luLWJvdHRvbTogNTBweDsNCiAgbWFyZ2luLWxlZnQ6IDA7DQoNCiAgYSwNCiAgc3Ryb25nIHsNCiAgICBjb2xvcjogIzM0NzZkMjsNCiAgICBoZWlnaHQ6IGF1dG87DQogIH0NCg0KICAubiB7DQogICAgaGVpZ2h0OiAzNHB4Ow0KICB9DQoNCiAgLm46aG92ZXIsDQogIGE6aG92ZXIgLnBjIHsNCiAgICBiYWNrZ3JvdW5kOiAjZDhkOGQ4Ow0KICAgIGNvbG9yOiAjMDA1N2RhOw0KICAgIGZpbHRlcjogYnJpZ2h0bmVzcygxLjEpOw0KICB9DQoNCiAgc3Ryb25nIC5wYyB7DQogICAgYmFja2dyb3VuZDogIzM0NzZkMjsNCiAgICBjb2xvcjogd2hpdGU7DQogIH0NCg0KfQ0KDQoub3AtaW1nLWFkZHJlc3MtZGVza3RvcC1jb250IHsNCiAgb3ZlcmZsb3c6IGhpZGRlbjsNCn0NCg0KLm9wLWltZy1hZGRyZXNzLWRpdmlkZS1oaWdoIHsNCiAgb3ZlcmZsb3c6IGhpZGRlbjsNCn0NCg0KI3dyYXBwZXIgI2t3IHsNCiAgd2lkdGg6IDk0JTsNCn0NCg0KI2NvbnRhaW5lci5zYW1fbmV3Z3JpZCAuYy1jb250YWluZXIgLnQgLkFDLWZhdmljb25UIH4gYSwgI2NvbnRhaW5lci5zYW1fbmV3Z3JpZCAuYy1jb250YWluZXIgLnQgLmMtaWNvbiB+IGEgew0KICBkaXNwbGF5OiBpbmxpbmUNCn0NCg0KYm9keSAjd3JhcHBlciAjY29udGVudF9sZWZ0IGFbaHJlZio9J29mZmljaWFsJ10gew0KICBjb2xvcjogd2hpdGU7DQp9DQoNCiNjb250ZW50X2xlZnQgLmMtZ3JvdXAtbWlkZGxlLCAjY29udGVudF9sZWZ0IC5jLWdyb3VwLXRvcCB7DQogIG1hcmdpbi1ib3R0b206IDMwcHggIWltcG9ydGFudDsNCn0NCg0KI2NvbnRhaW5lci5zYW1fbmV3Z3JpZCAjY29udGVudF9sZWZ0IC5jLWNvbnRhaW5lciAuYy1jb250YWluZXIgew0KICB3aWR0aDogYXV0bzsNCiAgbWluLXdpZHRoOiB1bnNldDsNCn0NCg0KI2NvbnRhaW5lci5zYW1fbmV3Z3JpZCAjY29udGVudF9yaWdodCAucmlnaHQtY2VpbGluZyB7DQogIHBvc2l0aW9uOiB1bnNldDsgLy8gw6nCgcK/w6XChcKNw6nCh8KNw6XCj8Kgw6XCnMKow6TCuMKAw6jCtcK3DQp9DQoNCi5jLWNvbnRhaW5lciAuYy1yZXN1bHQtY29udGVudCB7DQogIHBhZGRpbmctdG9wOiAyMHB4Ow0KfQ0KDQojd3JhcHBlciAjY29udGVudF9sZWZ0ID4gLmMtY29udGFpbmVyIGFydGljbGUgew0KICBwYWRkaW5nLXRvcDogMTVweDsNCiAgYm9yZGVyOiB1bnNldCAhaW1wb3J0YW50Ow0KICBib3gtc2hhZG93OiB1bnNldCAhaW1wb3J0YW50Ow0KfQ0KDQpib2R5IC53cmFwcGVyX25ldyAjaGVhZC5maXgtaGVhZCAuc19mb3JtIHsNCiAgaGVpZ2h0OiA3MHB4Ow0KfQ0KDQouQUMuc3Atc2VwYXJhdG9yIHsNCiAgbWFyZ2luLXRvcDogLTEwcHg7DQogIHdpZHRoOiA2NTBweDsNCn0NCg0KI3dyYXBwZXIgI2NvbnRlbnRfcmlnaHQgew0KICB3aWR0aDogMDsNCiAgaGVpZ2h0OiAwOw0KICBvdmVyZmxvdzogaGlkZGVuOw0KICBvcGFjaXR5OiAwOw0KfQ0KDQpib2R5LnNob3dSaWdodCB7DQogIA0KICAvLyDDpcKPwqrDqMKDwr3DqcKHwofDp8KUwqjDqMK/wpnDp8Knwo3DpsKWwrnDpsKhwojDpsKdwqXDpcKvwrnDpcKFwrbDqMK/wpvDqMKhwozDqcKawpDDqMKXwo/Dr8K8wozDpcKQwqbDpcKIwpnDpMK8wprDpcKvwrzDqMKHwrTDp8KZwr7DpcK6wqbDqcKhwrXDqcKdwqLDpcKKwqDDqMK9wr3DqcKdwp7DpcK4wrjDp8K8wpPDpsKFwqINCiAgI3dyYXBwZXIgI2NvbnRlbnRfcmlnaHQgew0KICAgIHdpZHRoOiA0MDBweDsgLy8gdXNlIHRoaXMgdmFsdWUgYXMgZGVmYXVsdA0KICAgIGhlaWdodDogdW5zZXQ7DQogICAgb3ZlcmZsb3c6IHVuc2V0Ow0KICAgIG9wYWNpdHk6IDE7DQogIH0NCn0NCg0KLnJlc3VsdC1tb2xlY3VsZSAjcGFnZSA+IGRpdiB7DQogIHdpZHRoOiB1bnNldDsNCn0NCg0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCA+IC5jLWNvbnRhaW5lclt0cGw9J3JlY29tbWVuZF9saXN0J10gew0KICBwYWRkaW5nLXRvcDogMTBweDsNCiAgZGlzcGxheTogZmxleDsNCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCn0NCg0KI2NvbnRlbnRfbGVmdCAuaGl0LXRvcHRpcCB7DQogIGdyaWQtY29sdW1uLXN0YXJ0OiAxOw0KICBncmlkLWNvbHVtbi1lbmQ6IHhtYWluLWVuZDsNCn0NCg0KQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogMTI4MHB4KSB7DQogICN1IC50b2luZGV4LCAjdSAjaW1zZyB7DQogICAgZGlzcGxheTogbm9uZTsNCiAgfQ0KfQ0KDQoud3JhcHBlcl9uZXcgI3NfdGFiLnNfdGFiIC5zX3RhYl9pbm5lcnsNCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCg0KICAmID4gKjphZnRlciB7DQogICAgZGlzcGxheTogbm9uZTsgLy8gw6TCuMKLw6XCiMKSw6fCusK/IG5vbmXDpsKOwokNCiAgfQ0KfQ0KDQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxOTIxcHgpIHsNCiAgLypCYWlkdSBpbiAySyBzY3JlZW4gZGVmYXVsdCBpbiA6IGNlbnRlciovDQogICNoZWFkIC5oZWFkX3dyYXBwZXIgew0KICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwcHgpOw0KICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICAgIGRpc3BsYXk6IGZsZXg7DQogIH0NCiAgDQogIGJvZHlbYmFpZHVdIHsNCiAgICAud3JhcHBlcl9uZXcgI3NfdGFiLnNfdGFiIC5zX3RhYl9pbm5lcnsNCiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICANCiAgICAgICYgPiAqOmFmdGVyIHsNCiAgICAgICAgZGlzcGxheTogbm9uZTsgLy8gw6TCuMKLw6XCiMKSw6fCusK/IG5vbmXDpsKOwokNCiAgICAgIH0NCiAgICB9DQogICAgDQogICAgI2NvbnRhaW5lci5zYW1fbmV3Z3JpZCB7DQogICAgICBwYWRkaW5nLWxlZnQ6IDMxNnB4Ow0KICAgIH0NCiAgfQ0KDQogIGZvcm0uZm0gLnNfaXB0X3dyLmJnIHsNCiAgICBtaW4td2lkdGg6IDQ4MHB4Ow0KICB9DQoNCiAgYm9keS5zaG93UmlnaHQgew0KICAgICNoZWFkIC5oZWFkX3dyYXBwZXIgew0KICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEyMHB4KTsNCiAgICB9DQogIH0NCn0NCg=="},{"meta":{"name":"baiduOnePageStyle.less","url":"http://ibaidu.tujidu.com/newcss/baiduOnePageStyle.less?t=26.04","ts":1670421065928,"mimetype":"text/plain"},"source":"LyoqU3RvcmUgQmFpZHVPbmVQYWdlU3R5bGUqKi8NCiN3cmFwcGVyX3dyYXBwZXIgI2NvbnRhaW5lciB7DQogIHdpZHRoOiAxMDAlOw0KICBtYXJnaW4tbGVmdDogdW5zZXQ7DQp9DQoNCmZvcm0uZm0gew0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQogIGJhY2tncm91bmQtY29sb3I6IHVuc2V0Ow0KfQ0KDQpib2R5W2JhaWR1XSAucGFnZWZvb3QuZ2ogew0KICBtYXJnaW4tdG9wOiAxMDBweDsNCn0NCg0KLndyYXBwZXJfbmV3IC5oZWFkX3dyYXBwZXIgI3Jlc3VsdF9sb2dvIHsNCiAgbWFyZ2luLWxlZnQ6IC0xNTBweDsNCiAgcG9zaXRpb246IHJlbGF0aXZlOw0KfQ0KDQojc190YWIgYiwgI3NfdGFiIGEgew0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQp9DQoNCiN3cmFwcGVyIC5oZWFkX251bXNfY29udF9vdXRlciB7DQogIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgbGVmdDogMjAlOw0KICB3aWR0aDogNjAlOw0KfQ0KDQojd3JhcHBlciAjY29udGVudF9sZWZ0IHsNCiAgbWFyZ2luOiAwIGF1dG8gIWltcG9ydGFudDsNCiAgcGFkZGluZy1sZWZ0OiB1bnNldCAhaW1wb3J0YW50Ow0KfQ0KDQojd3JhcHBlcl93cmFwcGVyICNjb250YWluZXIgI2hlYWRlcl90b3BfYmFyIHsNCiAgbWFyZ2luOiAwIGF1dG87DQp9DQoNCiN3cmFwcGVyICNjb250ZW50X2xlZnQsICN3cmFwcGVyICNjb250YWluZXIuc2FtX25ld2dyaWQgI3JzLCAjd3JhcHBlciAjcGFnZSB7DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgcGFkZGluZy1sZWZ0OiAwcHg7DQogIHdpZHRoOiA0MCUgIWltcG9ydGFudDsNCiAgbWluLXdpZHRoOiA2NzBweDsNCiAgZmxvYXQ6IHVuc2V0Ow0KICBtYXJnaW4tbGVmdDogdW5zZXQ7DQogIG1hcmdpbjogMCBhdXRvOw0KfQ0KDQojd3JhcHBlciAjcGFnZSB7DQogIGJhY2tncm91bmQ6IHVuc2V0Ow0KfQ0KDQojd3JhcHBlciAjcnMgdGggew0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCiN3cmFwcGVyICNycyB7DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgbWFyZ2luOiAzMHB4IGF1dG8gLTIwcHggYXV0bzsNCn0NCg0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0LA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0LW9wLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCBkaXZbY2xhc3MqPSd2bXAtcHJvamVjdCddLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCA+IC5jLWNvbnRhaW5lciB7DQogIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7DQogIG1pbi13aWR0aDogNjUwcHg7DQp9DQoNCkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEwMDBweCkgew0KICAjd3JhcHBlciAjY29udGVudF9sZWZ0LCAjd3JhcHBlciAjcnMgew0KICAgIG1pbi13aWR0aDogODAwcHg7DQogIH0NCn0NCg0KI3dyYXBwZXIgI2NvbnRhaW5lci5zYW1fbmV3Z3JpZCAjY29udGVudF9sZWZ0IHsNCiAgcGFkZGluZy1sZWZ0OiAyMHB4Ow0KICBkaXNwbGF5OiBibG9jazsNCn0NCg0KI3dyYXBwZXIgI2NvbnRlbnRfcmlnaHQgew0KICBmbG9hdDogdW5zZXQ7DQogIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCn0NCg0KYm9keS5zaG93UmlnaHQgI3dyYXBwZXIgI2NvbnRhaW5lci5zYW1fbmV3Z3JpZCAjY29udGVudF9sZWZ0IHsNCiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKGNhbGMoNnZ3IC0gMjUxcHgpKTsNCn0NCg0KYm9keS5zaG93UmlnaHQgI3dyYXBwZXIgI2NvbnRlbnRfcmlnaHQgew0KICByaWdodDogY2FsYygzNy41dncgLSA0NzBweCk7DQp9DQoNCkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEyODBweCkgew0KICBib2R5LnNob3dSaWdodCAjd3JhcHBlciAjY29udGFpbmVyLnNhbV9uZXdncmlkICNjb250ZW50X2xlZnQgew0KICAgIHRyYW5zZm9ybTogdW5zZXQ7DQogIH0NCg0KICBib2R5LnNob3dSaWdodCAjd3JhcHBlciAjY29udGVudF9yaWdodCB7DQogICAgd2lkdGg6IDA7DQogICAgaGVpZ2h0OiAwOw0KICAgIG92ZXJmbG93OiBoaWRkZW47DQogICAgb3BhY2l0eTogMDsNCiAgfQ0KfQ0KDQojd3JhcHBlciAjcGFnZSBhLCAjd3JhcHBlciAjcGFnZSBzdHJvbmcgew0KICBtYXJnaW4tcmlnaHQ6IDIycHggIWltcG9ydGFudDsNCn0NCg0KI3dyYXBwZXIgI3BhZ2UgLnBhZ2UtaW5uZXIgew0KICBwYWRkaW5nLWxlZnQ6IDIycHg7DQogIGRpc3BsYXk6IGZsZXg7DQogIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KfQ0KDQojY29udGFpbmVyIC5oaW50X2NvbW1vbl9yZXN0b3Agew0KICBwb3NpdGlvbjogYWJzb2x1dGU7DQogIGxlZnQ6IGNhbGMoNDV2dyAtIDUwMHB4KTsNCiAgbWFyZ2luLXRvcDogMjVweDsNCn0NCg0KLkFDLnNwLXNlcGFyYXRvciB7DQogIHdpZHRoOiBhdXRvOw0KfQ0KDQovKnNlYXJjaCBlbmdpbmUganVtcCovDQojc2VqLWNvbnRhaW5lciB7DQogIHBhZGRpbmctbGVmdDogMDsNCiAgbWFyZ2luLWxlZnQ6IDA7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KLnNfZm9ybV93cmFwcGVyIHsNCiAgZGlzcGxheTogZmxleDsNCiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQp9DQoNCiN3cmFwcGVyICNzX3RhYiB7DQogIHBhZGRpbmctbGVmdDogMDsNCiAgbWFyZ2luLWxlZnQ6IDA7DQogIGRpc3BsYXk6IGZsZXg7DQogIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KfQ0KDQojd3JhcHBlciAjY29udGFpbmVyIC5oZWFkX251bXNfY29udF9vdXRlciAuc2VhcmNoX3Rvb2xfY29udGVyLA0KI3dyYXBwZXIgI2NvbnRhaW5lciAuaGVhZF9udW1zX2NvbnRfb3V0ZXIgLm51bXMgew0KICB3aWR0aDogNjklOw0KICBtYXJnaW4tbGVmdDogMTYlOw0KfQ0KDQpmb3JtLmZtIC5zX2lwdF93ci5iZyB7DQogIG1pbi13aWR0aDogY2FsYygzNy41dncgLSAxNTBweCk7DQp9DQoNCi5yZXN1bHQtbW9sZWN1bGUubmV3LXBtZCB7DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgei1pbmRleDogMjMzOw0KDQogIG1pbi13aWR0aDogODAwcHg7DQogIHdpZHRoOiA0MCUgIWltcG9ydGFudDsNCiAgbWFyZ2luLXRvcDogNnB4Ow0KICBwYWRkaW5nLWxlZnQ6IDAgIWltcG9ydGFudDsNCiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOw0KICBtYXJnaW4tbGVmdDogNTAlICFpbXBvcnRhbnQ7DQp9DQoNCi5zaG93UmlnaHQgew0KICAucmVzdWx0LW1vbGVjdWxlLm5ldy1wbWQgew0KICAgICZbdHBsPSJhcHAvcnMiXSB7DQogICAgICBtYXJnaW4tbGVmdDogNDQlICFpbXBvcnRhbnQ7DQogICAgfQ0KDQogICAgJlt0cGw9ImFwcC9wYWdlIl0gew0KICAgICAgcGFkZGluZy1ib3R0b206IDIwcHg7DQogICAgICBtYXJnaW4tbGVmdDogNDglICFpbXBvcnRhbnQ7DQogICAgfQ0KDQogICAgJlt0cGw9ImFwcC9mb290ZXIiXSB7DQogICAgICBtYXJnaW4tbGVmdDogNDglICFpbXBvcnRhbnQ7DQogICAgfQ0KICB9DQp9DQoNCi5uZXctcG1kICNyc19uZXcgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsNCiAgd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpOw0KICBwYWRkaW5nOiAxMHB4IDAgMTBweCAyMHB4Ow0KfQ0KDQoucmVzdWx0LW1vbGVjdWxlICNwYWdlID4gZGl2IHsNCiAgd2lkdGg6IHVuc2V0Ow0KICBwYWRkaW5nLWxlZnQ6IHVuc2V0Ow0KfQ0KDQoubmV3LXBtZCAjcnNfbmV3IHRhYmxlIHsNCiAgd2lkdGg6IDEwMCU7DQogIG1hcmdpbi10b3A6IDEycHg7DQp9DQoNCkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDE5MjFweCkgew0KICAjaGVhZCAuaGVhZF93cmFwcGVyIHsNCiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTIwcHgpOw0KDQogICAgI3Ugew0KICAgICAgcmlnaHQ6IDIwMHB4Ow0KICAgIH0NCiAgfQ0KDQogIGJvZHlbYmFpZHVdIHsNCiAgICAjd3JhcHBlciAjc190YWIgew0KICAgICAgbWFyZ2luLWxlZnQ6IDk2cHg7DQogICAgICANCiAgICAgIC5zX3RhYl9pbm5lcnsNCiAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1ldmVubHk7DQogICAgICAgIHBhZGRpbmctbGVmdDogdW5zZXQ7DQogICAgICAgIA0KICAgICAgICA+ICogew0KICAgICAgICAgIG1hcmdpbi1yaWdodDogMDsNCiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICAjY29udGFpbmVyLnNhbV9uZXdncmlkIHsNCiAgICAgIHBhZGRpbmctbGVmdDogIDgwcHg7DQogICAgfQ0KICB9DQogIA0KICBmb3JtLmZtIC5zX2lwdF93ci5iZyB7DQogICAgbWluLXdpZHRoOiBjYWxjKDM3LjV2dyAtIDE1MHB4KTsNCiAgfQ0KfQ0KDQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxMzY2cHgpIGFuZCAobWF4LXdpZHRoOiAxOTIwcHgpIHsNCiAgLndyYXBwZXJfbmV3IC5oZWFkX3dyYXBwZXIgI3Jlc3VsdF9sb2dvIHsNCiAgICBtYXJnaW4tbGVmdDogMDsNCiAgfQ0KfQ0KDQpAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMzY2cHgpIHsNCiAgLndyYXBwZXJfbmV3IC5oZWFkX3dyYXBwZXIgI3Jlc3VsdF9sb2dvIHsNCiAgICBtYXJnaW4tbGVmdDogLTIzMHB4Ow0KICB9DQp9DQoNCg=="},{"meta":{"name":"baiduTwoPageStyle.less","url":"http://ibaidu.tujidu.com/newcss/baiduTwoPageStyle.less?t=26.04","ts":1670421065929,"mimetype":"text/plain"},"source":"LyoqU3RvcmUgQmFpZHVUb3dQYWdlU3R5bGUqKi8NCiN3cmFwcGVyX3dyYXBwZXIgI2NvbnRhaW5lciB7DQogIHdpZHRoOiBhdXRvOw0KICBtYXJnaW4tbGVmdDogdW5zZXQ7DQp9DQoNCmZvcm0uZm0gew0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQogIGJhY2tncm91bmQtY29sb3I6IHVuc2V0Ow0KfQ0KDQojc190YWIgYiwgI3NfdGFiIGEgew0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQp9DQoNCiN3cmFwcGVyICNzX3RhYiB7DQogIHBhZGRpbmctbGVmdDogMDsNCiAgbWFyZ2luLWxlZnQ6IDA7DQogIGRpc3BsYXk6IGZsZXg7DQogIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOw0KfQ0KDQojd3JhcHBlciAuaGVhZF9udW1zX2NvbnRfb3V0ZXIgLnNlYXJjaF90b29sX2NvbnRlciwNCiN3cmFwcGVyIC5oZWFkX251bXNfY29udF9vdXRlciAubnVtcyB7DQogIHdpZHRoOiA4MCU7DQogIG1hcmdpbi1sZWZ0OiAxMCU7DQp9DQoNCiN3cmFwcGVyIC5oZWFkX251bXNfY29udF9vdXRlciwNCi5oaW50X2NvbW1vbl9yZXN0b3AsDQojaGVhZGVyX3RvcF9iYXIgew0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQogIGxlZnQ6IDEwJTsNCiAgd2lkdGg6IDgwJTsNCn0NCg0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCwgI2NvbnRhaW5lciAucmVzdWx0LW1vbGVjdWxlIHsNCiAgbWFyZ2luOiAwIGF1dG8gIWltcG9ydGFudDsNCiAgcGFkZGluZy1sZWZ0OiB1bnNldCAhaW1wb3J0YW50Ow0KfQ0KDQojd3JhcHBlciAjaGVhZGVyX3RvcF9iYXIgew0KICBtYXJnaW4tYm90dG9tOiAwcHg7DQp9DQoNCmJvZHkgI2NvbnRhaW5lci5zYW1fbmV3Z3JpZCAjY29udGVudF9sZWZ0IHsNCiAgd2lkdGg6IDgwJTsNCn0NCg0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCB7DQogIGRpc3BsYXk6IGdyaWQ7DQogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNTAlIDUwJTsNCiAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogInhtYWluIHhtYWluIjsNCiAgbWFyZ2luOiAwIGF1dG87DQogIHBvc2l0aW9uOiByZWxhdGl2ZTsNCiAgcGFkZGluZy1sZWZ0OiA1JTsNCiAgZmxvYXQ6IHVuc2V0Ow0KICB3aWR0aDogODAlOw0KICBtYXJnaW4tbGVmdDogNyU7DQogIG1hcmdpbi1ib3R0b206IDMwcHg7DQp9DQoNCmJvZHlbbmV3c10gI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCA+IGRpdjpub3QoW2NsYXNzXSk6bm90KFtpZF0pIHsNCiAgZGlzcGxheTogZ3JpZDsNCiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA1MCUgNTAlOw0KICBncmlkLXRlbXBsYXRlLWFyZWFzOiAieG1haW4geG1haW4iOw0KfQ0KDQojd3JhcHBlciAjY29udGVudF9yaWdodCB7DQogIHdpZHRoOiAwICFpbXBvcnRhbnQ7DQogIGhlaWdodDogMCAhaW1wb3J0YW50Ow0KICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7DQogIG9wYWNpdHk6IDA7DQp9DQoNCiN3cmFwcGVyX3dyYXBwZXIgI2NvbnRhaW5lciAjcnMgew0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQogIG1hcmdpbjogMCBhdXRvOw0KfQ0KDQojd3JhcHBlciAjcGFnZSB7DQogIG1pbi13aWR0aDogNzEwcHg7DQogIGhlaWdodDogNDBweDsNCiAgbGluZS1oZWlnaHQ6IDQwcHg7DQogIHBhZGRpbmc6IDVweCAxMHB4Ow0KICBtYXJnaW46IDAgYXV0bzsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQoNCiAgLnBhZ2UtaW5uZXIgew0KICAgIHBhZGRpbmctbGVmdDogMDsNCiAgfQ0KfQ0KDQojd3JhcHBlciAjY29udGVudF9sZWZ0IHsNCiAgLnJlc3VsdCwNCiAgLnJlc3VsdC1vcCwNCiAgZGl2W2NsYXNzKj0ndm1wLXByb2plY3QnXSwNCiAgJiA+IC5jLWNvbnRhaW5lciB7DQogICAgd2lkdGg6IHVuc2V0ICFpbXBvcnRhbnQ7DQogICAgbWF4LXdpZHRoOiAxMDAlOw0KICAgIG1hcmdpbi1sZWZ0OiAwOw0KICAgIG1hcmdpbi1yaWdodDogMTVweDsNCiAgfQ0KDQogID4gKjpub3QoW2NsYXNzKj0ncmVzdWx0J10pOm5vdChbY2xhc3MqPSdjLWdyb3VwLXdyYXBwZXInXSkgew0KICAgIGdyaWQtY29sdW1uLXN0YXJ0OiAxOw0KICAgIGdyaWQtY29sdW1uLWVuZDogeG1haW4tZW5kOw0KICB9DQp9DQoNCi5jLWNvbnRhaW5lciBoMyBhIHsNCiAgei1pbmRleDogMTsNCn0NCg0KLkFDLnNwLXNlcGFyYXRvciB7DQogIHdpZHRoOiBhdXRvOw0KfQ0KDQovKnNlYXJjaCBlbmdpbmUganVtcCovDQojc2VqLWNvbnRhaW5lciB7DQogIHBhZGRpbmctbGVmdDogMDsNCiAgbWFyZ2luLWxlZnQ6IDA7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KLnNfZm9ybV93cmFwcGVyIHsNCiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogIGRpc3BsYXk6IGZsZXg7DQp9DQoNCi5yZXN1bHQtbW9sZWN1bGUubmV3LXBtZCB7DQogIG1hcmdpbjogMCBhdXRvOw0KICBtaW4td2lkdGg6IDgwMHB4Ow0KICB3aWR0aDogNDAlICFpbXBvcnRhbnQ7DQogIHBhZGRpbmctbGVmdDogMjBweDsNCg0KICAjcGFnZSA+IGRpdiB7DQogICAgd2lkdGg6IHVuc2V0Ow0KICAgIHBhZGRpbmctbGVmdDogdW5zZXQ7DQogIH0NCg0KICAjcnNfbmV3IHsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsNCiAgICB3aWR0aDogY2FsYygxMDAlIC0gMjBweCk7DQogICAgcGFkZGluZzogMTBweCAwIDEwcHggMjBweDsNCg0KICAgIHRhYmxlIHsNCiAgICAgIHdpZHRoOiAxMDAlOw0KICAgICAgbWFyZ2luLXRvcDogMTJweDsNCiAgICB9DQogIH0NCn0NCg0KI3dyYXBwZXIgLmhlYWRfbnVtc19jb250X291dGVyIC5zZWFyY2hfdG9vbF9jb250ZXIsDQojd3JhcHBlciAuaGVhZF9udW1zX2NvbnRfb3V0ZXIgLm51bXMgew0KICB3aWR0aDogODAlOw0KfQ0KDQpAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxNTAwcHgpIHsNCiAgZm9ybS5mbSAuc19pcHRfd3IuYmcgew0KICAgIG1pbi13aWR0aDogNDUwcHgNCiAgfQ0KDQogIC53cmFwcGVyX25ldyAuaGVhZF93cmFwcGVyICNyZXN1bHRfbG9nbyB7DQogICAgbWFyZ2luLWxlZnQ6IC0xNzBweDsNCiAgfQ0KfQ0KDQpAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxOTIxcHgpIHsNCiAgI2hlYWQgLmhlYWRfd3JhcHBlciB7DQogICAgdHJhbnNmb3JtOiB1bnNldDsNCg0KICAgICN1IHsNCiAgICAgIHJpZ2h0OiA5NXB4Ow0KICAgIH0NCiAgfQ0KICANCiAgI3NfdGFiLnNfdGFiIC5zX3RhYl9pbm5lciB7DQogICAgd2lkdGg6IDkwMHB4Ow0KICB9DQoNCiAgZm9ybS5mbSAuc19pcHRfd3IuYmcgew0KICAgIG1pbi13aWR0aDogOTAwcHgNCiAgfQ0KDQogIGJvZHlbYmFpZHVdIHsNCg0KICAgICNjb250YWluZXIuc2FtX25ld2dyaWQgew0KICAgICAgcGFkZGluZy1sZWZ0OiAxNThweDsNCiAgICB9DQogIH0NCn0NCg=="},{"meta":{"name":"googleCommonStyle.less","url":"http://ibaidu.tujidu.com/newcss/googleCommonStyle.less?t=26.04","ts":1670421065933,"mimetype":"text/plain"},"source":"LyoqKioqKioqKioqKioqKioqKiogU3RvcmUgR29vZ2xlQ29tbW9uU3R5bGUgKioqKioqKioqKioqKioqKioqKi8NCi8qIHJlZ3VsYXIgaXRlbXMsIHdhcnJpbmc6IGlmcmFtZXMgY291bGQgYmUgdmlkZW9zKi8NCmRpdi5yZXNfdG9wX2Jhbm5lciwNCiNwYWdlIC5maywNCiNoZWFkIC5oZWFkQmxvY2ssDQojcnNfdG9wX25ldywNCiNjb250ZW50X3JpZ2h0LA0KI3JzbyA+IHRhYmxlLA0KI3JzbyA+IGRpdltpZCo9IjMwIl0sDQojcnNvIC5jLXJlY29tbWVuZCwNCiNyc28gLmxlZnRCbG9jaywNCiNyc28gLm9VQWNQZCwNCiNzZWFyY2ggI3o5UG9WLA0KI3JzbyAuaGl0X3RvcF9uZXcsDQojcnNvICNmbGQsDQojcnNvIGRpdi5ycmVjb20tYnRuLXBhcmVudCwNCiNjb250ZW50X3JpZ2h0LA0KI2NlbnRlcl9jb2wgPiAjdGF3LA0KI2ZsZCwNCiNkZW1vIHsNCiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKiBpbml0ICoqKioqKioqKioqKioqKioqKiovDQpib2R5W2dvb2dsZV0gew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZkRmRGZEOw0KfQ0KDQojdG9wX25hdiAjaGR0YiB7DQogIGJhY2tncm91bmQ6IHVuc2V0Ow0KfQ0KDQojY250ICNoZHRiU3VtLCAjY250ID4gI2FwcGJhciB7DQogIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMCk7DQp9DQoNCiNmb3JtIC5iZHN1ZyB7DQogIHdpZHRoOiA3NiU7DQp9DQoNCiNhbGFfaW1nX3Jlc3VsdHMgew0KICBvdmVyZmxvdzogaGlkZGVuOw0KfQ0KDQphLA0KYSBlbSwNCiN1IGEgew0KICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQp9DQoNCmE6aG92ZXIsDQphOmhvdmVyIGgzIHsNCiAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqIHJld3JpdGUgaGVhZGVyICoqKioqKioqKioqKioqKioqKiovDQojaGVhZCB7DQogIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7DQogIGJvcmRlci1ib3R0b206IG5vbmU7DQp9DQoNCiNmb3JtIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogdW5zZXQ7DQoNCiAgLmJkc3VnIGxpIHsNCiAgICB3aWR0aDogYXV0bzsNCiAgICBjb2xvcjogIzAwMDsNCiAgICBmb250OiAxNXB4IGFyaWFsOw0KICAgIGxpbmUtaGVpZ2h0OiAyNnB4Ow0KICB9DQoNCiAgLnNfaXB0X3dyLmJnIHsNCiAgICBiYWNrZ3JvdW5kOiAjZmZmOw0KICAgIHdpZHRoOiA3NiU7DQogIH0NCg0KICAuc19idG4gew0KICAgIGJhY2tncm91bmQ6ICMzNDc2ZDI7DQogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzNDc2ZDI7DQoNCiAgICAmOmhvdmVyIHsNCiAgICAgIGJhY2tncm91bmQ6ICMzNDc2ZDI7DQogICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzM0NzZkMjsNCiAgICB9DQogIH0NCn0NCg0KI3NfdGFiIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsNCiAgYm9yZGVyLWJvdHRvbTogI2UwZTBlMCAxcHggc29saWQ7DQoNCiAgYiB7DQogICAgY29sb3I6ICMzNDc2ZDI7DQogICAgYm9yZGVyLWJvdHRvbTogM3B4ICMzNDc2ZDIgc29saWQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKiogcmV3cml0ZSAtIHNlYXJjaEJveCAqKioqKioqKioqKioqKioqKioqLw0KLyogU2VhcmNoVG9vbHMgKi8NCiNjb250YWluZXIgLmhlYWRfbnVtc19jb250X291dGVyIC5zZWFyY2hfdG9vbF9jb250ZXIsDQojY29udGFpbmVyIC5oZWFkX251bXNfY29udF9vdXRlciAubnVtcyB7DQogIHdpZHRoOiA2MzBweDsNCn0NCg0KLyogU2VhcmNoSXRtZXMgQm90dG9tIHRvIFRvcCBhbmkgKi8NCiNzZWFyY2ggI3JzbyB7DQogIGFuaW1hdGlvbi1uYW1lOiBhbmlfdG9wVG9idXR0b207DQogIGFuaW1hdGlvbi1kdXJhdGlvbjogLjNzOw0KICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOw0KICB3aWR0aDogODAwcHg7DQogIGFsaWduLWl0ZW1zOiBzdHJldGNoOw0KICBqdXN0aWZ5LWl0ZW1zOiBzdHJldGNoOw0KfQ0KDQovKiBTZWFyY2hCYXIgTGVmdCB0byBSaWdodCBhbmkgKi8NCi5zcnAgZm9ybSB7DQogIGFuaW1hdGlvbi1uYW1lOiBhbmlfbGVmdFRvcmlnaHQ7DQogIGFuaW1hdGlvbi1kdXJhdGlvbjogLjNzOw0KICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsNCn0NCg0KI3JzbyAualVta0ZiOmhvdmVyIHsNCiAgbWFyZ2luOiAwIGF1dG87DQogIGJvcmRlci1sZWZ0OiB1bnNldDsNCiAgcGFkZGluZzogMHB4IDIwcHggMTVweDsNCiAgbWFyZ2luLWJvdHRvbTogNDBweDsNCn0NCg0KI3JzLCAjcnNvIC5nIHsNCiAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsNCiAgcGFkZGluZzogMHB4IDIwcHggMTVweDsNCiAgbWFyZ2luLXRvcDogMHB4Ow0KICBtYXJnaW4tYm90dG9tOiA0MHB4Ow0KICBib3JkZXItcmFkaXVzOiA1cHg7DQogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTsNCiAgdHJhbnNpdGlvbjogYWxsIDAuMjVzIGN1YmljLWJlemllciguMjMsIDEsIC4zMiwgMSkgMHM7DQoNCiAgPiBkaXZ7DQogICAgbWFyZ2luLXRvcDogMTBweDsNCiAgfQ0KfQ0KDQojcnNvID4gLmcgfiBkaXY6bm90KC5nKSB7DQogIHdpZHRoOiAxMDAlOw0KICBvdmVyZmxvdzogaGlkZGVuOw0KfQ0KDQojcnMsICNyc28gLmcgZGl2LnJjIC5zIHsNCiAgbWF4LXdpZHRoOiB1bnNldDsNCn0NCg0KI3JzbyAuZzpob3ZlciB7DQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4zKTsNCiAgYm94LXNoYWRvdzogMCAwIDFweCBncmV5Ow0KICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAxcHggZ3JleTsNCiAgLW1vei1ib3gtc2hhZG93OiAwIDAgMXB4IGdyYXk7DQp9DQoNCiNyc28gLmdbdHBsPSdzb2Z0J10gLm9wLXNvZnQtdGl0bGUsDQojcnNvIC5nIGRpdi5yIHsNCiAgbWFyZ2luOiAwcHggLTIwcHggMTBweCAtMjBweDsNCiAgcGFkZGluZzogOHB4IDIwcHggNXB4Ow0KICBib3JkZXItcmFkaXVzOiA1cHggNXB4IDBweCAwcHg7DQp9DQoNCi8qIEl0ZW1zIC0gQ29sb3IgKi8NCiNyc28gLmYxMyBhLA0KI3JzbyAuZjEzIGVtLA0KI3JzbyAuYy1zcGFuMTggYSwNCiNyc28gLnN1YkxpbmtfZmFjdG9yeSBhLA0KI3JzbyAuYy10YWJzLWNvbnRlbnQgYSwNCiNyc28gLm9wX29mZmljYWxfd2VpYm9fY29udGVudCBhLA0KI3JzbyAub3Bfb2ZmaWNhbF93ZWlib19weiBhLA0KI3JzbyAub3BfdGllYmEyX3RhYmxpbmtzX2NvbnRhaW5lciBhLA0KI3JzbyAub3AtdGllYmEtZ2VuZXJhbC1yaWdodCwNCiNyc28gLm9wX2RxMDFfdGl0bGUsDQojcnNvIC5vcF9kcTAxX3RhYmxlIGEsDQojcnNvIC5vcF9kcTAxX21vcmVsaW5rIGEsDQojcnNvIC5vcC10aWViYS1nZW5lcmFsLW1haW5wbCBhLA0KI3JzbyAub3Atc2UtbGlzdGVuLXJlY29tbWVuZCwNCiNyc28gLmMtb2Zmc2V0ID4gZGl2IGEgew0KICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQogIGNvbG9yOiAjMzQ3NmQyOw0KDQogICY6aG92ZXIgew0KICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lICFpbXBvcnRhbnQ7DQogIH0NCn0NCg0KI3JzbyAuZjEzIGEgew0KICBjb2xvcjogIzAwODAwMDsNCn0NCg0KLyogSXRlbXMgLSBBZGogKi8NCg0KI3JzbyAuYy1zcGFuMTgsICNyc28gLmMtc3BhbjI0IHsNCiAgd2lkdGg6IDEwMCU7DQogIG1pbi13aWR0aDogdW5zZXQ7DQp9DQoNCiNyc28gLmMtYm9yZGVyIHsNCiAgd2lkdGg6IGF1dG87DQogIGJvcmRlcjogbm9uZTsNCiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7DQogIGJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7DQogIGJveC1zaGFkb3c6IDBweCAwcHggMHB4IHRyYW5zcGFyZW50Ow0KICAtd2Via2l0LWJveC1zaGFkb3c6IDBweCAwcHggMHB4IHRyYW5zcGFyZW50Ow0KICAtbW96LWJveC1zaGFkb3c6IDBweCAwcHggMHB4IHRyYW5zcGFyZW50Ow0KICAtby1ib3gtc2hhZG93OiAwcHggMHB4IDBweCB0cmFuc3BhcmVudDsNCn0NCg0KLyogSW1nICovDQoNCiNyc28gLnNlX2NvbV9pcnJlZ3VsYXJfZ2FsbGVyeSB1bCBsaSwNCiNyc28gLm9wX2ppbmd5YW5fbGlzdCwNCiNyc28gLmcgLm9wLWltZy1hZGRyZXNzLWxpbmstdHlwZSB7DQogIGRpc3BsYXk6IGlubGluZS1ibG9jazsNCiAgbWFyZ2luLWxlZnQ6IDEwcHg7DQp9DQoNCiNyc28gLmcgYSB7DQogIGNvbG9yOiAjMzQ3NmQyOw0KDQogIGgzIHsNCiAgICBwb3NpdGlvbjogcmVsYXRpdmU7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQoNCiAgICAmOmFmdGVyIHsNCiAgICAgIGNvbnRlbnQ6ICIiOw0KICAgICAgcG9zaXRpb246IGFic29sdXRlOw0KICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICMzNDc2ZDI7DQogICAgICBib3R0b206IC0zcHg7DQogICAgICBsZWZ0OiAxMDAlOw0KICAgICAgd2lkdGg6IDA7DQogICAgICB0cmFuc2l0aW9uOiB3aWR0aCAzNTBtcywgbGVmdCAzNTBtczsNCiAgICB9DQoNCiAgICAmOmhvdmVyOmFmdGVyIHsNCiAgICAgIGxlZnQ6IDA7DQogICAgICB3aWR0aDogMTAwJTsNCiAgICAgIHRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICAgIH0NCiAgfQ0KDQogICY6dmlzaXRlZCB7DQogICAgY29sb3I6ICM2NjAwOTk7DQogIH0NCn0NCg0KI3JzbyAub3Atc29mdC10aXRsZSBhLA0KI3JzbyAuZyBkaXYuciA+IGEgew0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQoNCiAgZW0gew0KICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCiAgfQ0KfQ0KDQovKiBwYWdlIG51bXMgKi8NCiNyc28gZGl2Lmc6bm90KFtjbGFzc10pIHsNCiAgbWFyZ2luLWxlZnQ6IDE4cHg7DQogIG1hcmdpbi1yaWdodDogMThweDsNCn0NCg0KI3JzbyAuZyAuZXhwLW91dGxpbmUgew0KICBkaXNwbGF5OiBub25lOw0KfQ0KDQojcmVzIC5nIC50cyB7DQogIG1heC13aWR0aDogdW5zZXQ7DQp9DQoNCiNtYWluICNyY250IHsNCiAgZmxleC13cmFwOiBub3dyYXA7DQp9DQoNCiNtYWluICNyY250ICNyaHMgew0KICBkaXNwbGF5OiBub25lOw0KfQ0KDQouc2hvd1JpZ2h0ICNtYWluICNyY250ICNyaHMgew0KICBkaXNwbGF5OiB1bnNldDsNCn0NCg0KY2l0ZSB7DQogIGZvbnQtd2VpZ2h0OiBub3JtYWw7DQogIHdoaXRlLXNwYWNlOiBub3dyYXA7DQp9DQoNCi8qKk1vb25jYW4gLVNUQVJUKiovDQovKipBamEgTGluZUhlaWdodCovDQpkaXYucmVzX3RvcF9iYW5uZXIgI2Zvb3QsICNwYWcNCiNyZXMgLnIgew0KICBsaW5lLWhlaWdodDogMS4zOw0KfQ0KDQojcmVzIHsNCiAgcGFkZGluZzogMDsNCn0NCg0KLyoqR29vZ2xlIENvbm5lY3Rpb25Cb3gqLw0KI3JzLCAjcnNvIC5nIHsNCiAgbWFyZ2luLWJvdHRvbTogMjBweDsNCiAgYm9yZGVyLXJhZGl1czogMTBweDsNCn0NCg0KI3JzbyAuZyBkaXYuciB7DQogIGJvcmRlci1yYWRpdXM6IDEwcHggMTBweCAwcHggMHB4Ow0KfQ0KDQojcnNvIC5nIC5jYXJkLXNlY3Rpb24sICNjZW50ZXJfY29sIC5rcC1ibGsgew0KICB3aWR0aDogMTAwJSAhaW1wb3J0YW50Ow0KfQ0KDQovKipSZXdyaXRlIG1haW4gcGFnZSAtPiB3ZWIgc3VtbWFyeSovDQouYzJ4elRiIC5nLCAucnVUY0lkIC5nLCAuZm0wNklmIC5nLCAuY1VuUUtlIC5nLCAuSGFuUW1mIC5nIHsNCiAgd2lkdGg6IDc1OHB4Ow0KICBwYWRkaW5nLWxlZnQ6IDIwcHggIWltcG9ydGFudDsNCiAgcGFkZGluZy1yaWdodDogMjBweCAhaW1wb3J0YW50Ow0KICBib3gtc2hhZG93OiAwIDAgMHB4IDBweCByZ2IoMCwgMCwgMCk7IC8qcmVtb3ZlIHRoZSBzaGFkb3cqLw0KfQ0KDQpkaXYgLnhmeHg1ZCB7DQogIG1hcmdpbi1ib3R0b206IC0xOHB4ICFpbXBvcnRhbnQ7DQogIG1hcmdpbi10b3A6IC0yNXB4ICFpbXBvcnRhbnQ7DQp9DQoNCmRpdiAueGFxSnpmLnhmeHg1ZCAua25vLWZ0ciB7DQogIG1hcmdpbi10b3A6IDEwcHggIWltcG9ydGFudDsNCn0NCg0KZGl2IC5rbm8tZnRyIGEgew0KICBwb3NpdGlvbjogc3RpY2t5Ow0KfQ0KDQovKipUaGFua3MgdG8gTW9vbmNhbiAtRU5EKiovDQojcmNudCAjcmVzIGgzLCAjcmNudCAjZXh0cmFyZXMgaDMgew0KICAvKipyZXNldCBmb250IHNpemUqKi8NCiAgZm9udC1zaXplOiBtZWRpdW07DQp9DQoNCiNyY250ICNyZXMgaDMgZGl2LCAjcmNudCAjZXh0cmFyZXMgaDMgZGl2IHsNCiAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KfQ0KDQovKmRlYWwgd2l0aCBjaXRlIHRvbyBsb25nIGFuZCB0aXRsZSB0b28gc2hvcnQqLw0KI3JzbyAuZyAuciA+IGEgPiBkaXYgew0KICB3aWR0aDogMzVyZW07DQp9DQoNCmRpdi5yY1thYy1uZWVkaGlkZV0gew0KICBtYXJnaW4tdG9wOiA1cHg7DQogIG1hcmdpbi1ib3R0b206IC0xNXB4Ow0KfQ0KDQovKnJlc2V0IGxvZ28gcG9zaXRpb24gYXQgZHJvcCAqLw0KLmxvZ28uYmFpZHUgew0KICB0b3A6IC01cHg7DQp9DQoNCmJvZHlbZ29vZ2xlXSAuYmlnIC5iYWlkdSB7DQogIHRyYW5zZm9ybTogdW5zZXQgIWltcG9ydGFudDsNCiAgbWFyZ2luLXRvcDogLTEwcHg7DQogIG1hcmdpbi1sZWZ0OiAtMnJlbTsNCn0NCg0KYm9keVtnb29nbGVdIC5iaWcgLmJhaWR1ICNsb2dvIGltZyB7DQogIG1hcmdpbi10b3A6IC0xNXB4Ow0KfQ0KDQpib2R5W2dvb2dsZV0gLmJpZy5taW5pZGl2IC5iYWlkdSAjbG9nbyBpbWcgew0KICBoZWlnaHQ6IDU5cHg7DQogIHdpZHRoOiB1bnNldDsNCiAgbWFyZ2luLXRvcDogLTE4cHg7DQp9DQoNCmJvZHlbZ29vZ2xlXSAuQThTQndmIHsNCiAgbWF4LXdpZHRoOiA2OTJweDsNCiAgd2lkdGg6IHVuc2V0Ow0KICBtYXJnaW4tbGVmdDogMjUlOw0KfQ0KDQouQUMuc3Atc2VwYXJhdG9yIHsNCiAgbWFyZ2luLXRvcDogLTIwcHg7DQp9DQoNCmRpdltqc2NvbnRyb2xsZXJdIGEsIGRpdltqc25hbWVdIGEgew0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQp9DQoNCi8vQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTM2NnB4KSB7DQovLyAgI21haW4gI3JjbnQgI3JocyB7DQovLyAgICBwYWRkaW5nLWxlZnQ6IDQwcHg7DQovLyAgICBtYXJnaW4tbGVmdDogODAwcHg7DQovLyAgfQ0KLy99DQovLw0KLy9AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAxOTIwcHgpIHsNCi8vICAjbWFpbiAjcmNudCAjcmhzIHsNCi8vICAgIG1hcmdpbi1sZWZ0OiAxMzAwcHg7DQovLyAgICBwYWRkaW5nLWxlZnQ6IDQwcHg7DQovLyAgfQ0KLy99DQo="},{"meta":{"name":"googleOnePageStyle.less","url":"http://ibaidu.tujidu.com/newcss/googleOnePageStyle.less?t=26.04","ts":1670421065933,"mimetype":"text/plain"},"source":"LyoqU3RvcmUgR29vZ2xlVHdvUGFnZVN0eWxlKiovDQojc2VhcmNoICNyc28gew0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQogIGZsb2F0OiB1bnNldDsNCiAgd2lkdGg6IDgwMHB4Ow0KICBtYXJnaW46IDAgYXV0bzsNCiAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7DQogIGp1c3RpZnktaXRlbXM6IHN0cmV0Y2g7DQogIGdyaWQtZ2FwOiAyMHB4Ow0KfQ0KDQojcnNvIC5qVW1rRmI6aG92ZXIgew0KICBtYXJnaW4tYm90dG9tOiAzMHB4Ow0KICBtYXJnaW4tbGVmdDogMjBweDsNCn0NCg0KI3JzbyAuZyB7DQogIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7DQogIGhlaWdodDogMTAwJTsNCiAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgcGFkZGluZzogMHB4IDIwcHggMTVweDsNCiAgbWFyZ2luLXRvcDogMHB4Ow0KICBib3JkZXItcmFkaXVzOiA1cHg7DQogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7DQogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7DQogIHRyYW5zaXRpb246IGFsbCAwLjI1cyBjdWJpYy1iZXppZXIoLjIzLCAxLCAuMzIsIDEpIDBzOw0KfQ0KDQojcnNvID4gZGl2IHsNCiAgd2lkdGg6IDEwMCU7DQp9DQoNCi5zZWFyY2ggPiAjaXJlcyAjcnNvID4gLmcgew0KICBtYXgtd2lkdGg6IHVuc2V0Ow0KfQ0KDQojcnNvID4gLmcgfiBkaXY6bm90KC5nKSB7DQogIHdpZHRoOiAxMDAlOw0KICBvdmVyZmxvdzogaGlkZGVuOw0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQojbWFpbiAjcmNudCB7DQogIG1heC13aWR0aDogdW5zZXQ7DQp9DQoNCmJvZHkgI2FwcGJhciwgYm9keSAucmhzY29sLCBib2R5ICN0b3BfbmF2LCBib2R5ICNmYmFyIHsNCiAgbWluLXdpZHRoOiB1bnNldDsNCn0NCg0KI3JzbyBnLXNjcm9sbGluZy1jYXJvdXNlbCB7DQogIG1hcmdpbjogdW5zZXQ7DQogIG1hcmdpbi1sZWZ0OiAyMHB4Ow0KfQ0KDQouY29sIHsNCiAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsNCn0NCg0KLmNvbCAjY2VudGVyX2NvbCB7DQogIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7DQogIG1hcmdpbi1sZWZ0OiB1bnNldCAhaW1wb3J0YW50Ow0KfQ0KDQouc3JwIC5iaWcgI3RzZiB7DQogIHdpZHRoOiA4MzNweDsNCn0NCg0KLyoqc2VhcmNoIGJveCBhbGlnbiBjZW50ZXIqKi8NCi5zcnAgZm9ybSB7DQogIG1hcmdpbjogMCBhdXRvOw0KfQ0KDQojdG9wX25hdiB7DQogIG1pbi13aWR0aDogdW5zZXQ7DQp9DQoNCi8qKnZpZGVvIGJveCBhbGlnbiBjZW50ZXIqKi8NCmctc2VjdGlvbi13aXRoLWhlYWRlciB7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KI2hkdGIgI2hkdGItbXNiIHsNCiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogIHdpZHRoOiAxMDAlOw0KfQ0KDQojaGR0YiAjaGR0Yi1tc2ItdmlzIHsNCiAgbWFyZ2luLWxlZnQ6IC0xNjlweDsNCn0NCg0KLkFDLnNwLXNlcGFyYXRvciB7DQogIG1hcmdpbi10b3A6IC0yMHB4Ow0KICB3aWR0aDogODAwcHg7DQogIG1hcmdpbi1sZWZ0OiBhdXRvOw0KICBtYXJnaW4tcmlnaHQ6IGF1dG87DQp9DQoNCi5GeExEcCB7DQogIHBhZGRpbmc6IHVuc2V0Ow0KfQ0KDQojbWFpbiAjY250LCAjY250ICNjZW50ZXJfY29sLCAjY250ICNmb290IHsNCiAgbWFyZ2luOiAwIGF1dG87DQogIHdpZHRoOiBjYWxjKDM2LjN2dyArIDUyNXB4KTsNCiAgdHJhbnNpdGlvbjogYWxsIDEuMnMgZWFzZS1pbi1vdXQ7DQogIGFuaW1hdGlvbi1uYW1lOiBhbmlfaGlkZVRvU2hvdzsNCiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjZzOw0KICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOw0KfQ0KDQpAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxNDQwcHgpIHsNCiAgLlJOTlhnYiB7DQogICAgd2lkdGg6IDgwJSAhaW1wb3J0YW50Ow0KICB9DQp9DQo="},{"meta":{"name":"googleTwoPageStyle.less","url":"http://ibaidu.tujidu.com/newcss/googleTwoPageStyle.less?t=26.04","ts":1670421065932,"mimetype":"text/plain"},"source":"LyoqU3RvcmUgR29vZ2xlVHdvUGFnZVN0eWxlKiovDQojc2VhcmNoICNyc28gew0KICBwb3NpdGlvbjogcmVsYXRpdmU7DQogIGZsb2F0OiB1bnNldDsNCiAgd2lkdGg6IHVuc2V0Ow0KICBtaW4td2lkdGg6IDgwMHB4Ow0KfQ0KDQojcnNvIC5qVW1rRmI6aG92ZXIgew0KICBtYXJnaW4tYm90dG9tOiAzMHB4Ow0KfQ0KDQojcnNvIC5nLCAudmtfYyB7DQogIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7DQogIGhlaWdodDogMTAwJTsNCiAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgcGFkZGluZzogMTBweCAyMHB4IDE1cHg7DQogIG1hcmdpbi10b3A6IDA7DQogIG1hcmdpbi1ib3R0b206IDA7DQogIGJvcmRlci1yYWRpdXM6IDVweDsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsNCiAgYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgdHJhbnNpdGlvbjogYWxsIDAuMXMgZWFzZS1pbjsNCn0NCg0KLnNlYXJjaCA+ICNpcmVzICNyc28gLmcgew0KICBtYXgtd2lkdGg6IHVuc2V0Ow0KfQ0KLlhxRm5EZnsgLy8gw6bCkMKcw6fCtMKiw6nCn8Kzw6TCucKQw6fCmsKEw6bCl8K2w6XCgMKZw6TCvMKaw6XCjcKgw6fClMKow6XCt8Kmw6jCvsK5w6/CvMKMw6XCr8K8w6jCh8K0w6XCj8Kzw6jCvsK5w6XCrsK9w6XCusKmw6TCuMKNw6jCtsKzDQogIGRpc3BsYXk6IG5vbmU7DQp9DQojbWFpbiAjcmNudCAjcmhzIHsNCiAgZGlzcGxheTogbm9uZTsNCn0NCg0KI21haW4gI3JjbnQgew0KICBtYXgtd2lkdGg6IHVuc2V0Ow0KfQ0KDQojbWFpbiAjY250LCAjY250ICNjZW50ZXJfY29sLCAjY250ICNmb290IHsNCiAgd2lkdGg6IGNhbGMoNTR2dyArIDM2MHB4KTsNCiAgbWFyZ2luOiAwIGF1dG87DQp9DQoNCmJvZHkgI2FwcGJhciwgYm9keSAucmhzY29sLCBib2R5ICN0b3BfbmF2LCBib2R5ICNmYmFyIHsNCiAgbWluLXdpZHRoOiB1bnNldDsNCn0NCg0KI3JzbyAuQ09Fb2lkLA0KI2twLXdwLXRhYi1vdmVydmlldyA+IGRpdiB7DQogIG1hcmdpbjogdW5zZXQ7DQp9DQoNCi5jb2wgew0KICB3aWR0aDogMTAwJSAhaW1wb3J0YW50Ow0KfQ0KDQouY29sICNjZW50ZXJfY29sIHsNCiAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsNCiAgbWFyZ2luLWxlZnQ6IHVuc2V0ICFpbXBvcnRhbnQ7DQp9DQoNCi5zcmcsICNyc28sICNrcC13cC10YWItb3ZlcnZpZXcgew0KICBkaXNwbGF5OiBncmlkOw0KICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDUwJSwgMWZyKSk7DQogIGdyaWQtdGVtcGxhdGUtYXJlYXM6ICJ4bWFpbiB4bWFpbiI7DQogIGdyaWQtZ2FwOiAyMHB4ICFpbXBvcnRhbnQ7DQogIGp1c3RpZnktaXRlbXM6IHN0cmV0Y2g7DQogIGFsaWduLWl0ZW1zOiBzdHJldGNoOw0KICB3aWR0aDogMTAwJTsNCn0NCg0KI3JzbyA+IC5nIH4gZGl2Om5vdCguZykgew0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQouQUMuc3Atc2VwYXJhdG9yIHsNCiAgbWFyZ2luLXRvcDogMTBweDsNCiAgbWFyZ2luLWxlZnQ6IGF1dG87DQogIG1hcmdpbi1yaWdodDogYXV0bzsNCn0NCg0KLyoqc2VhcmNoIGJveCBhbGlnbiBjZW50ZXIqKi8NCi5zcnAgZm9ybSB7DQogIG1hcmdpbjogMCBhdXRvOw0KfQ0KDQpnLXNlY3Rpb24td2l0aC1oZWFkZXIgew0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCiNoZHRiICNoZHRiLW1zYiB7DQogIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICB3aWR0aDogMTAwJTsNCn0NCg0KI2hkdGIgI2hkdGItbXNiLXZpcyB7DQogIG1hcmdpbi1sZWZ0OiAtMTY5cHg7DQp9DQo="},{"meta":{"name":"bingCommonStyle.less","url":"http://ibaidu.tujidu.com/newcss/bingCommonStyle.less?t=26.04","ts":1670421065959,"mimetype":"text/plain"},"source":"LypTdG9yZSBCaW5nQ29tbW9uU3R5bGUqLw0KYm9keSB7DQogIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7DQp9DQoNCi5zaF9mYXZpY29uIHsNCiAgbWFyZ2luLWxlZnQ6IDE2cHg7DQp9DQoNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyA+IGxpOm5vdCgjbWZhX3Jvb3QpIHsNCiAgei1pbmRleDogMTsNCiAgd2lkdGg6IDY3MHB4Ow0KICBwYWRkaW5nOiAxMnB4IDIwcHggIWltcG9ydGFudDsNCiAgbWFyZ2luLXRvcDogMDsNCiAgbWFyZ2luLWJvdHRvbTogMjVweDsNCiAgYm9yZGVyLXJhZGl1czogNXB4Ow0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KICBib3gtc2l6aW5nOiBib3JkZXItYm94Ow0KICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7DQogIHRyYW5zaXRpb246IGFsbCAwLjI1cyBjdWJpYy1iZXppZXIoLjIzLCAxLCAuMzIsIDEpIDBzOw0KICBvdmVyZmxvdzogaGlkZGVuOw0KfQ0KDQojYl9jb250ZW50ICNiX3Jlc3VsdHMgYSwNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBoMiBhIHsNCiAgcG9zaXRpb246IHJlbGF0aXZlOw0KICBjb2xvcjogIzM0NzZkMjsNCn0NCg0KI2JfY29udGVudCAjYl9yZXN1bHRzIGgyIGEsICNiX3Jlc3VsdHMgaDIgc3Ryb25nIHsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc2l6ZTogbWVkaXVtOw0KfQ0KDQojYl9jb250ZW50ICNiX3Jlc3VsdHMgPiBsaTpob3ZlciB7DQogIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4zKTsNCiAgYm94LXNoYWRvdzogMCAwIDFweCBncmV5Ow0KICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCAxcHggZ3JleTsNCiAgLW1vei1ib3gtc2hhZG93OiAwIDAgMXB4IGdyYXk7DQp9DQoNCiNiX2NvbnRlbnQgPiAjYl9yZXN1bHRzIGxpOm5vdCgjbWZhX3Jvb3QpIGgyIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjhmODsNCiAgbWFyZ2luOiAtMTJweCAtMjBweCAxMHB4IC0yMHB4Ow0KICBwYWRkaW5nOiA4cHggMjBweCA1cHg7DQogIGJvcmRlci1yYWRpdXM6IDVweCA1cHggMHB4IDBweDsNCn0NCg0KYSwgYSBzdHJvbmcgew0KICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQp9DQoNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBhIHN0cm9uZywNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBoMiBhIHN0cm9uZyB7DQogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsNCn0NCg0KLmJfYWxnbzpmaXJzdC1jaGlsZDpob3ZlciBoMiBhIHsNCiAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7DQp9DQoNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBhOmhvdmVyOmFmdGVyLA0KI2JfY29udGVudCAjYl9yZXN1bHRzIGgyIGE6aG92ZXI6YWZ0ZXIgew0KICBsZWZ0OiAwOw0KICB3aWR0aDogMTAwJTsNCiAgLXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCiAgLW1vei10cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCiAgdHJhbnNpdGlvbjogd2lkdGggMzUwbXM7DQp9DQoNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBhOmhvdmVyLA0KI2JfY29udGVudCAjYl9yZXN1bHRzIGgyIGE6aG92ZXIgew0KICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQp9DQoNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBhOmFmdGVyLA0KI2JfY29udGVudCAjYl9yZXN1bHRzIGgyIGE6YWZ0ZXIgew0KICBjb250ZW50OiAiIjsNCiAgcG9zaXRpb246IGFic29sdXRlOw0KICBib3JkZXItYm90dG9tOiAycHggc29saWQgIzM0NzZkMjsNCiAgYm90dG9tOiAtMnB4Ow0KICBsZWZ0OiAxMDAlOw0KICB3aWR0aDogMDsNCiAgLXdlYmtpdC10cmFuc2l0aW9uOiB3aWR0aCAzNTBtcywgbGVmdCAzNTBtczsNCiAgLW1vei10cmFuc2l0aW9uOiB3aWR0aCAzNTBtcywgbGVmdCAzNTBtczsNCiAgdHJhbnNpdGlvbjogd2lkdGggMzUwbXMsIGxlZnQgMzUwbXM7DQp9DQoNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBoMiBhOnZpc2l0ZWQsDQojYl9jb250ZW50ICNiX3Jlc3VsdHMgaDIgYTp2aXNpdGVkIHN0cm9uZywNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBoMiBoMiBhOnZpc2l0ZWQsDQojYl9jb250ZW50ICNiX3Jlc3VsdHMgaDIgaDIgYTp2aXNpdGVkIHN0cm9uZyB7DQogIGNvbG9yOiAjNjYwMDk5Ow0KfQ0KDQojYl9jb250ZW50ICNiX3Jlc3VsdHMgaDIgYTp2aXNpdGVkOmhvdmVyOmFmdGVyLA0KI2JfY29udGVudCAjYl9yZXN1bHRzIGgyIGgyIGE6dmlzaXRlZDpob3ZlcjphZnRlciB7DQogIGxlZnQ6IDA7DQogIHdpZHRoOiAxMDAlOw0KICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICAtbW96LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICB0cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCn0NCg0KI2JfY29udGVudCA+IG9sI2JfY29udGV4dCB7DQogIGRpc3BsYXk6IG5vbmU7DQp9DQoNCmJvZHkgI2JfaGVhZGVyIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsNCn0NCg0KI2JfY29udGVudCAuYl91bmRlclNlYXJjaGJveCB7DQogIG1hcmdpbi10b3A6IDEwcHg7DQp9DQoNCiNiX2hlYWRlciAuYl9zY29wZWJhciB7DQogIG1hcmdpbjogdW5zZXQ7DQp9DQoNCi8qc2VhcmNoIGVuZ2luZSBqdW1wKi8NCi50c2YtcCA+IC5sb2dvY29udCwgI3Nlai1jb250YWluZXIgew0KICBtYXJnaW4tcmlnaHQ6IDM1MHB4Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCi50c2YtcCA+IC5zZmliYmJjIHsNCiAgbWFyZ2luLXJpZ2h0OiAzNTBweDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQouYl9zZWFyY2hib3hGb3JtIC5zYV90bSB7DQogIHRleHQtYWxpZ246IGxlZnQ7IC8qIFNlYXJjaEJveCB0ZXh0IENlbnRlciAqLw0KfQ0KDQpib2R5ICNiX2hlYWRlciAjZXN0X3N3aXRjaCB7DQogIG1hcmdpbjogMCBhdXRvOw0KICBwYWRkaW5nLXJpZ2h0OiAxMCU7IC8qKlRPRE8qKiovDQp9DQoNCmJvZHkgI2VzdF9jbjo6YWZ0ZXIsIGJvZHkgI2VzdF9lbjo6YWZ0ZXIgew0KICB0cmFuc2Zvcm06IHNjYWxlKDEuMSwgMS4zKSBwZXJzcGVjdGl2ZSguNWVtKSByb3RhdGVYKDBkZWcpOw0KICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4xLCAxLjMpIHBlcnNwZWN0aXZlKC41ZW0pIHJvdGF0ZVgoMGRlZyk7DQp9DQoNCkBtZWRpYSAobWF4LXdpZHRoOiAxMTAwcHgpIHsNCiAgYm9keSAjYl9oZWFkZXIgI2VzdF9zd2l0Y2ggew0KICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxLjJyZW0pOw0KICB9DQp9DQoNCi8qIFNlYXJjaEl0bWVzIEJvdHRvbSB0byBUb3AgYW5pICovDQojYl9jb250ZW50IHsNCiAgYW5pbWF0aW9uLW5hbWU6IGFuaV90b3BUb2J1dHRvbTsNCiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjZzOw0KICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOw0KfQ0KDQovKiBTZWFyY2hCYXIgTGVmdCB0byBSaWdodCBhbmkgKi8NCmJvZHkgI2JfaGVhZGVyIHsNCiAgYW5pbWF0aW9uLW5hbWU6IGFuaV90b3BUb2J1dHRvbTsNCiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjZzOw0KICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsNCn0NCg0KYm9keSB7DQogIGFuaW1hdGlvbi1uYW1lOiBhbmlfaGlkZVRvU2hvdzsNCiAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjZzOw0KICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsNCn0NCg0KLkFDLnNwLXNlcGFyYXRvciB7DQogIG1hcmdpbi10b3A6IC0xNXB4Ow0KfQ0K"},{"meta":{"name":"bingOnePageStyle.less","url":"http://ibaidu.tujidu.com/newcss/bingOnePageStyle.less?t=26.04","ts":1670421065964,"mimetype":"text/plain"},"source":"LypTdG9yZSBCaW5nT25lUGFnZVN0eWxlKi8NCiNiX2NvbnRlbnQgYXNpZGUgew0KICBkaXNwbGF5OiBub25lOw0KfQ0KDQojYl9jb250ZW50ICNiX3Jlc3VsdHMgew0KICB3aWR0aDogNzN2dzsNCiAgZGlzcGxheTogZmxleDsNCiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCiAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgbWF4LXdpZHRoOiAxMDAwcHg7DQp9DQoNCmJvZHkgI2JfaGVhZGVyIHsNCiAgd2lkdGg6IDcydnc7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgbWFyZ2luOiAwIGF1dG87DQp9DQoNCmJvZHkgI2JfY29udGVudCB7DQogIGRpc3BsYXk6IGZsZXg7DQogIGZsZXgtd3JhcDogd3JhcDsNCiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogIG1hcmdpbi1sZWZ0OiB1bnNldDsNCiAgcGFkZGluZy1sZWZ0OiB1bnNldDsNCn0NCg0KI2JfY29udGVudCAjYl9yZXN1bHRzID4gbGk6bm90KCNtZmFfcm9vdCkgew0KICB3aWR0aDogOTglOw0KfQ0K"},{"meta":{"name":"bingTwoPageStyle.less","url":"http://ibaidu.tujidu.com/newcss/bingTwoPageStyle.less?t=26.04","ts":1670421065965,"mimetype":"text/plain"},"source":"LypTdG9yZSBCaW5nVHdvUGFnZVN0eWxlKi8NCiNjb250YWluZXIgI2NvbnRlbnRfbGVmdCAuaGl0X3RvcF9uZXcsDQojYl9jb250ZW50IGFzaWRlLCAjYl9yZXN1bHRzICNtZmFfcm9vdCB7DQogIGRpc3BsYXk6IG5vbmU7DQp9DQoNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyB7DQogIHdpZHRoOiA3M3Z3Ow0KICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDUwJSwgMWZyKSk7DQogIGdyaWQtdGVtcGxhdGUtYXJlYXM6ICJ4bWFpbiB4bWFpbiI7DQogIGRpc3BsYXk6IGdyaWQ7DQp9DQoNCi5jYXJvdXNlbCAuaXRlbXMgew0KICBtYXgtd2lkdGg6IDcydnc7DQogIG92ZXJmbG93LXg6IHNjcm9sbDsNCiAgcGFkZGluZzogMCAwIDEwcHggMCAhaW1wb3J0YW50Ow0KfQ0KDQojYl9jb250ZW50ICNiX3Jlc3VsdHMgPiBsaTpub3QoI21mYV9yb290KSB7DQogIHdpZHRoOiA5OCU7DQogIG1hcmdpbi1sZWZ0OiAxJTsNCn0NCg0KI2JfY29udGVudCAjYl9wb2xlIHsNCiAgbWF4LXdpZHRoOiA3MnZ3Ow0KICBtYXJnaW46IDAgYXV0bzsNCn0NCg0KI2JfcmVzdWx0cyAuYl9hbGdvIC5iX2RlZXAgdWwgew0KICB3aWR0aDogNTAlOw0KfQ0KDQojYl9tc2csICNiX3BhZyB7DQogIGdyaWQtY29sdW1uLWVuZDogeG1haW4tZW5kOw0KICBncmlkLWNvbHVtbi1zdGFydDogMTsNCiAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsNCn0NCg0KYm9keSAjYl9jb250ZW50IHsNCiAgZGlzcGxheTogZmxleDsNCiAgZmxleC13cmFwOiB3cmFwOw0KICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgbWFyZ2luLWxlZnQ6IHVuc2V0Ow0KICBwYWRkaW5nLWxlZnQ6IHVuc2V0Ow0KfQ0KDQpib2R5ICNiX2hlYWRlciB7DQogIHdpZHRoOiA3MnZ3Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIG1hcmdpbjogMCBhdXRvOw0KfQ0K"},{"meta":{"name":"duckCommonStyle.less","url":"http://ibaidu.tujidu.com/newcss/duckCommonStyle.less?t=26.01","ts":1670421065967,"mimetype":"text/plain"},"source":"LypTdG9yZTogRHVja0R1Y2tHb0NvbW1vblN0eWxlKi8NCmJvZHkgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1Ow0KfQ0KDQoucmVzdWx0X19pY29uIC5yZXN1bHRfX2ljb25fX2ltZywgLnJlc3VsdF9faWNvbiAucmVzdWx0X19pY29uIGltZyB7DQogIGRpc3BsYXk6IG5vbmU7DQp9DQoNCiNsaW5rc193cmFwcGVyIC5yZXN1bHRzLS1tYWluIHsNCiAgbWF4LXdpZHRoOiA5NSU7DQp9DQoNCiNsaW5rc193cmFwcGVyICNsaW5rcyAubnJuLXJlYWN0LWRpdiB7DQogIHdpZHRoOiA5NSU7DQogIG92ZXJmbG93OiBoaWRkZW47DQogIG1hcmdpbi10b3A6IDBweDsNCiAgbWFyZ2luLWJvdHRvbTogMjVweDsNCiAgYm9yZGVyLXJhZGl1czogNXB4Ow0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KICBib3gtc2l6aW5nOiBib3JkZXItYm94Ow0KICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7DQogIHRyYW5zaXRpb246IGFsbCAwLjI1cyBjdWJpYy1iZXppZXIoLjIzLCAxLCAuMzIsIDEpIDBzOw0KfQ0KDQouZGFyay1iZyAjbGlua3Nfd3JhcHBlciAjbGlua3MgLm5ybi1yZWFjdC1kaXYgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzOw0KfQ0KDQouZGFyay1iZyAjbGlua3Nfd3JhcHBlciAjbGlua3MgLm5ybi1yZWFjdC1kaXYgaDIgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzQ1Ow0KfQ0KDQouZGFyay1iZyAjbGlua3Nfd3JhcHBlciAjbGlua3MgLm5ybi1yZWFjdC1kaXYgaDIgYSB7DQogIGNvbG9yOiAjQ0NDQ0NDOw0KfQ0KDQouZGFyay1iZyAjbGlua3Nfd3JhcHBlciAjbGlua3MgLm5ybi1yZWFjdC1kaXYgaDIgYTp2aXNpdGVkIHsNCiAgY29sb3I6ICNiNzY2M2U7DQp9DQoNCiNsaW5rc193cmFwcGVyICNsaW5rcyAubnJuLXJlYWN0LWRpdiBhcnRpY2xlIHsNCiAgcGFkZGluZzogMThweDsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5ucm4tcmVhY3QtZGl2IGgyIGEgew0KICBvdmVyZmxvdzogaGlkZGVuOw0KICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsNCiAgbWF4LXdpZHRoOiA2NDBweDsNCiAgY29sb3I6ICMzNDc2ZDI7DQogIGZvbnQtc2l6ZTogc21hbGxlcjsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5ucm4tcmVhY3QtZGl2IC5yZXN1bHRfX2JvZHkgew0KICBwYWRkaW5nOiAxMnB4IDIwcHggIWltcG9ydGFudDsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5ucm4tcmVhY3QtZGl2OmhvdmVyIHsNCiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjMpOw0KICBib3gtc2hhZG93OiAwIDAgMXB4IGdyZXk7DQogIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDFweCBncmV5Ow0KICAtbW96LWJveC1zaGFkb3c6IDAgMCAxcHggZ3JheTsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5ucm4tcmVhY3QtZGl2IGgyIGE6aG92ZXI6YWZ0ZXIgew0KICBsZWZ0OiAwOw0KICB3aWR0aDogMTAwJTsNCiAgdHJhbnNpdGlvbjogd2lkdGggMzUwbXM7DQp9DQoNCiNsaW5rc193cmFwcGVyICNsaW5rcyAubnJuLXJlYWN0LWRpdiBoMiBhOmFmdGVyIHsNCiAgY29udGVudDogIiI7DQogIHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICMzNDc2ZDI7DQogIGJvdHRvbTogMXB4Ow0KICBsZWZ0OiAxMDAlOw0KICB3aWR0aDogMDsNCiAgdHJhbnNpdGlvbjogd2lkdGggMzUwbXMsIGxlZnQgMzUwbXM7DQp9DQoNCiNsaW5rc193cmFwcGVyICNsaW5rcyAubnJuLXJlYWN0LWRpdiBoMiBhOnZpc2l0ZWQsDQojbGlua3Nfd3JhcHBlciAjbGlua3MgLm5ybi1yZWFjdC1kaXYgaDIgYTp2aXNpdGVkIHN0cm9uZyB7DQogIGNvbG9yOiAjNjYwMDk5Ow0KfQ0KDQojbGlua3Nfd3JhcHBlciAjbGlua3MgLm5ybi1yZWFjdC1kaXYgaDIgYTp2aXNpdGVkOmhvdmVyOmFmdGVyLA0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5ucm4tcmVhY3QtZGl2IGgyIGE6dmlzaXRlZDpob3ZlcjphZnRlciB7DQogIGxlZnQ6IDA7DQogIHdpZHRoOiAxMDAlOw0KICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICAtbW96LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICB0cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCn0NCg0KLyogU2VhcmNoSXRtZXMgQm90dG9tIHRvIFRvcCBhbmkgKi8NCiNsaW5rc193cmFwcGVyICNsaW5rcyB7DQogIGFuaW1hdGlvbi1uYW1lOiBhbmlfdG9wVG9idXR0b207DQogIGFuaW1hdGlvbi1kdXJhdGlvbjogLjNzOw0KICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOw0KfQ0KDQovKiBTZWFyY2hCYXIgTGVmdCB0byBSaWdodCBhbmkgKi8NCiNoZWFkZXJfd3JhcHBlciAuaGVhZGVyX19zZWFyY2gtd3JhcCB7DQogIGFuaW1hdGlvbi1uYW1lOiBhbmlfbGVmdFRvcmlnaHQ7DQogIGFuaW1hdGlvbi1kdXJhdGlvbjogLjNzOw0KICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsNCn0NCg=="},{"meta":{"name":"duckOnePageStyle.less","url":"http://ibaidu.tujidu.com/newcss/duckOnePageStyle.less?t=26.01","ts":1670421065970,"mimetype":"text/plain"},"source":"LypTdG9yZTogRHVja0R1Y2tHb09uZVBhZ2VTdHlsZSovDQouanMtc2lkZWJhci1hZHMsICNvcmdhbmljLW1vZHVsZSwgLnBpbm5lZC10by1ib3R0b20gew0KICBkaXNwbGF5OiBub25lOw0KfQ0KDQouanMtcmVzdWx0LWhpZGRlbi1lbCB7DQogIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsNCn0NCg0KLnNpdGUtd3JhcHBlciAjd2ViX2NvbnRlbnRfd3JhcHBlciAuY3cgew0KICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgZGlzcGxheTogZmxleDsNCiAgbWF4LXdpZHRoOiB1bnNldDsNCiAgbWFyZ2luLWxlZnQ6IC0xNTBweDsNCn0NCg0KI2hlYWRlcl93cmFwcGVyICNoZWFkZXIsDQojd2ViX2NvbnRlbnRfd3JhcHBlciAjbGlua3Nfd3JhcHBlciAuc2VhcmNoLWZpbHRlcnMtd3JhcCwNCiN3ZWJfY29udGVudF93cmFwcGVyICNsaW5rc193cmFwcGVyIC5yZXN1bHRzLS1tZXNzYWdlIHsNCiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogIGRpc3BsYXk6IGdyaWQ7DQp9DQoNCiNoZWFkZXJfd3JhcHBlciAjaGVhZGVyIHsNCiAgbWF4LXdpZHRoOiB1bnNldDsNCn0NCg0KDQojaGVhZGVyX3dyYXBwZXIgI2hlYWRlciAuaGVhZGVyX19zZWFyY2gtd3JhcCB7DQogIHdpZHRoOiA1MDBweDsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgew0KICBkaXNwbGF5OiBpbmxpbmUtZmxleDsNCiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQp9DQoNCiNsaW5rc193cmFwcGVyIC5yZXN1bHRzLS1tYWluIHsNCiAgZmxvYXQ6IHVuc2V0Ow0KfQ0KDQojbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tc2lkZWJhciB7DQogIG1pbi13aWR0aDogdW5zZXQ7DQogIG1hcmdpbjogdW5zZXQ7DQp9DQoNCi5ib2R5LS1zZXJwIC5mb290ZXIgew0KICBkaXNwbGF5OiBmbGV4Ow0KICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgcGFkZGluZy1sZWZ0OiB1bnNldDsNCn0NCg=="},{"meta":{"name":"duckTwoPageStyle.less","url":"http://ibaidu.tujidu.com/newcss/duckTwoPageStyle.less?t=26.01","ts":1670421065969,"mimetype":"text/plain"},"source":"LypTdG9yZTogRHVja0R1Y2tHb1R3b1BhZ2VTdHlsZSovDQouanMtc2lkZWJhci1hZHMsDQojbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tc2lkZWJhciwNCiNvcmdhbmljLW1vZHVsZSwNCi5waW5uZWQtdG8tYm90dG9tIHsNCiAgZGlzcGxheTogbm9uZTsNCn0NCg0KLmpzLXJlc3VsdC1oaWRkZW4tZWwgew0KICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7DQp9DQoNCi5zaXRlLXdyYXBwZXIgI3dlYl9jb250ZW50X3dyYXBwZXIgLmN3IHsNCiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogIGRpc3BsYXk6IGZsZXg7DQogIG1heC13aWR0aDogdW5zZXQ7DQogIG1hcmdpbi1sZWZ0OiAtMTUwcHg7DQp9DQoNCiNoZWFkZXJfd3JhcHBlciAjaGVhZGVyLA0KI3dlYl9jb250ZW50X3dyYXBwZXIgI2xpbmtzX3dyYXBwZXIgLnNlYXJjaC1maWx0ZXJzLXdyYXAsDQojd2ViX2NvbnRlbnRfd3JhcHBlciAjbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tbWVzc2FnZSB7DQogIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICBkaXNwbGF5OiBncmlkOw0KfQ0KDQojaGVhZGVyX3dyYXBwZXIgI2hlYWRlciB7DQogIG1heC13aWR0aDogdW5zZXQ7DQp9DQoNCiNoZWFkZXJfd3JhcHBlciAjaGVhZGVyIC5oZWFkZXJfX3NlYXJjaC13cmFwIHsNCiAgd2lkdGg6IDUwMHB4Ow0KfQ0KDQojbGlua3Nfd3JhcHBlciB7DQogIGRpc3BsYXk6IGlubGluZS1mbGV4Ow0KICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW4gew0KICBmbG9hdDogdW5zZXQ7DQogIG1heC13aWR0aDogdW5zZXQ7DQp9DQoNCiNsaW5rc193cmFwcGVyIC5yZXN1bHRzLS1zaWRlYmFyIHsNCiAgbWluLXdpZHRoOiB1bnNldDsNCiAgbWFyZ2luOiB1bnNldDsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW4gI2xpbmtzIHsNCiAgd2lkdGg6IDgwdnc7DQogIC8qIFRoaXMgbWF5IGNhdXNlIFBhZ2UgZmFpbGVkICovDQogIGRpc3BsYXk6IGdyaWQ7DQogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNTAlIDUwJTsNCiAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogInhtYWluIHhtYWluIjsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW4gI2xpbmtzIC5ucm4tcmVhY3QtZGl2IHsNCiAgd2lkdGg6IHVuc2V0Ow0KICBtYXJnaW4tcmlnaHQ6IDE1cHg7DQp9DQoNCiNsaW5rcyAucmVzdWx0LS1tb3JlLCAjbGlua3MgLnJlc3VsdC0tc2VwIHsNCiAgZ3JpZC1jb2x1bW4tc3RhcnQ6IDE7DQogIGdyaWQtY29sdW1uLWVuZDogeG1haW4tZW5kOw0KICB3aWR0aDogdW5zZXQgIWltcG9ydGFudDsNCiAgcGFkZGluZzogMDsNCiAgcGFkZGluZy1yaWdodDogMTVweDsNCn0NCg0KI2xpbmtzIC5yZXN1bHQtLXNlcCB7DQogIG1hcmdpbi1ib3R0b206IDJlbTsNCn0NCg0KLmJvZHktLXNlcnAgLmZvb3RlciB7DQogIGRpc3BsYXk6IGZsZXg7DQogIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICBwYWRkaW5nLWxlZnQ6IHVuc2V0Ow0KfQ0K"},{"meta":{"name":"dogeCommonStyle.less","url":"http://ibaidu.tujidu.com/newcss/dogeCommonStyle.less?t=26.01","ts":1670421065994,"mimetype":"text/plain"},"source":"LypTdG9yZTogRG9nZUNvbW1vblN0eWxlKi8NCmJvZHkgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1Ow0KfQ0KDQoucmVzdWx0c19saW5rc19kZWVwIC5yZXN1bHRfX2ljb24gew0KICBkaXNwbGF5OiBub25lOw0KfQ0KDQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCBoMiB7DQogIGZvbnQtd2VpZ2h0OiA2MDA7DQp9DQoNCiNsaW5rc193cmFwcGVyIC5yZXN1bHRzLS1tYWluIHsNCiAgbWF4LXdpZHRoOiA2NzBweDsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAgew0KICB3aWR0aDogNjcwcHg7DQogIG92ZXJmbG93OiBoaWRkZW47DQogIG1hcmdpbi10b3A6IDBweDsNCiAgbWFyZ2luLWJvdHRvbTogMjVweDsNCiAgYm9yZGVyLXJhZGl1czogNXB4Ow0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOw0KICBib3gtc2l6aW5nOiBib3JkZXItYm94Ow0KICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7DQogIHRyYW5zaXRpb246IGFsbCAwLjI1cyBjdWJpYy1iZXppZXIoLjIzLCAxLCAuMzIsIDEpIDBzOw0KfQ0KDQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCAucmVzdWx0X190aXRsZSBhIHsNCiAgb3ZlcmZsb3c6IGhpZGRlbjsNCiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7DQogIG1heC13aWR0aDogNjQwcHg7DQogIGNvbG9yOiAjMzQ3NmQyOw0KICBmb250LXNpemU6IHNtYWxsZXI7DQp9DQoNCiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIC5yZXN1bHRfX2JvZHkgew0KICBwYWRkaW5nOiAxMnB4IDIwcHggIWltcG9ydGFudDsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXA6aG92ZXIgew0KICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMyk7DQogIGJveC1zaGFkb3c6IDAgMCAxcHggZ3JleTsNCiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMXB4IGdyZXk7DQogIC1tb3otYm94LXNoYWRvdzogMCAwIDFweCBncmF5Ow0KfQ0KDQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCBoMiB7DQogIGJhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7DQogIG1hcmdpbjogLTEycHggLTIwcHggMHB4IC0yMHB4Ow0KICBwYWRkaW5nOiA4cHggMjBweCA1cHg7DQogIGJvcmRlci1yYWRpdXM6IDVweCA1cHggMHB4IDBweDsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAgaDIgYTpob3ZlcjphZnRlciB7DQogIGxlZnQ6IDA7DQogIHdpZHRoOiAxMDAlOw0KICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICAtbW96LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICB0cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAgaDIgYTphZnRlciB7DQogIGNvbnRlbnQ6ICIiOw0KICBwb3NpdGlvbjogYWJzb2x1dGU7DQogIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjMzQ3NmQyOw0KICBib3R0b206IDFweDsNCiAgbGVmdDogMTAwJTsNCiAgd2lkdGg6IDA7DQogIC13ZWJraXQtdHJhbnNpdGlvbjogd2lkdGggMzUwbXMsIGxlZnQgMzUwbXM7DQogIC1tb3otdHJhbnNpdGlvbjogd2lkdGggMzUwbXMsIGxlZnQgMzUwbXM7DQogIHRyYW5zaXRpb246IHdpZHRoIDM1MG1zLCBsZWZ0IDM1MG1zOw0KfQ0KDQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCBoMiBhOnZpc2l0ZWQsDQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCBoMiBhOnZpc2l0ZWQgc3Ryb25nIHsNCiAgY29sb3I6ICM2NjAwOTk7DQp9DQoNCiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIGgyIGE6dmlzaXRlZDpob3ZlcjphZnRlciwNCiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIGgyIGE6dmlzaXRlZDpob3ZlcjphZnRlciB7DQogIGxlZnQ6IDA7DQogIHdpZHRoOiAxMDAlOw0KICAtd2Via2l0LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICAtbW96LXRyYW5zaXRpb246IHdpZHRoIDM1MG1zOw0KICB0cmFuc2l0aW9uOiB3aWR0aCAzNTBtczsNCn0NCg0KLyogU2VhcmNoSXRtZXMgQm90dG9tIHRvIFRvcCBhbmkgKi8NCiNsaW5rc193cmFwcGVyICNsaW5rcyB7DQogIGFuaW1hdGlvbi1uYW1lOiBhbmlfdG9wVG9idXR0b207DQogIGFuaW1hdGlvbi1kdXJhdGlvbjogLjNzOw0KICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOw0KfQ0KDQovKiBTZWFyY2hCYXIgTGVmdCB0byBSaWdodCBhbmkgKi8NCiNoZWFkZXJfd3JhcHBlciAuaGVhZGVyX19zZWFyY2gtd3JhcCB7DQogIGFuaW1hdGlvbi1uYW1lOiBhbmlfbGVmdFRvcmlnaHQ7DQogIGFuaW1hdGlvbi1kdXJhdGlvbjogLjNzOw0KICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsNCn0NCg0KLkFDLnNwLXNlcGFyYXRvciB7DQogIG1hcmdpbi10b3A6IC0xNXB4Ow0KfQ0K"},{"meta":{"name":"dogeOnePageStyle.less","url":"http://ibaidu.tujidu.com/newcss/dogeOnePageStyle.less?t=26.01","ts":1670421065999,"mimetype":"text/plain"},"source":"LypTdG9yZTogRG9nZU9uZVBhZ2VTdHlsZSovDQouanMtc2lkZWJhci1hZHMsICNvcmdhbmljLW1vZHVsZSwgLnBpbm5lZC10by1ib3R0b20gew0KICBkaXNwbGF5OiBub25lOw0KfQ0KDQouanMtcmVzdWx0LWhpZGRlbi1lbCB7DQogIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsNCn0NCg0KLnNpdGUtd3JhcHBlciAjd2ViX2NvbnRlbnRfd3JhcHBlciAuY3cgew0KICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgZGlzcGxheTogZmxleDsNCiAgbWF4LXdpZHRoOiB1bnNldDsNCn0NCg0KQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTAwMHB4KSB7DQogICNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIHsNCiAgICB3aWR0aDogMTAwJTsNCiAgfQ0KfQ0KDQojaGVhZGVyX3dyYXBwZXIgI2hlYWRlciwNCiN3ZWJfY29udGVudF93cmFwcGVyICNsaW5rc193cmFwcGVyIC5zZWFyY2gtZmlsdGVycy13cmFwLA0KI3dlYl9jb250ZW50X3dyYXBwZXIgI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1lc3NhZ2Ugew0KICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCiAgZGlzcGxheTogZ3JpZDsNCn0NCg0KI2hlYWRlcl93cmFwcGVyICNoZWFkZXIgew0KICBtYXgtd2lkdGg6IHVuc2V0Ow0KfQ0KDQojaGVhZGVyX3dyYXBwZXIgI2hlYWRlciAuaGVhZGVyX19zZWFyY2gtd3JhcCB7DQogIHdpZHRoOiA1MDBweDsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgew0KICBkaXNwbGF5OiBpbmxpbmUtZmxleDsNCiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogIHBhZGRpbmctbGVmdDogMDsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW4gew0KICBmbG9hdDogdW5zZXQ7DQogIG1heC13aWR0aDogODYwcHg7DQp9DQoNCiNsaW5rc193cmFwcGVyIC5yZXN1bHRzLS1zaWRlYmFyIHsNCiAgbWluLXdpZHRoOiB1bnNldDsNCiAgbWFyZ2luOiB1bnNldDsNCn0NCg0KLmJvZHktLXNlcnAgLmZvb3RlciB7DQogIGRpc3BsYXk6IGZsZXg7DQogIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICBwYWRkaW5nLWxlZnQ6IHVuc2V0Ow0KfQ0K"},{"meta":{"name":"dogeTwoPageStyle.less","url":"http://ibaidu.tujidu.com/newcss/dogeTwoPageStyle.less?t=26.01","ts":1670421066001,"mimetype":"text/plain"},"source":"LypTdG9yZTogRG9nZVR3b1BhZ2VTdHlsZSovDQouanMtc2lkZWJhci1hZHMsDQojbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tc2lkZWJhciwNCiNvcmdhbmljLW1vZHVsZSwNCi5waW5uZWQtdG8tYm90dG9tIHsNCiAgZGlzcGxheTogbm9uZTsNCn0NCg0KLmpzLXJlc3VsdC1oaWRkZW4tZWwgew0KICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7DQp9DQoNCi5zaXRlLXdyYXBwZXIgI3dlYl9jb250ZW50X3dyYXBwZXIgLmN3IHsNCiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogIGRpc3BsYXk6IGZsZXg7DQogIG1heC13aWR0aDogdW5zZXQ7DQogIG1hcmdpbi1sZWZ0OiAtMTUwcHg7DQp9DQoNCiNoZWFkZXJfd3JhcHBlciAjaGVhZGVyLA0KI3dlYl9jb250ZW50X3dyYXBwZXIgI2xpbmtzX3dyYXBwZXIgLnNlYXJjaC1maWx0ZXJzLXdyYXAsDQojd2ViX2NvbnRlbnRfd3JhcHBlciAjbGlua3Nfd3JhcHBlciAucmVzdWx0cy0tbWVzc2FnZSB7DQogIGp1c3RpZnktY29udGVudDogY2VudGVyOw0KICBkaXNwbGF5OiBncmlkOw0KfQ0KDQojaGVhZGVyX3dyYXBwZXIgI2hlYWRlciB7DQogIG1heC13aWR0aDogdW5zZXQ7DQp9DQoNCiNoZWFkZXJfd3JhcHBlciAjaGVhZGVyIC5oZWFkZXJfX3NlYXJjaC13cmFwIHsNCiAgd2lkdGg6IDUwMHB4Ow0KfQ0KDQojbGlua3Nfd3JhcHBlciB7DQogIGRpc3BsYXk6IGlubGluZS1mbGV4Ow0KICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW4gew0KICBmbG9hdDogdW5zZXQ7DQogIG1heC13aWR0aDogdW5zZXQ7DQp9DQoNCiNsaW5rc193cmFwcGVyIC5yZXN1bHRzLS1zaWRlYmFyIHsNCiAgbWluLXdpZHRoOiB1bnNldDsNCiAgbWFyZ2luOiB1bnNldDsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW4gI2xpbmtzIHsNCiAgd2lkdGg6IDgwdnc7DQogIC8qIFRoaXMgbWF5IGNhdXNlIFBhZ2UgZmFpbGVkICovDQogIGRpc3BsYXk6IGdyaWQ7DQogIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNTAlIDUwJTsNCiAgZ3JpZC10ZW1wbGF0ZS1hcmVhczogInhtYWluIHhtYWluIjsNCn0NCg0KI2xpbmtzX3dyYXBwZXIgLnJlc3VsdHMtLW1haW4gI2xpbmtzIC5yZXN1bHRzX2xpbmtzX2RlZXAgew0KICB3aWR0aDogdW5zZXQ7DQogIG1hcmdpbi1yaWdodDogMTVweDsNCn0NCg0KI2xpbmtzIC5yZXN1bHQtLW1vcmUsICNsaW5rcyAucmVzdWx0LS1zZXAgew0KICBncmlkLWNvbHVtbi1zdGFydDogMTsNCiAgZ3JpZC1jb2x1bW4tZW5kOiB4bWFpbi1lbmQ7DQogIHdpZHRoOiB1bnNldCAhaW1wb3J0YW50Ow0KICBwYWRkaW5nOiAwOw0KICBwYWRkaW5nLXJpZ2h0OiAxNXB4Ow0KfQ0KDQojbGlua3MgLnJlc3VsdC0tc2VwIHsNCiAgbWFyZ2luLWJvdHRvbTogMmVtOw0KfQ0KDQouYm9keS0tc2VycCAuZm9vdGVyIHsNCiAgZGlzcGxheTogZmxleDsNCiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7DQogIHBhZGRpbmctbGVmdDogdW5zZXQ7DQp9DQo="},{"meta":{"name":"HuYanStyle.less","url":"http://ibaidu.tujidu.com/newcss/HuYanStyle.less?t=26.02","ts":1670421066003,"mimetype":"text/plain"},"source":"LyoqU3RvcmUgSHVZYW5TdHlsZSoqLw0KLyoqKioqQmFpZHUtSHVZYW5TdHlsZSoqKioqLw0KYm9keVtiYWlkdV0sDQojd3JhcHBlciAjaGVhZCwNCiN3cmFwcGVyICNzX3RhYiwNCmZvcm0uZm0gLnNfaXB0X3dyLmJnIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsNCn0NCg0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0LW9wLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0LA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCBhcnRpY2xlLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCA+IC5jLWNvbnRhaW5lciwNCiN3cmFwcGVyICNycywNCiN3cmFwcGVyICNjb250ZW50X3JpZ2h0IHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI0FBQUFBQTsNCiAgYm9yZGVyOiAxcHggZG91YmxlICNBMkQ3RDQ7DQogIGJvcmRlci1yYWRpdXM6IDBweDsNCn0NCg0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0LW9wOmhvdmVyLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0OmhvdmVyLA0KI3dyYXBwZXIgI2NvbnRlbnRfbGVmdCAucmVzdWx0LW9wOmhvdmVyIGFydGljbGUgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDICFpbXBvcnRhbnQ7DQp9DQoNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLnJlc3VsdCBoM1tjbGFzc349J3QnXSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLnJlc3VsdC1vcCBoM1tjbGFzc349J3QnXSwNCiN3cmFwcGVyICNjb250ZW50X2xlZnQgLmMtY29udGFpbmVyIGgzW2NsYXNzfj0ndCddLA0KI3dyYXBwZXIgI3JzIC50dCB7DQogIGJhY2tncm91bmQtY29sb3I6ICNCQkJCQkI7DQp9DQoNCi8qKipCaW5nLUh1WWFuU3R5bGUqKioqLw0KLm5hX2NudCAubndzX2l0bSwNCi5ud3NfaXRtYiwNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyA+IGxpOm5vdCgjbWZhX3Jvb3QpLA0KYm9keSAjYl9oZWFkZXIgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjQUFBQUFBOw0KICBib3JkZXI6IDFweCBkb3VibGUgI0EyRDdENDsNCiAgYm9yZGVyLXJhZGl1czogMHB4Ow0KfQ0KDQojYl9jb250ZW50ICNiX3Jlc3VsdHMgbGk6aG92ZXIgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDICFpbXBvcnRhbnQ7DQp9DQoNCiNiX2NvbnRlbnQgI2JfcmVzdWx0cyBsaSBoMiB7DQogIGJhY2tncm91bmQtY29sb3I6ICNCQkJCQkI7DQp9DQoNCi8qKipHb29nbGUtSHVZYW5TdHlsZSoqKiovDQpib2R5W2dvb2dsZV0gew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZkRmRGZEOw0KfQ0KDQojcnNvIC5nLCAuYmtXTWdkID4gLmcsDQouYmtXTWdkIGctaW5uZXItY2FyZCwNCiNyaHNjb2wgI3JocywNCiNyaHNjb2wgI3JocyAuZyA+IGRpdiwNCi5jMnh6VGIgLmcsDQoucnVUY0lkIC5nLA0KLmZtMDZJZiAuZywNCi5jVW5RS2UgLmcsDQouSGFuUW1mIC5nLA0KI3JzbyAuZywNCiNyc28gLmtwLWJsaywNCiNyc28gLk1HcWpLLA0KI3JzbyA+IGRpdjpub3QoLmcpID4gKiB7DQogIGJhY2tncm91bmQtY29sb3I6ICNBQUFBQUE7DQogIGJvcmRlcjogMXB4IHNvbGlkICM5Y2QyY2ZBQTsNCiAgYm9yZGVyLXJhZGl1czogMHB4Ow0KfQ0KDQojcnNvIC5nOmhvdmVyLA0KLmJrV01nZCA+IC5nOmhvdmVyIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQyAhaW1wb3J0YW50Ow0KICBib3JkZXI6IDFweCBkb3VibGUgIzljZDJjZjsNCn0NCg0KLmJrV01nZCAuZyBkaXYuciwNCiNyc28gLmcgaDMgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjQkJCQkJCOw0KfQ0KDQovKioqU29nb3UtSHVZYW5TdHlsZSoqKiovDQpib2R5W3NvZ291XSwgI3BhZ2ViYXJfY29udGFpbmVyIGEgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZkRmRGZEOw0KfQ0KDQojbWFpbiAucmVzdWx0cyA+IGRpdiB7DQogIGJhY2tncm91bmQtY29sb3I6ICNBQUFBQUE7DQogIGJvcmRlcjogMXB4IHNvbGlkICM5Y2QyY2ZBQTsNCiAgYm9yZGVyLXJhZGl1czogMHB4Ow0KfQ0KDQojbWFpbiAucmVzdWx0cyA+IGRpdjpob3ZlciB7DQogIGJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0MgIWltcG9ydGFudDsNCiAgYm9yZGVyOiAxcHggZG91YmxlICM5Y2QyY2Y7DQp9DQoNCiNtYWluIC5yZXN1bHRzID4gZGl2IGgzIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI0JCQkJCQjsNCn0NCg0KLyoqKkR1Y2tfRG9nZS1IdVlhblN0eWxlKioqKi8NCmJvZHlbZHVja10sIGJvZHlbZG9nZV0gew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZkRmRGZEOw0KfQ0KDQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcCB7DQogIGJhY2tncm91bmQtY29sb3I6ICNBQUFBQUE7DQogIGJvcmRlcjogMXB4IHNvbGlkICM5Y2QyY2ZBQTsNCiAgYm9yZGVyLXJhZGl1czogMHB4Ow0KfQ0KDQojbGlua3Nfd3JhcHBlciAjbGlua3MgLnJlc3VsdHNfbGlua3NfZGVlcDpob3ZlciB7DQogIGJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0MgIWltcG9ydGFudDsNCiAgYm9yZGVyOiAxcHggZG91YmxlICM5Y2QyY2Y7DQp9DQoNCiNsaW5rc193cmFwcGVyICNsaW5rcyAucmVzdWx0c19saW5rc19kZWVwIGgyIHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI0JCQkJCQjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqQXV0byBEYXJrIE1vZGUqKioqKioqKioqKioqKioqKioqLw0KOnJvb3Qgew0KICAtLWJhY2stZ3JvdW5kLWNvbG9yLTE6ICMxMTE7DQogIC0tYmFjay1ncm91bmQtY29sb3ItMjogIzIyMjsNCiAgLS1iYWNrLWdyb3VuZC1jb2xvci0zOiAjMzMzOw0KICAtLWJhY2stZ3JvdW5kLWNvbG9yLTQ6ICM0NDQ7DQogIC0tdGV4dC1jb2xvci1ub21hbDogI2ZmZjsNCiAgLS10ZXh0LWNvbG9yLWVtOiAjZjY2Ow0KfQ0KDQovKioqICAqKioqLw0KQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgew0KICAjcnNvIC5nLCAudmtfYyB7DQogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFjay1ncm91bmQtY29sb3ItNCk7DQogIH0NCg0KICBpbWcgew0KICAgIGZpbHRlcjogYnJpZ2h0bmVzcygwLjgpOw0KICB9DQp9DQo="},{"meta":{"name":"BgAutoFit.less","url":"http://ibaidu.tujidu.com/newcss/BgAutoFit.less?t=26.03","ts":1670421066007,"mimetype":"text/plain"},"source":"LyoqU3RvcmUgQmcgQXV0b0ZpdCoqLw0KLyoqKioqQmFpZHUtQXV0b0ZpdCoqKioqLw0KYm9keVtiYWlkdV0gew0KICAjd3JhcHBlciB7DQogICAgLnJlc3VsdC1tb2xlY3VsZS5uZXctcG1kW3RwbD0iYXBwL2hlYWQtdGFiIl0gew0KICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsNCg0KICAgICAgI3NfdGFiIHsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7DQogICAgICAgIHBhZGRpbmctdG9wOiA2NnB4Ow0KICAgICAgICANCiAgICAgICAgYTpiZWZvcmV7DQogICAgICAgICAgY29sb3I6IGluaGVyaXQ7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgDQogICAgI2NvbnRlbnRfbGVmdCB7DQogICAgICAucmVzdWx0LCAucmVzdWx0LW9wIHsNCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgjRkZGLCAwLjcpOw0KICAgICAgICANCiAgICAgICAgaDN7DQogICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgjZjhmOGY4LCAwLjQpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KDQogICAgI2NvbnRlbnRfcmlnaHR7DQogICAgICBwYWRkaW5nOiAyMHB4IDE1cHggMTVweCAhaW1wb3J0YW50Ow0KICAgICAgYm9yZGVyLXJhZGl1czogNXB4Ow0KICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjY2Ow0KICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsNCiAgICAgIGJveC1zaGFkb3c6IDAgMCAyMHB4IDJweCByZ2JhKDAsIDAsIDAsIC4xKTsNCiAgICAgIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDIwcHggMnB4IHJnYmEoMCwgMCwgMCwgLjEpOw0KICAgICAgLW1vei1ib3gtc2hhZG93OiAwIDAgMjBweCAycHggcmdiYSgwLCAwLCAwLCAuMSk7DQogICAgfQ0KDQogICAgLy8gw6TCvsKnw6jCvsK5w6bCoMKPDQogICAgLm5ldy1wbWQgI3JzX25ld3sNCiAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoI0ZGRiwgMC43KTsNCiAgICB9DQogICAgDQogICAgLy8gw6XCusKVw6nCg8KoDQogICAgLnJlc3VsdC1tb2xlY3VsZS5uZXctcG1kew0KICAgICAgJlt0cGw9ImFwcC9wYWdlIl17DQogICAgICAgICNwYWdlIHsNCiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsNCiAgICAgICAgICBheyAvLyDDp8K/wrvDqcKhwrXDpsKMwonDqcKSwq4NCiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoI0ZGRiwgMC43KTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIA0KICAgICAgI2Zvb3R7IC8vIMOlwrrClcOpwoPCqMOowq/CtMOmwpjCjg0KICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKCNGRkYsIDAuNyk7DQogICAgICB9DQogICAgfQ0KICB9DQp9DQoNCi8qKioqKkdvb2dsZS1BdXRvRml0KioqKiovDQpib2R5W2dvb2dsZV0gew0KICAuc2ZiZ3sNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKCNGRkYsIDAuNyk7DQogIH0NCiAgI3RvcF9uYXYgLnlnNTF2Y3sNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsNCiAgfQ0KICAjcnMsICNyc28gLmd7DQogICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgjRkZGLCAwLjcpOw0KICB9DQogIC8vIMOkwr7Cp8Oowr7CucOmwqDCj8OowoPCjMOmwpnCr8OowonCsg0KICAuZEcyWElmew0KICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoI0ZGRiwgMC43KTsNCiAgfQ0KfQ0KLyoqKioqQmluZy1BdXRvRml0KioqKiovDQpib2R5W2JpbmddIHsNCiAgI2JfY29udGVudCB7DQogICAgI2JfcmVzdWx0c3sNCiAgICAgID4gbGk6bm90KCNtZmFfcm9vdCl7DQogICAgICAgIHotaW5kZXg6IDE7DQogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoI0ZGRiwgMC43KTsNCg0KICAgICAgICAuYl90aXRsZXsNCiAgICAgICAgICBtYXJnaW46IC0xMnB4IC0yMHB4Ow0KICAgICAgICAgIHBhZGRpbmc6IDVweCAyMHB4Ow0KICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoI0ZGRiwgMC40KTsNCiAgICAgICAgICANCiAgICAgICAgICBoMiBhew0KICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLmJfY2FwdGlvbiwgLm1hdHRyew0KICAgICAgICAgIG1hcmdpbi10b3A6IDI0cHg7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCi8qKioqKkR1Y2stQXV0b0ZpdCoqKioqLw0KLyoqKioqRG9nZS1BdXRvRml0KioqKiovDQovKioqKipDT01NT04qKioqKi8NCi5zcC1zZXBhcmF0b3IuQUN7DQogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoI0ZGRiwgMC45KSAhaW1wb3J0YW50Ow0KfQ0KLmJ1dHRvbi5naGhpZGVyew0KICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKCNmZmYsIDAuNyk7DQp9DQo="},{"meta":{"name":"LiteStyle.css","url":"https://gitcode.net/-/snippets/1906/raw/master/LiteStyle.css?inline=false","ts":1670421066743,"mimetype":"text/css"},"source":"LyoKISBWZXJzaW9uOiAyMDE4MDQyNzAwMAohIFRpdGxlOiAgYmFpZHUtbGl0ZVsyMDE4MDQyNzAwMF0KISBMYXN0IG1vZGlmaWVkOiAyMDE5LzA5LzA1CiEgRXhwaXJlczogMSBkYXlzICh1cGRhdGUgZnJlcXVlbmN5KQoKVGhpcyBzdHlsZSBpcyBmcm9tIHd3dy55aWNsZWFyLmNvbSwgYW5kIHRoYW5rcyB0aGUgYXV0aG9yIG9mIHRoZSBzaXRlLgoqLwoqe2ZvbnQtZmFtaWx5Oi1hcHBsZS1zeXN0ZW0sIkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsIk5pbWJ1cyBTYW5zIEwiLEFyaWFsLCJMaWJlcmF0aW9uIFNhbnMiLCJQaW5nRmFuZyBTQyIsIkhpcmFnaW5vIFNhbnMgR0IiLCJTb3VyY2UgSGFuIFNhbnMgQ04iLCJTb3VyY2UgSGFuIFNhbnMgU0MiLCJNaWNyb3NvZnQgWWFIZWkiLCJXZW5xdWFueWkgTWljcm8gSGVpIiwiV2VuUXVhbllpIFplbiBIZWkiLCJTVCBIZWl0aSIsU2ltSGVpLCJXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsc2Fucy1zZXJpZn0KOjotd2Via2l0LXNjcm9sbGJhcnt3aWR0aDo2cHg7aGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLDApfQo6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNre2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Cjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWJ7Ym9yZGVyLXJhZGl1czozcHg7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yKTt0cmFuc2l0aW9uOmFsbCAuNHMgZWFzZTstbW96LXRyYW5zaXRpb246YWxsIC40cyBlYXNlOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjRzIGVhc2U7LW8tdHJhbnNpdGlvbjphbGwgLjRzIGVhc2V9Cjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXJ7Ym9yZGVyLXJhZGl1czozcHg7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40KTt0cmFuc2l0aW9uOmFsbCAuNHMgZWFzZTstbW96LXRyYW5zaXRpb246YWxsIC40cyBlYXNlOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjRzIGVhc2U7LW8tdHJhbnNpdGlvbjphbGwgLjRzIGVhc2V9Ci5hbmltYXRlZHstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjoxczthbmltYXRpb24tZHVyYXRpb246MXM7YW5pbWF0aW9uLWZpbGwtbW9kZTpib3RofQpALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluVXB7ZnJvbXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCl9dG97b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fQpAa2V5ZnJhbWVzIGZhZGVJblVwe2Zyb217b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApfXRve29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX0KLmZhZGVJblVwey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZUluVXA7YW5pbWF0aW9uLW5hbWU6ZmFkZUluVXB9CkAtd2Via2l0LWtleWZyYW1lcyBib3VuY2VJblJpZ2h0ezYwJSw3NSUsOTAlLGZyb20sdG97LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSl9ZnJvbXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMzAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDMwMDBweCwwLDApfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTI1cHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTI1cHgsMCwwKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC01cHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTVweCwwLDApfXRvey13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fQpAa2V5ZnJhbWVzIGJvdW5jZUluUmlnaHR7NjAlLDc1JSw5MCUsZnJvbSx0b3std2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKX1mcm9te29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgzMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMzAwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNXB4LDAsMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19Ci5ib3VuY2VJblJpZ2h0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5SaWdodDthbmltYXRpb24tbmFtZTpib3VuY2VJblJpZ2h0fQpALXdlYmtpdC1rZXlmcmFtZXMgYm91bmNlSW5VcHs2MCUsNzUlLDkwJSxmcm9tLHRvey13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjIxNSwuNjEsLjM1NSwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpfWZyb217b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMzAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDMwMDBweCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTVweCwwKX10b3std2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX19CmF7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bWFyZ2luLWJvdHRvbToycHh9Ci5jLXNob3d1cmw6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Ym9yZGVyOm5vbmU7b3BhY2l0eTouODt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30KLnJlcy1nYXAtcmlnaHQxNjpob3Zlcntib3JkZXItYm90dG9tOiMzNDc2ZDIgMS4ycHggc29saWR9Ci5jLXNob3d1cmx7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9Ci5jLXRpcC1hcnJvdzpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZTtib3JkZXI6bm9uZX0KLmMtZGVmYXVsdCBhe3RleHQtZGVjb3JhdGlvbjpub25lO2JvcmRlcjpub25lfQouYy1nYXAtYm90dG9tIGE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0KLm9wX2RpY3QzX21vcmVsaW5rIGE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0KLmMtYnRuOmhvdmVye3RleHQtZGVjb3JhdGlvbjpub25lIWltcG9ydGFudH0KdGQgYTpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfQplbXt0ZXh0LWRlY29yYXRpb246bm9uZSFpbXBvcnRhbnR9CiNzX3dyYXB7ZGlzcGxheTpub25lfQoucy10b3AtbmF2e2Rpc3BsYXk6bm9uZX0KI3NfY3RuZXJfbWVudXN7ZGlzcGxheTpub25lfQojc19tZW51X2d1cmR7ZGlzcGxheTpub25lfQojc19zdHJweF9zcGFuMXtkaXNwbGF5Om5vbmV9CiNmdENvbntkaXNwbGF5Om5vbmV9CiNib3R0b21fY29udGFpbmVye2Rpc3BsYXk6bm9uZX0KI2xne2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlcjtoZWlnaHQ6NzBweDtwYWRkaW5nLXRvcDoxNTBweH0KI2xnIGltZ3tkaXNwbGF5Om5vbmV9CiNsZyBhe2Rpc3BsYXk6bm9uZX0KI2hlYWRfd3JhcHBlcntwYWRkaW5nLWJvdHRvbTowfQouc19mb3JtX3dyYXBwZXJ7bWFyZ2luLXRvcDphdXRvO2Rpc3BsYXk6IGZsZXg7fQojc19sZ19pbWcsI3NfbGdfaW1nX25ld3tkaXNwbGF5Om5vbmUhaW1wb3J0YW50fQojZm9ybSAuc19pcHRfd3J7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czozcHg7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7YmFja2dyb3VuZC1wb3NpdGlvbjoxMDAlIWltcG9ydGFudDtoZWlnaHQ6MzlweDtmb250LWZhbWlseTotYXBwbGUtc3lzdGVtLCJIZWx2ZXRpY2EgTmV1ZSIsSGVsdmV0aWNhLCJOaW1idXMgU2FucyBMIixBcmlhbCwiTGliZXJhdGlvbiBTYW5zIiwiUGluZ0ZhbmcgU0MiLCJIaXJhZ2lubyBTYW5zIEdCIiwiU291cmNlIEhhbiBTYW5zIENOIiwiU291cmNlIEhhbiBTYW5zIFNDIiwiTWljcm9zb2Z0IFlhSGVpIiwiV2VucXVhbnlpIE1pY3JvIEhlaSIsIldlblF1YW5ZaSBaZW4gSGVpIiwiU1QgSGVpdGkiLFNpbUhlaSwiV2VuUXVhbllpIFplbiBIZWkgU2hhcnAiLHNhbnMtc2VyaWY7cGFkZGluZy10b3A6NHB4fQouc19pcHR7Zm9udC1mYW1pbHk6LWFwcGxlLXN5c3RlbSwiSGVsdmV0aWNhIE5ldWUiLEhlbHZldGljYSwiTmltYnVzIFNhbnMgTCIsQXJpYWwsIkxpYmVyYXRpb24gU2FucyIsIlBpbmdGYW5nIFNDIiwiSGlyYWdpbm8gU2FucyBHQiIsIlNvdXJjZSBIYW4gU2FucyBDTiIsIlNvdXJjZSBIYW4gU2FucyBTQyIsIk1pY3Jvc29mdCBZYUhlaSIsIldlbnF1YW55aSBNaWNybyBIZWkiLCJXZW5RdWFuWWkgWmVuIEhlaSIsIlNUIEhlaXRpIixTaW1IZWksIldlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIixzYW5zLXNlcmlmfQojZm9ybSAuc19pcHRfd3I6aG92ZXJ7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czoycHg7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9Ci5pcHRob3Zlcnt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30KLmlwdGZvY3Vze2JveC1zaGFkb3c6MCAycHggNXB4IDAgcmdiYSgwLDAsMCwuMTYpLDAgMnB4IDEwcHggMCByZ2JhKDAsMCwwLC4xMil9CmJvZHkgI2Zvcm0gLnNfYnRue3dpZHRoOjMycHg7aGVpZ2h0OjMycHg7Ym9yZGVyLXJhZGl1czo1MCU7Zm9udC1zaXplOjA7Ym9yZGVyOm5vbmU7Ym94LXNoYWRvdzpub25lO21hcmdpbi1sZWZ0OjA7ei1pbmRleDoxMDA7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7bWFyZ2luLXRvcDowO29wYWNpdHk6MH0KYm9keSAjZm9ybSAuc19idG46aG92ZXJ7b3BhY2l0eTouNTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMCk7Ym9yZGVyOm5vbmU7Ym94LXNoYWRvdzpub25lO3RyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW1vei10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzfQpib2R5ICNmb3JtIC5zX2J0bl93cnt3aWR0aDozMnB4O2hlaWdodDozMnB4O2JvcmRlci1yYWRpdXM6NTAlO2ZvbnQtc2l6ZTowO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwKTtiYWNrZ3JvdW5kLXBvc2l0aW9uOjUwJTtib3JkZXI6bm9uZTtib3gtc2hhZG93Om5vbmU7bWFyZ2luLWxlZnQ6NXB4O3otaW5kZXg6MTAwO3RyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW1vei10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzO21hcmdpbi10b3A6NnB4fQpib2R5ICNmb3JtIC5zX2J0bl93cjpob3ZlcntvcGFjaXR5Oi41O2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwKTtib3JkZXI6bm9uZTtib3gtc2hhZG93Om5vbmU7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9Ci5idG5ob3ZlcntvcGFjaXR5Oi41O2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwKSFpbXBvcnRhbnQ7Ym9yZGVyOm5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZTt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30KLmhpbnRfdG9wcnFfdGlwc3ttYXJnaW4tYm90dG9tOjEycHh9Ci5zX2Zvcm17aGVpZ2h0Ojc1cHg7cGFkZGluZy10b3A6MTBweH0KI3NfdGFie3BhZGRpbmc6ODdweCAwIDAgMTIxcHg7fQojaGVhZC5zX2Rvd257Ym94LXNoYWRvdzowIDAgNXB4ICM2NjY7cGFkZGluZy1ib3R0b206IDhweDt9Ci5iZHN1Z3t0b3A6NDJweDtib3gtc2hhZG93OjAgMnB4IDVweCAwIHJnYmEoMCwwLDAsLjE2KSwwIDJweCAxMHB4IDAgcmdiYSgwLDAsMCwuMTIpO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6MCAwIDJweCAycHg7Zm9udC1mYW1pbHk6LWFwcGxlLXN5c3RlbSwiSGVsdmV0aWNhIE5ldWUiLEhlbHZldGljYSwiTmltYnVzIFNhbnMgTCIsQXJpYWwsIkxpYmVyYXRpb24gU2FucyIsIlBpbmdGYW5nIFNDIiwiSGlyYWdpbm8gU2FucyBHQiIsIlNvdXJjZSBIYW4gU2FucyBDTiIsIlNvdXJjZSBIYW4gU2FucyBTQyIsIk1pY3Jvc29mdCBZYUhlaSIsIldlbnF1YW55aSBNaWNybyBIZWkiLCJXZW5RdWFuWWkgWmVuIEhlaSIsIlNUIEhlaXRpIixTaW1IZWksIldlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIixzYW5zLXNlcmlmO30KLmJnc3VnIGxpe2ZvbnQtZmFtaWx5OkhlbHZldGljYSwiTWljcm9zb2Z0IFlhaGVpIFVJIiFpbXBvcnRhbnQ7d2lkdGg6MTAwJSFpbXBvcnRhbnQ7bGluZS1oZWlnaHQ6MzZweCFpbXBvcnRhbnR9Ci5iZ3N1ZyB1bCBsaXtsaW5lLWhlaWdodDozMnB4IWltcG9ydGFudH0KLmJkc3VnLW92ZXJmbG93e2ZvbnQtZmFtaWx5OkhlbHZldGljYSwiTWljcm9zb2Z0IFlhaGVpIFVJIiFpbXBvcnRhbnQ7d2lkdGg6NTgzcHghaW1wb3J0YW50fQojcXVpY2tkZWxldGV7dG9wOjVweCFpbXBvcnRhbnQ7b3BhY2l0eTouNX0KI2t3X3RpcHtmb250LWZhbWlseTpIZWx2ZXRpY2EsIk1pY3Jvc29mdCBZYWhlaSBVSSBMaWdodCJ9CiNyZXN1bHRfbG9nb3tiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejRLUENFdExTQkhaVzVsY21GMGIzSTZJRUZrYjJKbElFbHNiSFZ6ZEhKaGRHOXlJREU1TGpJdU1Td2dVMVpISUVWNGNHOXlkQ0JRYkhWbkxVbHVJQzRnVTFaSElGWmxjbk5wYjI0NklEWXVNREFnUW5WcGJHUWdNQ2tnSUMwdFBnbzhjM1puSUhabGNuTnBiMjQ5SWpFdU1TSWdhV1E5SXVXYnZ1V3hnbDh4SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhodGJHNXpPbmhzYVc1clBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJaUI0UFNJd2NIZ2lJSGs5SWpCd2VDSUtDU0IyYVdWM1FtOTRQU0l3SURBZ01UQXhJRE16SWlCemRIbHNaVDBpWlc1aFlteGxMV0poWTJ0bmNtOTFibVE2Ym1WM0lEQWdNQ0F4TURFZ016TTdJaUI0Yld3NmMzQmhZMlU5SW5CeVpYTmxjblpsSWo0S1BITjBlV3hsSUhSNWNHVTlJblJsZUhRdlkzTnpJajRLQ1M1emREQjdabWxzYkRvak5EZzNPVUpFTzMwS0NTNXpkREY3Wm1sc2JEb2pSRVEwTkRNMk8zMEtDUzV6ZERKN1ptbHNiRG9qUmtaR1JrWkdPMzBLUEM5emRIbHNaVDRLUEhCaGRHZ2dZMnhoYzNNOUluTjBNQ0lnWkQwaVRUVXdMalFzTVRVdU0yTXRNeTQ0TERBdU15MDBMREl1TmkwMUxqY3NOQzQzWXkweExqZ3NNaTR5TFRVdU5TdzBMakV0Tml3MkxqZGpMVEF1Tml3ekxqTXNNUzR6TERVdU1Td3pMRFV1TjJNeExqa3NNQzQyTERZdU1pMHdMalVzT0M0MExUQXVOV2d3TGpJS0NXZ3dMakpqTWk0eUxEQXNOaTQwTERFdU1TdzRMalFzTUM0MVl6RXVPQzB3TGpZc015NDFMVE11TWl3ekxUVXVOMk10TUM0MExUSXVNUzAwTGpRdE5DNDFMVFl1TWkwMkxqZEROVFF1TWl3eE9DdzFOQzR6TERFMUxqWXNOVEF1TkN3eE5TNHplaUJOTXpjc01UUXVPQW9KWXpBc01pNDBMREV1Tml3MExqTXNNeTQwTERRdU0yTXhMamtzTUN3ekxqUXRNUzQ1TERNdU5DMDBMak5qTUMweUxqUXRNUzQyTFRRdU15MHpMalF0TkM0elV6TTNMREV5TGpVc016Y3NNVFF1T0hvZ1RUUXpMamtzT0M0Mll6QXNNaTQxTERFdU5TdzBMalVzTXk0ekxEUXVOUW9KWXpFdU9Dd3dMRE11TXkweUxqRXNNeTR6TFRRdU5WTTBPU3cwTGpFc05EY3VNU3cwTGpGRE5EVXVNeXcwTERRekxqa3NOaXcwTXk0NUxEZ3VObm9nVFRVeUxqSXNPQzQxWXpBc01pNHpMREV1TkN3MExqTXNNeTR5TERRdU0zTXpMakl0TVM0NUxETXVNaTAwTGpOekxURXVOQzAwTGpNdE15NHlMVFF1TXdvSlV6VXlMaklzTmk0eUxEVXlMaklzT0M0MWVpQk5OVGN1TlN3eE5TNDVZekFzTWk0ekxERXVOU3cwTGpNc015NHpMRFF1TTJNeExqZ3NNQ3d6TGpNdE1TNDVMRE11TXkwMExqTnpMVEV1TlMwMExqTXRNeTR6TFRRdU0wTTFPQzQ1TERFeExqWXNOVGN1TlN3eE15NDJMRFUzTGpVc01UVXVPWG9pTHo0S1BIQmhkR2dnWTJ4aGMzTTlJbk4wTVNJZ1pEMGlUVFFzTXpBdU5IWXROUzR4YURZdU5HTXhMallzTUN3eExqWXNNQzR6TERFdU5pd3lkakV1TkdNd0xERXVOaTB5TGpNc01TNDRMVE11T1N3eExqaE1OQ3d6TUM0MFREUXNNekF1TkhvZ1RUUXNNak4yTFRRdU9HZzBMakVLQ1dNeExqWXNNQ3d6TGprc01Dd3pMamtzTWk0eGRqQXVNV013TERFdU5DMHdMalVzTWk0MkxURXVPQ3d5TGpaRE1UQXVNeXd5TXl3MExESXpMRFFzTWpONklFMHhMamNzTVRaMk1UWXVNMmcyTGpSak15d3dMRFl1TWl3d0xEWXVNaTB6TGpaMkxURXVNV013TFRFdU5pMHdMakV0TWk0M0xURXVNUzB6TGpVS0NXTXhMVEF1T0N3eExqRXRNaTR6TERFdU1TMHpMalpzTUN3d1l6QXROQzQxTFRNdU1pMDBMalV0Tmk0eUxUUXVOVXd4TGpjc01UWk1NUzQzTERFMmVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXhJaUJrUFNKTk1qVXNNamd1T1dNdE1TNHhMREV1TVMwekxqTXNNUzR6TFRNdU5Td3hMak5qTFRFdU15d3dMVEl1Tnkwd0xqVXRNaTQzTFRJdU1XTXdMVEV1TkN3d0xqVXRNaTR6TERJdU1TMHlMak5qTVM0ekxEQXNNaTQ0TERBdU1TdzBMakVzTUM0MlZqSTRMamw2Q2drZ1RUSXhMalFzTXpJdU0yTXdMalFzTUN3eUxqTXRNQzR4TERNdU55MHdMamxzTUM0eUxEQXVOMmd5TGpGMkxUZ3VPV013TFRNdU5pMHlMak10TlMwMUxqY3ROV010TVM0NExEQXROQzR6TERBdU55MDBMamNzTUM0NWJEQXVOQ3d5TGpOak1TNDJMVEF1Tml3ekxUQXVOaXcwTGpJdE1DNDJDZ2xqTVM0NExEQXNNeTR6TERBdU5pd3pMak1zTWk0MlZqSTBZeTB4TFRBdU5DMHlMalF0TUM0MkxUUXVNUzB3TGpaakxUTXNNQzAwTGpVc01TNDJMVFF1TlN3MExqZERNVFl1TkN3ek1TNDRMREU1TGpZc016SXVNeXd5TVM0MExETXlMak42SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERFaUlHUTlJazB6TUM0eUxERTJMakZqTUN3d0xqWXNNQzQyTERFdU1pd3hMak1zTVM0eVl6QXVPQ3d3TERFdU15MHdMallzTVM0ekxURXVNbU13TFRBdU55MHdMall0TVM0ekxURXVNeTB4TGpORE16QXVPQ3d4TkM0NExETXdMaklzTVRVdU15d3pNQzR5TERFMkxqRjZDZ2tnVFRNd0xqTXNNekl1TVdneUxqUldNVGd1TldndE1pNDBWak15TGpGNklpOCtDanh3WVhSb0lHTnNZWE56UFNKemRERWlJR1E5SWswM01TNHlMREl5TGpGb09DNDBZekF1TkN3d0xqRXNNQzQyTERBdU15d3dMallzTUM0M2RqSXVObWd0T1M0M2RpMHlMalpETnpBdU5pd3lNaTQwTERjd0xqZ3NNakl1TWl3M01TNHlMREl5TGpGNklFMDNNUzR5TERNd0xqVUtDV010TUM0MExEQXRNQzQyTFRBdU15MHdMamN0TUM0NGRpMHlMalpvT1M0M2RqSXVObU13TERBdU5DMHdMaklzTUM0M0xUQXVOaXd3TGpkSU56RXVNbm9nVFRjekxqWXNNVGhqTFRBdU1Td3dMalF0TUM0eExEQXVPUzB3TGpRc01TNDNZeTB3TGpFc01DNHpMVEF1TVN3d0xqVXRNQzR4TERBdU53b0phQzB5TGpaakxURXVNeXd3TGpFdE1TNDVMREF1T0MweUxESjJOeTQ1WXpBdU1Td3hMakVzTUM0NExERXVPQ3d5TERFdU9XZ3hNR014TGpJdE1DNHhMREV1T0Mwd0xqY3NNUzQ1TFRFdU9IWXROeTQ1WXkwd0xqRXRNUzR6TFRBdU55MHhMamt0TVM0NUxUSXVNV2d0TlFvSll6QXVNUzB3TGpNc01DNHhMVEF1T0N3d0xqTXRNUzQwWXpBdU1TMHdMalFzTUM0eExUQXVOeXd3TGpFdE1DNDVhRGN1TW5ZdE1TNDRTRFkzTGpSV01UaE1Oek11Tml3eE9FdzNNeTQyTERFNGVpSXZQZ284Y0dGMGFDQmpiR0Z6Y3owaWMzUXhJaUJrUFNKTk9UTXVOeXd5TWk0M1l5MHdMalF0TUM0eExUQXVOUzB3TGpJdE1DNDFMVEF1TlhZdE1DNDJhRE11TW5Zd0xqWmpMVEF1TVN3d0xqTXRNQzR5TERBdU5DMHdMalVzTUM0MVNEa3pMamQ2SUUwNU5pNDJMREkwTGpFS0NXTXhMakV0TUM0eExERXVOaTB3TGpVc01TNDJMVEV1TkhZdE1XZ3lMak4yTFRFdU5XZ3RNaTR6ZGkweExqRm9MVEV1T0hZeExqRm9MVE11TW5ZdE1TNHhhQzB4TGpoMk1TNHhhQzB5TGpOMk1TNDFhREl1TTNZeFl6QXVNU3d3TGprc01DNDJMREV1TkN3eExqWXNNUzQwU0RrMkxqWjZDZ2tnVFRrMExqZ3NNekF1TkdNeExqWXNNQzQ0TERNdU5Dd3hMak1zTlM0MExERXVPR3d3TGprdE1TNDNZeTB4TGpRdE1DNHlMVEl1T1Mwd0xqWXROQzQwTFRFdU1XTXhMakV0TUM0NExESXRNUzQyTERJdU55MHlMalZqTUM0ekxUQXVOQ3d3TGpRdE1DNDVMREF1TWkweExqTUtDV010TUM0ekxUQXVOaTB3TGpndE1DNDVMVEV1TkMwd0xqbG9MVGwyTVM0MWFEY3VOMk13TGpJc01Dd3dMalFzTUM0eExEQXVOQ3d3TGpGek1Dd3dMakV0TUM0eExEQXVNMk10TUM0MkxEQXVOaTB4TGpRc01TNHpMVEl1TXl3eExqaGpMVEV1TWkwd0xqY3RNaTR4TFRFdU15MHlMalF0TVM0NGFDMHlMaklLQ1dNd0xqa3NNU3d4TGpnc01TNDVMREl1T1N3eUxqZGpMVEV1Tml3d0xqWXRNeTR6TERFdU1TMDBMamtzTVM0emJEQXVPU3d4TGpaRE9URXVNeXd6TVM0NExEa3pMaklzTXpFdU1TdzVOQzQ0TERNd0xqUjZJRTA0T0M0ekxESTFMakoyTFRaak1DNHhMVEF1Tml3d0xqTXRNQzQ1TERBdU9DMHdMamtLQ1dneE1TNDRkaTB4TGpaSU9UVmpMVEF1TVMwd0xqRXRNaTR5TFRBdU1TMHlMaklzTUdndE5DNDNZeTB4TGpFc01DNHhMVEV1Tnl3d0xqa3RNUzQ0TERJdU1sWXlOV013TGpFc01pNHhMVEF1TkN3MExqUXRNUzR4TERZdU4yd3hMamtzTUM0MkNnbERPRGN1T1N3eU9TNDVMRGc0TGpNc01qY3VOaXc0T0M0ekxESTFMako2SWk4K0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERJaUlHUTlJazAwTmk0ekxESTBMakpqTUM0MkxEQXNNUzR5TERBdU1Td3hMamNzTUM0MGRqTXVOR013TERBdU15MHdMallzTVMweExqa3NNV010TVM0MUxEQXRNUzQ0TFRBdU5pMHhMamd0TWk0eGRpMHdMallLQ1VNME5DNHlMREkwTGpnc05EUXVOeXd5TkM0eUxEUTJMak1zTWpRdU1ub2dUVFE1TGpJc01qQXVOMGcwT0hZeUxqVkRORGN1Tml3eU15NHhMRFEzTERJekxEUTJMak1zTWpOakxUSXVOeXd3TFRNdU15d3hMVE11TXl3ekxqVjJNQzR6WXpBc01pNDBMREF1T1N3ekxqTXNNeTR5TERNdU13b0pZekF1T0N3d0xERXVNeTB3TGpFc01TNDRMVEF1Tld3d0xqRXNNQzQyYURFdU1VdzBPUzR5TERJd0xqZE1ORGt1TWl3eU1DNDNlaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F5SWlCa1BTSk5OVFl1Tnl3eU0yZ3RNUzR5ZGpVdU1tTXRNQzQyTERBdU5DMHhMamNzTUM0MkxUSXVOQ3d3TGpaakxUQXVPQ3d3TFRFdE1DNDBMVEV0TVM0emRpMDBMalpvTFRFdU1YWTBMamhqTUN3eExqWXNNQzQxTERJdU15d3lMakVzTWk0ekNnbGpNU3d3TERJdU1TMHdMak1zTWk0MkxUQXVObXd3TGpFc01DNDJhREV1TVZZeU0zb2lMejRLUEhCaGRHZ2dZMnhoYzNNOUluTjBNU0lnWkQwaVRUa3lMamNzTVRVdU4yTXdMVEF1Tnl3d0xqWXRNUzR6TERFdU1pMHhMak5qTUM0MkxEQXNNUzR5TERBdU5pd3hMaklzTVM0elV6azBMalVzTVRjc09UTXVPU3d4TjBNNU15NHpMREUyTGprc09USXVOeXd4Tmk0ekxEa3lMamNzTVRVdU4zb2lMejRLUEM5emRtYytDZz09Iik7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyO3dpZHRoOjEwMXB4O2hlaWdodDozM3B4O21hcmdpbi10b3A6OXB4fQojcmVzdWx0X2xvZ28gaW1ne2Rpc3BsYXk6bm9uZTt2aXNpYmlsaXR5OmhpZGRlbn0KI3Jlc3VsdF9sb2dvIGEgaW1ne2Rpc3BsYXk6bm9uZTt2aXNpYmlsaXR5OmhpZGRlbn0KLnJlc3VsdC5jLWNvbnRhaW5lcntsaW5lLWhlaWdodDoxLjY1fQojcnN7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLDApIWltcG9ydGFudH0KLmMtYm9yZGVyey13ZWJraXQtYm94LXNoYWRvdzowIDJweCA1cHggMCByZ2JhKDAsMCwwLC4xNiksMCAycHggMTBweCAwIHJnYmEoMCwwLDAsLjEyKTtib3gtc2hhZG93OjAgMnB4IDVweCAwIHJnYmEoMCwwLDAsLjE2KSwwIDJweCAxMHB4IDAgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yYWRpdXM6MnB4O2JvcmRlcjpub25lO3BhZGRpbmc6MjBweDt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30KLmMtYm9yZGVyOmhvdmVye2JveC1zaGFkb3c6MCAzcHggMTBweCByZ2JhKDAsMCwwLC4xNiksMCAzcHggMTBweCByZ2JhKDAsMCwwLC4yMyk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW1vei10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzfQouYy10YWJzLW5hdntib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjJweCAycHggMCAwO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30KLmMtdGFicy1uYXYtbW92ZXRvcHttYXJnaW4tbGVmdDotMjBweDttYXJnaW4tcmlnaHQ6LTIwcHg7bWFyZ2luLXRvcDotMjBweDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9Ci5jLXRhYnMtbmF2LXNlbGVjdGVke2JvcmRlci10b3A6bm9uZSFpbXBvcnRhbnQ7Ym9yZGVyLWxlZnQ6bm9uZSFpbXBvcnRhbnQ7Ym9yZGVyLXJpZ2h0Om5vbmUhaW1wb3J0YW50O3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30KLmMtdGFicy1uYXYtc2Vwe2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9CiNwYWdlIGF7aGVpZ2h0OjM0cHg7Ym9yZGVyLXJhZGl1czoycHg7Ym9yZGVyOm5vbmUhaW1wb3J0YW50O2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwKTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9CiNwYWdlIGE6aG92ZXJ7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW1vei10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzfQojcGFnZSBhIC5wYzpob3Zlcnt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9CiNwYWdlIHN0cm9uZ3toZWlnaHQ6MzRweDtib3JkZXItcmFkaXVzOjJweDtwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6LTJweDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9CiNwYWdlIHN0cm9uZyAucGN7bGluZS1oZWlnaHQ6MzRweDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9Ci5ma3tkaXNwbGF5Om5vbmUhaW1wb3J0YW50fQoucGN7Ym9yZGVyOm5vbmUhaW1wb3J0YW50O2hlaWdodDozNXB4O3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30KLnBjOmhvdmVye3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30KI3NfdGFiIGF7d2lkdGg6NTlweDtsaW5lLWhlaWdodDo0NHB4fQojc190YWIgYnt3aWR0aDo1OXB4O2xpbmUtaGVpZ2h0OjQ0cHh9CiNzX3RhYntwYWRkaW5nLWJvdHRvbTo4cHg7cGFkZGluZy10b3A6ODlweH0KLmMtaWNvbi10aWViYXtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXJ9Ci50b2luZGV4e2Rpc3BsYXk6bm9uZX0KLndyYXBwZXJfbmV3IC5zX3RhYl9pbm5lcntwYWRkaW5nLXRvcDogMTBweDt9Ci53cmFwcGVyX25ldyAuc19pcHRfd3J7YmFja2dyb3VuZDogI2ZmZmZmZjt9Ci53cmFwcGVyX25ldy53cmFwcGVyX3MgI2Zvcm0gLmJkc3VnLW5ld3t3aWR0aDogOTMlO30KI3UgLnBme2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlcjtmb250LXNpemU6MDtwYWRkaW5nOjE0cHg7b3BhY2l0eTouODstbW96LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7LW8tdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7cGFkZGluZy10b3A6MThweDtwYWRkaW5nLWJvdHRvbToxMHB4O30KI3UgLnBmOmhvdmVye29wYWNpdHk6MTsgLW1vei10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstd2Via2l0LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy1vLXRyYW5zaXRpb246YWxsIC4zcyBlYXNlfQoud3JhcHBlcl9uZXcgI3U+YS5wZntjb2xvcjpyZ2JhKDAsMCwwLDApOyBtYXJnaW46IDRweCAwIDAgMjRweDt9Ci53cmFwcGVyX25ldyAjdT5hLnBmOmhvdmVye2NvbG9yOnJnYmEoMCwwLDAsMCl9Ci5wZiAuYy1pY29ue2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9Ci5jLWljb24tdHJpYW5nbGUtZG93bntkaXNwbGF5Om5vbmV9Ci5iZHBmbWVudXtib3gtc2hhZG93OjAgMnB4IDVweCAwIHJnYmEoMCwwLDAsLjE2KSwwIDJweCAxMHB4IDAgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yYWRpdXM6MnB4IWltcG9ydGFudDtib3JkZXI6bm9uZTt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczttYXJnaW4tbGVmdDotMTBweDttYXJnaW4tdG9wOjMwcHg7ei1pbmRleDo4ODg4IWltcG9ydGFudH0KLmJkcGZtZW51IGE6aG92ZXJ7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9Ci5iZG51YXJyb3d7ZGlzcGxheTpub25lIWltcG9ydGFudH0KLnNldHByZWZ7Ym9yZGVyLXJhZGl1czoycHggMnB4IDAgMDt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30KLnNldHByZWY6aG92ZXJ7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9CiN1IC5sYntwYWRkaW5nOjIzcHg7Ym9yZGVyLXJhZGl1czo1MHB4O2ZvbnQtc2l6ZTowO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjUwcHg7dG9wOjM4MDAlO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlcjtib3gtc2hhZG93OnJnYmEoMCwwLDAsLjE1Njg2MykgMCAzcHggMTBweCxyZ2JhKDAsMCwwLC4yMjc0NTEpIDAgM3B4IDEwcHg7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9CiN1IC5sYjpob3Zlcnt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30KI3UgLmxiOmFjdGl2ZXtib3gtc2hhZG93OjAgMTBweCAzMHB4IHJnYmEoMCwwLDAsLjE5KSwwIDZweCAxMHB4IHJnYmEoMCwwLDAsLjIzKTt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1tb3otdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstd2Via2l0LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW8tdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30KLnRhbmctZm9yZWdyb3VuZHtib3JkZXItcmFkaXVzOjJweDtib3gtc2hhZG93OjAgMTlweCA2MHB4IHJnYmEoMCwwLDAsLjMpLDAgMTVweCAyMHB4IHJnYmEoMCwwLDAsLjIyKX0KI3NfdXBmdW5jX21lbnVze2Rpc3BsYXk6bm9uZX0KI2Jne2JhY2tncm91bmQtY29sb3I6I0ZGRkZGRiFpbXBvcnRhbnQ7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czozcHg7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7YmFja2dyb3VuZC1wb3NpdGlvbjoxMDAlIWltcG9ydGFudDt6LWluZGV4Oi0xO3dpZHRoOjYwMHB4O2hlaWdodDozOXB4O2ZvbnQtZmFtaWx5Oi1hcHBsZS1zeXN0ZW0sIkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsIk5pbWJ1cyBTYW5zIEwiLEFyaWFsLCJMaWJlcmF0aW9uIFNhbnMiLCJQaW5nRmFuZyBTQyIsIkhpcmFnaW5vIFNhbnMgR0IiLCJTb3VyY2UgSGFuIFNhbnMgQ04iLCJTb3VyY2UgSGFuIFNhbnMgU0MiLCJNaWNyb3NvZnQgWWFIZWkiLCJXZW5xdWFueWkgTWljcm8gSGVpIiwiV2VuUXVhbllpIFplbiBIZWkiLCJTVCBIZWl0aSIsU2ltSGVpLCJXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsc2Fucy1zZXJpZjtwYWRkaW5nLXRvcDo1cHghaW1wb3J0YW50fQojaGVhZF93cmFwcGVyIC5zX2lwdHtib3JkZXI6MCFpbXBvcnRhbnQ7aGVpZ2h0OjIwcHghaW1wb3J0YW50O2JvcmRlci1yYWRpdXM6MnB4O3dpZHRoOjU4NnB4IWltcG9ydGFudH0KI2hlYWRfd3JhcHBlciAubm9iZ19zX2ZtX2hvdmVye2JvcmRlcjowIWltcG9ydGFudH0KI2hlYWRfd3JhcHBlciAubm9iZ19zX2ZtX2ZvY3Vze2JvcmRlcjowIWltcG9ydGFudDtib3JkZXItdG9wOjAgc29saWQgI2ZmZiFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbTowIHNvbGlkICNmZmYhaW1wb3J0YW50O2JvcmRlci1sZWZ0OjAgc29saWQgI2ZmZiFpbXBvcnRhbnQ7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjMzhmfQoucy10aXRsZS1pbWFnZXtib3JkZXI6bm9uZSFpbXBvcnRhbnQ7Ym9yZGVyLXRvcDowIHNvbGlkICNmZmYhaW1wb3J0YW50O2JvcmRlci1ib3R0b206MCBzb2xpZCAjZmZmIWltcG9ydGFudDtib3JkZXItbGVmdDowIHNvbGlkICNmZmYhaW1wb3J0YW50O2JvcmRlci1yaWdodDowIHNvbGlkICNmZmYhaW1wb3J0YW50fQojc19sZ19pbWd7ZGlzcGxheTpub25lfQojZm9ybXstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjowLjJzO2FuaW1hdGlvbi1kdXJhdGlvbjowLjJzOy13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTpib3RoO2FuaW1hdGlvbi1maWxsLW1vZGU6Ym90aDthbmltYXRpb24tbmFtZTpmYWRlSW5VcDstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJblVwO2FuaW1hdGlvbi1kZWxheTouM3M7LXdlYmtpdC1hbmltYXRpb24tZGVsYXk6LjNzfQpib2R5Om5vdChbbmV3c10pICNoZWFkX3dyYXBwZXIgI2Zvcm0uZm17bWluLXdpZHRoOiA1MCU7d2lkdGg6IDExMCU7fQoucy1wLXRvcHt0cmFuc2Zvcm06c2NhbGUoLjgpO2JvdHRvbTo5cHghaW1wb3J0YW50fQoubW5hdntkaXNwbGF5Om5vbmV9CiN1X3NwIC5tbmF2e2Rpc3BsYXk6bm9uZX0KI3UxIGEubGJ7cGFkZGluZzoyM3B4O2JvcmRlci1yYWRpdXM6NTAlO2ZvbnQtc2l6ZTowO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjQ0cHg7dG9wOjEwNDAlO2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NEtQQ0V0TFNCSFpXNWxjbUYwYjNJNklFRmtiMkpsSUVsc2JIVnpkSEpoZEc5eUlERTVMakl1TVN3Z1UxWkhJRVY0Y0c5eWRDQlFiSFZuTFVsdUlDNGdVMVpISUZabGNuTnBiMjQ2SURZdU1EQWdRblZwYkdRZ01Da2dJQzB0UGdvOGMzWm5JSFpsY25OcGIyNDlJakV1TVNJZ2FXUTlJdVdidnVXeGdsOHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklpQjRQU0l3Y0hnaUlIazlJakJ3ZUNJS0NTQjJhV1YzUW05NFBTSXdJREFnTkRZZ05EWWlJSE4wZVd4bFBTSmxibUZpYkdVdFltRmphMmR5YjNWdVpEcHVaWGNnTUNBd0lEUTJJRFEyT3lJZ2VHMXNPbk53WVdObFBTSndjbVZ6WlhKMlpTSStDanh6ZEhsc1pTQjBlWEJsUFNKMFpYaDBMMk56Y3lJK0Nna3VjM1F3ZTJacGJHdzZJMFpHUmtaR1JqdDlDand2YzNSNWJHVStDanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWsweU15d3lNMk15TGprc01DdzFMakl0TWk0ekxEVXVNaTAxTGpKekxUSXVNeTAxTGpJdE5TNHlMVFV1TW5NdE5TNHlMREl1TXkwMUxqSXNOUzR5VXpJd0xqRXNNak1zTWpNc01qTjZJRTB5TXl3eU5TNDJDZ2xqTFRNdU5Td3dMVEV3TGpRc01TNDNMVEV3TGpRc05TNHlkakl1Tm1neU1DNDNkaTB5TGpaRE16TXVOQ3d5Tnk0ekxESTJMalVzTWpVdU5pd3lNeXd5TlM0MmVpSXZQZ284TDNOMlp6NEsiKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXI7Ym94LXNoYWRvdzpyZ2JhKDAsMCwwLC4xNTY4NjMpIDAgM3B4IDEwcHgscmdiYSgwLDAsMCwuMjI3NDUxKSAwIDNweCAxMHB4O3RyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW1vei10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzO2xpbmUtaGVpZ2h0OjA7ei1pbmRleDoxMDB9CiN1MSBhLmxiOmhvdmVye3RyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW1vei10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzfQojdTEgYS5sYjphY3RpdmV7Ym94LXNoYWRvdzowIDEwcHggMzBweCByZ2JhKDAsMCwwLC4xOSksMCA2cHggMTBweCByZ2JhKDAsMCwwLC4yMyk7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstbW96LXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy1vLXRyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9CiN1MSBhLnBme2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlcjtmb250LXNpemU6MDtwYWRkaW5nOjE0cHg7b3BhY2l0eTouODstbW96LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7LW8tdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7ei1pbmRleDowfQojdTEgYS5icml7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLDApO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlcjtmb250LXNpemU6MDtwYWRkaW5nOjJweDtvcGFjaXR5Oi44Oy1tb3otdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstby10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTtib3JkZXI6bm9uZTttYXJnaW4tdG9wOjEycHh9CiN3cmFwcGVyIC5iZGJyaWltZ3RpdGxle3BhZGRpbmctdG9wOjIzcHh9CiN3cmFwcGVyIC5iZGJyaS5iZGJyaWltZyAuYmRtYWlubGluayBhe2JvcmRlcjpub25lfQojd3JhcHBlciAuYmRicml7ei1pbmRleDoyfQojd3JhcHBlciAjdV9zcCAuc19icml7cGFkZGluZzo1cHg7Ym9yZGVyLXJhZGl1czo1MCU7Zm9udC1zaXplOjA7d2lkdGg6MzJweDtoZWlnaHQ6MzJweDtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejROQ2p3aExTMGdSMlZ1WlhKaGRHOXlPaUJCWkc5aVpTQkpiR3gxYzNSeVlYUnZjaUF4T1M0eUxqRXNJRk5XUnlCRmVIQnZjblFnVUd4MVp5MUpiaUF1SUZOV1J5QldaWEp6YVc5dU9pQTJMakF3SUVKMWFXeGtJREFwSUNBdExUNE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUJwWkQwaTVadSs1YkdDWHpFaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJZ2VHMXNibk02ZUd4cGJtczlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MekU1T1RrdmVHeHBibXNpSUhnOUlqQndlQ0lnZVQwaU1IQjRJZzBLQ1NCMmFXVjNRbTk0UFNJd0lEQWdNeklnTXpJaUlITjBlV3hsUFNKbGJtRmliR1V0WW1GamEyZHliM1Z1WkRwdVpYY2dNQ0F3SURNeUlETXlPeUlnZUcxc09uTndZV05sUFNKd2NtVnpaWEoyWlNJK0RRbzhjM1I1YkdVZ2RIbHdaVDBpZEdWNGRDOWpjM01pUGcwS0NTNXpkREI3Wm1sc2JEb2pSa1pHUmtaR08zME5Dand2YzNSNWJHVStEUW84Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk1UQXNNVE5vTTNZdE0yZ3RNMVl4TTNvZ1RURTBMalVzTWpKb00zWXRNMmd0TTBNeE5DNDFMREU1TERFMExqVXNNaklzTVRRdU5Td3lNbm9nVFRFd0xESXlhRE4yTFROb0xUTldNako2SUUweE1Dd3hOeTQxYUROMkxUTm9MVE5XTVRjdU5Yb05DZ2tnVFRFMExqVXNNVGN1TldnemRpMHphQzB6UXpFMExqVXNNVFF1TlN3eE5DNDFMREUzTGpVc01UUXVOU3d4Tnk0MWVpQk5NVGtzTVRCMk0yZ3pkaTB6U0RFNWVpQk5NVFF1TlN3eE0yZ3pkaTB6YUMwelF6RTBMalVzTVRBc01UUXVOU3d4TXl3eE5DNDFMREV6ZWlCTk1Ua3NNVGN1TldnemRpMHphQzB6RFFvSlZqRTNMalY2SUUweE9Td3lNbWd6ZGkwemFDMHpWakl5ZWlJdlBnMEtQQzl6ZG1jK0RRbz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXI7Ym94LXNoYWRvdzpyZ2JhKDAsMCwwLC4xNTY4NjMpIDAgM3B4IDEwcHgscmdiYSgwLDAsMCwuMjI3NDUxKSAwIDNweCAxMHB4O3RyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7LW1vei10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwczstby10cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzO2xpbmUtaGVpZ2h0OjA7ei1pbmRleDoxMDA7bWFyZ2luLXJpZ2h0OjIycHg7bWFyZ2luLXRvcDoxcHh9CiN1X3NwIC5zX2JkYnJpaW1ndGl0bGV7cGFkZGluZy10b3A6NzNweH0KI3NfdXNlcnNldHRpbmdfdG9we2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlcjtmb250LXNpemU6MDtwYWRkaW5nOjE0cHg7b3BhY2l0eTouODstbW96LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7LW8tdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7bWFyZ2luLXRvcDoxMnB4O21hcmdpbi1yaWdodDo0cHg7ei1pbmRleDotMTAwfQojc190b3Bfd3JhcHt6LWluZGV4Oi0xMDtib3JkZXItYm90dG9tOnVuc2V0O30KI3UgLnRvaW5kZXh7ZGlzcGxheTpub25lIWltcG9ydGFudH0KI3NfdXNlcm5hbWVfdG9we3RleHQtZGVjb3JhdGlvbjpub25lO21hcmdpbi10b3A6MjZweDttYXJnaW4tbGVmdDo1cHg7Ym9yZGVyOm5vbmU7cGFkZGluZy1sZWZ0OjEwcHg7cGFkZGluZy1yaWdodDoxMHB4O2JvcmRlci1yYWRpdXM6MTZweDttYXJnaW4tcmlnaHQ6LTNweH0KLnVzZXItbmFtZXt0ZXh0LWRlY29yYXRpb246bm9uZSFpbXBvcnRhbnR9Ci5tZW51LWFycm93e2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9Ci5zX3VzZXJfbmFtZV9tZW51e3RleHQtYWxpZ246Y2VudGVyIWltcG9ydGFudH0KLnMtdXNlci1zZXQtbWVudS5tZW51LXRvcHt3aWR0aDoxMDBweH0KLnMtdXNlci1zZXQtbWVudSBkaXZ7Ym9yZGVyOm5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6cmdiYSgwLDAsMCwuMTU2ODYzKSAwIDNweCAxMHB4LHJnYmEoMCwwLDAsLjIyNzQ1MSkgMCAzcHggMTBweH0KLnMtdXNlci1zZXQtbWVudXtwYWRkaW5nLXRvcDowO21hcmdpbi10b3A6MzZweDtib3JkZXItcmFkaXVzOjJweCFpbXBvcnRhbnR9Ci5zLXVzZXItc2V0LW1lbnUgYXtwYWRkaW5nLWxlZnQ6MjVweDstbW96LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7LW8tdHJhbnNpdGlvbjphbGwgLjNzIGVhc2V9Ci5zLXVzZXItc2V0LW1lbnUgYTpob3ZlcnstbW96LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7LW8tdHJhbnNpdGlvbjphbGwgLjNzIGVhc2V9CiN1c2Vye3RleHQtZGVjb3JhdGlvbjpub25lIWltcG9ydGFudDttYXJnaW4tdG9wOjMwcHg7bWFyZ2luLWxlZnQ6NXB4O2JvcmRlcjpub25lO3BhZGRpbmctbGVmdDoxMHB4O3BhZGRpbmctcmlnaHQ6MTBweDtib3JkZXItcmFkaXVzOjE2cHg7bWFyZ2luLXJpZ2h0Oi0zcHg7aGVpZ2h0OjIzcHg7cGFkZGluZy10b3A6OHB4Oy13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOjFzO2FuaW1hdGlvbi1kdXJhdGlvbjoxczstd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6Ym90aDthbmltYXRpb24tZmlsbC1tb2RlOmJvdGg7YW5pbWF0aW9uLW5hbWU6Ym91bmNlSW5SaWdodDstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZUluUmlnaHR9Ci51c2VybWVudXtib3JkZXI6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpyZ2JhKDAsMCwwLC4xNTY4NjMpIDAgM3B4IDEwcHgscmdiYSgwLDAsMCwuMjI3NDUxKSAwIDNweCAxMHB4IWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6cmdiYSgwLDAsMCwuMTU2ODYzKSAwIDNweCAxMHB4LHJnYmEoMCwwLDAsLjIyNzQ1MSkgMCAzcHggMTBweCFpbXBvcnRhbnQ7d2lkdGg6ODNweDtib3JkZXItcmFkaXVzOjJweCFpbXBvcnRhbnQ7dG9wOjM1cHghaW1wb3J0YW50O21hcmdpbjogMCBhdXRvO30KLnVzZXJuYW1lIGF7LW1vei10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstd2Via2l0LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy1vLXRyYW5zaXRpb246YWxsIC4zcyBlYXNlO2JvcmRlci1yYWRpdXM6MnB4fQoudXNlcm5hbWUgYTpob3ZlcntiYWNrZ3JvdW5kOiMzNDc2ZDIhaW1wb3J0YW50Oy1tb3otdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstby10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZX0KLnVzZXJuYW1lIGE6YWN0aXZle2JhY2tncm91bmQ6IzM0NzZkMiFpbXBvcnRhbnQ7LW1vei10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstd2Via2l0LXRyYW5zaXRpb246YWxsIC4zcyBlYXNlOy1vLXRyYW5zaXRpb246YWxsIC4zcyBlYXNlfQojdXNlciAuYy1pY29ue2Rpc3BsYXk6bm9uZX0KI2ltc2d7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyO2ZvbnQtc2l6ZTowO3BhZGRpbmc6MTRweDtvcGFjaXR5Oi44Oy1tb3otdHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTstby10cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTt6LWluZGV4OjA7cGFkZGluZy10b3A6MjVweDtwYWRkaW5nLWJvdHRvbToyMXB4fQojaW1zZzpob3ZlcntvcGFjaXR5OjF9Ci5oZWFkX3dyYXBwZXIgI2Jkcy1tZXNzYWdlLXdyYXBwZXJ7dG9wOjY0cHh9Ci5zLW1vZC1tc2d7Ym94LXNoYWRvdzpyZ2JhKDAsMCwwLC4xNTY4NjMpIDAgM3B4IDEwcHgscmdiYSgwLDAsMCwuMjI3NDUxKSAwIDNweCAxMHB4IWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6cmdiYSgwLDAsMCwuMTU2ODYzKSAwIDNweCAxMHB4LHJnYmEoMCwwLDAsLjIyNzQ1MSkgMCAzcHggMTBweCFpbXBvcnRhbnQ7Ym9yZGVyLXJhZGl1czozcHh9Ci5tc2ctYnRue2JvcmRlci1yYWRpdXM6MnB4O3RyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9Ci5tc2ctYnRuOmhvdmVye2JvcmRlci1yYWRpdXM6MnB4O2JveC1zaGFkb3c6MCAxcHggNnB4IHJnYmEoMCwwLDAsLjEyKSwwIDFweCA0cHggcmdiYSgwLDAsMCwuMTIpO3RyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9Ci5tc2ctYnRuOmFjdGl2ZXtib3JkZXItcmFkaXVzOjJweDtib3gtc2hhZG93OnJnYmEoMCwwLDAsLjE1Njg2MykgMCAzcHggMTBweCxyZ2JhKDAsMCwwLC4yMjc0NTEpIDAgM3B4IDEwcHghaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzpyZ2JhKDAsMCwwLC4xNTY4NjMpIDAgM3B4IDEwcHgscmdiYSgwLDAsMCwuMjI3NDUxKSAwIDNweCAxMHB4IWltcG9ydGFudDt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzfQoubm8tdXNlOmhvdmVye2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnR9Ci50b3AtbG9nbyBpbWd7ZGlzcGxheTpub25lfQoudG9wLWxvZ297YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0S1BDRXRMU0JIWlc1bGNtRjBiM0k2SUVGa2IySmxJRWxzYkhWemRISmhkRzl5SURFNUxqSXVNU3dnVTFaSElFVjRjRzl5ZENCUWJIVm5MVWx1SUM0Z1UxWkhJRlpsY25OcGIyNDZJRFl1TURBZ1FuVnBiR1FnTUNrZ0lDMHRQZ284YzNabklIWmxjbk5wYjI0OUlqRXVNU0lnYVdROUl1V2J2dVd4Z2w4eElpQjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIaHRiRzV6T25oc2FXNXJQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUwzaHNhVzVySWlCNFBTSXdjSGdpSUhrOUlqQndlQ0lLQ1NCMmFXVjNRbTk0UFNJd0lEQWdNVEF4SURNeklpQnpkSGxzWlQwaVpXNWhZbXhsTFdKaFkydG5jbTkxYm1RNmJtVjNJREFnTUNBeE1ERWdNek03SWlCNGJXdzZjM0JoWTJVOUluQnlaWE5sY25abElqNEtQSE4wZVd4bElIUjVjR1U5SW5SbGVIUXZZM056SWo0S0NTNXpkREI3Wm1sc2JEb2pORGczT1VKRU8zMEtDUzV6ZERGN1ptbHNiRG9qUkVRME5ETTJPMzBLQ1M1emRESjdabWxzYkRvalJrWkdSa1pHTzMwS1BDOXpkSGxzWlQ0S1BIQmhkR2dnWTJ4aGMzTTlJbk4wTUNJZ1pEMGlUVFV3TGpRc01UVXVNMk10TXk0NExEQXVNeTAwTERJdU5pMDFMamNzTkM0M1l5MHhMamdzTWk0eUxUVXVOU3cwTGpFdE5pdzJMamRqTFRBdU5pd3pMak1zTVM0ekxEVXVNU3d6TERVdU4yTXhMamtzTUM0MkxEWXVNaTB3TGpVc09DNDBMVEF1Tldnd0xqSUtDV2d3TGpKak1pNHlMREFzTmk0MExERXVNU3c0TGpRc01DNDFZekV1T0Mwd0xqWXNNeTQxTFRNdU1pd3pMVFV1TjJNdE1DNDBMVEl1TVMwMExqUXROQzQxTFRZdU1pMDJMamRETlRRdU1pd3hPQ3cxTkM0ekxERTFMallzTlRBdU5Dd3hOUzR6ZWlCTk16Y3NNVFF1T0FvSll6QXNNaTQwTERFdU5pdzBMak1zTXk0MExEUXVNMk14TGprc01Dd3pMalF0TVM0NUxETXVOQzAwTGpOak1DMHlMalF0TVM0MkxUUXVNeTB6TGpRdE5DNHpVek0zTERFeUxqVXNNemNzTVRRdU9Ib2dUVFF6TGprc09DNDJZekFzTWk0MUxERXVOU3cwTGpVc015NHpMRFF1TlFvSll6RXVPQ3d3TERNdU15MHlMakVzTXk0ekxUUXVOVk0wT1N3MExqRXNORGN1TVN3MExqRkRORFV1TXl3MExEUXpMamtzTml3ME15NDVMRGd1Tm5vZ1RUVXlMaklzT0M0MVl6QXNNaTR6TERFdU5DdzBMak1zTXk0eUxEUXVNM016TGpJdE1TNDVMRE11TWkwMExqTnpMVEV1TkMwMExqTXRNeTR5TFRRdU13b0pVelV5TGpJc05pNHlMRFV5TGpJc09DNDFlaUJOTlRjdU5Td3hOUzQ1WXpBc01pNHpMREV1TlN3MExqTXNNeTR6TERRdU0yTXhMamdzTUN3ekxqTXRNUzQ1TERNdU15MDBMak56TFRFdU5TMDBMak10TXk0ekxUUXVNME0xT0M0NUxERXhMallzTlRjdU5Td3hNeTQyTERVM0xqVXNNVFV1T1hvaUx6NEtQSEJoZEdnZ1kyeGhjM005SW5OME1TSWdaRDBpVFRRc016QXVOSFl0TlM0eGFEWXVOR014TGpZc01Dd3hMallzTUM0ekxERXVOaXd5ZGpFdU5HTXdMREV1TmkweUxqTXNNUzQ0TFRNdU9Td3hMamhNTkN3ek1DNDBURFFzTXpBdU5Ib2dUVFFzTWpOMkxUUXVPR2cwTGpFS0NXTXhMallzTUN3ekxqa3NNQ3d6TGprc01pNHhkakF1TVdNd0xERXVOQzB3TGpVc01pNDJMVEV1T0N3eUxqWkRNVEF1TXl3eU15dzBMREl6TERRc01qTjZJRTB4TGpjc01UWjJNVFl1TTJnMkxqUmpNeXd3TERZdU1pd3dMRFl1TWkwekxqWjJMVEV1TVdNd0xURXVOaTB3TGpFdE1pNDNMVEV1TVMwekxqVUtDV014TFRBdU9Dd3hMakV0TWk0ekxERXVNUzB6TGpac01Dd3dZekF0TkM0MUxUTXVNaTAwTGpVdE5pNHlMVFF1TlV3eExqY3NNVFpNTVM0M0xERTJlaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F4SWlCa1BTSk5NalVzTWpndU9XTXRNUzR4TERFdU1TMHpMak1zTVM0ekxUTXVOU3d4TGpOakxURXVNeXd3TFRJdU55MHdMalV0TWk0M0xUSXVNV013TFRFdU5Dd3dMalV0TWk0ekxESXVNUzB5TGpOak1TNHpMREFzTWk0NExEQXVNU3cwTGpFc01DNDJWakk0TGpsNkNna2dUVEl4TGpRc016SXVNMk13TGpRc01Dd3lMak10TUM0eExETXVOeTB3TGpsc01DNHlMREF1TjJneUxqRjJMVGd1T1dNd0xUTXVOaTB5TGpNdE5TMDFMamN0TldNdE1TNDRMREF0TkM0ekxEQXVOeTAwTGpjc01DNDViREF1TkN3eUxqTmpNUzQyTFRBdU5pd3pMVEF1Tml3MExqSXRNQzQyQ2dsak1TNDRMREFzTXk0ekxEQXVOaXd6TGpNc01pNDJWakkwWXkweExUQXVOQzB5TGpRdE1DNDJMVFF1TVMwd0xqWmpMVE1zTUMwMExqVXNNUzQyTFRRdU5TdzBMamRETVRZdU5Dd3pNUzQ0TERFNUxqWXNNekl1TXl3eU1TNDBMRE15TGpONklpOCtDanh3WVhSb0lHTnNZWE56UFNKemRERWlJR1E5SWswek1DNHlMREUyTGpGak1Dd3dMallzTUM0MkxERXVNaXd4TGpNc01TNHlZekF1T0N3d0xERXVNeTB3TGpZc01TNHpMVEV1TW1Nd0xUQXVOeTB3TGpZdE1TNHpMVEV1TXkweExqTkRNekF1T0N3eE5DNDRMRE13TGpJc01UVXVNeXd6TUM0eUxERTJMakY2Q2drZ1RUTXdMak1zTXpJdU1XZ3lMalJXTVRndU5XZ3RNaTQwVmpNeUxqRjZJaTgrQ2p4d1lYUm9JR05zWVhOelBTSnpkREVpSUdROUlrMDNNUzR5TERJeUxqRm9PQzQwWXpBdU5Dd3dMakVzTUM0MkxEQXVNeXd3TGpZc01DNDNkakl1Tm1ndE9TNDNkaTB5TGpaRE56QXVOaXd5TWk0MExEY3dMamdzTWpJdU1pdzNNUzR5TERJeUxqRjZJRTAzTVM0eUxETXdMalVLQ1dNdE1DNDBMREF0TUM0MkxUQXVNeTB3TGpjdE1DNDRkaTB5TGpab09TNDNkakl1Tm1Nd0xEQXVOQzB3TGpJc01DNDNMVEF1Tml3d0xqZElOekV1TW5vZ1RUY3pMallzTVRoakxUQXVNU3d3TGpRdE1DNHhMREF1T1Mwd0xqUXNNUzQzWXkwd0xqRXNNQzR6TFRBdU1Td3dMalV0TUM0eExEQXVOd29KYUMweUxqWmpMVEV1TXl3d0xqRXRNUzQ1TERBdU9DMHlMREoyTnk0NVl6QXVNU3d4TGpFc01DNDRMREV1T0N3eUxERXVPV2d4TUdNeExqSXRNQzR4TERFdU9DMHdMamNzTVM0NUxURXVPSFl0Tnk0NVl5MHdMakV0TVM0ekxUQXVOeTB4TGprdE1TNDVMVEl1TVdndE5Rb0pZekF1TVMwd0xqTXNNQzR4TFRBdU9Dd3dMak10TVM0MFl6QXVNUzB3TGpRc01DNHhMVEF1Tnl3d0xqRXRNQzQ1YURjdU1uWXRNUzQ0U0RZM0xqUldNVGhNTnpNdU5pd3hPRXczTXk0MkxERTRlaUl2UGdvOGNHRjBhQ0JqYkdGemN6MGljM1F4SWlCa1BTSk5PVE11Tnl3eU1pNDNZeTB3TGpRdE1DNHhMVEF1TlMwd0xqSXRNQzQxTFRBdU5YWXRNQzQyYURNdU1uWXdMalpqTFRBdU1Td3dMak10TUM0eUxEQXVOQzB3TGpVc01DNDFTRGt6TGpkNklFMDVOaTQyTERJMExqRUtDV014TGpFdE1DNHhMREV1Tmkwd0xqVXNNUzQyTFRFdU5IWXRNV2d5TGpOMkxURXVOV2d0TWk0emRpMHhMakZvTFRFdU9IWXhMakZvTFRNdU1uWXRNUzR4YUMweExqaDJNUzR4YUMweUxqTjJNUzQxYURJdU0zWXhZekF1TVN3d0xqa3NNQzQyTERFdU5Dd3hMallzTVM0MFNEazJMalo2Q2drZ1RUazBMamdzTXpBdU5HTXhMallzTUM0NExETXVOQ3d4TGpNc05TNDBMREV1T0d3d0xqa3RNUzQzWXkweExqUXRNQzR5TFRJdU9TMHdMall0TkM0MExURXVNV014TGpFdE1DNDRMREl0TVM0MkxESXVOeTB5TGpWak1DNHpMVEF1TkN3d0xqUXRNQzQ1TERBdU1pMHhMak1LQ1dNdE1DNHpMVEF1Tmkwd0xqZ3RNQzQ1TFRFdU5DMHdMamxvTFRsMk1TNDFhRGN1TjJNd0xqSXNNQ3d3TGpRc01DNHhMREF1TkN3d0xqRnpNQ3d3TGpFdE1DNHhMREF1TTJNdE1DNDJMREF1TmkweExqUXNNUzR6TFRJdU15d3hMamhqTFRFdU1pMHdMamN0TWk0eExURXVNeTB5TGpRdE1TNDRhQzB5TGpJS0NXTXdMamtzTVN3eExqZ3NNUzQ1TERJdU9Td3lMamRqTFRFdU5pd3dMall0TXk0ekxERXVNUzAwTGprc01TNHpiREF1T1N3eExqWkRPVEV1TXl3ek1TNDRMRGt6TGpJc016RXVNU3c1TkM0NExETXdMalI2SUUwNE9DNHpMREkxTGpKMkxUWmpNQzR4TFRBdU5pd3dMak10TUM0NUxEQXVPQzB3TGprS0NXZ3hNUzQ0ZGkweExqWklPVFZqTFRBdU1TMHdMakV0TWk0eUxUQXVNUzB5TGpJc01HZ3ROQzQzWXkweExqRXNNQzR4TFRFdU55d3dMamt0TVM0NExESXVNbFl5TldNd0xqRXNNaTR4TFRBdU5DdzBMalF0TVM0eExEWXVOMnd4TGprc01DNDJDZ2xET0RjdU9Td3lPUzQ1TERnNExqTXNNamN1Tml3NE9DNHpMREkxTGpKNklpOCtDanh3WVhSb0lHTnNZWE56UFNKemRESWlJR1E5SWswME5pNHpMREkwTGpKak1DNDJMREFzTVM0eUxEQXVNU3d4TGpjc01DNDBkak11TkdNd0xEQXVNeTB3TGpZc01TMHhMamtzTVdNdE1TNDFMREF0TVM0NExUQXVOaTB4TGpndE1pNHhkaTB3TGpZS0NVTTBOQzR5TERJMExqZ3NORFF1Tnl3eU5DNHlMRFEyTGpNc01qUXVNbm9nVFRRNUxqSXNNakF1TjBnME9IWXlMalZETkRjdU5pd3lNeTR4TERRM0xESXpMRFEyTGpNc01qTmpMVEl1Tnl3d0xUTXVNeXd4TFRNdU15d3pMalYyTUM0ell6QXNNaTQwTERBdU9Td3pMak1zTXk0eUxETXVNd29KWXpBdU9Dd3dMREV1TXkwd0xqRXNNUzQ0TFRBdU5Xd3dMakVzTUM0MmFERXVNVXcwT1M0eUxESXdMamRNTkRrdU1pd3lNQzQzZWlJdlBnbzhjR0YwYUNCamJHRnpjejBpYzNReUlpQmtQU0pOTlRZdU55d3lNMmd0TVM0eWRqVXVNbU10TUM0MkxEQXVOQzB4TGpjc01DNDJMVEl1TkN3d0xqWmpMVEF1T0N3d0xURXRNQzQwTFRFdE1TNHpkaTAwTGpab0xURXVNWFkwTGpoak1Dd3hMallzTUM0MUxESXVNeXd5TGpFc01pNHpDZ2xqTVN3d0xESXVNUzB3TGpNc01pNDJMVEF1Tm13d0xqRXNNQzQyYURFdU1WWXlNM29pTHo0S1BIQmhkR2dnWTJ4aGMzTTlJbk4wTVNJZ1pEMGlUVGt5TGpjc01UVXVOMk13TFRBdU55d3dMall0TVM0ekxERXVNaTB4TGpOak1DNDJMREFzTVM0eUxEQXVOaXd4TGpJc01TNHpVemswTGpVc01UY3NPVE11T1N3eE4wTTVNeTR6TERFMkxqa3NPVEl1Tnl3eE5pNHpMRGt5TGpjc01UVXVOM29pTHo0S1BDOXpkbWMrQ2c9PSIpO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlcjtoZWlnaHQ6MTAwcHg7d2lkdGg6MjAwcHh9CiN1X3NwIC5zX2JyaXtib3JkZXI6MCFpbXBvcnRhbnR9Ci5wYXNzLXRleHQtaW5wdXR7YmFja2dyb3VuZC1pbWFnZTpub25lIWltcG9ydGFudH0KLnBhc3MtdGV4dC1pbnB1dC1mb2N1c3tiYWNrZ3JvdW5kLWltYWdlOm5vbmUhaW1wb3J0YW50fQojcGFzc3BvcnQtbG9naW4tcG9we2ZvbnQtZmFtaWx5Oi1hcHBsZS1zeXN0ZW0sIkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsIk5pbWJ1cyBTYW5zIEwiLEFyaWFsLCJMaWJlcmF0aW9uIFNhbnMiLCJQaW5nRmFuZyBTQyIsIkhpcmFnaW5vIFNhbnMgR0IiLCJTb3VyY2UgSGFuIFNhbnMgQ04iLCJTb3VyY2UgSGFuIFNhbnMgU0MiLCJNaWNyb3NvZnQgWWFIZWkiLCJXZW5xdWFueWkgTWljcm8gSGVpIiwiV2VuUXVhbllpIFplbiBIZWkiLCJTVCBIZWl0aSIsU2ltSGVpLCJXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsc2Fucy1zZXJpZjtib3JkZXItcmFkaXVzOjJweH0KI1RBTkdSQU1fX1BTUF8yX190aXRsZVRleHR7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLCJNaWNyb3NvZnQgWWFoZWkgVUkgTGlnaHQifQoucGFzcy1mZ3Rwd2R7Zm9udC1mYW1pbHk6SGVsdmV0aWNhLCJNaWNyb3NvZnQgWWFoZWkgVUkiIWltcG9ydGFudH0KLnBhc3Mtc21zLWJ0bntmb250LWZhbWlseTpIZWx2ZXRpY2EsIk1pY3Jvc29mdCBZYWhlaSBVSSIhaW1wb3J0YW50fQoucGFzcy1yZWdsaW5re2ZvbnQtZmFtaWx5OkhlbHZldGljYSwiTWljcm9zb2Z0IFlhaGVpIFVJIiFpbXBvcnRhbnR9Ci50YW5nLWZvcmVncm91bmR7Ym9yZGVyLXJhZGl1czoycHghaW1wb3J0YW50O2JvcmRlcjowIWltcG9ydGFudH0KLnRhbmctdGl0bGV7Ym9yZGVyLXJhZGl1czoycHggMnB4IDAgMCFpbXBvcnRhbnR9Ci50YW5nLXBhc3MtcG9wLWxvZ2luIGRpdi50YW5nLXRpdGxle2JvcmRlci1yYWRpdXM6MnB4IDJweCAwIDAhaW1wb3J0YW50fQoucGFzcy1jaGVja2JveC1pbnB1dHt3aWR0aDoxN3B4O2hlaWdodDoxN3B4O2JvcmRlcjojZTBlMGUwIDNweCBzb2xpZCFpbXBvcnRhbnQ7YmFja2dyb3VuZC1jb2xvcjojZmZmIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmV9Ci50YW5nLXBhc3MtcG9wLWxvZ2luLWNvbG9yLWJsdWUgLnBhc3MtYnV0dG9uOmZvY3Vze2JveC1zaGFkb3c6cmdiYSgwLDAsMCwuMTU2ODYzKSAwIDNweCAxMHB4LHJnYmEoMCwwLDAsLjIyNzQ1MSkgMCAzcHggMTBweCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OnJnYmEoMCwwLDAsLjE1Njg2MykgMCAzcHggMTBweCxyZ2JhKDAsMCwwLC4yMjc0NTEpIDAgM3B4IDEwcHghaW1wb3J0YW50fQoucnJlY29tLWJ0bi1wYXJlbnR7ZGlzcGxheTpub25lIWltcG9ydGFudH0KLnMtcC10b3B7Ym90dG9tOi04cHghaW1wb3J0YW50fQppbnB1dFt0eXBlPXRleHRdOmZvY3Vze2JvcmRlcjpub25lIWltcG9ydGFudDtib3JkZXItdG9wOjAgc29saWQgI2ZmZiFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbTowIHNvbGlkICNmZmYhaW1wb3J0YW50O2JvcmRlci1sZWZ0OjAgc29saWQgI2ZmZiFpbXBvcnRhbnQ7Ym9yZGVyLXJpZ2h0OjAgc29saWQgI2ZmZiFpbXBvcnRhbnR9CmFbc29mdF9pZF17ZGlzcGxheTpub25lfQoub3Atc29mdC1idG5ib3ggLmMtZ2FwLWxlZnQtc21hbGx7bWFyZ2luLWxlZnQ6MCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiMzNDc2ZDI7cGFkZGluZzo3cHggMTVweDtib3JkZXItcmFkaXVzOjJweDtmb250LXNpemU6MTRweDt0cmFuc2l0aW9uOmFsbCAuM3MgZWFzZX0KLm9wLXNvZnQtYnRuYm94IC5jLWdhcC1sZWZ0LXNtYWxsOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzcwOThEMDt0cmFuc2l0aW9uOmFsbCAuM3MgZWFzZTtib3gtc2hhZG93OjAgMnB4IDVweCAwIHJnYmEoMCwwLDAsLjE2KSwwIDJweCAxMHB4IDAgcmdiYSgwLDAsMCwuMTIpfQouc291dHUtaW5wdXQtaW1hZ2V7dG9wOjZweDtsZWZ0OjVweH0KI2t3e2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Ci5zLXNraW4taGFzYmcgI2t3e2JveC1zaGFkb3c6MCAwIDAgcmdiYSgwLDAsMCwuMil9Ci5zLXNraW4taGFzYmcgLmJ0bl93cnt3aWR0aDozNXB4fQojc191c2Vyc2V0dGluZ190b3B7bWFyZ2luLXRvcDotN3B4fQojc191c2VybmFtZV90b3B7bWFyZ2luLXRvcDo3cHh9CiN1X3Nwe3BhZGRpbmctdG9wOjE2cHh9Ci5pcHRfcmVje2JhY2tncm91bmQ6MCAwO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0KLmlwdF9yZWM6aG92ZXJ7YmFja2dyb3VuZDowIDA7YmFja2dyb3VuZC1pbWFnZTpub25lfQouaXB0X3JlYzphZnRlcntkaXNwbGF5Om5vbmU7bWFyZ2luLXRvcDo1MHB4fQouYmRwZm1lbnUsLnVzZXJtZW51e2JvcmRlcjpub25lO2JveC1zaGFkb3c6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTstbW96LWJveC1zaGFkb3c6bm9uZTstby1ib3gtc2hhZG93Om5vbmV9Ci5xcmNvZGVDb257dmlzaWJpbGl0eTpoaWRkZW59CiNoZWFkIC5oZWFkQmxvY2t7bWFyZ2luOjEycHggMCA2cHggMTIxcHh9CmF7Y29sb3I6IzM0NzZkMn0KaDMgYTpob3Zlcntib3JkZXItYm90dG9tOiMzNDc2ZDIgMS4ycHggc29saWR9Ci5jLXNob3d1cmx7Y29sb3I6IzRDQUY1MH0KLm9wLXNlLWxpc3Rlbi1yZWNvbW1lbmQ6aG92ZXJ7Ym9yZGVyLWJvdHRvbTojMzQ3NmQyIDEuMnB4IHNvbGlkfQouYy1nYXAtYm90dG9tLXNtYWxsIGE6aG92ZXJ7Ym9yZGVyLWJvdHRvbTojMzQ3NmQyIDEuMnB4IHNvbGlkfQouYy1yb3cgYTpob3Zlcntib3JkZXItYm90dG9tOiMzNDc2ZDIgMS4ycHggc29saWR9CiNycyBhOmhvdmVye2JvcmRlci1ib3R0b206IzM0NzZkMiAxLjJweCBzb2xpZH0KLmhpbnRfdG9wcnFfdGlwc19pdGVtcyBhOmhvdmVye2JvcmRlci1ib3R0b206IzM0NzZkMiAxLjJweCBzb2xpZH0KLmM6aG92ZXJ7Ym9yZGVyLWJvdHRvbTojMzQ3NmQyIDEuMnB4IHNvbGlkfQplbXtjb2xvcjojRUE0MzM1fQoub3AtdmlkZW8tdmFzdC11bCBsaSBhe21hcmdpbi1ib3R0b206IHVuc2V0O30KYm9keXtiYWNrZ3JvdW5kLWNvbG9yOiNGN0Y3Rjd9CiNmb3JtIC5zX2J0bntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMCl9CiN3cmFwcGVyICNoZWFkIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjQ4LCAyNDgsIDI0OCwgMC40KTsKICAgIGJvcmRlci1ib3R0b206IG5vbmU7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCkKfQouYy10YWJzLW5hdntiYWNrZ3JvdW5kLWNvbG9yOiNFRUV9Ci5jLXRhYnMtbmF2LXNlbGVjdGVke2JvcmRlci1ib3R0b206I0Y0NDMzNiAycHggc29saWQhaW1wb3J0YW50O2JhY2tncm91bmQtY29sb3I6IzIxOTZGMyFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9CiNwYWdlIGF7YmFja2dyb3VuZDojZmZmO2NvbG9yOiM0MjQyNDJ9CiNwYWdlIGE6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwIWltcG9ydGFudH0KI3BhZ2UgYSAucGM6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwfQojcGFnZSBzdHJvbmd7YmFja2dyb3VuZC1jb2xvcjojNDI4NUY0IWltcG9ydGFudDtjb2xvcjojZmZmfQojcGFnZSBzdHJvbmcgLnBje2JhY2tncm91bmQtY29sb3I6IzQyODVGNCFpbXBvcnRhbnR9Ci5wYzpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTB9CiNzX3RhYiBie2JvcmRlci1ib3R0b206M3B4ICMzNDc2ZDIgc29saWQ7Y29sb3I6IzM0NzZkMn0KI3NfdGFie2JvcmRlci1ib3R0b206I2UwZTBlMCAxcHggc29saWR9Ci5iZHBmbWVudSBhOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzM0NzZkMiFpbXBvcnRhbnR9Ci5zZXRwcmVmOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzM0NzZkMiFpbXBvcnRhbnR9CiN1IC5sYntiYWNrZ3JvdW5kLWNvbG9yOiMzNDc2ZDJ9CiN1IC5sYjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2MThDQzd9CiN1IC5sYjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojN0RBMEQwfQojYmd7YmFja2dyb3VuZC1jb2xvcjojRkZGIWltcG9ydGFudDtiYWNrZ3JvdW5kOiNGRkZ9CiN1MSBhLmxie2JhY2tncm91bmQtY29sb3I6IzM0NzZkMn0KI3UxIGEubGI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNjE4Q0M3fQojdTEgYS5sYjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojN0RBMEQwfQojdV9zcCAuc19icml7YmFja2dyb3VuZC1jb2xvcjojRjQ0MzM2fQojc191c2VybmFtZV90b3B7YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwfQoucy11c2VyLXNldC1tZW51IGE6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMzQ3NmQyIWltcG9ydGFudH0KI3VzZXJ7YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwfQoubXNnLXNldHRpbmctYnRue2JhY2tncm91bmQtY29sb3I6IzM0NzZkMiFpbXBvcnRhbnR9Ci5uby11c2V7YmFja2dyb3VuZC1jb2xvcjojRTVFNUU1IWltcG9ydGFudH0KLnBhc3MtdGV4dC1pbnB1dHtib3JkZXItYm90dG9tOiNlMGUwZTAgMnB4IHNvbGlkIWltcG9ydGFudDtib3JkZXItbGVmdDojZmZmIDAgc29saWQhaW1wb3J0YW50O2JvcmRlci1yaWdodDojZmZmIDAgc29saWQhaW1wb3J0YW50O2JvcmRlci10b3A6I2ZmZiAwIHNvbGlkIWltcG9ydGFudH0KLnBhc3MtdGV4dC1pbnB1dC1mb2N1c3tib3JkZXItYm90dG9tOiMzNDc2ZDIgMnB4IHNvbGlkIWltcG9ydGFudDtib3JkZXItbGVmdDojZmZmIDAgc29saWQhaW1wb3J0YW50O2JvcmRlci1yaWdodDojZmZmIDAgc29saWQhaW1wb3J0YW50O2JvcmRlci10b3A6I2ZmZiAwIHNvbGlkIWltcG9ydGFudH0KLnRhbmctcGFzcy1wb3AtbG9naW4tY29sb3ItYmx1ZSAucGFzcy1idXR0b257YmFja2dyb3VuZC1jb2xvcjojMzQ3NmQyfQoudGFuZy1wYXNzLXBvcC1sb2dpbi1jb2xvci1ibHVlIC5wYXNzLWJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2MThDQzd9CiNsZ3ttYXJnaW4tbGVmdDotM3JlbTtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejROQ2p3aExTMGdSMlZ1WlhKaGRHOXlPaUJCWkc5aVpTQkpiR3gxYzNSeVlYUnZjaUF4T1M0eUxqRXNJRk5XUnlCRmVIQnZjblFnVUd4MVp5MUpiaUF1SUZOV1J5QldaWEp6YVc5dU9pQTJMakF3SUVKMWFXeGtJREFwSUNBdExUNE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUJwWkQwaTViR0NYekVpSUhodGJHNXpQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh5TURBd0wzTjJaeUlnZUcxc2JuTTZlR3hwYm1zOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2ZUd4cGJtc2lJSGc5SWpCd2VDSWdlVDBpTUhCNElnMEtDU0IyYVdWM1FtOTRQU0l3SURBZ01qVTVJREV4TmlJZ2MzUjViR1U5SW1WdVlXSnNaUzFpWVdOclozSnZkVzVrT201bGR5QXdJREFnTWpVNUlERXhOanNpSUhodGJEcHpjR0ZqWlQwaWNISmxjMlZ5ZG1VaVBnMEtQSE4wZVd4bElIUjVjR1U5SW5SbGVIUXZZM056SWo0TkNna3VjM1F3ZTJacGJHdzZJelF5T0RWR05EdDlEUW9KTG5OME1YdG1hV3hzT2lORlFUUXpNelU3ZlEwS0NTNXpkREo3Wm1sc2JEb2pSa1pHUmtaR08zME5Dand2YzNSNWJHVStEUW84Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk1USTRMaklzTnpkakxUVXVOQ3d3TGpRdE5TNDJMRE11TnkwNExqRXNOaTQzWXkweUxqVXNNeTR4TFRjdU55dzFMamd0T0M0MExEa3VOV010TUM0NExEUXVOeXd4TGpnc055NHlMRFF1TXl3NFl6SXVOeXd3TGprc09DNDRMVEF1Tnl3eE1TNDVMVEF1TncwS0NXZ3dMak5vTUM0ell6TXVNU3d3TERrdU1Td3hMallzTVRFdU9Td3dMamRqTWk0MUxUQXVPU3cwTGprdE5DNDFMRFF1TXkwNFl5MHdMalV0TXkwMkxqSXROaTQwTFRndU55MDVMalZETVRNekxqWXNPREF1Tnl3eE16TXVOeXczTnk0MExERXlPQzR5TERjM2VpQk5NVEE1TGpNc056WXVNdzBLQ1dNd0xETXVOQ3d5TGpJc05pNHhMRFF1T0N3MkxqRmpNaTQzTERBc05DNDRMVEl1Tnl3MExqZ3ROaTR4Y3kweUxqSXROaTR4TFRRdU9DMDJMakZUTVRBNUxqTXNOek1zTVRBNUxqTXNOell1TTNvZ1RURXhPU3cyTnk0MVl6QXNNeTQxTERJdU1TdzJMalFzTkM0MkxEWXVOQTBLQ1dNeUxqWXNNQ3cwTGpjdE1pNDVMRFF1TnkwMkxqUnpMVEl1TVMwMkxqUXROQzQzTFRZdU5FTXhNakVzTmpFc01URTVMRFl6TGprc01URTVMRFkzTGpWNklFMHhNekF1Tnl3Mk55NDBZekFzTXk0ekxESXNOaXcwTGpVc05uTTBMalV0TWk0M0xEUXVOUzAyWXpBdE15NHpMVEl0TmkwMExqVXROZzBLQ1ZNeE16QXVOeXcyTkM0eExERXpNQzQzTERZM0xqUjZJRTB4TXpndU1pdzNOeTQ0WXpBc015NHpMREl1TVN3MkxEUXVOaXcyWXpJdU5pd3dMRFF1TnkweUxqY3NOQzQzTFRaak1DMHpMak10TWk0eExUWXROQzQzTFRaRE1UUXdMaklzTnpFdU9Dd3hNemd1TWl3M05DNDFMREV6T0M0eUxEYzNMamg2SWcwS0NTOCtEUW84Y0dGMGFDQmpiR0Z6Y3owaWMzUXhJaUJrUFNKTk5qSXVPQ3c1T0M0eVZqa3hhRGxqTWk0eUxEQXNNaTR6TERBdU5Dd3lMak1zTWk0NGRqSmpNQ3d5TGpNdE15NHlMREl1TlMwMUxqVXNNaTQxYUMwMUxqaFdPVGd1TW5vZ1RUWXlMamdzT0RjdU9GWTRNV2cxTGpnTkNnbGpNaTR6TERBc05TNDFMREFzTlM0MUxETjJNQzR4WXpBc01pMHdMamNzTXk0M0xUSXVOU3d6TGpkRE56RXVOaXc0Tnk0NExEWXlMamdzT0RjdU9DdzJNaTQ0TERnM0xqaDZJRTAxT1M0MUxEYzNMamwyTWpOb09TNHhZelF1TXl3d0xEZ3VOeXd3TERndU55MDFMakYyTFRFdU5RMEtDV013TFRJdU15MHdMakl0TXk0NExURXVOUzAwTGpsak1TNDBMVEV1TVN3eExqVXRNeTR5TERFdU5TMDFMakZzTUN3d1l6QXROaTR6TFRRdU5TMDJMak10T0M0M0xUWXVNMHcxT1M0MUxEYzNMamxNTlRrdU5TdzNOeTQ1ZWlJdlBnMEtQSEJoZEdnZ1kyeGhjM005SW5OME1TSWdaRDBpVFRreUxqUXNPVFl1TVdNdE1TNDFMREV1TmkwMExqWXNNUzQ0TFRRdU9Td3hMamhqTFRFdU9Td3dMVE11T0Mwd0xqY3RNeTQ0TFRJdU9XTXdMVElzTUM0M0xUTXVNeXd5TGprdE15NHpZekV1T0N3d0xEUXNNQzR5TERVdU9Dd3dMamhXT1RZdU1Yb05DZ2tnVFRnM0xqTXNNVEF3TGpsak1DNDFMREFzTXk0ekxUQXVNaXcxTGpJdE1TNHpiREF1TXl3eGFESXVPVlk0T0dNd0xUVXVNUzB6TGpJdE55NHhMVGd0Tnk0eFl5MHlMalVzTUMwMkxqRXNNUzAyTGpZc01TNHliREF1Tml3ekxqSmpNaTR5TFRBdU9DdzBMakl0TUM0NUxEVXVPUzB3TGprTkNnbGpNaTQyTERBc05DNDJMREF1T1N3MExqWXNNeTQzZGpFdU1XTXRNUzQwTFRBdU5TMHpMalF0TUM0NUxUVXVPQzB3TGpsakxUUXVNaXd3TFRZdU15d3lMak10Tmk0ekxEWXVOa000TUM0ekxERXdNQzR6TERnMExqY3NNVEF3TGprc09EY3VNeXd4TURBdU9Yb2lMejROQ2p4d1lYUm9JR05zWVhOelBTSnpkREVpSUdROUlrMDVPUzQzTERjNExqRmpNQ3d3TGprc01DNDVMREV1Tnl3eExqZ3NNUzQzWXpFdU1Td3dMREV1T1Mwd0xqZ3NNUzQ1TFRFdU4yTXdMVEV0TUM0NExURXVPQzB4TGprdE1TNDRRekV3TUM0MkxEYzJMak1zT1RrdU55dzNOeXc1T1M0M0xEYzRMakY2RFFvSklFMDVPUzQ1TERFd01DNDJhRE11TkZZNE1TNDFhQzB6TGpSV01UQXdMalo2SWk4K0RRbzhjR0YwYUNCamJHRnpjejBpYzNReElpQmtQU0pOTVRVM0xqWXNPRFl1Tm1neE1TNDRZekF1TlN3d0xqRXNNQzQ0TERBdU5Dd3dMamtzTVhZekxqWm9MVEV6TGpkMkxUTXVOa014TlRZdU55dzROeXd4TlRjc09EWXVOeXd4TlRjdU5pdzROaTQyZWlCTk1UVTNMallzT1RndU5BMEtDV010TUM0MkxEQXRNQzQ1TFRBdU5DMHhMVEV1TVhZdE15NDJhREV6TGpkMk15NDNZekFzTUM0MkxUQXVNeXd4TFRBdU9Td3hTREUxTnk0MmVpQk5NVFl3TGprc09EQXVOMk10TUM0eExEQXVOUzB3TGpJc01TNHpMVEF1TlN3eUxqUmpMVEF1TVN3d0xqUXRNQzR4TERBdU55MHdMaklzTVdndE15NDNEUW9KWXkweExqZ3NNQzR4TFRJdU55d3hMakV0TWk0NExESXVPRlk1T0dNd0xqRXNNUzQyTERFdU1Td3lMalVzTWk0NExESXVOMmd4TkM0eFl6RXVOeTB3TGpFc01pNDJMVEVzTWk0M0xUSXVOVlk0TjJNdE1DNHhMVEV1T0MweExUSXVOeTB5TGpjdE1pNDVhQzAzRFFvSll6QXVNUzB3TGpRc01DNHlMVEV1TVN3d0xqUXRNbU13TGpFdE1DNDJMREF1TVMweExEQXVNaTB4TGpOb01UQXVNbll0TWk0MmFDMHlNaTR5ZGpJdU5rd3hOakF1T1N3NE1DNDNUREUyTUM0NUxEZ3dMamQ2SWk4K0RRbzhjR0YwYUNCamJHRnpjejBpYzNReElpQmtQU0pOTVRnNUxqUXNPRGN1TkdNdE1DNDFMVEF1TVMwd0xqY3RNQzR6TFRBdU55MHdMamQyTFRBdU9XZzBMalYyTUM0NVl5MHdMakVzTUM0MExUQXVNeXd3TGpZdE1DNDNMREF1TjBneE9Ea3VOSG9nVFRFNU15NDBMRGc1TGpRTkNnbGpNUzQxTFRBdU1Td3lMakl0TUM0M0xESXVNeTB5VmpnMmFETXVNbll0TWk0eGFDMHpMakoyTFRFdU5tZ3RNaTQxZGpFdU5tZ3ROQzQxZGkweExqWm9MVEl1Tm5ZeExqWm9MVE11TWxZNE5tZ3pMakoyTVM0MFl6QXVNU3d4TGpNc01DNDRMRElzTWk0eUxESklNVGt6TGpSNklFMHhPVEF1T1N3NU9DNHpEUW9KWXpJdU15d3hMakVzTkM0NExERXVPU3czTGpZc01pNDJiREV1TWkweUxqUmpMVEl0TUM0ekxUUXVNUzB3TGpndE5pNHlMVEV1Tm1NeExqVXRNUzR4TERJdU9DMHlMaklzTXk0NExUTXVOV013TGpRdE1DNDJMREF1TlMweExqSXNNQzR6TFRFdU9XTXRNQzQwTFRBdU9DMHhMakV0TVM0eUxUSXRNUzR5RFFvSmFDMHhNaTQzZGpJdU1XZ3hNQzQ0WXpBdU15d3dMREF1TlN3d0xqRXNNQzQyTERBdU1uTXdMREF1TWkwd0xqSXNNQzQwWXkwd0xqa3NNQzQ1TFRJc01TNDRMVE11TXl3eUxqWmpMVEV1TnkweExUSXVPUzB4TGprdE15NDBMVEl1Tm1ndE15NHhZekV1TWl3eExqUXNNaTQyTERJdU55dzBMakVzTXk0NERRb0pZeTB5TGpNc01DNDVMVFF1Tml3eExqVXROaTQ1TERFdU9Hd3hMak1zTWk0eVF6RTROUzQ1TERFd01DNHlMREU0T0M0MkxEazVMak1zTVRrd0xqa3NPVGd1TTNvZ1RURTRNUzQzTERrd0xqbDJMVGd1TldNd0xqRXRNQzQ0TERBdU5DMHhMaklzTVM0eExURXVNMmd4Tmk0M2RpMHlMak5vTFRndU13MEtDV010TUM0eExUQXVNaTB6TGpFdE1DNHhMVE11TVN3d2FDMDJMamRqTFRFdU5Td3dMakl0TWk0MExERXVNeTB5TGpVc015NHhkamd1TjJNd0xqRXNNeTB3TGpVc05pNHlMVEV1Tml3NUxqUnNNaTQzTERBdU9FTXhPREV1TVN3NU55NDJMREU0TVM0M0xEazBMak1zTVRneExqY3NPVEF1T1hvaUx6NE5Danh3WVhSb0lHTnNZWE56UFNKemRESWlJR1E5SWsweE1qSXVOU3c0T1M0MVl6QXVPQ3d3TERFdU55d3dMaklzTWk0MExEQXVOWFkwTGpoak1Dd3dMalF0TUM0NUxERXVOQzB5TGpjc01TNDBZeTB5TGpFc01DMHlMall0TUM0NUxUSXVOaTB5TGpsMkxUQXVPQTBLQ1VNeE1Ua3VOU3c1TUM0MExERXlNQzR5TERnNUxqVXNNVEl5TGpVc09Ea3VOWG9nVFRFeU5pNDJMRGcwTGpab0xURXVOM1l6TGpWakxUQXVOaTB3TGpJdE1TNDFMVEF1TXkweUxqUXRNQzR6WXkwekxqZ3NNQzAwTGpZc01TNDBMVFF1Tml3MExqbDJNQzQwRFFvSll6QXNNeTQwTERFdU15dzBMallzTkM0MUxEUXVObU14TGpFc01Dd3hMamt0TUM0eUxESXVOaTB3TGpkc01DNHlMREF1T0dneExqVk1NVEkyTGpZc09EUXVOa3d4TWpZdU5pdzROQzQyZWlJdlBnMEtQSEJoZEdnZ1kyeGhjM005SW5OME1pSWdaRDBpVFRFek55NHhMRGczTGpob0xURXVOM1kzTGpSakxUQXVPU3d3TGpVdE1pNDBMREF1T0MwekxqUXNNQzQ0WXkweExqRXNNQzB4TGpRdE1DNDJMVEV1TkMweExqbDJMVFl1TlVneE1qbDJOaTQ0WXpBc01pNHpMREF1Tnl3ekxqSXNNaTQ1TERNdU1nMEtDV014TGpRc01Dd3lMamt0TUM0MExETXVOaTB3TGpoc01DNHhMREF1T0dneExqVldPRGN1T0hvaUx6NE5Danh3WVhSb0lHTnNZWE56UFNKemRERWlJR1E5SWsweE9EY3VPU3czTnk0MVl6QXRNU3d3TGpndE1TNDRMREV1TnkweExqaHpNUzQzTERBdU9Dd3hMamNzTVM0NGN5MHdMamdzTVM0NExURXVOeXd4TGpoRE1UZzRMamNzTnprdU1pd3hPRGN1T1N3M09DNDBMREU0Tnk0NUxEYzNMalY2SWk4K0RRbzhMM04yWno0TkNnPT0iKX0KI2Zvcm0gLnNfYnRue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NEtQQ0V0TFNCSFpXNWxjbUYwYjNJNklFRmtiMkpsSUVsc2JIVnpkSEpoZEc5eUlERTVMakl1TVN3Z1UxWkhJRVY0Y0c5eWRDQlFiSFZuTFVsdUlDNGdVMVpISUZabGNuTnBiMjQ2SURZdU1EQWdRblZwYkdRZ01Da2dJQzB0UGdvOGMzWm5JSFpsY25OcGIyNDlJakV1TVNJZ2FXUTlJdVdidnVXeGdsOHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklpQjRQU0l3Y0hnaUlIazlJakJ3ZUNJS0NTQjJhV1YzUW05NFBTSXdJREFnTXpJZ016SWlJSE4wZVd4bFBTSmxibUZpYkdVdFltRmphMmR5YjNWdVpEcHVaWGNnTUNBd0lETXlJRE15T3lJZ2VHMXNPbk53WVdObFBTSndjbVZ6WlhKMlpTSStDanh6ZEhsc1pTQjBlWEJsUFNKMFpYaDBMMk56Y3lJK0Nna3VjM1F3ZTJacGJHdzZJelEzTnpsQ1JEdDlDand2YzNSNWJHVStDanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWsweE5DNDRMREl4TGpWakxUQXVOQ3d3TFRBdU55d3dMVEV1TVMwd0xqRmpMVEl1TVMwd0xqTXRNeTQ1TFRFdU5DMDFMakl0TTJNdE1TNHpMVEV1TnkweExqZ3RNeTQzTFRFdU5pMDFMamhqTUM0ekxUSXVNU3d4TGpRdE15NDVMRE10TlM0eUNnbGpNUzQzTFRFdU15d3pMamd0TVM0NExEVXVPQzB4TGpaak1pNHhMREF1TXl3ekxqa3NNUzQwTERVdU1pd3pZekV1TXl3eExqY3NNUzQ0TERNdU9Dd3hMallzTlM0NFl5MHdMak1zTWk0eExURXVOQ3d6TGprdE15dzFMakpETVRndU1pd3lNU3d4Tmk0MUxESXhMalVzTVRRdU9Dd3lNUzQxZWdvSklFMHhOQzQ0TERndU1XTXRNUzR5TERBdE1pNDBMREF1TkMwekxqTXNNUzR4WXkweUxqUXNNUzQ0TFRJdU9TdzFMak10TVN3M0xqZGpNUzQ0TERJdU5DdzFMak1zTWk0NUxEY3VOeXd4WXpFdU1pMHdMamtzTVM0NUxUSXVNaXd5TGpFdE15NDJZekF1TWkweExqVXRNQzR5TFRJdU9TMHhMakV0TkM0eENnbFRNVGNzT0M0MExERTFMalVzT0M0eVF6RTFMak1zT0M0eUxERTFMRGd1TVN3eE5DNDRMRGd1TVhvaUx6NEtQR2MrQ2drOFp6NEtDUWs4Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk1qVXVNeXd5Tnk0MVRESTFMak1zTWpjdU5XTXRNQzQyTERBdU5DMHhMalFzTUM0ekxURXVPQzB3TGpKc0xUVXVNUzAyTGpkakxUQXVOQzB3TGpZdE1DNHpMVEV1TkN3d0xqSXRNUzQ0YkRBc01Bb0pDUWxqTUM0MkxUQXVOQ3d4TGpRdE1DNHpMREV1T0N3d0xqSnNOUzR4TERZdU4wTXlOaXd5Tmk0ekxESTFMamtzTWpjdU1Td3lOUzR6TERJM0xqVjZJaTgrQ2drOEwyYytDand2Wno0S1BDOXpkbWMrQ2c9PSIpIWltcG9ydGFudH0KI2Zvcm0gLnNfYnRuX3dye2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NEtQQ0V0TFNCSFpXNWxjbUYwYjNJNklFRmtiMkpsSUVsc2JIVnpkSEpoZEc5eUlERTVMakl1TVN3Z1UxWkhJRVY0Y0c5eWRDQlFiSFZuTFVsdUlDNGdVMVpISUZabGNuTnBiMjQ2SURZdU1EQWdRblZwYkdRZ01Da2dJQzB0UGdvOGMzWm5JSFpsY25OcGIyNDlJakV1TVNJZ2FXUTlJdVdidnVXeGdsOHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklpQjRQU0l3Y0hnaUlIazlJakJ3ZUNJS0NTQjJhV1YzUW05NFBTSXdJREFnTXpJZ016SWlJSE4wZVd4bFBTSmxibUZpYkdVdFltRmphMmR5YjNWdVpEcHVaWGNnTUNBd0lETXlJRE15T3lJZ2VHMXNPbk53WVdObFBTSndjbVZ6WlhKMlpTSStDanh6ZEhsc1pTQjBlWEJsUFNKMFpYaDBMMk56Y3lJK0Nna3VjM1F3ZTJacGJHdzZJelEzTnpsQ1JEdDlDand2YzNSNWJHVStDanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWsweE5DNDRMREl4TGpWakxUQXVOQ3d3TFRBdU55d3dMVEV1TVMwd0xqRmpMVEl1TVMwd0xqTXRNeTQ1TFRFdU5DMDFMakl0TTJNdE1TNHpMVEV1TnkweExqZ3RNeTQzTFRFdU5pMDFMamhqTUM0ekxUSXVNU3d4TGpRdE15NDVMRE10TlM0eUNnbGpNUzQzTFRFdU15d3pMamd0TVM0NExEVXVPQzB4TGpaak1pNHhMREF1TXl3ekxqa3NNUzQwTERVdU1pd3pZekV1TXl3eExqY3NNUzQ0TERNdU9Dd3hMallzTlM0NFl5MHdMak1zTWk0eExURXVOQ3d6TGprdE15dzFMakpETVRndU1pd3lNU3d4Tmk0MUxESXhMalVzTVRRdU9Dd3lNUzQxZWdvSklFMHhOQzQ0TERndU1XTXRNUzR5TERBdE1pNDBMREF1TkMwekxqTXNNUzR4WXkweUxqUXNNUzQ0TFRJdU9TdzFMak10TVN3M0xqZGpNUzQ0TERJdU5DdzFMak1zTWk0NUxEY3VOeXd4WXpFdU1pMHdMamtzTVM0NUxUSXVNaXd5TGpFdE15NDJZekF1TWkweExqVXRNQzR5TFRJdU9TMHhMakV0TkM0eENnbFRNVGNzT0M0MExERTFMalVzT0M0eVF6RTFMak1zT0M0eUxERTFMRGd1TVN3eE5DNDRMRGd1TVhvaUx6NEtQR2MrQ2drOFp6NEtDUWs4Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk1qVXVNeXd5Tnk0MVRESTFMak1zTWpjdU5XTXRNQzQyTERBdU5DMHhMalFzTUM0ekxURXVPQzB3TGpKc0xUVXVNUzAyTGpkakxUQXVOQzB3TGpZdE1DNHpMVEV1TkN3d0xqSXRNUzQ0YkRBc01Bb0pDUWxqTUM0MkxUQXVOQ3d4TGpRdE1DNHpMREV1T0N3d0xqSnNOUzR4TERZdU4wTXlOaXd5Tmk0ekxESTFMamtzTWpjdU1Td3lOUzR6TERJM0xqVjZJaTgrQ2drOEwyYytDand2Wno0S1BDOXpkbWMrQ2c9PSIpIWltcG9ydGFudH0KLmMtaWNvbi10aWViYXtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejRLUENFdExTQkhaVzVsY21GMGIzSTZJRUZrYjJKbElFbHNiSFZ6ZEhKaGRHOXlJREU1TGpJdU1Td2dVMVpISUVWNGNHOXlkQ0JRYkhWbkxVbHVJQzRnVTFaSElGWmxjbk5wYjI0NklEWXVNREFnUW5WcGJHUWdNQ2tnSUMwdFBnbzhjM1puSUhabGNuTnBiMjQ5SWpFdU1TSWdhV1E5SXVXYnZ1V3hnbDh4SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhodGJHNXpPbmhzYVc1clBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJaUI0UFNJd2NIZ2lJSGs5SWpCd2VDSUtDU0IyYVdWM1FtOTRQU0l3SURBZ01qUWdNalFpSUhOMGVXeGxQU0psYm1GaWJHVXRZbUZqYTJkeWIzVnVaRHB1WlhjZ01DQXdJREkwSURJME95SWdlRzFzT25Od1lXTmxQU0p3Y21WelpYSjJaU0krQ2p4emRIbHNaU0IwZVhCbFBTSjBaWGgwTDJOemN5SStDZ2t1YzNRd2UyWnBiR3c2SXpNM1FVSkZNenQ5Q2drdWMzUXhlMlpwYkd3NkkwWkdSa1pHUmp0OUNqd3ZjM1I1YkdVK0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB5TUM0NUxESXpMak5JTXk0eFl5MHhMakVzTUMweUxUQXVPUzB5TFRKV01pNDRZekF0TVM0eExEQXVPUzB5TERJdE1tZ3hOeTQ0WXpFdU1Td3dMRElzTUM0NUxESXNNbll4T0M0MVF6SXlMamtzTWpJdU5Dd3lNaXd5TXk0ekxESXdMamtzTWpNdU0zb2lDZ2t2UGdvOFp6NEtDVHh3WVhSb0lHTnNZWE56UFNKemRERWlJR1E5SWswMUxqSXNNVGt1T1V3MExERTVMakpqTVM0MUxURXVPU3d5TGpNdE15NDVMREl1TkMwMUxqaGpNQzB4TERBdU1TMHpMakVzTUM0eExUWXVNMGc0WXpBc01pNHlMREFzTkM0ekxUQXVNU3cyTGpSak1Dd3dMall0TUM0eExERXVNaTB3TGpNc01TNDRDZ2tKYURFdU1XTXdMalVzTUM0NExERXVNaXd5TGpRc01pNHlMRFF1TmtnNVl5MHdMall0TVM0MUxURXVNaTB5TGpndE1TNDJMVE11T1VNM0xERTNMaklzTmk0ekxERTRMallzTlM0eUxERTVMamw2SUUwMExqRXNNVFF1T0ZZMkxqRmpNQzB4TGpJc01DNDFMVEV1T0N3eExqWXRNUzQ0YURNS0NRbGpNU3d3TERFdU5pd3dMamNzTVM0MkxERXVPSFk0TGpaSU9DNDVWall1TTJNd0xUQXVOQzB3TGpNdE1DNDJMVEF1Tmkwd0xqWm9MVEpqTFRBdU5Dd3dMVEF1Tml3d0xqSXRNQzQyTERBdU5uWTRMalZJTkM0eGVpQk5NVEl1T1N3eE9TNDFZeTB4TGpFc01DMHhMamN0TUM0MkxURXVPQzB4TGpaV01UTUtDUWxqTUMweExqRXNNQzQzTFRFdU55d3hMamd0TVM0NGFERldOQzR4YURFdU4zWXlMalZJTWpCV09HZ3ROQzR6ZGpNdU1tZ3hMamhqTVM0eExEQXNNUzQzTERBdU55d3hMamdzTVM0NGRqUXVPR013TERFdU1TMHdMallzTVM0MkxURXVPQ3d4TGpkSU1USXVPWG9nVFRFeUxqZ3NNVE11TTNZMExqTUtDUWxqTUN3d0xqUXNNQzR6TERBdU55d3dMamNzTUM0M2FETXVNbU13TGpVc01Dd3dMamN0TUM0ekxEQXVPQzB3TGpkMkxUUXVOR013TFRBdU5DMHdMak10TUM0M0xUQXVOeTB3TGpkb0xUTXVNME14TXk0eExERXlMallzTVRJdU9Td3hNaTQ0TERFeUxqZ3NNVE11TTNvaUx6NEtQQzluUGdvOEwzTjJaejRLIil9CiN1IC5wZntiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejRLUENFdExTQkhaVzVsY21GMGIzSTZJRUZrYjJKbElFbHNiSFZ6ZEhKaGRHOXlJREU1TGpJdU1Td2dVMVpISUVWNGNHOXlkQ0JRYkhWbkxVbHVJQzRnVTFaSElGWmxjbk5wYjI0NklEWXVNREFnUW5WcGJHUWdNQ2tnSUMwdFBnbzhjM1puSUhabGNuTnBiMjQ5SWpFdU1TSWdhV1E5SXVXYnZ1V3hnbDh4SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhodGJHNXpPbmhzYVc1clBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJaUI0UFNJd2NIZ2lJSGs5SWpCd2VDSUtDU0IyYVdWM1FtOTRQU0l3SURBZ016SWdNeklpSUhOMGVXeGxQU0psYm1GaWJHVXRZbUZqYTJkeWIzVnVaRHB1WlhjZ01DQXdJRE15SURNeU95SWdlRzFzT25Od1lXTmxQU0p3Y21WelpYSjJaU0krQ2p4emRIbHNaU0IwZVhCbFBTSjBaWGgwTDJOemN5SStDZ2t1YzNRd2UyWnBiR3c2SXpaRU5rUTJSRHQ5Q2p3dmMzUjViR1UrQ2p4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMHlOUzR5TERFM0xqSmpNQzB3TGpRc01DNHhMVEF1T0N3d0xqRXRNUzR5WXpBdE1DNDBMREF0TUM0NExUQXVNUzB4TGpKc01pNDJMVEpqTUM0eUxUQXVNaXd3TGpNdE1DNDFMREF1TVMwd0xqaHNMVEl1TlMwMExqTUtDV010TUM0eExUQXVNeTB3TGpVdE1DNDBMVEF1T0Mwd0xqTnNMVE11TVN3eExqSmpMVEF1Tmkwd0xqVXRNUzR6TFRBdU9TMHlMakV0TVM0eWJDMHdMalV0TXk0ell6QXRNQzR6TFRBdU15MHdMalV0TUM0MkxUQXVOV2d0TldNdE1DNHpMREF0TUM0MkxEQXVNaTB3TGpZc01DNDFiQzB3TGpVc015NHpDZ2xqTFRBdU9Dd3dMak10TVM0MExEQXVOeTB5TGpFc01TNHlURGN1TXl3M0xqUkROeXczTGpNc05pNDNMRGN1TkN3MkxqVXNOeTQzVERRc01URXVPV010TUM0eUxEQXVNeTB3TGpFc01DNDJMREF1TVN3d0xqaHNNaTQyTERKak1Dd3dMalF0TUM0eExEQXVPQzB3TGpFc01TNHlDZ2xqTUN3d0xqUXNNQ3d3TGpnc01DNHhMREV1TW13dE1pNDJMREpqTFRBdU1pd3dMakl0TUM0ekxEQXVOUzB3TGpFc01DNDRiREl1TlN3MExqTmpNQzR4TERBdU15d3dMalVzTUM0MExEQXVPQ3d3TGpOc015NHhMVEV1TW1Nd0xqWXNNQzQxTERFdU15d3dMamtzTWk0eExERXVNbXd3TGpVc015NHpDZ2xqTUN3d0xqTXNNQzR6TERBdU5Td3dMallzTUM0MWFEVmpNQzR6TERBc01DNDJMVEF1TWl3d0xqWXRNQzQxYkRBdU5TMHpMak5qTUM0NExUQXVNeXd4TGpRdE1DNDNMREl1TVMweExqSnNNeTR4TERFdU1tTXdMak1zTUM0eExEQXVOaXd3TERBdU9DMHdMak5zTWk0MUxUUXVNd29KWXpBdU1TMHdMak1zTUM0eExUQXVOaTB3TGpFdE1DNDRUREkxTGpJc01UY3VNbm9nVFRFMkxESXdMak5qTFRJdU5Dd3dMVFF1TXkweExqa3ROQzR6TFRRdU0zTXhMamt0TkM0ekxEUXVNeTAwTGpOek5DNHpMREV1T1N3MExqTXNOQzR6VXpFNExqUXNNakF1TXl3eE5pd3lNQzR6ZWlJdlBnbzhMM04yWno0SyIpfQojdSAubGJ7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaWRYUm1MVGdpUHo0S1BDRXRMU0JIWlc1bGNtRjBiM0k2SUVGa2IySmxJRWxzYkhWemRISmhkRzl5SURFNUxqSXVNU3dnVTFaSElFVjRjRzl5ZENCUWJIVm5MVWx1SUM0Z1UxWkhJRlpsY25OcGIyNDZJRFl1TURBZ1FuVnBiR1FnTUNrZ0lDMHRQZ284YzNabklIWmxjbk5wYjI0OUlqRXVNU0lnYVdROUl1V2J2dVd4Z2w4eElpQjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIaHRiRzV6T25oc2FXNXJQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUwzaHNhVzVySWlCNFBTSXdjSGdpSUhrOUlqQndlQ0lLQ1NCMmFXVjNRbTk0UFNJd0lEQWdORFlnTkRZaUlITjBlV3hsUFNKbGJtRmliR1V0WW1GamEyZHliM1Z1WkRwdVpYY2dNQ0F3SURRMklEUTJPeUlnZUcxc09uTndZV05sUFNKd2NtVnpaWEoyWlNJK0NqeHpkSGxzWlNCMGVYQmxQU0owWlhoMEwyTnpjeUkrQ2drdWMzUXdlMlpwYkd3NkkwWkdSa1pHUmp0OUNqd3ZjM1I1YkdVK0NqeHdZWFJvSUdOc1lYTnpQU0p6ZERBaUlHUTlJazB5TXl3eU0yTXlMamtzTUN3MUxqSXRNaTR6TERVdU1pMDFMakp6TFRJdU15MDFMakl0TlM0eUxUVXVNbk10TlM0eUxESXVNeTAxTGpJc05TNHlVekl3TGpFc01qTXNNak1zTWpONklFMHlNeXd5TlM0MkNnbGpMVE11TlN3d0xURXdMalFzTVM0M0xURXdMalFzTlM0eWRqSXVObWd5TUM0M2RpMHlMalpETXpNdU5Dd3lOeTR6TERJMkxqVXNNalV1Tml3eU15d3lOUzQyZWlJdlBnbzhMM04yWno0SyIpfQojdTEgYS5wZntiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejRLUENFdExTQkhaVzVsY21GMGIzSTZJRUZrYjJKbElFbHNiSFZ6ZEhKaGRHOXlJREU1TGpJdU1Td2dVMVpISUVWNGNHOXlkQ0JRYkhWbkxVbHVJQzRnVTFaSElGWmxjbk5wYjI0NklEWXVNREFnUW5WcGJHUWdNQ2tnSUMwdFBnbzhjM1puSUhabGNuTnBiMjQ5SWpFdU1TSWdhV1E5SXVXYnZ1V3hnbDh4SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhodGJHNXpPbmhzYVc1clBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJaUI0UFNJd2NIZ2lJSGs5SWpCd2VDSUtDU0IyYVdWM1FtOTRQU0l3SURBZ016SWdNeklpSUhOMGVXeGxQU0psYm1GaWJHVXRZbUZqYTJkeWIzVnVaRHB1WlhjZ01DQXdJRE15SURNeU95SWdlRzFzT25Od1lXTmxQU0p3Y21WelpYSjJaU0krQ2p4emRIbHNaU0IwZVhCbFBTSjBaWGgwTDJOemN5SStDZ2t1YzNRd2UyWnBiR3c2SXpaRU5rUTJSRHQ5Q2p3dmMzUjViR1UrQ2p4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMHlOUzR5TERFM0xqSmpNQzB3TGpRc01DNHhMVEF1T0N3d0xqRXRNUzR5WXpBdE1DNDBMREF0TUM0NExUQXVNUzB4TGpKc01pNDJMVEpqTUM0eUxUQXVNaXd3TGpNdE1DNDFMREF1TVMwd0xqaHNMVEl1TlMwMExqTUtDV010TUM0eExUQXVNeTB3TGpVdE1DNDBMVEF1T0Mwd0xqTnNMVE11TVN3eExqSmpMVEF1Tmkwd0xqVXRNUzR6TFRBdU9TMHlMakV0TVM0eWJDMHdMalV0TXk0ell6QXRNQzR6TFRBdU15MHdMalV0TUM0MkxUQXVOV2d0TldNdE1DNHpMREF0TUM0MkxEQXVNaTB3TGpZc01DNDFiQzB3TGpVc015NHpDZ2xqTFRBdU9Dd3dMak10TVM0MExEQXVOeTB5TGpFc01TNHlURGN1TXl3M0xqUkROeXczTGpNc05pNDNMRGN1TkN3MkxqVXNOeTQzVERRc01URXVPV010TUM0eUxEQXVNeTB3TGpFc01DNDJMREF1TVN3d0xqaHNNaTQyTERKak1Dd3dMalF0TUM0eExEQXVPQzB3TGpFc01TNHlDZ2xqTUN3d0xqUXNNQ3d3TGpnc01DNHhMREV1TW13dE1pNDJMREpqTFRBdU1pd3dMakl0TUM0ekxEQXVOUzB3TGpFc01DNDRiREl1TlN3MExqTmpNQzR4TERBdU15d3dMalVzTUM0MExEQXVPQ3d3TGpOc015NHhMVEV1TW1Nd0xqWXNNQzQxTERFdU15d3dMamtzTWk0eExERXVNbXd3TGpVc015NHpDZ2xqTUN3d0xqTXNNQzR6TERBdU5Td3dMallzTUM0MWFEVmpNQzR6TERBc01DNDJMVEF1TWl3d0xqWXRNQzQxYkRBdU5TMHpMak5qTUM0NExUQXVNeXd4TGpRdE1DNDNMREl1TVMweExqSnNNeTR4TERFdU1tTXdMak1zTUM0eExEQXVOaXd3TERBdU9DMHdMak5zTWk0MUxUUXVNd29KWXpBdU1TMHdMak1zTUM0eExUQXVOaTB3TGpFdE1DNDRUREkxTGpJc01UY3VNbm9nVFRFMkxESXdMak5qTFRJdU5Dd3dMVFF1TXkweExqa3ROQzR6TFRRdU0zTXhMamt0TkM0ekxEUXVNeTAwTGpOek5DNHpMREV1T1N3MExqTXNOQzR6VXpFNExqUXNNakF1TXl3eE5pd3lNQzR6ZWlJdlBnbzhMM04yWno0SyIpfQojdTEgYS5wZiwgI3UxIGEubGJ7Y29sb3I6IHJnYmEoMCwwLDAsMCkhaW1wb3J0YW50O30KI3UxIGEuYnJpe2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NEtQQ0V0TFNCSFpXNWxjbUYwYjNJNklFRmtiMkpsSUVsc2JIVnpkSEpoZEc5eUlERTVMakl1TVN3Z1UxWkhJRVY0Y0c5eWRDQlFiSFZuTFVsdUlDNGdVMVpISUZabGNuTnBiMjQ2SURZdU1EQWdRblZwYkdRZ01Da2dJQzB0UGdvOGMzWm5JSFpsY25OcGIyNDlJakV1TVNJZ2FXUTlJdVdidnVXeGdsOHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklpQjRQU0l3Y0hnaUlIazlJakJ3ZUNJS0NTQjJhV1YzUW05NFBTSXdJREFnTXpJZ016SWlJSE4wZVd4bFBTSmxibUZpYkdVdFltRmphMmR5YjNWdVpEcHVaWGNnTUNBd0lETXlJRE15T3lJZ2VHMXNPbk53WVdObFBTSndjbVZ6WlhKMlpTSStDanh6ZEhsc1pTQjBlWEJsUFNKMFpYaDBMMk56Y3lJK0Nna3VjM1F3ZTJacGJHdzZJelpFTmtRMlJEdDlDand2YzNSNWJHVStDanh3WVhSb0lHTnNZWE56UFNKemREQWlJR1E5SWswekxqY3NPUzQ0YURZdU1sWXpMamRJTXk0M1Zqa3VPSG9nVFRFeUxqa3NNamd1TTJnMkxqSjJMVFl1TW1ndE5pNHlWakk0TGpONklFMHpMamNzTWpndU0yZzJMakoyTFRZdU1rZ3pMamRXTWpndU0zb2dUVE11Tnl3eE9TNHhhRFl1TW5ZdE5pNHlDZ2xJTXk0M1ZqRTVMakY2SUUweE1pNDVMREU1TGpGb05pNHlkaTAyTGpKb0xUWXVNbFl4T1M0eGVpQk5Nakl1TWl3ekxqZDJOaTR5YURZdU1sWXpMamRJTWpJdU1ub2dUVEV5TGprc09TNDRhRFl1TWxZekxqZG9MVFl1TWxZNUxqaDZJRTB5TWk0eUxERTVMakZvTmk0eWRpMDJMakpvTFRZdU1sWXhPUzR4Q2dsNklFMHlNaTR5TERJNExqTm9OaTR5ZGkwMkxqSm9MVFl1TWxZeU9DNHplaUl2UGdvOEwzTjJaejRLIil9CiNzX3VzZXJzZXR0aW5nX3RvcHtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejRLUENFdExTQkhaVzVsY21GMGIzSTZJRUZrYjJKbElFbHNiSFZ6ZEhKaGRHOXlJREU1TGpJdU1Td2dVMVpISUVWNGNHOXlkQ0JRYkhWbkxVbHVJQzRnVTFaSElGWmxjbk5wYjI0NklEWXVNREFnUW5WcGJHUWdNQ2tnSUMwdFBnbzhjM1puSUhabGNuTnBiMjQ5SWpFdU1TSWdhV1E5SXVXYnZ1V3hnbDh4SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhodGJHNXpPbmhzYVc1clBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJaUI0UFNJd2NIZ2lJSGs5SWpCd2VDSUtDU0IyYVdWM1FtOTRQU0l3SURBZ016SWdNeklpSUhOMGVXeGxQU0psYm1GaWJHVXRZbUZqYTJkeWIzVnVaRHB1WlhjZ01DQXdJRE15SURNeU95SWdlRzFzT25Od1lXTmxQU0p3Y21WelpYSjJaU0krQ2p4emRIbHNaU0IwZVhCbFBTSjBaWGgwTDJOemN5SStDZ2t1YzNRd2UyWnBiR3c2SXpaRU5rUTJSRHQ5Q2p3dmMzUjViR1UrQ2p4d1lYUm9JR05zWVhOelBTSnpkREFpSUdROUlrMHlOUzR5TERFM0xqSmpNQzB3TGpRc01DNHhMVEF1T0N3d0xqRXRNUzR5WXpBdE1DNDBMREF0TUM0NExUQXVNUzB4TGpKc01pNDJMVEpqTUM0eUxUQXVNaXd3TGpNdE1DNDFMREF1TVMwd0xqaHNMVEl1TlMwMExqTUtDV010TUM0eExUQXVNeTB3TGpVdE1DNDBMVEF1T0Mwd0xqTnNMVE11TVN3eExqSmpMVEF1Tmkwd0xqVXRNUzR6TFRBdU9TMHlMakV0TVM0eWJDMHdMalV0TXk0ell6QXRNQzR6TFRBdU15MHdMalV0TUM0MkxUQXVOV2d0TldNdE1DNHpMREF0TUM0MkxEQXVNaTB3TGpZc01DNDFiQzB3TGpVc015NHpDZ2xqTFRBdU9Dd3dMak10TVM0MExEQXVOeTB5TGpFc01TNHlURGN1TXl3M0xqUkROeXczTGpNc05pNDNMRGN1TkN3MkxqVXNOeTQzVERRc01URXVPV010TUM0eUxEQXVNeTB3TGpFc01DNDJMREF1TVN3d0xqaHNNaTQyTERKak1Dd3dMalF0TUM0eExEQXVPQzB3TGpFc01TNHlDZ2xqTUN3d0xqUXNNQ3d3TGpnc01DNHhMREV1TW13dE1pNDJMREpqTFRBdU1pd3dMakl0TUM0ekxEQXVOUzB3TGpFc01DNDRiREl1TlN3MExqTmpNQzR4TERBdU15d3dMalVzTUM0MExEQXVPQ3d3TGpOc015NHhMVEV1TW1Nd0xqWXNNQzQxTERFdU15d3dMamtzTWk0eExERXVNbXd3TGpVc015NHpDZ2xqTUN3d0xqTXNNQzR6TERBdU5Td3dMallzTUM0MWFEVmpNQzR6TERBc01DNDJMVEF1TWl3d0xqWXRNQzQxYkRBdU5TMHpMak5qTUM0NExUQXVNeXd4TGpRdE1DNDNMREl1TVMweExqSnNNeTR4TERFdU1tTXdMak1zTUM0eExEQXVOaXd3TERBdU9DMHdMak5zTWk0MUxUUXVNd29KWXpBdU1TMHdMak1zTUM0eExUQXVOaTB3TGpFdE1DNDRUREkxTGpJc01UY3VNbm9nVFRFMkxESXdMak5qTFRJdU5Dd3dMVFF1TXkweExqa3ROQzR6TFRRdU0zTXhMamt0TkM0ekxEUXVNeTAwTGpOek5DNHpMREV1T1N3MExqTXNOQzR6VXpFNExqUXNNakF1TXl3eE5pd3lNQzR6ZWlJdlBnbzhMM04yWno0SyIpfQojaW1zZ3tiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejROQ2p3aExTMGdSMlZ1WlhKaGRHOXlPaUJCWkc5aVpTQkpiR3gxYzNSeVlYUnZjaUF4T1M0eUxqRXNJRk5XUnlCRmVIQnZjblFnVUd4MVp5MUpiaUF1SUZOV1J5QldaWEp6YVc5dU9pQTJMakF3SUVKMWFXeGtJREFwSUNBdExUNE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUJwWkQwaTVadSs1YkdDWHpFaUlIaHRiRzV6UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eU1EQXdMM04yWnlJZ2VHMXNibk02ZUd4cGJtczlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MekU1T1RrdmVHeHBibXNpSUhnOUlqQndlQ0lnZVQwaU1IQjRJZzBLQ1NCMmFXVjNRbTk0UFNJd0lEQWdNeklnTXpJaUlITjBlV3hsUFNKbGJtRmliR1V0WW1GamEyZHliM1Z1WkRwdVpYY2dNQ0F3SURNeUlETXlPeUlnZUcxc09uTndZV05sUFNKd2NtVnpaWEoyWlNJK0RRbzhjM1I1YkdVZ2RIbHdaVDBpZEdWNGRDOWpjM01pUGcwS0NTNXpkREI3Wm1sc2JEb2pOa1EyUkRaRU8zME5Dand2YzNSNWJHVStEUW84Y0dGMGFDQmpiR0Z6Y3owaWMzUXdJaUJrUFNKTk1qVXVNeXcwTGpab0xURTVRelVzTkM0MkxETXVPU3cxTGpjc015NDVMRGRzTUN3eU1TNDBiRFF1T0MwMExqaG9NVFl1Tm1NeExqTXNNQ3d5TGpRdE1TNHhMREl1TkMweUxqUldOME15Tnk0M0xEVXVOeXd5Tmk0MkxEUXVOaXd5TlM0ekxEUXVObm9OQ2drZ1RUSXlMamtzTVRndU9VZzRMaloyTFRJdU5HZ3hOQzR6VmpFNExqbDZJRTB5TWk0NUxERTFMak5JT0M0MmRpMHlMalJvTVRRdU0xWXhOUzR6ZWlCTk1qSXVPU3d4TVM0M1NEZ3VObFk1TGpSb01UUXVNMVl4TVM0M2VpSXZQZzBLUEM5emRtYytEUW89Iil9Ci5yZXN1bHQuYy1jb250YWluZXJ7YmFja2dyb3VuZDojZmZmO2JvcmRlci1yYWRpdXM6MnB4O3BhZGRpbmc6MjVweDt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzO2JveC1zaGFkb3c6MCAxcHggNHB4IDAgcmdiYSgwLDAsMCwuMTQpO3dpZHRoOjU0OXB4fQpoMyBhOnZpc2l0ZWR7b3BhY2l0eTouNCFpbXBvcnRhbnQ7Y29sb3I6I2JiYiFpbXBvcnRhbnR9Ci5yZXN1bHQuYy1jb250YWluZXI6aG92ZXJ7dHJhbnNpdGlvbjphbGwgLjVzIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHM7Ym94LXNoYWRvdzpyZ2JhKDAsMCwwLC4xMTc2NDcpIDAgMXB4IDZweCxyZ2JhKDAsMCwwLC4xMTc2NDcpIDAgMXB4IDRweH0KLnJlc3VsdC5jLWNvbnRhaW5lcjphY3RpdmV7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwcztib3gtc2hhZG93OnJnYmEoMCwwLDAsLjE4ODIzNSkgMCAxMHB4IDMwcHgscmdiYSgwLDAsMCwuMjI3NDUxKSAwIDZweCAxMHB4fQoudHtwYWRkaW5nLWJvdHRvbToxMHB4fQouYy1ib3JkZXJ7d2lkdGg6NTU5cHg7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDttYXJnaW4tdG9wOjE3cHg7bWFyZ2luLWJvdHRvbToyM3B4O2JvcmRlci10b3A6I0VFRSAxcHggc29saWQ7Ym9yZGVyLWJvdHRvbTojRUVFIDFweCBzb2xpZH0KI2hlbHB7cGFkZGluZy1sZWZ0OjEwN3B4IWltcG9ydGFudH0KLmMtdG9vbHMgYXtib3JkZXI6MCFpbXBvcnRhbnR9Ci5mMTMgYTpob3Zlcntib3JkZXI6bm9uZSFpbXBvcnRhbnR9Ci5mMTMgLm06aG92ZXJ7Ym9yZGVyLWJvdHRvbTpzb2xpZCAxcHggIzY2NiFpbXBvcnRhbnR9Ci5nIC5tOmhvdmVye2JvcmRlci1ib3R0b206c29saWQgMXB4ICM2NjYhaW1wb3J0YW50fQouYy1yb3cgYTpob3Zlcntib3JkZXItYm90dG9tOiMzNDc2ZDIgMXB4IHNvbGlkfQouYy1zcGFuNiBhOmhvdmVye2JvcmRlci1ib3R0b206bm9uZX0KLm9wX3ZkX21pbmluZXdlc3RfbGluazpob3ZlcntvcGFjaXR5Oi44fQoub3AtdGllYmEtb2ZmaWNhbC1sb29rbW9yZSBhOmhvdmVye2JvcmRlci1ib3R0b206IzM0NzZkMiAxcHggc29saWR9Cm9wLXRpZWJhLWdlbmVyYWwtbG9va21vcmUgYTpob3Zlcntib3JkZXItYm90dG9tOiMzNDc2ZDIgMXB4IHNvbGlkfQouYy10aXAtbWVudSB1bCBsaSBhe2NvbG9yOiMzNDc2ZDIhaW1wb3J0YW50fQpoMyBhOmhvdmVye2JvcmRlcjpub25lIWltcG9ydGFudDtvcGFjaXR5Oi43O3RyYW5zaXRpb246YWxsIDQ1MG1zIGN1YmljLWJlemllciguMjMsMSwuMzIsMSkgMHN9CmgzIGF7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30KLnNpdGVsaW5rX3N1bW1hcnkgYTpob3Zlcntib3JkZXItYm90dG9tOiMzNDc2ZDIgMXB4IHNvbGlkfQouYy1ncmF5OmhvdmVye2JvcmRlci1ib3R0b206IzY2NiAxcHggc29saWR9Ci5vcF9rZWZ1dGFibGVfY29tbWl0dGVsOmhvdmVye2JvcmRlci1ib3R0b206IzY2NiAxcHggc29saWR9Ci5vcC1zb2Z0LWJ0bmJveCBhOmhvdmVye2JvcmRlcjpub25lIWltcG9ydGFudH0KLm9wLXNvZnQtYXMtcGMtZG93bmJ0bnttYXJnaW4tbGVmdDowIWltcG9ydGFudDtjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzM0NzZkMjtwYWRkaW5nOjNweCAxNXB4O2JvcmRlci1yYWRpdXM6MnB4O2ZvbnQtc2l6ZToxNHB4O3RyYW5zaXRpb246YWxsIC4zcyBlYXNlO2JvcmRlcjpub25lO21hcmdpbi10b3A6LTNweH0KLm9wLXNvZnQtYXMtcGMtZG93bmJ0bjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM3MDk4RDA7dHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7Ym94LXNoYWRvdzowIDJweCA1cHggMCByZ2JhKDAsMCwwLC4xNiksMCAycHggMTBweCAwIHJnYmEoMCwwLDAsLjEyKTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9Ci5jLWJ0bi1wcmltYXJ5e21hcmdpbi1sZWZ0OjAhaW1wb3J0YW50O2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojMzQ3NmQyO3BhZGRpbmc6M3B4IDE1cHg7Ym9yZGVyLXJhZGl1czoycHg7Zm9udC1zaXplOjE0cHg7dHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7Ym9yZGVyOm5vbmU7bWFyZ2luLXRvcDotM3B4fQouYy1idG4tcHJpbWFyeTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM3MDk4RDA7dHJhbnNpdGlvbjphbGwgLjNzIGVhc2U7Ym94LXNoYWRvdzowIDJweCA1cHggMCByZ2JhKDAsMCwwLC4xNiksMCAycHggMTBweCAwIHJnYmEoMCwwLDAsLjEyKTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9Ci5vcC1zb2Z0LXRpdGxlIGE6aG92ZXJ7Ym9yZGVyOm5vbmUhaW1wb3J0YW50O29wYWNpdHk6Ljc7dHJhbnNpdGlvbjphbGwgNDUwbXMgY3ViaWMtYmV6aWVyKC4yMywxLC4zMiwxKSAwc30KLm9wLXNvZnQtdGl0bGUgYXt0cmFuc2l0aW9uOmFsbCA0NTBtcyBjdWJpYy1iZXppZXIoLjIzLDEsLjMyLDEpIDBzfQoubnVtc3t3aWR0aDo1OThweH0KLnNlYXJjaF90b29sX2NvbnRlcnt3aWR0aDo1OThweH0KLm9wX29mZmljYWxfd2VpYm9fb3RoZXIgYTpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZSFpbXBvcnRhbnR9Ci5vcF9vZmZpY2FsX3dlaWJvX2luZm8gYTpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZSFpbXBvcnRhbnR9Ci5vcF9vZmZpY2FsX3dlaWJvX2NvbnRlbnQgYTpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZSFpbXBvcnRhbnR9Ci5jLWJ0bntib3JkZXI6bm9uZSFpbXBvcnRhbnR9Ci5vcC16eC1uZXctbXZpZGVvLWluZm86aG92ZXJ7Ym9yZGVyLWJvdHRvbTpub25lfQoub3AtengtbmV3LW12aWRlby1ybHQgYTpob3Zlcntib3JkZXItYm90dG9tOiMzNDc2ZDIgMXB4IHNvbGlkfQoub3AtengtbmV3LW12aWRlby1vbmVsaW5lIGE6aG92ZXJ7Ym9yZGVyLWJvdHRvbTojMzQ3NmQyIDFweCBzb2xpZH0KLmhpbnRfY29tbW9uX3Jlc3RvcHtjb2xvcjojRUE0MzM1O2ZvbnQtc2l6ZTptZWRpdW07Zm9udC13ZWlnaHQ6NzAwfQoub3AtdGllYmEtZ2VuZXJhbC1tYWluLWNvbCBwOmhvdmVye2JvcmRlcjpub25lIWltcG9ydGFudH0KLmMtdGV4dHtiYWNrZ3JvdW5kOiMzNDc2ZDI7Y29sb3I6I2ZmZjtib3JkZXI6IzM0NzZkMiAxcHggc29saWQ7cGFkZGluZy10b3A6M3B4O2JvcmRlci1yYWRpdXM6MnB4fQouYy10ZXh0OmhvdmVye2JhY2tncm91bmQ6MCAwO2NvbG9yOiMzNDc2ZDI7Ym9yZGVyOiMzNDc2ZDIgMXB4IHNvbGlkIWltcG9ydGFudDtwYWRkaW5nLXRvcDozcHg7Ym9yZGVyLXJhZGl1czoycHh9Cg=="}],"requires":[{"meta":{"name":"vue.min.js","url":"https://cdn.staticfile.org/vue/2.6.14/vue.min.js","ts":1670421067011,"mimetype":"text/javascript"},"source":"LyohCiAqIFZ1ZS5qcyB2Mi42LjE0CiAqIChjKSAyMDE0LTIwMjEgRXZhbiBZb3UKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KIWZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9ZXx8c2VsZikuVnVlPXQoKX0odGhpcyxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiB0KGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gcihlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gaShlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHwiYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIG8oZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9dmFyIGE9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBzKGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09YS5jYWxsKGUpfWZ1bmN0aW9uIGMoZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiB0Pj0wJiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gdShlKXtyZXR1cm4gbihlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gbChlKXtyZXR1cm4gbnVsbD09ZT8iIjpBcnJheS5pc0FycmF5KGUpfHxzKGUpJiZlLnRvU3RyaW5nPT09YT9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHAoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxpPTA7aTxyLmxlbmd0aDtpKyspbltyW2ldXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19dmFyIGQ9cCgic2xvdCxjb21wb25lbnQiLCEwKSx2PXAoImtleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzIik7ZnVuY3Rpb24gaChlLHQpe2lmKGUubGVuZ3RoKXt2YXIgbj1lLmluZGV4T2YodCk7aWYobj4tMSlyZXR1cm4gZS5zcGxpY2UobiwxKX19dmFyIG09T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB5KGUsdCl7cmV0dXJuIG0uY2FsbChlLHQpfWZ1bmN0aW9uIGcoZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHRbbl18fCh0W25dPWUobikpfX12YXIgXz0vLShcdykvZyxiPWcoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShfLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOiIifSl9KSwkPWcoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pLHc9L1xCKFtBLVpdKS9nLEM9ZyhmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHcsIi0kMSIpLnRvTG93ZXJDYXNlKCl9KTt2YXIgeD1GdW5jdGlvbi5wcm90b3R5cGUuYmluZD9mdW5jdGlvbihlLHQpe3JldHVybiBlLmJpbmQodCl9OmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO3JldHVybiByP3I+MT9lLmFwcGx5KHQsYXJndW1lbnRzKTplLmNhbGwodCxuKTplLmNhbGwodCl9cmV0dXJuIG4uX2xlbmd0aD1lLmxlbmd0aCxufTtmdW5jdGlvbiBrKGUsdCl7dD10fHwwO2Zvcih2YXIgbj1lLmxlbmd0aC10LHI9bmV3IEFycmF5KG4pO24tLTspcltuXT1lW24rdF07cmV0dXJuIHJ9ZnVuY3Rpb24gQShlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBPKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXSYmQSh0LGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIFMoZSx0LG4pe312YXIgVD1mdW5jdGlvbihlLHQsbil7cmV0dXJuITF9LE49ZnVuY3Rpb24oZSl7cmV0dXJuIGV9O2Z1bmN0aW9uIEUoZSx0KXtpZihlPT09dClyZXR1cm4hMDt2YXIgbj1vKGUpLHI9byh0KTtpZighbnx8IXIpcmV0dXJuIW4mJiFyJiZTdHJpbmcoZSk9PT1TdHJpbmcodCk7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkoZSksYT1BcnJheS5pc0FycmF5KHQpO2lmKGkmJmEpcmV0dXJuIGUubGVuZ3RoPT09dC5sZW5ndGgmJmUuZXZlcnkoZnVuY3Rpb24oZSxuKXtyZXR1cm4gRShlLHRbbl0pfSk7aWYoZSBpbnN0YW5jZW9mIERhdGUmJnQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBlLmdldFRpbWUoKT09PXQuZ2V0VGltZSgpO2lmKGl8fGEpcmV0dXJuITE7dmFyIHM9T2JqZWN0LmtleXMoZSksYz1PYmplY3Qua2V5cyh0KTtyZXR1cm4gcy5sZW5ndGg9PT1jLmxlbmd0aCYmcy5ldmVyeShmdW5jdGlvbihuKXtyZXR1cm4gRShlW25dLHRbbl0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIGooZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihFKGVbbl0sdCkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gRChlKXt2YXIgdD0hMTtyZXR1cm4gZnVuY3Rpb24oKXt0fHwodD0hMCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciBMPSJkYXRhLXNlcnZlci1yZW5kZXJlZCIsST1bImNvbXBvbmVudCIsImRpcmVjdGl2ZSIsImZpbHRlciJdLE09WyJiZWZvcmVDcmVhdGUiLCJjcmVhdGVkIiwiYmVmb3JlTW91bnQiLCJtb3VudGVkIiwiYmVmb3JlVXBkYXRlIiwidXBkYXRlZCIsImJlZm9yZURlc3Ryb3kiLCJkZXN0cm95ZWQiLCJhY3RpdmF0ZWQiLCJkZWFjdGl2YXRlZCIsImVycm9yQ2FwdHVyZWQiLCJzZXJ2ZXJQcmVmZXRjaCJdLEY9e29wdGlvbk1lcmdlU3RyYXRlZ2llczpPYmplY3QuY3JlYXRlKG51bGwpLHNpbGVudDohMSxwcm9kdWN0aW9uVGlwOiExLGRldnRvb2xzOiExLHBlcmZvcm1hbmNlOiExLGVycm9ySGFuZGxlcjpudWxsLHdhcm5IYW5kbGVyOm51bGwsaWdub3JlZEVsZW1lbnRzOltdLGtleUNvZGVzOk9iamVjdC5jcmVhdGUobnVsbCksaXNSZXNlcnZlZFRhZzpULGlzUmVzZXJ2ZWRBdHRyOlQsaXNVbmtub3duRWxlbWVudDpULGdldFRhZ05hbWVzcGFjZTpTLHBhcnNlUGxhdGZvcm1UYWdOYW1lOk4sbXVzdFVzZVByb3A6VCxhc3luYzohMCxfbGlmZWN5Y2xlSG9va3M6TX0sUD0vYS16QS1aXHUwMEI3XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwM0YtXHUyMDQwXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkQvO2Z1bmN0aW9uIFIoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX12YXIgSD1uZXcgUmVnRXhwKCJbXiIrUC5zb3VyY2UrIi4kX1xcZF0iKTt2YXIgQixVPSJfX3Byb3RvX18iaW57fSxWPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LHo9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sSz16JiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksSj1WJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLHE9SiYmL21zaWV8dHJpZGVudC8udGVzdChKKSxXPUomJkouaW5kZXhPZigibXNpZSA5LjAiKT4wLFo9SiYmSi5pbmRleE9mKCJlZGdlLyIpPjAsRz0oSiYmSi5pbmRleE9mKCJhbmRyb2lkIiksSiYmL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KEopfHwiaW9zIj09PUspLFg9KEomJi9jaHJvbWVcL1xkKy8udGVzdChKKSxKJiYvcGhhbnRvbWpzLy50ZXN0KEopLEomJkoubWF0Y2goL2ZpcmVmb3hcLyhcZCspLykpLFk9e30ud2F0Y2gsUT0hMTtpZihWKXRyeXt2YXIgZWU9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGVlLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7UT0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLGVlKX1jYXRjaChlKXt9dmFyIHRlPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PUImJihCPSFWJiYheiYmInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWwmJihnbG9iYWwucHJvY2VzcyYmInNlcnZlciI9PT1nbG9iYWwucHJvY2Vzcy5lbnYuVlVFX0VOVikpLEJ9LG5lPVYmJndpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO2Z1bmN0aW9uIHJlKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYvbmF0aXZlIGNvZGUvLnRlc3QoZS50b1N0cmluZygpKX12YXIgaWUsb2U9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJnJlKFN5bWJvbCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmcmUoUmVmbGVjdC5vd25LZXlzKTtpZT0idW5kZWZpbmVkIiE9dHlwZW9mIFNldCYmcmUoU2V0KT9TZXQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX1yZXR1cm4gZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiEwPT09dGhpcy5zZXRbZV19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLnNldFtlXT0hMH0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfSxlfSgpO3ZhciBhZT1TLHNlPTAsY2U9ZnVuY3Rpb24oKXt0aGlzLmlkPXNlKyssdGhpcy5zdWJzPVtdfTtjZS5wcm90b3R5cGUuYWRkU3ViPWZ1bmN0aW9uKGUpe3RoaXMuc3Vicy5wdXNoKGUpfSxjZS5wcm90b3R5cGUucmVtb3ZlU3ViPWZ1bmN0aW9uKGUpe2godGhpcy5zdWJzLGUpfSxjZS5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Y2UudGFyZ2V0JiZjZS50YXJnZXQuYWRkRGVwKHRoaXMpfSxjZS5wcm90b3R5cGUubm90aWZ5PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuc3Vicy5zbGljZSgpLHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspZVt0XS51cGRhdGUoKX0sY2UudGFyZ2V0PW51bGw7dmFyIHVlPVtdO2Z1bmN0aW9uIGxlKGUpe3VlLnB1c2goZSksY2UudGFyZ2V0PWV9ZnVuY3Rpb24gZmUoKXt1ZS5wb3AoKSxjZS50YXJnZXQ9dWVbdWUubGVuZ3RoLTFdfXZhciBwZT1mdW5jdGlvbihlLHQsbixyLGksbyxhLHMpe3RoaXMudGFnPWUsdGhpcy5kYXRhPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMudGV4dD1yLHRoaXMuZWxtPWksdGhpcy5ucz12b2lkIDAsdGhpcy5jb250ZXh0PW8sdGhpcy5mbkNvbnRleHQ9dm9pZCAwLHRoaXMuZm5PcHRpb25zPXZvaWQgMCx0aGlzLmZuU2NvcGVJZD12b2lkIDAsdGhpcy5rZXk9dCYmdC5rZXksdGhpcy5jb21wb25lbnRPcHRpb25zPWEsdGhpcy5jb21wb25lbnRJbnN0YW5jZT12b2lkIDAsdGhpcy5wYXJlbnQ9dm9pZCAwLHRoaXMucmF3PSExLHRoaXMuaXNTdGF0aWM9ITEsdGhpcy5pc1Jvb3RJbnNlcnQ9ITAsdGhpcy5pc0NvbW1lbnQ9ITEsdGhpcy5pc0Nsb25lZD0hMSx0aGlzLmlzT25jZT0hMSx0aGlzLmFzeW5jRmFjdG9yeT1zLHRoaXMuYXN5bmNNZXRhPXZvaWQgMCx0aGlzLmlzQXN5bmNQbGFjZWhvbGRlcj0hMX0sZGU9e2NoaWxkOntjb25maWd1cmFibGU6ITB9fTtkZS5jaGlsZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocGUucHJvdG90eXBlLGRlKTt2YXIgdmU9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9IiIpO3ZhciB0PW5ldyBwZTtyZXR1cm4gdC50ZXh0PWUsdC5pc0NvbW1lbnQ9ITAsdH07ZnVuY3Rpb24gaGUoZSl7cmV0dXJuIG5ldyBwZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCxTdHJpbmcoZSkpfWZ1bmN0aW9uIG1lKGUpe3ZhciB0PW5ldyBwZShlLnRhZyxlLmRhdGEsZS5jaGlsZHJlbiYmZS5jaGlsZHJlbi5zbGljZSgpLGUudGV4dCxlLmVsbSxlLmNvbnRleHQsZS5jb21wb25lbnRPcHRpb25zLGUuYXN5bmNGYWN0b3J5KTtyZXR1cm4gdC5ucz1lLm5zLHQuaXNTdGF0aWM9ZS5pc1N0YXRpYyx0LmtleT1lLmtleSx0LmlzQ29tbWVudD1lLmlzQ29tbWVudCx0LmZuQ29udGV4dD1lLmZuQ29udGV4dCx0LmZuT3B0aW9ucz1lLmZuT3B0aW9ucyx0LmZuU2NvcGVJZD1lLmZuU2NvcGVJZCx0LmFzeW5jTWV0YT1lLmFzeW5jTWV0YSx0LmlzQ2xvbmVkPSEwLHR9dmFyIHllPUFycmF5LnByb3RvdHlwZSxnZT1PYmplY3QuY3JlYXRlKHllKTtbInB1c2giLCJwb3AiLCJzaGlmdCIsInVuc2hpZnQiLCJzcGxpY2UiLCJzb3J0IiwicmV2ZXJzZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9eWVbZV07UihnZSxlLGZ1bmN0aW9uKCl7Zm9yKHZhciBuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09YXJndW1lbnRzW3JdO3ZhciBpLG89dC5hcHBseSh0aGlzLG4pLGE9dGhpcy5fX29iX187c3dpdGNoKGUpe2Nhc2UicHVzaCI6Y2FzZSJ1bnNoaWZ0IjppPW47YnJlYWs7Y2FzZSJzcGxpY2UiOmk9bi5zbGljZSgyKX1yZXR1cm4gaSYmYS5vYnNlcnZlQXJyYXkoaSksYS5kZXAubm90aWZ5KCksb30pfSk7dmFyIF9lPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGdlKSxiZT0hMDtmdW5jdGlvbiAkZShlKXtiZT1lfXZhciB3ZT1mdW5jdGlvbihlKXt2YXIgdDt0aGlzLnZhbHVlPWUsdGhpcy5kZXA9bmV3IGNlLHRoaXMudm1Db3VudD0wLFIoZSwiX19vYl9fIix0aGlzKSxBcnJheS5pc0FycmF5KGUpPyhVPyh0PWdlLGUuX19wcm90b19fPXQpOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07UihlLG8sdFtvXSl9fShlLGdlLF9lKSx0aGlzLm9ic2VydmVBcnJheShlKSk6dGhpcy53YWxrKGUpfTtmdW5jdGlvbiBDZShlLHQpe3ZhciBuO2lmKG8oZSkmJiEoZSBpbnN0YW5jZW9mIHBlKSlyZXR1cm4geShlLCJfX29iX18iKSYmZS5fX29iX18gaW5zdGFuY2VvZiB3ZT9uPWUuX19vYl9fOmJlJiYhdGUoKSYmKEFycmF5LmlzQXJyYXkoZSl8fHMoZSkpJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYhZS5faXNWdWUmJihuPW5ldyB3ZShlKSksdCYmbiYmbi52bUNvdW50Kyssbn1mdW5jdGlvbiB4ZShlLHQsbixyLGkpe3ZhciBvPW5ldyBjZSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtpZighYXx8ITEhPT1hLmNvbmZpZ3VyYWJsZSl7dmFyIHM9YSYmYS5nZXQsYz1hJiZhLnNldDtzJiYhY3x8MiE9PWFyZ3VtZW50cy5sZW5ndGh8fChuPWVbdF0pO3ZhciB1PSFpJiZDZShuKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1zP3MuY2FsbChlKTpuO3JldHVybiBjZS50YXJnZXQmJihvLmRlcGVuZCgpLHUmJih1LmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KHQpJiZmdW5jdGlvbiBlKHQpe2Zvcih2YXIgbj12b2lkIDAscj0wLGk9dC5sZW5ndGg7cjxpO3IrKykobj10W3JdKSYmbi5fX29iX18mJm4uX19vYl9fLmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KG4pJiZlKG4pfSh0KSkpLHR9LHNldDpmdW5jdGlvbih0KXt2YXIgcj1zP3MuY2FsbChlKTpuO3Q9PT1yfHx0IT10JiZyIT1yfHxzJiYhY3x8KGM/Yy5jYWxsKGUsdCk6bj10LHU9IWkmJkNlKHQpLG8ubm90aWZ5KCkpfX0pfX1mdW5jdGlvbiBrZShlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSYmYyh0KSlyZXR1cm4gZS5sZW5ndGg9TWF0aC5tYXgoZS5sZW5ndGgsdCksZS5zcGxpY2UodCwxLG4pLG47aWYodCBpbiBlJiYhKHQgaW4gT2JqZWN0LnByb3RvdHlwZSkpcmV0dXJuIGVbdF09bixuO3ZhciByPWUuX19vYl9fO3JldHVybiBlLl9pc1Z1ZXx8ciYmci52bUNvdW50P246cj8oeGUoci52YWx1ZSx0LG4pLHIuZGVwLm5vdGlmeSgpLG4pOihlW3RdPW4sbil9ZnVuY3Rpb24gQWUoZSx0KXtpZihBcnJheS5pc0FycmF5KGUpJiZjKHQpKWUuc3BsaWNlKHQsMSk7ZWxzZXt2YXIgbj1lLl9fb2JfXztlLl9pc1Z1ZXx8biYmbi52bUNvdW50fHx5KGUsdCkmJihkZWxldGUgZVt0XSxuJiZuLmRlcC5ub3RpZnkoKSl9fXdlLnByb3RvdHlwZS53YWxrPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDtuKyspeGUoZSx0W25dKX0sd2UucHJvdG90eXBlLm9ic2VydmVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspQ2UoZVt0XSl9O3ZhciBPZT1GLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztmdW5jdGlvbiBTZShlLHQpe2lmKCF0KXJldHVybiBlO2Zvcih2YXIgbixyLGksbz1vZT9SZWZsZWN0Lm93bktleXModCk6T2JqZWN0LmtleXModCksYT0wO2E8by5sZW5ndGg7YSsrKSJfX29iX18iIT09KG49b1thXSkmJihyPWVbbl0saT10W25dLHkoZSxuKT9yIT09aSYmcyhyKSYmcyhpKSYmU2UocixpKTprZShlLG4saSkpO3JldHVybiBlfWZ1bmN0aW9uIFRlKGUsdCxuKXtyZXR1cm4gbj9mdW5jdGlvbigpe3ZhciByPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbChuLG4pOnQsaT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lLmNhbGwobixuKTplO3JldHVybiByP1NlKHIsaSk6aX06dD9lP2Z1bmN0aW9uKCl7cmV0dXJuIFNlKCJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbCh0aGlzLHRoaXMpOnQsImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5jYWxsKHRoaXMsdGhpcyk6ZSl9OnQ6ZX1mdW5jdGlvbiBOZShlLHQpe3ZhciBuPXQ/ZT9lLmNvbmNhdCh0KTpBcnJheS5pc0FycmF5KHQpP3Q6W3RdOmU7cmV0dXJuIG4/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyktMT09PXQuaW5kZXhPZihlW25dKSYmdC5wdXNoKGVbbl0pO3JldHVybiB0fShuKTpufWZ1bmN0aW9uIEVlKGUsdCxuLHIpe3ZhciBpPU9iamVjdC5jcmVhdGUoZXx8bnVsbCk7cmV0dXJuIHQ/QShpLHQpOml9T2UuZGF0YT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/VGUoZSx0LG4pOnQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6VGUoZSx0KX0sTS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09lW2VdPU5lfSksSS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09lW2UrInMiXT1FZX0pLE9lLndhdGNoPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1ZJiYoZT12b2lkIDApLHQ9PT1ZJiYodD12b2lkIDApLCF0KXJldHVybiBPYmplY3QuY3JlYXRlKGV8fG51bGwpO2lmKCFlKXJldHVybiB0O3ZhciBpPXt9O2Zvcih2YXIgbyBpbiBBKGksZSksdCl7dmFyIGE9aVtvXSxzPXRbb107YSYmIUFycmF5LmlzQXJyYXkoYSkmJihhPVthXSksaVtvXT1hP2EuY29uY2F0KHMpOkFycmF5LmlzQXJyYXkocyk/czpbc119cmV0dXJuIGl9LE9lLnByb3BzPU9lLm1ldGhvZHM9T2UuaW5qZWN0PU9lLmNvbXB1dGVkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIEEoaSxlKSx0JiZBKGksdCksaX0sT2UucHJvdmlkZT1UZTt2YXIgamU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD9lOnR9O2Z1bmN0aW9uIERlKGUsdCxuKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dC5vcHRpb25zKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUucHJvcHM7aWYobil7dmFyIHIsaSxvPXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHI9bi5sZW5ndGg7ci0tOykic3RyaW5nIj09dHlwZW9mKGk9bltyXSkmJihvW2IoaSldPXt0eXBlOm51bGx9KTtlbHNlIGlmKHMobikpZm9yKHZhciBhIGluIG4paT1uW2FdLG9bYihhKV09cyhpKT9pOnt0eXBlOml9O2UucHJvcHM9b319KHQpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbmplY3Q7aWYobil7dmFyIHI9ZS5pbmplY3Q9e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKylyW25baV1dPXtmcm9tOm5baV19O2Vsc2UgaWYocyhuKSlmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtyW29dPXMoYSk/QSh7ZnJvbTpvfSxhKTp7ZnJvbTphfX19fSh0KSxmdW5jdGlvbihlKXt2YXIgdD1lLmRpcmVjdGl2ZXM7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTsiZnVuY3Rpb24iPT10eXBlb2YgciYmKHRbbl09e2JpbmQ6cix1cGRhdGU6cn0pfX0odCksIXQuX2Jhc2UmJih0LmV4dGVuZHMmJihlPURlKGUsdC5leHRlbmRzLG4pKSx0Lm1peGlucykpZm9yKHZhciByPTAsaT10Lm1peGlucy5sZW5ndGg7cjxpO3IrKyllPURlKGUsdC5taXhpbnNbcl0sbik7dmFyIG8sYT17fTtmb3IobyBpbiBlKWMobyk7Zm9yKG8gaW4gdCl5KGUsbyl8fGMobyk7ZnVuY3Rpb24gYyhyKXt2YXIgaT1PZVtyXXx8amU7YVtyXT1pKGVbcl0sdFtyXSxuLHIpfXJldHVybiBhfWZ1bmN0aW9uIExlKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGk9ZVt0XTtpZih5KGksbikpcmV0dXJuIGlbbl07dmFyIG89YihuKTtpZih5KGksbykpcmV0dXJuIGlbb107dmFyIGE9JChvKTtyZXR1cm4geShpLGEpP2lbYV06aVtuXXx8aVtvXXx8aVthXX19ZnVuY3Rpb24gSWUoZSx0LG4scil7dmFyIGk9dFtlXSxvPSF5KG4sZSksYT1uW2VdLHM9UmUoQm9vbGVhbixpLnR5cGUpO2lmKHM+LTEpaWYobyYmIXkoaSwiZGVmYXVsdCIpKWE9ITE7ZWxzZSBpZigiIj09PWF8fGE9PT1DKGUpKXt2YXIgYz1SZShTdHJpbmcsaS50eXBlKTsoYzwwfHxzPGMpJiYoYT0hMCl9aWYodm9pZCAwPT09YSl7YT1mdW5jdGlvbihlLHQsbil7aWYoIXkodCwiZGVmYXVsdCIpKXJldHVybjt2YXIgcj10LmRlZmF1bHQ7aWYoZSYmZS4kb3B0aW9ucy5wcm9wc0RhdGEmJnZvaWQgMD09PWUuJG9wdGlvbnMucHJvcHNEYXRhW25dJiZ2b2lkIDAhPT1lLl9wcm9wc1tuXSlyZXR1cm4gZS5fcHJvcHNbbl07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHImJiJGdW5jdGlvbiIhPT1GZSh0LnR5cGUpP3IuY2FsbChlKTpyfShyLGksZSk7dmFyIHU9YmU7JGUoITApLENlKGEpLCRlKHUpfXJldHVybiBhfXZhciBNZT0vXlxzKmZ1bmN0aW9uIChcdyspLztmdW5jdGlvbiBGZShlKXt2YXIgdD1lJiZlLnRvU3RyaW5nKCkubWF0Y2goTWUpO3JldHVybiB0P3RbMV06IiJ9ZnVuY3Rpb24gUGUoZSx0KXtyZXR1cm4gRmUoZSk9PT1GZSh0KX1mdW5jdGlvbiBSZShlLHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBQZSh0LGUpPzA6LTE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKFBlKHRbbl0sZSkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gSGUoZSx0LG4pe2xlKCk7dHJ5e2lmKHQpZm9yKHZhciByPXQ7cj1yLiRwYXJlbnQ7KXt2YXIgaT1yLiRvcHRpb25zLmVycm9yQ2FwdHVyZWQ7aWYoaSlmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl0cnl7aWYoITE9PT1pW29dLmNhbGwocixlLHQsbikpcmV0dXJufWNhdGNoKGUpe1VlKGUsciwiZXJyb3JDYXB0dXJlZCBob29rIil9fVVlKGUsdCxuKX1maW5hbGx5e2ZlKCl9fWZ1bmN0aW9uIEJlKGUsdCxuLHIsaSl7dmFyIG87dHJ5eyhvPW4/ZS5hcHBseSh0LG4pOmUuY2FsbCh0KSkmJiFvLl9pc1Z1ZSYmdShvKSYmIW8uX2hhbmRsZWQmJihvLmNhdGNoKGZ1bmN0aW9uKGUpe3JldHVybiBIZShlLHIsaSsiIChQcm9taXNlL2FzeW5jKSIpfSksby5faGFuZGxlZD0hMCl9Y2F0Y2goZSl7SGUoZSxyLGkpfXJldHVybiBvfWZ1bmN0aW9uIFVlKGUsdCxuKXtpZihGLmVycm9ySGFuZGxlcil0cnl7cmV0dXJuIEYuZXJyb3JIYW5kbGVyLmNhbGwobnVsbCxlLHQsbil9Y2F0Y2godCl7dCE9PWUmJlZlKHQsbnVsbCwiY29uZmlnLmVycm9ySGFuZGxlciIpfVZlKGUsdCxuKX1mdW5jdGlvbiBWZShlLHQsbil7aWYoIVYmJiF6fHwidW5kZWZpbmVkIj09dHlwZW9mIGNvbnNvbGUpdGhyb3cgZTtjb25zb2xlLmVycm9yKGUpfXZhciB6ZSxLZT0hMSxKZT1bXSxxZT0hMTtmdW5jdGlvbiBXZSgpe3FlPSExO3ZhciBlPUplLnNsaWNlKDApO0plLmxlbmd0aD0wO2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0oKX1pZigidW5kZWZpbmVkIiE9dHlwZW9mIFByb21pc2UmJnJlKFByb21pc2UpKXt2YXIgWmU9UHJvbWlzZS5yZXNvbHZlKCk7emU9ZnVuY3Rpb24oKXtaZS50aGVuKFdlKSxHJiZzZXRUaW1lb3V0KFMpfSxLZT0hMH1lbHNlIGlmKHF8fCJ1bmRlZmluZWQiPT10eXBlb2YgTXV0YXRpb25PYnNlcnZlcnx8IXJlKE11dGF0aW9uT2JzZXJ2ZXIpJiYiW29iamVjdCBNdXRhdGlvbk9ic2VydmVyQ29uc3RydWN0b3JdIiE9PU11dGF0aW9uT2JzZXJ2ZXIudG9TdHJpbmcoKSl6ZT0idW5kZWZpbmVkIiE9dHlwZW9mIHNldEltbWVkaWF0ZSYmcmUoc2V0SW1tZWRpYXRlKT9mdW5jdGlvbigpe3NldEltbWVkaWF0ZShXZSl9OmZ1bmN0aW9uKCl7c2V0VGltZW91dChXZSwwKX07ZWxzZXt2YXIgR2U9MSxYZT1uZXcgTXV0YXRpb25PYnNlcnZlcihXZSksWWU9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKEdlKSk7WGUub2JzZXJ2ZShZZSx7Y2hhcmFjdGVyRGF0YTohMH0pLHplPWZ1bmN0aW9uKCl7R2U9KEdlKzEpJTIsWWUuZGF0YT1TdHJpbmcoR2UpfSxLZT0hMH1mdW5jdGlvbiBRZShlLHQpe3ZhciBuO2lmKEplLnB1c2goZnVuY3Rpb24oKXtpZihlKXRyeXtlLmNhbGwodCl9Y2F0Y2goZSl7SGUoZSx0LCJuZXh0VGljayIpfWVsc2UgbiYmbih0KX0pLHFlfHwocWU9ITAsemUoKSksIWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSlyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7bj1lfSl9dmFyIGV0PW5ldyBpZTtmdW5jdGlvbiB0dChlKXshZnVuY3Rpb24gZSh0LG4pe3ZhciByLGk7dmFyIGE9QXJyYXkuaXNBcnJheSh0KTtpZighYSYmIW8odCl8fE9iamVjdC5pc0Zyb3plbih0KXx8dCBpbnN0YW5jZW9mIHBlKXJldHVybjtpZih0Ll9fb2JfXyl7dmFyIHM9dC5fX29iX18uZGVwLmlkO2lmKG4uaGFzKHMpKXJldHVybjtuLmFkZChzKX1pZihhKWZvcihyPXQubGVuZ3RoO3ItLTspZSh0W3JdLG4pO2Vsc2UgZm9yKGk9T2JqZWN0LmtleXModCkscj1pLmxlbmd0aDtyLS07KWUodFtpW3JdXSxuKX0oZSxldCksZXQuY2xlYXIoKX12YXIgbnQ9ZyhmdW5jdGlvbihlKXt2YXIgdD0iJiI9PT1lLmNoYXJBdCgwKSxuPSJ+Ij09PShlPXQ/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCkscj0iISI9PT0oZT1uP2Uuc2xpY2UoMSk6ZSkuY2hhckF0KDApO3JldHVybntuYW1lOmU9cj9lLnNsaWNlKDEpOmUsb25jZTpuLGNhcHR1cmU6cixwYXNzaXZlOnR9fSk7ZnVuY3Rpb24gcnQoZSx0KXtmdW5jdGlvbiBuKCl7dmFyIGU9YXJndW1lbnRzLHI9bi5mbnM7aWYoIUFycmF5LmlzQXJyYXkocikpcmV0dXJuIEJlKHIsbnVsbCxhcmd1bWVudHMsdCwidi1vbiBoYW5kbGVyIik7Zm9yKHZhciBpPXIuc2xpY2UoKSxvPTA7bzxpLmxlbmd0aDtvKyspQmUoaVtvXSxudWxsLGUsdCwidi1vbiBoYW5kbGVyIil9cmV0dXJuIG4uZm5zPWUsbn1mdW5jdGlvbiBpdChlLG4saSxvLGEscyl7dmFyIGMsdSxsLGY7Zm9yKGMgaW4gZSl1PWVbY10sbD1uW2NdLGY9bnQoYyksdCh1KXx8KHQobCk/KHQodS5mbnMpJiYodT1lW2NdPXJ0KHUscykpLHIoZi5vbmNlKSYmKHU9ZVtjXT1hKGYubmFtZSx1LGYuY2FwdHVyZSkpLGkoZi5uYW1lLHUsZi5jYXB0dXJlLGYucGFzc2l2ZSxmLnBhcmFtcykpOnUhPT1sJiYobC5mbnM9dSxlW2NdPWwpKTtmb3IoYyBpbiBuKXQoZVtjXSkmJm8oKGY9bnQoYykpLm5hbWUsbltjXSxmLmNhcHR1cmUpfWZ1bmN0aW9uIG90KGUsaSxvKXt2YXIgYTtlIGluc3RhbmNlb2YgcGUmJihlPWUuZGF0YS5ob29rfHwoZS5kYXRhLmhvb2s9e30pKTt2YXIgcz1lW2ldO2Z1bmN0aW9uIGMoKXtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxoKGEuZm5zLGMpfXQocyk/YT1ydChbY10pOm4ocy5mbnMpJiZyKHMubWVyZ2VkKT8oYT1zKS5mbnMucHVzaChjKTphPXJ0KFtzLGNdKSxhLm1lcmdlZD0hMCxlW2ldPWF9ZnVuY3Rpb24gYXQoZSx0LHIsaSxvKXtpZihuKHQpKXtpZih5KHQscikpcmV0dXJuIGVbcl09dFtyXSxvfHxkZWxldGUgdFtyXSwhMDtpZih5KHQsaSkpcmV0dXJuIGVbcl09dFtpXSxvfHxkZWxldGUgdFtpXSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBzdChlKXtyZXR1cm4gaShlKT9baGUoZSldOkFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24gZShvLGEpe3ZhciBzPVtdO3ZhciBjLHUsbCxmO2ZvcihjPTA7YzxvLmxlbmd0aDtjKyspdCh1PW9bY10pfHwiYm9vbGVhbiI9PXR5cGVvZiB1fHwobD1zLmxlbmd0aC0xLGY9c1tsXSxBcnJheS5pc0FycmF5KHUpP3UubGVuZ3RoPjAmJihjdCgodT1lKHUsKGF8fCIiKSsiXyIrYykpWzBdKSYmY3QoZikmJihzW2xdPWhlKGYudGV4dCt1WzBdLnRleHQpLHUuc2hpZnQoKSkscy5wdXNoLmFwcGx5KHMsdSkpOmkodSk/Y3QoZik/c1tsXT1oZShmLnRleHQrdSk6IiIhPT11JiZzLnB1c2goaGUodSkpOmN0KHUpJiZjdChmKT9zW2xdPWhlKGYudGV4dCt1LnRleHQpOihyKG8uX2lzVkxpc3QpJiZuKHUudGFnKSYmdCh1LmtleSkmJm4oYSkmJih1LmtleT0iX192bGlzdCIrYSsiXyIrYysiX18iKSxzLnB1c2godSkpKTtyZXR1cm4gc30oZSk6dm9pZCAwfWZ1bmN0aW9uIGN0KGUpe3JldHVybiBuKGUpJiZuKGUudGV4dCkmJiExPT09ZS5pc0NvbW1lbnR9ZnVuY3Rpb24gdXQoZSx0KXtpZihlKXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPW9lP1JlZmxlY3Qub3duS2V5cyhlKTpPYmplY3Qua2V5cyhlKSxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPXJbaV07aWYoIl9fb2JfXyIhPT1vKXtmb3IodmFyIGE9ZVtvXS5mcm9tLHM9dDtzOyl7aWYocy5fcHJvdmlkZWQmJnkocy5fcHJvdmlkZWQsYSkpe25bb109cy5fcHJvdmlkZWRbYV07YnJlYWt9cz1zLiRwYXJlbnR9aWYoIXMmJiJkZWZhdWx0ImluIGVbb10pe3ZhciBjPWVbb10uZGVmYXVsdDtuW29dPSJmdW5jdGlvbiI9PXR5cGVvZiBjP2MuY2FsbCh0KTpjfX19cmV0dXJuIG59fWZ1bmN0aW9uIGx0KGUsdCl7aWYoIWV8fCFlLmxlbmd0aClyZXR1cm57fTtmb3IodmFyIG49e30scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyl7dmFyIG89ZVtyXSxhPW8uZGF0YTtpZihhJiZhLmF0dHJzJiZhLmF0dHJzLnNsb3QmJmRlbGV0ZSBhLmF0dHJzLnNsb3Qsby5jb250ZXh0IT09dCYmby5mbkNvbnRleHQhPT10fHwhYXx8bnVsbD09YS5zbG90KShuLmRlZmF1bHR8fChuLmRlZmF1bHQ9W10pKS5wdXNoKG8pO2Vsc2V7dmFyIHM9YS5zbG90LGM9bltzXXx8KG5bc109W10pOyJ0ZW1wbGF0ZSI9PT1vLnRhZz9jLnB1c2guYXBwbHkoYyxvLmNoaWxkcmVufHxbXSk6Yy5wdXNoKG8pfX1mb3IodmFyIHUgaW4gbiluW3VdLmV2ZXJ5KGZ0KSYmZGVsZXRlIG5bdV07cmV0dXJuIG59ZnVuY3Rpb24gZnQoZSl7cmV0dXJuIGUuaXNDb21tZW50JiYhZS5hc3luY0ZhY3Rvcnl8fCIgIj09PWUudGV4dH1mdW5jdGlvbiBwdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJmUuYXN5bmNGYWN0b3J5fWZ1bmN0aW9uIGR0KHQsbixyKXt2YXIgaSxvPU9iamVjdC5rZXlzKG4pLmxlbmd0aD4wLGE9dD8hIXQuJHN0YWJsZTohbyxzPXQmJnQuJGtleTtpZih0KXtpZih0Ll9ub3JtYWxpemVkKXJldHVybiB0Ll9ub3JtYWxpemVkO2lmKGEmJnImJnIhPT1lJiZzPT09ci4ka2V5JiYhbyYmIXIuJGhhc05vcm1hbClyZXR1cm4gcjtmb3IodmFyIGMgaW4gaT17fSx0KXRbY10mJiIkIiE9PWNbMF0mJihpW2NdPXZ0KG4sYyx0W2NdKSl9ZWxzZSBpPXt9O2Zvcih2YXIgdSBpbiBuKXUgaW4gaXx8KGlbdV09aHQobix1KSk7cmV0dXJuIHQmJk9iamVjdC5pc0V4dGVuc2libGUodCkmJih0Ll9ub3JtYWxpemVkPWkpLFIoaSwiJHN0YWJsZSIsYSksUihpLCIka2V5IixzKSxSKGksIiRoYXNOb3JtYWwiLG8pLGl9ZnVuY3Rpb24gdnQoZSx0LG4pe3ZhciByPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD9uLmFwcGx5KG51bGwsYXJndW1lbnRzKTpuKHt9KSx0PShlPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIUFycmF5LmlzQXJyYXkoZSk/W2VdOnN0KGUpKSYmZVswXTtyZXR1cm4gZSYmKCF0fHwxPT09ZS5sZW5ndGgmJnQuaXNDb21tZW50JiYhcHQodCkpP3ZvaWQgMDplfTtyZXR1cm4gbi5wcm94eSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7Z2V0OnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxyfWZ1bmN0aW9uIGh0KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fWZ1bmN0aW9uIG10KGUsdCl7dmFyIHIsaSxhLHMsYztpZihBcnJheS5pc0FycmF5KGUpfHwic3RyaW5nIj09dHlwZW9mIGUpZm9yKHI9bmV3IEFycmF5KGUubGVuZ3RoKSxpPTAsYT1lLmxlbmd0aDtpPGE7aSsrKXJbaV09dChlW2ldLGkpO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlKWZvcihyPW5ldyBBcnJheShlKSxpPTA7aTxlO2krKylyW2ldPXQoaSsxLGkpO2Vsc2UgaWYobyhlKSlpZihvZSYmZVtTeW1ib2wuaXRlcmF0b3JdKXtyPVtdO2Zvcih2YXIgdT1lW1N5bWJvbC5pdGVyYXRvcl0oKSxsPXUubmV4dCgpOyFsLmRvbmU7KXIucHVzaCh0KGwudmFsdWUsci5sZW5ndGgpKSxsPXUubmV4dCgpfWVsc2UgZm9yKHM9T2JqZWN0LmtleXMoZSkscj1uZXcgQXJyYXkocy5sZW5ndGgpLGk9MCxhPXMubGVuZ3RoO2k8YTtpKyspYz1zW2ldLHJbaV09dChlW2NdLGMsaSk7cmV0dXJuIG4ocil8fChyPVtdKSxyLl9pc1ZMaXN0PSEwLHJ9ZnVuY3Rpb24geXQoZSx0LG4scil7dmFyIGksbz10aGlzLiRzY29wZWRTbG90c1tlXTtvPyhuPW58fHt9LHImJihuPUEoQSh7fSxyKSxuKSksaT1vKG4pfHwoImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOnQpKTppPXRoaXMuJHNsb3RzW2VdfHwoImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOnQpO3ZhciBhPW4mJm4uc2xvdDtyZXR1cm4gYT90aGlzLiRjcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIse3Nsb3Q6YX0saSk6aX1mdW5jdGlvbiBndChlKXtyZXR1cm4gTGUodGhpcy4kb3B0aW9ucywiZmlsdGVycyIsZSl8fE59ZnVuY3Rpb24gX3QoZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMT09PWUuaW5kZXhPZih0KTplIT09dH1mdW5jdGlvbiBidChlLHQsbixyLGkpe3ZhciBvPUYua2V5Q29kZXNbdF18fG47cmV0dXJuIGkmJnImJiFGLmtleUNvZGVzW3RdP190KGkscik6bz9fdChvLGUpOnI/QyhyKSE9PXQ6dm9pZCAwPT09ZX1mdW5jdGlvbiAkdChlLHQsbixyLGkpe2lmKG4paWYobyhuKSl7dmFyIGE7QXJyYXkuaXNBcnJheShuKSYmKG49TyhuKSk7dmFyIHM9ZnVuY3Rpb24obyl7aWYoImNsYXNzIj09PW98fCJzdHlsZSI9PT1vfHx2KG8pKWE9ZTtlbHNle3ZhciBzPWUuYXR0cnMmJmUuYXR0cnMudHlwZTthPXJ8fEYubXVzdFVzZVByb3AodCxzLG8pP2UuZG9tUHJvcHN8fChlLmRvbVByb3BzPXt9KTplLmF0dHJzfHwoZS5hdHRycz17fSl9dmFyIGM9YihvKSx1PUMobyk7YyBpbiBhfHx1IGluIGF8fChhW29dPW5bb10saSYmKChlLm9ufHwoZS5vbj17fSkpWyJ1cGRhdGU6IitvXT1mdW5jdGlvbihlKXtuW29dPWV9KSl9O2Zvcih2YXIgYyBpbiBuKXMoYyl9ZWxzZTtyZXR1cm4gZX1mdW5jdGlvbiB3dChlLHQpe3ZhciBuPXRoaXMuX3N0YXRpY1RyZWVzfHwodGhpcy5fc3RhdGljVHJlZXM9W10pLHI9bltlXTtyZXR1cm4gciYmIXQ/cjooeHQocj1uW2VdPXRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2VdLmNhbGwodGhpcy5fcmVuZGVyUHJveHksbnVsbCx0aGlzKSwiX19zdGF0aWNfXyIrZSwhMSkscil9ZnVuY3Rpb24gQ3QoZSx0LG4pe3JldHVybiB4dChlLCJfX29uY2VfXyIrdCsobj8iXyIrbjoiIiksITApLGV9ZnVuY3Rpb24geHQoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspZVtyXSYmInN0cmluZyIhPXR5cGVvZiBlW3JdJiZrdChlW3JdLHQrIl8iK3Isbik7ZWxzZSBrdChlLHQsbil9ZnVuY3Rpb24ga3QoZSx0LG4pe2UuaXNTdGF0aWM9ITAsZS5rZXk9dCxlLmlzT25jZT1ufWZ1bmN0aW9uIEF0KGUsdCl7aWYodClpZihzKHQpKXt2YXIgbj1lLm9uPWUub24/QSh7fSxlLm9uKTp7fTtmb3IodmFyIHIgaW4gdCl7dmFyIGk9bltyXSxvPXRbcl07bltyXT1pP1tdLmNvbmNhdChpLG8pOm99fWVsc2U7cmV0dXJuIGV9ZnVuY3Rpb24gT3QoZSx0LG4scil7dD10fHx7JHN0YWJsZTohbn07Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07QXJyYXkuaXNBcnJheShvKT9PdChvLHQsbik6byYmKG8ucHJveHkmJihvLmZuLnByb3h5PSEwKSx0W28ua2V5XT1vLmZuKX1yZXR1cm4gciYmKHQuJGtleT1yKSx0fWZ1bmN0aW9uIFN0KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKz0yKXt2YXIgcj10W25dOyJzdHJpbmciPT10eXBlb2YgciYmciYmKGVbdFtuXV09dFtuKzFdKX1yZXR1cm4gZX1mdW5jdGlvbiBUdChlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT90K2U6ZX1mdW5jdGlvbiBOdChlKXtlLl9vPUN0LGUuX249ZixlLl9zPWwsZS5fbD1tdCxlLl90PXl0LGUuX3E9RSxlLl9pPWosZS5fbT13dCxlLl9mPWd0LGUuX2s9YnQsZS5fYj0kdCxlLl92PWhlLGUuX2U9dmUsZS5fdT1PdCxlLl9nPUF0LGUuX2Q9U3QsZS5fcD1UdH1mdW5jdGlvbiBFdCh0LG4saSxvLGEpe3ZhciBzLGM9dGhpcyx1PWEub3B0aW9uczt5KG8sIl91aWQiKT8ocz1PYmplY3QuY3JlYXRlKG8pKS5fb3JpZ2luYWw9bzoocz1vLG89by5fb3JpZ2luYWwpO3ZhciBsPXIodS5fY29tcGlsZWQpLGY9IWw7dGhpcy5kYXRhPXQsdGhpcy5wcm9wcz1uLHRoaXMuY2hpbGRyZW49aSx0aGlzLnBhcmVudD1vLHRoaXMubGlzdGVuZXJzPXQub258fGUsdGhpcy5pbmplY3Rpb25zPXV0KHUuaW5qZWN0LG8pLHRoaXMuc2xvdHM9ZnVuY3Rpb24oKXtyZXR1cm4gYy4kc2xvdHN8fGR0KHQuc2NvcGVkU2xvdHMsYy4kc2xvdHM9bHQoaSxvKSksYy4kc2xvdHN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzY29wZWRTbG90cyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGR0KHQuc2NvcGVkU2xvdHMsdGhpcy5zbG90cygpKX19KSxsJiYodGhpcy4kb3B0aW9ucz11LHRoaXMuJHNsb3RzPXRoaXMuc2xvdHMoKSx0aGlzLiRzY29wZWRTbG90cz1kdCh0LnNjb3BlZFNsb3RzLHRoaXMuJHNsb3RzKSksdS5fc2NvcGVJZD90aGlzLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPUh0KHMsZSx0LG4scixmKTtyZXR1cm4gaSYmIUFycmF5LmlzQXJyYXkoaSkmJihpLmZuU2NvcGVJZD11Ll9zY29wZUlkLGkuZm5Db250ZXh0PW8pLGl9OnRoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIEh0KHMsZSx0LG4scixmKX19ZnVuY3Rpb24ganQoZSx0LG4scixpKXt2YXIgbz1tZShlKTtyZXR1cm4gby5mbkNvbnRleHQ9bixvLmZuT3B0aW9ucz1yLHQuc2xvdCYmKChvLmRhdGF8fChvLmRhdGE9e30pKS5zbG90PXQuc2xvdCksb31mdW5jdGlvbiBEdChlLHQpe2Zvcih2YXIgbiBpbiB0KWVbYihuKV09dFtuXX1OdChFdC5wcm90b3R5cGUpO3ZhciBMdD17aW5pdDpmdW5jdGlvbihlLHQpe2lmKGUuY29tcG9uZW50SW5zdGFuY2UmJiFlLmNvbXBvbmVudEluc3RhbmNlLl9pc0Rlc3Ryb3llZCYmZS5kYXRhLmtlZXBBbGl2ZSl7dmFyIHI9ZTtMdC5wcmVwYXRjaChyLHIpfWVsc2V7KGUuY29tcG9uZW50SW5zdGFuY2U9ZnVuY3Rpb24oZSx0KXt2YXIgcj17X2lzQ29tcG9uZW50OiEwLF9wYXJlbnRWbm9kZTplLHBhcmVudDp0fSxpPWUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtuKGkpJiYoci5yZW5kZXI9aS5yZW5kZXIsci5zdGF0aWNSZW5kZXJGbnM9aS5zdGF0aWNSZW5kZXJGbnMpO3JldHVybiBuZXcgZS5jb21wb25lbnRPcHRpb25zLkN0b3Iocil9KGUsWnQpKS4kbW91bnQodD9lLmVsbTp2b2lkIDAsdCl9fSxwcmVwYXRjaDpmdW5jdGlvbih0LG4pe3ZhciByPW4uY29tcG9uZW50T3B0aW9uczshZnVuY3Rpb24odCxuLHIsaSxvKXt2YXIgYT1pLmRhdGEuc2NvcGVkU2xvdHMscz10LiRzY29wZWRTbG90cyxjPSEhKGEmJiFhLiRzdGFibGV8fHMhPT1lJiYhcy4kc3RhYmxlfHxhJiZ0LiRzY29wZWRTbG90cy4ka2V5IT09YS4ka2V5fHwhYSYmdC4kc2NvcGVkU2xvdHMuJGtleSksdT0hIShvfHx0LiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbnx8Yyk7dC4kb3B0aW9ucy5fcGFyZW50Vm5vZGU9aSx0LiR2bm9kZT1pLHQuX3Zub2RlJiYodC5fdm5vZGUucGFyZW50PWkpO2lmKHQuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuPW8sdC4kYXR0cnM9aS5kYXRhLmF0dHJzfHxlLHQuJGxpc3RlbmVycz1yfHxlLG4mJnQuJG9wdGlvbnMucHJvcHMpeyRlKCExKTtmb3IodmFyIGw9dC5fcHJvcHMsZj10LiRvcHRpb25zLl9wcm9wS2V5c3x8W10scD0wO3A8Zi5sZW5ndGg7cCsrKXt2YXIgZD1mW3BdLHY9dC4kb3B0aW9ucy5wcm9wcztsW2RdPUllKGQsdixuLHQpfSRlKCEwKSx0LiRvcHRpb25zLnByb3BzRGF0YT1ufXI9cnx8ZTt2YXIgaD10LiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7dC4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzPXIsV3QodCxyLGgpLHUmJih0LiRzbG90cz1sdChvLGkuY29udGV4dCksdC4kZm9yY2VVcGRhdGUoKSl9KG4uY29tcG9uZW50SW5zdGFuY2U9dC5jb21wb25lbnRJbnN0YW5jZSxyLnByb3BzRGF0YSxyLmxpc3RlbmVycyxuLHIuY2hpbGRyZW4pfSxpbnNlcnQ6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmNvbnRleHQscj1lLmNvbXBvbmVudEluc3RhbmNlO3IuX2lzTW91bnRlZHx8KHIuX2lzTW91bnRlZD0hMCxRdChyLCJtb3VudGVkIikpLGUuZGF0YS5rZWVwQWxpdmUmJihuLl9pc01vdW50ZWQ/KCh0PXIpLl9pbmFjdGl2ZT0hMSx0bi5wdXNoKHQpKTpZdChyLCEwKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb21wb25lbnRJbnN0YW5jZTt0Ll9pc0Rlc3Ryb3llZHx8KGUuZGF0YS5rZWVwQWxpdmU/ZnVuY3Rpb24gZSh0LG4pe2lmKG4mJih0Ll9kaXJlY3RJbmFjdGl2ZT0hMCxYdCh0KSkpcmV0dXJuO2lmKCF0Ll9pbmFjdGl2ZSl7dC5faW5hY3RpdmU9ITA7Zm9yKHZhciByPTA7cjx0LiRjaGlsZHJlbi5sZW5ndGg7cisrKWUodC4kY2hpbGRyZW5bcl0pO1F0KHQsImRlYWN0aXZhdGVkIil9fSh0LCEwKTp0LiRkZXN0cm95KCkpfX0sSXQ9T2JqZWN0LmtleXMoTHQpO2Z1bmN0aW9uIE10KGksYSxzLGMsbCl7aWYoIXQoaSkpe3ZhciBmPXMuJG9wdGlvbnMuX2Jhc2U7aWYobyhpKSYmKGk9Zi5leHRlbmQoaSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBpKXt2YXIgcDtpZih0KGkuY2lkKSYmdm9pZCAwPT09KGk9ZnVuY3Rpb24oZSxpKXtpZihyKGUuZXJyb3IpJiZuKGUuZXJyb3JDb21wKSlyZXR1cm4gZS5lcnJvckNvbXA7aWYobihlLnJlc29sdmVkKSlyZXR1cm4gZS5yZXNvbHZlZDt2YXIgYT1VdDthJiZuKGUub3duZXJzKSYmLTE9PT1lLm93bmVycy5pbmRleE9mKGEpJiZlLm93bmVycy5wdXNoKGEpO2lmKHIoZS5sb2FkaW5nKSYmbihlLmxvYWRpbmdDb21wKSlyZXR1cm4gZS5sb2FkaW5nQ29tcDtpZihhJiYhbihlLm93bmVycykpe3ZhciBzPWUub3duZXJzPVthXSxjPSEwLGw9bnVsbCxmPW51bGw7YS4kb24oImhvb2s6ZGVzdHJveWVkIixmdW5jdGlvbigpe3JldHVybiBoKHMsYSl9KTt2YXIgcD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXMubGVuZ3RoO3Q8bjt0Kyspc1t0XS4kZm9yY2VVcGRhdGUoKTtlJiYocy5sZW5ndGg9MCxudWxsIT09bCYmKGNsZWFyVGltZW91dChsKSxsPW51bGwpLG51bGwhPT1mJiYoY2xlYXJUaW1lb3V0KGYpLGY9bnVsbCkpfSxkPUQoZnVuY3Rpb24odCl7ZS5yZXNvbHZlZD1WdCh0LGkpLGM/cy5sZW5ndGg9MDpwKCEwKX0pLHY9RChmdW5jdGlvbih0KXtuKGUuZXJyb3JDb21wKSYmKGUuZXJyb3I9ITAscCghMCkpfSksbT1lKGQsdik7cmV0dXJuIG8obSkmJih1KG0pP3QoZS5yZXNvbHZlZCkmJm0udGhlbihkLHYpOnUobS5jb21wb25lbnQpJiYobS5jb21wb25lbnQudGhlbihkLHYpLG4obS5lcnJvcikmJihlLmVycm9yQ29tcD1WdChtLmVycm9yLGkpKSxuKG0ubG9hZGluZykmJihlLmxvYWRpbmdDb21wPVZ0KG0ubG9hZGluZyxpKSwwPT09bS5kZWxheT9lLmxvYWRpbmc9ITA6bD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bD1udWxsLHQoZS5yZXNvbHZlZCkmJnQoZS5lcnJvcikmJihlLmxvYWRpbmc9ITAscCghMSkpfSxtLmRlbGF5fHwyMDApKSxuKG0udGltZW91dCkmJihmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmPW51bGwsdChlLnJlc29sdmVkKSYmdihudWxsKX0sbS50aW1lb3V0KSkpKSxjPSExLGUubG9hZGluZz9lLmxvYWRpbmdDb21wOmUucmVzb2x2ZWR9fShwPWksZikpKXJldHVybiBmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPXZlKCk7cmV0dXJuIG8uYXN5bmNGYWN0b3J5PWUsby5hc3luY01ldGE9e2RhdGE6dCxjb250ZXh0Om4sY2hpbGRyZW46cix0YWc6aX0sb30ocCxhLHMsYyxsKTthPWF8fHt9LHduKGkpLG4oYS5tb2RlbCkmJmZ1bmN0aW9uKGUsdCl7dmFyIHI9ZS5tb2RlbCYmZS5tb2RlbC5wcm9wfHwidmFsdWUiLGk9ZS5tb2RlbCYmZS5tb2RlbC5ldmVudHx8ImlucHV0IjsodC5hdHRyc3x8KHQuYXR0cnM9e30pKVtyXT10Lm1vZGVsLnZhbHVlO3ZhciBvPXQub258fCh0Lm9uPXt9KSxhPW9baV0scz10Lm1vZGVsLmNhbGxiYWNrO24oYSk/KEFycmF5LmlzQXJyYXkoYSk/LTE9PT1hLmluZGV4T2Yocyk6YSE9PXMpJiYob1tpXT1bc10uY29uY2F0KGEpKTpvW2ldPXN9KGkub3B0aW9ucyxhKTt2YXIgZD1mdW5jdGlvbihlLHIsaSl7dmFyIG89ci5vcHRpb25zLnByb3BzO2lmKCF0KG8pKXt2YXIgYT17fSxzPWUuYXR0cnMsYz1lLnByb3BzO2lmKG4ocyl8fG4oYykpZm9yKHZhciB1IGluIG8pe3ZhciBsPUModSk7YXQoYSxjLHUsbCwhMCl8fGF0KGEscyx1LGwsITEpfXJldHVybiBhfX0oYSxpKTtpZihyKGkub3B0aW9ucy5mdW5jdGlvbmFsKSlyZXR1cm4gZnVuY3Rpb24odCxyLGksbyxhKXt2YXIgcz10Lm9wdGlvbnMsYz17fSx1PXMucHJvcHM7aWYobih1KSlmb3IodmFyIGwgaW4gdSljW2xdPUllKGwsdSxyfHxlKTtlbHNlIG4oaS5hdHRycykmJkR0KGMsaS5hdHRycyksbihpLnByb3BzKSYmRHQoYyxpLnByb3BzKTt2YXIgZj1uZXcgRXQoaSxjLGEsbyx0KSxwPXMucmVuZGVyLmNhbGwobnVsbCxmLl9jLGYpO2lmKHAgaW5zdGFuY2VvZiBwZSlyZXR1cm4ganQocCxpLGYucGFyZW50LHMpO2lmKEFycmF5LmlzQXJyYXkocCkpe2Zvcih2YXIgZD1zdChwKXx8W10sdj1uZXcgQXJyYXkoZC5sZW5ndGgpLGg9MDtoPGQubGVuZ3RoO2grKyl2W2hdPWp0KGRbaF0saSxmLnBhcmVudCxzKTtyZXR1cm4gdn19KGksZCxhLHMsYyk7dmFyIHY9YS5vbjtpZihhLm9uPWEubmF0aXZlT24scihpLm9wdGlvbnMuYWJzdHJhY3QpKXt2YXIgbT1hLnNsb3Q7YT17fSxtJiYoYS5zbG90PW0pfSFmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5ob29rfHwoZS5ob29rPXt9KSxuPTA7bjxJdC5sZW5ndGg7bisrKXt2YXIgcj1JdFtuXSxpPXRbcl0sbz1MdFtyXTtpPT09b3x8aSYmaS5fbWVyZ2VkfHwodFtyXT1pP0Z0KG8saSk6byl9fShhKTt2YXIgeT1pLm9wdGlvbnMubmFtZXx8bDtyZXR1cm4gbmV3IHBlKCJ2dWUtY29tcG9uZW50LSIraS5jaWQrKHk/Ii0iK3k6IiIpLGEsdm9pZCAwLHZvaWQgMCx2b2lkIDAscyx7Q3RvcjppLHByb3BzRGF0YTpkLGxpc3RlbmVyczp2LHRhZzpsLGNoaWxkcmVuOmN9LHApfX19ZnVuY3Rpb24gRnQoZSx0KXt2YXIgbj1mdW5jdGlvbihuLHIpe2UobixyKSx0KG4scil9O3JldHVybiBuLl9tZXJnZWQ9ITAsbn12YXIgUHQ9MSxSdD0yO2Z1bmN0aW9uIEh0KGUsYSxzLGMsdSxsKXtyZXR1cm4oQXJyYXkuaXNBcnJheShzKXx8aShzKSkmJih1PWMsYz1zLHM9dm9pZCAwKSxyKGwpJiYodT1SdCksZnVuY3Rpb24oZSxpLGEscyxjKXtpZihuKGEpJiZuKGEuX19vYl9fKSlyZXR1cm4gdmUoKTtuKGEpJiZuKGEuaXMpJiYoaT1hLmlzKTtpZighaSlyZXR1cm4gdmUoKTtBcnJheS5pc0FycmF5KHMpJiYiZnVuY3Rpb24iPT10eXBlb2Ygc1swXSYmKChhPWF8fHt9KS5zY29wZWRTbG90cz17ZGVmYXVsdDpzWzBdfSxzLmxlbmd0aD0wKTtjPT09UnQ/cz1zdChzKTpjPT09UHQmJihzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKEFycmF5LmlzQXJyYXkoZVt0XSkpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sZSk7cmV0dXJuIGV9KHMpKTt2YXIgdSxsO2lmKCJzdHJpbmciPT10eXBlb2YgaSl7dmFyIGY7bD1lLiR2bm9kZSYmZS4kdm5vZGUubnN8fEYuZ2V0VGFnTmFtZXNwYWNlKGkpLHU9Ri5pc1Jlc2VydmVkVGFnKGkpP25ldyBwZShGLnBhcnNlUGxhdGZvcm1UYWdOYW1lKGkpLGEscyx2b2lkIDAsdm9pZCAwLGUpOmEmJmEucHJlfHwhbihmPUxlKGUuJG9wdGlvbnMsImNvbXBvbmVudHMiLGkpKT9uZXcgcGUoaSxhLHMsdm9pZCAwLHZvaWQgMCxlKTpNdChmLGEsZSxzLGkpfWVsc2UgdT1NdChpLGEsZSxzKTtyZXR1cm4gQXJyYXkuaXNBcnJheSh1KT91Om4odSk/KG4obCkmJmZ1bmN0aW9uIGUoaSxvLGEpe2kubnM9bzsiZm9yZWlnbk9iamVjdCI9PT1pLnRhZyYmKG89dm9pZCAwLGE9ITApO2lmKG4oaS5jaGlsZHJlbikpZm9yKHZhciBzPTAsYz1pLmNoaWxkcmVuLmxlbmd0aDtzPGM7cysrKXt2YXIgdT1pLmNoaWxkcmVuW3NdO24odS50YWcpJiYodCh1Lm5zKXx8cihhKSYmInN2ZyIhPT11LnRhZykmJmUodSxvLGEpfX0odSxsKSxuKGEpJiZmdW5jdGlvbihlKXtvKGUuc3R5bGUpJiZ0dChlLnN0eWxlKTtvKGUuY2xhc3MpJiZ0dChlLmNsYXNzKX0oYSksdSk6dmUoKX0oZSxhLHMsYyx1KX12YXIgQnQsVXQ9bnVsbDtmdW5jdGlvbiBWdChlLHQpe3JldHVybihlLl9fZXNNb2R1bGV8fG9lJiYiTW9kdWxlIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSkmJihlPWUuZGVmYXVsdCksbyhlKT90LmV4dGVuZChlKTplfWZ1bmN0aW9uIHp0KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF07aWYobihyKSYmKG4oci5jb21wb25lbnRPcHRpb25zKXx8cHQocikpKXJldHVybiByfX1mdW5jdGlvbiBLdChlLHQpe0J0LiRvbihlLHQpfWZ1bmN0aW9uIEp0KGUsdCl7QnQuJG9mZihlLHQpfWZ1bmN0aW9uIHF0KGUsdCl7dmFyIG49QnQ7cmV0dXJuIGZ1bmN0aW9uIHIoKXtudWxsIT09dC5hcHBseShudWxsLGFyZ3VtZW50cykmJm4uJG9mZihlLHIpfX1mdW5jdGlvbiBXdChlLHQsbil7QnQ9ZSxpdCh0LG58fHt9LEt0LEp0LHF0LGUpLEJ0PXZvaWQgMH12YXIgWnQ9bnVsbDtmdW5jdGlvbiBHdChlKXt2YXIgdD1adDtyZXR1cm4gWnQ9ZSxmdW5jdGlvbigpe1p0PXR9fWZ1bmN0aW9uIFh0KGUpe2Zvcig7ZSYmKGU9ZS4kcGFyZW50KTspaWYoZS5faW5hY3RpdmUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gWXQoZSx0KXtpZih0KXtpZihlLl9kaXJlY3RJbmFjdGl2ZT0hMSxYdChlKSlyZXR1cm59ZWxzZSBpZihlLl9kaXJlY3RJbmFjdGl2ZSlyZXR1cm47aWYoZS5faW5hY3RpdmV8fG51bGw9PT1lLl9pbmFjdGl2ZSl7ZS5faW5hY3RpdmU9ITE7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKVl0KGUuJGNoaWxkcmVuW25dKTtRdChlLCJhY3RpdmF0ZWQiKX19ZnVuY3Rpb24gUXQoZSx0KXtsZSgpO3ZhciBuPWUuJG9wdGlvbnNbdF0scj10KyIgaG9vayI7aWYobilmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspQmUobltpXSxlLG51bGwsZSxyKTtlLl9oYXNIb29rRXZlbnQmJmUuJGVtaXQoImhvb2s6Iit0KSxmZSgpfXZhciBlbj1bXSx0bj1bXSxubj17fSxybj0hMSxvbj0hMSxhbj0wO3ZhciBzbj0wLGNuPURhdGUubm93O2lmKFYmJiFxKXt2YXIgdW49d2luZG93LnBlcmZvcm1hbmNlO3VuJiYiZnVuY3Rpb24iPT10eXBlb2YgdW4ubm93JiZjbigpPmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLnRpbWVTdGFtcCYmKGNuPWZ1bmN0aW9uKCl7cmV0dXJuIHVuLm5vdygpfSl9ZnVuY3Rpb24gbG4oKXt2YXIgZSx0O2Zvcihzbj1jbigpLG9uPSEwLGVuLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSksYW49MDthbjxlbi5sZW5ndGg7YW4rKykoZT1lblthbl0pLmJlZm9yZSYmZS5iZWZvcmUoKSx0PWUuaWQsbm5bdF09bnVsbCxlLnJ1bigpO3ZhciBuPXRuLnNsaWNlKCkscj1lbi5zbGljZSgpO2FuPWVuLmxlbmd0aD10bi5sZW5ndGg9MCxubj17fSxybj1vbj0hMSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLl9pbmFjdGl2ZT0hMCxZdChlW3RdLCEwKX0obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7Zm9yKDt0LS07KXt2YXIgbj1lW3RdLHI9bi52bTtyLl93YXRjaGVyPT09biYmci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJlF0KHIsInVwZGF0ZWQiKX19KHIpLG5lJiZGLmRldnRvb2xzJiZuZS5lbWl0KCJmbHVzaCIpfXZhciBmbj0wLHBuPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy52bT1lLGkmJihlLl93YXRjaGVyPXRoaXMpLGUuX3dhdGNoZXJzLnB1c2godGhpcykscj8odGhpcy5kZWVwPSEhci5kZWVwLHRoaXMudXNlcj0hIXIudXNlcix0aGlzLmxhenk9ISFyLmxhenksdGhpcy5zeW5jPSEhci5zeW5jLHRoaXMuYmVmb3JlPXIuYmVmb3JlKTp0aGlzLmRlZXA9dGhpcy51c2VyPXRoaXMubGF6eT10aGlzLnN5bmM9ITEsdGhpcy5jYj1uLHRoaXMuaWQ9Kytmbix0aGlzLmFjdGl2ZT0hMCx0aGlzLmRpcnR5PXRoaXMubGF6eSx0aGlzLmRlcHM9W10sdGhpcy5uZXdEZXBzPVtdLHRoaXMuZGVwSWRzPW5ldyBpZSx0aGlzLm5ld0RlcElkcz1uZXcgaWUsdGhpcy5leHByZXNzaW9uPSIiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P3RoaXMuZ2V0dGVyPXQ6KHRoaXMuZ2V0dGVyPWZ1bmN0aW9uKGUpe2lmKCFILnRlc3QoZSkpe3ZhciB0PWUuc3BsaXQoIi4iKTtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2lmKCFlKXJldHVybjtlPWVbdFtuXV19cmV0dXJuIGV9fX0odCksdGhpcy5nZXR0ZXJ8fCh0aGlzLmdldHRlcj1TKSksdGhpcy52YWx1ZT10aGlzLmxhenk/dm9pZCAwOnRoaXMuZ2V0KCl9O3BuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt2YXIgZTtsZSh0aGlzKTt2YXIgdD10aGlzLnZtO3RyeXtlPXRoaXMuZ2V0dGVyLmNhbGwodCx0KX1jYXRjaChlKXtpZighdGhpcy51c2VyKXRocm93IGU7SGUoZSx0LCdnZXR0ZXIgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZmluYWxseXt0aGlzLmRlZXAmJnR0KGUpLGZlKCksdGhpcy5jbGVhbnVwRGVwcygpfXJldHVybiBlfSxwbi5wcm90b3R5cGUuYWRkRGVwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7dGhpcy5uZXdEZXBJZHMuaGFzKHQpfHwodGhpcy5uZXdEZXBJZHMuYWRkKHQpLHRoaXMubmV3RGVwcy5wdXNoKGUpLHRoaXMuZGVwSWRzLmhhcyh0KXx8ZS5hZGRTdWIodGhpcykpfSxwbi5wcm90b3R5cGUuY2xlYW51cERlcHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXt2YXIgdD10aGlzLmRlcHNbZV07dGhpcy5uZXdEZXBJZHMuaGFzKHQuaWQpfHx0LnJlbW92ZVN1Yih0aGlzKX12YXIgbj10aGlzLmRlcElkczt0aGlzLmRlcElkcz10aGlzLm5ld0RlcElkcyx0aGlzLm5ld0RlcElkcz1uLHRoaXMubmV3RGVwSWRzLmNsZWFyKCksbj10aGlzLmRlcHMsdGhpcy5kZXBzPXRoaXMubmV3RGVwcyx0aGlzLm5ld0RlcHM9bix0aGlzLm5ld0RlcHMubGVuZ3RoPTB9LHBuLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxhenk/dGhpcy5kaXJ0eT0hMDp0aGlzLnN5bmM/dGhpcy5ydW4oKTpmdW5jdGlvbihlKXt2YXIgdD1lLmlkO2lmKG51bGw9PW5uW3RdKXtpZihublt0XT0hMCxvbil7Zm9yKHZhciBuPWVuLmxlbmd0aC0xO24+YW4mJmVuW25dLmlkPmUuaWQ7KW4tLTtlbi5zcGxpY2UobisxLDAsZSl9ZWxzZSBlbi5wdXNoKGUpO3JufHwocm49ITAsUWUobG4pKX19KHRoaXMpfSxwbi5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3ZhciBlPXRoaXMuZ2V0KCk7aWYoZSE9PXRoaXMudmFsdWV8fG8oZSl8fHRoaXMuZGVlcCl7dmFyIHQ9dGhpcy52YWx1ZTtpZih0aGlzLnZhbHVlPWUsdGhpcy51c2VyKXt2YXIgbj0nY2FsbGJhY2sgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJztCZSh0aGlzLmNiLHRoaXMudm0sW2UsdF0sdGhpcy52bSxuKX1lbHNlIHRoaXMuY2IuY2FsbCh0aGlzLnZtLGUsdCl9fX0scG4ucHJvdG90eXBlLmV2YWx1YXRlPWZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLmdldCgpLHRoaXMuZGlydHk9ITF9LHBuLnByb3RvdHlwZS5kZXBlbmQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXRoaXMuZGVwc1tlXS5kZXBlbmQoKX0scG4ucHJvdG90eXBlLnRlYXJkb3duPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3RoaXMudm0uX2lzQmVpbmdEZXN0cm95ZWR8fGgodGhpcy52bS5fd2F0Y2hlcnMsdGhpcyk7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0ucmVtb3ZlU3ViKHRoaXMpO3RoaXMuYWN0aXZlPSExfX07dmFyIGRuPXtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6UyxzZXQ6U307ZnVuY3Rpb24gdm4oZSx0LG4pe2RuLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzW3RdW25dfSxkbi5zZXQ9ZnVuY3Rpb24oZSl7dGhpc1t0XVtuXT1lfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLGRuKX1mdW5jdGlvbiBobihlKXtlLl93YXRjaGVycz1bXTt2YXIgdD1lLiRvcHRpb25zO3QucHJvcHMmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS4kb3B0aW9ucy5wcm9wc0RhdGF8fHt9LHI9ZS5fcHJvcHM9e30saT1lLiRvcHRpb25zLl9wcm9wS2V5cz1bXTtlLiRwYXJlbnQmJiRlKCExKTt2YXIgbz1mdW5jdGlvbihvKXtpLnB1c2gobyk7dmFyIGE9SWUobyx0LG4sZSk7eGUocixvLGEpLG8gaW4gZXx8dm4oZSwiX3Byb3BzIixvKX07Zm9yKHZhciBhIGluIHQpbyhhKTskZSghMCl9KGUsdC5wcm9wcyksdC5tZXRob2RzJiZmdW5jdGlvbihlLHQpe2UuJG9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpZVtuXT0iZnVuY3Rpb24iIT10eXBlb2YgdFtuXT9TOngodFtuXSxlKX0oZSx0Lm1ldGhvZHMpLHQuZGF0YT9mdW5jdGlvbihlKXt2YXIgdD1lLiRvcHRpb25zLmRhdGE7cyh0PWUuX2RhdGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24oZSx0KXtsZSgpO3RyeXtyZXR1cm4gZS5jYWxsKHQsdCl9Y2F0Y2goZSl7cmV0dXJuIEhlKGUsdCwiZGF0YSgpIikse319ZmluYWxseXtmZSgpfX0odCxlKTp0fHx7fSl8fCh0PXt9KTt2YXIgbj1PYmplY3Qua2V5cyh0KSxyPWUuJG9wdGlvbnMucHJvcHMsaT0oZS4kb3B0aW9ucy5tZXRob2RzLG4ubGVuZ3RoKTtmb3IoO2ktLTspe3ZhciBvPW5baV07ciYmeShyLG8pfHwoYT12b2lkIDAsMzYhPT0oYT0obysiIikuY2hhckNvZGVBdCgwKSkmJjk1IT09YSYmdm4oZSwiX2RhdGEiLG8pKX12YXIgYTtDZSh0LCEwKX0oZSk6Q2UoZS5fZGF0YT17fSwhMCksdC5jb21wdXRlZCYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLl9jb21wdXRlZFdhdGNoZXJzPU9iamVjdC5jcmVhdGUobnVsbCkscj10ZSgpO2Zvcih2YXIgaSBpbiB0KXt2YXIgbz10W2ldLGE9ImZ1bmN0aW9uIj09dHlwZW9mIG8/bzpvLmdldDtyfHwobltpXT1uZXcgcG4oZSxhfHxTLFMsbW4pKSxpIGluIGV8fHluKGUsaSxvKX19KGUsdC5jb21wdXRlZCksdC53YXRjaCYmdC53YXRjaCE9PVkmJmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07aWYoQXJyYXkuaXNBcnJheShyKSlmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKylibihlLG4scltpXSk7ZWxzZSBibihlLG4scil9fShlLHQud2F0Y2gpfXZhciBtbj17bGF6eTohMH07ZnVuY3Rpb24geW4oZSx0LG4pe3ZhciByPSF0ZSgpOyJmdW5jdGlvbiI9PXR5cGVvZiBuPyhkbi5nZXQ9cj9nbih0KTpfbihuKSxkbi5zZXQ9Uyk6KGRuLmdldD1uLmdldD9yJiYhMSE9PW4uY2FjaGU/Z24odCk6X24obi5nZXQpOlMsZG4uc2V0PW4uc2V0fHxTKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LGRuKX1mdW5jdGlvbiBnbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jb21wdXRlZFdhdGNoZXJzJiZ0aGlzLl9jb21wdXRlZFdhdGNoZXJzW2VdO2lmKHQpcmV0dXJuIHQuZGlydHkmJnQuZXZhbHVhdGUoKSxjZS50YXJnZXQmJnQuZGVwZW5kKCksdC52YWx1ZX19ZnVuY3Rpb24gX24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzLHRoaXMpfX1mdW5jdGlvbiBibihlLHQsbixyKXtyZXR1cm4gcyhuKSYmKHI9bixuPW4uaGFuZGxlciksInN0cmluZyI9PXR5cGVvZiBuJiYobj1lW25dKSxlLiR3YXRjaCh0LG4scil9dmFyICRuPTA7ZnVuY3Rpb24gd24oZSl7dmFyIHQ9ZS5vcHRpb25zO2lmKGUuc3VwZXIpe3ZhciBuPXduKGUuc3VwZXIpO2lmKG4hPT1lLnN1cGVyT3B0aW9ucyl7ZS5zdXBlck9wdGlvbnM9bjt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdCxuPWUub3B0aW9ucyxyPWUuc2VhbGVkT3B0aW9ucztmb3IodmFyIGkgaW4gbiluW2ldIT09cltpXSYmKHR8fCh0PXt9KSx0W2ldPW5baV0pO3JldHVybiB0fShlKTtyJiZBKGUuZXh0ZW5kT3B0aW9ucyxyKSwodD1lLm9wdGlvbnM9RGUobixlLmV4dGVuZE9wdGlvbnMpKS5uYW1lJiYodC5jb21wb25lbnRzW3QubmFtZV09ZSl9fXJldHVybiB0fWZ1bmN0aW9uIENuKGUpe3RoaXMuX2luaXQoZSl9ZnVuY3Rpb24geG4oZSl7ZS5jaWQ9MDt2YXIgdD0xO2UuZXh0ZW5kPWZ1bmN0aW9uKGUpe2U9ZXx8e307dmFyIG49dGhpcyxyPW4uY2lkLGk9ZS5fQ3Rvcnx8KGUuX0N0b3I9e30pO2lmKGlbcl0pcmV0dXJuIGlbcl07dmFyIG89ZS5uYW1lfHxuLm9wdGlvbnMubmFtZSxhPWZ1bmN0aW9uKGUpe3RoaXMuX2luaXQoZSl9O3JldHVybihhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YSxhLmNpZD10KyssYS5vcHRpb25zPURlKG4ub3B0aW9ucyxlKSxhLnN1cGVyPW4sYS5vcHRpb25zLnByb3BzJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpdm4oZS5wcm90b3R5cGUsIl9wcm9wcyIsbil9KGEpLGEub3B0aW9ucy5jb21wdXRlZCYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLmNvbXB1dGVkO2Zvcih2YXIgbiBpbiB0KXluKGUucHJvdG90eXBlLG4sdFtuXSl9KGEpLGEuZXh0ZW5kPW4uZXh0ZW5kLGEubWl4aW49bi5taXhpbixhLnVzZT1uLnVzZSxJLmZvckVhY2goZnVuY3Rpb24oZSl7YVtlXT1uW2VdfSksbyYmKGEub3B0aW9ucy5jb21wb25lbnRzW29dPWEpLGEuc3VwZXJPcHRpb25zPW4ub3B0aW9ucyxhLmV4dGVuZE9wdGlvbnM9ZSxhLnNlYWxlZE9wdGlvbnM9QSh7fSxhLm9wdGlvbnMpLGlbcl09YSxhfX1mdW5jdGlvbiBrbihlKXtyZXR1cm4gZSYmKGUuQ3Rvci5vcHRpb25zLm5hbWV8fGUudGFnKX1mdW5jdGlvbiBBbihlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2UuaW5kZXhPZih0KT4tMToic3RyaW5nIj09dHlwZW9mIGU/ZS5zcGxpdCgiLCIpLmluZGV4T2YodCk+LTE6KG49ZSwiW29iamVjdCBSZWdFeHBdIj09PWEuY2FsbChuKSYmZS50ZXN0KHQpKTt2YXIgbn1mdW5jdGlvbiBPbihlLHQpe3ZhciBuPWUuY2FjaGUscj1lLmtleXMsaT1lLl92bm9kZTtmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtpZihhKXt2YXIgcz1hLm5hbWU7cyYmIXQocykmJlNuKG4sbyxyLGkpfX19ZnVuY3Rpb24gU24oZSx0LG4scil7dmFyIGk9ZVt0XTshaXx8ciYmaS50YWc9PT1yLnRhZ3x8aS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpLGVbdF09bnVsbCxoKG4sdCl9IWZ1bmN0aW9uKHQpe3QucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7bi5fdWlkPSRuKyssbi5faXNWdWU9ITAsdCYmdC5faXNDb21wb25lbnQ/ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLiRvcHRpb25zPU9iamVjdC5jcmVhdGUoZS5jb25zdHJ1Y3Rvci5vcHRpb25zKSxyPXQuX3BhcmVudFZub2RlO24ucGFyZW50PXQucGFyZW50LG4uX3BhcmVudFZub2RlPXI7dmFyIGk9ci5jb21wb25lbnRPcHRpb25zO24ucHJvcHNEYXRhPWkucHJvcHNEYXRhLG4uX3BhcmVudExpc3RlbmVycz1pLmxpc3RlbmVycyxuLl9yZW5kZXJDaGlsZHJlbj1pLmNoaWxkcmVuLG4uX2NvbXBvbmVudFRhZz1pLnRhZyx0LnJlbmRlciYmKG4ucmVuZGVyPXQucmVuZGVyLG4uc3RhdGljUmVuZGVyRm5zPXQuc3RhdGljUmVuZGVyRm5zKX0obix0KTpuLiRvcHRpb25zPURlKHduKG4uY29uc3RydWN0b3IpLHR8fHt9LG4pLG4uX3JlbmRlclByb3h5PW4sbi5fc2VsZj1uLGZ1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMsbj10LnBhcmVudDtpZihuJiYhdC5hYnN0cmFjdCl7Zm9yKDtuLiRvcHRpb25zLmFic3RyYWN0JiZuLiRwYXJlbnQ7KW49bi4kcGFyZW50O24uJGNoaWxkcmVuLnB1c2goZSl9ZS4kcGFyZW50PW4sZS4kcm9vdD1uP24uJHJvb3Q6ZSxlLiRjaGlsZHJlbj1bXSxlLiRyZWZzPXt9LGUuX3dhdGNoZXI9bnVsbCxlLl9pbmFjdGl2ZT1udWxsLGUuX2RpcmVjdEluYWN0aXZlPSExLGUuX2lzTW91bnRlZD0hMSxlLl9pc0Rlc3Ryb3llZD0hMSxlLl9pc0JlaW5nRGVzdHJveWVkPSExfShuKSxmdW5jdGlvbihlKXtlLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLl9oYXNIb29rRXZlbnQ9ITE7dmFyIHQ9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QmJld0KGUsdCl9KG4pLGZ1bmN0aW9uKHQpe3QuX3Zub2RlPW51bGwsdC5fc3RhdGljVHJlZXM9bnVsbDt2YXIgbj10LiRvcHRpb25zLHI9dC4kdm5vZGU9bi5fcGFyZW50Vm5vZGUsaT1yJiZyLmNvbnRleHQ7dC4kc2xvdHM9bHQobi5fcmVuZGVyQ2hpbGRyZW4saSksdC4kc2NvcGVkU2xvdHM9ZSx0Ll9jPWZ1bmN0aW9uKGUsbixyLGkpe3JldHVybiBIdCh0LGUsbixyLGksITEpfSx0LiRjcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGUsbixyLGkpe3JldHVybiBIdCh0LGUsbixyLGksITApfTt2YXIgbz1yJiZyLmRhdGE7eGUodCwiJGF0dHJzIixvJiZvLmF0dHJzfHxlLG51bGwsITApLHhlKHQsIiRsaXN0ZW5lcnMiLG4uX3BhcmVudExpc3RlbmVyc3x8ZSxudWxsLCEwKX0obiksUXQobiwiYmVmb3JlQ3JlYXRlIiksZnVuY3Rpb24oZSl7dmFyIHQ9dXQoZS4kb3B0aW9ucy5pbmplY3QsZSk7dCYmKCRlKCExKSxPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3hlKGUsbix0W25dKX0pLCRlKCEwKSl9KG4pLGhuKG4pLGZ1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMucHJvdmlkZTt0JiYoZS5fcHJvdmlkZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dC5jYWxsKGUpOnQpfShuKSxRdChuLCJjcmVhdGVkIiksbi4kb3B0aW9ucy5lbCYmbi4kbW91bnQobi4kb3B0aW9ucy5lbCl9fShDbiksZnVuY3Rpb24oZSl7dmFyIHQ9e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfX0sbj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BzfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCIkZGF0YSIsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCIkcHJvcHMiLG4pLGUucHJvdG90eXBlLiRzZXQ9a2UsZS5wcm90b3R5cGUuJGRlbGV0ZT1BZSxlLnByb3RvdHlwZS4kd2F0Y2g9ZnVuY3Rpb24oZSx0LG4pe2lmKHModCkpcmV0dXJuIGJuKHRoaXMsZSx0LG4pOyhuPW58fHt9KS51c2VyPSEwO3ZhciByPW5ldyBwbih0aGlzLGUsdCxuKTtpZihuLmltbWVkaWF0ZSl7dmFyIGk9J2NhbGxiYWNrIGZvciBpbW1lZGlhdGUgd2F0Y2hlciAiJytyLmV4cHJlc3Npb24rJyInO2xlKCksQmUodCx0aGlzLFtyLnZhbHVlXSx0aGlzLGkpLGZlKCl9cmV0dXJuIGZ1bmN0aW9uKCl7ci50ZWFyZG93bigpfX19KENuKSxmdW5jdGlvbihlKXt2YXIgdD0vXmhvb2s6LztlLnByb3RvdHlwZS4kb249ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzO2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBpPTAsbz1lLmxlbmd0aDtpPG87aSsrKXIuJG9uKGVbaV0sbik7ZWxzZShyLl9ldmVudHNbZV18fChyLl9ldmVudHNbZV09W10pKS5wdXNoKG4pLHQudGVzdChlKSYmKHIuX2hhc0hvb2tFdmVudD0hMCk7cmV0dXJuIHJ9LGUucHJvdG90eXBlLiRvbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztmdW5jdGlvbiByKCl7bi4kb2ZmKGUsciksdC5hcHBseShuLGFyZ3VtZW50cyl9cmV0dXJuIHIuZm49dCxuLiRvbihlLHIpLG59LGUucHJvdG90eXBlLiRvZmY9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBuLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxuO2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgcj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluLiRvZmYoZVtyXSx0KTtyZXR1cm4gbn12YXIgbyxhPW4uX2V2ZW50c1tlXTtpZighYSlyZXR1cm4gbjtpZighdClyZXR1cm4gbi5fZXZlbnRzW2VdPW51bGwsbjtmb3IodmFyIHM9YS5sZW5ndGg7cy0tOylpZigobz1hW3NdKT09PXR8fG8uZm49PT10KXthLnNwbGljZShzLDEpO2JyZWFrfXJldHVybiBufSxlLnByb3RvdHlwZS4kZW1pdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9ldmVudHNbZV07aWYodCl7dD10Lmxlbmd0aD4xP2sodCk6dDtmb3IodmFyIG49ayhhcmd1bWVudHMsMSkscj0nZXZlbnQgaGFuZGxlciBmb3IgIicrZSsnIicsaT0wLG89dC5sZW5ndGg7aTxvO2krKylCZSh0W2ldLHRoaXMsbix0aGlzLHIpfXJldHVybiB0aGlzfX0oQ24pLGZ1bmN0aW9uKGUpe2UucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLHI9bi4kZWwsaT1uLl92bm9kZSxvPUd0KG4pO24uX3Zub2RlPWUsbi4kZWw9aT9uLl9fcGF0Y2hfXyhpLGUpOm4uX19wYXRjaF9fKG4uJGVsLGUsdCwhMSksbygpLHImJihyLl9fdnVlX189bnVsbCksbi4kZWwmJihuLiRlbC5fX3Z1ZV9fPW4pLG4uJHZub2RlJiZuLiRwYXJlbnQmJm4uJHZub2RlPT09bi4kcGFyZW50Ll92bm9kZSYmKG4uJHBhcmVudC4kZWw9bi4kZWwpfSxlLnByb3RvdHlwZS4kZm9yY2VVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl93YXRjaGVyJiZ0aGlzLl93YXRjaGVyLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS4kZGVzdHJveT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIWUuX2lzQmVpbmdEZXN0cm95ZWQpe1F0KGUsImJlZm9yZURlc3Ryb3kiKSxlLl9pc0JlaW5nRGVzdHJveWVkPSEwO3ZhciB0PWUuJHBhcmVudDshdHx8dC5faXNCZWluZ0Rlc3Ryb3llZHx8ZS4kb3B0aW9ucy5hYnN0cmFjdHx8aCh0LiRjaGlsZHJlbixlKSxlLl93YXRjaGVyJiZlLl93YXRjaGVyLnRlYXJkb3duKCk7Zm9yKHZhciBuPWUuX3dhdGNoZXJzLmxlbmd0aDtuLS07KWUuX3dhdGNoZXJzW25dLnRlYXJkb3duKCk7ZS5fZGF0YS5fX29iX18mJmUuX2RhdGEuX19vYl9fLnZtQ291bnQtLSxlLl9pc0Rlc3Ryb3llZD0hMCxlLl9fcGF0Y2hfXyhlLl92bm9kZSxudWxsKSxRdChlLCJkZXN0cm95ZWQiKSxlLiRvZmYoKSxlLiRlbCYmKGUuJGVsLl9fdnVlX189bnVsbCksZS4kdm5vZGUmJihlLiR2bm9kZS5wYXJlbnQ9bnVsbCl9fX0oQ24pLGZ1bmN0aW9uKGUpe050KGUucHJvdG90eXBlKSxlLnByb3RvdHlwZS4kbmV4dFRpY2s9ZnVuY3Rpb24oZSl7cmV0dXJuIFFlKGUsdGhpcyl9LGUucHJvdG90eXBlLl9yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMsbj10LiRvcHRpb25zLHI9bi5yZW5kZXIsaT1uLl9wYXJlbnRWbm9kZTtpJiYodC4kc2NvcGVkU2xvdHM9ZHQoaS5kYXRhLnNjb3BlZFNsb3RzLHQuJHNsb3RzLHQuJHNjb3BlZFNsb3RzKSksdC4kdm5vZGU9aTt0cnl7VXQ9dCxlPXIuY2FsbCh0Ll9yZW5kZXJQcm94eSx0LiRjcmVhdGVFbGVtZW50KX1jYXRjaChuKXtIZShuLHQsInJlbmRlciIpLGU9dC5fdm5vZGV9ZmluYWxseXtVdD1udWxsfXJldHVybiBBcnJheS5pc0FycmF5KGUpJiYxPT09ZS5sZW5ndGgmJihlPWVbMF0pLGUgaW5zdGFuY2VvZiBwZXx8KGU9dmUoKSksZS5wYXJlbnQ9aSxlfX0oQ24pO3ZhciBUbj1bU3RyaW5nLFJlZ0V4cCxBcnJheV0sTm49e0tlZXBBbGl2ZTp7bmFtZToia2VlcC1hbGl2ZSIsYWJzdHJhY3Q6ITAscHJvcHM6e2luY2x1ZGU6VG4sZXhjbHVkZTpUbixtYXg6W1N0cmluZyxOdW1iZXJdfSxtZXRob2RzOntjYWNoZVZOb2RlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jYWNoZSx0PXRoaXMua2V5cyxuPXRoaXMudm5vZGVUb0NhY2hlLHI9dGhpcy5rZXlUb0NhY2hlO2lmKG4pe3ZhciBpPW4udGFnLG89bi5jb21wb25lbnRJbnN0YW5jZSxhPW4uY29tcG9uZW50T3B0aW9ucztlW3JdPXtuYW1lOmtuKGEpLHRhZzppLGNvbXBvbmVudEluc3RhbmNlOm99LHQucHVzaChyKSx0aGlzLm1heCYmdC5sZW5ndGg+cGFyc2VJbnQodGhpcy5tYXgpJiZTbihlLHRbMF0sdCx0aGlzLl92bm9kZSksdGhpcy52bm9kZVRvQ2FjaGU9bnVsbH19fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5jYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMua2V5cz1bXX0sZGVzdHJveWVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuY2FjaGUpU24odGhpcy5jYWNoZSxlLHRoaXMua2V5cyl9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuY2FjaGVWTm9kZSgpLHRoaXMuJHdhdGNoKCJpbmNsdWRlIixmdW5jdGlvbih0KXtPbihlLGZ1bmN0aW9uKGUpe3JldHVybiBBbih0LGUpfSl9KSx0aGlzLiR3YXRjaCgiZXhjbHVkZSIsZnVuY3Rpb24odCl7T24oZSxmdW5jdGlvbihlKXtyZXR1cm4hQW4odCxlKX0pfSl9LHVwZGF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhY2hlVk5vZGUoKX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kc2xvdHMuZGVmYXVsdCx0PXp0KGUpLG49dCYmdC5jb21wb25lbnRPcHRpb25zO2lmKG4pe3ZhciByPWtuKG4pLGk9dGhpcy5pbmNsdWRlLG89dGhpcy5leGNsdWRlO2lmKGkmJighcnx8IUFuKGkscikpfHxvJiZyJiZBbihvLHIpKXJldHVybiB0O3ZhciBhPXRoaXMuY2FjaGUscz10aGlzLmtleXMsYz1udWxsPT10LmtleT9uLkN0b3IuY2lkKyhuLnRhZz8iOjoiK24udGFnOiIiKTp0LmtleTthW2NdPyh0LmNvbXBvbmVudEluc3RhbmNlPWFbY10uY29tcG9uZW50SW5zdGFuY2UsaChzLGMpLHMucHVzaChjKSk6KHRoaXMudm5vZGVUb0NhY2hlPXQsdGhpcy5rZXlUb0NhY2hlPWMpLHQuZGF0YS5rZWVwQWxpdmU9ITB9cmV0dXJuIHR8fGUmJmVbMF19fX07IWZ1bmN0aW9uKGUpe3ZhciB0PXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRn19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJjb25maWciLHQpLGUudXRpbD17d2FybjphZSxleHRlbmQ6QSxtZXJnZU9wdGlvbnM6RGUsZGVmaW5lUmVhY3RpdmU6eGV9LGUuc2V0PWtlLGUuZGVsZXRlPUFlLGUubmV4dFRpY2s9UWUsZS5vYnNlcnZhYmxlPWZ1bmN0aW9uKGUpe3JldHVybiBDZShlKSxlfSxlLm9wdGlvbnM9T2JqZWN0LmNyZWF0ZShudWxsKSxJLmZvckVhY2goZnVuY3Rpb24odCl7ZS5vcHRpb25zW3QrInMiXT1PYmplY3QuY3JlYXRlKG51bGwpfSksZS5vcHRpb25zLl9iYXNlPWUsQShlLm9wdGlvbnMuY29tcG9uZW50cyxObiksZnVuY3Rpb24oZSl7ZS51c2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5faW5zdGFsbGVkUGx1Z2luc3x8KHRoaXMuX2luc3RhbGxlZFBsdWdpbnM9W10pO2lmKHQuaW5kZXhPZihlKT4tMSlyZXR1cm4gdGhpczt2YXIgbj1rKGFyZ3VtZW50cywxKTtyZXR1cm4gbi51bnNoaWZ0KHRoaXMpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLmluc3RhbGw/ZS5pbnN0YWxsLmFwcGx5KGUsbik6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUuYXBwbHkobnVsbCxuKSx0LnB1c2goZSksdGhpc319KGUpLGZ1bmN0aW9uKGUpe2UubWl4aW49ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3B0aW9ucz1EZSh0aGlzLm9wdGlvbnMsZSksdGhpc319KGUpLHhuKGUpLGZ1bmN0aW9uKGUpe0kuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG4/KCJjb21wb25lbnQiPT09dCYmcyhuKSYmKG4ubmFtZT1uLm5hbWV8fGUsbj10aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKG4pKSwiZGlyZWN0aXZlIj09PXQmJiJmdW5jdGlvbiI9PXR5cGVvZiBuJiYobj17YmluZDpuLHVwZGF0ZTpufSksdGhpcy5vcHRpb25zW3QrInMiXVtlXT1uLG4pOnRoaXMub3B0aW9uc1t0KyJzIl1bZV19fSl9KGUpfShDbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KENuLnByb3RvdHlwZSwiJGlzU2VydmVyIix7Z2V0OnRlfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KENuLnByb3RvdHlwZSwiJHNzckNvbnRleHQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdm5vZGUmJnRoaXMuJHZub2RlLnNzckNvbnRleHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KENuLCJGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCIse3ZhbHVlOkV0fSksQ24udmVyc2lvbj0iMi42LjE0Ijt2YXIgRW49cCgic3R5bGUsY2xhc3MiKSxqbj1wKCJpbnB1dCx0ZXh0YXJlYSxvcHRpb24sc2VsZWN0LHByb2dyZXNzIiksRG49ZnVuY3Rpb24oZSx0LG4pe3JldHVybiJ2YWx1ZSI9PT1uJiZqbihlKSYmImJ1dHRvbiIhPT10fHwic2VsZWN0ZWQiPT09biYmIm9wdGlvbiI9PT1lfHwiY2hlY2tlZCI9PT1uJiYiaW5wdXQiPT09ZXx8Im11dGVkIj09PW4mJiJ2aWRlbyI9PT1lfSxMbj1wKCJjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2siKSxJbj1wKCJldmVudHMsY2FyZXQsdHlwaW5nLHBsYWludGV4dC1vbmx5IiksTW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gQm4odCl8fCJmYWxzZSI9PT10PyJmYWxzZSI6ImNvbnRlbnRlZGl0YWJsZSI9PT1lJiZJbih0KT90OiJ0cnVlIn0sRm49cCgiYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSxkZWZhdWx0LGRlZmF1bHRjaGVja2VkLGRlZmF1bHRtdXRlZCxkZWZhdWx0c2VsZWN0ZWQsZGVmZXIsZGlzYWJsZWQsZW5hYmxlZCxmb3Jtbm92YWxpZGF0ZSxoaWRkZW4saW5kZXRlcm1pbmF0ZSxpbmVydCxpc21hcCxpdGVtc2NvcGUsbG9vcCxtdWx0aXBsZSxtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LHJlcXVpcmVkLHJldmVyc2VkLHNjb3BlZCxzZWFtbGVzcyxzZWxlY3RlZCxzb3J0YWJsZSx0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlIiksUG49Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLFJuPWZ1bmN0aW9uKGUpe3JldHVybiI6Ij09PWUuY2hhckF0KDUpJiYieGxpbmsiPT09ZS5zbGljZSgwLDUpfSxIbj1mdW5jdGlvbihlKXtyZXR1cm4gUm4oZSk/ZS5zbGljZSg2LGUubGVuZ3RoKToiIn0sQm49ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV8fCExPT09ZX07ZnVuY3Rpb24gVW4oZSl7Zm9yKHZhciB0PWUuZGF0YSxyPWUsaT1lO24oaS5jb21wb25lbnRJbnN0YW5jZSk7KShpPWkuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmaS5kYXRhJiYodD1WbihpLmRhdGEsdCkpO2Zvcig7bihyPXIucGFyZW50KTspciYmci5kYXRhJiYodD1Wbih0LHIuZGF0YSkpO3JldHVybiBmdW5jdGlvbihlLHQpe2lmKG4oZSl8fG4odCkpcmV0dXJuIHpuKGUsS24odCkpO3JldHVybiIifSh0LnN0YXRpY0NsYXNzLHQuY2xhc3MpfWZ1bmN0aW9uIFZuKGUsdCl7cmV0dXJue3N0YXRpY0NsYXNzOnpuKGUuc3RhdGljQ2xhc3MsdC5zdGF0aWNDbGFzcyksY2xhc3M6bihlLmNsYXNzKT9bZS5jbGFzcyx0LmNsYXNzXTp0LmNsYXNzfX1mdW5jdGlvbiB6bihlLHQpe3JldHVybiBlP3Q/ZSsiICIrdDplOnR8fCIifWZ1bmN0aW9uIEtuKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdCxyPSIiLGk9MCxvPWUubGVuZ3RoO2k8bztpKyspbih0PUtuKGVbaV0pKSYmIiIhPT10JiYociYmKHIrPSIgIikscis9dCk7cmV0dXJuIHJ9KGUpOm8oZSk/ZnVuY3Rpb24oZSl7dmFyIHQ9IiI7Zm9yKHZhciBuIGluIGUpZVtuXSYmKHQmJih0Kz0iICIpLHQrPW4pO3JldHVybiB0fShlKToic3RyaW5nIj09dHlwZW9mIGU/ZToiIn12YXIgSm49e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLG1hdGg6Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwifSxxbj1wKCJodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSxhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoMSxoMixoMyxoNCxoNSxoNixoZ3JvdXAsbmF2LHNlY3Rpb24sZGl2LGRkLGRsLGR0LGZpZ2NhcHRpb24sZmlndXJlLHBpY3R1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LHMsc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLGVtYmVkLG9iamVjdCxwYXJhbSxzb3VyY2UsY2FudmFzLHNjcmlwdCxub3NjcmlwdCxkZWwsaW5zLGNhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLGJ1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sb3V0cHV0LHByb2dyZXNzLHNlbGVjdCx0ZXh0YXJlYSxkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksY29udGVudCxlbGVtZW50LHNoYWRvdyx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCIpLFduPXAoInN2ZyxhbmltYXRlLGNpcmNsZSxjbGlwcGF0aCxjdXJzb3IsZGVmcyxkZXNjLGVsbGlwc2UsZmlsdGVyLGZvbnQtZmFjZSxmb3JlaWdub2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybixwb2x5Z29uLHBvbHlsaW5lLHJlY3Qsc3dpdGNoLHN5bWJvbCx0ZXh0LHRleHRwYXRoLHRzcGFuLHVzZSx2aWV3IiwhMCksWm49ZnVuY3Rpb24oZSl7cmV0dXJuIHFuKGUpfHxXbihlKX07ZnVuY3Rpb24gR24oZSl7cmV0dXJuIFduKGUpPyJzdmciOiJtYXRoIj09PWU/Im1hdGgiOnZvaWQgMH12YXIgWG49T2JqZWN0LmNyZWF0ZShudWxsKTt2YXIgWW49cCgidGV4dCxudW1iZXIscGFzc3dvcmQsc2VhcmNoLGVtYWlsLHRlbCx1cmwiKTtmdW5jdGlvbiBRbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSk7cmV0dXJuIHR8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpfXJldHVybiBlfXZhciBlcj1PYmplY3QuZnJlZXplKHtjcmVhdGVFbGVtZW50OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlKTtyZXR1cm4ic2VsZWN0IiE9PWU/bjoodC5kYXRhJiZ0LmRhdGEuYXR0cnMmJnZvaWQgMCE9PXQuZGF0YS5hdHRycy5tdWx0aXBsZSYmbi5zZXRBdHRyaWJ1dGUoIm11bHRpcGxlIiwibXVsdGlwbGUiKSxuKX0sY3JlYXRlRWxlbWVudE5TOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhKbltlXSx0KX0sY3JlYXRlVGV4dE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGUpfSxjcmVhdGVDb21tZW50OmZ1bmN0aW9uKGUpe3JldHVybiBkb2N1bWVudC5jcmVhdGVDb21tZW50KGUpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24oZSx0LG4pe2UuaW5zZXJ0QmVmb3JlKHQsbil9LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGUsdCl7ZS5yZW1vdmVDaGlsZCh0KX0sYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtlLmFwcGVuZENoaWxkKHQpfSxwYXJlbnROb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBhcmVudE5vZGV9LG5leHRTaWJsaW5nOmZ1bmN0aW9uKGUpe3JldHVybiBlLm5leHRTaWJsaW5nfSx0YWdOYW1lOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRhZ05hbWV9LHNldFRleHRDb250ZW50OmZ1bmN0aW9uKGUsdCl7ZS50ZXh0Q29udGVudD10fSxzZXRTdHlsZVNjb3BlOmZ1bmN0aW9uKGUsdCl7ZS5zZXRBdHRyaWJ1dGUodCwiIil9fSksdHI9e2NyZWF0ZTpmdW5jdGlvbihlLHQpe25yKHQpfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXtlLmRhdGEucmVmIT09dC5kYXRhLnJlZiYmKG5yKGUsITApLG5yKHQpKX0sZGVzdHJveTpmdW5jdGlvbihlKXtucihlLCEwKX19O2Z1bmN0aW9uIG5yKGUsdCl7dmFyIHI9ZS5kYXRhLnJlZjtpZihuKHIpKXt2YXIgaT1lLmNvbnRleHQsbz1lLmNvbXBvbmVudEluc3RhbmNlfHxlLmVsbSxhPWkuJHJlZnM7dD9BcnJheS5pc0FycmF5KGFbcl0pP2goYVtyXSxvKTphW3JdPT09byYmKGFbcl09dm9pZCAwKTplLmRhdGEucmVmSW5Gb3I/QXJyYXkuaXNBcnJheShhW3JdKT9hW3JdLmluZGV4T2Yobyk8MCYmYVtyXS5wdXNoKG8pOmFbcl09W29dOmFbcl09b319dmFyIHJyPW5ldyBwZSgiIix7fSxbXSksaXI9WyJjcmVhdGUiLCJhY3RpdmF0ZSIsInVwZGF0ZSIsInJlbW92ZSIsImRlc3Ryb3kiXTtmdW5jdGlvbiBvcihlLGkpe3JldHVybiBlLmtleT09PWkua2V5JiZlLmFzeW5jRmFjdG9yeT09PWkuYXN5bmNGYWN0b3J5JiYoZS50YWc9PT1pLnRhZyYmZS5pc0NvbW1lbnQ9PT1pLmlzQ29tbWVudCYmbihlLmRhdGEpPT09bihpLmRhdGEpJiZmdW5jdGlvbihlLHQpe2lmKCJpbnB1dCIhPT1lLnRhZylyZXR1cm4hMDt2YXIgcixpPW4ocj1lLmRhdGEpJiZuKHI9ci5hdHRycykmJnIudHlwZSxvPW4ocj10LmRhdGEpJiZuKHI9ci5hdHRycykmJnIudHlwZTtyZXR1cm4gaT09PW98fFluKGkpJiZZbihvKX0oZSxpKXx8cihlLmlzQXN5bmNQbGFjZWhvbGRlcikmJnQoaS5hc3luY0ZhY3RvcnkuZXJyb3IpKX1mdW5jdGlvbiBhcihlLHQscil7dmFyIGksbyxhPXt9O2ZvcihpPXQ7aTw9cjsrK2kpbihvPWVbaV0ua2V5KSYmKGFbb109aSk7cmV0dXJuIGF9dmFyIHNyPXtjcmVhdGU6Y3IsdXBkYXRlOmNyLGRlc3Ryb3k6ZnVuY3Rpb24oZSl7Y3IoZSxycil9fTtmdW5jdGlvbiBjcihlLHQpeyhlLmRhdGEuZGlyZWN0aXZlc3x8dC5kYXRhLmRpcmVjdGl2ZXMpJiZmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvPWU9PT1ycixhPXQ9PT1ycixzPWxyKGUuZGF0YS5kaXJlY3RpdmVzLGUuY29udGV4dCksYz1scih0LmRhdGEuZGlyZWN0aXZlcyx0LmNvbnRleHQpLHU9W10sbD1bXTtmb3IobiBpbiBjKXI9c1tuXSxpPWNbbl0scj8oaS5vbGRWYWx1ZT1yLnZhbHVlLGkub2xkQXJnPXIuYXJnLHByKGksInVwZGF0ZSIsdCxlKSxpLmRlZiYmaS5kZWYuY29tcG9uZW50VXBkYXRlZCYmbC5wdXNoKGkpKToocHIoaSwiYmluZCIsdCxlKSxpLmRlZiYmaS5kZWYuaW5zZXJ0ZWQmJnUucHVzaChpKSk7aWYodS5sZW5ndGgpe3ZhciBmPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTA7bjx1Lmxlbmd0aDtuKyspcHIodVtuXSwiaW5zZXJ0ZWQiLHQsZSl9O28/b3QodCwiaW5zZXJ0IixmKTpmKCl9bC5sZW5ndGgmJm90KHQsInBvc3RwYXRjaCIsZnVuY3Rpb24oKXtmb3IodmFyIG49MDtuPGwubGVuZ3RoO24rKylwcihsW25dLCJjb21wb25lbnRVcGRhdGVkIix0LGUpfSk7aWYoIW8pZm9yKG4gaW4gcyljW25dfHxwcihzW25dLCJ1bmJpbmQiLGUsZSxhKX0oZSx0KX12YXIgdXI9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBscihlLHQpe3ZhciBuLHIsaT1PYmplY3QuY3JlYXRlKG51bGwpO2lmKCFlKXJldHVybiBpO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspKHI9ZVtuXSkubW9kaWZpZXJzfHwoci5tb2RpZmllcnM9dXIpLGlbZnIocildPXIsci5kZWY9TGUodC4kb3B0aW9ucywiZGlyZWN0aXZlcyIsci5uYW1lKTtyZXR1cm4gaX1mdW5jdGlvbiBmcihlKXtyZXR1cm4gZS5yYXdOYW1lfHxlLm5hbWUrIi4iK09iamVjdC5rZXlzKGUubW9kaWZpZXJzfHx7fSkuam9pbigiLiIpfWZ1bmN0aW9uIHByKGUsdCxuLHIsaSl7dmFyIG89ZS5kZWYmJmUuZGVmW3RdO2lmKG8pdHJ5e28obi5lbG0sZSxuLHIsaSl9Y2F0Y2gocil7SGUocixuLmNvbnRleHQsImRpcmVjdGl2ZSAiK2UubmFtZSsiICIrdCsiIGhvb2siKX19dmFyIGRyPVt0cixzcl07ZnVuY3Rpb24gdnIoZSxyKXt2YXIgaT1yLmNvbXBvbmVudE9wdGlvbnM7aWYoIShuKGkpJiYhMT09PWkuQ3Rvci5vcHRpb25zLmluaGVyaXRBdHRyc3x8dChlLmRhdGEuYXR0cnMpJiZ0KHIuZGF0YS5hdHRycykpKXt2YXIgbyxhLHM9ci5lbG0sYz1lLmRhdGEuYXR0cnN8fHt9LHU9ci5kYXRhLmF0dHJzfHx7fTtmb3IobyBpbiBuKHUuX19vYl9fKSYmKHU9ci5kYXRhLmF0dHJzPUEoe30sdSkpLHUpYT11W29dLGNbb10hPT1hJiZocihzLG8sYSxyLmRhdGEucHJlKTtmb3IobyBpbihxfHxaKSYmdS52YWx1ZSE9PWMudmFsdWUmJmhyKHMsInZhbHVlIix1LnZhbHVlKSxjKXQodVtvXSkmJihSbihvKT9zLnJlbW92ZUF0dHJpYnV0ZU5TKFBuLEhuKG8pKTpMbihvKXx8cy5yZW1vdmVBdHRyaWJ1dGUobykpfX1mdW5jdGlvbiBocihlLHQsbixyKXtyfHxlLnRhZ05hbWUuaW5kZXhPZigiLSIpPi0xP21yKGUsdCxuKTpGbih0KT9CbihuKT9lLnJlbW92ZUF0dHJpYnV0ZSh0KToobj0iYWxsb3dmdWxsc2NyZWVuIj09PXQmJiJFTUJFRCI9PT1lLnRhZ05hbWU/InRydWUiOnQsZS5zZXRBdHRyaWJ1dGUodCxuKSk6TG4odCk/ZS5zZXRBdHRyaWJ1dGUodCxNbih0LG4pKTpSbih0KT9CbihuKT9lLnJlbW92ZUF0dHJpYnV0ZU5TKFBuLEhuKHQpKTplLnNldEF0dHJpYnV0ZU5TKFBuLHQsbik6bXIoZSx0LG4pfWZ1bmN0aW9uIG1yKGUsdCxuKXtpZihCbihuKSllLnJlbW92ZUF0dHJpYnV0ZSh0KTtlbHNle2lmKHEmJiFXJiYiVEVYVEFSRUEiPT09ZS50YWdOYW1lJiYicGxhY2Vob2xkZXIiPT09dCYmIiIhPT1uJiYhZS5fX2llcGgpe3ZhciByPWZ1bmN0aW9uKHQpe3Quc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksZS5yZW1vdmVFdmVudExpc3RlbmVyKCJpbnB1dCIscil9O2UuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHIpLGUuX19pZXBoPSEwfWUuc2V0QXR0cmlidXRlKHQsbil9fXZhciB5cj17Y3JlYXRlOnZyLHVwZGF0ZTp2cn07ZnVuY3Rpb24gZ3IoZSxyKXt2YXIgaT1yLmVsbSxvPXIuZGF0YSxhPWUuZGF0YTtpZighKHQoby5zdGF0aWNDbGFzcykmJnQoby5jbGFzcykmJih0KGEpfHx0KGEuc3RhdGljQ2xhc3MpJiZ0KGEuY2xhc3MpKSkpe3ZhciBzPVVuKHIpLGM9aS5fdHJhbnNpdGlvbkNsYXNzZXM7bihjKSYmKHM9em4ocyxLbihjKSkpLHMhPT1pLl9wcmV2Q2xhc3MmJihpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpLGkuX3ByZXZDbGFzcz1zKX19dmFyIF9yLGJyLCRyLHdyLENyLHhyLGtyPXtjcmVhdGU6Z3IsdXBkYXRlOmdyfSxBcj0vW1x3KS4rXC1fJFxdXS87ZnVuY3Rpb24gT3IoZSl7dmFyIHQsbixyLGksbyxhPSExLHM9ITEsYz0hMSx1PSExLGw9MCxmPTAscD0wLGQ9MDtmb3Iocj0wO3I8ZS5sZW5ndGg7cisrKWlmKG49dCx0PWUuY2hhckNvZGVBdChyKSxhKTM5PT09dCYmOTIhPT1uJiYoYT0hMSk7ZWxzZSBpZihzKTM0PT09dCYmOTIhPT1uJiYocz0hMSk7ZWxzZSBpZihjKTk2PT09dCYmOTIhPT1uJiYoYz0hMSk7ZWxzZSBpZih1KTQ3PT09dCYmOTIhPT1uJiYodT0hMSk7ZWxzZSBpZigxMjQhPT10fHwxMjQ9PT1lLmNoYXJDb2RlQXQocisxKXx8MTI0PT09ZS5jaGFyQ29kZUF0KHItMSl8fGx8fGZ8fHApe3N3aXRjaCh0KXtjYXNlIDM0OnM9ITA7YnJlYWs7Y2FzZSAzOTphPSEwO2JyZWFrO2Nhc2UgOTY6Yz0hMDticmVhaztjYXNlIDQwOnArKzticmVhaztjYXNlIDQxOnAtLTticmVhaztjYXNlIDkxOmYrKzticmVhaztjYXNlIDkzOmYtLTticmVhaztjYXNlIDEyMzpsKys7YnJlYWs7Y2FzZSAxMjU6bC0tfWlmKDQ3PT09dCl7Zm9yKHZhciB2PXItMSxoPXZvaWQgMDt2Pj0wJiYiICI9PT0oaD1lLmNoYXJBdCh2KSk7di0tKTtoJiZBci50ZXN0KGgpfHwodT0hMCl9fWVsc2Ugdm9pZCAwPT09aT8oZD1yKzEsaT1lLnNsaWNlKDAscikudHJpbSgpKTptKCk7ZnVuY3Rpb24gbSgpeyhvfHwobz1bXSkpLnB1c2goZS5zbGljZShkLHIpLnRyaW0oKSksZD1yKzF9aWYodm9pZCAwPT09aT9pPWUuc2xpY2UoMCxyKS50cmltKCk6MCE9PWQmJm0oKSxvKWZvcihyPTA7cjxvLmxlbmd0aDtyKyspaT1TcihpLG9bcl0pO3JldHVybiBpfWZ1bmN0aW9uIFNyKGUsdCl7dmFyIG49dC5pbmRleE9mKCIoIik7aWYobjwwKXJldHVybidfZigiJyt0KyciKSgnK2UrIikiO3ZhciByPXQuc2xpY2UoMCxuKSxpPXQuc2xpY2UobisxKTtyZXR1cm4nX2YoIicrcisnIikoJytlKygiKSIhPT1pPyIsIitpOmkpfWZ1bmN0aW9uIFRyKGUsdCl7Y29uc29sZS5lcnJvcigiW1Z1ZSBjb21waWxlcl06ICIrZSl9ZnVuY3Rpb24gTnIoZSx0KXtyZXR1cm4gZT9lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZVt0XX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZX0pOltdfWZ1bmN0aW9uIEVyKGUsdCxuLHIsaSl7KGUucHJvcHN8fChlLnByb3BzPVtdKSkucHVzaChIcih7bmFtZTp0LHZhbHVlOm4sZHluYW1pYzppfSxyKSksZS5wbGFpbj0hMX1mdW5jdGlvbiBqcihlLHQsbixyLGkpeyhpP2UuZHluYW1pY0F0dHJzfHwoZS5keW5hbWljQXR0cnM9W10pOmUuYXR0cnN8fChlLmF0dHJzPVtdKSkucHVzaChIcih7bmFtZTp0LHZhbHVlOm4sZHluYW1pYzppfSxyKSksZS5wbGFpbj0hMX1mdW5jdGlvbiBEcihlLHQsbixyKXtlLmF0dHJzTWFwW3RdPW4sZS5hdHRyc0xpc3QucHVzaChIcih7bmFtZTp0LHZhbHVlOm59LHIpKX1mdW5jdGlvbiBMcihlLHQsbixyLGksbyxhLHMpeyhlLmRpcmVjdGl2ZXN8fChlLmRpcmVjdGl2ZXM9W10pKS5wdXNoKEhyKHtuYW1lOnQscmF3TmFtZTpuLHZhbHVlOnIsYXJnOmksaXNEeW5hbWljQXJnOm8sbW9kaWZpZXJzOmF9LHMpKSxlLnBsYWluPSExfWZ1bmN0aW9uIElyKGUsdCxuKXtyZXR1cm4gbj8iX3AoIit0KycsIicrZSsnIiknOmUrdH1mdW5jdGlvbiBNcih0LG4scixpLG8sYSxzLGMpe3ZhciB1OyhpPWl8fGUpLnJpZ2h0P2M/bj0iKCIrbisiKT09PSdjbGljayc/J2NvbnRleHRtZW51JzooIituKyIpIjoiY2xpY2siPT09biYmKG49ImNvbnRleHRtZW51IixkZWxldGUgaS5yaWdodCk6aS5taWRkbGUmJihjP249IigiK24rIik9PT0nY2xpY2snPydtb3VzZXVwJzooIituKyIpIjoiY2xpY2siPT09biYmKG49Im1vdXNldXAiKSksaS5jYXB0dXJlJiYoZGVsZXRlIGkuY2FwdHVyZSxuPUlyKCIhIixuLGMpKSxpLm9uY2UmJihkZWxldGUgaS5vbmNlLG49SXIoIn4iLG4sYykpLGkucGFzc2l2ZSYmKGRlbGV0ZSBpLnBhc3NpdmUsbj1JcigiJiIsbixjKSksaS5uYXRpdmU/KGRlbGV0ZSBpLm5hdGl2ZSx1PXQubmF0aXZlRXZlbnRzfHwodC5uYXRpdmVFdmVudHM9e30pKTp1PXQuZXZlbnRzfHwodC5ldmVudHM9e30pO3ZhciBsPUhyKHt2YWx1ZTpyLnRyaW0oKSxkeW5hbWljOmN9LHMpO2khPT1lJiYobC5tb2RpZmllcnM9aSk7dmFyIGY9dVtuXTtBcnJheS5pc0FycmF5KGYpP28/Zi51bnNoaWZ0KGwpOmYucHVzaChsKTp1W25dPWY/bz9bbCxmXTpbZixsXTpsLHQucGxhaW49ITF9ZnVuY3Rpb24gRnIoZSx0LG4pe3ZhciByPVByKGUsIjoiK3QpfHxQcihlLCJ2LWJpbmQ6Iit0KTtpZihudWxsIT1yKXJldHVybiBPcihyKTtpZighMSE9PW4pe3ZhciBpPVByKGUsdCk7aWYobnVsbCE9aSlyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaSl9fWZ1bmN0aW9uIFByKGUsdCxuKXt2YXIgcjtpZihudWxsIT0ocj1lLmF0dHJzTWFwW3RdKSlmb3IodmFyIGk9ZS5hdHRyc0xpc3Qsbz0wLGE9aS5sZW5ndGg7bzxhO28rKylpZihpW29dLm5hbWU9PT10KXtpLnNwbGljZShvLDEpO2JyZWFrfXJldHVybiBuJiZkZWxldGUgZS5hdHRyc01hcFt0XSxyfWZ1bmN0aW9uIFJyKGUsdCl7Zm9yKHZhciBuPWUuYXR0cnNMaXN0LHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07aWYodC50ZXN0KG8ubmFtZSkpcmV0dXJuIG4uc3BsaWNlKHIsMSksb319ZnVuY3Rpb24gSHIoZSx0KXtyZXR1cm4gdCYmKG51bGwhPXQuc3RhcnQmJihlLnN0YXJ0PXQuc3RhcnQpLG51bGwhPXQuZW5kJiYoZS5lbmQ9dC5lbmQpKSxlfWZ1bmN0aW9uIEJyKGUsdCxuKXt2YXIgcj1ufHx7fSxpPXIubnVtYmVyLG89IiQkdiI7ci50cmltJiYobz0iKHR5cGVvZiAkJHYgPT09ICdzdHJpbmcnPyAkJHYudHJpbSgpOiAkJHYpIiksaSYmKG89Il9uKCIrbysiKSIpO3ZhciBhPVVyKHQsbyk7ZS5tb2RlbD17dmFsdWU6IigiK3QrIikiLGV4cHJlc3Npb246SlNPTi5zdHJpbmdpZnkodCksY2FsbGJhY2s6ImZ1bmN0aW9uICgkJHYpIHsiK2ErIn0ifX1mdW5jdGlvbiBVcihlLHQpe3ZhciBuPWZ1bmN0aW9uKGUpe2lmKGU9ZS50cmltKCksX3I9ZS5sZW5ndGgsZS5pbmRleE9mKCJbIik8MHx8ZS5sYXN0SW5kZXhPZigiXSIpPF9yLTEpcmV0dXJuKHdyPWUubGFzdEluZGV4T2YoIi4iKSk+LTE/e2V4cDplLnNsaWNlKDAsd3IpLGtleTonIicrZS5zbGljZSh3cisxKSsnIid9OntleHA6ZSxrZXk6bnVsbH07YnI9ZSx3cj1Dcj14cj0wO2Zvcig7IXpyKCk7KUtyKCRyPVZyKCkpP3FyKCRyKTo5MT09PSRyJiZKcigkcik7cmV0dXJue2V4cDplLnNsaWNlKDAsQ3IpLGtleTplLnNsaWNlKENyKzEseHIpfX0oZSk7cmV0dXJuIG51bGw9PT1uLmtleT9lKyI9Iit0OiIkc2V0KCIrbi5leHArIiwgIituLmtleSsiLCAiK3QrIikifWZ1bmN0aW9uIFZyKCl7cmV0dXJuIGJyLmNoYXJDb2RlQXQoKyt3cil9ZnVuY3Rpb24genIoKXtyZXR1cm4gd3I+PV9yfWZ1bmN0aW9uIEtyKGUpe3JldHVybiAzND09PWV8fDM5PT09ZX1mdW5jdGlvbiBKcihlKXt2YXIgdD0xO2ZvcihDcj13cjshenIoKTspaWYoS3IoZT1WcigpKSlxcihlKTtlbHNlIGlmKDkxPT09ZSYmdCsrLDkzPT09ZSYmdC0tLDA9PT10KXt4cj13cjticmVha319ZnVuY3Rpb24gcXIoZSl7Zm9yKHZhciB0PWU7IXpyKCkmJihlPVZyKCkpIT09dDspO312YXIgV3IsWnI9Il9fciIsR3I9Il9fYyI7ZnVuY3Rpb24gWHIoZSx0LG4pe3ZhciByPVdyO3JldHVybiBmdW5jdGlvbiBpKCl7bnVsbCE9PXQuYXBwbHkobnVsbCxhcmd1bWVudHMpJiZlaShlLGksbixyKX19dmFyIFlyPUtlJiYhKFgmJk51bWJlcihYWzFdKTw9NTMpO2Z1bmN0aW9uIFFyKGUsdCxuLHIpe2lmKFlyKXt2YXIgaT1zbixvPXQ7dD1vLl93cmFwcGVyPWZ1bmN0aW9uKGUpe2lmKGUudGFyZ2V0PT09ZS5jdXJyZW50VGFyZ2V0fHxlLnRpbWVTdGFtcD49aXx8ZS50aW1lU3RhbXA8PTB8fGUudGFyZ2V0Lm93bmVyRG9jdW1lbnQhPT1kb2N1bWVudClyZXR1cm4gby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fVdyLmFkZEV2ZW50TGlzdGVuZXIoZSx0LFE/e2NhcHR1cmU6bixwYXNzaXZlOnJ9Om4pfWZ1bmN0aW9uIGVpKGUsdCxuLHIpeyhyfHxXcikucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQuX3dyYXBwZXJ8fHQsbil9ZnVuY3Rpb24gdGkoZSxyKXtpZighdChlLmRhdGEub24pfHwhdChyLmRhdGEub24pKXt2YXIgaT1yLmRhdGEub258fHt9LG89ZS5kYXRhLm9ufHx7fTtXcj1yLmVsbSxmdW5jdGlvbihlKXtpZihuKGVbWnJdKSl7dmFyIHQ9cT8iY2hhbmdlIjoiaW5wdXQiO2VbdF09W10uY29uY2F0KGVbWnJdLGVbdF18fFtdKSxkZWxldGUgZVtacl19bihlW0dyXSkmJihlLmNoYW5nZT1bXS5jb25jYXQoZVtHcl0sZS5jaGFuZ2V8fFtdKSxkZWxldGUgZVtHcl0pfShpKSxpdChpLG8sUXIsZWksWHIsci5jb250ZXh0KSxXcj12b2lkIDB9fXZhciBuaSxyaT17Y3JlYXRlOnRpLHVwZGF0ZTp0aX07ZnVuY3Rpb24gaWkoZSxyKXtpZighdChlLmRhdGEuZG9tUHJvcHMpfHwhdChyLmRhdGEuZG9tUHJvcHMpKXt2YXIgaSxvLGE9ci5lbG0scz1lLmRhdGEuZG9tUHJvcHN8fHt9LGM9ci5kYXRhLmRvbVByb3BzfHx7fTtmb3IoaSBpbiBuKGMuX19vYl9fKSYmKGM9ci5kYXRhLmRvbVByb3BzPUEoe30sYykpLHMpaSBpbiBjfHwoYVtpXT0iIik7Zm9yKGkgaW4gYyl7aWYobz1jW2ldLCJ0ZXh0Q29udGVudCI9PT1pfHwiaW5uZXJIVE1MIj09PWkpe2lmKHIuY2hpbGRyZW4mJihyLmNoaWxkcmVuLmxlbmd0aD0wKSxvPT09c1tpXSljb250aW51ZTsxPT09YS5jaGlsZE5vZGVzLmxlbmd0aCYmYS5yZW1vdmVDaGlsZChhLmNoaWxkTm9kZXNbMF0pfWlmKCJ2YWx1ZSI9PT1pJiYiUFJPR1JFU1MiIT09YS50YWdOYW1lKXthLl92YWx1ZT1vO3ZhciB1PXQobyk/IiI6U3RyaW5nKG8pO29pKGEsdSkmJihhLnZhbHVlPXUpfWVsc2UgaWYoImlubmVySFRNTCI9PT1pJiZXbihhLnRhZ05hbWUpJiZ0KGEuaW5uZXJIVE1MKSl7KG5pPW5pfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MPSI8c3ZnPiIrbysiPC9zdmc+Ijtmb3IodmFyIGw9bmkuZmlyc3RDaGlsZDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTtmb3IoO2wuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChsLmZpcnN0Q2hpbGQpfWVsc2UgaWYobyE9PXNbaV0pdHJ5e2FbaV09b31jYXRjaChlKXt9fX19ZnVuY3Rpb24gb2koZSx0KXtyZXR1cm4hZS5jb21wb3NpbmcmJigiT1BUSU9OIj09PWUudGFnTmFtZXx8ZnVuY3Rpb24oZSx0KXt2YXIgbj0hMDt0cnl7bj1kb2N1bWVudC5hY3RpdmVFbGVtZW50IT09ZX1jYXRjaChlKXt9cmV0dXJuIG4mJmUudmFsdWUhPT10fShlLHQpfHxmdW5jdGlvbihlLHQpe3ZhciByPWUudmFsdWUsaT1lLl92TW9kaWZpZXJzO2lmKG4oaSkpe2lmKGkubnVtYmVyKXJldHVybiBmKHIpIT09Zih0KTtpZihpLnRyaW0pcmV0dXJuIHIudHJpbSgpIT09dC50cmltKCl9cmV0dXJuIHIhPT10fShlLHQpKX12YXIgYWk9e2NyZWF0ZTppaSx1cGRhdGU6aWl9LHNpPWcoZnVuY3Rpb24oZSl7dmFyIHQ9e30sbj0vOiguKykvO3JldHVybiBlLnNwbGl0KC87KD8hW14oXSpcKSkvZykuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlKXt2YXIgcj1lLnNwbGl0KG4pO3IubGVuZ3RoPjEmJih0W3JbMF0udHJpbSgpXT1yWzFdLnRyaW0oKSl9fSksdH0pO2Z1bmN0aW9uIGNpKGUpe3ZhciB0PXVpKGUuc3R5bGUpO3JldHVybiBlLnN0YXRpY1N0eWxlP0EoZS5zdGF0aWNTdHlsZSx0KTp0fWZ1bmN0aW9uIHVpKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP08oZSk6InN0cmluZyI9PXR5cGVvZiBlP3NpKGUpOmV9dmFyIGxpLGZpPS9eLS0vLHBpPS9ccyohaW1wb3J0YW50JC8sZGk9ZnVuY3Rpb24oZSx0LG4pe2lmKGZpLnRlc3QodCkpZS5zdHlsZS5zZXRQcm9wZXJ0eSh0LG4pO2Vsc2UgaWYocGkudGVzdChuKSllLnN0eWxlLnNldFByb3BlcnR5KEModCksbi5yZXBsYWNlKHBpLCIiKSwiaW1wb3J0YW50Iik7ZWxzZXt2YXIgcj1oaSh0KTtpZihBcnJheS5pc0FycmF5KG4pKWZvcih2YXIgaT0wLG89bi5sZW5ndGg7aTxvO2krKyllLnN0eWxlW3JdPW5baV07ZWxzZSBlLnN0eWxlW3JdPW59fSx2aT1bIldlYmtpdCIsIk1veiIsIm1zIl0saGk9ZyhmdW5jdGlvbihlKXtpZihsaT1saXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsImZpbHRlciIhPT0oZT1iKGUpKSYmZSBpbiBsaSlyZXR1cm4gZTtmb3IodmFyIHQ9ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLG49MDtuPHZpLmxlbmd0aDtuKyspe3ZhciByPXZpW25dK3Q7aWYociBpbiBsaSlyZXR1cm4gcn19KTtmdW5jdGlvbiBtaShlLHIpe3ZhciBpPXIuZGF0YSxvPWUuZGF0YTtpZighKHQoaS5zdGF0aWNTdHlsZSkmJnQoaS5zdHlsZSkmJnQoby5zdGF0aWNTdHlsZSkmJnQoby5zdHlsZSkpKXt2YXIgYSxzLGM9ci5lbG0sdT1vLnN0YXRpY1N0eWxlLGw9by5ub3JtYWxpemVkU3R5bGV8fG8uc3R5bGV8fHt9LGY9dXx8bCxwPXVpKHIuZGF0YS5zdHlsZSl8fHt9O3IuZGF0YS5ub3JtYWxpemVkU3R5bGU9bihwLl9fb2JfXyk/QSh7fSxwKTpwO3ZhciBkPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj17fTtpZih0KWZvcih2YXIgaT1lO2kuY29tcG9uZW50SW5zdGFuY2U7KShpPWkuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmaS5kYXRhJiYobj1jaShpLmRhdGEpKSYmQShyLG4pOyhuPWNpKGUuZGF0YSkpJiZBKHIsbik7Zm9yKHZhciBvPWU7bz1vLnBhcmVudDspby5kYXRhJiYobj1jaShvLmRhdGEpKSYmQShyLG4pO3JldHVybiByfShyLCEwKTtmb3IocyBpbiBmKXQoZFtzXSkmJmRpKGMscywiIik7Zm9yKHMgaW4gZCkoYT1kW3NdKSE9PWZbc10mJmRpKGMscyxudWxsPT1hPyIiOmEpfX12YXIgeWk9e2NyZWF0ZTptaSx1cGRhdGU6bWl9LGdpPS9ccysvO2Z1bmN0aW9uIF9pKGUsdCl7aWYodCYmKHQ9dC50cmltKCkpKWlmKGUuY2xhc3NMaXN0KXQuaW5kZXhPZigiICIpPi0xP3Quc3BsaXQoZ2kpLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUuY2xhc3NMaXN0LmFkZCh0KX0pOmUuY2xhc3NMaXN0LmFkZCh0KTtlbHNle3ZhciBuPSIgIisoZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKSsiICI7bi5pbmRleE9mKCIgIit0KyIgIik8MCYmZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwobit0KS50cmltKCkpfX1mdW5jdGlvbiBiaShlLHQpe2lmKHQmJih0PXQudHJpbSgpKSlpZihlLmNsYXNzTGlzdCl0LmluZGV4T2YoIiAiKT4tMT90LnNwbGl0KGdpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmNsYXNzTGlzdC5yZW1vdmUodCl9KTplLmNsYXNzTGlzdC5yZW1vdmUodCksZS5jbGFzc0xpc3QubGVuZ3RofHxlLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTtlbHNle2Zvcih2YXIgbj0iICIrKGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIikrIiAiLHI9IiAiK3QrIiAiO24uaW5kZXhPZihyKT49MDspbj1uLnJlcGxhY2UociwiICIpOyhuPW4udHJpbSgpKT9lLnNldEF0dHJpYnV0ZSgiY2xhc3MiLG4pOmUucmVtb3ZlQXR0cmlidXRlKCJjbGFzcyIpfX1mdW5jdGlvbiAkaShlKXtpZihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciB0PXt9O3JldHVybiExIT09ZS5jc3MmJkEodCx3aShlLm5hbWV8fCJ2IikpLEEodCxlKSx0fXJldHVybiJzdHJpbmciPT10eXBlb2YgZT93aShlKTp2b2lkIDB9fXZhciB3aT1nKGZ1bmN0aW9uKGUpe3JldHVybntlbnRlckNsYXNzOmUrIi1lbnRlciIsZW50ZXJUb0NsYXNzOmUrIi1lbnRlci10byIsZW50ZXJBY3RpdmVDbGFzczplKyItZW50ZXItYWN0aXZlIixsZWF2ZUNsYXNzOmUrIi1sZWF2ZSIsbGVhdmVUb0NsYXNzOmUrIi1sZWF2ZS10byIsbGVhdmVBY3RpdmVDbGFzczplKyItbGVhdmUtYWN0aXZlIn19KSxDaT1WJiYhVyx4aT0idHJhbnNpdGlvbiIsa2k9ImFuaW1hdGlvbiIsQWk9InRyYW5zaXRpb24iLE9pPSJ0cmFuc2l0aW9uZW5kIixTaT0iYW5pbWF0aW9uIixUaT0iYW5pbWF0aW9uZW5kIjtDaSYmKHZvaWQgMD09PXdpbmRvdy5vbnRyYW5zaXRpb25lbmQmJnZvaWQgMCE9PXdpbmRvdy5vbndlYmtpdHRyYW5zaXRpb25lbmQmJihBaT0iV2Via2l0VHJhbnNpdGlvbiIsT2k9IndlYmtpdFRyYW5zaXRpb25FbmQiKSx2b2lkIDA9PT13aW5kb3cub25hbmltYXRpb25lbmQmJnZvaWQgMCE9PXdpbmRvdy5vbndlYmtpdGFuaW1hdGlvbmVuZCYmKFNpPSJXZWJraXRBbmltYXRpb24iLFRpPSJ3ZWJraXRBbmltYXRpb25FbmQiKSk7dmFyIE5pPVY/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpzZXRUaW1lb3V0OmZ1bmN0aW9uKGUpe3JldHVybiBlKCl9O2Z1bmN0aW9uIEVpKGUpe05pKGZ1bmN0aW9uKCl7TmkoZSl9KX1mdW5jdGlvbiBqaShlLHQpe3ZhciBuPWUuX3RyYW5zaXRpb25DbGFzc2VzfHwoZS5fdHJhbnNpdGlvbkNsYXNzZXM9W10pO24uaW5kZXhPZih0KTwwJiYobi5wdXNoKHQpLF9pKGUsdCkpfWZ1bmN0aW9uIERpKGUsdCl7ZS5fdHJhbnNpdGlvbkNsYXNzZXMmJmgoZS5fdHJhbnNpdGlvbkNsYXNzZXMsdCksYmkoZSx0KX1mdW5jdGlvbiBMaShlLHQsbil7dmFyIHI9TWkoZSx0KSxpPXIudHlwZSxvPXIudGltZW91dCxhPXIucHJvcENvdW50O2lmKCFpKXJldHVybiBuKCk7dmFyIHM9aT09PXhpP09pOlRpLGM9MCx1PWZ1bmN0aW9uKCl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKHMsbCksbigpfSxsPWZ1bmN0aW9uKHQpe3QudGFyZ2V0PT09ZSYmKytjPj1hJiZ1KCl9O3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjPGEmJnUoKX0sbysxKSxlLmFkZEV2ZW50TGlzdGVuZXIocyxsKX12YXIgSWk9L1xiKHRyYW5zZm9ybXxhbGwpKCx8JCkvO2Z1bmN0aW9uIE1pKGUsdCl7dmFyIG4scj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKSxpPShyW0FpKyJEZWxheSJdfHwiIikuc3BsaXQoIiwgIiksbz0ocltBaSsiRHVyYXRpb24iXXx8IiIpLnNwbGl0KCIsICIpLGE9RmkoaSxvKSxzPShyW1NpKyJEZWxheSJdfHwiIikuc3BsaXQoIiwgIiksYz0ocltTaSsiRHVyYXRpb24iXXx8IiIpLnNwbGl0KCIsICIpLHU9RmkocyxjKSxsPTAsZj0wO3JldHVybiB0PT09eGk/YT4wJiYobj14aSxsPWEsZj1vLmxlbmd0aCk6dD09PWtpP3U+MCYmKG49a2ksbD11LGY9Yy5sZW5ndGgpOmY9KG49KGw9TWF0aC5tYXgoYSx1KSk+MD9hPnU/eGk6a2k6bnVsbCk/bj09PXhpP28ubGVuZ3RoOmMubGVuZ3RoOjAse3R5cGU6bix0aW1lb3V0OmwscHJvcENvdW50OmYsaGFzVHJhbnNmb3JtOm49PT14aSYmSWkudGVzdChyW0FpKyJQcm9wZXJ0eSJdKX19ZnVuY3Rpb24gRmkoZSx0KXtmb3IoO2UubGVuZ3RoPHQubGVuZ3RoOyllPWUuY29uY2F0KGUpO3JldHVybiBNYXRoLm1heC5hcHBseShudWxsLHQubWFwKGZ1bmN0aW9uKHQsbil7cmV0dXJuIFBpKHQpK1BpKGVbbl0pfSkpfWZ1bmN0aW9uIFBpKGUpe3JldHVybiAxZTMqTnVtYmVyKGUuc2xpY2UoMCwtMSkucmVwbGFjZSgiLCIsIi4iKSl9ZnVuY3Rpb24gUmkoZSxyKXt2YXIgaT1lLmVsbTtuKGkuX2xlYXZlQ2IpJiYoaS5fbGVhdmVDYi5jYW5jZWxsZWQ9ITAsaS5fbGVhdmVDYigpKTt2YXIgYT0kaShlLmRhdGEudHJhbnNpdGlvbik7aWYoIXQoYSkmJiFuKGkuX2VudGVyQ2IpJiYxPT09aS5ub2RlVHlwZSl7Zm9yKHZhciBzPWEuY3NzLGM9YS50eXBlLHU9YS5lbnRlckNsYXNzLGw9YS5lbnRlclRvQ2xhc3MscD1hLmVudGVyQWN0aXZlQ2xhc3MsZD1hLmFwcGVhckNsYXNzLHY9YS5hcHBlYXJUb0NsYXNzLGg9YS5hcHBlYXJBY3RpdmVDbGFzcyxtPWEuYmVmb3JlRW50ZXIseT1hLmVudGVyLGc9YS5hZnRlckVudGVyLF89YS5lbnRlckNhbmNlbGxlZCxiPWEuYmVmb3JlQXBwZWFyLCQ9YS5hcHBlYXIsdz1hLmFmdGVyQXBwZWFyLEM9YS5hcHBlYXJDYW5jZWxsZWQseD1hLmR1cmF0aW9uLGs9WnQsQT1adC4kdm5vZGU7QSYmQS5wYXJlbnQ7KWs9QS5jb250ZXh0LEE9QS5wYXJlbnQ7dmFyIE89IWsuX2lzTW91bnRlZHx8IWUuaXNSb290SW5zZXJ0O2lmKCFPfHwkfHwiIj09PSQpe3ZhciBTPU8mJmQ/ZDp1LFQ9TyYmaD9oOnAsTj1PJiZ2P3Y6bCxFPU8mJmJ8fG0saj1PJiYiZnVuY3Rpb24iPT10eXBlb2YgJD8kOnksTD1PJiZ3fHxnLEk9TyYmQ3x8XyxNPWYobyh4KT94LmVudGVyOngpLEY9ITEhPT1zJiYhVyxQPVVpKGopLFI9aS5fZW50ZXJDYj1EKGZ1bmN0aW9uKCl7RiYmKERpKGksTiksRGkoaSxUKSksUi5jYW5jZWxsZWQ/KEYmJkRpKGksUyksSSYmSShpKSk6TCYmTChpKSxpLl9lbnRlckNiPW51bGx9KTtlLmRhdGEuc2hvd3x8b3QoZSwiaW5zZXJ0IixmdW5jdGlvbigpe3ZhciB0PWkucGFyZW50Tm9kZSxuPXQmJnQuX3BlbmRpbmcmJnQuX3BlbmRpbmdbZS5rZXldO24mJm4udGFnPT09ZS50YWcmJm4uZWxtLl9sZWF2ZUNiJiZuLmVsbS5fbGVhdmVDYigpLGomJmooaSxSKX0pLEUmJkUoaSksRiYmKGppKGksUyksamkoaSxUKSxFaShmdW5jdGlvbigpe0RpKGksUyksUi5jYW5jZWxsZWR8fChqaShpLE4pLFB8fChCaShNKT9zZXRUaW1lb3V0KFIsTSk6TGkoaSxjLFIpKSl9KSksZS5kYXRhLnNob3cmJihyJiZyKCksaiYmaihpLFIpKSxGfHxQfHxSKCl9fX1mdW5jdGlvbiBIaShlLHIpe3ZhciBpPWUuZWxtO24oaS5fZW50ZXJDYikmJihpLl9lbnRlckNiLmNhbmNlbGxlZD0hMCxpLl9lbnRlckNiKCkpO3ZhciBhPSRpKGUuZGF0YS50cmFuc2l0aW9uKTtpZih0KGEpfHwxIT09aS5ub2RlVHlwZSlyZXR1cm4gcigpO2lmKCFuKGkuX2xlYXZlQ2IpKXt2YXIgcz1hLmNzcyxjPWEudHlwZSx1PWEubGVhdmVDbGFzcyxsPWEubGVhdmVUb0NsYXNzLHA9YS5sZWF2ZUFjdGl2ZUNsYXNzLGQ9YS5iZWZvcmVMZWF2ZSx2PWEubGVhdmUsaD1hLmFmdGVyTGVhdmUsbT1hLmxlYXZlQ2FuY2VsbGVkLHk9YS5kZWxheUxlYXZlLGc9YS5kdXJhdGlvbixfPSExIT09cyYmIVcsYj1VaSh2KSwkPWYobyhnKT9nLmxlYXZlOmcpLHc9aS5fbGVhdmVDYj1EKGZ1bmN0aW9uKCl7aS5wYXJlbnROb2RlJiZpLnBhcmVudE5vZGUuX3BlbmRpbmcmJihpLnBhcmVudE5vZGUuX3BlbmRpbmdbZS5rZXldPW51bGwpLF8mJihEaShpLGwpLERpKGkscCkpLHcuY2FuY2VsbGVkPyhfJiZEaShpLHUpLG0mJm0oaSkpOihyKCksaCYmaChpKSksaS5fbGVhdmVDYj1udWxsfSk7eT95KEMpOkMoKX1mdW5jdGlvbiBDKCl7dy5jYW5jZWxsZWR8fCghZS5kYXRhLnNob3cmJmkucGFyZW50Tm9kZSYmKChpLnBhcmVudE5vZGUuX3BlbmRpbmd8fChpLnBhcmVudE5vZGUuX3BlbmRpbmc9e30pKVtlLmtleV09ZSksZCYmZChpKSxfJiYoamkoaSx1KSxqaShpLHApLEVpKGZ1bmN0aW9uKCl7RGkoaSx1KSx3LmNhbmNlbGxlZHx8KGppKGksbCksYnx8KEJpKCQpP3NldFRpbWVvdXQodywkKTpMaShpLGMsdykpKX0pKSx2JiZ2KGksdyksX3x8Ynx8dygpKX19ZnVuY3Rpb24gQmkoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlJiYhaXNOYU4oZSl9ZnVuY3Rpb24gVWkoZSl7aWYodChlKSlyZXR1cm4hMTt2YXIgcj1lLmZucztyZXR1cm4gbihyKT9VaShBcnJheS5pc0FycmF5KHIpP3JbMF06cik6KGUuX2xlbmd0aHx8ZS5sZW5ndGgpPjF9ZnVuY3Rpb24gVmkoZSx0KXshMCE9PXQuZGF0YS5zaG93JiZSaSh0KX12YXIgemk9ZnVuY3Rpb24oZSl7dmFyIG8sYSxzPXt9LGM9ZS5tb2R1bGVzLHU9ZS5ub2RlT3BzO2ZvcihvPTA7bzxpci5sZW5ndGg7KytvKWZvcihzW2lyW29dXT1bXSxhPTA7YTxjLmxlbmd0aDsrK2EpbihjW2FdW2lyW29dXSkmJnNbaXJbb11dLnB1c2goY1thXVtpcltvXV0pO2Z1bmN0aW9uIGwoZSl7dmFyIHQ9dS5wYXJlbnROb2RlKGUpO24odCkmJnUucmVtb3ZlQ2hpbGQodCxlKX1mdW5jdGlvbiBmKGUsdCxpLG8sYSxjLGwpe2lmKG4oZS5lbG0pJiZuKGMpJiYoZT1jW2xdPW1lKGUpKSxlLmlzUm9vdEluc2VydD0hYSwhZnVuY3Rpb24oZSx0LGksbyl7dmFyIGE9ZS5kYXRhO2lmKG4oYSkpe3ZhciBjPW4oZS5jb21wb25lbnRJbnN0YW5jZSkmJmEua2VlcEFsaXZlO2lmKG4oYT1hLmhvb2spJiZuKGE9YS5pbml0KSYmYShlLCExKSxuKGUuY29tcG9uZW50SW5zdGFuY2UpKXJldHVybiBkKGUsdCksdihpLGUuZWxtLG8pLHIoYykmJmZ1bmN0aW9uKGUsdCxyLGkpe2Zvcih2YXIgbyxhPWU7YS5jb21wb25lbnRJbnN0YW5jZTspaWYoYT1hLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSxuKG89YS5kYXRhKSYmbihvPW8udHJhbnNpdGlvbikpe2ZvcihvPTA7bzxzLmFjdGl2YXRlLmxlbmd0aDsrK28pcy5hY3RpdmF0ZVtvXShycixhKTt0LnB1c2goYSk7YnJlYWt9dihyLGUuZWxtLGkpfShlLHQsaSxvKSwhMH19KGUsdCxpLG8pKXt2YXIgZj1lLmRhdGEscD1lLmNoaWxkcmVuLG09ZS50YWc7bihtKT8oZS5lbG09ZS5ucz91LmNyZWF0ZUVsZW1lbnROUyhlLm5zLG0pOnUuY3JlYXRlRWxlbWVudChtLGUpLGcoZSksaChlLHAsdCksbihmKSYmeShlLHQpLHYoaSxlLmVsbSxvKSk6cihlLmlzQ29tbWVudCk/KGUuZWxtPXUuY3JlYXRlQ29tbWVudChlLnRleHQpLHYoaSxlLmVsbSxvKSk6KGUuZWxtPXUuY3JlYXRlVGV4dE5vZGUoZS50ZXh0KSx2KGksZS5lbG0sbykpfX1mdW5jdGlvbiBkKGUsdCl7bihlLmRhdGEucGVuZGluZ0luc2VydCkmJih0LnB1c2guYXBwbHkodCxlLmRhdGEucGVuZGluZ0luc2VydCksZS5kYXRhLnBlbmRpbmdJbnNlcnQ9bnVsbCksZS5lbG09ZS5jb21wb25lbnRJbnN0YW5jZS4kZWwsbShlKT8oeShlLHQpLGcoZSkpOihucihlKSx0LnB1c2goZSkpfWZ1bmN0aW9uIHYoZSx0LHIpe24oZSkmJihuKHIpP3UucGFyZW50Tm9kZShyKT09PWUmJnUuaW5zZXJ0QmVmb3JlKGUsdCxyKTp1LmFwcGVuZENoaWxkKGUsdCkpfWZ1bmN0aW9uIGgoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpZih0W3JdLG4sZS5lbG0sbnVsbCwhMCx0LHIpO2Vsc2UgaShlLnRleHQpJiZ1LmFwcGVuZENoaWxkKGUuZWxtLHUuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGUudGV4dCkpKX1mdW5jdGlvbiBtKGUpe2Zvcig7ZS5jb21wb25lbnRJbnN0YW5jZTspZT1lLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtyZXR1cm4gbihlLnRhZyl9ZnVuY3Rpb24geShlLHQpe2Zvcih2YXIgcj0wO3I8cy5jcmVhdGUubGVuZ3RoOysrcilzLmNyZWF0ZVtyXShycixlKTtuKG89ZS5kYXRhLmhvb2spJiYobihvLmNyZWF0ZSkmJm8uY3JlYXRlKHJyLGUpLG4oby5pbnNlcnQpJiZ0LnB1c2goZSkpfWZ1bmN0aW9uIGcoZSl7dmFyIHQ7aWYobih0PWUuZm5TY29wZUlkKSl1LnNldFN0eWxlU2NvcGUoZS5lbG0sdCk7ZWxzZSBmb3IodmFyIHI9ZTtyOyluKHQ9ci5jb250ZXh0KSYmbih0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZ1LnNldFN0eWxlU2NvcGUoZS5lbG0sdCkscj1yLnBhcmVudDtuKHQ9WnQpJiZ0IT09ZS5jb250ZXh0JiZ0IT09ZS5mbkNvbnRleHQmJm4odD10LiRvcHRpb25zLl9zY29wZUlkKSYmdS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpfWZ1bmN0aW9uIF8oZSx0LG4scixpLG8pe2Zvcig7cjw9aTsrK3IpZihuW3JdLG8sZSx0LCExLG4scil9ZnVuY3Rpb24gYihlKXt2YXIgdCxyLGk9ZS5kYXRhO2lmKG4oaSkpZm9yKG4odD1pLmhvb2spJiZuKHQ9dC5kZXN0cm95KSYmdChlKSx0PTA7dDxzLmRlc3Ryb3kubGVuZ3RoOysrdClzLmRlc3Ryb3lbdF0oZSk7aWYobih0PWUuY2hpbGRyZW4pKWZvcihyPTA7cjxlLmNoaWxkcmVuLmxlbmd0aDsrK3IpYihlLmNoaWxkcmVuW3JdKX1mdW5jdGlvbiAkKGUsdCxyKXtmb3IoO3Q8PXI7Kyt0KXt2YXIgaT1lW3RdO24oaSkmJihuKGkudGFnKT8odyhpKSxiKGkpKTpsKGkuZWxtKSl9fWZ1bmN0aW9uIHcoZSx0KXtpZihuKHQpfHxuKGUuZGF0YSkpe3ZhciByLGk9cy5yZW1vdmUubGVuZ3RoKzE7Zm9yKG4odCk/dC5saXN0ZW5lcnMrPWk6dD1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXswPT0tLW4ubGlzdGVuZXJzJiZsKGUpfXJldHVybiBuLmxpc3RlbmVycz10LG59KGUuZWxtLGkpLG4ocj1lLmNvbXBvbmVudEluc3RhbmNlKSYmbihyPXIuX3Zub2RlKSYmbihyLmRhdGEpJiZ3KHIsdCkscj0wO3I8cy5yZW1vdmUubGVuZ3RoOysrcilzLnJlbW92ZVtyXShlLHQpO24ocj1lLmRhdGEuaG9vaykmJm4ocj1yLnJlbW92ZSk/cihlLHQpOnQoKX1lbHNlIGwoZS5lbG0pfWZ1bmN0aW9uIEMoZSx0LHIsaSl7Zm9yKHZhciBvPXI7bzxpO28rKyl7dmFyIGE9dFtvXTtpZihuKGEpJiZvcihlLGEpKXJldHVybiBvfX1mdW5jdGlvbiB4KGUsaSxvLGEsYyxsKXtpZihlIT09aSl7bihpLmVsbSkmJm4oYSkmJihpPWFbY109bWUoaSkpO3ZhciBwPWkuZWxtPWUuZWxtO2lmKHIoZS5pc0FzeW5jUGxhY2Vob2xkZXIpKW4oaS5hc3luY0ZhY3RvcnkucmVzb2x2ZWQpP08oZS5lbG0saSxvKTppLmlzQXN5bmNQbGFjZWhvbGRlcj0hMDtlbHNlIGlmKHIoaS5pc1N0YXRpYykmJnIoZS5pc1N0YXRpYykmJmkua2V5PT09ZS5rZXkmJihyKGkuaXNDbG9uZWQpfHxyKGkuaXNPbmNlKSkpaS5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlO2Vsc2V7dmFyIGQsdj1pLmRhdGE7bih2KSYmbihkPXYuaG9vaykmJm4oZD1kLnByZXBhdGNoKSYmZChlLGkpO3ZhciBoPWUuY2hpbGRyZW4seT1pLmNoaWxkcmVuO2lmKG4odikmJm0oaSkpe2ZvcihkPTA7ZDxzLnVwZGF0ZS5sZW5ndGg7KytkKXMudXBkYXRlW2RdKGUsaSk7bihkPXYuaG9vaykmJm4oZD1kLnVwZGF0ZSkmJmQoZSxpKX10KGkudGV4dCk/bihoKSYmbih5KT9oIT09eSYmZnVuY3Rpb24oZSxyLGksbyxhKXtmb3IodmFyIHMsYyxsLHA9MCxkPTAsdj1yLmxlbmd0aC0xLGg9clswXSxtPXJbdl0seT1pLmxlbmd0aC0xLGc9aVswXSxiPWlbeV0sdz0hYTtwPD12JiZkPD15Oyl0KGgpP2g9clsrK3BdOnQobSk/bT1yWy0tdl06b3IoaCxnKT8oeChoLGcsbyxpLGQpLGg9clsrK3BdLGc9aVsrK2RdKTpvcihtLGIpPyh4KG0sYixvLGkseSksbT1yWy0tdl0sYj1pWy0teV0pOm9yKGgsYik/KHgoaCxiLG8saSx5KSx3JiZ1Lmluc2VydEJlZm9yZShlLGguZWxtLHUubmV4dFNpYmxpbmcobS5lbG0pKSxoPXJbKytwXSxiPWlbLS15XSk6b3IobSxnKT8oeChtLGcsbyxpLGQpLHcmJnUuaW5zZXJ0QmVmb3JlKGUsbS5lbG0saC5lbG0pLG09clstLXZdLGc9aVsrK2RdKToodChzKSYmKHM9YXIocixwLHYpKSx0KGM9bihnLmtleSk/c1tnLmtleV06QyhnLHIscCx2KSk/ZihnLG8sZSxoLmVsbSwhMSxpLGQpOm9yKGw9cltjXSxnKT8oeChsLGcsbyxpLGQpLHJbY109dm9pZCAwLHcmJnUuaW5zZXJ0QmVmb3JlKGUsbC5lbG0saC5lbG0pKTpmKGcsbyxlLGguZWxtLCExLGksZCksZz1pWysrZF0pO3A+dj9fKGUsdChpW3krMV0pP251bGw6aVt5KzFdLmVsbSxpLGQseSxvKTpkPnkmJiQocixwLHYpfShwLGgseSxvLGwpOm4oeSk/KG4oZS50ZXh0KSYmdS5zZXRUZXh0Q29udGVudChwLCIiKSxfKHAsbnVsbCx5LDAseS5sZW5ndGgtMSxvKSk6bihoKT8kKGgsMCxoLmxlbmd0aC0xKTpuKGUudGV4dCkmJnUuc2V0VGV4dENvbnRlbnQocCwiIik6ZS50ZXh0IT09aS50ZXh0JiZ1LnNldFRleHRDb250ZW50KHAsaS50ZXh0KSxuKHYpJiZuKGQ9di5ob29rKSYmbihkPWQucG9zdHBhdGNoKSYmZChlLGkpfX19ZnVuY3Rpb24gayhlLHQsaSl7aWYocihpKSYmbihlLnBhcmVudCkpZS5wYXJlbnQuZGF0YS5wZW5kaW5nSW5zZXJ0PXQ7ZWxzZSBmb3IodmFyIG89MDtvPHQubGVuZ3RoOysrbyl0W29dLmRhdGEuaG9vay5pbnNlcnQodFtvXSl9dmFyIEE9cCgiYXR0cnMsY2xhc3Msc3RhdGljQ2xhc3Msc3RhdGljU3R5bGUsa2V5Iik7ZnVuY3Rpb24gTyhlLHQsaSxvKXt2YXIgYSxzPXQudGFnLGM9dC5kYXRhLHU9dC5jaGlsZHJlbjtpZihvPW98fGMmJmMucHJlLHQuZWxtPWUscih0LmlzQ29tbWVudCkmJm4odC5hc3luY0ZhY3RvcnkpKXJldHVybiB0LmlzQXN5bmNQbGFjZWhvbGRlcj0hMCwhMDtpZihuKGMpJiYobihhPWMuaG9vaykmJm4oYT1hLmluaXQpJiZhKHQsITApLG4oYT10LmNvbXBvbmVudEluc3RhbmNlKSkpcmV0dXJuIGQodCxpKSwhMDtpZihuKHMpKXtpZihuKHUpKWlmKGUuaGFzQ2hpbGROb2RlcygpKWlmKG4oYT1jKSYmbihhPWEuZG9tUHJvcHMpJiZuKGE9YS5pbm5lckhUTUwpKXtpZihhIT09ZS5pbm5lckhUTUwpcmV0dXJuITF9ZWxzZXtmb3IodmFyIGw9ITAsZj1lLmZpcnN0Q2hpbGQscD0wO3A8dS5sZW5ndGg7cCsrKXtpZighZnx8IU8oZix1W3BdLGksbykpe2w9ITE7YnJlYWt9Zj1mLm5leHRTaWJsaW5nfWlmKCFsfHxmKXJldHVybiExfWVsc2UgaCh0LHUsaSk7aWYobihjKSl7dmFyIHY9ITE7Zm9yKHZhciBtIGluIGMpaWYoIUEobSkpe3Y9ITAseSh0LGkpO2JyZWFrfSF2JiZjLmNsYXNzJiZ0dChjLmNsYXNzKX19ZWxzZSBlLmRhdGEhPT10LnRleHQmJihlLmRhdGE9dC50ZXh0KTtyZXR1cm4hMH1yZXR1cm4gZnVuY3Rpb24oZSxpLG8sYSl7aWYoIXQoaSkpe3ZhciBjLGw9ITEscD1bXTtpZih0KGUpKWw9ITAsZihpLHApO2Vsc2V7dmFyIGQ9bihlLm5vZGVUeXBlKTtpZighZCYmb3IoZSxpKSl4KGUsaSxwLG51bGwsbnVsbCxhKTtlbHNle2lmKGQpe2lmKDE9PT1lLm5vZGVUeXBlJiZlLmhhc0F0dHJpYnV0ZShMKSYmKGUucmVtb3ZlQXR0cmlidXRlKEwpLG89ITApLHIobykmJk8oZSxpLHApKXJldHVybiBrKGkscCwhMCksZTtjPWUsZT1uZXcgcGUodS50YWdOYW1lKGMpLnRvTG93ZXJDYXNlKCkse30sW10sdm9pZCAwLGMpfXZhciB2PWUuZWxtLGg9dS5wYXJlbnROb2RlKHYpO2lmKGYoaSxwLHYuX2xlYXZlQ2I/bnVsbDpoLHUubmV4dFNpYmxpbmcodikpLG4oaS5wYXJlbnQpKWZvcih2YXIgeT1pLnBhcmVudCxnPW0oaSk7eTspe2Zvcih2YXIgXz0wO188cy5kZXN0cm95Lmxlbmd0aDsrK18pcy5kZXN0cm95W19dKHkpO2lmKHkuZWxtPWkuZWxtLGcpe2Zvcih2YXIgdz0wO3c8cy5jcmVhdGUubGVuZ3RoOysrdylzLmNyZWF0ZVt3XShycix5KTt2YXIgQz15LmRhdGEuaG9vay5pbnNlcnQ7aWYoQy5tZXJnZWQpZm9yKHZhciBBPTE7QTxDLmZucy5sZW5ndGg7QSsrKUMuZm5zW0FdKCl9ZWxzZSBucih5KTt5PXkucGFyZW50fW4oaCk/JChbZV0sMCwwKTpuKGUudGFnKSYmYihlKX19cmV0dXJuIGsoaSxwLGwpLGkuZWxtfW4oZSkmJmIoZSl9fSh7bm9kZU9wczplcixtb2R1bGVzOlt5cixrcixyaSxhaSx5aSxWP3tjcmVhdGU6VmksYWN0aXZhdGU6VmkscmVtb3ZlOmZ1bmN0aW9uKGUsdCl7ITAhPT1lLmRhdGEuc2hvdz9IaShlLHQpOnQoKX19Ont9XS5jb25jYXQoZHIpfSk7VyYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIixmdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7ZSYmZS52bW9kZWwmJllpKGUsImlucHV0Iil9KTt2YXIgS2k9e2luc2VydGVkOmZ1bmN0aW9uKGUsdCxuLHIpeyJzZWxlY3QiPT09bi50YWc/KHIuZWxtJiYhci5lbG0uX3ZPcHRpb25zP290KG4sInBvc3RwYXRjaCIsZnVuY3Rpb24oKXtLaS5jb21wb25lbnRVcGRhdGVkKGUsdCxuKX0pOkppKGUsdCxuLmNvbnRleHQpLGUuX3ZPcHRpb25zPVtdLm1hcC5jYWxsKGUub3B0aW9ucyxaaSkpOigidGV4dGFyZWEiPT09bi50YWd8fFluKGUudHlwZSkpJiYoZS5fdk1vZGlmaWVycz10Lm1vZGlmaWVycyx0Lm1vZGlmaWVycy5sYXp5fHwoZS5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbnN0YXJ0IixHaSksZS5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbmVuZCIsWGkpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixYaSksVyYmKGUudm1vZGVsPSEwKSkpfSxjb21wb25lbnRVcGRhdGVkOmZ1bmN0aW9uKGUsdCxuKXtpZigic2VsZWN0Ij09PW4udGFnKXtKaShlLHQsbi5jb250ZXh0KTt2YXIgcj1lLl92T3B0aW9ucyxpPWUuX3ZPcHRpb25zPVtdLm1hcC5jYWxsKGUub3B0aW9ucyxaaSk7aWYoaS5zb21lKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIUUoZSxyW3RdKX0pKShlLm11bHRpcGxlP3QudmFsdWUuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gV2koZSxpKX0pOnQudmFsdWUhPT10Lm9sZFZhbHVlJiZXaSh0LnZhbHVlLGkpKSYmWWkoZSwiY2hhbmdlIil9fX07ZnVuY3Rpb24gSmkoZSx0LG4pe3FpKGUsdCxuKSwocXx8WikmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxaShlLHQsbil9LDApfWZ1bmN0aW9uIHFpKGUsdCxuKXt2YXIgcj10LnZhbHVlLGk9ZS5tdWx0aXBsZTtpZighaXx8QXJyYXkuaXNBcnJheShyKSl7Zm9yKHZhciBvLGEscz0wLGM9ZS5vcHRpb25zLmxlbmd0aDtzPGM7cysrKWlmKGE9ZS5vcHRpb25zW3NdLGkpbz1qKHIsWmkoYSkpPi0xLGEuc2VsZWN0ZWQhPT1vJiYoYS5zZWxlY3RlZD1vKTtlbHNlIGlmKEUoWmkoYSkscikpcmV0dXJuIHZvaWQoZS5zZWxlY3RlZEluZGV4IT09cyYmKGUuc2VsZWN0ZWRJbmRleD1zKSk7aXx8KGUuc2VsZWN0ZWRJbmRleD0tMSl9fWZ1bmN0aW9uIFdpKGUsdCl7cmV0dXJuIHQuZXZlcnkoZnVuY3Rpb24odCl7cmV0dXJuIUUodCxlKX0pfWZ1bmN0aW9uIFppKGUpe3JldHVybiJfdmFsdWUiaW4gZT9lLl92YWx1ZTplLnZhbHVlfWZ1bmN0aW9uIEdpKGUpe2UudGFyZ2V0LmNvbXBvc2luZz0hMH1mdW5jdGlvbiBYaShlKXtlLnRhcmdldC5jb21wb3NpbmcmJihlLnRhcmdldC5jb21wb3Npbmc9ITEsWWkoZS50YXJnZXQsImlucHV0IikpfWZ1bmN0aW9uIFlpKGUsdCl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkhUTUxFdmVudHMiKTtuLmluaXRFdmVudCh0LCEwLCEwKSxlLmRpc3BhdGNoRXZlbnQobil9ZnVuY3Rpb24gUWkoZSl7cmV0dXJuIWUuY29tcG9uZW50SW5zdGFuY2V8fGUuZGF0YSYmZS5kYXRhLnRyYW5zaXRpb24/ZTpRaShlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSl9dmFyIGVvPXttb2RlbDpLaSxzaG93OntiaW5kOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnZhbHVlLGk9KG49UWkobikpLmRhdGEmJm4uZGF0YS50cmFuc2l0aW9uLG89ZS5fX3ZPcmlnaW5hbERpc3BsYXk9Im5vbmUiPT09ZS5zdHlsZS5kaXNwbGF5PyIiOmUuc3R5bGUuZGlzcGxheTtyJiZpPyhuLmRhdGEuc2hvdz0hMCxSaShuLGZ1bmN0aW9uKCl7ZS5zdHlsZS5kaXNwbGF5PW99KSk6ZS5zdHlsZS5kaXNwbGF5PXI/bzoibm9uZSJ9LHVwZGF0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9dC52YWx1ZTshciE9IXQub2xkVmFsdWUmJigobj1RaShuKSkuZGF0YSYmbi5kYXRhLnRyYW5zaXRpb24/KG4uZGF0YS5zaG93PSEwLHI/UmkobixmdW5jdGlvbigpe2Uuc3R5bGUuZGlzcGxheT1lLl9fdk9yaWdpbmFsRGlzcGxheX0pOkhpKG4sZnVuY3Rpb24oKXtlLnN0eWxlLmRpc3BsYXk9Im5vbmUifSkpOmUuc3R5bGUuZGlzcGxheT1yP2UuX192T3JpZ2luYWxEaXNwbGF5OiJub25lIil9LHVuYmluZDpmdW5jdGlvbihlLHQsbixyLGkpe2l8fChlLnN0eWxlLmRpc3BsYXk9ZS5fX3ZPcmlnaW5hbERpc3BsYXkpfX19LHRvPXtuYW1lOlN0cmluZyxhcHBlYXI6Qm9vbGVhbixjc3M6Qm9vbGVhbixtb2RlOlN0cmluZyx0eXBlOlN0cmluZyxlbnRlckNsYXNzOlN0cmluZyxsZWF2ZUNsYXNzOlN0cmluZyxlbnRlclRvQ2xhc3M6U3RyaW5nLGxlYXZlVG9DbGFzczpTdHJpbmcsZW50ZXJBY3RpdmVDbGFzczpTdHJpbmcsbGVhdmVBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyQ2xhc3M6U3RyaW5nLGFwcGVhckFjdGl2ZUNsYXNzOlN0cmluZyxhcHBlYXJUb0NsYXNzOlN0cmluZyxkdXJhdGlvbjpbTnVtYmVyLFN0cmluZyxPYmplY3RdfTtmdW5jdGlvbiBubyhlKXt2YXIgdD1lJiZlLmNvbXBvbmVudE9wdGlvbnM7cmV0dXJuIHQmJnQuQ3Rvci5vcHRpb25zLmFic3RyYWN0P25vKHp0KHQuY2hpbGRyZW4pKTplfWZ1bmN0aW9uIHJvKGUpe3ZhciB0PXt9LG49ZS4kb3B0aW9ucztmb3IodmFyIHIgaW4gbi5wcm9wc0RhdGEpdFtyXT1lW3JdO3ZhciBpPW4uX3BhcmVudExpc3RlbmVycztmb3IodmFyIG8gaW4gaSl0W2IobyldPWlbb107cmV0dXJuIHR9ZnVuY3Rpb24gaW8oZSx0KXtpZigvXGQta2VlcC1hbGl2ZSQvLnRlc3QodC50YWcpKXJldHVybiBlKCJrZWVwLWFsaXZlIix7cHJvcHM6dC5jb21wb25lbnRPcHRpb25zLnByb3BzRGF0YX0pfXZhciBvbz1mdW5jdGlvbihlKXtyZXR1cm4gZS50YWd8fHB0KGUpfSxhbz1mdW5jdGlvbihlKXtyZXR1cm4ic2hvdyI9PT1lLm5hbWV9LHNvPXtuYW1lOiJ0cmFuc2l0aW9uIixwcm9wczp0byxhYnN0cmFjdDohMCxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMuJHNsb3RzLmRlZmF1bHQ7aWYobiYmKG49bi5maWx0ZXIob28pKS5sZW5ndGgpe3ZhciByPXRoaXMubW9kZSxvPW5bMF07aWYoZnVuY3Rpb24oZSl7Zm9yKDtlPWUucGFyZW50OylpZihlLmRhdGEudHJhbnNpdGlvbilyZXR1cm4hMH0odGhpcy4kdm5vZGUpKXJldHVybiBvO3ZhciBhPW5vKG8pO2lmKCFhKXJldHVybiBvO2lmKHRoaXMuX2xlYXZpbmcpcmV0dXJuIGlvKGUsbyk7dmFyIHM9Il9fdHJhbnNpdGlvbi0iK3RoaXMuX3VpZCsiLSI7YS5rZXk9bnVsbD09YS5rZXk/YS5pc0NvbW1lbnQ/cysiY29tbWVudCI6cythLnRhZzppKGEua2V5KT8wPT09U3RyaW5nKGEua2V5KS5pbmRleE9mKHMpP2Eua2V5OnMrYS5rZXk6YS5rZXk7dmFyIGM9KGEuZGF0YXx8KGEuZGF0YT17fSkpLnRyYW5zaXRpb249cm8odGhpcyksdT10aGlzLl92bm9kZSxsPW5vKHUpO2lmKGEuZGF0YS5kaXJlY3RpdmVzJiZhLmRhdGEuZGlyZWN0aXZlcy5zb21lKGFvKSYmKGEuZGF0YS5zaG93PSEwKSxsJiZsLmRhdGEmJiFmdW5jdGlvbihlLHQpe3JldHVybiB0LmtleT09PWUua2V5JiZ0LnRhZz09PWUudGFnfShhLGwpJiYhcHQobCkmJighbC5jb21wb25lbnRJbnN0YW5jZXx8IWwuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLmlzQ29tbWVudCkpe3ZhciBmPWwuZGF0YS50cmFuc2l0aW9uPUEoe30sYyk7aWYoIm91dC1pbiI9PT1yKXJldHVybiB0aGlzLl9sZWF2aW5nPSEwLG90KGYsImFmdGVyTGVhdmUiLGZ1bmN0aW9uKCl7dC5fbGVhdmluZz0hMSx0LiRmb3JjZVVwZGF0ZSgpfSksaW8oZSxvKTtpZigiaW4tb3V0Ij09PXIpe2lmKHB0KGEpKXJldHVybiB1O3ZhciBwLGQ9ZnVuY3Rpb24oKXtwKCl9O290KGMsImFmdGVyRW50ZXIiLGQpLG90KGMsImVudGVyQ2FuY2VsbGVkIixkKSxvdChmLCJkZWxheUxlYXZlIixmdW5jdGlvbihlKXtwPWV9KX19cmV0dXJuIG99fX0sY289QSh7dGFnOlN0cmluZyxtb3ZlQ2xhc3M6U3RyaW5nfSx0byk7ZnVuY3Rpb24gdW8oZSl7ZS5lbG0uX21vdmVDYiYmZS5lbG0uX21vdmVDYigpLGUuZWxtLl9lbnRlckNiJiZlLmVsbS5fZW50ZXJDYigpfWZ1bmN0aW9uIGxvKGUpe2UuZGF0YS5uZXdQb3M9ZS5lbG0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9ZnVuY3Rpb24gZm8oZSl7dmFyIHQ9ZS5kYXRhLnBvcyxuPWUuZGF0YS5uZXdQb3Mscj10LmxlZnQtbi5sZWZ0LGk9dC50b3Atbi50b3A7aWYocnx8aSl7ZS5kYXRhLm1vdmVkPSEwO3ZhciBvPWUuZWxtLnN0eWxlO28udHJhbnNmb3JtPW8uV2Via2l0VHJhbnNmb3JtPSJ0cmFuc2xhdGUoIityKyJweCwiK2krInB4KSIsby50cmFuc2l0aW9uRHVyYXRpb249IjBzIn19ZGVsZXRlIGNvLm1vZGU7dmFyIHBvPXtUcmFuc2l0aW9uOnNvLFRyYW5zaXRpb25Hcm91cDp7cHJvcHM6Y28sYmVmb3JlTW91bnQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5fdXBkYXRlO3RoaXMuX3VwZGF0ZT1mdW5jdGlvbihuLHIpe3ZhciBpPUd0KGUpO2UuX19wYXRjaF9fKGUuX3Zub2RlLGUua2VwdCwhMSwhMCksZS5fdm5vZGU9ZS5rZXB0LGkoKSx0LmNhbGwoZSxuLHIpfX0scmVuZGVyOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLnRhZ3x8dGhpcy4kdm5vZGUuZGF0YS50YWd8fCJzcGFuIixuPU9iamVjdC5jcmVhdGUobnVsbCkscj10aGlzLnByZXZDaGlsZHJlbj10aGlzLmNoaWxkcmVuLGk9dGhpcy4kc2xvdHMuZGVmYXVsdHx8W10sbz10aGlzLmNoaWxkcmVuPVtdLGE9cm8odGhpcykscz0wO3M8aS5sZW5ndGg7cysrKXt2YXIgYz1pW3NdO2MudGFnJiZudWxsIT1jLmtleSYmMCE9PVN0cmluZyhjLmtleSkuaW5kZXhPZigiX192bGlzdCIpJiYoby5wdXNoKGMpLG5bYy5rZXldPWMsKGMuZGF0YXx8KGMuZGF0YT17fSkpLnRyYW5zaXRpb249YSl9aWYocil7Zm9yKHZhciB1PVtdLGw9W10sZj0wO2Y8ci5sZW5ndGg7ZisrKXt2YXIgcD1yW2ZdO3AuZGF0YS50cmFuc2l0aW9uPWEscC5kYXRhLnBvcz1wLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuW3Aua2V5XT91LnB1c2gocCk6bC5wdXNoKHApfXRoaXMua2VwdD1lKHQsbnVsbCx1KSx0aGlzLnJlbW92ZWQ9bH1yZXR1cm4gZSh0LG51bGwsbyl9LHVwZGF0ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByZXZDaGlsZHJlbix0PXRoaXMubW92ZUNsYXNzfHwodGhpcy5uYW1lfHwidiIpKyItbW92ZSI7ZS5sZW5ndGgmJnRoaXMuaGFzTW92ZShlWzBdLmVsbSx0KSYmKGUuZm9yRWFjaCh1byksZS5mb3JFYWNoKGxvKSxlLmZvckVhY2goZm8pLHRoaXMuX3JlZmxvdz1kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCxlLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZS5kYXRhLm1vdmVkKXt2YXIgbj1lLmVsbSxyPW4uc3R5bGU7amkobix0KSxyLnRyYW5zZm9ybT1yLldlYmtpdFRyYW5zZm9ybT1yLnRyYW5zaXRpb25EdXJhdGlvbj0iIixuLmFkZEV2ZW50TGlzdGVuZXIoT2ksbi5fbW92ZUNiPWZ1bmN0aW9uIGUocil7ciYmci50YXJnZXQhPT1ufHxyJiYhL3RyYW5zZm9ybSQvLnRlc3Qoci5wcm9wZXJ0eU5hbWUpfHwobi5yZW1vdmVFdmVudExpc3RlbmVyKE9pLGUpLG4uX21vdmVDYj1udWxsLERpKG4sdCkpfSl9fSkpfSxtZXRob2RzOntoYXNNb3ZlOmZ1bmN0aW9uKGUsdCl7aWYoIUNpKXJldHVybiExO2lmKHRoaXMuX2hhc01vdmUpcmV0dXJuIHRoaXMuX2hhc01vdmU7dmFyIG49ZS5jbG9uZU5vZGUoKTtlLl90cmFuc2l0aW9uQ2xhc3NlcyYmZS5fdHJhbnNpdGlvbkNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbihlKXtiaShuLGUpfSksX2kobix0KSxuLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuJGVsLmFwcGVuZENoaWxkKG4pO3ZhciByPU1pKG4pO3JldHVybiB0aGlzLiRlbC5yZW1vdmVDaGlsZChuKSx0aGlzLl9oYXNNb3ZlPXIuaGFzVHJhbnNmb3JtfX19fTtDbi5jb25maWcubXVzdFVzZVByb3A9RG4sQ24uY29uZmlnLmlzUmVzZXJ2ZWRUYWc9Wm4sQ24uY29uZmlnLmlzUmVzZXJ2ZWRBdHRyPUVuLENuLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2U9R24sQ24uY29uZmlnLmlzVW5rbm93bkVsZW1lbnQ9ZnVuY3Rpb24oZSl7aWYoIVYpcmV0dXJuITA7aWYoWm4oZSkpcmV0dXJuITE7aWYoZT1lLnRvTG93ZXJDYXNlKCksbnVsbCE9WG5bZV0pcmV0dXJuIFhuW2VdO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZSk7cmV0dXJuIGUuaW5kZXhPZigiLSIpPi0xP1huW2VdPXQuY29uc3RydWN0b3I9PT13aW5kb3cuSFRNTFVua25vd25FbGVtZW50fHx0LmNvbnN0cnVjdG9yPT09d2luZG93LkhUTUxFbGVtZW50OlhuW2VdPS9IVE1MVW5rbm93bkVsZW1lbnQvLnRlc3QodC50b1N0cmluZygpKX0sQShDbi5vcHRpb25zLmRpcmVjdGl2ZXMsZW8pLEEoQ24ub3B0aW9ucy5jb21wb25lbnRzLHBvKSxDbi5wcm90b3R5cGUuX19wYXRjaF9fPVY/emk6UyxDbi5wcm90b3R5cGUuJG1vdW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gZS4kZWw9dCxlLiRvcHRpb25zLnJlbmRlcnx8KGUuJG9wdGlvbnMucmVuZGVyPXZlKSxRdChlLCJiZWZvcmVNb3VudCIpLHI9ZnVuY3Rpb24oKXtlLl91cGRhdGUoZS5fcmVuZGVyKCksbil9LG5ldyBwbihlLHIsUyx7YmVmb3JlOmZ1bmN0aW9uKCl7ZS5faXNNb3VudGVkJiYhZS5faXNEZXN0cm95ZWQmJlF0KGUsImJlZm9yZVVwZGF0ZSIpfX0sITApLG49ITEsbnVsbD09ZS4kdm5vZGUmJihlLl9pc01vdW50ZWQ9ITAsUXQoZSwibW91bnRlZCIpKSxlfSh0aGlzLGU9ZSYmVj9RbihlKTp2b2lkIDAsdCl9LFYmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtGLmRldnRvb2xzJiZuZSYmbmUuZW1pdCgiaW5pdCIsQ24pfSwwKTt2YXIgdm89L1x7XHsoKD86Lnxccj9cbikrPylcfVx9L2csaG89L1stLiorP14ke30oKXxbXF1cL1xcXS9nLG1vPWcoZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS5yZXBsYWNlKGhvLCJcXCQmIiksbj1lWzFdLnJlcGxhY2UoaG8sIlxcJCYiKTtyZXR1cm4gbmV3IFJlZ0V4cCh0KyIoKD86LnxcXG4pKz8pIituLCJnIil9KTt2YXIgeW89e3N0YXRpY0tleXM6WyJzdGF0aWNDbGFzcyJdLHRyYW5zZm9ybU5vZGU6ZnVuY3Rpb24oZSx0KXt0Lndhcm47dmFyIG49UHIoZSwiY2xhc3MiKTtuJiYoZS5zdGF0aWNDbGFzcz1KU09OLnN0cmluZ2lmeShuKSk7dmFyIHI9RnIoZSwiY2xhc3MiLCExKTtyJiYoZS5jbGFzc0JpbmRpbmc9cil9LGdlbkRhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9IiI7cmV0dXJuIGUuc3RhdGljQ2xhc3MmJih0Kz0ic3RhdGljQ2xhc3M6IitlLnN0YXRpY0NsYXNzKyIsIiksZS5jbGFzc0JpbmRpbmcmJih0Kz0iY2xhc3M6IitlLmNsYXNzQmluZGluZysiLCIpLHR9fTt2YXIgZ28sX289e3N0YXRpY0tleXM6WyJzdGF0aWNTdHlsZSJdLHRyYW5zZm9ybU5vZGU6ZnVuY3Rpb24oZSx0KXt0Lndhcm47dmFyIG49UHIoZSwic3R5bGUiKTtuJiYoZS5zdGF0aWNTdHlsZT1KU09OLnN0cmluZ2lmeShzaShuKSkpO3ZhciByPUZyKGUsInN0eWxlIiwhMSk7ciYmKGUuc3R5bGVCaW5kaW5nPXIpfSxnZW5EYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PSIiO3JldHVybiBlLnN0YXRpY1N0eWxlJiYodCs9InN0YXRpY1N0eWxlOiIrZS5zdGF0aWNTdHlsZSsiLCIpLGUuc3R5bGVCaW5kaW5nJiYodCs9InN0eWxlOigiK2Uuc3R5bGVCaW5kaW5nKyIpLCIpLHR9fSxibz1mdW5jdGlvbihlKXtyZXR1cm4oZ289Z298fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5pbm5lckhUTUw9ZSxnby50ZXh0Q29udGVudH0sJG89cCgiYXJlYSxiYXNlLGJyLGNvbCxlbWJlZCxmcmFtZSxocixpbWcsaW5wdXQsaXNpbmRleCxrZXlnZW4sbGluayxtZXRhLHBhcmFtLHNvdXJjZSx0cmFjayx3YnIiKSx3bz1wKCJjb2xncm91cCxkZCxkdCxsaSxvcHRpb25zLHAsdGQsdGZvb3QsdGgsdGhlYWQsdHIsc291cmNlIiksQ289cCgiYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJhc2UsYmxvY2txdW90ZSxib2R5LGNhcHRpb24sY29sLGNvbGdyb3VwLGRkLGRldGFpbHMsZGlhbG9nLGRpdixkbCxkdCxmaWVsZHNldCxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsZm9ybSxoMSxoMixoMyxoNCxoNSxoNixoZWFkLGhlYWRlcixoZ3JvdXAsaHIsaHRtbCxsZWdlbmQsbGksbWVudWl0ZW0sbWV0YSxvcHRncm91cCxvcHRpb24scGFyYW0scnAscnQsc291cmNlLHN0eWxlLHN1bW1hcnksdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsdGl0bGUsdHIsdHJhY2siKSx4bz0vXlxzKihbXlxzIic8PlwvPV0rKSg/OlxzKig9KVxzKig/OiIoW14iXSopIit8JyhbXiddKiknK3woW15ccyInPTw+YF0rKSkpPy8sa289L15ccyooKD86di1bXHctXSs6fEB8OnwjKVxbW149XSs/XF1bXlxzIic8PlwvPV0qKSg/OlxzKig9KVxzKig/OiIoW14iXSopIit8JyhbXiddKiknK3woW15ccyInPTw+YF0rKSkpPy8sQW89IlthLXpBLVpfXVtcXC1cXC4wLTlfYS16QS1aIitQLnNvdXJjZSsiXSoiLE9vPSIoKD86IitBbysiXFw6KT8iK0FvKyIpIixTbz1uZXcgUmVnRXhwKCJePCIrT28pLFRvPS9eXHMqKFwvPyk+LyxObz1uZXcgUmVnRXhwKCJePFxcLyIrT28rIltePl0qPiIpLEVvPS9ePCFET0NUWVBFIFtePl0rPi9pLGpvPS9ePCFcLS0vLERvPS9ePCFcWy8sTG89cCgic2NyaXB0LHN0eWxlLHRleHRhcmVhIiwhMCksSW89e30sTW89eyImbHQ7IjoiPCIsIiZndDsiOiI+IiwiJnF1b3Q7IjonIicsIiZhbXA7IjoiJiIsIiYjMTA7IjoiXG4iLCImIzk7IjoiXHQiLCImIzM5OyI6IicifSxGbz0vJig/Omx0fGd0fHF1b3R8YW1wfCMzOSk7L2csUG89LyYoPzpsdHxndHxxdW90fGFtcHwjMzl8IzEwfCM5KTsvZyxSbz1wKCJwcmUsdGV4dGFyZWEiLCEwKSxIbz1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZSbyhlKSYmIlxuIj09PXRbMF19O2Z1bmN0aW9uIEJvKGUsdCl7dmFyIG49dD9QbzpGbztyZXR1cm4gZS5yZXBsYWNlKG4sZnVuY3Rpb24oZSl7cmV0dXJuIE1vW2VdfSl9dmFyIFVvLFZvLHpvLEtvLEpvLHFvLFdvLFpvLEdvPS9eQHxedi1vbjovLFhvPS9edi18XkB8Xjp8XiMvLFlvPS8oW1xzXFNdKj8pXHMrKD86aW58b2YpXHMrKFtcc1xTXSopLyxRbz0vLChbXixcfVxdXSopKD86LChbXixcfVxdXSopKT8kLyxlYT0vXlwofFwpJC9nLHRhPS9eXFsuKlxdJC8sbmE9LzooLiopJC8scmE9L146fF5cLnxedi1iaW5kOi8saWE9L1wuW14uXF1dKyg/PVteXF1dKiQpL2csb2E9L152LXNsb3QoOnwkKXxeIy8sYWE9L1tcclxuXS8sc2E9L1sgXGZcdFxyXG5dKy9nLGNhPWcoYm8pLHVhPSJfZW1wdHlfIjtmdW5jdGlvbiBsYShlLHQsbil7cmV0dXJue3R5cGU6MSx0YWc6ZSxhdHRyc0xpc3Q6dCxhdHRyc01hcDp5YSh0KSxyYXdBdHRyc01hcDp7fSxwYXJlbnQ6bixjaGlsZHJlbjpbXX19ZnVuY3Rpb24gZmEoZSx0KXtVbz10Lndhcm58fFRyLHFvPXQuaXNQcmVUYWd8fFQsV289dC5tdXN0VXNlUHJvcHx8VCxabz10LmdldFRhZ05hbWVzcGFjZXx8VDt0LmlzUmVzZXJ2ZWRUYWc7em89TnIodC5tb2R1bGVzLCJ0cmFuc2Zvcm1Ob2RlIiksS289TnIodC5tb2R1bGVzLCJwcmVUcmFuc2Zvcm1Ob2RlIiksSm89TnIodC5tb2R1bGVzLCJwb3N0VHJhbnNmb3JtTm9kZSIpLFZvPXQuZGVsaW1pdGVyczt2YXIgbixyLGk9W10sbz0hMSE9PXQucHJlc2VydmVXaGl0ZXNwYWNlLGE9dC53aGl0ZXNwYWNlLHM9ITEsYz0hMTtmdW5jdGlvbiB1KGUpe2lmKGwoZSksc3x8ZS5wcm9jZXNzZWR8fChlPXBhKGUsdCkpLGkubGVuZ3RofHxlPT09bnx8bi5pZiYmKGUuZWxzZWlmfHxlLmVsc2UpJiZ2YShuLHtleHA6ZS5lbHNlaWYsYmxvY2s6ZX0pLHImJiFlLmZvcmJpZGRlbilpZihlLmVsc2VpZnx8ZS5lbHNlKWE9ZSwodT1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtmb3IoO3QtLTspe2lmKDE9PT1lW3RdLnR5cGUpcmV0dXJuIGVbdF07ZS5wb3AoKX19KHIuY2hpbGRyZW4pKSYmdS5pZiYmdmEodSx7ZXhwOmEuZWxzZWlmLGJsb2NrOmF9KTtlbHNle2lmKGUuc2xvdFNjb3BlKXt2YXIgbz1lLnNsb3RUYXJnZXR8fCciZGVmYXVsdCInOyhyLnNjb3BlZFNsb3RzfHwoci5zY29wZWRTbG90cz17fSkpW29dPWV9ci5jaGlsZHJlbi5wdXNoKGUpLGUucGFyZW50PXJ9dmFyIGEsdTtlLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnNsb3RTY29wZX0pLGwoZSksZS5wcmUmJihzPSExKSxxbyhlLnRhZykmJihjPSExKTtmb3IodmFyIGY9MDtmPEpvLmxlbmd0aDtmKyspSm9bZl0oZSx0KX1mdW5jdGlvbiBsKGUpe2lmKCFjKWZvcih2YXIgdDsodD1lLmNoaWxkcmVuW2UuY2hpbGRyZW4ubGVuZ3RoLTFdKSYmMz09PXQudHlwZSYmIiAiPT09dC50ZXh0OyllLmNoaWxkcmVuLnBvcCgpfXJldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLGk9W10sbz10LmV4cGVjdEhUTUwsYT10LmlzVW5hcnlUYWd8fFQscz10LmNhbkJlTGVmdE9wZW5UYWd8fFQsYz0wO2U7KXtpZihuPWUsciYmTG8ocikpe3ZhciB1PTAsbD1yLnRvTG93ZXJDYXNlKCksZj1Jb1tsXXx8KElvW2xdPW5ldyBSZWdFeHAoIihbXFxzXFxTXSo/KSg8LyIrbCsiW14+XSo+KSIsImkiKSkscD1lLnJlcGxhY2UoZixmdW5jdGlvbihlLG4scil7cmV0dXJuIHU9ci5sZW5ndGgsTG8obCl8fCJub3NjcmlwdCI9PT1sfHwobj1uLnJlcGxhY2UoLzwhXC0tKFtcc1xTXSo/KS0tPi9nLCIkMSIpLnJlcGxhY2UoLzwhXFtDREFUQVxbKFtcc1xTXSo/KV1dPi9nLCIkMSIpKSxIbyhsLG4pJiYobj1uLnNsaWNlKDEpKSx0LmNoYXJzJiZ0LmNoYXJzKG4pLCIifSk7Yys9ZS5sZW5ndGgtcC5sZW5ndGgsZT1wLEEobCxjLXUsYyl9ZWxzZXt2YXIgZD1lLmluZGV4T2YoIjwiKTtpZigwPT09ZCl7aWYoam8udGVzdChlKSl7dmFyIHY9ZS5pbmRleE9mKCItLVx4M2UiKTtpZih2Pj0wKXt0LnNob3VsZEtlZXBDb21tZW50JiZ0LmNvbW1lbnQoZS5zdWJzdHJpbmcoNCx2KSxjLGMrdiszKSxDKHYrMyk7Y29udGludWV9fWlmKERvLnRlc3QoZSkpe3ZhciBoPWUuaW5kZXhPZigiXT4iKTtpZihoPj0wKXtDKGgrMik7Y29udGludWV9fXZhciBtPWUubWF0Y2goRW8pO2lmKG0pe0MobVswXS5sZW5ndGgpO2NvbnRpbnVlfXZhciB5PWUubWF0Y2goTm8pO2lmKHkpe3ZhciBnPWM7Qyh5WzBdLmxlbmd0aCksQSh5WzFdLGcsYyk7Y29udGludWV9dmFyIF89eCgpO2lmKF8pe2soXyksSG8oXy50YWdOYW1lLGUpJiZDKDEpO2NvbnRpbnVlfX12YXIgYj12b2lkIDAsJD12b2lkIDAsdz12b2lkIDA7aWYoZD49MCl7Zm9yKCQ9ZS5zbGljZShkKTshKE5vLnRlc3QoJCl8fFNvLnRlc3QoJCl8fGpvLnRlc3QoJCl8fERvLnRlc3QoJCl8fCh3PSQuaW5kZXhPZigiPCIsMSkpPDApOylkKz13LCQ9ZS5zbGljZShkKTtiPWUuc3Vic3RyaW5nKDAsZCl9ZDwwJiYoYj1lKSxiJiZDKGIubGVuZ3RoKSx0LmNoYXJzJiZiJiZ0LmNoYXJzKGIsYy1iLmxlbmd0aCxjKX1pZihlPT09bil7dC5jaGFycyYmdC5jaGFycyhlKTticmVha319ZnVuY3Rpb24gQyh0KXtjKz10LGU9ZS5zdWJzdHJpbmcodCl9ZnVuY3Rpb24geCgpe3ZhciB0PWUubWF0Y2goU28pO2lmKHQpe3ZhciBuLHIsaT17dGFnTmFtZTp0WzFdLGF0dHJzOltdLHN0YXJ0OmN9O2ZvcihDKHRbMF0ubGVuZ3RoKTshKG49ZS5tYXRjaChUbykpJiYocj1lLm1hdGNoKGtvKXx8ZS5tYXRjaCh4bykpOylyLnN0YXJ0PWMsQyhyWzBdLmxlbmd0aCksci5lbmQ9YyxpLmF0dHJzLnB1c2gocik7aWYobilyZXR1cm4gaS51bmFyeVNsYXNoPW5bMV0sQyhuWzBdLmxlbmd0aCksaS5lbmQ9YyxpfX1mdW5jdGlvbiBrKGUpe3ZhciBuPWUudGFnTmFtZSxjPWUudW5hcnlTbGFzaDtvJiYoInAiPT09ciYmQ28obikmJkEocikscyhuKSYmcj09PW4mJkEobikpO2Zvcih2YXIgdT1hKG4pfHwhIWMsbD1lLmF0dHJzLmxlbmd0aCxmPW5ldyBBcnJheShsKSxwPTA7cDxsO3ArKyl7dmFyIGQ9ZS5hdHRyc1twXSx2PWRbM118fGRbNF18fGRbNV18fCIiLGg9ImEiPT09biYmImhyZWYiPT09ZFsxXT90LnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjp0LnNob3VsZERlY29kZU5ld2xpbmVzO2ZbcF09e25hbWU6ZFsxXSx2YWx1ZTpCbyh2LGgpfX11fHwoaS5wdXNoKHt0YWc6bixsb3dlckNhc2VkVGFnOm4udG9Mb3dlckNhc2UoKSxhdHRyczpmLHN0YXJ0OmUuc3RhcnQsZW5kOmUuZW5kfSkscj1uKSx0LnN0YXJ0JiZ0LnN0YXJ0KG4sZix1LGUuc3RhcnQsZS5lbmQpfWZ1bmN0aW9uIEEoZSxuLG8pe3ZhciBhLHM7aWYobnVsbD09biYmKG49YyksbnVsbD09byYmKG89YyksZSlmb3Iocz1lLnRvTG93ZXJDYXNlKCksYT1pLmxlbmd0aC0xO2E+PTAmJmlbYV0ubG93ZXJDYXNlZFRhZyE9PXM7YS0tKTtlbHNlIGE9MDtpZihhPj0wKXtmb3IodmFyIHU9aS5sZW5ndGgtMTt1Pj1hO3UtLSl0LmVuZCYmdC5lbmQoaVt1XS50YWcsbixvKTtpLmxlbmd0aD1hLHI9YSYmaVthLTFdLnRhZ31lbHNlImJyIj09PXM/dC5zdGFydCYmdC5zdGFydChlLFtdLCEwLG4sbyk6InAiPT09cyYmKHQuc3RhcnQmJnQuc3RhcnQoZSxbXSwhMSxuLG8pLHQuZW5kJiZ0LmVuZChlLG4sbykpfUEoKX0oZSx7d2FybjpVbyxleHBlY3RIVE1MOnQuZXhwZWN0SFRNTCxpc1VuYXJ5VGFnOnQuaXNVbmFyeVRhZyxjYW5CZUxlZnRPcGVuVGFnOnQuY2FuQmVMZWZ0T3BlblRhZyxzaG91bGREZWNvZGVOZXdsaW5lczp0LnNob3VsZERlY29kZU5ld2xpbmVzLHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjp0LnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZixzaG91bGRLZWVwQ29tbWVudDp0LmNvbW1lbnRzLG91dHB1dFNvdXJjZVJhbmdlOnQub3V0cHV0U291cmNlUmFuZ2Usc3RhcnQ6ZnVuY3Rpb24oZSxvLGEsbCxmKXt2YXIgcD1yJiZyLm5zfHxabyhlKTtxJiYic3ZnIj09PXAmJihvPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07Z2EudGVzdChyLm5hbWUpfHwoci5uYW1lPXIubmFtZS5yZXBsYWNlKF9hLCIiKSx0LnB1c2gocikpfXJldHVybiB0fShvKSk7dmFyIGQsdj1sYShlLG8scik7cCYmKHYubnM9cCksInN0eWxlIiE9PShkPXYpLnRhZyYmKCJzY3JpcHQiIT09ZC50YWd8fGQuYXR0cnNNYXAudHlwZSYmInRleHQvamF2YXNjcmlwdCIhPT1kLmF0dHJzTWFwLnR5cGUpfHx0ZSgpfHwodi5mb3JiaWRkZW49ITApO2Zvcih2YXIgaD0wO2g8S28ubGVuZ3RoO2grKyl2PUtvW2hdKHYsdCl8fHY7c3x8KCFmdW5jdGlvbihlKXtudWxsIT1QcihlLCJ2LXByZSIpJiYoZS5wcmU9ITApfSh2KSx2LnByZSYmKHM9ITApKSxxbyh2LnRhZykmJihjPSEwKSxzP2Z1bmN0aW9uKGUpe3ZhciB0PWUuYXR0cnNMaXN0LG49dC5sZW5ndGg7aWYobilmb3IodmFyIHI9ZS5hdHRycz1uZXcgQXJyYXkobiksaT0wO2k8bjtpKyspcltpXT17bmFtZTp0W2ldLm5hbWUsdmFsdWU6SlNPTi5zdHJpbmdpZnkodFtpXS52YWx1ZSl9LG51bGwhPXRbaV0uc3RhcnQmJihyW2ldLnN0YXJ0PXRbaV0uc3RhcnQscltpXS5lbmQ9dFtpXS5lbmQpO2Vsc2UgZS5wcmV8fChlLnBsYWluPSEwKX0odik6di5wcm9jZXNzZWR8fChkYSh2KSxmdW5jdGlvbihlKXt2YXIgdD1QcihlLCJ2LWlmIik7aWYodCllLmlmPXQsdmEoZSx7ZXhwOnQsYmxvY2s6ZX0pO2Vsc2V7bnVsbCE9UHIoZSwidi1lbHNlIikmJihlLmVsc2U9ITApO3ZhciBuPVByKGUsInYtZWxzZS1pZiIpO24mJihlLmVsc2VpZj1uKX19KHYpLGZ1bmN0aW9uKGUpe251bGwhPVByKGUsInYtb25jZSIpJiYoZS5vbmNlPSEwKX0odikpLG58fChuPXYpLGE/dSh2KToocj12LGkucHVzaCh2KSl9LGVuZDpmdW5jdGlvbihlLHQsbil7dmFyIG89aVtpLmxlbmd0aC0xXTtpLmxlbmd0aC09MSxyPWlbaS5sZW5ndGgtMV0sdShvKX0sY2hhcnM6ZnVuY3Rpb24oZSx0LG4pe2lmKHImJighcXx8InRleHRhcmVhIiE9PXIudGFnfHxyLmF0dHJzTWFwLnBsYWNlaG9sZGVyIT09ZSkpe3ZhciBpLHUsbCxmPXIuY2hpbGRyZW47aWYoZT1jfHxlLnRyaW0oKT8ic2NyaXB0Ij09PShpPXIpLnRhZ3x8InN0eWxlIj09PWkudGFnP2U6Y2EoZSk6Zi5sZW5ndGg/YT8iY29uZGVuc2UiPT09YSYmYWEudGVzdChlKT8iIjoiICI6bz8iICI6IiI6IiIpY3x8ImNvbmRlbnNlIiE9PWF8fChlPWUucmVwbGFjZShzYSwiICIpKSwhcyYmIiAiIT09ZSYmKHU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10P21vKHQpOnZvO2lmKG4udGVzdChlKSl7Zm9yKHZhciByLGksbyxhPVtdLHM9W10sYz1uLmxhc3RJbmRleD0wO3I9bi5leGVjKGUpOyl7KGk9ci5pbmRleCk+YyYmKHMucHVzaChvPWUuc2xpY2UoYyxpKSksYS5wdXNoKEpTT04uc3RyaW5naWZ5KG8pKSk7dmFyIHU9T3IoclsxXS50cmltKCkpO2EucHVzaCgiX3MoIit1KyIpIikscy5wdXNoKHsiQGJpbmRpbmciOnV9KSxjPWkrclswXS5sZW5ndGh9cmV0dXJuIGM8ZS5sZW5ndGgmJihzLnB1c2gobz1lLnNsaWNlKGMpKSxhLnB1c2goSlNPTi5zdHJpbmdpZnkobykpKSx7ZXhwcmVzc2lvbjphLmpvaW4oIisiKSx0b2tlbnM6c319fShlLFZvKSk/bD17dHlwZToyLGV4cHJlc3Npb246dS5leHByZXNzaW9uLHRva2Vuczp1LnRva2Vucyx0ZXh0OmV9OiIgIj09PWUmJmYubGVuZ3RoJiYiICI9PT1mW2YubGVuZ3RoLTFdLnRleHR8fChsPXt0eXBlOjMsdGV4dDplfSksbCYmZi5wdXNoKGwpfX0sY29tbWVudDpmdW5jdGlvbihlLHQsbil7aWYocil7dmFyIGk9e3R5cGU6Myx0ZXh0OmUsaXNDb21tZW50OiEwfTtyLmNoaWxkcmVuLnB1c2goaSl9fX0pLG59ZnVuY3Rpb24gcGEoZSx0KXt2YXIgbixyOyhyPUZyKG49ZSwia2V5IikpJiYobi5rZXk9ciksZS5wbGFpbj0hZS5rZXkmJiFlLnNjb3BlZFNsb3RzJiYhZS5hdHRyc0xpc3QubGVuZ3RoLGZ1bmN0aW9uKGUpe3ZhciB0PUZyKGUsInJlZiIpO3QmJihlLnJlZj10LGUucmVmSW5Gb3I9ZnVuY3Rpb24oZSl7dmFyIHQ9ZTtmb3IoO3Q7KXtpZih2b2lkIDAhPT10LmZvcilyZXR1cm4hMDt0PXQucGFyZW50fXJldHVybiExfShlKSl9KGUpLGZ1bmN0aW9uKGUpe3ZhciB0OyJ0ZW1wbGF0ZSI9PT1lLnRhZz8odD1QcihlLCJzY29wZSIpLGUuc2xvdFNjb3BlPXR8fFByKGUsInNsb3Qtc2NvcGUiKSk6KHQ9UHIoZSwic2xvdC1zY29wZSIpKSYmKGUuc2xvdFNjb3BlPXQpO3ZhciBuPUZyKGUsInNsb3QiKTtuJiYoZS5zbG90VGFyZ2V0PSciIic9PT1uPyciZGVmYXVsdCInOm4sZS5zbG90VGFyZ2V0RHluYW1pYz0hKCFlLmF0dHJzTWFwWyI6c2xvdCJdJiYhZS5hdHRyc01hcFsidi1iaW5kOnNsb3QiXSksInRlbXBsYXRlIj09PWUudGFnfHxlLnNsb3RTY29wZXx8anIoZSwic2xvdCIsbixmdW5jdGlvbihlLHQpe3JldHVybiBlLnJhd0F0dHJzTWFwWyI6Iit0XXx8ZS5yYXdBdHRyc01hcFsidi1iaW5kOiIrdF18fGUucmF3QXR0cnNNYXBbdF19KGUsInNsb3QiKSkpO2lmKCJ0ZW1wbGF0ZSI9PT1lLnRhZyl7dmFyIHI9UnIoZSxvYSk7aWYocil7dmFyIGk9aGEociksbz1pLm5hbWUsYT1pLmR5bmFtaWM7ZS5zbG90VGFyZ2V0PW8sZS5zbG90VGFyZ2V0RHluYW1pYz1hLGUuc2xvdFNjb3BlPXIudmFsdWV8fHVhfX1lbHNle3ZhciBzPVJyKGUsb2EpO2lmKHMpe3ZhciBjPWUuc2NvcGVkU2xvdHN8fChlLnNjb3BlZFNsb3RzPXt9KSx1PWhhKHMpLGw9dS5uYW1lLGY9dS5keW5hbWljLHA9Y1tsXT1sYSgidGVtcGxhdGUiLFtdLGUpO3Auc2xvdFRhcmdldD1sLHAuc2xvdFRhcmdldER5bmFtaWM9ZixwLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGUpe2lmKCFlLnNsb3RTY29wZSlyZXR1cm4gZS5wYXJlbnQ9cCwhMH0pLHAuc2xvdFNjb3BlPXMudmFsdWV8fHVhLGUuY2hpbGRyZW49W10sZS5wbGFpbj0hMX19fShlKSxmdW5jdGlvbihlKXsic2xvdCI9PT1lLnRhZyYmKGUuc2xvdE5hbWU9RnIoZSwibmFtZSIpKX0oZSksZnVuY3Rpb24oZSl7dmFyIHQ7KHQ9RnIoZSwiaXMiKSkmJihlLmNvbXBvbmVudD10KTtudWxsIT1QcihlLCJpbmxpbmUtdGVtcGxhdGUiKSYmKGUuaW5saW5lVGVtcGxhdGU9ITApfShlKTtmb3IodmFyIGk9MDtpPHpvLmxlbmd0aDtpKyspZT16b1tpXShlLHQpfHxlO3JldHVybiBmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyxjLHU9ZS5hdHRyc0xpc3Q7Zm9yKHQ9MCxuPXUubGVuZ3RoO3Q8bjt0KyspaWYocj1pPXVbdF0ubmFtZSxvPXVbdF0udmFsdWUsWG8udGVzdChyKSlpZihlLmhhc0JpbmRpbmdzPSEwLChhPW1hKHIucmVwbGFjZShYbywiIikpKSYmKHI9ci5yZXBsYWNlKGlhLCIiKSkscmEudGVzdChyKSlyPXIucmVwbGFjZShyYSwiIiksbz1PcihvKSwoYz10YS50ZXN0KHIpKSYmKHI9ci5zbGljZSgxLC0xKSksYSYmKGEucHJvcCYmIWMmJiJpbm5lckh0bWwiPT09KHI9YihyKSkmJihyPSJpbm5lckhUTUwiKSxhLmNhbWVsJiYhYyYmKHI9YihyKSksYS5zeW5jJiYocz1VcihvLCIkZXZlbnQiKSxjP01yKGUsJyJ1cGRhdGU6IisoJytyKyIpIixzLG51bGwsITEsMCx1W3RdLCEwKTooTXIoZSwidXBkYXRlOiIrYihyKSxzLG51bGwsITEsMCx1W3RdKSxDKHIpIT09YihyKSYmTXIoZSwidXBkYXRlOiIrQyhyKSxzLG51bGwsITEsMCx1W3RdKSkpKSxhJiZhLnByb3B8fCFlLmNvbXBvbmVudCYmV28oZS50YWcsZS5hdHRyc01hcC50eXBlLHIpP0VyKGUscixvLHVbdF0sYyk6anIoZSxyLG8sdVt0XSxjKTtlbHNlIGlmKEdvLnRlc3Qocikpcj1yLnJlcGxhY2UoR28sIiIpLChjPXRhLnRlc3QocikpJiYocj1yLnNsaWNlKDEsLTEpKSxNcihlLHIsbyxhLCExLDAsdVt0XSxjKTtlbHNle3ZhciBsPShyPXIucmVwbGFjZShYbywiIikpLm1hdGNoKG5hKSxmPWwmJmxbMV07Yz0hMSxmJiYocj1yLnNsaWNlKDAsLShmLmxlbmd0aCsxKSksdGEudGVzdChmKSYmKGY9Zi5zbGljZSgxLC0xKSxjPSEwKSksTHIoZSxyLGksbyxmLGMsYSx1W3RdKX1lbHNlIGpyKGUscixKU09OLnN0cmluZ2lmeShvKSx1W3RdKSwhZS5jb21wb25lbnQmJiJtdXRlZCI9PT1yJiZXbyhlLnRhZyxlLmF0dHJzTWFwLnR5cGUscikmJkVyKGUsciwidHJ1ZSIsdVt0XSl9KGUpLGV9ZnVuY3Rpb24gZGEoZSl7dmFyIHQ7aWYodD1QcihlLCJ2LWZvciIpKXt2YXIgbj1mdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKFlvKTtpZighdClyZXR1cm47dmFyIG49e307bi5mb3I9dFsyXS50cmltKCk7dmFyIHI9dFsxXS50cmltKCkucmVwbGFjZShlYSwiIiksaT1yLm1hdGNoKFFvKTtpPyhuLmFsaWFzPXIucmVwbGFjZShRbywiIikudHJpbSgpLG4uaXRlcmF0b3IxPWlbMV0udHJpbSgpLGlbMl0mJihuLml0ZXJhdG9yMj1pWzJdLnRyaW0oKSkpOm4uYWxpYXM9cjtyZXR1cm4gbn0odCk7biYmQShlLG4pfX1mdW5jdGlvbiB2YShlLHQpe2UuaWZDb25kaXRpb25zfHwoZS5pZkNvbmRpdGlvbnM9W10pLGUuaWZDb25kaXRpb25zLnB1c2godCl9ZnVuY3Rpb24gaGEoZSl7dmFyIHQ9ZS5uYW1lLnJlcGxhY2Uob2EsIiIpO3JldHVybiB0fHwiIyIhPT1lLm5hbWVbMF0mJih0PSJkZWZhdWx0IiksdGEudGVzdCh0KT97bmFtZTp0LnNsaWNlKDEsLTEpLGR5bmFtaWM6ITB9OntuYW1lOiciJyt0KyciJyxkeW5hbWljOiExfX1mdW5jdGlvbiBtYShlKXt2YXIgdD1lLm1hdGNoKGlhKTtpZih0KXt2YXIgbj17fTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZS5zbGljZSgxKV09ITB9KSxufX1mdW5jdGlvbiB5YShlKXtmb3IodmFyIHQ9e30sbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0W2Vbbl0ubmFtZV09ZVtuXS52YWx1ZTtyZXR1cm4gdH12YXIgZ2E9L154bWxuczpOU1xkKy8sX2E9L15OU1xkKzovO2Z1bmN0aW9uIGJhKGUpe3JldHVybiBsYShlLnRhZyxlLmF0dHJzTGlzdC5zbGljZSgpLGUucGFyZW50KX12YXIgJGE9W3lvLF9vLHtwcmVUcmFuc2Zvcm1Ob2RlOmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0Ij09PWUudGFnKXt2YXIgbixyPWUuYXR0cnNNYXA7aWYoIXJbInYtbW9kZWwiXSlyZXR1cm47aWYoKHJbIjp0eXBlIl18fHJbInYtYmluZDp0eXBlIl0pJiYobj1GcihlLCJ0eXBlIikpLHIudHlwZXx8bnx8IXJbInYtYmluZCJdfHwobj0iKCIrclsidi1iaW5kIl0rIikudHlwZSIpLG4pe3ZhciBpPVByKGUsInYtaWYiLCEwKSxvPWk/IiYmKCIraSsiKSI6IiIsYT1udWxsIT1QcihlLCJ2LWVsc2UiLCEwKSxzPVByKGUsInYtZWxzZS1pZiIsITApLGM9YmEoZSk7ZGEoYyksRHIoYywidHlwZSIsImNoZWNrYm94IikscGEoYyx0KSxjLnByb2Nlc3NlZD0hMCxjLmlmPSIoIituKyIpPT09J2NoZWNrYm94JyIrbyx2YShjLHtleHA6Yy5pZixibG9jazpjfSk7dmFyIHU9YmEoZSk7UHIodSwidi1mb3IiLCEwKSxEcih1LCJ0eXBlIiwicmFkaW8iKSxwYSh1LHQpLHZhKGMse2V4cDoiKCIrbisiKT09PSdyYWRpbyciK28sYmxvY2s6dX0pO3ZhciBsPWJhKGUpO3JldHVybiBQcihsLCJ2LWZvciIsITApLERyKGwsIjp0eXBlIixuKSxwYShsLHQpLHZhKGMse2V4cDppLGJsb2NrOmx9KSxhP2MuZWxzZT0hMDpzJiYoYy5lbHNlaWY9cyksY319fX1dO3ZhciB3YSxDYSx4YT17ZXhwZWN0SFRNTDohMCxtb2R1bGVzOiRhLGRpcmVjdGl2ZXM6e21vZGVsOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnZhbHVlLGk9dC5tb2RpZmllcnMsbz1lLnRhZyxhPWUuYXR0cnNNYXAudHlwZTtpZihlLmNvbXBvbmVudClyZXR1cm4gQnIoZSxyLGkpLCExO2lmKCJzZWxlY3QiPT09bykhZnVuY3Rpb24oZSx0LG4pe3ZhciByPSd2YXIgJCRzZWxlY3RlZFZhbCA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCgkZXZlbnQudGFyZ2V0Lm9wdGlvbnMsZnVuY3Rpb24obyl7cmV0dXJuIG8uc2VsZWN0ZWR9KS5tYXAoZnVuY3Rpb24obyl7dmFyIHZhbCA9ICJfdmFsdWUiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWU7cmV0dXJuICcrKG4mJm4ubnVtYmVyPyJfbih2YWwpIjoidmFsIikrIn0pOyI7cj1yKyIgIitVcih0LCIkZXZlbnQudGFyZ2V0Lm11bHRpcGxlID8gJCRzZWxlY3RlZFZhbCA6ICQkc2VsZWN0ZWRWYWxbMF0iKSxNcihlLCJjaGFuZ2UiLHIsbnVsbCwhMCl9KGUscixpKTtlbHNlIGlmKCJpbnB1dCI9PT1vJiYiY2hlY2tib3giPT09YSkhZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4mJm4ubnVtYmVyLGk9RnIoZSwidmFsdWUiKXx8Im51bGwiLG89RnIoZSwidHJ1ZS12YWx1ZSIpfHwidHJ1ZSIsYT1GcihlLCJmYWxzZS12YWx1ZSIpfHwiZmFsc2UiO0VyKGUsImNoZWNrZWQiLCJBcnJheS5pc0FycmF5KCIrdCsiKT9faSgiK3QrIiwiK2krIik+LTEiKygidHJ1ZSI9PT1vPyI6KCIrdCsiKSI6IjpfcSgiK3QrIiwiK28rIikiKSksTXIoZSwiY2hhbmdlIiwidmFyICQkYT0iK3QrIiwkJGVsPSRldmVudC50YXJnZXQsJCRjPSQkZWwuY2hlY2tlZD8oIitvKyIpOigiK2ErIik7aWYoQXJyYXkuaXNBcnJheSgkJGEpKXt2YXIgJCR2PSIrKHI/Il9uKCIraSsiKSI6aSkrIiwkJGk9X2koJCRhLCQkdik7aWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIrVXIodCwiJCRhLmNvbmNhdChbJCR2XSkiKSsiKX1lbHNleyQkaT4tMSYmKCIrVXIodCwiJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSkiKSsiKX19ZWxzZXsiK1VyKHQsIiQkYyIpKyJ9IixudWxsLCEwKX0oZSxyLGkpO2Vsc2UgaWYoImlucHV0Ij09PW8mJiJyYWRpbyI9PT1hKSFmdW5jdGlvbihlLHQsbil7dmFyIHI9biYmbi5udW1iZXIsaT1GcihlLCJ2YWx1ZSIpfHwibnVsbCI7RXIoZSwiY2hlY2tlZCIsIl9xKCIrdCsiLCIrKGk9cj8iX24oIitpKyIpIjppKSsiKSIpLE1yKGUsImNoYW5nZSIsVXIodCxpKSxudWxsLCEwKX0oZSxyLGkpO2Vsc2UgaWYoImlucHV0Ij09PW98fCJ0ZXh0YXJlYSI9PT1vKSFmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5hdHRyc01hcC50eXBlLGk9bnx8e30sbz1pLmxhenksYT1pLm51bWJlcixzPWkudHJpbSxjPSFvJiYicmFuZ2UiIT09cix1PW8/ImNoYW5nZSI6InJhbmdlIj09PXI/WnI6ImlucHV0IixsPSIkZXZlbnQudGFyZ2V0LnZhbHVlIjtzJiYobD0iJGV2ZW50LnRhcmdldC52YWx1ZS50cmltKCkiKSxhJiYobD0iX24oIitsKyIpIik7dmFyIGY9VXIodCxsKTtjJiYoZj0iaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuOyIrZiksRXIoZSwidmFsdWUiLCIoIit0KyIpIiksTXIoZSx1LGYsbnVsbCwhMCksKHN8fGEpJiZNcihlLCJibHVyIiwiJGZvcmNlVXBkYXRlKCkiKX0oZSxyLGkpO2Vsc2UgaWYoIUYuaXNSZXNlcnZlZFRhZyhvKSlyZXR1cm4gQnIoZSxyLGkpLCExO3JldHVybiEwfSx0ZXh0OmZ1bmN0aW9uKGUsdCl7dC52YWx1ZSYmRXIoZSwidGV4dENvbnRlbnQiLCJfcygiK3QudmFsdWUrIikiLHQpfSxodG1sOmZ1bmN0aW9uKGUsdCl7dC52YWx1ZSYmRXIoZSwiaW5uZXJIVE1MIiwiX3MoIit0LnZhbHVlKyIpIix0KX19LGlzUHJlVGFnOmZ1bmN0aW9uKGUpe3JldHVybiJwcmUiPT09ZX0saXNVbmFyeVRhZzokbyxtdXN0VXNlUHJvcDpEbixjYW5CZUxlZnRPcGVuVGFnOndvLGlzUmVzZXJ2ZWRUYWc6Wm4sZ2V0VGFnTmFtZXNwYWNlOkduLHN0YXRpY0tleXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uY2F0KHQuc3RhdGljS2V5c3x8W10pfSxbXSkuam9pbigiLCIpfSgkYSl9LGthPWcoZnVuY3Rpb24oZSl7cmV0dXJuIHAoInR5cGUsdGFnLGF0dHJzTGlzdCxhdHRyc01hcCxwbGFpbixwYXJlbnQsY2hpbGRyZW4sYXR0cnMsc3RhcnQsZW5kLHJhd0F0dHJzTWFwIisoZT8iLCIrZToiIikpfSk7ZnVuY3Rpb24gQWEoZSx0KXtlJiYod2E9a2EodC5zdGF0aWNLZXlzfHwiIiksQ2E9dC5pc1Jlc2VydmVkVGFnfHxULGZ1bmN0aW9uIGUodCl7dC5zdGF0aWM9ZnVuY3Rpb24oZSl7aWYoMj09PWUudHlwZSlyZXR1cm4hMTtpZigzPT09ZS50eXBlKXJldHVybiEwO3JldHVybiEoIWUucHJlJiYoZS5oYXNCaW5kaW5nc3x8ZS5pZnx8ZS5mb3J8fGQoZS50YWcpfHwhQ2EoZS50YWcpfHxmdW5jdGlvbihlKXtmb3IoO2UucGFyZW50Oyl7aWYoInRlbXBsYXRlIiE9PShlPWUucGFyZW50KS50YWcpcmV0dXJuITE7aWYoZS5mb3IpcmV0dXJuITB9cmV0dXJuITF9KGUpfHwhT2JqZWN0LmtleXMoZSkuZXZlcnkod2EpKSl9KHQpO2lmKDE9PT10LnR5cGUpe2lmKCFDYSh0LnRhZykmJiJzbG90IiE9PXQudGFnJiZudWxsPT10LmF0dHJzTWFwWyJpbmxpbmUtdGVtcGxhdGUiXSlyZXR1cm47Zm9yKHZhciBuPTAscj10LmNoaWxkcmVuLmxlbmd0aDtuPHI7bisrKXt2YXIgaT10LmNoaWxkcmVuW25dO2UoaSksaS5zdGF0aWN8fCh0LnN0YXRpYz0hMSl9aWYodC5pZkNvbmRpdGlvbnMpZm9yKHZhciBvPTEsYT10LmlmQ29uZGl0aW9ucy5sZW5ndGg7bzxhO28rKyl7dmFyIHM9dC5pZkNvbmRpdGlvbnNbb10uYmxvY2s7ZShzKSxzLnN0YXRpY3x8KHQuc3RhdGljPSExKX19fShlKSxmdW5jdGlvbiBlKHQsbil7aWYoMT09PXQudHlwZSl7aWYoKHQuc3RhdGljfHx0Lm9uY2UpJiYodC5zdGF0aWNJbkZvcj1uKSx0LnN0YXRpYyYmdC5jaGlsZHJlbi5sZW5ndGgmJigxIT09dC5jaGlsZHJlbi5sZW5ndGh8fDMhPT10LmNoaWxkcmVuWzBdLnR5cGUpKXJldHVybiB2b2lkKHQuc3RhdGljUm9vdD0hMCk7aWYodC5zdGF0aWNSb290PSExLHQuY2hpbGRyZW4pZm9yKHZhciByPTAsaT10LmNoaWxkcmVuLmxlbmd0aDtyPGk7cisrKWUodC5jaGlsZHJlbltyXSxufHwhIXQuZm9yKTtpZih0LmlmQ29uZGl0aW9ucylmb3IodmFyIG89MSxhPXQuaWZDb25kaXRpb25zLmxlbmd0aDtvPGE7bysrKWUodC5pZkNvbmRpdGlvbnNbb10uYmxvY2ssbil9fShlLCExKSl9dmFyIE9hPS9eKFtcdyRfXSt8XChbXildKj9cKSlccyo9PnxeZnVuY3Rpb24oPzpccytbXHckXSspP1xzKlwoLyxTYT0vXChbXildKj9cKTsqJC8sVGE9L15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLyxOYT17ZXNjOjI3LHRhYjo5LGVudGVyOjEzLHNwYWNlOjMyLHVwOjM4LGxlZnQ6MzcscmlnaHQ6MzksZG93bjo0MCxkZWxldGU6WzgsNDZdfSxFYT17ZXNjOlsiRXNjIiwiRXNjYXBlIl0sdGFiOiJUYWIiLGVudGVyOiJFbnRlciIsc3BhY2U6WyIgIiwiU3BhY2ViYXIiXSx1cDpbIlVwIiwiQXJyb3dVcCJdLGxlZnQ6WyJMZWZ0IiwiQXJyb3dMZWZ0Il0scmlnaHQ6WyJSaWdodCIsIkFycm93UmlnaHQiXSxkb3duOlsiRG93biIsIkFycm93RG93biJdLGRlbGV0ZTpbIkJhY2tzcGFjZSIsIkRlbGV0ZSIsIkRlbCJdfSxqYT1mdW5jdGlvbihlKXtyZXR1cm4iaWYoIitlKyIpcmV0dXJuIG51bGw7In0sRGE9e3N0b3A6IiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiLHByZXZlbnQ6IiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyIsc2VsZjpqYSgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSxjdHJsOmphKCIhJGV2ZW50LmN0cmxLZXkiKSxzaGlmdDpqYSgiISRldmVudC5zaGlmdEtleSIpLGFsdDpqYSgiISRldmVudC5hbHRLZXkiKSxtZXRhOmphKCIhJGV2ZW50Lm1ldGFLZXkiKSxsZWZ0OmphKCInYnV0dG9uJyBpbiAkZXZlbnQgJiYgJGV2ZW50LmJ1dHRvbiAhPT0gMCIpLG1pZGRsZTpqYSgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSxyaWdodDpqYSgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDIiKX07ZnVuY3Rpb24gTGEoZSx0KXt2YXIgbj10PyJuYXRpdmVPbjoiOiJvbjoiLHI9IiIsaT0iIjtmb3IodmFyIG8gaW4gZSl7dmFyIGE9SWEoZVtvXSk7ZVtvXSYmZVtvXS5keW5hbWljP2krPW8rIiwiK2ErIiwiOnIrPSciJytvKyciOicrYSsiLCJ9cmV0dXJuIHI9InsiK3Iuc2xpY2UoMCwtMSkrIn0iLGk/bisiX2QoIityKyIsWyIraS5zbGljZSgwLC0xKSsiXSkiOm4rcn1mdW5jdGlvbiBJYShlKXtpZighZSlyZXR1cm4iZnVuY3Rpb24oKXt9IjtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiJbIitlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gSWEoZSl9KS5qb2luKCIsIikrIl0iO3ZhciB0PVRhLnRlc3QoZS52YWx1ZSksbj1PYS50ZXN0KGUudmFsdWUpLHI9VGEudGVzdChlLnZhbHVlLnJlcGxhY2UoU2EsIiIpKTtpZihlLm1vZGlmaWVycyl7dmFyIGk9IiIsbz0iIixhPVtdO2Zvcih2YXIgcyBpbiBlLm1vZGlmaWVycylpZihEYVtzXSlvKz1EYVtzXSxOYVtzXSYmYS5wdXNoKHMpO2Vsc2UgaWYoImV4YWN0Ij09PXMpe3ZhciBjPWUubW9kaWZpZXJzO28rPWphKFsiY3RybCIsInNoaWZ0IiwiYWx0IiwibWV0YSJdLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hY1tlXX0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iJGV2ZW50LiIrZSsiS2V5In0pLmpvaW4oInx8IikpfWVsc2UgYS5wdXNoKHMpO3JldHVybiBhLmxlbmd0aCYmKGkrPWZ1bmN0aW9uKGUpe3JldHVybiJpZighJGV2ZW50LnR5cGUuaW5kZXhPZigna2V5JykmJiIrZS5tYXAoTWEpLmpvaW4oIiYmIikrIilyZXR1cm4gbnVsbDsifShhKSksbyYmKGkrPW8pLCJmdW5jdGlvbigkZXZlbnQpeyIraSsodD8icmV0dXJuICIrZS52YWx1ZSsiLmFwcGx5KG51bGwsIGFyZ3VtZW50cykiOm4/InJldHVybiAoIitlLnZhbHVlKyIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cykiOnI/InJldHVybiAiK2UudmFsdWU6ZS52YWx1ZSkrIn0ifXJldHVybiB0fHxuP2UudmFsdWU6ImZ1bmN0aW9uKCRldmVudCl7Iisocj8icmV0dXJuICIrZS52YWx1ZTplLnZhbHVlKSsifSJ9ZnVuY3Rpb24gTWEoZSl7dmFyIHQ9cGFyc2VJbnQoZSwxMCk7aWYodClyZXR1cm4iJGV2ZW50LmtleUNvZGUhPT0iK3Q7dmFyIG49TmFbZV0scj1FYVtlXTtyZXR1cm4iX2soJGV2ZW50LmtleUNvZGUsIitKU09OLnN0cmluZ2lmeShlKSsiLCIrSlNPTi5zdHJpbmdpZnkobikrIiwkZXZlbnQua2V5LCIrSlNPTi5zdHJpbmdpZnkocikrIikifXZhciBGYT17b246ZnVuY3Rpb24oZSx0KXtlLndyYXBMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIl9nKCIrZSsiLCIrdC52YWx1ZSsiKSJ9fSxiaW5kOmZ1bmN0aW9uKGUsdCl7ZS53cmFwRGF0YT1mdW5jdGlvbihuKXtyZXR1cm4iX2IoIituKyIsJyIrZS50YWcrIicsIit0LnZhbHVlKyIsIisodC5tb2RpZmllcnMmJnQubW9kaWZpZXJzLnByb3A/InRydWUiOiJmYWxzZSIpKyh0Lm1vZGlmaWVycyYmdC5tb2RpZmllcnMuc3luYz8iLHRydWUiOiIiKSsiKSJ9fSxjbG9hazpTfSxQYT1mdW5jdGlvbihlKXt0aGlzLm9wdGlvbnM9ZSx0aGlzLndhcm49ZS53YXJufHxUcix0aGlzLnRyYW5zZm9ybXM9TnIoZS5tb2R1bGVzLCJ0cmFuc2Zvcm1Db2RlIiksdGhpcy5kYXRhR2VuRm5zPU5yKGUubW9kdWxlcywiZ2VuRGF0YSIpLHRoaXMuZGlyZWN0aXZlcz1BKEEoe30sRmEpLGUuZGlyZWN0aXZlcyk7dmFyIHQ9ZS5pc1Jlc2VydmVkVGFnfHxUO3RoaXMubWF5YmVDb21wb25lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuISFlLmNvbXBvbmVudHx8IXQoZS50YWcpfSx0aGlzLm9uY2VJZD0wLHRoaXMuc3RhdGljUmVuZGVyRm5zPVtdLHRoaXMucHJlPSExfTtmdW5jdGlvbiBSYShlLHQpe3ZhciBuPW5ldyBQYSh0KTtyZXR1cm57cmVuZGVyOiJ3aXRoKHRoaXMpe3JldHVybiAiKyhlPyJzY3JpcHQiPT09ZS50YWc/Im51bGwiOkhhKGUsbik6J19jKCJkaXYiKScpKyJ9IixzdGF0aWNSZW5kZXJGbnM6bi5zdGF0aWNSZW5kZXJGbnN9fWZ1bmN0aW9uIEhhKGUsdCl7aWYoZS5wYXJlbnQmJihlLnByZT1lLnByZXx8ZS5wYXJlbnQucHJlKSxlLnN0YXRpY1Jvb3QmJiFlLnN0YXRpY1Byb2Nlc3NlZClyZXR1cm4gQmEoZSx0KTtpZihlLm9uY2UmJiFlLm9uY2VQcm9jZXNzZWQpcmV0dXJuIFVhKGUsdCk7aWYoZS5mb3ImJiFlLmZvclByb2Nlc3NlZClyZXR1cm4gemEoZSx0KTtpZihlLmlmJiYhZS5pZlByb2Nlc3NlZClyZXR1cm4gVmEoZSx0KTtpZigidGVtcGxhdGUiIT09ZS50YWd8fGUuc2xvdFRhcmdldHx8dC5wcmUpe2lmKCJzbG90Ij09PWUudGFnKXJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPWUuc2xvdE5hbWV8fCciZGVmYXVsdCInLHI9V2EoZSx0KSxpPSJfdCgiK24rKHI/IixmdW5jdGlvbigpe3JldHVybiAiK3IrIn0iOiIiKSxvPWUuYXR0cnN8fGUuZHluYW1pY0F0dHJzP1hhKChlLmF0dHJzfHxbXSkuY29uY2F0KGUuZHluYW1pY0F0dHJzfHxbXSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOmIoZS5uYW1lKSx2YWx1ZTplLnZhbHVlLGR5bmFtaWM6ZS5keW5hbWljfX0pKTpudWxsLGE9ZS5hdHRyc01hcFsidi1iaW5kIl07IW8mJiFhfHxyfHwoaSs9IixudWxsIik7byYmKGkrPSIsIitvKTthJiYoaSs9KG8/IiI6IixudWxsIikrIiwiK2EpO3JldHVybiBpKyIpIn0oZSx0KTt2YXIgbjtpZihlLmNvbXBvbmVudCluPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LmlubGluZVRlbXBsYXRlP251bGw6V2EodCxuLCEwKTtyZXR1cm4iX2MoIitlKyIsIitLYSh0LG4pKyhyPyIsIityOiIiKSsiKSJ9KGUuY29tcG9uZW50LGUsdCk7ZWxzZXt2YXIgcjsoIWUucGxhaW58fGUucHJlJiZ0Lm1heWJlQ29tcG9uZW50KGUpKSYmKHI9S2EoZSx0KSk7dmFyIGk9ZS5pbmxpbmVUZW1wbGF0ZT9udWxsOldhKGUsdCwhMCk7bj0iX2MoJyIrZS50YWcrIiciKyhyPyIsIityOiIiKSsoaT8iLCIraToiIikrIikifWZvcih2YXIgbz0wO288dC50cmFuc2Zvcm1zLmxlbmd0aDtvKyspbj10LnRyYW5zZm9ybXNbb10oZSxuKTtyZXR1cm4gbn1yZXR1cm4gV2EoZSx0KXx8InZvaWQgMCJ9ZnVuY3Rpb24gQmEoZSx0KXtlLnN0YXRpY1Byb2Nlc3NlZD0hMDt2YXIgbj10LnByZTtyZXR1cm4gZS5wcmUmJih0LnByZT1lLnByZSksdC5zdGF0aWNSZW5kZXJGbnMucHVzaCgid2l0aCh0aGlzKXtyZXR1cm4gIitIYShlLHQpKyJ9IiksdC5wcmU9biwiX20oIisodC5zdGF0aWNSZW5kZXJGbnMubGVuZ3RoLTEpKyhlLnN0YXRpY0luRm9yPyIsdHJ1ZSI6IiIpKyIpIn1mdW5jdGlvbiBVYShlLHQpe2lmKGUub25jZVByb2Nlc3NlZD0hMCxlLmlmJiYhZS5pZlByb2Nlc3NlZClyZXR1cm4gVmEoZSx0KTtpZihlLnN0YXRpY0luRm9yKXtmb3IodmFyIG49IiIscj1lLnBhcmVudDtyOyl7aWYoci5mb3Ipe249ci5rZXk7YnJlYWt9cj1yLnBhcmVudH1yZXR1cm4gbj8iX28oIitIYShlLHQpKyIsIit0Lm9uY2VJZCsrKyIsIituKyIpIjpIYShlLHQpfXJldHVybiBCYShlLHQpfWZ1bmN0aW9uIFZhKGUsdCxuLHIpe3JldHVybiBlLmlmUHJvY2Vzc2VkPSEwLGZ1bmN0aW9uIGUodCxuLHIsaSl7aWYoIXQubGVuZ3RoKXJldHVybiBpfHwiX2UoKSI7dmFyIG89dC5zaGlmdCgpO3JldHVybiBvLmV4cD8iKCIrby5leHArIik/IithKG8uYmxvY2spKyI6IitlKHQsbixyLGkpOiIiK2Eoby5ibG9jayk7ZnVuY3Rpb24gYShlKXtyZXR1cm4gcj9yKGUsbik6ZS5vbmNlP1VhKGUsbik6SGEoZSxuKX19KGUuaWZDb25kaXRpb25zLnNsaWNlKCksdCxuLHIpfWZ1bmN0aW9uIHphKGUsdCxuLHIpe3ZhciBpPWUuZm9yLG89ZS5hbGlhcyxhPWUuaXRlcmF0b3IxPyIsIitlLml0ZXJhdG9yMToiIixzPWUuaXRlcmF0b3IyPyIsIitlLml0ZXJhdG9yMjoiIjtyZXR1cm4gZS5mb3JQcm9jZXNzZWQ9ITAsKHJ8fCJfbCIpKyIoKCIraSsiKSxmdW5jdGlvbigiK28rYStzKyIpe3JldHVybiAiKyhufHxIYSkoZSx0KSsifSkifWZ1bmN0aW9uIEthKGUsdCl7dmFyIG49InsiLHI9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmRpcmVjdGl2ZXM7aWYoIW4pcmV0dXJuO3ZhciByLGksbyxhLHM9ImRpcmVjdGl2ZXM6WyIsYz0hMTtmb3Iocj0wLGk9bi5sZW5ndGg7cjxpO3IrKyl7bz1uW3JdLGE9ITA7dmFyIHU9dC5kaXJlY3RpdmVzW28ubmFtZV07dSYmKGE9ISF1KGUsbyx0Lndhcm4pKSxhJiYoYz0hMCxzKz0ne25hbWU6Iicrby5uYW1lKyciLHJhd05hbWU6Iicrby5yYXdOYW1lKyciJysoby52YWx1ZT8iLHZhbHVlOigiK28udmFsdWUrIiksZXhwcmVzc2lvbjoiK0pTT04uc3RyaW5naWZ5KG8udmFsdWUpOiIiKSsoby5hcmc/Iixhcmc6Iisoby5pc0R5bmFtaWNBcmc/by5hcmc6JyInK28uYXJnKyciJyk6IiIpKyhvLm1vZGlmaWVycz8iLG1vZGlmaWVyczoiK0pTT04uc3RyaW5naWZ5KG8ubW9kaWZpZXJzKToiIikrIn0sIil9aWYoYylyZXR1cm4gcy5zbGljZSgwLC0xKSsiXSJ9KGUsdCk7ciYmKG4rPXIrIiwiKSxlLmtleSYmKG4rPSJrZXk6IitlLmtleSsiLCIpLGUucmVmJiYobis9InJlZjoiK2UucmVmKyIsIiksZS5yZWZJbkZvciYmKG4rPSJyZWZJbkZvcjp0cnVlLCIpLGUucHJlJiYobis9InByZTp0cnVlLCIpLGUuY29tcG9uZW50JiYobis9J3RhZzoiJytlLnRhZysnIiwnKTtmb3IodmFyIGk9MDtpPHQuZGF0YUdlbkZucy5sZW5ndGg7aSsrKW4rPXQuZGF0YUdlbkZuc1tpXShlKTtpZihlLmF0dHJzJiYobis9ImF0dHJzOiIrWGEoZS5hdHRycykrIiwiKSxlLnByb3BzJiYobis9ImRvbVByb3BzOiIrWGEoZS5wcm9wcykrIiwiKSxlLmV2ZW50cyYmKG4rPUxhKGUuZXZlbnRzLCExKSsiLCIpLGUubmF0aXZlRXZlbnRzJiYobis9TGEoZS5uYXRpdmVFdmVudHMsITApKyIsIiksZS5zbG90VGFyZ2V0JiYhZS5zbG90U2NvcGUmJihuKz0ic2xvdDoiK2Uuc2xvdFRhcmdldCsiLCIpLGUuc2NvcGVkU2xvdHMmJihuKz1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5mb3J8fE9iamVjdC5rZXlzKHQpLnNvbWUoZnVuY3Rpb24oZSl7dmFyIG49dFtlXTtyZXR1cm4gbi5zbG90VGFyZ2V0RHluYW1pY3x8bi5pZnx8bi5mb3J8fEphKG4pfSksaT0hIWUuaWY7aWYoIXIpZm9yKHZhciBvPWUucGFyZW50O287KXtpZihvLnNsb3RTY29wZSYmby5zbG90U2NvcGUhPT11YXx8by5mb3Ipe3I9ITA7YnJlYWt9by5pZiYmKGk9ITApLG89by5wYXJlbnR9dmFyIGE9T2JqZWN0LmtleXModCkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBxYSh0W2VdLG4pfSkuam9pbigiLCIpO3JldHVybiJzY29wZWRTbG90czpfdShbIithKyJdIisocj8iLG51bGwsdHJ1ZSI6IiIpKyghciYmaT8iLG51bGwsZmFsc2UsIitmdW5jdGlvbihlKXt2YXIgdD01MzgxLG49ZS5sZW5ndGg7Zm9yKDtuOyl0PTMzKnReZS5jaGFyQ29kZUF0KC0tbik7cmV0dXJuIHQ+Pj4wfShhKToiIikrIikifShlLGUuc2NvcGVkU2xvdHMsdCkrIiwiKSxlLm1vZGVsJiYobis9Im1vZGVsOnt2YWx1ZToiK2UubW9kZWwudmFsdWUrIixjYWxsYmFjazoiK2UubW9kZWwuY2FsbGJhY2srIixleHByZXNzaW9uOiIrZS5tb2RlbC5leHByZXNzaW9uKyJ9LCIpLGUuaW5saW5lVGVtcGxhdGUpe3ZhciBvPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jaGlsZHJlblswXTtpZihuJiYxPT09bi50eXBlKXt2YXIgcj1SYShuLHQub3B0aW9ucyk7cmV0dXJuImlubGluZVRlbXBsYXRlOntyZW5kZXI6ZnVuY3Rpb24oKXsiK3IucmVuZGVyKyJ9LHN0YXRpY1JlbmRlckZuczpbIityLnN0YXRpY1JlbmRlckZucy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uKCl7IitlKyJ9In0pLmpvaW4oIiwiKSsiXX0ifX0oZSx0KTtvJiYobis9bysiLCIpfXJldHVybiBuPW4ucmVwbGFjZSgvLCQvLCIiKSsifSIsZS5keW5hbWljQXR0cnMmJihuPSJfYigiK24rJywiJytlLnRhZysnIiwnK1hhKGUuZHluYW1pY0F0dHJzKSsiKSIpLGUud3JhcERhdGEmJihuPWUud3JhcERhdGEobikpLGUud3JhcExpc3RlbmVycyYmKG49ZS53cmFwTGlzdGVuZXJzKG4pKSxufWZ1bmN0aW9uIEphKGUpe3JldHVybiAxPT09ZS50eXBlJiYoInNsb3QiPT09ZS50YWd8fGUuY2hpbGRyZW4uc29tZShKYSkpfWZ1bmN0aW9uIHFhKGUsdCl7dmFyIG49ZS5hdHRyc01hcFsic2xvdC1zY29wZSJdO2lmKGUuaWYmJiFlLmlmUHJvY2Vzc2VkJiYhbilyZXR1cm4gVmEoZSx0LHFhLCJudWxsIik7aWYoZS5mb3ImJiFlLmZvclByb2Nlc3NlZClyZXR1cm4gemEoZSx0LHFhKTt2YXIgcj1lLnNsb3RTY29wZT09PXVhPyIiOlN0cmluZyhlLnNsb3RTY29wZSksaT0iZnVuY3Rpb24oIityKyIpe3JldHVybiAiKygidGVtcGxhdGUiPT09ZS50YWc/ZS5pZiYmbj8iKCIrZS5pZisiKT8iKyhXYShlLHQpfHwidW5kZWZpbmVkIikrIjp1bmRlZmluZWQiOldhKGUsdCl8fCJ1bmRlZmluZWQiOkhhKGUsdCkpKyJ9IixvPXI/IiI6Iixwcm94eTp0cnVlIjtyZXR1cm4ie2tleToiKyhlLnNsb3RUYXJnZXR8fCciZGVmYXVsdCInKSsiLGZuOiIraStvKyJ9In1mdW5jdGlvbiBXYShlLHQsbixyLGkpe3ZhciBvPWUuY2hpbGRyZW47aWYoby5sZW5ndGgpe3ZhciBhPW9bMF07aWYoMT09PW8ubGVuZ3RoJiZhLmZvciYmInRlbXBsYXRlIiE9PWEudGFnJiYic2xvdCIhPT1hLnRhZyl7dmFyIHM9bj90Lm1heWJlQ29tcG9uZW50KGEpPyIsMSI6IiwwIjoiIjtyZXR1cm4iIisocnx8SGEpKGEsdCkrc312YXIgYz1uP2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAscj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdO2lmKDE9PT1pLnR5cGUpe2lmKFphKGkpfHxpLmlmQ29uZGl0aW9ucyYmaS5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gWmEoZS5ibG9jayl9KSl7bj0yO2JyZWFrfSh0KGkpfHxpLmlmQ29uZGl0aW9ucyYmaS5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gdChlLmJsb2NrKX0pKSYmKG49MSl9fXJldHVybiBufShvLHQubWF5YmVDb21wb25lbnQpOjAsdT1pfHxHYTtyZXR1cm4iWyIrby5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHUoZSx0KX0pLmpvaW4oIiwiKSsiXSIrKGM/IiwiK2M6IiIpfX1mdW5jdGlvbiBaYShlKXtyZXR1cm4gdm9pZCAwIT09ZS5mb3J8fCJ0ZW1wbGF0ZSI9PT1lLnRhZ3x8InNsb3QiPT09ZS50YWd9ZnVuY3Rpb24gR2EoZSx0KXtyZXR1cm4gMT09PWUudHlwZT9IYShlLHQpOjM9PT1lLnR5cGUmJmUuaXNDb21tZW50PyhyPWUsIl9lKCIrSlNPTi5zdHJpbmdpZnkoci50ZXh0KSsiKSIpOiJfdigiKygyPT09KG49ZSkudHlwZT9uLmV4cHJlc3Npb246WWEoSlNPTi5zdHJpbmdpZnkobi50ZXh0KSkpKyIpIjt2YXIgbixyfWZ1bmN0aW9uIFhhKGUpe2Zvcih2YXIgdD0iIixuPSIiLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyXSxvPVlhKGkudmFsdWUpO2kuZHluYW1pYz9uKz1pLm5hbWUrIiwiK28rIiwiOnQrPSciJytpLm5hbWUrJyI6JytvKyIsIn1yZXR1cm4gdD0ieyIrdC5zbGljZSgwLC0xKSsifSIsbj8iX2QoIit0KyIsWyIrbi5zbGljZSgwLC0xKSsiXSkiOnR9ZnVuY3Rpb24gWWEoZSl7cmV0dXJuIGUucmVwbGFjZSgvXHUyMDI4L2csIlxcdTIwMjgiKS5yZXBsYWNlKC9cdTIwMjkvZywiXFx1MjAyOSIpfW5ldyBSZWdFeHAoIlxcYiIrImRvLGlmLGZvcixsZXQsbmV3LHRyeSx2YXIsY2FzZSxlbHNlLHdpdGgsYXdhaXQsYnJlYWssY2F0Y2gsY2xhc3MsY29uc3Qsc3VwZXIsdGhyb3csd2hpbGUseWllbGQsZGVsZXRlLGV4cG9ydCxpbXBvcnQscmV0dXJuLHN3aXRjaCxkZWZhdWx0LGV4dGVuZHMsZmluYWxseSxjb250aW51ZSxkZWJ1Z2dlcixmdW5jdGlvbixhcmd1bWVudHMiLnNwbGl0KCIsIikuam9pbigiXFxifFxcYiIpKyJcXGIiKTtmdW5jdGlvbiBRYShlLHQpe3RyeXtyZXR1cm4gbmV3IEZ1bmN0aW9uKGUpfWNhdGNoKG4pe3JldHVybiB0LnB1c2goe2VycjpuLGNvZGU6ZX0pLFN9fWZ1bmN0aW9uIGVzKGUpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGZ1bmN0aW9uKG4scixpKXsocj1BKHt9LHIpKS53YXJuO2RlbGV0ZSByLndhcm47dmFyIG89ci5kZWxpbWl0ZXJzP1N0cmluZyhyLmRlbGltaXRlcnMpK246bjtpZih0W29dKXJldHVybiB0W29dO3ZhciBhPWUobixyKSxzPXt9LGM9W107cmV0dXJuIHMucmVuZGVyPVFhKGEucmVuZGVyLGMpLHMuc3RhdGljUmVuZGVyRm5zPWEuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gUWEoZSxjKX0pLHRbb109c319dmFyIHRzLG5zLHJzPSh0cz1mdW5jdGlvbihlLHQpe3ZhciBuPWZhKGUudHJpbSgpLHQpOyExIT09dC5vcHRpbWl6ZSYmQWEobix0KTt2YXIgcj1SYShuLHQpO3JldHVybnthc3Q6bixyZW5kZXI6ci5yZW5kZXIsc3RhdGljUmVuZGVyRm5zOnIuc3RhdGljUmVuZGVyRm5zfX0sZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LG4pe3ZhciByPU9iamVjdC5jcmVhdGUoZSksaT1bXSxvPVtdO2lmKG4pZm9yKHZhciBhIGluIG4ubW9kdWxlcyYmKHIubW9kdWxlcz0oZS5tb2R1bGVzfHxbXSkuY29uY2F0KG4ubW9kdWxlcykpLG4uZGlyZWN0aXZlcyYmKHIuZGlyZWN0aXZlcz1BKE9iamVjdC5jcmVhdGUoZS5kaXJlY3RpdmVzfHxudWxsKSxuLmRpcmVjdGl2ZXMpKSxuKSJtb2R1bGVzIiE9PWEmJiJkaXJlY3RpdmVzIiE9PWEmJihyW2FdPW5bYV0pO3Iud2Fybj1mdW5jdGlvbihlLHQsbil7KG4/bzppKS5wdXNoKGUpfTt2YXIgcz10cyh0LnRyaW0oKSxyKTtyZXR1cm4gcy5lcnJvcnM9aSxzLnRpcHM9byxzfXJldHVybntjb21waWxlOnQsY29tcGlsZVRvRnVuY3Rpb25zOmVzKHQpfX0pKHhhKSxpcz0ocnMuY29tcGlsZSxycy5jb21waWxlVG9GdW5jdGlvbnMpO2Z1bmN0aW9uIG9zKGUpe3JldHVybihucz1uc3x8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmlubmVySFRNTD1lPyc8YSBocmVmPSJcbiIvPic6JzxkaXYgYT0iXG4iLz4nLG5zLmlubmVySFRNTC5pbmRleE9mKCImIzEwOyIpPjB9dmFyIGFzPSEhViYmb3MoITEpLHNzPSEhViYmb3MoITApLGNzPWcoZnVuY3Rpb24oZSl7dmFyIHQ9UW4oZSk7cmV0dXJuIHQmJnQuaW5uZXJIVE1MfSksdXM9Q24ucHJvdG90eXBlLiRtb3VudDtyZXR1cm4gQ24ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe2lmKChlPWUmJlFuKGUpKT09PWRvY3VtZW50LmJvZHl8fGU9PT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpcmV0dXJuIHRoaXM7dmFyIG49dGhpcy4kb3B0aW9ucztpZighbi5yZW5kZXIpe3ZhciByPW4udGVtcGxhdGU7aWYocilpZigic3RyaW5nIj09dHlwZW9mIHIpIiMiPT09ci5jaGFyQXQoMCkmJihyPWNzKHIpKTtlbHNle2lmKCFyLm5vZGVUeXBlKXJldHVybiB0aGlzO3I9ci5pbm5lckhUTUx9ZWxzZSBlJiYocj1mdW5jdGlvbihlKXtpZihlLm91dGVySFRNTClyZXR1cm4gZS5vdXRlckhUTUw7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIHQuYXBwZW5kQ2hpbGQoZS5jbG9uZU5vZGUoITApKSx0LmlubmVySFRNTH0oZSkpO2lmKHIpe3ZhciBpPWlzKHIse291dHB1dFNvdXJjZVJhbmdlOiExLHNob3VsZERlY29kZU5ld2xpbmVzOmFzLHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjpzcyxkZWxpbWl0ZXJzOm4uZGVsaW1pdGVycyxjb21tZW50czpuLmNvbW1lbnRzfSx0aGlzKSxvPWkucmVuZGVyLGE9aS5zdGF0aWNSZW5kZXJGbnM7bi5yZW5kZXI9byxuLnN0YXRpY1JlbmRlckZucz1hfX1yZXR1cm4gdXMuY2FsbCh0aGlzLGUsdCl9LENuLmNvbXBpbGU9aXMsQ259KTs="},{"meta":{"name":"less.min.js","url":"https://cdn.staticfile.org/less.js/4.1.2/less.min.js","ts":1670421067016,"mimetype":"text/javascript"},"source":"LyoqCiAqIExlc3MgLSBMZWFuZXIgQ1NTIHY0LjEuMgogKiBodHRwOi8vbGVzc2Nzcy5vcmcKICogCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDIxLCBBbGV4aXMgU2VsbGllciA8c2VsZkBjbG91ZGhlYWQubmV0PgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBMaWNlbnNlLgogKgogKiBAbGljZW5zZSBBcGFjaGUtMi4wCiAqLwohZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQoKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0KTooZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5sZXNzPXQoKX0odGhpcywoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZS5yZXBsYWNlKC9eW2Etei1dKzpcLys/W15cL10rLywiIikucmVwbGFjZSgvW1w/XCZdbGl2ZXJlbG9hZD1cdysvLCIiKS5yZXBsYWNlKC9eXC8vLCIiKS5yZXBsYWNlKC9cLlthLXpBLVpdKyQvLCIiKS5yZXBsYWNlKC9bXlwuXHctXSsvZywiLSIpLnJlcGxhY2UoL1wuL2csIjoiKX1mdW5jdGlvbiB0KGUsdCl7Zm9yKHZhciBpIGluIHQuZGF0YXNldClpZih0LmRhdGFzZXQuaGFzT3duUHJvcGVydHkoaSkpaWYoImVudiI9PT1pfHwiZHVtcExpbmVOdW1iZXJzIj09PWl8fCJyb290cGF0aCI9PT1pfHwiZXJyb3JSZXBvcnRpbmciPT09aSllW2ldPXQuZGF0YXNldFtpXTtlbHNlIHRyeXtlW2ldPUpTT04ucGFyc2UodC5kYXRhc2V0W2ldKX1jYXRjaChlKXt9fXZhciBpPWZ1bmN0aW9uKHQsaSxuKXt2YXIgcj1uLmhyZWZ8fCIiLHM9Imxlc3M6Iisobi50aXRsZXx8ZShyKSksbz10LmdldEVsZW1lbnRCeUlkKHMpLGE9ITEsbD10LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7bC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJ0ZXh0L2NzcyIpLG4ubWVkaWEmJmwuc2V0QXR0cmlidXRlKCJtZWRpYSIsbi5tZWRpYSksbC5pZD1zLGwuc3R5bGVTaGVldHx8KGwuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZShpKSksYT1udWxsIT09byYmby5jaGlsZE5vZGVzLmxlbmd0aD4wJiZsLmNoaWxkTm9kZXMubGVuZ3RoPjAmJm8uZmlyc3RDaGlsZC5ub2RlVmFsdWU9PT1sLmZpcnN0Q2hpbGQubm9kZVZhbHVlKTt2YXIgdT10LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07aWYobnVsbD09PW98fCExPT09YSl7dmFyIGM9biYmbi5uZXh0U2libGluZ3x8bnVsbDtjP2MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobCxjKTp1LmFwcGVuZENoaWxkKGwpfWlmKG8mJiExPT09YSYmby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pLGwuc3R5bGVTaGVldCl0cnl7bC5zdHlsZVNoZWV0LmNzc1RleHQ9aX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoIkNvdWxkbid0IHJlYXNzaWduIHN0eWxlU2hlZXQuY3NzVGV4dC4iKX19LG49ZnVuY3Rpb24oZSl7dmFyIHQsaT1lLmRvY3VtZW50O3JldHVybiBpLmN1cnJlbnRTY3JpcHR8fCh0PWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpKVt0Lmxlbmd0aC0xXX0scj17ZXJyb3I6ZnVuY3Rpb24oZSl7dGhpcy5fZmlyZUV2ZW50KCJlcnJvciIsZSl9LHdhcm46ZnVuY3Rpb24oZSl7dGhpcy5fZmlyZUV2ZW50KCJ3YXJuIixlKX0saW5mbzpmdW5jdGlvbihlKXt0aGlzLl9maXJlRXZlbnQoImluZm8iLGUpfSxkZWJ1ZzpmdW5jdGlvbihlKXt0aGlzLl9maXJlRXZlbnQoImRlYnVnIixlKX0sYWRkTGlzdGVuZXI6ZnVuY3Rpb24oZSl7dGhpcy5fbGlzdGVuZXJzLnB1c2goZSl9LHJlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8dGhpcy5fbGlzdGVuZXJzLmxlbmd0aDt0KyspaWYodGhpcy5fbGlzdGVuZXJzW3RdPT09ZSlyZXR1cm4gdm9pZCB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9LF9maXJlRXZlbnQ6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIGk9MDtpPHRoaXMuX2xpc3RlbmVycy5sZW5ndGg7aSsrKXt2YXIgbj10aGlzLl9saXN0ZW5lcnNbaV1bZV07biYmbih0KX19LF9saXN0ZW5lcnM6W119LHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7dGhpcy5maWxlTWFuYWdlcnM9dHx8W10sZT1lfHx7fTtmb3IodmFyIGk9W10sbj1pLmNvbmNhdChbImVuY29kZUJhc2U2NCIsIm1pbWVMb29rdXAiLCJjaGFyc2V0TG9va3VwIiwiZ2V0U291cmNlTWFwR2VuZXJhdG9yIl0pLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIHM9bltyXSxvPWVbc107bz90aGlzW3NdPW8uYmluZChlKTpyPGkubGVuZ3RoJiZ0aGlzLndhcm4oIm1pc3NpbmcgcmVxdWlyZWQgZnVuY3Rpb24gaW4gZW52aXJvbm1lbnQgLSAiK3MpfX1yZXR1cm4gZS5wcm90b3R5cGUuZ2V0RmlsZU1hbmFnZXI9ZnVuY3Rpb24oZSx0LGksbixzKXtlfHxyLndhcm4oImdldEZpbGVNYW5hZ2VyIGNhbGxlZCB3aXRoIG5vIGZpbGVuYW1lLi4gUGxlYXNlIHJlcG9ydCB0aGlzIGlzc3VlLiBjb250aW51aW5nLiIpLG51bGw9PXQmJnIud2FybigiZ2V0RmlsZU1hbmFnZXIgY2FsbGVkIHdpdGggbnVsbCBkaXJlY3RvcnkuLiBQbGVhc2UgcmVwb3J0IHRoaXMgaXNzdWUuIGNvbnRpbnVpbmcuIik7dmFyIG89dGhpcy5maWxlTWFuYWdlcnM7aS5wbHVnaW5NYW5hZ2VyJiYobz1bXS5jb25jYXQobykuY29uY2F0KGkucGx1Z2luTWFuYWdlci5nZXRGaWxlTWFuYWdlcnMoKSkpO2Zvcih2YXIgYT1vLmxlbmd0aC0xO2E+PTA7YS0tKXt2YXIgbD1vW2FdO2lmKGxbcz8ic3VwcG9ydHNTeW5jIjoic3VwcG9ydHMiXShlLHQsaSxuKSlyZXR1cm4gbH1yZXR1cm4gbnVsbH0sZS5wcm90b3R5cGUuYWRkRmlsZU1hbmFnZXI9ZnVuY3Rpb24oZSl7dGhpcy5maWxlTWFuYWdlcnMucHVzaChlKX0sZS5wcm90b3R5cGUuY2xlYXJGaWxlTWFuYWdlcnM9ZnVuY3Rpb24oKXt0aGlzLmZpbGVNYW5hZ2Vycz1bXX0sZX0oKSxvPXthbGljZWJsdWU6IiNmMGY4ZmYiLGFudGlxdWV3aGl0ZToiI2ZhZWJkNyIsYXF1YToiIzAwZmZmZiIsYXF1YW1hcmluZToiIzdmZmZkNCIsYXp1cmU6IiNmMGZmZmYiLGJlaWdlOiIjZjVmNWRjIixiaXNxdWU6IiNmZmU0YzQiLGJsYWNrOiIjMDAwMDAwIixibGFuY2hlZGFsbW9uZDoiI2ZmZWJjZCIsYmx1ZToiIzAwMDBmZiIsYmx1ZXZpb2xldDoiIzhhMmJlMiIsYnJvd246IiNhNTJhMmEiLGJ1cmx5d29vZDoiI2RlYjg4NyIsY2FkZXRibHVlOiIjNWY5ZWEwIixjaGFydHJldXNlOiIjN2ZmZjAwIixjaG9jb2xhdGU6IiNkMjY5MWUiLGNvcmFsOiIjZmY3ZjUwIixjb3JuZmxvd2VyYmx1ZToiIzY0OTVlZCIsY29ybnNpbGs6IiNmZmY4ZGMiLGNyaW1zb246IiNkYzE0M2MiLGN5YW46IiMwMGZmZmYiLGRhcmtibHVlOiIjMDAwMDhiIixkYXJrY3lhbjoiIzAwOGI4YiIsZGFya2dvbGRlbnJvZDoiI2I4ODYwYiIsZGFya2dyYXk6IiNhOWE5YTkiLGRhcmtncmV5OiIjYTlhOWE5IixkYXJrZ3JlZW46IiMwMDY0MDAiLGRhcmtraGFraToiI2JkYjc2YiIsZGFya21hZ2VudGE6IiM4YjAwOGIiLGRhcmtvbGl2ZWdyZWVuOiIjNTU2YjJmIixkYXJrb3JhbmdlOiIjZmY4YzAwIixkYXJrb3JjaGlkOiIjOTkzMmNjIixkYXJrcmVkOiIjOGIwMDAwIixkYXJrc2FsbW9uOiIjZTk5NjdhIixkYXJrc2VhZ3JlZW46IiM4ZmJjOGYiLGRhcmtzbGF0ZWJsdWU6IiM0ODNkOGIiLGRhcmtzbGF0ZWdyYXk6IiMyZjRmNGYiLGRhcmtzbGF0ZWdyZXk6IiMyZjRmNGYiLGRhcmt0dXJxdW9pc2U6IiMwMGNlZDEiLGRhcmt2aW9sZXQ6IiM5NDAwZDMiLGRlZXBwaW5rOiIjZmYxNDkzIixkZWVwc2t5Ymx1ZToiIzAwYmZmZiIsZGltZ3JheToiIzY5Njk2OSIsZGltZ3JleToiIzY5Njk2OSIsZG9kZ2VyYmx1ZToiIzFlOTBmZiIsZmlyZWJyaWNrOiIjYjIyMjIyIixmbG9yYWx3aGl0ZToiI2ZmZmFmMCIsZm9yZXN0Z3JlZW46IiMyMjhiMjIiLGZ1Y2hzaWE6IiNmZjAwZmYiLGdhaW5zYm9ybzoiI2RjZGNkYyIsZ2hvc3R3aGl0ZToiI2Y4ZjhmZiIsZ29sZDoiI2ZmZDcwMCIsZ29sZGVucm9kOiIjZGFhNTIwIixncmF5OiIjODA4MDgwIixncmV5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsZ3JlZW55ZWxsb3c6IiNhZGZmMmYiLGhvbmV5ZGV3OiIjZjBmZmYwIixob3RwaW5rOiIjZmY2OWI0IixpbmRpYW5yZWQ6IiNjZDVjNWMiLGluZGlnbzoiIzRiMDA4MiIsaXZvcnk6IiNmZmZmZjAiLGtoYWtpOiIjZjBlNjhjIixsYXZlbmRlcjoiI2U2ZTZmYSIsbGF2ZW5kZXJibHVzaDoiI2ZmZjBmNSIsbGF3bmdyZWVuOiIjN2NmYzAwIixsZW1vbmNoaWZmb246IiNmZmZhY2QiLGxpZ2h0Ymx1ZToiI2FkZDhlNiIsbGlnaHRjb3JhbDoiI2YwODA4MCIsbGlnaHRjeWFuOiIjZTBmZmZmIixsaWdodGdvbGRlbnJvZHllbGxvdzoiI2ZhZmFkMiIsbGlnaHRncmF5OiIjZDNkM2QzIixsaWdodGdyZXk6IiNkM2QzZDMiLGxpZ2h0Z3JlZW46IiM5MGVlOTAiLGxpZ2h0cGluazoiI2ZmYjZjMSIsbGlnaHRzYWxtb246IiNmZmEwN2EiLGxpZ2h0c2VhZ3JlZW46IiMyMGIyYWEiLGxpZ2h0c2t5Ymx1ZToiIzg3Y2VmYSIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLGxpZ2h0c2xhdGVncmV5OiIjNzc4ODk5IixsaWdodHN0ZWVsYmx1ZToiI2IwYzRkZSIsbGlnaHR5ZWxsb3c6IiNmZmZmZTAiLGxpbWU6IiMwMGZmMDAiLGxpbWVncmVlbjoiIzMyY2QzMiIsbGluZW46IiNmYWYwZTYiLG1hZ2VudGE6IiNmZjAwZmYiLG1hcm9vbjoiIzgwMDAwMCIsbWVkaXVtYXF1YW1hcmluZToiIzY2Y2RhYSIsbWVkaXVtYmx1ZToiIzAwMDBjZCIsbWVkaXVtb3JjaGlkOiIjYmE1NWQzIixtZWRpdW1wdXJwbGU6IiM5MzcwZDgiLG1lZGl1bXNlYWdyZWVuOiIjM2NiMzcxIixtZWRpdW1zbGF0ZWJsdWU6IiM3YjY4ZWUiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBmYTlhIixtZWRpdW10dXJxdW9pc2U6IiM0OGQxY2MiLG1lZGl1bXZpb2xldHJlZDoiI2M3MTU4NSIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixtaW50Y3JlYW06IiNmNWZmZmEiLG1pc3R5cm9zZToiI2ZmZTRlMSIsbW9jY2FzaW46IiNmZmU0YjUiLG5hdmFqb3doaXRlOiIjZmZkZWFkIixuYXZ5OiIjMDAwMDgwIixvbGRsYWNlOiIjZmRmNWU2IixvbGl2ZToiIzgwODAwMCIsb2xpdmVkcmFiOiIjNmI4ZTIzIixvcmFuZ2U6IiNmZmE1MDAiLG9yYW5nZXJlZDoiI2ZmNDUwMCIsb3JjaGlkOiIjZGE3MGQ2IixwYWxlZ29sZGVucm9kOiIjZWVlOGFhIixwYWxlZ3JlZW46IiM5OGZiOTgiLHBhbGV0dXJxdW9pc2U6IiNhZmVlZWUiLHBhbGV2aW9sZXRyZWQ6IiNkODcwOTMiLHBhcGF5YXdoaXA6IiNmZmVmZDUiLHBlYWNocHVmZjoiI2ZmZGFiOSIscGVydToiI2NkODUzZiIscGluazoiI2ZmYzBjYiIscGx1bToiI2RkYTBkZCIscG93ZGVyYmx1ZToiI2IwZTBlNiIscHVycGxlOiIjODAwMDgwIixyZWJlY2NhcHVycGxlOiIjNjYzMzk5IixyZWQ6IiNmZjAwMDAiLHJvc3licm93bjoiI2JjOGY4ZiIscm95YWxibHVlOiIjNDE2OWUxIixzYWRkbGVicm93bjoiIzhiNDUxMyIsc2FsbW9uOiIjZmE4MDcyIixzYW5keWJyb3duOiIjZjRhNDYwIixzZWFncmVlbjoiIzJlOGI1NyIsc2Vhc2hlbGw6IiNmZmY1ZWUiLHNpZW5uYToiI2EwNTIyZCIsc2lsdmVyOiIjYzBjMGMwIixza3libHVlOiIjODdjZWViIixzbGF0ZWJsdWU6IiM2YTVhY2QiLHNsYXRlZ3JheToiIzcwODA5MCIsc2xhdGVncmV5OiIjNzA4MDkwIixzbm93OiIjZmZmYWZhIixzcHJpbmdncmVlbjoiIzAwZmY3ZiIsc3RlZWxibHVlOiIjNDY4MmI0Iix0YW46IiNkMmI0OGMiLHRlYWw6IiMwMDgwODAiLHRoaXN0bGU6IiNkOGJmZDgiLHRvbWF0bzoiI2ZmNjM0NyIsdHVycXVvaXNlOiIjNDBlMGQwIix2aW9sZXQ6IiNlZTgyZWUiLHdoZWF0OiIjZjVkZWIzIix3aGl0ZToiI2ZmZmZmZiIsd2hpdGVzbW9rZToiI2Y1ZjVmNSIseWVsbG93OiIjZmZmZjAwIix5ZWxsb3dncmVlbjoiIzlhY2QzMiJ9LGE9e2xlbmd0aDp7bToxLGNtOi4wMSxtbTouMDAxLGluOi4wMjU0LHB4Oi4wMjU0Lzk2LHB0Oi4wMjU0LzcyLHBjOi4wMjU0LzcyKjEyfSxkdXJhdGlvbjp7czoxLG1zOi4wMDF9LGFuZ2xlOntyYWQ6MS8oMipNYXRoLlBJKSxkZWc6MS8zNjAsZ3JhZDoxLzQwMCx0dXJuOjF9fSxsPXtjb2xvcnM6byx1bml0Q29udmVyc2lvbnM6YX0sdT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aGlzLnBhcmVudD1udWxsLHRoaXMudmlzaWJpbGl0eUJsb2Nrcz12b2lkIDAsdGhpcy5ub2RlVmlzaWJsZT12b2lkIDAsdGhpcy5yb290Tm9kZT1udWxsLHRoaXMucGFyc2VkPW51bGx9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY3VycmVudEZpbGVJbmZvIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsZUluZm8oKX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImluZGV4Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0SW5kZXgoKX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5zZXRQYXJlbnQ9ZnVuY3Rpb24odCxpKXtmdW5jdGlvbiBuKHQpe3QmJnQgaW5zdGFuY2VvZiBlJiYodC5wYXJlbnQ9aSl9QXJyYXkuaXNBcnJheSh0KT90LmZvckVhY2gobik6bih0KX0sZS5wcm90b3R5cGUuZ2V0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5kZXh8fHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nZXRJbmRleCgpfHwwfSxlLnByb3RvdHlwZS5maWxlSW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9maWxlSW5mb3x8dGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZpbGVJbmZvKCl8fHt9fSxlLnByb3RvdHlwZS5pc1J1bGVzZXRMaWtlPWZ1bmN0aW9uKCl7cmV0dXJuITF9LGUucHJvdG90eXBlLnRvQ1NTPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiB0aGlzLmdlbkNTUyhlLHthZGQ6ZnVuY3Rpb24oZSxpLG4pe3QucHVzaChlKX0saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiAwPT09dC5sZW5ndGh9fSksdC5qb2luKCIiKX0sZS5wcm90b3R5cGUuZ2VuQ1NTPWZ1bmN0aW9uKGUsdCl7dC5hZGQodGhpcy52YWx1ZSl9LGUucHJvdG90eXBlLmFjY2VwdD1mdW5jdGlvbihlKXt0aGlzLnZhbHVlPWUudmlzaXQodGhpcy52YWx1ZSl9LGUucHJvdG90eXBlLmV2YWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZS5wcm90b3R5cGUuX29wZXJhdGU9ZnVuY3Rpb24oZSx0LGksbil7c3dpdGNoKHQpe2Nhc2UiKyI6cmV0dXJuIGkrbjtjYXNlIi0iOnJldHVybiBpLW47Y2FzZSIqIjpyZXR1cm4gaSpuO2Nhc2UiLyI6cmV0dXJuIGkvbn19LGUucHJvdG90eXBlLmZyb3VuZD1mdW5jdGlvbihlLHQpe3ZhciBpPWUmJmUubnVtUHJlY2lzaW9uO3JldHVybiBpP051bWJlcigodCsyZS0xNikudG9GaXhlZChpKSk6dH0sZS5jb21wYXJlPWZ1bmN0aW9uKHQsaSl7aWYodC5jb21wYXJlJiYiUXVvdGVkIiE9PWkudHlwZSYmIkFub255bW91cyIhPT1pLnR5cGUpcmV0dXJuIHQuY29tcGFyZShpKTtpZihpLmNvbXBhcmUpcmV0dXJuLWkuY29tcGFyZSh0KTtpZih0LnR5cGU9PT1pLnR5cGUpe2lmKHQ9dC52YWx1ZSxpPWkudmFsdWUsIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQ9PT1pPzA6dm9pZCAwO2lmKHQubGVuZ3RoPT09aS5sZW5ndGgpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWlmKDAhPT1lLmNvbXBhcmUodFtuXSxpW25dKSlyZXR1cm47cmV0dXJuIDB9fX0sZS5udW1lcmljQ29tcGFyZT1mdW5jdGlvbihlLHQpe3JldHVybiBlPHQ/LTE6ZT09PXQ/MDplPnQ/MTp2b2lkIDB9LGUucHJvdG90eXBlLmJsb2Nrc1Zpc2liaWxpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy52aXNpYmlsaXR5QmxvY2tzJiYodGhpcy52aXNpYmlsaXR5QmxvY2tzPTApLDAhPT10aGlzLnZpc2liaWxpdHlCbG9ja3N9LGUucHJvdG90eXBlLmFkZFZpc2liaWxpdHlCbG9jaz1mdW5jdGlvbigpe251bGw9PXRoaXMudmlzaWJpbGl0eUJsb2NrcyYmKHRoaXMudmlzaWJpbGl0eUJsb2Nrcz0wKSx0aGlzLnZpc2liaWxpdHlCbG9ja3M9dGhpcy52aXNpYmlsaXR5QmxvY2tzKzF9LGUucHJvdG90eXBlLnJlbW92ZVZpc2liaWxpdHlCbG9jaz1mdW5jdGlvbigpe251bGw9PXRoaXMudmlzaWJpbGl0eUJsb2NrcyYmKHRoaXMudmlzaWJpbGl0eUJsb2Nrcz0wKSx0aGlzLnZpc2liaWxpdHlCbG9ja3M9dGhpcy52aXNpYmlsaXR5QmxvY2tzLTF9LGUucHJvdG90eXBlLmVuc3VyZVZpc2liaWxpdHk9ZnVuY3Rpb24oKXt0aGlzLm5vZGVWaXNpYmxlPSEwfSxlLnByb3RvdHlwZS5lbnN1cmVJbnZpc2liaWxpdHk9ZnVuY3Rpb24oKXt0aGlzLm5vZGVWaXNpYmxlPSExfSxlLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlVmlzaWJsZX0sZS5wcm90b3R5cGUudmlzaWJpbGl0eUluZm89ZnVuY3Rpb24oKXtyZXR1cm57dmlzaWJpbGl0eUJsb2Nrczp0aGlzLnZpc2liaWxpdHlCbG9ja3Msbm9kZVZpc2libGU6dGhpcy5ub2RlVmlzaWJsZX19LGUucHJvdG90eXBlLmNvcHlWaXNpYmlsaXR5SW5mbz1mdW5jdGlvbihlKXtlJiYodGhpcy52aXNpYmlsaXR5QmxvY2tzPWUudmlzaWJpbGl0eUJsb2Nrcyx0aGlzLm5vZGVWaXNpYmxlPWUubm9kZVZpc2libGUpfSxlfSgpLGM9ZnVuY3Rpb24oZSx0LGkpe3ZhciBuPXRoaXM7QXJyYXkuaXNBcnJheShlKT90aGlzLnJnYj1lOmUubGVuZ3RoPj02Pyh0aGlzLnJnYj1bXSxlLm1hdGNoKC8uezJ9L2cpLm1hcCgoZnVuY3Rpb24oZSx0KXt0PDM/bi5yZ2IucHVzaChwYXJzZUludChlLDE2KSk6bi5hbHBoYT1wYXJzZUludChlLDE2KS8yNTV9KSkpOih0aGlzLnJnYj1bXSxlLnNwbGl0KCIiKS5tYXAoKGZ1bmN0aW9uKGUsdCl7dDwzP24ucmdiLnB1c2gocGFyc2VJbnQoZStlLDE2KSk6bi5hbHBoYT1wYXJzZUludChlK2UsMTYpLzI1NX0pKSksdGhpcy5hbHBoYT10aGlzLmFscGhhfHwoIm51bWJlciI9PXR5cGVvZiB0P3Q6MSksdm9pZCAwIT09aSYmKHRoaXMudmFsdWU9aSl9O2Z1bmN0aW9uIGgoZSx0KXtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoZSwwKSx0KX1mdW5jdGlvbiBmKGUpe3JldHVybiIjIitlLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuKChlPWgoTWF0aC5yb3VuZChlKSwyNTUpKTwxNj8iMCI6IiIpK2UudG9TdHJpbmcoMTYpfSkpLmpvaW4oIiIpfWMucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IkNvbG9yIixsdW1hOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZ2JbMF0vMjU1LHQ9dGhpcy5yZ2JbMV0vMjU1LGk9dGhpcy5yZ2JbMl0vMjU1O3JldHVybi4yMTI2KihlPWU8PS4wMzkyOD9lLzEyLjkyOk1hdGgucG93KChlKy4wNTUpLzEuMDU1LDIuNCkpKy43MTUyKih0PXQ8PS4wMzkyOD90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCkpKy4wNzIyKihpPWk8PS4wMzkyOD9pLzEyLjkyOk1hdGgucG93KChpKy4wNTUpLzEuMDU1LDIuNCkpfSxnZW5DU1M6ZnVuY3Rpb24oZSx0KXt0LmFkZCh0aGlzLnRvQ1NTKGUpKX0sdG9DU1M6ZnVuY3Rpb24oZSx0KXt2YXIgaSxuLHIscz1lJiZlLmNvbXByZXNzJiYhdCxvPVtdO2lmKG49dGhpcy5mcm91bmQoZSx0aGlzLmFscGhhKSx0aGlzLnZhbHVlKWlmKDA9PT10aGlzLnZhbHVlLmluZGV4T2YoInJnYiIpKW48MSYmKHI9InJnYmEiKTtlbHNle2lmKDAhPT10aGlzLnZhbHVlLmluZGV4T2YoImhzbCIpKXJldHVybiB0aGlzLnZhbHVlO3I9bjwxPyJoc2xhIjoiaHNsIn1lbHNlIG48MSYmKHI9InJnYmEiKTtzd2l0Y2gocil7Y2FzZSJyZ2JhIjpvPXRoaXMucmdiLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGgoTWF0aC5yb3VuZChlKSwyNTUpfSkpLmNvbmNhdChoKG4sMSkpO2JyZWFrO2Nhc2UiaHNsYSI6by5wdXNoKGgobiwxKSk7Y2FzZSJoc2wiOmk9dGhpcy50b0hTTCgpLG89W3RoaXMuZnJvdW5kKGUsaS5oKSx0aGlzLmZyb3VuZChlLDEwMCppLnMpKyIlIix0aGlzLmZyb3VuZChlLDEwMCppLmwpKyIlIl0uY29uY2F0KG8pfWlmKHIpcmV0dXJuIHIrIigiK28uam9pbigiLCIrKHM/IiI6IiAiKSkrIikiO2lmKGk9dGhpcy50b1JHQigpLHMpe3ZhciBhPWkuc3BsaXQoIiIpO2FbMV09PT1hWzJdJiZhWzNdPT09YVs0XSYmYVs1XT09PWFbNl0mJihpPSIjIithWzFdK2FbM10rYVs1XSl9cmV0dXJuIGl9LG9wZXJhdGU6ZnVuY3Rpb24oZSx0LGkpe2Zvcih2YXIgbj1uZXcgQXJyYXkoMykscj10aGlzLmFscGhhKigxLWkuYWxwaGEpK2kuYWxwaGEscz0wO3M8MztzKyspbltzXT10aGlzLl9vcGVyYXRlKGUsdCx0aGlzLnJnYltzXSxpLnJnYltzXSk7cmV0dXJuIG5ldyBjKG4scil9LHRvUkdCOmZ1bmN0aW9uKCl7cmV0dXJuIGYodGhpcy5yZ2IpfSx0b0hTTDpmdW5jdGlvbigpe3ZhciBlLHQsaT10aGlzLnJnYlswXS8yNTUsbj10aGlzLnJnYlsxXS8yNTUscj10aGlzLnJnYlsyXS8yNTUscz10aGlzLmFscGhhLG89TWF0aC5tYXgoaSxuLHIpLGE9TWF0aC5taW4oaSxuLHIpLGw9KG8rYSkvMix1PW8tYTtpZihvPT09YSllPXQ9MDtlbHNle3N3aXRjaCh0PWw+LjU/dS8oMi1vLWEpOnUvKG8rYSksbyl7Y2FzZSBpOmU9KG4tcikvdSsobjxyPzY6MCk7YnJlYWs7Y2FzZSBuOmU9KHItaSkvdSsyO2JyZWFrO2Nhc2UgcjplPShpLW4pL3UrNH1lLz02fXJldHVybntoOjM2MCplLHM6dCxsOmwsYTpzfX0sdG9IU1Y6ZnVuY3Rpb24oKXt2YXIgZSx0LGk9dGhpcy5yZ2JbMF0vMjU1LG49dGhpcy5yZ2JbMV0vMjU1LHI9dGhpcy5yZ2JbMl0vMjU1LHM9dGhpcy5hbHBoYSxvPU1hdGgubWF4KGksbixyKSxhPU1hdGgubWluKGksbixyKSxsPW8sdT1vLWE7aWYodD0wPT09bz8wOnUvbyxvPT09YSllPTA7ZWxzZXtzd2l0Y2gobyl7Y2FzZSBpOmU9KG4tcikvdSsobjxyPzY6MCk7YnJlYWs7Y2FzZSBuOmU9KHItaSkvdSsyO2JyZWFrO2Nhc2UgcjplPShpLW4pL3UrNH1lLz02fXJldHVybntoOjM2MCplLHM6dCx2OmwsYTpzfX0sdG9BUkdCOmZ1bmN0aW9uKCl7cmV0dXJuIGYoWzI1NSp0aGlzLmFscGhhXS5jb25jYXQodGhpcy5yZ2IpKX0sY29tcGFyZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZ2ImJmUucmdiWzBdPT09dGhpcy5yZ2JbMF0mJmUucmdiWzFdPT09dGhpcy5yZ2JbMV0mJmUucmdiWzJdPT09dGhpcy5yZ2JbMl0mJmUuYWxwaGE9PT10aGlzLmFscGhhPzA6dm9pZCAwfX0pLGMuZnJvbUtleXdvcmQ9ZnVuY3Rpb24oZSl7dmFyIHQsaT1lLnRvTG93ZXJDYXNlKCk7aWYoby5oYXNPd25Qcm9wZXJ0eShpKT90PW5ldyBjKG9baV0uc2xpY2UoMSkpOiJ0cmFuc3BhcmVudCI9PT1pJiYodD1uZXcgYyhbMCwwLDBdLDApKSx0KXJldHVybiB0LnZhbHVlPWUsdH07dmFyIHA9ZnVuY3Rpb24oZSl7dGhpcy52YWx1ZT1lfTtwLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJQYXJlbiIsZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dC5hZGQoIigiKSx0aGlzLnZhbHVlLmdlbkNTUyhlLHQpLHQuYWRkKCIpIil9LGV2YWw6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBwKHRoaXMudmFsdWUuZXZhbChlKSl9fSk7dmFyIHY9eyIiOiEwLCIgIjohMCwifCI6ITB9LGQ9ZnVuY3Rpb24oZSl7IiAiPT09ZT8odGhpcy52YWx1ZT0iICIsdGhpcy5lbXB0eU9yV2hpdGVzcGFjZT0hMCk6KHRoaXMudmFsdWU9ZT9lLnRyaW0oKToiIix0aGlzLmVtcHR5T3JXaGl0ZXNwYWNlPSIiPT09dGhpcy52YWx1ZSl9O2QucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IkNvbWJpbmF0b3IiLGdlbkNTUzpmdW5jdGlvbihlLHQpe3ZhciBpPWUuY29tcHJlc3N8fHZbdGhpcy52YWx1ZV0/IiI6IiAiO3QuYWRkKGkrdGhpcy52YWx1ZStpKX19KTt2YXIgbT1mdW5jdGlvbihlLHQsaSxuLHIscyl7dGhpcy5jb21iaW5hdG9yPWUgaW5zdGFuY2VvZiBkP2U6bmV3IGQoZSksdGhpcy52YWx1ZT0ic3RyaW5nIj09dHlwZW9mIHQ/dC50cmltKCk6dHx8IiIsdGhpcy5pc1ZhcmlhYmxlPWksdGhpcy5faW5kZXg9bix0aGlzLl9maWxlSW5mbz1yLHRoaXMuY29weVZpc2liaWxpdHlJbmZvKHMpLHRoaXMuc2V0UGFyZW50KHRoaXMuY29tYmluYXRvcix0aGlzKX07bS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiRWxlbWVudCIsYWNjZXB0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMudmFsdWU7dGhpcy5jb21iaW5hdG9yPWUudmlzaXQodGhpcy5jb21iaW5hdG9yKSwib2JqZWN0Ij09dHlwZW9mIHQmJih0aGlzLnZhbHVlPWUudmlzaXQodCkpfSxldmFsOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbSh0aGlzLmNvbWJpbmF0b3IsdGhpcy52YWx1ZS5ldmFsP3RoaXMudmFsdWUuZXZhbChlKTp0aGlzLnZhbHVlLHRoaXMuaXNWYXJpYWJsZSx0aGlzLmdldEluZGV4KCksdGhpcy5maWxlSW5mbygpLHRoaXMudmlzaWJpbGl0eUluZm8oKSl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBtKHRoaXMuY29tYmluYXRvcix0aGlzLnZhbHVlLHRoaXMuaXNWYXJpYWJsZSx0aGlzLmdldEluZGV4KCksdGhpcy5maWxlSW5mbygpLHRoaXMudmlzaWJpbGl0eUluZm8oKSl9LGdlbkNTUzpmdW5jdGlvbihlLHQpe3QuYWRkKHRoaXMudG9DU1MoZSksdGhpcy5maWxlSW5mbygpLHRoaXMuZ2V0SW5kZXgoKSl9LHRvQ1NTOmZ1bmN0aW9uKGUpe2U9ZXx8e307dmFyIHQ9dGhpcy52YWx1ZSxpPWUuZmlyc3RTZWxlY3RvcjtyZXR1cm4gdCBpbnN0YW5jZW9mIHAmJihlLmZpcnN0U2VsZWN0b3I9ITApLHQ9dC50b0NTUz90LnRvQ1NTKGUpOnQsZS5maXJzdFNlbGVjdG9yPWksIiI9PT10JiYiJiI9PT10aGlzLmNvbWJpbmF0b3IudmFsdWUuY2hhckF0KDApPyIiOnRoaXMuY29tYmluYXRvci50b0NTUyhlKSt0fX0pO3ZhciBnPXtBTFdBWVM6MCxQQVJFTlNfRElWSVNJT046MSxQQVJFTlM6Mn0seT0wLGI9MSx3PTI7ZnVuY3Rpb24geChlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsLTEpfWZ1bmN0aW9uIFMoZSl7cmV0dXJuIkFycmF5Ij09PXgoZSl9ZnVuY3Rpb24gSShlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD17fSksUyhlKT9lLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIEkoZSx0KX0pKToiT2JqZWN0IiE9PXgoaT1lKXx8aS5jb25zdHJ1Y3RvciE9PU9iamVjdHx8T2JqZWN0LmdldFByb3RvdHlwZU9mKGkpIT09T2JqZWN0LnByb3RvdHlwZT9lOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPTAsdD0wLGk9YXJndW1lbnRzLmxlbmd0aDt0PGk7dCsrKWUrPWFyZ3VtZW50c1t0XS5sZW5ndGg7dmFyIG49QXJyYXkoZSkscj0wO2Zvcih0PTA7dDxpO3QrKylmb3IodmFyIHM9YXJndW1lbnRzW3RdLG89MCxhPXMubGVuZ3RoO288YTtvKysscisrKW5bcl09c1tvXTtyZXR1cm4gbn0oT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSksT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKSkucmVkdWNlKChmdW5jdGlvbihpLG4pe3JldHVybiBTKHQucHJvcHMpJiYhdC5wcm9wcy5pbmNsdWRlcyhuKXx8ZnVuY3Rpb24oZSx0LGksbixyKXt2YXIgcz17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG4sdCk/ImVudW1lcmFibGUiOiJub25lbnVtZXJhYmxlIjsiZW51bWVyYWJsZSI9PT1zJiYoZVt0XT1pKSxyJiYibm9uZW51bWVyYWJsZSI9PT1zJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTppLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9KGksbixJKGVbbl0sdCksZSx0Lm5vbmVudW1lcmFibGUpLGl9KSx7fSk7dmFyIGl9ZnVuY3Rpb24gQyhlLHQpe2Zvcih2YXIgaT1lKzEsbj1udWxsLHI9LTE7LS1pPj0wJiYiXG4iIT09dC5jaGFyQXQoaSk7KXIrKztyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGUmJihuPSh0LnNsaWNlKDAsZSkubWF0Y2goL1xuL2cpfHwiIikubGVuZ3RoKSx7bGluZTpuLGNvbHVtbjpyfX1mdW5jdGlvbiBrKGUpe3ZhciB0LGk9ZS5sZW5ndGgsbj1uZXcgQXJyYXkoaSk7Zm9yKHQ9MDt0PGk7dCsrKW5bdF09ZVt0XTtyZXR1cm4gbn1mdW5jdGlvbiBfKGUpe3ZhciB0PXt9O2Zvcih2YXIgaSBpbiBlKWUuaGFzT3duUHJvcGVydHkoaSkmJih0W2ldPWVbaV0pO3JldHVybiB0fWZ1bmN0aW9uIEEoZSx0KXt2YXIgaT10fHx7fTtpZighdC5fZGVmYXVsdHMpe2k9e307dmFyIG49SShlKTtpLl9kZWZhdWx0cz1uO3ZhciByPXQ/SSh0KTp7fTtPYmplY3QuYXNzaWduKGksbixyKX1yZXR1cm4gaX1mdW5jdGlvbiBNKGUsdCl7aWYodCYmdC5fZGVmYXVsdHMpcmV0dXJuIHQ7dmFyIGk9QShlLHQpO2lmKGkuc3RyaWN0TWF0aCYmKGkubWF0aD1nLlBBUkVOUyksaS5yZWxhdGl2ZVVybHMmJihpLnJld3JpdGVVcmxzPXcpLCJzdHJpbmciPT10eXBlb2YgaS5tYXRoKXN3aXRjaChpLm1hdGgudG9Mb3dlckNhc2UoKSl7Y2FzZSJhbHdheXMiOmkubWF0aD1nLkFMV0FZUzticmVhaztjYXNlInBhcmVucy1kaXZpc2lvbiI6aS5tYXRoPWcuUEFSRU5TX0RJVklTSU9OO2JyZWFrO2Nhc2Uic3RyaWN0IjpjYXNlInBhcmVucyI6aS5tYXRoPWcuUEFSRU5TO2JyZWFrO2RlZmF1bHQ6aS5tYXRoPWcuUEFSRU5TfWlmKCJzdHJpbmciPT10eXBlb2YgaS5yZXdyaXRlVXJscylzd2l0Y2goaS5yZXdyaXRlVXJscy50b0xvd2VyQ2FzZSgpKXtjYXNlIm9mZiI6aS5yZXdyaXRlVXJscz15O2JyZWFrO2Nhc2UibG9jYWwiOmkucmV3cml0ZVVybHM9YjticmVhaztjYXNlImFsbCI6aS5yZXdyaXRlVXJscz13fXJldHVybiBpfWZ1bmN0aW9uIEUoZSx0KXt2b2lkIDA9PT10JiYodD1bXSk7Zm9yKHZhciBpPTAsbj1lLmxlbmd0aDtpPG47aSsrKXt2YXIgcj1lW2ldO0FycmF5LmlzQXJyYXkocik/RShyLHQpOnZvaWQgMCE9PXImJnQucHVzaChyKX1yZXR1cm4gdH12YXIgUD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRMb2NhdGlvbjpDLGNvcHlBcnJheTprLGNsb25lOl8sZGVmYXVsdHM6QSxjb3B5T3B0aW9uczpNLG1lcmdlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBpIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShpKSYmKGVbaV09dFtpXSk7cmV0dXJuIGV9LGZsYXR0ZW5BcnJheTpFfSksUj0vKDxhbm9ueW1vdXM+fEZ1bmN0aW9uKTooXGQrKTooXGQrKS8sTz1mdW5jdGlvbihlLHQsaSl7RXJyb3IuY2FsbCh0aGlzKTt2YXIgbj1lLmZpbGVuYW1lfHxpO2lmKHRoaXMubWVzc2FnZT1lLm1lc3NhZ2UsdGhpcy5zdGFjaz1lLnN0YWNrLHQmJm4pe3ZhciByPXQuY29udGVudHNbbl0scz1DKGUuaW5kZXgsciksbz1zLmxpbmUsYT1zLmNvbHVtbixsPWUuY2FsbCYmQyhlLmNhbGwscikubGluZSx1PXI/ci5zcGxpdCgiXG4iKToiIjtpZih0aGlzLnR5cGU9ZS50eXBlfHwiU3ludGF4Iix0aGlzLmZpbGVuYW1lPW4sdGhpcy5pbmRleD1lLmluZGV4LHRoaXMubGluZT0ibnVtYmVyIj09dHlwZW9mIG8/bysxOm51bGwsdGhpcy5jb2x1bW49YSwhdGhpcy5saW5lJiZ0aGlzLnN0YWNrKXt2YXIgYz10aGlzLnN0YWNrLm1hdGNoKFIpLGg9bmV3IEZ1bmN0aW9uKCJhIiwidGhyb3cgbmV3IEVycm9yKCkiKSxmPTA7dHJ5e2goKX1jYXRjaChlKXt2YXIgcD1lLnN0YWNrLm1hdGNoKFIpO2Y9MS0obz1wYXJzZUludChwWzJdKSl9YyYmKGNbMl0mJih0aGlzLmxpbmU9cGFyc2VJbnQoY1syXSkrZiksY1szXSYmKHRoaXMuY29sdW1uPXBhcnNlSW50KGNbM10pKSl9dGhpcy5jYWxsTGluZT1sKzEsdGhpcy5jYWxsRXh0cmFjdD11W2xdLHRoaXMuZXh0cmFjdD1bdVt0aGlzLmxpbmUtMl0sdVt0aGlzLmxpbmUtMV0sdVt0aGlzLmxpbmVdXX19O2lmKHZvaWQgMD09PU9iamVjdC5jcmVhdGUpe3ZhciBWPWZ1bmN0aW9uKCl7fTtWLnByb3RvdHlwZT1FcnJvci5wcm90b3R5cGUsTy5wcm90b3R5cGU9bmV3IFZ9ZWxzZSBPLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7Ty5wcm90b3R5cGUuY29uc3RydWN0b3I9TyxPLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbihlKXtlPWV8fHt9O3ZhciB0PSIiLGk9dGhpcy5leHRyYWN0fHxbXSxuPVtdLHI9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9O2lmKGUuc3R5bGl6ZSl7dmFyIHM9dHlwZW9mIGUuc3R5bGl6ZTtpZigiZnVuY3Rpb24iIT09cyl0aHJvdyBFcnJvcigib3B0aW9ucy5zdHlsaXplIHNob3VsZCBiZSBhIGZ1bmN0aW9uLCBnb3QgYSAiK3MrIiEiKTtyPWUuc3R5bGl6ZX1pZihudWxsIT09dGhpcy5saW5lKXtpZigic3RyaW5nIj09dHlwZW9mIGlbMF0mJm4ucHVzaChyKHRoaXMubGluZS0xKyIgIitpWzBdLCJncmV5IikpLCJzdHJpbmciPT10eXBlb2YgaVsxXSl7dmFyIG89dGhpcy5saW5lKyIgIjtpWzFdJiYobys9aVsxXS5zbGljZSgwLHRoaXMuY29sdW1uKStyKHIocihpWzFdLnN1YnN0cih0aGlzLmNvbHVtbiwxKSwiYm9sZCIpK2lbMV0uc2xpY2UodGhpcy5jb2x1bW4rMSksInJlZCIpLCJpbnZlcnNlIikpLG4ucHVzaChvKX0ic3RyaW5nIj09dHlwZW9mIGlbMl0mJm4ucHVzaChyKHRoaXMubGluZSsxKyIgIitpWzJdLCJncmV5IikpLG49bi5qb2luKCJcbiIpK3IoIiIsInJlc2V0IikrIlxuIn1yZXR1cm4gdCs9cih0aGlzLnR5cGUrIkVycm9yOiAiK3RoaXMubWVzc2FnZSwicmVkIiksdGhpcy5maWxlbmFtZSYmKHQrPXIoIiBpbiAiLCJyZWQiKSt0aGlzLmZpbGVuYW1lKSx0aGlzLmxpbmUmJih0Kz1yKCIgb24gbGluZSAiK3RoaXMubGluZSsiLCBjb2x1bW4gIisodGhpcy5jb2x1bW4rMSkrIjoiLCJncmV5IikpLHQrPSJcbiIrbix0aGlzLmNhbGxMaW5lJiYodCs9cigiZnJvbSAiLCJyZWQiKSsodGhpcy5maWxlbmFtZXx8IiIpKyIvbiIsdCs9cih0aGlzLmNhbGxMaW5lLCJncmV5IikrIiAiK3RoaXMuY2FsbEV4dHJhY3QrIi9uIiksdH07dmFyIEY9ZnVuY3Rpb24oZSx0LGksbixyLHMpe3RoaXMuZXh0ZW5kTGlzdD10LHRoaXMuY29uZGl0aW9uPWksdGhpcy5ldmFsZENvbmRpdGlvbj0haSx0aGlzLl9pbmRleD1uLHRoaXMuX2ZpbGVJbmZvPXIsdGhpcy5lbGVtZW50cz10aGlzLmdldEVsZW1lbnRzKGUpLHRoaXMubWl4aW5FbGVtZW50c189dm9pZCAwLHRoaXMuY29weVZpc2liaWxpdHlJbmZvKHMpLHRoaXMuc2V0UGFyZW50KHRoaXMuZWxlbWVudHMsdGhpcyl9O0YucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IlNlbGVjdG9yIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50cyYmKHRoaXMuZWxlbWVudHM9ZS52aXNpdEFycmF5KHRoaXMuZWxlbWVudHMpKSx0aGlzLmV4dGVuZExpc3QmJih0aGlzLmV4dGVuZExpc3Q9ZS52aXNpdEFycmF5KHRoaXMuZXh0ZW5kTGlzdCkpLHRoaXMuY29uZGl0aW9uJiYodGhpcy5jb25kaXRpb249ZS52aXNpdCh0aGlzLmNvbmRpdGlvbikpfSxjcmVhdGVEZXJpdmVkOmZ1bmN0aW9uKGUsdCxpKXtlPXRoaXMuZ2V0RWxlbWVudHMoZSk7dmFyIG49bmV3IEYoZSx0fHx0aGlzLmV4dGVuZExpc3QsbnVsbCx0aGlzLmdldEluZGV4KCksdGhpcy5maWxlSW5mbygpLHRoaXMudmlzaWJpbGl0eUluZm8oKSk7cmV0dXJuIG4uZXZhbGRDb25kaXRpb249bnVsbCE9aT9pOnRoaXMuZXZhbGRDb25kaXRpb24sbi5tZWRpYUVtcHR5PXRoaXMubWVkaWFFbXB0eSxufSxnZXRFbGVtZW50czpmdW5jdGlvbihlKXtyZXR1cm4gZT8oInN0cmluZyI9PXR5cGVvZiBlJiZ0aGlzLnBhcnNlLnBhcnNlTm9kZShlLFsic2VsZWN0b3IiXSx0aGlzLl9pbmRleCx0aGlzLl9maWxlSW5mbywoZnVuY3Rpb24odCxpKXtpZih0KXRocm93IG5ldyBPKHtpbmRleDp0LmluZGV4LG1lc3NhZ2U6dC5tZXNzYWdlfSx0aGlzLnBhcnNlLmltcG9ydHMsdGhpcy5fZmlsZUluZm8uZmlsZW5hbWUpO2U9aVswXS5lbGVtZW50c30pKSxlKTpbbmV3IG0oIiIsIiYiLCExLHRoaXMuX2luZGV4LHRoaXMuX2ZpbGVJbmZvKV19LGNyZWF0ZUVtcHR5U2VsZWN0b3JzOmZ1bmN0aW9uKCl7dmFyIGU9bmV3IG0oIiIsIiYiLCExLHRoaXMuX2luZGV4LHRoaXMuX2ZpbGVJbmZvKSx0PVtuZXcgRihbZV0sbnVsbCxudWxsLHRoaXMuX2luZGV4LHRoaXMuX2ZpbGVJbmZvKV07cmV0dXJuIHRbMF0ubWVkaWFFbXB0eT0hMCx0fSxtYXRjaDpmdW5jdGlvbihlKXt2YXIgdCxpLG49dGhpcy5lbGVtZW50cyxyPW4ubGVuZ3RoO2lmKDA9PT0odD0oZT1lLm1peGluRWxlbWVudHMoKSkubGVuZ3RoKXx8cjx0KXJldHVybiAwO2ZvcihpPTA7aTx0O2krKylpZihuW2ldLnZhbHVlIT09ZVtpXSlyZXR1cm4gMDtyZXR1cm4gdH0sbWl4aW5FbGVtZW50czpmdW5jdGlvbigpe2lmKHRoaXMubWl4aW5FbGVtZW50c18pcmV0dXJuIHRoaXMubWl4aW5FbGVtZW50c187dmFyIGU9dGhpcy5lbGVtZW50cy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbWJpbmF0b3IudmFsdWUrKGUudmFsdWUudmFsdWV8fGUudmFsdWUpfSkpLmpvaW4oIiIpLm1hdGNoKC9bLCYjXCpcLlx3LV0oW1x3LV18KFxcLikpKi9nKTtyZXR1cm4gZT8iJiI9PT1lWzBdJiZlLnNoaWZ0KCk6ZT1bXSx0aGlzLm1peGluRWxlbWVudHNfPWV9LGlzSnVzdFBhcmVudFNlbGVjdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubWVkaWFFbXB0eSYmMT09PXRoaXMuZWxlbWVudHMubGVuZ3RoJiYiJiI9PT10aGlzLmVsZW1lbnRzWzBdLnZhbHVlJiYoIiAiPT09dGhpcy5lbGVtZW50c1swXS5jb21iaW5hdG9yLnZhbHVlfHwiIj09PXRoaXMuZWxlbWVudHNbMF0uY29tYmluYXRvci52YWx1ZSl9LGV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jb25kaXRpb24mJnRoaXMuY29uZGl0aW9uLmV2YWwoZSksaT10aGlzLmVsZW1lbnRzLG49dGhpcy5leHRlbmRMaXN0O3JldHVybiBpPWkmJmkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5ldmFsKGUpfSkpLG49biYmbi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmV2YWwoZSl9KSksdGhpcy5jcmVhdGVEZXJpdmVkKGksbix0KX0sZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dmFyIGk7Zm9yKGUmJmUuZmlyc3RTZWxlY3Rvcnx8IiIhPT10aGlzLmVsZW1lbnRzWzBdLmNvbWJpbmF0b3IudmFsdWV8fHQuYWRkKCIgIix0aGlzLmZpbGVJbmZvKCksdGhpcy5nZXRJbmRleCgpKSxpPTA7aTx0aGlzLmVsZW1lbnRzLmxlbmd0aDtpKyspdGhpcy5lbGVtZW50c1tpXS5nZW5DU1MoZSx0KX0sZ2V0SXNPdXRwdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ldmFsZENvbmRpdGlvbn19KTt2YXIgJD1mdW5jdGlvbihlKXtpZighZSl0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIHJlcXVpcmVzIGFuIGFycmF5IGFyZ3VtZW50Iik7QXJyYXkuaXNBcnJheShlKT90aGlzLnZhbHVlPWU6dGhpcy52YWx1ZT1bZV19OyQucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IlZhbHVlIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy52YWx1ZSYmKHRoaXMudmFsdWU9ZS52aXNpdEFycmF5KHRoaXMudmFsdWUpKX0sZXZhbDpmdW5jdGlvbihlKXtyZXR1cm4gMT09PXRoaXMudmFsdWUubGVuZ3RoP3RoaXMudmFsdWVbMF0uZXZhbChlKTpuZXcgJCh0aGlzLnZhbHVlLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZXZhbChlKX0pKSl9LGdlbkNTUzpmdW5jdGlvbihlLHQpe3ZhciBpO2ZvcihpPTA7aTx0aGlzLnZhbHVlLmxlbmd0aDtpKyspdGhpcy52YWx1ZVtpXS5nZW5DU1MoZSx0KSxpKzE8dGhpcy52YWx1ZS5sZW5ndGgmJnQuYWRkKGUmJmUuY29tcHJlc3M/IiwiOiIsICIpfX0pO3ZhciBMPWZ1bmN0aW9uKGUpe3RoaXMudmFsdWU9ZX07TC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiS2V5d29yZCIsZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7aWYoIiUiPT09dGhpcy52YWx1ZSl0aHJvd3t0eXBlOiJTeW50YXgiLG1lc3NhZ2U6IkludmFsaWQgJSB3aXRob3V0IG51bWJlciJ9O3QuYWRkKHRoaXMudmFsdWUpfX0pLEwuVHJ1ZT1uZXcgTCgidHJ1ZSIpLEwuRmFsc2U9bmV3IEwoImZhbHNlIik7dmFyIGo9ZnVuY3Rpb24oZSx0LGksbixyLHMpe3RoaXMudmFsdWU9ZSx0aGlzLl9pbmRleD10LHRoaXMuX2ZpbGVJbmZvPWksdGhpcy5tYXBMaW5lcz1uLHRoaXMucnVsZXNldExpa2U9dm9pZCAwIT09ciYmcix0aGlzLmFsbG93Um9vdD0hMCx0aGlzLmNvcHlWaXNpYmlsaXR5SW5mbyhzKX07ai5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiQW5vbnltb3VzIixldmFsOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBqKHRoaXMudmFsdWUsdGhpcy5faW5kZXgsdGhpcy5fZmlsZUluZm8sdGhpcy5tYXBMaW5lcyx0aGlzLnJ1bGVzZXRMaWtlLHRoaXMudmlzaWJpbGl0eUluZm8oKSl9LGNvbXBhcmU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9DU1MmJnRoaXMudG9DU1MoKT09PWUudG9DU1MoKT8wOnZvaWQgMH0saXNSdWxlc2V0TGlrZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJ1bGVzZXRMaWtlfSxnZW5DU1M6ZnVuY3Rpb24oZSx0KXt0aGlzLm5vZGVWaXNpYmxlPUJvb2xlYW4odGhpcy52YWx1ZSksdGhpcy5ub2RlVmlzaWJsZSYmdC5hZGQodGhpcy52YWx1ZSx0aGlzLl9maWxlSW5mbyx0aGlzLl9pbmRleCx0aGlzLm1hcExpbmVzKX19KTt2YXIgTj1nO3ZhciBEPWZ1bmN0aW9uKGUsdCxpLG4scixzLG8sYSl7dGhpcy5uYW1lPWUsdGhpcy52YWx1ZT10IGluc3RhbmNlb2YgdT90Om5ldyAkKFt0P25ldyBqKHQpOm51bGxdKSx0aGlzLmltcG9ydGFudD1pPyIgIitpLnRyaW0oKToiIix0aGlzLm1lcmdlPW4sdGhpcy5faW5kZXg9cix0aGlzLl9maWxlSW5mbz1zLHRoaXMuaW5saW5lPW98fCExLHRoaXMudmFyaWFibGU9dm9pZCAwIT09YT9hOmUuY2hhckF0JiYiQCI9PT1lLmNoYXJBdCgwKSx0aGlzLmFsbG93Um9vdD0hMCx0aGlzLnNldFBhcmVudCh0aGlzLnZhbHVlLHRoaXMpfTtELnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJEZWNsYXJhdGlvbiIsZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dC5hZGQodGhpcy5uYW1lKyhlLmNvbXByZXNzPyI6IjoiOiAiKSx0aGlzLmZpbGVJbmZvKCksdGhpcy5nZXRJbmRleCgpKTt0cnl7dGhpcy52YWx1ZS5nZW5DU1MoZSx0KX1jYXRjaChlKXt0aHJvdyBlLmluZGV4PXRoaXMuX2luZGV4LGUuZmlsZW5hbWU9dGhpcy5fZmlsZUluZm8uZmlsZW5hbWUsZX10LmFkZCh0aGlzLmltcG9ydGFudCsodGhpcy5pbmxpbmV8fGUubGFzdFJ1bGUmJmUuY29tcHJlc3M/IiI6IjsiKSx0aGlzLl9maWxlSW5mbyx0aGlzLl9pbmRleCl9LGV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuPSExLHI9dGhpcy5uYW1lLHM9dGhpcy52YXJpYWJsZTsic3RyaW5nIiE9dHlwZW9mIHImJihyPTE9PT1yLmxlbmd0aCYmclswXWluc3RhbmNlb2YgTD9yWzBdLnZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIGksbj0iIixyPXQubGVuZ3RoLHM9e2FkZDpmdW5jdGlvbihlKXtuKz1lfX07Zm9yKGk9MDtpPHI7aSsrKXRbaV0uZXZhbChlKS5nZW5DU1MoZSxzKTtyZXR1cm4gbn0oZSxyKSxzPSExKSwiZm9udCI9PT1yJiZlLm1hdGg9PT1OLkFMV0FZUyYmKG49ITAsdD1lLm1hdGgsZS5tYXRoPU4uUEFSRU5TX0RJVklTSU9OKTt0cnl7aWYoZS5pbXBvcnRhbnRTY29wZS5wdXNoKHt9KSxpPXRoaXMudmFsdWUuZXZhbChlKSwhdGhpcy52YXJpYWJsZSYmIkRldGFjaGVkUnVsZXNldCI9PT1pLnR5cGUpdGhyb3d7bWVzc2FnZToiUnVsZXNldHMgY2Fubm90IGJlIGV2YWx1YXRlZCBvbiBhIHByb3BlcnR5LiIsaW5kZXg6dGhpcy5nZXRJbmRleCgpLGZpbGVuYW1lOnRoaXMuZmlsZUluZm8oKS5maWxlbmFtZX07dmFyIG89dGhpcy5pbXBvcnRhbnQsYT1lLmltcG9ydGFudFNjb3BlLnBvcCgpO3JldHVybiFvJiZhLmltcG9ydGFudCYmKG89YS5pbXBvcnRhbnQpLG5ldyBEKHIsaSxvLHRoaXMubWVyZ2UsdGhpcy5nZXRJbmRleCgpLHRoaXMuZmlsZUluZm8oKSx0aGlzLmlubGluZSxzKX1jYXRjaChlKXt0aHJvdyJudW1iZXIiIT10eXBlb2YgZS5pbmRleCYmKGUuaW5kZXg9dGhpcy5nZXRJbmRleCgpLGUuZmlsZW5hbWU9dGhpcy5maWxlSW5mbygpLmZpbGVuYW1lKSxlfWZpbmFsbHl7biYmKGUubWF0aD10KX19LG1ha2VJbXBvcnRhbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEQodGhpcy5uYW1lLHRoaXMudmFsdWUsIiFpbXBvcnRhbnQiLHRoaXMubWVyZ2UsdGhpcy5nZXRJbmRleCgpLHRoaXMuZmlsZUluZm8oKSx0aGlzLmlubGluZSl9fSk7dmFyIEI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsaSxuKXt2YXIgcj0iIjtpZih0LmR1bXBMaW5lTnVtYmVycyYmIXQuY29tcHJlc3Mpc3dpdGNoKHQuZHVtcExpbmVOdW1iZXJzKXtjYXNlImNvbW1lbnRzIjpyPWUuYXNDb21tZW50KGkpO2JyZWFrO2Nhc2UibWVkaWFxdWVyeSI6cj1lLmFzTWVkaWFRdWVyeShpKTticmVhaztjYXNlImFsbCI6cj1lLmFzQ29tbWVudChpKSsobnx8IiIpK2UuYXNNZWRpYVF1ZXJ5KGkpfXJldHVybiByfXJldHVybiBlLmFzQ29tbWVudD1mdW5jdGlvbihlKXtyZXR1cm4iLyogbGluZSAiK2UuZGVidWdJbmZvLmxpbmVOdW1iZXIrIiwgIitlLmRlYnVnSW5mby5maWxlTmFtZSsiICovXG4ifSxlLmFzTWVkaWFRdWVyeT1mdW5jdGlvbihlKXt2YXIgdD1lLmRlYnVnSW5mby5maWxlTmFtZTtyZXR1cm4vXlthLXpdKzpcL1wvL2kudGVzdCh0KXx8KHQ9ImZpbGU6Ly8iK3QpLCJAbWVkaWEgLXNhc3MtZGVidWctaW5mb3tmaWxlbmFtZXtmb250LWZhbWlseToiK3QucmVwbGFjZSgvKFsuOlwvXFxdKS9nLChmdW5jdGlvbihlKXtyZXR1cm4iXFwiPT1lJiYoZT0iLyIpLCJcXCIrZX0pKSsifWxpbmV7Zm9udC1mYW1pbHk6XFwwMDAwMyIrZS5kZWJ1Z0luZm8ubGluZU51bWJlcisifX1cbiJ9LGV9KCksVT1mdW5jdGlvbihlLHQsaSxuKXt0aGlzLnZhbHVlPWUsdGhpcy5pc0xpbmVDb21tZW50PXQsdGhpcy5faW5kZXg9aSx0aGlzLl9maWxlSW5mbz1uLHRoaXMuYWxsb3dSb290PSEwfTtVLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJDb21tZW50IixnZW5DU1M6ZnVuY3Rpb24oZSx0KXt0aGlzLmRlYnVnSW5mbyYmdC5hZGQoQihlLHRoaXMpLHRoaXMuZmlsZUluZm8oKSx0aGlzLmdldEluZGV4KCkpLHQuYWRkKHRoaXMudmFsdWUpfSxpc1NpbGVudDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbXByZXNzJiYiISIhPT10aGlzLnZhbHVlWzJdO3JldHVybiB0aGlzLmlzTGluZUNvbW1lbnR8fHR9fSk7dmFyIHE9e30sVD1mdW5jdGlvbihlLHQsaSl7aWYoZSlmb3IodmFyIG49MDtuPGkubGVuZ3RoO24rKyllLmhhc093blByb3BlcnR5KGlbbl0pJiYodFtpW25dXT1lW2lbbl1dKX0sej1bInBhdGhzIiwicmV3cml0ZVVybHMiLCJyb290cGF0aCIsInN0cmljdEltcG9ydHMiLCJpbnNlY3VyZSIsImR1bXBMaW5lTnVtYmVycyIsImNvbXByZXNzIiwic3luY0ltcG9ydCIsImNodW5rSW5wdXQiLCJtaW1lIiwidXNlRmlsZUNhY2hlIiwicHJvY2Vzc0ltcG9ydHMiLCJwbHVnaW5NYW5hZ2VyIl07cS5QYXJzZT1mdW5jdGlvbihlKXtUKGUsdGhpcyx6KSwic3RyaW5nIj09dHlwZW9mIHRoaXMucGF0aHMmJih0aGlzLnBhdGhzPVt0aGlzLnBhdGhzXSl9O3ZhciBHPVsicGF0aHMiLCJjb21wcmVzcyIsIm1hdGgiLCJzdHJpY3RVbml0cyIsInNvdXJjZU1hcCIsImltcG9ydE11bHRpcGxlIiwidXJsQXJncyIsImphdmFzY3JpcHRFbmFibGVkIiwicGx1Z2luTWFuYWdlciIsImltcG9ydGFudFNjb3BlIiwicmV3cml0ZVVybHMiXTtmdW5jdGlvbiBXKGUpe3JldHVybiEvXig/OlthLXotXSs6fFwvfCMpL2kudGVzdChlKX1mdW5jdGlvbiBKKGUpe3JldHVybiIuIj09PWUuY2hhckF0KDApfXEuRXZhbD1mdW5jdGlvbihlLHQpe1QoZSx0aGlzLEcpLCJzdHJpbmciPT10eXBlb2YgdGhpcy5wYXRocyYmKHRoaXMucGF0aHM9W3RoaXMucGF0aHNdKSx0aGlzLmZyYW1lcz10fHxbXSx0aGlzLmltcG9ydGFudFNjb3BlPXRoaXMuaW1wb3J0YW50U2NvcGV8fFtdfSxxLkV2YWwucHJvdG90eXBlLmVudGVyQ2FsYz1mdW5jdGlvbigpe3RoaXMuY2FsY1N0YWNrfHwodGhpcy5jYWxjU3RhY2s9W10pLHRoaXMuY2FsY1N0YWNrLnB1c2goITApLHRoaXMuaW5DYWxjPSEwfSxxLkV2YWwucHJvdG90eXBlLmV4aXRDYWxjPWZ1bmN0aW9uKCl7dGhpcy5jYWxjU3RhY2sucG9wKCksdGhpcy5jYWxjU3RhY2subGVuZ3RofHwodGhpcy5pbkNhbGM9ITEpfSxxLkV2YWwucHJvdG90eXBlLmluUGFyZW50aGVzaXM9ZnVuY3Rpb24oKXt0aGlzLnBhcmVuc1N0YWNrfHwodGhpcy5wYXJlbnNTdGFjaz1bXSksdGhpcy5wYXJlbnNTdGFjay5wdXNoKCEwKX0scS5FdmFsLnByb3RvdHlwZS5vdXRPZlBhcmVudGhlc2lzPWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnNTdGFjay5wb3AoKX0scS5FdmFsLnByb3RvdHlwZS5pbkNhbGM9ITEscS5FdmFsLnByb3RvdHlwZS5tYXRoT249ITAscS5FdmFsLnByb3RvdHlwZS5pc01hdGhPbj1mdW5jdGlvbihlKXtyZXR1cm4hIXRoaXMubWF0aE9uJiYoISEoIi8iIT09ZXx8dGhpcy5tYXRoPT09Zy5BTFdBWVN8fHRoaXMucGFyZW5zU3RhY2smJnRoaXMucGFyZW5zU3RhY2subGVuZ3RoKSYmKCEodGhpcy5tYXRoPmcuUEFSRU5TX0RJVklTSU9OKXx8dGhpcy5wYXJlbnNTdGFjayYmdGhpcy5wYXJlbnNTdGFjay5sZW5ndGgpKX0scS5FdmFsLnByb3RvdHlwZS5wYXRoUmVxdWlyZXNSZXdyaXRlPWZ1bmN0aW9uKGUpe3JldHVybih0aGlzLnJld3JpdGVVcmxzPT09Yj9KOlcpKGUpfSxxLkV2YWwucHJvdG90eXBlLnJld3JpdGVQYXRoPWZ1bmN0aW9uKGUsdCl7dmFyIGk7cmV0dXJuIHQ9dHx8IiIsaT10aGlzLm5vcm1hbGl6ZVBhdGgodCtlKSxKKGUpJiZXKHQpJiYhMT09PUooaSkmJihpPSIuLyIraSksaX0scS5FdmFsLnByb3RvdHlwZS5ub3JtYWxpemVQYXRoPWZ1bmN0aW9uKGUpe3ZhciB0LGk9ZS5zcGxpdCgiLyIpLnJldmVyc2UoKTtmb3IoZT1bXTswIT09aS5sZW5ndGg7KXN3aXRjaCh0PWkucG9wKCkpe2Nhc2UiLiI6YnJlYWs7Y2FzZSIuLiI6MD09PWUubGVuZ3RofHwiLi4iPT09ZVtlLmxlbmd0aC0xXT9lLnB1c2godCk6ZS5wb3AoKTticmVhaztkZWZhdWx0OmUucHVzaCh0KX1yZXR1cm4gZS5qb2luKCIvIil9O3ZhciBIPWZ1bmN0aW9uIGUodCl7cmV0dXJue19kYXRhOnt9LGFkZDpmdW5jdGlvbihlLHQpe2U9ZS50b0xvd2VyQ2FzZSgpLHRoaXMuX2RhdGEuaGFzT3duUHJvcGVydHkoZSksdGhpcy5fZGF0YVtlXT10fSxhZGRNdWx0aXBsZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO09iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKGkpe3QuYWRkKGksZVtpXSl9KSl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZGF0YVtlXXx8dCYmdC5nZXQoZSl9LGdldExvY2FsRnVuY3Rpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9LGluaGVyaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzKX0sY3JlYXRlOmZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfX19KG51bGwpLFE9e2V2YWw6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnZhbHVlXyx0PXRoaXMuZXJyb3JfO2lmKHQpdGhyb3cgdDtpZihudWxsIT1lKXJldHVybiBlP0wuVHJ1ZTpMLkZhbHNlfSx2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnZhbHVlXz1lfSxlcnJvcjpmdW5jdGlvbihlKXt0aGlzLmVycm9yXz1lfSxyZXNldDpmdW5jdGlvbigpe3RoaXMudmFsdWVfPXRoaXMuZXJyb3JfPW51bGx9fSxLPWZ1bmN0aW9uKGUsdCxpLG4pe3RoaXMuc2VsZWN0b3JzPWUsdGhpcy5ydWxlcz10LHRoaXMuX2xvb2t1cHM9e30sdGhpcy5fdmFyaWFibGVzPW51bGwsdGhpcy5fcHJvcGVydGllcz1udWxsLHRoaXMuc3RyaWN0SW1wb3J0cz1pLHRoaXMuY29weVZpc2liaWxpdHlJbmZvKG4pLHRoaXMuYWxsb3dSb290PSEwLHRoaXMuc2V0UGFyZW50KHRoaXMuc2VsZWN0b3JzLHRoaXMpLHRoaXMuc2V0UGFyZW50KHRoaXMucnVsZXMsdGhpcyl9O0sucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IlJ1bGVzZXQiLGlzUnVsZXNldDohMCxpc1J1bGVzZXRMaWtlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGFjY2VwdDpmdW5jdGlvbihlKXt0aGlzLnBhdGhzP3RoaXMucGF0aHM9ZS52aXNpdEFycmF5KHRoaXMucGF0aHMsITApOnRoaXMuc2VsZWN0b3JzJiYodGhpcy5zZWxlY3RvcnM9ZS52aXNpdEFycmF5KHRoaXMuc2VsZWN0b3JzKSksdGhpcy5ydWxlcyYmdGhpcy5ydWxlcy5sZW5ndGgmJih0aGlzLnJ1bGVzPWUudmlzaXRBcnJheSh0aGlzLnJ1bGVzKSl9LGV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuLHIscyxvPSExO2lmKHRoaXMuc2VsZWN0b3JzJiYoaT10aGlzLnNlbGVjdG9ycy5sZW5ndGgpKXtmb3IodD1uZXcgQXJyYXkoaSksUS5lcnJvcih7dHlwZToiU3ludGF4IixtZXNzYWdlOiJpdCBpcyBjdXJyZW50bHkgb25seSBhbGxvd2VkIGluIHBhcmFtZXRyaWMgbWl4aW4gZ3VhcmRzLCJ9KSxyPTA7cjxpO3IrKyl7bj10aGlzLnNlbGVjdG9yc1tyXS5ldmFsKGUpO2Zvcih2YXIgYT0wO2E8bi5lbGVtZW50cy5sZW5ndGg7YSsrKWlmKG4uZWxlbWVudHNbYV0uaXNWYXJpYWJsZSl7cz0hMDticmVha310W3JdPW4sbi5ldmFsZENvbmRpdGlvbiYmKG89ITApfWlmKHMpe3ZhciBsPW5ldyBBcnJheShpKTtmb3Iocj0wO3I8aTtyKyspbj10W3JdLGxbcl09bi50b0NTUyhlKTt0aGlzLnBhcnNlLnBhcnNlTm9kZShsLmpvaW4oIiwiKSxbInNlbGVjdG9ycyJdLHRbMF0uZ2V0SW5kZXgoKSx0WzBdLmZpbGVJbmZvKCksKGZ1bmN0aW9uKGUsaSl7aSYmKHQ9RShpKSl9KSl9US5yZXNldCgpfWVsc2Ugbz0hMDt2YXIgYyxoLGY9dGhpcy5ydWxlcz9rKHRoaXMucnVsZXMpOm51bGwscD1uZXcgSyh0LGYsdGhpcy5zdHJpY3RJbXBvcnRzLHRoaXMudmlzaWJpbGl0eUluZm8oKSk7cC5vcmlnaW5hbFJ1bGVzZXQ9dGhpcyxwLnJvb3Q9dGhpcy5yb290LHAuZmlyc3RSb290PXRoaXMuZmlyc3RSb290LHAuYWxsb3dJbXBvcnRzPXRoaXMuYWxsb3dJbXBvcnRzLHRoaXMuZGVidWdJbmZvJiYocC5kZWJ1Z0luZm89dGhpcy5kZWJ1Z0luZm8pLG98fChmLmxlbmd0aD0wKSxwLmZ1bmN0aW9uUmVnaXN0cnk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LGk9MCxuPWUubGVuZ3RoO2khPT1uOysraSlpZih0PWVbaV0uZnVuY3Rpb25SZWdpc3RyeSlyZXR1cm4gdDtyZXR1cm4gSH0oZS5mcmFtZXMpLmluaGVyaXQoKTt2YXIgdj1lLmZyYW1lczt2LnVuc2hpZnQocCk7dmFyIGQ9ZS5zZWxlY3RvcnM7ZHx8KGUuc2VsZWN0b3JzPWQ9W10pLGQudW5zaGlmdCh0aGlzLnNlbGVjdG9ycyksKHAucm9vdHx8cC5hbGxvd0ltcG9ydHN8fCFwLnN0cmljdEltcG9ydHMpJiZwLmV2YWxJbXBvcnRzKGUpO3ZhciBtPXAucnVsZXM7Zm9yKHI9MDtjPW1bcl07cisrKWMuZXZhbEZpcnN0JiYobVtyXT1jLmV2YWwoZSkpO3ZhciBnPWUubWVkaWFCbG9ja3MmJmUubWVkaWFCbG9ja3MubGVuZ3RofHwwO2ZvcihyPTA7Yz1tW3JdO3IrKykiTWl4aW5DYWxsIj09PWMudHlwZT8oZj1jLmV2YWwoZSkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hKGUgaW5zdGFuY2VvZiBEJiZlLnZhcmlhYmxlKXx8IXAudmFyaWFibGUoZS5uYW1lKX0pKSxtLnNwbGljZS5hcHBseShtLFtyLDFdLmNvbmNhdChmKSkscis9Zi5sZW5ndGgtMSxwLnJlc2V0Q2FjaGUoKSk6IlZhcmlhYmxlQ2FsbCI9PT1jLnR5cGUmJihmPWMuZXZhbChlKS5ydWxlcy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiEoZSBpbnN0YW5jZW9mIEQmJmUudmFyaWFibGUpfSkpLG0uc3BsaWNlLmFwcGx5KG0sW3IsMV0uY29uY2F0KGYpKSxyKz1mLmxlbmd0aC0xLHAucmVzZXRDYWNoZSgpKTtmb3Iocj0wO2M9bVtyXTtyKyspYy5ldmFsRmlyc3R8fChtW3JdPWM9Yy5ldmFsP2MuZXZhbChlKTpjKTtmb3Iocj0wO2M9bVtyXTtyKyspaWYoYyBpbnN0YW5jZW9mIEsmJmMuc2VsZWN0b3JzJiYxPT09Yy5zZWxlY3RvcnMubGVuZ3RoJiZjLnNlbGVjdG9yc1swXSYmYy5zZWxlY3RvcnNbMF0uaXNKdXN0UGFyZW50U2VsZWN0b3IoKSl7bS5zcGxpY2Uoci0tLDEpO2ZvcihhPTA7aD1jLnJ1bGVzW2FdO2ErKyloIGluc3RhbmNlb2YgdSYmKGguY29weVZpc2liaWxpdHlJbmZvKGMudmlzaWJpbGl0eUluZm8oKSksaCBpbnN0YW5jZW9mIEQmJmgudmFyaWFibGV8fG0uc3BsaWNlKCsrciwwLGgpKX1pZih2LnNoaWZ0KCksZC5zaGlmdCgpLGUubWVkaWFCbG9ja3MpZm9yKHI9ZztyPGUubWVkaWFCbG9ja3MubGVuZ3RoO3IrKyllLm1lZGlhQmxvY2tzW3JdLmJ1YmJsZVNlbGVjdG9ycyh0KTtyZXR1cm4gcH0sZXZhbEltcG9ydHM6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuPXRoaXMucnVsZXM7aWYobilmb3IodD0wO3Q8bi5sZW5ndGg7dCsrKSJJbXBvcnQiPT09blt0XS50eXBlJiYoKGk9blt0XS5ldmFsKGUpKSYmKGkubGVuZ3RofHwwPT09aS5sZW5ndGgpPyhuLnNwbGljZS5hcHBseShuLFt0LDFdLmNvbmNhdChpKSksdCs9aS5sZW5ndGgtMSk6bi5zcGxpY2UodCwxLGkpLHRoaXMucmVzZXRDYWNoZSgpKX0sbWFrZUltcG9ydGFudDpmdW5jdGlvbigpe3JldHVybiBuZXcgSyh0aGlzLnNlbGVjdG9ycyx0aGlzLnJ1bGVzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUubWFrZUltcG9ydGFudD9lLm1ha2VJbXBvcnRhbnQoKTplfSkpLHRoaXMuc3RyaWN0SW1wb3J0cyx0aGlzLnZpc2liaWxpdHlJbmZvKCkpfSxtYXRjaEFyZ3M6ZnVuY3Rpb24oZSl7cmV0dXJuIWV8fDA9PT1lLmxlbmd0aH0sbWF0Y2hDb25kaXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLnNlbGVjdG9yc1t0aGlzLnNlbGVjdG9ycy5sZW5ndGgtMV07cmV0dXJuISFpLmV2YWxkQ29uZGl0aW9uJiYhKGkuY29uZGl0aW9uJiYhaS5jb25kaXRpb24uZXZhbChuZXcgcS5FdmFsKHQsdC5mcmFtZXMpKSl9LHJlc2V0Q2FjaGU6ZnVuY3Rpb24oKXt0aGlzLl9ydWxlc2V0cz1udWxsLHRoaXMuX3ZhcmlhYmxlcz1udWxsLHRoaXMuX3Byb3BlcnRpZXM9bnVsbCx0aGlzLl9sb29rdXBzPXt9fSx2YXJpYWJsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmFyaWFibGVzfHwodGhpcy5fdmFyaWFibGVzPXRoaXMucnVsZXM/dGhpcy5ydWxlcy5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7aWYodCBpbnN0YW5jZW9mIEQmJiEwPT09dC52YXJpYWJsZSYmKGVbdC5uYW1lXT10KSwiSW1wb3J0Ij09PXQudHlwZSYmdC5yb290JiZ0LnJvb3QudmFyaWFibGVzKXt2YXIgaT10LnJvb3QudmFyaWFibGVzKCk7Zm9yKHZhciBuIGluIGkpaS5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09dC5yb290LnZhcmlhYmxlKG4pKX1yZXR1cm4gZX0pLHt9KTp7fSksdGhpcy5fdmFyaWFibGVzfSxwcm9wZXJ0aWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BlcnRpZXN8fCh0aGlzLl9wcm9wZXJ0aWVzPXRoaXMucnVsZXM/dGhpcy5ydWxlcy5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7aWYodCBpbnN0YW5jZW9mIEQmJiEwIT09dC52YXJpYWJsZSl7dmFyIGk9MT09PXQubmFtZS5sZW5ndGgmJnQubmFtZVswXWluc3RhbmNlb2YgTD90Lm5hbWVbMF0udmFsdWU6dC5uYW1lO2VbIiQiK2ldP2VbIiQiK2ldLnB1c2godCk6ZVsiJCIraV09W3RdfXJldHVybiBlfSkse30pOnt9KSx0aGlzLl9wcm9wZXJ0aWVzfSx2YXJpYWJsZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnZhcmlhYmxlcygpW2VdO2lmKHQpcmV0dXJuIHRoaXMucGFyc2VWYWx1ZSh0KX0scHJvcGVydHk6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wcm9wZXJ0aWVzKClbZV07aWYodClyZXR1cm4gdGhpcy5wYXJzZVZhbHVlKHQpfSxsYXN0RGVjbGFyYXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5ydWxlcy5sZW5ndGg7ZT4wO2UtLSl7dmFyIHQ9dGhpcy5ydWxlc1tlLTFdO2lmKHQgaW5zdGFuY2VvZiBEKXJldHVybiB0aGlzLnBhcnNlVmFsdWUodCl9fSxwYXJzZVZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZS52YWx1ZSBpbnN0YW5jZW9mIGomJiFlLnBhcnNlZD8oInN0cmluZyI9PXR5cGVvZiBlLnZhbHVlLnZhbHVlP3RoaXMucGFyc2UucGFyc2VOb2RlKGUudmFsdWUudmFsdWUsWyJ2YWx1ZSIsImltcG9ydGFudCJdLGUudmFsdWUuZ2V0SW5kZXgoKSxlLmZpbGVJbmZvKCksKGZ1bmN0aW9uKHQsaSl7dCYmKGUucGFyc2VkPSEwKSxpJiYoZS52YWx1ZT1pWzBdLGUuaW1wb3J0YW50PWlbMV18fCIiLGUucGFyc2VkPSEwKX0pKTplLnBhcnNlZD0hMCxlKTplfWlmKEFycmF5LmlzQXJyYXkoZSkpe3ZhciBuPVtdO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe24ucHVzaChpLmNhbGwodCxlKSl9KSksbn1yZXR1cm4gaS5jYWxsKHQsZSl9LHJ1bGVzZXRzOmZ1bmN0aW9uKCl7aWYoIXRoaXMucnVsZXMpcmV0dXJuW107dmFyIGUsdCxpPVtdLG49dGhpcy5ydWxlcztmb3IoZT0wO3Q9bltlXTtlKyspdC5pc1J1bGVzZXQmJmkucHVzaCh0KTtyZXR1cm4gaX0scHJlcGVuZFJ1bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5ydWxlczt0P3QudW5zaGlmdChlKTp0aGlzLnJ1bGVzPVtlXSx0aGlzLnNldFBhcmVudChlLHRoaXMpfSxmaW5kOmZ1bmN0aW9uKGUsdCxpKXt0PXR8fHRoaXM7dmFyIG4scixzPVtdLG89ZS50b0NTUygpO3JldHVybiBvIGluIHRoaXMuX2xvb2t1cHM/dGhpcy5fbG9va3Vwc1tvXToodGhpcy5ydWxlc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKG8pe2lmKG8hPT10KWZvcih2YXIgYT0wO2E8by5zZWxlY3RvcnMubGVuZ3RoO2ErKylpZihuPWUubWF0Y2goby5zZWxlY3RvcnNbYV0pKXtpZihlLmVsZW1lbnRzLmxlbmd0aD5uKXtpZighaXx8aShvKSl7cj1vLmZpbmQobmV3IEYoZS5lbGVtZW50cy5zbGljZShuKSksdCxpKTtmb3IodmFyIGw9MDtsPHIubGVuZ3RoOysrbClyW2xdLnBhdGgucHVzaChvKTtBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShzLHIpfX1lbHNlIHMucHVzaCh7cnVsZTpvLHBhdGg6W119KTticmVha319KSksdGhpcy5fbG9va3Vwc1tvXT1zLHMpfSxnZW5DU1M6ZnVuY3Rpb24oZSx0KXt2YXIgaSxuLHIscyxvLGE9W107ZS50YWJMZXZlbD1lLnRhYkxldmVsfHwwLHRoaXMucm9vdHx8ZS50YWJMZXZlbCsrO3ZhciBsLHU9ZS5jb21wcmVzcz8iIjpBcnJheShlLnRhYkxldmVsKzEpLmpvaW4oIiAgIiksYz1lLmNvbXByZXNzPyIiOkFycmF5KGUudGFiTGV2ZWwpLmpvaW4oIiAgIiksaD0wLGY9MDtmb3IoaT0wO3M9dGhpcy5ydWxlc1tpXTtpKyspcyBpbnN0YW5jZW9mIFU/KGY9PT1pJiZmKyssYS5wdXNoKHMpKTpzLmlzQ2hhcnNldCYmcy5pc0NoYXJzZXQoKT8oYS5zcGxpY2UoaCwwLHMpLGgrKyxmKyspOiJJbXBvcnQiPT09cy50eXBlPyhhLnNwbGljZShmLDAscyksZisrKTphLnB1c2gocyk7aWYoYT1bXS5jb25jYXQoYSksIXRoaXMucm9vdCl7KHI9QihlLHRoaXMsYykpJiYodC5hZGQociksdC5hZGQoYykpO3ZhciBwPXRoaXMucGF0aHMsdj1wLmxlbmd0aCxkPXZvaWQgMDtmb3IobD1lLmNvbXByZXNzPyIsIjoiLFxuIitjLGk9MDtpPHY7aSsrKWlmKGQ9KG89cFtpXSkubGVuZ3RoKWZvcihpPjAmJnQuYWRkKGwpLGUuZmlyc3RTZWxlY3Rvcj0hMCxvWzBdLmdlbkNTUyhlLHQpLGUuZmlyc3RTZWxlY3Rvcj0hMSxuPTE7bjxkO24rKylvW25dLmdlbkNTUyhlLHQpO3QuYWRkKChlLmNvbXByZXNzPyJ7IjoiIHtcbiIpK3UpfWZvcihpPTA7cz1hW2ldO2krKyl7aSsxPT09YS5sZW5ndGgmJihlLmxhc3RSdWxlPSEwKTt2YXIgbT1lLmxhc3RSdWxlO3MuaXNSdWxlc2V0TGlrZShzKSYmKGUubGFzdFJ1bGU9ITEpLHMuZ2VuQ1NTP3MuZ2VuQ1NTKGUsdCk6cy52YWx1ZSYmdC5hZGQocy52YWx1ZS50b1N0cmluZygpKSxlLmxhc3RSdWxlPW0sIWUubGFzdFJ1bGUmJnMuaXNWaXNpYmxlKCk/dC5hZGQoZS5jb21wcmVzcz8iIjoiXG4iK3UpOmUubGFzdFJ1bGU9ITF9dGhpcy5yb290fHwodC5hZGQoZS5jb21wcmVzcz8ifSI6IlxuIitjKyJ9IiksZS50YWJMZXZlbC0tKSx0LmlzRW1wdHkoKXx8ZS5jb21wcmVzc3x8IXRoaXMuZmlyc3RSb290fHx0LmFkZCgiXG4iKX0sam9pblNlbGVjdG9yczpmdW5jdGlvbihlLHQsaSl7Zm9yKHZhciBuPTA7bjxpLmxlbmd0aDtuKyspdGhpcy5qb2luU2VsZWN0b3IoZSx0LGlbbl0pfSxqb2luU2VsZWN0b3I6ZnVuY3Rpb24oZSx0LGkpe2Z1bmN0aW9uIG4oZSx0KXt2YXIgaSxuO2lmKDA9PT1lLmxlbmd0aClpPW5ldyBwKGVbMF0pO2Vsc2V7dmFyIHI9bmV3IEFycmF5KGUubGVuZ3RoKTtmb3Iobj0wO248ZS5sZW5ndGg7bisrKXJbbl09bmV3IG0obnVsbCxlW25dLHQuaXNWYXJpYWJsZSx0Ll9pbmRleCx0Ll9maWxlSW5mbyk7aT1uZXcgcChuZXcgRihyKSl9cmV0dXJuIGl9ZnVuY3Rpb24gcihlLHQpe3ZhciBpO3JldHVybiBpPW5ldyBtKG51bGwsZSx0LmlzVmFyaWFibGUsdC5faW5kZXgsdC5fZmlsZUluZm8pLG5ldyBGKFtpXSl9ZnVuY3Rpb24gcyhlLHQsaSxuKXt2YXIgcixzLG87aWYocj1bXSxlLmxlbmd0aD4wPyhzPShyPWsoZSkpLnBvcCgpLG89bi5jcmVhdGVEZXJpdmVkKGsocy5lbGVtZW50cykpKTpvPW4uY3JlYXRlRGVyaXZlZChbXSksdC5sZW5ndGg+MCl7dmFyIGE9aS5jb21iaW5hdG9yLGw9dFswXS5lbGVtZW50c1swXTthLmVtcHR5T3JXaGl0ZXNwYWNlJiYhbC5jb21iaW5hdG9yLmVtcHR5T3JXaGl0ZXNwYWNlJiYoYT1sLmNvbWJpbmF0b3IpLG8uZWxlbWVudHMucHVzaChuZXcgbShhLGwudmFsdWUsaS5pc1ZhcmlhYmxlLGkuX2luZGV4LGkuX2ZpbGVJbmZvKSksby5lbGVtZW50cz1vLmVsZW1lbnRzLmNvbmNhdCh0WzBdLmVsZW1lbnRzLnNsaWNlKDEpKX1pZigwIT09by5lbGVtZW50cy5sZW5ndGgmJnIucHVzaChvKSx0Lmxlbmd0aD4xKXt2YXIgdT10LnNsaWNlKDEpO3U9dS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNyZWF0ZURlcml2ZWQoZS5lbGVtZW50cyxbXSl9KSkscj1yLmNvbmNhdCh1KX1yZXR1cm4gcn1mdW5jdGlvbiBvKGUsdCxpLG4scil7dmFyIG87Zm9yKG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIGE9cyhlW29dLHQsaSxuKTtyLnB1c2goYSl9cmV0dXJuIHJ9ZnVuY3Rpb24gYShlLHQpe3ZhciBpLG47aWYoMCE9PWUubGVuZ3RoKWlmKDAhPT10Lmxlbmd0aClmb3IoaT0wO249dFtpXTtpKyspbi5sZW5ndGg+MD9uW24ubGVuZ3RoLTFdPW5bbi5sZW5ndGgtMV0uY3JlYXRlRGVyaXZlZChuW24ubGVuZ3RoLTFdLmVsZW1lbnRzLmNvbmNhdChlKSk6bi5wdXNoKG5ldyBGKGUpKTtlbHNlIHQucHVzaChbbmV3IEYoZSldKX1mdW5jdGlvbiBsKGUsdCl7dmFyIGk9dC5jcmVhdGVEZXJpdmVkKHQuZWxlbWVudHMsdC5leHRlbmRMaXN0LHQuZXZhbGRDb25kaXRpb24pO3JldHVybiBpLmNvcHlWaXNpYmlsaXR5SW5mbyhlKSxpfXZhciB1LGM7aWYoIWZ1bmN0aW9uIGUodCxpLGwpe3ZhciB1LGMsaCxmLHYsZCxnLHksYix3LHgsUyxJPSExO2ZvcihmPVtdLHY9W1tdXSx1PTA7eT1sLmVsZW1lbnRzW3VdO3UrKylpZigiJiIhPT15LnZhbHVlKXt2YXIgQz0oUz12b2lkIDAsKHg9eSkudmFsdWUgaW5zdGFuY2VvZiBwJiYoUz14LnZhbHVlLnZhbHVlKWluc3RhbmNlb2YgRj9TOm51bGwpO2lmKG51bGwhPUMpe2EoZix2KTt2YXIgayxfPVtdLEE9W107Zm9yKGs9ZShfLGksQyksST1JfHxrLGg9MDtoPF8ubGVuZ3RoO2grKyl7byh2LFtyKG4oX1toXSx5KSx5KV0seSxsLEEpfXY9QSxmPVtdfWVsc2UgZi5wdXNoKHkpfWVsc2V7Zm9yKEk9ITAsZD1bXSxhKGYsdiksYz0wO2M8di5sZW5ndGg7YysrKWlmKGc9dltjXSwwPT09aS5sZW5ndGgpZy5sZW5ndGg+MCYmZ1swXS5lbGVtZW50cy5wdXNoKG5ldyBtKHkuY29tYmluYXRvciwiIix5LmlzVmFyaWFibGUseS5faW5kZXgseS5fZmlsZUluZm8pKSxkLnB1c2goZyk7ZWxzZSBmb3IoaD0wO2g8aS5sZW5ndGg7aCsrKXt2YXIgTT1zKGcsaVtoXSx5LGwpO2QucHVzaChNKX12PWQsZj1bXX1mb3IoYShmLHYpLHU9MDt1PHYubGVuZ3RoO3UrKykoYj12W3VdLmxlbmd0aCk+MCYmKHQucHVzaCh2W3VdKSx3PXZbdV1bYi0xXSx2W3VdW2ItMV09dy5jcmVhdGVEZXJpdmVkKHcuZWxlbWVudHMsbC5leHRlbmRMaXN0KSk7cmV0dXJuIEl9KGM9W10sdCxpKSlpZih0Lmxlbmd0aD4wKWZvcihjPVtdLHU9MDt1PHQubGVuZ3RoO3UrKyl7dmFyIGg9dFt1XS5tYXAobC5iaW5kKHRoaXMsaS52aXNpYmlsaXR5SW5mbygpKSk7aC5wdXNoKGkpLGMucHVzaChoKX1lbHNlIGM9W1tpXV07Zm9yKHU9MDt1PGMubGVuZ3RoO3UrKyllLnB1c2goY1t1XSl9fSk7dmFyIFo9ZnVuY3Rpb24oZSx0LGksbixyLHMsbyxhKXt2YXIgbDtpZih0aGlzLm5hbWU9ZSx0aGlzLnZhbHVlPXQgaW5zdGFuY2VvZiB1P3Q6dD9uZXcgaih0KTp0LGkpe2ZvcihBcnJheS5pc0FycmF5KGkpP3RoaXMucnVsZXM9aToodGhpcy5ydWxlcz1baV0sdGhpcy5ydWxlc1swXS5zZWxlY3RvcnM9bmV3IEYoW10sbnVsbCxudWxsLG4scikuY3JlYXRlRW1wdHlTZWxlY3RvcnMoKSksbD0wO2w8dGhpcy5ydWxlcy5sZW5ndGg7bCsrKXRoaXMucnVsZXNbbF0uYWxsb3dJbXBvcnRzPSEwO3RoaXMuc2V0UGFyZW50KHRoaXMucnVsZXMsdGhpcyl9dGhpcy5faW5kZXg9bix0aGlzLl9maWxlSW5mbz1yLHRoaXMuZGVidWdJbmZvPXMsdGhpcy5pc1Jvb3RlZD1vfHwhMSx0aGlzLmNvcHlWaXNpYmlsaXR5SW5mbyhhKSx0aGlzLmFsbG93Um9vdD0hMH07Wi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiQXRSdWxlIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy52YWx1ZSxpPXRoaXMucnVsZXM7aSYmKHRoaXMucnVsZXM9ZS52aXNpdEFycmF5KGkpKSx0JiYodGhpcy52YWx1ZT1lLnZpc2l0KHQpKX0saXNSdWxlc2V0TGlrZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJ1bGVzfHwhdGhpcy5pc0NoYXJzZXQoKX0saXNDaGFyc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIkBjaGFyc2V0Ij09PXRoaXMubmFtZX0sZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy52YWx1ZSxuPXRoaXMucnVsZXM7dC5hZGQodGhpcy5uYW1lLHRoaXMuZmlsZUluZm8oKSx0aGlzLmdldEluZGV4KCkpLGkmJih0LmFkZCgiICIpLGkuZ2VuQ1NTKGUsdCkpLG4/dGhpcy5vdXRwdXRSdWxlc2V0KGUsdCxuKTp0LmFkZCgiOyIpfSxldmFsOmZ1bmN0aW9uKGUpe3ZhciB0LGksbj10aGlzLnZhbHVlLHI9dGhpcy5ydWxlcztyZXR1cm4gdD1lLm1lZGlhUGF0aCxpPWUubWVkaWFCbG9ja3MsZS5tZWRpYVBhdGg9W10sZS5tZWRpYUJsb2Nrcz1bXSxuJiYobj1uLmV2YWwoZSkpLHImJigocj1bclswXS5ldmFsKGUpXSlbMF0ucm9vdD0hMCksZS5tZWRpYVBhdGg9dCxlLm1lZGlhQmxvY2tzPWksbmV3IFoodGhpcy5uYW1lLG4scix0aGlzLmdldEluZGV4KCksdGhpcy5maWxlSW5mbygpLHRoaXMuZGVidWdJbmZvLHRoaXMuaXNSb290ZWQsdGhpcy52aXNpYmlsaXR5SW5mbygpKX0sdmFyaWFibGU6ZnVuY3Rpb24oZSl7aWYodGhpcy5ydWxlcylyZXR1cm4gSy5wcm90b3R5cGUudmFyaWFibGUuY2FsbCh0aGlzLnJ1bGVzWzBdLGUpfSxmaW5kOmZ1bmN0aW9uKCl7aWYodGhpcy5ydWxlcylyZXR1cm4gSy5wcm90b3R5cGUuZmluZC5hcHBseSh0aGlzLnJ1bGVzWzBdLGFyZ3VtZW50cyl9LHJ1bGVzZXRzOmZ1bmN0aW9uKCl7aWYodGhpcy5ydWxlcylyZXR1cm4gSy5wcm90b3R5cGUucnVsZXNldHMuYXBwbHkodGhpcy5ydWxlc1swXSl9LG91dHB1dFJ1bGVzZXQ6ZnVuY3Rpb24oZSx0LGkpe3ZhciBuLHI9aS5sZW5ndGg7aWYoZS50YWJMZXZlbD0xKygwfGUudGFiTGV2ZWwpLGUuY29tcHJlc3Mpe2Zvcih0LmFkZCgieyIpLG49MDtuPHI7bisrKWlbbl0uZ2VuQ1NTKGUsdCk7cmV0dXJuIHQuYWRkKCJ9Iiksdm9pZCBlLnRhYkxldmVsLS19dmFyIHM9IlxuIitBcnJheShlLnRhYkxldmVsKS5qb2luKCIgICIpLG89cysiICAiO2lmKHIpe2Zvcih0LmFkZCgiIHsiK28pLGlbMF0uZ2VuQ1NTKGUsdCksbj0xO248cjtuKyspdC5hZGQobyksaVtuXS5nZW5DU1MoZSx0KTt0LmFkZChzKyJ9Iil9ZWxzZSB0LmFkZCgiIHsiK3MrIn0iKTtlLnRhYkxldmVsLS19fSk7dmFyIFg9ZnVuY3Rpb24oZSx0KXt0aGlzLnJ1bGVzZXQ9ZSx0aGlzLmZyYW1lcz10LHRoaXMuc2V0UGFyZW50KHRoaXMucnVsZXNldCx0aGlzKX07WC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiRGV0YWNoZWRSdWxlc2V0IixldmFsRmlyc3Q6ITAsYWNjZXB0OmZ1bmN0aW9uKGUpe3RoaXMucnVsZXNldD1lLnZpc2l0KHRoaXMucnVsZXNldCl9LGV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5mcmFtZXN8fGsoZS5mcmFtZXMpO3JldHVybiBuZXcgWCh0aGlzLnJ1bGVzZXQsdCl9LGNhbGxFdmFsOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJ1bGVzZXQuZXZhbCh0aGlzLmZyYW1lcz9uZXcgcS5FdmFsKGUsdGhpcy5mcmFtZXMuY29uY2F0KGUuZnJhbWVzKSk6ZSl9fSk7dmFyIFk9ZnVuY3Rpb24oZSx0LGkpe3RoaXMubnVtZXJhdG9yPWU/ayhlKS5zb3J0KCk6W10sdGhpcy5kZW5vbWluYXRvcj10P2sodCkuc29ydCgpOltdLGk/dGhpcy5iYWNrdXBVbml0PWk6ZSYmZS5sZW5ndGgmJih0aGlzLmJhY2t1cFVuaXQ9ZVswXSl9O1kucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IlVuaXQiLGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBZKGsodGhpcy5udW1lcmF0b3IpLGsodGhpcy5kZW5vbWluYXRvciksdGhpcy5iYWNrdXBVbml0KX0sZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dmFyIGk9ZSYmZS5zdHJpY3RVbml0czsxPT09dGhpcy5udW1lcmF0b3IubGVuZ3RoP3QuYWRkKHRoaXMubnVtZXJhdG9yWzBdKTohaSYmdGhpcy5iYWNrdXBVbml0P3QuYWRkKHRoaXMuYmFja3VwVW5pdCk6IWkmJnRoaXMuZGVub21pbmF0b3IubGVuZ3RoJiZ0LmFkZCh0aGlzLmRlbm9taW5hdG9yWzBdKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMubnVtZXJhdG9yLmpvaW4oIioiKTtmb3IoZT0wO2U8dGhpcy5kZW5vbWluYXRvci5sZW5ndGg7ZSsrKXQrPSIvIit0aGlzLmRlbm9taW5hdG9yW2VdO3JldHVybiB0fSxjb21wYXJlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmlzKGUudG9TdHJpbmcoKSk/MDp2b2lkIDB9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKT09PWUudG9VcHBlckNhc2UoKX0saXNMZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gUmVnRXhwKCJeKHB4fGVtfGV4fGNofHJlbXxpbnxjbXxtbXxwY3xwdHxleHx2d3x2aHx2bWlufHZtYXgpJCIsImdpIikudGVzdCh0aGlzLnRvQ1NTKCkpfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLm51bWVyYXRvci5sZW5ndGgmJjA9PT10aGlzLmRlbm9taW5hdG9yLmxlbmd0aH0saXNTaW5ndWxhcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm51bWVyYXRvci5sZW5ndGg8PTEmJjA9PT10aGlzLmRlbm9taW5hdG9yLmxlbmd0aH0sbWFwOmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0PTA7dDx0aGlzLm51bWVyYXRvci5sZW5ndGg7dCsrKXRoaXMubnVtZXJhdG9yW3RdPWUodGhpcy5udW1lcmF0b3JbdF0sITEpO2Zvcih0PTA7dDx0aGlzLmRlbm9taW5hdG9yLmxlbmd0aDt0KyspdGhpcy5kZW5vbWluYXRvclt0XT1lKHRoaXMuZGVub21pbmF0b3JbdF0sITApfSx1c2VkVW5pdHM6ZnVuY3Rpb24oKXt2YXIgZSx0LGksbj17fTtmb3IoaSBpbiB0PWZ1bmN0aW9uKHQpe3JldHVybiBlLmhhc093blByb3BlcnR5KHQpJiYhbltpXSYmKG5baV09dCksdH0sYSlhLmhhc093blByb3BlcnR5KGkpJiYoZT1hW2ldLHRoaXMubWFwKHQpKTtyZXR1cm4gbn0sY2FuY2VsOmZ1bmN0aW9uKCl7dmFyIGUsdCxpPXt9O2Zvcih0PTA7dDx0aGlzLm51bWVyYXRvci5sZW5ndGg7dCsrKWlbZT10aGlzLm51bWVyYXRvclt0XV09KGlbZV18fDApKzE7Zm9yKHQ9MDt0PHRoaXMuZGVub21pbmF0b3IubGVuZ3RoO3QrKylpW2U9dGhpcy5kZW5vbWluYXRvclt0XV09KGlbZV18fDApLTE7Zm9yKGUgaW4gdGhpcy5udW1lcmF0b3I9W10sdGhpcy5kZW5vbWluYXRvcj1bXSxpKWlmKGkuaGFzT3duUHJvcGVydHkoZSkpe3ZhciBuPWlbZV07aWYobj4wKWZvcih0PTA7dDxuO3QrKyl0aGlzLm51bWVyYXRvci5wdXNoKGUpO2Vsc2UgaWYobjwwKWZvcih0PTA7dDwtbjt0KyspdGhpcy5kZW5vbWluYXRvci5wdXNoKGUpfXRoaXMubnVtZXJhdG9yLnNvcnQoKSx0aGlzLmRlbm9taW5hdG9yLnNvcnQoKX19KTt2YXIgZWU9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLnZhbHVlPXBhcnNlRmxvYXQoZSksaXNOYU4odGhpcy52YWx1ZSkpdGhyb3cgbmV3IEVycm9yKCJEaW1lbnNpb24gaXMgbm90IGEgbnVtYmVyLiIpO3RoaXMudW5pdD10JiZ0IGluc3RhbmNlb2YgWT90Om5ldyBZKHQ/W3RdOnZvaWQgMCksdGhpcy5zZXRQYXJlbnQodGhpcy51bml0LHRoaXMpfTtlZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiRGltZW5zaW9uIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy51bml0PWUudmlzaXQodGhpcy51bml0KX0sZXZhbDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpc30sdG9Db2xvcjpmdW5jdGlvbigpe3JldHVybiBuZXcgYyhbdGhpcy52YWx1ZSx0aGlzLnZhbHVlLHRoaXMudmFsdWVdKX0sZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7aWYoZSYmZS5zdHJpY3RVbml0cyYmIXRoaXMudW5pdC5pc1Npbmd1bGFyKCkpdGhyb3cgbmV3IEVycm9yKCJNdWx0aXBsZSB1bml0cyBpbiBkaW1lbnNpb24uIENvcnJlY3QgdGhlIHVuaXRzIG9yIHVzZSB0aGUgdW5pdCBmdW5jdGlvbi4gQmFkIHVuaXQ6ICIrdGhpcy51bml0LnRvU3RyaW5nKCkpO3ZhciBpPXRoaXMuZnJvdW5kKGUsdGhpcy52YWx1ZSksbj1TdHJpbmcoaSk7aWYoMCE9PWkmJmk8MWUtNiYmaT4tMWUtNiYmKG49aS50b0ZpeGVkKDIwKS5yZXBsYWNlKC8wKyQvLCIiKSksZSYmZS5jb21wcmVzcyl7aWYoMD09PWkmJnRoaXMudW5pdC5pc0xlbmd0aCgpKXJldHVybiB2b2lkIHQuYWRkKG4pO2k+MCYmaTwxJiYobj1uLnN1YnN0cigxKSl9dC5hZGQobiksdGhpcy51bml0LmdlbkNTUyhlLHQpfSxvcGVyYXRlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgbj10aGlzLl9vcGVyYXRlKGUsdCx0aGlzLnZhbHVlLGkudmFsdWUpLHI9dGhpcy51bml0LmNsb25lKCk7aWYoIisiPT09dHx8Ii0iPT09dClpZigwPT09ci5udW1lcmF0b3IubGVuZ3RoJiYwPT09ci5kZW5vbWluYXRvci5sZW5ndGgpcj1pLnVuaXQuY2xvbmUoKSx0aGlzLnVuaXQuYmFja3VwVW5pdCYmKHIuYmFja3VwVW5pdD10aGlzLnVuaXQuYmFja3VwVW5pdCk7ZWxzZSBpZigwPT09aS51bml0Lm51bWVyYXRvci5sZW5ndGgmJjA9PT1yLmRlbm9taW5hdG9yLmxlbmd0aCk7ZWxzZXtpZihpPWkuY29udmVydFRvKHRoaXMudW5pdC51c2VkVW5pdHMoKSksZS5zdHJpY3RVbml0cyYmaS51bml0LnRvU3RyaW5nKCkhPT1yLnRvU3RyaW5nKCkpdGhyb3cgbmV3IEVycm9yKCJJbmNvbXBhdGlibGUgdW5pdHMuIENoYW5nZSB0aGUgdW5pdHMgb3IgdXNlIHRoZSB1bml0IGZ1bmN0aW9uLiBCYWQgdW5pdHM6ICciK3IudG9TdHJpbmcoKSsiJyBhbmQgJyIraS51bml0LnRvU3RyaW5nKCkrIicuIik7bj10aGlzLl9vcGVyYXRlKGUsdCx0aGlzLnZhbHVlLGkudmFsdWUpfWVsc2UiKiI9PT10PyhyLm51bWVyYXRvcj1yLm51bWVyYXRvci5jb25jYXQoaS51bml0Lm51bWVyYXRvcikuc29ydCgpLHIuZGVub21pbmF0b3I9ci5kZW5vbWluYXRvci5jb25jYXQoaS51bml0LmRlbm9taW5hdG9yKS5zb3J0KCksci5jYW5jZWwoKSk6Ii8iPT09dCYmKHIubnVtZXJhdG9yPXIubnVtZXJhdG9yLmNvbmNhdChpLnVuaXQuZGVub21pbmF0b3IpLnNvcnQoKSxyLmRlbm9taW5hdG9yPXIuZGVub21pbmF0b3IuY29uY2F0KGkudW5pdC5udW1lcmF0b3IpLnNvcnQoKSxyLmNhbmNlbCgpKTtyZXR1cm4gbmV3IGVlKG4scil9LGNvbXBhcmU6ZnVuY3Rpb24oZSl7dmFyIHQsaTtpZihlIGluc3RhbmNlb2YgZWUpe2lmKHRoaXMudW5pdC5pc0VtcHR5KCl8fGUudW5pdC5pc0VtcHR5KCkpdD10aGlzLGk9ZTtlbHNlIGlmKHQ9dGhpcy51bmlmeSgpLGk9ZS51bmlmeSgpLDAhPT10LnVuaXQuY29tcGFyZShpLnVuaXQpKXJldHVybjtyZXR1cm4gdS5udW1lcmljQ29tcGFyZSh0LnZhbHVlLGkudmFsdWUpfX0sdW5pZnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb252ZXJ0VG8oe2xlbmd0aDoicHgiLGR1cmF0aW9uOiJzIixhbmdsZToicmFkIn0pfSxjb252ZXJ0VG86ZnVuY3Rpb24oZSl7dmFyIHQsaSxuLHIscyxvPXRoaXMudmFsdWUsbD10aGlzLnVuaXQuY2xvbmUoKSx1PXt9O2lmKCJzdHJpbmciPT10eXBlb2YgZSl7Zm9yKHQgaW4gYSlhW3RdLmhhc093blByb3BlcnR5KGUpJiYoKHU9e30pW3RdPWUpO2U9dX1mb3IoaSBpbiBzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4uaGFzT3duUHJvcGVydHkoZSk/KHQ/by89bltlXS9uW3JdOm8qPW5bZV0vbltyXSxyKTplfSxlKWUuaGFzT3duUHJvcGVydHkoaSkmJihyPWVbaV0sbj1hW2ldLGwubWFwKHMpKTtyZXR1cm4gbC5jYW5jZWwoKSxuZXcgZWUobyxsKX19KTt2YXIgdGU9ZyxpZT1mdW5jdGlvbihlLHQsaSl7dGhpcy5vcD1lLnRyaW0oKSx0aGlzLm9wZXJhbmRzPXQsdGhpcy5pc1NwYWNlZD1pfTtpZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiT3BlcmF0aW9uIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5vcGVyYW5kcz1lLnZpc2l0QXJyYXkodGhpcy5vcGVyYW5kcyl9LGV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsaT10aGlzLm9wZXJhbmRzWzBdLmV2YWwoZSksbj10aGlzLm9wZXJhbmRzWzFdLmV2YWwoZSk7aWYoZS5pc01hdGhPbih0aGlzLm9wKSl7aWYodD0iLi8iPT09dGhpcy5vcD8iLyI6dGhpcy5vcCxpIGluc3RhbmNlb2YgZWUmJm4gaW5zdGFuY2VvZiBjJiYoaT1pLnRvQ29sb3IoKSksbiBpbnN0YW5jZW9mIGVlJiZpIGluc3RhbmNlb2YgYyYmKG49bi50b0NvbG9yKCkpLCFpLm9wZXJhdGV8fCFuLm9wZXJhdGUpe2lmKChpIGluc3RhbmNlb2YgaWV8fG4gaW5zdGFuY2VvZiBpZSkmJiIvIj09PWkub3AmJmUubWF0aD09PXRlLlBBUkVOU19ESVZJU0lPTilyZXR1cm4gbmV3IGllKHRoaXMub3AsW2ksbl0sdGhpcy5pc1NwYWNlZCk7dGhyb3d7dHlwZToiT3BlcmF0aW9uIixtZXNzYWdlOiJPcGVyYXRpb24gb24gYW4gaW52YWxpZCB0eXBlIn19cmV0dXJuIGkub3BlcmF0ZShlLHQsbil9cmV0dXJuIG5ldyBpZSh0aGlzLm9wLFtpLG5dLHRoaXMuaXNTcGFjZWQpfSxnZW5DU1M6ZnVuY3Rpb24oZSx0KXt0aGlzLm9wZXJhbmRzWzBdLmdlbkNTUyhlLHQpLHRoaXMuaXNTcGFjZWQmJnQuYWRkKCIgIiksdC5hZGQodGhpcy5vcCksdGhpcy5pc1NwYWNlZCYmdC5hZGQoIiAiKSx0aGlzLm9wZXJhbmRzWzFdLmdlbkNTUyhlLHQpfX0pO3ZhciBuZT1mdW5jdGlvbihlLHQpe2lmKHRoaXMudmFsdWU9ZSx0aGlzLm5vU3BhY2luZz10LCFlKXRocm93IG5ldyBFcnJvcigiRXhwcmVzc2lvbiByZXF1aXJlcyBhbiBhcnJheSBwYXJhbWV0ZXIiKX07bmUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IkV4cHJlc3Npb24iLGFjY2VwdDpmdW5jdGlvbihlKXt0aGlzLnZhbHVlPWUudmlzaXRBcnJheSh0aGlzLnZhbHVlKX0sZXZhbDpmdW5jdGlvbihlKXt2YXIgdCxpPWUuaXNNYXRoT24oKSxuPXRoaXMucGFyZW5zLHI9ITE7cmV0dXJuIG4mJmUuaW5QYXJlbnRoZXNpcygpLHRoaXMudmFsdWUubGVuZ3RoPjE/dD1uZXcgbmUodGhpcy52YWx1ZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmV2YWw/dC5ldmFsKGUpOnR9KSksdGhpcy5ub1NwYWNpbmcpOjE9PT10aGlzLnZhbHVlLmxlbmd0aD8oIXRoaXMudmFsdWVbMF0ucGFyZW5zfHx0aGlzLnZhbHVlWzBdLnBhcmVuc0luT3B8fGUuaW5DYWxjfHwocj0hMCksdD10aGlzLnZhbHVlWzBdLmV2YWwoZSkpOnQ9dGhpcyxuJiZlLm91dE9mUGFyZW50aGVzaXMoKSwhdGhpcy5wYXJlbnN8fCF0aGlzLnBhcmVuc0luT3B8fGl8fHJ8fHQgaW5zdGFuY2VvZiBlZXx8KHQ9bmV3IHAodCkpLHR9LGdlbkNTUzpmdW5jdGlvbihlLHQpe2Zvcih2YXIgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7aSsrKXRoaXMudmFsdWVbaV0uZ2VuQ1NTKGUsdCksIXRoaXMubm9TcGFjaW5nJiZpKzE8dGhpcy52YWx1ZS5sZW5ndGgmJnQuYWRkKCIgIil9LHRocm93QXdheUNvbW1lbnRzOmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLnZhbHVlLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIShlIGluc3RhbmNlb2YgVSl9KSl9fSk7dmFyIHJlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsaSxuKXt0aGlzLm5hbWU9ZS50b0xvd2VyQ2FzZSgpLHRoaXMuaW5kZXg9aSx0aGlzLmNvbnRleHQ9dCx0aGlzLmN1cnJlbnRGaWxlSW5mbz1uLHRoaXMuZnVuYz10LmZyYW1lc1swXS5mdW5jdGlvblJlZ2lzdHJ5LmdldCh0aGlzLm5hbWUpfXJldHVybiBlLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5mdW5jKX0sZS5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO0FycmF5LmlzQXJyYXkoZSl8fChlPVtlXSk7dmFyIGk9dGhpcy5mdW5jLmV2YWxBcmdzOyExIT09aSYmKGU9ZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmV2YWwodC5jb250ZXh0KX0pKSk7dmFyIG49ZnVuY3Rpb24oZSl7cmV0dXJuISgiQ29tbWVudCI9PT1lLnR5cGUpfTtyZXR1cm4gZT1lLmZpbHRlcihuKS5tYXAoKGZ1bmN0aW9uKGUpe2lmKCJFeHByZXNzaW9uIj09PWUudHlwZSl7dmFyIHQ9ZS52YWx1ZS5maWx0ZXIobik7cmV0dXJuIDE9PT10Lmxlbmd0aD9lLnBhcmVucyYmIi8iPT09dFswXS5vcD9lOnRbMF06bmV3IG5lKHQpfXJldHVybiBlfSkpLCExPT09aT90aGlzLmZ1bmMuYXBwbHkodGhpcyxmdW5jdGlvbihlLHQsaSl7aWYoaXx8Mj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBuLHI9MCxzPXQubGVuZ3RoO3I8cztyKyspIW4mJnIgaW4gdHx8KG58fChuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQsMCxyKSksbltyXT10W3JdKTtyZXR1cm4gZS5jb25jYXQobnx8dCl9KFt0aGlzLmNvbnRleHRdLGUpKTp0aGlzLmZ1bmMuYXBwbHkodGhpcyxlKX0sZX0oKSxzZT1mdW5jdGlvbihlLHQsaSxuKXt0aGlzLm5hbWU9ZSx0aGlzLmFyZ3M9dCx0aGlzLmNhbGM9ImNhbGMiPT09ZSx0aGlzLl9pbmRleD1pLHRoaXMuX2ZpbGVJbmZvPW59O3NlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJDYWxsIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5hcmdzJiYodGhpcy5hcmdzPWUudmlzaXRBcnJheSh0aGlzLmFyZ3MpKX0sZXZhbDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLGk9ZS5tYXRoT247ZS5tYXRoT249IXRoaXMuY2FsYywodGhpcy5jYWxjfHxlLmluQ2FsYykmJmUuZW50ZXJDYWxjKCk7dmFyIG4scj1mdW5jdGlvbigpeyh0LmNhbGN8fGUuaW5DYWxjKSYmZS5leGl0Q2FsYygpLGUubWF0aE9uPWl9LHM9bmV3IHJlKHRoaXMubmFtZSxlLHRoaXMuZ2V0SW5kZXgoKSx0aGlzLmZpbGVJbmZvKCkpO2lmKHMuaXNWYWxpZCgpKXRyeXtuPXMuY2FsbCh0aGlzLmFyZ3MpLHIoKX1jYXRjaChlKXtpZihlLmhhc093blByb3BlcnR5KCJsaW5lIikmJmUuaGFzT3duUHJvcGVydHkoImNvbHVtbiIpKXRocm93IGU7dGhyb3d7dHlwZTplLnR5cGV8fCJSdW50aW1lIixtZXNzYWdlOiJFcnJvciBldmFsdWF0aW5nIGZ1bmN0aW9uIGAiK3RoaXMubmFtZSsiYCIrKGUubWVzc2FnZT8iOiAiK2UubWVzc2FnZToiIiksaW5kZXg6dGhpcy5nZXRJbmRleCgpLGZpbGVuYW1lOnRoaXMuZmlsZUluZm8oKS5maWxlbmFtZSxsaW5lOmUubGluZU51bWJlcixjb2x1bW46ZS5jb2x1bW5OdW1iZXJ9fWlmKG51bGwhPW4pcmV0dXJuIG4gaW5zdGFuY2VvZiB1fHwobj1uZXcgaihuJiYhMCE9PW4/bi50b1N0cmluZygpOm51bGwpKSxuLl9pbmRleD10aGlzLl9pbmRleCxuLl9maWxlSW5mbz10aGlzLl9maWxlSW5mbyxuO3ZhciBvPXRoaXMuYXJncy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmV2YWwoZSl9KSk7cmV0dXJuIHIoKSxuZXcgc2UodGhpcy5uYW1lLG8sdGhpcy5nZXRJbmRleCgpLHRoaXMuZmlsZUluZm8oKSl9LGdlbkNTUzpmdW5jdGlvbihlLHQpe3QuYWRkKHRoaXMubmFtZSsiKCIsdGhpcy5maWxlSW5mbygpLHRoaXMuZ2V0SW5kZXgoKSk7Zm9yKHZhciBpPTA7aTx0aGlzLmFyZ3MubGVuZ3RoO2krKyl0aGlzLmFyZ3NbaV0uZ2VuQ1NTKGUsdCksaSsxPHRoaXMuYXJncy5sZW5ndGgmJnQuYWRkKCIsICIpO3QuYWRkKCIpIil9fSk7dmFyIG9lPWZ1bmN0aW9uKGUsdCxpKXt0aGlzLm5hbWU9ZSx0aGlzLl9pbmRleD10LHRoaXMuX2ZpbGVJbmZvPWl9O29lLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJWYXJpYWJsZSIsZXZhbDpmdW5jdGlvbihlKXt2YXIgdCxpPXRoaXMubmFtZTtpZigwPT09aS5pbmRleE9mKCJAQCIpJiYoaT0iQCIrbmV3IG9lKGkuc2xpY2UoMSksdGhpcy5nZXRJbmRleCgpLHRoaXMuZmlsZUluZm8oKSkuZXZhbChlKS52YWx1ZSksdGhpcy5ldmFsdWF0aW5nKXRocm93e3R5cGU6Ik5hbWUiLG1lc3NhZ2U6IlJlY3Vyc2l2ZSB2YXJpYWJsZSBkZWZpbml0aW9uIGZvciAiK2ksZmlsZW5hbWU6dGhpcy5maWxlSW5mbygpLmZpbGVuYW1lLGluZGV4OnRoaXMuZ2V0SW5kZXgoKX07aWYodGhpcy5ldmFsdWF0aW5nPSEwLHQ9dGhpcy5maW5kKGUuZnJhbWVzLChmdW5jdGlvbih0KXt2YXIgbj10LnZhcmlhYmxlKGkpO2lmKG4pe2lmKG4uaW1wb3J0YW50KWUuaW1wb3J0YW50U2NvcGVbZS5pbXBvcnRhbnRTY29wZS5sZW5ndGgtMV0uaW1wb3J0YW50PW4uaW1wb3J0YW50O3JldHVybiBlLmluQ2FsYz9uZXcgc2UoIl9TRUxGIixbbi52YWx1ZV0pLmV2YWwoZSk6bi52YWx1ZS5ldmFsKGUpfX0pKSlyZXR1cm4gdGhpcy5ldmFsdWF0aW5nPSExLHQ7dGhyb3d7dHlwZToiTmFtZSIsbWVzc2FnZToidmFyaWFibGUgIitpKyIgaXMgdW5kZWZpbmVkIixmaWxlbmFtZTp0aGlzLmZpbGVJbmZvKCkuZmlsZW5hbWUsaW5kZXg6dGhpcy5nZXRJbmRleCgpfX0sZmluZDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgaT0wLG49dm9pZCAwO2k8ZS5sZW5ndGg7aSsrKWlmKG49dC5jYWxsKGUsZVtpXSkpcmV0dXJuIG47cmV0dXJuIG51bGx9fSk7dmFyIGFlPWZ1bmN0aW9uKGUsdCxpKXt0aGlzLm5hbWU9ZSx0aGlzLl9pbmRleD10LHRoaXMuX2ZpbGVJbmZvPWl9O2FlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJQcm9wZXJ0eSIsZXZhbDpmdW5jdGlvbihlKXt2YXIgdCxpPXRoaXMubmFtZSxuPWUucGx1Z2luTWFuYWdlci5sZXNzLnZpc2l0b3JzLlRvQ1NTVmlzaXRvci5wcm90b3R5cGUuX21lcmdlUnVsZXM7aWYodGhpcy5ldmFsdWF0aW5nKXRocm93e3R5cGU6Ik5hbWUiLG1lc3NhZ2U6IlJlY3Vyc2l2ZSBwcm9wZXJ0eSByZWZlcmVuY2UgZm9yICIraSxmaWxlbmFtZTp0aGlzLmZpbGVJbmZvKCkuZmlsZW5hbWUsaW5kZXg6dGhpcy5nZXRJbmRleCgpfTtpZih0aGlzLmV2YWx1YXRpbmc9ITAsdD10aGlzLmZpbmQoZS5mcmFtZXMsKGZ1bmN0aW9uKHQpe3ZhciByLHM9dC5wcm9wZXJ0eShpKTtpZihzKXtmb3IodmFyIG89MDtvPHMubGVuZ3RoO28rKylyPXNbb10sc1tvXT1uZXcgRChyLm5hbWUsci52YWx1ZSxyLmltcG9ydGFudCxyLm1lcmdlLHIuaW5kZXgsci5jdXJyZW50RmlsZUluZm8sci5pbmxpbmUsci52YXJpYWJsZSk7aWYobihzKSwocj1zW3MubGVuZ3RoLTFdKS5pbXBvcnRhbnQpZS5pbXBvcnRhbnRTY29wZVtlLmltcG9ydGFudFNjb3BlLmxlbmd0aC0xXS5pbXBvcnRhbnQ9ci5pbXBvcnRhbnQ7cmV0dXJuIHI9ci52YWx1ZS5ldmFsKGUpfX0pKSlyZXR1cm4gdGhpcy5ldmFsdWF0aW5nPSExLHQ7dGhyb3d7dHlwZToiTmFtZSIsbWVzc2FnZToiUHJvcGVydHkgJyIraSsiJyBpcyB1bmRlZmluZWQiLGZpbGVuYW1lOnRoaXMuY3VycmVudEZpbGVJbmZvLmZpbGVuYW1lLGluZGV4OnRoaXMuaW5kZXh9fSxmaW5kOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBpPTAsbj12b2lkIDA7aTxlLmxlbmd0aDtpKyspaWYobj10LmNhbGwoZSxlW2ldKSlyZXR1cm4gbjtyZXR1cm4gbnVsbH19KTt2YXIgbGU9ZnVuY3Rpb24oZSx0LGkpe3RoaXMua2V5PWUsdGhpcy5vcD10LHRoaXMudmFsdWU9aX07bGUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IkF0dHJpYnV0ZSIsZXZhbDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGxlKHRoaXMua2V5LmV2YWw/dGhpcy5rZXkuZXZhbChlKTp0aGlzLmtleSx0aGlzLm9wLHRoaXMudmFsdWUmJnRoaXMudmFsdWUuZXZhbD90aGlzLnZhbHVlLmV2YWwoZSk6dGhpcy52YWx1ZSl9LGdlbkNTUzpmdW5jdGlvbihlLHQpe3QuYWRkKHRoaXMudG9DU1MoZSkpfSx0b0NTUzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmtleS50b0NTUz90aGlzLmtleS50b0NTUyhlKTp0aGlzLmtleTtyZXR1cm4gdGhpcy5vcCYmKHQrPXRoaXMub3AsdCs9dGhpcy52YWx1ZS50b0NTUz90aGlzLnZhbHVlLnRvQ1NTKGUpOnRoaXMudmFsdWUpLCJbIit0KyJdIn19KTt2YXIgdWU9ZnVuY3Rpb24oZSx0LGksbixyKXt0aGlzLmVzY2FwZWQ9bnVsbD09aXx8aSx0aGlzLnZhbHVlPXR8fCIiLHRoaXMucXVvdGU9ZS5jaGFyQXQoMCksdGhpcy5faW5kZXg9bix0aGlzLl9maWxlSW5mbz1yLHRoaXMudmFyaWFibGVSZWdleD0vQFx7KFtcdy1dKylcfS9nLHRoaXMucHJvcFJlZ2V4PS9cJFx7KFtcdy1dKylcfS9nLHRoaXMuYWxsb3dSb290PWl9O3VlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJRdW90ZWQiLGdlbkNTUzpmdW5jdGlvbihlLHQpe3RoaXMuZXNjYXBlZHx8dC5hZGQodGhpcy5xdW90ZSx0aGlzLmZpbGVJbmZvKCksdGhpcy5nZXRJbmRleCgpKSx0LmFkZCh0aGlzLnZhbHVlKSx0aGlzLmVzY2FwZWR8fHQuYWRkKHRoaXMucXVvdGUpfSxjb250YWluc1ZhcmlhYmxlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlLm1hdGNoKHRoaXMudmFyaWFibGVSZWdleCl9LGV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxpPXRoaXMudmFsdWU7ZnVuY3Rpb24gbihlLHQsaSl7dmFyIG49ZTtkb3tlPW4udG9TdHJpbmcoKSxuPWUucmVwbGFjZSh0LGkpfXdoaWxlKGUhPT1uKTtyZXR1cm4gbn1yZXR1cm4gaT1uKGksdGhpcy52YXJpYWJsZVJlZ2V4LChmdW5jdGlvbihpLG4pe3ZhciByPW5ldyBvZSgiQCIrbix0LmdldEluZGV4KCksdC5maWxlSW5mbygpKS5ldmFsKGUsITApO3JldHVybiByIGluc3RhbmNlb2YgdWU/ci52YWx1ZTpyLnRvQ1NTKCl9KSksaT1uKGksdGhpcy5wcm9wUmVnZXgsKGZ1bmN0aW9uKGksbil7dmFyIHI9bmV3IGFlKCIkIituLHQuZ2V0SW5kZXgoKSx0LmZpbGVJbmZvKCkpLmV2YWwoZSwhMCk7cmV0dXJuIHIgaW5zdGFuY2VvZiB1ZT9yLnZhbHVlOnIudG9DU1MoKX0pKSxuZXcgdWUodGhpcy5xdW90ZStpK3RoaXMucXVvdGUsaSx0aGlzLmVzY2FwZWQsdGhpcy5nZXRJbmRleCgpLHRoaXMuZmlsZUluZm8oKSl9LGNvbXBhcmU6ZnVuY3Rpb24oZSl7cmV0dXJuIlF1b3RlZCIhPT1lLnR5cGV8fHRoaXMuZXNjYXBlZHx8ZS5lc2NhcGVkP2UudG9DU1MmJnRoaXMudG9DU1MoKT09PWUudG9DU1MoKT8wOnZvaWQgMDp1Lm51bWVyaWNDb21wYXJlKHRoaXMudmFsdWUsZS52YWx1ZSl9fSk7dmFyIGNlPWZ1bmN0aW9uKGUsdCxpLG4pe3RoaXMudmFsdWU9ZSx0aGlzLl9pbmRleD10LHRoaXMuX2ZpbGVJbmZvPWksdGhpcy5pc0V2YWxkPW59O2NlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJVcmwiLGFjY2VwdDpmdW5jdGlvbihlKXt0aGlzLnZhbHVlPWUudmlzaXQodGhpcy52YWx1ZSl9LGdlbkNTUzpmdW5jdGlvbihlLHQpe3QuYWRkKCJ1cmwoIiksdGhpcy52YWx1ZS5nZW5DU1MoZSx0KSx0LmFkZCgiKSIpfSxldmFsOmZ1bmN0aW9uKGUpe3ZhciB0LGk9dGhpcy52YWx1ZS5ldmFsKGUpO2lmKCF0aGlzLmlzRXZhbGQmJigic3RyaW5nIj09dHlwZW9mKHQ9dGhpcy5maWxlSW5mbygpJiZ0aGlzLmZpbGVJbmZvKCkucm9vdHBhdGgpJiYic3RyaW5nIj09dHlwZW9mIGkudmFsdWUmJmUucGF0aFJlcXVpcmVzUmV3cml0ZShpLnZhbHVlKT8oaS5xdW90ZXx8KHQ9dC5yZXBsYWNlKC9bXChcKSciXHNdL2csKGZ1bmN0aW9uKGUpe3JldHVybiJcXCIrZX0pKSksaS52YWx1ZT1lLnJld3JpdGVQYXRoKGkudmFsdWUsdCkpOmkudmFsdWU9ZS5ub3JtYWxpemVQYXRoKGkudmFsdWUpLGUudXJsQXJncyYmIWkudmFsdWUubWF0Y2goL15ccypkYXRhOi8pKSl7dmFyIG49KC0xPT09aS52YWx1ZS5pbmRleE9mKCI/Iik/Ij8iOiImIikrZS51cmxBcmdzOy0xIT09aS52YWx1ZS5pbmRleE9mKCIjIik/aS52YWx1ZT1pLnZhbHVlLnJlcGxhY2UoIiMiLG4rIiMiKTppLnZhbHVlKz1ufXJldHVybiBuZXcgY2UoaSx0aGlzLmdldEluZGV4KCksdGhpcy5maWxlSW5mbygpLCEwKX19KTt2YXIgaGU9ZnVuY3Rpb24oZSx0LGksbixyKXt0aGlzLl9pbmRleD1pLHRoaXMuX2ZpbGVJbmZvPW47dmFyIHM9bmV3IEYoW10sbnVsbCxudWxsLHRoaXMuX2luZGV4LHRoaXMuX2ZpbGVJbmZvKS5jcmVhdGVFbXB0eVNlbGVjdG9ycygpO3RoaXMuZmVhdHVyZXM9bmV3ICQodCksdGhpcy5ydWxlcz1bbmV3IEsocyxlKV0sdGhpcy5ydWxlc1swXS5hbGxvd0ltcG9ydHM9ITAsdGhpcy5jb3B5VmlzaWJpbGl0eUluZm8ociksdGhpcy5hbGxvd1Jvb3Q9ITAsdGhpcy5zZXRQYXJlbnQocyx0aGlzKSx0aGlzLnNldFBhcmVudCh0aGlzLmZlYXR1cmVzLHRoaXMpLHRoaXMuc2V0UGFyZW50KHRoaXMucnVsZXMsdGhpcyl9O2hlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyBaLHt0eXBlOiJNZWRpYSIsaXNSdWxlc2V0TGlrZTpmdW5jdGlvbigpe3JldHVybiEwfSxhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5mZWF0dXJlcyYmKHRoaXMuZmVhdHVyZXM9ZS52aXNpdCh0aGlzLmZlYXR1cmVzKSksdGhpcy5ydWxlcyYmKHRoaXMucnVsZXM9ZS52aXNpdEFycmF5KHRoaXMucnVsZXMpKX0sZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dC5hZGQoIkBtZWRpYSAiLHRoaXMuX2ZpbGVJbmZvLHRoaXMuX2luZGV4KSx0aGlzLmZlYXR1cmVzLmdlbkNTUyhlLHQpLHRoaXMub3V0cHV0UnVsZXNldChlLHQsdGhpcy5ydWxlcyl9LGV2YWw6ZnVuY3Rpb24oZSl7ZS5tZWRpYUJsb2Nrc3x8KGUubWVkaWFCbG9ja3M9W10sZS5tZWRpYVBhdGg9W10pO3ZhciB0PW5ldyBoZShudWxsLFtdLHRoaXMuX2luZGV4LHRoaXMuX2ZpbGVJbmZvLHRoaXMudmlzaWJpbGl0eUluZm8oKSk7cmV0dXJuIHRoaXMuZGVidWdJbmZvJiYodGhpcy5ydWxlc1swXS5kZWJ1Z0luZm89dGhpcy5kZWJ1Z0luZm8sdC5kZWJ1Z0luZm89dGhpcy5kZWJ1Z0luZm8pLHQuZmVhdHVyZXM9dGhpcy5mZWF0dXJlcy5ldmFsKGUpLGUubWVkaWFQYXRoLnB1c2godCksZS5tZWRpYUJsb2Nrcy5wdXNoKHQpLHRoaXMucnVsZXNbMF0uZnVuY3Rpb25SZWdpc3RyeT1lLmZyYW1lc1swXS5mdW5jdGlvblJlZ2lzdHJ5LmluaGVyaXQoKSxlLmZyYW1lcy51bnNoaWZ0KHRoaXMucnVsZXNbMF0pLHQucnVsZXM9W3RoaXMucnVsZXNbMF0uZXZhbChlKV0sZS5mcmFtZXMuc2hpZnQoKSxlLm1lZGlhUGF0aC5wb3AoKSwwPT09ZS5tZWRpYVBhdGgubGVuZ3RoP3QuZXZhbFRvcChlKTp0LmV2YWxOZXN0ZWQoZSl9LGV2YWxUb3A6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZihlLm1lZGlhQmxvY2tzLmxlbmd0aD4xKXt2YXIgaT1uZXcgRihbXSxudWxsLG51bGwsdGhpcy5nZXRJbmRleCgpLHRoaXMuZmlsZUluZm8oKSkuY3JlYXRlRW1wdHlTZWxlY3RvcnMoKTsodD1uZXcgSyhpLGUubWVkaWFCbG9ja3MpKS5tdWx0aU1lZGlhPSEwLHQuY29weVZpc2liaWxpdHlJbmZvKHRoaXMudmlzaWJpbGl0eUluZm8oKSksdGhpcy5zZXRQYXJlbnQodCx0aGlzKX1yZXR1cm4gZGVsZXRlIGUubWVkaWFCbG9ja3MsZGVsZXRlIGUubWVkaWFQYXRoLHR9LGV2YWxOZXN0ZWQ6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuPWUubWVkaWFQYXRoLmNvbmNhdChbdGhpc10pO2Zvcih0PTA7dDxuLmxlbmd0aDt0KyspaT1uW3RdLmZlYXR1cmVzIGluc3RhbmNlb2YgJD9uW3RdLmZlYXR1cmVzLnZhbHVlOm5bdF0uZmVhdHVyZXMsblt0XT1BcnJheS5pc0FycmF5KGkpP2k6W2ldO3JldHVybiB0aGlzLmZlYXR1cmVzPW5ldyAkKHRoaXMucGVybXV0ZShuKS5tYXAoKGZ1bmN0aW9uKGUpe2ZvcihlPWUubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS50b0NTUz9lOm5ldyBqKGUpfSkpLHQ9ZS5sZW5ndGgtMTt0PjA7dC0tKWUuc3BsaWNlKHQsMCxuZXcgaigiYW5kIikpO3JldHVybiBuZXcgbmUoZSl9KSkpLHRoaXMuc2V0UGFyZW50KHRoaXMuZmVhdHVyZXMsdGhpcyksbmV3IEsoW10sW10pfSxwZXJtdXRlOmZ1bmN0aW9uKGUpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm5bXTtpZigxPT09ZS5sZW5ndGgpcmV0dXJuIGVbMF07Zm9yKHZhciB0PVtdLGk9dGhpcy5wZXJtdXRlKGUuc2xpY2UoMSkpLG49MDtuPGkubGVuZ3RoO24rKylmb3IodmFyIHI9MDtyPGVbMF0ubGVuZ3RoO3IrKyl0LnB1c2goW2VbMF1bcl1dLmNvbmNhdChpW25dKSk7cmV0dXJuIHR9LGJ1YmJsZVNlbGVjdG9yczpmdW5jdGlvbihlKXtlJiYodGhpcy5ydWxlcz1bbmV3IEsoayhlKSxbdGhpcy5ydWxlc1swXV0pXSx0aGlzLnNldFBhcmVudCh0aGlzLnJ1bGVzLHRoaXMpKX19KTt2YXIgZmU9ZnVuY3Rpb24oZSx0LGksbixyLHMpe2lmKHRoaXMub3B0aW9ucz1pLHRoaXMuX2luZGV4PW4sdGhpcy5fZmlsZUluZm89cix0aGlzLnBhdGg9ZSx0aGlzLmZlYXR1cmVzPXQsdGhpcy5hbGxvd1Jvb3Q9ITAsdm9pZCAwIT09dGhpcy5vcHRpb25zLmxlc3N8fHRoaXMub3B0aW9ucy5pbmxpbmUpdGhpcy5jc3M9IXRoaXMub3B0aW9ucy5sZXNzfHx0aGlzLm9wdGlvbnMuaW5saW5lO2Vsc2V7dmFyIG89dGhpcy5nZXRQYXRoKCk7byYmL1sjXC5cJlw/XWNzcyhbXD87XS4qKT8kLy50ZXN0KG8pJiYodGhpcy5jc3M9ITApfXRoaXMuY29weVZpc2liaWxpdHlJbmZvKHMpLHRoaXMuc2V0UGFyZW50KHRoaXMuZmVhdHVyZXMsdGhpcyksdGhpcy5zZXRQYXJlbnQodGhpcy5wYXRoLHRoaXMpfTtmZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiSW1wb3J0IixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5mZWF0dXJlcyYmKHRoaXMuZmVhdHVyZXM9ZS52aXNpdCh0aGlzLmZlYXR1cmVzKSksdGhpcy5wYXRoPWUudmlzaXQodGhpcy5wYXRoKSx0aGlzLm9wdGlvbnMuaXNQbHVnaW58fHRoaXMub3B0aW9ucy5pbmxpbmV8fCF0aGlzLnJvb3R8fCh0aGlzLnJvb3Q9ZS52aXNpdCh0aGlzLnJvb3QpKX0sZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dGhpcy5jc3MmJnZvaWQgMD09PXRoaXMucGF0aC5fZmlsZUluZm8ucmVmZXJlbmNlJiYodC5hZGQoIkBpbXBvcnQgIix0aGlzLl9maWxlSW5mbyx0aGlzLl9pbmRleCksdGhpcy5wYXRoLmdlbkNTUyhlLHQpLHRoaXMuZmVhdHVyZXMmJih0LmFkZCgiICIpLHRoaXMuZmVhdHVyZXMuZ2VuQ1NTKGUsdCkpLHQuYWRkKCI7IikpfSxnZXRQYXRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGF0aCBpbnN0YW5jZW9mIGNlP3RoaXMucGF0aC52YWx1ZS52YWx1ZTp0aGlzLnBhdGgudmFsdWV9LGlzVmFyaWFibGVJbXBvcnQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBhdGg7cmV0dXJuIGUgaW5zdGFuY2VvZiBjZSYmKGU9ZS52YWx1ZSksIShlIGluc3RhbmNlb2YgdWUpfHxlLmNvbnRhaW5zVmFyaWFibGVzKCl9LGV2YWxGb3JJbXBvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wYXRoO3JldHVybiB0IGluc3RhbmNlb2YgY2UmJih0PXQudmFsdWUpLG5ldyBmZSh0LmV2YWwoZSksdGhpcy5mZWF0dXJlcyx0aGlzLm9wdGlvbnMsdGhpcy5faW5kZXgsdGhpcy5fZmlsZUluZm8sdGhpcy52aXNpYmlsaXR5SW5mbygpKX0sZXZhbFBhdGg6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wYXRoLmV2YWwoZSksaT10aGlzLl9maWxlSW5mbztpZighKHQgaW5zdGFuY2VvZiBjZSkpe3ZhciBuPXQudmFsdWU7aSYmbiYmZS5wYXRoUmVxdWlyZXNSZXdyaXRlKG4pP3QudmFsdWU9ZS5yZXdyaXRlUGF0aChuLGkucm9vdHBhdGgpOnQudmFsdWU9ZS5ub3JtYWxpemVQYXRoKHQudmFsdWUpfXJldHVybiB0fSxldmFsOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZG9FdmFsKGUpO3JldHVybih0aGlzLm9wdGlvbnMucmVmZXJlbmNlfHx0aGlzLmJsb2Nrc1Zpc2liaWxpdHkoKSkmJih0Lmxlbmd0aHx8MD09PXQubGVuZ3RoP3QuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5hZGRWaXNpYmlsaXR5QmxvY2soKX0pKTp0LmFkZFZpc2liaWxpdHlCbG9jaygpKSx0fSxkb0V2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuPXRoaXMuZmVhdHVyZXMmJnRoaXMuZmVhdHVyZXMuZXZhbChlKTtpZih0aGlzLm9wdGlvbnMuaXNQbHVnaW4pe2lmKHRoaXMucm9vdCYmdGhpcy5yb290LmV2YWwpdHJ5e3RoaXMucm9vdC5ldmFsKGUpfWNhdGNoKGUpe3Rocm93IGUubWVzc2FnZT0iUGx1Z2luIGVycm9yIGR1cmluZyBldmFsdWF0aW9uIixuZXcgTyhlLHRoaXMucm9vdC5pbXBvcnRzLHRoaXMucm9vdC5maWxlbmFtZSl9cmV0dXJuKGk9ZS5mcmFtZXNbMF0mJmUuZnJhbWVzWzBdLmZ1bmN0aW9uUmVnaXN0cnkpJiZ0aGlzLnJvb3QmJnRoaXMucm9vdC5mdW5jdGlvbnMmJmkuYWRkTXVsdGlwbGUodGhpcy5yb290LmZ1bmN0aW9ucyksW119aWYodGhpcy5za2lwJiYoImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuc2tpcCYmKHRoaXMuc2tpcD10aGlzLnNraXAoKSksdGhpcy5za2lwKSlyZXR1cm5bXTtpZih0aGlzLm9wdGlvbnMuaW5saW5lKXt2YXIgcj1uZXcgaih0aGlzLnJvb3QsMCx7ZmlsZW5hbWU6dGhpcy5pbXBvcnRlZEZpbGVuYW1lLHJlZmVyZW5jZTp0aGlzLnBhdGguX2ZpbGVJbmZvJiZ0aGlzLnBhdGguX2ZpbGVJbmZvLnJlZmVyZW5jZX0sITAsITApO3JldHVybiB0aGlzLmZlYXR1cmVzP25ldyBoZShbcl0sdGhpcy5mZWF0dXJlcy52YWx1ZSk6W3JdfWlmKHRoaXMuY3NzKXt2YXIgcz1uZXcgZmUodGhpcy5ldmFsUGF0aChlKSxuLHRoaXMub3B0aW9ucyx0aGlzLl9pbmRleCk7aWYoIXMuY3NzJiZ0aGlzLmVycm9yKXRocm93IHRoaXMuZXJyb3I7cmV0dXJuIHN9cmV0dXJuIHRoaXMucm9vdD8oKHQ9bmV3IEsobnVsbCxrKHRoaXMucm9vdC5ydWxlcykpKS5ldmFsSW1wb3J0cyhlKSx0aGlzLmZlYXR1cmVzP25ldyBoZSh0LnJ1bGVzLHRoaXMuZmVhdHVyZXMudmFsdWUpOnQucnVsZXMpOltdfX0pO3ZhciBwZT1mdW5jdGlvbigpe307cGUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse2V2YWx1YXRlSmF2YVNjcmlwdDpmdW5jdGlvbihlLHQpe3ZhciBpLG49dGhpcyxyPXt9O2lmKCF0LmphdmFzY3JpcHRFbmFibGVkKXRocm93e21lc3NhZ2U6IklubGluZSBKYXZhU2NyaXB0IGlzIG5vdCBlbmFibGVkLiBJcyBpdCBzZXQgaW4geW91ciBvcHRpb25zPyIsZmlsZW5hbWU6dGhpcy5maWxlSW5mbygpLmZpbGVuYW1lLGluZGV4OnRoaXMuZ2V0SW5kZXgoKX07ZT1lLnJlcGxhY2UoL0BceyhbXHctXSspXH0vZywoZnVuY3Rpb24oZSxpKXtyZXR1cm4gbi5qc2lmeShuZXcgb2UoIkAiK2ksbi5nZXRJbmRleCgpLG4uZmlsZUluZm8oKSkuZXZhbCh0KSl9KSk7dHJ5e2U9bmV3IEZ1bmN0aW9uKCJyZXR1cm4gKCIrZSsiKSIpfWNhdGNoKHQpe3Rocm93e21lc3NhZ2U6IkphdmFTY3JpcHQgZXZhbHVhdGlvbiBlcnJvcjogIit0Lm1lc3NhZ2UrIiBmcm9tIGAiK2UrImAiLGZpbGVuYW1lOnRoaXMuZmlsZUluZm8oKS5maWxlbmFtZSxpbmRleDp0aGlzLmdldEluZGV4KCl9fXZhciBzPXQuZnJhbWVzWzBdLnZhcmlhYmxlcygpO2Zvcih2YXIgbyBpbiBzKXMuaGFzT3duUHJvcGVydHkobykmJihyW28uc2xpY2UoMSldPXt2YWx1ZTpzW29dLnZhbHVlLHRvSlM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZS5ldmFsKHQpLnRvQ1NTKCl9fSk7dHJ5e2k9ZS5jYWxsKHIpfWNhdGNoKGUpe3Rocm93e21lc3NhZ2U6IkphdmFTY3JpcHQgZXZhbHVhdGlvbiBlcnJvcjogJyIrZS5uYW1lKyI6ICIrZS5tZXNzYWdlLnJlcGxhY2UoL1siXS9nLCInIikrIiciLGZpbGVuYW1lOnRoaXMuZmlsZUluZm8oKS5maWxlbmFtZSxpbmRleDp0aGlzLmdldEluZGV4KCl9fXJldHVybiBpfSxqc2lmeTpmdW5jdGlvbihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlLnZhbHVlKSYmZS52YWx1ZS5sZW5ndGg+MT8iWyIrZS52YWx1ZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvQ1NTKCl9KSkuam9pbigiLCAiKSsiXSI6ZS50b0NTUygpfX0pO3ZhciB2ZT1mdW5jdGlvbihlLHQsaSxuKXt0aGlzLmVzY2FwZWQ9dCx0aGlzLmV4cHJlc3Npb249ZSx0aGlzLl9pbmRleD1pLHRoaXMuX2ZpbGVJbmZvPW59O3ZlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyBwZSx7dHlwZToiSmF2YVNjcmlwdCIsZXZhbDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmV2YWx1YXRlSmF2YVNjcmlwdCh0aGlzLmV4cHJlc3Npb24sZSksaT10eXBlb2YgdDtyZXR1cm4ibnVtYmVyIiE9PWl8fGlzTmFOKHQpPyJzdHJpbmciPT09aT9uZXcgdWUoJyInK3QrJyInLHQsdGhpcy5lc2NhcGVkLHRoaXMuX2luZGV4KTpBcnJheS5pc0FycmF5KHQpP25ldyBqKHQuam9pbigiLCAiKSk6bmV3IGoodCk6bmV3IGVlKHQpfX0pO3ZhciBkZT1mdW5jdGlvbihlLHQpe3RoaXMua2V5PWUsdGhpcy52YWx1ZT10fTtkZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiQXNzaWdubWVudCIsYWNjZXB0OmZ1bmN0aW9uKGUpe3RoaXMudmFsdWU9ZS52aXNpdCh0aGlzLnZhbHVlKX0sZXZhbDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy52YWx1ZS5ldmFsP25ldyBkZSh0aGlzLmtleSx0aGlzLnZhbHVlLmV2YWwoZSkpOnRoaXN9LGdlbkNTUzpmdW5jdGlvbihlLHQpe3QuYWRkKHRoaXMua2V5KyI9IiksdGhpcy52YWx1ZS5nZW5DU1M/dGhpcy52YWx1ZS5nZW5DU1MoZSx0KTp0LmFkZCh0aGlzLnZhbHVlKX19KTt2YXIgbWU9ZnVuY3Rpb24oZSx0LGksbixyKXt0aGlzLm9wPWUudHJpbSgpLHRoaXMubHZhbHVlPXQsdGhpcy5ydmFsdWU9aSx0aGlzLl9pbmRleD1uLHRoaXMubmVnYXRlPXJ9O21lLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJDb25kaXRpb24iLGFjY2VwdDpmdW5jdGlvbihlKXt0aGlzLmx2YWx1ZT1lLnZpc2l0KHRoaXMubHZhbHVlKSx0aGlzLnJ2YWx1ZT1lLnZpc2l0KHRoaXMucnZhbHVlKX0sZXZhbDpmdW5jdGlvbihlKXt2YXIgdD1mdW5jdGlvbihlLHQsaSl7c3dpdGNoKGUpe2Nhc2UiYW5kIjpyZXR1cm4gdCYmaTtjYXNlIm9yIjpyZXR1cm4gdHx8aTtkZWZhdWx0OnN3aXRjaCh1LmNvbXBhcmUodCxpKSl7Y2FzZS0xOnJldHVybiI8Ij09PWV8fCI9PCI9PT1lfHwiPD0iPT09ZTtjYXNlIDA6cmV0dXJuIj0iPT09ZXx8Ij49Ij09PWV8fCI9PCI9PT1lfHwiPD0iPT09ZTtjYXNlIDE6cmV0dXJuIj4iPT09ZXx8Ij49Ij09PWU7ZGVmYXVsdDpyZXR1cm4hMX19fSh0aGlzLm9wLHRoaXMubHZhbHVlLmV2YWwoZSksdGhpcy5ydmFsdWUuZXZhbChlKSk7cmV0dXJuIHRoaXMubmVnYXRlPyF0OnR9fSk7dmFyIGdlPWZ1bmN0aW9uKGUpe3RoaXMudmFsdWU9ZX07Z2UucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IlVuaWNvZGVEZXNjcmlwdG9yIn0pO3ZhciB5ZT1mdW5jdGlvbihlKXt0aGlzLnZhbHVlPWV9O3llLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJOZWdhdGl2ZSIsZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dC5hZGQoIi0iKSx0aGlzLnZhbHVlLmdlbkNTUyhlLHQpfSxldmFsOmZ1bmN0aW9uKGUpe3JldHVybiBlLmlzTWF0aE9uKCk/bmV3IGllKCIqIixbbmV3IGVlKC0xKSx0aGlzLnZhbHVlXSkuZXZhbChlKTpuZXcgeWUodGhpcy52YWx1ZS5ldmFsKGUpKX19KTt2YXIgYmU9ZnVuY3Rpb24oZSx0LGksbixyKXtzd2l0Y2godGhpcy5zZWxlY3Rvcj1lLHRoaXMub3B0aW9uPXQsdGhpcy5vYmplY3RfaWQ9YmUubmV4dF9pZCsrLHRoaXMucGFyZW50X2lkcz1bdGhpcy5vYmplY3RfaWRdLHRoaXMuX2luZGV4PWksdGhpcy5fZmlsZUluZm89bix0aGlzLmNvcHlWaXNpYmlsaXR5SW5mbyhyKSx0aGlzLmFsbG93Um9vdD0hMCx0KXtjYXNlImFsbCI6dGhpcy5hbGxvd0JlZm9yZT0hMCx0aGlzLmFsbG93QWZ0ZXI9ITA7YnJlYWs7ZGVmYXVsdDp0aGlzLmFsbG93QmVmb3JlPSExLHRoaXMuYWxsb3dBZnRlcj0hMX10aGlzLnNldFBhcmVudCh0aGlzLnNlbGVjdG9yLHRoaXMpfTtiZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiRXh0ZW5kIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5zZWxlY3Rvcj1lLnZpc2l0KHRoaXMuc2VsZWN0b3IpfSxldmFsOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgYmUodGhpcy5zZWxlY3Rvci5ldmFsKGUpLHRoaXMub3B0aW9uLHRoaXMuZ2V0SW5kZXgoKSx0aGlzLmZpbGVJbmZvKCksdGhpcy52aXNpYmlsaXR5SW5mbygpKX0sY2xvbmU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBiZSh0aGlzLnNlbGVjdG9yLHRoaXMub3B0aW9uLHRoaXMuZ2V0SW5kZXgoKSx0aGlzLmZpbGVJbmZvKCksdGhpcy52aXNpYmlsaXR5SW5mbygpKX0sZmluZFNlbGZTZWxlY3RvcnM6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuPVtdO2Zvcih0PTA7dDxlLmxlbmd0aDt0KyspaT1lW3RdLmVsZW1lbnRzLHQ+MCYmaS5sZW5ndGgmJiIiPT09aVswXS5jb21iaW5hdG9yLnZhbHVlJiYoaVswXS5jb21iaW5hdG9yLnZhbHVlPSIgIiksbj1uLmNvbmNhdChlW3RdLmVsZW1lbnRzKTt0aGlzLnNlbGZTZWxlY3RvcnM9W25ldyBGKG4pXSx0aGlzLnNlbGZTZWxlY3RvcnNbMF0uY29weVZpc2liaWxpdHlJbmZvKHRoaXMudmlzaWJpbGl0eUluZm8oKSl9fSksYmUubmV4dF9pZD0wO3ZhciB3ZT1mdW5jdGlvbihlLHQsaSl7dGhpcy52YXJpYWJsZT1lLHRoaXMuX2luZGV4PXQsdGhpcy5fZmlsZUluZm89aSx0aGlzLmFsbG93Um9vdD0hMH07d2UucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IlZhcmlhYmxlQ2FsbCIsZXZhbDpmdW5jdGlvbihlKXt2YXIgdCxpPW5ldyBvZSh0aGlzLnZhcmlhYmxlLHRoaXMuZ2V0SW5kZXgoKSx0aGlzLmZpbGVJbmZvKCkpLmV2YWwoZSksbj1uZXcgTyh7bWVzc2FnZToiQ291bGQgbm90IGV2YWx1YXRlIHZhcmlhYmxlIGNhbGwgIit0aGlzLnZhcmlhYmxlfSk7aWYoIWkucnVsZXNldCl7aWYoaS5ydWxlcyl0PWk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGkpKXQ9bmV3IEsoIiIsaSk7ZWxzZXtpZighQXJyYXkuaXNBcnJheShpLnZhbHVlKSl0aHJvdyBuO3Q9bmV3IEsoIiIsaS52YWx1ZSl9aT1uZXcgWCh0KX1pZihpLnJ1bGVzZXQpcmV0dXJuIGkuY2FsbEV2YWwoZSk7dGhyb3cgbn19KTt2YXIgeGU9ZnVuY3Rpb24oZSx0LGksbil7dGhpcy52YWx1ZT1lLHRoaXMubG9va3Vwcz10LHRoaXMuX2luZGV4PWksdGhpcy5fZmlsZUluZm89bn07eGUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6Ik5hbWVzcGFjZVZhbHVlIixldmFsOmZ1bmN0aW9uKGUpe3ZhciB0LGksbj10aGlzLnZhbHVlLmV2YWwoZSk7Zm9yKHQ9MDt0PHRoaXMubG9va3Vwcy5sZW5ndGg7dCsrKXtpZihpPXRoaXMubG9va3Vwc1t0XSxBcnJheS5pc0FycmF5KG4pJiYobj1uZXcgSyhbbmV3IEZdLG4pKSwiIj09PWkpbj1uLmxhc3REZWNsYXJhdGlvbigpO2Vsc2UgaWYoIkAiPT09aS5jaGFyQXQoMCkpe2lmKCJAIj09PWkuY2hhckF0KDEpJiYoaT0iQCIrbmV3IG9lKGkuc3Vic3RyKDEpKS5ldmFsKGUpLnZhbHVlKSxuLnZhcmlhYmxlcyYmKG49bi52YXJpYWJsZShpKSksIW4pdGhyb3d7dHlwZToiTmFtZSIsbWVzc2FnZToidmFyaWFibGUgIitpKyIgbm90IGZvdW5kIixmaWxlbmFtZTp0aGlzLmZpbGVJbmZvKCkuZmlsZW5hbWUsaW5kZXg6dGhpcy5nZXRJbmRleCgpfX1lbHNle2lmKGk9IiRAIj09PWkuc3Vic3RyaW5nKDAsMik/IiQiK25ldyBvZShpLnN1YnN0cigxKSkuZXZhbChlKS52YWx1ZToiJCI9PT1pLmNoYXJBdCgwKT9pOiIkIitpLG4ucHJvcGVydGllcyYmKG49bi5wcm9wZXJ0eShpKSksIW4pdGhyb3d7dHlwZToiTmFtZSIsbWVzc2FnZToncHJvcGVydHkgIicraS5zdWJzdHIoMSkrJyIgbm90IGZvdW5kJyxmaWxlbmFtZTp0aGlzLmZpbGVJbmZvKCkuZmlsZW5hbWUsaW5kZXg6dGhpcy5nZXRJbmRleCgpfTtuPW5bbi5sZW5ndGgtMV19bi52YWx1ZSYmKG49bi5ldmFsKGUpLnZhbHVlKSxuLnJ1bGVzZXQmJihuPW4ucnVsZXNldC5ldmFsKGUpKX1yZXR1cm4gbn19KTt2YXIgU2U9ZnVuY3Rpb24oZSx0LGksbixyLHMsbyl7dGhpcy5uYW1lPWV8fCJhbm9ueW1vdXMgbWl4aW4iLHRoaXMuc2VsZWN0b3JzPVtuZXcgRihbbmV3IG0obnVsbCxlLCExLHRoaXMuX2luZGV4LHRoaXMuX2ZpbGVJbmZvKV0pXSx0aGlzLnBhcmFtcz10LHRoaXMuY29uZGl0aW9uPW4sdGhpcy52YXJpYWRpYz1yLHRoaXMuYXJpdHk9dC5sZW5ndGgsdGhpcy5ydWxlcz1pLHRoaXMuX2xvb2t1cHM9e307dmFyIGE9W107dGhpcy5yZXF1aXJlZD10LnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4hdC5uYW1lfHx0Lm5hbWUmJiF0LnZhbHVlP2UrMTooYS5wdXNoKHQubmFtZSksZSl9KSwwKSx0aGlzLm9wdGlvbmFsUGFyYW1ldGVycz1hLHRoaXMuZnJhbWVzPXMsdGhpcy5jb3B5VmlzaWJpbGl0eUluZm8obyksdGhpcy5hbGxvd1Jvb3Q9ITB9O1NlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyBLLHt0eXBlOiJNaXhpbkRlZmluaXRpb24iLGV2YWxGaXJzdDohMCxhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5wYXJhbXMmJnRoaXMucGFyYW1zLmxlbmd0aCYmKHRoaXMucGFyYW1zPWUudmlzaXRBcnJheSh0aGlzLnBhcmFtcykpLHRoaXMucnVsZXM9ZS52aXNpdEFycmF5KHRoaXMucnVsZXMpLHRoaXMuY29uZGl0aW9uJiYodGhpcy5jb25kaXRpb249ZS52aXNpdCh0aGlzLmNvbmRpdGlvbikpfSxldmFsUGFyYW1zOmZ1bmN0aW9uKGUsdCxpLG4pe3ZhciByLHMsbyxhLGwsdSxjLGgsZj1uZXcgSyhudWxsLG51bGwpLHA9ayh0aGlzLnBhcmFtcyksdj0wO2lmKHQuZnJhbWVzJiZ0LmZyYW1lc1swXSYmdC5mcmFtZXNbMF0uZnVuY3Rpb25SZWdpc3RyeSYmKGYuZnVuY3Rpb25SZWdpc3RyeT10LmZyYW1lc1swXS5mdW5jdGlvblJlZ2lzdHJ5LmluaGVyaXQoKSksdD1uZXcgcS5FdmFsKHQsW2ZdLmNvbmNhdCh0LmZyYW1lcykpLGkpZm9yKHY9KGk9ayhpKSkubGVuZ3RoLG89MDtvPHY7bysrKWlmKHU9KHM9aVtvXSkmJnMubmFtZSl7Zm9yKGM9ITEsYT0wO2E8cC5sZW5ndGg7YSsrKWlmKCFuW2FdJiZ1PT09cFthXS5uYW1lKXtuW2FdPXMudmFsdWUuZXZhbChlKSxmLnByZXBlbmRSdWxlKG5ldyBEKHUscy52YWx1ZS5ldmFsKGUpKSksYz0hMDticmVha31pZihjKXtpLnNwbGljZShvLDEpLG8tLTtjb250aW51ZX10aHJvd3t0eXBlOiJSdW50aW1lIixtZXNzYWdlOiJOYW1lZCBhcmd1bWVudCBmb3IgIit0aGlzLm5hbWUrIiAiK2lbb10ubmFtZSsiIG5vdCBmb3VuZCJ9fWZvcihoPTAsbz0wO288cC5sZW5ndGg7bysrKWlmKCFuW29dKXtpZihzPWkmJmlbaF0sdT1wW29dLm5hbWUpaWYocFtvXS52YXJpYWRpYyl7Zm9yKHI9W10sYT1oO2E8djthKyspci5wdXNoKGlbYV0udmFsdWUuZXZhbChlKSk7Zi5wcmVwZW5kUnVsZShuZXcgRCh1LG5ldyBuZShyKS5ldmFsKGUpKSl9ZWxzZXtpZihsPXMmJnMudmFsdWUpbD1BcnJheS5pc0FycmF5KGwpP25ldyBYKG5ldyBLKCIiLGwpKTpsLmV2YWwoZSk7ZWxzZXtpZighcFtvXS52YWx1ZSl0aHJvd3t0eXBlOiJSdW50aW1lIixtZXNzYWdlOiJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciAiK3RoaXMubmFtZSsiICgiK3YrIiBmb3IgIit0aGlzLmFyaXR5KyIpIn07bD1wW29dLnZhbHVlLmV2YWwodCksZi5yZXNldENhY2hlKCl9Zi5wcmVwZW5kUnVsZShuZXcgRCh1LGwpKSxuW29dPWx9aWYocFtvXS52YXJpYWRpYyYmaSlmb3IoYT1oO2E8djthKyspblthXT1pW2FdLnZhbHVlLmV2YWwoZSk7aCsrfXJldHVybiBmfSxtYWtlSW1wb3J0YW50OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ydWxlcz90aGlzLnJ1bGVzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUubWFrZUltcG9ydGFudD9lLm1ha2VJbXBvcnRhbnQoITApOmV9KSk6dGhpcy5ydWxlcztyZXR1cm4gbmV3IFNlKHRoaXMubmFtZSx0aGlzLnBhcmFtcyxlLHRoaXMuY29uZGl0aW9uLHRoaXMudmFyaWFkaWMsdGhpcy5mcmFtZXMpfSxldmFsOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgU2UodGhpcy5uYW1lLHRoaXMucGFyYW1zLHRoaXMucnVsZXMsdGhpcy5jb25kaXRpb24sdGhpcy52YXJpYWRpYyx0aGlzLmZyYW1lc3x8ayhlLmZyYW1lcykpfSxldmFsQ2FsbDpmdW5jdGlvbihlLHQsaSl7dmFyIG4scixzPVtdLG89dGhpcy5mcmFtZXM/dGhpcy5mcmFtZXMuY29uY2F0KGUuZnJhbWVzKTplLmZyYW1lcyxhPXRoaXMuZXZhbFBhcmFtcyhlLG5ldyBxLkV2YWwoZSxvKSx0LHMpO3JldHVybiBhLnByZXBlbmRSdWxlKG5ldyBEKCJAYXJndW1lbnRzIixuZXcgbmUocykuZXZhbChlKSkpLG49ayh0aGlzLnJ1bGVzKSwocj1uZXcgSyhudWxsLG4pKS5vcmlnaW5hbFJ1bGVzZXQ9dGhpcyxyPXIuZXZhbChuZXcgcS5FdmFsKGUsW3RoaXMsYV0uY29uY2F0KG8pKSksaSYmKHI9ci5tYWtlSW1wb3J0YW50KCkpLHJ9LG1hdGNoQ29uZGl0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuISh0aGlzLmNvbmRpdGlvbiYmIXRoaXMuY29uZGl0aW9uLmV2YWwobmV3IHEuRXZhbCh0LFt0aGlzLmV2YWxQYXJhbXModCxuZXcgcS5FdmFsKHQsdGhpcy5mcmFtZXM/dGhpcy5mcmFtZXMuY29uY2F0KHQuZnJhbWVzKTp0LmZyYW1lcyksZSxbXSldLmNvbmNhdCh0aGlzLmZyYW1lc3x8W10pLmNvbmNhdCh0LmZyYW1lcykpKSl9LG1hdGNoQXJnczpmdW5jdGlvbihlLHQpe3ZhciBpLG49ZSYmZS5sZW5ndGh8fDAscj10aGlzLm9wdGlvbmFsUGFyYW1ldGVycyxzPWU/ZS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuaW5kZXhPZih0Lm5hbWUpPDA/ZSsxOmV9KSwwKTowO2lmKHRoaXMudmFyaWFkaWMpe2lmKHM8dGhpcy5yZXF1aXJlZC0xKXJldHVybiExfWVsc2V7aWYoczx0aGlzLnJlcXVpcmVkKXJldHVybiExO2lmKG4+dGhpcy5wYXJhbXMubGVuZ3RoKXJldHVybiExfWk9TWF0aC5taW4ocyx0aGlzLmFyaXR5KTtmb3IodmFyIG89MDtvPGk7bysrKWlmKCF0aGlzLnBhcmFtc1tvXS5uYW1lJiYhdGhpcy5wYXJhbXNbb10udmFyaWFkaWMmJmVbb10udmFsdWUuZXZhbCh0KS50b0NTUygpIT10aGlzLnBhcmFtc1tvXS52YWx1ZS5ldmFsKHQpLnRvQ1NTKCkpcmV0dXJuITE7cmV0dXJuITB9fSk7dmFyIEllPWZ1bmN0aW9uKGUsdCxpLG4scil7dGhpcy5zZWxlY3Rvcj1uZXcgRihlKSx0aGlzLmFyZ3VtZW50cz10fHxbXSx0aGlzLl9pbmRleD1pLHRoaXMuX2ZpbGVJbmZvPW4sdGhpcy5pbXBvcnRhbnQ9cix0aGlzLmFsbG93Um9vdD0hMCx0aGlzLnNldFBhcmVudCh0aGlzLnNlbGVjdG9yLHRoaXMpfTtJZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiTWl4aW5DYWxsIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9ZS52aXNpdCh0aGlzLnNlbGVjdG9yKSksdGhpcy5hcmd1bWVudHMubGVuZ3RoJiYodGhpcy5hcmd1bWVudHM9ZS52aXNpdEFycmF5KHRoaXMuYXJndW1lbnRzKSl9LGV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuLHIscyxvLGEsbCx1LGMsaCxmLHAsdixkLG09W10sZz1bXSx5PSExLGI9W10sdz1bXTtmdW5jdGlvbiB4KHQsaSl7dmFyIG4scixzO2ZvcihuPTA7bjwyO24rKyl7Zm9yKHdbbl09ITAsUS52YWx1ZShuKSxyPTA7cjxpLmxlbmd0aCYmd1tuXTtyKyspKHM9aVtyXSkubWF0Y2hDb25kaXRpb24mJih3W25dPXdbbl0mJnMubWF0Y2hDb25kaXRpb24obnVsbCxlKSk7dC5tYXRjaENvbmRpdGlvbiYmKHdbbl09d1tuXSYmdC5tYXRjaENvbmRpdGlvbihtLGUpKX1yZXR1cm4gd1swXXx8d1sxXT93WzBdIT13WzFdP3dbMV0/MToyOjA6LTF9Zm9yKHRoaXMuc2VsZWN0b3I9dGhpcy5zZWxlY3Rvci5ldmFsKGUpLG89MDtvPHRoaXMuYXJndW1lbnRzLmxlbmd0aDtvKyspaWYocz0ocj10aGlzLmFyZ3VtZW50c1tvXSkudmFsdWUuZXZhbChlKSxyLmV4cGFuZCYmQXJyYXkuaXNBcnJheShzLnZhbHVlKSlmb3Iocz1zLnZhbHVlLGE9MDthPHMubGVuZ3RoO2ErKyltLnB1c2goe3ZhbHVlOnNbYV19KTtlbHNlIG0ucHVzaCh7bmFtZTpyLm5hbWUsdmFsdWU6c30pO2ZvcihkPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hdGNoQXJncyhudWxsLGUpfSxvPTA7bzxlLmZyYW1lcy5sZW5ndGg7bysrKWlmKCh0PWUuZnJhbWVzW29dLmZpbmQodGhpcy5zZWxlY3RvcixudWxsLGQpKS5sZW5ndGg+MCl7Zm9yKGM9ITAsYT0wO2E8dC5sZW5ndGg7YSsrKXtmb3IoaT10W2FdLnJ1bGUsbj10W2FdLnBhdGgsdT0hMSxsPTA7bDxlLmZyYW1lcy5sZW5ndGg7bCsrKWlmKCEoaSBpbnN0YW5jZW9mIFNlKSYmaT09PShlLmZyYW1lc1tsXS5vcmlnaW5hbFJ1bGVzZXR8fGUuZnJhbWVzW2xdKSl7dT0hMDticmVha311fHxpLm1hdGNoQXJncyhtLGUpJiYoLTEhPT0oaD17bWl4aW46aSxncm91cDp4KGksbil9KS5ncm91cCYmYi5wdXNoKGgpLHk9ITApfWZvcihRLnJlc2V0KCkscD1bMCwwLDBdLGE9MDthPGIubGVuZ3RoO2ErKylwW2JbYV0uZ3JvdXBdKys7aWYocFswXT4wKWY9MjtlbHNlIGlmKGY9MSxwWzFdK3BbMl0+MSl0aHJvd3t0eXBlOiJSdW50aW1lIixtZXNzYWdlOiJBbWJpZ3VvdXMgdXNlIG9mIGBkZWZhdWx0KClgIGZvdW5kIHdoZW4gbWF0Y2hpbmcgZm9yIGAiK3RoaXMuZm9ybWF0KG0pKyJgIixpbmRleDp0aGlzLmdldEluZGV4KCksZmlsZW5hbWU6dGhpcy5maWxlSW5mbygpLmZpbGVuYW1lfTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDA9PT0oaD1iW2FdLmdyb3VwKXx8aD09PWYpdHJ5eyhpPWJbYV0ubWl4aW4paW5zdGFuY2VvZiBTZXx8KHY9aS5vcmlnaW5hbFJ1bGVzZXR8fGksKGk9bmV3IFNlKCIiLFtdLGkucnVsZXMsbnVsbCwhMSxudWxsLHYudmlzaWJpbGl0eUluZm8oKSkpLm9yaWdpbmFsUnVsZXNldD12KTt2YXIgUz1pLmV2YWxDYWxsKGUsbSx0aGlzLmltcG9ydGFudCkucnVsZXM7dGhpcy5fc2V0VmlzaWJpbGl0eVRvUmVwbGFjZW1lbnQoUyksQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZyxTKX1jYXRjaChlKXt0aHJvd3ttZXNzYWdlOmUubWVzc2FnZSxpbmRleDp0aGlzLmdldEluZGV4KCksZmlsZW5hbWU6dGhpcy5maWxlSW5mbygpLmZpbGVuYW1lLHN0YWNrOmUuc3RhY2t9fWlmKHkpcmV0dXJuIGd9dGhyb3cgYz97dHlwZToiUnVudGltZSIsbWVzc2FnZToiTm8gbWF0Y2hpbmcgZGVmaW5pdGlvbiB3YXMgZm91bmQgZm9yIGAiK3RoaXMuZm9ybWF0KG0pKyJgIixpbmRleDp0aGlzLmdldEluZGV4KCksZmlsZW5hbWU6dGhpcy5maWxlSW5mbygpLmZpbGVuYW1lfTp7dHlwZToiTmFtZSIsbWVzc2FnZTp0aGlzLnNlbGVjdG9yLnRvQ1NTKCkudHJpbSgpKyIgaXMgdW5kZWZpbmVkIixpbmRleDp0aGlzLmdldEluZGV4KCksZmlsZW5hbWU6dGhpcy5maWxlSW5mbygpLmZpbGVuYW1lfX0sX3NldFZpc2liaWxpdHlUb1JlcGxhY2VtZW50OmZ1bmN0aW9uKGUpe3ZhciB0O2lmKHRoaXMuYmxvY2tzVmlzaWJpbGl0eSgpKWZvcih0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS5hZGRWaXNpYmlsaXR5QmxvY2soKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnNlbGVjdG9yLnRvQ1NTKCkudHJpbSgpKyIoIisoZT9lLm1hcCgoZnVuY3Rpb24oZSl7dmFyIHQ9IiI7cmV0dXJuIGUubmFtZSYmKHQrPWUubmFtZSsiOiIpLGUudmFsdWUudG9DU1M/dCs9ZS52YWx1ZS50b0NTUygpOnQrPSI/Pz8iLHR9KSkuam9pbigiLCAiKToiIikrIikifX0pO3ZhciBDZT17Tm9kZTp1LENvbG9yOmMsQXRSdWxlOlosRGV0YWNoZWRSdWxlc2V0OlgsT3BlcmF0aW9uOmllLERpbWVuc2lvbjplZSxVbml0OlksS2V5d29yZDpMLFZhcmlhYmxlOm9lLFByb3BlcnR5OmFlLFJ1bGVzZXQ6SyxFbGVtZW50Om0sQXR0cmlidXRlOmxlLENvbWJpbmF0b3I6ZCxTZWxlY3RvcjpGLFF1b3RlZDp1ZSxFeHByZXNzaW9uOm5lLERlY2xhcmF0aW9uOkQsQ2FsbDpzZSxVUkw6Y2UsSW1wb3J0OmZlLENvbW1lbnQ6VSxBbm9ueW1vdXM6aixWYWx1ZTokLEphdmFTY3JpcHQ6dmUsQXNzaWdubWVudDpkZSxDb25kaXRpb246bWUsUGFyZW46cCxNZWRpYTpoZSxVbmljb2RlRGVzY3JpcHRvcjpnZSxOZWdhdGl2ZTp5ZSxFeHRlbmQ6YmUsVmFyaWFibGVDYWxsOndlLE5hbWVzcGFjZVZhbHVlOnhlLG1peGluOntDYWxsOkllLERlZmluaXRpb246U2V9fSxrZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUucHJvdG90eXBlLmdldFBhdGg9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sYXN0SW5kZXhPZigiPyIpO3JldHVybiB0PjAmJihlPWUuc2xpY2UoMCx0KSksKHQ9ZS5sYXN0SW5kZXhPZigiLyIpKTwwJiYodD1lLmxhc3RJbmRleE9mKCJcXCIpKSx0PDA/IiI6ZS5zbGljZSgwLHQrMSl9LGUucHJvdG90eXBlLnRyeUFwcGVuZEV4dGVuc2lvbj1mdW5jdGlvbihlLHQpe3JldHVybi8oXC5bYS16XSokKXwoW1w/O10uKikkLy50ZXN0KGUpP2U6ZSt0fSxlLnByb3RvdHlwZS50cnlBcHBlbmRMZXNzRXh0ZW5zaW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRyeUFwcGVuZEV4dGVuc2lvbihlLCIubGVzcyIpfSxlLnByb3RvdHlwZS5zdXBwb3J0c1N5bmM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZS5wcm90b3R5cGUuYWx3YXlzTWFrZVBhdGhzQWJzb2x1dGU9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZS5wcm90b3R5cGUuaXNQYXRoQWJzb2x1dGU9ZnVuY3Rpb24oZSl7cmV0dXJuL14oPzpbYS16LV0rOnxcL3xcXHwjKS9pLnRlc3QoZSl9LGUucHJvdG90eXBlLmpvaW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT9lK3Q6dH0sZS5wcm90b3R5cGUucGF0aERpZmY9ZnVuY3Rpb24oZSx0KXt2YXIgaSxuLHIscyxvPXRoaXMuZXh0cmFjdFVybFBhcnRzKGUpLGE9dGhpcy5leHRyYWN0VXJsUGFydHModCksbD0iIjtpZihvLmhvc3RQYXJ0IT09YS5ob3N0UGFydClyZXR1cm4iIjtmb3Iobj1NYXRoLm1heChhLmRpcmVjdG9yaWVzLmxlbmd0aCxvLmRpcmVjdG9yaWVzLmxlbmd0aCksaT0wO2k8biYmYS5kaXJlY3Rvcmllc1tpXT09PW8uZGlyZWN0b3JpZXNbaV07aSsrKTtmb3Iocz1hLmRpcmVjdG9yaWVzLnNsaWNlKGkpLHI9by5kaXJlY3Rvcmllcy5zbGljZShpKSxpPTA7aTxzLmxlbmd0aC0xO2krKylsKz0iLi4vIjtmb3IoaT0wO2k8ci5sZW5ndGgtMTtpKyspbCs9cltpXSsiLyI7cmV0dXJuIGx9LGUucHJvdG90eXBlLmV4dHJhY3RVcmxQYXJ0cz1mdW5jdGlvbihlLHQpe3ZhciBpLG4scj0vXigoPzpbYS16LV0rOik/XC97Mn0oPzpbXlwvXD8jXSpcLyl8KFtcL1xcXSkpPygoPzpbXlwvXFxcPyNdKltcL1xcXSkqKShbXlwvXFxcPyNdKikoWyNcP10uKik/JC9pLHM9ZS5tYXRjaChyKSxvPXt9LGE9W10sbD1bXTtpZighcyl0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBzaGVldCBocmVmIC0gJyIrZSsiJyIpO2lmKHQmJighc1sxXXx8c1syXSkpe2lmKCEobj10Lm1hdGNoKHIpKSl0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBwYWdlIHVybCAtICciK3QrIiciKTtzWzFdPXNbMV18fG5bMV18fCIiLHNbMl18fChzWzNdPW5bM10rc1szXSl9aWYoc1szXSlmb3IoYT1zWzNdLnJlcGxhY2UoL1xcL2csIi8iKS5zcGxpdCgiLyIpLGk9MDtpPGEubGVuZ3RoO2krKykiLi4iPT09YVtpXT9sLnBvcCgpOiIuIiE9PWFbaV0mJmwucHVzaChhW2ldKTtyZXR1cm4gby5ob3N0UGFydD1zWzFdLG8uZGlyZWN0b3JpZXM9bCxvLnJhd1BhdGg9KHNbMV18fCIiKSthLmpvaW4oIi8iKSxvLnBhdGg9KHNbMV18fCIiKStsLmpvaW4oIi8iKSxvLmZpbGVuYW1lPXNbNF0sby5maWxlVXJsPW8ucGF0aCsoc1s0XXx8IiIpLG8udXJsPW8uZmlsZVVybCsoc1s1XXx8IiIpLG99LGV9KCksX2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5yZXF1aXJlPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fXJldHVybiBlLnByb3RvdHlwZS5ldmFsUGx1Z2luPWZ1bmN0aW9uKGUsdCxpLG4scil7dmFyIHMsbyxhLGwsdSxjO2w9dC5wbHVnaW5NYW5hZ2VyLHImJih1PSJzdHJpbmciPT10eXBlb2Ygcj9yOnIuZmlsZW5hbWUpO3ZhciBoPShuZXcgdGhpcy5sZXNzLkZpbGVNYW5hZ2VyKS5leHRyYWN0VXJsUGFydHModSkuZmlsZW5hbWU7aWYodSYmKG89bC5nZXQodSkpKXtpZihjPXRoaXMudHJ5U2V0T3B0aW9ucyhvLHUsaCxuKSlyZXR1cm4gYzt0cnl7by51c2UmJm8udXNlLmNhbGwodGhpcy5jb250ZXh0LG8pfWNhdGNoKGUpe3JldHVybiBlLm1lc3NhZ2U9ZS5tZXNzYWdlfHwiRXJyb3IgZHVyaW5nIEBwbHVnaW4gY2FsbCIsbmV3IE8oZSxpLHUpfXJldHVybiBvfWE9e2V4cG9ydHM6e30scGx1Z2luTWFuYWdlcjpsLGZpbGVJbmZvOnJ9LHM9SC5jcmVhdGUoKTt0cnl7bmV3IEZ1bmN0aW9uKCJtb2R1bGUiLCJyZXF1aXJlIiwicmVnaXN0ZXJQbHVnaW4iLCJmdW5jdGlvbnMiLCJ0cmVlIiwibGVzcyIsImZpbGVJbmZvIixlKShhLHRoaXMucmVxdWlyZSh1KSwoZnVuY3Rpb24oZSl7bz1lfSkscyx0aGlzLmxlc3MudHJlZSx0aGlzLmxlc3Mscil9Y2F0Y2goZSl7cmV0dXJuIG5ldyBPKGUsaSx1KX1pZihvfHwobz1hLmV4cG9ydHMpLChvPXRoaXMudmFsaWRhdGVQbHVnaW4obyx1LGgpKWluc3RhbmNlb2YgTylyZXR1cm4gbztpZighbylyZXR1cm4gbmV3IE8oe21lc3NhZ2U6Ik5vdCBhIHZhbGlkIHBsdWdpbiJ9LGksdSk7aWYoby5pbXBvcnRzPWksby5maWxlbmFtZT11LCghby5taW5WZXJzaW9ufHx0aGlzLmNvbXBhcmVWZXJzaW9uKCIzLjAuMCIsby5taW5WZXJzaW9uKTwwKSYmKGM9dGhpcy50cnlTZXRPcHRpb25zKG8sdSxoLG4pKSlyZXR1cm4gYztpZihsLmFkZFBsdWdpbihvLHIuZmlsZW5hbWUscyksby5mdW5jdGlvbnM9cy5nZXRMb2NhbEZ1bmN0aW9ucygpLGM9dGhpcy50cnlTZXRPcHRpb25zKG8sdSxoLG4pKXJldHVybiBjO3RyeXtvLnVzZSYmby51c2UuY2FsbCh0aGlzLmNvbnRleHQsbyl9Y2F0Y2goZSl7cmV0dXJuIGUubWVzc2FnZT1lLm1lc3NhZ2V8fCJFcnJvciBkdXJpbmcgQHBsdWdpbiBjYWxsIixuZXcgTyhlLGksdSl9cmV0dXJuIG99LGUucHJvdG90eXBlLnRyeVNldE9wdGlvbnM9ZnVuY3Rpb24oZSx0LGksbil7aWYobiYmIWUuc2V0T3B0aW9ucylyZXR1cm4gbmV3IE8oe21lc3NhZ2U6Ik9wdGlvbnMgaGF2ZSBiZWVuIHByb3ZpZGVkIGJ1dCB0aGUgcGx1Z2luICIraSsiIGRvZXMgbm90IHN1cHBvcnQgYW55IG9wdGlvbnMuIn0pO3RyeXtlLnNldE9wdGlvbnMmJmUuc2V0T3B0aW9ucyhuKX1jYXRjaChlKXtyZXR1cm4gbmV3IE8oZSl9fSxlLnByb3RvdHlwZS52YWxpZGF0ZVBsdWdpbj1mdW5jdGlvbihlLHQsaSl7cmV0dXJuIGU/KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiYoZT1uZXcgZSksZS5taW5WZXJzaW9uJiZ0aGlzLmNvbXBhcmVWZXJzaW9uKGUubWluVmVyc2lvbix0aGlzLmxlc3MudmVyc2lvbik8MD9uZXcgTyh7bWVzc2FnZToiUGx1Z2luICIraSsiIHJlcXVpcmVzIHZlcnNpb24gIit0aGlzLnZlcnNpb25Ub1N0cmluZyhlLm1pblZlcnNpb24pfSk6ZSk6bnVsbH0sZS5wcm90b3R5cGUuY29tcGFyZVZlcnNpb249ZnVuY3Rpb24oZSx0KXsic3RyaW5nIj09dHlwZW9mIGUmJihlPWUubWF0Y2goL14oXGQrKVwuPyhcZCspP1wuPyhcZCspPy8pKS5zaGlmdCgpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKWlmKGVbaV0hPT10W2ldKXJldHVybiBwYXJzZUludChlW2ldKT5wYXJzZUludCh0W2ldKT8tMToxO3JldHVybiAwfSxlLnByb3RvdHlwZS52ZXJzaW9uVG9TdHJpbmc9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PSIiLGk9MDtpPGUubGVuZ3RoO2krKyl0Kz0odD8iLiI6IiIpK2VbaV07cmV0dXJuIHR9LGUucHJvdG90eXBlLnByaW50VXNhZ2U9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBpPWVbdF07aS5wcmludFVzYWdlJiZpLnByaW50VXNhZ2UoKX19LGV9KCksQWU9e3Zpc2l0RGVlcGVyOiEwfSxNZT0hMTtmdW5jdGlvbiBFZShlKXtyZXR1cm4gZX12YXIgUGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuX2ltcGxlbWVudGF0aW9uPWUsdGhpcy5fdmlzaXRJbkNhY2hlPXt9LHRoaXMuX3Zpc2l0T3V0Q2FjaGU9e30sTWV8fCghZnVuY3Rpb24gZSh0LGkpe3ZhciBuLHI7Zm9yKG4gaW4gdClzd2l0Y2godHlwZW9mKHI9dFtuXSkpe2Nhc2UiZnVuY3Rpb24iOnIucHJvdG90eXBlJiZyLnByb3RvdHlwZS50eXBlJiYoci5wcm90b3R5cGUudHlwZUluZGV4PWkrKyk7YnJlYWs7Y2FzZSJvYmplY3QiOmk9ZShyLGkpfXJldHVybiBpfShDZSwxKSxNZT0hMCl9cmV0dXJuIGUucHJvdG90eXBlLnZpc2l0PWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiBlO3ZhciB0PWUudHlwZUluZGV4O2lmKCF0KXJldHVybiBlLnZhbHVlJiZlLnZhbHVlLnR5cGVJbmRleCYmdGhpcy52aXNpdChlLnZhbHVlKSxlO3ZhciBpLG49dGhpcy5faW1wbGVtZW50YXRpb24scj10aGlzLl92aXNpdEluQ2FjaGVbdF0scz10aGlzLl92aXNpdE91dENhY2hlW3RdLG89QWU7aWYoby52aXNpdERlZXBlcj0hMCxyfHwocj1uW2k9InZpc2l0IitlLnR5cGVdfHxFZSxzPW5baSsiT3V0Il18fEVlLHRoaXMuX3Zpc2l0SW5DYWNoZVt0XT1yLHRoaXMuX3Zpc2l0T3V0Q2FjaGVbdF09cyksciE9PUVlKXt2YXIgYT1yLmNhbGwobixlLG8pO2UmJm4uaXNSZXBsYWNpbmcmJihlPWEpfWlmKG8udmlzaXREZWVwZXImJmUpaWYoZS5sZW5ndGgpZm9yKHZhciBsPTAsdT1lLmxlbmd0aDtsPHU7bCsrKWVbbF0uYWNjZXB0JiZlW2xdLmFjY2VwdCh0aGlzKTtlbHNlIGUuYWNjZXB0JiZlLmFjY2VwdCh0aGlzKTtyZXR1cm4gcyE9RWUmJnMuY2FsbChuLGUpLGV9LGUucHJvdG90eXBlLnZpc2l0QXJyYXk9ZnVuY3Rpb24oZSx0KXtpZighZSlyZXR1cm4gZTt2YXIgaSxuPWUubGVuZ3RoO2lmKHR8fCF0aGlzLl9pbXBsZW1lbnRhdGlvbi5pc1JlcGxhY2luZyl7Zm9yKGk9MDtpPG47aSsrKXRoaXMudmlzaXQoZVtpXSk7cmV0dXJuIGV9dmFyIHI9W107Zm9yKGk9MDtpPG47aSsrKXt2YXIgcz10aGlzLnZpc2l0KGVbaV0pO3ZvaWQgMCE9PXMmJihzLnNwbGljZT9zLmxlbmd0aCYmdGhpcy5mbGF0dGVuKHMscik6ci5wdXNoKHMpKX1yZXR1cm4gcn0sZS5wcm90b3R5cGUuZmxhdHRlbj1mdW5jdGlvbihlLHQpe3ZhciBpLG4scixzLG8sYTtmb3IodHx8KHQ9W10pLG49MCxpPWUubGVuZ3RoO248aTtuKyspaWYodm9pZCAwIT09KHI9ZVtuXSkpaWYoci5zcGxpY2UpZm9yKG89MCxzPXIubGVuZ3RoO288cztvKyspdm9pZCAwIT09KGE9cltvXSkmJihhLnNwbGljZT9hLmxlbmd0aCYmdGhpcy5mbGF0dGVuKGEsdCk6dC5wdXNoKGEpKTtlbHNlIHQucHVzaChyKTtyZXR1cm4gdH0sZX0oKSxSZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5pbXBvcnRzPVtdLHRoaXMudmFyaWFibGVJbXBvcnRzPVtdLHRoaXMuX29uU2VxdWVuY2VyRW1wdHk9ZSx0aGlzLl9jdXJyZW50RGVwdGg9MH1yZXR1cm4gZS5wcm90b3R5cGUuYWRkSW1wb3J0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsaT17Y2FsbGJhY2s6ZSxhcmdzOm51bGwsaXNSZWFkeTohMX07cmV0dXJuIHRoaXMuaW1wb3J0cy5wdXNoKGkpLGZ1bmN0aW9uKCl7aS5hcmdzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxpLmlzUmVhZHk9ITAsdC50cnlSdW4oKX19LGUucHJvdG90eXBlLmFkZFZhcmlhYmxlSW1wb3J0PWZ1bmN0aW9uKGUpe3RoaXMudmFyaWFibGVJbXBvcnRzLnB1c2goZSl9LGUucHJvdG90eXBlLnRyeVJ1bj1mdW5jdGlvbigpe3RoaXMuX2N1cnJlbnREZXB0aCsrO3RyeXtmb3IoOzspe2Zvcig7dGhpcy5pbXBvcnRzLmxlbmd0aD4wOyl7dmFyIGU9dGhpcy5pbXBvcnRzWzBdO2lmKCFlLmlzUmVhZHkpcmV0dXJuO3RoaXMuaW1wb3J0cz10aGlzLmltcG9ydHMuc2xpY2UoMSksZS5jYWxsYmFjay5hcHBseShudWxsLGUuYXJncyl9aWYoMD09PXRoaXMudmFyaWFibGVJbXBvcnRzLmxlbmd0aClicmVhazt2YXIgdD10aGlzLnZhcmlhYmxlSW1wb3J0c1swXTt0aGlzLnZhcmlhYmxlSW1wb3J0cz10aGlzLnZhcmlhYmxlSW1wb3J0cy5zbGljZSgxKSx0KCl9fWZpbmFsbHl7dGhpcy5fY3VycmVudERlcHRoLS19MD09PXRoaXMuX2N1cnJlbnREZXB0aCYmdGhpcy5fb25TZXF1ZW5jZXJFbXB0eSYmdGhpcy5fb25TZXF1ZW5jZXJFbXB0eSgpfSxlfSgpLE9lPWZ1bmN0aW9uKGUsdCl7dGhpcy5fdmlzaXRvcj1uZXcgUGUodGhpcyksdGhpcy5faW1wb3J0ZXI9ZSx0aGlzLl9maW5pc2g9dCx0aGlzLmNvbnRleHQ9bmV3IHEuRXZhbCx0aGlzLmltcG9ydENvdW50PTAsdGhpcy5vbmNlRmlsZURldGVjdGlvbk1hcD17fSx0aGlzLnJlY3Vyc2lvbkRldGVjdG9yPXt9LHRoaXMuX3NlcXVlbmNlcj1uZXcgUmUodGhpcy5fb25TZXF1ZW5jZXJFbXB0eS5iaW5kKHRoaXMpKX07T2UucHJvdG90eXBlPXtpc1JlcGxhY2luZzohMSxydW46ZnVuY3Rpb24oZSl7dHJ5e3RoaXMuX3Zpc2l0b3IudmlzaXQoZSl9Y2F0Y2goZSl7dGhpcy5lcnJvcj1lfXRoaXMuaXNGaW5pc2hlZD0hMCx0aGlzLl9zZXF1ZW5jZXIudHJ5UnVuKCl9LF9vblNlcXVlbmNlckVtcHR5OmZ1bmN0aW9uKCl7dGhpcy5pc0ZpbmlzaGVkJiZ0aGlzLl9maW5pc2godGhpcy5lcnJvcil9LHZpc2l0SW1wb3J0OmZ1bmN0aW9uKGUsdCl7dmFyIGk9ZS5vcHRpb25zLmlubGluZTtpZighZS5jc3N8fGkpe3ZhciBuPW5ldyBxLkV2YWwodGhpcy5jb250ZXh0LGsodGhpcy5jb250ZXh0LmZyYW1lcykpLHI9bi5mcmFtZXNbMF07dGhpcy5pbXBvcnRDb3VudCsrLGUuaXNWYXJpYWJsZUltcG9ydCgpP3RoaXMuX3NlcXVlbmNlci5hZGRWYXJpYWJsZUltcG9ydCh0aGlzLnByb2Nlc3NJbXBvcnROb2RlLmJpbmQodGhpcyxlLG4scikpOnRoaXMucHJvY2Vzc0ltcG9ydE5vZGUoZSxuLHIpfXQudmlzaXREZWVwZXI9ITF9LHByb2Nlc3NJbXBvcnROb2RlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgbixyPWUub3B0aW9ucy5pbmxpbmU7dHJ5e249ZS5ldmFsRm9ySW1wb3J0KHQpfWNhdGNoKHQpe3QuZmlsZW5hbWV8fCh0LmluZGV4PWUuZ2V0SW5kZXgoKSx0LmZpbGVuYW1lPWUuZmlsZUluZm8oKS5maWxlbmFtZSksZS5jc3M9ITAsZS5lcnJvcj10fWlmKCFufHxuLmNzcyYmIXIpdGhpcy5pbXBvcnRDb3VudC0tLHRoaXMuaXNGaW5pc2hlZCYmdGhpcy5fc2VxdWVuY2VyLnRyeVJ1bigpO2Vsc2V7bi5vcHRpb25zLm11bHRpcGxlJiYodC5pbXBvcnRNdWx0aXBsZT0hMCk7Zm9yKHZhciBzPXZvaWQgMD09PW4uY3NzLG89MDtvPGkucnVsZXMubGVuZ3RoO28rKylpZihpLnJ1bGVzW29dPT09ZSl7aS5ydWxlc1tvXT1uO2JyZWFrfXZhciBhPXRoaXMub25JbXBvcnRlZC5iaW5kKHRoaXMsbix0KSxsPXRoaXMuX3NlcXVlbmNlci5hZGRJbXBvcnQoYSk7dGhpcy5faW1wb3J0ZXIucHVzaChuLmdldFBhdGgoKSxzLG4uZmlsZUluZm8oKSxuLm9wdGlvbnMsbCl9fSxvbkltcG9ydGVkOmZ1bmN0aW9uKGUsdCxpLG4scixzKXtpJiYoaS5maWxlbmFtZXx8KGkuaW5kZXg9ZS5nZXRJbmRleCgpLGkuZmlsZW5hbWU9ZS5maWxlSW5mbygpLmZpbGVuYW1lKSx0aGlzLmVycm9yPWkpO3ZhciBvPXRoaXMsYT1lLm9wdGlvbnMuaW5saW5lLGw9ZS5vcHRpb25zLmlzUGx1Z2luLHU9ZS5vcHRpb25zLm9wdGlvbmFsLGM9cnx8cyBpbiBvLnJlY3Vyc2lvbkRldGVjdG9yO2lmKHQuaW1wb3J0TXVsdGlwbGV8fChlLnNraXA9ISFjfHxmdW5jdGlvbigpe3JldHVybiBzIGluIG8ub25jZUZpbGVEZXRlY3Rpb25NYXB8fChvLm9uY2VGaWxlRGV0ZWN0aW9uTWFwW3NdPSEwLCExKX0pLCFzJiZ1JiYoZS5za2lwPSEwKSxuJiYoZS5yb290PW4sZS5pbXBvcnRlZEZpbGVuYW1lPXMsIWEmJiFsJiYodC5pbXBvcnRNdWx0aXBsZXx8IWMpKSl7by5yZWN1cnNpb25EZXRlY3RvcltzXT0hMDt2YXIgaD10aGlzLmNvbnRleHQ7dGhpcy5jb250ZXh0PXQ7dHJ5e3RoaXMuX3Zpc2l0b3IudmlzaXQobil9Y2F0Y2goaSl7dGhpcy5lcnJvcj1pfXRoaXMuY29udGV4dD1ofW8uaW1wb3J0Q291bnQtLSxvLmlzRmluaXNoZWQmJm8uX3NlcXVlbmNlci50cnlSdW4oKX0sdmlzaXREZWNsYXJhdGlvbjpmdW5jdGlvbihlLHQpeyJEZXRhY2hlZFJ1bGVzZXQiPT09ZS52YWx1ZS50eXBlP3RoaXMuY29udGV4dC5mcmFtZXMudW5zaGlmdChlKTp0LnZpc2l0RGVlcGVyPSExfSx2aXNpdERlY2xhcmF0aW9uT3V0OmZ1bmN0aW9uKGUpeyJEZXRhY2hlZFJ1bGVzZXQiPT09ZS52YWx1ZS50eXBlJiZ0aGlzLmNvbnRleHQuZnJhbWVzLnNoaWZ0KCl9LHZpc2l0QXRSdWxlOmZ1bmN0aW9uKGUsdCl7dGhpcy5jb250ZXh0LmZyYW1lcy51bnNoaWZ0KGUpfSx2aXNpdEF0UnVsZU91dDpmdW5jdGlvbihlKXt0aGlzLmNvbnRleHQuZnJhbWVzLnNoaWZ0KCl9LHZpc2l0TWl4aW5EZWZpbml0aW9uOmZ1bmN0aW9uKGUsdCl7dGhpcy5jb250ZXh0LmZyYW1lcy51bnNoaWZ0KGUpfSx2aXNpdE1peGluRGVmaW5pdGlvbk91dDpmdW5jdGlvbihlKXt0aGlzLmNvbnRleHQuZnJhbWVzLnNoaWZ0KCl9LHZpc2l0UnVsZXNldDpmdW5jdGlvbihlLHQpe3RoaXMuY29udGV4dC5mcmFtZXMudW5zaGlmdChlKX0sdmlzaXRSdWxlc2V0T3V0OmZ1bmN0aW9uKGUpe3RoaXMuY29udGV4dC5mcmFtZXMuc2hpZnQoKX0sdmlzaXRNZWRpYTpmdW5jdGlvbihlLHQpe3RoaXMuY29udGV4dC5mcmFtZXMudW5zaGlmdChlLnJ1bGVzWzBdKX0sdmlzaXRNZWRpYU91dDpmdW5jdGlvbihlKXt0aGlzLmNvbnRleHQuZnJhbWVzLnNoaWZ0KCl9fTt2YXIgVmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMudmlzaWJsZT1lfXJldHVybiBlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oZSl7dGhpcy52aXNpdChlKX0sZS5wcm90b3R5cGUudmlzaXRBcnJheT1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4gZTt2YXIgdCxpPWUubGVuZ3RoO2Zvcih0PTA7dDxpO3QrKyl0aGlzLnZpc2l0KGVbdF0pO3JldHVybiBlfSxlLnByb3RvdHlwZS52aXNpdD1mdW5jdGlvbihlKXtyZXR1cm4gZT9lLmNvbnN0cnVjdG9yPT09QXJyYXk/dGhpcy52aXNpdEFycmF5KGUpOighZS5ibG9ja3NWaXNpYmlsaXR5fHxlLmJsb2Nrc1Zpc2liaWxpdHkoKXx8KHRoaXMudmlzaWJsZT9lLmVuc3VyZVZpc2liaWxpdHkoKTplLmVuc3VyZUludmlzaWJpbGl0eSgpLGUuYWNjZXB0KHRoaXMpKSxlKTplfSxlfSgpLEZlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuX3Zpc2l0b3I9bmV3IFBlKHRoaXMpLHRoaXMuY29udGV4dHM9W10sdGhpcy5hbGxFeHRlbmRzU3RhY2s9W1tdXX1yZXR1cm4gZS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKGUpe3JldHVybihlPXRoaXMuX3Zpc2l0b3IudmlzaXQoZSkpLmFsbEV4dGVuZHM9dGhpcy5hbGxFeHRlbmRzU3RhY2tbMF0sZX0sZS5wcm90b3R5cGUudmlzaXREZWNsYXJhdGlvbj1mdW5jdGlvbihlLHQpe3QudmlzaXREZWVwZXI9ITF9LGUucHJvdG90eXBlLnZpc2l0TWl4aW5EZWZpbml0aW9uPWZ1bmN0aW9uKGUsdCl7dC52aXNpdERlZXBlcj0hMX0sZS5wcm90b3R5cGUudmlzaXRSdWxlc2V0PWZ1bmN0aW9uKGUsdCl7aWYoIWUucm9vdCl7dmFyIGksbixyLHMsbz1bXSxhPWUucnVsZXMsbD1hP2EubGVuZ3RoOjA7Zm9yKGk9MDtpPGw7aSsrKWUucnVsZXNbaV1pbnN0YW5jZW9mIENlLkV4dGVuZCYmKG8ucHVzaChhW2ldKSxlLmV4dGVuZE9uRXZlcnlQYXRoPSEwKTt2YXIgdT1lLnBhdGhzO2ZvcihpPTA7aTx1Lmxlbmd0aDtpKyspe3ZhciBjPXVbaV0saD1jW2MubGVuZ3RoLTFdLmV4dGVuZExpc3Q7Zm9yKChzPWg/ayhoKS5jb25jYXQobyk6bykmJihzPXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5jbG9uZSgpfSkpKSxuPTA7bjxzLmxlbmd0aDtuKyspdGhpcy5mb3VuZEV4dGVuZHM9ITAsKHI9c1tuXSkuZmluZFNlbGZTZWxlY3RvcnMoYyksci5ydWxlc2V0PWUsMD09PW4mJihyLmZpcnN0RXh0ZW5kT25UaGlzU2VsZWN0b3JQYXRoPSEwKSx0aGlzLmFsbEV4dGVuZHNTdGFja1t0aGlzLmFsbEV4dGVuZHNTdGFjay5sZW5ndGgtMV0ucHVzaChyKX10aGlzLmNvbnRleHRzLnB1c2goZS5zZWxlY3RvcnMpfX0sZS5wcm90b3R5cGUudmlzaXRSdWxlc2V0T3V0PWZ1bmN0aW9uKGUpe2Uucm9vdHx8KHRoaXMuY29udGV4dHMubGVuZ3RoPXRoaXMuY29udGV4dHMubGVuZ3RoLTEpfSxlLnByb3RvdHlwZS52aXNpdE1lZGlhPWZ1bmN0aW9uKGUsdCl7ZS5hbGxFeHRlbmRzPVtdLHRoaXMuYWxsRXh0ZW5kc1N0YWNrLnB1c2goZS5hbGxFeHRlbmRzKX0sZS5wcm90b3R5cGUudmlzaXRNZWRpYU91dD1mdW5jdGlvbihlKXt0aGlzLmFsbEV4dGVuZHNTdGFjay5sZW5ndGg9dGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoLTF9LGUucHJvdG90eXBlLnZpc2l0QXRSdWxlPWZ1bmN0aW9uKGUsdCl7ZS5hbGxFeHRlbmRzPVtdLHRoaXMuYWxsRXh0ZW5kc1N0YWNrLnB1c2goZS5hbGxFeHRlbmRzKX0sZS5wcm90b3R5cGUudmlzaXRBdFJ1bGVPdXQ9ZnVuY3Rpb24oZSl7dGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoPXRoaXMuYWxsRXh0ZW5kc1N0YWNrLmxlbmd0aC0xfSxlfSgpLCRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuX3Zpc2l0b3I9bmV3IFBlKHRoaXMpfXJldHVybiBlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEZlO2lmKHRoaXMuZXh0ZW5kSW5kaWNlcz17fSx0LnJ1bihlKSwhdC5mb3VuZEV4dGVuZHMpcmV0dXJuIGU7ZS5hbGxFeHRlbmRzPWUuYWxsRXh0ZW5kcy5jb25jYXQodGhpcy5kb0V4dGVuZENoYWluaW5nKGUuYWxsRXh0ZW5kcyxlLmFsbEV4dGVuZHMpKSx0aGlzLmFsbEV4dGVuZHNTdGFjaz1bZS5hbGxFeHRlbmRzXTt2YXIgaT10aGlzLl92aXNpdG9yLnZpc2l0KGUpO3JldHVybiB0aGlzLmNoZWNrRXh0ZW5kc0Zvck5vbk1hdGNoZWQoZS5hbGxFeHRlbmRzKSxpfSxlLnByb3RvdHlwZS5jaGVja0V4dGVuZHNGb3JOb25NYXRjaGVkPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZXh0ZW5kSW5kaWNlcztlLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIWUuaGFzRm91bmRNYXRjaGVzJiYxPT1lLnBhcmVudF9pZHMubGVuZ3RofSkpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBpPSJfdW5rbm93bl8iO3RyeXtpPWUuc2VsZWN0b3IudG9DU1Moe30pfWNhdGNoKGUpe310W2UuaW5kZXgrIiAiK2ldfHwodFtlLmluZGV4KyIgIitpXT0hMCxyLndhcm4oImV4dGVuZCAnIitpKyInIGhhcyBubyBtYXRjaGVzIikpfSkpfSxlLnByb3RvdHlwZS5kb0V4dGVuZENoYWluaW5nPWZ1bmN0aW9uKGUsdCxpKXt2YXIgbixyLHMsbyxhLGwsdSxjLGg9W10sZj10aGlzO2ZvcihpPWl8fDAsbj0wO248ZS5sZW5ndGg7bisrKWZvcihyPTA7cjx0Lmxlbmd0aDtyKyspbD1lW25dLHU9dFtyXSxsLnBhcmVudF9pZHMuaW5kZXhPZih1Lm9iamVjdF9pZCk+PTB8fChhPVt1LnNlbGZTZWxlY3RvcnNbMF1dLChzPWYuZmluZE1hdGNoKGwsYSkpLmxlbmd0aCYmKGwuaGFzRm91bmRNYXRjaGVzPSEwLGwuc2VsZlNlbGVjdG9ycy5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD11LnZpc2liaWxpdHlJbmZvKCk7bz1mLmV4dGVuZFNlbGVjdG9yKHMsYSxlLGwuaXNWaXNpYmxlKCkpLChjPW5ldyBDZS5FeHRlbmQodS5zZWxlY3Rvcix1Lm9wdGlvbiwwLHUuZmlsZUluZm8oKSx0KSkuc2VsZlNlbGVjdG9ycz1vLG9bby5sZW5ndGgtMV0uZXh0ZW5kTGlzdD1bY10saC5wdXNoKGMpLGMucnVsZXNldD11LnJ1bGVzZXQsYy5wYXJlbnRfaWRzPWMucGFyZW50X2lkcy5jb25jYXQodS5wYXJlbnRfaWRzLGwucGFyZW50X2lkcyksdS5maXJzdEV4dGVuZE9uVGhpc1NlbGVjdG9yUGF0aCYmKGMuZmlyc3RFeHRlbmRPblRoaXNTZWxlY3RvclBhdGg9ITAsdS5ydWxlc2V0LnBhdGhzLnB1c2gobykpfSkpKSk7aWYoaC5sZW5ndGgpe2lmKHRoaXMuZXh0ZW5kQ2hhaW5Db3VudCsrLGk+MTAwKXt2YXIgcD0ie3VuYWJsZSB0byBjYWxjdWxhdGV9Iix2PSJ7dW5hYmxlIHRvIGNhbGN1bGF0ZX0iO3RyeXtwPWhbMF0uc2VsZlNlbGVjdG9yc1swXS50b0NTUygpLHY9aFswXS5zZWxlY3Rvci50b0NTUygpfWNhdGNoKGUpe310aHJvd3ttZXNzYWdlOiJleHRlbmQgY2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkLiBPbmUgb2YgdGhlIGNpcmN1bGFyIGV4dGVuZHMgaXMgY3VycmVudGx5OiIrcCsiOmV4dGVuZCgiK3YrIikifX1yZXR1cm4gaC5jb25jYXQoZi5kb0V4dGVuZENoYWluaW5nKGgsdCxpKzEpKX1yZXR1cm4gaH0sZS5wcm90b3R5cGUudmlzaXREZWNsYXJhdGlvbj1mdW5jdGlvbihlLHQpe3QudmlzaXREZWVwZXI9ITF9LGUucHJvdG90eXBlLnZpc2l0TWl4aW5EZWZpbml0aW9uPWZ1bmN0aW9uKGUsdCl7dC52aXNpdERlZXBlcj0hMX0sZS5wcm90b3R5cGUudmlzaXRTZWxlY3Rvcj1mdW5jdGlvbihlLHQpe3QudmlzaXREZWVwZXI9ITF9LGUucHJvdG90eXBlLnZpc2l0UnVsZXNldD1mdW5jdGlvbihlLHQpe2lmKCFlLnJvb3Qpe3ZhciBpLG4scixzLG89dGhpcy5hbGxFeHRlbmRzU3RhY2tbdGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoLTFdLGE9W10sbD10aGlzO2ZvcihyPTA7cjxvLmxlbmd0aDtyKyspZm9yKG49MDtuPGUucGF0aHMubGVuZ3RoO24rKylpZihzPWUucGF0aHNbbl0sIWUuZXh0ZW5kT25FdmVyeVBhdGgpe3ZhciB1PXNbcy5sZW5ndGgtMV0uZXh0ZW5kTGlzdDt1JiZ1Lmxlbmd0aHx8KGk9dGhpcy5maW5kTWF0Y2gob1tyXSxzKSkubGVuZ3RoJiYob1tyXS5oYXNGb3VuZE1hdGNoZXM9ITAsb1tyXS5zZWxmU2VsZWN0b3JzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0O3Q9bC5leHRlbmRTZWxlY3RvcihpLHMsZSxvW3JdLmlzVmlzaWJsZSgpKSxhLnB1c2godCl9KSkpfWUucGF0aHM9ZS5wYXRocy5jb25jYXQoYSl9fSxlLnByb3RvdHlwZS5maW5kTWF0Y2g9ZnVuY3Rpb24oZSx0KXt2YXIgaSxuLHIscyxvLGEsbCx1PWUuc2VsZWN0b3IuZWxlbWVudHMsYz1bXSxoPVtdO2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspZm9yKG49dFtpXSxyPTA7cjxuLmVsZW1lbnRzLmxlbmd0aDtyKyspZm9yKHM9bi5lbGVtZW50c1tyXSwoZS5hbGxvd0JlZm9yZXx8MD09PWkmJjA9PT1yKSYmYy5wdXNoKHtwYXRoSW5kZXg6aSxpbmRleDpyLG1hdGNoZWQ6MCxpbml0aWFsQ29tYmluYXRvcjpzLmNvbWJpbmF0b3J9KSxhPTA7YTxjLmxlbmd0aDthKyspbD1jW2FdLCIiPT09KG89cy5jb21iaW5hdG9yLnZhbHVlKSYmMD09PXImJihvPSIgIiksIXRoaXMuaXNFbGVtZW50VmFsdWVzRXF1YWwodVtsLm1hdGNoZWRdLnZhbHVlLHMudmFsdWUpfHxsLm1hdGNoZWQ+MCYmdVtsLm1hdGNoZWRdLmNvbWJpbmF0b3IudmFsdWUhPT1vP2w9bnVsbDpsLm1hdGNoZWQrKyxsJiYobC5maW5pc2hlZD1sLm1hdGNoZWQ9PT11Lmxlbmd0aCxsLmZpbmlzaGVkJiYhZS5hbGxvd0FmdGVyJiYocisxPG4uZWxlbWVudHMubGVuZ3RofHxpKzE8dC5sZW5ndGgpJiYobD1udWxsKSksbD9sLmZpbmlzaGVkJiYobC5sZW5ndGg9dS5sZW5ndGgsbC5lbmRQYXRoSW5kZXg9aSxsLmVuZFBhdGhFbGVtZW50SW5kZXg9cisxLGMubGVuZ3RoPTAsaC5wdXNoKGwpKTooYy5zcGxpY2UoYSwxKSxhLS0pO3JldHVybiBofSxlLnByb3RvdHlwZS5pc0VsZW1lbnRWYWx1ZXNFcXVhbD1mdW5jdGlvbihlLHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZXx8InN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBlPT09dDtpZihlIGluc3RhbmNlb2YgQ2UuQXR0cmlidXRlKXJldHVybiBlLm9wPT09dC5vcCYmZS5rZXk9PT10LmtleSYmKGUudmFsdWUmJnQudmFsdWU/KGU9ZS52YWx1ZS52YWx1ZXx8ZS52YWx1ZSk9PT0odD10LnZhbHVlLnZhbHVlfHx0LnZhbHVlKTohZS52YWx1ZSYmIXQudmFsdWUpO2lmKGU9ZS52YWx1ZSx0PXQudmFsdWUsZSBpbnN0YW5jZW9mIENlLlNlbGVjdG9yKXtpZighKHQgaW5zdGFuY2VvZiBDZS5TZWxlY3Rvcil8fGUuZWxlbWVudHMubGVuZ3RoIT09dC5lbGVtZW50cy5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBpPTA7aTxlLmVsZW1lbnRzLmxlbmd0aDtpKyspe2lmKGUuZWxlbWVudHNbaV0uY29tYmluYXRvci52YWx1ZSE9PXQuZWxlbWVudHNbaV0uY29tYmluYXRvci52YWx1ZSYmKDAhPT1pfHwoZS5lbGVtZW50c1tpXS5jb21iaW5hdG9yLnZhbHVlfHwiICIpIT09KHQuZWxlbWVudHNbaV0uY29tYmluYXRvci52YWx1ZXx8IiAiKSkpcmV0dXJuITE7aWYoIXRoaXMuaXNFbGVtZW50VmFsdWVzRXF1YWwoZS5lbGVtZW50c1tpXS52YWx1ZSx0LmVsZW1lbnRzW2ldLnZhbHVlKSlyZXR1cm4hMX1yZXR1cm4hMH1yZXR1cm4hMX0sZS5wcm90b3R5cGUuZXh0ZW5kU2VsZWN0b3I9ZnVuY3Rpb24oZSx0LGksbil7dmFyIHIscyxvLGEsbCx1PTAsYz0wLGg9W107Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKylzPXRbKGE9ZVtyXSkucGF0aEluZGV4XSxvPW5ldyBDZS5FbGVtZW50KGEuaW5pdGlhbENvbWJpbmF0b3IsaS5lbGVtZW50c1swXS52YWx1ZSxpLmVsZW1lbnRzWzBdLmlzVmFyaWFibGUsaS5lbGVtZW50c1swXS5nZXRJbmRleCgpLGkuZWxlbWVudHNbMF0uZmlsZUluZm8oKSksYS5wYXRoSW5kZXg+dSYmYz4wJiYoaFtoLmxlbmd0aC0xXS5lbGVtZW50cz1oW2gubGVuZ3RoLTFdLmVsZW1lbnRzLmNvbmNhdCh0W3VdLmVsZW1lbnRzLnNsaWNlKGMpKSxjPTAsdSsrKSxsPXMuZWxlbWVudHMuc2xpY2UoYyxhLmluZGV4KS5jb25jYXQoW29dKS5jb25jYXQoaS5lbGVtZW50cy5zbGljZSgxKSksdT09PWEucGF0aEluZGV4JiZyPjA/aFtoLmxlbmd0aC0xXS5lbGVtZW50cz1oW2gubGVuZ3RoLTFdLmVsZW1lbnRzLmNvbmNhdChsKTooaD1oLmNvbmNhdCh0LnNsaWNlKHUsYS5wYXRoSW5kZXgpKSkucHVzaChuZXcgQ2UuU2VsZWN0b3IobCkpLHU9YS5lbmRQYXRoSW5kZXgsKGM9YS5lbmRQYXRoRWxlbWVudEluZGV4KT49dFt1XS5lbGVtZW50cy5sZW5ndGgmJihjPTAsdSsrKTtyZXR1cm4gdTx0Lmxlbmd0aCYmYz4wJiYoaFtoLmxlbmd0aC0xXS5lbGVtZW50cz1oW2gubGVuZ3RoLTFdLmVsZW1lbnRzLmNvbmNhdCh0W3VdLmVsZW1lbnRzLnNsaWNlKGMpKSx1KyspLGg9KGg9aC5jb25jYXQodC5zbGljZSh1LHQubGVuZ3RoKSkpLm1hcCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jcmVhdGVEZXJpdmVkKGUuZWxlbWVudHMpO3JldHVybiBuP3QuZW5zdXJlVmlzaWJpbGl0eSgpOnQuZW5zdXJlSW52aXNpYmlsaXR5KCksdH0pKX0sZS5wcm90b3R5cGUudmlzaXRNZWRpYT1mdW5jdGlvbihlLHQpe3ZhciBpPWUuYWxsRXh0ZW5kcy5jb25jYXQodGhpcy5hbGxFeHRlbmRzU3RhY2tbdGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoLTFdKTtpPWkuY29uY2F0KHRoaXMuZG9FeHRlbmRDaGFpbmluZyhpLGUuYWxsRXh0ZW5kcykpLHRoaXMuYWxsRXh0ZW5kc1N0YWNrLnB1c2goaSl9LGUucHJvdG90eXBlLnZpc2l0TWVkaWFPdXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoLTE7dGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoPXR9LGUucHJvdG90eXBlLnZpc2l0QXRSdWxlPWZ1bmN0aW9uKGUsdCl7dmFyIGk9ZS5hbGxFeHRlbmRzLmNvbmNhdCh0aGlzLmFsbEV4dGVuZHNTdGFja1t0aGlzLmFsbEV4dGVuZHNTdGFjay5sZW5ndGgtMV0pO2k9aS5jb25jYXQodGhpcy5kb0V4dGVuZENoYWluaW5nKGksZS5hbGxFeHRlbmRzKSksdGhpcy5hbGxFeHRlbmRzU3RhY2sucHVzaChpKX0sZS5wcm90b3R5cGUudmlzaXRBdFJ1bGVPdXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoLTE7dGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoPXR9LGV9KCksTGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5jb250ZXh0cz1bW11dLHRoaXMuX3Zpc2l0b3I9bmV3IFBlKHRoaXMpfXJldHVybiBlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3Zpc2l0b3IudmlzaXQoZSl9LGUucHJvdG90eXBlLnZpc2l0RGVjbGFyYXRpb249ZnVuY3Rpb24oZSx0KXt0LnZpc2l0RGVlcGVyPSExfSxlLnByb3RvdHlwZS52aXNpdE1peGluRGVmaW5pdGlvbj1mdW5jdGlvbihlLHQpe3QudmlzaXREZWVwZXI9ITF9LGUucHJvdG90eXBlLnZpc2l0UnVsZXNldD1mdW5jdGlvbihlLHQpe3ZhciBpLG49dGhpcy5jb250ZXh0c1t0aGlzLmNvbnRleHRzLmxlbmd0aC0xXSxyPVtdO3RoaXMuY29udGV4dHMucHVzaChyKSxlLnJvb3R8fCgoaT1lLnNlbGVjdG9ycykmJihpPWkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRJc091dHB1dCgpfSkpLGUuc2VsZWN0b3JzPWkubGVuZ3RoP2k6aT1udWxsLGkmJmUuam9pblNlbGVjdG9ycyhyLG4saSkpLGl8fChlLnJ1bGVzPW51bGwpLGUucGF0aHM9cil9LGUucHJvdG90eXBlLnZpc2l0UnVsZXNldE91dD1mdW5jdGlvbihlKXt0aGlzLmNvbnRleHRzLmxlbmd0aD10aGlzLmNvbnRleHRzLmxlbmd0aC0xfSxlLnByb3RvdHlwZS52aXNpdE1lZGlhPWZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5jb250ZXh0c1t0aGlzLmNvbnRleHRzLmxlbmd0aC0xXTtlLnJ1bGVzWzBdLnJvb3Q9MD09PWkubGVuZ3RofHxpWzBdLm11bHRpTWVkaWF9LGUucHJvdG90eXBlLnZpc2l0QXRSdWxlPWZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5jb250ZXh0c1t0aGlzLmNvbnRleHRzLmxlbmd0aC0xXTtlLnJ1bGVzJiZlLnJ1bGVzLmxlbmd0aCYmKGUucnVsZXNbMF0ucm9vdD1lLmlzUm9vdGVkfHwwPT09aS5sZW5ndGh8fG51bGwpfSxlfSgpLGplPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLl92aXNpdG9yPW5ldyBQZSh0aGlzKSx0aGlzLl9jb250ZXh0PWV9cmV0dXJuIGUucHJvdG90eXBlLmNvbnRhaW5zU2lsZW50Tm9uQmxvY2tlZENoaWxkPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFlKXJldHVybiExO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKWlmKCh0PWVbaV0pLmlzU2lsZW50JiZ0LmlzU2lsZW50KHRoaXMuX2NvbnRleHQpJiYhdC5ibG9ja3NWaXNpYmlsaXR5KCkpcmV0dXJuITA7cmV0dXJuITF9LGUucHJvdG90eXBlLmtlZXBPbmx5VmlzaWJsZUNoaWxkcz1mdW5jdGlvbihlKXtlJiZlLnJ1bGVzJiYoZS5ydWxlcz1lLnJ1bGVzLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNWaXNpYmxlKCl9KSkpfSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKGUpe3JldHVybiFlfHwhZS5ydWxlc3x8MD09PWUucnVsZXMubGVuZ3RofSxlLnByb3RvdHlwZS5oYXNWaXNpYmxlU2VsZWN0b3I9ZnVuY3Rpb24oZSl7cmV0dXJuISghZXx8IWUucGF0aHMpJiZlLnBhdGhzLmxlbmd0aD4wfSxlLnByb3RvdHlwZS5yZXNvbHZlVmlzaWJpbGl0eT1mdW5jdGlvbihlLHQpe2lmKCFlLmJsb2Nrc1Zpc2liaWxpdHkoKSl7aWYodGhpcy5pc0VtcHR5KGUpJiYhdGhpcy5jb250YWluc1NpbGVudE5vbkJsb2NrZWRDaGlsZCh0KSlyZXR1cm47cmV0dXJuIGV9dmFyIGk9ZS5ydWxlc1swXTtpZih0aGlzLmtlZXBPbmx5VmlzaWJsZUNoaWxkcyhpKSwhdGhpcy5pc0VtcHR5KGkpKXJldHVybiBlLmVuc3VyZVZpc2liaWxpdHkoKSxlLnJlbW92ZVZpc2liaWxpdHlCbG9jaygpLGV9LGUucHJvdG90eXBlLmlzVmlzaWJsZVJ1bGVzZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuISFlLmZpcnN0Um9vdHx8IXRoaXMuaXNFbXB0eShlKSYmISghZS5yb290JiYhdGhpcy5oYXNWaXNpYmxlU2VsZWN0b3IoZSkpfSxlfSgpLE5lPWZ1bmN0aW9uKGUpe3RoaXMuX3Zpc2l0b3I9bmV3IFBlKHRoaXMpLHRoaXMuX2NvbnRleHQ9ZSx0aGlzLnV0aWxzPW5ldyBqZShlKX07TmUucHJvdG90eXBlPXtpc1JlcGxhY2luZzohMCxydW46ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3Zpc2l0b3IudmlzaXQoZSl9LHZpc2l0RGVjbGFyYXRpb246ZnVuY3Rpb24oZSx0KXtpZighZS5ibG9ja3NWaXNpYmlsaXR5KCkmJiFlLnZhcmlhYmxlKXJldHVybiBlfSx2aXNpdE1peGluRGVmaW5pdGlvbjpmdW5jdGlvbihlLHQpe2UuZnJhbWVzPVtdfSx2aXNpdEV4dGVuZDpmdW5jdGlvbihlLHQpe30sdmlzaXRDb21tZW50OmZ1bmN0aW9uKGUsdCl7aWYoIWUuYmxvY2tzVmlzaWJpbGl0eSgpJiYhZS5pc1NpbGVudCh0aGlzLl9jb250ZXh0KSlyZXR1cm4gZX0sdmlzaXRNZWRpYTpmdW5jdGlvbihlLHQpe3ZhciBpPWUucnVsZXNbMF0ucnVsZXM7cmV0dXJuIGUuYWNjZXB0KHRoaXMuX3Zpc2l0b3IpLHQudmlzaXREZWVwZXI9ITEsdGhpcy51dGlscy5yZXNvbHZlVmlzaWJpbGl0eShlLGkpfSx2aXNpdEltcG9ydDpmdW5jdGlvbihlLHQpe2lmKCFlLmJsb2Nrc1Zpc2liaWxpdHkoKSlyZXR1cm4gZX0sdmlzaXRBdFJ1bGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5ydWxlcyYmZS5ydWxlcy5sZW5ndGg/dGhpcy52aXNpdEF0UnVsZVdpdGhCb2R5KGUsdCk6dGhpcy52aXNpdEF0UnVsZVdpdGhvdXRCb2R5KGUsdCl9LHZpc2l0QW5vbnltb3VzOmZ1bmN0aW9uKGUsdCl7aWYoIWUuYmxvY2tzVmlzaWJpbGl0eSgpKXJldHVybiBlLmFjY2VwdCh0aGlzLl92aXNpdG9yKSxlfSx2aXNpdEF0UnVsZVdpdGhCb2R5OmZ1bmN0aW9uKGUsdCl7dmFyIGk9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ydWxlcztyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ydWxlcztyZXR1cm4gMT09PXQubGVuZ3RoJiYoIXRbMF0ucGF0aHN8fDA9PT10WzBdLnBhdGhzLmxlbmd0aCl9KGUpP3RbMF0ucnVsZXM6dH0oZSk7cmV0dXJuIGUuYWNjZXB0KHRoaXMuX3Zpc2l0b3IpLHQudmlzaXREZWVwZXI9ITEsdGhpcy51dGlscy5pc0VtcHR5KGUpfHx0aGlzLl9tZXJnZVJ1bGVzKGUucnVsZXNbMF0ucnVsZXMpLHRoaXMudXRpbHMucmVzb2x2ZVZpc2liaWxpdHkoZSxpKX0sdmlzaXRBdFJ1bGVXaXRob3V0Qm9keTpmdW5jdGlvbihlLHQpe2lmKCFlLmJsb2Nrc1Zpc2liaWxpdHkoKSl7aWYoIkBjaGFyc2V0Ij09PWUubmFtZSl7aWYodGhpcy5jaGFyc2V0KXtpZihlLmRlYnVnSW5mbyl7dmFyIGk9bmV3IENlLkNvbW1lbnQoIi8qICIrZS50b0NTUyh0aGlzLl9jb250ZXh0KS5yZXBsYWNlKC9cbi9nLCIiKSsiICovXG4iKTtyZXR1cm4gaS5kZWJ1Z0luZm89ZS5kZWJ1Z0luZm8sdGhpcy5fdmlzaXRvci52aXNpdChpKX1yZXR1cm59dGhpcy5jaGFyc2V0PSEwfXJldHVybiBlfX0sY2hlY2tWYWxpZE5vZGVzOmZ1bmN0aW9uKGUsdCl7aWYoZSlmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49ZVtpXTtpZih0JiZuIGluc3RhbmNlb2YgQ2UuRGVjbGFyYXRpb24mJiFuLnZhcmlhYmxlKXRocm93e21lc3NhZ2U6IlByb3BlcnRpZXMgbXVzdCBiZSBpbnNpZGUgc2VsZWN0b3IgYmxvY2tzLiBUaGV5IGNhbm5vdCBiZSBpbiB0aGUgcm9vdCIsaW5kZXg6bi5nZXRJbmRleCgpLGZpbGVuYW1lOm4uZmlsZUluZm8oKSYmbi5maWxlSW5mbygpLmZpbGVuYW1lfTtpZihuIGluc3RhbmNlb2YgQ2UuQ2FsbCl0aHJvd3ttZXNzYWdlOiJGdW5jdGlvbiAnIituLm5hbWUrIicgZGlkIG5vdCByZXR1cm4gYSByb290IG5vZGUiLGluZGV4Om4uZ2V0SW5kZXgoKSxmaWxlbmFtZTpuLmZpbGVJbmZvKCkmJm4uZmlsZUluZm8oKS5maWxlbmFtZX07aWYobi50eXBlJiYhbi5hbGxvd1Jvb3QpdGhyb3d7bWVzc2FnZTpuLnR5cGUrIiBub2RlIHJldHVybmVkIGJ5IGEgZnVuY3Rpb24gaXMgbm90IHZhbGlkIGhlcmUiLGluZGV4Om4uZ2V0SW5kZXgoKSxmaWxlbmFtZTpuLmZpbGVJbmZvKCkmJm4uZmlsZUluZm8oKS5maWxlbmFtZX19fSx2aXNpdFJ1bGVzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgaSxuPVtdO2lmKHRoaXMuY2hlY2tWYWxpZE5vZGVzKGUucnVsZXMsZS5maXJzdFJvb3QpLGUucm9vdCllLmFjY2VwdCh0aGlzLl92aXNpdG9yKSx0LnZpc2l0RGVlcGVyPSExO2Vsc2V7dGhpcy5fY29tcGlsZVJ1bGVzZXRQYXRocyhlKTtmb3IodmFyIHI9ZS5ydWxlcyxzPXI/ci5sZW5ndGg6MCxvPTA7bzxzOykoaT1yW29dKSYmaS5ydWxlcz8obi5wdXNoKHRoaXMuX3Zpc2l0b3IudmlzaXQoaSkpLHIuc3BsaWNlKG8sMSkscy0tKTpvKys7cz4wP2UuYWNjZXB0KHRoaXMuX3Zpc2l0b3IpOmUucnVsZXM9bnVsbCx0LnZpc2l0RGVlcGVyPSExfXJldHVybiBlLnJ1bGVzJiYodGhpcy5fbWVyZ2VSdWxlcyhlLnJ1bGVzKSx0aGlzLl9yZW1vdmVEdXBsaWNhdGVSdWxlcyhlLnJ1bGVzKSksdGhpcy51dGlscy5pc1Zpc2libGVSdWxlc2V0KGUpJiYoZS5lbnN1cmVWaXNpYmlsaXR5KCksbi5zcGxpY2UoMCwwLGUpKSwxPT09bi5sZW5ndGg/blswXTpufSxfY29tcGlsZVJ1bGVzZXRQYXRoczpmdW5jdGlvbihlKXtlLnBhdGhzJiYoZS5wYXRocz1lLnBhdGhzLmZpbHRlcigoZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKCIgIj09PWVbMF0uZWxlbWVudHNbMF0uY29tYmluYXRvci52YWx1ZSYmKGVbMF0uZWxlbWVudHNbMF0uY29tYmluYXRvcj1uZXcgQ2UuQ29tYmluYXRvcigiIikpLHQ9MDt0PGUubGVuZ3RoO3QrKylpZihlW3RdLmlzVmlzaWJsZSgpJiZlW3RdLmdldElzT3V0cHV0KCkpcmV0dXJuITA7cmV0dXJuITF9KSkpfSxfcmVtb3ZlRHVwbGljYXRlUnVsZXM6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQsaSxuLHI9e307Zm9yKG49ZS5sZW5ndGgtMTtuPj0wO24tLSlpZigoaT1lW25dKWluc3RhbmNlb2YgQ2UuRGVjbGFyYXRpb24paWYocltpLm5hbWVdKXsodD1yW2kubmFtZV0paW5zdGFuY2VvZiBDZS5EZWNsYXJhdGlvbiYmKHQ9cltpLm5hbWVdPVtyW2kubmFtZV0udG9DU1ModGhpcy5fY29udGV4dCldKTt2YXIgcz1pLnRvQ1NTKHRoaXMuX2NvbnRleHQpOy0xIT09dC5pbmRleE9mKHMpP2Uuc3BsaWNlKG4sMSk6dC5wdXNoKHMpfWVsc2UgcltpLm5hbWVdPWl9fSxfbWVyZ2VSdWxlczpmdW5jdGlvbihlKXtpZihlKXtmb3IodmFyIHQ9e30saT1bXSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07aWYoci5tZXJnZSl7dmFyIHM9ci5uYW1lO3Rbc10/ZS5zcGxpY2Uobi0tLDEpOmkucHVzaCh0W3NdPVtdKSx0W3NdLnB1c2gocil9fWkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoZS5sZW5ndGg+MCl7dmFyIHQ9ZVswXSxpPVtdLG49W25ldyBDZS5FeHByZXNzaW9uKGkpXTtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyIrIj09PWUubWVyZ2UmJmkubGVuZ3RoPjAmJm4ucHVzaChuZXcgQ2UuRXhwcmVzc2lvbihpPVtdKSksaS5wdXNoKGUudmFsdWUpLHQuaW1wb3J0YW50PXQuaW1wb3J0YW50fHxlLmltcG9ydGFudH0pKSx0LnZhbHVlPW5ldyBDZS5WYWx1ZShuKX19KSl9fX07dmFyIERlPXtWaXNpdG9yOlBlLEltcG9ydFZpc2l0b3I6T2UsTWFya1Zpc2libGVTZWxlY3RvcnNWaXNpdG9yOlZlLEV4dGVuZFZpc2l0b3I6JGUsSm9pblNlbGVjdG9yVmlzaXRvcjpMZSxUb0NTU1Zpc2l0b3I6TmV9O3ZhciBCZT1mdW5jdGlvbigpe3ZhciBlLHQsaSxuLHIscyxvLGE9W10sbD17fTtmdW5jdGlvbiB1KGkpe2Zvcih2YXIgbixhLGMsaD1sLmksZj10LHA9bC5pLW8sdj1sLmkrcy5sZW5ndGgtcCxkPWwuaSs9aSxtPWU7bC5pPHY7bC5pKyspe2lmKG49bS5jaGFyQ29kZUF0KGwuaSksbC5hdXRvQ29tbWVudEFic29yYiYmNDc9PT1uKXtpZigiLyI9PT0oYT1tLmNoYXJBdChsLmkrMSkpKXtjPXtpbmRleDpsLmksaXNMaW5lQ29tbWVudDohMH07dmFyIGc9bS5pbmRleE9mKCJcbiIsbC5pKzIpO2c8MCYmKGc9diksbC5pPWcsYy50ZXh0PW0uc3Vic3RyKGMuaW5kZXgsbC5pLWMuaW5kZXgpLGwuY29tbWVudFN0b3JlLnB1c2goYyk7Y29udGludWV9aWYoIioiPT09YSl7dmFyIHk9bS5pbmRleE9mKCIqLyIsbC5pKzIpO2lmKHk+PTApe2M9e2luZGV4OmwuaSx0ZXh0Om0uc3Vic3RyKGwuaSx5KzItbC5pKSxpc0xpbmVDb21tZW50OiExfSxsLmkrPWMudGV4dC5sZW5ndGgtMSxsLmNvbW1lbnRTdG9yZS5wdXNoKGMpO2NvbnRpbnVlfX1icmVha31pZigzMiE9PW4mJjEwIT09biYmOSE9PW4mJjEzIT09bilicmVha31pZihzPXMuc2xpY2UoaStsLmktZCtwKSxvPWwuaSwhcy5sZW5ndGgpe2lmKHQ8ci5sZW5ndGgtMSlyZXR1cm4gcz1yWysrdF0sdSgwKSwhMDtsLmZpbmlzaGVkPSEwfXJldHVybiBoIT09bC5pfHxmIT09dH1yZXR1cm4gbC5zYXZlPWZ1bmN0aW9uKCl7bz1sLmksYS5wdXNoKHtjdXJyZW50OnMsaTpsLmksajp0fSl9LGwucmVzdG9yZT1mdW5jdGlvbihlKXsobC5pPml8fGwuaT09PWkmJmUmJiFuKSYmKGk9bC5pLG49ZSk7dmFyIHI9YS5wb3AoKTtzPXIuY3VycmVudCxvPWwuaT1yLmksdD1yLmp9LGwuZm9yZ2V0PWZ1bmN0aW9uKCl7YS5wb3AoKX0sbC5pc1doaXRlc3BhY2U9ZnVuY3Rpb24odCl7dmFyIGk9bC5pKyh0fHwwKSxuPWUuY2hhckNvZGVBdChpKTtyZXR1cm4gMzI9PT1ufHwxMz09PW58fDk9PT1ufHwxMD09PW59LGwuJHJlPWZ1bmN0aW9uKGUpe2wuaT5vJiYocz1zLnNsaWNlKGwuaS1vKSxvPWwuaSk7dmFyIHQ9ZS5leGVjKHMpO3JldHVybiB0Pyh1KHRbMF0ubGVuZ3RoKSwic3RyaW5nIj09dHlwZW9mIHQ/dDoxPT09dC5sZW5ndGg/dFswXTp0KTpudWxsfSxsLiRjaGFyPWZ1bmN0aW9uKHQpe3JldHVybiBlLmNoYXJBdChsLmkpIT09dD9udWxsOih1KDEpLHQpfSxsLiRzdHI9ZnVuY3Rpb24odCl7Zm9yKHZhciBpPXQubGVuZ3RoLG49MDtuPGk7bisrKWlmKGUuY2hhckF0KGwuaStuKSE9PXQuY2hhckF0KG4pKXJldHVybiBudWxsO3JldHVybiB1KGkpLHR9LGwuJHF1b3RlZD1mdW5jdGlvbih0KXt2YXIgaT10fHxsLmksbj1lLmNoYXJBdChpKTtpZigiJyI9PT1ufHwnIic9PT1uKXtmb3IodmFyIHI9ZS5sZW5ndGgscz1pLG89MTtvK3M8cjtvKyspe3N3aXRjaChlLmNoYXJBdChvK3MpKXtjYXNlIlxcIjpvKys7Y29udGludWU7Y2FzZSJcciI6Y2FzZSJcbiI6YnJlYWs7Y2FzZSBuOnZhciBhPWUuc3Vic3RyKHMsbysxKTtyZXR1cm4gdHx8MD09PXQ/W24sYV06KHUobysxKSxhKX19cmV0dXJuIG51bGx9fSxsLiRwYXJzZVVudGlsPWZ1bmN0aW9uKHQpe3ZhciBpLG49IiIscj1udWxsLHM9ITEsbz0wLGE9W10sYz1bXSxoPWUubGVuZ3RoLGY9bC5pLHA9bC5pLHY9bC5pLGQ9ITA7aT0ic3RyaW5nIj09dHlwZW9mIHQ/ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fTpmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KGUpfTtkb3t2YXIgbT1lLmNoYXJBdCh2KTtpZigwPT09byYmaShtKSkocj1lLnN1YnN0cihwLHYtcCkpP2MucHVzaChyKTpjLnB1c2goIiAiKSxyPWMsdSh2LWYpLGQ9ITE7ZWxzZXtpZihzKXsiKiI9PT1tJiYiLyI9PT1lLmNoYXJBdCh2KzEpJiYodisrLG8tLSxzPSExKSx2Kys7Y29udGludWV9c3dpdGNoKG0pe2Nhc2UiXFwiOnYrKyxtPWUuY2hhckF0KHYpLGMucHVzaChlLnN1YnN0cihwLHYtcCsxKSkscD12KzE7YnJlYWs7Y2FzZSIvIjoiKiI9PT1lLmNoYXJBdCh2KzEpJiYodisrLHM9ITAsbysrKTticmVhaztjYXNlIiciOmNhc2UnIic6KG49bC4kcXVvdGVkKHYpKT8oYy5wdXNoKGUuc3Vic3RyKHAsdi1wKSxuKSxwPSh2Kz1uWzFdLmxlbmd0aC0xKSsxKToodSh2LWYpLHI9bSxkPSExKTticmVhaztjYXNlInsiOmEucHVzaCgifSIpLG8rKzticmVhaztjYXNlIigiOmEucHVzaCgiKSIpLG8rKzticmVhaztjYXNlIlsiOmEucHVzaCgiXSIpLG8rKzticmVhaztjYXNlIn0iOmNhc2UiKSI6Y2FzZSJdIjp2YXIgZz1hLnBvcCgpO209PT1nP28tLToodSh2LWYpLHI9ZyxkPSExKX0rK3Y+aCYmKGQ9ITEpfX13aGlsZShkKTtyZXR1cm4gcnx8bnVsbH0sbC5hdXRvQ29tbWVudEFic29yYj0hMCxsLmNvbW1lbnRTdG9yZT1bXSxsLmZpbmlzaGVkPSExLGwucGVlaz1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKWlmKGUuY2hhckF0KGwuaStpKSE9PXQuY2hhckF0KGkpKXJldHVybiExO3JldHVybiEwfXJldHVybiB0LnRlc3Qocyl9LGwucGVla0NoYXI9ZnVuY3Rpb24odCl7cmV0dXJuIGUuY2hhckF0KGwuaSk9PT10fSxsLmN1cnJlbnRDaGFyPWZ1bmN0aW9uKCl7cmV0dXJuIGUuY2hhckF0KGwuaSl9LGwucHJldkNoYXI9ZnVuY3Rpb24oKXtyZXR1cm4gZS5jaGFyQXQobC5pLTEpfSxsLmdldElucHV0PWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGwucGVla05vdE51bWVyaWM9ZnVuY3Rpb24oKXt2YXIgdD1lLmNoYXJDb2RlQXQobC5pKTtyZXR1cm4gdD41N3x8dDw0M3x8NDc9PT10fHw0ND09PXR9LGwuc3RhcnQ9ZnVuY3Rpb24obixhLGMpe2U9bixsLmk9dD1vPWk9MCxyPWE/ZnVuY3Rpb24oZSx0KXt2YXIgaSxuLHIscyxvLGEsbCx1LGMsaD1lLmxlbmd0aCxmPTAscD0wLHY9W10sZD0wO2Z1bmN0aW9uIG0odCl7dmFyIGk9by1kO2k8NTEyJiYhdHx8IWl8fCh2LnB1c2goZS5zbGljZShkLG8rMSkpLGQ9bysxKX1mb3Iobz0wO288aDtvKyspaWYoISgobD1lLmNoYXJDb2RlQXQobykpPj05NyYmbDw9MTIyfHxsPDM0KSlzd2l0Y2gobCl7Y2FzZSA0MDpwKyssbj1vO2NvbnRpbnVlO2Nhc2UgNDE6aWYoLS1wPDApcmV0dXJuIHQoIm1pc3Npbmcgb3BlbmluZyBgKGAiLG8pO2NvbnRpbnVlO2Nhc2UgNTk6cHx8bSgpO2NvbnRpbnVlO2Nhc2UgMTIzOmYrKyxpPW87Y29udGludWU7Y2FzZSAxMjU6aWYoLS1mPDApcmV0dXJuIHQoIm1pc3Npbmcgb3BlbmluZyBge2AiLG8pO2Z8fHB8fG0oKTtjb250aW51ZTtjYXNlIDkyOmlmKG88aC0xKXtvKys7Y29udGludWV9cmV0dXJuIHQoInVuZXNjYXBlZCBgXFxgIixvKTtjYXNlIDM0OmNhc2UgMzk6Y2FzZSA5Njpmb3IoYz0wLGE9byxvKz0xO288aDtvKyspaWYoISgodT1lLmNoYXJDb2RlQXQobykpPjk2KSl7aWYodT09bCl7Yz0xO2JyZWFrfWlmKDkyPT11KXtpZihvPT1oLTEpcmV0dXJuIHQoInVuZXNjYXBlZCBgXFxgIixvKTtvKyt9fWlmKGMpY29udGludWU7cmV0dXJuIHQoInVubWF0Y2hlZCBgIitTdHJpbmcuZnJvbUNoYXJDb2RlKGwpKyJgIixhKTtjYXNlIDQ3OmlmKHB8fG89PWgtMSljb250aW51ZTtpZig0Nz09KHU9ZS5jaGFyQ29kZUF0KG8rMSkpKWZvcihvKz0yO288aCYmKCEoKHU9ZS5jaGFyQ29kZUF0KG8pKTw9MTMpfHwxMCE9dSYmMTMhPXUpO28rKyk7ZWxzZSBpZig0Mj09dSl7Zm9yKHI9YT1vLG8rPTI7bzxoLTEmJigxMjU9PSh1PWUuY2hhckNvZGVBdChvKSkmJihzPW8pLDQyIT11fHw0NyE9ZS5jaGFyQ29kZUF0KG8rMSkpO28rKyk7aWYobz09aC0xKXJldHVybiB0KCJtaXNzaW5nIGNsb3NpbmcgYCovYCIsYSk7bysrfWNvbnRpbnVlO2Nhc2UgNDI6aWYobzxoLTEmJjQ3PT1lLmNoYXJDb2RlQXQobysxKSlyZXR1cm4gdCgidW5tYXRjaGVkIGAvKmAiLG8pO2NvbnRpbnVlfXJldHVybiAwIT09Zj90KHI+aSYmcz5yPyJtaXNzaW5nIGNsb3NpbmcgYH1gIG9yIGAqL2AiOiJtaXNzaW5nIGNsb3NpbmcgYH1gIixpKTowIT09cD90KCJtaXNzaW5nIGNsb3NpbmcgYClgIixuKToobSghMCksdil9KG4sYyk6W25dLHM9clswXSx1KDApfSxsLmVuZD1mdW5jdGlvbigpe3ZhciB0LHI9bC5pPj1lLmxlbmd0aDtyZXR1cm4gbC5pPGkmJih0PW4sbC5pPWkpLHtpc0ZpbmlzaGVkOnIsZnVydGhlc3Q6bC5pLGZ1cnRoZXN0UG9zc2libGVFcnJvck1lc3NhZ2U6dCxmdXJ0aGVzdFJlYWNoZWRFbmQ6bC5pPj1lLmxlbmd0aC0xLGZ1cnRoZXN0Q2hhcjplW2wuaV19fSxsfSxVZT1mdW5jdGlvbiBlKHQsaSxuKXt2YXIgcixzPUJlKCk7ZnVuY3Rpb24gbyhlLHQpe3Rocm93IG5ldyBPKHtpbmRleDpzLmksZmlsZW5hbWU6bi5maWxlbmFtZSx0eXBlOnR8fCJTeW50YXgiLG1lc3NhZ2U6ZX0saSl9ZnVuY3Rpb24gYShlLHQpe3ZhciBpPWUgaW5zdGFuY2VvZiBGdW5jdGlvbj9lLmNhbGwocik6cy4kcmUoZSk7aWYoaSlyZXR1cm4gaTtvKHR8fCgic3RyaW5nIj09dHlwZW9mIGU/ImV4cGVjdGVkICciK2UrIicgZ290ICciK3MuY3VycmVudENoYXIoKSsiJyI6InVuZXhwZWN0ZWQgdG9rZW4iKSl9ZnVuY3Rpb24gbChlLHQpe2lmKHMuJGNoYXIoZSkpcmV0dXJuIGU7byh0fHwiZXhwZWN0ZWQgJyIrZSsiJyBnb3QgJyIrcy5jdXJyZW50Q2hhcigpKyInIil9ZnVuY3Rpb24gdShlKXt2YXIgdD1uLmZpbGVuYW1lO3JldHVybntsaW5lTnVtYmVyOkMoZSxzLmdldElucHV0KCkpLmxpbmUrMSxmaWxlTmFtZTp0fX1yZXR1cm57cGFyc2VySW5wdXQ6cyxpbXBvcnRzOmksZmlsZUluZm86bixwYXJzZU5vZGU6ZnVuY3Rpb24oZSx0LG4sbyxhKXt2YXIgbCx1PVtdLGM9czt0cnl7Yy5zdGFydChlLCExLChmdW5jdGlvbihlLHQpe2Eoe21lc3NhZ2U6ZSxpbmRleDp0K259KX0pKTtmb3IodmFyIGg9MCxmPXZvaWQgMCxwPXZvaWQgMDtmPXRbaF07aCsrKWlmKHA9Yy5pLGw9cltmXSgpKXt0cnl7bC5faW5kZXg9cCtuLGwuX2ZpbGVJbmZvPW99Y2F0Y2goZSl7fXUucHVzaChsKX1lbHNlIHUucHVzaChudWxsKTtjLmVuZCgpLmlzRmluaXNoZWQ/YShudWxsLHUpOmEoITAsbnVsbCl9Y2F0Y2goZSl7dGhyb3cgbmV3IE8oe2luZGV4OmUuaW5kZXgrbixtZXNzYWdlOmUubWVzc2FnZX0saSxvLmZpbGVuYW1lKX19LHBhcnNlOmZ1bmN0aW9uKHIsbyxhKXt2YXIgbCx1LGMsaCxmPW51bGwscD0iIjtpZih1PWEmJmEuZ2xvYmFsVmFycz9lLnNlcmlhbGl6ZVZhcnMoYS5nbG9iYWxWYXJzKSsiXG4iOiIiLGM9YSYmYS5tb2RpZnlWYXJzPyJcbiIrZS5zZXJpYWxpemVWYXJzKGEubW9kaWZ5VmFycyk6IiIsdC5wbHVnaW5NYW5hZ2VyKWZvcih2YXIgdj10LnBsdWdpbk1hbmFnZXIuZ2V0UHJlUHJvY2Vzc29ycygpLGQ9MDtkPHYubGVuZ3RoO2QrKylyPXZbZF0ucHJvY2VzcyhyLHtjb250ZXh0OnQsaW1wb3J0czppLGZpbGVJbmZvOm59KTsodXx8YSYmYS5iYW5uZXIpJiYocD0oYSYmYS5iYW5uZXI/YS5iYW5uZXI6IiIpK3UsKGg9aS5jb250ZW50c0lnbm9yZWRDaGFycylbbi5maWxlbmFtZV09aFtuLmZpbGVuYW1lXXx8MCxoW24uZmlsZW5hbWVdKz1wLmxlbmd0aCkscj1wKyhyPXIucmVwbGFjZSgvXHJcbj8vZywiXG4iKSkucmVwbGFjZSgvXlx1RkVGRi8sIiIpK2MsaS5jb250ZW50c1tuLmZpbGVuYW1lXT1yO3RyeXtzLnN0YXJ0KHIsdC5jaHVua0lucHV0LChmdW5jdGlvbihlLHQpe3Rocm93IG5ldyBPKHtpbmRleDp0LHR5cGU6IlBhcnNlIixtZXNzYWdlOmUsZmlsZW5hbWU6bi5maWxlbmFtZX0saSl9KSksQ2UuTm9kZS5wcm90b3R5cGUucGFyc2U9dGhpcyxsPW5ldyBDZS5SdWxlc2V0KG51bGwsdGhpcy5wYXJzZXJzLnByaW1hcnkoKSksQ2UuTm9kZS5wcm90b3R5cGUucm9vdE5vZGU9bCxsLnJvb3Q9ITAsbC5maXJzdFJvb3Q9ITAsbC5mdW5jdGlvblJlZ2lzdHJ5PUguaW5oZXJpdCgpfWNhdGNoKGUpe3JldHVybiBvKG5ldyBPKGUsaSxuLmZpbGVuYW1lKSl9dmFyIG09cy5lbmQoKTtpZighbS5pc0ZpbmlzaGVkKXt2YXIgZz1tLmZ1cnRoZXN0UG9zc2libGVFcnJvck1lc3NhZ2U7Z3x8KGc9IlVucmVjb2duaXNlZCBpbnB1dCIsIn0iPT09bS5mdXJ0aGVzdENoYXI/Zys9Ii4gUG9zc2libHkgbWlzc2luZyBvcGVuaW5nICd7JyI6IikiPT09bS5mdXJ0aGVzdENoYXI/Zys9Ii4gUG9zc2libHkgbWlzc2luZyBvcGVuaW5nICcoJyI6bS5mdXJ0aGVzdFJlYWNoZWRFbmQmJihnKz0iLiBQb3NzaWJseSBtaXNzaW5nIHNvbWV0aGluZyIpKSxmPW5ldyBPKHt0eXBlOiJQYXJzZSIsbWVzc2FnZTpnLGluZGV4Om0uZnVydGhlc3QsZmlsZW5hbWU6bi5maWxlbmFtZX0saSl9dmFyIHk9ZnVuY3Rpb24oZSl7cmV0dXJuKGU9Znx8ZXx8aS5lcnJvcik/KGUgaW5zdGFuY2VvZiBPfHwoZT1uZXcgTyhlLGksbi5maWxlbmFtZSkpLG8oZSkpOm8obnVsbCxsKX07aWYoITE9PT10LnByb2Nlc3NJbXBvcnRzKXJldHVybiB5KCk7bmV3IERlLkltcG9ydFZpc2l0b3IoaSx5KS5ydW4obCl9LHBhcnNlcnM6cj17cHJpbWFyeTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PXRoaXMubWl4aW4saT1bXTs7KXtmb3IoO2U9dGhpcy5jb21tZW50KCk7KWkucHVzaChlKTtpZihzLmZpbmlzaGVkKWJyZWFrO2lmKHMucGVlaygifSIpKWJyZWFrO2lmKGU9dGhpcy5leHRlbmRSdWxlKCkpaT1pLmNvbmNhdChlKTtlbHNlIGlmKGU9dC5kZWZpbml0aW9uKCl8fHRoaXMuZGVjbGFyYXRpb24oKXx8dC5jYWxsKCExLCExKXx8dGhpcy5ydWxlc2V0KCl8fHRoaXMudmFyaWFibGVDYWxsKCl8fHRoaXMuZW50aXRpZXMuY2FsbCgpfHx0aGlzLmF0cnVsZSgpKWkucHVzaChlKTtlbHNle2Zvcih2YXIgbj0hMTtzLiRjaGFyKCI7Iik7KW49ITA7aWYoIW4pYnJlYWt9fXJldHVybiBpfSxjb21tZW50OmZ1bmN0aW9uKCl7aWYocy5jb21tZW50U3RvcmUubGVuZ3RoKXt2YXIgZT1zLmNvbW1lbnRTdG9yZS5zaGlmdCgpO3JldHVybiBuZXcgQ2UuQ29tbWVudChlLnRleHQsZS5pc0xpbmVDb21tZW50LGUuaW5kZXgsbil9fSxlbnRpdGllczp7bWl4aW5Mb29rdXA6ZnVuY3Rpb24oKXtyZXR1cm4gci5taXhpbi5jYWxsKCEwLCEwKX0scXVvdGVkOmZ1bmN0aW9uKGUpe3ZhciB0LGk9cy5pLHI9ITE7aWYocy5zYXZlKCkscy4kY2hhcigifiIpKXI9ITA7ZWxzZSBpZihlKXJldHVybiB2b2lkIHMucmVzdG9yZSgpO2lmKHQ9cy4kcXVvdGVkKCkpcmV0dXJuIHMuZm9yZ2V0KCksbmV3IENlLlF1b3RlZCh0LmNoYXJBdCgwKSx0LnN1YnN0cigxLHQubGVuZ3RoLTIpLHIsaSxuKTtzLnJlc3RvcmUoKX0sa2V5d29yZDpmdW5jdGlvbigpe3ZhciBlPXMuJGNoYXIoIiUiKXx8cy4kcmUoL15cWz8oPzpbXHctXXxcXCg/OltBLUZhLWYwLTldezEsNn0gP3xbXkEtRmEtZjAtOV0pKStcXT8vKTtpZihlKXJldHVybiBDZS5Db2xvci5mcm9tS2V5d29yZChlKXx8bmV3IENlLktleXdvcmQoZSl9LGNhbGw6ZnVuY3Rpb24oKXt2YXIgZSx0LGkscj1zLmk7aWYoIXMucGVlaygvXnVybFwoL2kpKWlmKHMuc2F2ZSgpLGU9cy4kcmUoL14oW1x3LV0rfCV8fnxwcm9naWQ6W1x3XC5dKylcKC8pKXtpZihlPWVbMV0sKGk9dGhpcy5jdXN0b21GdW5jQ2FsbChlKSkmJih0PWkucGFyc2UoKSkmJmkuc3RvcClyZXR1cm4gcy5mb3JnZXQoKSx0O2lmKHQ9dGhpcy5hcmd1bWVudHModCkscy4kY2hhcigiKSIpKXJldHVybiBzLmZvcmdldCgpLG5ldyBDZS5DYWxsKGUsdCxyLG4pO3MucmVzdG9yZSgiQ291bGQgbm90IHBhcnNlIGNhbGwgYXJndW1lbnRzIG9yIG1pc3NpbmcgJyknIil9ZWxzZSBzLmZvcmdldCgpfSxjdXN0b21GdW5jQ2FsbDpmdW5jdGlvbihlKXtyZXR1cm57YWxwaGE6dChyLmllQWxwaGEsITApLGJvb2xlYW46dChpKSxpZjp0KGkpfVtlLnRvTG93ZXJDYXNlKCldO2Z1bmN0aW9uIHQoZSx0KXtyZXR1cm57cGFyc2U6ZSxzdG9wOnR9fWZ1bmN0aW9uIGkoKXtyZXR1cm5bYShyLmNvbmRpdGlvbiwiZXhwZWN0ZWQgY29uZGl0aW9uIildfX0sYXJndW1lbnRzOmZ1bmN0aW9uKGUpe3ZhciB0LGksbj1lfHxbXSxvPVtdO2ZvcihzLnNhdmUoKTs7KXtpZihlKWU9ITE7ZWxzZXtpZighKGk9ci5kZXRhY2hlZFJ1bGVzZXQoKXx8dGhpcy5hc3NpZ25tZW50KCl8fHIuZXhwcmVzc2lvbigpKSlicmVhaztpLnZhbHVlJiYxPT1pLnZhbHVlLmxlbmd0aCYmKGk9aS52YWx1ZVswXSksbi5wdXNoKGkpfXMuJGNoYXIoIiwiKXx8KHMuJGNoYXIoIjsiKXx8dCkmJih0PSEwLGk9bi5sZW5ndGg8MT9uWzBdOm5ldyBDZS5WYWx1ZShuKSxvLnB1c2goaSksbj1bXSl9cmV0dXJuIHMuZm9yZ2V0KCksdD9vOm59LGxpdGVyYWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaW1lbnNpb24oKXx8dGhpcy5jb2xvcigpfHx0aGlzLnF1b3RlZCgpfHx0aGlzLnVuaWNvZGVEZXNjcmlwdG9yKCl9LGFzc2lnbm1lbnQ6ZnVuY3Rpb24oKXt2YXIgZSx0O2lmKHMuc2F2ZSgpLGU9cy4kcmUoL15cdysoPz1ccz89KS9pKSlpZihzLiRjaGFyKCI9Iikpe2lmKHQ9ci5lbnRpdHkoKSlyZXR1cm4gcy5mb3JnZXQoKSxuZXcgQ2UuQXNzaWdubWVudChlLHQpO3MucmVzdG9yZSgpfWVsc2Ugcy5yZXN0b3JlKCk7ZWxzZSBzLnJlc3RvcmUoKX0sdXJsOmZ1bmN0aW9uKCl7dmFyIGUsdD1zLmk7aWYocy5hdXRvQ29tbWVudEFic29yYj0hMSxzLiRzdHIoInVybCgiKSlyZXR1cm4gZT10aGlzLnF1b3RlZCgpfHx0aGlzLnZhcmlhYmxlKCl8fHRoaXMucHJvcGVydHkoKXx8cy4kcmUoL14oPzooPzpcXFtcKFwpJyJdKXxbXlwoXCknIl0pKy8pfHwiIixzLmF1dG9Db21tZW50QWJzb3JiPSEwLGwoIikiKSxuZXcgQ2UuVVJMKG51bGwhPWUudmFsdWV8fGUgaW5zdGFuY2VvZiBDZS5WYXJpYWJsZXx8ZSBpbnN0YW5jZW9mIENlLlByb3BlcnR5P2U6bmV3IENlLkFub255bW91cyhlLHQpLHQsbik7cy5hdXRvQ29tbWVudEFic29yYj0hMH0sdmFyaWFibGU6ZnVuY3Rpb24oKXt2YXIgZSx0LGk9cy5pO2lmKHMuc2F2ZSgpLCJAIj09PXMuY3VycmVudENoYXIoKSYmKHQ9cy4kcmUoL15AQD9bXHctXSsvKSkpe2lmKCIoIj09PShlPXMuY3VycmVudENoYXIoKSl8fCJbIj09PWUmJiFzLnByZXZDaGFyKCkubWF0Y2goL15ccy8pKXt2YXIgbz1yLnZhcmlhYmxlQ2FsbCh0KTtpZihvKXJldHVybiBzLmZvcmdldCgpLG99cmV0dXJuIHMuZm9yZ2V0KCksbmV3IENlLlZhcmlhYmxlKHQsaSxuKX1zLnJlc3RvcmUoKX0sdmFyaWFibGVDdXJseTpmdW5jdGlvbigpe3ZhciBlLHQ9cy5pO2lmKCJAIj09PXMuY3VycmVudENoYXIoKSYmKGU9cy4kcmUoL15AXHsoW1x3LV0rKVx9LykpKXJldHVybiBuZXcgQ2UuVmFyaWFibGUoIkAiK2VbMV0sdCxuKX0scHJvcGVydHk6ZnVuY3Rpb24oKXt2YXIgZSx0PXMuaTtpZigiJCI9PT1zLmN1cnJlbnRDaGFyKCkmJihlPXMuJHJlKC9eXCRbXHctXSsvKSkpcmV0dXJuIG5ldyBDZS5Qcm9wZXJ0eShlLHQsbil9LHByb3BlcnR5Q3VybHk6ZnVuY3Rpb24oKXt2YXIgZSx0PXMuaTtpZigiJCI9PT1zLmN1cnJlbnRDaGFyKCkmJihlPXMuJHJlKC9eXCRceyhbXHctXSspXH0vKSkpcmV0dXJuIG5ldyBDZS5Qcm9wZXJ0eSgiJCIrZVsxXSx0LG4pfSxjb2xvcjpmdW5jdGlvbigpe3ZhciBlO2lmKHMuc2F2ZSgpLCIjIj09PXMuY3VycmVudENoYXIoKSYmKGU9cy4kcmUoL14jKFtBLUZhLWYwLTldezh9fFtBLUZhLWYwLTldezZ9fFtBLUZhLWYwLTldezMsNH0pKFtcdy4jXFtdKT8vKSkmJiFlWzJdKXJldHVybiBzLmZvcmdldCgpLG5ldyBDZS5Db2xvcihlWzFdLHZvaWQgMCxlWzBdKTtzLnJlc3RvcmUoKX0sY29sb3JLZXl3b3JkOmZ1bmN0aW9uKCl7cy5zYXZlKCk7dmFyIGU9cy5hdXRvQ29tbWVudEFic29yYjtzLmF1dG9Db21tZW50QWJzb3JiPSExO3ZhciB0PXMuJHJlKC9eW19BLVphLXotXVtfQS1aYS16MC05LV0rLyk7aWYocy5hdXRvQ29tbWVudEFic29yYj1lLHQpe3MucmVzdG9yZSgpO3ZhciBpPUNlLkNvbG9yLmZyb21LZXl3b3JkKHQpO3JldHVybiBpPyhzLiRzdHIodCksaSk6dm9pZCAwfXMuZm9yZ2V0KCl9LGRpbWVuc2lvbjpmdW5jdGlvbigpe2lmKCFzLnBlZWtOb3ROdW1lcmljKCkpe3ZhciBlPXMuJHJlKC9eKFsrLV0/XGQqXC4/XGQrKSglfFthLXpfXSspPy9pKTtyZXR1cm4gZT9uZXcgQ2UuRGltZW5zaW9uKGVbMV0sZVsyXSk6dm9pZCAwfX0sdW5pY29kZURlc2NyaXB0b3I6ZnVuY3Rpb24oKXt2YXIgZTtpZihlPXMuJHJlKC9eVVwrWzAtOWEtZkEtRj9dKyhcLVswLTlhLWZBLUY/XSspPy8pKXJldHVybiBuZXcgQ2UuVW5pY29kZURlc2NyaXB0b3IoZVswXSl9LGphdmFzY3JpcHQ6ZnVuY3Rpb24oKXt2YXIgZSx0PXMuaTtzLnNhdmUoKTt2YXIgaT1zLiRjaGFyKCJ+Iik7aWYocy4kY2hhcigiYCIpKXtpZihlPXMuJHJlKC9eW15gXSpgLykpcmV0dXJuIHMuZm9yZ2V0KCksbmV3IENlLkphdmFTY3JpcHQoZS5zdWJzdHIoMCxlLmxlbmd0aC0xKSxCb29sZWFuKGkpLHQsbik7cy5yZXN0b3JlKCJpbnZhbGlkIGphdmFzY3JpcHQgZGVmaW5pdGlvbiIpfWVsc2Ugcy5yZXN0b3JlKCl9fSx2YXJpYWJsZTpmdW5jdGlvbigpe3ZhciBlO2lmKCJAIj09PXMuY3VycmVudENoYXIoKSYmKGU9cy4kcmUoL14oQFtcdy1dKylccyo6LykpKXJldHVybiBlWzFdfSx2YXJpYWJsZUNhbGw6ZnVuY3Rpb24oZSl7dmFyIHQsaT1zLmksbz0hIWUsYT1lO2lmKHMuc2F2ZSgpLGF8fCJAIj09PXMuY3VycmVudENoYXIoKSYmKGE9cy4kcmUoL14oQFtcdy1dKykoXChccypcKSk/LykpKXtpZighKHQ9dGhpcy5taXhpbi5ydWxlTG9va3VwcygpKSYmKG8mJiIoKSIhPT1zLiRzdHIoIigpIil8fCIoKSIhPT1hWzJdKSlyZXR1cm4gdm9pZCBzLnJlc3RvcmUoIk1pc3NpbmcgJ1suLi5dJyBsb29rdXAgaW4gdmFyaWFibGUgY2FsbCIpO298fChhPWFbMV0pO3ZhciBsPW5ldyBDZS5WYXJpYWJsZUNhbGwoYSxpLG4pO3JldHVybiFvJiZyLmVuZCgpPyhzLmZvcmdldCgpLGwpOihzLmZvcmdldCgpLG5ldyBDZS5OYW1lc3BhY2VWYWx1ZShsLHQsaSxuKSl9cy5yZXN0b3JlKCl9LGV4dGVuZDpmdW5jdGlvbihlKXt2YXIgdCxpLHIsbCx1LGM9cy5pO2lmKHMuJHN0cihlPyImOmV4dGVuZCgiOiI6ZXh0ZW5kKCIpKXtkb3tmb3Iocj1udWxsLHQ9bnVsbDshKHI9cy4kcmUoL14oYWxsKSg/PVxzKihcKXwsKSkvKSkmJihpPXRoaXMuZWxlbWVudCgpKTspdD90LnB1c2goaSk6dD1baV07cj1yJiZyWzFdLHR8fG8oIk1pc3NpbmcgdGFyZ2V0IHNlbGVjdG9yIGZvciA6ZXh0ZW5kKCkuIiksdT1uZXcgQ2UuRXh0ZW5kKG5ldyBDZS5TZWxlY3Rvcih0KSxyLGMsbiksbD9sLnB1c2godSk6bD1bdV19d2hpbGUocy4kY2hhcigiLCIpKTtyZXR1cm4gYSgvXlwpLyksZSYmYSgvXjsvKSxsfX0sZXh0ZW5kUnVsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmV4dGVuZCghMCl9LG1peGluOntjYWxsOmZ1bmN0aW9uKGUsdCl7dmFyIGksbyxhLHUsYz1zLmN1cnJlbnRDaGFyKCksaD0hMSxmPXMuaTtpZigiLiI9PT1jfHwiIyI9PT1jKXtpZihzLnNhdmUoKSxvPXRoaXMuZWxlbWVudHMoKSl7aWYocy4kY2hhcigiKCIpJiYoYT10aGlzLmFyZ3MoITApLmFyZ3MsbCgiKSIpLHU9ITApLCExIT09dCYmKGk9dGhpcy5ydWxlTG9va3VwcygpKSwhMD09PXQmJiFpKXJldHVybiB2b2lkIHMucmVzdG9yZSgpO2lmKGUmJiFpJiYhdSlyZXR1cm4gdm9pZCBzLnJlc3RvcmUoKTtpZighZSYmci5pbXBvcnRhbnQoKSYmKGg9ITApLGV8fHIuZW5kKCkpe3MuZm9yZ2V0KCk7dmFyIHA9bmV3IENlLm1peGluLkNhbGwobyxhLGYsbiwhaSYmaCk7cmV0dXJuIGk/bmV3IENlLk5hbWVzcGFjZVZhbHVlKHAsaSk6cH19cy5yZXN0b3JlKCl9fSxlbGVtZW50czpmdW5jdGlvbigpe2Zvcih2YXIgZSx0LGkscixvLGE9L15bIy5dKD86W1x3LV18XFwoPzpbQS1GYS1mMC05XXsxLDZ9ID98W15BLUZhLWYwLTldKSkrLztvPXMuaSx0PXMuJHJlKGEpOylyPW5ldyBDZS5FbGVtZW50KGksdCwhMSxvLG4pLGU/ZS5wdXNoKHIpOmU9W3JdLGk9cy4kY2hhcigiPiIpO3JldHVybiBlfSxhcmdzOmZ1bmN0aW9uKGUpe3ZhciB0LGksbixhLGwsdSxjLGg9ci5lbnRpdGllcyxmPXthcmdzOm51bGwsdmFyaWFkaWM6ITF9LHA9W10sdj1bXSxkPVtdLG09ITA7Zm9yKHMuc2F2ZSgpOzspe2lmKGUpdT1yLmRldGFjaGVkUnVsZXNldCgpfHxyLmV4cHJlc3Npb24oKTtlbHNle2lmKHMuY29tbWVudFN0b3JlLmxlbmd0aD0wLHMuJHN0cigiLi4uIikpe2YudmFyaWFkaWM9ITAscy4kY2hhcigiOyIpJiYhdCYmKHQ9ITApLCh0P3Y6ZCkucHVzaCh7dmFyaWFkaWM6ITB9KTticmVha311PWgudmFyaWFibGUoKXx8aC5wcm9wZXJ0eSgpfHxoLmxpdGVyYWwoKXx8aC5rZXl3b3JkKCl8fHRoaXMuY2FsbCghMCl9aWYoIXV8fCFtKWJyZWFrO2E9bnVsbCx1LnRocm93QXdheUNvbW1lbnRzJiZ1LnRocm93QXdheUNvbW1lbnRzKCksbD11O3ZhciBnPW51bGw7aWYoZT91LnZhbHVlJiYxPT11LnZhbHVlLmxlbmd0aCYmKGc9dS52YWx1ZVswXSk6Zz11LGcmJihnIGluc3RhbmNlb2YgQ2UuVmFyaWFibGV8fGcgaW5zdGFuY2VvZiBDZS5Qcm9wZXJ0eSkpaWYocy4kY2hhcigiOiIpKXtpZihwLmxlbmd0aD4wJiYodCYmbygiQ2Fubm90IG1peCA7IGFuZCAsIGFzIGRlbGltaXRlciB0eXBlcyIpLGk9ITApLCEobD1yLmRldGFjaGVkUnVsZXNldCgpfHxyLmV4cHJlc3Npb24oKSkpe2lmKCFlKXJldHVybiBzLnJlc3RvcmUoKSxmLmFyZ3M9W10sZjtvKCJjb3VsZCBub3QgdW5kZXJzdGFuZCB2YWx1ZSBmb3IgbmFtZWQgYXJndW1lbnQiKX1hPW49Zy5uYW1lfWVsc2UgaWYocy4kc3RyKCIuLi4iKSl7aWYoIWUpe2YudmFyaWFkaWM9ITAscy4kY2hhcigiOyIpJiYhdCYmKHQ9ITApLCh0P3Y6ZCkucHVzaCh7bmFtZTp1Lm5hbWUsdmFyaWFkaWM6ITB9KTticmVha31jPSEwfWVsc2UgZXx8KG49YT1nLm5hbWUsbD1udWxsKTtsJiZwLnB1c2gobCksZC5wdXNoKHtuYW1lOmEsdmFsdWU6bCxleHBhbmQ6Y30pLHMuJGNoYXIoIiwiKT9tPSEwOigobT0iOyI9PT1zLiRjaGFyKCI7IikpfHx0KSYmKGkmJm8oIkNhbm5vdCBtaXggOyBhbmQgLCBhcyBkZWxpbWl0ZXIgdHlwZXMiKSx0PSEwLHAubGVuZ3RoPjEmJihsPW5ldyBDZS5WYWx1ZShwKSksdi5wdXNoKHtuYW1lOm4sdmFsdWU6bCxleHBhbmQ6Y30pLG49bnVsbCxwPVtdLGk9ITEpfXJldHVybiBzLmZvcmdldCgpLGYuYXJncz10P3Y6ZCxmfSxkZWZpbml0aW9uOmZ1bmN0aW9uKCl7dmFyIGUsdCxpLG4sbz1bXSxsPSExO2lmKCEoIi4iIT09cy5jdXJyZW50Q2hhcigpJiYiIyIhPT1zLmN1cnJlbnRDaGFyKCl8fHMucGVlaygvXltee10qXH0vKSkpaWYocy5zYXZlKCksdD1zLiRyZSgvXihbIy5dKD86W1x3LV18XFwoPzpbQS1GYS1mMC05XXsxLDZ9ID98W15BLUZhLWYwLTldKSkrKVxzKlwoLykpe2U9dFsxXTt2YXIgdT10aGlzLmFyZ3MoITEpO2lmKG89dS5hcmdzLGw9dS52YXJpYWRpYywhcy4kY2hhcigiKSIpKXJldHVybiB2b2lkIHMucmVzdG9yZSgiTWlzc2luZyBjbG9zaW5nICcpJyIpO2lmKHMuY29tbWVudFN0b3JlLmxlbmd0aD0wLHMuJHN0cigid2hlbiIpJiYobj1hKHIuY29uZGl0aW9ucywiZXhwZWN0ZWQgY29uZGl0aW9uIikpLGk9ci5ibG9jaygpKXJldHVybiBzLmZvcmdldCgpLG5ldyBDZS5taXhpbi5EZWZpbml0aW9uKGUsbyxpLG4sbCk7cy5yZXN0b3JlKCl9ZWxzZSBzLnJlc3RvcmUoKX0scnVsZUxvb2t1cHM6ZnVuY3Rpb24oKXt2YXIgZSx0PVtdO2lmKCJbIj09PXMuY3VycmVudENoYXIoKSl7Zm9yKDs7KXtpZihzLnNhdmUoKSwhKGU9dGhpcy5sb29rdXBWYWx1ZSgpKSYmIiIhPT1lKXtzLnJlc3RvcmUoKTticmVha310LnB1c2goZSkscy5mb3JnZXQoKX1yZXR1cm4gdC5sZW5ndGg+MD90OnZvaWQgMH19LGxvb2t1cFZhbHVlOmZ1bmN0aW9uKCl7aWYocy5zYXZlKCkscy4kY2hhcigiWyIpKXt2YXIgZT1zLiRyZSgvXig/OltAJF17MCwyfSlbX2EtekEtWjAtOS1dKi8pO2lmKHMuJGNoYXIoIl0iKSlyZXR1cm4gZXx8IiI9PT1lPyhzLmZvcmdldCgpLGUpOnZvaWQgcy5yZXN0b3JlKCk7cy5yZXN0b3JlKCl9ZWxzZSBzLnJlc3RvcmUoKX19LGVudGl0eTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZW50aXRpZXM7cmV0dXJuIHRoaXMuY29tbWVudCgpfHxlLmxpdGVyYWwoKXx8ZS52YXJpYWJsZSgpfHxlLnVybCgpfHxlLnByb3BlcnR5KCl8fGUuY2FsbCgpfHxlLmtleXdvcmQoKXx8dGhpcy5taXhpbi5jYWxsKCEwKXx8ZS5qYXZhc2NyaXB0KCl9LGVuZDpmdW5jdGlvbigpe3JldHVybiBzLiRjaGFyKCI7Iil8fHMucGVlaygifSIpfSxpZUFscGhhOmZ1bmN0aW9uKCl7dmFyIGU7aWYocy4kcmUoL15vcGFjaXR5PS9pKSlyZXR1cm4oZT1zLiRyZSgvXlxkKy8pKXx8KGU9IkB7IisoZT1hKHIuZW50aXRpZXMudmFyaWFibGUsIkNvdWxkIG5vdCBwYXJzZSBhbHBoYSIpKS5uYW1lLnNsaWNlKDEpKyJ9IiksbCgiKSIpLG5ldyBDZS5RdW90ZWQoIiIsImFscGhhKG9wYWNpdHk9IitlKyIpIil9LGVsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgZSx0LGkscj1zLmk7aWYodD10aGlzLmNvbWJpbmF0b3IoKSwoZT1zLiRyZSgvXig/OlxkK1wuXGQrfFxkKyklLyl8fHMuJHJlKC9eKD86Wy4jXT98OiopKD86W1x3LV18W15ceDAwLVx4OWZdfFxcKD86W0EtRmEtZjAtOV17MSw2fSA/fFteQS1GYS1mMC05XSkpKy8pfHxzLiRjaGFyKCIqIil8fHMuJGNoYXIoIiYiKXx8dGhpcy5hdHRyaWJ1dGUoKXx8cy4kcmUoL15cKFteJigpQF0rXCkvKXx8cy4kcmUoL15bXC4jOl0oPz1AKS8pfHx0aGlzLmVudGl0aWVzLnZhcmlhYmxlQ3VybHkoKSl8fChzLnNhdmUoKSxzLiRjaGFyKCIoIik/KGk9dGhpcy5zZWxlY3RvcighMSkpJiZzLiRjaGFyKCIpIik/KGU9bmV3IENlLlBhcmVuKGkpLHMuZm9yZ2V0KCkpOnMucmVzdG9yZSgiTWlzc2luZyBjbG9zaW5nICcpJyIpOnMuZm9yZ2V0KCkpLGUpcmV0dXJuIG5ldyBDZS5FbGVtZW50KHQsZSxlIGluc3RhbmNlb2YgQ2UuVmFyaWFibGUscixuKX0sY29tYmluYXRvcjpmdW5jdGlvbigpe3ZhciBlPXMuY3VycmVudENoYXIoKTtpZigiLyI9PT1lKXtzLnNhdmUoKTt2YXIgdD1zLiRyZSgvXlwvW2Etel0rXC8vaSk7aWYodClyZXR1cm4gcy5mb3JnZXQoKSxuZXcgQ2UuQ29tYmluYXRvcih0KTtzLnJlc3RvcmUoKX1pZigiPiI9PT1lfHwiKyI9PT1lfHwifiI9PT1lfHwifCI9PT1lfHwiXiI9PT1lKXtmb3Iocy5pKyssIl4iPT09ZSYmIl4iPT09cy5jdXJyZW50Q2hhcigpJiYoZT0iXl4iLHMuaSsrKTtzLmlzV2hpdGVzcGFjZSgpOylzLmkrKztyZXR1cm4gbmV3IENlLkNvbWJpbmF0b3IoZSl9cmV0dXJuIHMuaXNXaGl0ZXNwYWNlKC0xKT9uZXcgQ2UuQ29tYmluYXRvcigiICIpOm5ldyBDZS5Db21iaW5hdG9yKG51bGwpfSxzZWxlY3RvcjpmdW5jdGlvbihlKXt2YXIgdCxpLHIsbCx1LGMsaCxmPXMuaTtmb3IoZT0hMSE9PWU7KGUmJihpPXRoaXMuZXh0ZW5kKCkpfHxlJiYoYz1zLiRzdHIoIndoZW4iKSl8fChsPXRoaXMuZWxlbWVudCgpKSkmJihjP2g9YSh0aGlzLmNvbmRpdGlvbnMsImV4cGVjdGVkIGNvbmRpdGlvbiIpOmg/bygiQ1NTIGd1YXJkIGNhbiBvbmx5IGJlIHVzZWQgYXQgdGhlIGVuZCBvZiBzZWxlY3RvciIpOmk/dT11P3UuY29uY2F0KGkpOmk6KHUmJm8oIkV4dGVuZCBjYW4gb25seSBiZSB1c2VkIGF0IHRoZSBlbmQgb2Ygc2VsZWN0b3IiKSxyPXMuY3VycmVudENoYXIoKSx0P3QucHVzaChsKTp0PVtsXSxsPW51bGwpLCJ7IiE9PXImJiJ9IiE9PXImJiI7IiE9PXImJiIsIiE9PXImJiIpIiE9PXIpOyk7aWYodClyZXR1cm4gbmV3IENlLlNlbGVjdG9yKHQsdSxoLGYsbik7dSYmbygiRXh0ZW5kIG11c3QgYmUgdXNlZCB0byBleHRlbmQgYSBzZWxlY3RvciwgaXQgY2Fubm90IGJlIHVzZWQgb24gaXRzIG93biIpfSxzZWxlY3RvcnM6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdDsoZT10aGlzLnNlbGVjdG9yKCkpJiYodD90LnB1c2goZSk6dD1bZV0scy5jb21tZW50U3RvcmUubGVuZ3RoPTAsZS5jb25kaXRpb24mJnQubGVuZ3RoPjEmJm8oIkd1YXJkcyBhcmUgb25seSBjdXJyZW50bHkgYWxsb3dlZCBvbiBhIHNpbmdsZSBzZWxlY3Rvci4iKSxzLiRjaGFyKCIsIikpOyllLmNvbmRpdGlvbiYmbygiR3VhcmRzIGFyZSBvbmx5IGN1cnJlbnRseSBhbGxvd2VkIG9uIGEgc2luZ2xlIHNlbGVjdG9yLiIpLHMuY29tbWVudFN0b3JlLmxlbmd0aD0wO3JldHVybiB0fSxhdHRyaWJ1dGU6ZnVuY3Rpb24oKXtpZihzLiRjaGFyKCJbIikpe3ZhciBlLHQsaSxuPXRoaXMuZW50aXRpZXM7cmV0dXJuKGU9bi52YXJpYWJsZUN1cmx5KCkpfHwoZT1hKC9eKD86W19BLVphLXowLTktXCpdKlx8KT8oPzpbX0EtWmEtejAtOS1dfFxcLikrLykpLChpPXMuJHJlKC9eW3x+KiReXT89LykpJiYodD1uLnF1b3RlZCgpfHxzLiRyZSgvXlswLTldKyUvKXx8cy4kcmUoL15bXHctXSsvKXx8bi52YXJpYWJsZUN1cmx5KCkpLGwoIl0iKSxuZXcgQ2UuQXR0cmlidXRlKGUsaSx0KX19LGJsb2NrOmZ1bmN0aW9uKCl7dmFyIGU7aWYocy4kY2hhcigieyIpJiYoZT10aGlzLnByaW1hcnkoKSkmJnMuJGNoYXIoIn0iKSlyZXR1cm4gZX0sYmxvY2tSdWxlc2V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ibG9jaygpO3JldHVybiBlJiYoZT1uZXcgQ2UuUnVsZXNldChudWxsLGUpKSxlfSxkZXRhY2hlZFJ1bGVzZXQ6ZnVuY3Rpb24oKXt2YXIgZSx0LGk7aWYocy5zYXZlKCksIXMuJHJlKC9eWy4jXVwoLyl8fCh0PShlPXRoaXMubWl4aW4uYXJncyghMSkpLmFyZ3MsaT1lLnZhcmlhZGljLHMuJGNoYXIoIikiKSkpe3ZhciBuPXRoaXMuYmxvY2tSdWxlc2V0KCk7aWYobilyZXR1cm4gcy5mb3JnZXQoKSx0P25ldyBDZS5taXhpbi5EZWZpbml0aW9uKG51bGwsdCxuLG51bGwsaSk6bmV3IENlLkRldGFjaGVkUnVsZXNldChuKTtzLnJlc3RvcmUoKX1lbHNlIHMucmVzdG9yZSgpfSxydWxlc2V0OmZ1bmN0aW9uKCl7dmFyIGUsaSxuO2lmKHMuc2F2ZSgpLHQuZHVtcExpbmVOdW1iZXJzJiYobj11KHMuaSkpLChlPXRoaXMuc2VsZWN0b3JzKCkpJiYoaT10aGlzLmJsb2NrKCkpKXtzLmZvcmdldCgpO3ZhciByPW5ldyBDZS5SdWxlc2V0KGUsaSx0LnN0cmljdEltcG9ydHMpO3JldHVybiB0LmR1bXBMaW5lTnVtYmVycyYmKHIuZGVidWdJbmZvPW4pLHJ9cy5yZXN0b3JlKCl9LGRlY2xhcmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGUsdCxpLHIsbyxhLGw9cy5pLHU9cy5jdXJyZW50Q2hhcigpO2lmKCIuIiE9PXUmJiIjIiE9PXUmJiImIiE9PXUmJiI6IiE9PXUpaWYocy5zYXZlKCksZT10aGlzLnZhcmlhYmxlKCl8fHRoaXMucnVsZVByb3BlcnR5KCkpe2lmKChhPSJzdHJpbmciPT10eXBlb2YgZSkmJih0PXRoaXMuZGV0YWNoZWRSdWxlc2V0KCkpJiYoaT0hMCkscy5jb21tZW50U3RvcmUubGVuZ3RoPTAsIXQpe2lmKG89IWEmJmUubGVuZ3RoPjEmJmUucG9wKCkudmFsdWUsdD1lWzBdLnZhbHVlJiYiLS0iPT09ZVswXS52YWx1ZS5zbGljZSgwLDIpP3RoaXMucGVybWlzc2l2ZVZhbHVlKCk6dGhpcy5hbm9ueW1vdXNWYWx1ZSgpKXJldHVybiBzLmZvcmdldCgpLG5ldyBDZS5EZWNsYXJhdGlvbihlLHQsITEsbyxsLG4pO3R8fCh0PXRoaXMudmFsdWUoKSksdD9yPXRoaXMuaW1wb3J0YW50KCk6YSYmKHQ9dGhpcy5wZXJtaXNzaXZlVmFsdWUoKSl9aWYodCYmKHRoaXMuZW5kKCl8fGkpKXJldHVybiBzLmZvcmdldCgpLG5ldyBDZS5EZWNsYXJhdGlvbihlLHQscixvLGwsbik7cy5yZXN0b3JlKCl9ZWxzZSBzLnJlc3RvcmUoKX0sYW5vbnltb3VzVmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1zLmksdD1zLiRyZSgvXihbXi4jQFwkK1wvJyIqYCg7e30tXSopOy8pO2lmKHQpcmV0dXJuIG5ldyBDZS5Bbm9ueW1vdXModFsxXSxlKX0scGVybWlzc2l2ZVZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LGkscixhLGw9ZXx8IjsiLHU9cy5pLGM9W107ZnVuY3Rpb24gaCgpe3ZhciBlPXMuY3VycmVudENoYXIoKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGw/ZT09PWw6bC50ZXN0KGUpfWlmKCFoKCkpe2E9W107ZG97KChpPXRoaXMuY29tbWVudCgpKXx8KGk9dGhpcy5lbnRpdHkoKSkpJiZhLnB1c2goaSl9d2hpbGUoaSk7aWYocj1oKCksYS5sZW5ndGg+MCl7aWYoYT1uZXcgQ2UuRXhwcmVzc2lvbihhKSxyKXJldHVybiBhO2MucHVzaChhKSwiICI9PT1zLnByZXZDaGFyKCkmJmMucHVzaChuZXcgQ2UuQW5vbnltb3VzKCIgIix1KSl9aWYocy5zYXZlKCksYT1zLiRwYXJzZVVudGlsKGwpKXtpZigic3RyaW5nIj09dHlwZW9mIGEmJm8oIkV4cGVjdGVkICciK2ErIiciLCJQYXJzZSIpLDE9PT1hLmxlbmd0aCYmIiAiPT09YVswXSlyZXR1cm4gcy5mb3JnZXQoKSxuZXcgQ2UuQW5vbnltb3VzKCIiLHUpO3ZhciBmPXZvaWQgMDtmb3IodD0wO3Q8YS5sZW5ndGg7dCsrKWlmKGY9YVt0XSxBcnJheS5pc0FycmF5KGYpKWMucHVzaChuZXcgQ2UuUXVvdGVkKGZbMF0sZlsxXSwhMCx1LG4pKTtlbHNle3Q9PT1hLmxlbmd0aC0xJiYoZj1mLnRyaW0oKSk7dmFyIHA9bmV3IENlLlF1b3RlZCgiJyIsZiwhMCx1LG4pO3AudmFyaWFibGVSZWdleD0vQChbXHctXSspL2cscC5wcm9wUmVnZXg9L1wkKFtcdy1dKykvZyxjLnB1c2gocCl9cmV0dXJuIHMuZm9yZ2V0KCksbmV3IENlLkV4cHJlc3Npb24oYywhMCl9cy5yZXN0b3JlKCl9fSxpbXBvcnQ6ZnVuY3Rpb24oKXt2YXIgZSx0LGk9cy5pLHI9cy4kcmUoL15AaW1wb3J0P1xzKy8pO2lmKHIpe3ZhciBhPShyP3RoaXMuaW1wb3J0T3B0aW9ucygpOm51bGwpfHx7fTtpZihlPXRoaXMuZW50aXRpZXMucXVvdGVkKCl8fHRoaXMuZW50aXRpZXMudXJsKCkpcmV0dXJuIHQ9dGhpcy5tZWRpYUZlYXR1cmVzKCkscy4kY2hhcigiOyIpfHwocy5pPWksbygibWlzc2luZyBzZW1pLWNvbG9uIG9yIHVucmVjb2duaXNlZCBtZWRpYSBmZWF0dXJlcyBvbiBpbXBvcnQiKSksdD10JiZuZXcgQ2UuVmFsdWUodCksbmV3IENlLkltcG9ydChlLHQsYSxpLG4pO3MuaT1pLG8oIm1hbGZvcm1lZCBpbXBvcnQgc3RhdGVtZW50Iil9fSxpbXBvcnRPcHRpb25zOmZ1bmN0aW9uKCl7dmFyIGUsdCxpLG49e307aWYoIXMuJGNoYXIoIigiKSlyZXR1cm4gbnVsbDtkb3tpZihlPXRoaXMuaW1wb3J0T3B0aW9uKCkpe3N3aXRjaChpPSEwLHQ9ZSl7Y2FzZSJjc3MiOnQ9Imxlc3MiLGk9ITE7YnJlYWs7Y2FzZSJvbmNlIjp0PSJtdWx0aXBsZSIsaT0hMX1pZihuW3RdPWksIXMuJGNoYXIoIiwiKSlicmVha319d2hpbGUoZSk7cmV0dXJuIGwoIikiKSxufSxpbXBvcnRPcHRpb246ZnVuY3Rpb24oKXt2YXIgZT1zLiRyZSgvXihsZXNzfGNzc3xtdWx0aXBsZXxvbmNlfGlubGluZXxyZWZlcmVuY2V8b3B0aW9uYWwpLyk7aWYoZSlyZXR1cm4gZVsxXX0sbWVkaWFGZWF0dXJlOmZ1bmN0aW9uKCl7dmFyIGUsdCxpPXRoaXMuZW50aXRpZXMscj1bXTtzLnNhdmUoKTtkb3soZT1pLmtleXdvcmQoKXx8aS52YXJpYWJsZSgpfHxpLm1peGluTG9va3VwKCkpP3IucHVzaChlKTpzLiRjaGFyKCIoIikmJih0PXRoaXMucHJvcGVydHkoKSxlPXRoaXMudmFsdWUoKSxzLiRjaGFyKCIpIik/dCYmZT9yLnB1c2gobmV3IENlLlBhcmVuKG5ldyBDZS5EZWNsYXJhdGlvbih0LGUsbnVsbCxudWxsLHMuaSxuLCEwKSkpOmU/ci5wdXNoKG5ldyBDZS5QYXJlbihlKSk6bygiYmFkbHkgZm9ybWVkIG1lZGlhIGZlYXR1cmUgZGVmaW5pdGlvbiIpOm8oIk1pc3NpbmcgY2xvc2luZyAnKSciLCJQYXJzZSIpKX13aGlsZShlKTtpZihzLmZvcmdldCgpLHIubGVuZ3RoPjApcmV0dXJuIG5ldyBDZS5FeHByZXNzaW9uKHIpfSxtZWRpYUZlYXR1cmVzOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLmVudGl0aWVzLGk9W107ZG97aWYoZT10aGlzLm1lZGlhRmVhdHVyZSgpKXtpZihpLnB1c2goZSksIXMuJGNoYXIoIiwiKSlicmVha31lbHNlIGlmKChlPXQudmFyaWFibGUoKXx8dC5taXhpbkxvb2t1cCgpKSYmKGkucHVzaChlKSwhcy4kY2hhcigiLCIpKSlicmVha313aGlsZShlKTtyZXR1cm4gaS5sZW5ndGg+MD9pOm51bGx9LG1lZGlhOmZ1bmN0aW9uKCl7dmFyIGUsaSxyLGEsbD1zLmk7aWYodC5kdW1wTGluZU51bWJlcnMmJihhPXUobCkpLHMuc2F2ZSgpLHMuJHN0cigiQG1lZGlhIikpcmV0dXJuIGU9dGhpcy5tZWRpYUZlYXR1cmVzKCksKGk9dGhpcy5ibG9jaygpKXx8bygibWVkaWEgZGVmaW5pdGlvbnMgcmVxdWlyZSBibG9jayBzdGF0ZW1lbnRzIGFmdGVyIGFueSBmZWF0dXJlcyIpLHMuZm9yZ2V0KCkscj1uZXcgQ2UuTWVkaWEoaSxlLGwsbiksdC5kdW1wTGluZU51bWJlcnMmJihyLmRlYnVnSW5mbz1hKSxyO3MucmVzdG9yZSgpfSxwbHVnaW46ZnVuY3Rpb24oKXt2YXIgZSx0LGkscj1zLmk7aWYocy4kcmUoL15AcGx1Z2luP1xzKy8pKXtpZihpPSh0PXRoaXMucGx1Z2luQXJncygpKT97cGx1Z2luQXJnczp0LGlzUGx1Z2luOiEwfTp7aXNQbHVnaW46ITB9LGU9dGhpcy5lbnRpdGllcy5xdW90ZWQoKXx8dGhpcy5lbnRpdGllcy51cmwoKSlyZXR1cm4gcy4kY2hhcigiOyIpfHwocy5pPXIsbygibWlzc2luZyBzZW1pLWNvbG9uIG9uIEBwbHVnaW4iKSksbmV3IENlLkltcG9ydChlLG51bGwsaSxyLG4pO3MuaT1yLG8oIm1hbGZvcm1lZCBAcGx1Z2luIHN0YXRlbWVudCIpfX0scGx1Z2luQXJnczpmdW5jdGlvbigpe2lmKHMuc2F2ZSgpLCFzLiRjaGFyKCIoIikpcmV0dXJuIHMucmVzdG9yZSgpLG51bGw7dmFyIGU9cy4kcmUoL15ccyooW15cKTtdKylcKVxzKi8pO3JldHVybiBlWzFdPyhzLmZvcmdldCgpLGVbMV0udHJpbSgpKToocy5yZXN0b3JlKCksbnVsbCl9LGF0cnVsZTpmdW5jdGlvbigpe3ZhciBlLGkscixhLGwsYyxoLGY9cy5pLHA9ITAsdj0hMDtpZigiQCI9PT1zLmN1cnJlbnRDaGFyKCkpe2lmKGk9dGhpcy5pbXBvcnQoKXx8dGhpcy5wbHVnaW4oKXx8dGhpcy5tZWRpYSgpKXJldHVybiBpO2lmKHMuc2F2ZSgpLGU9cy4kcmUoL15AW2Etei1dKy8pKXtzd2l0Y2goYT1lLCItIj09ZS5jaGFyQXQoMSkmJmUuaW5kZXhPZigiLSIsMik+MCYmKGE9IkAiK2Uuc2xpY2UoZS5pbmRleE9mKCItIiwyKSsxKSksYSl7Y2FzZSJAY2hhcnNldCI6bD0hMCxwPSExO2JyZWFrO2Nhc2UiQG5hbWVzcGFjZSI6Yz0hMCxwPSExO2JyZWFrO2Nhc2UiQGtleWZyYW1lcyI6Y2FzZSJAY291bnRlci1zdHlsZSI6bD0hMDticmVhaztjYXNlIkBkb2N1bWVudCI6Y2FzZSJAc3VwcG9ydHMiOmg9ITAsdj0hMTticmVhaztkZWZhdWx0Omg9ITB9aWYocy5jb21tZW50U3RvcmUubGVuZ3RoPTAsbD8oaT10aGlzLmVudGl0eSgpKXx8bygiZXhwZWN0ZWQgIitlKyIgaWRlbnRpZmllciIpOmM/KGk9dGhpcy5leHByZXNzaW9uKCkpfHxvKCJleHBlY3RlZCAiK2UrIiBleHByZXNzaW9uIik6aCYmKGk9dGhpcy5wZXJtaXNzaXZlVmFsdWUoL15beztdLykscD0ieyI9PT1zLmN1cnJlbnRDaGFyKCksaT9pLnZhbHVlfHwoaT1udWxsKTpwfHwiOyI9PT1zLmN1cnJlbnRDaGFyKCl8fG8oZSsiIHJ1bGUgaXMgbWlzc2luZyBibG9jayBvciBlbmRpbmcgc2VtaS1jb2xvbiIpKSxwJiYocj10aGlzLmJsb2NrUnVsZXNldCgpKSxyfHwhcCYmaSYmcy4kY2hhcigiOyIpKXJldHVybiBzLmZvcmdldCgpLG5ldyBDZS5BdFJ1bGUoZSxpLHIsZixuLHQuZHVtcExpbmVOdW1iZXJzP3UoZik6bnVsbCx2KTtzLnJlc3RvcmUoImF0LXJ1bGUgb3B0aW9ucyBub3QgcmVjb2duaXNlZCIpfX19LHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdD1bXSxpPXMuaTtkb3tpZigoZT10aGlzLmV4cHJlc3Npb24oKSkmJih0LnB1c2goZSksIXMuJGNoYXIoIiwiKSkpYnJlYWt9d2hpbGUoZSk7aWYodC5sZW5ndGg+MClyZXR1cm4gbmV3IENlLlZhbHVlKHQsaSl9LGltcG9ydGFudDpmdW5jdGlvbigpe2lmKCIhIj09PXMuY3VycmVudENoYXIoKSlyZXR1cm4gcy4kcmUoL14hICppbXBvcnRhbnQvKX0sc3ViOmZ1bmN0aW9uKCl7dmFyIGUsdDtpZihzLnNhdmUoKSxzLiRjaGFyKCIoIikpcmV0dXJuKGU9dGhpcy5hZGRpdGlvbigpKSYmcy4kY2hhcigiKSIpPyhzLmZvcmdldCgpLCh0PW5ldyBDZS5FeHByZXNzaW9uKFtlXSkpLnBhcmVucz0hMCx0KTp2b2lkIHMucmVzdG9yZSgiRXhwZWN0ZWQgJyknIik7cy5yZXN0b3JlKCl9LG11bHRpcGxpY2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGUsdCxpLG4scjtpZihlPXRoaXMub3BlcmFuZCgpKXtmb3Iocj1zLmlzV2hpdGVzcGFjZSgtMSk7IXMucGVlaygvXlwvWypcL10vKTspe2lmKHMuc2F2ZSgpLCEoaT1zLiRjaGFyKCIvIil8fHMuJGNoYXIoIioiKXx8cy4kc3RyKCIuLyIpKSl7cy5mb3JnZXQoKTticmVha31pZighKHQ9dGhpcy5vcGVyYW5kKCkpKXtzLnJlc3RvcmUoKTticmVha31zLmZvcmdldCgpLGUucGFyZW5zSW5PcD0hMCx0LnBhcmVuc0luT3A9ITAsbj1uZXcgQ2UuT3BlcmF0aW9uKGksW258fGUsdF0scikscj1zLmlzV2hpdGVzcGFjZSgtMSl9cmV0dXJuIG58fGV9fSxhZGRpdGlvbjpmdW5jdGlvbigpe3ZhciBlLHQsaSxuLHI7aWYoZT10aGlzLm11bHRpcGxpY2F0aW9uKCkpe2ZvcihyPXMuaXNXaGl0ZXNwYWNlKC0xKTsoaT1zLiRyZSgvXlstK11ccysvKXx8IXImJihzLiRjaGFyKCIrIil8fHMuJGNoYXIoIi0iKSkpJiYodD10aGlzLm11bHRpcGxpY2F0aW9uKCkpOyllLnBhcmVuc0luT3A9ITAsdC5wYXJlbnNJbk9wPSEwLG49bmV3IENlLk9wZXJhdGlvbihpLFtufHxlLHRdLHIpLHI9cy5pc1doaXRlc3BhY2UoLTEpO3JldHVybiBufHxlfX0sY29uZGl0aW9uczpmdW5jdGlvbigpe3ZhciBlLHQsaSxuPXMuaTtpZihlPXRoaXMuY29uZGl0aW9uKCEwKSl7Zm9yKDtzLnBlZWsoL14sXHMqKG5vdFxzKik/XCgvKSYmcy4kY2hhcigiLCIpJiYodD10aGlzLmNvbmRpdGlvbighMCkpOylpPW5ldyBDZS5Db25kaXRpb24oIm9yIixpfHxlLHQsbik7cmV0dXJuIGl8fGV9fSxjb25kaXRpb246ZnVuY3Rpb24oZSl7dmFyIHQsaSxuO2lmKHQ9dGhpcy5jb25kaXRpb25BbmQoZSkpe2lmKGk9cy4kc3RyKCJvciIpKXtpZighKG49dGhpcy5jb25kaXRpb24oZSkpKXJldHVybjt0PW5ldyBDZS5Db25kaXRpb24oaSx0LG4pfXJldHVybiB0fX0sY29uZGl0aW9uQW5kOmZ1bmN0aW9uKGUpe3ZhciB0LGksbixyLG89dGhpcztpZih0PShyPW8ubmVnYXRlZENvbmRpdGlvbihlKXx8by5wYXJlbnRoZXNpc0NvbmRpdGlvbihlKSl8fGU/cjpvLmF0b21pY0NvbmRpdGlvbihlKSl7aWYoaT1zLiRzdHIoImFuZCIpKXtpZighKG49dGhpcy5jb25kaXRpb25BbmQoZSkpKXJldHVybjt0PW5ldyBDZS5Db25kaXRpb24oaSx0LG4pfXJldHVybiB0fX0sbmVnYXRlZENvbmRpdGlvbjpmdW5jdGlvbihlKXtpZihzLiRzdHIoIm5vdCIpKXt2YXIgdD10aGlzLnBhcmVudGhlc2lzQ29uZGl0aW9uKGUpO3JldHVybiB0JiYodC5uZWdhdGU9IXQubmVnYXRlKSx0fX0scGFyZW50aGVzaXNDb25kaXRpb246ZnVuY3Rpb24oZSl7dmFyIHQ7aWYocy5zYXZlKCkscy4kc3RyKCIoIikpe2lmKHQ9ZnVuY3Rpb24odCl7dmFyIGk7aWYocy5zYXZlKCksaT10LmNvbmRpdGlvbihlKSl7aWYocy4kY2hhcigiKSIpKXJldHVybiBzLmZvcmdldCgpLGk7cy5yZXN0b3JlKCl9ZWxzZSBzLnJlc3RvcmUoKX0odGhpcykpcmV0dXJuIHMuZm9yZ2V0KCksdDtpZih0PXRoaXMuYXRvbWljQ29uZGl0aW9uKGUpKXtpZihzLiRjaGFyKCIpIikpcmV0dXJuIHMuZm9yZ2V0KCksdDtzLnJlc3RvcmUoImV4cGVjdGVkICcpJyBnb3QgJyIrcy5jdXJyZW50Q2hhcigpKyInIil9ZWxzZSBzLnJlc3RvcmUoKX1lbHNlIHMucmVzdG9yZSgpfSxhdG9taWNDb25kaXRpb246ZnVuY3Rpb24oZSl7dmFyIHQsaSxuLHIsYT10aGlzLmVudGl0aWVzLGw9cy5pO2Z1bmN0aW9uIHUoKXtyZXR1cm4gdGhpcy5hZGRpdGlvbigpfHxhLmtleXdvcmQoKXx8YS5xdW90ZWQoKXx8YS5taXhpbkxvb2t1cCgpfWlmKHQ9KHU9dS5iaW5kKHRoaXMpKSgpKXJldHVybiBzLiRjaGFyKCI+Iik/cj1zLiRjaGFyKCI9Iik/Ij49IjoiPiI6cy4kY2hhcigiPCIpP3I9cy4kY2hhcigiPSIpPyI8PSI6IjwiOnMuJGNoYXIoIj0iKSYmKHI9cy4kY2hhcigiPiIpPyI9PiI6cy4kY2hhcigiPCIpPyI9PCI6Ij0iKSxyPyhpPXUoKSk/bj1uZXcgQ2UuQ29uZGl0aW9uKHIsdCxpLGwsITEpOm8oImV4cGVjdGVkIGV4cHJlc3Npb24iKTpuPW5ldyBDZS5Db25kaXRpb24oIj0iLHQsbmV3IENlLktleXdvcmQoInRydWUiKSxsLCExKSxufSxvcGVyYW5kOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLmVudGl0aWVzO3MucGVlaygvXi1bQFwkXChdLykmJihlPXMuJGNoYXIoIi0iKSk7dmFyIGk9dGhpcy5zdWIoKXx8dC5kaW1lbnNpb24oKXx8dC5jb2xvcigpfHx0LnZhcmlhYmxlKCl8fHQucHJvcGVydHkoKXx8dC5jYWxsKCl8fHQucXVvdGVkKCEwKXx8dC5jb2xvcktleXdvcmQoKXx8dC5taXhpbkxvb2t1cCgpO3JldHVybiBlJiYoaS5wYXJlbnNJbk9wPSEwLGk9bmV3IENlLk5lZ2F0aXZlKGkpKSxpfSxleHByZXNzaW9uOmZ1bmN0aW9uKCl7dmFyIGUsdCxpPVtdLG49cy5pO2RveyhlPXRoaXMuY29tbWVudCgpKT9pLnB1c2goZSk6KChlPXRoaXMuYWRkaXRpb24oKXx8dGhpcy5lbnRpdHkoKSlpbnN0YW5jZW9mIENlLkNvbW1lbnQmJihlPW51bGwpLGUmJihpLnB1c2goZSkscy5wZWVrKC9eXC9bXC8qXS8pfHwodD1zLiRjaGFyKCIvIikpJiZpLnB1c2gobmV3IENlLkFub255bW91cyh0LG4pKSkpfXdoaWxlKGUpO2lmKGkubGVuZ3RoPjApcmV0dXJuIG5ldyBDZS5FeHByZXNzaW9uKGkpfSxwcm9wZXJ0eTpmdW5jdGlvbigpe3ZhciBlPXMuJHJlKC9eKFwqPy0/W19hLXpBLVowLTktXSspXHMqOi8pO2lmKGUpcmV0dXJuIGVbMV19LHJ1bGVQcm9wZXJ0eTpmdW5jdGlvbigpe3ZhciBlLHQsaT1bXSxyPVtdO3Muc2F2ZSgpO3ZhciBvPXMuJHJlKC9eKFtfYS16QS1aMC05LV0rKVxzKjovKTtpZihvKXJldHVybiBpPVtuZXcgQ2UuS2V5d29yZChvWzFdKV0scy5mb3JnZXQoKSxpO2Z1bmN0aW9uIGEoZSl7dmFyIHQ9cy5pLG49cy4kcmUoZSk7aWYobilyZXR1cm4gci5wdXNoKHQpLGkucHVzaChuWzFdKX1mb3IoYSgvXihcKj8pLyk7YSgvXigoPzpbXHctXSspfCg/OltAXCRdXHtbXHctXStcfSkpLyk7KTtpZihpLmxlbmd0aD4xJiZhKC9eKCg/OlwrX3xcKyk/KVxzKjovKSl7Zm9yKHMuZm9yZ2V0KCksIiI9PT1pWzBdJiYoaS5zaGlmdCgpLHIuc2hpZnQoKSksdD0wO3Q8aS5sZW5ndGg7dCsrKWU9aVt0XSxpW3RdPSJAIiE9PWUuY2hhckF0KDApJiYiJCIhPT1lLmNoYXJBdCgwKT9uZXcgQ2UuS2V5d29yZChlKToiQCI9PT1lLmNoYXJBdCgwKT9uZXcgQ2UuVmFyaWFibGUoIkAiK2Uuc2xpY2UoMiwtMSksclt0XSxuKTpuZXcgQ2UuUHJvcGVydHkoIiQiK2Uuc2xpY2UoMiwtMSksclt0XSxuKTtyZXR1cm4gaX1zLnJlc3RvcmUoKX19fX07ZnVuY3Rpb24gcWUoZSx0LGksbil7cmV0dXJuIHQuZXZhbChlKT9pLmV2YWwoZSk6bj9uLmV2YWwoZSk6bmV3IGp9ZnVuY3Rpb24gVGUoZSx0KXt0cnl7cmV0dXJuIHQuZXZhbChlKSxMLlRydWV9Y2F0Y2goZSl7cmV0dXJuIEwuRmFsc2V9fVVlLnNlcmlhbGl6ZVZhcnM9ZnVuY3Rpb24oZSl7dmFyIHQ9IiI7Zm9yKHZhciBpIGluIGUpaWYoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSxpKSl7dmFyIG49ZVtpXTt0Kz0oIkAiPT09aVswXT8iIjoiQCIpK2krIjogIituKygiOyI9PT1TdHJpbmcobikuc2xpY2UoLTEpPyIiOiI7Iil9cmV0dXJuIHR9LHFlLmV2YWxBcmdzPSExLFRlLmV2YWxBcmdzPSExO3ZhciB6ZSxHZT17aXNkZWZpbmVkOlRlLGJvb2xlYW46ZnVuY3Rpb24oZSl7cmV0dXJuIGU/TC5UcnVlOkwuRmFsc2V9LGlmOnFlfTtmdW5jdGlvbiBXZShlKXtyZXR1cm4gTWF0aC5taW4oMSxNYXRoLm1heCgwLGUpKX1mdW5jdGlvbiBKZShlLHQpe3ZhciBpPXplLmhzbGEodC5oLHQucyx0LmwsdC5hKTtpZihpKXJldHVybiBlLnZhbHVlJiYvXihyZ2J8aHNsKS8udGVzdChlLnZhbHVlKT9pLnZhbHVlPWUudmFsdWU6aS52YWx1ZT0icmdiIixpfWZ1bmN0aW9uIEhlKGUpe2lmKGUudG9IU0wpcmV0dXJuIGUudG9IU0woKTt0aHJvdyBuZXcgRXJyb3IoIkFyZ3VtZW50IGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gYSBjb2xvciIpfWZ1bmN0aW9uIFFlKGUpe2lmKGUudG9IU1YpcmV0dXJuIGUudG9IU1YoKTt0aHJvdyBuZXcgRXJyb3IoIkFyZ3VtZW50IGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gYSBjb2xvciIpfWZ1bmN0aW9uIEtlKGUpe2lmKGUgaW5zdGFuY2VvZiBlZSlyZXR1cm4gcGFyc2VGbG9hdChlLnVuaXQuaXMoIiUiKT9lLnZhbHVlLzEwMDplLnZhbHVlKTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIGU7dGhyb3d7dHlwZToiQXJndW1lbnQiLG1lc3NhZ2U6ImNvbG9yIGZ1bmN0aW9ucyB0YWtlIG51bWJlcnMgYXMgcGFyYW1ldGVycyJ9fXZhciBaZT16ZT17cmdiOmZ1bmN0aW9uKGUsdCxpKXt2YXIgbj0xO2lmKGUgaW5zdGFuY2VvZiBuZSl7dmFyIHI9ZS52YWx1ZTtpZihlPXJbMF0sdD1yWzFdLChpPXJbMl0paW5zdGFuY2VvZiBpZSl7dmFyIHM9aTtpPXMub3BlcmFuZHNbMF0sbj1zLm9wZXJhbmRzWzFdfX12YXIgbz16ZS5yZ2JhKGUsdCxpLG4pO2lmKG8pcmV0dXJuIG8udmFsdWU9InJnYiIsb30scmdiYTpmdW5jdGlvbihlLHQsaSxuKXt0cnl7aWYoZSBpbnN0YW5jZW9mIGMpcmV0dXJuIG49dD9LZSh0KTplLmFscGhhLG5ldyBjKGUucmdiLG4sInJnYmEiKTt2YXIgcj1bZSx0LGldLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGk9MjU1LCh0PWUpaW5zdGFuY2VvZiBlZSYmdC51bml0LmlzKCIlIik/cGFyc2VGbG9hdCh0LnZhbHVlKmkvMTAwKTpLZSh0KTt2YXIgdCxpfSkpO3JldHVybiBuPUtlKG4pLG5ldyBjKHIsbiwicmdiYSIpfWNhdGNoKGUpe319LGhzbDpmdW5jdGlvbihlLHQsaSl7dmFyIG49MTtpZihlIGluc3RhbmNlb2YgbmUpe3ZhciByPWUudmFsdWU7aWYoZT1yWzBdLHQ9clsxXSwoaT1yWzJdKWluc3RhbmNlb2YgaWUpe3ZhciBzPWk7aT1zLm9wZXJhbmRzWzBdLG49cy5vcGVyYW5kc1sxXX19dmFyIG89emUuaHNsYShlLHQsaSxuKTtpZihvKXJldHVybiBvLnZhbHVlPSJoc2wiLG99LGhzbGE6ZnVuY3Rpb24oZSx0LGksbil7dHJ5e2lmKGUgaW5zdGFuY2VvZiBjKXJldHVybiBuPXQ/S2UodCk6ZS5hbHBoYSxuZXcgYyhlLnJnYixuLCJoc2xhIik7dmFyIHIscztmdW5jdGlvbiBvKGUpe3JldHVybiA2KihlPWU8MD9lKzE6ZT4xP2UtMTplKTwxP3IrKHMtcikqZSo2OjIqZTwxP3M6MyplPDI/cisocy1yKSooMi8zLWUpKjY6cn1lPUtlKGUpJTM2MC8zNjAsdD1XZShLZSh0KSksaT1XZShLZShpKSksbj1XZShLZShuKSkscj0yKmktKHM9aTw9LjU/aSoodCsxKTppK3QtaSp0KTt2YXIgYT1bMjU1Km8oZSsxLzMpLDI1NSpvKGUpLDI1NSpvKGUtMS8zKV07cmV0dXJuIG49S2UobiksbmV3IGMoYSxuLCJoc2xhIil9Y2F0Y2goZSl7fX0saHN2OmZ1bmN0aW9uKGUsdCxpKXtyZXR1cm4gemUuaHN2YShlLHQsaSwxKX0saHN2YTpmdW5jdGlvbihlLHQsaSxuKXt2YXIgcixzO2U9S2UoZSklMzYwLzM2MCozNjAsdD1LZSh0KSxpPUtlKGkpLG49S2Uobik7dmFyIG89W2ksaSooMS10KSxpKigxLShzPWUvNjAtKHI9TWF0aC5mbG9vcihlLzYwJTYpKSkqdCksaSooMS0oMS1zKSp0KV0sYT1bWzAsMywxXSxbMiwwLDFdLFsxLDAsM10sWzEsMiwwXSxbMywxLDBdLFswLDEsMl1dO3JldHVybiB6ZS5yZ2JhKDI1NSpvW2Fbcl1bMF1dLDI1NSpvW2Fbcl1bMV1dLDI1NSpvW2Fbcl1bMl1dLG4pfSxodWU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBlZShIZShlKS5oKX0sc2F0dXJhdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGVlKDEwMCpIZShlKS5zLCIlIil9LGxpZ2h0bmVzczpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGVlKDEwMCpIZShlKS5sLCIlIil9LGhzdmh1ZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGVlKFFlKGUpLmgpfSxoc3ZzYXR1cmF0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZWUoMTAwKlFlKGUpLnMsIiUiKX0saHN2dmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBlZSgxMDAqUWUoZSkudiwiJSIpfSxyZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBlZShlLnJnYlswXSl9LGdyZWVuOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZWUoZS5yZ2JbMV0pfSxibHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZWUoZS5yZ2JbMl0pfSxhbHBoYTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGVlKEhlKGUpLmEpfSxsdW1hOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZWUoZS5sdW1hKCkqZS5hbHBoYSoxMDAsIiUiKX0sbHVtaW5hbmNlOmZ1bmN0aW9uKGUpe3ZhciB0PS4yMTI2KmUucmdiWzBdLzI1NSsuNzE1MiplLnJnYlsxXS8yNTUrLjA3MjIqZS5yZ2JbMl0vMjU1O3JldHVybiBuZXcgZWUodCplLmFscGhhKjEwMCwiJSIpfSxzYXR1cmF0ZTpmdW5jdGlvbihlLHQsaSl7aWYoIWUucmdiKXJldHVybiBudWxsO3ZhciBuPUhlKGUpO3JldHVybiB2b2lkIDAhPT1pJiYicmVsYXRpdmUiPT09aS52YWx1ZT9uLnMrPW4ucyp0LnZhbHVlLzEwMDpuLnMrPXQudmFsdWUvMTAwLG4ucz1XZShuLnMpLEplKGUsbil9LGRlc2F0dXJhdGU6ZnVuY3Rpb24oZSx0LGkpe3ZhciBuPUhlKGUpO3JldHVybiB2b2lkIDAhPT1pJiYicmVsYXRpdmUiPT09aS52YWx1ZT9uLnMtPW4ucyp0LnZhbHVlLzEwMDpuLnMtPXQudmFsdWUvMTAwLG4ucz1XZShuLnMpLEplKGUsbil9LGxpZ2h0ZW46ZnVuY3Rpb24oZSx0LGkpe3ZhciBuPUhlKGUpO3JldHVybiB2b2lkIDAhPT1pJiYicmVsYXRpdmUiPT09aS52YWx1ZT9uLmwrPW4ubCp0LnZhbHVlLzEwMDpuLmwrPXQudmFsdWUvMTAwLG4ubD1XZShuLmwpLEplKGUsbil9LGRhcmtlbjpmdW5jdGlvbihlLHQsaSl7dmFyIG49SGUoZSk7cmV0dXJuIHZvaWQgMCE9PWkmJiJyZWxhdGl2ZSI9PT1pLnZhbHVlP24ubC09bi5sKnQudmFsdWUvMTAwOm4ubC09dC52YWx1ZS8xMDAsbi5sPVdlKG4ubCksSmUoZSxuKX0sZmFkZWluOmZ1bmN0aW9uKGUsdCxpKXt2YXIgbj1IZShlKTtyZXR1cm4gdm9pZCAwIT09aSYmInJlbGF0aXZlIj09PWkudmFsdWU/bi5hKz1uLmEqdC52YWx1ZS8xMDA6bi5hKz10LnZhbHVlLzEwMCxuLmE9V2Uobi5hKSxKZShlLG4pfSxmYWRlb3V0OmZ1bmN0aW9uKGUsdCxpKXt2YXIgbj1IZShlKTtyZXR1cm4gdm9pZCAwIT09aSYmInJlbGF0aXZlIj09PWkudmFsdWU/bi5hLT1uLmEqdC52YWx1ZS8xMDA6bi5hLT10LnZhbHVlLzEwMCxuLmE9V2Uobi5hKSxKZShlLG4pfSxmYWRlOmZ1bmN0aW9uKGUsdCl7dmFyIGk9SGUoZSk7cmV0dXJuIGkuYT10LnZhbHVlLzEwMCxpLmE9V2UoaS5hKSxKZShlLGkpfSxzcGluOmZ1bmN0aW9uKGUsdCl7dmFyIGk9SGUoZSksbj0oaS5oK3QudmFsdWUpJTM2MDtyZXR1cm4gaS5oPW48MD8zNjArbjpuLEplKGUsaSl9LG1peDpmdW5jdGlvbihlLHQsaSl7aXx8KGk9bmV3IGVlKDUwKSk7dmFyIG49aS52YWx1ZS8xMDAscj0yKm4tMSxzPUhlKGUpLmEtSGUodCkuYSxvPSgocipzPT0tMT9yOihyK3MpLygxK3IqcykpKzEpLzIsYT0xLW8sbD1bZS5yZ2JbMF0qbyt0LnJnYlswXSphLGUucmdiWzFdKm8rdC5yZ2JbMV0qYSxlLnJnYlsyXSpvK3QucmdiWzJdKmFdLHU9ZS5hbHBoYSpuK3QuYWxwaGEqKDEtbik7cmV0dXJuIG5ldyBjKGwsdSl9LGdyZXlzY2FsZTpmdW5jdGlvbihlKXtyZXR1cm4gemUuZGVzYXR1cmF0ZShlLG5ldyBlZSgxMDApKX0sY29udHJhc3Q6ZnVuY3Rpb24oZSx0LGksbil7aWYoIWUucmdiKXJldHVybiBudWxsO2lmKHZvaWQgMD09PWkmJihpPXplLnJnYmEoMjU1LDI1NSwyNTUsMSkpLHZvaWQgMD09PXQmJih0PXplLnJnYmEoMCwwLDAsMSkpLHQubHVtYSgpPmkubHVtYSgpKXt2YXIgcj1pO2k9dCx0PXJ9cmV0dXJuIG49dm9pZCAwPT09bj8uNDM6S2UobiksZS5sdW1hKCk8bj9pOnR9LGFyZ2I6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBqKGUudG9BUkdCKCkpfSxjb2xvcjpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgdWUmJi9eIyhbQS1GYS1mMC05XXs4fXxbQS1GYS1mMC05XXs2fXxbQS1GYS1mMC05XXszLDR9KSQvaS50ZXN0KGUudmFsdWUpKXt2YXIgdD1lLnZhbHVlLnNsaWNlKDEpO3JldHVybiBuZXcgYyh0LHZvaWQgMCwiIyIrdCl9aWYoZSBpbnN0YW5jZW9mIGN8fChlPWMuZnJvbUtleXdvcmQoZS52YWx1ZSkpKXJldHVybiBlLnZhbHVlPXZvaWQgMCxlO3Rocm93e3R5cGU6IkFyZ3VtZW50IixtZXNzYWdlOiJhcmd1bWVudCBtdXN0IGJlIGEgY29sb3Iga2V5d29yZCBvciAzfDR8Nnw4IGRpZ2l0IGhleCBlLmcuICNGRkYifX0sdGludDpmdW5jdGlvbihlLHQpe3JldHVybiB6ZS5taXgoemUucmdiKDI1NSwyNTUsMjU1KSxlLHQpfSxzaGFkZTpmdW5jdGlvbihlLHQpe3JldHVybiB6ZS5taXgoemUucmdiKDAsMCwwKSxlLHQpfX07ZnVuY3Rpb24gWGUoZSx0LGkpe3ZhciBuLHIscyxvLGE9dC5hbHBoYSxsPWkuYWxwaGEsdT1bXTtzPWwrYSooMS1sKTtmb3IodmFyIGg9MDtoPDM7aCsrKW89ZShuPXQucmdiW2hdLzI1NSxyPWkucmdiW2hdLzI1NSkscyYmKG89KGwqcithKihuLWwqKG4rci1vKSkpL3MpLHVbaF09MjU1Km87cmV0dXJuIG5ldyBjKHUscyl9dmFyIFllPXttdWx0aXBseTpmdW5jdGlvbihlLHQpe3JldHVybiBlKnR9LHNjcmVlbjpmdW5jdGlvbihlLHQpe3JldHVybiBlK3QtZSp0fSxvdmVybGF5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUqPTIpPD0xP1llLm11bHRpcGx5KGUsdCk6WWUuc2NyZWVuKGUtMSx0KX0sc29mdGxpZ2h0OmZ1bmN0aW9uKGUsdCl7dmFyIGk9MSxuPWU7cmV0dXJuIHQ+LjUmJihuPTEsaT1lPi4yNT9NYXRoLnNxcnQoZSk6KCgxNiplLTEyKSplKzQpKmUpLGUtKDEtMip0KSpuKihpLWUpfSxoYXJkbGlnaHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWWUub3ZlcmxheSh0LGUpfSxkaWZmZXJlbmNlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIE1hdGguYWJzKGUtdCl9LGV4Y2x1c2lvbjpmdW5jdGlvbihlLHQpe3JldHVybiBlK3QtMiplKnR9LGF2ZXJhZ2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZSt0KS8yfSxuZWdhdGlvbjpmdW5jdGlvbihlLHQpe3JldHVybiAxLU1hdGguYWJzKGUrdC0xKX19O2Zvcih2YXIgZXQgaW4gWWUpWWUuaGFzT3duUHJvcGVydHkoZXQpJiYoWGVbZXRdPVhlLmJpbmQobnVsbCxZZVtldF0pKTt2YXIgdHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZS52YWx1ZSk/ZS52YWx1ZTpBcnJheShlKX0saXQ9e19TRUxGOmZ1bmN0aW9uKGUpe3JldHVybiBlfSwifiI6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIDE9PT1lLmxlbmd0aD9lWzBdOm5ldyAkKGUpfSxleHRyYWN0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dC52YWx1ZS0xLHR0KGUpW3RdfSxsZW5ndGg6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBlZSh0dChlKS5sZW5ndGgpfSxyYW5nZTpmdW5jdGlvbihlLHQsaSl7dmFyIG4scixzPTEsbz1bXTt0PyhyPXQsbj1lLnZhbHVlLGkmJihzPWkudmFsdWUpKToobj0xLHI9ZSk7Zm9yKHZhciBhPW47YTw9ci52YWx1ZTthKz1zKW8ucHVzaChuZXcgZWUoYSxyLnVuaXQpKTtyZXR1cm4gbmV3IG5lKG8pfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIGksbixyPXRoaXMscz1bXSxvPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdT9lLmV2YWwoci5jb250ZXh0KTplfTtuPSFlLnZhbHVlfHxlIGluc3RhbmNlb2YgdWU/ZS5ydWxlc2V0P28oZS5ydWxlc2V0KS5ydWxlczplLnJ1bGVzP2UucnVsZXMubWFwKG8pOkFycmF5LmlzQXJyYXkoZSk/ZS5tYXAobyk6W28oZSldOkFycmF5LmlzQXJyYXkoZS52YWx1ZSk/ZS52YWx1ZS5tYXAobyk6W28oZS52YWx1ZSldO3ZhciBhPSJAdmFsdWUiLGw9IkBrZXkiLGM9IkBpbmRleCI7dC5wYXJhbXM/KGE9dC5wYXJhbXNbMF0mJnQucGFyYW1zWzBdLm5hbWUsbD10LnBhcmFtc1sxXSYmdC5wYXJhbXNbMV0ubmFtZSxjPXQucGFyYW1zWzJdJiZ0LnBhcmFtc1syXS5uYW1lLHQ9dC5ydWxlcyk6dD10LnJ1bGVzZXQ7Zm9yKHZhciBoPTA7aDxuLmxlbmd0aDtoKyspe3ZhciBmPXZvaWQgMCxwPXZvaWQgMCx2PW5baF07diBpbnN0YW5jZW9mIEQ/KGY9InN0cmluZyI9PXR5cGVvZiB2Lm5hbWU/di5uYW1lOnYubmFtZVswXS52YWx1ZSxwPXYudmFsdWUpOihmPW5ldyBlZShoKzEpLHA9diksdiBpbnN0YW5jZW9mIFV8fChpPXQucnVsZXMuc2xpY2UoMCksYSYmaS5wdXNoKG5ldyBEKGEscCwhMSwhMSx0aGlzLmluZGV4LHRoaXMuY3VycmVudEZpbGVJbmZvKSksYyYmaS5wdXNoKG5ldyBEKGMsbmV3IGVlKGgrMSksITEsITEsdGhpcy5pbmRleCx0aGlzLmN1cnJlbnRGaWxlSW5mbykpLGwmJmkucHVzaChuZXcgRChsLGYsITEsITEsdGhpcy5pbmRleCx0aGlzLmN1cnJlbnRGaWxlSW5mbykpLHMucHVzaChuZXcgSyhbbmV3IEYoW25ldyBtKCIiLCImIildKV0saSx0LnN0cmljdEltcG9ydHMsdC52aXNpYmlsaXR5SW5mbygpKSkpfXJldHVybiBuZXcgSyhbbmV3IEYoW25ldyBtKCIiLCImIildKV0scyx0LnN0cmljdEltcG9ydHMsdC52aXNpYmlsaXR5SW5mbygpKS5ldmFsKHRoaXMuY29udGV4dCl9fSxudD1mdW5jdGlvbihlLHQsaSl7aWYoIShpIGluc3RhbmNlb2YgZWUpKXRocm93e3R5cGU6IkFyZ3VtZW50IixtZXNzYWdlOiJhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIn07cmV0dXJuIG51bGw9PXQ/dD1pLnVuaXQ6aT1pLnVuaWZ5KCksbmV3IGVlKGUocGFyc2VGbG9hdChpLnZhbHVlKSksdCl9LHJ0PXtjZWlsOm51bGwsZmxvb3I6bnVsbCxzcXJ0Om51bGwsYWJzOm51bGwsdGFuOiIiLHNpbjoiIixjb3M6IiIsYXRhbjoicmFkIixhc2luOiJyYWQiLGFjb3M6InJhZCJ9O2Zvcih2YXIgc3QgaW4gcnQpcnQuaGFzT3duUHJvcGVydHkoc3QpJiYocnRbc3RdPW50LmJpbmQobnVsbCxNYXRoW3N0XSxydFtzdF0pKTtydC5yb3VuZD1mdW5jdGlvbihlLHQpe3ZhciBpPXZvaWQgMD09PXQ/MDp0LnZhbHVlO3JldHVybiBudCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9GaXhlZChpKX0pLG51bGwsZSl9O3ZhciBvdD1mdW5jdGlvbihlLHQpe3N3aXRjaCgodD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KSkubGVuZ3RoKXtjYXNlIDA6dGhyb3d7dHlwZToiQXJndW1lbnQiLG1lc3NhZ2U6Im9uZSBvciBtb3JlIGFyZ3VtZW50cyByZXF1aXJlZCJ9fXZhciBpLG4scixzLG8sYSxsLHUsYz1bXSxoPXt9O2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspaWYoKHI9dFtpXSlpbnN0YW5jZW9mIGVlKWlmKGw9IiIhPT0oYT0iIj09PShzPSIiPT09ci51bml0LnRvU3RyaW5nKCkmJnZvaWQgMCE9PXU/bmV3IGVlKHIudmFsdWUsdSkudW5pZnkoKTpyLnVuaWZ5KCkpLnVuaXQudG9TdHJpbmcoKSYmdm9pZCAwIT09bD9sOnMudW5pdC50b1N0cmluZygpKSYmdm9pZCAwPT09bHx8IiIhPT1hJiYiIj09PWNbMF0udW5pZnkoKS51bml0LnRvU3RyaW5nKCk/YTpsLHU9IiIhPT1hJiZ2b2lkIDA9PT11P3IudW5pdC50b1N0cmluZygpOnUsdm9pZCAwIT09KG49dm9pZCAwIT09aFsiIl0mJiIiIT09YSYmYT09PWw/aFsiIl06aFthXSkpbz0iIj09PWNbbl0udW5pdC50b1N0cmluZygpJiZ2b2lkIDAhPT11P25ldyBlZShjW25dLnZhbHVlLHUpLnVuaWZ5KCk6Y1tuXS51bmlmeSgpLChlJiZzLnZhbHVlPG8udmFsdWV8fCFlJiZzLnZhbHVlPm8udmFsdWUpJiYoY1tuXT1yKTtlbHNle2lmKHZvaWQgMCE9PWwmJmEhPT1sKXRocm93e3R5cGU6IkFyZ3VtZW50IixtZXNzYWdlOiJpbmNvbXBhdGlibGUgdHlwZXMifTtoW2FdPWMubGVuZ3RoLGMucHVzaChyKX1lbHNlIEFycmF5LmlzQXJyYXkodFtpXS52YWx1ZSkmJkFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHQsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodFtpXS52YWx1ZSkpO3JldHVybiAxPT1jLmxlbmd0aD9jWzBdOih0PWMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS50b0NTUyh0aGlzLmNvbnRleHQpfSkpLmpvaW4odGhpcy5jb250ZXh0LmNvbXByZXNzPyIsIjoiLCAiKSxuZXcgaigoZT8ibWluIjoibWF4IikrIigiK3QrIikiKSl9LGF0PXttaW46ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF07dHJ5e3JldHVybiBvdCghMCxlKX1jYXRjaChlKXt9fSxtYXg6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF07dHJ5e3JldHVybiBvdCghMSxlKX1jYXRjaChlKXt9fSxjb252ZXJ0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29udmVydFRvKHQudmFsdWUpfSxwaTpmdW5jdGlvbigpe3JldHVybiBuZXcgZWUoTWF0aC5QSSl9LG1vZDpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgZWUoZS52YWx1ZSV0LnZhbHVlLGUudW5pdCl9LHBvdzpmdW5jdGlvbihlLHQpe2lmKCJudW1iZXIiPT10eXBlb2YgZSYmIm51bWJlciI9PXR5cGVvZiB0KWU9bmV3IGVlKGUpLHQ9bmV3IGVlKHQpO2Vsc2UgaWYoIShlIGluc3RhbmNlb2YgZWUmJnQgaW5zdGFuY2VvZiBlZSkpdGhyb3d7dHlwZToiQXJndW1lbnQiLG1lc3NhZ2U6ImFyZ3VtZW50cyBtdXN0IGJlIG51bWJlcnMifTtyZXR1cm4gbmV3IGVlKE1hdGgucG93KGUudmFsdWUsdC52YWx1ZSksZS51bml0KX0scGVyY2VudGFnZTpmdW5jdGlvbihlKXtyZXR1cm4gbnQoKGZ1bmN0aW9uKGUpe3JldHVybiAxMDAqZX0pLCIlIixlKX19LGx0PXtlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdWUoJyInLGUgaW5zdGFuY2VvZiB2ZT9lLmV2YWx1YXRlZDplLnZhbHVlLCEwKX0sZXNjYXBlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgaihlbmNvZGVVUkkoZS52YWx1ZSkucmVwbGFjZSgvPS9nLCIlM0QiKS5yZXBsYWNlKC86L2csIiUzQSIpLnJlcGxhY2UoLyMvZywiJTIzIikucmVwbGFjZSgvOy9nLCIlM0IiKS5yZXBsYWNlKC9cKC9nLCIlMjgiKS5yZXBsYWNlKC9cKS9nLCIlMjkiKSl9LHJlcGxhY2U6ZnVuY3Rpb24oZSx0LGksbil7dmFyIHI9ZS52YWx1ZTtyZXR1cm4gaT0iUXVvdGVkIj09PWkudHlwZT9pLnZhbHVlOmkudG9DU1MoKSxyPXIucmVwbGFjZShuZXcgUmVnRXhwKHQudmFsdWUsbj9uLnZhbHVlOiIiKSxpKSxuZXcgdWUoZS5xdW90ZXx8IiIscixlLmVzY2FwZWQpfSwiJSI6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxpPWUudmFsdWUsbj1mdW5jdGlvbihlKXtpPWkucmVwbGFjZSgvJVtzZGFdL2ksKGZ1bmN0aW9uKGkpe3ZhciBuPSJRdW90ZWQiPT09dFtlXS50eXBlJiZpLm1hdGNoKC9zL2kpP3RbZV0udmFsdWU6dFtlXS50b0NTUygpO3JldHVybiBpLm1hdGNoKC9bQS1aXSQvKT9lbmNvZGVVUklDb21wb25lbnQobik6bn0pKX0scj0wO3I8dC5sZW5ndGg7cisrKW4ocik7cmV0dXJuIGk9aS5yZXBsYWNlKC8lJS9nLCIlIiksbmV3IHVlKGUucXVvdGV8fCIiLGksZS5lc2NhcGVkKX19LHV0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiB0P0wuVHJ1ZTpMLkZhbHNlfSxjdD1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQpdGhyb3d7dHlwZToiQXJndW1lbnQiLG1lc3NhZ2U6Im1pc3NpbmcgdGhlIHJlcXVpcmVkIHNlY29uZCBhcmd1bWVudCB0byBpc3VuaXQuIn07aWYoInN0cmluZyIhPXR5cGVvZih0PSJzdHJpbmciPT10eXBlb2YgdC52YWx1ZT90LnZhbHVlOnQpKXRocm93e3R5cGU6IkFyZ3VtZW50IixtZXNzYWdlOiJTZWNvbmQgYXJndW1lbnQgdG8gaXN1bml0IHNob3VsZCBiZSBhIHVuaXQgb3IgYSBzdHJpbmcuIn07cmV0dXJuIGUgaW5zdGFuY2VvZiBlZSYmZS51bml0LmlzKHQpP0wuVHJ1ZTpMLkZhbHNlfSxodD17aXNydWxlc2V0OmZ1bmN0aW9uKGUpe3JldHVybiB1dChlLFgpfSxpc2NvbG9yOmZ1bmN0aW9uKGUpe3JldHVybiB1dChlLGMpfSxpc251bWJlcjpmdW5jdGlvbihlKXtyZXR1cm4gdXQoZSxlZSl9LGlzc3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiB1dChlLHVlKX0saXNrZXl3b3JkOmZ1bmN0aW9uKGUpe3JldHVybiB1dChlLEwpfSxpc3VybDpmdW5jdGlvbihlKXtyZXR1cm4gdXQoZSxjZSl9LGlzcGl4ZWw6ZnVuY3Rpb24oZSl7cmV0dXJuIGN0KGUsInB4Iil9LGlzcGVyY2VudGFnZTpmdW5jdGlvbihlKXtyZXR1cm4gY3QoZSwiJSIpfSxpc2VtOmZ1bmN0aW9uKGUpe3JldHVybiBjdChlLCJlbSIpfSxpc3VuaXQ6Y3QsdW5pdDpmdW5jdGlvbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIGVlKSl0aHJvd3t0eXBlOiJBcmd1bWVudCIsbWVzc2FnZToidGhlIGZpcnN0IGFyZ3VtZW50IHRvIHVuaXQgbXVzdCBiZSBhIG51bWJlciIrKGUgaW5zdGFuY2VvZiBpZT8iLiBIYXZlIHlvdSBmb3Jnb3R0ZW4gcGFyZW50aGVzaXM/IjoiIil9O3JldHVybiB0PXQ/dCBpbnN0YW5jZW9mIEw/dC52YWx1ZTp0LnRvQ1NTKCk6IiIsbmV3IGVlKGUudmFsdWUsdCl9LCJnZXQtdW5pdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBqKGUudW5pdCl9fSxmdD1mdW5jdGlvbihlKXt2YXIgdD17ZnVuY3Rpb25SZWdpc3RyeTpILGZ1bmN0aW9uQ2FsbGVyOnJlfTtyZXR1cm4gSC5hZGRNdWx0aXBsZShHZSksSC5hZGQoImRlZmF1bHQiLFEuZXZhbC5iaW5kKFEpKSxILmFkZE11bHRpcGxlKFplKSxILmFkZE11bHRpcGxlKFhlKSxILmFkZE11bHRpcGxlKGZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBjZSh0LGUuaW5kZXgsZS5jdXJyZW50RmlsZUluZm8pLmV2YWwoZS5jb250ZXh0KX07cmV0dXJueyJkYXRhLXVyaSI6ZnVuY3Rpb24oaSxuKXtufHwobj1pLGk9bnVsbCk7dmFyIHM9aSYmaS52YWx1ZSxvPW4udmFsdWUsYT10aGlzLmN1cnJlbnRGaWxlSW5mbyxsPWEucmV3cml0ZVVybHM/YS5jdXJyZW50RGlyZWN0b3J5OmEuZW50cnlQYXRoLHU9by5pbmRleE9mKCIjIiksYz0iIjstMSE9PXUmJihjPW8uc2xpY2UodSksbz1vLnNsaWNlKDAsdSkpO3ZhciBoPV8odGhpcy5jb250ZXh0KTtoLnJhd0J1ZmZlcj0hMDt2YXIgZj1lLmdldEZpbGVNYW5hZ2VyKG8sbCxoLGUsITApO2lmKCFmKXJldHVybiB0KHRoaXMsbik7dmFyIHA9ITE7aWYoaSlwPS87YmFzZTY0JC8udGVzdChzKTtlbHNle2lmKCJpbWFnZS9zdmcreG1sIj09PShzPWUubWltZUxvb2t1cChvKSkpcD0hMTtlbHNle3ZhciB2PWUuY2hhcnNldExvb2t1cChzKTtwPVsiVVMtQVNDSUkiLCJVVEYtOCJdLmluZGV4T2Yodik8MH1wJiYocys9IjtiYXNlNjQiKX12YXIgZD1mLmxvYWRGaWxlU3luYyhvLGwsaCxlKTtpZighZC5jb250ZW50cylyZXR1cm4gci53YXJuKCJTa2lwcGVkIGRhdGEtdXJpIGVtYmVkZGluZyBvZiAiK28rIiBiZWNhdXNlIGZpbGUgbm90IGZvdW5kIiksdCh0aGlzLG58fGkpO3ZhciBtPWQuY29udGVudHM7aWYocCYmIWUuZW5jb2RlQmFzZTY0KXJldHVybiB0KHRoaXMsbik7dmFyIGc9ImRhdGE6IitzKyIsIisobT1wP2UuZW5jb2RlQmFzZTY0KG0pOmVuY29kZVVSSUNvbXBvbmVudChtKSkrYztyZXR1cm4gbmV3IGNlKG5ldyB1ZSgnIicrZysnIicsZywhMSx0aGlzLmluZGV4LHRoaXMuY3VycmVudEZpbGVJbmZvKSx0aGlzLmluZGV4LHRoaXMuY3VycmVudEZpbGVJbmZvKX19fShlKSksSC5hZGRNdWx0aXBsZShpdCksSC5hZGRNdWx0aXBsZShydCksSC5hZGRNdWx0aXBsZShhdCksSC5hZGRNdWx0aXBsZShsdCksSC5hZGRNdWx0aXBsZSh7InN2Zy1ncmFkaWVudCI6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuLHIscyxvLGEsbCx1PSJsaW5lYXIiLGg9J3g9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiJyxmPXtjb21wcmVzczohMX0scD1lLnRvQ1NTKGYpO2Z1bmN0aW9uIHYoKXt0aHJvd3t0eXBlOiJBcmd1bWVudCIsbWVzc2FnZToic3ZnLWdyYWRpZW50IGV4cGVjdHMgZGlyZWN0aW9uLCBzdGFydF9jb2xvciBbc3RhcnRfcG9zaXRpb25dLCBbY29sb3IgcG9zaXRpb24sXS4uLiwgZW5kX2NvbG9yIFtlbmRfcG9zaXRpb25dIG9yIGRpcmVjdGlvbiwgY29sb3IgbGlzdCJ9fXN3aXRjaCgyPT1hcmd1bWVudHMubGVuZ3RoPyhhcmd1bWVudHNbMV0udmFsdWUubGVuZ3RoPDImJnYoKSx0PWFyZ3VtZW50c1sxXS52YWx1ZSk6YXJndW1lbnRzLmxlbmd0aDwzP3YoKTp0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxwKXtjYXNlInRvIGJvdHRvbSI6aT0neDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiJzticmVhaztjYXNlInRvIHJpZ2h0IjppPSd4MT0iMCUiIHkxPSIwJSIgeDI9IjEwMCUiIHkyPSIwJSInO2JyZWFrO2Nhc2UidG8gYm90dG9tIHJpZ2h0IjppPSd4MT0iMCUiIHkxPSIwJSIgeDI9IjEwMCUiIHkyPSIxMDAlIic7YnJlYWs7Y2FzZSJ0byB0b3AgcmlnaHQiOmk9J3gxPSIwJSIgeTE9IjEwMCUiIHgyPSIxMDAlIiB5Mj0iMCUiJzticmVhaztjYXNlImVsbGlwc2UiOmNhc2UiZWxsaXBzZSBhdCBjZW50ZXIiOnU9InJhZGlhbCIsaT0nY3g9IjUwJSIgY3k9IjUwJSIgcj0iNzUlIicsaD0neD0iLTUwIiB5PSItNTAiIHdpZHRoPSIxMDEiIGhlaWdodD0iMTAxIic7YnJlYWs7ZGVmYXVsdDp0aHJvd3t0eXBlOiJBcmd1bWVudCIsbWVzc2FnZToic3ZnLWdyYWRpZW50IGRpcmVjdGlvbiBtdXN0IGJlICd0byBib3R0b20nLCAndG8gcmlnaHQnLCAndG8gYm90dG9tIHJpZ2h0JywgJ3RvIHRvcCByaWdodCcgb3IgJ2VsbGlwc2UgYXQgY2VudGVyJyJ9fWZvcihuPSc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDEgMSI+PCcrdSsnR3JhZGllbnQgaWQ9ImciICcraSsiPiIscj0wO3I8dC5sZW5ndGg7cis9MSl0W3JdaW5zdGFuY2VvZiBuZT8ocz10W3JdLnZhbHVlWzBdLG89dFtyXS52YWx1ZVsxXSk6KHM9dFtyXSxvPXZvaWQgMCkscyBpbnN0YW5jZW9mIGMmJigoMD09PXJ8fHIrMT09PXQubGVuZ3RoKSYmdm9pZCAwPT09b3x8byBpbnN0YW5jZW9mIGVlKXx8digpLGE9bz9vLnRvQ1NTKGYpOjA9PT1yPyIwJSI6IjEwMCUiLGw9cy5hbHBoYSxuKz0nPHN0b3Agb2Zmc2V0PSInK2ErJyIgc3RvcC1jb2xvcj0iJytzLnRvUkdCKCkrJyInKyhsPDE/JyBzdG9wLW9wYWNpdHk9IicrbCsnIic6IiIpKyIvPiI7cmV0dXJuIG4rPSI8LyIrdSsiR3JhZGllbnQ+PHJlY3QgIitoKycgZmlsbD0idXJsKCNnKSIgLz48L3N2Zz4nLG49ZW5jb2RlVVJJQ29tcG9uZW50KG4pLG5ldyBjZShuZXcgdWUoIiciKyhuPSJkYXRhOmltYWdlL3N2Zyt4bWwsIituKSsiJyIsbiwhMSx0aGlzLmluZGV4LHRoaXMuY3VycmVudEZpbGVJbmZvKSx0aGlzLmluZGV4LHRoaXMuY3VycmVudEZpbGVJbmZvKX19KSxILmFkZE11bHRpcGxlKGh0KSx0fTtmdW5jdGlvbiBwdChlLHQpe3ZhciBpLG49KHQ9dHx8e30pLnZhcmlhYmxlcyxyPW5ldyBxLkV2YWwodCk7Im9iamVjdCIhPXR5cGVvZiBufHxBcnJheS5pc0FycmF5KG4pfHwobj1PYmplY3Qua2V5cyhuKS5tYXAoKGZ1bmN0aW9uKGUpe3ZhciB0PW5bZV07cmV0dXJuIHQgaW5zdGFuY2VvZiBDZS5WYWx1ZXx8KHQgaW5zdGFuY2VvZiBDZS5FeHByZXNzaW9ufHwodD1uZXcgQ2UuRXhwcmVzc2lvbihbdF0pKSx0PW5ldyBDZS5WYWx1ZShbdF0pKSxuZXcgQ2UuRGVjbGFyYXRpb24oIkAiK2UsdCwhMSxudWxsLDApfSkpLHIuZnJhbWVzPVtuZXcgQ2UuUnVsZXNldChudWxsLG4pXSk7dmFyIHMsbyxhPVtuZXcgRGUuSm9pblNlbGVjdG9yVmlzaXRvcixuZXcgRGUuTWFya1Zpc2libGVTZWxlY3RvcnNWaXNpdG9yKCEwKSxuZXcgRGUuRXh0ZW5kVmlzaXRvcixuZXcgRGUuVG9DU1NWaXNpdG9yKHtjb21wcmVzczpCb29sZWFuKHQuY29tcHJlc3MpfSldLGw9W107aWYodC5wbHVnaW5NYW5hZ2VyKXtvPXQucGx1Z2luTWFuYWdlci52aXNpdG9yKCk7Zm9yKHZhciB1PTA7dTwyO3UrKylmb3Ioby5maXJzdCgpO3M9by5nZXQoKTspcy5pc1ByZUV2YWxWaXNpdG9yPzAhPT11JiYtMSE9PWwuaW5kZXhPZihzKXx8KGwucHVzaChzKSxzLnJ1bihlKSk6MCE9PXUmJi0xIT09YS5pbmRleE9mKHMpfHwocy5pc1ByZVZpc2l0b3I/YS51bnNoaWZ0KHMpOmEucHVzaChzKSl9aT1lLmV2YWwocik7Zm9yKHU9MDt1PGEubGVuZ3RoO3UrKylhW3VdLnJ1bihpKTtpZih0LnBsdWdpbk1hbmFnZXIpZm9yKG8uZmlyc3QoKTtzPW8uZ2V0KCk7KS0xPT09YS5pbmRleE9mKHMpJiYtMT09PWwuaW5kZXhPZihzKSYmcy5ydW4oaSk7cmV0dXJuIGl9dmFyIHZ0LGR0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLmxlc3M9ZSx0aGlzLnZpc2l0b3JzPVtdLHRoaXMucHJlUHJvY2Vzc29ycz1bXSx0aGlzLnBvc3RQcm9jZXNzb3JzPVtdLHRoaXMuaW5zdGFsbGVkUGx1Z2lucz1bXSx0aGlzLmZpbGVNYW5hZ2Vycz1bXSx0aGlzLml0ZXJhdG9yPS0xLHRoaXMucGx1Z2luQ2FjaGU9e30sdGhpcy5Mb2FkZXI9bmV3IGUuUGx1Z2luTG9hZGVyKGUpfXJldHVybiBlLnByb3RvdHlwZS5hZGRQbHVnaW5zPWZ1bmN0aW9uKGUpe2lmKGUpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy5hZGRQbHVnaW4oZVt0XSl9LGUucHJvdG90eXBlLmFkZFBsdWdpbj1mdW5jdGlvbihlLHQsaSl7dGhpcy5pbnN0YWxsZWRQbHVnaW5zLnB1c2goZSksdCYmKHRoaXMucGx1Z2luQ2FjaGVbdF09ZSksZS5pbnN0YWxsJiZlLmluc3RhbGwodGhpcy5sZXNzLHRoaXMsaXx8dGhpcy5sZXNzLmZ1bmN0aW9ucy5mdW5jdGlvblJlZ2lzdHJ5KX0sZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBsdWdpbkNhY2hlW2VdfSxlLnByb3RvdHlwZS5hZGRWaXNpdG9yPWZ1bmN0aW9uKGUpe3RoaXMudmlzaXRvcnMucHVzaChlKX0sZS5wcm90b3R5cGUuYWRkUHJlUHJvY2Vzc29yPWZ1bmN0aW9uKGUsdCl7dmFyIGk7Zm9yKGk9MDtpPHRoaXMucHJlUHJvY2Vzc29ycy5sZW5ndGgmJiEodGhpcy5wcmVQcm9jZXNzb3JzW2ldLnByaW9yaXR5Pj10KTtpKyspO3RoaXMucHJlUHJvY2Vzc29ycy5zcGxpY2UoaSwwLHtwcmVQcm9jZXNzb3I6ZSxwcmlvcml0eTp0fSl9LGUucHJvdG90eXBlLmFkZFBvc3RQcm9jZXNzb3I9ZnVuY3Rpb24oZSx0KXt2YXIgaTtmb3IoaT0wO2k8dGhpcy5wb3N0UHJvY2Vzc29ycy5sZW5ndGgmJiEodGhpcy5wb3N0UHJvY2Vzc29yc1tpXS5wcmlvcml0eT49dCk7aSsrKTt0aGlzLnBvc3RQcm9jZXNzb3JzLnNwbGljZShpLDAse3Bvc3RQcm9jZXNzb3I6ZSxwcmlvcml0eTp0fSl9LGUucHJvdG90eXBlLmFkZEZpbGVNYW5hZ2VyPWZ1bmN0aW9uKGUpe3RoaXMuZmlsZU1hbmFnZXJzLnB1c2goZSl9LGUucHJvdG90eXBlLmdldFByZVByb2Nlc3NvcnM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8dGhpcy5wcmVQcm9jZXNzb3JzLmxlbmd0aDt0KyspZS5wdXNoKHRoaXMucHJlUHJvY2Vzc29yc1t0XS5wcmVQcm9jZXNzb3IpO3JldHVybiBlfSxlLnByb3RvdHlwZS5nZXRQb3N0UHJvY2Vzc29ycz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTA7dDx0aGlzLnBvc3RQcm9jZXNzb3JzLmxlbmd0aDt0KyspZS5wdXNoKHRoaXMucG9zdFByb2Nlc3NvcnNbdF0ucG9zdFByb2Nlc3Nvcik7cmV0dXJuIGV9LGUucHJvdG90eXBlLmdldFZpc2l0b3JzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlzaXRvcnN9LGUucHJvdG90eXBlLnZpc2l0b3I9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybntmaXJzdDpmdW5jdGlvbigpe3JldHVybiBlLml0ZXJhdG9yPS0xLGUudmlzaXRvcnNbZS5pdGVyYXRvcl19LGdldDpmdW5jdGlvbigpe3JldHVybiBlLml0ZXJhdG9yKz0xLGUudmlzaXRvcnNbZS5pdGVyYXRvcl19fX0sZS5wcm90b3R5cGUuZ2V0RmlsZU1hbmFnZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsZU1hbmFnZXJzfSxlfSgpLG10PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIXQmJnZ0fHwodnQ9bmV3IGR0KGUpKSx2dH07dmFyIGd0LHl0LGJ0PWZ1bmN0aW9uKGUpe3ZhciB0PWUubWF0Y2goL152KFxkezEsMn0pXC4oXGR7MSwyfSlcLihcZHsxLDJ9KSg/Oi0oWzAtOUEtWmEtei0uXSspKT8oPzpcKyhbMC05QS1aYS16LS5dKykpPyQvKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBwYXJzZTogIitlKTtyZXR1cm57bWFqb3I6cGFyc2VJbnQodFsxXSwxMCksbWlub3I6cGFyc2VJbnQodFsyXSwxMCkscGF0Y2g6cGFyc2VJbnQodFszXSwxMCkscHJlOnRbNF18fCIiLGJ1aWxkOnRbNV18fCIifX07ZnVuY3Rpb24gd3QoZSx0KXt2YXIgaSxuLG8sYTtvPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSx0KXt0aGlzLnJvb3Q9ZSx0aGlzLmltcG9ydHM9dH1yZXR1cm4gdC5wcm90b3R5cGUudG9DU1M9ZnVuY3Rpb24odCl7dmFyIGksbixzPXt9O3RyeXtpPXB0KHRoaXMucm9vdCx0KX1jYXRjaChlKXt0aHJvdyBuZXcgTyhlLHRoaXMuaW1wb3J0cyl9dHJ5e3ZhciBvPUJvb2xlYW4odC5jb21wcmVzcyk7byYmci53YXJuKCJUaGUgY29tcHJlc3Mgb3B0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB5b3UgdXNlIGEgZGVkaWNhdGVkIGNzcyBtaW5pZmllciwgZm9yIGluc3RhbmNlIHNlZSBsZXNzLXBsdWdpbi1jbGVhbi1jc3MuIik7dmFyIGE9e2NvbXByZXNzOm8sZHVtcExpbmVOdW1iZXJzOnQuZHVtcExpbmVOdW1iZXJzLHN0cmljdFVuaXRzOkJvb2xlYW4odC5zdHJpY3RVbml0cyksbnVtUHJlY2lzaW9uOjh9O3Quc291cmNlTWFwPyhuPW5ldyBlKHQuc291cmNlTWFwKSxzLmNzcz1uLnRvQ1NTKGksYSx0aGlzLmltcG9ydHMpKTpzLmNzcz1pLnRvQ1NTKGEpfWNhdGNoKGUpe3Rocm93IG5ldyBPKGUsdGhpcy5pbXBvcnRzKX1pZih0LnBsdWdpbk1hbmFnZXIpZm9yKHZhciBsPXQucGx1Z2luTWFuYWdlci5nZXRQb3N0UHJvY2Vzc29ycygpLHU9MDt1PGwubGVuZ3RoO3UrKylzLmNzcz1sW3VdLnByb2Nlc3Mocy5jc3Mse3NvdXJjZU1hcDpuLG9wdGlvbnM6dCxpbXBvcnRzOnRoaXMuaW1wb3J0c30pO2Zvcih2YXIgYyBpbiB0LnNvdXJjZU1hcCYmKHMubWFwPW4uZ2V0RXh0ZXJuYWxTb3VyY2VNYXAoKSkscy5pbXBvcnRzPVtdLHRoaXMuaW1wb3J0cy5maWxlcyl0aGlzLmltcG9ydHMuZmlsZXMuaGFzT3duUHJvcGVydHkoYykmJmMhPT10aGlzLmltcG9ydHMucm9vdEZpbGVuYW1lJiZzLmltcG9ydHMucHVzaChjKTtyZXR1cm4gc30sdH0oKX0obj1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIGkoZSl7dGhpcy5vcHRpb25zPWV9cmV0dXJuIGkucHJvdG90eXBlLnRvQ1NTPWZ1bmN0aW9uKHQsaSxuKXt2YXIgcj1uZXcgZSh7Y29udGVudHNJZ25vcmVkQ2hhcnNNYXA6bi5jb250ZW50c0lnbm9yZWRDaGFycyxyb290Tm9kZTp0LGNvbnRlbnRzTWFwOm4uY29udGVudHMsc291cmNlTWFwRmlsZW5hbWU6dGhpcy5vcHRpb25zLnNvdXJjZU1hcEZpbGVuYW1lLHNvdXJjZU1hcFVSTDp0aGlzLm9wdGlvbnMuc291cmNlTWFwVVJMLG91dHB1dEZpbGVuYW1lOnRoaXMub3B0aW9ucy5zb3VyY2VNYXBPdXRwdXRGaWxlbmFtZSxzb3VyY2VNYXBCYXNlcGF0aDp0aGlzLm9wdGlvbnMuc291cmNlTWFwQmFzZXBhdGgsc291cmNlTWFwUm9vdHBhdGg6dGhpcy5vcHRpb25zLnNvdXJjZU1hcFJvb3RwYXRoLG91dHB1dFNvdXJjZUZpbGVzOnRoaXMub3B0aW9ucy5vdXRwdXRTb3VyY2VGaWxlcyxzb3VyY2VNYXBHZW5lcmF0b3I6dGhpcy5vcHRpb25zLnNvdXJjZU1hcEdlbmVyYXRvcixzb3VyY2VNYXBGaWxlSW5saW5lOnRoaXMub3B0aW9ucy5zb3VyY2VNYXBGaWxlSW5saW5lLGRpc2FibGVTb3VyY2VtYXBBbm5vdGF0aW9uOnRoaXMub3B0aW9ucy5kaXNhYmxlU291cmNlbWFwQW5ub3RhdGlvbn0pLHM9ci50b0NTUyhpKTtyZXR1cm4gdGhpcy5zb3VyY2VNYXA9ci5zb3VyY2VNYXAsdGhpcy5zb3VyY2VNYXBVUkw9ci5zb3VyY2VNYXBVUkwsdGhpcy5vcHRpb25zLnNvdXJjZU1hcElucHV0RmlsZW5hbWUmJih0aGlzLnNvdXJjZU1hcElucHV0RmlsZW5hbWU9ci5ub3JtYWxpemVGaWxlbmFtZSh0aGlzLm9wdGlvbnMuc291cmNlTWFwSW5wdXRGaWxlbmFtZSkpLHZvaWQgMCE9PXRoaXMub3B0aW9ucy5zb3VyY2VNYXBCYXNlcGF0aCYmdm9pZCAwIT09dGhpcy5zb3VyY2VNYXBVUkwmJih0aGlzLnNvdXJjZU1hcFVSTD1yLnJlbW92ZUJhc2VwYXRoKHRoaXMuc291cmNlTWFwVVJMKSkscyt0aGlzLmdldENTU0FwcGVuZGFnZSgpfSxpLnByb3RvdHlwZS5nZXRDU1NBcHBlbmRhZ2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNvdXJjZU1hcFVSTDtpZih0aGlzLm9wdGlvbnMuc291cmNlTWFwRmlsZUlubGluZSl7aWYodm9pZCAwPT09dGhpcy5zb3VyY2VNYXApcmV0dXJuIiI7ZT0iZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCwiK3QuZW5jb2RlQmFzZTY0KHRoaXMuc291cmNlTWFwKX1yZXR1cm4gdGhpcy5vcHRpb25zLmRpc2FibGVTb3VyY2VtYXBBbm5vdGF0aW9uPyIiOmU/Ii8qIyBzb3VyY2VNYXBwaW5nVVJMPSIrZSsiICovIjoiIn0saS5wcm90b3R5cGUuZ2V0RXh0ZXJuYWxTb3VyY2VNYXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb3VyY2VNYXB9LGkucHJvdG90eXBlLnNldEV4dGVybmFsU291cmNlTWFwPWZ1bmN0aW9uKGUpe3RoaXMuc291cmNlTWFwPWV9LGkucHJvdG90eXBlLmlzSW5saW5lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5zb3VyY2VNYXBGaWxlSW5saW5lfSxpLnByb3RvdHlwZS5nZXRTb3VyY2VNYXBVUkw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb3VyY2VNYXBVUkx9LGkucHJvdG90eXBlLmdldE91dHB1dEZpbGVuYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5zb3VyY2VNYXBPdXRwdXRGaWxlbmFtZX0saS5wcm90b3R5cGUuZ2V0SW5wdXRGaWxlbmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNvdXJjZU1hcElucHV0RmlsZW5hbWV9LGl9KCl9KGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9jc3M9W10sdGhpcy5fcm9vdE5vZGU9dC5yb290Tm9kZSx0aGlzLl9jb250ZW50c01hcD10LmNvbnRlbnRzTWFwLHRoaXMuX2NvbnRlbnRzSWdub3JlZENoYXJzTWFwPXQuY29udGVudHNJZ25vcmVkQ2hhcnNNYXAsdC5zb3VyY2VNYXBGaWxlbmFtZSYmKHRoaXMuX3NvdXJjZU1hcEZpbGVuYW1lPXQuc291cmNlTWFwRmlsZW5hbWUucmVwbGFjZSgvXFwvZywiLyIpKSx0aGlzLl9vdXRwdXRGaWxlbmFtZT10Lm91dHB1dEZpbGVuYW1lLHRoaXMuc291cmNlTWFwVVJMPXQuc291cmNlTWFwVVJMLHQuc291cmNlTWFwQmFzZXBhdGgmJih0aGlzLl9zb3VyY2VNYXBCYXNlcGF0aD10LnNvdXJjZU1hcEJhc2VwYXRoLnJlcGxhY2UoL1xcL2csIi8iKSksdC5zb3VyY2VNYXBSb290cGF0aD8odGhpcy5fc291cmNlTWFwUm9vdHBhdGg9dC5zb3VyY2VNYXBSb290cGF0aC5yZXBsYWNlKC9cXC9nLCIvIiksIi8iIT09dGhpcy5fc291cmNlTWFwUm9vdHBhdGguY2hhckF0KHRoaXMuX3NvdXJjZU1hcFJvb3RwYXRoLmxlbmd0aC0xKSYmKHRoaXMuX3NvdXJjZU1hcFJvb3RwYXRoKz0iLyIpKTp0aGlzLl9zb3VyY2VNYXBSb290cGF0aD0iIix0aGlzLl9vdXRwdXRTb3VyY2VGaWxlcz10Lm91dHB1dFNvdXJjZUZpbGVzLHRoaXMuX3NvdXJjZU1hcEdlbmVyYXRvckNvbnN0cnVjdG9yPWUuZ2V0U291cmNlTWFwR2VuZXJhdG9yKCksdGhpcy5fbGluZU51bWJlcj0wLHRoaXMuX2NvbHVtbj0wfXJldHVybiB0LnByb3RvdHlwZS5yZW1vdmVCYXNlcGF0aD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc291cmNlTWFwQmFzZXBhdGgmJjA9PT1lLmluZGV4T2YodGhpcy5fc291cmNlTWFwQmFzZXBhdGgpJiYoIlxcIiE9PShlPWUuc3Vic3RyaW5nKHRoaXMuX3NvdXJjZU1hcEJhc2VwYXRoLmxlbmd0aCkpLmNoYXJBdCgwKSYmIi8iIT09ZS5jaGFyQXQoMCl8fChlPWUuc3Vic3RyaW5nKDEpKSksZX0sdC5wcm90b3R5cGUubm9ybWFsaXplRmlsZW5hbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5yZXBsYWNlKC9cXC9nLCIvIiksZT10aGlzLnJlbW92ZUJhc2VwYXRoKGUpLCh0aGlzLl9zb3VyY2VNYXBSb290cGF0aHx8IiIpK2V9LHQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLHQsaSxuKXtpZihlKXt2YXIgcixzLG8sYSxsO2lmKHQmJnQuZmlsZW5hbWUpe3ZhciB1PXRoaXMuX2NvbnRlbnRzTWFwW3QuZmlsZW5hbWVdO2lmKHRoaXMuX2NvbnRlbnRzSWdub3JlZENoYXJzTWFwW3QuZmlsZW5hbWVdJiYoKGktPXRoaXMuX2NvbnRlbnRzSWdub3JlZENoYXJzTWFwW3QuZmlsZW5hbWVdKTwwJiYoaT0wKSx1PXUuc2xpY2UodGhpcy5fY29udGVudHNJZ25vcmVkQ2hhcnNNYXBbdC5maWxlbmFtZV0pKSx2b2lkIDA9PT11KXJldHVybiB2b2lkIHRoaXMuX2Nzcy5wdXNoKGUpO2E9KHM9KHU9dS5zdWJzdHJpbmcoMCxpKSkuc3BsaXQoIlxuIikpW3MubGVuZ3RoLTFdfWlmKG89KHI9ZS5zcGxpdCgiXG4iKSlbci5sZW5ndGgtMV0sdCYmdC5maWxlbmFtZSlpZihuKWZvcihsPTA7bDxyLmxlbmd0aDtsKyspdGhpcy5fc291cmNlTWFwR2VuZXJhdG9yLmFkZE1hcHBpbmcoe2dlbmVyYXRlZDp7bGluZTp0aGlzLl9saW5lTnVtYmVyK2wrMSxjb2x1bW46MD09PWw/dGhpcy5fY29sdW1uOjB9LG9yaWdpbmFsOntsaW5lOnMubGVuZ3RoK2wsY29sdW1uOjA9PT1sP2EubGVuZ3RoOjB9LHNvdXJjZTp0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKHQuZmlsZW5hbWUpfSk7ZWxzZSB0aGlzLl9zb3VyY2VNYXBHZW5lcmF0b3IuYWRkTWFwcGluZyh7Z2VuZXJhdGVkOntsaW5lOnRoaXMuX2xpbmVOdW1iZXIrMSxjb2x1bW46dGhpcy5fY29sdW1ufSxvcmlnaW5hbDp7bGluZTpzLmxlbmd0aCxjb2x1bW46YS5sZW5ndGh9LHNvdXJjZTp0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKHQuZmlsZW5hbWUpfSk7MT09PXIubGVuZ3RoP3RoaXMuX2NvbHVtbis9by5sZW5ndGg6KHRoaXMuX2xpbmVOdW1iZXIrPXIubGVuZ3RoLTEsdGhpcy5fY29sdW1uPW8ubGVuZ3RoKSx0aGlzLl9jc3MucHVzaChlKX19LHQucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuX2Nzcy5sZW5ndGh9LHQucHJvdG90eXBlLnRvQ1NTPWZ1bmN0aW9uKGUpe2lmKHRoaXMuX3NvdXJjZU1hcEdlbmVyYXRvcj1uZXcgdGhpcy5fc291cmNlTWFwR2VuZXJhdG9yQ29uc3RydWN0b3Ioe2ZpbGU6dGhpcy5fb3V0cHV0RmlsZW5hbWUsc291cmNlUm9vdDpudWxsfSksdGhpcy5fb3V0cHV0U291cmNlRmlsZXMpZm9yKHZhciB0IGluIHRoaXMuX2NvbnRlbnRzTWFwKWlmKHRoaXMuX2NvbnRlbnRzTWFwLmhhc093blByb3BlcnR5KHQpKXt2YXIgaT10aGlzLl9jb250ZW50c01hcFt0XTt0aGlzLl9jb250ZW50c0lnbm9yZWRDaGFyc01hcFt0XSYmKGk9aS5zbGljZSh0aGlzLl9jb250ZW50c0lnbm9yZWRDaGFyc01hcFt0XSkpLHRoaXMuX3NvdXJjZU1hcEdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHRoaXMubm9ybWFsaXplRmlsZW5hbWUodCksaSl9aWYodGhpcy5fcm9vdE5vZGUuZ2VuQ1NTKGUsdGhpcyksdGhpcy5fY3NzLmxlbmd0aD4wKXt2YXIgbj12b2lkIDAscj1KU09OLnN0cmluZ2lmeSh0aGlzLl9zb3VyY2VNYXBHZW5lcmF0b3IudG9KU09OKCkpO3RoaXMuc291cmNlTWFwVVJMP249dGhpcy5zb3VyY2VNYXBVUkw6dGhpcy5fc291cmNlTWFwRmlsZW5hbWUmJihuPXRoaXMuX3NvdXJjZU1hcEZpbGVuYW1lKSx0aGlzLnNvdXJjZU1hcFVSTD1uLHRoaXMuc291cmNlTWFwPXJ9cmV0dXJuIHRoaXMuX2Nzcy5qb2luKCIiKX0sdH0oKX0oZT1uZXcgcyhlLHQpKSxlKSksYT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsdCxpKXt0aGlzLmxlc3M9ZSx0aGlzLnJvb3RGaWxlbmFtZT1pLmZpbGVuYW1lLHRoaXMucGF0aHM9dC5wYXRoc3x8W10sdGhpcy5jb250ZW50cz17fSx0aGlzLmNvbnRlbnRzSWdub3JlZENoYXJzPXt9LHRoaXMubWltZT10Lm1pbWUsdGhpcy5lcnJvcj1udWxsLHRoaXMuY29udGV4dD10LHRoaXMucXVldWU9W10sdGhpcy5maWxlcz17fX1yZXR1cm4gdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGksbixzLG8pe3ZhciBhPXRoaXMsbD10aGlzLmNvbnRleHQucGx1Z2luTWFuYWdlci5Mb2FkZXI7dGhpcy5xdWV1ZS5wdXNoKHQpO3ZhciB1PWZ1bmN0aW9uKGUsaSxuKXthLnF1ZXVlLnNwbGljZShhLnF1ZXVlLmluZGV4T2YodCksMSk7dmFyIGw9bj09PWEucm9vdEZpbGVuYW1lO3Mub3B0aW9uYWwmJmU/KG8obnVsbCx7cnVsZXM6W119LCExLG51bGwpLHIuaW5mbygiVGhlIGZpbGUgIituKyIgd2FzIHNraXBwZWQgYmVjYXVzZSBpdCB3YXMgbm90IGZvdW5kIGFuZCB0aGUgaW1wb3J0IHdhcyBtYXJrZWQgb3B0aW9uYWwuIikpOihhLmZpbGVzW25dfHxzLmlubGluZXx8KGEuZmlsZXNbbl09e3Jvb3Q6aSxvcHRpb25zOnN9KSxlJiYhYS5lcnJvciYmKGEuZXJyb3I9ZSksbyhlLGksbCxuKSl9LGM9e3Jld3JpdGVVcmxzOnRoaXMuY29udGV4dC5yZXdyaXRlVXJscyxlbnRyeVBhdGg6bi5lbnRyeVBhdGgscm9vdHBhdGg6bi5yb290cGF0aCxyb290RmlsZW5hbWU6bi5yb290RmlsZW5hbWV9LGg9ZS5nZXRGaWxlTWFuYWdlcih0LG4uY3VycmVudERpcmVjdG9yeSx0aGlzLmNvbnRleHQsZSk7aWYoaCl7dmFyIGYscCx2PWZ1bmN0aW9uKGUpe3ZhciB0LGk9ZS5maWxlbmFtZSxyPWUuY29udGVudHMucmVwbGFjZSgvXlx1RkVGRi8sIiIpO2MuY3VycmVudERpcmVjdG9yeT1oLmdldFBhdGgoaSksYy5yZXdyaXRlVXJscyYmKGMucm9vdHBhdGg9aC5qb2luKGEuY29udGV4dC5yb290cGF0aHx8IiIsaC5wYXRoRGlmZihjLmN1cnJlbnREaXJlY3RvcnksYy5lbnRyeVBhdGgpKSwhaC5pc1BhdGhBYnNvbHV0ZShjLnJvb3RwYXRoKSYmaC5hbHdheXNNYWtlUGF0aHNBYnNvbHV0ZSgpJiYoYy5yb290cGF0aD1oLmpvaW4oYy5lbnRyeVBhdGgsYy5yb290cGF0aCkpKSxjLmZpbGVuYW1lPWk7dmFyIG89bmV3IHEuUGFyc2UoYS5jb250ZXh0KTtvLnByb2Nlc3NJbXBvcnRzPSExLGEuY29udGVudHNbaV09ciwobi5yZWZlcmVuY2V8fHMucmVmZXJlbmNlKSYmKGMucmVmZXJlbmNlPSEwKSxzLmlzUGx1Z2luPyh0PWwuZXZhbFBsdWdpbihyLG8sYSxzLnBsdWdpbkFyZ3MsYykpaW5zdGFuY2VvZiBPP3UodCxudWxsLGkpOnUobnVsbCx0LGkpOnMuaW5saW5lP3UobnVsbCxyLGkpOiFhLmZpbGVzW2ldfHxhLmZpbGVzW2ldLm9wdGlvbnMubXVsdGlwbGV8fHMubXVsdGlwbGU/bmV3IFVlKG8sYSxjKS5wYXJzZShyLChmdW5jdGlvbihlLHQpe3UoZSx0LGkpfSkpOnUobnVsbCxhLmZpbGVzW2ldLnJvb3QsaSl9LGQ9Xyh0aGlzLmNvbnRleHQpO2kmJihkLmV4dD1zLmlzUGx1Z2luPyIuanMiOiIubGVzcyIpLHMuaXNQbHVnaW4/KGQubWltZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCIsZC5zeW5jSW1wb3J0P2Y9bC5sb2FkUGx1Z2luU3luYyh0LG4uY3VycmVudERpcmVjdG9yeSxkLGUsaCk6cD1sLmxvYWRQbHVnaW4odCxuLmN1cnJlbnREaXJlY3RvcnksZCxlLGgpKTpkLnN5bmNJbXBvcnQ/Zj1oLmxvYWRGaWxlU3luYyh0LG4uY3VycmVudERpcmVjdG9yeSxkLGUpOnA9aC5sb2FkRmlsZSh0LG4uY3VycmVudERpcmVjdG9yeSxkLGUsKGZ1bmN0aW9uKGUsdCl7ZT91KGUpOnYodCl9KSksZj9mLmZpbGVuYW1lP3YoZik6dShmKTpwJiZwLnRoZW4odix1KX1lbHNlIHUoe21lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIGEgZmlsZS1tYW5hZ2VyIGZvciAiK3R9KX0sdH0oKX0oZSk7dmFyIHUsYz1mdW5jdGlvbihlLHQsaSl7dmFyIG49ZnVuY3Rpb24oZSxpLHIpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBpPyhyPWksaT1NKHRoaXMub3B0aW9ucyx7fSkpOmk9TSh0aGlzLm9wdGlvbnMsaXx8e30pLCFyKXt2YXIgcz10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxyKXtuLmNhbGwocyxlLGksKGZ1bmN0aW9uKGUsaSl7ZT9yKGUpOnQoaSl9KSl9KSl9dGhpcy5wYXJzZShlLGksKGZ1bmN0aW9uKGUsaSxuLHMpe2lmKGUpcmV0dXJuIHIoZSk7dmFyIG87dHJ5e289bmV3IHQoaSxuKS50b0NTUyhzKX1jYXRjaChlKXtyZXR1cm4gcihlKX1yKG51bGwsbyl9KSl9O3JldHVybiBufSgwLG8pLGg9ZnVuY3Rpb24oZSx0LGkpe3ZhciBuPWZ1bmN0aW9uKGUsdCxyKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdD8ocj10LHQ9TSh0aGlzLm9wdGlvbnMse30pKTp0PU0odGhpcy5vcHRpb25zLHR8fHt9KSwhcil7dmFyIHM9dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGkscil7bi5jYWxsKHMsZSx0LChmdW5jdGlvbihlLHQpe2U/cihlKTppKHQpfSkpfSkpfXZhciBvLGE9dm9pZCAwLGw9bmV3IG10KHRoaXMsIXQucmVVc2VQbHVnaW5NYW5hZ2VyKTtpZih0LnBsdWdpbk1hbmFnZXI9bCxvPW5ldyBxLlBhcnNlKHQpLHQucm9vdEZpbGVJbmZvKWE9dC5yb290RmlsZUluZm87ZWxzZXt2YXIgdT10LmZpbGVuYW1lfHwiaW5wdXQiLGM9dS5yZXBsYWNlKC9bXlwvXFxdKiQvLCIiKTsoYT17ZmlsZW5hbWU6dSxyZXdyaXRlVXJsczpvLnJld3JpdGVVcmxzLHJvb3RwYXRoOm8ucm9vdHBhdGh8fCIiLGN1cnJlbnREaXJlY3Rvcnk6YyxlbnRyeVBhdGg6Yyxyb290RmlsZW5hbWU6dX0pLnJvb3RwYXRoJiYiLyIhPT1hLnJvb3RwYXRoLnNsaWNlKC0xKSYmKGEucm9vdHBhdGgrPSIvIil9dmFyIGg9bmV3IGkodGhpcyxvLGEpO3RoaXMuaW1wb3J0TWFuYWdlcj1oLHQucGx1Z2lucyYmdC5wbHVnaW5zLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0LGk7aWYoZS5maWxlQ29udGVudCl7aWYoaT1lLmZpbGVDb250ZW50LnJlcGxhY2UoL15cdUZFRkYvLCIiKSwodD1sLkxvYWRlci5ldmFsUGx1Z2luKGksbyxoLGUub3B0aW9ucyxlLmZpbGVuYW1lKSlpbnN0YW5jZW9mIE8pcmV0dXJuIHIodCl9ZWxzZSBsLmFkZFBsdWdpbihlKX0pKSxuZXcgVWUobyxoLGEpLnBhcnNlKGUsKGZ1bmN0aW9uKGUsaSl7aWYoZSlyZXR1cm4gcihlKTtyKG51bGwsaSxoLHQpfSksdCl9O3JldHVybiBufSgwLDAsYSksZj1idCgidjQuMS4yIikscD17dmVyc2lvbjpbZi5tYWpvcixmLm1pbm9yLGYucGF0Y2hdLGRhdGE6bCx0cmVlOkNlLEVudmlyb25tZW50OnMsQWJzdHJhY3RGaWxlTWFuYWdlcjprZSxBYnN0cmFjdFBsdWdpbkxvYWRlcjpfZSxlbnZpcm9ubWVudDplLHZpc2l0b3JzOkRlLFBhcnNlcjpVZSxmdW5jdGlvbnM6ZnQoZSksY29udGV4dHM6cSxTb3VyY2VNYXBPdXRwdXQ6aSxTb3VyY2VNYXBCdWlsZGVyOm4sUGFyc2VUcmVlOm8sSW1wb3J0TWFuYWdlcjphLHJlbmRlcjpjLHBhcnNlOmgsTGVzc0Vycm9yOk8sdHJhbnNmb3JtVHJlZTpwdCx1dGlsczpQLFBsdWdpbk1hbmFnZXI6bXQsbG9nZ2VyOnJ9LHY9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSk7cmV0dXJuIGUuYXBwbHkodCxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpLHR9fSxkPU9iamVjdC5jcmVhdGUocCk7Zm9yKHZhciBtIGluIHAudHJlZSlpZigiZnVuY3Rpb24iPT10eXBlb2YodT1wLnRyZWVbbV0pKWRbbS50b0xvd2VyQ2FzZSgpXT12KHUpO2Vsc2UgZm9yKHZhciBnIGluIGRbbV09T2JqZWN0LmNyZWF0ZShudWxsKSx1KWRbbV1bZy50b0xvd2VyQ2FzZSgpXT12KHVbZ10pO3JldHVybiBwLnBhcnNlPXAucGFyc2UuYmluZChkKSxwLnJlbmRlcj1wLnJlbmRlci5iaW5kKGQpLGR9dmFyIHh0PXt9LFN0PWZ1bmN0aW9uKCl7fTtTdC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcga2Use2Fsd2F5c01ha2VQYXRoc0Fic29sdXRlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGpvaW46ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT90aGlzLmV4dHJhY3RVcmxQYXJ0cyh0LGUpLnBhdGg6dH0sZG9YSFI6ZnVuY3Rpb24oZSx0LGksbil7dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0LHM9IWd0LmlzRmlsZVByb3RvY29sfHxndC5maWxlQXN5bmM7ZnVuY3Rpb24gbyh0LGksbil7dC5zdGF0dXM+PTIwMCYmdC5zdGF0dXM8MzAwP2kodC5yZXNwb25zZVRleHQsdC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKToiZnVuY3Rpb24iPT10eXBlb2YgbiYmbih0LnN0YXR1cyxlKX0iZnVuY3Rpb24iPT10eXBlb2Ygci5vdmVycmlkZU1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUoInRleHQvY3NzIikseXQuZGVidWcoIlhIUjogR2V0dGluZyAnIitlKyInIiksci5vcGVuKCJHRVQiLGUscyksci5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLHR8fCJ0ZXh0L3gtbGVzcywgdGV4dC9jc3M7IHE9MC45LCAqLyo7IHE9MC41Iiksci5zZW5kKG51bGwpLGd0LmlzRmlsZVByb3RvY29sJiYhZ3QuZmlsZUFzeW5jPzA9PT1yLnN0YXR1c3x8ci5zdGF0dXM+PTIwMCYmci5zdGF0dXM8MzAwP2koci5yZXNwb25zZVRleHQpOm4oci5zdGF0dXMsZSk6cz9yLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PXIucmVhZHlTdGF0ZSYmbyhyLGksbil9Om8ocixpLG4pfSxzdXBwb3J0czpmdW5jdGlvbigpe3JldHVybiEwfSxjbGVhckZpbGVDYWNoZTpmdW5jdGlvbigpe3h0PXt9fSxsb2FkRmlsZTpmdW5jdGlvbihlLHQsaSxuKXt0JiYhdGhpcy5pc1BhdGhBYnNvbHV0ZShlKSYmKGU9dCtlKSxlPWkuZXh0P3RoaXMudHJ5QXBwZW5kRXh0ZW5zaW9uKGUsaS5leHQpOmUsaT1pfHx7fTt2YXIgcj10aGlzLmV4dHJhY3RVcmxQYXJ0cyhlLHdpbmRvdy5sb2NhdGlvbi5ocmVmKS51cmwscz10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSx0KXtpZihpLnVzZUZpbGVDYWNoZSYmeHRbcl0pdHJ5e3ZhciBuPXh0W3JdO3JldHVybiBlKHtjb250ZW50czpuLGZpbGVuYW1lOnIsd2ViSW5mbzp7bGFzdE1vZGlmaWVkOm5ldyBEYXRlfX0pfWNhdGNoKGUpe3JldHVybiB0KHtmaWxlbmFtZTpyLG1lc3NhZ2U6IkVycm9yIGxvYWRpbmcgZmlsZSAiK3IrIiBlcnJvciB3YXMgIitlLm1lc3NhZ2V9KX1zLmRvWEhSKHIsaS5taW1lLChmdW5jdGlvbih0LGkpe3h0W3JdPXQsZSh7Y29udGVudHM6dCxmaWxlbmFtZTpyLHdlYkluZm86e2xhc3RNb2RpZmllZDppfX0pfSksKGZ1bmN0aW9uKGUsaSl7dCh7dHlwZToiRmlsZSIsbWVzc2FnZToiJyIraSsiJyB3YXNuJ3QgZm91bmQgKCIrZSsiKSIsaHJlZjpyfSl9KSl9KSl9fSk7dmFyIEl0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGd0PWUseXQ9dCxTdH0sQ3Q9ZnVuY3Rpb24oZSl7dGhpcy5sZXNzPWV9O0N0LnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyBfZSx7bG9hZFBsdWdpbjpmdW5jdGlvbihlLHQsaSxuLHIpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocyxvKXtyLmxvYWRGaWxlKGUsdCxpLG4pLnRoZW4ocykuY2F0Y2gobyl9KSl9fSk7dmFyIGt0PWZ1bmN0aW9uKHQsbixyKXtyZXR1cm57YWRkOmZ1bmN0aW9uKHMsbyl7ci5lcnJvclJlcG9ydGluZyYmImh0bWwiIT09ci5lcnJvclJlcG9ydGluZz8iY29uc29sZSI9PT1yLmVycm9yUmVwb3J0aW5nP2Z1bmN0aW9uKGUsdCl7dmFyIGk9ZS5maWxlbmFtZXx8dCxzPVtdLG89KGUudHlwZXx8IlN5bnRheCIpKyJFcnJvcjogIisoZS5tZXNzYWdlfHwiVGhlcmUgaXMgYW4gZXJyb3IgaW4geW91ciAubGVzcyBmaWxlIikrIiBpbiAiK2ksYT1mdW5jdGlvbihlLHQsaSl7dm9pZCAwIT09ZS5leHRyYWN0W3RdJiZzLnB1c2goIntsaW5lfSB7Y29udGVudH0iLnJlcGxhY2UoL1x7bGluZVx9LywocGFyc2VJbnQoZS5saW5lLDEwKXx8MCkrKHQtMSkpLnJlcGxhY2UoL1x7Y2xhc3NcfS8saSkucmVwbGFjZSgvXHtjb250ZW50XH0vLGUuZXh0cmFjdFt0XSkpfTtlLmxpbmUmJihhKGUsMCwiIiksYShlLDEsImxpbmUiKSxhKGUsMiwiIiksbys9IiBvbiBsaW5lICIrZS5saW5lKyIsIGNvbHVtbiAiKyhlLmNvbHVtbisxKSsiOlxuIitzLmpvaW4oIlxuIikpLGUuc3RhY2smJihlLmV4dHJhY3R8fHIubG9nTGV2ZWw+PTQpJiYobys9IlxuU3RhY2sgVHJhY2VcbiIrZS5zdGFjayksbi5sb2dnZXIuZXJyb3Iobyl9KHMsbyk6ImZ1bmN0aW9uIj09dHlwZW9mIHIuZXJyb3JSZXBvcnRpbmcmJnIuZXJyb3JSZXBvcnRpbmcoImFkZCIscyxvKTpmdW5jdGlvbihuLHMpe3ZhciBvLGEsbD0ibGVzcy1lcnJvci1tZXNzYWdlOiIrZShzfHwiIiksdT10LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9W10saD1uLmZpbGVuYW1lfHxzLGY9aC5tYXRjaCgvKFteXC9dKyhcPy4qKT8pJC8pWzFdO3UuaWQ9bCx1LmNsYXNzTmFtZT0ibGVzcy1lcnJvci1tZXNzYWdlIixhPSI8aDM+Iisobi50eXBlfHwiU3ludGF4IikrIkVycm9yOiAiKyhuLm1lc3NhZ2V8fCJUaGVyZSBpcyBhbiBlcnJvciBpbiB5b3VyIC5sZXNzIGZpbGUiKSsnPC9oMz48cD5pbiA8YSBocmVmPSInK2grJyI+JytmKyI8L2E+ICI7dmFyIHA9ZnVuY3Rpb24oZSx0LGkpe3ZvaWQgMCE9PWUuZXh0cmFjdFt0XSYmYy5wdXNoKCc8bGk+PGxhYmVsPntsaW5lfTwvbGFiZWw+PHByZSBjbGFzcz0ie2NsYXNzfSI+e2NvbnRlbnR9PC9wcmU+PC9saT4nLnJlcGxhY2UoL1x7bGluZVx9LywocGFyc2VJbnQoZS5saW5lLDEwKXx8MCkrKHQtMSkpLnJlcGxhY2UoL1x7Y2xhc3NcfS8saSkucmVwbGFjZSgvXHtjb250ZW50XH0vLGUuZXh0cmFjdFt0XSkpfTtuLmxpbmUmJihwKG4sMCwiIikscChuLDEsImxpbmUiKSxwKG4sMiwiIiksYSs9Im9uIGxpbmUgIituLmxpbmUrIiwgY29sdW1uICIrKG4uY29sdW1uKzEpKyI6PC9wPjx1bD4iK2Muam9pbigiIikrIjwvdWw+Iiksbi5zdGFjayYmKG4uZXh0cmFjdHx8ci5sb2dMZXZlbD49NCkmJihhKz0iPGJyLz5TdGFjayBUcmFjZTwvYnIgLz4iK24uc3RhY2suc3BsaXQoIlxuIikuc2xpY2UoMSkuam9pbigiPGJyLz4iKSksdS5pbm5lckhUTUw9YSxpKHQuZG9jdW1lbnQsWyIubGVzcy1lcnJvci1tZXNzYWdlIHVsLCAubGVzcy1lcnJvci1tZXNzYWdlIGxpIHsiLCJsaXN0LXN0eWxlLXR5cGU6IG5vbmU7IiwibWFyZ2luLXJpZ2h0OiAxNXB4OyIsInBhZGRpbmc6IDRweCAwOyIsIm1hcmdpbjogMDsiLCJ9IiwiLmxlc3MtZXJyb3ItbWVzc2FnZSBsYWJlbCB7IiwiZm9udC1zaXplOiAxMnB4OyIsIm1hcmdpbi1yaWdodDogMTVweDsiLCJwYWRkaW5nOiA0cHggMDsiLCJjb2xvcjogI2NjNzc3NzsiLCJ9IiwiLmxlc3MtZXJyb3ItbWVzc2FnZSBwcmUgeyIsImNvbG9yOiAjZGQ2NjY2OyIsInBhZGRpbmc6IDRweCAwOyIsIm1hcmdpbjogMDsiLCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IiwifSIsIi5sZXNzLWVycm9yLW1lc3NhZ2UgcHJlLmxpbmUgeyIsImNvbG9yOiAjZmYwMDAwOyIsIn0iLCIubGVzcy1lcnJvci1tZXNzYWdlIGgzIHsiLCJmb250LXNpemU6IDIwcHg7IiwiZm9udC13ZWlnaHQ6IGJvbGQ7IiwicGFkZGluZzogMTVweCAwIDVweCAwOyIsIm1hcmdpbjogMDsiLCJ9IiwiLmxlc3MtZXJyb3ItbWVzc2FnZSBhIHsiLCJjb2xvcjogIzEwYSIsIn0iLCIubGVzcy1lcnJvci1tZXNzYWdlIC5lcnJvciB7IiwiY29sb3I6IHJlZDsiLCJmb250LXdlaWdodDogYm9sZDsiLCJwYWRkaW5nLWJvdHRvbTogMnB4OyIsImJvcmRlci1ib3R0b206IDFweCBkYXNoZWQgcmVkOyIsIn0iXS5qb2luKCJcbiIpLHt0aXRsZToiZXJyb3ItbWVzc2FnZSJ9KSx1LnN0eWxlLmNzc1RleHQ9WyJmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWYiLCJib3JkZXI6IDFweCBzb2xpZCAjZTAwIiwiYmFja2dyb3VuZC1jb2xvcjogI2VlZSIsImJvcmRlci1yYWRpdXM6IDVweCIsIi13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4IiwiLW1vei1ib3JkZXItcmFkaXVzOiA1cHgiLCJjb2xvcjogI2UwMCIsInBhZGRpbmc6IDE1cHgiLCJtYXJnaW4tYm90dG9tOiAxNXB4Il0uam9pbigiOyIpLCJkZXZlbG9wbWVudCI9PT1yLmVudiYmKG89c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7dmFyIGU9dC5kb2N1bWVudCxpPWUuYm9keTtpJiYoZS5nZXRFbGVtZW50QnlJZChsKT9pLnJlcGxhY2VDaGlsZCh1LGUuZ2V0RWxlbWVudEJ5SWQobCkpOmkuaW5zZXJ0QmVmb3JlKHUsaS5maXJzdENoaWxkKSxjbGVhckludGVydmFsKG8pKX0pLDEwKSl9KHMsbyl9LHJlbW92ZTpmdW5jdGlvbihpKXtyLmVycm9yUmVwb3J0aW5nJiYiaHRtbCIhPT1yLmVycm9yUmVwb3J0aW5nPyJjb25zb2xlIj09PXIuZXJyb3JSZXBvcnRpbmd8fCJmdW5jdGlvbiI9PXR5cGVvZiByLmVycm9yUmVwb3J0aW5nJiZyLmVycm9yUmVwb3J0aW5nKCJyZW1vdmUiLGkpOmZ1bmN0aW9uKGkpe3ZhciBuPXQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxlc3MtZXJyb3ItbWVzc2FnZToiK2UoaSkpO24mJm4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKX0oaSl9fX0sX3Q9e2phdmFzY3JpcHRFbmFibGVkOiExLGRlcGVuZHM6ITEsY29tcHJlc3M6ITEsbGludDohMSxwYXRoczpbXSxjb2xvcjohMCxzdHJpY3RJbXBvcnRzOiExLGluc2VjdXJlOiExLHJvb3RwYXRoOiIiLHJld3JpdGVVcmxzOiExLG1hdGg6MSxzdHJpY3RVbml0czohMSxnbG9iYWxWYXJzOm51bGwsbW9kaWZ5VmFyczpudWxsLHVybEFyZ3M6IiJ9O2lmKHdpbmRvdy5sZXNzKWZvcih2YXIgQXQgaW4gd2luZG93Lmxlc3Mpd2luZG93Lmxlc3MuaGFzT3duUHJvcGVydHkoQXQpJiYoX3RbQXRdPXdpbmRvdy5sZXNzW0F0XSk7IWZ1bmN0aW9uKGUsaSl7dChpLG4oZSkpLHZvaWQgMD09PWkuaXNGaWxlUHJvdG9jb2wmJihpLmlzRmlsZVByb3RvY29sPS9eKGZpbGV8KGNocm9tZXxzYWZhcmkpKC1leHRlbnNpb24pP3xyZXNvdXJjZXxxcmN8YXBwKTovLnRlc3QoZS5sb2NhdGlvbi5wcm90b2NvbCkpLGkuYXN5bmM9aS5hc3luY3x8ITEsaS5maWxlQXN5bmM9aS5maWxlQXN5bmN8fCExLGkucG9sbD1pLnBvbGx8fChpLmlzRmlsZVByb3RvY29sPzFlMzoxNTAwKSxpLmVudj1pLmVudnx8KCIxMjcuMC4wLjEiPT1lLmxvY2F0aW9uLmhvc3RuYW1lfHwiMC4wLjAuMCI9PWUubG9jYXRpb24uaG9zdG5hbWV8fCJsb2NhbGhvc3QiPT1lLmxvY2F0aW9uLmhvc3RuYW1lfHxlLmxvY2F0aW9uLnBvcnQmJmUubG9jYXRpb24ucG9ydC5sZW5ndGg+MHx8aS5pc0ZpbGVQcm90b2NvbD8iZGV2ZWxvcG1lbnQiOiJwcm9kdWN0aW9uIik7dmFyIHI9LyFkdW1wTGluZU51bWJlcnM6KGNvbW1lbnRzfG1lZGlhcXVlcnl8YWxsKS8uZXhlYyhlLmxvY2F0aW9uLmhhc2gpO3ImJihpLmR1bXBMaW5lTnVtYmVycz1yWzFdKSx2b2lkIDA9PT1pLnVzZUZpbGVDYWNoZSYmKGkudXNlRmlsZUNhY2hlPSEwKSx2b2lkIDA9PT1pLm9uUmVhZHkmJihpLm9uUmVhZHk9ITApLGkucmVsYXRpdmVVcmxzJiYoaS5yZXdyaXRlVXJscz0iYWxsIil9KHdpbmRvdyxfdCksX3QucGx1Z2lucz1fdC5wbHVnaW5zfHxbXSx3aW5kb3cuTEVTU19QTFVHSU5TJiYoX3QucGx1Z2lucz1fdC5wbHVnaW5zLmNvbmNhdCh3aW5kb3cuTEVTU19QTFVHSU5TKSk7dmFyIE10LEV0LFB0LFJ0PWZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5kb2N1bWVudCxzPXd0KCk7cy5vcHRpb25zPW47dmFyIG89cy5lbnZpcm9ubWVudCxhPUl0KG4scy5sb2dnZXIpLGw9bmV3IGE7by5hZGRGaWxlTWFuYWdlcihsKSxzLkZpbGVNYW5hZ2VyPWEscy5QbHVnaW5Mb2FkZXI9Q3QsZnVuY3Rpb24oZSx0KXt0LmxvZ0xldmVsPXZvaWQgMCE9PXQubG9nTGV2ZWw/dC5sb2dMZXZlbDoiZGV2ZWxvcG1lbnQiPT09dC5lbnY/MzoxLHQubG9nZ2Vyc3x8KHQubG9nZ2Vycz1be2RlYnVnOmZ1bmN0aW9uKGUpe3QubG9nTGV2ZWw+PTQmJmNvbnNvbGUubG9nKGUpfSxpbmZvOmZ1bmN0aW9uKGUpe3QubG9nTGV2ZWw+PTMmJmNvbnNvbGUubG9nKGUpfSx3YXJuOmZ1bmN0aW9uKGUpe3QubG9nTGV2ZWw+PTImJmNvbnNvbGUud2FybihlKX0sZXJyb3I6ZnVuY3Rpb24oZSl7dC5sb2dMZXZlbD49MSYmY29uc29sZS5lcnJvcihlKX19XSk7Zm9yKHZhciBpPTA7aTx0LmxvZ2dlcnMubGVuZ3RoO2krKyllLmxvZ2dlci5hZGRMaXN0ZW5lcih0LmxvZ2dlcnNbaV0pfShzLG4pO3ZhciB1PWt0KGUscyxuKSxjPXMuY2FjaGU9bi5jYWNoZXx8ZnVuY3Rpb24oZSx0LGkpe3ZhciBuPW51bGw7aWYoImRldmVsb3BtZW50IiE9PXQuZW52KXRyeXtuPXZvaWQgMD09PWUubG9jYWxTdG9yYWdlP251bGw6ZS5sb2NhbFN0b3JhZ2V9Y2F0Y2goZSl7fXJldHVybntzZXRDU1M6ZnVuY3Rpb24oZSx0LHIscyl7aWYobil7aS5pbmZvKCJzYXZpbmcgIitlKyIgdG8gY2FjaGUuIik7dHJ5e24uc2V0SXRlbShlLHMpLG4uc2V0SXRlbShlKyI6dGltZXN0YW1wIix0KSxyJiZuLnNldEl0ZW0oZSsiOnZhcnMiLEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaCh0KXtpLmVycm9yKCdmYWlsZWQgdG8gc2F2ZSAiJytlKyciIHRvIGxvY2FsIHN0b3JhZ2UgZm9yIGNhY2hpbmcuJyl9fX0sZ2V0Q1NTOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcj1uJiZuLmdldEl0ZW0oZSkscz1uJiZuLmdldEl0ZW0oZSsiOnRpbWVzdGFtcCIpLG89biYmbi5nZXRJdGVtKGUrIjp2YXJzIik7aWYoaT1pfHx7fSxvPW98fCJ7fSIscyYmdC5sYXN0TW9kaWZpZWQmJm5ldyBEYXRlKHQubGFzdE1vZGlmaWVkKS52YWx1ZU9mKCk9PT1uZXcgRGF0ZShzKS52YWx1ZU9mKCkmJkpTT04uc3RyaW5naWZ5KGkpPT09bylyZXR1cm4gcn19fShlLG4scy5sb2dnZXIpOyFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aHJvd3t0eXBlOiJSdW50aW1lIixtZXNzYWdlOiJJbWFnZSBzaXplIGZ1bmN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiBicm93c2VyIHZlcnNpb24gb2YgbGVzcyJ9fXZhciB0PXsiaW1hZ2Utc2l6ZSI6ZnVuY3Rpb24odCl7cmV0dXJuIGUoKSwtMX0sImltYWdlLXdpZHRoIjpmdW5jdGlvbih0KXtyZXR1cm4gZSgpLC0xfSwiaW1hZ2UtaGVpZ2h0IjpmdW5jdGlvbih0KXtyZXR1cm4gZSgpLC0xfX07SC5hZGRNdWx0aXBsZSh0KX0ocy5lbnZpcm9ubWVudCksbi5mdW5jdGlvbnMmJnMuZnVuY3Rpb25zLmZ1bmN0aW9uUmVnaXN0cnkuYWRkTXVsdGlwbGUobi5mdW5jdGlvbnMpO3ZhciBoPS9edGV4dFwvKHgtKT9sZXNzJC87ZnVuY3Rpb24gZihlKXt2YXIgdD17fTtmb3IodmFyIGkgaW4gZSllLmhhc093blByb3BlcnR5KGkpJiYodFtpXT1lW2ldKTtyZXR1cm4gdH1mdW5jdGlvbiBwKGUsdCl7dmFyIGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWkuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSk7cmV0dXJuIGUuYXBwbHkodCxuKX19ZnVuY3Rpb24gdihlKXtmb3IodmFyIHQsaT1yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHlsZSIpLG89MDtvPGkubGVuZ3RoO28rKylpZigodD1pW29dKS50eXBlLm1hdGNoKGgpKXt2YXIgYT1mKG4pO2EubW9kaWZ5VmFycz1lO3ZhciBsPXQuaW5uZXJIVE1MfHwiIjthLmZpbGVuYW1lPXIubG9jYXRpb24uaHJlZi5yZXBsYWNlKC8jLiokLywiIikscy5yZW5kZXIobCxhLHAoKGZ1bmN0aW9uKGUsdCxpKXt0P3UuYWRkKHQsImlubGluZSIpOihlLnR5cGU9InRleHQvY3NzIixlLnN0eWxlU2hlZXQ/ZS5zdHlsZVNoZWV0LmNzc1RleHQ9aS5jc3M6ZS5pbm5lckhUTUw9aS5jc3MpfSksbnVsbCx0KSl9fWZ1bmN0aW9uIGQoZSxpLHIsYSxoKXt2YXIgcD1mKG4pO3QocCxlKSxwLm1pbWU9ZS50eXBlLGgmJihwLm1vZGlmeVZhcnM9aCksbC5sb2FkRmlsZShlLmhyZWYsbnVsbCxwLG8pLnRoZW4oKGZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXt2YXIgbj10LmNvbnRlbnRzLG89dC5maWxlbmFtZSxoPXQud2ViSW5mbyxmPXtjdXJyZW50RGlyZWN0b3J5OmwuZ2V0UGF0aChvKSxmaWxlbmFtZTpvLHJvb3RGaWxlbmFtZTpvLHJld3JpdGVVcmxzOnAucmV3cml0ZVVybHN9O2lmKGYuZW50cnlQYXRoPWYuY3VycmVudERpcmVjdG9yeSxmLnJvb3RwYXRoPXAucm9vdHBhdGh8fGYuY3VycmVudERpcmVjdG9yeSxoKXtoLnJlbWFpbmluZz1hO3ZhciB2PWMuZ2V0Q1NTKG8saCxwLm1vZGlmeVZhcnMpO2lmKCFyJiZ2KXJldHVybiBoLmxvY2FsPSEwLHZvaWQgaShudWxsLHYsbixlLGgsbyl9dS5yZW1vdmUobykscC5yb290RmlsZUluZm89ZixzLnJlbmRlcihuLHAsKGZ1bmN0aW9uKHQscil7dD8odC5ocmVmPW8saSh0KSk6KGMuc2V0Q1NTKGUuaHJlZixoLmxhc3RNb2RpZmllZCxwLm1vZGlmeVZhcnMsci5jc3MpLGkobnVsbCxyLmNzcyxuLGUsaCxvKSl9KSl9KHQpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtjb25zb2xlLmxvZyhlKSxpKGUpfSkpfWZ1bmN0aW9uIG0oZSx0LGkpe2Zvcih2YXIgbj0wO248cy5zaGVldHMubGVuZ3RoO24rKylkKHMuc2hlZXRzW25dLGUsdCxzLnNoZWV0cy5sZW5ndGgtKG4rMSksaSl9cmV0dXJuIHMud2F0Y2g9ZnVuY3Rpb24oKXtyZXR1cm4gcy53YXRjaE1vZGV8fChzLmVudj0iZGV2ZWxvcG1lbnQiLCJkZXZlbG9wbWVudCI9PT1zLmVudiYmKHMud2F0Y2hUaW1lcj1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtzLndhdGNoTW9kZSYmKGwuY2xlYXJGaWxlQ2FjaGUoKSxtKChmdW5jdGlvbih0LG4scixzLG8pe3Q/dS5hZGQodCx0LmhyZWZ8fHMuaHJlZik6biYmaShlLmRvY3VtZW50LG4scyl9KSkpfSksbi5wb2xsKSkpLHRoaXMud2F0Y2hNb2RlPSEwLCEwfSxzLnVud2F0Y2g9ZnVuY3Rpb24oKXtyZXR1cm4gY2xlYXJJbnRlcnZhbChzLndhdGNoVGltZXIpLHRoaXMud2F0Y2hNb2RlPSExLCExfSxzLnJlZ2lzdGVyU3R5bGVzaGVldHNJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciBlPXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKTtzLnNoZWV0cz1bXTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKykoInN0eWxlc2hlZXQvbGVzcyI9PT1lW3RdLnJlbHx8ZVt0XS5yZWwubWF0Y2goL3N0eWxlc2hlZXQvKSYmZVt0XS50eXBlLm1hdGNoKGgpKSYmcy5zaGVldHMucHVzaChlW3RdKX0scy5yZWdpc3RlclN0eWxlc2hlZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe3MucmVnaXN0ZXJTdHlsZXNoZWV0c0ltbWVkaWF0ZWx5KCksZSgpfSkpfSxzLm1vZGlmeVZhcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHMucmVmcmVzaCghMCxlLCExKX0scy5yZWZyZXNoPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4odHx8cikmJiExIT09ciYmbC5jbGVhckZpbGVDYWNoZSgpLG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe3ZhciBhLGwsYyxoO2E9bD1uZXcgRGF0ZSwwPT09KGg9cy5zaGVldHMubGVuZ3RoKT8obD1uZXcgRGF0ZSxjPWwtYSxzLmxvZ2dlci5pbmZvKCJMZXNzIGhhcyBmaW5pc2hlZCBhbmQgbm8gc2hlZXRzIHdlcmUgbG9hZGVkLiIpLHIoe3N0YXJ0VGltZTphLGVuZFRpbWU6bCx0b3RhbE1pbGxpc2Vjb25kczpjLHNoZWV0czpzLnNoZWV0cy5sZW5ndGh9KSk6bSgoZnVuY3Rpb24odCxuLGYscCx2KXtpZih0KXJldHVybiB1LmFkZCh0LHQuaHJlZnx8cC5ocmVmKSx2b2lkIG8odCk7di5sb2NhbD9zLmxvZ2dlci5pbmZvKCJMb2FkaW5nICIrcC5ocmVmKyIgZnJvbSBjYWNoZS4iKTpzLmxvZ2dlci5pbmZvKCJSZW5kZXJlZCAiK3AuaHJlZisiIHN1Y2Nlc3NmdWxseS4iKSxpKGUuZG9jdW1lbnQsbixwKSxzLmxvZ2dlci5pbmZvKCJDU1MgZm9yICIrcC5ocmVmKyIgZ2VuZXJhdGVkIGluICIrKG5ldyBEYXRlLWwpKyJtcyIpLDA9PT0tLWgmJihjPW5ldyBEYXRlLWEscy5sb2dnZXIuaW5mbygiTGVzcyBoYXMgZmluaXNoZWQuIENTUyBnZW5lcmF0ZWQgaW4gIitjKyJtcyIpLHIoe3N0YXJ0VGltZTphLGVuZFRpbWU6bCx0b3RhbE1pbGxpc2Vjb25kczpjLHNoZWV0czpzLnNoZWV0cy5sZW5ndGh9KSksbD1uZXcgRGF0ZX0pLHQsbiksdihuKX0pKX0scy5yZWZyZXNoU3R5bGVzPXYsc30od2luZG93LF90KTtmdW5jdGlvbiBPdChlKXtlLmZpbGVuYW1lJiZjb25zb2xlLndhcm4oZSksX3QuYXN5bmN8fEV0LnJlbW92ZUNoaWxkKFB0KX1yZXR1cm4gd2luZG93Lmxlc3M9UnQsX3Qub25SZWFkeSYmKC8hd2F0Y2gvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhhc2gpJiZSdC53YXRjaCgpLF90LmFzeW5jfHwoTXQ9ImJvZHkgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQgfSIsRXQ9ZG9jdW1lbnQuaGVhZHx8ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSwoUHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkudHlwZT0idGV4dC9jc3MiLFB0LnN0eWxlU2hlZXQ/UHQuc3R5bGVTaGVldC5jc3NUZXh0PU10OlB0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKE10KSksRXQuYXBwZW5kQ2hpbGQoUHQpKSxSdC5yZWdpc3RlclN0eWxlc2hlZXRzSW1tZWRpYXRlbHkoKSxSdC5wYWdlTG9hZEZpbmlzaGVkPVJ0LnJlZnJlc2goImRldmVsb3BtZW50Ij09PVJ0LmVudikudGhlbihPdCxPdCkpLFJ0fSkpOwovLyMgc291cmNlTWFwcGluZ1VSTD1sZXNzLm1pbi5qcy5tYXAK"},{"meta":{"name":"vue.min.js","url":"https://lib.baomitu.com/vue/2.6.14/vue.min.js","ts":1670421067090,"mimetype":"text/javascript"},"source":"LyohCiAqIFZ1ZS5qcyB2Mi42LjE0CiAqIChjKSAyMDE0LTIwMjEgRXZhbiBZb3UKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KIWZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9ZXx8c2VsZikuVnVlPXQoKX0odGhpcyxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1PYmplY3QuZnJlZXplKHt9KTtmdW5jdGlvbiB0KGUpe3JldHVybiBudWxsPT1lfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGwhPWV9ZnVuY3Rpb24gcihlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gaShlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHwiYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIG8oZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9dmFyIGE9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBzKGUpe3JldHVybiJbb2JqZWN0IE9iamVjdF0iPT09YS5jYWxsKGUpfWZ1bmN0aW9uIGMoZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiB0Pj0wJiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gdShlKXtyZXR1cm4gbihlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gbChlKXtyZXR1cm4gbnVsbD09ZT8iIjpBcnJheS5pc0FycmF5KGUpfHxzKGUpJiZlLnRvU3RyaW5nPT09YT9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHAoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxpPTA7aTxyLmxlbmd0aDtpKyspbltyW2ldXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19dmFyIGQ9cCgic2xvdCxjb21wb25lbnQiLCEwKSx2PXAoImtleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzIik7ZnVuY3Rpb24gaChlLHQpe2lmKGUubGVuZ3RoKXt2YXIgbj1lLmluZGV4T2YodCk7aWYobj4tMSlyZXR1cm4gZS5zcGxpY2UobiwxKX19dmFyIG09T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiB5KGUsdCl7cmV0dXJuIG0uY2FsbChlLHQpfWZ1bmN0aW9uIGcoZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHRbbl18fCh0W25dPWUobikpfX12YXIgXz0vLShcdykvZyxiPWcoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShfLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOiIifSl9KSwkPWcoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pLHc9L1xCKFtBLVpdKS9nLEM9ZyhmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHcsIi0kMSIpLnRvTG93ZXJDYXNlKCl9KTt2YXIgeD1GdW5jdGlvbi5wcm90b3R5cGUuYmluZD9mdW5jdGlvbihlLHQpe3JldHVybiBlLmJpbmQodCl9OmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO3JldHVybiByP3I+MT9lLmFwcGx5KHQsYXJndW1lbnRzKTplLmNhbGwodCxuKTplLmNhbGwodCl9cmV0dXJuIG4uX2xlbmd0aD1lLmxlbmd0aCxufTtmdW5jdGlvbiBrKGUsdCl7dD10fHwwO2Zvcih2YXIgbj1lLmxlbmd0aC10LHI9bmV3IEFycmF5KG4pO24tLTspcltuXT1lW24rdF07cmV0dXJuIHJ9ZnVuY3Rpb24gQShlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBPKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXSYmQSh0LGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIFMoZSx0LG4pe312YXIgVD1mdW5jdGlvbihlLHQsbil7cmV0dXJuITF9LE49ZnVuY3Rpb24oZSl7cmV0dXJuIGV9O2Z1bmN0aW9uIEUoZSx0KXtpZihlPT09dClyZXR1cm4hMDt2YXIgbj1vKGUpLHI9byh0KTtpZighbnx8IXIpcmV0dXJuIW4mJiFyJiZTdHJpbmcoZSk9PT1TdHJpbmcodCk7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkoZSksYT1BcnJheS5pc0FycmF5KHQpO2lmKGkmJmEpcmV0dXJuIGUubGVuZ3RoPT09dC5sZW5ndGgmJmUuZXZlcnkoZnVuY3Rpb24oZSxuKXtyZXR1cm4gRShlLHRbbl0pfSk7aWYoZSBpbnN0YW5jZW9mIERhdGUmJnQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBlLmdldFRpbWUoKT09PXQuZ2V0VGltZSgpO2lmKGl8fGEpcmV0dXJuITE7dmFyIHM9T2JqZWN0LmtleXMoZSksYz1PYmplY3Qua2V5cyh0KTtyZXR1cm4gcy5sZW5ndGg9PT1jLmxlbmd0aCYmcy5ldmVyeShmdW5jdGlvbihuKXtyZXR1cm4gRShlW25dLHRbbl0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIGooZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihFKGVbbl0sdCkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gRChlKXt2YXIgdD0hMTtyZXR1cm4gZnVuY3Rpb24oKXt0fHwodD0hMCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciBMPSJkYXRhLXNlcnZlci1yZW5kZXJlZCIsST1bImNvbXBvbmVudCIsImRpcmVjdGl2ZSIsImZpbHRlciJdLE09WyJiZWZvcmVDcmVhdGUiLCJjcmVhdGVkIiwiYmVmb3JlTW91bnQiLCJtb3VudGVkIiwiYmVmb3JlVXBkYXRlIiwidXBkYXRlZCIsImJlZm9yZURlc3Ryb3kiLCJkZXN0cm95ZWQiLCJhY3RpdmF0ZWQiLCJkZWFjdGl2YXRlZCIsImVycm9yQ2FwdHVyZWQiLCJzZXJ2ZXJQcmVmZXRjaCJdLEY9e29wdGlvbk1lcmdlU3RyYXRlZ2llczpPYmplY3QuY3JlYXRlKG51bGwpLHNpbGVudDohMSxwcm9kdWN0aW9uVGlwOiExLGRldnRvb2xzOiExLHBlcmZvcm1hbmNlOiExLGVycm9ySGFuZGxlcjpudWxsLHdhcm5IYW5kbGVyOm51bGwsaWdub3JlZEVsZW1lbnRzOltdLGtleUNvZGVzOk9iamVjdC5jcmVhdGUobnVsbCksaXNSZXNlcnZlZFRhZzpULGlzUmVzZXJ2ZWRBdHRyOlQsaXNVbmtub3duRWxlbWVudDpULGdldFRhZ05hbWVzcGFjZTpTLHBhcnNlUGxhdGZvcm1UYWdOYW1lOk4sbXVzdFVzZVByb3A6VCxhc3luYzohMCxfbGlmZWN5Y2xlSG9va3M6TX0sUD0vYS16QS1aXHUwMEI3XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwM0YtXHUyMDQwXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkQvO2Z1bmN0aW9uIFIoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX12YXIgSD1uZXcgUmVnRXhwKCJbXiIrUC5zb3VyY2UrIi4kX1xcZF0iKTt2YXIgQixVPSJfX3Byb3RvX18iaW57fSxWPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LHo9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sSz16JiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksSj1WJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLHE9SiYmL21zaWV8dHJpZGVudC8udGVzdChKKSxXPUomJkouaW5kZXhPZigibXNpZSA5LjAiKT4wLFo9SiYmSi5pbmRleE9mKCJlZGdlLyIpPjAsRz0oSiYmSi5pbmRleE9mKCJhbmRyb2lkIiksSiYmL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KEopfHwiaW9zIj09PUspLFg9KEomJi9jaHJvbWVcL1xkKy8udGVzdChKKSxKJiYvcGhhbnRvbWpzLy50ZXN0KEopLEomJkoubWF0Y2goL2ZpcmVmb3hcLyhcZCspLykpLFk9e30ud2F0Y2gsUT0hMTtpZihWKXRyeXt2YXIgZWU9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGVlLCJwYXNzaXZlIix7Z2V0OmZ1bmN0aW9uKCl7UT0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLGVlKX1jYXRjaChlKXt9dmFyIHRlPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PUImJihCPSFWJiYheiYmInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWwmJihnbG9iYWwucHJvY2VzcyYmInNlcnZlciI9PT1nbG9iYWwucHJvY2Vzcy5lbnYuVlVFX0VOVikpLEJ9LG5lPVYmJndpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO2Z1bmN0aW9uIHJlKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYvbmF0aXZlIGNvZGUvLnRlc3QoZS50b1N0cmluZygpKX12YXIgaWUsb2U9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJnJlKFN5bWJvbCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmcmUoUmVmbGVjdC5vd25LZXlzKTtpZT0idW5kZWZpbmVkIiE9dHlwZW9mIFNldCYmcmUoU2V0KT9TZXQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX1yZXR1cm4gZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiEwPT09dGhpcy5zZXRbZV19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt0aGlzLnNldFtlXT0hMH0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfSxlfSgpO3ZhciBhZT1TLHNlPTAsY2U9ZnVuY3Rpb24oKXt0aGlzLmlkPXNlKyssdGhpcy5zdWJzPVtdfTtjZS5wcm90b3R5cGUuYWRkU3ViPWZ1bmN0aW9uKGUpe3RoaXMuc3Vicy5wdXNoKGUpfSxjZS5wcm90b3R5cGUucmVtb3ZlU3ViPWZ1bmN0aW9uKGUpe2godGhpcy5zdWJzLGUpfSxjZS5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Y2UudGFyZ2V0JiZjZS50YXJnZXQuYWRkRGVwKHRoaXMpfSxjZS5wcm90b3R5cGUubm90aWZ5PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuc3Vicy5zbGljZSgpLHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspZVt0XS51cGRhdGUoKX0sY2UudGFyZ2V0PW51bGw7dmFyIHVlPVtdO2Z1bmN0aW9uIGxlKGUpe3VlLnB1c2goZSksY2UudGFyZ2V0PWV9ZnVuY3Rpb24gZmUoKXt1ZS5wb3AoKSxjZS50YXJnZXQ9dWVbdWUubGVuZ3RoLTFdfXZhciBwZT1mdW5jdGlvbihlLHQsbixyLGksbyxhLHMpe3RoaXMudGFnPWUsdGhpcy5kYXRhPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMudGV4dD1yLHRoaXMuZWxtPWksdGhpcy5ucz12b2lkIDAsdGhpcy5jb250ZXh0PW8sdGhpcy5mbkNvbnRleHQ9dm9pZCAwLHRoaXMuZm5PcHRpb25zPXZvaWQgMCx0aGlzLmZuU2NvcGVJZD12b2lkIDAsdGhpcy5rZXk9dCYmdC5rZXksdGhpcy5jb21wb25lbnRPcHRpb25zPWEsdGhpcy5jb21wb25lbnRJbnN0YW5jZT12b2lkIDAsdGhpcy5wYXJlbnQ9dm9pZCAwLHRoaXMucmF3PSExLHRoaXMuaXNTdGF0aWM9ITEsdGhpcy5pc1Jvb3RJbnNlcnQ9ITAsdGhpcy5pc0NvbW1lbnQ9ITEsdGhpcy5pc0Nsb25lZD0hMSx0aGlzLmlzT25jZT0hMSx0aGlzLmFzeW5jRmFjdG9yeT1zLHRoaXMuYXN5bmNNZXRhPXZvaWQgMCx0aGlzLmlzQXN5bmNQbGFjZWhvbGRlcj0hMX0sZGU9e2NoaWxkOntjb25maWd1cmFibGU6ITB9fTtkZS5jaGlsZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocGUucHJvdG90eXBlLGRlKTt2YXIgdmU9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9IiIpO3ZhciB0PW5ldyBwZTtyZXR1cm4gdC50ZXh0PWUsdC5pc0NvbW1lbnQ9ITAsdH07ZnVuY3Rpb24gaGUoZSl7cmV0dXJuIG5ldyBwZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCxTdHJpbmcoZSkpfWZ1bmN0aW9uIG1lKGUpe3ZhciB0PW5ldyBwZShlLnRhZyxlLmRhdGEsZS5jaGlsZHJlbiYmZS5jaGlsZHJlbi5zbGljZSgpLGUudGV4dCxlLmVsbSxlLmNvbnRleHQsZS5jb21wb25lbnRPcHRpb25zLGUuYXN5bmNGYWN0b3J5KTtyZXR1cm4gdC5ucz1lLm5zLHQuaXNTdGF0aWM9ZS5pc1N0YXRpYyx0LmtleT1lLmtleSx0LmlzQ29tbWVudD1lLmlzQ29tbWVudCx0LmZuQ29udGV4dD1lLmZuQ29udGV4dCx0LmZuT3B0aW9ucz1lLmZuT3B0aW9ucyx0LmZuU2NvcGVJZD1lLmZuU2NvcGVJZCx0LmFzeW5jTWV0YT1lLmFzeW5jTWV0YSx0LmlzQ2xvbmVkPSEwLHR9dmFyIHllPUFycmF5LnByb3RvdHlwZSxnZT1PYmplY3QuY3JlYXRlKHllKTtbInB1c2giLCJwb3AiLCJzaGlmdCIsInVuc2hpZnQiLCJzcGxpY2UiLCJzb3J0IiwicmV2ZXJzZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9eWVbZV07UihnZSxlLGZ1bmN0aW9uKCl7Zm9yKHZhciBuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09YXJndW1lbnRzW3JdO3ZhciBpLG89dC5hcHBseSh0aGlzLG4pLGE9dGhpcy5fX29iX187c3dpdGNoKGUpe2Nhc2UicHVzaCI6Y2FzZSJ1bnNoaWZ0IjppPW47YnJlYWs7Y2FzZSJzcGxpY2UiOmk9bi5zbGljZSgyKX1yZXR1cm4gaSYmYS5vYnNlcnZlQXJyYXkoaSksYS5kZXAubm90aWZ5KCksb30pfSk7dmFyIF9lPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGdlKSxiZT0hMDtmdW5jdGlvbiAkZShlKXtiZT1lfXZhciB3ZT1mdW5jdGlvbihlKXt2YXIgdDt0aGlzLnZhbHVlPWUsdGhpcy5kZXA9bmV3IGNlLHRoaXMudm1Db3VudD0wLFIoZSwiX19vYl9fIix0aGlzKSxBcnJheS5pc0FycmF5KGUpPyhVPyh0PWdlLGUuX19wcm90b19fPXQpOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07UihlLG8sdFtvXSl9fShlLGdlLF9lKSx0aGlzLm9ic2VydmVBcnJheShlKSk6dGhpcy53YWxrKGUpfTtmdW5jdGlvbiBDZShlLHQpe3ZhciBuO2lmKG8oZSkmJiEoZSBpbnN0YW5jZW9mIHBlKSlyZXR1cm4geShlLCJfX29iX18iKSYmZS5fX29iX18gaW5zdGFuY2VvZiB3ZT9uPWUuX19vYl9fOmJlJiYhdGUoKSYmKEFycmF5LmlzQXJyYXkoZSl8fHMoZSkpJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYhZS5faXNWdWUmJihuPW5ldyB3ZShlKSksdCYmbiYmbi52bUNvdW50Kyssbn1mdW5jdGlvbiB4ZShlLHQsbixyLGkpe3ZhciBvPW5ldyBjZSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtpZighYXx8ITEhPT1hLmNvbmZpZ3VyYWJsZSl7dmFyIHM9YSYmYS5nZXQsYz1hJiZhLnNldDtzJiYhY3x8MiE9PWFyZ3VtZW50cy5sZW5ndGh8fChuPWVbdF0pO3ZhciB1PSFpJiZDZShuKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1zP3MuY2FsbChlKTpuO3JldHVybiBjZS50YXJnZXQmJihvLmRlcGVuZCgpLHUmJih1LmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KHQpJiZmdW5jdGlvbiBlKHQpe2Zvcih2YXIgbj12b2lkIDAscj0wLGk9dC5sZW5ndGg7cjxpO3IrKykobj10W3JdKSYmbi5fX29iX18mJm4uX19vYl9fLmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KG4pJiZlKG4pfSh0KSkpLHR9LHNldDpmdW5jdGlvbih0KXt2YXIgcj1zP3MuY2FsbChlKTpuO3Q9PT1yfHx0IT10JiZyIT1yfHxzJiYhY3x8KGM/Yy5jYWxsKGUsdCk6bj10LHU9IWkmJkNlKHQpLG8ubm90aWZ5KCkpfX0pfX1mdW5jdGlvbiBrZShlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSYmYyh0KSlyZXR1cm4gZS5sZW5ndGg9TWF0aC5tYXgoZS5sZW5ndGgsdCksZS5zcGxpY2UodCwxLG4pLG47aWYodCBpbiBlJiYhKHQgaW4gT2JqZWN0LnByb3RvdHlwZSkpcmV0dXJuIGVbdF09bixuO3ZhciByPWUuX19vYl9fO3JldHVybiBlLl9pc1Z1ZXx8ciYmci52bUNvdW50P246cj8oeGUoci52YWx1ZSx0LG4pLHIuZGVwLm5vdGlmeSgpLG4pOihlW3RdPW4sbil9ZnVuY3Rpb24gQWUoZSx0KXtpZihBcnJheS5pc0FycmF5KGUpJiZjKHQpKWUuc3BsaWNlKHQsMSk7ZWxzZXt2YXIgbj1lLl9fb2JfXztlLl9pc1Z1ZXx8biYmbi52bUNvdW50fHx5KGUsdCkmJihkZWxldGUgZVt0XSxuJiZuLmRlcC5ub3RpZnkoKSl9fXdlLnByb3RvdHlwZS53YWxrPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDtuKyspeGUoZSx0W25dKX0sd2UucHJvdG90eXBlLm9ic2VydmVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspQ2UoZVt0XSl9O3ZhciBPZT1GLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztmdW5jdGlvbiBTZShlLHQpe2lmKCF0KXJldHVybiBlO2Zvcih2YXIgbixyLGksbz1vZT9SZWZsZWN0Lm93bktleXModCk6T2JqZWN0LmtleXModCksYT0wO2E8by5sZW5ndGg7YSsrKSJfX29iX18iIT09KG49b1thXSkmJihyPWVbbl0saT10W25dLHkoZSxuKT9yIT09aSYmcyhyKSYmcyhpKSYmU2UocixpKTprZShlLG4saSkpO3JldHVybiBlfWZ1bmN0aW9uIFRlKGUsdCxuKXtyZXR1cm4gbj9mdW5jdGlvbigpe3ZhciByPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbChuLG4pOnQsaT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lLmNhbGwobixuKTplO3JldHVybiByP1NlKHIsaSk6aX06dD9lP2Z1bmN0aW9uKCl7cmV0dXJuIFNlKCJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbCh0aGlzLHRoaXMpOnQsImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5jYWxsKHRoaXMsdGhpcyk6ZSl9OnQ6ZX1mdW5jdGlvbiBOZShlLHQpe3ZhciBuPXQ/ZT9lLmNvbmNhdCh0KTpBcnJheS5pc0FycmF5KHQpP3Q6W3RdOmU7cmV0dXJuIG4/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyktMT09PXQuaW5kZXhPZihlW25dKSYmdC5wdXNoKGVbbl0pO3JldHVybiB0fShuKTpufWZ1bmN0aW9uIEVlKGUsdCxuLHIpe3ZhciBpPU9iamVjdC5jcmVhdGUoZXx8bnVsbCk7cmV0dXJuIHQ/QShpLHQpOml9T2UuZGF0YT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/VGUoZSx0LG4pOnQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6VGUoZSx0KX0sTS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09lW2VdPU5lfSksSS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09lW2UrInMiXT1FZX0pLE9lLndhdGNoPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1ZJiYoZT12b2lkIDApLHQ9PT1ZJiYodD12b2lkIDApLCF0KXJldHVybiBPYmplY3QuY3JlYXRlKGV8fG51bGwpO2lmKCFlKXJldHVybiB0O3ZhciBpPXt9O2Zvcih2YXIgbyBpbiBBKGksZSksdCl7dmFyIGE9aVtvXSxzPXRbb107YSYmIUFycmF5LmlzQXJyYXkoYSkmJihhPVthXSksaVtvXT1hP2EuY29uY2F0KHMpOkFycmF5LmlzQXJyYXkocyk/czpbc119cmV0dXJuIGl9LE9lLnByb3BzPU9lLm1ldGhvZHM9T2UuaW5qZWN0PU9lLmNvbXB1dGVkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIEEoaSxlKSx0JiZBKGksdCksaX0sT2UucHJvdmlkZT1UZTt2YXIgamU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD9lOnR9O2Z1bmN0aW9uIERlKGUsdCxuKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dC5vcHRpb25zKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUucHJvcHM7aWYobil7dmFyIHIsaSxvPXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHI9bi5sZW5ndGg7ci0tOykic3RyaW5nIj09dHlwZW9mKGk9bltyXSkmJihvW2IoaSldPXt0eXBlOm51bGx9KTtlbHNlIGlmKHMobikpZm9yKHZhciBhIGluIG4paT1uW2FdLG9bYihhKV09cyhpKT9pOnt0eXBlOml9O2UucHJvcHM9b319KHQpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbmplY3Q7aWYobil7dmFyIHI9ZS5pbmplY3Q9e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKylyW25baV1dPXtmcm9tOm5baV19O2Vsc2UgaWYocyhuKSlmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtyW29dPXMoYSk/QSh7ZnJvbTpvfSxhKTp7ZnJvbTphfX19fSh0KSxmdW5jdGlvbihlKXt2YXIgdD1lLmRpcmVjdGl2ZXM7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTsiZnVuY3Rpb24iPT10eXBlb2YgciYmKHRbbl09e2JpbmQ6cix1cGRhdGU6cn0pfX0odCksIXQuX2Jhc2UmJih0LmV4dGVuZHMmJihlPURlKGUsdC5leHRlbmRzLG4pKSx0Lm1peGlucykpZm9yKHZhciByPTAsaT10Lm1peGlucy5sZW5ndGg7cjxpO3IrKyllPURlKGUsdC5taXhpbnNbcl0sbik7dmFyIG8sYT17fTtmb3IobyBpbiBlKWMobyk7Zm9yKG8gaW4gdCl5KGUsbyl8fGMobyk7ZnVuY3Rpb24gYyhyKXt2YXIgaT1PZVtyXXx8amU7YVtyXT1pKGVbcl0sdFtyXSxuLHIpfXJldHVybiBhfWZ1bmN0aW9uIExlKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGk9ZVt0XTtpZih5KGksbikpcmV0dXJuIGlbbl07dmFyIG89YihuKTtpZih5KGksbykpcmV0dXJuIGlbb107dmFyIGE9JChvKTtyZXR1cm4geShpLGEpP2lbYV06aVtuXXx8aVtvXXx8aVthXX19ZnVuY3Rpb24gSWUoZSx0LG4scil7dmFyIGk9dFtlXSxvPSF5KG4sZSksYT1uW2VdLHM9UmUoQm9vbGVhbixpLnR5cGUpO2lmKHM+LTEpaWYobyYmIXkoaSwiZGVmYXVsdCIpKWE9ITE7ZWxzZSBpZigiIj09PWF8fGE9PT1DKGUpKXt2YXIgYz1SZShTdHJpbmcsaS50eXBlKTsoYzwwfHxzPGMpJiYoYT0hMCl9aWYodm9pZCAwPT09YSl7YT1mdW5jdGlvbihlLHQsbil7aWYoIXkodCwiZGVmYXVsdCIpKXJldHVybjt2YXIgcj10LmRlZmF1bHQ7aWYoZSYmZS4kb3B0aW9ucy5wcm9wc0RhdGEmJnZvaWQgMD09PWUuJG9wdGlvbnMucHJvcHNEYXRhW25dJiZ2b2lkIDAhPT1lLl9wcm9wc1tuXSlyZXR1cm4gZS5fcHJvcHNbbl07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHImJiJGdW5jdGlvbiIhPT1GZSh0LnR5cGUpP3IuY2FsbChlKTpyfShyLGksZSk7dmFyIHU9YmU7JGUoITApLENlKGEpLCRlKHUpfXJldHVybiBhfXZhciBNZT0vXlxzKmZ1bmN0aW9uIChcdyspLztmdW5jdGlvbiBGZShlKXt2YXIgdD1lJiZlLnRvU3RyaW5nKCkubWF0Y2goTWUpO3JldHVybiB0P3RbMV06IiJ9ZnVuY3Rpb24gUGUoZSx0KXtyZXR1cm4gRmUoZSk9PT1GZSh0KX1mdW5jdGlvbiBSZShlLHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiBQZSh0LGUpPzA6LTE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKFBlKHRbbl0sZSkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gSGUoZSx0LG4pe2xlKCk7dHJ5e2lmKHQpZm9yKHZhciByPXQ7cj1yLiRwYXJlbnQ7KXt2YXIgaT1yLiRvcHRpb25zLmVycm9yQ2FwdHVyZWQ7aWYoaSlmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl0cnl7aWYoITE9PT1pW29dLmNhbGwocixlLHQsbikpcmV0dXJufWNhdGNoKGUpe1VlKGUsciwiZXJyb3JDYXB0dXJlZCBob29rIil9fVVlKGUsdCxuKX1maW5hbGx5e2ZlKCl9fWZ1bmN0aW9uIEJlKGUsdCxuLHIsaSl7dmFyIG87dHJ5eyhvPW4/ZS5hcHBseSh0LG4pOmUuY2FsbCh0KSkmJiFvLl9pc1Z1ZSYmdShvKSYmIW8uX2hhbmRsZWQmJihvLmNhdGNoKGZ1bmN0aW9uKGUpe3JldHVybiBIZShlLHIsaSsiIChQcm9taXNlL2FzeW5jKSIpfSksby5faGFuZGxlZD0hMCl9Y2F0Y2goZSl7SGUoZSxyLGkpfXJldHVybiBvfWZ1bmN0aW9uIFVlKGUsdCxuKXtpZihGLmVycm9ySGFuZGxlcil0cnl7cmV0dXJuIEYuZXJyb3JIYW5kbGVyLmNhbGwobnVsbCxlLHQsbil9Y2F0Y2godCl7dCE9PWUmJlZlKHQsbnVsbCwiY29uZmlnLmVycm9ySGFuZGxlciIpfVZlKGUsdCxuKX1mdW5jdGlvbiBWZShlLHQsbil7aWYoIVYmJiF6fHwidW5kZWZpbmVkIj09dHlwZW9mIGNvbnNvbGUpdGhyb3cgZTtjb25zb2xlLmVycm9yKGUpfXZhciB6ZSxLZT0hMSxKZT1bXSxxZT0hMTtmdW5jdGlvbiBXZSgpe3FlPSExO3ZhciBlPUplLnNsaWNlKDApO0plLmxlbmd0aD0wO2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0oKX1pZigidW5kZWZpbmVkIiE9dHlwZW9mIFByb21pc2UmJnJlKFByb21pc2UpKXt2YXIgWmU9UHJvbWlzZS5yZXNvbHZlKCk7emU9ZnVuY3Rpb24oKXtaZS50aGVuKFdlKSxHJiZzZXRUaW1lb3V0KFMpfSxLZT0hMH1lbHNlIGlmKHF8fCJ1bmRlZmluZWQiPT10eXBlb2YgTXV0YXRpb25PYnNlcnZlcnx8IXJlKE11dGF0aW9uT2JzZXJ2ZXIpJiYiW29iamVjdCBNdXRhdGlvbk9ic2VydmVyQ29uc3RydWN0b3JdIiE9PU11dGF0aW9uT2JzZXJ2ZXIudG9TdHJpbmcoKSl6ZT0idW5kZWZpbmVkIiE9dHlwZW9mIHNldEltbWVkaWF0ZSYmcmUoc2V0SW1tZWRpYXRlKT9mdW5jdGlvbigpe3NldEltbWVkaWF0ZShXZSl9OmZ1bmN0aW9uKCl7c2V0VGltZW91dChXZSwwKX07ZWxzZXt2YXIgR2U9MSxYZT1uZXcgTXV0YXRpb25PYnNlcnZlcihXZSksWWU9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKEdlKSk7WGUub2JzZXJ2ZShZZSx7Y2hhcmFjdGVyRGF0YTohMH0pLHplPWZ1bmN0aW9uKCl7R2U9KEdlKzEpJTIsWWUuZGF0YT1TdHJpbmcoR2UpfSxLZT0hMH1mdW5jdGlvbiBRZShlLHQpe3ZhciBuO2lmKEplLnB1c2goZnVuY3Rpb24oKXtpZihlKXRyeXtlLmNhbGwodCl9Y2F0Y2goZSl7SGUoZSx0LCJuZXh0VGljayIpfWVsc2UgbiYmbih0KX0pLHFlfHwocWU9ITAsemUoKSksIWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSlyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7bj1lfSl9dmFyIGV0PW5ldyBpZTtmdW5jdGlvbiB0dChlKXshZnVuY3Rpb24gZSh0LG4pe3ZhciByLGk7dmFyIGE9QXJyYXkuaXNBcnJheSh0KTtpZighYSYmIW8odCl8fE9iamVjdC5pc0Zyb3plbih0KXx8dCBpbnN0YW5jZW9mIHBlKXJldHVybjtpZih0Ll9fb2JfXyl7dmFyIHM9dC5fX29iX18uZGVwLmlkO2lmKG4uaGFzKHMpKXJldHVybjtuLmFkZChzKX1pZihhKWZvcihyPXQubGVuZ3RoO3ItLTspZSh0W3JdLG4pO2Vsc2UgZm9yKGk9T2JqZWN0LmtleXModCkscj1pLmxlbmd0aDtyLS07KWUodFtpW3JdXSxuKX0oZSxldCksZXQuY2xlYXIoKX12YXIgbnQ9ZyhmdW5jdGlvbihlKXt2YXIgdD0iJiI9PT1lLmNoYXJBdCgwKSxuPSJ+Ij09PShlPXQ/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCkscj0iISI9PT0oZT1uP2Uuc2xpY2UoMSk6ZSkuY2hhckF0KDApO3JldHVybntuYW1lOmU9cj9lLnNsaWNlKDEpOmUsb25jZTpuLGNhcHR1cmU6cixwYXNzaXZlOnR9fSk7ZnVuY3Rpb24gcnQoZSx0KXtmdW5jdGlvbiBuKCl7dmFyIGU9YXJndW1lbnRzLHI9bi5mbnM7aWYoIUFycmF5LmlzQXJyYXkocikpcmV0dXJuIEJlKHIsbnVsbCxhcmd1bWVudHMsdCwidi1vbiBoYW5kbGVyIik7Zm9yKHZhciBpPXIuc2xpY2UoKSxvPTA7bzxpLmxlbmd0aDtvKyspQmUoaVtvXSxudWxsLGUsdCwidi1vbiBoYW5kbGVyIil9cmV0dXJuIG4uZm5zPWUsbn1mdW5jdGlvbiBpdChlLG4saSxvLGEscyl7dmFyIGMsdSxsLGY7Zm9yKGMgaW4gZSl1PWVbY10sbD1uW2NdLGY9bnQoYyksdCh1KXx8KHQobCk/KHQodS5mbnMpJiYodT1lW2NdPXJ0KHUscykpLHIoZi5vbmNlKSYmKHU9ZVtjXT1hKGYubmFtZSx1LGYuY2FwdHVyZSkpLGkoZi5uYW1lLHUsZi5jYXB0dXJlLGYucGFzc2l2ZSxmLnBhcmFtcykpOnUhPT1sJiYobC5mbnM9dSxlW2NdPWwpKTtmb3IoYyBpbiBuKXQoZVtjXSkmJm8oKGY9bnQoYykpLm5hbWUsbltjXSxmLmNhcHR1cmUpfWZ1bmN0aW9uIG90KGUsaSxvKXt2YXIgYTtlIGluc3RhbmNlb2YgcGUmJihlPWUuZGF0YS5ob29rfHwoZS5kYXRhLmhvb2s9e30pKTt2YXIgcz1lW2ldO2Z1bmN0aW9uIGMoKXtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxoKGEuZm5zLGMpfXQocyk/YT1ydChbY10pOm4ocy5mbnMpJiZyKHMubWVyZ2VkKT8oYT1zKS5mbnMucHVzaChjKTphPXJ0KFtzLGNdKSxhLm1lcmdlZD0hMCxlW2ldPWF9ZnVuY3Rpb24gYXQoZSx0LHIsaSxvKXtpZihuKHQpKXtpZih5KHQscikpcmV0dXJuIGVbcl09dFtyXSxvfHxkZWxldGUgdFtyXSwhMDtpZih5KHQsaSkpcmV0dXJuIGVbcl09dFtpXSxvfHxkZWxldGUgdFtpXSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBzdChlKXtyZXR1cm4gaShlKT9baGUoZSldOkFycmF5LmlzQXJyYXkoZSk/ZnVuY3Rpb24gZShvLGEpe3ZhciBzPVtdO3ZhciBjLHUsbCxmO2ZvcihjPTA7YzxvLmxlbmd0aDtjKyspdCh1PW9bY10pfHwiYm9vbGVhbiI9PXR5cGVvZiB1fHwobD1zLmxlbmd0aC0xLGY9c1tsXSxBcnJheS5pc0FycmF5KHUpP3UubGVuZ3RoPjAmJihjdCgodT1lKHUsKGF8fCIiKSsiXyIrYykpWzBdKSYmY3QoZikmJihzW2xdPWhlKGYudGV4dCt1WzBdLnRleHQpLHUuc2hpZnQoKSkscy5wdXNoLmFwcGx5KHMsdSkpOmkodSk/Y3QoZik/c1tsXT1oZShmLnRleHQrdSk6IiIhPT11JiZzLnB1c2goaGUodSkpOmN0KHUpJiZjdChmKT9zW2xdPWhlKGYudGV4dCt1LnRleHQpOihyKG8uX2lzVkxpc3QpJiZuKHUudGFnKSYmdCh1LmtleSkmJm4oYSkmJih1LmtleT0iX192bGlzdCIrYSsiXyIrYysiX18iKSxzLnB1c2godSkpKTtyZXR1cm4gc30oZSk6dm9pZCAwfWZ1bmN0aW9uIGN0KGUpe3JldHVybiBuKGUpJiZuKGUudGV4dCkmJiExPT09ZS5pc0NvbW1lbnR9ZnVuY3Rpb24gdXQoZSx0KXtpZihlKXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPW9lP1JlZmxlY3Qub3duS2V5cyhlKTpPYmplY3Qua2V5cyhlKSxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBvPXJbaV07aWYoIl9fb2JfXyIhPT1vKXtmb3IodmFyIGE9ZVtvXS5mcm9tLHM9dDtzOyl7aWYocy5fcHJvdmlkZWQmJnkocy5fcHJvdmlkZWQsYSkpe25bb109cy5fcHJvdmlkZWRbYV07YnJlYWt9cz1zLiRwYXJlbnR9aWYoIXMmJiJkZWZhdWx0ImluIGVbb10pe3ZhciBjPWVbb10uZGVmYXVsdDtuW29dPSJmdW5jdGlvbiI9PXR5cGVvZiBjP2MuY2FsbCh0KTpjfX19cmV0dXJuIG59fWZ1bmN0aW9uIGx0KGUsdCl7aWYoIWV8fCFlLmxlbmd0aClyZXR1cm57fTtmb3IodmFyIG49e30scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyl7dmFyIG89ZVtyXSxhPW8uZGF0YTtpZihhJiZhLmF0dHJzJiZhLmF0dHJzLnNsb3QmJmRlbGV0ZSBhLmF0dHJzLnNsb3Qsby5jb250ZXh0IT09dCYmby5mbkNvbnRleHQhPT10fHwhYXx8bnVsbD09YS5zbG90KShuLmRlZmF1bHR8fChuLmRlZmF1bHQ9W10pKS5wdXNoKG8pO2Vsc2V7dmFyIHM9YS5zbG90LGM9bltzXXx8KG5bc109W10pOyJ0ZW1wbGF0ZSI9PT1vLnRhZz9jLnB1c2guYXBwbHkoYyxvLmNoaWxkcmVufHxbXSk6Yy5wdXNoKG8pfX1mb3IodmFyIHUgaW4gbiluW3VdLmV2ZXJ5KGZ0KSYmZGVsZXRlIG5bdV07cmV0dXJuIG59ZnVuY3Rpb24gZnQoZSl7cmV0dXJuIGUuaXNDb21tZW50JiYhZS5hc3luY0ZhY3Rvcnl8fCIgIj09PWUudGV4dH1mdW5jdGlvbiBwdChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJmUuYXN5bmNGYWN0b3J5fWZ1bmN0aW9uIGR0KHQsbixyKXt2YXIgaSxvPU9iamVjdC5rZXlzKG4pLmxlbmd0aD4wLGE9dD8hIXQuJHN0YWJsZTohbyxzPXQmJnQuJGtleTtpZih0KXtpZih0Ll9ub3JtYWxpemVkKXJldHVybiB0Ll9ub3JtYWxpemVkO2lmKGEmJnImJnIhPT1lJiZzPT09ci4ka2V5JiYhbyYmIXIuJGhhc05vcm1hbClyZXR1cm4gcjtmb3IodmFyIGMgaW4gaT17fSx0KXRbY10mJiIkIiE9PWNbMF0mJihpW2NdPXZ0KG4sYyx0W2NdKSl9ZWxzZSBpPXt9O2Zvcih2YXIgdSBpbiBuKXUgaW4gaXx8KGlbdV09aHQobix1KSk7cmV0dXJuIHQmJk9iamVjdC5pc0V4dGVuc2libGUodCkmJih0Ll9ub3JtYWxpemVkPWkpLFIoaSwiJHN0YWJsZSIsYSksUihpLCIka2V5IixzKSxSKGksIiRoYXNOb3JtYWwiLG8pLGl9ZnVuY3Rpb24gdnQoZSx0LG4pe3ZhciByPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD9uLmFwcGx5KG51bGwsYXJndW1lbnRzKTpuKHt9KSx0PShlPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIUFycmF5LmlzQXJyYXkoZSk/W2VdOnN0KGUpKSYmZVswXTtyZXR1cm4gZSYmKCF0fHwxPT09ZS5sZW5ndGgmJnQuaXNDb21tZW50JiYhcHQodCkpP3ZvaWQgMDplfTtyZXR1cm4gbi5wcm94eSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7Z2V0OnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxyfWZ1bmN0aW9uIGh0KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fWZ1bmN0aW9uIG10KGUsdCl7dmFyIHIsaSxhLHMsYztpZihBcnJheS5pc0FycmF5KGUpfHwic3RyaW5nIj09dHlwZW9mIGUpZm9yKHI9bmV3IEFycmF5KGUubGVuZ3RoKSxpPTAsYT1lLmxlbmd0aDtpPGE7aSsrKXJbaV09dChlW2ldLGkpO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlKWZvcihyPW5ldyBBcnJheShlKSxpPTA7aTxlO2krKylyW2ldPXQoaSsxLGkpO2Vsc2UgaWYobyhlKSlpZihvZSYmZVtTeW1ib2wuaXRlcmF0b3JdKXtyPVtdO2Zvcih2YXIgdT1lW1N5bWJvbC5pdGVyYXRvcl0oKSxsPXUubmV4dCgpOyFsLmRvbmU7KXIucHVzaCh0KGwudmFsdWUsci5sZW5ndGgpKSxsPXUubmV4dCgpfWVsc2UgZm9yKHM9T2JqZWN0LmtleXMoZSkscj1uZXcgQXJyYXkocy5sZW5ndGgpLGk9MCxhPXMubGVuZ3RoO2k8YTtpKyspYz1zW2ldLHJbaV09dChlW2NdLGMsaSk7cmV0dXJuIG4ocil8fChyPVtdKSxyLl9pc1ZMaXN0PSEwLHJ9ZnVuY3Rpb24geXQoZSx0LG4scil7dmFyIGksbz10aGlzLiRzY29wZWRTbG90c1tlXTtvPyhuPW58fHt9LHImJihuPUEoQSh7fSxyKSxuKSksaT1vKG4pfHwoImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOnQpKTppPXRoaXMuJHNsb3RzW2VdfHwoImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOnQpO3ZhciBhPW4mJm4uc2xvdDtyZXR1cm4gYT90aGlzLiRjcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIse3Nsb3Q6YX0saSk6aX1mdW5jdGlvbiBndChlKXtyZXR1cm4gTGUodGhpcy4kb3B0aW9ucywiZmlsdGVycyIsZSl8fE59ZnVuY3Rpb24gX3QoZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMT09PWUuaW5kZXhPZih0KTplIT09dH1mdW5jdGlvbiBidChlLHQsbixyLGkpe3ZhciBvPUYua2V5Q29kZXNbdF18fG47cmV0dXJuIGkmJnImJiFGLmtleUNvZGVzW3RdP190KGkscik6bz9fdChvLGUpOnI/QyhyKSE9PXQ6dm9pZCAwPT09ZX1mdW5jdGlvbiAkdChlLHQsbixyLGkpe2lmKG4paWYobyhuKSl7dmFyIGE7QXJyYXkuaXNBcnJheShuKSYmKG49TyhuKSk7dmFyIHM9ZnVuY3Rpb24obyl7aWYoImNsYXNzIj09PW98fCJzdHlsZSI9PT1vfHx2KG8pKWE9ZTtlbHNle3ZhciBzPWUuYXR0cnMmJmUuYXR0cnMudHlwZTthPXJ8fEYubXVzdFVzZVByb3AodCxzLG8pP2UuZG9tUHJvcHN8fChlLmRvbVByb3BzPXt9KTplLmF0dHJzfHwoZS5hdHRycz17fSl9dmFyIGM9YihvKSx1PUMobyk7YyBpbiBhfHx1IGluIGF8fChhW29dPW5bb10saSYmKChlLm9ufHwoZS5vbj17fSkpWyJ1cGRhdGU6IitvXT1mdW5jdGlvbihlKXtuW29dPWV9KSl9O2Zvcih2YXIgYyBpbiBuKXMoYyl9ZWxzZTtyZXR1cm4gZX1mdW5jdGlvbiB3dChlLHQpe3ZhciBuPXRoaXMuX3N0YXRpY1RyZWVzfHwodGhpcy5fc3RhdGljVHJlZXM9W10pLHI9bltlXTtyZXR1cm4gciYmIXQ/cjooeHQocj1uW2VdPXRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2VdLmNhbGwodGhpcy5fcmVuZGVyUHJveHksbnVsbCx0aGlzKSwiX19zdGF0aWNfXyIrZSwhMSkscil9ZnVuY3Rpb24gQ3QoZSx0LG4pe3JldHVybiB4dChlLCJfX29uY2VfXyIrdCsobj8iXyIrbjoiIiksITApLGV9ZnVuY3Rpb24geHQoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspZVtyXSYmInN0cmluZyIhPXR5cGVvZiBlW3JdJiZrdChlW3JdLHQrIl8iK3Isbik7ZWxzZSBrdChlLHQsbil9ZnVuY3Rpb24ga3QoZSx0LG4pe2UuaXNTdGF0aWM9ITAsZS5rZXk9dCxlLmlzT25jZT1ufWZ1bmN0aW9uIEF0KGUsdCl7aWYodClpZihzKHQpKXt2YXIgbj1lLm9uPWUub24/QSh7fSxlLm9uKTp7fTtmb3IodmFyIHIgaW4gdCl7dmFyIGk9bltyXSxvPXRbcl07bltyXT1pP1tdLmNvbmNhdChpLG8pOm99fWVsc2U7cmV0dXJuIGV9ZnVuY3Rpb24gT3QoZSx0LG4scil7dD10fHx7JHN0YWJsZTohbn07Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07QXJyYXkuaXNBcnJheShvKT9PdChvLHQsbik6byYmKG8ucHJveHkmJihvLmZuLnByb3h5PSEwKSx0W28ua2V5XT1vLmZuKX1yZXR1cm4gciYmKHQuJGtleT1yKSx0fWZ1bmN0aW9uIFN0KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKz0yKXt2YXIgcj10W25dOyJzdHJpbmciPT10eXBlb2YgciYmciYmKGVbdFtuXV09dFtuKzFdKX1yZXR1cm4gZX1mdW5jdGlvbiBUdChlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT90K2U6ZX1mdW5jdGlvbiBOdChlKXtlLl9vPUN0LGUuX249ZixlLl9zPWwsZS5fbD1tdCxlLl90PXl0LGUuX3E9RSxlLl9pPWosZS5fbT13dCxlLl9mPWd0LGUuX2s9YnQsZS5fYj0kdCxlLl92PWhlLGUuX2U9dmUsZS5fdT1PdCxlLl9nPUF0LGUuX2Q9U3QsZS5fcD1UdH1mdW5jdGlvbiBFdCh0LG4saSxvLGEpe3ZhciBzLGM9dGhpcyx1PWEub3B0aW9uczt5KG8sIl91aWQiKT8ocz1PYmplY3QuY3JlYXRlKG8pKS5fb3JpZ2luYWw9bzoocz1vLG89by5fb3JpZ2luYWwpO3ZhciBsPXIodS5fY29tcGlsZWQpLGY9IWw7dGhpcy5kYXRhPXQsdGhpcy5wcm9wcz1uLHRoaXMuY2hpbGRyZW49aSx0aGlzLnBhcmVudD1vLHRoaXMubGlzdGVuZXJzPXQub258fGUsdGhpcy5pbmplY3Rpb25zPXV0KHUuaW5qZWN0LG8pLHRoaXMuc2xvdHM9ZnVuY3Rpb24oKXtyZXR1cm4gYy4kc2xvdHN8fGR0KHQuc2NvcGVkU2xvdHMsYy4kc2xvdHM9bHQoaSxvKSksYy4kc2xvdHN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzY29wZWRTbG90cyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGR0KHQuc2NvcGVkU2xvdHMsdGhpcy5zbG90cygpKX19KSxsJiYodGhpcy4kb3B0aW9ucz11LHRoaXMuJHNsb3RzPXRoaXMuc2xvdHMoKSx0aGlzLiRzY29wZWRTbG90cz1kdCh0LnNjb3BlZFNsb3RzLHRoaXMuJHNsb3RzKSksdS5fc2NvcGVJZD90aGlzLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPUh0KHMsZSx0LG4scixmKTtyZXR1cm4gaSYmIUFycmF5LmlzQXJyYXkoaSkmJihpLmZuU2NvcGVJZD11Ll9zY29wZUlkLGkuZm5Db250ZXh0PW8pLGl9OnRoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIEh0KHMsZSx0LG4scixmKX19ZnVuY3Rpb24ganQoZSx0LG4scixpKXt2YXIgbz1tZShlKTtyZXR1cm4gby5mbkNvbnRleHQ9bixvLmZuT3B0aW9ucz1yLHQuc2xvdCYmKChvLmRhdGF8fChvLmRhdGE9e30pKS5zbG90PXQuc2xvdCksb31mdW5jdGlvbiBEdChlLHQpe2Zvcih2YXIgbiBpbiB0KWVbYihuKV09dFtuXX1OdChFdC5wcm90b3R5cGUpO3ZhciBMdD17aW5pdDpmdW5jdGlvbihlLHQpe2lmKGUuY29tcG9uZW50SW5zdGFuY2UmJiFlLmNvbXBvbmVudEluc3RhbmNlLl9pc0Rlc3Ryb3llZCYmZS5kYXRhLmtlZXBBbGl2ZSl7dmFyIHI9ZTtMdC5wcmVwYXRjaChyLHIpfWVsc2V7KGUuY29tcG9uZW50SW5zdGFuY2U9ZnVuY3Rpb24oZSx0KXt2YXIgcj17X2lzQ29tcG9uZW50OiEwLF9wYXJlbnRWbm9kZTplLHBhcmVudDp0fSxpPWUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtuKGkpJiYoci5yZW5kZXI9aS5yZW5kZXIsci5zdGF0aWNSZW5kZXJGbnM9aS5zdGF0aWNSZW5kZXJGbnMpO3JldHVybiBuZXcgZS5jb21wb25lbnRPcHRpb25zLkN0b3Iocil9KGUsWnQpKS4kbW91bnQodD9lLmVsbTp2b2lkIDAsdCl9fSxwcmVwYXRjaDpmdW5jdGlvbih0LG4pe3ZhciByPW4uY29tcG9uZW50T3B0aW9uczshZnVuY3Rpb24odCxuLHIsaSxvKXt2YXIgYT1pLmRhdGEuc2NvcGVkU2xvdHMscz10LiRzY29wZWRTbG90cyxjPSEhKGEmJiFhLiRzdGFibGV8fHMhPT1lJiYhcy4kc3RhYmxlfHxhJiZ0LiRzY29wZWRTbG90cy4ka2V5IT09YS4ka2V5fHwhYSYmdC4kc2NvcGVkU2xvdHMuJGtleSksdT0hIShvfHx0LiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbnx8Yyk7dC4kb3B0aW9ucy5fcGFyZW50Vm5vZGU9aSx0LiR2bm9kZT1pLHQuX3Zub2RlJiYodC5fdm5vZGUucGFyZW50PWkpO2lmKHQuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuPW8sdC4kYXR0cnM9aS5kYXRhLmF0dHJzfHxlLHQuJGxpc3RlbmVycz1yfHxlLG4mJnQuJG9wdGlvbnMucHJvcHMpeyRlKCExKTtmb3IodmFyIGw9dC5fcHJvcHMsZj10LiRvcHRpb25zLl9wcm9wS2V5c3x8W10scD0wO3A8Zi5sZW5ndGg7cCsrKXt2YXIgZD1mW3BdLHY9dC4kb3B0aW9ucy5wcm9wcztsW2RdPUllKGQsdixuLHQpfSRlKCEwKSx0LiRvcHRpb25zLnByb3BzRGF0YT1ufXI9cnx8ZTt2YXIgaD10LiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7dC4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzPXIsV3QodCxyLGgpLHUmJih0LiRzbG90cz1sdChvLGkuY29udGV4dCksdC4kZm9yY2VVcGRhdGUoKSl9KG4uY29tcG9uZW50SW5zdGFuY2U9dC5jb21wb25lbnRJbnN0YW5jZSxyLnByb3BzRGF0YSxyLmxpc3RlbmVycyxuLHIuY2hpbGRyZW4pfSxpbnNlcnQ6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmNvbnRleHQscj1lLmNvbXBvbmVudEluc3RhbmNlO3IuX2lzTW91bnRlZHx8KHIuX2lzTW91bnRlZD0hMCxRdChyLCJtb3VudGVkIikpLGUuZGF0YS5rZWVwQWxpdmUmJihuLl9pc01vdW50ZWQ/KCh0PXIpLl9pbmFjdGl2ZT0hMSx0bi5wdXNoKHQpKTpZdChyLCEwKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb21wb25lbnRJbnN0YW5jZTt0Ll9pc0Rlc3Ryb3llZHx8KGUuZGF0YS5rZWVwQWxpdmU/ZnVuY3Rpb24gZSh0LG4pe2lmKG4mJih0Ll9kaXJlY3RJbmFjdGl2ZT0hMCxYdCh0KSkpcmV0dXJuO2lmKCF0Ll9pbmFjdGl2ZSl7dC5faW5hY3RpdmU9ITA7Zm9yKHZhciByPTA7cjx0LiRjaGlsZHJlbi5sZW5ndGg7cisrKWUodC4kY2hpbGRyZW5bcl0pO1F0KHQsImRlYWN0aXZhdGVkIil9fSh0LCEwKTp0LiRkZXN0cm95KCkpfX0sSXQ9T2JqZWN0LmtleXMoTHQpO2Z1bmN0aW9uIE10KGksYSxzLGMsbCl7aWYoIXQoaSkpe3ZhciBmPXMuJG9wdGlvbnMuX2Jhc2U7aWYobyhpKSYmKGk9Zi5leHRlbmQoaSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBpKXt2YXIgcDtpZih0KGkuY2lkKSYmdm9pZCAwPT09KGk9ZnVuY3Rpb24oZSxpKXtpZihyKGUuZXJyb3IpJiZuKGUuZXJyb3JDb21wKSlyZXR1cm4gZS5lcnJvckNvbXA7aWYobihlLnJlc29sdmVkKSlyZXR1cm4gZS5yZXNvbHZlZDt2YXIgYT1VdDthJiZuKGUub3duZXJzKSYmLTE9PT1lLm93bmVycy5pbmRleE9mKGEpJiZlLm93bmVycy5wdXNoKGEpO2lmKHIoZS5sb2FkaW5nKSYmbihlLmxvYWRpbmdDb21wKSlyZXR1cm4gZS5sb2FkaW5nQ29tcDtpZihhJiYhbihlLm93bmVycykpe3ZhciBzPWUub3duZXJzPVthXSxjPSEwLGw9bnVsbCxmPW51bGw7YS4kb24oImhvb2s6ZGVzdHJveWVkIixmdW5jdGlvbigpe3JldHVybiBoKHMsYSl9KTt2YXIgcD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPXMubGVuZ3RoO3Q8bjt0Kyspc1t0XS4kZm9yY2VVcGRhdGUoKTtlJiYocy5sZW5ndGg9MCxudWxsIT09bCYmKGNsZWFyVGltZW91dChsKSxsPW51bGwpLG51bGwhPT1mJiYoY2xlYXJUaW1lb3V0KGYpLGY9bnVsbCkpfSxkPUQoZnVuY3Rpb24odCl7ZS5yZXNvbHZlZD1WdCh0LGkpLGM/cy5sZW5ndGg9MDpwKCEwKX0pLHY9RChmdW5jdGlvbih0KXtuKGUuZXJyb3JDb21wKSYmKGUuZXJyb3I9ITAscCghMCkpfSksbT1lKGQsdik7cmV0dXJuIG8obSkmJih1KG0pP3QoZS5yZXNvbHZlZCkmJm0udGhlbihkLHYpOnUobS5jb21wb25lbnQpJiYobS5jb21wb25lbnQudGhlbihkLHYpLG4obS5lcnJvcikmJihlLmVycm9yQ29tcD1WdChtLmVycm9yLGkpKSxuKG0ubG9hZGluZykmJihlLmxvYWRpbmdDb21wPVZ0KG0ubG9hZGluZyxpKSwwPT09bS5kZWxheT9lLmxvYWRpbmc9ITA6bD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bD1udWxsLHQoZS5yZXNvbHZlZCkmJnQoZS5lcnJvcikmJihlLmxvYWRpbmc9ITAscCghMSkpfSxtLmRlbGF5fHwyMDApKSxuKG0udGltZW91dCkmJihmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmPW51bGwsdChlLnJlc29sdmVkKSYmdihudWxsKX0sbS50aW1lb3V0KSkpKSxjPSExLGUubG9hZGluZz9lLmxvYWRpbmdDb21wOmUucmVzb2x2ZWR9fShwPWksZikpKXJldHVybiBmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPXZlKCk7cmV0dXJuIG8uYXN5bmNGYWN0b3J5PWUsby5hc3luY01ldGE9e2RhdGE6dCxjb250ZXh0Om4sY2hpbGRyZW46cix0YWc6aX0sb30ocCxhLHMsYyxsKTthPWF8fHt9LHduKGkpLG4oYS5tb2RlbCkmJmZ1bmN0aW9uKGUsdCl7dmFyIHI9ZS5tb2RlbCYmZS5tb2RlbC5wcm9wfHwidmFsdWUiLGk9ZS5tb2RlbCYmZS5tb2RlbC5ldmVudHx8ImlucHV0IjsodC5hdHRyc3x8KHQuYXR0cnM9e30pKVtyXT10Lm1vZGVsLnZhbHVlO3ZhciBvPXQub258fCh0Lm9uPXt9KSxhPW9baV0scz10Lm1vZGVsLmNhbGxiYWNrO24oYSk/KEFycmF5LmlzQXJyYXkoYSk/LTE9PT1hLmluZGV4T2Yocyk6YSE9PXMpJiYob1tpXT1bc10uY29uY2F0KGEpKTpvW2ldPXN9KGkub3B0aW9ucyxhKTt2YXIgZD1mdW5jdGlvbihlLHIsaSl7dmFyIG89ci5vcHRpb25zLnByb3BzO2lmKCF0KG8pKXt2YXIgYT17fSxzPWUuYXR0cnMsYz1lLnByb3BzO2lmKG4ocyl8fG4oYykpZm9yKHZhciB1IGluIG8pe3ZhciBsPUModSk7YXQoYSxjLHUsbCwhMCl8fGF0KGEscyx1LGwsITEpfXJldHVybiBhfX0oYSxpKTtpZihyKGkub3B0aW9ucy5mdW5jdGlvbmFsKSlyZXR1cm4gZnVuY3Rpb24odCxyLGksbyxhKXt2YXIgcz10Lm9wdGlvbnMsYz17fSx1PXMucHJvcHM7aWYobih1KSlmb3IodmFyIGwgaW4gdSljW2xdPUllKGwsdSxyfHxlKTtlbHNlIG4oaS5hdHRycykmJkR0KGMsaS5hdHRycyksbihpLnByb3BzKSYmRHQoYyxpLnByb3BzKTt2YXIgZj1uZXcgRXQoaSxjLGEsbyx0KSxwPXMucmVuZGVyLmNhbGwobnVsbCxmLl9jLGYpO2lmKHAgaW5zdGFuY2VvZiBwZSlyZXR1cm4ganQocCxpLGYucGFyZW50LHMpO2lmKEFycmF5LmlzQXJyYXkocCkpe2Zvcih2YXIgZD1zdChwKXx8W10sdj1uZXcgQXJyYXkoZC5sZW5ndGgpLGg9MDtoPGQubGVuZ3RoO2grKyl2W2hdPWp0KGRbaF0saSxmLnBhcmVudCxzKTtyZXR1cm4gdn19KGksZCxhLHMsYyk7dmFyIHY9YS5vbjtpZihhLm9uPWEubmF0aXZlT24scihpLm9wdGlvbnMuYWJzdHJhY3QpKXt2YXIgbT1hLnNsb3Q7YT17fSxtJiYoYS5zbG90PW0pfSFmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5ob29rfHwoZS5ob29rPXt9KSxuPTA7bjxJdC5sZW5ndGg7bisrKXt2YXIgcj1JdFtuXSxpPXRbcl0sbz1MdFtyXTtpPT09b3x8aSYmaS5fbWVyZ2VkfHwodFtyXT1pP0Z0KG8saSk6byl9fShhKTt2YXIgeT1pLm9wdGlvbnMubmFtZXx8bDtyZXR1cm4gbmV3IHBlKCJ2dWUtY29tcG9uZW50LSIraS5jaWQrKHk/Ii0iK3k6IiIpLGEsdm9pZCAwLHZvaWQgMCx2b2lkIDAscyx7Q3RvcjppLHByb3BzRGF0YTpkLGxpc3RlbmVyczp2LHRhZzpsLGNoaWxkcmVuOmN9LHApfX19ZnVuY3Rpb24gRnQoZSx0KXt2YXIgbj1mdW5jdGlvbihuLHIpe2UobixyKSx0KG4scil9O3JldHVybiBuLl9tZXJnZWQ9ITAsbn12YXIgUHQ9MSxSdD0yO2Z1bmN0aW9uIEh0KGUsYSxzLGMsdSxsKXtyZXR1cm4oQXJyYXkuaXNBcnJheShzKXx8aShzKSkmJih1PWMsYz1zLHM9dm9pZCAwKSxyKGwpJiYodT1SdCksZnVuY3Rpb24oZSxpLGEscyxjKXtpZihuKGEpJiZuKGEuX19vYl9fKSlyZXR1cm4gdmUoKTtuKGEpJiZuKGEuaXMpJiYoaT1hLmlzKTtpZighaSlyZXR1cm4gdmUoKTtBcnJheS5pc0FycmF5KHMpJiYiZnVuY3Rpb24iPT10eXBlb2Ygc1swXSYmKChhPWF8fHt9KS5zY29wZWRTbG90cz17ZGVmYXVsdDpzWzBdfSxzLmxlbmd0aD0wKTtjPT09UnQ/cz1zdChzKTpjPT09UHQmJihzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKEFycmF5LmlzQXJyYXkoZVt0XSkpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sZSk7cmV0dXJuIGV9KHMpKTt2YXIgdSxsO2lmKCJzdHJpbmciPT10eXBlb2YgaSl7dmFyIGY7bD1lLiR2bm9kZSYmZS4kdm5vZGUubnN8fEYuZ2V0VGFnTmFtZXNwYWNlKGkpLHU9Ri5pc1Jlc2VydmVkVGFnKGkpP25ldyBwZShGLnBhcnNlUGxhdGZvcm1UYWdOYW1lKGkpLGEscyx2b2lkIDAsdm9pZCAwLGUpOmEmJmEucHJlfHwhbihmPUxlKGUuJG9wdGlvbnMsImNvbXBvbmVudHMiLGkpKT9uZXcgcGUoaSxhLHMsdm9pZCAwLHZvaWQgMCxlKTpNdChmLGEsZSxzLGkpfWVsc2UgdT1NdChpLGEsZSxzKTtyZXR1cm4gQXJyYXkuaXNBcnJheSh1KT91Om4odSk/KG4obCkmJmZ1bmN0aW9uIGUoaSxvLGEpe2kubnM9bzsiZm9yZWlnbk9iamVjdCI9PT1pLnRhZyYmKG89dm9pZCAwLGE9ITApO2lmKG4oaS5jaGlsZHJlbikpZm9yKHZhciBzPTAsYz1pLmNoaWxkcmVuLmxlbmd0aDtzPGM7cysrKXt2YXIgdT1pLmNoaWxkcmVuW3NdO24odS50YWcpJiYodCh1Lm5zKXx8cihhKSYmInN2ZyIhPT11LnRhZykmJmUodSxvLGEpfX0odSxsKSxuKGEpJiZmdW5jdGlvbihlKXtvKGUuc3R5bGUpJiZ0dChlLnN0eWxlKTtvKGUuY2xhc3MpJiZ0dChlLmNsYXNzKX0oYSksdSk6dmUoKX0oZSxhLHMsYyx1KX12YXIgQnQsVXQ9bnVsbDtmdW5jdGlvbiBWdChlLHQpe3JldHVybihlLl9fZXNNb2R1bGV8fG9lJiYiTW9kdWxlIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSkmJihlPWUuZGVmYXVsdCksbyhlKT90LmV4dGVuZChlKTplfWZ1bmN0aW9uIHp0KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF07aWYobihyKSYmKG4oci5jb21wb25lbnRPcHRpb25zKXx8cHQocikpKXJldHVybiByfX1mdW5jdGlvbiBLdChlLHQpe0J0LiRvbihlLHQpfWZ1bmN0aW9uIEp0KGUsdCl7QnQuJG9mZihlLHQpfWZ1bmN0aW9uIHF0KGUsdCl7dmFyIG49QnQ7cmV0dXJuIGZ1bmN0aW9uIHIoKXtudWxsIT09dC5hcHBseShudWxsLGFyZ3VtZW50cykmJm4uJG9mZihlLHIpfX1mdW5jdGlvbiBXdChlLHQsbil7QnQ9ZSxpdCh0LG58fHt9LEt0LEp0LHF0LGUpLEJ0PXZvaWQgMH12YXIgWnQ9bnVsbDtmdW5jdGlvbiBHdChlKXt2YXIgdD1adDtyZXR1cm4gWnQ9ZSxmdW5jdGlvbigpe1p0PXR9fWZ1bmN0aW9uIFh0KGUpe2Zvcig7ZSYmKGU9ZS4kcGFyZW50KTspaWYoZS5faW5hY3RpdmUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gWXQoZSx0KXtpZih0KXtpZihlLl9kaXJlY3RJbmFjdGl2ZT0hMSxYdChlKSlyZXR1cm59ZWxzZSBpZihlLl9kaXJlY3RJbmFjdGl2ZSlyZXR1cm47aWYoZS5faW5hY3RpdmV8fG51bGw9PT1lLl9pbmFjdGl2ZSl7ZS5faW5hY3RpdmU9ITE7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKVl0KGUuJGNoaWxkcmVuW25dKTtRdChlLCJhY3RpdmF0ZWQiKX19ZnVuY3Rpb24gUXQoZSx0KXtsZSgpO3ZhciBuPWUuJG9wdGlvbnNbdF0scj10KyIgaG9vayI7aWYobilmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspQmUobltpXSxlLG51bGwsZSxyKTtlLl9oYXNIb29rRXZlbnQmJmUuJGVtaXQoImhvb2s6Iit0KSxmZSgpfXZhciBlbj1bXSx0bj1bXSxubj17fSxybj0hMSxvbj0hMSxhbj0wO3ZhciBzbj0wLGNuPURhdGUubm93O2lmKFYmJiFxKXt2YXIgdW49d2luZG93LnBlcmZvcm1hbmNlO3VuJiYiZnVuY3Rpb24iPT10eXBlb2YgdW4ubm93JiZjbigpPmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLnRpbWVTdGFtcCYmKGNuPWZ1bmN0aW9uKCl7cmV0dXJuIHVuLm5vdygpfSl9ZnVuY3Rpb24gbG4oKXt2YXIgZSx0O2Zvcihzbj1jbigpLG9uPSEwLGVuLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSksYW49MDthbjxlbi5sZW5ndGg7YW4rKykoZT1lblthbl0pLmJlZm9yZSYmZS5iZWZvcmUoKSx0PWUuaWQsbm5bdF09bnVsbCxlLnJ1bigpO3ZhciBuPXRuLnNsaWNlKCkscj1lbi5zbGljZSgpO2FuPWVuLmxlbmd0aD10bi5sZW5ndGg9MCxubj17fSxybj1vbj0hMSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLl9pbmFjdGl2ZT0hMCxZdChlW3RdLCEwKX0obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7Zm9yKDt0LS07KXt2YXIgbj1lW3RdLHI9bi52bTtyLl93YXRjaGVyPT09biYmci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJlF0KHIsInVwZGF0ZWQiKX19KHIpLG5lJiZGLmRldnRvb2xzJiZuZS5lbWl0KCJmbHVzaCIpfXZhciBmbj0wLHBuPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dGhpcy52bT1lLGkmJihlLl93YXRjaGVyPXRoaXMpLGUuX3dhdGNoZXJzLnB1c2godGhpcykscj8odGhpcy5kZWVwPSEhci5kZWVwLHRoaXMudXNlcj0hIXIudXNlcix0aGlzLmxhenk9ISFyLmxhenksdGhpcy5zeW5jPSEhci5zeW5jLHRoaXMuYmVmb3JlPXIuYmVmb3JlKTp0aGlzLmRlZXA9dGhpcy51c2VyPXRoaXMubGF6eT10aGlzLnN5bmM9ITEsdGhpcy5jYj1uLHRoaXMuaWQ9Kytmbix0aGlzLmFjdGl2ZT0hMCx0aGlzLmRpcnR5PXRoaXMubGF6eSx0aGlzLmRlcHM9W10sdGhpcy5uZXdEZXBzPVtdLHRoaXMuZGVwSWRzPW5ldyBpZSx0aGlzLm5ld0RlcElkcz1uZXcgaWUsdGhpcy5leHByZXNzaW9uPSIiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P3RoaXMuZ2V0dGVyPXQ6KHRoaXMuZ2V0dGVyPWZ1bmN0aW9uKGUpe2lmKCFILnRlc3QoZSkpe3ZhciB0PWUuc3BsaXQoIi4iKTtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2lmKCFlKXJldHVybjtlPWVbdFtuXV19cmV0dXJuIGV9fX0odCksdGhpcy5nZXR0ZXJ8fCh0aGlzLmdldHRlcj1TKSksdGhpcy52YWx1ZT10aGlzLmxhenk/dm9pZCAwOnRoaXMuZ2V0KCl9O3BuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXt2YXIgZTtsZSh0aGlzKTt2YXIgdD10aGlzLnZtO3RyeXtlPXRoaXMuZ2V0dGVyLmNhbGwodCx0KX1jYXRjaChlKXtpZighdGhpcy51c2VyKXRocm93IGU7SGUoZSx0LCdnZXR0ZXIgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJyl9ZmluYWxseXt0aGlzLmRlZXAmJnR0KGUpLGZlKCksdGhpcy5jbGVhbnVwRGVwcygpfXJldHVybiBlfSxwbi5wcm90b3R5cGUuYWRkRGVwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7dGhpcy5uZXdEZXBJZHMuaGFzKHQpfHwodGhpcy5uZXdEZXBJZHMuYWRkKHQpLHRoaXMubmV3RGVwcy5wdXNoKGUpLHRoaXMuZGVwSWRzLmhhcyh0KXx8ZS5hZGRTdWIodGhpcykpfSxwbi5wcm90b3R5cGUuY2xlYW51cERlcHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXt2YXIgdD10aGlzLmRlcHNbZV07dGhpcy5uZXdEZXBJZHMuaGFzKHQuaWQpfHx0LnJlbW92ZVN1Yih0aGlzKX12YXIgbj10aGlzLmRlcElkczt0aGlzLmRlcElkcz10aGlzLm5ld0RlcElkcyx0aGlzLm5ld0RlcElkcz1uLHRoaXMubmV3RGVwSWRzLmNsZWFyKCksbj10aGlzLmRlcHMsdGhpcy5kZXBzPXRoaXMubmV3RGVwcyx0aGlzLm5ld0RlcHM9bix0aGlzLm5ld0RlcHMubGVuZ3RoPTB9LHBuLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxhenk/dGhpcy5kaXJ0eT0hMDp0aGlzLnN5bmM/dGhpcy5ydW4oKTpmdW5jdGlvbihlKXt2YXIgdD1lLmlkO2lmKG51bGw9PW5uW3RdKXtpZihublt0XT0hMCxvbil7Zm9yKHZhciBuPWVuLmxlbmd0aC0xO24+YW4mJmVuW25dLmlkPmUuaWQ7KW4tLTtlbi5zcGxpY2UobisxLDAsZSl9ZWxzZSBlbi5wdXNoKGUpO3JufHwocm49ITAsUWUobG4pKX19KHRoaXMpfSxwbi5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3ZhciBlPXRoaXMuZ2V0KCk7aWYoZSE9PXRoaXMudmFsdWV8fG8oZSl8fHRoaXMuZGVlcCl7dmFyIHQ9dGhpcy52YWx1ZTtpZih0aGlzLnZhbHVlPWUsdGhpcy51c2VyKXt2YXIgbj0nY2FsbGJhY2sgZm9yIHdhdGNoZXIgIicrdGhpcy5leHByZXNzaW9uKyciJztCZSh0aGlzLmNiLHRoaXMudm0sW2UsdF0sdGhpcy52bSxuKX1lbHNlIHRoaXMuY2IuY2FsbCh0aGlzLnZtLGUsdCl9fX0scG4ucHJvdG90eXBlLmV2YWx1YXRlPWZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLmdldCgpLHRoaXMuZGlydHk9ITF9LHBuLnByb3RvdHlwZS5kZXBlbmQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXRoaXMuZGVwc1tlXS5kZXBlbmQoKX0scG4ucHJvdG90eXBlLnRlYXJkb3duPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3RoaXMudm0uX2lzQmVpbmdEZXN0cm95ZWR8fGgodGhpcy52bS5fd2F0Y2hlcnMsdGhpcyk7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0ucmVtb3ZlU3ViKHRoaXMpO3RoaXMuYWN0aXZlPSExfX07dmFyIGRuPXtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6UyxzZXQ6U307ZnVuY3Rpb24gdm4oZSx0LG4pe2RuLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzW3RdW25dfSxkbi5zZXQ9ZnVuY3Rpb24oZSl7dGhpc1t0XVtuXT1lfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLGRuKX1mdW5jdGlvbiBobihlKXtlLl93YXRjaGVycz1bXTt2YXIgdD1lLiRvcHRpb25zO3QucHJvcHMmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS4kb3B0aW9ucy5wcm9wc0RhdGF8fHt9LHI9ZS5fcHJvcHM9e30saT1lLiRvcHRpb25zLl9wcm9wS2V5cz1bXTtlLiRwYXJlbnQmJiRlKCExKTt2YXIgbz1mdW5jdGlvbihvKXtpLnB1c2gobyk7dmFyIGE9SWUobyx0LG4sZSk7eGUocixvLGEpLG8gaW4gZXx8dm4oZSwiX3Byb3BzIixvKX07Zm9yKHZhciBhIGluIHQpbyhhKTskZSghMCl9KGUsdC5wcm9wcyksdC5tZXRob2RzJiZmdW5jdGlvbihlLHQpe2UuJG9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpZVtuXT0iZnVuY3Rpb24iIT10eXBlb2YgdFtuXT9TOngodFtuXSxlKX0oZSx0Lm1ldGhvZHMpLHQuZGF0YT9mdW5jdGlvbihlKXt2YXIgdD1lLiRvcHRpb25zLmRhdGE7cyh0PWUuX2RhdGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24oZSx0KXtsZSgpO3RyeXtyZXR1cm4gZS5jYWxsKHQsdCl9Y2F0Y2goZSl7cmV0dXJuIEhlKGUsdCwiZGF0YSgpIikse319ZmluYWxseXtmZSgpfX0odCxlKTp0fHx7fSl8fCh0PXt9KTt2YXIgbj1PYmplY3Qua2V5cyh0KSxyPWUuJG9wdGlvbnMucHJvcHMsaT0oZS4kb3B0aW9ucy5tZXRob2RzLG4ubGVuZ3RoKTtmb3IoO2ktLTspe3ZhciBvPW5baV07ciYmeShyLG8pfHwoYT12b2lkIDAsMzYhPT0oYT0obysiIikuY2hhckNvZGVBdCgwKSkmJjk1IT09YSYmdm4oZSwiX2RhdGEiLG8pKX12YXIgYTtDZSh0LCEwKX0oZSk6Q2UoZS5fZGF0YT17fSwhMCksdC5jb21wdXRlZCYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLl9jb21wdXRlZFdhdGNoZXJzPU9iamVjdC5jcmVhdGUobnVsbCkscj10ZSgpO2Zvcih2YXIgaSBpbiB0KXt2YXIgbz10W2ldLGE9ImZ1bmN0aW9uIj09dHlwZW9mIG8/bzpvLmdldDtyfHwobltpXT1uZXcgcG4oZSxhfHxTLFMsbW4pKSxpIGluIGV8fHluKGUsaSxvKX19KGUsdC5jb21wdXRlZCksdC53YXRjaCYmdC53YXRjaCE9PVkmJmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07aWYoQXJyYXkuaXNBcnJheShyKSlmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKylibihlLG4scltpXSk7ZWxzZSBibihlLG4scil9fShlLHQud2F0Y2gpfXZhciBtbj17bGF6eTohMH07ZnVuY3Rpb24geW4oZSx0LG4pe3ZhciByPSF0ZSgpOyJmdW5jdGlvbiI9PXR5cGVvZiBuPyhkbi5nZXQ9cj9nbih0KTpfbihuKSxkbi5zZXQ9Uyk6KGRuLmdldD1uLmdldD9yJiYhMSE9PW4uY2FjaGU/Z24odCk6X24obi5nZXQpOlMsZG4uc2V0PW4uc2V0fHxTKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LGRuKX1mdW5jdGlvbiBnbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jb21wdXRlZFdhdGNoZXJzJiZ0aGlzLl9jb21wdXRlZFdhdGNoZXJzW2VdO2lmKHQpcmV0dXJuIHQuZGlydHkmJnQuZXZhbHVhdGUoKSxjZS50YXJnZXQmJnQuZGVwZW5kKCksdC52YWx1ZX19ZnVuY3Rpb24gX24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzLHRoaXMpfX1mdW5jdGlvbiBibihlLHQsbixyKXtyZXR1cm4gcyhuKSYmKHI9bixuPW4uaGFuZGxlciksInN0cmluZyI9PXR5cGVvZiBuJiYobj1lW25dKSxlLiR3YXRjaCh0LG4scil9dmFyICRuPTA7ZnVuY3Rpb24gd24oZSl7dmFyIHQ9ZS5vcHRpb25zO2lmKGUuc3VwZXIpe3ZhciBuPXduKGUuc3VwZXIpO2lmKG4hPT1lLnN1cGVyT3B0aW9ucyl7ZS5zdXBlck9wdGlvbnM9bjt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdCxuPWUub3B0aW9ucyxyPWUuc2VhbGVkT3B0aW9ucztmb3IodmFyIGkgaW4gbiluW2ldIT09cltpXSYmKHR8fCh0PXt9KSx0W2ldPW5baV0pO3JldHVybiB0fShlKTtyJiZBKGUuZXh0ZW5kT3B0aW9ucyxyKSwodD1lLm9wdGlvbnM9RGUobixlLmV4dGVuZE9wdGlvbnMpKS5uYW1lJiYodC5jb21wb25lbnRzW3QubmFtZV09ZSl9fXJldHVybiB0fWZ1bmN0aW9uIENuKGUpe3RoaXMuX2luaXQoZSl9ZnVuY3Rpb24geG4oZSl7ZS5jaWQ9MDt2YXIgdD0xO2UuZXh0ZW5kPWZ1bmN0aW9uKGUpe2U9ZXx8e307dmFyIG49dGhpcyxyPW4uY2lkLGk9ZS5fQ3Rvcnx8KGUuX0N0b3I9e30pO2lmKGlbcl0pcmV0dXJuIGlbcl07dmFyIG89ZS5uYW1lfHxuLm9wdGlvbnMubmFtZSxhPWZ1bmN0aW9uKGUpe3RoaXMuX2luaXQoZSl9O3JldHVybihhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YSxhLmNpZD10KyssYS5vcHRpb25zPURlKG4ub3B0aW9ucyxlKSxhLnN1cGVyPW4sYS5vcHRpb25zLnByb3BzJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpdm4oZS5wcm90b3R5cGUsIl9wcm9wcyIsbil9KGEpLGEub3B0aW9ucy5jb21wdXRlZCYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLmNvbXB1dGVkO2Zvcih2YXIgbiBpbiB0KXluKGUucHJvdG90eXBlLG4sdFtuXSl9KGEpLGEuZXh0ZW5kPW4uZXh0ZW5kLGEubWl4aW49bi5taXhpbixhLnVzZT1uLnVzZSxJLmZvckVhY2goZnVuY3Rpb24oZSl7YVtlXT1uW2VdfSksbyYmKGEub3B0aW9ucy5jb21wb25lbnRzW29dPWEpLGEuc3VwZXJPcHRpb25zPW4ub3B0aW9ucyxhLmV4dGVuZE9wdGlvbnM9ZSxhLnNlYWxlZE9wdGlvbnM9QSh7fSxhLm9wdGlvbnMpLGlbcl09YSxhfX1mdW5jdGlvbiBrbihlKXtyZXR1cm4gZSYmKGUuQ3Rvci5vcHRpb25zLm5hbWV8fGUudGFnKX1mdW5jdGlvbiBBbihlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2UuaW5kZXhPZih0KT4tMToic3RyaW5nIj09dHlwZW9mIGU/ZS5zcGxpdCgiLCIpLmluZGV4T2YodCk+LTE6KG49ZSwiW29iamVjdCBSZWdFeHBdIj09PWEuY2FsbChuKSYmZS50ZXN0KHQpKTt2YXIgbn1mdW5jdGlvbiBPbihlLHQpe3ZhciBuPWUuY2FjaGUscj1lLmtleXMsaT1lLl92bm9kZTtmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtpZihhKXt2YXIgcz1hLm5hbWU7cyYmIXQocykmJlNuKG4sbyxyLGkpfX19ZnVuY3Rpb24gU24oZSx0LG4scil7dmFyIGk9ZVt0XTshaXx8ciYmaS50YWc9PT1yLnRhZ3x8aS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpLGVbdF09bnVsbCxoKG4sdCl9IWZ1bmN0aW9uKHQpe3QucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7bi5fdWlkPSRuKyssbi5faXNWdWU9ITAsdCYmdC5faXNDb21wb25lbnQ/ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLiRvcHRpb25zPU9iamVjdC5jcmVhdGUoZS5jb25zdHJ1Y3Rvci5vcHRpb25zKSxyPXQuX3BhcmVudFZub2RlO24ucGFyZW50PXQucGFyZW50LG4uX3BhcmVudFZub2RlPXI7dmFyIGk9ci5jb21wb25lbnRPcHRpb25zO24ucHJvcHNEYXRhPWkucHJvcHNEYXRhLG4uX3BhcmVudExpc3RlbmVycz1pLmxpc3RlbmVycyxuLl9yZW5kZXJDaGlsZHJlbj1pLmNoaWxkcmVuLG4uX2NvbXBvbmVudFRhZz1pLnRhZyx0LnJlbmRlciYmKG4ucmVuZGVyPXQucmVuZGVyLG4uc3RhdGljUmVuZGVyRm5zPXQuc3RhdGljUmVuZGVyRm5zKX0obix0KTpuLiRvcHRpb25zPURlKHduKG4uY29uc3RydWN0b3IpLHR8fHt9LG4pLG4uX3JlbmRlclByb3h5PW4sbi5fc2VsZj1uLGZ1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMsbj10LnBhcmVudDtpZihuJiYhdC5hYnN0cmFjdCl7Zm9yKDtuLiRvcHRpb25zLmFic3RyYWN0JiZuLiRwYXJlbnQ7KW49bi4kcGFyZW50O24uJGNoaWxkcmVuLnB1c2goZSl9ZS4kcGFyZW50PW4sZS4kcm9vdD1uP24uJHJvb3Q6ZSxlLiRjaGlsZHJlbj1bXSxlLiRyZWZzPXt9LGUuX3dhdGNoZXI9bnVsbCxlLl9pbmFjdGl2ZT1udWxsLGUuX2RpcmVjdEluYWN0aXZlPSExLGUuX2lzTW91bnRlZD0hMSxlLl9pc0Rlc3Ryb3llZD0hMSxlLl9pc0JlaW5nRGVzdHJveWVkPSExfShuKSxmdW5jdGlvbihlKXtlLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLl9oYXNIb29rRXZlbnQ9ITE7dmFyIHQ9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QmJld0KGUsdCl9KG4pLGZ1bmN0aW9uKHQpe3QuX3Zub2RlPW51bGwsdC5fc3RhdGljVHJlZXM9bnVsbDt2YXIgbj10LiRvcHRpb25zLHI9dC4kdm5vZGU9bi5fcGFyZW50Vm5vZGUsaT1yJiZyLmNvbnRleHQ7dC4kc2xvdHM9bHQobi5fcmVuZGVyQ2hpbGRyZW4saSksdC4kc2NvcGVkU2xvdHM9ZSx0Ll9jPWZ1bmN0aW9uKGUsbixyLGkpe3JldHVybiBIdCh0LGUsbixyLGksITEpfSx0LiRjcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGUsbixyLGkpe3JldHVybiBIdCh0LGUsbixyLGksITApfTt2YXIgbz1yJiZyLmRhdGE7eGUodCwiJGF0dHJzIixvJiZvLmF0dHJzfHxlLG51bGwsITApLHhlKHQsIiRsaXN0ZW5lcnMiLG4uX3BhcmVudExpc3RlbmVyc3x8ZSxudWxsLCEwKX0obiksUXQobiwiYmVmb3JlQ3JlYXRlIiksZnVuY3Rpb24oZSl7dmFyIHQ9dXQoZS4kb3B0aW9ucy5pbmplY3QsZSk7dCYmKCRlKCExKSxPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3hlKGUsbix0W25dKX0pLCRlKCEwKSl9KG4pLGhuKG4pLGZ1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMucHJvdmlkZTt0JiYoZS5fcHJvdmlkZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dC5jYWxsKGUpOnQpfShuKSxRdChuLCJjcmVhdGVkIiksbi4kb3B0aW9ucy5lbCYmbi4kbW91bnQobi4kb3B0aW9ucy5lbCl9fShDbiksZnVuY3Rpb24oZSl7dmFyIHQ9e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfX0sbj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BzfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCIkZGF0YSIsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCIkcHJvcHMiLG4pLGUucHJvdG90eXBlLiRzZXQ9a2UsZS5wcm90b3R5cGUuJGRlbGV0ZT1BZSxlLnByb3RvdHlwZS4kd2F0Y2g9ZnVuY3Rpb24oZSx0LG4pe2lmKHModCkpcmV0dXJuIGJuKHRoaXMsZSx0LG4pOyhuPW58fHt9KS51c2VyPSEwO3ZhciByPW5ldyBwbih0aGlzLGUsdCxuKTtpZihuLmltbWVkaWF0ZSl7dmFyIGk9J2NhbGxiYWNrIGZvciBpbW1lZGlhdGUgd2F0Y2hlciAiJytyLmV4cHJlc3Npb24rJyInO2xlKCksQmUodCx0aGlzLFtyLnZhbHVlXSx0aGlzLGkpLGZlKCl9cmV0dXJuIGZ1bmN0aW9uKCl7ci50ZWFyZG93bigpfX19KENuKSxmdW5jdGlvbihlKXt2YXIgdD0vXmhvb2s6LztlLnByb3RvdHlwZS4kb249ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzO2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBpPTAsbz1lLmxlbmd0aDtpPG87aSsrKXIuJG9uKGVbaV0sbik7ZWxzZShyLl9ldmVudHNbZV18fChyLl9ldmVudHNbZV09W10pKS5wdXNoKG4pLHQudGVzdChlKSYmKHIuX2hhc0hvb2tFdmVudD0hMCk7cmV0dXJuIHJ9LGUucHJvdG90eXBlLiRvbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztmdW5jdGlvbiByKCl7bi4kb2ZmKGUsciksdC5hcHBseShuLGFyZ3VtZW50cyl9cmV0dXJuIHIuZm49dCxuLiRvbihlLHIpLG59LGUucHJvdG90eXBlLiRvZmY9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBuLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxuO2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgcj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluLiRvZmYoZVtyXSx0KTtyZXR1cm4gbn12YXIgbyxhPW4uX2V2ZW50c1tlXTtpZighYSlyZXR1cm4gbjtpZighdClyZXR1cm4gbi5fZXZlbnRzW2VdPW51bGwsbjtmb3IodmFyIHM9YS5sZW5ndGg7cy0tOylpZigobz1hW3NdKT09PXR8fG8uZm49PT10KXthLnNwbGljZShzLDEpO2JyZWFrfXJldHVybiBufSxlLnByb3RvdHlwZS4kZW1pdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9ldmVudHNbZV07aWYodCl7dD10Lmxlbmd0aD4xP2sodCk6dDtmb3IodmFyIG49ayhhcmd1bWVudHMsMSkscj0nZXZlbnQgaGFuZGxlciBmb3IgIicrZSsnIicsaT0wLG89dC5sZW5ndGg7aTxvO2krKylCZSh0W2ldLHRoaXMsbix0aGlzLHIpfXJldHVybiB0aGlzfX0oQ24pLGZ1bmN0aW9uKGUpe2UucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLHI9bi4kZWwsaT1uLl92bm9kZSxvPUd0KG4pO24uX3Zub2RlPWUsbi4kZWw9aT9uLl9fcGF0Y2hfXyhpLGUpOm4uX19wYXRjaF9fKG4uJGVsLGUsdCwhMSksbygpLHImJihyLl9fdnVlX189bnVsbCksbi4kZWwmJihuLiRlbC5fX3Z1ZV9fPW4pLG4uJHZub2RlJiZuLiRwYXJlbnQmJm4uJHZub2RlPT09bi4kcGFyZW50Ll92bm9kZSYmKG4uJHBhcmVudC4kZWw9bi4kZWwpfSxlLnByb3RvdHlwZS4kZm9yY2VVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl93YXRjaGVyJiZ0aGlzLl93YXRjaGVyLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS4kZGVzdHJveT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIWUuX2lzQmVpbmdEZXN0cm95ZWQpe1F0KGUsImJlZm9yZURlc3Ryb3kiKSxlLl9pc0JlaW5nRGVzdHJveWVkPSEwO3ZhciB0PWUuJHBhcmVudDshdHx8dC5faXNCZWluZ0Rlc3Ryb3llZHx8ZS4kb3B0aW9ucy5hYnN0cmFjdHx8aCh0LiRjaGlsZHJlbixlKSxlLl93YXRjaGVyJiZlLl93YXRjaGVyLnRlYXJkb3duKCk7Zm9yKHZhciBuPWUuX3dhdGNoZXJzLmxlbmd0aDtuLS07KWUuX3dhdGNoZXJzW25dLnRlYXJkb3duKCk7ZS5fZGF0YS5fX29iX18mJmUuX2RhdGEuX19vYl9fLnZtQ291bnQtLSxlLl9pc0Rlc3Ryb3llZD0hMCxlLl9fcGF0Y2hfXyhlLl92bm9kZSxudWxsKSxRdChlLCJkZXN0cm95ZWQiKSxlLiRvZmYoKSxlLiRlbCYmKGUuJGVsLl9fdnVlX189bnVsbCksZS4kdm5vZGUmJihlLiR2bm9kZS5wYXJlbnQ9bnVsbCl9fX0oQ24pLGZ1bmN0aW9uKGUpe050KGUucHJvdG90eXBlKSxlLnByb3RvdHlwZS4kbmV4dFRpY2s9ZnVuY3Rpb24oZSl7cmV0dXJuIFFlKGUsdGhpcyl9LGUucHJvdG90eXBlLl9yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMsbj10LiRvcHRpb25zLHI9bi5yZW5kZXIsaT1uLl9wYXJlbnRWbm9kZTtpJiYodC4kc2NvcGVkU2xvdHM9ZHQoaS5kYXRhLnNjb3BlZFNsb3RzLHQuJHNsb3RzLHQuJHNjb3BlZFNsb3RzKSksdC4kdm5vZGU9aTt0cnl7VXQ9dCxlPXIuY2FsbCh0Ll9yZW5kZXJQcm94eSx0LiRjcmVhdGVFbGVtZW50KX1jYXRjaChuKXtIZShuLHQsInJlbmRlciIpLGU9dC5fdm5vZGV9ZmluYWxseXtVdD1udWxsfXJldHVybiBBcnJheS5pc0FycmF5KGUpJiYxPT09ZS5sZW5ndGgmJihlPWVbMF0pLGUgaW5zdGFuY2VvZiBwZXx8KGU9dmUoKSksZS5wYXJlbnQ9aSxlfX0oQ24pO3ZhciBUbj1bU3RyaW5nLFJlZ0V4cCxBcnJheV0sTm49e0tlZXBBbGl2ZTp7bmFtZToia2VlcC1hbGl2ZSIsYWJzdHJhY3Q6ITAscHJvcHM6e2luY2x1ZGU6VG4sZXhjbHVkZTpUbixtYXg6W1N0cmluZyxOdW1iZXJdfSxtZXRob2RzOntjYWNoZVZOb2RlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jYWNoZSx0PXRoaXMua2V5cyxuPXRoaXMudm5vZGVUb0NhY2hlLHI9dGhpcy5rZXlUb0NhY2hlO2lmKG4pe3ZhciBpPW4udGFnLG89bi5jb21wb25lbnRJbnN0YW5jZSxhPW4uY29tcG9uZW50T3B0aW9ucztlW3JdPXtuYW1lOmtuKGEpLHRhZzppLGNvbXBvbmVudEluc3RhbmNlOm99LHQucHVzaChyKSx0aGlzLm1heCYmdC5sZW5ndGg+cGFyc2VJbnQodGhpcy5tYXgpJiZTbihlLHRbMF0sdCx0aGlzLl92bm9kZSksdGhpcy52bm9kZVRvQ2FjaGU9bnVsbH19fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5jYWNoZT1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMua2V5cz1bXX0sZGVzdHJveWVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuY2FjaGUpU24odGhpcy5jYWNoZSxlLHRoaXMua2V5cyl9LG1vdW50ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuY2FjaGVWTm9kZSgpLHRoaXMuJHdhdGNoKCJpbmNsdWRlIixmdW5jdGlvbih0KXtPbihlLGZ1bmN0aW9uKGUpe3JldHVybiBBbih0LGUpfSl9KSx0aGlzLiR3YXRjaCgiZXhjbHVkZSIsZnVuY3Rpb24odCl7T24oZSxmdW5jdGlvbihlKXtyZXR1cm4hQW4odCxlKX0pfSl9LHVwZGF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhY2hlVk5vZGUoKX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kc2xvdHMuZGVmYXVsdCx0PXp0KGUpLG49dCYmdC5jb21wb25lbnRPcHRpb25zO2lmKG4pe3ZhciByPWtuKG4pLGk9dGhpcy5pbmNsdWRlLG89dGhpcy5leGNsdWRlO2lmKGkmJighcnx8IUFuKGkscikpfHxvJiZyJiZBbihvLHIpKXJldHVybiB0O3ZhciBhPXRoaXMuY2FjaGUscz10aGlzLmtleXMsYz1udWxsPT10LmtleT9uLkN0b3IuY2lkKyhuLnRhZz8iOjoiK24udGFnOiIiKTp0LmtleTthW2NdPyh0LmNvbXBvbmVudEluc3RhbmNlPWFbY10uY29tcG9uZW50SW5zdGFuY2UsaChzLGMpLHMucHVzaChjKSk6KHRoaXMudm5vZGVUb0NhY2hlPXQsdGhpcy5rZXlUb0NhY2hlPWMpLHQuZGF0YS5rZWVwQWxpdmU9ITB9cmV0dXJuIHR8fGUmJmVbMF19fX07IWZ1bmN0aW9uKGUpe3ZhciB0PXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRn19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJjb25maWciLHQpLGUudXRpbD17d2FybjphZSxleHRlbmQ6QSxtZXJnZU9wdGlvbnM6RGUsZGVmaW5lUmVhY3RpdmU6eGV9LGUuc2V0PWtlLGUuZGVsZXRlPUFlLGUubmV4dFRpY2s9UWUsZS5vYnNlcnZhYmxlPWZ1bmN0aW9uKGUpe3JldHVybiBDZShlKSxlfSxlLm9wdGlvbnM9T2JqZWN0LmNyZWF0ZShudWxsKSxJLmZvckVhY2goZnVuY3Rpb24odCl7ZS5vcHRpb25zW3QrInMiXT1PYmplY3QuY3JlYXRlKG51bGwpfSksZS5vcHRpb25zLl9iYXNlPWUsQShlLm9wdGlvbnMuY29tcG9uZW50cyxObiksZnVuY3Rpb24oZSl7ZS51c2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5faW5zdGFsbGVkUGx1Z2luc3x8KHRoaXMuX2luc3RhbGxlZFBsdWdpbnM9W10pO2lmKHQuaW5kZXhPZihlKT4tMSlyZXR1cm4gdGhpczt2YXIgbj1rKGFyZ3VtZW50cywxKTtyZXR1cm4gbi51bnNoaWZ0KHRoaXMpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLmluc3RhbGw/ZS5pbnN0YWxsLmFwcGx5KGUsbik6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUuYXBwbHkobnVsbCxuKSx0LnB1c2goZSksdGhpc319KGUpLGZ1bmN0aW9uKGUpe2UubWl4aW49ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3B0aW9ucz1EZSh0aGlzLm9wdGlvbnMsZSksdGhpc319KGUpLHhuKGUpLGZ1bmN0aW9uKGUpe0kuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG4/KCJjb21wb25lbnQiPT09dCYmcyhuKSYmKG4ubmFtZT1uLm5hbWV8fGUsbj10aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKG4pKSwiZGlyZWN0aXZlIj09PXQmJiJmdW5jdGlvbiI9PXR5cGVvZiBuJiYobj17YmluZDpuLHVwZGF0ZTpufSksdGhpcy5vcHRpb25zW3QrInMiXVtlXT1uLG4pOnRoaXMub3B0aW9uc1t0KyJzIl1bZV19fSl9KGUpfShDbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KENuLnByb3RvdHlwZSwiJGlzU2VydmVyIix7Z2V0OnRlfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KENuLnByb3RvdHlwZSwiJHNzckNvbnRleHQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdm5vZGUmJnRoaXMuJHZub2RlLnNzckNvbnRleHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KENuLCJGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCIse3ZhbHVlOkV0fSksQ24udmVyc2lvbj0iMi42LjE0Ijt2YXIgRW49cCgic3R5bGUsY2xhc3MiKSxqbj1wKCJpbnB1dCx0ZXh0YXJlYSxvcHRpb24sc2VsZWN0LHByb2dyZXNzIiksRG49ZnVuY3Rpb24oZSx0LG4pe3JldHVybiJ2YWx1ZSI9PT1uJiZqbihlKSYmImJ1dHRvbiIhPT10fHwic2VsZWN0ZWQiPT09biYmIm9wdGlvbiI9PT1lfHwiY2hlY2tlZCI9PT1uJiYiaW5wdXQiPT09ZXx8Im11dGVkIj09PW4mJiJ2aWRlbyI9PT1lfSxMbj1wKCJjb250ZW50ZWRpdGFibGUsZHJhZ2dhYmxlLHNwZWxsY2hlY2siKSxJbj1wKCJldmVudHMsY2FyZXQsdHlwaW5nLHBsYWludGV4dC1vbmx5IiksTW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gQm4odCl8fCJmYWxzZSI9PT10PyJmYWxzZSI6ImNvbnRlbnRlZGl0YWJsZSI9PT1lJiZJbih0KT90OiJ0cnVlIn0sRm49cCgiYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSxkZWZhdWx0LGRlZmF1bHRjaGVja2VkLGRlZmF1bHRtdXRlZCxkZWZhdWx0c2VsZWN0ZWQsZGVmZXIsZGlzYWJsZWQsZW5hYmxlZCxmb3Jtbm92YWxpZGF0ZSxoaWRkZW4saW5kZXRlcm1pbmF0ZSxpbmVydCxpc21hcCxpdGVtc2NvcGUsbG9vcCxtdWx0aXBsZSxtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LHJlcXVpcmVkLHJldmVyc2VkLHNjb3BlZCxzZWFtbGVzcyxzZWxlY3RlZCxzb3J0YWJsZSx0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlIiksUG49Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLFJuPWZ1bmN0aW9uKGUpe3JldHVybiI6Ij09PWUuY2hhckF0KDUpJiYieGxpbmsiPT09ZS5zbGljZSgwLDUpfSxIbj1mdW5jdGlvbihlKXtyZXR1cm4gUm4oZSk/ZS5zbGljZSg2LGUubGVuZ3RoKToiIn0sQm49ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV8fCExPT09ZX07ZnVuY3Rpb24gVW4oZSl7Zm9yKHZhciB0PWUuZGF0YSxyPWUsaT1lO24oaS5jb21wb25lbnRJbnN0YW5jZSk7KShpPWkuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmaS5kYXRhJiYodD1WbihpLmRhdGEsdCkpO2Zvcig7bihyPXIucGFyZW50KTspciYmci5kYXRhJiYodD1Wbih0LHIuZGF0YSkpO3JldHVybiBmdW5jdGlvbihlLHQpe2lmKG4oZSl8fG4odCkpcmV0dXJuIHpuKGUsS24odCkpO3JldHVybiIifSh0LnN0YXRpY0NsYXNzLHQuY2xhc3MpfWZ1bmN0aW9uIFZuKGUsdCl7cmV0dXJue3N0YXRpY0NsYXNzOnpuKGUuc3RhdGljQ2xhc3MsdC5zdGF0aWNDbGFzcyksY2xhc3M6bihlLmNsYXNzKT9bZS5jbGFzcyx0LmNsYXNzXTp0LmNsYXNzfX1mdW5jdGlvbiB6bihlLHQpe3JldHVybiBlP3Q/ZSsiICIrdDplOnR8fCIifWZ1bmN0aW9uIEtuKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdCxyPSIiLGk9MCxvPWUubGVuZ3RoO2k8bztpKyspbih0PUtuKGVbaV0pKSYmIiIhPT10JiYociYmKHIrPSIgIikscis9dCk7cmV0dXJuIHJ9KGUpOm8oZSk/ZnVuY3Rpb24oZSl7dmFyIHQ9IiI7Zm9yKHZhciBuIGluIGUpZVtuXSYmKHQmJih0Kz0iICIpLHQrPW4pO3JldHVybiB0fShlKToic3RyaW5nIj09dHlwZW9mIGU/ZToiIn12YXIgSm49e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLG1hdGg6Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwifSxxbj1wKCJodG1sLGJvZHksYmFzZSxoZWFkLGxpbmssbWV0YSxzdHlsZSx0aXRsZSxhZGRyZXNzLGFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixoMSxoMixoMyxoNCxoNSxoNixoZ3JvdXAsbmF2LHNlY3Rpb24sZGl2LGRkLGRsLGR0LGZpZ2NhcHRpb24sZmlndXJlLHBpY3R1cmUsaHIsaW1nLGxpLG1haW4sb2wscCxwcmUsdWwsYSxiLGFiYnIsYmRpLGJkbyxicixjaXRlLGNvZGUsZGF0YSxkZm4sZW0saSxrYmQsbWFyayxxLHJwLHJ0LHJ0YyxydWJ5LHMsc2FtcCxzbWFsbCxzcGFuLHN0cm9uZyxzdWIsc3VwLHRpbWUsdSx2YXIsd2JyLGFyZWEsYXVkaW8sbWFwLHRyYWNrLHZpZGVvLGVtYmVkLG9iamVjdCxwYXJhbSxzb3VyY2UsY2FudmFzLHNjcmlwdCxub3NjcmlwdCxkZWwsaW5zLGNhcHRpb24sY29sLGNvbGdyb3VwLHRhYmxlLHRoZWFkLHRib2R5LHRkLHRoLHRyLGJ1dHRvbixkYXRhbGlzdCxmaWVsZHNldCxmb3JtLGlucHV0LGxhYmVsLGxlZ2VuZCxtZXRlcixvcHRncm91cCxvcHRpb24sb3V0cHV0LHByb2dyZXNzLHNlbGVjdCx0ZXh0YXJlYSxkZXRhaWxzLGRpYWxvZyxtZW51LG1lbnVpdGVtLHN1bW1hcnksY29udGVudCxlbGVtZW50LHNoYWRvdyx0ZW1wbGF0ZSxibG9ja3F1b3RlLGlmcmFtZSx0Zm9vdCIpLFduPXAoInN2ZyxhbmltYXRlLGNpcmNsZSxjbGlwcGF0aCxjdXJzb3IsZGVmcyxkZXNjLGVsbGlwc2UsZmlsdGVyLGZvbnQtZmFjZSxmb3JlaWdub2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybixwb2x5Z29uLHBvbHlsaW5lLHJlY3Qsc3dpdGNoLHN5bWJvbCx0ZXh0LHRleHRwYXRoLHRzcGFuLHVzZSx2aWV3IiwhMCksWm49ZnVuY3Rpb24oZSl7cmV0dXJuIHFuKGUpfHxXbihlKX07ZnVuY3Rpb24gR24oZSl7cmV0dXJuIFduKGUpPyJzdmciOiJtYXRoIj09PWU/Im1hdGgiOnZvaWQgMH12YXIgWG49T2JqZWN0LmNyZWF0ZShudWxsKTt2YXIgWW49cCgidGV4dCxudW1iZXIscGFzc3dvcmQsc2VhcmNoLGVtYWlsLHRlbCx1cmwiKTtmdW5jdGlvbiBRbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSk7cmV0dXJuIHR8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpfXJldHVybiBlfXZhciBlcj1PYmplY3QuZnJlZXplKHtjcmVhdGVFbGVtZW50OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlKTtyZXR1cm4ic2VsZWN0IiE9PWU/bjoodC5kYXRhJiZ0LmRhdGEuYXR0cnMmJnZvaWQgMCE9PXQuZGF0YS5hdHRycy5tdWx0aXBsZSYmbi5zZXRBdHRyaWJ1dGUoIm11bHRpcGxlIiwibXVsdGlwbGUiKSxuKX0sY3JlYXRlRWxlbWVudE5TOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhKbltlXSx0KX0sY3JlYXRlVGV4dE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGUpfSxjcmVhdGVDb21tZW50OmZ1bmN0aW9uKGUpe3JldHVybiBkb2N1bWVudC5jcmVhdGVDb21tZW50KGUpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24oZSx0LG4pe2UuaW5zZXJ0QmVmb3JlKHQsbil9LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGUsdCl7ZS5yZW1vdmVDaGlsZCh0KX0sYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24oZSx0KXtlLmFwcGVuZENoaWxkKHQpfSxwYXJlbnROb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnBhcmVudE5vZGV9LG5leHRTaWJsaW5nOmZ1bmN0aW9uKGUpe3JldHVybiBlLm5leHRTaWJsaW5nfSx0YWdOYW1lOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRhZ05hbWV9LHNldFRleHRDb250ZW50OmZ1bmN0aW9uKGUsdCl7ZS50ZXh0Q29udGVudD10fSxzZXRTdHlsZVNjb3BlOmZ1bmN0aW9uKGUsdCl7ZS5zZXRBdHRyaWJ1dGUodCwiIil9fSksdHI9e2NyZWF0ZTpmdW5jdGlvbihlLHQpe25yKHQpfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXtlLmRhdGEucmVmIT09dC5kYXRhLnJlZiYmKG5yKGUsITApLG5yKHQpKX0sZGVzdHJveTpmdW5jdGlvbihlKXtucihlLCEwKX19O2Z1bmN0aW9uIG5yKGUsdCl7dmFyIHI9ZS5kYXRhLnJlZjtpZihuKHIpKXt2YXIgaT1lLmNvbnRleHQsbz1lLmNvbXBvbmVudEluc3RhbmNlfHxlLmVsbSxhPWkuJHJlZnM7dD9BcnJheS5pc0FycmF5KGFbcl0pP2goYVtyXSxvKTphW3JdPT09byYmKGFbcl09dm9pZCAwKTplLmRhdGEucmVmSW5Gb3I/QXJyYXkuaXNBcnJheShhW3JdKT9hW3JdLmluZGV4T2Yobyk8MCYmYVtyXS5wdXNoKG8pOmFbcl09W29dOmFbcl09b319dmFyIHJyPW5ldyBwZSgiIix7fSxbXSksaXI9WyJjcmVhdGUiLCJhY3RpdmF0ZSIsInVwZGF0ZSIsInJlbW92ZSIsImRlc3Ryb3kiXTtmdW5jdGlvbiBvcihlLGkpe3JldHVybiBlLmtleT09PWkua2V5JiZlLmFzeW5jRmFjdG9yeT09PWkuYXN5bmNGYWN0b3J5JiYoZS50YWc9PT1pLnRhZyYmZS5pc0NvbW1lbnQ9PT1pLmlzQ29tbWVudCYmbihlLmRhdGEpPT09bihpLmRhdGEpJiZmdW5jdGlvbihlLHQpe2lmKCJpbnB1dCIhPT1lLnRhZylyZXR1cm4hMDt2YXIgcixpPW4ocj1lLmRhdGEpJiZuKHI9ci5hdHRycykmJnIudHlwZSxvPW4ocj10LmRhdGEpJiZuKHI9ci5hdHRycykmJnIudHlwZTtyZXR1cm4gaT09PW98fFluKGkpJiZZbihvKX0oZSxpKXx8cihlLmlzQXN5bmNQbGFjZWhvbGRlcikmJnQoaS5hc3luY0ZhY3RvcnkuZXJyb3IpKX1mdW5jdGlvbiBhcihlLHQscil7dmFyIGksbyxhPXt9O2ZvcihpPXQ7aTw9cjsrK2kpbihvPWVbaV0ua2V5KSYmKGFbb109aSk7cmV0dXJuIGF9dmFyIHNyPXtjcmVhdGU6Y3IsdXBkYXRlOmNyLGRlc3Ryb3k6ZnVuY3Rpb24oZSl7Y3IoZSxycil9fTtmdW5jdGlvbiBjcihlLHQpeyhlLmRhdGEuZGlyZWN0aXZlc3x8dC5kYXRhLmRpcmVjdGl2ZXMpJiZmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvPWU9PT1ycixhPXQ9PT1ycixzPWxyKGUuZGF0YS5kaXJlY3RpdmVzLGUuY29udGV4dCksYz1scih0LmRhdGEuZGlyZWN0aXZlcyx0LmNvbnRleHQpLHU9W10sbD1bXTtmb3IobiBpbiBjKXI9c1tuXSxpPWNbbl0scj8oaS5vbGRWYWx1ZT1yLnZhbHVlLGkub2xkQXJnPXIuYXJnLHByKGksInVwZGF0ZSIsdCxlKSxpLmRlZiYmaS5kZWYuY29tcG9uZW50VXBkYXRlZCYmbC5wdXNoKGkpKToocHIoaSwiYmluZCIsdCxlKSxpLmRlZiYmaS5kZWYuaW5zZXJ0ZWQmJnUucHVzaChpKSk7aWYodS5sZW5ndGgpe3ZhciBmPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTA7bjx1Lmxlbmd0aDtuKyspcHIodVtuXSwiaW5zZXJ0ZWQiLHQsZSl9O28/b3QodCwiaW5zZXJ0IixmKTpmKCl9bC5sZW5ndGgmJm90KHQsInBvc3RwYXRjaCIsZnVuY3Rpb24oKXtmb3IodmFyIG49MDtuPGwubGVuZ3RoO24rKylwcihsW25dLCJjb21wb25lbnRVcGRhdGVkIix0LGUpfSk7aWYoIW8pZm9yKG4gaW4gcyljW25dfHxwcihzW25dLCJ1bmJpbmQiLGUsZSxhKX0oZSx0KX12YXIgdXI9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBscihlLHQpe3ZhciBuLHIsaT1PYmplY3QuY3JlYXRlKG51bGwpO2lmKCFlKXJldHVybiBpO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspKHI9ZVtuXSkubW9kaWZpZXJzfHwoci5tb2RpZmllcnM9dXIpLGlbZnIocildPXIsci5kZWY9TGUodC4kb3B0aW9ucywiZGlyZWN0aXZlcyIsci5uYW1lKTtyZXR1cm4gaX1mdW5jdGlvbiBmcihlKXtyZXR1cm4gZS5yYXdOYW1lfHxlLm5hbWUrIi4iK09iamVjdC5rZXlzKGUubW9kaWZpZXJzfHx7fSkuam9pbigiLiIpfWZ1bmN0aW9uIHByKGUsdCxuLHIsaSl7dmFyIG89ZS5kZWYmJmUuZGVmW3RdO2lmKG8pdHJ5e28obi5lbG0sZSxuLHIsaSl9Y2F0Y2gocil7SGUocixuLmNvbnRleHQsImRpcmVjdGl2ZSAiK2UubmFtZSsiICIrdCsiIGhvb2siKX19dmFyIGRyPVt0cixzcl07ZnVuY3Rpb24gdnIoZSxyKXt2YXIgaT1yLmNvbXBvbmVudE9wdGlvbnM7aWYoIShuKGkpJiYhMT09PWkuQ3Rvci5vcHRpb25zLmluaGVyaXRBdHRyc3x8dChlLmRhdGEuYXR0cnMpJiZ0KHIuZGF0YS5hdHRycykpKXt2YXIgbyxhLHM9ci5lbG0sYz1lLmRhdGEuYXR0cnN8fHt9LHU9ci5kYXRhLmF0dHJzfHx7fTtmb3IobyBpbiBuKHUuX19vYl9fKSYmKHU9ci5kYXRhLmF0dHJzPUEoe30sdSkpLHUpYT11W29dLGNbb10hPT1hJiZocihzLG8sYSxyLmRhdGEucHJlKTtmb3IobyBpbihxfHxaKSYmdS52YWx1ZSE9PWMudmFsdWUmJmhyKHMsInZhbHVlIix1LnZhbHVlKSxjKXQodVtvXSkmJihSbihvKT9zLnJlbW92ZUF0dHJpYnV0ZU5TKFBuLEhuKG8pKTpMbihvKXx8cy5yZW1vdmVBdHRyaWJ1dGUobykpfX1mdW5jdGlvbiBocihlLHQsbixyKXtyfHxlLnRhZ05hbWUuaW5kZXhPZigiLSIpPi0xP21yKGUsdCxuKTpGbih0KT9CbihuKT9lLnJlbW92ZUF0dHJpYnV0ZSh0KToobj0iYWxsb3dmdWxsc2NyZWVuIj09PXQmJiJFTUJFRCI9PT1lLnRhZ05hbWU/InRydWUiOnQsZS5zZXRBdHRyaWJ1dGUodCxuKSk6TG4odCk/ZS5zZXRBdHRyaWJ1dGUodCxNbih0LG4pKTpSbih0KT9CbihuKT9lLnJlbW92ZUF0dHJpYnV0ZU5TKFBuLEhuKHQpKTplLnNldEF0dHJpYnV0ZU5TKFBuLHQsbik6bXIoZSx0LG4pfWZ1bmN0aW9uIG1yKGUsdCxuKXtpZihCbihuKSllLnJlbW92ZUF0dHJpYnV0ZSh0KTtlbHNle2lmKHEmJiFXJiYiVEVYVEFSRUEiPT09ZS50YWdOYW1lJiYicGxhY2Vob2xkZXIiPT09dCYmIiIhPT1uJiYhZS5fX2llcGgpe3ZhciByPWZ1bmN0aW9uKHQpe3Quc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksZS5yZW1vdmVFdmVudExpc3RlbmVyKCJpbnB1dCIscil9O2UuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHIpLGUuX19pZXBoPSEwfWUuc2V0QXR0cmlidXRlKHQsbil9fXZhciB5cj17Y3JlYXRlOnZyLHVwZGF0ZTp2cn07ZnVuY3Rpb24gZ3IoZSxyKXt2YXIgaT1yLmVsbSxvPXIuZGF0YSxhPWUuZGF0YTtpZighKHQoby5zdGF0aWNDbGFzcykmJnQoby5jbGFzcykmJih0KGEpfHx0KGEuc3RhdGljQ2xhc3MpJiZ0KGEuY2xhc3MpKSkpe3ZhciBzPVVuKHIpLGM9aS5fdHJhbnNpdGlvbkNsYXNzZXM7bihjKSYmKHM9em4ocyxLbihjKSkpLHMhPT1pLl9wcmV2Q2xhc3MmJihpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpLGkuX3ByZXZDbGFzcz1zKX19dmFyIF9yLGJyLCRyLHdyLENyLHhyLGtyPXtjcmVhdGU6Z3IsdXBkYXRlOmdyfSxBcj0vW1x3KS4rXC1fJFxdXS87ZnVuY3Rpb24gT3IoZSl7dmFyIHQsbixyLGksbyxhPSExLHM9ITEsYz0hMSx1PSExLGw9MCxmPTAscD0wLGQ9MDtmb3Iocj0wO3I8ZS5sZW5ndGg7cisrKWlmKG49dCx0PWUuY2hhckNvZGVBdChyKSxhKTM5PT09dCYmOTIhPT1uJiYoYT0hMSk7ZWxzZSBpZihzKTM0PT09dCYmOTIhPT1uJiYocz0hMSk7ZWxzZSBpZihjKTk2PT09dCYmOTIhPT1uJiYoYz0hMSk7ZWxzZSBpZih1KTQ3PT09dCYmOTIhPT1uJiYodT0hMSk7ZWxzZSBpZigxMjQhPT10fHwxMjQ9PT1lLmNoYXJDb2RlQXQocisxKXx8MTI0PT09ZS5jaGFyQ29kZUF0KHItMSl8fGx8fGZ8fHApe3N3aXRjaCh0KXtjYXNlIDM0OnM9ITA7YnJlYWs7Y2FzZSAzOTphPSEwO2JyZWFrO2Nhc2UgOTY6Yz0hMDticmVhaztjYXNlIDQwOnArKzticmVhaztjYXNlIDQxOnAtLTticmVhaztjYXNlIDkxOmYrKzticmVhaztjYXNlIDkzOmYtLTticmVhaztjYXNlIDEyMzpsKys7YnJlYWs7Y2FzZSAxMjU6bC0tfWlmKDQ3PT09dCl7Zm9yKHZhciB2PXItMSxoPXZvaWQgMDt2Pj0wJiYiICI9PT0oaD1lLmNoYXJBdCh2KSk7di0tKTtoJiZBci50ZXN0KGgpfHwodT0hMCl9fWVsc2Ugdm9pZCAwPT09aT8oZD1yKzEsaT1lLnNsaWNlKDAscikudHJpbSgpKTptKCk7ZnVuY3Rpb24gbSgpeyhvfHwobz1bXSkpLnB1c2goZS5zbGljZShkLHIpLnRyaW0oKSksZD1yKzF9aWYodm9pZCAwPT09aT9pPWUuc2xpY2UoMCxyKS50cmltKCk6MCE9PWQmJm0oKSxvKWZvcihyPTA7cjxvLmxlbmd0aDtyKyspaT1TcihpLG9bcl0pO3JldHVybiBpfWZ1bmN0aW9uIFNyKGUsdCl7dmFyIG49dC5pbmRleE9mKCIoIik7aWYobjwwKXJldHVybidfZigiJyt0KyciKSgnK2UrIikiO3ZhciByPXQuc2xpY2UoMCxuKSxpPXQuc2xpY2UobisxKTtyZXR1cm4nX2YoIicrcisnIikoJytlKygiKSIhPT1pPyIsIitpOmkpfWZ1bmN0aW9uIFRyKGUsdCl7Y29uc29sZS5lcnJvcigiW1Z1ZSBjb21waWxlcl06ICIrZSl9ZnVuY3Rpb24gTnIoZSx0KXtyZXR1cm4gZT9lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZVt0XX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZX0pOltdfWZ1bmN0aW9uIEVyKGUsdCxuLHIsaSl7KGUucHJvcHN8fChlLnByb3BzPVtdKSkucHVzaChIcih7bmFtZTp0LHZhbHVlOm4sZHluYW1pYzppfSxyKSksZS5wbGFpbj0hMX1mdW5jdGlvbiBqcihlLHQsbixyLGkpeyhpP2UuZHluYW1pY0F0dHJzfHwoZS5keW5hbWljQXR0cnM9W10pOmUuYXR0cnN8fChlLmF0dHJzPVtdKSkucHVzaChIcih7bmFtZTp0LHZhbHVlOm4sZHluYW1pYzppfSxyKSksZS5wbGFpbj0hMX1mdW5jdGlvbiBEcihlLHQsbixyKXtlLmF0dHJzTWFwW3RdPW4sZS5hdHRyc0xpc3QucHVzaChIcih7bmFtZTp0LHZhbHVlOm59LHIpKX1mdW5jdGlvbiBMcihlLHQsbixyLGksbyxhLHMpeyhlLmRpcmVjdGl2ZXN8fChlLmRpcmVjdGl2ZXM9W10pKS5wdXNoKEhyKHtuYW1lOnQscmF3TmFtZTpuLHZhbHVlOnIsYXJnOmksaXNEeW5hbWljQXJnOm8sbW9kaWZpZXJzOmF9LHMpKSxlLnBsYWluPSExfWZ1bmN0aW9uIElyKGUsdCxuKXtyZXR1cm4gbj8iX3AoIit0KycsIicrZSsnIiknOmUrdH1mdW5jdGlvbiBNcih0LG4scixpLG8sYSxzLGMpe3ZhciB1OyhpPWl8fGUpLnJpZ2h0P2M/bj0iKCIrbisiKT09PSdjbGljayc/J2NvbnRleHRtZW51JzooIituKyIpIjoiY2xpY2siPT09biYmKG49ImNvbnRleHRtZW51IixkZWxldGUgaS5yaWdodCk6aS5taWRkbGUmJihjP249IigiK24rIik9PT0nY2xpY2snPydtb3VzZXVwJzooIituKyIpIjoiY2xpY2siPT09biYmKG49Im1vdXNldXAiKSksaS5jYXB0dXJlJiYoZGVsZXRlIGkuY2FwdHVyZSxuPUlyKCIhIixuLGMpKSxpLm9uY2UmJihkZWxldGUgaS5vbmNlLG49SXIoIn4iLG4sYykpLGkucGFzc2l2ZSYmKGRlbGV0ZSBpLnBhc3NpdmUsbj1JcigiJiIsbixjKSksaS5uYXRpdmU/KGRlbGV0ZSBpLm5hdGl2ZSx1PXQubmF0aXZlRXZlbnRzfHwodC5uYXRpdmVFdmVudHM9e30pKTp1PXQuZXZlbnRzfHwodC5ldmVudHM9e30pO3ZhciBsPUhyKHt2YWx1ZTpyLnRyaW0oKSxkeW5hbWljOmN9LHMpO2khPT1lJiYobC5tb2RpZmllcnM9aSk7dmFyIGY9dVtuXTtBcnJheS5pc0FycmF5KGYpP28/Zi51bnNoaWZ0KGwpOmYucHVzaChsKTp1W25dPWY/bz9bbCxmXTpbZixsXTpsLHQucGxhaW49ITF9ZnVuY3Rpb24gRnIoZSx0LG4pe3ZhciByPVByKGUsIjoiK3QpfHxQcihlLCJ2LWJpbmQ6Iit0KTtpZihudWxsIT1yKXJldHVybiBPcihyKTtpZighMSE9PW4pe3ZhciBpPVByKGUsdCk7aWYobnVsbCE9aSlyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaSl9fWZ1bmN0aW9uIFByKGUsdCxuKXt2YXIgcjtpZihudWxsIT0ocj1lLmF0dHJzTWFwW3RdKSlmb3IodmFyIGk9ZS5hdHRyc0xpc3Qsbz0wLGE9aS5sZW5ndGg7bzxhO28rKylpZihpW29dLm5hbWU9PT10KXtpLnNwbGljZShvLDEpO2JyZWFrfXJldHVybiBuJiZkZWxldGUgZS5hdHRyc01hcFt0XSxyfWZ1bmN0aW9uIFJyKGUsdCl7Zm9yKHZhciBuPWUuYXR0cnNMaXN0LHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07aWYodC50ZXN0KG8ubmFtZSkpcmV0dXJuIG4uc3BsaWNlKHIsMSksb319ZnVuY3Rpb24gSHIoZSx0KXtyZXR1cm4gdCYmKG51bGwhPXQuc3RhcnQmJihlLnN0YXJ0PXQuc3RhcnQpLG51bGwhPXQuZW5kJiYoZS5lbmQ9dC5lbmQpKSxlfWZ1bmN0aW9uIEJyKGUsdCxuKXt2YXIgcj1ufHx7fSxpPXIubnVtYmVyLG89IiQkdiI7ci50cmltJiYobz0iKHR5cGVvZiAkJHYgPT09ICdzdHJpbmcnPyAkJHYudHJpbSgpOiAkJHYpIiksaSYmKG89Il9uKCIrbysiKSIpO3ZhciBhPVVyKHQsbyk7ZS5tb2RlbD17dmFsdWU6IigiK3QrIikiLGV4cHJlc3Npb246SlNPTi5zdHJpbmdpZnkodCksY2FsbGJhY2s6ImZ1bmN0aW9uICgkJHYpIHsiK2ErIn0ifX1mdW5jdGlvbiBVcihlLHQpe3ZhciBuPWZ1bmN0aW9uKGUpe2lmKGU9ZS50cmltKCksX3I9ZS5sZW5ndGgsZS5pbmRleE9mKCJbIik8MHx8ZS5sYXN0SW5kZXhPZigiXSIpPF9yLTEpcmV0dXJuKHdyPWUubGFzdEluZGV4T2YoIi4iKSk+LTE/e2V4cDplLnNsaWNlKDAsd3IpLGtleTonIicrZS5zbGljZSh3cisxKSsnIid9OntleHA6ZSxrZXk6bnVsbH07YnI9ZSx3cj1Dcj14cj0wO2Zvcig7IXpyKCk7KUtyKCRyPVZyKCkpP3FyKCRyKTo5MT09PSRyJiZKcigkcik7cmV0dXJue2V4cDplLnNsaWNlKDAsQ3IpLGtleTplLnNsaWNlKENyKzEseHIpfX0oZSk7cmV0dXJuIG51bGw9PT1uLmtleT9lKyI9Iit0OiIkc2V0KCIrbi5leHArIiwgIituLmtleSsiLCAiK3QrIikifWZ1bmN0aW9uIFZyKCl7cmV0dXJuIGJyLmNoYXJDb2RlQXQoKyt3cil9ZnVuY3Rpb24genIoKXtyZXR1cm4gd3I+PV9yfWZ1bmN0aW9uIEtyKGUpe3JldHVybiAzND09PWV8fDM5PT09ZX1mdW5jdGlvbiBKcihlKXt2YXIgdD0xO2ZvcihDcj13cjshenIoKTspaWYoS3IoZT1WcigpKSlxcihlKTtlbHNlIGlmKDkxPT09ZSYmdCsrLDkzPT09ZSYmdC0tLDA9PT10KXt4cj13cjticmVha319ZnVuY3Rpb24gcXIoZSl7Zm9yKHZhciB0PWU7IXpyKCkmJihlPVZyKCkpIT09dDspO312YXIgV3IsWnI9Il9fciIsR3I9Il9fYyI7ZnVuY3Rpb24gWHIoZSx0LG4pe3ZhciByPVdyO3JldHVybiBmdW5jdGlvbiBpKCl7bnVsbCE9PXQuYXBwbHkobnVsbCxhcmd1bWVudHMpJiZlaShlLGksbixyKX19dmFyIFlyPUtlJiYhKFgmJk51bWJlcihYWzFdKTw9NTMpO2Z1bmN0aW9uIFFyKGUsdCxuLHIpe2lmKFlyKXt2YXIgaT1zbixvPXQ7dD1vLl93cmFwcGVyPWZ1bmN0aW9uKGUpe2lmKGUudGFyZ2V0PT09ZS5jdXJyZW50VGFyZ2V0fHxlLnRpbWVTdGFtcD49aXx8ZS50aW1lU3RhbXA8PTB8fGUudGFyZ2V0Lm93bmVyRG9jdW1lbnQhPT1kb2N1bWVudClyZXR1cm4gby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fVdyLmFkZEV2ZW50TGlzdGVuZXIoZSx0LFE/e2NhcHR1cmU6bixwYXNzaXZlOnJ9Om4pfWZ1bmN0aW9uIGVpKGUsdCxuLHIpeyhyfHxXcikucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQuX3dyYXBwZXJ8fHQsbil9ZnVuY3Rpb24gdGkoZSxyKXtpZighdChlLmRhdGEub24pfHwhdChyLmRhdGEub24pKXt2YXIgaT1yLmRhdGEub258fHt9LG89ZS5kYXRhLm9ufHx7fTtXcj1yLmVsbSxmdW5jdGlvbihlKXtpZihuKGVbWnJdKSl7dmFyIHQ9cT8iY2hhbmdlIjoiaW5wdXQiO2VbdF09W10uY29uY2F0KGVbWnJdLGVbdF18fFtdKSxkZWxldGUgZVtacl19bihlW0dyXSkmJihlLmNoYW5nZT1bXS5jb25jYXQoZVtHcl0sZS5jaGFuZ2V8fFtdKSxkZWxldGUgZVtHcl0pfShpKSxpdChpLG8sUXIsZWksWHIsci5jb250ZXh0KSxXcj12b2lkIDB9fXZhciBuaSxyaT17Y3JlYXRlOnRpLHVwZGF0ZTp0aX07ZnVuY3Rpb24gaWkoZSxyKXtpZighdChlLmRhdGEuZG9tUHJvcHMpfHwhdChyLmRhdGEuZG9tUHJvcHMpKXt2YXIgaSxvLGE9ci5lbG0scz1lLmRhdGEuZG9tUHJvcHN8fHt9LGM9ci5kYXRhLmRvbVByb3BzfHx7fTtmb3IoaSBpbiBuKGMuX19vYl9fKSYmKGM9ci5kYXRhLmRvbVByb3BzPUEoe30sYykpLHMpaSBpbiBjfHwoYVtpXT0iIik7Zm9yKGkgaW4gYyl7aWYobz1jW2ldLCJ0ZXh0Q29udGVudCI9PT1pfHwiaW5uZXJIVE1MIj09PWkpe2lmKHIuY2hpbGRyZW4mJihyLmNoaWxkcmVuLmxlbmd0aD0wKSxvPT09c1tpXSljb250aW51ZTsxPT09YS5jaGlsZE5vZGVzLmxlbmd0aCYmYS5yZW1vdmVDaGlsZChhLmNoaWxkTm9kZXNbMF0pfWlmKCJ2YWx1ZSI9PT1pJiYiUFJPR1JFU1MiIT09YS50YWdOYW1lKXthLl92YWx1ZT1vO3ZhciB1PXQobyk/IiI6U3RyaW5nKG8pO29pKGEsdSkmJihhLnZhbHVlPXUpfWVsc2UgaWYoImlubmVySFRNTCI9PT1pJiZXbihhLnRhZ05hbWUpJiZ0KGEuaW5uZXJIVE1MKSl7KG5pPW5pfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MPSI8c3ZnPiIrbysiPC9zdmc+Ijtmb3IodmFyIGw9bmkuZmlyc3RDaGlsZDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTtmb3IoO2wuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChsLmZpcnN0Q2hpbGQpfWVsc2UgaWYobyE9PXNbaV0pdHJ5e2FbaV09b31jYXRjaChlKXt9fX19ZnVuY3Rpb24gb2koZSx0KXtyZXR1cm4hZS5jb21wb3NpbmcmJigiT1BUSU9OIj09PWUudGFnTmFtZXx8ZnVuY3Rpb24oZSx0KXt2YXIgbj0hMDt0cnl7bj1kb2N1bWVudC5hY3RpdmVFbGVtZW50IT09ZX1jYXRjaChlKXt9cmV0dXJuIG4mJmUudmFsdWUhPT10fShlLHQpfHxmdW5jdGlvbihlLHQpe3ZhciByPWUudmFsdWUsaT1lLl92TW9kaWZpZXJzO2lmKG4oaSkpe2lmKGkubnVtYmVyKXJldHVybiBmKHIpIT09Zih0KTtpZihpLnRyaW0pcmV0dXJuIHIudHJpbSgpIT09dC50cmltKCl9cmV0dXJuIHIhPT10fShlLHQpKX12YXIgYWk9e2NyZWF0ZTppaSx1cGRhdGU6aWl9LHNpPWcoZnVuY3Rpb24oZSl7dmFyIHQ9e30sbj0vOiguKykvO3JldHVybiBlLnNwbGl0KC87KD8hW14oXSpcKSkvZykuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlKXt2YXIgcj1lLnNwbGl0KG4pO3IubGVuZ3RoPjEmJih0W3JbMF0udHJpbSgpXT1yWzFdLnRyaW0oKSl9fSksdH0pO2Z1bmN0aW9uIGNpKGUpe3ZhciB0PXVpKGUuc3R5bGUpO3JldHVybiBlLnN0YXRpY1N0eWxlP0EoZS5zdGF0aWNTdHlsZSx0KTp0fWZ1bmN0aW9uIHVpKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP08oZSk6InN0cmluZyI9PXR5cGVvZiBlP3NpKGUpOmV9dmFyIGxpLGZpPS9eLS0vLHBpPS9ccyohaW1wb3J0YW50JC8sZGk9ZnVuY3Rpb24oZSx0LG4pe2lmKGZpLnRlc3QodCkpZS5zdHlsZS5zZXRQcm9wZXJ0eSh0LG4pO2Vsc2UgaWYocGkudGVzdChuKSllLnN0eWxlLnNldFByb3BlcnR5KEModCksbi5yZXBsYWNlKHBpLCIiKSwiaW1wb3J0YW50Iik7ZWxzZXt2YXIgcj1oaSh0KTtpZihBcnJheS5pc0FycmF5KG4pKWZvcih2YXIgaT0wLG89bi5sZW5ndGg7aTxvO2krKyllLnN0eWxlW3JdPW5baV07ZWxzZSBlLnN0eWxlW3JdPW59fSx2aT1bIldlYmtpdCIsIk1veiIsIm1zIl0saGk9ZyhmdW5jdGlvbihlKXtpZihsaT1saXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsImZpbHRlciIhPT0oZT1iKGUpKSYmZSBpbiBsaSlyZXR1cm4gZTtmb3IodmFyIHQ9ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLG49MDtuPHZpLmxlbmd0aDtuKyspe3ZhciByPXZpW25dK3Q7aWYociBpbiBsaSlyZXR1cm4gcn19KTtmdW5jdGlvbiBtaShlLHIpe3ZhciBpPXIuZGF0YSxvPWUuZGF0YTtpZighKHQoaS5zdGF0aWNTdHlsZSkmJnQoaS5zdHlsZSkmJnQoby5zdGF0aWNTdHlsZSkmJnQoby5zdHlsZSkpKXt2YXIgYSxzLGM9ci5lbG0sdT1vLnN0YXRpY1N0eWxlLGw9by5ub3JtYWxpemVkU3R5bGV8fG8uc3R5bGV8fHt9LGY9dXx8bCxwPXVpKHIuZGF0YS5zdHlsZSl8fHt9O3IuZGF0YS5ub3JtYWxpemVkU3R5bGU9bihwLl9fb2JfXyk/QSh7fSxwKTpwO3ZhciBkPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj17fTtpZih0KWZvcih2YXIgaT1lO2kuY29tcG9uZW50SW5zdGFuY2U7KShpPWkuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmaS5kYXRhJiYobj1jaShpLmRhdGEpKSYmQShyLG4pOyhuPWNpKGUuZGF0YSkpJiZBKHIsbik7Zm9yKHZhciBvPWU7bz1vLnBhcmVudDspby5kYXRhJiYobj1jaShvLmRhdGEpKSYmQShyLG4pO3JldHVybiByfShyLCEwKTtmb3IocyBpbiBmKXQoZFtzXSkmJmRpKGMscywiIik7Zm9yKHMgaW4gZCkoYT1kW3NdKSE9PWZbc10mJmRpKGMscyxudWxsPT1hPyIiOmEpfX12YXIgeWk9e2NyZWF0ZTptaSx1cGRhdGU6bWl9LGdpPS9ccysvO2Z1bmN0aW9uIF9pKGUsdCl7aWYodCYmKHQ9dC50cmltKCkpKWlmKGUuY2xhc3NMaXN0KXQuaW5kZXhPZigiICIpPi0xP3Quc3BsaXQoZ2kpLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUuY2xhc3NMaXN0LmFkZCh0KX0pOmUuY2xhc3NMaXN0LmFkZCh0KTtlbHNle3ZhciBuPSIgIisoZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKSsiICI7bi5pbmRleE9mKCIgIit0KyIgIik8MCYmZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwobit0KS50cmltKCkpfX1mdW5jdGlvbiBiaShlLHQpe2lmKHQmJih0PXQudHJpbSgpKSlpZihlLmNsYXNzTGlzdCl0LmluZGV4T2YoIiAiKT4tMT90LnNwbGl0KGdpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmNsYXNzTGlzdC5yZW1vdmUodCl9KTplLmNsYXNzTGlzdC5yZW1vdmUodCksZS5jbGFzc0xpc3QubGVuZ3RofHxlLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTtlbHNle2Zvcih2YXIgbj0iICIrKGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIikrIiAiLHI9IiAiK3QrIiAiO24uaW5kZXhPZihyKT49MDspbj1uLnJlcGxhY2UociwiICIpOyhuPW4udHJpbSgpKT9lLnNldEF0dHJpYnV0ZSgiY2xhc3MiLG4pOmUucmVtb3ZlQXR0cmlidXRlKCJjbGFzcyIpfX1mdW5jdGlvbiAkaShlKXtpZihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciB0PXt9O3JldHVybiExIT09ZS5jc3MmJkEodCx3aShlLm5hbWV8fCJ2IikpLEEodCxlKSx0fXJldHVybiJzdHJpbmciPT10eXBlb2YgZT93aShlKTp2b2lkIDB9fXZhciB3aT1nKGZ1bmN0aW9uKGUpe3JldHVybntlbnRlckNsYXNzOmUrIi1lbnRlciIsZW50ZXJUb0NsYXNzOmUrIi1lbnRlci10byIsZW50ZXJBY3RpdmVDbGFzczplKyItZW50ZXItYWN0aXZlIixsZWF2ZUNsYXNzOmUrIi1sZWF2ZSIsbGVhdmVUb0NsYXNzOmUrIi1sZWF2ZS10byIsbGVhdmVBY3RpdmVDbGFzczplKyItbGVhdmUtYWN0aXZlIn19KSxDaT1WJiYhVyx4aT0idHJhbnNpdGlvbiIsa2k9ImFuaW1hdGlvbiIsQWk9InRyYW5zaXRpb24iLE9pPSJ0cmFuc2l0aW9uZW5kIixTaT0iYW5pbWF0aW9uIixUaT0iYW5pbWF0aW9uZW5kIjtDaSYmKHZvaWQgMD09PXdpbmRvdy5vbnRyYW5zaXRpb25lbmQmJnZvaWQgMCE9PXdpbmRvdy5vbndlYmtpdHRyYW5zaXRpb25lbmQmJihBaT0iV2Via2l0VHJhbnNpdGlvbiIsT2k9IndlYmtpdFRyYW5zaXRpb25FbmQiKSx2b2lkIDA9PT13aW5kb3cub25hbmltYXRpb25lbmQmJnZvaWQgMCE9PXdpbmRvdy5vbndlYmtpdGFuaW1hdGlvbmVuZCYmKFNpPSJXZWJraXRBbmltYXRpb24iLFRpPSJ3ZWJraXRBbmltYXRpb25FbmQiKSk7dmFyIE5pPVY/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpzZXRUaW1lb3V0OmZ1bmN0aW9uKGUpe3JldHVybiBlKCl9O2Z1bmN0aW9uIEVpKGUpe05pKGZ1bmN0aW9uKCl7TmkoZSl9KX1mdW5jdGlvbiBqaShlLHQpe3ZhciBuPWUuX3RyYW5zaXRpb25DbGFzc2VzfHwoZS5fdHJhbnNpdGlvbkNsYXNzZXM9W10pO24uaW5kZXhPZih0KTwwJiYobi5wdXNoKHQpLF9pKGUsdCkpfWZ1bmN0aW9uIERpKGUsdCl7ZS5fdHJhbnNpdGlvbkNsYXNzZXMmJmgoZS5fdHJhbnNpdGlvbkNsYXNzZXMsdCksYmkoZSx0KX1mdW5jdGlvbiBMaShlLHQsbil7dmFyIHI9TWkoZSx0KSxpPXIudHlwZSxvPXIudGltZW91dCxhPXIucHJvcENvdW50O2lmKCFpKXJldHVybiBuKCk7dmFyIHM9aT09PXhpP09pOlRpLGM9MCx1PWZ1bmN0aW9uKCl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKHMsbCksbigpfSxsPWZ1bmN0aW9uKHQpe3QudGFyZ2V0PT09ZSYmKytjPj1hJiZ1KCl9O3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjPGEmJnUoKX0sbysxKSxlLmFkZEV2ZW50TGlzdGVuZXIocyxsKX12YXIgSWk9L1xiKHRyYW5zZm9ybXxhbGwpKCx8JCkvO2Z1bmN0aW9uIE1pKGUsdCl7dmFyIG4scj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKSxpPShyW0FpKyJEZWxheSJdfHwiIikuc3BsaXQoIiwgIiksbz0ocltBaSsiRHVyYXRpb24iXXx8IiIpLnNwbGl0KCIsICIpLGE9RmkoaSxvKSxzPShyW1NpKyJEZWxheSJdfHwiIikuc3BsaXQoIiwgIiksYz0ocltTaSsiRHVyYXRpb24iXXx8IiIpLnNwbGl0KCIsICIpLHU9RmkocyxjKSxsPTAsZj0wO3JldHVybiB0PT09eGk/YT4wJiYobj14aSxsPWEsZj1vLmxlbmd0aCk6dD09PWtpP3U+MCYmKG49a2ksbD11LGY9Yy5sZW5ndGgpOmY9KG49KGw9TWF0aC5tYXgoYSx1KSk+MD9hPnU/eGk6a2k6bnVsbCk/bj09PXhpP28ubGVuZ3RoOmMubGVuZ3RoOjAse3R5cGU6bix0aW1lb3V0OmwscHJvcENvdW50OmYsaGFzVHJhbnNmb3JtOm49PT14aSYmSWkudGVzdChyW0FpKyJQcm9wZXJ0eSJdKX19ZnVuY3Rpb24gRmkoZSx0KXtmb3IoO2UubGVuZ3RoPHQubGVuZ3RoOyllPWUuY29uY2F0KGUpO3JldHVybiBNYXRoLm1heC5hcHBseShudWxsLHQubWFwKGZ1bmN0aW9uKHQsbil7cmV0dXJuIFBpKHQpK1BpKGVbbl0pfSkpfWZ1bmN0aW9uIFBpKGUpe3JldHVybiAxZTMqTnVtYmVyKGUuc2xpY2UoMCwtMSkucmVwbGFjZSgiLCIsIi4iKSl9ZnVuY3Rpb24gUmkoZSxyKXt2YXIgaT1lLmVsbTtuKGkuX2xlYXZlQ2IpJiYoaS5fbGVhdmVDYi5jYW5jZWxsZWQ9ITAsaS5fbGVhdmVDYigpKTt2YXIgYT0kaShlLmRhdGEudHJhbnNpdGlvbik7aWYoIXQoYSkmJiFuKGkuX2VudGVyQ2IpJiYxPT09aS5ub2RlVHlwZSl7Zm9yKHZhciBzPWEuY3NzLGM9YS50eXBlLHU9YS5lbnRlckNsYXNzLGw9YS5lbnRlclRvQ2xhc3MscD1hLmVudGVyQWN0aXZlQ2xhc3MsZD1hLmFwcGVhckNsYXNzLHY9YS5hcHBlYXJUb0NsYXNzLGg9YS5hcHBlYXJBY3RpdmVDbGFzcyxtPWEuYmVmb3JlRW50ZXIseT1hLmVudGVyLGc9YS5hZnRlckVudGVyLF89YS5lbnRlckNhbmNlbGxlZCxiPWEuYmVmb3JlQXBwZWFyLCQ9YS5hcHBlYXIsdz1hLmFmdGVyQXBwZWFyLEM9YS5hcHBlYXJDYW5jZWxsZWQseD1hLmR1cmF0aW9uLGs9WnQsQT1adC4kdm5vZGU7QSYmQS5wYXJlbnQ7KWs9QS5jb250ZXh0LEE9QS5wYXJlbnQ7dmFyIE89IWsuX2lzTW91bnRlZHx8IWUuaXNSb290SW5zZXJ0O2lmKCFPfHwkfHwiIj09PSQpe3ZhciBTPU8mJmQ/ZDp1LFQ9TyYmaD9oOnAsTj1PJiZ2P3Y6bCxFPU8mJmJ8fG0saj1PJiYiZnVuY3Rpb24iPT10eXBlb2YgJD8kOnksTD1PJiZ3fHxnLEk9TyYmQ3x8XyxNPWYobyh4KT94LmVudGVyOngpLEY9ITEhPT1zJiYhVyxQPVVpKGopLFI9aS5fZW50ZXJDYj1EKGZ1bmN0aW9uKCl7RiYmKERpKGksTiksRGkoaSxUKSksUi5jYW5jZWxsZWQ/KEYmJkRpKGksUyksSSYmSShpKSk6TCYmTChpKSxpLl9lbnRlckNiPW51bGx9KTtlLmRhdGEuc2hvd3x8b3QoZSwiaW5zZXJ0IixmdW5jdGlvbigpe3ZhciB0PWkucGFyZW50Tm9kZSxuPXQmJnQuX3BlbmRpbmcmJnQuX3BlbmRpbmdbZS5rZXldO24mJm4udGFnPT09ZS50YWcmJm4uZWxtLl9sZWF2ZUNiJiZuLmVsbS5fbGVhdmVDYigpLGomJmooaSxSKX0pLEUmJkUoaSksRiYmKGppKGksUyksamkoaSxUKSxFaShmdW5jdGlvbigpe0RpKGksUyksUi5jYW5jZWxsZWR8fChqaShpLE4pLFB8fChCaShNKT9zZXRUaW1lb3V0KFIsTSk6TGkoaSxjLFIpKSl9KSksZS5kYXRhLnNob3cmJihyJiZyKCksaiYmaihpLFIpKSxGfHxQfHxSKCl9fX1mdW5jdGlvbiBIaShlLHIpe3ZhciBpPWUuZWxtO24oaS5fZW50ZXJDYikmJihpLl9lbnRlckNiLmNhbmNlbGxlZD0hMCxpLl9lbnRlckNiKCkpO3ZhciBhPSRpKGUuZGF0YS50cmFuc2l0aW9uKTtpZih0KGEpfHwxIT09aS5ub2RlVHlwZSlyZXR1cm4gcigpO2lmKCFuKGkuX2xlYXZlQ2IpKXt2YXIgcz1hLmNzcyxjPWEudHlwZSx1PWEubGVhdmVDbGFzcyxsPWEubGVhdmVUb0NsYXNzLHA9YS5sZWF2ZUFjdGl2ZUNsYXNzLGQ9YS5iZWZvcmVMZWF2ZSx2PWEubGVhdmUsaD1hLmFmdGVyTGVhdmUsbT1hLmxlYXZlQ2FuY2VsbGVkLHk9YS5kZWxheUxlYXZlLGc9YS5kdXJhdGlvbixfPSExIT09cyYmIVcsYj1VaSh2KSwkPWYobyhnKT9nLmxlYXZlOmcpLHc9aS5fbGVhdmVDYj1EKGZ1bmN0aW9uKCl7aS5wYXJlbnROb2RlJiZpLnBhcmVudE5vZGUuX3BlbmRpbmcmJihpLnBhcmVudE5vZGUuX3BlbmRpbmdbZS5rZXldPW51bGwpLF8mJihEaShpLGwpLERpKGkscCkpLHcuY2FuY2VsbGVkPyhfJiZEaShpLHUpLG0mJm0oaSkpOihyKCksaCYmaChpKSksaS5fbGVhdmVDYj1udWxsfSk7eT95KEMpOkMoKX1mdW5jdGlvbiBDKCl7dy5jYW5jZWxsZWR8fCghZS5kYXRhLnNob3cmJmkucGFyZW50Tm9kZSYmKChpLnBhcmVudE5vZGUuX3BlbmRpbmd8fChpLnBhcmVudE5vZGUuX3BlbmRpbmc9e30pKVtlLmtleV09ZSksZCYmZChpKSxfJiYoamkoaSx1KSxqaShpLHApLEVpKGZ1bmN0aW9uKCl7RGkoaSx1KSx3LmNhbmNlbGxlZHx8KGppKGksbCksYnx8KEJpKCQpP3NldFRpbWVvdXQodywkKTpMaShpLGMsdykpKX0pKSx2JiZ2KGksdyksX3x8Ynx8dygpKX19ZnVuY3Rpb24gQmkoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlJiYhaXNOYU4oZSl9ZnVuY3Rpb24gVWkoZSl7aWYodChlKSlyZXR1cm4hMTt2YXIgcj1lLmZucztyZXR1cm4gbihyKT9VaShBcnJheS5pc0FycmF5KHIpP3JbMF06cik6KGUuX2xlbmd0aHx8ZS5sZW5ndGgpPjF9ZnVuY3Rpb24gVmkoZSx0KXshMCE9PXQuZGF0YS5zaG93JiZSaSh0KX12YXIgemk9ZnVuY3Rpb24oZSl7dmFyIG8sYSxzPXt9LGM9ZS5tb2R1bGVzLHU9ZS5ub2RlT3BzO2ZvcihvPTA7bzxpci5sZW5ndGg7KytvKWZvcihzW2lyW29dXT1bXSxhPTA7YTxjLmxlbmd0aDsrK2EpbihjW2FdW2lyW29dXSkmJnNbaXJbb11dLnB1c2goY1thXVtpcltvXV0pO2Z1bmN0aW9uIGwoZSl7dmFyIHQ9dS5wYXJlbnROb2RlKGUpO24odCkmJnUucmVtb3ZlQ2hpbGQodCxlKX1mdW5jdGlvbiBmKGUsdCxpLG8sYSxjLGwpe2lmKG4oZS5lbG0pJiZuKGMpJiYoZT1jW2xdPW1lKGUpKSxlLmlzUm9vdEluc2VydD0hYSwhZnVuY3Rpb24oZSx0LGksbyl7dmFyIGE9ZS5kYXRhO2lmKG4oYSkpe3ZhciBjPW4oZS5jb21wb25lbnRJbnN0YW5jZSkmJmEua2VlcEFsaXZlO2lmKG4oYT1hLmhvb2spJiZuKGE9YS5pbml0KSYmYShlLCExKSxuKGUuY29tcG9uZW50SW5zdGFuY2UpKXJldHVybiBkKGUsdCksdihpLGUuZWxtLG8pLHIoYykmJmZ1bmN0aW9uKGUsdCxyLGkpe2Zvcih2YXIgbyxhPWU7YS5jb21wb25lbnRJbnN0YW5jZTspaWYoYT1hLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSxuKG89YS5kYXRhKSYmbihvPW8udHJhbnNpdGlvbikpe2ZvcihvPTA7bzxzLmFjdGl2YXRlLmxlbmd0aDsrK28pcy5hY3RpdmF0ZVtvXShycixhKTt0LnB1c2goYSk7YnJlYWt9dihyLGUuZWxtLGkpfShlLHQsaSxvKSwhMH19KGUsdCxpLG8pKXt2YXIgZj1lLmRhdGEscD1lLmNoaWxkcmVuLG09ZS50YWc7bihtKT8oZS5lbG09ZS5ucz91LmNyZWF0ZUVsZW1lbnROUyhlLm5zLG0pOnUuY3JlYXRlRWxlbWVudChtLGUpLGcoZSksaChlLHAsdCksbihmKSYmeShlLHQpLHYoaSxlLmVsbSxvKSk6cihlLmlzQ29tbWVudCk/KGUuZWxtPXUuY3JlYXRlQ29tbWVudChlLnRleHQpLHYoaSxlLmVsbSxvKSk6KGUuZWxtPXUuY3JlYXRlVGV4dE5vZGUoZS50ZXh0KSx2KGksZS5lbG0sbykpfX1mdW5jdGlvbiBkKGUsdCl7bihlLmRhdGEucGVuZGluZ0luc2VydCkmJih0LnB1c2guYXBwbHkodCxlLmRhdGEucGVuZGluZ0luc2VydCksZS5kYXRhLnBlbmRpbmdJbnNlcnQ9bnVsbCksZS5lbG09ZS5jb21wb25lbnRJbnN0YW5jZS4kZWwsbShlKT8oeShlLHQpLGcoZSkpOihucihlKSx0LnB1c2goZSkpfWZ1bmN0aW9uIHYoZSx0LHIpe24oZSkmJihuKHIpP3UucGFyZW50Tm9kZShyKT09PWUmJnUuaW5zZXJ0QmVmb3JlKGUsdCxyKTp1LmFwcGVuZENoaWxkKGUsdCkpfWZ1bmN0aW9uIGgoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpZih0W3JdLG4sZS5lbG0sbnVsbCwhMCx0LHIpO2Vsc2UgaShlLnRleHQpJiZ1LmFwcGVuZENoaWxkKGUuZWxtLHUuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGUudGV4dCkpKX1mdW5jdGlvbiBtKGUpe2Zvcig7ZS5jb21wb25lbnRJbnN0YW5jZTspZT1lLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtyZXR1cm4gbihlLnRhZyl9ZnVuY3Rpb24geShlLHQpe2Zvcih2YXIgcj0wO3I8cy5jcmVhdGUubGVuZ3RoOysrcilzLmNyZWF0ZVtyXShycixlKTtuKG89ZS5kYXRhLmhvb2spJiYobihvLmNyZWF0ZSkmJm8uY3JlYXRlKHJyLGUpLG4oby5pbnNlcnQpJiZ0LnB1c2goZSkpfWZ1bmN0aW9uIGcoZSl7dmFyIHQ7aWYobih0PWUuZm5TY29wZUlkKSl1LnNldFN0eWxlU2NvcGUoZS5lbG0sdCk7ZWxzZSBmb3IodmFyIHI9ZTtyOyluKHQ9ci5jb250ZXh0KSYmbih0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZ1LnNldFN0eWxlU2NvcGUoZS5lbG0sdCkscj1yLnBhcmVudDtuKHQ9WnQpJiZ0IT09ZS5jb250ZXh0JiZ0IT09ZS5mbkNvbnRleHQmJm4odD10LiRvcHRpb25zLl9zY29wZUlkKSYmdS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpfWZ1bmN0aW9uIF8oZSx0LG4scixpLG8pe2Zvcig7cjw9aTsrK3IpZihuW3JdLG8sZSx0LCExLG4scil9ZnVuY3Rpb24gYihlKXt2YXIgdCxyLGk9ZS5kYXRhO2lmKG4oaSkpZm9yKG4odD1pLmhvb2spJiZuKHQ9dC5kZXN0cm95KSYmdChlKSx0PTA7dDxzLmRlc3Ryb3kubGVuZ3RoOysrdClzLmRlc3Ryb3lbdF0oZSk7aWYobih0PWUuY2hpbGRyZW4pKWZvcihyPTA7cjxlLmNoaWxkcmVuLmxlbmd0aDsrK3IpYihlLmNoaWxkcmVuW3JdKX1mdW5jdGlvbiAkKGUsdCxyKXtmb3IoO3Q8PXI7Kyt0KXt2YXIgaT1lW3RdO24oaSkmJihuKGkudGFnKT8odyhpKSxiKGkpKTpsKGkuZWxtKSl9fWZ1bmN0aW9uIHcoZSx0KXtpZihuKHQpfHxuKGUuZGF0YSkpe3ZhciByLGk9cy5yZW1vdmUubGVuZ3RoKzE7Zm9yKG4odCk/dC5saXN0ZW5lcnMrPWk6dD1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXswPT0tLW4ubGlzdGVuZXJzJiZsKGUpfXJldHVybiBuLmxpc3RlbmVycz10LG59KGUuZWxtLGkpLG4ocj1lLmNvbXBvbmVudEluc3RhbmNlKSYmbihyPXIuX3Zub2RlKSYmbihyLmRhdGEpJiZ3KHIsdCkscj0wO3I8cy5yZW1vdmUubGVuZ3RoOysrcilzLnJlbW92ZVtyXShlLHQpO24ocj1lLmRhdGEuaG9vaykmJm4ocj1yLnJlbW92ZSk/cihlLHQpOnQoKX1lbHNlIGwoZS5lbG0pfWZ1bmN0aW9uIEMoZSx0LHIsaSl7Zm9yKHZhciBvPXI7bzxpO28rKyl7dmFyIGE9dFtvXTtpZihuKGEpJiZvcihlLGEpKXJldHVybiBvfX1mdW5jdGlvbiB4KGUsaSxvLGEsYyxsKXtpZihlIT09aSl7bihpLmVsbSkmJm4oYSkmJihpPWFbY109bWUoaSkpO3ZhciBwPWkuZWxtPWUuZWxtO2lmKHIoZS5pc0FzeW5jUGxhY2Vob2xkZXIpKW4oaS5hc3luY0ZhY3RvcnkucmVzb2x2ZWQpP08oZS5lbG0saSxvKTppLmlzQXN5bmNQbGFjZWhvbGRlcj0hMDtlbHNlIGlmKHIoaS5pc1N0YXRpYykmJnIoZS5pc1N0YXRpYykmJmkua2V5PT09ZS5rZXkmJihyKGkuaXNDbG9uZWQpfHxyKGkuaXNPbmNlKSkpaS5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlO2Vsc2V7dmFyIGQsdj1pLmRhdGE7bih2KSYmbihkPXYuaG9vaykmJm4oZD1kLnByZXBhdGNoKSYmZChlLGkpO3ZhciBoPWUuY2hpbGRyZW4seT1pLmNoaWxkcmVuO2lmKG4odikmJm0oaSkpe2ZvcihkPTA7ZDxzLnVwZGF0ZS5sZW5ndGg7KytkKXMudXBkYXRlW2RdKGUsaSk7bihkPXYuaG9vaykmJm4oZD1kLnVwZGF0ZSkmJmQoZSxpKX10KGkudGV4dCk/bihoKSYmbih5KT9oIT09eSYmZnVuY3Rpb24oZSxyLGksbyxhKXtmb3IodmFyIHMsYyxsLHA9MCxkPTAsdj1yLmxlbmd0aC0xLGg9clswXSxtPXJbdl0seT1pLmxlbmd0aC0xLGc9aVswXSxiPWlbeV0sdz0hYTtwPD12JiZkPD15Oyl0KGgpP2g9clsrK3BdOnQobSk/bT1yWy0tdl06b3IoaCxnKT8oeChoLGcsbyxpLGQpLGg9clsrK3BdLGc9aVsrK2RdKTpvcihtLGIpPyh4KG0sYixvLGkseSksbT1yWy0tdl0sYj1pWy0teV0pOm9yKGgsYik/KHgoaCxiLG8saSx5KSx3JiZ1Lmluc2VydEJlZm9yZShlLGguZWxtLHUubmV4dFNpYmxpbmcobS5lbG0pKSxoPXJbKytwXSxiPWlbLS15XSk6b3IobSxnKT8oeChtLGcsbyxpLGQpLHcmJnUuaW5zZXJ0QmVmb3JlKGUsbS5lbG0saC5lbG0pLG09clstLXZdLGc9aVsrK2RdKToodChzKSYmKHM9YXIocixwLHYpKSx0KGM9bihnLmtleSk/c1tnLmtleV06QyhnLHIscCx2KSk/ZihnLG8sZSxoLmVsbSwhMSxpLGQpOm9yKGw9cltjXSxnKT8oeChsLGcsbyxpLGQpLHJbY109dm9pZCAwLHcmJnUuaW5zZXJ0QmVmb3JlKGUsbC5lbG0saC5lbG0pKTpmKGcsbyxlLGguZWxtLCExLGksZCksZz1pWysrZF0pO3A+dj9fKGUsdChpW3krMV0pP251bGw6aVt5KzFdLmVsbSxpLGQseSxvKTpkPnkmJiQocixwLHYpfShwLGgseSxvLGwpOm4oeSk/KG4oZS50ZXh0KSYmdS5zZXRUZXh0Q29udGVudChwLCIiKSxfKHAsbnVsbCx5LDAseS5sZW5ndGgtMSxvKSk6bihoKT8kKGgsMCxoLmxlbmd0aC0xKTpuKGUudGV4dCkmJnUuc2V0VGV4dENvbnRlbnQocCwiIik6ZS50ZXh0IT09aS50ZXh0JiZ1LnNldFRleHRDb250ZW50KHAsaS50ZXh0KSxuKHYpJiZuKGQ9di5ob29rKSYmbihkPWQucG9zdHBhdGNoKSYmZChlLGkpfX19ZnVuY3Rpb24gayhlLHQsaSl7aWYocihpKSYmbihlLnBhcmVudCkpZS5wYXJlbnQuZGF0YS5wZW5kaW5nSW5zZXJ0PXQ7ZWxzZSBmb3IodmFyIG89MDtvPHQubGVuZ3RoOysrbyl0W29dLmRhdGEuaG9vay5pbnNlcnQodFtvXSl9dmFyIEE9cCgiYXR0cnMsY2xhc3Msc3RhdGljQ2xhc3Msc3RhdGljU3R5bGUsa2V5Iik7ZnVuY3Rpb24gTyhlLHQsaSxvKXt2YXIgYSxzPXQudGFnLGM9dC5kYXRhLHU9dC5jaGlsZHJlbjtpZihvPW98fGMmJmMucHJlLHQuZWxtPWUscih0LmlzQ29tbWVudCkmJm4odC5hc3luY0ZhY3RvcnkpKXJldHVybiB0LmlzQXN5bmNQbGFjZWhvbGRlcj0hMCwhMDtpZihuKGMpJiYobihhPWMuaG9vaykmJm4oYT1hLmluaXQpJiZhKHQsITApLG4oYT10LmNvbXBvbmVudEluc3RhbmNlKSkpcmV0dXJuIGQodCxpKSwhMDtpZihuKHMpKXtpZihuKHUpKWlmKGUuaGFzQ2hpbGROb2RlcygpKWlmKG4oYT1jKSYmbihhPWEuZG9tUHJvcHMpJiZuKGE9YS5pbm5lckhUTUwpKXtpZihhIT09ZS5pbm5lckhUTUwpcmV0dXJuITF9ZWxzZXtmb3IodmFyIGw9ITAsZj1lLmZpcnN0Q2hpbGQscD0wO3A8dS5sZW5ndGg7cCsrKXtpZighZnx8IU8oZix1W3BdLGksbykpe2w9ITE7YnJlYWt9Zj1mLm5leHRTaWJsaW5nfWlmKCFsfHxmKXJldHVybiExfWVsc2UgaCh0LHUsaSk7aWYobihjKSl7dmFyIHY9ITE7Zm9yKHZhciBtIGluIGMpaWYoIUEobSkpe3Y9ITAseSh0LGkpO2JyZWFrfSF2JiZjLmNsYXNzJiZ0dChjLmNsYXNzKX19ZWxzZSBlLmRhdGEhPT10LnRleHQmJihlLmRhdGE9dC50ZXh0KTtyZXR1cm4hMH1yZXR1cm4gZnVuY3Rpb24oZSxpLG8sYSl7aWYoIXQoaSkpe3ZhciBjLGw9ITEscD1bXTtpZih0KGUpKWw9ITAsZihpLHApO2Vsc2V7dmFyIGQ9bihlLm5vZGVUeXBlKTtpZighZCYmb3IoZSxpKSl4KGUsaSxwLG51bGwsbnVsbCxhKTtlbHNle2lmKGQpe2lmKDE9PT1lLm5vZGVUeXBlJiZlLmhhc0F0dHJpYnV0ZShMKSYmKGUucmVtb3ZlQXR0cmlidXRlKEwpLG89ITApLHIobykmJk8oZSxpLHApKXJldHVybiBrKGkscCwhMCksZTtjPWUsZT1uZXcgcGUodS50YWdOYW1lKGMpLnRvTG93ZXJDYXNlKCkse30sW10sdm9pZCAwLGMpfXZhciB2PWUuZWxtLGg9dS5wYXJlbnROb2RlKHYpO2lmKGYoaSxwLHYuX2xlYXZlQ2I/bnVsbDpoLHUubmV4dFNpYmxpbmcodikpLG4oaS5wYXJlbnQpKWZvcih2YXIgeT1pLnBhcmVudCxnPW0oaSk7eTspe2Zvcih2YXIgXz0wO188cy5kZXN0cm95Lmxlbmd0aDsrK18pcy5kZXN0cm95W19dKHkpO2lmKHkuZWxtPWkuZWxtLGcpe2Zvcih2YXIgdz0wO3c8cy5jcmVhdGUubGVuZ3RoOysrdylzLmNyZWF0ZVt3XShycix5KTt2YXIgQz15LmRhdGEuaG9vay5pbnNlcnQ7aWYoQy5tZXJnZWQpZm9yKHZhciBBPTE7QTxDLmZucy5sZW5ndGg7QSsrKUMuZm5zW0FdKCl9ZWxzZSBucih5KTt5PXkucGFyZW50fW4oaCk/JChbZV0sMCwwKTpuKGUudGFnKSYmYihlKX19cmV0dXJuIGsoaSxwLGwpLGkuZWxtfW4oZSkmJmIoZSl9fSh7bm9kZU9wczplcixtb2R1bGVzOlt5cixrcixyaSxhaSx5aSxWP3tjcmVhdGU6VmksYWN0aXZhdGU6VmkscmVtb3ZlOmZ1bmN0aW9uKGUsdCl7ITAhPT1lLmRhdGEuc2hvdz9IaShlLHQpOnQoKX19Ont9XS5jb25jYXQoZHIpfSk7VyYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIixmdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7ZSYmZS52bW9kZWwmJllpKGUsImlucHV0Iil9KTt2YXIgS2k9e2luc2VydGVkOmZ1bmN0aW9uKGUsdCxuLHIpeyJzZWxlY3QiPT09bi50YWc/KHIuZWxtJiYhci5lbG0uX3ZPcHRpb25zP290KG4sInBvc3RwYXRjaCIsZnVuY3Rpb24oKXtLaS5jb21wb25lbnRVcGRhdGVkKGUsdCxuKX0pOkppKGUsdCxuLmNvbnRleHQpLGUuX3ZPcHRpb25zPVtdLm1hcC5jYWxsKGUub3B0aW9ucyxaaSkpOigidGV4dGFyZWEiPT09bi50YWd8fFluKGUudHlwZSkpJiYoZS5fdk1vZGlmaWVycz10Lm1vZGlmaWVycyx0Lm1vZGlmaWVycy5sYXp5fHwoZS5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbnN0YXJ0IixHaSksZS5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbmVuZCIsWGkpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixYaSksVyYmKGUudm1vZGVsPSEwKSkpfSxjb21wb25lbnRVcGRhdGVkOmZ1bmN0aW9uKGUsdCxuKXtpZigic2VsZWN0Ij09PW4udGFnKXtKaShlLHQsbi5jb250ZXh0KTt2YXIgcj1lLl92T3B0aW9ucyxpPWUuX3ZPcHRpb25zPVtdLm1hcC5jYWxsKGUub3B0aW9ucyxaaSk7aWYoaS5zb21lKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIUUoZSxyW3RdKX0pKShlLm11bHRpcGxlP3QudmFsdWUuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gV2koZSxpKX0pOnQudmFsdWUhPT10Lm9sZFZhbHVlJiZXaSh0LnZhbHVlLGkpKSYmWWkoZSwiY2hhbmdlIil9fX07ZnVuY3Rpb24gSmkoZSx0LG4pe3FpKGUsdCxuKSwocXx8WikmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxaShlLHQsbil9LDApfWZ1bmN0aW9uIHFpKGUsdCxuKXt2YXIgcj10LnZhbHVlLGk9ZS5tdWx0aXBsZTtpZighaXx8QXJyYXkuaXNBcnJheShyKSl7Zm9yKHZhciBvLGEscz0wLGM9ZS5vcHRpb25zLmxlbmd0aDtzPGM7cysrKWlmKGE9ZS5vcHRpb25zW3NdLGkpbz1qKHIsWmkoYSkpPi0xLGEuc2VsZWN0ZWQhPT1vJiYoYS5zZWxlY3RlZD1vKTtlbHNlIGlmKEUoWmkoYSkscikpcmV0dXJuIHZvaWQoZS5zZWxlY3RlZEluZGV4IT09cyYmKGUuc2VsZWN0ZWRJbmRleD1zKSk7aXx8KGUuc2VsZWN0ZWRJbmRleD0tMSl9fWZ1bmN0aW9uIFdpKGUsdCl7cmV0dXJuIHQuZXZlcnkoZnVuY3Rpb24odCl7cmV0dXJuIUUodCxlKX0pfWZ1bmN0aW9uIFppKGUpe3JldHVybiJfdmFsdWUiaW4gZT9lLl92YWx1ZTplLnZhbHVlfWZ1bmN0aW9uIEdpKGUpe2UudGFyZ2V0LmNvbXBvc2luZz0hMH1mdW5jdGlvbiBYaShlKXtlLnRhcmdldC5jb21wb3NpbmcmJihlLnRhcmdldC5jb21wb3Npbmc9ITEsWWkoZS50YXJnZXQsImlucHV0IikpfWZ1bmN0aW9uIFlpKGUsdCl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkhUTUxFdmVudHMiKTtuLmluaXRFdmVudCh0LCEwLCEwKSxlLmRpc3BhdGNoRXZlbnQobil9ZnVuY3Rpb24gUWkoZSl7cmV0dXJuIWUuY29tcG9uZW50SW5zdGFuY2V8fGUuZGF0YSYmZS5kYXRhLnRyYW5zaXRpb24/ZTpRaShlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSl9dmFyIGVvPXttb2RlbDpLaSxzaG93OntiaW5kOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnZhbHVlLGk9KG49UWkobikpLmRhdGEmJm4uZGF0YS50cmFuc2l0aW9uLG89ZS5fX3ZPcmlnaW5hbERpc3BsYXk9Im5vbmUiPT09ZS5zdHlsZS5kaXNwbGF5PyIiOmUuc3R5bGUuZGlzcGxheTtyJiZpPyhuLmRhdGEuc2hvdz0hMCxSaShuLGZ1bmN0aW9uKCl7ZS5zdHlsZS5kaXNwbGF5PW99KSk6ZS5zdHlsZS5kaXNwbGF5PXI/bzoibm9uZSJ9LHVwZGF0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9dC52YWx1ZTshciE9IXQub2xkVmFsdWUmJigobj1RaShuKSkuZGF0YSYmbi5kYXRhLnRyYW5zaXRpb24/KG4uZGF0YS5zaG93PSEwLHI/UmkobixmdW5jdGlvbigpe2Uuc3R5bGUuZGlzcGxheT1lLl9fdk9yaWdpbmFsRGlzcGxheX0pOkhpKG4sZnVuY3Rpb24oKXtlLnN0eWxlLmRpc3BsYXk9Im5vbmUifSkpOmUuc3R5bGUuZGlzcGxheT1yP2UuX192T3JpZ2luYWxEaXNwbGF5OiJub25lIil9LHVuYmluZDpmdW5jdGlvbihlLHQsbixyLGkpe2l8fChlLnN0eWxlLmRpc3BsYXk9ZS5fX3ZPcmlnaW5hbERpc3BsYXkpfX19LHRvPXtuYW1lOlN0cmluZyxhcHBlYXI6Qm9vbGVhbixjc3M6Qm9vbGVhbixtb2RlOlN0cmluZyx0eXBlOlN0cmluZyxlbnRlckNsYXNzOlN0cmluZyxsZWF2ZUNsYXNzOlN0cmluZyxlbnRlclRvQ2xhc3M6U3RyaW5nLGxlYXZlVG9DbGFzczpTdHJpbmcsZW50ZXJBY3RpdmVDbGFzczpTdHJpbmcsbGVhdmVBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyQ2xhc3M6U3RyaW5nLGFwcGVhckFjdGl2ZUNsYXNzOlN0cmluZyxhcHBlYXJUb0NsYXNzOlN0cmluZyxkdXJhdGlvbjpbTnVtYmVyLFN0cmluZyxPYmplY3RdfTtmdW5jdGlvbiBubyhlKXt2YXIgdD1lJiZlLmNvbXBvbmVudE9wdGlvbnM7cmV0dXJuIHQmJnQuQ3Rvci5vcHRpb25zLmFic3RyYWN0P25vKHp0KHQuY2hpbGRyZW4pKTplfWZ1bmN0aW9uIHJvKGUpe3ZhciB0PXt9LG49ZS4kb3B0aW9ucztmb3IodmFyIHIgaW4gbi5wcm9wc0RhdGEpdFtyXT1lW3JdO3ZhciBpPW4uX3BhcmVudExpc3RlbmVycztmb3IodmFyIG8gaW4gaSl0W2IobyldPWlbb107cmV0dXJuIHR9ZnVuY3Rpb24gaW8oZSx0KXtpZigvXGQta2VlcC1hbGl2ZSQvLnRlc3QodC50YWcpKXJldHVybiBlKCJrZWVwLWFsaXZlIix7cHJvcHM6dC5jb21wb25lbnRPcHRpb25zLnByb3BzRGF0YX0pfXZhciBvbz1mdW5jdGlvbihlKXtyZXR1cm4gZS50YWd8fHB0KGUpfSxhbz1mdW5jdGlvbihlKXtyZXR1cm4ic2hvdyI9PT1lLm5hbWV9LHNvPXtuYW1lOiJ0cmFuc2l0aW9uIixwcm9wczp0byxhYnN0cmFjdDohMCxyZW5kZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMuJHNsb3RzLmRlZmF1bHQ7aWYobiYmKG49bi5maWx0ZXIob28pKS5sZW5ndGgpe3ZhciByPXRoaXMubW9kZSxvPW5bMF07aWYoZnVuY3Rpb24oZSl7Zm9yKDtlPWUucGFyZW50OylpZihlLmRhdGEudHJhbnNpdGlvbilyZXR1cm4hMH0odGhpcy4kdm5vZGUpKXJldHVybiBvO3ZhciBhPW5vKG8pO2lmKCFhKXJldHVybiBvO2lmKHRoaXMuX2xlYXZpbmcpcmV0dXJuIGlvKGUsbyk7dmFyIHM9Il9fdHJhbnNpdGlvbi0iK3RoaXMuX3VpZCsiLSI7YS5rZXk9bnVsbD09YS5rZXk/YS5pc0NvbW1lbnQ/cysiY29tbWVudCI6cythLnRhZzppKGEua2V5KT8wPT09U3RyaW5nKGEua2V5KS5pbmRleE9mKHMpP2Eua2V5OnMrYS5rZXk6YS5rZXk7dmFyIGM9KGEuZGF0YXx8KGEuZGF0YT17fSkpLnRyYW5zaXRpb249cm8odGhpcyksdT10aGlzLl92bm9kZSxsPW5vKHUpO2lmKGEuZGF0YS5kaXJlY3RpdmVzJiZhLmRhdGEuZGlyZWN0aXZlcy5zb21lKGFvKSYmKGEuZGF0YS5zaG93PSEwKSxsJiZsLmRhdGEmJiFmdW5jdGlvbihlLHQpe3JldHVybiB0LmtleT09PWUua2V5JiZ0LnRhZz09PWUudGFnfShhLGwpJiYhcHQobCkmJighbC5jb21wb25lbnRJbnN0YW5jZXx8IWwuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLmlzQ29tbWVudCkpe3ZhciBmPWwuZGF0YS50cmFuc2l0aW9uPUEoe30sYyk7aWYoIm91dC1pbiI9PT1yKXJldHVybiB0aGlzLl9sZWF2aW5nPSEwLG90KGYsImFmdGVyTGVhdmUiLGZ1bmN0aW9uKCl7dC5fbGVhdmluZz0hMSx0LiRmb3JjZVVwZGF0ZSgpfSksaW8oZSxvKTtpZigiaW4tb3V0Ij09PXIpe2lmKHB0KGEpKXJldHVybiB1O3ZhciBwLGQ9ZnVuY3Rpb24oKXtwKCl9O290KGMsImFmdGVyRW50ZXIiLGQpLG90KGMsImVudGVyQ2FuY2VsbGVkIixkKSxvdChmLCJkZWxheUxlYXZlIixmdW5jdGlvbihlKXtwPWV9KX19cmV0dXJuIG99fX0sY289QSh7dGFnOlN0cmluZyxtb3ZlQ2xhc3M6U3RyaW5nfSx0byk7ZnVuY3Rpb24gdW8oZSl7ZS5lbG0uX21vdmVDYiYmZS5lbG0uX21vdmVDYigpLGUuZWxtLl9lbnRlckNiJiZlLmVsbS5fZW50ZXJDYigpfWZ1bmN0aW9uIGxvKGUpe2UuZGF0YS5uZXdQb3M9ZS5lbG0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9ZnVuY3Rpb24gZm8oZSl7dmFyIHQ9ZS5kYXRhLnBvcyxuPWUuZGF0YS5uZXdQb3Mscj10LmxlZnQtbi5sZWZ0LGk9dC50b3Atbi50b3A7aWYocnx8aSl7ZS5kYXRhLm1vdmVkPSEwO3ZhciBvPWUuZWxtLnN0eWxlO28udHJhbnNmb3JtPW8uV2Via2l0VHJhbnNmb3JtPSJ0cmFuc2xhdGUoIityKyJweCwiK2krInB4KSIsby50cmFuc2l0aW9uRHVyYXRpb249IjBzIn19ZGVsZXRlIGNvLm1vZGU7dmFyIHBvPXtUcmFuc2l0aW9uOnNvLFRyYW5zaXRpb25Hcm91cDp7cHJvcHM6Y28sYmVmb3JlTW91bnQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5fdXBkYXRlO3RoaXMuX3VwZGF0ZT1mdW5jdGlvbihuLHIpe3ZhciBpPUd0KGUpO2UuX19wYXRjaF9fKGUuX3Zub2RlLGUua2VwdCwhMSwhMCksZS5fdm5vZGU9ZS5rZXB0LGkoKSx0LmNhbGwoZSxuLHIpfX0scmVuZGVyOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLnRhZ3x8dGhpcy4kdm5vZGUuZGF0YS50YWd8fCJzcGFuIixuPU9iamVjdC5jcmVhdGUobnVsbCkscj10aGlzLnByZXZDaGlsZHJlbj10aGlzLmNoaWxkcmVuLGk9dGhpcy4kc2xvdHMuZGVmYXVsdHx8W10sbz10aGlzLmNoaWxkcmVuPVtdLGE9cm8odGhpcykscz0wO3M8aS5sZW5ndGg7cysrKXt2YXIgYz1pW3NdO2MudGFnJiZudWxsIT1jLmtleSYmMCE9PVN0cmluZyhjLmtleSkuaW5kZXhPZigiX192bGlzdCIpJiYoby5wdXNoKGMpLG5bYy5rZXldPWMsKGMuZGF0YXx8KGMuZGF0YT17fSkpLnRyYW5zaXRpb249YSl9aWYocil7Zm9yKHZhciB1PVtdLGw9W10sZj0wO2Y8ci5sZW5ndGg7ZisrKXt2YXIgcD1yW2ZdO3AuZGF0YS50cmFuc2l0aW9uPWEscC5kYXRhLnBvcz1wLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuW3Aua2V5XT91LnB1c2gocCk6bC5wdXNoKHApfXRoaXMua2VwdD1lKHQsbnVsbCx1KSx0aGlzLnJlbW92ZWQ9bH1yZXR1cm4gZSh0LG51bGwsbyl9LHVwZGF0ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByZXZDaGlsZHJlbix0PXRoaXMubW92ZUNsYXNzfHwodGhpcy5uYW1lfHwidiIpKyItbW92ZSI7ZS5sZW5ndGgmJnRoaXMuaGFzTW92ZShlWzBdLmVsbSx0KSYmKGUuZm9yRWFjaCh1byksZS5mb3JFYWNoKGxvKSxlLmZvckVhY2goZm8pLHRoaXMuX3JlZmxvdz1kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCxlLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZS5kYXRhLm1vdmVkKXt2YXIgbj1lLmVsbSxyPW4uc3R5bGU7amkobix0KSxyLnRyYW5zZm9ybT1yLldlYmtpdFRyYW5zZm9ybT1yLnRyYW5zaXRpb25EdXJhdGlvbj0iIixuLmFkZEV2ZW50TGlzdGVuZXIoT2ksbi5fbW92ZUNiPWZ1bmN0aW9uIGUocil7ciYmci50YXJnZXQhPT1ufHxyJiYhL3RyYW5zZm9ybSQvLnRlc3Qoci5wcm9wZXJ0eU5hbWUpfHwobi5yZW1vdmVFdmVudExpc3RlbmVyKE9pLGUpLG4uX21vdmVDYj1udWxsLERpKG4sdCkpfSl9fSkpfSxtZXRob2RzOntoYXNNb3ZlOmZ1bmN0aW9uKGUsdCl7aWYoIUNpKXJldHVybiExO2lmKHRoaXMuX2hhc01vdmUpcmV0dXJuIHRoaXMuX2hhc01vdmU7dmFyIG49ZS5jbG9uZU5vZGUoKTtlLl90cmFuc2l0aW9uQ2xhc3NlcyYmZS5fdHJhbnNpdGlvbkNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbihlKXtiaShuLGUpfSksX2kobix0KSxuLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuJGVsLmFwcGVuZENoaWxkKG4pO3ZhciByPU1pKG4pO3JldHVybiB0aGlzLiRlbC5yZW1vdmVDaGlsZChuKSx0aGlzLl9oYXNNb3ZlPXIuaGFzVHJhbnNmb3JtfX19fTtDbi5jb25maWcubXVzdFVzZVByb3A9RG4sQ24uY29uZmlnLmlzUmVzZXJ2ZWRUYWc9Wm4sQ24uY29uZmlnLmlzUmVzZXJ2ZWRBdHRyPUVuLENuLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2U9R24sQ24uY29uZmlnLmlzVW5rbm93bkVsZW1lbnQ9ZnVuY3Rpb24oZSl7aWYoIVYpcmV0dXJuITA7aWYoWm4oZSkpcmV0dXJuITE7aWYoZT1lLnRvTG93ZXJDYXNlKCksbnVsbCE9WG5bZV0pcmV0dXJuIFhuW2VdO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZSk7cmV0dXJuIGUuaW5kZXhPZigiLSIpPi0xP1huW2VdPXQuY29uc3RydWN0b3I9PT13aW5kb3cuSFRNTFVua25vd25FbGVtZW50fHx0LmNvbnN0cnVjdG9yPT09d2luZG93LkhUTUxFbGVtZW50OlhuW2VdPS9IVE1MVW5rbm93bkVsZW1lbnQvLnRlc3QodC50b1N0cmluZygpKX0sQShDbi5vcHRpb25zLmRpcmVjdGl2ZXMsZW8pLEEoQ24ub3B0aW9ucy5jb21wb25lbnRzLHBvKSxDbi5wcm90b3R5cGUuX19wYXRjaF9fPVY/emk6UyxDbi5wcm90b3R5cGUuJG1vdW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gZS4kZWw9dCxlLiRvcHRpb25zLnJlbmRlcnx8KGUuJG9wdGlvbnMucmVuZGVyPXZlKSxRdChlLCJiZWZvcmVNb3VudCIpLHI9ZnVuY3Rpb24oKXtlLl91cGRhdGUoZS5fcmVuZGVyKCksbil9LG5ldyBwbihlLHIsUyx7YmVmb3JlOmZ1bmN0aW9uKCl7ZS5faXNNb3VudGVkJiYhZS5faXNEZXN0cm95ZWQmJlF0KGUsImJlZm9yZVVwZGF0ZSIpfX0sITApLG49ITEsbnVsbD09ZS4kdm5vZGUmJihlLl9pc01vdW50ZWQ9ITAsUXQoZSwibW91bnRlZCIpKSxlfSh0aGlzLGU9ZSYmVj9RbihlKTp2b2lkIDAsdCl9LFYmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtGLmRldnRvb2xzJiZuZSYmbmUuZW1pdCgiaW5pdCIsQ24pfSwwKTt2YXIgdm89L1x7XHsoKD86Lnxccj9cbikrPylcfVx9L2csaG89L1stLiorP14ke30oKXxbXF1cL1xcXS9nLG1vPWcoZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS5yZXBsYWNlKGhvLCJcXCQmIiksbj1lWzFdLnJlcGxhY2UoaG8sIlxcJCYiKTtyZXR1cm4gbmV3IFJlZ0V4cCh0KyIoKD86LnxcXG4pKz8pIituLCJnIil9KTt2YXIgeW89e3N0YXRpY0tleXM6WyJzdGF0aWNDbGFzcyJdLHRyYW5zZm9ybU5vZGU6ZnVuY3Rpb24oZSx0KXt0Lndhcm47dmFyIG49UHIoZSwiY2xhc3MiKTtuJiYoZS5zdGF0aWNDbGFzcz1KU09OLnN0cmluZ2lmeShuKSk7dmFyIHI9RnIoZSwiY2xhc3MiLCExKTtyJiYoZS5jbGFzc0JpbmRpbmc9cil9LGdlbkRhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9IiI7cmV0dXJuIGUuc3RhdGljQ2xhc3MmJih0Kz0ic3RhdGljQ2xhc3M6IitlLnN0YXRpY0NsYXNzKyIsIiksZS5jbGFzc0JpbmRpbmcmJih0Kz0iY2xhc3M6IitlLmNsYXNzQmluZGluZysiLCIpLHR9fTt2YXIgZ28sX289e3N0YXRpY0tleXM6WyJzdGF0aWNTdHlsZSJdLHRyYW5zZm9ybU5vZGU6ZnVuY3Rpb24oZSx0KXt0Lndhcm47dmFyIG49UHIoZSwic3R5bGUiKTtuJiYoZS5zdGF0aWNTdHlsZT1KU09OLnN0cmluZ2lmeShzaShuKSkpO3ZhciByPUZyKGUsInN0eWxlIiwhMSk7ciYmKGUuc3R5bGVCaW5kaW5nPXIpfSxnZW5EYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PSIiO3JldHVybiBlLnN0YXRpY1N0eWxlJiYodCs9InN0YXRpY1N0eWxlOiIrZS5zdGF0aWNTdHlsZSsiLCIpLGUuc3R5bGVCaW5kaW5nJiYodCs9InN0eWxlOigiK2Uuc3R5bGVCaW5kaW5nKyIpLCIpLHR9fSxibz1mdW5jdGlvbihlKXtyZXR1cm4oZ289Z298fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5pbm5lckhUTUw9ZSxnby50ZXh0Q29udGVudH0sJG89cCgiYXJlYSxiYXNlLGJyLGNvbCxlbWJlZCxmcmFtZSxocixpbWcsaW5wdXQsaXNpbmRleCxrZXlnZW4sbGluayxtZXRhLHBhcmFtLHNvdXJjZSx0cmFjayx3YnIiKSx3bz1wKCJjb2xncm91cCxkZCxkdCxsaSxvcHRpb25zLHAsdGQsdGZvb3QsdGgsdGhlYWQsdHIsc291cmNlIiksQ289cCgiYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJhc2UsYmxvY2txdW90ZSxib2R5LGNhcHRpb24sY29sLGNvbGdyb3VwLGRkLGRldGFpbHMsZGlhbG9nLGRpdixkbCxkdCxmaWVsZHNldCxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsZm9ybSxoMSxoMixoMyxoNCxoNSxoNixoZWFkLGhlYWRlcixoZ3JvdXAsaHIsaHRtbCxsZWdlbmQsbGksbWVudWl0ZW0sbWV0YSxvcHRncm91cCxvcHRpb24scGFyYW0scnAscnQsc291cmNlLHN0eWxlLHN1bW1hcnksdGJvZHksdGQsdGZvb3QsdGgsdGhlYWQsdGl0bGUsdHIsdHJhY2siKSx4bz0vXlxzKihbXlxzIic8PlwvPV0rKSg/OlxzKig9KVxzKig/OiIoW14iXSopIit8JyhbXiddKiknK3woW15ccyInPTw+YF0rKSkpPy8sa289L15ccyooKD86di1bXHctXSs6fEB8OnwjKVxbW149XSs/XF1bXlxzIic8PlwvPV0qKSg/OlxzKig9KVxzKig/OiIoW14iXSopIit8JyhbXiddKiknK3woW15ccyInPTw+YF0rKSkpPy8sQW89IlthLXpBLVpfXVtcXC1cXC4wLTlfYS16QS1aIitQLnNvdXJjZSsiXSoiLE9vPSIoKD86IitBbysiXFw6KT8iK0FvKyIpIixTbz1uZXcgUmVnRXhwKCJePCIrT28pLFRvPS9eXHMqKFwvPyk+LyxObz1uZXcgUmVnRXhwKCJePFxcLyIrT28rIltePl0qPiIpLEVvPS9ePCFET0NUWVBFIFtePl0rPi9pLGpvPS9ePCFcLS0vLERvPS9ePCFcWy8sTG89cCgic2NyaXB0LHN0eWxlLHRleHRhcmVhIiwhMCksSW89e30sTW89eyImbHQ7IjoiPCIsIiZndDsiOiI+IiwiJnF1b3Q7IjonIicsIiZhbXA7IjoiJiIsIiYjMTA7IjoiXG4iLCImIzk7IjoiXHQiLCImIzM5OyI6IicifSxGbz0vJig/Omx0fGd0fHF1b3R8YW1wfCMzOSk7L2csUG89LyYoPzpsdHxndHxxdW90fGFtcHwjMzl8IzEwfCM5KTsvZyxSbz1wKCJwcmUsdGV4dGFyZWEiLCEwKSxIbz1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZSbyhlKSYmIlxuIj09PXRbMF19O2Z1bmN0aW9uIEJvKGUsdCl7dmFyIG49dD9QbzpGbztyZXR1cm4gZS5yZXBsYWNlKG4sZnVuY3Rpb24oZSl7cmV0dXJuIE1vW2VdfSl9dmFyIFVvLFZvLHpvLEtvLEpvLHFvLFdvLFpvLEdvPS9eQHxedi1vbjovLFhvPS9edi18XkB8Xjp8XiMvLFlvPS8oW1xzXFNdKj8pXHMrKD86aW58b2YpXHMrKFtcc1xTXSopLyxRbz0vLChbXixcfVxdXSopKD86LChbXixcfVxdXSopKT8kLyxlYT0vXlwofFwpJC9nLHRhPS9eXFsuKlxdJC8sbmE9LzooLiopJC8scmE9L146fF5cLnxedi1iaW5kOi8saWE9L1wuW14uXF1dKyg/PVteXF1dKiQpL2csb2E9L152LXNsb3QoOnwkKXxeIy8sYWE9L1tcclxuXS8sc2E9L1sgXGZcdFxyXG5dKy9nLGNhPWcoYm8pLHVhPSJfZW1wdHlfIjtmdW5jdGlvbiBsYShlLHQsbil7cmV0dXJue3R5cGU6MSx0YWc6ZSxhdHRyc0xpc3Q6dCxhdHRyc01hcDp5YSh0KSxyYXdBdHRyc01hcDp7fSxwYXJlbnQ6bixjaGlsZHJlbjpbXX19ZnVuY3Rpb24gZmEoZSx0KXtVbz10Lndhcm58fFRyLHFvPXQuaXNQcmVUYWd8fFQsV289dC5tdXN0VXNlUHJvcHx8VCxabz10LmdldFRhZ05hbWVzcGFjZXx8VDt0LmlzUmVzZXJ2ZWRUYWc7em89TnIodC5tb2R1bGVzLCJ0cmFuc2Zvcm1Ob2RlIiksS289TnIodC5tb2R1bGVzLCJwcmVUcmFuc2Zvcm1Ob2RlIiksSm89TnIodC5tb2R1bGVzLCJwb3N0VHJhbnNmb3JtTm9kZSIpLFZvPXQuZGVsaW1pdGVyczt2YXIgbixyLGk9W10sbz0hMSE9PXQucHJlc2VydmVXaGl0ZXNwYWNlLGE9dC53aGl0ZXNwYWNlLHM9ITEsYz0hMTtmdW5jdGlvbiB1KGUpe2lmKGwoZSksc3x8ZS5wcm9jZXNzZWR8fChlPXBhKGUsdCkpLGkubGVuZ3RofHxlPT09bnx8bi5pZiYmKGUuZWxzZWlmfHxlLmVsc2UpJiZ2YShuLHtleHA6ZS5lbHNlaWYsYmxvY2s6ZX0pLHImJiFlLmZvcmJpZGRlbilpZihlLmVsc2VpZnx8ZS5lbHNlKWE9ZSwodT1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtmb3IoO3QtLTspe2lmKDE9PT1lW3RdLnR5cGUpcmV0dXJuIGVbdF07ZS5wb3AoKX19KHIuY2hpbGRyZW4pKSYmdS5pZiYmdmEodSx7ZXhwOmEuZWxzZWlmLGJsb2NrOmF9KTtlbHNle2lmKGUuc2xvdFNjb3BlKXt2YXIgbz1lLnNsb3RUYXJnZXR8fCciZGVmYXVsdCInOyhyLnNjb3BlZFNsb3RzfHwoci5zY29wZWRTbG90cz17fSkpW29dPWV9ci5jaGlsZHJlbi5wdXNoKGUpLGUucGFyZW50PXJ9dmFyIGEsdTtlLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLnNsb3RTY29wZX0pLGwoZSksZS5wcmUmJihzPSExKSxxbyhlLnRhZykmJihjPSExKTtmb3IodmFyIGY9MDtmPEpvLmxlbmd0aDtmKyspSm9bZl0oZSx0KX1mdW5jdGlvbiBsKGUpe2lmKCFjKWZvcih2YXIgdDsodD1lLmNoaWxkcmVuW2UuY2hpbGRyZW4ubGVuZ3RoLTFdKSYmMz09PXQudHlwZSYmIiAiPT09dC50ZXh0OyllLmNoaWxkcmVuLnBvcCgpfXJldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLGk9W10sbz10LmV4cGVjdEhUTUwsYT10LmlzVW5hcnlUYWd8fFQscz10LmNhbkJlTGVmdE9wZW5UYWd8fFQsYz0wO2U7KXtpZihuPWUsciYmTG8ocikpe3ZhciB1PTAsbD1yLnRvTG93ZXJDYXNlKCksZj1Jb1tsXXx8KElvW2xdPW5ldyBSZWdFeHAoIihbXFxzXFxTXSo/KSg8LyIrbCsiW14+XSo+KSIsImkiKSkscD1lLnJlcGxhY2UoZixmdW5jdGlvbihlLG4scil7cmV0dXJuIHU9ci5sZW5ndGgsTG8obCl8fCJub3NjcmlwdCI9PT1sfHwobj1uLnJlcGxhY2UoLzwhXC0tKFtcc1xTXSo/KS0tPi9nLCIkMSIpLnJlcGxhY2UoLzwhXFtDREFUQVxbKFtcc1xTXSo/KV1dPi9nLCIkMSIpKSxIbyhsLG4pJiYobj1uLnNsaWNlKDEpKSx0LmNoYXJzJiZ0LmNoYXJzKG4pLCIifSk7Yys9ZS5sZW5ndGgtcC5sZW5ndGgsZT1wLEEobCxjLXUsYyl9ZWxzZXt2YXIgZD1lLmluZGV4T2YoIjwiKTtpZigwPT09ZCl7aWYoam8udGVzdChlKSl7dmFyIHY9ZS5pbmRleE9mKCItLVx4M2UiKTtpZih2Pj0wKXt0LnNob3VsZEtlZXBDb21tZW50JiZ0LmNvbW1lbnQoZS5zdWJzdHJpbmcoNCx2KSxjLGMrdiszKSxDKHYrMyk7Y29udGludWV9fWlmKERvLnRlc3QoZSkpe3ZhciBoPWUuaW5kZXhPZigiXT4iKTtpZihoPj0wKXtDKGgrMik7Y29udGludWV9fXZhciBtPWUubWF0Y2goRW8pO2lmKG0pe0MobVswXS5sZW5ndGgpO2NvbnRpbnVlfXZhciB5PWUubWF0Y2goTm8pO2lmKHkpe3ZhciBnPWM7Qyh5WzBdLmxlbmd0aCksQSh5WzFdLGcsYyk7Y29udGludWV9dmFyIF89eCgpO2lmKF8pe2soXyksSG8oXy50YWdOYW1lLGUpJiZDKDEpO2NvbnRpbnVlfX12YXIgYj12b2lkIDAsJD12b2lkIDAsdz12b2lkIDA7aWYoZD49MCl7Zm9yKCQ9ZS5zbGljZShkKTshKE5vLnRlc3QoJCl8fFNvLnRlc3QoJCl8fGpvLnRlc3QoJCl8fERvLnRlc3QoJCl8fCh3PSQuaW5kZXhPZigiPCIsMSkpPDApOylkKz13LCQ9ZS5zbGljZShkKTtiPWUuc3Vic3RyaW5nKDAsZCl9ZDwwJiYoYj1lKSxiJiZDKGIubGVuZ3RoKSx0LmNoYXJzJiZiJiZ0LmNoYXJzKGIsYy1iLmxlbmd0aCxjKX1pZihlPT09bil7dC5jaGFycyYmdC5jaGFycyhlKTticmVha319ZnVuY3Rpb24gQyh0KXtjKz10LGU9ZS5zdWJzdHJpbmcodCl9ZnVuY3Rpb24geCgpe3ZhciB0PWUubWF0Y2goU28pO2lmKHQpe3ZhciBuLHIsaT17dGFnTmFtZTp0WzFdLGF0dHJzOltdLHN0YXJ0OmN9O2ZvcihDKHRbMF0ubGVuZ3RoKTshKG49ZS5tYXRjaChUbykpJiYocj1lLm1hdGNoKGtvKXx8ZS5tYXRjaCh4bykpOylyLnN0YXJ0PWMsQyhyWzBdLmxlbmd0aCksci5lbmQ9YyxpLmF0dHJzLnB1c2gocik7aWYobilyZXR1cm4gaS51bmFyeVNsYXNoPW5bMV0sQyhuWzBdLmxlbmd0aCksaS5lbmQ9YyxpfX1mdW5jdGlvbiBrKGUpe3ZhciBuPWUudGFnTmFtZSxjPWUudW5hcnlTbGFzaDtvJiYoInAiPT09ciYmQ28obikmJkEocikscyhuKSYmcj09PW4mJkEobikpO2Zvcih2YXIgdT1hKG4pfHwhIWMsbD1lLmF0dHJzLmxlbmd0aCxmPW5ldyBBcnJheShsKSxwPTA7cDxsO3ArKyl7dmFyIGQ9ZS5hdHRyc1twXSx2PWRbM118fGRbNF18fGRbNV18fCIiLGg9ImEiPT09biYmImhyZWYiPT09ZFsxXT90LnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjp0LnNob3VsZERlY29kZU5ld2xpbmVzO2ZbcF09e25hbWU6ZFsxXSx2YWx1ZTpCbyh2LGgpfX11fHwoaS5wdXNoKHt0YWc6bixsb3dlckNhc2VkVGFnOm4udG9Mb3dlckNhc2UoKSxhdHRyczpmLHN0YXJ0OmUuc3RhcnQsZW5kOmUuZW5kfSkscj1uKSx0LnN0YXJ0JiZ0LnN0YXJ0KG4sZix1LGUuc3RhcnQsZS5lbmQpfWZ1bmN0aW9uIEEoZSxuLG8pe3ZhciBhLHM7aWYobnVsbD09biYmKG49YyksbnVsbD09byYmKG89YyksZSlmb3Iocz1lLnRvTG93ZXJDYXNlKCksYT1pLmxlbmd0aC0xO2E+PTAmJmlbYV0ubG93ZXJDYXNlZFRhZyE9PXM7YS0tKTtlbHNlIGE9MDtpZihhPj0wKXtmb3IodmFyIHU9aS5sZW5ndGgtMTt1Pj1hO3UtLSl0LmVuZCYmdC5lbmQoaVt1XS50YWcsbixvKTtpLmxlbmd0aD1hLHI9YSYmaVthLTFdLnRhZ31lbHNlImJyIj09PXM/dC5zdGFydCYmdC5zdGFydChlLFtdLCEwLG4sbyk6InAiPT09cyYmKHQuc3RhcnQmJnQuc3RhcnQoZSxbXSwhMSxuLG8pLHQuZW5kJiZ0LmVuZChlLG4sbykpfUEoKX0oZSx7d2FybjpVbyxleHBlY3RIVE1MOnQuZXhwZWN0SFRNTCxpc1VuYXJ5VGFnOnQuaXNVbmFyeVRhZyxjYW5CZUxlZnRPcGVuVGFnOnQuY2FuQmVMZWZ0T3BlblRhZyxzaG91bGREZWNvZGVOZXdsaW5lczp0LnNob3VsZERlY29kZU5ld2xpbmVzLHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjp0LnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZixzaG91bGRLZWVwQ29tbWVudDp0LmNvbW1lbnRzLG91dHB1dFNvdXJjZVJhbmdlOnQub3V0cHV0U291cmNlUmFuZ2Usc3RhcnQ6ZnVuY3Rpb24oZSxvLGEsbCxmKXt2YXIgcD1yJiZyLm5zfHxabyhlKTtxJiYic3ZnIj09PXAmJihvPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07Z2EudGVzdChyLm5hbWUpfHwoci5uYW1lPXIubmFtZS5yZXBsYWNlKF9hLCIiKSx0LnB1c2gocikpfXJldHVybiB0fShvKSk7dmFyIGQsdj1sYShlLG8scik7cCYmKHYubnM9cCksInN0eWxlIiE9PShkPXYpLnRhZyYmKCJzY3JpcHQiIT09ZC50YWd8fGQuYXR0cnNNYXAudHlwZSYmInRleHQvamF2YXNjcmlwdCIhPT1kLmF0dHJzTWFwLnR5cGUpfHx0ZSgpfHwodi5mb3JiaWRkZW49ITApO2Zvcih2YXIgaD0wO2g8S28ubGVuZ3RoO2grKyl2PUtvW2hdKHYsdCl8fHY7c3x8KCFmdW5jdGlvbihlKXtudWxsIT1QcihlLCJ2LXByZSIpJiYoZS5wcmU9ITApfSh2KSx2LnByZSYmKHM9ITApKSxxbyh2LnRhZykmJihjPSEwKSxzP2Z1bmN0aW9uKGUpe3ZhciB0PWUuYXR0cnNMaXN0LG49dC5sZW5ndGg7aWYobilmb3IodmFyIHI9ZS5hdHRycz1uZXcgQXJyYXkobiksaT0wO2k8bjtpKyspcltpXT17bmFtZTp0W2ldLm5hbWUsdmFsdWU6SlNPTi5zdHJpbmdpZnkodFtpXS52YWx1ZSl9LG51bGwhPXRbaV0uc3RhcnQmJihyW2ldLnN0YXJ0PXRbaV0uc3RhcnQscltpXS5lbmQ9dFtpXS5lbmQpO2Vsc2UgZS5wcmV8fChlLnBsYWluPSEwKX0odik6di5wcm9jZXNzZWR8fChkYSh2KSxmdW5jdGlvbihlKXt2YXIgdD1QcihlLCJ2LWlmIik7aWYodCllLmlmPXQsdmEoZSx7ZXhwOnQsYmxvY2s6ZX0pO2Vsc2V7bnVsbCE9UHIoZSwidi1lbHNlIikmJihlLmVsc2U9ITApO3ZhciBuPVByKGUsInYtZWxzZS1pZiIpO24mJihlLmVsc2VpZj1uKX19KHYpLGZ1bmN0aW9uKGUpe251bGwhPVByKGUsInYtb25jZSIpJiYoZS5vbmNlPSEwKX0odikpLG58fChuPXYpLGE/dSh2KToocj12LGkucHVzaCh2KSl9LGVuZDpmdW5jdGlvbihlLHQsbil7dmFyIG89aVtpLmxlbmd0aC0xXTtpLmxlbmd0aC09MSxyPWlbaS5sZW5ndGgtMV0sdShvKX0sY2hhcnM6ZnVuY3Rpb24oZSx0LG4pe2lmKHImJighcXx8InRleHRhcmVhIiE9PXIudGFnfHxyLmF0dHJzTWFwLnBsYWNlaG9sZGVyIT09ZSkpe3ZhciBpLHUsbCxmPXIuY2hpbGRyZW47aWYoZT1jfHxlLnRyaW0oKT8ic2NyaXB0Ij09PShpPXIpLnRhZ3x8InN0eWxlIj09PWkudGFnP2U6Y2EoZSk6Zi5sZW5ndGg/YT8iY29uZGVuc2UiPT09YSYmYWEudGVzdChlKT8iIjoiICI6bz8iICI6IiI6IiIpY3x8ImNvbmRlbnNlIiE9PWF8fChlPWUucmVwbGFjZShzYSwiICIpKSwhcyYmIiAiIT09ZSYmKHU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10P21vKHQpOnZvO2lmKG4udGVzdChlKSl7Zm9yKHZhciByLGksbyxhPVtdLHM9W10sYz1uLmxhc3RJbmRleD0wO3I9bi5leGVjKGUpOyl7KGk9ci5pbmRleCk+YyYmKHMucHVzaChvPWUuc2xpY2UoYyxpKSksYS5wdXNoKEpTT04uc3RyaW5naWZ5KG8pKSk7dmFyIHU9T3IoclsxXS50cmltKCkpO2EucHVzaCgiX3MoIit1KyIpIikscy5wdXNoKHsiQGJpbmRpbmciOnV9KSxjPWkrclswXS5sZW5ndGh9cmV0dXJuIGM8ZS5sZW5ndGgmJihzLnB1c2gobz1lLnNsaWNlKGMpKSxhLnB1c2goSlNPTi5zdHJpbmdpZnkobykpKSx7ZXhwcmVzc2lvbjphLmpvaW4oIisiKSx0b2tlbnM6c319fShlLFZvKSk/bD17dHlwZToyLGV4cHJlc3Npb246dS5leHByZXNzaW9uLHRva2Vuczp1LnRva2Vucyx0ZXh0OmV9OiIgIj09PWUmJmYubGVuZ3RoJiYiICI9PT1mW2YubGVuZ3RoLTFdLnRleHR8fChsPXt0eXBlOjMsdGV4dDplfSksbCYmZi5wdXNoKGwpfX0sY29tbWVudDpmdW5jdGlvbihlLHQsbil7aWYocil7dmFyIGk9e3R5cGU6Myx0ZXh0OmUsaXNDb21tZW50OiEwfTtyLmNoaWxkcmVuLnB1c2goaSl9fX0pLG59ZnVuY3Rpb24gcGEoZSx0KXt2YXIgbixyOyhyPUZyKG49ZSwia2V5IikpJiYobi5rZXk9ciksZS5wbGFpbj0hZS5rZXkmJiFlLnNjb3BlZFNsb3RzJiYhZS5hdHRyc0xpc3QubGVuZ3RoLGZ1bmN0aW9uKGUpe3ZhciB0PUZyKGUsInJlZiIpO3QmJihlLnJlZj10LGUucmVmSW5Gb3I9ZnVuY3Rpb24oZSl7dmFyIHQ9ZTtmb3IoO3Q7KXtpZih2b2lkIDAhPT10LmZvcilyZXR1cm4hMDt0PXQucGFyZW50fXJldHVybiExfShlKSl9KGUpLGZ1bmN0aW9uKGUpe3ZhciB0OyJ0ZW1wbGF0ZSI9PT1lLnRhZz8odD1QcihlLCJzY29wZSIpLGUuc2xvdFNjb3BlPXR8fFByKGUsInNsb3Qtc2NvcGUiKSk6KHQ9UHIoZSwic2xvdC1zY29wZSIpKSYmKGUuc2xvdFNjb3BlPXQpO3ZhciBuPUZyKGUsInNsb3QiKTtuJiYoZS5zbG90VGFyZ2V0PSciIic9PT1uPyciZGVmYXVsdCInOm4sZS5zbG90VGFyZ2V0RHluYW1pYz0hKCFlLmF0dHJzTWFwWyI6c2xvdCJdJiYhZS5hdHRyc01hcFsidi1iaW5kOnNsb3QiXSksInRlbXBsYXRlIj09PWUudGFnfHxlLnNsb3RTY29wZXx8anIoZSwic2xvdCIsbixmdW5jdGlvbihlLHQpe3JldHVybiBlLnJhd0F0dHJzTWFwWyI6Iit0XXx8ZS5yYXdBdHRyc01hcFsidi1iaW5kOiIrdF18fGUucmF3QXR0cnNNYXBbdF19KGUsInNsb3QiKSkpO2lmKCJ0ZW1wbGF0ZSI9PT1lLnRhZyl7dmFyIHI9UnIoZSxvYSk7aWYocil7dmFyIGk9aGEociksbz1pLm5hbWUsYT1pLmR5bmFtaWM7ZS5zbG90VGFyZ2V0PW8sZS5zbG90VGFyZ2V0RHluYW1pYz1hLGUuc2xvdFNjb3BlPXIudmFsdWV8fHVhfX1lbHNle3ZhciBzPVJyKGUsb2EpO2lmKHMpe3ZhciBjPWUuc2NvcGVkU2xvdHN8fChlLnNjb3BlZFNsb3RzPXt9KSx1PWhhKHMpLGw9dS5uYW1lLGY9dS5keW5hbWljLHA9Y1tsXT1sYSgidGVtcGxhdGUiLFtdLGUpO3Auc2xvdFRhcmdldD1sLHAuc2xvdFRhcmdldER5bmFtaWM9ZixwLmNoaWxkcmVuPWUuY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uKGUpe2lmKCFlLnNsb3RTY29wZSlyZXR1cm4gZS5wYXJlbnQ9cCwhMH0pLHAuc2xvdFNjb3BlPXMudmFsdWV8fHVhLGUuY2hpbGRyZW49W10sZS5wbGFpbj0hMX19fShlKSxmdW5jdGlvbihlKXsic2xvdCI9PT1lLnRhZyYmKGUuc2xvdE5hbWU9RnIoZSwibmFtZSIpKX0oZSksZnVuY3Rpb24oZSl7dmFyIHQ7KHQ9RnIoZSwiaXMiKSkmJihlLmNvbXBvbmVudD10KTtudWxsIT1QcihlLCJpbmxpbmUtdGVtcGxhdGUiKSYmKGUuaW5saW5lVGVtcGxhdGU9ITApfShlKTtmb3IodmFyIGk9MDtpPHpvLmxlbmd0aDtpKyspZT16b1tpXShlLHQpfHxlO3JldHVybiBmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyxjLHU9ZS5hdHRyc0xpc3Q7Zm9yKHQ9MCxuPXUubGVuZ3RoO3Q8bjt0KyspaWYocj1pPXVbdF0ubmFtZSxvPXVbdF0udmFsdWUsWG8udGVzdChyKSlpZihlLmhhc0JpbmRpbmdzPSEwLChhPW1hKHIucmVwbGFjZShYbywiIikpKSYmKHI9ci5yZXBsYWNlKGlhLCIiKSkscmEudGVzdChyKSlyPXIucmVwbGFjZShyYSwiIiksbz1PcihvKSwoYz10YS50ZXN0KHIpKSYmKHI9ci5zbGljZSgxLC0xKSksYSYmKGEucHJvcCYmIWMmJiJpbm5lckh0bWwiPT09KHI9YihyKSkmJihyPSJpbm5lckhUTUwiKSxhLmNhbWVsJiYhYyYmKHI9YihyKSksYS5zeW5jJiYocz1VcihvLCIkZXZlbnQiKSxjP01yKGUsJyJ1cGRhdGU6IisoJytyKyIpIixzLG51bGwsITEsMCx1W3RdLCEwKTooTXIoZSwidXBkYXRlOiIrYihyKSxzLG51bGwsITEsMCx1W3RdKSxDKHIpIT09YihyKSYmTXIoZSwidXBkYXRlOiIrQyhyKSxzLG51bGwsITEsMCx1W3RdKSkpKSxhJiZhLnByb3B8fCFlLmNvbXBvbmVudCYmV28oZS50YWcsZS5hdHRyc01hcC50eXBlLHIpP0VyKGUscixvLHVbdF0sYyk6anIoZSxyLG8sdVt0XSxjKTtlbHNlIGlmKEdvLnRlc3Qocikpcj1yLnJlcGxhY2UoR28sIiIpLChjPXRhLnRlc3QocikpJiYocj1yLnNsaWNlKDEsLTEpKSxNcihlLHIsbyxhLCExLDAsdVt0XSxjKTtlbHNle3ZhciBsPShyPXIucmVwbGFjZShYbywiIikpLm1hdGNoKG5hKSxmPWwmJmxbMV07Yz0hMSxmJiYocj1yLnNsaWNlKDAsLShmLmxlbmd0aCsxKSksdGEudGVzdChmKSYmKGY9Zi5zbGljZSgxLC0xKSxjPSEwKSksTHIoZSxyLGksbyxmLGMsYSx1W3RdKX1lbHNlIGpyKGUscixKU09OLnN0cmluZ2lmeShvKSx1W3RdKSwhZS5jb21wb25lbnQmJiJtdXRlZCI9PT1yJiZXbyhlLnRhZyxlLmF0dHJzTWFwLnR5cGUscikmJkVyKGUsciwidHJ1ZSIsdVt0XSl9KGUpLGV9ZnVuY3Rpb24gZGEoZSl7dmFyIHQ7aWYodD1QcihlLCJ2LWZvciIpKXt2YXIgbj1mdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKFlvKTtpZighdClyZXR1cm47dmFyIG49e307bi5mb3I9dFsyXS50cmltKCk7dmFyIHI9dFsxXS50cmltKCkucmVwbGFjZShlYSwiIiksaT1yLm1hdGNoKFFvKTtpPyhuLmFsaWFzPXIucmVwbGFjZShRbywiIikudHJpbSgpLG4uaXRlcmF0b3IxPWlbMV0udHJpbSgpLGlbMl0mJihuLml0ZXJhdG9yMj1pWzJdLnRyaW0oKSkpOm4uYWxpYXM9cjtyZXR1cm4gbn0odCk7biYmQShlLG4pfX1mdW5jdGlvbiB2YShlLHQpe2UuaWZDb25kaXRpb25zfHwoZS5pZkNvbmRpdGlvbnM9W10pLGUuaWZDb25kaXRpb25zLnB1c2godCl9ZnVuY3Rpb24gaGEoZSl7dmFyIHQ9ZS5uYW1lLnJlcGxhY2Uob2EsIiIpO3JldHVybiB0fHwiIyIhPT1lLm5hbWVbMF0mJih0PSJkZWZhdWx0IiksdGEudGVzdCh0KT97bmFtZTp0LnNsaWNlKDEsLTEpLGR5bmFtaWM6ITB9OntuYW1lOiciJyt0KyciJyxkeW5hbWljOiExfX1mdW5jdGlvbiBtYShlKXt2YXIgdD1lLm1hdGNoKGlhKTtpZih0KXt2YXIgbj17fTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZS5zbGljZSgxKV09ITB9KSxufX1mdW5jdGlvbiB5YShlKXtmb3IodmFyIHQ9e30sbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0W2Vbbl0ubmFtZV09ZVtuXS52YWx1ZTtyZXR1cm4gdH12YXIgZ2E9L154bWxuczpOU1xkKy8sX2E9L15OU1xkKzovO2Z1bmN0aW9uIGJhKGUpe3JldHVybiBsYShlLnRhZyxlLmF0dHJzTGlzdC5zbGljZSgpLGUucGFyZW50KX12YXIgJGE9W3lvLF9vLHtwcmVUcmFuc2Zvcm1Ob2RlOmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0Ij09PWUudGFnKXt2YXIgbixyPWUuYXR0cnNNYXA7aWYoIXJbInYtbW9kZWwiXSlyZXR1cm47aWYoKHJbIjp0eXBlIl18fHJbInYtYmluZDp0eXBlIl0pJiYobj1GcihlLCJ0eXBlIikpLHIudHlwZXx8bnx8IXJbInYtYmluZCJdfHwobj0iKCIrclsidi1iaW5kIl0rIikudHlwZSIpLG4pe3ZhciBpPVByKGUsInYtaWYiLCEwKSxvPWk/IiYmKCIraSsiKSI6IiIsYT1udWxsIT1QcihlLCJ2LWVsc2UiLCEwKSxzPVByKGUsInYtZWxzZS1pZiIsITApLGM9YmEoZSk7ZGEoYyksRHIoYywidHlwZSIsImNoZWNrYm94IikscGEoYyx0KSxjLnByb2Nlc3NlZD0hMCxjLmlmPSIoIituKyIpPT09J2NoZWNrYm94JyIrbyx2YShjLHtleHA6Yy5pZixibG9jazpjfSk7dmFyIHU9YmEoZSk7UHIodSwidi1mb3IiLCEwKSxEcih1LCJ0eXBlIiwicmFkaW8iKSxwYSh1LHQpLHZhKGMse2V4cDoiKCIrbisiKT09PSdyYWRpbyciK28sYmxvY2s6dX0pO3ZhciBsPWJhKGUpO3JldHVybiBQcihsLCJ2LWZvciIsITApLERyKGwsIjp0eXBlIixuKSxwYShsLHQpLHZhKGMse2V4cDppLGJsb2NrOmx9KSxhP2MuZWxzZT0hMDpzJiYoYy5lbHNlaWY9cyksY319fX1dO3ZhciB3YSxDYSx4YT17ZXhwZWN0SFRNTDohMCxtb2R1bGVzOiRhLGRpcmVjdGl2ZXM6e21vZGVsOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnZhbHVlLGk9dC5tb2RpZmllcnMsbz1lLnRhZyxhPWUuYXR0cnNNYXAudHlwZTtpZihlLmNvbXBvbmVudClyZXR1cm4gQnIoZSxyLGkpLCExO2lmKCJzZWxlY3QiPT09bykhZnVuY3Rpb24oZSx0LG4pe3ZhciByPSd2YXIgJCRzZWxlY3RlZFZhbCA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCgkZXZlbnQudGFyZ2V0Lm9wdGlvbnMsZnVuY3Rpb24obyl7cmV0dXJuIG8uc2VsZWN0ZWR9KS5tYXAoZnVuY3Rpb24obyl7dmFyIHZhbCA9ICJfdmFsdWUiIGluIG8gPyBvLl92YWx1ZSA6IG8udmFsdWU7cmV0dXJuICcrKG4mJm4ubnVtYmVyPyJfbih2YWwpIjoidmFsIikrIn0pOyI7cj1yKyIgIitVcih0LCIkZXZlbnQudGFyZ2V0Lm11bHRpcGxlID8gJCRzZWxlY3RlZFZhbCA6ICQkc2VsZWN0ZWRWYWxbMF0iKSxNcihlLCJjaGFuZ2UiLHIsbnVsbCwhMCl9KGUscixpKTtlbHNlIGlmKCJpbnB1dCI9PT1vJiYiY2hlY2tib3giPT09YSkhZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4mJm4ubnVtYmVyLGk9RnIoZSwidmFsdWUiKXx8Im51bGwiLG89RnIoZSwidHJ1ZS12YWx1ZSIpfHwidHJ1ZSIsYT1GcihlLCJmYWxzZS12YWx1ZSIpfHwiZmFsc2UiO0VyKGUsImNoZWNrZWQiLCJBcnJheS5pc0FycmF5KCIrdCsiKT9faSgiK3QrIiwiK2krIik+LTEiKygidHJ1ZSI9PT1vPyI6KCIrdCsiKSI6IjpfcSgiK3QrIiwiK28rIikiKSksTXIoZSwiY2hhbmdlIiwidmFyICQkYT0iK3QrIiwkJGVsPSRldmVudC50YXJnZXQsJCRjPSQkZWwuY2hlY2tlZD8oIitvKyIpOigiK2ErIik7aWYoQXJyYXkuaXNBcnJheSgkJGEpKXt2YXIgJCR2PSIrKHI/Il9uKCIraSsiKSI6aSkrIiwkJGk9X2koJCRhLCQkdik7aWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIrVXIodCwiJCRhLmNvbmNhdChbJCR2XSkiKSsiKX1lbHNleyQkaT4tMSYmKCIrVXIodCwiJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSkiKSsiKX19ZWxzZXsiK1VyKHQsIiQkYyIpKyJ9IixudWxsLCEwKX0oZSxyLGkpO2Vsc2UgaWYoImlucHV0Ij09PW8mJiJyYWRpbyI9PT1hKSFmdW5jdGlvbihlLHQsbil7dmFyIHI9biYmbi5udW1iZXIsaT1GcihlLCJ2YWx1ZSIpfHwibnVsbCI7RXIoZSwiY2hlY2tlZCIsIl9xKCIrdCsiLCIrKGk9cj8iX24oIitpKyIpIjppKSsiKSIpLE1yKGUsImNoYW5nZSIsVXIodCxpKSxudWxsLCEwKX0oZSxyLGkpO2Vsc2UgaWYoImlucHV0Ij09PW98fCJ0ZXh0YXJlYSI9PT1vKSFmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5hdHRyc01hcC50eXBlLGk9bnx8e30sbz1pLmxhenksYT1pLm51bWJlcixzPWkudHJpbSxjPSFvJiYicmFuZ2UiIT09cix1PW8/ImNoYW5nZSI6InJhbmdlIj09PXI/WnI6ImlucHV0IixsPSIkZXZlbnQudGFyZ2V0LnZhbHVlIjtzJiYobD0iJGV2ZW50LnRhcmdldC52YWx1ZS50cmltKCkiKSxhJiYobD0iX24oIitsKyIpIik7dmFyIGY9VXIodCxsKTtjJiYoZj0iaWYoJGV2ZW50LnRhcmdldC5jb21wb3NpbmcpcmV0dXJuOyIrZiksRXIoZSwidmFsdWUiLCIoIit0KyIpIiksTXIoZSx1LGYsbnVsbCwhMCksKHN8fGEpJiZNcihlLCJibHVyIiwiJGZvcmNlVXBkYXRlKCkiKX0oZSxyLGkpO2Vsc2UgaWYoIUYuaXNSZXNlcnZlZFRhZyhvKSlyZXR1cm4gQnIoZSxyLGkpLCExO3JldHVybiEwfSx0ZXh0OmZ1bmN0aW9uKGUsdCl7dC52YWx1ZSYmRXIoZSwidGV4dENvbnRlbnQiLCJfcygiK3QudmFsdWUrIikiLHQpfSxodG1sOmZ1bmN0aW9uKGUsdCl7dC52YWx1ZSYmRXIoZSwiaW5uZXJIVE1MIiwiX3MoIit0LnZhbHVlKyIpIix0KX19LGlzUHJlVGFnOmZ1bmN0aW9uKGUpe3JldHVybiJwcmUiPT09ZX0saXNVbmFyeVRhZzokbyxtdXN0VXNlUHJvcDpEbixjYW5CZUxlZnRPcGVuVGFnOndvLGlzUmVzZXJ2ZWRUYWc6Wm4sZ2V0VGFnTmFtZXNwYWNlOkduLHN0YXRpY0tleXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uY2F0KHQuc3RhdGljS2V5c3x8W10pfSxbXSkuam9pbigiLCIpfSgkYSl9LGthPWcoZnVuY3Rpb24oZSl7cmV0dXJuIHAoInR5cGUsdGFnLGF0dHJzTGlzdCxhdHRyc01hcCxwbGFpbixwYXJlbnQsY2hpbGRyZW4sYXR0cnMsc3RhcnQsZW5kLHJhd0F0dHJzTWFwIisoZT8iLCIrZToiIikpfSk7ZnVuY3Rpb24gQWEoZSx0KXtlJiYod2E9a2EodC5zdGF0aWNLZXlzfHwiIiksQ2E9dC5pc1Jlc2VydmVkVGFnfHxULGZ1bmN0aW9uIGUodCl7dC5zdGF0aWM9ZnVuY3Rpb24oZSl7aWYoMj09PWUudHlwZSlyZXR1cm4hMTtpZigzPT09ZS50eXBlKXJldHVybiEwO3JldHVybiEoIWUucHJlJiYoZS5oYXNCaW5kaW5nc3x8ZS5pZnx8ZS5mb3J8fGQoZS50YWcpfHwhQ2EoZS50YWcpfHxmdW5jdGlvbihlKXtmb3IoO2UucGFyZW50Oyl7aWYoInRlbXBsYXRlIiE9PShlPWUucGFyZW50KS50YWcpcmV0dXJuITE7aWYoZS5mb3IpcmV0dXJuITB9cmV0dXJuITF9KGUpfHwhT2JqZWN0LmtleXMoZSkuZXZlcnkod2EpKSl9KHQpO2lmKDE9PT10LnR5cGUpe2lmKCFDYSh0LnRhZykmJiJzbG90IiE9PXQudGFnJiZudWxsPT10LmF0dHJzTWFwWyJpbmxpbmUtdGVtcGxhdGUiXSlyZXR1cm47Zm9yKHZhciBuPTAscj10LmNoaWxkcmVuLmxlbmd0aDtuPHI7bisrKXt2YXIgaT10LmNoaWxkcmVuW25dO2UoaSksaS5zdGF0aWN8fCh0LnN0YXRpYz0hMSl9aWYodC5pZkNvbmRpdGlvbnMpZm9yKHZhciBvPTEsYT10LmlmQ29uZGl0aW9ucy5sZW5ndGg7bzxhO28rKyl7dmFyIHM9dC5pZkNvbmRpdGlvbnNbb10uYmxvY2s7ZShzKSxzLnN0YXRpY3x8KHQuc3RhdGljPSExKX19fShlKSxmdW5jdGlvbiBlKHQsbil7aWYoMT09PXQudHlwZSl7aWYoKHQuc3RhdGljfHx0Lm9uY2UpJiYodC5zdGF0aWNJbkZvcj1uKSx0LnN0YXRpYyYmdC5jaGlsZHJlbi5sZW5ndGgmJigxIT09dC5jaGlsZHJlbi5sZW5ndGh8fDMhPT10LmNoaWxkcmVuWzBdLnR5cGUpKXJldHVybiB2b2lkKHQuc3RhdGljUm9vdD0hMCk7aWYodC5zdGF0aWNSb290PSExLHQuY2hpbGRyZW4pZm9yKHZhciByPTAsaT10LmNoaWxkcmVuLmxlbmd0aDtyPGk7cisrKWUodC5jaGlsZHJlbltyXSxufHwhIXQuZm9yKTtpZih0LmlmQ29uZGl0aW9ucylmb3IodmFyIG89MSxhPXQuaWZDb25kaXRpb25zLmxlbmd0aDtvPGE7bysrKWUodC5pZkNvbmRpdGlvbnNbb10uYmxvY2ssbil9fShlLCExKSl9dmFyIE9hPS9eKFtcdyRfXSt8XChbXildKj9cKSlccyo9PnxeZnVuY3Rpb24oPzpccytbXHckXSspP1xzKlwoLyxTYT0vXChbXildKj9cKTsqJC8sVGE9L15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLyxOYT17ZXNjOjI3LHRhYjo5LGVudGVyOjEzLHNwYWNlOjMyLHVwOjM4LGxlZnQ6MzcscmlnaHQ6MzksZG93bjo0MCxkZWxldGU6WzgsNDZdfSxFYT17ZXNjOlsiRXNjIiwiRXNjYXBlIl0sdGFiOiJUYWIiLGVudGVyOiJFbnRlciIsc3BhY2U6WyIgIiwiU3BhY2ViYXIiXSx1cDpbIlVwIiwiQXJyb3dVcCJdLGxlZnQ6WyJMZWZ0IiwiQXJyb3dMZWZ0Il0scmlnaHQ6WyJSaWdodCIsIkFycm93UmlnaHQiXSxkb3duOlsiRG93biIsIkFycm93RG93biJdLGRlbGV0ZTpbIkJhY2tzcGFjZSIsIkRlbGV0ZSIsIkRlbCJdfSxqYT1mdW5jdGlvbihlKXtyZXR1cm4iaWYoIitlKyIpcmV0dXJuIG51bGw7In0sRGE9e3N0b3A6IiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiLHByZXZlbnQ6IiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyIsc2VsZjpqYSgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSxjdHJsOmphKCIhJGV2ZW50LmN0cmxLZXkiKSxzaGlmdDpqYSgiISRldmVudC5zaGlmdEtleSIpLGFsdDpqYSgiISRldmVudC5hbHRLZXkiKSxtZXRhOmphKCIhJGV2ZW50Lm1ldGFLZXkiKSxsZWZ0OmphKCInYnV0dG9uJyBpbiAkZXZlbnQgJiYgJGV2ZW50LmJ1dHRvbiAhPT0gMCIpLG1pZGRsZTpqYSgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSxyaWdodDpqYSgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDIiKX07ZnVuY3Rpb24gTGEoZSx0KXt2YXIgbj10PyJuYXRpdmVPbjoiOiJvbjoiLHI9IiIsaT0iIjtmb3IodmFyIG8gaW4gZSl7dmFyIGE9SWEoZVtvXSk7ZVtvXSYmZVtvXS5keW5hbWljP2krPW8rIiwiK2ErIiwiOnIrPSciJytvKyciOicrYSsiLCJ9cmV0dXJuIHI9InsiK3Iuc2xpY2UoMCwtMSkrIn0iLGk/bisiX2QoIityKyIsWyIraS5zbGljZSgwLC0xKSsiXSkiOm4rcn1mdW5jdGlvbiBJYShlKXtpZighZSlyZXR1cm4iZnVuY3Rpb24oKXt9IjtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiJbIitlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gSWEoZSl9KS5qb2luKCIsIikrIl0iO3ZhciB0PVRhLnRlc3QoZS52YWx1ZSksbj1PYS50ZXN0KGUudmFsdWUpLHI9VGEudGVzdChlLnZhbHVlLnJlcGxhY2UoU2EsIiIpKTtpZihlLm1vZGlmaWVycyl7dmFyIGk9IiIsbz0iIixhPVtdO2Zvcih2YXIgcyBpbiBlLm1vZGlmaWVycylpZihEYVtzXSlvKz1EYVtzXSxOYVtzXSYmYS5wdXNoKHMpO2Vsc2UgaWYoImV4YWN0Ij09PXMpe3ZhciBjPWUubW9kaWZpZXJzO28rPWphKFsiY3RybCIsInNoaWZ0IiwiYWx0IiwibWV0YSJdLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hY1tlXX0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iJGV2ZW50LiIrZSsiS2V5In0pLmpvaW4oInx8IikpfWVsc2UgYS5wdXNoKHMpO3JldHVybiBhLmxlbmd0aCYmKGkrPWZ1bmN0aW9uKGUpe3JldHVybiJpZighJGV2ZW50LnR5cGUuaW5kZXhPZigna2V5JykmJiIrZS5tYXAoTWEpLmpvaW4oIiYmIikrIilyZXR1cm4gbnVsbDsifShhKSksbyYmKGkrPW8pLCJmdW5jdGlvbigkZXZlbnQpeyIraSsodD8icmV0dXJuICIrZS52YWx1ZSsiLmFwcGx5KG51bGwsIGFyZ3VtZW50cykiOm4/InJldHVybiAoIitlLnZhbHVlKyIpLmFwcGx5KG51bGwsIGFyZ3VtZW50cykiOnI/InJldHVybiAiK2UudmFsdWU6ZS52YWx1ZSkrIn0ifXJldHVybiB0fHxuP2UudmFsdWU6ImZ1bmN0aW9uKCRldmVudCl7Iisocj8icmV0dXJuICIrZS52YWx1ZTplLnZhbHVlKSsifSJ9ZnVuY3Rpb24gTWEoZSl7dmFyIHQ9cGFyc2VJbnQoZSwxMCk7aWYodClyZXR1cm4iJGV2ZW50LmtleUNvZGUhPT0iK3Q7dmFyIG49TmFbZV0scj1FYVtlXTtyZXR1cm4iX2soJGV2ZW50LmtleUNvZGUsIitKU09OLnN0cmluZ2lmeShlKSsiLCIrSlNPTi5zdHJpbmdpZnkobikrIiwkZXZlbnQua2V5LCIrSlNPTi5zdHJpbmdpZnkocikrIikifXZhciBGYT17b246ZnVuY3Rpb24oZSx0KXtlLndyYXBMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIl9nKCIrZSsiLCIrdC52YWx1ZSsiKSJ9fSxiaW5kOmZ1bmN0aW9uKGUsdCl7ZS53cmFwRGF0YT1mdW5jdGlvbihuKXtyZXR1cm4iX2IoIituKyIsJyIrZS50YWcrIicsIit0LnZhbHVlKyIsIisodC5tb2RpZmllcnMmJnQubW9kaWZpZXJzLnByb3A/InRydWUiOiJmYWxzZSIpKyh0Lm1vZGlmaWVycyYmdC5tb2RpZmllcnMuc3luYz8iLHRydWUiOiIiKSsiKSJ9fSxjbG9hazpTfSxQYT1mdW5jdGlvbihlKXt0aGlzLm9wdGlvbnM9ZSx0aGlzLndhcm49ZS53YXJufHxUcix0aGlzLnRyYW5zZm9ybXM9TnIoZS5tb2R1bGVzLCJ0cmFuc2Zvcm1Db2RlIiksdGhpcy5kYXRhR2VuRm5zPU5yKGUubW9kdWxlcywiZ2VuRGF0YSIpLHRoaXMuZGlyZWN0aXZlcz1BKEEoe30sRmEpLGUuZGlyZWN0aXZlcyk7dmFyIHQ9ZS5pc1Jlc2VydmVkVGFnfHxUO3RoaXMubWF5YmVDb21wb25lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuISFlLmNvbXBvbmVudHx8IXQoZS50YWcpfSx0aGlzLm9uY2VJZD0wLHRoaXMuc3RhdGljUmVuZGVyRm5zPVtdLHRoaXMucHJlPSExfTtmdW5jdGlvbiBSYShlLHQpe3ZhciBuPW5ldyBQYSh0KTtyZXR1cm57cmVuZGVyOiJ3aXRoKHRoaXMpe3JldHVybiAiKyhlPyJzY3JpcHQiPT09ZS50YWc/Im51bGwiOkhhKGUsbik6J19jKCJkaXYiKScpKyJ9IixzdGF0aWNSZW5kZXJGbnM6bi5zdGF0aWNSZW5kZXJGbnN9fWZ1bmN0aW9uIEhhKGUsdCl7aWYoZS5wYXJlbnQmJihlLnByZT1lLnByZXx8ZS5wYXJlbnQucHJlKSxlLnN0YXRpY1Jvb3QmJiFlLnN0YXRpY1Byb2Nlc3NlZClyZXR1cm4gQmEoZSx0KTtpZihlLm9uY2UmJiFlLm9uY2VQcm9jZXNzZWQpcmV0dXJuIFVhKGUsdCk7aWYoZS5mb3ImJiFlLmZvclByb2Nlc3NlZClyZXR1cm4gemEoZSx0KTtpZihlLmlmJiYhZS5pZlByb2Nlc3NlZClyZXR1cm4gVmEoZSx0KTtpZigidGVtcGxhdGUiIT09ZS50YWd8fGUuc2xvdFRhcmdldHx8dC5wcmUpe2lmKCJzbG90Ij09PWUudGFnKXJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPWUuc2xvdE5hbWV8fCciZGVmYXVsdCInLHI9V2EoZSx0KSxpPSJfdCgiK24rKHI/IixmdW5jdGlvbigpe3JldHVybiAiK3IrIn0iOiIiKSxvPWUuYXR0cnN8fGUuZHluYW1pY0F0dHJzP1hhKChlLmF0dHJzfHxbXSkuY29uY2F0KGUuZHluYW1pY0F0dHJzfHxbXSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOmIoZS5uYW1lKSx2YWx1ZTplLnZhbHVlLGR5bmFtaWM6ZS5keW5hbWljfX0pKTpudWxsLGE9ZS5hdHRyc01hcFsidi1iaW5kIl07IW8mJiFhfHxyfHwoaSs9IixudWxsIik7byYmKGkrPSIsIitvKTthJiYoaSs9KG8/IiI6IixudWxsIikrIiwiK2EpO3JldHVybiBpKyIpIn0oZSx0KTt2YXIgbjtpZihlLmNvbXBvbmVudCluPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LmlubGluZVRlbXBsYXRlP251bGw6V2EodCxuLCEwKTtyZXR1cm4iX2MoIitlKyIsIitLYSh0LG4pKyhyPyIsIityOiIiKSsiKSJ9KGUuY29tcG9uZW50LGUsdCk7ZWxzZXt2YXIgcjsoIWUucGxhaW58fGUucHJlJiZ0Lm1heWJlQ29tcG9uZW50KGUpKSYmKHI9S2EoZSx0KSk7dmFyIGk9ZS5pbmxpbmVUZW1wbGF0ZT9udWxsOldhKGUsdCwhMCk7bj0iX2MoJyIrZS50YWcrIiciKyhyPyIsIityOiIiKSsoaT8iLCIraToiIikrIikifWZvcih2YXIgbz0wO288dC50cmFuc2Zvcm1zLmxlbmd0aDtvKyspbj10LnRyYW5zZm9ybXNbb10oZSxuKTtyZXR1cm4gbn1yZXR1cm4gV2EoZSx0KXx8InZvaWQgMCJ9ZnVuY3Rpb24gQmEoZSx0KXtlLnN0YXRpY1Byb2Nlc3NlZD0hMDt2YXIgbj10LnByZTtyZXR1cm4gZS5wcmUmJih0LnByZT1lLnByZSksdC5zdGF0aWNSZW5kZXJGbnMucHVzaCgid2l0aCh0aGlzKXtyZXR1cm4gIitIYShlLHQpKyJ9IiksdC5wcmU9biwiX20oIisodC5zdGF0aWNSZW5kZXJGbnMubGVuZ3RoLTEpKyhlLnN0YXRpY0luRm9yPyIsdHJ1ZSI6IiIpKyIpIn1mdW5jdGlvbiBVYShlLHQpe2lmKGUub25jZVByb2Nlc3NlZD0hMCxlLmlmJiYhZS5pZlByb2Nlc3NlZClyZXR1cm4gVmEoZSx0KTtpZihlLnN0YXRpY0luRm9yKXtmb3IodmFyIG49IiIscj1lLnBhcmVudDtyOyl7aWYoci5mb3Ipe249ci5rZXk7YnJlYWt9cj1yLnBhcmVudH1yZXR1cm4gbj8iX28oIitIYShlLHQpKyIsIit0Lm9uY2VJZCsrKyIsIituKyIpIjpIYShlLHQpfXJldHVybiBCYShlLHQpfWZ1bmN0aW9uIFZhKGUsdCxuLHIpe3JldHVybiBlLmlmUHJvY2Vzc2VkPSEwLGZ1bmN0aW9uIGUodCxuLHIsaSl7aWYoIXQubGVuZ3RoKXJldHVybiBpfHwiX2UoKSI7dmFyIG89dC5zaGlmdCgpO3JldHVybiBvLmV4cD8iKCIrby5leHArIik/IithKG8uYmxvY2spKyI6IitlKHQsbixyLGkpOiIiK2Eoby5ibG9jayk7ZnVuY3Rpb24gYShlKXtyZXR1cm4gcj9yKGUsbik6ZS5vbmNlP1VhKGUsbik6SGEoZSxuKX19KGUuaWZDb25kaXRpb25zLnNsaWNlKCksdCxuLHIpfWZ1bmN0aW9uIHphKGUsdCxuLHIpe3ZhciBpPWUuZm9yLG89ZS5hbGlhcyxhPWUuaXRlcmF0b3IxPyIsIitlLml0ZXJhdG9yMToiIixzPWUuaXRlcmF0b3IyPyIsIitlLml0ZXJhdG9yMjoiIjtyZXR1cm4gZS5mb3JQcm9jZXNzZWQ9ITAsKHJ8fCJfbCIpKyIoKCIraSsiKSxmdW5jdGlvbigiK28rYStzKyIpe3JldHVybiAiKyhufHxIYSkoZSx0KSsifSkifWZ1bmN0aW9uIEthKGUsdCl7dmFyIG49InsiLHI9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmRpcmVjdGl2ZXM7aWYoIW4pcmV0dXJuO3ZhciByLGksbyxhLHM9ImRpcmVjdGl2ZXM6WyIsYz0hMTtmb3Iocj0wLGk9bi5sZW5ndGg7cjxpO3IrKyl7bz1uW3JdLGE9ITA7dmFyIHU9dC5kaXJlY3RpdmVzW28ubmFtZV07dSYmKGE9ISF1KGUsbyx0Lndhcm4pKSxhJiYoYz0hMCxzKz0ne25hbWU6Iicrby5uYW1lKyciLHJhd05hbWU6Iicrby5yYXdOYW1lKyciJysoby52YWx1ZT8iLHZhbHVlOigiK28udmFsdWUrIiksZXhwcmVzc2lvbjoiK0pTT04uc3RyaW5naWZ5KG8udmFsdWUpOiIiKSsoby5hcmc/Iixhcmc6Iisoby5pc0R5bmFtaWNBcmc/by5hcmc6JyInK28uYXJnKyciJyk6IiIpKyhvLm1vZGlmaWVycz8iLG1vZGlmaWVyczoiK0pTT04uc3RyaW5naWZ5KG8ubW9kaWZpZXJzKToiIikrIn0sIil9aWYoYylyZXR1cm4gcy5zbGljZSgwLC0xKSsiXSJ9KGUsdCk7ciYmKG4rPXIrIiwiKSxlLmtleSYmKG4rPSJrZXk6IitlLmtleSsiLCIpLGUucmVmJiYobis9InJlZjoiK2UucmVmKyIsIiksZS5yZWZJbkZvciYmKG4rPSJyZWZJbkZvcjp0cnVlLCIpLGUucHJlJiYobis9InByZTp0cnVlLCIpLGUuY29tcG9uZW50JiYobis9J3RhZzoiJytlLnRhZysnIiwnKTtmb3IodmFyIGk9MDtpPHQuZGF0YUdlbkZucy5sZW5ndGg7aSsrKW4rPXQuZGF0YUdlbkZuc1tpXShlKTtpZihlLmF0dHJzJiYobis9ImF0dHJzOiIrWGEoZS5hdHRycykrIiwiKSxlLnByb3BzJiYobis9ImRvbVByb3BzOiIrWGEoZS5wcm9wcykrIiwiKSxlLmV2ZW50cyYmKG4rPUxhKGUuZXZlbnRzLCExKSsiLCIpLGUubmF0aXZlRXZlbnRzJiYobis9TGEoZS5uYXRpdmVFdmVudHMsITApKyIsIiksZS5zbG90VGFyZ2V0JiYhZS5zbG90U2NvcGUmJihuKz0ic2xvdDoiK2Uuc2xvdFRhcmdldCsiLCIpLGUuc2NvcGVkU2xvdHMmJihuKz1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5mb3J8fE9iamVjdC5rZXlzKHQpLnNvbWUoZnVuY3Rpb24oZSl7dmFyIG49dFtlXTtyZXR1cm4gbi5zbG90VGFyZ2V0RHluYW1pY3x8bi5pZnx8bi5mb3J8fEphKG4pfSksaT0hIWUuaWY7aWYoIXIpZm9yKHZhciBvPWUucGFyZW50O287KXtpZihvLnNsb3RTY29wZSYmby5zbG90U2NvcGUhPT11YXx8by5mb3Ipe3I9ITA7YnJlYWt9by5pZiYmKGk9ITApLG89by5wYXJlbnR9dmFyIGE9T2JqZWN0LmtleXModCkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBxYSh0W2VdLG4pfSkuam9pbigiLCIpO3JldHVybiJzY29wZWRTbG90czpfdShbIithKyJdIisocj8iLG51bGwsdHJ1ZSI6IiIpKyghciYmaT8iLG51bGwsZmFsc2UsIitmdW5jdGlvbihlKXt2YXIgdD01MzgxLG49ZS5sZW5ndGg7Zm9yKDtuOyl0PTMzKnReZS5jaGFyQ29kZUF0KC0tbik7cmV0dXJuIHQ+Pj4wfShhKToiIikrIikifShlLGUuc2NvcGVkU2xvdHMsdCkrIiwiKSxlLm1vZGVsJiYobis9Im1vZGVsOnt2YWx1ZToiK2UubW9kZWwudmFsdWUrIixjYWxsYmFjazoiK2UubW9kZWwuY2FsbGJhY2srIixleHByZXNzaW9uOiIrZS5tb2RlbC5leHByZXNzaW9uKyJ9LCIpLGUuaW5saW5lVGVtcGxhdGUpe3ZhciBvPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jaGlsZHJlblswXTtpZihuJiYxPT09bi50eXBlKXt2YXIgcj1SYShuLHQub3B0aW9ucyk7cmV0dXJuImlubGluZVRlbXBsYXRlOntyZW5kZXI6ZnVuY3Rpb24oKXsiK3IucmVuZGVyKyJ9LHN0YXRpY1JlbmRlckZuczpbIityLnN0YXRpY1JlbmRlckZucy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uKCl7IitlKyJ9In0pLmpvaW4oIiwiKSsiXX0ifX0oZSx0KTtvJiYobis9bysiLCIpfXJldHVybiBuPW4ucmVwbGFjZSgvLCQvLCIiKSsifSIsZS5keW5hbWljQXR0cnMmJihuPSJfYigiK24rJywiJytlLnRhZysnIiwnK1hhKGUuZHluYW1pY0F0dHJzKSsiKSIpLGUud3JhcERhdGEmJihuPWUud3JhcERhdGEobikpLGUud3JhcExpc3RlbmVycyYmKG49ZS53cmFwTGlzdGVuZXJzKG4pKSxufWZ1bmN0aW9uIEphKGUpe3JldHVybiAxPT09ZS50eXBlJiYoInNsb3QiPT09ZS50YWd8fGUuY2hpbGRyZW4uc29tZShKYSkpfWZ1bmN0aW9uIHFhKGUsdCl7dmFyIG49ZS5hdHRyc01hcFsic2xvdC1zY29wZSJdO2lmKGUuaWYmJiFlLmlmUHJvY2Vzc2VkJiYhbilyZXR1cm4gVmEoZSx0LHFhLCJudWxsIik7aWYoZS5mb3ImJiFlLmZvclByb2Nlc3NlZClyZXR1cm4gemEoZSx0LHFhKTt2YXIgcj1lLnNsb3RTY29wZT09PXVhPyIiOlN0cmluZyhlLnNsb3RTY29wZSksaT0iZnVuY3Rpb24oIityKyIpe3JldHVybiAiKygidGVtcGxhdGUiPT09ZS50YWc/ZS5pZiYmbj8iKCIrZS5pZisiKT8iKyhXYShlLHQpfHwidW5kZWZpbmVkIikrIjp1bmRlZmluZWQiOldhKGUsdCl8fCJ1bmRlZmluZWQiOkhhKGUsdCkpKyJ9IixvPXI/IiI6Iixwcm94eTp0cnVlIjtyZXR1cm4ie2tleToiKyhlLnNsb3RUYXJnZXR8fCciZGVmYXVsdCInKSsiLGZuOiIraStvKyJ9In1mdW5jdGlvbiBXYShlLHQsbixyLGkpe3ZhciBvPWUuY2hpbGRyZW47aWYoby5sZW5ndGgpe3ZhciBhPW9bMF07aWYoMT09PW8ubGVuZ3RoJiZhLmZvciYmInRlbXBsYXRlIiE9PWEudGFnJiYic2xvdCIhPT1hLnRhZyl7dmFyIHM9bj90Lm1heWJlQ29tcG9uZW50KGEpPyIsMSI6IiwwIjoiIjtyZXR1cm4iIisocnx8SGEpKGEsdCkrc312YXIgYz1uP2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAscj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdO2lmKDE9PT1pLnR5cGUpe2lmKFphKGkpfHxpLmlmQ29uZGl0aW9ucyYmaS5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gWmEoZS5ibG9jayl9KSl7bj0yO2JyZWFrfSh0KGkpfHxpLmlmQ29uZGl0aW9ucyYmaS5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gdChlLmJsb2NrKX0pKSYmKG49MSl9fXJldHVybiBufShvLHQubWF5YmVDb21wb25lbnQpOjAsdT1pfHxHYTtyZXR1cm4iWyIrby5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHUoZSx0KX0pLmpvaW4oIiwiKSsiXSIrKGM/IiwiK2M6IiIpfX1mdW5jdGlvbiBaYShlKXtyZXR1cm4gdm9pZCAwIT09ZS5mb3J8fCJ0ZW1wbGF0ZSI9PT1lLnRhZ3x8InNsb3QiPT09ZS50YWd9ZnVuY3Rpb24gR2EoZSx0KXtyZXR1cm4gMT09PWUudHlwZT9IYShlLHQpOjM9PT1lLnR5cGUmJmUuaXNDb21tZW50PyhyPWUsIl9lKCIrSlNPTi5zdHJpbmdpZnkoci50ZXh0KSsiKSIpOiJfdigiKygyPT09KG49ZSkudHlwZT9uLmV4cHJlc3Npb246WWEoSlNPTi5zdHJpbmdpZnkobi50ZXh0KSkpKyIpIjt2YXIgbixyfWZ1bmN0aW9uIFhhKGUpe2Zvcih2YXIgdD0iIixuPSIiLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyXSxvPVlhKGkudmFsdWUpO2kuZHluYW1pYz9uKz1pLm5hbWUrIiwiK28rIiwiOnQrPSciJytpLm5hbWUrJyI6JytvKyIsIn1yZXR1cm4gdD0ieyIrdC5zbGljZSgwLC0xKSsifSIsbj8iX2QoIit0KyIsWyIrbi5zbGljZSgwLC0xKSsiXSkiOnR9ZnVuY3Rpb24gWWEoZSl7cmV0dXJuIGUucmVwbGFjZSgvXHUyMDI4L2csIlxcdTIwMjgiKS5yZXBsYWNlKC9cdTIwMjkvZywiXFx1MjAyOSIpfW5ldyBSZWdFeHAoIlxcYiIrImRvLGlmLGZvcixsZXQsbmV3LHRyeSx2YXIsY2FzZSxlbHNlLHdpdGgsYXdhaXQsYnJlYWssY2F0Y2gsY2xhc3MsY29uc3Qsc3VwZXIsdGhyb3csd2hpbGUseWllbGQsZGVsZXRlLGV4cG9ydCxpbXBvcnQscmV0dXJuLHN3aXRjaCxkZWZhdWx0LGV4dGVuZHMsZmluYWxseSxjb250aW51ZSxkZWJ1Z2dlcixmdW5jdGlvbixhcmd1bWVudHMiLnNwbGl0KCIsIikuam9pbigiXFxifFxcYiIpKyJcXGIiKTtmdW5jdGlvbiBRYShlLHQpe3RyeXtyZXR1cm4gbmV3IEZ1bmN0aW9uKGUpfWNhdGNoKG4pe3JldHVybiB0LnB1c2goe2VycjpuLGNvZGU6ZX0pLFN9fWZ1bmN0aW9uIGVzKGUpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGZ1bmN0aW9uKG4scixpKXsocj1BKHt9LHIpKS53YXJuO2RlbGV0ZSByLndhcm47dmFyIG89ci5kZWxpbWl0ZXJzP1N0cmluZyhyLmRlbGltaXRlcnMpK246bjtpZih0W29dKXJldHVybiB0W29dO3ZhciBhPWUobixyKSxzPXt9LGM9W107cmV0dXJuIHMucmVuZGVyPVFhKGEucmVuZGVyLGMpLHMuc3RhdGljUmVuZGVyRm5zPWEuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gUWEoZSxjKX0pLHRbb109c319dmFyIHRzLG5zLHJzPSh0cz1mdW5jdGlvbihlLHQpe3ZhciBuPWZhKGUudHJpbSgpLHQpOyExIT09dC5vcHRpbWl6ZSYmQWEobix0KTt2YXIgcj1SYShuLHQpO3JldHVybnthc3Q6bixyZW5kZXI6ci5yZW5kZXIsc3RhdGljUmVuZGVyRm5zOnIuc3RhdGljUmVuZGVyRm5zfX0sZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LG4pe3ZhciByPU9iamVjdC5jcmVhdGUoZSksaT1bXSxvPVtdO2lmKG4pZm9yKHZhciBhIGluIG4ubW9kdWxlcyYmKHIubW9kdWxlcz0oZS5tb2R1bGVzfHxbXSkuY29uY2F0KG4ubW9kdWxlcykpLG4uZGlyZWN0aXZlcyYmKHIuZGlyZWN0aXZlcz1BKE9iamVjdC5jcmVhdGUoZS5kaXJlY3RpdmVzfHxudWxsKSxuLmRpcmVjdGl2ZXMpKSxuKSJtb2R1bGVzIiE9PWEmJiJkaXJlY3RpdmVzIiE9PWEmJihyW2FdPW5bYV0pO3Iud2Fybj1mdW5jdGlvbihlLHQsbil7KG4/bzppKS5wdXNoKGUpfTt2YXIgcz10cyh0LnRyaW0oKSxyKTtyZXR1cm4gcy5lcnJvcnM9aSxzLnRpcHM9byxzfXJldHVybntjb21waWxlOnQsY29tcGlsZVRvRnVuY3Rpb25zOmVzKHQpfX0pKHhhKSxpcz0ocnMuY29tcGlsZSxycy5jb21waWxlVG9GdW5jdGlvbnMpO2Z1bmN0aW9uIG9zKGUpe3JldHVybihucz1uc3x8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmlubmVySFRNTD1lPyc8YSBocmVmPSJcbiIvPic6JzxkaXYgYT0iXG4iLz4nLG5zLmlubmVySFRNTC5pbmRleE9mKCImIzEwOyIpPjB9dmFyIGFzPSEhViYmb3MoITEpLHNzPSEhViYmb3MoITApLGNzPWcoZnVuY3Rpb24oZSl7dmFyIHQ9UW4oZSk7cmV0dXJuIHQmJnQuaW5uZXJIVE1MfSksdXM9Q24ucHJvdG90eXBlLiRtb3VudDtyZXR1cm4gQ24ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe2lmKChlPWUmJlFuKGUpKT09PWRvY3VtZW50LmJvZHl8fGU9PT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpcmV0dXJuIHRoaXM7dmFyIG49dGhpcy4kb3B0aW9ucztpZighbi5yZW5kZXIpe3ZhciByPW4udGVtcGxhdGU7aWYocilpZigic3RyaW5nIj09dHlwZW9mIHIpIiMiPT09ci5jaGFyQXQoMCkmJihyPWNzKHIpKTtlbHNle2lmKCFyLm5vZGVUeXBlKXJldHVybiB0aGlzO3I9ci5pbm5lckhUTUx9ZWxzZSBlJiYocj1mdW5jdGlvbihlKXtpZihlLm91dGVySFRNTClyZXR1cm4gZS5vdXRlckhUTUw7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIHQuYXBwZW5kQ2hpbGQoZS5jbG9uZU5vZGUoITApKSx0LmlubmVySFRNTH0oZSkpO2lmKHIpe3ZhciBpPWlzKHIse291dHB1dFNvdXJjZVJhbmdlOiExLHNob3VsZERlY29kZU5ld2xpbmVzOmFzLHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjpzcyxkZWxpbWl0ZXJzOm4uZGVsaW1pdGVycyxjb21tZW50czpuLmNvbW1lbnRzfSx0aGlzKSxvPWkucmVuZGVyLGE9aS5zdGF0aWNSZW5kZXJGbnM7bi5yZW5kZXI9byxuLnN0YXRpY1JlbmRlckZucz1hfX1yZXR1cm4gdXMuY2FsbCh0aGlzLGUsdCl9LENuLmNvbXBpbGU9aXMsQ259KTs="},{"meta":{"name":"less.min.js","url":"https://lib.baomitu.com/less.js/4.1.2/less.min.js","ts":1670421067148,"mimetype":"text/javascript"},"source":"LyoqCiAqIExlc3MgLSBMZWFuZXIgQ1NTIHY0LjEuMgogKiBodHRwOi8vbGVzc2Nzcy5vcmcKICogCiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDIxLCBBbGV4aXMgU2VsbGllciA8c2VsZkBjbG91ZGhlYWQubmV0PgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBMaWNlbnNlLgogKgogKiBAbGljZW5zZSBBcGFjaGUtMi4wCiAqLwohZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPXQoKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZSh0KTooZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5sZXNzPXQoKX0odGhpcywoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZS5yZXBsYWNlKC9eW2Etei1dKzpcLys/W15cL10rLywiIikucmVwbGFjZSgvW1w/XCZdbGl2ZXJlbG9hZD1cdysvLCIiKS5yZXBsYWNlKC9eXC8vLCIiKS5yZXBsYWNlKC9cLlthLXpBLVpdKyQvLCIiKS5yZXBsYWNlKC9bXlwuXHctXSsvZywiLSIpLnJlcGxhY2UoL1wuL2csIjoiKX1mdW5jdGlvbiB0KGUsdCl7Zm9yKHZhciBpIGluIHQuZGF0YXNldClpZih0LmRhdGFzZXQuaGFzT3duUHJvcGVydHkoaSkpaWYoImVudiI9PT1pfHwiZHVtcExpbmVOdW1iZXJzIj09PWl8fCJyb290cGF0aCI9PT1pfHwiZXJyb3JSZXBvcnRpbmciPT09aSllW2ldPXQuZGF0YXNldFtpXTtlbHNlIHRyeXtlW2ldPUpTT04ucGFyc2UodC5kYXRhc2V0W2ldKX1jYXRjaChlKXt9fXZhciBpPWZ1bmN0aW9uKHQsaSxuKXt2YXIgcj1uLmhyZWZ8fCIiLHM9Imxlc3M6Iisobi50aXRsZXx8ZShyKSksbz10LmdldEVsZW1lbnRCeUlkKHMpLGE9ITEsbD10LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7bC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJ0ZXh0L2NzcyIpLG4ubWVkaWEmJmwuc2V0QXR0cmlidXRlKCJtZWRpYSIsbi5tZWRpYSksbC5pZD1zLGwuc3R5bGVTaGVldHx8KGwuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZShpKSksYT1udWxsIT09byYmby5jaGlsZE5vZGVzLmxlbmd0aD4wJiZsLmNoaWxkTm9kZXMubGVuZ3RoPjAmJm8uZmlyc3RDaGlsZC5ub2RlVmFsdWU9PT1sLmZpcnN0Q2hpbGQubm9kZVZhbHVlKTt2YXIgdT10LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07aWYobnVsbD09PW98fCExPT09YSl7dmFyIGM9biYmbi5uZXh0U2libGluZ3x8bnVsbDtjP2MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobCxjKTp1LmFwcGVuZENoaWxkKGwpfWlmKG8mJiExPT09YSYmby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pLGwuc3R5bGVTaGVldCl0cnl7bC5zdHlsZVNoZWV0LmNzc1RleHQ9aX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoIkNvdWxkbid0IHJlYXNzaWduIHN0eWxlU2hlZXQuY3NzVGV4dC4iKX19LG49ZnVuY3Rpb24oZSl7dmFyIHQsaT1lLmRvY3VtZW50O3JldHVybiBpLmN1cnJlbnRTY3JpcHR8fCh0PWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpKVt0Lmxlbmd0aC0xXX0scj17ZXJyb3I6ZnVuY3Rpb24oZSl7dGhpcy5fZmlyZUV2ZW50KCJlcnJvciIsZSl9LHdhcm46ZnVuY3Rpb24oZSl7dGhpcy5fZmlyZUV2ZW50KCJ3YXJuIixlKX0saW5mbzpmdW5jdGlvbihlKXt0aGlzLl9maXJlRXZlbnQoImluZm8iLGUpfSxkZWJ1ZzpmdW5jdGlvbihlKXt0aGlzLl9maXJlRXZlbnQoImRlYnVnIixlKX0sYWRkTGlzdGVuZXI6ZnVuY3Rpb24oZSl7dGhpcy5fbGlzdGVuZXJzLnB1c2goZSl9LHJlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8dGhpcy5fbGlzdGVuZXJzLmxlbmd0aDt0KyspaWYodGhpcy5fbGlzdGVuZXJzW3RdPT09ZSlyZXR1cm4gdm9pZCB0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9LF9maXJlRXZlbnQ6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIGk9MDtpPHRoaXMuX2xpc3RlbmVycy5sZW5ndGg7aSsrKXt2YXIgbj10aGlzLl9saXN0ZW5lcnNbaV1bZV07biYmbih0KX19LF9saXN0ZW5lcnM6W119LHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7dGhpcy5maWxlTWFuYWdlcnM9dHx8W10sZT1lfHx7fTtmb3IodmFyIGk9W10sbj1pLmNvbmNhdChbImVuY29kZUJhc2U2NCIsIm1pbWVMb29rdXAiLCJjaGFyc2V0TG9va3VwIiwiZ2V0U291cmNlTWFwR2VuZXJhdG9yIl0pLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIHM9bltyXSxvPWVbc107bz90aGlzW3NdPW8uYmluZChlKTpyPGkubGVuZ3RoJiZ0aGlzLndhcm4oIm1pc3NpbmcgcmVxdWlyZWQgZnVuY3Rpb24gaW4gZW52aXJvbm1lbnQgLSAiK3MpfX1yZXR1cm4gZS5wcm90b3R5cGUuZ2V0RmlsZU1hbmFnZXI9ZnVuY3Rpb24oZSx0LGksbixzKXtlfHxyLndhcm4oImdldEZpbGVNYW5hZ2VyIGNhbGxlZCB3aXRoIG5vIGZpbGVuYW1lLi4gUGxlYXNlIHJlcG9ydCB0aGlzIGlzc3VlLiBjb250aW51aW5nLiIpLG51bGw9PXQmJnIud2FybigiZ2V0RmlsZU1hbmFnZXIgY2FsbGVkIHdpdGggbnVsbCBkaXJlY3RvcnkuLiBQbGVhc2UgcmVwb3J0IHRoaXMgaXNzdWUuIGNvbnRpbnVpbmcuIik7dmFyIG89dGhpcy5maWxlTWFuYWdlcnM7aS5wbHVnaW5NYW5hZ2VyJiYobz1bXS5jb25jYXQobykuY29uY2F0KGkucGx1Z2luTWFuYWdlci5nZXRGaWxlTWFuYWdlcnMoKSkpO2Zvcih2YXIgYT1vLmxlbmd0aC0xO2E+PTA7YS0tKXt2YXIgbD1vW2FdO2lmKGxbcz8ic3VwcG9ydHNTeW5jIjoic3VwcG9ydHMiXShlLHQsaSxuKSlyZXR1cm4gbH1yZXR1cm4gbnVsbH0sZS5wcm90b3R5cGUuYWRkRmlsZU1hbmFnZXI9ZnVuY3Rpb24oZSl7dGhpcy5maWxlTWFuYWdlcnMucHVzaChlKX0sZS5wcm90b3R5cGUuY2xlYXJGaWxlTWFuYWdlcnM9ZnVuY3Rpb24oKXt0aGlzLmZpbGVNYW5hZ2Vycz1bXX0sZX0oKSxvPXthbGljZWJsdWU6IiNmMGY4ZmYiLGFudGlxdWV3aGl0ZToiI2ZhZWJkNyIsYXF1YToiIzAwZmZmZiIsYXF1YW1hcmluZToiIzdmZmZkNCIsYXp1cmU6IiNmMGZmZmYiLGJlaWdlOiIjZjVmNWRjIixiaXNxdWU6IiNmZmU0YzQiLGJsYWNrOiIjMDAwMDAwIixibGFuY2hlZGFsbW9uZDoiI2ZmZWJjZCIsYmx1ZToiIzAwMDBmZiIsYmx1ZXZpb2xldDoiIzhhMmJlMiIsYnJvd246IiNhNTJhMmEiLGJ1cmx5d29vZDoiI2RlYjg4NyIsY2FkZXRibHVlOiIjNWY5ZWEwIixjaGFydHJldXNlOiIjN2ZmZjAwIixjaG9jb2xhdGU6IiNkMjY5MWUiLGNvcmFsOiIjZmY3ZjUwIixjb3JuZmxvd2VyYmx1ZToiIzY0OTVlZCIsY29ybnNpbGs6IiNmZmY4ZGMiLGNyaW1zb246IiNkYzE0M2MiLGN5YW46IiMwMGZmZmYiLGRhcmtibHVlOiIjMDAwMDhiIixkYXJrY3lhbjoiIzAwOGI4YiIsZGFya2dvbGRlbnJvZDoiI2I4ODYwYiIsZGFya2dyYXk6IiNhOWE5YTkiLGRhcmtncmV5OiIjYTlhOWE5IixkYXJrZ3JlZW46IiMwMDY0MDAiLGRhcmtraGFraToiI2JkYjc2YiIsZGFya21hZ2VudGE6IiM4YjAwOGIiLGRhcmtvbGl2ZWdyZWVuOiIjNTU2YjJmIixkYXJrb3JhbmdlOiIjZmY4YzAwIixkYXJrb3JjaGlkOiIjOTkzMmNjIixkYXJrcmVkOiIjOGIwMDAwIixkYXJrc2FsbW9uOiIjZTk5NjdhIixkYXJrc2VhZ3JlZW46IiM4ZmJjOGYiLGRhcmtzbGF0ZWJsdWU6IiM0ODNkOGIiLGRhcmtzbGF0ZWdyYXk6IiMyZjRmNGYiLGRhcmtzbGF0ZWdyZXk6IiMyZjRmNGYiLGRhcmt0dXJxdW9pc2U6IiMwMGNlZDEiLGRhcmt2aW9sZXQ6IiM5NDAwZDMiLGRlZXBwaW5rOiIjZmYxNDkzIixkZWVwc2t5Ymx1ZToiIzAwYmZmZiIsZGltZ3JheToiIzY5Njk2OSIsZGltZ3JleToiIzY5Njk2OSIsZG9kZ2VyYmx1ZToiIzFlOTBmZiIsZmlyZWJyaWNrOiIjYjIyMjIyIixmbG9yYWx3aGl0ZToiI2ZmZmFmMCIsZm9yZXN0Z3JlZW46IiMyMjhiMjIiLGZ1Y2hzaWE6IiNmZjAwZmYiLGdhaW5zYm9ybzoiI2RjZGNkYyIsZ2hvc3R3aGl0ZToiI2Y4ZjhmZiIsZ29sZDoiI2ZmZDcwMCIsZ29sZGVucm9kOiIjZGFhNTIwIixncmF5OiIjODA4MDgwIixncmV5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsZ3JlZW55ZWxsb3c6IiNhZGZmMmYiLGhvbmV5ZGV3OiIjZjBmZmYwIixob3RwaW5rOiIjZmY2OWI0IixpbmRpYW5yZWQ6IiNjZDVjNWMiLGluZGlnbzoiIzRiMDA4MiIsaXZvcnk6IiNmZmZmZjAiLGtoYWtpOiIjZjBlNjhjIixsYXZlbmRlcjoiI2U2ZTZmYSIsbGF2ZW5kZXJibHVzaDoiI2ZmZjBmNSIsbGF3bmdyZWVuOiIjN2NmYzAwIixsZW1vbmNoaWZmb246IiNmZmZhY2QiLGxpZ2h0Ymx1ZToiI2FkZDhlNiIsbGlnaHRjb3JhbDoiI2YwODA4MCIsbGlnaHRjeWFuOiIjZTBmZmZmIixsaWdodGdvbGRlbnJvZHllbGxvdzoiI2ZhZmFkMiIsbGlnaHRncmF5OiIjZDNkM2QzIixsaWdodGdyZXk6IiNkM2QzZDMiLGxpZ2h0Z3JlZW46IiM5MGVlOTAiLGxpZ2h0cGluazoiI2ZmYjZjMSIsbGlnaHRzYWxtb246IiNmZmEwN2EiLGxpZ2h0c2VhZ3JlZW46IiMyMGIyYWEiLGxpZ2h0c2t5Ymx1ZToiIzg3Y2VmYSIsbGlnaHRzbGF0ZWdyYXk6IiM3Nzg4OTkiLGxpZ2h0c2xhdGVncmV5OiIjNzc4ODk5IixsaWdodHN0ZWVsYmx1ZToiI2IwYzRkZSIsbGlnaHR5ZWxsb3c6IiNmZmZmZTAiLGxpbWU6IiMwMGZmMDAiLGxpbWVncmVlbjoiIzMyY2QzMiIsbGluZW46IiNmYWYwZTYiLG1hZ2VudGE6IiNmZjAwZmYiLG1hcm9vbjoiIzgwMDAwMCIsbWVkaXVtYXF1YW1hcmluZToiIzY2Y2RhYSIsbWVkaXVtYmx1ZToiIzAwMDBjZCIsbWVkaXVtb3JjaGlkOiIjYmE1NWQzIixtZWRpdW1wdXJwbGU6IiM5MzcwZDgiLG1lZGl1bXNlYWdyZWVuOiIjM2NiMzcxIixtZWRpdW1zbGF0ZWJsdWU6IiM3YjY4ZWUiLG1lZGl1bXNwcmluZ2dyZWVuOiIjMDBmYTlhIixtZWRpdW10dXJxdW9pc2U6IiM0OGQxY2MiLG1lZGl1bXZpb2xldHJlZDoiI2M3MTU4NSIsbWlkbmlnaHRibHVlOiIjMTkxOTcwIixtaW50Y3JlYW06IiNmNWZmZmEiLG1pc3R5cm9zZToiI2ZmZTRlMSIsbW9jY2FzaW46IiNmZmU0YjUiLG5hdmFqb3doaXRlOiIjZmZkZWFkIixuYXZ5OiIjMDAwMDgwIixvbGRsYWNlOiIjZmRmNWU2IixvbGl2ZToiIzgwODAwMCIsb2xpdmVkcmFiOiIjNmI4ZTIzIixvcmFuZ2U6IiNmZmE1MDAiLG9yYW5nZXJlZDoiI2ZmNDUwMCIsb3JjaGlkOiIjZGE3MGQ2IixwYWxlZ29sZGVucm9kOiIjZWVlOGFhIixwYWxlZ3JlZW46IiM5OGZiOTgiLHBhbGV0dXJxdW9pc2U6IiNhZmVlZWUiLHBhbGV2aW9sZXRyZWQ6IiNkODcwOTMiLHBhcGF5YXdoaXA6IiNmZmVmZDUiLHBlYWNocHVmZjoiI2ZmZGFiOSIscGVydToiI2NkODUzZiIscGluazoiI2ZmYzBjYiIscGx1bToiI2RkYTBkZCIscG93ZGVyYmx1ZToiI2IwZTBlNiIscHVycGxlOiIjODAwMDgwIixyZWJlY2NhcHVycGxlOiIjNjYzMzk5IixyZWQ6IiNmZjAwMDAiLHJvc3licm93bjoiI2JjOGY4ZiIscm95YWxibHVlOiIjNDE2OWUxIixzYWRkbGVicm93bjoiIzhiNDUxMyIsc2FsbW9uOiIjZmE4MDcyIixzYW5keWJyb3duOiIjZjRhNDYwIixzZWFncmVlbjoiIzJlOGI1NyIsc2Vhc2hlbGw6IiNmZmY1ZWUiLHNpZW5uYToiI2EwNTIyZCIsc2lsdmVyOiIjYzBjMGMwIixza3libHVlOiIjODdjZWViIixzbGF0ZWJsdWU6IiM2YTVhY2QiLHNsYXRlZ3JheToiIzcwODA5MCIsc2xhdGVncmV5OiIjNzA4MDkwIixzbm93OiIjZmZmYWZhIixzcHJpbmdncmVlbjoiIzAwZmY3ZiIsc3RlZWxibHVlOiIjNDY4MmI0Iix0YW46IiNkMmI0OGMiLHRlYWw6IiMwMDgwODAiLHRoaXN0bGU6IiNkOGJmZDgiLHRvbWF0bzoiI2ZmNjM0NyIsdHVycXVvaXNlOiIjNDBlMGQwIix2aW9sZXQ6IiNlZTgyZWUiLHdoZWF0OiIjZjVkZWIzIix3aGl0ZToiI2ZmZmZmZiIsd2hpdGVzbW9rZToiI2Y1ZjVmNSIseWVsbG93OiIjZmZmZjAwIix5ZWxsb3dncmVlbjoiIzlhY2QzMiJ9LGE9e2xlbmd0aDp7bToxLGNtOi4wMSxtbTouMDAxLGluOi4wMjU0LHB4Oi4wMjU0Lzk2LHB0Oi4wMjU0LzcyLHBjOi4wMjU0LzcyKjEyfSxkdXJhdGlvbjp7czoxLG1zOi4wMDF9LGFuZ2xlOntyYWQ6MS8oMipNYXRoLlBJKSxkZWc6MS8zNjAsZ3JhZDoxLzQwMCx0dXJuOjF9fSxsPXtjb2xvcnM6byx1bml0Q29udmVyc2lvbnM6YX0sdT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aGlzLnBhcmVudD1udWxsLHRoaXMudmlzaWJpbGl0eUJsb2Nrcz12b2lkIDAsdGhpcy5ub2RlVmlzaWJsZT12b2lkIDAsdGhpcy5yb290Tm9kZT1udWxsLHRoaXMucGFyc2VkPW51bGx9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY3VycmVudEZpbGVJbmZvIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsZUluZm8oKX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsImluZGV4Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0SW5kZXgoKX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5zZXRQYXJlbnQ9ZnVuY3Rpb24odCxpKXtmdW5jdGlvbiBuKHQpe3QmJnQgaW5zdGFuY2VvZiBlJiYodC5wYXJlbnQ9aSl9QXJyYXkuaXNBcnJheSh0KT90LmZvckVhY2gobik6bih0KX0sZS5wcm90b3R5cGUuZ2V0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5kZXh8fHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nZXRJbmRleCgpfHwwfSxlLnByb3RvdHlwZS5maWxlSW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9maWxlSW5mb3x8dGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZpbGVJbmZvKCl8fHt9fSxlLnByb3RvdHlwZS5pc1J1bGVzZXRMaWtlPWZ1bmN0aW9uKCl7cmV0dXJuITF9LGUucHJvdG90eXBlLnRvQ1NTPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiB0aGlzLmdlbkNTUyhlLHthZGQ6ZnVuY3Rpb24oZSxpLG4pe3QucHVzaChlKX0saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiAwPT09dC5sZW5ndGh9fSksdC5qb2luKCIiKX0sZS5wcm90b3R5cGUuZ2VuQ1NTPWZ1bmN0aW9uKGUsdCl7dC5hZGQodGhpcy52YWx1ZSl9LGUucHJvdG90eXBlLmFjY2VwdD1mdW5jdGlvbihlKXt0aGlzLnZhbHVlPWUudmlzaXQodGhpcy52YWx1ZSl9LGUucHJvdG90eXBlLmV2YWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZS5wcm90b3R5cGUuX29wZXJhdGU9ZnVuY3Rpb24oZSx0LGksbil7c3dpdGNoKHQpe2Nhc2UiKyI6cmV0dXJuIGkrbjtjYXNlIi0iOnJldHVybiBpLW47Y2FzZSIqIjpyZXR1cm4gaSpuO2Nhc2UiLyI6cmV0dXJuIGkvbn19LGUucHJvdG90eXBlLmZyb3VuZD1mdW5jdGlvbihlLHQpe3ZhciBpPWUmJmUubnVtUHJlY2lzaW9uO3JldHVybiBpP051bWJlcigodCsyZS0xNikudG9GaXhlZChpKSk6dH0sZS5jb21wYXJlPWZ1bmN0aW9uKHQsaSl7aWYodC5jb21wYXJlJiYiUXVvdGVkIiE9PWkudHlwZSYmIkFub255bW91cyIhPT1pLnR5cGUpcmV0dXJuIHQuY29tcGFyZShpKTtpZihpLmNvbXBhcmUpcmV0dXJuLWkuY29tcGFyZSh0KTtpZih0LnR5cGU9PT1pLnR5cGUpe2lmKHQ9dC52YWx1ZSxpPWkudmFsdWUsIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQ9PT1pPzA6dm9pZCAwO2lmKHQubGVuZ3RoPT09aS5sZW5ndGgpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWlmKDAhPT1lLmNvbXBhcmUodFtuXSxpW25dKSlyZXR1cm47cmV0dXJuIDB9fX0sZS5udW1lcmljQ29tcGFyZT1mdW5jdGlvbihlLHQpe3JldHVybiBlPHQ/LTE6ZT09PXQ/MDplPnQ/MTp2b2lkIDB9LGUucHJvdG90eXBlLmJsb2Nrc1Zpc2liaWxpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy52aXNpYmlsaXR5QmxvY2tzJiYodGhpcy52aXNpYmlsaXR5QmxvY2tzPTApLDAhPT10aGlzLnZpc2liaWxpdHlCbG9ja3N9LGUucHJvdG90eXBlLmFkZFZpc2liaWxpdHlCbG9jaz1mdW5jdGlvbigpe251bGw9PXRoaXMudmlzaWJpbGl0eUJsb2NrcyYmKHRoaXMudmlzaWJpbGl0eUJsb2Nrcz0wKSx0aGlzLnZpc2liaWxpdHlCbG9ja3M9dGhpcy52aXNpYmlsaXR5QmxvY2tzKzF9LGUucHJvdG90eXBlLnJlbW92ZVZpc2liaWxpdHlCbG9jaz1mdW5jdGlvbigpe251bGw9PXRoaXMudmlzaWJpbGl0eUJsb2NrcyYmKHRoaXMudmlzaWJpbGl0eUJsb2Nrcz0wKSx0aGlzLnZpc2liaWxpdHlCbG9ja3M9dGhpcy52aXNpYmlsaXR5QmxvY2tzLTF9LGUucHJvdG90eXBlLmVuc3VyZVZpc2liaWxpdHk9ZnVuY3Rpb24oKXt0aGlzLm5vZGVWaXNpYmxlPSEwfSxlLnByb3RvdHlwZS5lbnN1cmVJbnZpc2liaWxpdHk9ZnVuY3Rpb24oKXt0aGlzLm5vZGVWaXNpYmxlPSExfSxlLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlVmlzaWJsZX0sZS5wcm90b3R5cGUudmlzaWJpbGl0eUluZm89ZnVuY3Rpb24oKXtyZXR1cm57dmlzaWJpbGl0eUJsb2Nrczp0aGlzLnZpc2liaWxpdHlCbG9ja3Msbm9kZVZpc2libGU6dGhpcy5ub2RlVmlzaWJsZX19LGUucHJvdG90eXBlLmNvcHlWaXNpYmlsaXR5SW5mbz1mdW5jdGlvbihlKXtlJiYodGhpcy52aXNpYmlsaXR5QmxvY2tzPWUudmlzaWJpbGl0eUJsb2Nrcyx0aGlzLm5vZGVWaXNpYmxlPWUubm9kZVZpc2libGUpfSxlfSgpLGM9ZnVuY3Rpb24oZSx0LGkpe3ZhciBuPXRoaXM7QXJyYXkuaXNBcnJheShlKT90aGlzLnJnYj1lOmUubGVuZ3RoPj02Pyh0aGlzLnJnYj1bXSxlLm1hdGNoKC8uezJ9L2cpLm1hcCgoZnVuY3Rpb24oZSx0KXt0PDM/bi5yZ2IucHVzaChwYXJzZUludChlLDE2KSk6bi5hbHBoYT1wYXJzZUludChlLDE2KS8yNTV9KSkpOih0aGlzLnJnYj1bXSxlLnNwbGl0KCIiKS5tYXAoKGZ1bmN0aW9uKGUsdCl7dDwzP24ucmdiLnB1c2gocGFyc2VJbnQoZStlLDE2KSk6bi5hbHBoYT1wYXJzZUludChlK2UsMTYpLzI1NX0pKSksdGhpcy5hbHBoYT10aGlzLmFscGhhfHwoIm51bWJlciI9PXR5cGVvZiB0P3Q6MSksdm9pZCAwIT09aSYmKHRoaXMudmFsdWU9aSl9O2Z1bmN0aW9uIGgoZSx0KXtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoZSwwKSx0KX1mdW5jdGlvbiBmKGUpe3JldHVybiIjIitlLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuKChlPWgoTWF0aC5yb3VuZChlKSwyNTUpKTwxNj8iMCI6IiIpK2UudG9TdHJpbmcoMTYpfSkpLmpvaW4oIiIpfWMucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IkNvbG9yIixsdW1hOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZ2JbMF0vMjU1LHQ9dGhpcy5yZ2JbMV0vMjU1LGk9dGhpcy5yZ2JbMl0vMjU1O3JldHVybi4yMTI2KihlPWU8PS4wMzkyOD9lLzEyLjkyOk1hdGgucG93KChlKy4wNTUpLzEuMDU1LDIuNCkpKy43MTUyKih0PXQ8PS4wMzkyOD90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCkpKy4wNzIyKihpPWk8PS4wMzkyOD9pLzEyLjkyOk1hdGgucG93KChpKy4wNTUpLzEuMDU1LDIuNCkpfSxnZW5DU1M6ZnVuY3Rpb24oZSx0KXt0LmFkZCh0aGlzLnRvQ1NTKGUpKX0sdG9DU1M6ZnVuY3Rpb24oZSx0KXt2YXIgaSxuLHIscz1lJiZlLmNvbXByZXNzJiYhdCxvPVtdO2lmKG49dGhpcy5mcm91bmQoZSx0aGlzLmFscGhhKSx0aGlzLnZhbHVlKWlmKDA9PT10aGlzLnZhbHVlLmluZGV4T2YoInJnYiIpKW48MSYmKHI9InJnYmEiKTtlbHNle2lmKDAhPT10aGlzLnZhbHVlLmluZGV4T2YoImhzbCIpKXJldHVybiB0aGlzLnZhbHVlO3I9bjwxPyJoc2xhIjoiaHNsIn1lbHNlIG48MSYmKHI9InJnYmEiKTtzd2l0Y2gocil7Y2FzZSJyZ2JhIjpvPXRoaXMucmdiLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGgoTWF0aC5yb3VuZChlKSwyNTUpfSkpLmNvbmNhdChoKG4sMSkpO2JyZWFrO2Nhc2UiaHNsYSI6by5wdXNoKGgobiwxKSk7Y2FzZSJoc2wiOmk9dGhpcy50b0hTTCgpLG89W3RoaXMuZnJvdW5kKGUsaS5oKSx0aGlzLmZyb3VuZChlLDEwMCppLnMpKyIlIix0aGlzLmZyb3VuZChlLDEwMCppLmwpKyIlIl0uY29uY2F0KG8pfWlmKHIpcmV0dXJuIHIrIigiK28uam9pbigiLCIrKHM/IiI6IiAiKSkrIikiO2lmKGk9dGhpcy50b1JHQigpLHMpe3ZhciBhPWkuc3BsaXQoIiIpO2FbMV09PT1hWzJdJiZhWzNdPT09YVs0XSYmYVs1XT09PWFbNl0mJihpPSIjIithWzFdK2FbM10rYVs1XSl9cmV0dXJuIGl9LG9wZXJhdGU6ZnVuY3Rpb24oZSx0LGkpe2Zvcih2YXIgbj1uZXcgQXJyYXkoMykscj10aGlzLmFscGhhKigxLWkuYWxwaGEpK2kuYWxwaGEscz0wO3M8MztzKyspbltzXT10aGlzLl9vcGVyYXRlKGUsdCx0aGlzLnJnYltzXSxpLnJnYltzXSk7cmV0dXJuIG5ldyBjKG4scil9LHRvUkdCOmZ1bmN0aW9uKCl7cmV0dXJuIGYodGhpcy5yZ2IpfSx0b0hTTDpmdW5jdGlvbigpe3ZhciBlLHQsaT10aGlzLnJnYlswXS8yNTUsbj10aGlzLnJnYlsxXS8yNTUscj10aGlzLnJnYlsyXS8yNTUscz10aGlzLmFscGhhLG89TWF0aC5tYXgoaSxuLHIpLGE9TWF0aC5taW4oaSxuLHIpLGw9KG8rYSkvMix1PW8tYTtpZihvPT09YSllPXQ9MDtlbHNle3N3aXRjaCh0PWw+LjU/dS8oMi1vLWEpOnUvKG8rYSksbyl7Y2FzZSBpOmU9KG4tcikvdSsobjxyPzY6MCk7YnJlYWs7Y2FzZSBuOmU9KHItaSkvdSsyO2JyZWFrO2Nhc2UgcjplPShpLW4pL3UrNH1lLz02fXJldHVybntoOjM2MCplLHM6dCxsOmwsYTpzfX0sdG9IU1Y6ZnVuY3Rpb24oKXt2YXIgZSx0LGk9dGhpcy5yZ2JbMF0vMjU1LG49dGhpcy5yZ2JbMV0vMjU1LHI9dGhpcy5yZ2JbMl0vMjU1LHM9dGhpcy5hbHBoYSxvPU1hdGgubWF4KGksbixyKSxhPU1hdGgubWluKGksbixyKSxsPW8sdT1vLWE7aWYodD0wPT09bz8wOnUvbyxvPT09YSllPTA7ZWxzZXtzd2l0Y2gobyl7Y2FzZSBpOmU9KG4tcikvdSsobjxyPzY6MCk7YnJlYWs7Y2FzZSBuOmU9KHItaSkvdSsyO2JyZWFrO2Nhc2UgcjplPShpLW4pL3UrNH1lLz02fXJldHVybntoOjM2MCplLHM6dCx2OmwsYTpzfX0sdG9BUkdCOmZ1bmN0aW9uKCl7cmV0dXJuIGYoWzI1NSp0aGlzLmFscGhhXS5jb25jYXQodGhpcy5yZ2IpKX0sY29tcGFyZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZ2ImJmUucmdiWzBdPT09dGhpcy5yZ2JbMF0mJmUucmdiWzFdPT09dGhpcy5yZ2JbMV0mJmUucmdiWzJdPT09dGhpcy5yZ2JbMl0mJmUuYWxwaGE9PT10aGlzLmFscGhhPzA6dm9pZCAwfX0pLGMuZnJvbUtleXdvcmQ9ZnVuY3Rpb24oZSl7dmFyIHQsaT1lLnRvTG93ZXJDYXNlKCk7aWYoby5oYXNPd25Qcm9wZXJ0eShpKT90PW5ldyBjKG9baV0uc2xpY2UoMSkpOiJ0cmFuc3BhcmVudCI9PT1pJiYodD1uZXcgYyhbMCwwLDBdLDApKSx0KXJldHVybiB0LnZhbHVlPWUsdH07dmFyIHA9ZnVuY3Rpb24oZSl7dGhpcy52YWx1ZT1lfTtwLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJQYXJlbiIsZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dC5hZGQoIigiKSx0aGlzLnZhbHVlLmdlbkNTUyhlLHQpLHQuYWRkKCIpIil9LGV2YWw6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBwKHRoaXMudmFsdWUuZXZhbChlKSl9fSk7dmFyIHY9eyIiOiEwLCIgIjohMCwifCI6ITB9LGQ9ZnVuY3Rpb24oZSl7IiAiPT09ZT8odGhpcy52YWx1ZT0iICIsdGhpcy5lbXB0eU9yV2hpdGVzcGFjZT0hMCk6KHRoaXMudmFsdWU9ZT9lLnRyaW0oKToiIix0aGlzLmVtcHR5T3JXaGl0ZXNwYWNlPSIiPT09dGhpcy52YWx1ZSl9O2QucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IkNvbWJpbmF0b3IiLGdlbkNTUzpmdW5jdGlvbihlLHQpe3ZhciBpPWUuY29tcHJlc3N8fHZbdGhpcy52YWx1ZV0/IiI6IiAiO3QuYWRkKGkrdGhpcy52YWx1ZStpKX19KTt2YXIgbT1mdW5jdGlvbihlLHQsaSxuLHIscyl7dGhpcy5jb21iaW5hdG9yPWUgaW5zdGFuY2VvZiBkP2U6bmV3IGQoZSksdGhpcy52YWx1ZT0ic3RyaW5nIj09dHlwZW9mIHQ/dC50cmltKCk6dHx8IiIsdGhpcy5pc1ZhcmlhYmxlPWksdGhpcy5faW5kZXg9bix0aGlzLl9maWxlSW5mbz1yLHRoaXMuY29weVZpc2liaWxpdHlJbmZvKHMpLHRoaXMuc2V0UGFyZW50KHRoaXMuY29tYmluYXRvcix0aGlzKX07bS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiRWxlbWVudCIsYWNjZXB0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMudmFsdWU7dGhpcy5jb21iaW5hdG9yPWUudmlzaXQodGhpcy5jb21iaW5hdG9yKSwib2JqZWN0Ij09dHlwZW9mIHQmJih0aGlzLnZhbHVlPWUudmlzaXQodCkpfSxldmFsOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgbSh0aGlzLmNvbWJpbmF0b3IsdGhpcy52YWx1ZS5ldmFsP3RoaXMudmFsdWUuZXZhbChlKTp0aGlzLnZhbHVlLHRoaXMuaXNWYXJpYWJsZSx0aGlzLmdldEluZGV4KCksdGhpcy5maWxlSW5mbygpLHRoaXMudmlzaWJpbGl0eUluZm8oKSl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBtKHRoaXMuY29tYmluYXRvcix0aGlzLnZhbHVlLHRoaXMuaXNWYXJpYWJsZSx0aGlzLmdldEluZGV4KCksdGhpcy5maWxlSW5mbygpLHRoaXMudmlzaWJpbGl0eUluZm8oKSl9LGdlbkNTUzpmdW5jdGlvbihlLHQpe3QuYWRkKHRoaXMudG9DU1MoZSksdGhpcy5maWxlSW5mbygpLHRoaXMuZ2V0SW5kZXgoKSl9LHRvQ1NTOmZ1bmN0aW9uKGUpe2U9ZXx8e307dmFyIHQ9dGhpcy52YWx1ZSxpPWUuZmlyc3RTZWxlY3RvcjtyZXR1cm4gdCBpbnN0YW5jZW9mIHAmJihlLmZpcnN0U2VsZWN0b3I9ITApLHQ9dC50b0NTUz90LnRvQ1NTKGUpOnQsZS5maXJzdFNlbGVjdG9yPWksIiI9PT10JiYiJiI9PT10aGlzLmNvbWJpbmF0b3IudmFsdWUuY2hhckF0KDApPyIiOnRoaXMuY29tYmluYXRvci50b0NTUyhlKSt0fX0pO3ZhciBnPXtBTFdBWVM6MCxQQVJFTlNfRElWSVNJT046MSxQQVJFTlM6Mn0seT0wLGI9MSx3PTI7ZnVuY3Rpb24geChlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsLTEpfWZ1bmN0aW9uIFMoZSl7cmV0dXJuIkFycmF5Ij09PXgoZSl9ZnVuY3Rpb24gSShlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD17fSksUyhlKT9lLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIEkoZSx0KX0pKToiT2JqZWN0IiE9PXgoaT1lKXx8aS5jb25zdHJ1Y3RvciE9PU9iamVjdHx8T2JqZWN0LmdldFByb3RvdHlwZU9mKGkpIT09T2JqZWN0LnByb3RvdHlwZT9lOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPTAsdD0wLGk9YXJndW1lbnRzLmxlbmd0aDt0PGk7dCsrKWUrPWFyZ3VtZW50c1t0XS5sZW5ndGg7dmFyIG49QXJyYXkoZSkscj0wO2Zvcih0PTA7dDxpO3QrKylmb3IodmFyIHM9YXJndW1lbnRzW3RdLG89MCxhPXMubGVuZ3RoO288YTtvKysscisrKW5bcl09c1tvXTtyZXR1cm4gbn0oT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSksT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKSkucmVkdWNlKChmdW5jdGlvbihpLG4pe3JldHVybiBTKHQucHJvcHMpJiYhdC5wcm9wcy5pbmNsdWRlcyhuKXx8ZnVuY3Rpb24oZSx0LGksbixyKXt2YXIgcz17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG4sdCk/ImVudW1lcmFibGUiOiJub25lbnVtZXJhYmxlIjsiZW51bWVyYWJsZSI9PT1zJiYoZVt0XT1pKSxyJiYibm9uZW51bWVyYWJsZSI9PT1zJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTppLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9KGksbixJKGVbbl0sdCksZSx0Lm5vbmVudW1lcmFibGUpLGl9KSx7fSk7dmFyIGl9ZnVuY3Rpb24gQyhlLHQpe2Zvcih2YXIgaT1lKzEsbj1udWxsLHI9LTE7LS1pPj0wJiYiXG4iIT09dC5jaGFyQXQoaSk7KXIrKztyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGUmJihuPSh0LnNsaWNlKDAsZSkubWF0Y2goL1xuL2cpfHwiIikubGVuZ3RoKSx7bGluZTpuLGNvbHVtbjpyfX1mdW5jdGlvbiBrKGUpe3ZhciB0LGk9ZS5sZW5ndGgsbj1uZXcgQXJyYXkoaSk7Zm9yKHQ9MDt0PGk7dCsrKW5bdF09ZVt0XTtyZXR1cm4gbn1mdW5jdGlvbiBfKGUpe3ZhciB0PXt9O2Zvcih2YXIgaSBpbiBlKWUuaGFzT3duUHJvcGVydHkoaSkmJih0W2ldPWVbaV0pO3JldHVybiB0fWZ1bmN0aW9uIEEoZSx0KXt2YXIgaT10fHx7fTtpZighdC5fZGVmYXVsdHMpe2k9e307dmFyIG49SShlKTtpLl9kZWZhdWx0cz1uO3ZhciByPXQ/SSh0KTp7fTtPYmplY3QuYXNzaWduKGksbixyKX1yZXR1cm4gaX1mdW5jdGlvbiBNKGUsdCl7aWYodCYmdC5fZGVmYXVsdHMpcmV0dXJuIHQ7dmFyIGk9QShlLHQpO2lmKGkuc3RyaWN0TWF0aCYmKGkubWF0aD1nLlBBUkVOUyksaS5yZWxhdGl2ZVVybHMmJihpLnJld3JpdGVVcmxzPXcpLCJzdHJpbmciPT10eXBlb2YgaS5tYXRoKXN3aXRjaChpLm1hdGgudG9Mb3dlckNhc2UoKSl7Y2FzZSJhbHdheXMiOmkubWF0aD1nLkFMV0FZUzticmVhaztjYXNlInBhcmVucy1kaXZpc2lvbiI6aS5tYXRoPWcuUEFSRU5TX0RJVklTSU9OO2JyZWFrO2Nhc2Uic3RyaWN0IjpjYXNlInBhcmVucyI6aS5tYXRoPWcuUEFSRU5TO2JyZWFrO2RlZmF1bHQ6aS5tYXRoPWcuUEFSRU5TfWlmKCJzdHJpbmciPT10eXBlb2YgaS5yZXdyaXRlVXJscylzd2l0Y2goaS5yZXdyaXRlVXJscy50b0xvd2VyQ2FzZSgpKXtjYXNlIm9mZiI6aS5yZXdyaXRlVXJscz15O2JyZWFrO2Nhc2UibG9jYWwiOmkucmV3cml0ZVVybHM9YjticmVhaztjYXNlImFsbCI6aS5yZXdyaXRlVXJscz13fXJldHVybiBpfWZ1bmN0aW9uIEUoZSx0KXt2b2lkIDA9PT10JiYodD1bXSk7Zm9yKHZhciBpPTAsbj1lLmxlbmd0aDtpPG47aSsrKXt2YXIgcj1lW2ldO0FycmF5LmlzQXJyYXkocik/RShyLHQpOnZvaWQgMCE9PXImJnQucHVzaChyKX1yZXR1cm4gdH12YXIgUD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXRMb2NhdGlvbjpDLGNvcHlBcnJheTprLGNsb25lOl8sZGVmYXVsdHM6QSxjb3B5T3B0aW9uczpNLG1lcmdlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBpIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShpKSYmKGVbaV09dFtpXSk7cmV0dXJuIGV9LGZsYXR0ZW5BcnJheTpFfSksUj0vKDxhbm9ueW1vdXM+fEZ1bmN0aW9uKTooXGQrKTooXGQrKS8sTz1mdW5jdGlvbihlLHQsaSl7RXJyb3IuY2FsbCh0aGlzKTt2YXIgbj1lLmZpbGVuYW1lfHxpO2lmKHRoaXMubWVzc2FnZT1lLm1lc3NhZ2UsdGhpcy5zdGFjaz1lLnN0YWNrLHQmJm4pe3ZhciByPXQuY29udGVudHNbbl0scz1DKGUuaW5kZXgsciksbz1zLmxpbmUsYT1zLmNvbHVtbixsPWUuY2FsbCYmQyhlLmNhbGwscikubGluZSx1PXI/ci5zcGxpdCgiXG4iKToiIjtpZih0aGlzLnR5cGU9ZS50eXBlfHwiU3ludGF4Iix0aGlzLmZpbGVuYW1lPW4sdGhpcy5pbmRleD1lLmluZGV4LHRoaXMubGluZT0ibnVtYmVyIj09dHlwZW9mIG8/bysxOm51bGwsdGhpcy5jb2x1bW49YSwhdGhpcy5saW5lJiZ0aGlzLnN0YWNrKXt2YXIgYz10aGlzLnN0YWNrLm1hdGNoKFIpLGg9bmV3IEZ1bmN0aW9uKCJhIiwidGhyb3cgbmV3IEVycm9yKCkiKSxmPTA7dHJ5e2goKX1jYXRjaChlKXt2YXIgcD1lLnN0YWNrLm1hdGNoKFIpO2Y9MS0obz1wYXJzZUludChwWzJdKSl9YyYmKGNbMl0mJih0aGlzLmxpbmU9cGFyc2VJbnQoY1syXSkrZiksY1szXSYmKHRoaXMuY29sdW1uPXBhcnNlSW50KGNbM10pKSl9dGhpcy5jYWxsTGluZT1sKzEsdGhpcy5jYWxsRXh0cmFjdD11W2xdLHRoaXMuZXh0cmFjdD1bdVt0aGlzLmxpbmUtMl0sdVt0aGlzLmxpbmUtMV0sdVt0aGlzLmxpbmVdXX19O2lmKHZvaWQgMD09PU9iamVjdC5jcmVhdGUpe3ZhciBWPWZ1bmN0aW9uKCl7fTtWLnByb3RvdHlwZT1FcnJvci5wcm90b3R5cGUsTy5wcm90b3R5cGU9bmV3IFZ9ZWxzZSBPLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7Ty5wcm90b3R5cGUuY29uc3RydWN0b3I9TyxPLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbihlKXtlPWV8fHt9O3ZhciB0PSIiLGk9dGhpcy5leHRyYWN0fHxbXSxuPVtdLHI9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9O2lmKGUuc3R5bGl6ZSl7dmFyIHM9dHlwZW9mIGUuc3R5bGl6ZTtpZigiZnVuY3Rpb24iIT09cyl0aHJvdyBFcnJvcigib3B0aW9ucy5zdHlsaXplIHNob3VsZCBiZSBhIGZ1bmN0aW9uLCBnb3QgYSAiK3MrIiEiKTtyPWUuc3R5bGl6ZX1pZihudWxsIT09dGhpcy5saW5lKXtpZigic3RyaW5nIj09dHlwZW9mIGlbMF0mJm4ucHVzaChyKHRoaXMubGluZS0xKyIgIitpWzBdLCJncmV5IikpLCJzdHJpbmciPT10eXBlb2YgaVsxXSl7dmFyIG89dGhpcy5saW5lKyIgIjtpWzFdJiYobys9aVsxXS5zbGljZSgwLHRoaXMuY29sdW1uKStyKHIocihpWzFdLnN1YnN0cih0aGlzLmNvbHVtbiwxKSwiYm9sZCIpK2lbMV0uc2xpY2UodGhpcy5jb2x1bW4rMSksInJlZCIpLCJpbnZlcnNlIikpLG4ucHVzaChvKX0ic3RyaW5nIj09dHlwZW9mIGlbMl0mJm4ucHVzaChyKHRoaXMubGluZSsxKyIgIitpWzJdLCJncmV5IikpLG49bi5qb2luKCJcbiIpK3IoIiIsInJlc2V0IikrIlxuIn1yZXR1cm4gdCs9cih0aGlzLnR5cGUrIkVycm9yOiAiK3RoaXMubWVzc2FnZSwicmVkIiksdGhpcy5maWxlbmFtZSYmKHQrPXIoIiBpbiAiLCJyZWQiKSt0aGlzLmZpbGVuYW1lKSx0aGlzLmxpbmUmJih0Kz1yKCIgb24gbGluZSAiK3RoaXMubGluZSsiLCBjb2x1bW4gIisodGhpcy5jb2x1bW4rMSkrIjoiLCJncmV5IikpLHQrPSJcbiIrbix0aGlzLmNhbGxMaW5lJiYodCs9cigiZnJvbSAiLCJyZWQiKSsodGhpcy5maWxlbmFtZXx8IiIpKyIvbiIsdCs9cih0aGlzLmNhbGxMaW5lLCJncmV5IikrIiAiK3RoaXMuY2FsbEV4dHJhY3QrIi9uIiksdH07dmFyIEY9ZnVuY3Rpb24oZSx0LGksbixyLHMpe3RoaXMuZXh0ZW5kTGlzdD10LHRoaXMuY29uZGl0aW9uPWksdGhpcy5ldmFsZENvbmRpdGlvbj0haSx0aGlzLl9pbmRleD1uLHRoaXMuX2ZpbGVJbmZvPXIsdGhpcy5lbGVtZW50cz10aGlzLmdldEVsZW1lbnRzKGUpLHRoaXMubWl4aW5FbGVtZW50c189dm9pZCAwLHRoaXMuY29weVZpc2liaWxpdHlJbmZvKHMpLHRoaXMuc2V0UGFyZW50KHRoaXMuZWxlbWVudHMsdGhpcyl9O0YucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IlNlbGVjdG9yIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50cyYmKHRoaXMuZWxlbWVudHM9ZS52aXNpdEFycmF5KHRoaXMuZWxlbWVudHMpKSx0aGlzLmV4dGVuZExpc3QmJih0aGlzLmV4dGVuZExpc3Q9ZS52aXNpdEFycmF5KHRoaXMuZXh0ZW5kTGlzdCkpLHRoaXMuY29uZGl0aW9uJiYodGhpcy5jb25kaXRpb249ZS52aXNpdCh0aGlzLmNvbmRpdGlvbikpfSxjcmVhdGVEZXJpdmVkOmZ1bmN0aW9uKGUsdCxpKXtlPXRoaXMuZ2V0RWxlbWVudHMoZSk7dmFyIG49bmV3IEYoZSx0fHx0aGlzLmV4dGVuZExpc3QsbnVsbCx0aGlzLmdldEluZGV4KCksdGhpcy5maWxlSW5mbygpLHRoaXMudmlzaWJpbGl0eUluZm8oKSk7cmV0dXJuIG4uZXZhbGRDb25kaXRpb249bnVsbCE9aT9pOnRoaXMuZXZhbGRDb25kaXRpb24sbi5tZWRpYUVtcHR5PXRoaXMubWVkaWFFbXB0eSxufSxnZXRFbGVtZW50czpmdW5jdGlvbihlKXtyZXR1cm4gZT8oInN0cmluZyI9PXR5cGVvZiBlJiZ0aGlzLnBhcnNlLnBhcnNlTm9kZShlLFsic2VsZWN0b3IiXSx0aGlzLl9pbmRleCx0aGlzLl9maWxlSW5mbywoZnVuY3Rpb24odCxpKXtpZih0KXRocm93IG5ldyBPKHtpbmRleDp0LmluZGV4LG1lc3NhZ2U6dC5tZXNzYWdlfSx0aGlzLnBhcnNlLmltcG9ydHMsdGhpcy5fZmlsZUluZm8uZmlsZW5hbWUpO2U9aVswXS5lbGVtZW50c30pKSxlKTpbbmV3IG0oIiIsIiYiLCExLHRoaXMuX2luZGV4LHRoaXMuX2ZpbGVJbmZvKV19LGNyZWF0ZUVtcHR5U2VsZWN0b3JzOmZ1bmN0aW9uKCl7dmFyIGU9bmV3IG0oIiIsIiYiLCExLHRoaXMuX2luZGV4LHRoaXMuX2ZpbGVJbmZvKSx0PVtuZXcgRihbZV0sbnVsbCxudWxsLHRoaXMuX2luZGV4LHRoaXMuX2ZpbGVJbmZvKV07cmV0dXJuIHRbMF0ubWVkaWFFbXB0eT0hMCx0fSxtYXRjaDpmdW5jdGlvbihlKXt2YXIgdCxpLG49dGhpcy5lbGVtZW50cyxyPW4ubGVuZ3RoO2lmKDA9PT0odD0oZT1lLm1peGluRWxlbWVudHMoKSkubGVuZ3RoKXx8cjx0KXJldHVybiAwO2ZvcihpPTA7aTx0O2krKylpZihuW2ldLnZhbHVlIT09ZVtpXSlyZXR1cm4gMDtyZXR1cm4gdH0sbWl4aW5FbGVtZW50czpmdW5jdGlvbigpe2lmKHRoaXMubWl4aW5FbGVtZW50c18pcmV0dXJuIHRoaXMubWl4aW5FbGVtZW50c187dmFyIGU9dGhpcy5lbGVtZW50cy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbWJpbmF0b3IudmFsdWUrKGUudmFsdWUudmFsdWV8fGUudmFsdWUpfSkpLmpvaW4oIiIpLm1hdGNoKC9bLCYjXCpcLlx3LV0oW1x3LV18KFxcLikpKi9nKTtyZXR1cm4gZT8iJiI9PT1lWzBdJiZlLnNoaWZ0KCk6ZT1bXSx0aGlzLm1peGluRWxlbWVudHNfPWV9LGlzSnVzdFBhcmVudFNlbGVjdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubWVkaWFFbXB0eSYmMT09PXRoaXMuZWxlbWVudHMubGVuZ3RoJiYiJiI9PT10aGlzLmVsZW1lbnRzWzBdLnZhbHVlJiYoIiAiPT09dGhpcy5lbGVtZW50c1swXS5jb21iaW5hdG9yLnZhbHVlfHwiIj09PXRoaXMuZWxlbWVudHNbMF0uY29tYmluYXRvci52YWx1ZSl9LGV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jb25kaXRpb24mJnRoaXMuY29uZGl0aW9uLmV2YWwoZSksaT10aGlzLmVsZW1lbnRzLG49dGhpcy5leHRlbmRMaXN0O3JldHVybiBpPWkmJmkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5ldmFsKGUpfSkpLG49biYmbi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmV2YWwoZSl9KSksdGhpcy5jcmVhdGVEZXJpdmVkKGksbix0KX0sZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dmFyIGk7Zm9yKGUmJmUuZmlyc3RTZWxlY3Rvcnx8IiIhPT10aGlzLmVsZW1lbnRzWzBdLmNvbWJpbmF0b3IudmFsdWV8fHQuYWRkKCIgIix0aGlzLmZpbGVJbmZvKCksdGhpcy5nZXRJbmRleCgpKSxpPTA7aTx0aGlzLmVsZW1lbnRzLmxlbmd0aDtpKyspdGhpcy5lbGVtZW50c1tpXS5nZW5DU1MoZSx0KX0sZ2V0SXNPdXRwdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ldmFsZENvbmRpdGlvbn19KTt2YXIgJD1mdW5jdGlvbihlKXtpZighZSl0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIHJlcXVpcmVzIGFuIGFycmF5IGFyZ3VtZW50Iik7QXJyYXkuaXNBcnJheShlKT90aGlzLnZhbHVlPWU6dGhpcy52YWx1ZT1bZV19OyQucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IlZhbHVlIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy52YWx1ZSYmKHRoaXMudmFsdWU9ZS52aXNpdEFycmF5KHRoaXMudmFsdWUpKX0sZXZhbDpmdW5jdGlvbihlKXtyZXR1cm4gMT09PXRoaXMudmFsdWUubGVuZ3RoP3RoaXMudmFsdWVbMF0uZXZhbChlKTpuZXcgJCh0aGlzLnZhbHVlLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZXZhbChlKX0pKSl9LGdlbkNTUzpmdW5jdGlvbihlLHQpe3ZhciBpO2ZvcihpPTA7aTx0aGlzLnZhbHVlLmxlbmd0aDtpKyspdGhpcy52YWx1ZVtpXS5nZW5DU1MoZSx0KSxpKzE8dGhpcy52YWx1ZS5sZW5ndGgmJnQuYWRkKGUmJmUuY29tcHJlc3M/IiwiOiIsICIpfX0pO3ZhciBMPWZ1bmN0aW9uKGUpe3RoaXMudmFsdWU9ZX07TC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiS2V5d29yZCIsZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7aWYoIiUiPT09dGhpcy52YWx1ZSl0aHJvd3t0eXBlOiJTeW50YXgiLG1lc3NhZ2U6IkludmFsaWQgJSB3aXRob3V0IG51bWJlciJ9O3QuYWRkKHRoaXMudmFsdWUpfX0pLEwuVHJ1ZT1uZXcgTCgidHJ1ZSIpLEwuRmFsc2U9bmV3IEwoImZhbHNlIik7dmFyIGo9ZnVuY3Rpb24oZSx0LGksbixyLHMpe3RoaXMudmFsdWU9ZSx0aGlzLl9pbmRleD10LHRoaXMuX2ZpbGVJbmZvPWksdGhpcy5tYXBMaW5lcz1uLHRoaXMucnVsZXNldExpa2U9dm9pZCAwIT09ciYmcix0aGlzLmFsbG93Um9vdD0hMCx0aGlzLmNvcHlWaXNpYmlsaXR5SW5mbyhzKX07ai5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiQW5vbnltb3VzIixldmFsOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBqKHRoaXMudmFsdWUsdGhpcy5faW5kZXgsdGhpcy5fZmlsZUluZm8sdGhpcy5tYXBMaW5lcyx0aGlzLnJ1bGVzZXRMaWtlLHRoaXMudmlzaWJpbGl0eUluZm8oKSl9LGNvbXBhcmU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9DU1MmJnRoaXMudG9DU1MoKT09PWUudG9DU1MoKT8wOnZvaWQgMH0saXNSdWxlc2V0TGlrZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJ1bGVzZXRMaWtlfSxnZW5DU1M6ZnVuY3Rpb24oZSx0KXt0aGlzLm5vZGVWaXNpYmxlPUJvb2xlYW4odGhpcy52YWx1ZSksdGhpcy5ub2RlVmlzaWJsZSYmdC5hZGQodGhpcy52YWx1ZSx0aGlzLl9maWxlSW5mbyx0aGlzLl9pbmRleCx0aGlzLm1hcExpbmVzKX19KTt2YXIgTj1nO3ZhciBEPWZ1bmN0aW9uKGUsdCxpLG4scixzLG8sYSl7dGhpcy5uYW1lPWUsdGhpcy52YWx1ZT10IGluc3RhbmNlb2YgdT90Om5ldyAkKFt0P25ldyBqKHQpOm51bGxdKSx0aGlzLmltcG9ydGFudD1pPyIgIitpLnRyaW0oKToiIix0aGlzLm1lcmdlPW4sdGhpcy5faW5kZXg9cix0aGlzLl9maWxlSW5mbz1zLHRoaXMuaW5saW5lPW98fCExLHRoaXMudmFyaWFibGU9dm9pZCAwIT09YT9hOmUuY2hhckF0JiYiQCI9PT1lLmNoYXJBdCgwKSx0aGlzLmFsbG93Um9vdD0hMCx0aGlzLnNldFBhcmVudCh0aGlzLnZhbHVlLHRoaXMpfTtELnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJEZWNsYXJhdGlvbiIsZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dC5hZGQodGhpcy5uYW1lKyhlLmNvbXByZXNzPyI6IjoiOiAiKSx0aGlzLmZpbGVJbmZvKCksdGhpcy5nZXRJbmRleCgpKTt0cnl7dGhpcy52YWx1ZS5nZW5DU1MoZSx0KX1jYXRjaChlKXt0aHJvdyBlLmluZGV4PXRoaXMuX2luZGV4LGUuZmlsZW5hbWU9dGhpcy5fZmlsZUluZm8uZmlsZW5hbWUsZX10LmFkZCh0aGlzLmltcG9ydGFudCsodGhpcy5pbmxpbmV8fGUubGFzdFJ1bGUmJmUuY29tcHJlc3M/IiI6IjsiKSx0aGlzLl9maWxlSW5mbyx0aGlzLl9pbmRleCl9LGV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuPSExLHI9dGhpcy5uYW1lLHM9dGhpcy52YXJpYWJsZTsic3RyaW5nIiE9dHlwZW9mIHImJihyPTE9PT1yLmxlbmd0aCYmclswXWluc3RhbmNlb2YgTD9yWzBdLnZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIGksbj0iIixyPXQubGVuZ3RoLHM9e2FkZDpmdW5jdGlvbihlKXtuKz1lfX07Zm9yKGk9MDtpPHI7aSsrKXRbaV0uZXZhbChlKS5nZW5DU1MoZSxzKTtyZXR1cm4gbn0oZSxyKSxzPSExKSwiZm9udCI9PT1yJiZlLm1hdGg9PT1OLkFMV0FZUyYmKG49ITAsdD1lLm1hdGgsZS5tYXRoPU4uUEFSRU5TX0RJVklTSU9OKTt0cnl7aWYoZS5pbXBvcnRhbnRTY29wZS5wdXNoKHt9KSxpPXRoaXMudmFsdWUuZXZhbChlKSwhdGhpcy52YXJpYWJsZSYmIkRldGFjaGVkUnVsZXNldCI9PT1pLnR5cGUpdGhyb3d7bWVzc2FnZToiUnVsZXNldHMgY2Fubm90IGJlIGV2YWx1YXRlZCBvbiBhIHByb3BlcnR5LiIsaW5kZXg6dGhpcy5nZXRJbmRleCgpLGZpbGVuYW1lOnRoaXMuZmlsZUluZm8oKS5maWxlbmFtZX07dmFyIG89dGhpcy5pbXBvcnRhbnQsYT1lLmltcG9ydGFudFNjb3BlLnBvcCgpO3JldHVybiFvJiZhLmltcG9ydGFudCYmKG89YS5pbXBvcnRhbnQpLG5ldyBEKHIsaSxvLHRoaXMubWVyZ2UsdGhpcy5nZXRJbmRleCgpLHRoaXMuZmlsZUluZm8oKSx0aGlzLmlubGluZSxzKX1jYXRjaChlKXt0aHJvdyJudW1iZXIiIT10eXBlb2YgZS5pbmRleCYmKGUuaW5kZXg9dGhpcy5nZXRJbmRleCgpLGUuZmlsZW5hbWU9dGhpcy5maWxlSW5mbygpLmZpbGVuYW1lKSxlfWZpbmFsbHl7biYmKGUubWF0aD10KX19LG1ha2VJbXBvcnRhbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEQodGhpcy5uYW1lLHRoaXMudmFsdWUsIiFpbXBvcnRhbnQiLHRoaXMubWVyZ2UsdGhpcy5nZXRJbmRleCgpLHRoaXMuZmlsZUluZm8oKSx0aGlzLmlubGluZSl9fSk7dmFyIEI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsaSxuKXt2YXIgcj0iIjtpZih0LmR1bXBMaW5lTnVtYmVycyYmIXQuY29tcHJlc3Mpc3dpdGNoKHQuZHVtcExpbmVOdW1iZXJzKXtjYXNlImNvbW1lbnRzIjpyPWUuYXNDb21tZW50KGkpO2JyZWFrO2Nhc2UibWVkaWFxdWVyeSI6cj1lLmFzTWVkaWFRdWVyeShpKTticmVhaztjYXNlImFsbCI6cj1lLmFzQ29tbWVudChpKSsobnx8IiIpK2UuYXNNZWRpYVF1ZXJ5KGkpfXJldHVybiByfXJldHVybiBlLmFzQ29tbWVudD1mdW5jdGlvbihlKXtyZXR1cm4iLyogbGluZSAiK2UuZGVidWdJbmZvLmxpbmVOdW1iZXIrIiwgIitlLmRlYnVnSW5mby5maWxlTmFtZSsiICovXG4ifSxlLmFzTWVkaWFRdWVyeT1mdW5jdGlvbihlKXt2YXIgdD1lLmRlYnVnSW5mby5maWxlTmFtZTtyZXR1cm4vXlthLXpdKzpcL1wvL2kudGVzdCh0KXx8KHQ9ImZpbGU6Ly8iK3QpLCJAbWVkaWEgLXNhc3MtZGVidWctaW5mb3tmaWxlbmFtZXtmb250LWZhbWlseToiK3QucmVwbGFjZSgvKFsuOlwvXFxdKS9nLChmdW5jdGlvbihlKXtyZXR1cm4iXFwiPT1lJiYoZT0iLyIpLCJcXCIrZX0pKSsifWxpbmV7Zm9udC1mYW1pbHk6XFwwMDAwMyIrZS5kZWJ1Z0luZm8ubGluZU51bWJlcisifX1cbiJ9LGV9KCksVT1mdW5jdGlvbihlLHQsaSxuKXt0aGlzLnZhbHVlPWUsdGhpcy5pc0xpbmVDb21tZW50PXQsdGhpcy5faW5kZXg9aSx0aGlzLl9maWxlSW5mbz1uLHRoaXMuYWxsb3dSb290PSEwfTtVLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJDb21tZW50IixnZW5DU1M6ZnVuY3Rpb24oZSx0KXt0aGlzLmRlYnVnSW5mbyYmdC5hZGQoQihlLHRoaXMpLHRoaXMuZmlsZUluZm8oKSx0aGlzLmdldEluZGV4KCkpLHQuYWRkKHRoaXMudmFsdWUpfSxpc1NpbGVudDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbXByZXNzJiYiISIhPT10aGlzLnZhbHVlWzJdO3JldHVybiB0aGlzLmlzTGluZUNvbW1lbnR8fHR9fSk7dmFyIHE9e30sVD1mdW5jdGlvbihlLHQsaSl7aWYoZSlmb3IodmFyIG49MDtuPGkubGVuZ3RoO24rKyllLmhhc093blByb3BlcnR5KGlbbl0pJiYodFtpW25dXT1lW2lbbl1dKX0sej1bInBhdGhzIiwicmV3cml0ZVVybHMiLCJyb290cGF0aCIsInN0cmljdEltcG9ydHMiLCJpbnNlY3VyZSIsImR1bXBMaW5lTnVtYmVycyIsImNvbXByZXNzIiwic3luY0ltcG9ydCIsImNodW5rSW5wdXQiLCJtaW1lIiwidXNlRmlsZUNhY2hlIiwicHJvY2Vzc0ltcG9ydHMiLCJwbHVnaW5NYW5hZ2VyIl07cS5QYXJzZT1mdW5jdGlvbihlKXtUKGUsdGhpcyx6KSwic3RyaW5nIj09dHlwZW9mIHRoaXMucGF0aHMmJih0aGlzLnBhdGhzPVt0aGlzLnBhdGhzXSl9O3ZhciBHPVsicGF0aHMiLCJjb21wcmVzcyIsIm1hdGgiLCJzdHJpY3RVbml0cyIsInNvdXJjZU1hcCIsImltcG9ydE11bHRpcGxlIiwidXJsQXJncyIsImphdmFzY3JpcHRFbmFibGVkIiwicGx1Z2luTWFuYWdlciIsImltcG9ydGFudFNjb3BlIiwicmV3cml0ZVVybHMiXTtmdW5jdGlvbiBXKGUpe3JldHVybiEvXig/OlthLXotXSs6fFwvfCMpL2kudGVzdChlKX1mdW5jdGlvbiBKKGUpe3JldHVybiIuIj09PWUuY2hhckF0KDApfXEuRXZhbD1mdW5jdGlvbihlLHQpe1QoZSx0aGlzLEcpLCJzdHJpbmciPT10eXBlb2YgdGhpcy5wYXRocyYmKHRoaXMucGF0aHM9W3RoaXMucGF0aHNdKSx0aGlzLmZyYW1lcz10fHxbXSx0aGlzLmltcG9ydGFudFNjb3BlPXRoaXMuaW1wb3J0YW50U2NvcGV8fFtdfSxxLkV2YWwucHJvdG90eXBlLmVudGVyQ2FsYz1mdW5jdGlvbigpe3RoaXMuY2FsY1N0YWNrfHwodGhpcy5jYWxjU3RhY2s9W10pLHRoaXMuY2FsY1N0YWNrLnB1c2goITApLHRoaXMuaW5DYWxjPSEwfSxxLkV2YWwucHJvdG90eXBlLmV4aXRDYWxjPWZ1bmN0aW9uKCl7dGhpcy5jYWxjU3RhY2sucG9wKCksdGhpcy5jYWxjU3RhY2subGVuZ3RofHwodGhpcy5pbkNhbGM9ITEpfSxxLkV2YWwucHJvdG90eXBlLmluUGFyZW50aGVzaXM9ZnVuY3Rpb24oKXt0aGlzLnBhcmVuc1N0YWNrfHwodGhpcy5wYXJlbnNTdGFjaz1bXSksdGhpcy5wYXJlbnNTdGFjay5wdXNoKCEwKX0scS5FdmFsLnByb3RvdHlwZS5vdXRPZlBhcmVudGhlc2lzPWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnNTdGFjay5wb3AoKX0scS5FdmFsLnByb3RvdHlwZS5pbkNhbGM9ITEscS5FdmFsLnByb3RvdHlwZS5tYXRoT249ITAscS5FdmFsLnByb3RvdHlwZS5pc01hdGhPbj1mdW5jdGlvbihlKXtyZXR1cm4hIXRoaXMubWF0aE9uJiYoISEoIi8iIT09ZXx8dGhpcy5tYXRoPT09Zy5BTFdBWVN8fHRoaXMucGFyZW5zU3RhY2smJnRoaXMucGFyZW5zU3RhY2subGVuZ3RoKSYmKCEodGhpcy5tYXRoPmcuUEFSRU5TX0RJVklTSU9OKXx8dGhpcy5wYXJlbnNTdGFjayYmdGhpcy5wYXJlbnNTdGFjay5sZW5ndGgpKX0scS5FdmFsLnByb3RvdHlwZS5wYXRoUmVxdWlyZXNSZXdyaXRlPWZ1bmN0aW9uKGUpe3JldHVybih0aGlzLnJld3JpdGVVcmxzPT09Yj9KOlcpKGUpfSxxLkV2YWwucHJvdG90eXBlLnJld3JpdGVQYXRoPWZ1bmN0aW9uKGUsdCl7dmFyIGk7cmV0dXJuIHQ9dHx8IiIsaT10aGlzLm5vcm1hbGl6ZVBhdGgodCtlKSxKKGUpJiZXKHQpJiYhMT09PUooaSkmJihpPSIuLyIraSksaX0scS5FdmFsLnByb3RvdHlwZS5ub3JtYWxpemVQYXRoPWZ1bmN0aW9uKGUpe3ZhciB0LGk9ZS5zcGxpdCgiLyIpLnJldmVyc2UoKTtmb3IoZT1bXTswIT09aS5sZW5ndGg7KXN3aXRjaCh0PWkucG9wKCkpe2Nhc2UiLiI6YnJlYWs7Y2FzZSIuLiI6MD09PWUubGVuZ3RofHwiLi4iPT09ZVtlLmxlbmd0aC0xXT9lLnB1c2godCk6ZS5wb3AoKTticmVhaztkZWZhdWx0OmUucHVzaCh0KX1yZXR1cm4gZS5qb2luKCIvIil9O3ZhciBIPWZ1bmN0aW9uIGUodCl7cmV0dXJue19kYXRhOnt9LGFkZDpmdW5jdGlvbihlLHQpe2U9ZS50b0xvd2VyQ2FzZSgpLHRoaXMuX2RhdGEuaGFzT3duUHJvcGVydHkoZSksdGhpcy5fZGF0YVtlXT10fSxhZGRNdWx0aXBsZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO09iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKGkpe3QuYWRkKGksZVtpXSl9KSl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZGF0YVtlXXx8dCYmdC5nZXQoZSl9LGdldExvY2FsRnVuY3Rpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9LGluaGVyaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzKX0sY3JlYXRlOmZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfX19KG51bGwpLFE9e2V2YWw6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnZhbHVlXyx0PXRoaXMuZXJyb3JfO2lmKHQpdGhyb3cgdDtpZihudWxsIT1lKXJldHVybiBlP0wuVHJ1ZTpMLkZhbHNlfSx2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnZhbHVlXz1lfSxlcnJvcjpmdW5jdGlvbihlKXt0aGlzLmVycm9yXz1lfSxyZXNldDpmdW5jdGlvbigpe3RoaXMudmFsdWVfPXRoaXMuZXJyb3JfPW51bGx9fSxLPWZ1bmN0aW9uKGUsdCxpLG4pe3RoaXMuc2VsZWN0b3JzPWUsdGhpcy5ydWxlcz10LHRoaXMuX2xvb2t1cHM9e30sdGhpcy5fdmFyaWFibGVzPW51bGwsdGhpcy5fcHJvcGVydGllcz1udWxsLHRoaXMuc3RyaWN0SW1wb3J0cz1pLHRoaXMuY29weVZpc2liaWxpdHlJbmZvKG4pLHRoaXMuYWxsb3dSb290PSEwLHRoaXMuc2V0UGFyZW50KHRoaXMuc2VsZWN0b3JzLHRoaXMpLHRoaXMuc2V0UGFyZW50KHRoaXMucnVsZXMsdGhpcyl9O0sucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IlJ1bGVzZXQiLGlzUnVsZXNldDohMCxpc1J1bGVzZXRMaWtlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGFjY2VwdDpmdW5jdGlvbihlKXt0aGlzLnBhdGhzP3RoaXMucGF0aHM9ZS52aXNpdEFycmF5KHRoaXMucGF0aHMsITApOnRoaXMuc2VsZWN0b3JzJiYodGhpcy5zZWxlY3RvcnM9ZS52aXNpdEFycmF5KHRoaXMuc2VsZWN0b3JzKSksdGhpcy5ydWxlcyYmdGhpcy5ydWxlcy5sZW5ndGgmJih0aGlzLnJ1bGVzPWUudmlzaXRBcnJheSh0aGlzLnJ1bGVzKSl9LGV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuLHIscyxvPSExO2lmKHRoaXMuc2VsZWN0b3JzJiYoaT10aGlzLnNlbGVjdG9ycy5sZW5ndGgpKXtmb3IodD1uZXcgQXJyYXkoaSksUS5lcnJvcih7dHlwZToiU3ludGF4IixtZXNzYWdlOiJpdCBpcyBjdXJyZW50bHkgb25seSBhbGxvd2VkIGluIHBhcmFtZXRyaWMgbWl4aW4gZ3VhcmRzLCJ9KSxyPTA7cjxpO3IrKyl7bj10aGlzLnNlbGVjdG9yc1tyXS5ldmFsKGUpO2Zvcih2YXIgYT0wO2E8bi5lbGVtZW50cy5sZW5ndGg7YSsrKWlmKG4uZWxlbWVudHNbYV0uaXNWYXJpYWJsZSl7cz0hMDticmVha310W3JdPW4sbi5ldmFsZENvbmRpdGlvbiYmKG89ITApfWlmKHMpe3ZhciBsPW5ldyBBcnJheShpKTtmb3Iocj0wO3I8aTtyKyspbj10W3JdLGxbcl09bi50b0NTUyhlKTt0aGlzLnBhcnNlLnBhcnNlTm9kZShsLmpvaW4oIiwiKSxbInNlbGVjdG9ycyJdLHRbMF0uZ2V0SW5kZXgoKSx0WzBdLmZpbGVJbmZvKCksKGZ1bmN0aW9uKGUsaSl7aSYmKHQ9RShpKSl9KSl9US5yZXNldCgpfWVsc2Ugbz0hMDt2YXIgYyxoLGY9dGhpcy5ydWxlcz9rKHRoaXMucnVsZXMpOm51bGwscD1uZXcgSyh0LGYsdGhpcy5zdHJpY3RJbXBvcnRzLHRoaXMudmlzaWJpbGl0eUluZm8oKSk7cC5vcmlnaW5hbFJ1bGVzZXQ9dGhpcyxwLnJvb3Q9dGhpcy5yb290LHAuZmlyc3RSb290PXRoaXMuZmlyc3RSb290LHAuYWxsb3dJbXBvcnRzPXRoaXMuYWxsb3dJbXBvcnRzLHRoaXMuZGVidWdJbmZvJiYocC5kZWJ1Z0luZm89dGhpcy5kZWJ1Z0luZm8pLG98fChmLmxlbmd0aD0wKSxwLmZ1bmN0aW9uUmVnaXN0cnk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LGk9MCxuPWUubGVuZ3RoO2khPT1uOysraSlpZih0PWVbaV0uZnVuY3Rpb25SZWdpc3RyeSlyZXR1cm4gdDtyZXR1cm4gSH0oZS5mcmFtZXMpLmluaGVyaXQoKTt2YXIgdj1lLmZyYW1lczt2LnVuc2hpZnQocCk7dmFyIGQ9ZS5zZWxlY3RvcnM7ZHx8KGUuc2VsZWN0b3JzPWQ9W10pLGQudW5zaGlmdCh0aGlzLnNlbGVjdG9ycyksKHAucm9vdHx8cC5hbGxvd0ltcG9ydHN8fCFwLnN0cmljdEltcG9ydHMpJiZwLmV2YWxJbXBvcnRzKGUpO3ZhciBtPXAucnVsZXM7Zm9yKHI9MDtjPW1bcl07cisrKWMuZXZhbEZpcnN0JiYobVtyXT1jLmV2YWwoZSkpO3ZhciBnPWUubWVkaWFCbG9ja3MmJmUubWVkaWFCbG9ja3MubGVuZ3RofHwwO2ZvcihyPTA7Yz1tW3JdO3IrKykiTWl4aW5DYWxsIj09PWMudHlwZT8oZj1jLmV2YWwoZSkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hKGUgaW5zdGFuY2VvZiBEJiZlLnZhcmlhYmxlKXx8IXAudmFyaWFibGUoZS5uYW1lKX0pKSxtLnNwbGljZS5hcHBseShtLFtyLDFdLmNvbmNhdChmKSkscis9Zi5sZW5ndGgtMSxwLnJlc2V0Q2FjaGUoKSk6IlZhcmlhYmxlQ2FsbCI9PT1jLnR5cGUmJihmPWMuZXZhbChlKS5ydWxlcy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiEoZSBpbnN0YW5jZW9mIEQmJmUudmFyaWFibGUpfSkpLG0uc3BsaWNlLmFwcGx5KG0sW3IsMV0uY29uY2F0KGYpKSxyKz1mLmxlbmd0aC0xLHAucmVzZXRDYWNoZSgpKTtmb3Iocj0wO2M9bVtyXTtyKyspYy5ldmFsRmlyc3R8fChtW3JdPWM9Yy5ldmFsP2MuZXZhbChlKTpjKTtmb3Iocj0wO2M9bVtyXTtyKyspaWYoYyBpbnN0YW5jZW9mIEsmJmMuc2VsZWN0b3JzJiYxPT09Yy5zZWxlY3RvcnMubGVuZ3RoJiZjLnNlbGVjdG9yc1swXSYmYy5zZWxlY3RvcnNbMF0uaXNKdXN0UGFyZW50U2VsZWN0b3IoKSl7bS5zcGxpY2Uoci0tLDEpO2ZvcihhPTA7aD1jLnJ1bGVzW2FdO2ErKyloIGluc3RhbmNlb2YgdSYmKGguY29weVZpc2liaWxpdHlJbmZvKGMudmlzaWJpbGl0eUluZm8oKSksaCBpbnN0YW5jZW9mIEQmJmgudmFyaWFibGV8fG0uc3BsaWNlKCsrciwwLGgpKX1pZih2LnNoaWZ0KCksZC5zaGlmdCgpLGUubWVkaWFCbG9ja3MpZm9yKHI9ZztyPGUubWVkaWFCbG9ja3MubGVuZ3RoO3IrKyllLm1lZGlhQmxvY2tzW3JdLmJ1YmJsZVNlbGVjdG9ycyh0KTtyZXR1cm4gcH0sZXZhbEltcG9ydHM6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuPXRoaXMucnVsZXM7aWYobilmb3IodD0wO3Q8bi5sZW5ndGg7dCsrKSJJbXBvcnQiPT09blt0XS50eXBlJiYoKGk9blt0XS5ldmFsKGUpKSYmKGkubGVuZ3RofHwwPT09aS5sZW5ndGgpPyhuLnNwbGljZS5hcHBseShuLFt0LDFdLmNvbmNhdChpKSksdCs9aS5sZW5ndGgtMSk6bi5zcGxpY2UodCwxLGkpLHRoaXMucmVzZXRDYWNoZSgpKX0sbWFrZUltcG9ydGFudDpmdW5jdGlvbigpe3JldHVybiBuZXcgSyh0aGlzLnNlbGVjdG9ycyx0aGlzLnJ1bGVzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUubWFrZUltcG9ydGFudD9lLm1ha2VJbXBvcnRhbnQoKTplfSkpLHRoaXMuc3RyaWN0SW1wb3J0cyx0aGlzLnZpc2liaWxpdHlJbmZvKCkpfSxtYXRjaEFyZ3M6ZnVuY3Rpb24oZSl7cmV0dXJuIWV8fDA9PT1lLmxlbmd0aH0sbWF0Y2hDb25kaXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLnNlbGVjdG9yc1t0aGlzLnNlbGVjdG9ycy5sZW5ndGgtMV07cmV0dXJuISFpLmV2YWxkQ29uZGl0aW9uJiYhKGkuY29uZGl0aW9uJiYhaS5jb25kaXRpb24uZXZhbChuZXcgcS5FdmFsKHQsdC5mcmFtZXMpKSl9LHJlc2V0Q2FjaGU6ZnVuY3Rpb24oKXt0aGlzLl9ydWxlc2V0cz1udWxsLHRoaXMuX3ZhcmlhYmxlcz1udWxsLHRoaXMuX3Byb3BlcnRpZXM9bnVsbCx0aGlzLl9sb29rdXBzPXt9fSx2YXJpYWJsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmFyaWFibGVzfHwodGhpcy5fdmFyaWFibGVzPXRoaXMucnVsZXM/dGhpcy5ydWxlcy5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7aWYodCBpbnN0YW5jZW9mIEQmJiEwPT09dC52YXJpYWJsZSYmKGVbdC5uYW1lXT10KSwiSW1wb3J0Ij09PXQudHlwZSYmdC5yb290JiZ0LnJvb3QudmFyaWFibGVzKXt2YXIgaT10LnJvb3QudmFyaWFibGVzKCk7Zm9yKHZhciBuIGluIGkpaS5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09dC5yb290LnZhcmlhYmxlKG4pKX1yZXR1cm4gZX0pLHt9KTp7fSksdGhpcy5fdmFyaWFibGVzfSxwcm9wZXJ0aWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BlcnRpZXN8fCh0aGlzLl9wcm9wZXJ0aWVzPXRoaXMucnVsZXM/dGhpcy5ydWxlcy5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7aWYodCBpbnN0YW5jZW9mIEQmJiEwIT09dC52YXJpYWJsZSl7dmFyIGk9MT09PXQubmFtZS5sZW5ndGgmJnQubmFtZVswXWluc3RhbmNlb2YgTD90Lm5hbWVbMF0udmFsdWU6dC5uYW1lO2VbIiQiK2ldP2VbIiQiK2ldLnB1c2godCk6ZVsiJCIraV09W3RdfXJldHVybiBlfSkse30pOnt9KSx0aGlzLl9wcm9wZXJ0aWVzfSx2YXJpYWJsZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnZhcmlhYmxlcygpW2VdO2lmKHQpcmV0dXJuIHRoaXMucGFyc2VWYWx1ZSh0KX0scHJvcGVydHk6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wcm9wZXJ0aWVzKClbZV07aWYodClyZXR1cm4gdGhpcy5wYXJzZVZhbHVlKHQpfSxsYXN0RGVjbGFyYXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5ydWxlcy5sZW5ndGg7ZT4wO2UtLSl7dmFyIHQ9dGhpcy5ydWxlc1tlLTFdO2lmKHQgaW5zdGFuY2VvZiBEKXJldHVybiB0aGlzLnBhcnNlVmFsdWUodCl9fSxwYXJzZVZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZS52YWx1ZSBpbnN0YW5jZW9mIGomJiFlLnBhcnNlZD8oInN0cmluZyI9PXR5cGVvZiBlLnZhbHVlLnZhbHVlP3RoaXMucGFyc2UucGFyc2VOb2RlKGUudmFsdWUudmFsdWUsWyJ2YWx1ZSIsImltcG9ydGFudCJdLGUudmFsdWUuZ2V0SW5kZXgoKSxlLmZpbGVJbmZvKCksKGZ1bmN0aW9uKHQsaSl7dCYmKGUucGFyc2VkPSEwKSxpJiYoZS52YWx1ZT1pWzBdLGUuaW1wb3J0YW50PWlbMV18fCIiLGUucGFyc2VkPSEwKX0pKTplLnBhcnNlZD0hMCxlKTplfWlmKEFycmF5LmlzQXJyYXkoZSkpe3ZhciBuPVtdO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe24ucHVzaChpLmNhbGwodCxlKSl9KSksbn1yZXR1cm4gaS5jYWxsKHQsZSl9LHJ1bGVzZXRzOmZ1bmN0aW9uKCl7aWYoIXRoaXMucnVsZXMpcmV0dXJuW107dmFyIGUsdCxpPVtdLG49dGhpcy5ydWxlcztmb3IoZT0wO3Q9bltlXTtlKyspdC5pc1J1bGVzZXQmJmkucHVzaCh0KTtyZXR1cm4gaX0scHJlcGVuZFJ1bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5ydWxlczt0P3QudW5zaGlmdChlKTp0aGlzLnJ1bGVzPVtlXSx0aGlzLnNldFBhcmVudChlLHRoaXMpfSxmaW5kOmZ1bmN0aW9uKGUsdCxpKXt0PXR8fHRoaXM7dmFyIG4scixzPVtdLG89ZS50b0NTUygpO3JldHVybiBvIGluIHRoaXMuX2xvb2t1cHM/dGhpcy5fbG9va3Vwc1tvXToodGhpcy5ydWxlc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKG8pe2lmKG8hPT10KWZvcih2YXIgYT0wO2E8by5zZWxlY3RvcnMubGVuZ3RoO2ErKylpZihuPWUubWF0Y2goby5zZWxlY3RvcnNbYV0pKXtpZihlLmVsZW1lbnRzLmxlbmd0aD5uKXtpZighaXx8aShvKSl7cj1vLmZpbmQobmV3IEYoZS5lbGVtZW50cy5zbGljZShuKSksdCxpKTtmb3IodmFyIGw9MDtsPHIubGVuZ3RoOysrbClyW2xdLnBhdGgucHVzaChvKTtBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShzLHIpfX1lbHNlIHMucHVzaCh7cnVsZTpvLHBhdGg6W119KTticmVha319KSksdGhpcy5fbG9va3Vwc1tvXT1zLHMpfSxnZW5DU1M6ZnVuY3Rpb24oZSx0KXt2YXIgaSxuLHIscyxvLGE9W107ZS50YWJMZXZlbD1lLnRhYkxldmVsfHwwLHRoaXMucm9vdHx8ZS50YWJMZXZlbCsrO3ZhciBsLHU9ZS5jb21wcmVzcz8iIjpBcnJheShlLnRhYkxldmVsKzEpLmpvaW4oIiAgIiksYz1lLmNvbXByZXNzPyIiOkFycmF5KGUudGFiTGV2ZWwpLmpvaW4oIiAgIiksaD0wLGY9MDtmb3IoaT0wO3M9dGhpcy5ydWxlc1tpXTtpKyspcyBpbnN0YW5jZW9mIFU/KGY9PT1pJiZmKyssYS5wdXNoKHMpKTpzLmlzQ2hhcnNldCYmcy5pc0NoYXJzZXQoKT8oYS5zcGxpY2UoaCwwLHMpLGgrKyxmKyspOiJJbXBvcnQiPT09cy50eXBlPyhhLnNwbGljZShmLDAscyksZisrKTphLnB1c2gocyk7aWYoYT1bXS5jb25jYXQoYSksIXRoaXMucm9vdCl7KHI9QihlLHRoaXMsYykpJiYodC5hZGQociksdC5hZGQoYykpO3ZhciBwPXRoaXMucGF0aHMsdj1wLmxlbmd0aCxkPXZvaWQgMDtmb3IobD1lLmNvbXByZXNzPyIsIjoiLFxuIitjLGk9MDtpPHY7aSsrKWlmKGQ9KG89cFtpXSkubGVuZ3RoKWZvcihpPjAmJnQuYWRkKGwpLGUuZmlyc3RTZWxlY3Rvcj0hMCxvWzBdLmdlbkNTUyhlLHQpLGUuZmlyc3RTZWxlY3Rvcj0hMSxuPTE7bjxkO24rKylvW25dLmdlbkNTUyhlLHQpO3QuYWRkKChlLmNvbXByZXNzPyJ7IjoiIHtcbiIpK3UpfWZvcihpPTA7cz1hW2ldO2krKyl7aSsxPT09YS5sZW5ndGgmJihlLmxhc3RSdWxlPSEwKTt2YXIgbT1lLmxhc3RSdWxlO3MuaXNSdWxlc2V0TGlrZShzKSYmKGUubGFzdFJ1bGU9ITEpLHMuZ2VuQ1NTP3MuZ2VuQ1NTKGUsdCk6cy52YWx1ZSYmdC5hZGQocy52YWx1ZS50b1N0cmluZygpKSxlLmxhc3RSdWxlPW0sIWUubGFzdFJ1bGUmJnMuaXNWaXNpYmxlKCk/dC5hZGQoZS5jb21wcmVzcz8iIjoiXG4iK3UpOmUubGFzdFJ1bGU9ITF9dGhpcy5yb290fHwodC5hZGQoZS5jb21wcmVzcz8ifSI6IlxuIitjKyJ9IiksZS50YWJMZXZlbC0tKSx0LmlzRW1wdHkoKXx8ZS5jb21wcmVzc3x8IXRoaXMuZmlyc3RSb290fHx0LmFkZCgiXG4iKX0sam9pblNlbGVjdG9yczpmdW5jdGlvbihlLHQsaSl7Zm9yKHZhciBuPTA7bjxpLmxlbmd0aDtuKyspdGhpcy5qb2luU2VsZWN0b3IoZSx0LGlbbl0pfSxqb2luU2VsZWN0b3I6ZnVuY3Rpb24oZSx0LGkpe2Z1bmN0aW9uIG4oZSx0KXt2YXIgaSxuO2lmKDA9PT1lLmxlbmd0aClpPW5ldyBwKGVbMF0pO2Vsc2V7dmFyIHI9bmV3IEFycmF5KGUubGVuZ3RoKTtmb3Iobj0wO248ZS5sZW5ndGg7bisrKXJbbl09bmV3IG0obnVsbCxlW25dLHQuaXNWYXJpYWJsZSx0Ll9pbmRleCx0Ll9maWxlSW5mbyk7aT1uZXcgcChuZXcgRihyKSl9cmV0dXJuIGl9ZnVuY3Rpb24gcihlLHQpe3ZhciBpO3JldHVybiBpPW5ldyBtKG51bGwsZSx0LmlzVmFyaWFibGUsdC5faW5kZXgsdC5fZmlsZUluZm8pLG5ldyBGKFtpXSl9ZnVuY3Rpb24gcyhlLHQsaSxuKXt2YXIgcixzLG87aWYocj1bXSxlLmxlbmd0aD4wPyhzPShyPWsoZSkpLnBvcCgpLG89bi5jcmVhdGVEZXJpdmVkKGsocy5lbGVtZW50cykpKTpvPW4uY3JlYXRlRGVyaXZlZChbXSksdC5sZW5ndGg+MCl7dmFyIGE9aS5jb21iaW5hdG9yLGw9dFswXS5lbGVtZW50c1swXTthLmVtcHR5T3JXaGl0ZXNwYWNlJiYhbC5jb21iaW5hdG9yLmVtcHR5T3JXaGl0ZXNwYWNlJiYoYT1sLmNvbWJpbmF0b3IpLG8uZWxlbWVudHMucHVzaChuZXcgbShhLGwudmFsdWUsaS5pc1ZhcmlhYmxlLGkuX2luZGV4LGkuX2ZpbGVJbmZvKSksby5lbGVtZW50cz1vLmVsZW1lbnRzLmNvbmNhdCh0WzBdLmVsZW1lbnRzLnNsaWNlKDEpKX1pZigwIT09by5lbGVtZW50cy5sZW5ndGgmJnIucHVzaChvKSx0Lmxlbmd0aD4xKXt2YXIgdT10LnNsaWNlKDEpO3U9dS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNyZWF0ZURlcml2ZWQoZS5lbGVtZW50cyxbXSl9KSkscj1yLmNvbmNhdCh1KX1yZXR1cm4gcn1mdW5jdGlvbiBvKGUsdCxpLG4scil7dmFyIG87Zm9yKG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIGE9cyhlW29dLHQsaSxuKTtyLnB1c2goYSl9cmV0dXJuIHJ9ZnVuY3Rpb24gYShlLHQpe3ZhciBpLG47aWYoMCE9PWUubGVuZ3RoKWlmKDAhPT10Lmxlbmd0aClmb3IoaT0wO249dFtpXTtpKyspbi5sZW5ndGg+MD9uW24ubGVuZ3RoLTFdPW5bbi5sZW5ndGgtMV0uY3JlYXRlRGVyaXZlZChuW24ubGVuZ3RoLTFdLmVsZW1lbnRzLmNvbmNhdChlKSk6bi5wdXNoKG5ldyBGKGUpKTtlbHNlIHQucHVzaChbbmV3IEYoZSldKX1mdW5jdGlvbiBsKGUsdCl7dmFyIGk9dC5jcmVhdGVEZXJpdmVkKHQuZWxlbWVudHMsdC5leHRlbmRMaXN0LHQuZXZhbGRDb25kaXRpb24pO3JldHVybiBpLmNvcHlWaXNpYmlsaXR5SW5mbyhlKSxpfXZhciB1LGM7aWYoIWZ1bmN0aW9uIGUodCxpLGwpe3ZhciB1LGMsaCxmLHYsZCxnLHksYix3LHgsUyxJPSExO2ZvcihmPVtdLHY9W1tdXSx1PTA7eT1sLmVsZW1lbnRzW3VdO3UrKylpZigiJiIhPT15LnZhbHVlKXt2YXIgQz0oUz12b2lkIDAsKHg9eSkudmFsdWUgaW5zdGFuY2VvZiBwJiYoUz14LnZhbHVlLnZhbHVlKWluc3RhbmNlb2YgRj9TOm51bGwpO2lmKG51bGwhPUMpe2EoZix2KTt2YXIgayxfPVtdLEE9W107Zm9yKGs9ZShfLGksQyksST1JfHxrLGg9MDtoPF8ubGVuZ3RoO2grKyl7byh2LFtyKG4oX1toXSx5KSx5KV0seSxsLEEpfXY9QSxmPVtdfWVsc2UgZi5wdXNoKHkpfWVsc2V7Zm9yKEk9ITAsZD1bXSxhKGYsdiksYz0wO2M8di5sZW5ndGg7YysrKWlmKGc9dltjXSwwPT09aS5sZW5ndGgpZy5sZW5ndGg+MCYmZ1swXS5lbGVtZW50cy5wdXNoKG5ldyBtKHkuY29tYmluYXRvciwiIix5LmlzVmFyaWFibGUseS5faW5kZXgseS5fZmlsZUluZm8pKSxkLnB1c2goZyk7ZWxzZSBmb3IoaD0wO2g8aS5sZW5ndGg7aCsrKXt2YXIgTT1zKGcsaVtoXSx5LGwpO2QucHVzaChNKX12PWQsZj1bXX1mb3IoYShmLHYpLHU9MDt1PHYubGVuZ3RoO3UrKykoYj12W3VdLmxlbmd0aCk+MCYmKHQucHVzaCh2W3VdKSx3PXZbdV1bYi0xXSx2W3VdW2ItMV09dy5jcmVhdGVEZXJpdmVkKHcuZWxlbWVudHMsbC5leHRlbmRMaXN0KSk7cmV0dXJuIEl9KGM9W10sdCxpKSlpZih0Lmxlbmd0aD4wKWZvcihjPVtdLHU9MDt1PHQubGVuZ3RoO3UrKyl7dmFyIGg9dFt1XS5tYXAobC5iaW5kKHRoaXMsaS52aXNpYmlsaXR5SW5mbygpKSk7aC5wdXNoKGkpLGMucHVzaChoKX1lbHNlIGM9W1tpXV07Zm9yKHU9MDt1PGMubGVuZ3RoO3UrKyllLnB1c2goY1t1XSl9fSk7dmFyIFo9ZnVuY3Rpb24oZSx0LGksbixyLHMsbyxhKXt2YXIgbDtpZih0aGlzLm5hbWU9ZSx0aGlzLnZhbHVlPXQgaW5zdGFuY2VvZiB1P3Q6dD9uZXcgaih0KTp0LGkpe2ZvcihBcnJheS5pc0FycmF5KGkpP3RoaXMucnVsZXM9aToodGhpcy5ydWxlcz1baV0sdGhpcy5ydWxlc1swXS5zZWxlY3RvcnM9bmV3IEYoW10sbnVsbCxudWxsLG4scikuY3JlYXRlRW1wdHlTZWxlY3RvcnMoKSksbD0wO2w8dGhpcy5ydWxlcy5sZW5ndGg7bCsrKXRoaXMucnVsZXNbbF0uYWxsb3dJbXBvcnRzPSEwO3RoaXMuc2V0UGFyZW50KHRoaXMucnVsZXMsdGhpcyl9dGhpcy5faW5kZXg9bix0aGlzLl9maWxlSW5mbz1yLHRoaXMuZGVidWdJbmZvPXMsdGhpcy5pc1Jvb3RlZD1vfHwhMSx0aGlzLmNvcHlWaXNpYmlsaXR5SW5mbyhhKSx0aGlzLmFsbG93Um9vdD0hMH07Wi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiQXRSdWxlIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy52YWx1ZSxpPXRoaXMucnVsZXM7aSYmKHRoaXMucnVsZXM9ZS52aXNpdEFycmF5KGkpKSx0JiYodGhpcy52YWx1ZT1lLnZpc2l0KHQpKX0saXNSdWxlc2V0TGlrZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJ1bGVzfHwhdGhpcy5pc0NoYXJzZXQoKX0saXNDaGFyc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIkBjaGFyc2V0Ij09PXRoaXMubmFtZX0sZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy52YWx1ZSxuPXRoaXMucnVsZXM7dC5hZGQodGhpcy5uYW1lLHRoaXMuZmlsZUluZm8oKSx0aGlzLmdldEluZGV4KCkpLGkmJih0LmFkZCgiICIpLGkuZ2VuQ1NTKGUsdCkpLG4/dGhpcy5vdXRwdXRSdWxlc2V0KGUsdCxuKTp0LmFkZCgiOyIpfSxldmFsOmZ1bmN0aW9uKGUpe3ZhciB0LGksbj10aGlzLnZhbHVlLHI9dGhpcy5ydWxlcztyZXR1cm4gdD1lLm1lZGlhUGF0aCxpPWUubWVkaWFCbG9ja3MsZS5tZWRpYVBhdGg9W10sZS5tZWRpYUJsb2Nrcz1bXSxuJiYobj1uLmV2YWwoZSkpLHImJigocj1bclswXS5ldmFsKGUpXSlbMF0ucm9vdD0hMCksZS5tZWRpYVBhdGg9dCxlLm1lZGlhQmxvY2tzPWksbmV3IFoodGhpcy5uYW1lLG4scix0aGlzLmdldEluZGV4KCksdGhpcy5maWxlSW5mbygpLHRoaXMuZGVidWdJbmZvLHRoaXMuaXNSb290ZWQsdGhpcy52aXNpYmlsaXR5SW5mbygpKX0sdmFyaWFibGU6ZnVuY3Rpb24oZSl7aWYodGhpcy5ydWxlcylyZXR1cm4gSy5wcm90b3R5cGUudmFyaWFibGUuY2FsbCh0aGlzLnJ1bGVzWzBdLGUpfSxmaW5kOmZ1bmN0aW9uKCl7aWYodGhpcy5ydWxlcylyZXR1cm4gSy5wcm90b3R5cGUuZmluZC5hcHBseSh0aGlzLnJ1bGVzWzBdLGFyZ3VtZW50cyl9LHJ1bGVzZXRzOmZ1bmN0aW9uKCl7aWYodGhpcy5ydWxlcylyZXR1cm4gSy5wcm90b3R5cGUucnVsZXNldHMuYXBwbHkodGhpcy5ydWxlc1swXSl9LG91dHB1dFJ1bGVzZXQ6ZnVuY3Rpb24oZSx0LGkpe3ZhciBuLHI9aS5sZW5ndGg7aWYoZS50YWJMZXZlbD0xKygwfGUudGFiTGV2ZWwpLGUuY29tcHJlc3Mpe2Zvcih0LmFkZCgieyIpLG49MDtuPHI7bisrKWlbbl0uZ2VuQ1NTKGUsdCk7cmV0dXJuIHQuYWRkKCJ9Iiksdm9pZCBlLnRhYkxldmVsLS19dmFyIHM9IlxuIitBcnJheShlLnRhYkxldmVsKS5qb2luKCIgICIpLG89cysiICAiO2lmKHIpe2Zvcih0LmFkZCgiIHsiK28pLGlbMF0uZ2VuQ1NTKGUsdCksbj0xO248cjtuKyspdC5hZGQobyksaVtuXS5nZW5DU1MoZSx0KTt0LmFkZChzKyJ9Iil9ZWxzZSB0LmFkZCgiIHsiK3MrIn0iKTtlLnRhYkxldmVsLS19fSk7dmFyIFg9ZnVuY3Rpb24oZSx0KXt0aGlzLnJ1bGVzZXQ9ZSx0aGlzLmZyYW1lcz10LHRoaXMuc2V0UGFyZW50KHRoaXMucnVsZXNldCx0aGlzKX07WC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiRGV0YWNoZWRSdWxlc2V0IixldmFsRmlyc3Q6ITAsYWNjZXB0OmZ1bmN0aW9uKGUpe3RoaXMucnVsZXNldD1lLnZpc2l0KHRoaXMucnVsZXNldCl9LGV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5mcmFtZXN8fGsoZS5mcmFtZXMpO3JldHVybiBuZXcgWCh0aGlzLnJ1bGVzZXQsdCl9LGNhbGxFdmFsOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJ1bGVzZXQuZXZhbCh0aGlzLmZyYW1lcz9uZXcgcS5FdmFsKGUsdGhpcy5mcmFtZXMuY29uY2F0KGUuZnJhbWVzKSk6ZSl9fSk7dmFyIFk9ZnVuY3Rpb24oZSx0LGkpe3RoaXMubnVtZXJhdG9yPWU/ayhlKS5zb3J0KCk6W10sdGhpcy5kZW5vbWluYXRvcj10P2sodCkuc29ydCgpOltdLGk/dGhpcy5iYWNrdXBVbml0PWk6ZSYmZS5sZW5ndGgmJih0aGlzLmJhY2t1cFVuaXQ9ZVswXSl9O1kucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IlVuaXQiLGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBZKGsodGhpcy5udW1lcmF0b3IpLGsodGhpcy5kZW5vbWluYXRvciksdGhpcy5iYWNrdXBVbml0KX0sZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dmFyIGk9ZSYmZS5zdHJpY3RVbml0czsxPT09dGhpcy5udW1lcmF0b3IubGVuZ3RoP3QuYWRkKHRoaXMubnVtZXJhdG9yWzBdKTohaSYmdGhpcy5iYWNrdXBVbml0P3QuYWRkKHRoaXMuYmFja3VwVW5pdCk6IWkmJnRoaXMuZGVub21pbmF0b3IubGVuZ3RoJiZ0LmFkZCh0aGlzLmRlbm9taW5hdG9yWzBdKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMubnVtZXJhdG9yLmpvaW4oIioiKTtmb3IoZT0wO2U8dGhpcy5kZW5vbWluYXRvci5sZW5ndGg7ZSsrKXQrPSIvIit0aGlzLmRlbm9taW5hdG9yW2VdO3JldHVybiB0fSxjb21wYXJlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmlzKGUudG9TdHJpbmcoKSk/MDp2b2lkIDB9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKT09PWUudG9VcHBlckNhc2UoKX0saXNMZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gUmVnRXhwKCJeKHB4fGVtfGV4fGNofHJlbXxpbnxjbXxtbXxwY3xwdHxleHx2d3x2aHx2bWlufHZtYXgpJCIsImdpIikudGVzdCh0aGlzLnRvQ1NTKCkpfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLm51bWVyYXRvci5sZW5ndGgmJjA9PT10aGlzLmRlbm9taW5hdG9yLmxlbmd0aH0saXNTaW5ndWxhcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm51bWVyYXRvci5sZW5ndGg8PTEmJjA9PT10aGlzLmRlbm9taW5hdG9yLmxlbmd0aH0sbWFwOmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0PTA7dDx0aGlzLm51bWVyYXRvci5sZW5ndGg7dCsrKXRoaXMubnVtZXJhdG9yW3RdPWUodGhpcy5udW1lcmF0b3JbdF0sITEpO2Zvcih0PTA7dDx0aGlzLmRlbm9taW5hdG9yLmxlbmd0aDt0KyspdGhpcy5kZW5vbWluYXRvclt0XT1lKHRoaXMuZGVub21pbmF0b3JbdF0sITApfSx1c2VkVW5pdHM6ZnVuY3Rpb24oKXt2YXIgZSx0LGksbj17fTtmb3IoaSBpbiB0PWZ1bmN0aW9uKHQpe3JldHVybiBlLmhhc093blByb3BlcnR5KHQpJiYhbltpXSYmKG5baV09dCksdH0sYSlhLmhhc093blByb3BlcnR5KGkpJiYoZT1hW2ldLHRoaXMubWFwKHQpKTtyZXR1cm4gbn0sY2FuY2VsOmZ1bmN0aW9uKCl7dmFyIGUsdCxpPXt9O2Zvcih0PTA7dDx0aGlzLm51bWVyYXRvci5sZW5ndGg7dCsrKWlbZT10aGlzLm51bWVyYXRvclt0XV09KGlbZV18fDApKzE7Zm9yKHQ9MDt0PHRoaXMuZGVub21pbmF0b3IubGVuZ3RoO3QrKylpW2U9dGhpcy5kZW5vbWluYXRvclt0XV09KGlbZV18fDApLTE7Zm9yKGUgaW4gdGhpcy5udW1lcmF0b3I9W10sdGhpcy5kZW5vbWluYXRvcj1bXSxpKWlmKGkuaGFzT3duUHJvcGVydHkoZSkpe3ZhciBuPWlbZV07aWYobj4wKWZvcih0PTA7dDxuO3QrKyl0aGlzLm51bWVyYXRvci5wdXNoKGUpO2Vsc2UgaWYobjwwKWZvcih0PTA7dDwtbjt0KyspdGhpcy5kZW5vbWluYXRvci5wdXNoKGUpfXRoaXMubnVtZXJhdG9yLnNvcnQoKSx0aGlzLmRlbm9taW5hdG9yLnNvcnQoKX19KTt2YXIgZWU9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLnZhbHVlPXBhcnNlRmxvYXQoZSksaXNOYU4odGhpcy52YWx1ZSkpdGhyb3cgbmV3IEVycm9yKCJEaW1lbnNpb24gaXMgbm90IGEgbnVtYmVyLiIpO3RoaXMudW5pdD10JiZ0IGluc3RhbmNlb2YgWT90Om5ldyBZKHQ/W3RdOnZvaWQgMCksdGhpcy5zZXRQYXJlbnQodGhpcy51bml0LHRoaXMpfTtlZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiRGltZW5zaW9uIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy51bml0PWUudmlzaXQodGhpcy51bml0KX0sZXZhbDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpc30sdG9Db2xvcjpmdW5jdGlvbigpe3JldHVybiBuZXcgYyhbdGhpcy52YWx1ZSx0aGlzLnZhbHVlLHRoaXMudmFsdWVdKX0sZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7aWYoZSYmZS5zdHJpY3RVbml0cyYmIXRoaXMudW5pdC5pc1Npbmd1bGFyKCkpdGhyb3cgbmV3IEVycm9yKCJNdWx0aXBsZSB1bml0cyBpbiBkaW1lbnNpb24uIENvcnJlY3QgdGhlIHVuaXRzIG9yIHVzZSB0aGUgdW5pdCBmdW5jdGlvbi4gQmFkIHVuaXQ6ICIrdGhpcy51bml0LnRvU3RyaW5nKCkpO3ZhciBpPXRoaXMuZnJvdW5kKGUsdGhpcy52YWx1ZSksbj1TdHJpbmcoaSk7aWYoMCE9PWkmJmk8MWUtNiYmaT4tMWUtNiYmKG49aS50b0ZpeGVkKDIwKS5yZXBsYWNlKC8wKyQvLCIiKSksZSYmZS5jb21wcmVzcyl7aWYoMD09PWkmJnRoaXMudW5pdC5pc0xlbmd0aCgpKXJldHVybiB2b2lkIHQuYWRkKG4pO2k+MCYmaTwxJiYobj1uLnN1YnN0cigxKSl9dC5hZGQobiksdGhpcy51bml0LmdlbkNTUyhlLHQpfSxvcGVyYXRlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgbj10aGlzLl9vcGVyYXRlKGUsdCx0aGlzLnZhbHVlLGkudmFsdWUpLHI9dGhpcy51bml0LmNsb25lKCk7aWYoIisiPT09dHx8Ii0iPT09dClpZigwPT09ci5udW1lcmF0b3IubGVuZ3RoJiYwPT09ci5kZW5vbWluYXRvci5sZW5ndGgpcj1pLnVuaXQuY2xvbmUoKSx0aGlzLnVuaXQuYmFja3VwVW5pdCYmKHIuYmFja3VwVW5pdD10aGlzLnVuaXQuYmFja3VwVW5pdCk7ZWxzZSBpZigwPT09aS51bml0Lm51bWVyYXRvci5sZW5ndGgmJjA9PT1yLmRlbm9taW5hdG9yLmxlbmd0aCk7ZWxzZXtpZihpPWkuY29udmVydFRvKHRoaXMudW5pdC51c2VkVW5pdHMoKSksZS5zdHJpY3RVbml0cyYmaS51bml0LnRvU3RyaW5nKCkhPT1yLnRvU3RyaW5nKCkpdGhyb3cgbmV3IEVycm9yKCJJbmNvbXBhdGlibGUgdW5pdHMuIENoYW5nZSB0aGUgdW5pdHMgb3IgdXNlIHRoZSB1bml0IGZ1bmN0aW9uLiBCYWQgdW5pdHM6ICciK3IudG9TdHJpbmcoKSsiJyBhbmQgJyIraS51bml0LnRvU3RyaW5nKCkrIicuIik7bj10aGlzLl9vcGVyYXRlKGUsdCx0aGlzLnZhbHVlLGkudmFsdWUpfWVsc2UiKiI9PT10PyhyLm51bWVyYXRvcj1yLm51bWVyYXRvci5jb25jYXQoaS51bml0Lm51bWVyYXRvcikuc29ydCgpLHIuZGVub21pbmF0b3I9ci5kZW5vbWluYXRvci5jb25jYXQoaS51bml0LmRlbm9taW5hdG9yKS5zb3J0KCksci5jYW5jZWwoKSk6Ii8iPT09dCYmKHIubnVtZXJhdG9yPXIubnVtZXJhdG9yLmNvbmNhdChpLnVuaXQuZGVub21pbmF0b3IpLnNvcnQoKSxyLmRlbm9taW5hdG9yPXIuZGVub21pbmF0b3IuY29uY2F0KGkudW5pdC5udW1lcmF0b3IpLnNvcnQoKSxyLmNhbmNlbCgpKTtyZXR1cm4gbmV3IGVlKG4scil9LGNvbXBhcmU6ZnVuY3Rpb24oZSl7dmFyIHQsaTtpZihlIGluc3RhbmNlb2YgZWUpe2lmKHRoaXMudW5pdC5pc0VtcHR5KCl8fGUudW5pdC5pc0VtcHR5KCkpdD10aGlzLGk9ZTtlbHNlIGlmKHQ9dGhpcy51bmlmeSgpLGk9ZS51bmlmeSgpLDAhPT10LnVuaXQuY29tcGFyZShpLnVuaXQpKXJldHVybjtyZXR1cm4gdS5udW1lcmljQ29tcGFyZSh0LnZhbHVlLGkudmFsdWUpfX0sdW5pZnk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb252ZXJ0VG8oe2xlbmd0aDoicHgiLGR1cmF0aW9uOiJzIixhbmdsZToicmFkIn0pfSxjb252ZXJ0VG86ZnVuY3Rpb24oZSl7dmFyIHQsaSxuLHIscyxvPXRoaXMudmFsdWUsbD10aGlzLnVuaXQuY2xvbmUoKSx1PXt9O2lmKCJzdHJpbmciPT10eXBlb2YgZSl7Zm9yKHQgaW4gYSlhW3RdLmhhc093blByb3BlcnR5KGUpJiYoKHU9e30pW3RdPWUpO2U9dX1mb3IoaSBpbiBzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4uaGFzT3duUHJvcGVydHkoZSk/KHQ/by89bltlXS9uW3JdOm8qPW5bZV0vbltyXSxyKTplfSxlKWUuaGFzT3duUHJvcGVydHkoaSkmJihyPWVbaV0sbj1hW2ldLGwubWFwKHMpKTtyZXR1cm4gbC5jYW5jZWwoKSxuZXcgZWUobyxsKX19KTt2YXIgdGU9ZyxpZT1mdW5jdGlvbihlLHQsaSl7dGhpcy5vcD1lLnRyaW0oKSx0aGlzLm9wZXJhbmRzPXQsdGhpcy5pc1NwYWNlZD1pfTtpZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiT3BlcmF0aW9uIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5vcGVyYW5kcz1lLnZpc2l0QXJyYXkodGhpcy5vcGVyYW5kcyl9LGV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsaT10aGlzLm9wZXJhbmRzWzBdLmV2YWwoZSksbj10aGlzLm9wZXJhbmRzWzFdLmV2YWwoZSk7aWYoZS5pc01hdGhPbih0aGlzLm9wKSl7aWYodD0iLi8iPT09dGhpcy5vcD8iLyI6dGhpcy5vcCxpIGluc3RhbmNlb2YgZWUmJm4gaW5zdGFuY2VvZiBjJiYoaT1pLnRvQ29sb3IoKSksbiBpbnN0YW5jZW9mIGVlJiZpIGluc3RhbmNlb2YgYyYmKG49bi50b0NvbG9yKCkpLCFpLm9wZXJhdGV8fCFuLm9wZXJhdGUpe2lmKChpIGluc3RhbmNlb2YgaWV8fG4gaW5zdGFuY2VvZiBpZSkmJiIvIj09PWkub3AmJmUubWF0aD09PXRlLlBBUkVOU19ESVZJU0lPTilyZXR1cm4gbmV3IGllKHRoaXMub3AsW2ksbl0sdGhpcy5pc1NwYWNlZCk7dGhyb3d7dHlwZToiT3BlcmF0aW9uIixtZXNzYWdlOiJPcGVyYXRpb24gb24gYW4gaW52YWxpZCB0eXBlIn19cmV0dXJuIGkub3BlcmF0ZShlLHQsbil9cmV0dXJuIG5ldyBpZSh0aGlzLm9wLFtpLG5dLHRoaXMuaXNTcGFjZWQpfSxnZW5DU1M6ZnVuY3Rpb24oZSx0KXt0aGlzLm9wZXJhbmRzWzBdLmdlbkNTUyhlLHQpLHRoaXMuaXNTcGFjZWQmJnQuYWRkKCIgIiksdC5hZGQodGhpcy5vcCksdGhpcy5pc1NwYWNlZCYmdC5hZGQoIiAiKSx0aGlzLm9wZXJhbmRzWzFdLmdlbkNTUyhlLHQpfX0pO3ZhciBuZT1mdW5jdGlvbihlLHQpe2lmKHRoaXMudmFsdWU9ZSx0aGlzLm5vU3BhY2luZz10LCFlKXRocm93IG5ldyBFcnJvcigiRXhwcmVzc2lvbiByZXF1aXJlcyBhbiBhcnJheSBwYXJhbWV0ZXIiKX07bmUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IkV4cHJlc3Npb24iLGFjY2VwdDpmdW5jdGlvbihlKXt0aGlzLnZhbHVlPWUudmlzaXRBcnJheSh0aGlzLnZhbHVlKX0sZXZhbDpmdW5jdGlvbihlKXt2YXIgdCxpPWUuaXNNYXRoT24oKSxuPXRoaXMucGFyZW5zLHI9ITE7cmV0dXJuIG4mJmUuaW5QYXJlbnRoZXNpcygpLHRoaXMudmFsdWUubGVuZ3RoPjE/dD1uZXcgbmUodGhpcy52YWx1ZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmV2YWw/dC5ldmFsKGUpOnR9KSksdGhpcy5ub1NwYWNpbmcpOjE9PT10aGlzLnZhbHVlLmxlbmd0aD8oIXRoaXMudmFsdWVbMF0ucGFyZW5zfHx0aGlzLnZhbHVlWzBdLnBhcmVuc0luT3B8fGUuaW5DYWxjfHwocj0hMCksdD10aGlzLnZhbHVlWzBdLmV2YWwoZSkpOnQ9dGhpcyxuJiZlLm91dE9mUGFyZW50aGVzaXMoKSwhdGhpcy5wYXJlbnN8fCF0aGlzLnBhcmVuc0luT3B8fGl8fHJ8fHQgaW5zdGFuY2VvZiBlZXx8KHQ9bmV3IHAodCkpLHR9LGdlbkNTUzpmdW5jdGlvbihlLHQpe2Zvcih2YXIgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7aSsrKXRoaXMudmFsdWVbaV0uZ2VuQ1NTKGUsdCksIXRoaXMubm9TcGFjaW5nJiZpKzE8dGhpcy52YWx1ZS5sZW5ndGgmJnQuYWRkKCIgIil9LHRocm93QXdheUNvbW1lbnRzOmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLnZhbHVlLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIShlIGluc3RhbmNlb2YgVSl9KSl9fSk7dmFyIHJlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsaSxuKXt0aGlzLm5hbWU9ZS50b0xvd2VyQ2FzZSgpLHRoaXMuaW5kZXg9aSx0aGlzLmNvbnRleHQ9dCx0aGlzLmN1cnJlbnRGaWxlSW5mbz1uLHRoaXMuZnVuYz10LmZyYW1lc1swXS5mdW5jdGlvblJlZ2lzdHJ5LmdldCh0aGlzLm5hbWUpfXJldHVybiBlLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5mdW5jKX0sZS5wcm90b3R5cGUuY2FsbD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO0FycmF5LmlzQXJyYXkoZSl8fChlPVtlXSk7dmFyIGk9dGhpcy5mdW5jLmV2YWxBcmdzOyExIT09aSYmKGU9ZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmV2YWwodC5jb250ZXh0KX0pKSk7dmFyIG49ZnVuY3Rpb24oZSl7cmV0dXJuISgiQ29tbWVudCI9PT1lLnR5cGUpfTtyZXR1cm4gZT1lLmZpbHRlcihuKS5tYXAoKGZ1bmN0aW9uKGUpe2lmKCJFeHByZXNzaW9uIj09PWUudHlwZSl7dmFyIHQ9ZS52YWx1ZS5maWx0ZXIobik7cmV0dXJuIDE9PT10Lmxlbmd0aD9lLnBhcmVucyYmIi8iPT09dFswXS5vcD9lOnRbMF06bmV3IG5lKHQpfXJldHVybiBlfSkpLCExPT09aT90aGlzLmZ1bmMuYXBwbHkodGhpcyxmdW5jdGlvbihlLHQsaSl7aWYoaXx8Mj09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKHZhciBuLHI9MCxzPXQubGVuZ3RoO3I8cztyKyspIW4mJnIgaW4gdHx8KG58fChuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQsMCxyKSksbltyXT10W3JdKTtyZXR1cm4gZS5jb25jYXQobnx8dCl9KFt0aGlzLmNvbnRleHRdLGUpKTp0aGlzLmZ1bmMuYXBwbHkodGhpcyxlKX0sZX0oKSxzZT1mdW5jdGlvbihlLHQsaSxuKXt0aGlzLm5hbWU9ZSx0aGlzLmFyZ3M9dCx0aGlzLmNhbGM9ImNhbGMiPT09ZSx0aGlzLl9pbmRleD1pLHRoaXMuX2ZpbGVJbmZvPW59O3NlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJDYWxsIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5hcmdzJiYodGhpcy5hcmdzPWUudmlzaXRBcnJheSh0aGlzLmFyZ3MpKX0sZXZhbDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLGk9ZS5tYXRoT247ZS5tYXRoT249IXRoaXMuY2FsYywodGhpcy5jYWxjfHxlLmluQ2FsYykmJmUuZW50ZXJDYWxjKCk7dmFyIG4scj1mdW5jdGlvbigpeyh0LmNhbGN8fGUuaW5DYWxjKSYmZS5leGl0Q2FsYygpLGUubWF0aE9uPWl9LHM9bmV3IHJlKHRoaXMubmFtZSxlLHRoaXMuZ2V0SW5kZXgoKSx0aGlzLmZpbGVJbmZvKCkpO2lmKHMuaXNWYWxpZCgpKXRyeXtuPXMuY2FsbCh0aGlzLmFyZ3MpLHIoKX1jYXRjaChlKXtpZihlLmhhc093blByb3BlcnR5KCJsaW5lIikmJmUuaGFzT3duUHJvcGVydHkoImNvbHVtbiIpKXRocm93IGU7dGhyb3d7dHlwZTplLnR5cGV8fCJSdW50aW1lIixtZXNzYWdlOiJFcnJvciBldmFsdWF0aW5nIGZ1bmN0aW9uIGAiK3RoaXMubmFtZSsiYCIrKGUubWVzc2FnZT8iOiAiK2UubWVzc2FnZToiIiksaW5kZXg6dGhpcy5nZXRJbmRleCgpLGZpbGVuYW1lOnRoaXMuZmlsZUluZm8oKS5maWxlbmFtZSxsaW5lOmUubGluZU51bWJlcixjb2x1bW46ZS5jb2x1bW5OdW1iZXJ9fWlmKG51bGwhPW4pcmV0dXJuIG4gaW5zdGFuY2VvZiB1fHwobj1uZXcgaihuJiYhMCE9PW4/bi50b1N0cmluZygpOm51bGwpKSxuLl9pbmRleD10aGlzLl9pbmRleCxuLl9maWxlSW5mbz10aGlzLl9maWxlSW5mbyxuO3ZhciBvPXRoaXMuYXJncy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmV2YWwoZSl9KSk7cmV0dXJuIHIoKSxuZXcgc2UodGhpcy5uYW1lLG8sdGhpcy5nZXRJbmRleCgpLHRoaXMuZmlsZUluZm8oKSl9LGdlbkNTUzpmdW5jdGlvbihlLHQpe3QuYWRkKHRoaXMubmFtZSsiKCIsdGhpcy5maWxlSW5mbygpLHRoaXMuZ2V0SW5kZXgoKSk7Zm9yKHZhciBpPTA7aTx0aGlzLmFyZ3MubGVuZ3RoO2krKyl0aGlzLmFyZ3NbaV0uZ2VuQ1NTKGUsdCksaSsxPHRoaXMuYXJncy5sZW5ndGgmJnQuYWRkKCIsICIpO3QuYWRkKCIpIil9fSk7dmFyIG9lPWZ1bmN0aW9uKGUsdCxpKXt0aGlzLm5hbWU9ZSx0aGlzLl9pbmRleD10LHRoaXMuX2ZpbGVJbmZvPWl9O29lLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJWYXJpYWJsZSIsZXZhbDpmdW5jdGlvbihlKXt2YXIgdCxpPXRoaXMubmFtZTtpZigwPT09aS5pbmRleE9mKCJAQCIpJiYoaT0iQCIrbmV3IG9lKGkuc2xpY2UoMSksdGhpcy5nZXRJbmRleCgpLHRoaXMuZmlsZUluZm8oKSkuZXZhbChlKS52YWx1ZSksdGhpcy5ldmFsdWF0aW5nKXRocm93e3R5cGU6Ik5hbWUiLG1lc3NhZ2U6IlJlY3Vyc2l2ZSB2YXJpYWJsZSBkZWZpbml0aW9uIGZvciAiK2ksZmlsZW5hbWU6dGhpcy5maWxlSW5mbygpLmZpbGVuYW1lLGluZGV4OnRoaXMuZ2V0SW5kZXgoKX07aWYodGhpcy5ldmFsdWF0aW5nPSEwLHQ9dGhpcy5maW5kKGUuZnJhbWVzLChmdW5jdGlvbih0KXt2YXIgbj10LnZhcmlhYmxlKGkpO2lmKG4pe2lmKG4uaW1wb3J0YW50KWUuaW1wb3J0YW50U2NvcGVbZS5pbXBvcnRhbnRTY29wZS5sZW5ndGgtMV0uaW1wb3J0YW50PW4uaW1wb3J0YW50O3JldHVybiBlLmluQ2FsYz9uZXcgc2UoIl9TRUxGIixbbi52YWx1ZV0pLmV2YWwoZSk6bi52YWx1ZS5ldmFsKGUpfX0pKSlyZXR1cm4gdGhpcy5ldmFsdWF0aW5nPSExLHQ7dGhyb3d7dHlwZToiTmFtZSIsbWVzc2FnZToidmFyaWFibGUgIitpKyIgaXMgdW5kZWZpbmVkIixmaWxlbmFtZTp0aGlzLmZpbGVJbmZvKCkuZmlsZW5hbWUsaW5kZXg6dGhpcy5nZXRJbmRleCgpfX0sZmluZDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgaT0wLG49dm9pZCAwO2k8ZS5sZW5ndGg7aSsrKWlmKG49dC5jYWxsKGUsZVtpXSkpcmV0dXJuIG47cmV0dXJuIG51bGx9fSk7dmFyIGFlPWZ1bmN0aW9uKGUsdCxpKXt0aGlzLm5hbWU9ZSx0aGlzLl9pbmRleD10LHRoaXMuX2ZpbGVJbmZvPWl9O2FlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJQcm9wZXJ0eSIsZXZhbDpmdW5jdGlvbihlKXt2YXIgdCxpPXRoaXMubmFtZSxuPWUucGx1Z2luTWFuYWdlci5sZXNzLnZpc2l0b3JzLlRvQ1NTVmlzaXRvci5wcm90b3R5cGUuX21lcmdlUnVsZXM7aWYodGhpcy5ldmFsdWF0aW5nKXRocm93e3R5cGU6Ik5hbWUiLG1lc3NhZ2U6IlJlY3Vyc2l2ZSBwcm9wZXJ0eSByZWZlcmVuY2UgZm9yICIraSxmaWxlbmFtZTp0aGlzLmZpbGVJbmZvKCkuZmlsZW5hbWUsaW5kZXg6dGhpcy5nZXRJbmRleCgpfTtpZih0aGlzLmV2YWx1YXRpbmc9ITAsdD10aGlzLmZpbmQoZS5mcmFtZXMsKGZ1bmN0aW9uKHQpe3ZhciByLHM9dC5wcm9wZXJ0eShpKTtpZihzKXtmb3IodmFyIG89MDtvPHMubGVuZ3RoO28rKylyPXNbb10sc1tvXT1uZXcgRChyLm5hbWUsci52YWx1ZSxyLmltcG9ydGFudCxyLm1lcmdlLHIuaW5kZXgsci5jdXJyZW50RmlsZUluZm8sci5pbmxpbmUsci52YXJpYWJsZSk7aWYobihzKSwocj1zW3MubGVuZ3RoLTFdKS5pbXBvcnRhbnQpZS5pbXBvcnRhbnRTY29wZVtlLmltcG9ydGFudFNjb3BlLmxlbmd0aC0xXS5pbXBvcnRhbnQ9ci5pbXBvcnRhbnQ7cmV0dXJuIHI9ci52YWx1ZS5ldmFsKGUpfX0pKSlyZXR1cm4gdGhpcy5ldmFsdWF0aW5nPSExLHQ7dGhyb3d7dHlwZToiTmFtZSIsbWVzc2FnZToiUHJvcGVydHkgJyIraSsiJyBpcyB1bmRlZmluZWQiLGZpbGVuYW1lOnRoaXMuY3VycmVudEZpbGVJbmZvLmZpbGVuYW1lLGluZGV4OnRoaXMuaW5kZXh9fSxmaW5kOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBpPTAsbj12b2lkIDA7aTxlLmxlbmd0aDtpKyspaWYobj10LmNhbGwoZSxlW2ldKSlyZXR1cm4gbjtyZXR1cm4gbnVsbH19KTt2YXIgbGU9ZnVuY3Rpb24oZSx0LGkpe3RoaXMua2V5PWUsdGhpcy5vcD10LHRoaXMudmFsdWU9aX07bGUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IkF0dHJpYnV0ZSIsZXZhbDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGxlKHRoaXMua2V5LmV2YWw/dGhpcy5rZXkuZXZhbChlKTp0aGlzLmtleSx0aGlzLm9wLHRoaXMudmFsdWUmJnRoaXMudmFsdWUuZXZhbD90aGlzLnZhbHVlLmV2YWwoZSk6dGhpcy52YWx1ZSl9LGdlbkNTUzpmdW5jdGlvbihlLHQpe3QuYWRkKHRoaXMudG9DU1MoZSkpfSx0b0NTUzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmtleS50b0NTUz90aGlzLmtleS50b0NTUyhlKTp0aGlzLmtleTtyZXR1cm4gdGhpcy5vcCYmKHQrPXRoaXMub3AsdCs9dGhpcy52YWx1ZS50b0NTUz90aGlzLnZhbHVlLnRvQ1NTKGUpOnRoaXMudmFsdWUpLCJbIit0KyJdIn19KTt2YXIgdWU9ZnVuY3Rpb24oZSx0LGksbixyKXt0aGlzLmVzY2FwZWQ9bnVsbD09aXx8aSx0aGlzLnZhbHVlPXR8fCIiLHRoaXMucXVvdGU9ZS5jaGFyQXQoMCksdGhpcy5faW5kZXg9bix0aGlzLl9maWxlSW5mbz1yLHRoaXMudmFyaWFibGVSZWdleD0vQFx7KFtcdy1dKylcfS9nLHRoaXMucHJvcFJlZ2V4PS9cJFx7KFtcdy1dKylcfS9nLHRoaXMuYWxsb3dSb290PWl9O3VlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJRdW90ZWQiLGdlbkNTUzpmdW5jdGlvbihlLHQpe3RoaXMuZXNjYXBlZHx8dC5hZGQodGhpcy5xdW90ZSx0aGlzLmZpbGVJbmZvKCksdGhpcy5nZXRJbmRleCgpKSx0LmFkZCh0aGlzLnZhbHVlKSx0aGlzLmVzY2FwZWR8fHQuYWRkKHRoaXMucXVvdGUpfSxjb250YWluc1ZhcmlhYmxlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlLm1hdGNoKHRoaXMudmFyaWFibGVSZWdleCl9LGV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxpPXRoaXMudmFsdWU7ZnVuY3Rpb24gbihlLHQsaSl7dmFyIG49ZTtkb3tlPW4udG9TdHJpbmcoKSxuPWUucmVwbGFjZSh0LGkpfXdoaWxlKGUhPT1uKTtyZXR1cm4gbn1yZXR1cm4gaT1uKGksdGhpcy52YXJpYWJsZVJlZ2V4LChmdW5jdGlvbihpLG4pe3ZhciByPW5ldyBvZSgiQCIrbix0LmdldEluZGV4KCksdC5maWxlSW5mbygpKS5ldmFsKGUsITApO3JldHVybiByIGluc3RhbmNlb2YgdWU/ci52YWx1ZTpyLnRvQ1NTKCl9KSksaT1uKGksdGhpcy5wcm9wUmVnZXgsKGZ1bmN0aW9uKGksbil7dmFyIHI9bmV3IGFlKCIkIituLHQuZ2V0SW5kZXgoKSx0LmZpbGVJbmZvKCkpLmV2YWwoZSwhMCk7cmV0dXJuIHIgaW5zdGFuY2VvZiB1ZT9yLnZhbHVlOnIudG9DU1MoKX0pKSxuZXcgdWUodGhpcy5xdW90ZStpK3RoaXMucXVvdGUsaSx0aGlzLmVzY2FwZWQsdGhpcy5nZXRJbmRleCgpLHRoaXMuZmlsZUluZm8oKSl9LGNvbXBhcmU6ZnVuY3Rpb24oZSl7cmV0dXJuIlF1b3RlZCIhPT1lLnR5cGV8fHRoaXMuZXNjYXBlZHx8ZS5lc2NhcGVkP2UudG9DU1MmJnRoaXMudG9DU1MoKT09PWUudG9DU1MoKT8wOnZvaWQgMDp1Lm51bWVyaWNDb21wYXJlKHRoaXMudmFsdWUsZS52YWx1ZSl9fSk7dmFyIGNlPWZ1bmN0aW9uKGUsdCxpLG4pe3RoaXMudmFsdWU9ZSx0aGlzLl9pbmRleD10LHRoaXMuX2ZpbGVJbmZvPWksdGhpcy5pc0V2YWxkPW59O2NlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJVcmwiLGFjY2VwdDpmdW5jdGlvbihlKXt0aGlzLnZhbHVlPWUudmlzaXQodGhpcy52YWx1ZSl9LGdlbkNTUzpmdW5jdGlvbihlLHQpe3QuYWRkKCJ1cmwoIiksdGhpcy52YWx1ZS5nZW5DU1MoZSx0KSx0LmFkZCgiKSIpfSxldmFsOmZ1bmN0aW9uKGUpe3ZhciB0LGk9dGhpcy52YWx1ZS5ldmFsKGUpO2lmKCF0aGlzLmlzRXZhbGQmJigic3RyaW5nIj09dHlwZW9mKHQ9dGhpcy5maWxlSW5mbygpJiZ0aGlzLmZpbGVJbmZvKCkucm9vdHBhdGgpJiYic3RyaW5nIj09dHlwZW9mIGkudmFsdWUmJmUucGF0aFJlcXVpcmVzUmV3cml0ZShpLnZhbHVlKT8oaS5xdW90ZXx8KHQ9dC5yZXBsYWNlKC9bXChcKSciXHNdL2csKGZ1bmN0aW9uKGUpe3JldHVybiJcXCIrZX0pKSksaS52YWx1ZT1lLnJld3JpdGVQYXRoKGkudmFsdWUsdCkpOmkudmFsdWU9ZS5ub3JtYWxpemVQYXRoKGkudmFsdWUpLGUudXJsQXJncyYmIWkudmFsdWUubWF0Y2goL15ccypkYXRhOi8pKSl7dmFyIG49KC0xPT09aS52YWx1ZS5pbmRleE9mKCI/Iik/Ij8iOiImIikrZS51cmxBcmdzOy0xIT09aS52YWx1ZS5pbmRleE9mKCIjIik/aS52YWx1ZT1pLnZhbHVlLnJlcGxhY2UoIiMiLG4rIiMiKTppLnZhbHVlKz1ufXJldHVybiBuZXcgY2UoaSx0aGlzLmdldEluZGV4KCksdGhpcy5maWxlSW5mbygpLCEwKX19KTt2YXIgaGU9ZnVuY3Rpb24oZSx0LGksbixyKXt0aGlzLl9pbmRleD1pLHRoaXMuX2ZpbGVJbmZvPW47dmFyIHM9bmV3IEYoW10sbnVsbCxudWxsLHRoaXMuX2luZGV4LHRoaXMuX2ZpbGVJbmZvKS5jcmVhdGVFbXB0eVNlbGVjdG9ycygpO3RoaXMuZmVhdHVyZXM9bmV3ICQodCksdGhpcy5ydWxlcz1bbmV3IEsocyxlKV0sdGhpcy5ydWxlc1swXS5hbGxvd0ltcG9ydHM9ITAsdGhpcy5jb3B5VmlzaWJpbGl0eUluZm8ociksdGhpcy5hbGxvd1Jvb3Q9ITAsdGhpcy5zZXRQYXJlbnQocyx0aGlzKSx0aGlzLnNldFBhcmVudCh0aGlzLmZlYXR1cmVzLHRoaXMpLHRoaXMuc2V0UGFyZW50KHRoaXMucnVsZXMsdGhpcyl9O2hlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyBaLHt0eXBlOiJNZWRpYSIsaXNSdWxlc2V0TGlrZTpmdW5jdGlvbigpe3JldHVybiEwfSxhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5mZWF0dXJlcyYmKHRoaXMuZmVhdHVyZXM9ZS52aXNpdCh0aGlzLmZlYXR1cmVzKSksdGhpcy5ydWxlcyYmKHRoaXMucnVsZXM9ZS52aXNpdEFycmF5KHRoaXMucnVsZXMpKX0sZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dC5hZGQoIkBtZWRpYSAiLHRoaXMuX2ZpbGVJbmZvLHRoaXMuX2luZGV4KSx0aGlzLmZlYXR1cmVzLmdlbkNTUyhlLHQpLHRoaXMub3V0cHV0UnVsZXNldChlLHQsdGhpcy5ydWxlcyl9LGV2YWw6ZnVuY3Rpb24oZSl7ZS5tZWRpYUJsb2Nrc3x8KGUubWVkaWFCbG9ja3M9W10sZS5tZWRpYVBhdGg9W10pO3ZhciB0PW5ldyBoZShudWxsLFtdLHRoaXMuX2luZGV4LHRoaXMuX2ZpbGVJbmZvLHRoaXMudmlzaWJpbGl0eUluZm8oKSk7cmV0dXJuIHRoaXMuZGVidWdJbmZvJiYodGhpcy5ydWxlc1swXS5kZWJ1Z0luZm89dGhpcy5kZWJ1Z0luZm8sdC5kZWJ1Z0luZm89dGhpcy5kZWJ1Z0luZm8pLHQuZmVhdHVyZXM9dGhpcy5mZWF0dXJlcy5ldmFsKGUpLGUubWVkaWFQYXRoLnB1c2godCksZS5tZWRpYUJsb2Nrcy5wdXNoKHQpLHRoaXMucnVsZXNbMF0uZnVuY3Rpb25SZWdpc3RyeT1lLmZyYW1lc1swXS5mdW5jdGlvblJlZ2lzdHJ5LmluaGVyaXQoKSxlLmZyYW1lcy51bnNoaWZ0KHRoaXMucnVsZXNbMF0pLHQucnVsZXM9W3RoaXMucnVsZXNbMF0uZXZhbChlKV0sZS5mcmFtZXMuc2hpZnQoKSxlLm1lZGlhUGF0aC5wb3AoKSwwPT09ZS5tZWRpYVBhdGgubGVuZ3RoP3QuZXZhbFRvcChlKTp0LmV2YWxOZXN0ZWQoZSl9LGV2YWxUb3A6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZihlLm1lZGlhQmxvY2tzLmxlbmd0aD4xKXt2YXIgaT1uZXcgRihbXSxudWxsLG51bGwsdGhpcy5nZXRJbmRleCgpLHRoaXMuZmlsZUluZm8oKSkuY3JlYXRlRW1wdHlTZWxlY3RvcnMoKTsodD1uZXcgSyhpLGUubWVkaWFCbG9ja3MpKS5tdWx0aU1lZGlhPSEwLHQuY29weVZpc2liaWxpdHlJbmZvKHRoaXMudmlzaWJpbGl0eUluZm8oKSksdGhpcy5zZXRQYXJlbnQodCx0aGlzKX1yZXR1cm4gZGVsZXRlIGUubWVkaWFCbG9ja3MsZGVsZXRlIGUubWVkaWFQYXRoLHR9LGV2YWxOZXN0ZWQ6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuPWUubWVkaWFQYXRoLmNvbmNhdChbdGhpc10pO2Zvcih0PTA7dDxuLmxlbmd0aDt0KyspaT1uW3RdLmZlYXR1cmVzIGluc3RhbmNlb2YgJD9uW3RdLmZlYXR1cmVzLnZhbHVlOm5bdF0uZmVhdHVyZXMsblt0XT1BcnJheS5pc0FycmF5KGkpP2k6W2ldO3JldHVybiB0aGlzLmZlYXR1cmVzPW5ldyAkKHRoaXMucGVybXV0ZShuKS5tYXAoKGZ1bmN0aW9uKGUpe2ZvcihlPWUubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS50b0NTUz9lOm5ldyBqKGUpfSkpLHQ9ZS5sZW5ndGgtMTt0PjA7dC0tKWUuc3BsaWNlKHQsMCxuZXcgaigiYW5kIikpO3JldHVybiBuZXcgbmUoZSl9KSkpLHRoaXMuc2V0UGFyZW50KHRoaXMuZmVhdHVyZXMsdGhpcyksbmV3IEsoW10sW10pfSxwZXJtdXRlOmZ1bmN0aW9uKGUpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm5bXTtpZigxPT09ZS5sZW5ndGgpcmV0dXJuIGVbMF07Zm9yKHZhciB0PVtdLGk9dGhpcy5wZXJtdXRlKGUuc2xpY2UoMSkpLG49MDtuPGkubGVuZ3RoO24rKylmb3IodmFyIHI9MDtyPGVbMF0ubGVuZ3RoO3IrKyl0LnB1c2goW2VbMF1bcl1dLmNvbmNhdChpW25dKSk7cmV0dXJuIHR9LGJ1YmJsZVNlbGVjdG9yczpmdW5jdGlvbihlKXtlJiYodGhpcy5ydWxlcz1bbmV3IEsoayhlKSxbdGhpcy5ydWxlc1swXV0pXSx0aGlzLnNldFBhcmVudCh0aGlzLnJ1bGVzLHRoaXMpKX19KTt2YXIgZmU9ZnVuY3Rpb24oZSx0LGksbixyLHMpe2lmKHRoaXMub3B0aW9ucz1pLHRoaXMuX2luZGV4PW4sdGhpcy5fZmlsZUluZm89cix0aGlzLnBhdGg9ZSx0aGlzLmZlYXR1cmVzPXQsdGhpcy5hbGxvd1Jvb3Q9ITAsdm9pZCAwIT09dGhpcy5vcHRpb25zLmxlc3N8fHRoaXMub3B0aW9ucy5pbmxpbmUpdGhpcy5jc3M9IXRoaXMub3B0aW9ucy5sZXNzfHx0aGlzLm9wdGlvbnMuaW5saW5lO2Vsc2V7dmFyIG89dGhpcy5nZXRQYXRoKCk7byYmL1sjXC5cJlw/XWNzcyhbXD87XS4qKT8kLy50ZXN0KG8pJiYodGhpcy5jc3M9ITApfXRoaXMuY29weVZpc2liaWxpdHlJbmZvKHMpLHRoaXMuc2V0UGFyZW50KHRoaXMuZmVhdHVyZXMsdGhpcyksdGhpcy5zZXRQYXJlbnQodGhpcy5wYXRoLHRoaXMpfTtmZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiSW1wb3J0IixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5mZWF0dXJlcyYmKHRoaXMuZmVhdHVyZXM9ZS52aXNpdCh0aGlzLmZlYXR1cmVzKSksdGhpcy5wYXRoPWUudmlzaXQodGhpcy5wYXRoKSx0aGlzLm9wdGlvbnMuaXNQbHVnaW58fHRoaXMub3B0aW9ucy5pbmxpbmV8fCF0aGlzLnJvb3R8fCh0aGlzLnJvb3Q9ZS52aXNpdCh0aGlzLnJvb3QpKX0sZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dGhpcy5jc3MmJnZvaWQgMD09PXRoaXMucGF0aC5fZmlsZUluZm8ucmVmZXJlbmNlJiYodC5hZGQoIkBpbXBvcnQgIix0aGlzLl9maWxlSW5mbyx0aGlzLl9pbmRleCksdGhpcy5wYXRoLmdlbkNTUyhlLHQpLHRoaXMuZmVhdHVyZXMmJih0LmFkZCgiICIpLHRoaXMuZmVhdHVyZXMuZ2VuQ1NTKGUsdCkpLHQuYWRkKCI7IikpfSxnZXRQYXRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGF0aCBpbnN0YW5jZW9mIGNlP3RoaXMucGF0aC52YWx1ZS52YWx1ZTp0aGlzLnBhdGgudmFsdWV9LGlzVmFyaWFibGVJbXBvcnQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBhdGg7cmV0dXJuIGUgaW5zdGFuY2VvZiBjZSYmKGU9ZS52YWx1ZSksIShlIGluc3RhbmNlb2YgdWUpfHxlLmNvbnRhaW5zVmFyaWFibGVzKCl9LGV2YWxGb3JJbXBvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wYXRoO3JldHVybiB0IGluc3RhbmNlb2YgY2UmJih0PXQudmFsdWUpLG5ldyBmZSh0LmV2YWwoZSksdGhpcy5mZWF0dXJlcyx0aGlzLm9wdGlvbnMsdGhpcy5faW5kZXgsdGhpcy5fZmlsZUluZm8sdGhpcy52aXNpYmlsaXR5SW5mbygpKX0sZXZhbFBhdGg6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wYXRoLmV2YWwoZSksaT10aGlzLl9maWxlSW5mbztpZighKHQgaW5zdGFuY2VvZiBjZSkpe3ZhciBuPXQudmFsdWU7aSYmbiYmZS5wYXRoUmVxdWlyZXNSZXdyaXRlKG4pP3QudmFsdWU9ZS5yZXdyaXRlUGF0aChuLGkucm9vdHBhdGgpOnQudmFsdWU9ZS5ub3JtYWxpemVQYXRoKHQudmFsdWUpfXJldHVybiB0fSxldmFsOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZG9FdmFsKGUpO3JldHVybih0aGlzLm9wdGlvbnMucmVmZXJlbmNlfHx0aGlzLmJsb2Nrc1Zpc2liaWxpdHkoKSkmJih0Lmxlbmd0aHx8MD09PXQubGVuZ3RoP3QuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5hZGRWaXNpYmlsaXR5QmxvY2soKX0pKTp0LmFkZFZpc2liaWxpdHlCbG9jaygpKSx0fSxkb0V2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuPXRoaXMuZmVhdHVyZXMmJnRoaXMuZmVhdHVyZXMuZXZhbChlKTtpZih0aGlzLm9wdGlvbnMuaXNQbHVnaW4pe2lmKHRoaXMucm9vdCYmdGhpcy5yb290LmV2YWwpdHJ5e3RoaXMucm9vdC5ldmFsKGUpfWNhdGNoKGUpe3Rocm93IGUubWVzc2FnZT0iUGx1Z2luIGVycm9yIGR1cmluZyBldmFsdWF0aW9uIixuZXcgTyhlLHRoaXMucm9vdC5pbXBvcnRzLHRoaXMucm9vdC5maWxlbmFtZSl9cmV0dXJuKGk9ZS5mcmFtZXNbMF0mJmUuZnJhbWVzWzBdLmZ1bmN0aW9uUmVnaXN0cnkpJiZ0aGlzLnJvb3QmJnRoaXMucm9vdC5mdW5jdGlvbnMmJmkuYWRkTXVsdGlwbGUodGhpcy5yb290LmZ1bmN0aW9ucyksW119aWYodGhpcy5za2lwJiYoImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuc2tpcCYmKHRoaXMuc2tpcD10aGlzLnNraXAoKSksdGhpcy5za2lwKSlyZXR1cm5bXTtpZih0aGlzLm9wdGlvbnMuaW5saW5lKXt2YXIgcj1uZXcgaih0aGlzLnJvb3QsMCx7ZmlsZW5hbWU6dGhpcy5pbXBvcnRlZEZpbGVuYW1lLHJlZmVyZW5jZTp0aGlzLnBhdGguX2ZpbGVJbmZvJiZ0aGlzLnBhdGguX2ZpbGVJbmZvLnJlZmVyZW5jZX0sITAsITApO3JldHVybiB0aGlzLmZlYXR1cmVzP25ldyBoZShbcl0sdGhpcy5mZWF0dXJlcy52YWx1ZSk6W3JdfWlmKHRoaXMuY3NzKXt2YXIgcz1uZXcgZmUodGhpcy5ldmFsUGF0aChlKSxuLHRoaXMub3B0aW9ucyx0aGlzLl9pbmRleCk7aWYoIXMuY3NzJiZ0aGlzLmVycm9yKXRocm93IHRoaXMuZXJyb3I7cmV0dXJuIHN9cmV0dXJuIHRoaXMucm9vdD8oKHQ9bmV3IEsobnVsbCxrKHRoaXMucm9vdC5ydWxlcykpKS5ldmFsSW1wb3J0cyhlKSx0aGlzLmZlYXR1cmVzP25ldyBoZSh0LnJ1bGVzLHRoaXMuZmVhdHVyZXMudmFsdWUpOnQucnVsZXMpOltdfX0pO3ZhciBwZT1mdW5jdGlvbigpe307cGUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse2V2YWx1YXRlSmF2YVNjcmlwdDpmdW5jdGlvbihlLHQpe3ZhciBpLG49dGhpcyxyPXt9O2lmKCF0LmphdmFzY3JpcHRFbmFibGVkKXRocm93e21lc3NhZ2U6IklubGluZSBKYXZhU2NyaXB0IGlzIG5vdCBlbmFibGVkLiBJcyBpdCBzZXQgaW4geW91ciBvcHRpb25zPyIsZmlsZW5hbWU6dGhpcy5maWxlSW5mbygpLmZpbGVuYW1lLGluZGV4OnRoaXMuZ2V0SW5kZXgoKX07ZT1lLnJlcGxhY2UoL0BceyhbXHctXSspXH0vZywoZnVuY3Rpb24oZSxpKXtyZXR1cm4gbi5qc2lmeShuZXcgb2UoIkAiK2ksbi5nZXRJbmRleCgpLG4uZmlsZUluZm8oKSkuZXZhbCh0KSl9KSk7dHJ5e2U9bmV3IEZ1bmN0aW9uKCJyZXR1cm4gKCIrZSsiKSIpfWNhdGNoKHQpe3Rocm93e21lc3NhZ2U6IkphdmFTY3JpcHQgZXZhbHVhdGlvbiBlcnJvcjogIit0Lm1lc3NhZ2UrIiBmcm9tIGAiK2UrImAiLGZpbGVuYW1lOnRoaXMuZmlsZUluZm8oKS5maWxlbmFtZSxpbmRleDp0aGlzLmdldEluZGV4KCl9fXZhciBzPXQuZnJhbWVzWzBdLnZhcmlhYmxlcygpO2Zvcih2YXIgbyBpbiBzKXMuaGFzT3duUHJvcGVydHkobykmJihyW28uc2xpY2UoMSldPXt2YWx1ZTpzW29dLnZhbHVlLHRvSlM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZS5ldmFsKHQpLnRvQ1NTKCl9fSk7dHJ5e2k9ZS5jYWxsKHIpfWNhdGNoKGUpe3Rocm93e21lc3NhZ2U6IkphdmFTY3JpcHQgZXZhbHVhdGlvbiBlcnJvcjogJyIrZS5uYW1lKyI6ICIrZS5tZXNzYWdlLnJlcGxhY2UoL1siXS9nLCInIikrIiciLGZpbGVuYW1lOnRoaXMuZmlsZUluZm8oKS5maWxlbmFtZSxpbmRleDp0aGlzLmdldEluZGV4KCl9fXJldHVybiBpfSxqc2lmeTpmdW5jdGlvbihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlLnZhbHVlKSYmZS52YWx1ZS5sZW5ndGg+MT8iWyIrZS52YWx1ZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvQ1NTKCl9KSkuam9pbigiLCAiKSsiXSI6ZS50b0NTUygpfX0pO3ZhciB2ZT1mdW5jdGlvbihlLHQsaSxuKXt0aGlzLmVzY2FwZWQ9dCx0aGlzLmV4cHJlc3Npb249ZSx0aGlzLl9pbmRleD1pLHRoaXMuX2ZpbGVJbmZvPW59O3ZlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyBwZSx7dHlwZToiSmF2YVNjcmlwdCIsZXZhbDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmV2YWx1YXRlSmF2YVNjcmlwdCh0aGlzLmV4cHJlc3Npb24sZSksaT10eXBlb2YgdDtyZXR1cm4ibnVtYmVyIiE9PWl8fGlzTmFOKHQpPyJzdHJpbmciPT09aT9uZXcgdWUoJyInK3QrJyInLHQsdGhpcy5lc2NhcGVkLHRoaXMuX2luZGV4KTpBcnJheS5pc0FycmF5KHQpP25ldyBqKHQuam9pbigiLCAiKSk6bmV3IGoodCk6bmV3IGVlKHQpfX0pO3ZhciBkZT1mdW5jdGlvbihlLHQpe3RoaXMua2V5PWUsdGhpcy52YWx1ZT10fTtkZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiQXNzaWdubWVudCIsYWNjZXB0OmZ1bmN0aW9uKGUpe3RoaXMudmFsdWU9ZS52aXNpdCh0aGlzLnZhbHVlKX0sZXZhbDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy52YWx1ZS5ldmFsP25ldyBkZSh0aGlzLmtleSx0aGlzLnZhbHVlLmV2YWwoZSkpOnRoaXN9LGdlbkNTUzpmdW5jdGlvbihlLHQpe3QuYWRkKHRoaXMua2V5KyI9IiksdGhpcy52YWx1ZS5nZW5DU1M/dGhpcy52YWx1ZS5nZW5DU1MoZSx0KTp0LmFkZCh0aGlzLnZhbHVlKX19KTt2YXIgbWU9ZnVuY3Rpb24oZSx0LGksbixyKXt0aGlzLm9wPWUudHJpbSgpLHRoaXMubHZhbHVlPXQsdGhpcy5ydmFsdWU9aSx0aGlzLl9pbmRleD1uLHRoaXMubmVnYXRlPXJ9O21lLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJDb25kaXRpb24iLGFjY2VwdDpmdW5jdGlvbihlKXt0aGlzLmx2YWx1ZT1lLnZpc2l0KHRoaXMubHZhbHVlKSx0aGlzLnJ2YWx1ZT1lLnZpc2l0KHRoaXMucnZhbHVlKX0sZXZhbDpmdW5jdGlvbihlKXt2YXIgdD1mdW5jdGlvbihlLHQsaSl7c3dpdGNoKGUpe2Nhc2UiYW5kIjpyZXR1cm4gdCYmaTtjYXNlIm9yIjpyZXR1cm4gdHx8aTtkZWZhdWx0OnN3aXRjaCh1LmNvbXBhcmUodCxpKSl7Y2FzZS0xOnJldHVybiI8Ij09PWV8fCI9PCI9PT1lfHwiPD0iPT09ZTtjYXNlIDA6cmV0dXJuIj0iPT09ZXx8Ij49Ij09PWV8fCI9PCI9PT1lfHwiPD0iPT09ZTtjYXNlIDE6cmV0dXJuIj4iPT09ZXx8Ij49Ij09PWU7ZGVmYXVsdDpyZXR1cm4hMX19fSh0aGlzLm9wLHRoaXMubHZhbHVlLmV2YWwoZSksdGhpcy5ydmFsdWUuZXZhbChlKSk7cmV0dXJuIHRoaXMubmVnYXRlPyF0OnR9fSk7dmFyIGdlPWZ1bmN0aW9uKGUpe3RoaXMudmFsdWU9ZX07Z2UucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IlVuaWNvZGVEZXNjcmlwdG9yIn0pO3ZhciB5ZT1mdW5jdGlvbihlKXt0aGlzLnZhbHVlPWV9O3llLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyB1LHt0eXBlOiJOZWdhdGl2ZSIsZ2VuQ1NTOmZ1bmN0aW9uKGUsdCl7dC5hZGQoIi0iKSx0aGlzLnZhbHVlLmdlbkNTUyhlLHQpfSxldmFsOmZ1bmN0aW9uKGUpe3JldHVybiBlLmlzTWF0aE9uKCk/bmV3IGllKCIqIixbbmV3IGVlKC0xKSx0aGlzLnZhbHVlXSkuZXZhbChlKTpuZXcgeWUodGhpcy52YWx1ZS5ldmFsKGUpKX19KTt2YXIgYmU9ZnVuY3Rpb24oZSx0LGksbixyKXtzd2l0Y2godGhpcy5zZWxlY3Rvcj1lLHRoaXMub3B0aW9uPXQsdGhpcy5vYmplY3RfaWQ9YmUubmV4dF9pZCsrLHRoaXMucGFyZW50X2lkcz1bdGhpcy5vYmplY3RfaWRdLHRoaXMuX2luZGV4PWksdGhpcy5fZmlsZUluZm89bix0aGlzLmNvcHlWaXNpYmlsaXR5SW5mbyhyKSx0aGlzLmFsbG93Um9vdD0hMCx0KXtjYXNlImFsbCI6dGhpcy5hbGxvd0JlZm9yZT0hMCx0aGlzLmFsbG93QWZ0ZXI9ITA7YnJlYWs7ZGVmYXVsdDp0aGlzLmFsbG93QmVmb3JlPSExLHRoaXMuYWxsb3dBZnRlcj0hMX10aGlzLnNldFBhcmVudCh0aGlzLnNlbGVjdG9yLHRoaXMpfTtiZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiRXh0ZW5kIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5zZWxlY3Rvcj1lLnZpc2l0KHRoaXMuc2VsZWN0b3IpfSxldmFsOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgYmUodGhpcy5zZWxlY3Rvci5ldmFsKGUpLHRoaXMub3B0aW9uLHRoaXMuZ2V0SW5kZXgoKSx0aGlzLmZpbGVJbmZvKCksdGhpcy52aXNpYmlsaXR5SW5mbygpKX0sY2xvbmU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBiZSh0aGlzLnNlbGVjdG9yLHRoaXMub3B0aW9uLHRoaXMuZ2V0SW5kZXgoKSx0aGlzLmZpbGVJbmZvKCksdGhpcy52aXNpYmlsaXR5SW5mbygpKX0sZmluZFNlbGZTZWxlY3RvcnM6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuPVtdO2Zvcih0PTA7dDxlLmxlbmd0aDt0KyspaT1lW3RdLmVsZW1lbnRzLHQ+MCYmaS5sZW5ndGgmJiIiPT09aVswXS5jb21iaW5hdG9yLnZhbHVlJiYoaVswXS5jb21iaW5hdG9yLnZhbHVlPSIgIiksbj1uLmNvbmNhdChlW3RdLmVsZW1lbnRzKTt0aGlzLnNlbGZTZWxlY3RvcnM9W25ldyBGKG4pXSx0aGlzLnNlbGZTZWxlY3RvcnNbMF0uY29weVZpc2liaWxpdHlJbmZvKHRoaXMudmlzaWJpbGl0eUluZm8oKSl9fSksYmUubmV4dF9pZD0wO3ZhciB3ZT1mdW5jdGlvbihlLHQsaSl7dGhpcy52YXJpYWJsZT1lLHRoaXMuX2luZGV4PXQsdGhpcy5fZmlsZUluZm89aSx0aGlzLmFsbG93Um9vdD0hMH07d2UucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6IlZhcmlhYmxlQ2FsbCIsZXZhbDpmdW5jdGlvbihlKXt2YXIgdCxpPW5ldyBvZSh0aGlzLnZhcmlhYmxlLHRoaXMuZ2V0SW5kZXgoKSx0aGlzLmZpbGVJbmZvKCkpLmV2YWwoZSksbj1uZXcgTyh7bWVzc2FnZToiQ291bGQgbm90IGV2YWx1YXRlIHZhcmlhYmxlIGNhbGwgIit0aGlzLnZhcmlhYmxlfSk7aWYoIWkucnVsZXNldCl7aWYoaS5ydWxlcyl0PWk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGkpKXQ9bmV3IEsoIiIsaSk7ZWxzZXtpZighQXJyYXkuaXNBcnJheShpLnZhbHVlKSl0aHJvdyBuO3Q9bmV3IEsoIiIsaS52YWx1ZSl9aT1uZXcgWCh0KX1pZihpLnJ1bGVzZXQpcmV0dXJuIGkuY2FsbEV2YWwoZSk7dGhyb3cgbn19KTt2YXIgeGU9ZnVuY3Rpb24oZSx0LGksbil7dGhpcy52YWx1ZT1lLHRoaXMubG9va3Vwcz10LHRoaXMuX2luZGV4PWksdGhpcy5fZmlsZUluZm89bn07eGUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24obmV3IHUse3R5cGU6Ik5hbWVzcGFjZVZhbHVlIixldmFsOmZ1bmN0aW9uKGUpe3ZhciB0LGksbj10aGlzLnZhbHVlLmV2YWwoZSk7Zm9yKHQ9MDt0PHRoaXMubG9va3Vwcy5sZW5ndGg7dCsrKXtpZihpPXRoaXMubG9va3Vwc1t0XSxBcnJheS5pc0FycmF5KG4pJiYobj1uZXcgSyhbbmV3IEZdLG4pKSwiIj09PWkpbj1uLmxhc3REZWNsYXJhdGlvbigpO2Vsc2UgaWYoIkAiPT09aS5jaGFyQXQoMCkpe2lmKCJAIj09PWkuY2hhckF0KDEpJiYoaT0iQCIrbmV3IG9lKGkuc3Vic3RyKDEpKS5ldmFsKGUpLnZhbHVlKSxuLnZhcmlhYmxlcyYmKG49bi52YXJpYWJsZShpKSksIW4pdGhyb3d7dHlwZToiTmFtZSIsbWVzc2FnZToidmFyaWFibGUgIitpKyIgbm90IGZvdW5kIixmaWxlbmFtZTp0aGlzLmZpbGVJbmZvKCkuZmlsZW5hbWUsaW5kZXg6dGhpcy5nZXRJbmRleCgpfX1lbHNle2lmKGk9IiRAIj09PWkuc3Vic3RyaW5nKDAsMik/IiQiK25ldyBvZShpLnN1YnN0cigxKSkuZXZhbChlKS52YWx1ZToiJCI9PT1pLmNoYXJBdCgwKT9pOiIkIitpLG4ucHJvcGVydGllcyYmKG49bi5wcm9wZXJ0eShpKSksIW4pdGhyb3d7dHlwZToiTmFtZSIsbWVzc2FnZToncHJvcGVydHkgIicraS5zdWJzdHIoMSkrJyIgbm90IGZvdW5kJyxmaWxlbmFtZTp0aGlzLmZpbGVJbmZvKCkuZmlsZW5hbWUsaW5kZXg6dGhpcy5nZXRJbmRleCgpfTtuPW5bbi5sZW5ndGgtMV19bi52YWx1ZSYmKG49bi5ldmFsKGUpLnZhbHVlKSxuLnJ1bGVzZXQmJihuPW4ucnVsZXNldC5ldmFsKGUpKX1yZXR1cm4gbn19KTt2YXIgU2U9ZnVuY3Rpb24oZSx0LGksbixyLHMsbyl7dGhpcy5uYW1lPWV8fCJhbm9ueW1vdXMgbWl4aW4iLHRoaXMuc2VsZWN0b3JzPVtuZXcgRihbbmV3IG0obnVsbCxlLCExLHRoaXMuX2luZGV4LHRoaXMuX2ZpbGVJbmZvKV0pXSx0aGlzLnBhcmFtcz10LHRoaXMuY29uZGl0aW9uPW4sdGhpcy52YXJpYWRpYz1yLHRoaXMuYXJpdHk9dC5sZW5ndGgsdGhpcy5ydWxlcz1pLHRoaXMuX2xvb2t1cHM9e307dmFyIGE9W107dGhpcy5yZXF1aXJlZD10LnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4hdC5uYW1lfHx0Lm5hbWUmJiF0LnZhbHVlP2UrMTooYS5wdXNoKHQubmFtZSksZSl9KSwwKSx0aGlzLm9wdGlvbmFsUGFyYW1ldGVycz1hLHRoaXMuZnJhbWVzPXMsdGhpcy5jb3B5VmlzaWJpbGl0eUluZm8obyksdGhpcy5hbGxvd1Jvb3Q9ITB9O1NlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyBLLHt0eXBlOiJNaXhpbkRlZmluaXRpb24iLGV2YWxGaXJzdDohMCxhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5wYXJhbXMmJnRoaXMucGFyYW1zLmxlbmd0aCYmKHRoaXMucGFyYW1zPWUudmlzaXRBcnJheSh0aGlzLnBhcmFtcykpLHRoaXMucnVsZXM9ZS52aXNpdEFycmF5KHRoaXMucnVsZXMpLHRoaXMuY29uZGl0aW9uJiYodGhpcy5jb25kaXRpb249ZS52aXNpdCh0aGlzLmNvbmRpdGlvbikpfSxldmFsUGFyYW1zOmZ1bmN0aW9uKGUsdCxpLG4pe3ZhciByLHMsbyxhLGwsdSxjLGgsZj1uZXcgSyhudWxsLG51bGwpLHA9ayh0aGlzLnBhcmFtcyksdj0wO2lmKHQuZnJhbWVzJiZ0LmZyYW1lc1swXSYmdC5mcmFtZXNbMF0uZnVuY3Rpb25SZWdpc3RyeSYmKGYuZnVuY3Rpb25SZWdpc3RyeT10LmZyYW1lc1swXS5mdW5jdGlvblJlZ2lzdHJ5LmluaGVyaXQoKSksdD1uZXcgcS5FdmFsKHQsW2ZdLmNvbmNhdCh0LmZyYW1lcykpLGkpZm9yKHY9KGk9ayhpKSkubGVuZ3RoLG89MDtvPHY7bysrKWlmKHU9KHM9aVtvXSkmJnMubmFtZSl7Zm9yKGM9ITEsYT0wO2E8cC5sZW5ndGg7YSsrKWlmKCFuW2FdJiZ1PT09cFthXS5uYW1lKXtuW2FdPXMudmFsdWUuZXZhbChlKSxmLnByZXBlbmRSdWxlKG5ldyBEKHUscy52YWx1ZS5ldmFsKGUpKSksYz0hMDticmVha31pZihjKXtpLnNwbGljZShvLDEpLG8tLTtjb250aW51ZX10aHJvd3t0eXBlOiJSdW50aW1lIixtZXNzYWdlOiJOYW1lZCBhcmd1bWVudCBmb3IgIit0aGlzLm5hbWUrIiAiK2lbb10ubmFtZSsiIG5vdCBmb3VuZCJ9fWZvcihoPTAsbz0wO288cC5sZW5ndGg7bysrKWlmKCFuW29dKXtpZihzPWkmJmlbaF0sdT1wW29dLm5hbWUpaWYocFtvXS52YXJpYWRpYyl7Zm9yKHI9W10sYT1oO2E8djthKyspci5wdXNoKGlbYV0udmFsdWUuZXZhbChlKSk7Zi5wcmVwZW5kUnVsZShuZXcgRCh1LG5ldyBuZShyKS5ldmFsKGUpKSl9ZWxzZXtpZihsPXMmJnMudmFsdWUpbD1BcnJheS5pc0FycmF5KGwpP25ldyBYKG5ldyBLKCIiLGwpKTpsLmV2YWwoZSk7ZWxzZXtpZighcFtvXS52YWx1ZSl0aHJvd3t0eXBlOiJSdW50aW1lIixtZXNzYWdlOiJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciAiK3RoaXMubmFtZSsiICgiK3YrIiBmb3IgIit0aGlzLmFyaXR5KyIpIn07bD1wW29dLnZhbHVlLmV2YWwodCksZi5yZXNldENhY2hlKCl9Zi5wcmVwZW5kUnVsZShuZXcgRCh1LGwpKSxuW29dPWx9aWYocFtvXS52YXJpYWRpYyYmaSlmb3IoYT1oO2E8djthKyspblthXT1pW2FdLnZhbHVlLmV2YWwoZSk7aCsrfXJldHVybiBmfSxtYWtlSW1wb3J0YW50OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ydWxlcz90aGlzLnJ1bGVzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUubWFrZUltcG9ydGFudD9lLm1ha2VJbXBvcnRhbnQoITApOmV9KSk6dGhpcy5ydWxlcztyZXR1cm4gbmV3IFNlKHRoaXMubmFtZSx0aGlzLnBhcmFtcyxlLHRoaXMuY29uZGl0aW9uLHRoaXMudmFyaWFkaWMsdGhpcy5mcmFtZXMpfSxldmFsOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgU2UodGhpcy5uYW1lLHRoaXMucGFyYW1zLHRoaXMucnVsZXMsdGhpcy5jb25kaXRpb24sdGhpcy52YXJpYWRpYyx0aGlzLmZyYW1lc3x8ayhlLmZyYW1lcykpfSxldmFsQ2FsbDpmdW5jdGlvbihlLHQsaSl7dmFyIG4scixzPVtdLG89dGhpcy5mcmFtZXM/dGhpcy5mcmFtZXMuY29uY2F0KGUuZnJhbWVzKTplLmZyYW1lcyxhPXRoaXMuZXZhbFBhcmFtcyhlLG5ldyBxLkV2YWwoZSxvKSx0LHMpO3JldHVybiBhLnByZXBlbmRSdWxlKG5ldyBEKCJAYXJndW1lbnRzIixuZXcgbmUocykuZXZhbChlKSkpLG49ayh0aGlzLnJ1bGVzKSwocj1uZXcgSyhudWxsLG4pKS5vcmlnaW5hbFJ1bGVzZXQ9dGhpcyxyPXIuZXZhbChuZXcgcS5FdmFsKGUsW3RoaXMsYV0uY29uY2F0KG8pKSksaSYmKHI9ci5tYWtlSW1wb3J0YW50KCkpLHJ9LG1hdGNoQ29uZGl0aW9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuISh0aGlzLmNvbmRpdGlvbiYmIXRoaXMuY29uZGl0aW9uLmV2YWwobmV3IHEuRXZhbCh0LFt0aGlzLmV2YWxQYXJhbXModCxuZXcgcS5FdmFsKHQsdGhpcy5mcmFtZXM/dGhpcy5mcmFtZXMuY29uY2F0KHQuZnJhbWVzKTp0LmZyYW1lcyksZSxbXSldLmNvbmNhdCh0aGlzLmZyYW1lc3x8W10pLmNvbmNhdCh0LmZyYW1lcykpKSl9LG1hdGNoQXJnczpmdW5jdGlvbihlLHQpe3ZhciBpLG49ZSYmZS5sZW5ndGh8fDAscj10aGlzLm9wdGlvbmFsUGFyYW1ldGVycyxzPWU/ZS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuaW5kZXhPZih0Lm5hbWUpPDA/ZSsxOmV9KSwwKTowO2lmKHRoaXMudmFyaWFkaWMpe2lmKHM8dGhpcy5yZXF1aXJlZC0xKXJldHVybiExfWVsc2V7aWYoczx0aGlzLnJlcXVpcmVkKXJldHVybiExO2lmKG4+dGhpcy5wYXJhbXMubGVuZ3RoKXJldHVybiExfWk9TWF0aC5taW4ocyx0aGlzLmFyaXR5KTtmb3IodmFyIG89MDtvPGk7bysrKWlmKCF0aGlzLnBhcmFtc1tvXS5uYW1lJiYhdGhpcy5wYXJhbXNbb10udmFyaWFkaWMmJmVbb10udmFsdWUuZXZhbCh0KS50b0NTUygpIT10aGlzLnBhcmFtc1tvXS52YWx1ZS5ldmFsKHQpLnRvQ1NTKCkpcmV0dXJuITE7cmV0dXJuITB9fSk7dmFyIEllPWZ1bmN0aW9uKGUsdCxpLG4scil7dGhpcy5zZWxlY3Rvcj1uZXcgRihlKSx0aGlzLmFyZ3VtZW50cz10fHxbXSx0aGlzLl9pbmRleD1pLHRoaXMuX2ZpbGVJbmZvPW4sdGhpcy5pbXBvcnRhbnQ9cix0aGlzLmFsbG93Um9vdD0hMCx0aGlzLnNldFBhcmVudCh0aGlzLnNlbGVjdG9yLHRoaXMpfTtJZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcgdSx7dHlwZToiTWl4aW5DYWxsIixhY2NlcHQ6ZnVuY3Rpb24oZSl7dGhpcy5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9ZS52aXNpdCh0aGlzLnNlbGVjdG9yKSksdGhpcy5hcmd1bWVudHMubGVuZ3RoJiYodGhpcy5hcmd1bWVudHM9ZS52aXNpdEFycmF5KHRoaXMuYXJndW1lbnRzKSl9LGV2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuLHIscyxvLGEsbCx1LGMsaCxmLHAsdixkLG09W10sZz1bXSx5PSExLGI9W10sdz1bXTtmdW5jdGlvbiB4KHQsaSl7dmFyIG4scixzO2ZvcihuPTA7bjwyO24rKyl7Zm9yKHdbbl09ITAsUS52YWx1ZShuKSxyPTA7cjxpLmxlbmd0aCYmd1tuXTtyKyspKHM9aVtyXSkubWF0Y2hDb25kaXRpb24mJih3W25dPXdbbl0mJnMubWF0Y2hDb25kaXRpb24obnVsbCxlKSk7dC5tYXRjaENvbmRpdGlvbiYmKHdbbl09d1tuXSYmdC5tYXRjaENvbmRpdGlvbihtLGUpKX1yZXR1cm4gd1swXXx8d1sxXT93WzBdIT13WzFdP3dbMV0/MToyOjA6LTF9Zm9yKHRoaXMuc2VsZWN0b3I9dGhpcy5zZWxlY3Rvci5ldmFsKGUpLG89MDtvPHRoaXMuYXJndW1lbnRzLmxlbmd0aDtvKyspaWYocz0ocj10aGlzLmFyZ3VtZW50c1tvXSkudmFsdWUuZXZhbChlKSxyLmV4cGFuZCYmQXJyYXkuaXNBcnJheShzLnZhbHVlKSlmb3Iocz1zLnZhbHVlLGE9MDthPHMubGVuZ3RoO2ErKyltLnB1c2goe3ZhbHVlOnNbYV19KTtlbHNlIG0ucHVzaCh7bmFtZTpyLm5hbWUsdmFsdWU6c30pO2ZvcihkPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hdGNoQXJncyhudWxsLGUpfSxvPTA7bzxlLmZyYW1lcy5sZW5ndGg7bysrKWlmKCh0PWUuZnJhbWVzW29dLmZpbmQodGhpcy5zZWxlY3RvcixudWxsLGQpKS5sZW5ndGg+MCl7Zm9yKGM9ITAsYT0wO2E8dC5sZW5ndGg7YSsrKXtmb3IoaT10W2FdLnJ1bGUsbj10W2FdLnBhdGgsdT0hMSxsPTA7bDxlLmZyYW1lcy5sZW5ndGg7bCsrKWlmKCEoaSBpbnN0YW5jZW9mIFNlKSYmaT09PShlLmZyYW1lc1tsXS5vcmlnaW5hbFJ1bGVzZXR8fGUuZnJhbWVzW2xdKSl7dT0hMDticmVha311fHxpLm1hdGNoQXJncyhtLGUpJiYoLTEhPT0oaD17bWl4aW46aSxncm91cDp4KGksbil9KS5ncm91cCYmYi5wdXNoKGgpLHk9ITApfWZvcihRLnJlc2V0KCkscD1bMCwwLDBdLGE9MDthPGIubGVuZ3RoO2ErKylwW2JbYV0uZ3JvdXBdKys7aWYocFswXT4wKWY9MjtlbHNlIGlmKGY9MSxwWzFdK3BbMl0+MSl0aHJvd3t0eXBlOiJSdW50aW1lIixtZXNzYWdlOiJBbWJpZ3VvdXMgdXNlIG9mIGBkZWZhdWx0KClgIGZvdW5kIHdoZW4gbWF0Y2hpbmcgZm9yIGAiK3RoaXMuZm9ybWF0KG0pKyJgIixpbmRleDp0aGlzLmdldEluZGV4KCksZmlsZW5hbWU6dGhpcy5maWxlSW5mbygpLmZpbGVuYW1lfTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDA9PT0oaD1iW2FdLmdyb3VwKXx8aD09PWYpdHJ5eyhpPWJbYV0ubWl4aW4paW5zdGFuY2VvZiBTZXx8KHY9aS5vcmlnaW5hbFJ1bGVzZXR8fGksKGk9bmV3IFNlKCIiLFtdLGkucnVsZXMsbnVsbCwhMSxudWxsLHYudmlzaWJpbGl0eUluZm8oKSkpLm9yaWdpbmFsUnVsZXNldD12KTt2YXIgUz1pLmV2YWxDYWxsKGUsbSx0aGlzLmltcG9ydGFudCkucnVsZXM7dGhpcy5fc2V0VmlzaWJpbGl0eVRvUmVwbGFjZW1lbnQoUyksQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZyxTKX1jYXRjaChlKXt0aHJvd3ttZXNzYWdlOmUubWVzc2FnZSxpbmRleDp0aGlzLmdldEluZGV4KCksZmlsZW5hbWU6dGhpcy5maWxlSW5mbygpLmZpbGVuYW1lLHN0YWNrOmUuc3RhY2t9fWlmKHkpcmV0dXJuIGd9dGhyb3cgYz97dHlwZToiUnVudGltZSIsbWVzc2FnZToiTm8gbWF0Y2hpbmcgZGVmaW5pdGlvbiB3YXMgZm91bmQgZm9yIGAiK3RoaXMuZm9ybWF0KG0pKyJgIixpbmRleDp0aGlzLmdldEluZGV4KCksZmlsZW5hbWU6dGhpcy5maWxlSW5mbygpLmZpbGVuYW1lfTp7dHlwZToiTmFtZSIsbWVzc2FnZTp0aGlzLnNlbGVjdG9yLnRvQ1NTKCkudHJpbSgpKyIgaXMgdW5kZWZpbmVkIixpbmRleDp0aGlzLmdldEluZGV4KCksZmlsZW5hbWU6dGhpcy5maWxlSW5mbygpLmZpbGVuYW1lfX0sX3NldFZpc2liaWxpdHlUb1JlcGxhY2VtZW50OmZ1bmN0aW9uKGUpe3ZhciB0O2lmKHRoaXMuYmxvY2tzVmlzaWJpbGl0eSgpKWZvcih0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS5hZGRWaXNpYmlsaXR5QmxvY2soKX0sZm9ybWF0OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnNlbGVjdG9yLnRvQ1NTKCkudHJpbSgpKyIoIisoZT9lLm1hcCgoZnVuY3Rpb24oZSl7dmFyIHQ9IiI7cmV0dXJuIGUubmFtZSYmKHQrPWUubmFtZSsiOiIpLGUudmFsdWUudG9DU1M/dCs9ZS52YWx1ZS50b0NTUygpOnQrPSI/Pz8iLHR9KSkuam9pbigiLCAiKToiIikrIikifX0pO3ZhciBDZT17Tm9kZTp1LENvbG9yOmMsQXRSdWxlOlosRGV0YWNoZWRSdWxlc2V0OlgsT3BlcmF0aW9uOmllLERpbWVuc2lvbjplZSxVbml0OlksS2V5d29yZDpMLFZhcmlhYmxlOm9lLFByb3BlcnR5OmFlLFJ1bGVzZXQ6SyxFbGVtZW50Om0sQXR0cmlidXRlOmxlLENvbWJpbmF0b3I6ZCxTZWxlY3RvcjpGLFF1b3RlZDp1ZSxFeHByZXNzaW9uOm5lLERlY2xhcmF0aW9uOkQsQ2FsbDpzZSxVUkw6Y2UsSW1wb3J0OmZlLENvbW1lbnQ6VSxBbm9ueW1vdXM6aixWYWx1ZTokLEphdmFTY3JpcHQ6dmUsQXNzaWdubWVudDpkZSxDb25kaXRpb246bWUsUGFyZW46cCxNZWRpYTpoZSxVbmljb2RlRGVzY3JpcHRvcjpnZSxOZWdhdGl2ZTp5ZSxFeHRlbmQ6YmUsVmFyaWFibGVDYWxsOndlLE5hbWVzcGFjZVZhbHVlOnhlLG1peGluOntDYWxsOkllLERlZmluaXRpb246U2V9fSxrZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUucHJvdG90eXBlLmdldFBhdGg9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sYXN0SW5kZXhPZigiPyIpO3JldHVybiB0PjAmJihlPWUuc2xpY2UoMCx0KSksKHQ9ZS5sYXN0SW5kZXhPZigiLyIpKTwwJiYodD1lLmxhc3RJbmRleE9mKCJcXCIpKSx0PDA/IiI6ZS5zbGljZSgwLHQrMSl9LGUucHJvdG90eXBlLnRyeUFwcGVuZEV4dGVuc2lvbj1mdW5jdGlvbihlLHQpe3JldHVybi8oXC5bYS16XSokKXwoW1w/O10uKikkLy50ZXN0KGUpP2U6ZSt0fSxlLnByb3RvdHlwZS50cnlBcHBlbmRMZXNzRXh0ZW5zaW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRyeUFwcGVuZEV4dGVuc2lvbihlLCIubGVzcyIpfSxlLnByb3RvdHlwZS5zdXBwb3J0c1N5bmM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZS5wcm90b3R5cGUuYWx3YXlzTWFrZVBhdGhzQWJzb2x1dGU9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZS5wcm90b3R5cGUuaXNQYXRoQWJzb2x1dGU9ZnVuY3Rpb24oZSl7cmV0dXJuL14oPzpbYS16LV0rOnxcL3xcXHwjKS9pLnRlc3QoZSl9LGUucHJvdG90eXBlLmpvaW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT9lK3Q6dH0sZS5wcm90b3R5cGUucGF0aERpZmY9ZnVuY3Rpb24oZSx0KXt2YXIgaSxuLHIscyxvPXRoaXMuZXh0cmFjdFVybFBhcnRzKGUpLGE9dGhpcy5leHRyYWN0VXJsUGFydHModCksbD0iIjtpZihvLmhvc3RQYXJ0IT09YS5ob3N0UGFydClyZXR1cm4iIjtmb3Iobj1NYXRoLm1heChhLmRpcmVjdG9yaWVzLmxlbmd0aCxvLmRpcmVjdG9yaWVzLmxlbmd0aCksaT0wO2k8biYmYS5kaXJlY3Rvcmllc1tpXT09PW8uZGlyZWN0b3JpZXNbaV07aSsrKTtmb3Iocz1hLmRpcmVjdG9yaWVzLnNsaWNlKGkpLHI9by5kaXJlY3Rvcmllcy5zbGljZShpKSxpPTA7aTxzLmxlbmd0aC0xO2krKylsKz0iLi4vIjtmb3IoaT0wO2k8ci5sZW5ndGgtMTtpKyspbCs9cltpXSsiLyI7cmV0dXJuIGx9LGUucHJvdG90eXBlLmV4dHJhY3RVcmxQYXJ0cz1mdW5jdGlvbihlLHQpe3ZhciBpLG4scj0vXigoPzpbYS16LV0rOik/XC97Mn0oPzpbXlwvXD8jXSpcLyl8KFtcL1xcXSkpPygoPzpbXlwvXFxcPyNdKltcL1xcXSkqKShbXlwvXFxcPyNdKikoWyNcP10uKik/JC9pLHM9ZS5tYXRjaChyKSxvPXt9LGE9W10sbD1bXTtpZighcyl0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBzaGVldCBocmVmIC0gJyIrZSsiJyIpO2lmKHQmJighc1sxXXx8c1syXSkpe2lmKCEobj10Lm1hdGNoKHIpKSl0aHJvdyBuZXcgRXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBwYWdlIHVybCAtICciK3QrIiciKTtzWzFdPXNbMV18fG5bMV18fCIiLHNbMl18fChzWzNdPW5bM10rc1szXSl9aWYoc1szXSlmb3IoYT1zWzNdLnJlcGxhY2UoL1xcL2csIi8iKS5zcGxpdCgiLyIpLGk9MDtpPGEubGVuZ3RoO2krKykiLi4iPT09YVtpXT9sLnBvcCgpOiIuIiE9PWFbaV0mJmwucHVzaChhW2ldKTtyZXR1cm4gby5ob3N0UGFydD1zWzFdLG8uZGlyZWN0b3JpZXM9bCxvLnJhd1BhdGg9KHNbMV18fCIiKSthLmpvaW4oIi8iKSxvLnBhdGg9KHNbMV18fCIiKStsLmpvaW4oIi8iKSxvLmZpbGVuYW1lPXNbNF0sby5maWxlVXJsPW8ucGF0aCsoc1s0XXx8IiIpLG8udXJsPW8uZmlsZVVybCsoc1s1XXx8IiIpLG99LGV9KCksX2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5yZXF1aXJlPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fXJldHVybiBlLnByb3RvdHlwZS5ldmFsUGx1Z2luPWZ1bmN0aW9uKGUsdCxpLG4scil7dmFyIHMsbyxhLGwsdSxjO2w9dC5wbHVnaW5NYW5hZ2VyLHImJih1PSJzdHJpbmciPT10eXBlb2Ygcj9yOnIuZmlsZW5hbWUpO3ZhciBoPShuZXcgdGhpcy5sZXNzLkZpbGVNYW5hZ2VyKS5leHRyYWN0VXJsUGFydHModSkuZmlsZW5hbWU7aWYodSYmKG89bC5nZXQodSkpKXtpZihjPXRoaXMudHJ5U2V0T3B0aW9ucyhvLHUsaCxuKSlyZXR1cm4gYzt0cnl7by51c2UmJm8udXNlLmNhbGwodGhpcy5jb250ZXh0LG8pfWNhdGNoKGUpe3JldHVybiBlLm1lc3NhZ2U9ZS5tZXNzYWdlfHwiRXJyb3IgZHVyaW5nIEBwbHVnaW4gY2FsbCIsbmV3IE8oZSxpLHUpfXJldHVybiBvfWE9e2V4cG9ydHM6e30scGx1Z2luTWFuYWdlcjpsLGZpbGVJbmZvOnJ9LHM9SC5jcmVhdGUoKTt0cnl7bmV3IEZ1bmN0aW9uKCJtb2R1bGUiLCJyZXF1aXJlIiwicmVnaXN0ZXJQbHVnaW4iLCJmdW5jdGlvbnMiLCJ0cmVlIiwibGVzcyIsImZpbGVJbmZvIixlKShhLHRoaXMucmVxdWlyZSh1KSwoZnVuY3Rpb24oZSl7bz1lfSkscyx0aGlzLmxlc3MudHJlZSx0aGlzLmxlc3Mscil9Y2F0Y2goZSl7cmV0dXJuIG5ldyBPKGUsaSx1KX1pZihvfHwobz1hLmV4cG9ydHMpLChvPXRoaXMudmFsaWRhdGVQbHVnaW4obyx1LGgpKWluc3RhbmNlb2YgTylyZXR1cm4gbztpZighbylyZXR1cm4gbmV3IE8oe21lc3NhZ2U6Ik5vdCBhIHZhbGlkIHBsdWdpbiJ9LGksdSk7aWYoby5pbXBvcnRzPWksby5maWxlbmFtZT11LCghby5taW5WZXJzaW9ufHx0aGlzLmNvbXBhcmVWZXJzaW9uKCIzLjAuMCIsby5taW5WZXJzaW9uKTwwKSYmKGM9dGhpcy50cnlTZXRPcHRpb25zKG8sdSxoLG4pKSlyZXR1cm4gYztpZihsLmFkZFBsdWdpbihvLHIuZmlsZW5hbWUscyksby5mdW5jdGlvbnM9cy5nZXRMb2NhbEZ1bmN0aW9ucygpLGM9dGhpcy50cnlTZXRPcHRpb25zKG8sdSxoLG4pKXJldHVybiBjO3RyeXtvLnVzZSYmby51c2UuY2FsbCh0aGlzLmNvbnRleHQsbyl9Y2F0Y2goZSl7cmV0dXJuIGUubWVzc2FnZT1lLm1lc3NhZ2V8fCJFcnJvciBkdXJpbmcgQHBsdWdpbiBjYWxsIixuZXcgTyhlLGksdSl9cmV0dXJuIG99LGUucHJvdG90eXBlLnRyeVNldE9wdGlvbnM9ZnVuY3Rpb24oZSx0LGksbil7aWYobiYmIWUuc2V0T3B0aW9ucylyZXR1cm4gbmV3IE8oe21lc3NhZ2U6Ik9wdGlvbnMgaGF2ZSBiZWVuIHByb3ZpZGVkIGJ1dCB0aGUgcGx1Z2luICIraSsiIGRvZXMgbm90IHN1cHBvcnQgYW55IG9wdGlvbnMuIn0pO3RyeXtlLnNldE9wdGlvbnMmJmUuc2V0T3B0aW9ucyhuKX1jYXRjaChlKXtyZXR1cm4gbmV3IE8oZSl9fSxlLnByb3RvdHlwZS52YWxpZGF0ZVBsdWdpbj1mdW5jdGlvbihlLHQsaSl7cmV0dXJuIGU/KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiYoZT1uZXcgZSksZS5taW5WZXJzaW9uJiZ0aGlzLmNvbXBhcmVWZXJzaW9uKGUubWluVmVyc2lvbix0aGlzLmxlc3MudmVyc2lvbik8MD9uZXcgTyh7bWVzc2FnZToiUGx1Z2luICIraSsiIHJlcXVpcmVzIHZlcnNpb24gIit0aGlzLnZlcnNpb25Ub1N0cmluZyhlLm1pblZlcnNpb24pfSk6ZSk6bnVsbH0sZS5wcm90b3R5cGUuY29tcGFyZVZlcnNpb249ZnVuY3Rpb24oZSx0KXsic3RyaW5nIj09dHlwZW9mIGUmJihlPWUubWF0Y2goL14oXGQrKVwuPyhcZCspP1wuPyhcZCspPy8pKS5zaGlmdCgpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKWlmKGVbaV0hPT10W2ldKXJldHVybiBwYXJzZUludChlW2ldKT5wYXJzZUludCh0W2ldKT8tMToxO3JldHVybiAwfSxlLnByb3RvdHlwZS52ZXJzaW9uVG9TdHJpbmc9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PSIiLGk9MDtpPGUubGVuZ3RoO2krKyl0Kz0odD8iLiI6IiIpK2VbaV07cmV0dXJuIHR9LGUucHJvdG90eXBlLnByaW50VXNhZ2U9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBpPWVbdF07aS5wcmludFVzYWdlJiZpLnByaW50VXNhZ2UoKX19LGV9KCksQWU9e3Zpc2l0RGVlcGVyOiEwfSxNZT0hMTtmdW5jdGlvbiBFZShlKXtyZXR1cm4gZX12YXIgUGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuX2ltcGxlbWVudGF0aW9uPWUsdGhpcy5fdmlzaXRJbkNhY2hlPXt9LHRoaXMuX3Zpc2l0T3V0Q2FjaGU9e30sTWV8fCghZnVuY3Rpb24gZSh0LGkpe3ZhciBuLHI7Zm9yKG4gaW4gdClzd2l0Y2godHlwZW9mKHI9dFtuXSkpe2Nhc2UiZnVuY3Rpb24iOnIucHJvdG90eXBlJiZyLnByb3RvdHlwZS50eXBlJiYoci5wcm90b3R5cGUudHlwZUluZGV4PWkrKyk7YnJlYWs7Y2FzZSJvYmplY3QiOmk9ZShyLGkpfXJldHVybiBpfShDZSwxKSxNZT0hMCl9cmV0dXJuIGUucHJvdG90eXBlLnZpc2l0PWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiBlO3ZhciB0PWUudHlwZUluZGV4O2lmKCF0KXJldHVybiBlLnZhbHVlJiZlLnZhbHVlLnR5cGVJbmRleCYmdGhpcy52aXNpdChlLnZhbHVlKSxlO3ZhciBpLG49dGhpcy5faW1wbGVtZW50YXRpb24scj10aGlzLl92aXNpdEluQ2FjaGVbdF0scz10aGlzLl92aXNpdE91dENhY2hlW3RdLG89QWU7aWYoby52aXNpdERlZXBlcj0hMCxyfHwocj1uW2k9InZpc2l0IitlLnR5cGVdfHxFZSxzPW5baSsiT3V0Il18fEVlLHRoaXMuX3Zpc2l0SW5DYWNoZVt0XT1yLHRoaXMuX3Zpc2l0T3V0Q2FjaGVbdF09cyksciE9PUVlKXt2YXIgYT1yLmNhbGwobixlLG8pO2UmJm4uaXNSZXBsYWNpbmcmJihlPWEpfWlmKG8udmlzaXREZWVwZXImJmUpaWYoZS5sZW5ndGgpZm9yKHZhciBsPTAsdT1lLmxlbmd0aDtsPHU7bCsrKWVbbF0uYWNjZXB0JiZlW2xdLmFjY2VwdCh0aGlzKTtlbHNlIGUuYWNjZXB0JiZlLmFjY2VwdCh0aGlzKTtyZXR1cm4gcyE9RWUmJnMuY2FsbChuLGUpLGV9LGUucHJvdG90eXBlLnZpc2l0QXJyYXk9ZnVuY3Rpb24oZSx0KXtpZighZSlyZXR1cm4gZTt2YXIgaSxuPWUubGVuZ3RoO2lmKHR8fCF0aGlzLl9pbXBsZW1lbnRhdGlvbi5pc1JlcGxhY2luZyl7Zm9yKGk9MDtpPG47aSsrKXRoaXMudmlzaXQoZVtpXSk7cmV0dXJuIGV9dmFyIHI9W107Zm9yKGk9MDtpPG47aSsrKXt2YXIgcz10aGlzLnZpc2l0KGVbaV0pO3ZvaWQgMCE9PXMmJihzLnNwbGljZT9zLmxlbmd0aCYmdGhpcy5mbGF0dGVuKHMscik6ci5wdXNoKHMpKX1yZXR1cm4gcn0sZS5wcm90b3R5cGUuZmxhdHRlbj1mdW5jdGlvbihlLHQpe3ZhciBpLG4scixzLG8sYTtmb3IodHx8KHQ9W10pLG49MCxpPWUubGVuZ3RoO248aTtuKyspaWYodm9pZCAwIT09KHI9ZVtuXSkpaWYoci5zcGxpY2UpZm9yKG89MCxzPXIubGVuZ3RoO288cztvKyspdm9pZCAwIT09KGE9cltvXSkmJihhLnNwbGljZT9hLmxlbmd0aCYmdGhpcy5mbGF0dGVuKGEsdCk6dC5wdXNoKGEpKTtlbHNlIHQucHVzaChyKTtyZXR1cm4gdH0sZX0oKSxSZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5pbXBvcnRzPVtdLHRoaXMudmFyaWFibGVJbXBvcnRzPVtdLHRoaXMuX29uU2VxdWVuY2VyRW1wdHk9ZSx0aGlzLl9jdXJyZW50RGVwdGg9MH1yZXR1cm4gZS5wcm90b3R5cGUuYWRkSW1wb3J0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsaT17Y2FsbGJhY2s6ZSxhcmdzOm51bGwsaXNSZWFkeTohMX07cmV0dXJuIHRoaXMuaW1wb3J0cy5wdXNoKGkpLGZ1bmN0aW9uKCl7aS5hcmdzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSxpLmlzUmVhZHk9ITAsdC50cnlSdW4oKX19LGUucHJvdG90eXBlLmFkZFZhcmlhYmxlSW1wb3J0PWZ1bmN0aW9uKGUpe3RoaXMudmFyaWFibGVJbXBvcnRzLnB1c2goZSl9LGUucHJvdG90eXBlLnRyeVJ1bj1mdW5jdGlvbigpe3RoaXMuX2N1cnJlbnREZXB0aCsrO3RyeXtmb3IoOzspe2Zvcig7dGhpcy5pbXBvcnRzLmxlbmd0aD4wOyl7dmFyIGU9dGhpcy5pbXBvcnRzWzBdO2lmKCFlLmlzUmVhZHkpcmV0dXJuO3RoaXMuaW1wb3J0cz10aGlzLmltcG9ydHMuc2xpY2UoMSksZS5jYWxsYmFjay5hcHBseShudWxsLGUuYXJncyl9aWYoMD09PXRoaXMudmFyaWFibGVJbXBvcnRzLmxlbmd0aClicmVhazt2YXIgdD10aGlzLnZhcmlhYmxlSW1wb3J0c1swXTt0aGlzLnZhcmlhYmxlSW1wb3J0cz10aGlzLnZhcmlhYmxlSW1wb3J0cy5zbGljZSgxKSx0KCl9fWZpbmFsbHl7dGhpcy5fY3VycmVudERlcHRoLS19MD09PXRoaXMuX2N1cnJlbnREZXB0aCYmdGhpcy5fb25TZXF1ZW5jZXJFbXB0eSYmdGhpcy5fb25TZXF1ZW5jZXJFbXB0eSgpfSxlfSgpLE9lPWZ1bmN0aW9uKGUsdCl7dGhpcy5fdmlzaXRvcj1uZXcgUGUodGhpcyksdGhpcy5faW1wb3J0ZXI9ZSx0aGlzLl9maW5pc2g9dCx0aGlzLmNvbnRleHQ9bmV3IHEuRXZhbCx0aGlzLmltcG9ydENvdW50PTAsdGhpcy5vbmNlRmlsZURldGVjdGlvbk1hcD17fSx0aGlzLnJlY3Vyc2lvbkRldGVjdG9yPXt9LHRoaXMuX3NlcXVlbmNlcj1uZXcgUmUodGhpcy5fb25TZXF1ZW5jZXJFbXB0eS5iaW5kKHRoaXMpKX07T2UucHJvdG90eXBlPXtpc1JlcGxhY2luZzohMSxydW46ZnVuY3Rpb24oZSl7dHJ5e3RoaXMuX3Zpc2l0b3IudmlzaXQoZSl9Y2F0Y2goZSl7dGhpcy5lcnJvcj1lfXRoaXMuaXNGaW5pc2hlZD0hMCx0aGlzLl9zZXF1ZW5jZXIudHJ5UnVuKCl9LF9vblNlcXVlbmNlckVtcHR5OmZ1bmN0aW9uKCl7dGhpcy5pc0ZpbmlzaGVkJiZ0aGlzLl9maW5pc2godGhpcy5lcnJvcil9LHZpc2l0SW1wb3J0OmZ1bmN0aW9uKGUsdCl7dmFyIGk9ZS5vcHRpb25zLmlubGluZTtpZighZS5jc3N8fGkpe3ZhciBuPW5ldyBxLkV2YWwodGhpcy5jb250ZXh0LGsodGhpcy5jb250ZXh0LmZyYW1lcykpLHI9bi5mcmFtZXNbMF07dGhpcy5pbXBvcnRDb3VudCsrLGUuaXNWYXJpYWJsZUltcG9ydCgpP3RoaXMuX3NlcXVlbmNlci5hZGRWYXJpYWJsZUltcG9ydCh0aGlzLnByb2Nlc3NJbXBvcnROb2RlLmJpbmQodGhpcyxlLG4scikpOnRoaXMucHJvY2Vzc0ltcG9ydE5vZGUoZSxuLHIpfXQudmlzaXREZWVwZXI9ITF9LHByb2Nlc3NJbXBvcnROb2RlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgbixyPWUub3B0aW9ucy5pbmxpbmU7dHJ5e249ZS5ldmFsRm9ySW1wb3J0KHQpfWNhdGNoKHQpe3QuZmlsZW5hbWV8fCh0LmluZGV4PWUuZ2V0SW5kZXgoKSx0LmZpbGVuYW1lPWUuZmlsZUluZm8oKS5maWxlbmFtZSksZS5jc3M9ITAsZS5lcnJvcj10fWlmKCFufHxuLmNzcyYmIXIpdGhpcy5pbXBvcnRDb3VudC0tLHRoaXMuaXNGaW5pc2hlZCYmdGhpcy5fc2VxdWVuY2VyLnRyeVJ1bigpO2Vsc2V7bi5vcHRpb25zLm11bHRpcGxlJiYodC5pbXBvcnRNdWx0aXBsZT0hMCk7Zm9yKHZhciBzPXZvaWQgMD09PW4uY3NzLG89MDtvPGkucnVsZXMubGVuZ3RoO28rKylpZihpLnJ1bGVzW29dPT09ZSl7aS5ydWxlc1tvXT1uO2JyZWFrfXZhciBhPXRoaXMub25JbXBvcnRlZC5iaW5kKHRoaXMsbix0KSxsPXRoaXMuX3NlcXVlbmNlci5hZGRJbXBvcnQoYSk7dGhpcy5faW1wb3J0ZXIucHVzaChuLmdldFBhdGgoKSxzLG4uZmlsZUluZm8oKSxuLm9wdGlvbnMsbCl9fSxvbkltcG9ydGVkOmZ1bmN0aW9uKGUsdCxpLG4scixzKXtpJiYoaS5maWxlbmFtZXx8KGkuaW5kZXg9ZS5nZXRJbmRleCgpLGkuZmlsZW5hbWU9ZS5maWxlSW5mbygpLmZpbGVuYW1lKSx0aGlzLmVycm9yPWkpO3ZhciBvPXRoaXMsYT1lLm9wdGlvbnMuaW5saW5lLGw9ZS5vcHRpb25zLmlzUGx1Z2luLHU9ZS5vcHRpb25zLm9wdGlvbmFsLGM9cnx8cyBpbiBvLnJlY3Vyc2lvbkRldGVjdG9yO2lmKHQuaW1wb3J0TXVsdGlwbGV8fChlLnNraXA9ISFjfHxmdW5jdGlvbigpe3JldHVybiBzIGluIG8ub25jZUZpbGVEZXRlY3Rpb25NYXB8fChvLm9uY2VGaWxlRGV0ZWN0aW9uTWFwW3NdPSEwLCExKX0pLCFzJiZ1JiYoZS5za2lwPSEwKSxuJiYoZS5yb290PW4sZS5pbXBvcnRlZEZpbGVuYW1lPXMsIWEmJiFsJiYodC5pbXBvcnRNdWx0aXBsZXx8IWMpKSl7by5yZWN1cnNpb25EZXRlY3RvcltzXT0hMDt2YXIgaD10aGlzLmNvbnRleHQ7dGhpcy5jb250ZXh0PXQ7dHJ5e3RoaXMuX3Zpc2l0b3IudmlzaXQobil9Y2F0Y2goaSl7dGhpcy5lcnJvcj1pfXRoaXMuY29udGV4dD1ofW8uaW1wb3J0Q291bnQtLSxvLmlzRmluaXNoZWQmJm8uX3NlcXVlbmNlci50cnlSdW4oKX0sdmlzaXREZWNsYXJhdGlvbjpmdW5jdGlvbihlLHQpeyJEZXRhY2hlZFJ1bGVzZXQiPT09ZS52YWx1ZS50eXBlP3RoaXMuY29udGV4dC5mcmFtZXMudW5zaGlmdChlKTp0LnZpc2l0RGVlcGVyPSExfSx2aXNpdERlY2xhcmF0aW9uT3V0OmZ1bmN0aW9uKGUpeyJEZXRhY2hlZFJ1bGVzZXQiPT09ZS52YWx1ZS50eXBlJiZ0aGlzLmNvbnRleHQuZnJhbWVzLnNoaWZ0KCl9LHZpc2l0QXRSdWxlOmZ1bmN0aW9uKGUsdCl7dGhpcy5jb250ZXh0LmZyYW1lcy51bnNoaWZ0KGUpfSx2aXNpdEF0UnVsZU91dDpmdW5jdGlvbihlKXt0aGlzLmNvbnRleHQuZnJhbWVzLnNoaWZ0KCl9LHZpc2l0TWl4aW5EZWZpbml0aW9uOmZ1bmN0aW9uKGUsdCl7dGhpcy5jb250ZXh0LmZyYW1lcy51bnNoaWZ0KGUpfSx2aXNpdE1peGluRGVmaW5pdGlvbk91dDpmdW5jdGlvbihlKXt0aGlzLmNvbnRleHQuZnJhbWVzLnNoaWZ0KCl9LHZpc2l0UnVsZXNldDpmdW5jdGlvbihlLHQpe3RoaXMuY29udGV4dC5mcmFtZXMudW5zaGlmdChlKX0sdmlzaXRSdWxlc2V0T3V0OmZ1bmN0aW9uKGUpe3RoaXMuY29udGV4dC5mcmFtZXMuc2hpZnQoKX0sdmlzaXRNZWRpYTpmdW5jdGlvbihlLHQpe3RoaXMuY29udGV4dC5mcmFtZXMudW5zaGlmdChlLnJ1bGVzWzBdKX0sdmlzaXRNZWRpYU91dDpmdW5jdGlvbihlKXt0aGlzLmNvbnRleHQuZnJhbWVzLnNoaWZ0KCl9fTt2YXIgVmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMudmlzaWJsZT1lfXJldHVybiBlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oZSl7dGhpcy52aXNpdChlKX0sZS5wcm90b3R5cGUudmlzaXRBcnJheT1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4gZTt2YXIgdCxpPWUubGVuZ3RoO2Zvcih0PTA7dDxpO3QrKyl0aGlzLnZpc2l0KGVbdF0pO3JldHVybiBlfSxlLnByb3RvdHlwZS52aXNpdD1mdW5jdGlvbihlKXtyZXR1cm4gZT9lLmNvbnN0cnVjdG9yPT09QXJyYXk/dGhpcy52aXNpdEFycmF5KGUpOighZS5ibG9ja3NWaXNpYmlsaXR5fHxlLmJsb2Nrc1Zpc2liaWxpdHkoKXx8KHRoaXMudmlzaWJsZT9lLmVuc3VyZVZpc2liaWxpdHkoKTplLmVuc3VyZUludmlzaWJpbGl0eSgpLGUuYWNjZXB0KHRoaXMpKSxlKTplfSxlfSgpLEZlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuX3Zpc2l0b3I9bmV3IFBlKHRoaXMpLHRoaXMuY29udGV4dHM9W10sdGhpcy5hbGxFeHRlbmRzU3RhY2s9W1tdXX1yZXR1cm4gZS5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKGUpe3JldHVybihlPXRoaXMuX3Zpc2l0b3IudmlzaXQoZSkpLmFsbEV4dGVuZHM9dGhpcy5hbGxFeHRlbmRzU3RhY2tbMF0sZX0sZS5wcm90b3R5cGUudmlzaXREZWNsYXJhdGlvbj1mdW5jdGlvbihlLHQpe3QudmlzaXREZWVwZXI9ITF9LGUucHJvdG90eXBlLnZpc2l0TWl4aW5EZWZpbml0aW9uPWZ1bmN0aW9uKGUsdCl7dC52aXNpdERlZXBlcj0hMX0sZS5wcm90b3R5cGUudmlzaXRSdWxlc2V0PWZ1bmN0aW9uKGUsdCl7aWYoIWUucm9vdCl7dmFyIGksbixyLHMsbz1bXSxhPWUucnVsZXMsbD1hP2EubGVuZ3RoOjA7Zm9yKGk9MDtpPGw7aSsrKWUucnVsZXNbaV1pbnN0YW5jZW9mIENlLkV4dGVuZCYmKG8ucHVzaChhW2ldKSxlLmV4dGVuZE9uRXZlcnlQYXRoPSEwKTt2YXIgdT1lLnBhdGhzO2ZvcihpPTA7aTx1Lmxlbmd0aDtpKyspe3ZhciBjPXVbaV0saD1jW2MubGVuZ3RoLTFdLmV4dGVuZExpc3Q7Zm9yKChzPWg/ayhoKS5jb25jYXQobyk6bykmJihzPXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5jbG9uZSgpfSkpKSxuPTA7bjxzLmxlbmd0aDtuKyspdGhpcy5mb3VuZEV4dGVuZHM9ITAsKHI9c1tuXSkuZmluZFNlbGZTZWxlY3RvcnMoYyksci5ydWxlc2V0PWUsMD09PW4mJihyLmZpcnN0RXh0ZW5kT25UaGlzU2VsZWN0b3JQYXRoPSEwKSx0aGlzLmFsbEV4dGVuZHNTdGFja1t0aGlzLmFsbEV4dGVuZHNTdGFjay5sZW5ndGgtMV0ucHVzaChyKX10aGlzLmNvbnRleHRzLnB1c2goZS5zZWxlY3RvcnMpfX0sZS5wcm90b3R5cGUudmlzaXRSdWxlc2V0T3V0PWZ1bmN0aW9uKGUpe2Uucm9vdHx8KHRoaXMuY29udGV4dHMubGVuZ3RoPXRoaXMuY29udGV4dHMubGVuZ3RoLTEpfSxlLnByb3RvdHlwZS52aXNpdE1lZGlhPWZ1bmN0aW9uKGUsdCl7ZS5hbGxFeHRlbmRzPVtdLHRoaXMuYWxsRXh0ZW5kc1N0YWNrLnB1c2goZS5hbGxFeHRlbmRzKX0sZS5wcm90b3R5cGUudmlzaXRNZWRpYU91dD1mdW5jdGlvbihlKXt0aGlzLmFsbEV4dGVuZHNTdGFjay5sZW5ndGg9dGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoLTF9LGUucHJvdG90eXBlLnZpc2l0QXRSdWxlPWZ1bmN0aW9uKGUsdCl7ZS5hbGxFeHRlbmRzPVtdLHRoaXMuYWxsRXh0ZW5kc1N0YWNrLnB1c2goZS5hbGxFeHRlbmRzKX0sZS5wcm90b3R5cGUudmlzaXRBdFJ1bGVPdXQ9ZnVuY3Rpb24oZSl7dGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoPXRoaXMuYWxsRXh0ZW5kc1N0YWNrLmxlbmd0aC0xfSxlfSgpLCRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuX3Zpc2l0b3I9bmV3IFBlKHRoaXMpfXJldHVybiBlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEZlO2lmKHRoaXMuZXh0ZW5kSW5kaWNlcz17fSx0LnJ1bihlKSwhdC5mb3VuZEV4dGVuZHMpcmV0dXJuIGU7ZS5hbGxFeHRlbmRzPWUuYWxsRXh0ZW5kcy5jb25jYXQodGhpcy5kb0V4dGVuZENoYWluaW5nKGUuYWxsRXh0ZW5kcyxlLmFsbEV4dGVuZHMpKSx0aGlzLmFsbEV4dGVuZHNTdGFjaz1bZS5hbGxFeHRlbmRzXTt2YXIgaT10aGlzLl92aXNpdG9yLnZpc2l0KGUpO3JldHVybiB0aGlzLmNoZWNrRXh0ZW5kc0Zvck5vbk1hdGNoZWQoZS5hbGxFeHRlbmRzKSxpfSxlLnByb3RvdHlwZS5jaGVja0V4dGVuZHNGb3JOb25NYXRjaGVkPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZXh0ZW5kSW5kaWNlcztlLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIWUuaGFzRm91bmRNYXRjaGVzJiYxPT1lLnBhcmVudF9pZHMubGVuZ3RofSkpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBpPSJfdW5rbm93bl8iO3RyeXtpPWUuc2VsZWN0b3IudG9DU1Moe30pfWNhdGNoKGUpe310W2UuaW5kZXgrIiAiK2ldfHwodFtlLmluZGV4KyIgIitpXT0hMCxyLndhcm4oImV4dGVuZCAnIitpKyInIGhhcyBubyBtYXRjaGVzIikpfSkpfSxlLnByb3RvdHlwZS5kb0V4dGVuZENoYWluaW5nPWZ1bmN0aW9uKGUsdCxpKXt2YXIgbixyLHMsbyxhLGwsdSxjLGg9W10sZj10aGlzO2ZvcihpPWl8fDAsbj0wO248ZS5sZW5ndGg7bisrKWZvcihyPTA7cjx0Lmxlbmd0aDtyKyspbD1lW25dLHU9dFtyXSxsLnBhcmVudF9pZHMuaW5kZXhPZih1Lm9iamVjdF9pZCk+PTB8fChhPVt1LnNlbGZTZWxlY3RvcnNbMF1dLChzPWYuZmluZE1hdGNoKGwsYSkpLmxlbmd0aCYmKGwuaGFzRm91bmRNYXRjaGVzPSEwLGwuc2VsZlNlbGVjdG9ycy5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD11LnZpc2liaWxpdHlJbmZvKCk7bz1mLmV4dGVuZFNlbGVjdG9yKHMsYSxlLGwuaXNWaXNpYmxlKCkpLChjPW5ldyBDZS5FeHRlbmQodS5zZWxlY3Rvcix1Lm9wdGlvbiwwLHUuZmlsZUluZm8oKSx0KSkuc2VsZlNlbGVjdG9ycz1vLG9bby5sZW5ndGgtMV0uZXh0ZW5kTGlzdD1bY10saC5wdXNoKGMpLGMucnVsZXNldD11LnJ1bGVzZXQsYy5wYXJlbnRfaWRzPWMucGFyZW50X2lkcy5jb25jYXQodS5wYXJlbnRfaWRzLGwucGFyZW50X2lkcyksdS5maXJzdEV4dGVuZE9uVGhpc1NlbGVjdG9yUGF0aCYmKGMuZmlyc3RFeHRlbmRPblRoaXNTZWxlY3RvclBhdGg9ITAsdS5ydWxlc2V0LnBhdGhzLnB1c2gobykpfSkpKSk7aWYoaC5sZW5ndGgpe2lmKHRoaXMuZXh0ZW5kQ2hhaW5Db3VudCsrLGk+MTAwKXt2YXIgcD0ie3VuYWJsZSB0byBjYWxjdWxhdGV9Iix2PSJ7dW5hYmxlIHRvIGNhbGN1bGF0ZX0iO3RyeXtwPWhbMF0uc2VsZlNlbGVjdG9yc1swXS50b0NTUygpLHY9aFswXS5zZWxlY3Rvci50b0NTUygpfWNhdGNoKGUpe310aHJvd3ttZXNzYWdlOiJleHRlbmQgY2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkLiBPbmUgb2YgdGhlIGNpcmN1bGFyIGV4dGVuZHMgaXMgY3VycmVudGx5OiIrcCsiOmV4dGVuZCgiK3YrIikifX1yZXR1cm4gaC5jb25jYXQoZi5kb0V4dGVuZENoYWluaW5nKGgsdCxpKzEpKX1yZXR1cm4gaH0sZS5wcm90b3R5cGUudmlzaXREZWNsYXJhdGlvbj1mdW5jdGlvbihlLHQpe3QudmlzaXREZWVwZXI9ITF9LGUucHJvdG90eXBlLnZpc2l0TWl4aW5EZWZpbml0aW9uPWZ1bmN0aW9uKGUsdCl7dC52aXNpdERlZXBlcj0hMX0sZS5wcm90b3R5cGUudmlzaXRTZWxlY3Rvcj1mdW5jdGlvbihlLHQpe3QudmlzaXREZWVwZXI9ITF9LGUucHJvdG90eXBlLnZpc2l0UnVsZXNldD1mdW5jdGlvbihlLHQpe2lmKCFlLnJvb3Qpe3ZhciBpLG4scixzLG89dGhpcy5hbGxFeHRlbmRzU3RhY2tbdGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoLTFdLGE9W10sbD10aGlzO2ZvcihyPTA7cjxvLmxlbmd0aDtyKyspZm9yKG49MDtuPGUucGF0aHMubGVuZ3RoO24rKylpZihzPWUucGF0aHNbbl0sIWUuZXh0ZW5kT25FdmVyeVBhdGgpe3ZhciB1PXNbcy5sZW5ndGgtMV0uZXh0ZW5kTGlzdDt1JiZ1Lmxlbmd0aHx8KGk9dGhpcy5maW5kTWF0Y2gob1tyXSxzKSkubGVuZ3RoJiYob1tyXS5oYXNGb3VuZE1hdGNoZXM9ITAsb1tyXS5zZWxmU2VsZWN0b3JzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0O3Q9bC5leHRlbmRTZWxlY3RvcihpLHMsZSxvW3JdLmlzVmlzaWJsZSgpKSxhLnB1c2godCl9KSkpfWUucGF0aHM9ZS5wYXRocy5jb25jYXQoYSl9fSxlLnByb3RvdHlwZS5maW5kTWF0Y2g9ZnVuY3Rpb24oZSx0KXt2YXIgaSxuLHIscyxvLGEsbCx1PWUuc2VsZWN0b3IuZWxlbWVudHMsYz1bXSxoPVtdO2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspZm9yKG49dFtpXSxyPTA7cjxuLmVsZW1lbnRzLmxlbmd0aDtyKyspZm9yKHM9bi5lbGVtZW50c1tyXSwoZS5hbGxvd0JlZm9yZXx8MD09PWkmJjA9PT1yKSYmYy5wdXNoKHtwYXRoSW5kZXg6aSxpbmRleDpyLG1hdGNoZWQ6MCxpbml0aWFsQ29tYmluYXRvcjpzLmNvbWJpbmF0b3J9KSxhPTA7YTxjLmxlbmd0aDthKyspbD1jW2FdLCIiPT09KG89cy5jb21iaW5hdG9yLnZhbHVlKSYmMD09PXImJihvPSIgIiksIXRoaXMuaXNFbGVtZW50VmFsdWVzRXF1YWwodVtsLm1hdGNoZWRdLnZhbHVlLHMudmFsdWUpfHxsLm1hdGNoZWQ+MCYmdVtsLm1hdGNoZWRdLmNvbWJpbmF0b3IudmFsdWUhPT1vP2w9bnVsbDpsLm1hdGNoZWQrKyxsJiYobC5maW5pc2hlZD1sLm1hdGNoZWQ9PT11Lmxlbmd0aCxsLmZpbmlzaGVkJiYhZS5hbGxvd0FmdGVyJiYocisxPG4uZWxlbWVudHMubGVuZ3RofHxpKzE8dC5sZW5ndGgpJiYobD1udWxsKSksbD9sLmZpbmlzaGVkJiYobC5sZW5ndGg9dS5sZW5ndGgsbC5lbmRQYXRoSW5kZXg9aSxsLmVuZFBhdGhFbGVtZW50SW5kZXg9cisxLGMubGVuZ3RoPTAsaC5wdXNoKGwpKTooYy5zcGxpY2UoYSwxKSxhLS0pO3JldHVybiBofSxlLnByb3RvdHlwZS5pc0VsZW1lbnRWYWx1ZXNFcXVhbD1mdW5jdGlvbihlLHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZXx8InN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBlPT09dDtpZihlIGluc3RhbmNlb2YgQ2UuQXR0cmlidXRlKXJldHVybiBlLm9wPT09dC5vcCYmZS5rZXk9PT10LmtleSYmKGUudmFsdWUmJnQudmFsdWU/KGU9ZS52YWx1ZS52YWx1ZXx8ZS52YWx1ZSk9PT0odD10LnZhbHVlLnZhbHVlfHx0LnZhbHVlKTohZS52YWx1ZSYmIXQudmFsdWUpO2lmKGU9ZS52YWx1ZSx0PXQudmFsdWUsZSBpbnN0YW5jZW9mIENlLlNlbGVjdG9yKXtpZighKHQgaW5zdGFuY2VvZiBDZS5TZWxlY3Rvcil8fGUuZWxlbWVudHMubGVuZ3RoIT09dC5lbGVtZW50cy5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBpPTA7aTxlLmVsZW1lbnRzLmxlbmd0aDtpKyspe2lmKGUuZWxlbWVudHNbaV0uY29tYmluYXRvci52YWx1ZSE9PXQuZWxlbWVudHNbaV0uY29tYmluYXRvci52YWx1ZSYmKDAhPT1pfHwoZS5lbGVtZW50c1tpXS5jb21iaW5hdG9yLnZhbHVlfHwiICIpIT09KHQuZWxlbWVudHNbaV0uY29tYmluYXRvci52YWx1ZXx8IiAiKSkpcmV0dXJuITE7aWYoIXRoaXMuaXNFbGVtZW50VmFsdWVzRXF1YWwoZS5lbGVtZW50c1tpXS52YWx1ZSx0LmVsZW1lbnRzW2ldLnZhbHVlKSlyZXR1cm4hMX1yZXR1cm4hMH1yZXR1cm4hMX0sZS5wcm90b3R5cGUuZXh0ZW5kU2VsZWN0b3I9ZnVuY3Rpb24oZSx0LGksbil7dmFyIHIscyxvLGEsbCx1PTAsYz0wLGg9W107Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKylzPXRbKGE9ZVtyXSkucGF0aEluZGV4XSxvPW5ldyBDZS5FbGVtZW50KGEuaW5pdGlhbENvbWJpbmF0b3IsaS5lbGVtZW50c1swXS52YWx1ZSxpLmVsZW1lbnRzWzBdLmlzVmFyaWFibGUsaS5lbGVtZW50c1swXS5nZXRJbmRleCgpLGkuZWxlbWVudHNbMF0uZmlsZUluZm8oKSksYS5wYXRoSW5kZXg+dSYmYz4wJiYoaFtoLmxlbmd0aC0xXS5lbGVtZW50cz1oW2gubGVuZ3RoLTFdLmVsZW1lbnRzLmNvbmNhdCh0W3VdLmVsZW1lbnRzLnNsaWNlKGMpKSxjPTAsdSsrKSxsPXMuZWxlbWVudHMuc2xpY2UoYyxhLmluZGV4KS5jb25jYXQoW29dKS5jb25jYXQoaS5lbGVtZW50cy5zbGljZSgxKSksdT09PWEucGF0aEluZGV4JiZyPjA/aFtoLmxlbmd0aC0xXS5lbGVtZW50cz1oW2gubGVuZ3RoLTFdLmVsZW1lbnRzLmNvbmNhdChsKTooaD1oLmNvbmNhdCh0LnNsaWNlKHUsYS5wYXRoSW5kZXgpKSkucHVzaChuZXcgQ2UuU2VsZWN0b3IobCkpLHU9YS5lbmRQYXRoSW5kZXgsKGM9YS5lbmRQYXRoRWxlbWVudEluZGV4KT49dFt1XS5lbGVtZW50cy5sZW5ndGgmJihjPTAsdSsrKTtyZXR1cm4gdTx0Lmxlbmd0aCYmYz4wJiYoaFtoLmxlbmd0aC0xXS5lbGVtZW50cz1oW2gubGVuZ3RoLTFdLmVsZW1lbnRzLmNvbmNhdCh0W3VdLmVsZW1lbnRzLnNsaWNlKGMpKSx1KyspLGg9KGg9aC5jb25jYXQodC5zbGljZSh1LHQubGVuZ3RoKSkpLm1hcCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jcmVhdGVEZXJpdmVkKGUuZWxlbWVudHMpO3JldHVybiBuP3QuZW5zdXJlVmlzaWJpbGl0eSgpOnQuZW5zdXJlSW52aXNpYmlsaXR5KCksdH0pKX0sZS5wcm90b3R5cGUudmlzaXRNZWRpYT1mdW5jdGlvbihlLHQpe3ZhciBpPWUuYWxsRXh0ZW5kcy5jb25jYXQodGhpcy5hbGxFeHRlbmRzU3RhY2tbdGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoLTFdKTtpPWkuY29uY2F0KHRoaXMuZG9FeHRlbmRDaGFpbmluZyhpLGUuYWxsRXh0ZW5kcykpLHRoaXMuYWxsRXh0ZW5kc1N0YWNrLnB1c2goaSl9LGUucHJvdG90eXBlLnZpc2l0TWVkaWFPdXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoLTE7dGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoPXR9LGUucHJvdG90eXBlLnZpc2l0QXRSdWxlPWZ1bmN0aW9uKGUsdCl7dmFyIGk9ZS5hbGxFeHRlbmRzLmNvbmNhdCh0aGlzLmFsbEV4dGVuZHNTdGFja1t0aGlzLmFsbEV4dGVuZHNTdGFjay5sZW5ndGgtMV0pO2k9aS5jb25jYXQodGhpcy5kb0V4dGVuZENoYWluaW5nKGksZS5hbGxFeHRlbmRzKSksdGhpcy5hbGxFeHRlbmRzU3RhY2sucHVzaChpKX0sZS5wcm90b3R5cGUudmlzaXRBdFJ1bGVPdXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoLTE7dGhpcy5hbGxFeHRlbmRzU3RhY2subGVuZ3RoPXR9LGV9KCksTGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dGhpcy5jb250ZXh0cz1bW11dLHRoaXMuX3Zpc2l0b3I9bmV3IFBlKHRoaXMpfXJldHVybiBlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3Zpc2l0b3IudmlzaXQoZSl9LGUucHJvdG90eXBlLnZpc2l0RGVjbGFyYXRpb249ZnVuY3Rpb24oZSx0KXt0LnZpc2l0RGVlcGVyPSExfSxlLnByb3RvdHlwZS52aXNpdE1peGluRGVmaW5pdGlvbj1mdW5jdGlvbihlLHQpe3QudmlzaXREZWVwZXI9ITF9LGUucHJvdG90eXBlLnZpc2l0UnVsZXNldD1mdW5jdGlvbihlLHQpe3ZhciBpLG49dGhpcy5jb250ZXh0c1t0aGlzLmNvbnRleHRzLmxlbmd0aC0xXSxyPVtdO3RoaXMuY29udGV4dHMucHVzaChyKSxlLnJvb3R8fCgoaT1lLnNlbGVjdG9ycykmJihpPWkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRJc091dHB1dCgpfSkpLGUuc2VsZWN0b3JzPWkubGVuZ3RoP2k6aT1udWxsLGkmJmUuam9pblNlbGVjdG9ycyhyLG4saSkpLGl8fChlLnJ1bGVzPW51bGwpLGUucGF0aHM9cil9LGUucHJvdG90eXBlLnZpc2l0UnVsZXNldE91dD1mdW5jdGlvbihlKXt0aGlzLmNvbnRleHRzLmxlbmd0aD10aGlzLmNvbnRleHRzLmxlbmd0aC0xfSxlLnByb3RvdHlwZS52aXNpdE1lZGlhPWZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5jb250ZXh0c1t0aGlzLmNvbnRleHRzLmxlbmd0aC0xXTtlLnJ1bGVzWzBdLnJvb3Q9MD09PWkubGVuZ3RofHxpWzBdLm11bHRpTWVkaWF9LGUucHJvdG90eXBlLnZpc2l0QXRSdWxlPWZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5jb250ZXh0c1t0aGlzLmNvbnRleHRzLmxlbmd0aC0xXTtlLnJ1bGVzJiZlLnJ1bGVzLmxlbmd0aCYmKGUucnVsZXNbMF0ucm9vdD1lLmlzUm9vdGVkfHwwPT09aS5sZW5ndGh8fG51bGwpfSxlfSgpLGplPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLl92aXNpdG9yPW5ldyBQZSh0aGlzKSx0aGlzLl9jb250ZXh0PWV9cmV0dXJuIGUucHJvdG90eXBlLmNvbnRhaW5zU2lsZW50Tm9uQmxvY2tlZENoaWxkPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFlKXJldHVybiExO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKWlmKCh0PWVbaV0pLmlzU2lsZW50JiZ0LmlzU2lsZW50KHRoaXMuX2NvbnRleHQpJiYhdC5ibG9ja3NWaXNpYmlsaXR5KCkpcmV0dXJuITA7cmV0dXJuITF9LGUucHJvdG90eXBlLmtlZXBPbmx5VmlzaWJsZUNoaWxkcz1mdW5jdGlvbihlKXtlJiZlLnJ1bGVzJiYoZS5ydWxlcz1lLnJ1bGVzLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNWaXNpYmxlKCl9KSkpfSxlLnByb3RvdHlwZS5pc0VtcHR5PWZ1bmN0aW9uKGUpe3JldHVybiFlfHwhZS5ydWxlc3x8MD09PWUucnVsZXMubGVuZ3RofSxlLnByb3RvdHlwZS5oYXNWaXNpYmxlU2VsZWN0b3I9ZnVuY3Rpb24oZSl7cmV0dXJuISghZXx8IWUucGF0aHMpJiZlLnBhdGhzLmxlbmd0aD4wfSxlLnByb3RvdHlwZS5yZXNvbHZlVmlzaWJpbGl0eT1mdW5jdGlvbihlLHQpe2lmKCFlLmJsb2Nrc1Zpc2liaWxpdHkoKSl7aWYodGhpcy5pc0VtcHR5KGUpJiYhdGhpcy5jb250YWluc1NpbGVudE5vbkJsb2NrZWRDaGlsZCh0KSlyZXR1cm47cmV0dXJuIGV9dmFyIGk9ZS5ydWxlc1swXTtpZih0aGlzLmtlZXBPbmx5VmlzaWJsZUNoaWxkcyhpKSwhdGhpcy5pc0VtcHR5KGkpKXJldHVybiBlLmVuc3VyZVZpc2liaWxpdHkoKSxlLnJlbW92ZVZpc2liaWxpdHlCbG9jaygpLGV9LGUucHJvdG90eXBlLmlzVmlzaWJsZVJ1bGVzZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuISFlLmZpcnN0Um9vdHx8IXRoaXMuaXNFbXB0eShlKSYmISghZS5yb290JiYhdGhpcy5oYXNWaXNpYmxlU2VsZWN0b3IoZSkpfSxlfSgpLE5lPWZ1bmN0aW9uKGUpe3RoaXMuX3Zpc2l0b3I9bmV3IFBlKHRoaXMpLHRoaXMuX2NvbnRleHQ9ZSx0aGlzLnV0aWxzPW5ldyBqZShlKX07TmUucHJvdG90eXBlPXtpc1JlcGxhY2luZzohMCxydW46ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3Zpc2l0b3IudmlzaXQoZSl9LHZpc2l0RGVjbGFyYXRpb246ZnVuY3Rpb24oZSx0KXtpZighZS5ibG9ja3NWaXNpYmlsaXR5KCkmJiFlLnZhcmlhYmxlKXJldHVybiBlfSx2aXNpdE1peGluRGVmaW5pdGlvbjpmdW5jdGlvbihlLHQpe2UuZnJhbWVzPVtdfSx2aXNpdEV4dGVuZDpmdW5jdGlvbihlLHQpe30sdmlzaXRDb21tZW50OmZ1bmN0aW9uKGUsdCl7aWYoIWUuYmxvY2tzVmlzaWJpbGl0eSgpJiYhZS5pc1NpbGVudCh0aGlzLl9jb250ZXh0KSlyZXR1cm4gZX0sdmlzaXRNZWRpYTpmdW5jdGlvbihlLHQpe3ZhciBpPWUucnVsZXNbMF0ucnVsZXM7cmV0dXJuIGUuYWNjZXB0KHRoaXMuX3Zpc2l0b3IpLHQudmlzaXREZWVwZXI9ITEsdGhpcy51dGlscy5yZXNvbHZlVmlzaWJpbGl0eShlLGkpfSx2aXNpdEltcG9ydDpmdW5jdGlvbihlLHQpe2lmKCFlLmJsb2Nrc1Zpc2liaWxpdHkoKSlyZXR1cm4gZX0sdmlzaXRBdFJ1bGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5ydWxlcyYmZS5ydWxlcy5sZW5ndGg/dGhpcy52aXNpdEF0UnVsZVdpdGhCb2R5KGUsdCk6dGhpcy52aXNpdEF0UnVsZVdpdGhvdXRCb2R5KGUsdCl9LHZpc2l0QW5vbnltb3VzOmZ1bmN0aW9uKGUsdCl7aWYoIWUuYmxvY2tzVmlzaWJpbGl0eSgpKXJldHVybiBlLmFjY2VwdCh0aGlzLl92aXNpdG9yKSxlfSx2aXNpdEF0UnVsZVdpdGhCb2R5OmZ1bmN0aW9uKGUsdCl7dmFyIGk9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ydWxlcztyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ydWxlcztyZXR1cm4gMT09PXQubGVuZ3RoJiYoIXRbMF0ucGF0aHN8fDA9PT10WzBdLnBhdGhzLmxlbmd0aCl9KGUpP3RbMF0ucnVsZXM6dH0oZSk7cmV0dXJuIGUuYWNjZXB0KHRoaXMuX3Zpc2l0b3IpLHQudmlzaXREZWVwZXI9ITEsdGhpcy51dGlscy5pc0VtcHR5KGUpfHx0aGlzLl9tZXJnZVJ1bGVzKGUucnVsZXNbMF0ucnVsZXMpLHRoaXMudXRpbHMucmVzb2x2ZVZpc2liaWxpdHkoZSxpKX0sdmlzaXRBdFJ1bGVXaXRob3V0Qm9keTpmdW5jdGlvbihlLHQpe2lmKCFlLmJsb2Nrc1Zpc2liaWxpdHkoKSl7aWYoIkBjaGFyc2V0Ij09PWUubmFtZSl7aWYodGhpcy5jaGFyc2V0KXtpZihlLmRlYnVnSW5mbyl7dmFyIGk9bmV3IENlLkNvbW1lbnQoIi8qICIrZS50b0NTUyh0aGlzLl9jb250ZXh0KS5yZXBsYWNlKC9cbi9nLCIiKSsiICovXG4iKTtyZXR1cm4gaS5kZWJ1Z0luZm89ZS5kZWJ1Z0luZm8sdGhpcy5fdmlzaXRvci52aXNpdChpKX1yZXR1cm59dGhpcy5jaGFyc2V0PSEwfXJldHVybiBlfX0sY2hlY2tWYWxpZE5vZGVzOmZ1bmN0aW9uKGUsdCl7aWYoZSlmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG49ZVtpXTtpZih0JiZuIGluc3RhbmNlb2YgQ2UuRGVjbGFyYXRpb24mJiFuLnZhcmlhYmxlKXRocm93e21lc3NhZ2U6IlByb3BlcnRpZXMgbXVzdCBiZSBpbnNpZGUgc2VsZWN0b3IgYmxvY2tzLiBUaGV5IGNhbm5vdCBiZSBpbiB0aGUgcm9vdCIsaW5kZXg6bi5nZXRJbmRleCgpLGZpbGVuYW1lOm4uZmlsZUluZm8oKSYmbi5maWxlSW5mbygpLmZpbGVuYW1lfTtpZihuIGluc3RhbmNlb2YgQ2UuQ2FsbCl0aHJvd3ttZXNzYWdlOiJGdW5jdGlvbiAnIituLm5hbWUrIicgZGlkIG5vdCByZXR1cm4gYSByb290IG5vZGUiLGluZGV4Om4uZ2V0SW5kZXgoKSxmaWxlbmFtZTpuLmZpbGVJbmZvKCkmJm4uZmlsZUluZm8oKS5maWxlbmFtZX07aWYobi50eXBlJiYhbi5hbGxvd1Jvb3QpdGhyb3d7bWVzc2FnZTpuLnR5cGUrIiBub2RlIHJldHVybmVkIGJ5IGEgZnVuY3Rpb24gaXMgbm90IHZhbGlkIGhlcmUiLGluZGV4Om4uZ2V0SW5kZXgoKSxmaWxlbmFtZTpuLmZpbGVJbmZvKCkmJm4uZmlsZUluZm8oKS5maWxlbmFtZX19fSx2aXNpdFJ1bGVzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgaSxuPVtdO2lmKHRoaXMuY2hlY2tWYWxpZE5vZGVzKGUucnVsZXMsZS5maXJzdFJvb3QpLGUucm9vdCllLmFjY2VwdCh0aGlzLl92aXNpdG9yKSx0LnZpc2l0RGVlcGVyPSExO2Vsc2V7dGhpcy5fY29tcGlsZVJ1bGVzZXRQYXRocyhlKTtmb3IodmFyIHI9ZS5ydWxlcyxzPXI/ci5sZW5ndGg6MCxvPTA7bzxzOykoaT1yW29dKSYmaS5ydWxlcz8obi5wdXNoKHRoaXMuX3Zpc2l0b3IudmlzaXQoaSkpLHIuc3BsaWNlKG8sMSkscy0tKTpvKys7cz4wP2UuYWNjZXB0KHRoaXMuX3Zpc2l0b3IpOmUucnVsZXM9bnVsbCx0LnZpc2l0RGVlcGVyPSExfXJldHVybiBlLnJ1bGVzJiYodGhpcy5fbWVyZ2VSdWxlcyhlLnJ1bGVzKSx0aGlzLl9yZW1vdmVEdXBsaWNhdGVSdWxlcyhlLnJ1bGVzKSksdGhpcy51dGlscy5pc1Zpc2libGVSdWxlc2V0KGUpJiYoZS5lbnN1cmVWaXNpYmlsaXR5KCksbi5zcGxpY2UoMCwwLGUpKSwxPT09bi5sZW5ndGg/blswXTpufSxfY29tcGlsZVJ1bGVzZXRQYXRoczpmdW5jdGlvbihlKXtlLnBhdGhzJiYoZS5wYXRocz1lLnBhdGhzLmZpbHRlcigoZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKCIgIj09PWVbMF0uZWxlbWVudHNbMF0uY29tYmluYXRvci52YWx1ZSYmKGVbMF0uZWxlbWVudHNbMF0uY29tYmluYXRvcj1uZXcgQ2UuQ29tYmluYXRvcigiIikpLHQ9MDt0PGUubGVuZ3RoO3QrKylpZihlW3RdLmlzVmlzaWJsZSgpJiZlW3RdLmdldElzT3V0cHV0KCkpcmV0dXJuITA7cmV0dXJuITF9KSkpfSxfcmVtb3ZlRHVwbGljYXRlUnVsZXM6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQsaSxuLHI9e307Zm9yKG49ZS5sZW5ndGgtMTtuPj0wO24tLSlpZigoaT1lW25dKWluc3RhbmNlb2YgQ2UuRGVjbGFyYXRpb24paWYocltpLm5hbWVdKXsodD1yW2kubmFtZV0paW5zdGFuY2VvZiBDZS5EZWNsYXJhdGlvbiYmKHQ9cltpLm5hbWVdPVtyW2kubmFtZV0udG9DU1ModGhpcy5fY29udGV4dCldKTt2YXIgcz1pLnRvQ1NTKHRoaXMuX2NvbnRleHQpOy0xIT09dC5pbmRleE9mKHMpP2Uuc3BsaWNlKG4sMSk6dC5wdXNoKHMpfWVsc2UgcltpLm5hbWVdPWl9fSxfbWVyZ2VSdWxlczpmdW5jdGlvbihlKXtpZihlKXtmb3IodmFyIHQ9e30saT1bXSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07aWYoci5tZXJnZSl7dmFyIHM9ci5uYW1lO3Rbc10/ZS5zcGxpY2Uobi0tLDEpOmkucHVzaCh0W3NdPVtdKSx0W3NdLnB1c2gocil9fWkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoZS5sZW5ndGg+MCl7dmFyIHQ9ZVswXSxpPVtdLG49W25ldyBDZS5FeHByZXNzaW9uKGkpXTtlLmZvckVhY2goKGZ1bmN0aW9uKGUpeyIrIj09PWUubWVyZ2UmJmkubGVuZ3RoPjAmJm4ucHVzaChuZXcgQ2UuRXhwcmVzc2lvbihpPVtdKSksaS5wdXNoKGUudmFsdWUpLHQuaW1wb3J0YW50PXQuaW1wb3J0YW50fHxlLmltcG9ydGFudH0pKSx0LnZhbHVlPW5ldyBDZS5WYWx1ZShuKX19KSl9fX07dmFyIERlPXtWaXNpdG9yOlBlLEltcG9ydFZpc2l0b3I6T2UsTWFya1Zpc2libGVTZWxlY3RvcnNWaXNpdG9yOlZlLEV4dGVuZFZpc2l0b3I6JGUsSm9pblNlbGVjdG9yVmlzaXRvcjpMZSxUb0NTU1Zpc2l0b3I6TmV9O3ZhciBCZT1mdW5jdGlvbigpe3ZhciBlLHQsaSxuLHIscyxvLGE9W10sbD17fTtmdW5jdGlvbiB1KGkpe2Zvcih2YXIgbixhLGMsaD1sLmksZj10LHA9bC5pLW8sdj1sLmkrcy5sZW5ndGgtcCxkPWwuaSs9aSxtPWU7bC5pPHY7bC5pKyspe2lmKG49bS5jaGFyQ29kZUF0KGwuaSksbC5hdXRvQ29tbWVudEFic29yYiYmNDc9PT1uKXtpZigiLyI9PT0oYT1tLmNoYXJBdChsLmkrMSkpKXtjPXtpbmRleDpsLmksaXNMaW5lQ29tbWVudDohMH07dmFyIGc9bS5pbmRleE9mKCJcbiIsbC5pKzIpO2c8MCYmKGc9diksbC5pPWcsYy50ZXh0PW0uc3Vic3RyKGMuaW5kZXgsbC5pLWMuaW5kZXgpLGwuY29tbWVudFN0b3JlLnB1c2goYyk7Y29udGludWV9aWYoIioiPT09YSl7dmFyIHk9bS5pbmRleE9mKCIqLyIsbC5pKzIpO2lmKHk+PTApe2M9e2luZGV4OmwuaSx0ZXh0Om0uc3Vic3RyKGwuaSx5KzItbC5pKSxpc0xpbmVDb21tZW50OiExfSxsLmkrPWMudGV4dC5sZW5ndGgtMSxsLmNvbW1lbnRTdG9yZS5wdXNoKGMpO2NvbnRpbnVlfX1icmVha31pZigzMiE9PW4mJjEwIT09biYmOSE9PW4mJjEzIT09bilicmVha31pZihzPXMuc2xpY2UoaStsLmktZCtwKSxvPWwuaSwhcy5sZW5ndGgpe2lmKHQ8ci5sZW5ndGgtMSlyZXR1cm4gcz1yWysrdF0sdSgwKSwhMDtsLmZpbmlzaGVkPSEwfXJldHVybiBoIT09bC5pfHxmIT09dH1yZXR1cm4gbC5zYXZlPWZ1bmN0aW9uKCl7bz1sLmksYS5wdXNoKHtjdXJyZW50OnMsaTpsLmksajp0fSl9LGwucmVzdG9yZT1mdW5jdGlvbihlKXsobC5pPml8fGwuaT09PWkmJmUmJiFuKSYmKGk9bC5pLG49ZSk7dmFyIHI9YS5wb3AoKTtzPXIuY3VycmVudCxvPWwuaT1yLmksdD1yLmp9LGwuZm9yZ2V0PWZ1bmN0aW9uKCl7YS5wb3AoKX0sbC5pc1doaXRlc3BhY2U9ZnVuY3Rpb24odCl7dmFyIGk9bC5pKyh0fHwwKSxuPWUuY2hhckNvZGVBdChpKTtyZXR1cm4gMzI9PT1ufHwxMz09PW58fDk9PT1ufHwxMD09PW59LGwuJHJlPWZ1bmN0aW9uKGUpe2wuaT5vJiYocz1zLnNsaWNlKGwuaS1vKSxvPWwuaSk7dmFyIHQ9ZS5leGVjKHMpO3JldHVybiB0Pyh1KHRbMF0ubGVuZ3RoKSwic3RyaW5nIj09dHlwZW9mIHQ/dDoxPT09dC5sZW5ndGg/dFswXTp0KTpudWxsfSxsLiRjaGFyPWZ1bmN0aW9uKHQpe3JldHVybiBlLmNoYXJBdChsLmkpIT09dD9udWxsOih1KDEpLHQpfSxsLiRzdHI9ZnVuY3Rpb24odCl7Zm9yKHZhciBpPXQubGVuZ3RoLG49MDtuPGk7bisrKWlmKGUuY2hhckF0KGwuaStuKSE9PXQuY2hhckF0KG4pKXJldHVybiBudWxsO3JldHVybiB1KGkpLHR9LGwuJHF1b3RlZD1mdW5jdGlvbih0KXt2YXIgaT10fHxsLmksbj1lLmNoYXJBdChpKTtpZigiJyI9PT1ufHwnIic9PT1uKXtmb3IodmFyIHI9ZS5sZW5ndGgscz1pLG89MTtvK3M8cjtvKyspe3N3aXRjaChlLmNoYXJBdChvK3MpKXtjYXNlIlxcIjpvKys7Y29udGludWU7Y2FzZSJcciI6Y2FzZSJcbiI6YnJlYWs7Y2FzZSBuOnZhciBhPWUuc3Vic3RyKHMsbysxKTtyZXR1cm4gdHx8MD09PXQ/W24sYV06KHUobysxKSxhKX19cmV0dXJuIG51bGx9fSxsLiRwYXJzZVVudGlsPWZ1bmN0aW9uKHQpe3ZhciBpLG49IiIscj1udWxsLHM9ITEsbz0wLGE9W10sYz1bXSxoPWUubGVuZ3RoLGY9bC5pLHA9bC5pLHY9bC5pLGQ9ITA7aT0ic3RyaW5nIj09dHlwZW9mIHQ/ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fTpmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KGUpfTtkb3t2YXIgbT1lLmNoYXJBdCh2KTtpZigwPT09byYmaShtKSkocj1lLnN1YnN0cihwLHYtcCkpP2MucHVzaChyKTpjLnB1c2goIiAiKSxyPWMsdSh2LWYpLGQ9ITE7ZWxzZXtpZihzKXsiKiI9PT1tJiYiLyI9PT1lLmNoYXJBdCh2KzEpJiYodisrLG8tLSxzPSExKSx2Kys7Y29udGludWV9c3dpdGNoKG0pe2Nhc2UiXFwiOnYrKyxtPWUuY2hhckF0KHYpLGMucHVzaChlLnN1YnN0cihwLHYtcCsxKSkscD12KzE7YnJlYWs7Y2FzZSIvIjoiKiI9PT1lLmNoYXJBdCh2KzEpJiYodisrLHM9ITAsbysrKTticmVhaztjYXNlIiciOmNhc2UnIic6KG49bC4kcXVvdGVkKHYpKT8oYy5wdXNoKGUuc3Vic3RyKHAsdi1wKSxuKSxwPSh2Kz1uWzFdLmxlbmd0aC0xKSsxKToodSh2LWYpLHI9bSxkPSExKTticmVhaztjYXNlInsiOmEucHVzaCgifSIpLG8rKzticmVhaztjYXNlIigiOmEucHVzaCgiKSIpLG8rKzticmVhaztjYXNlIlsiOmEucHVzaCgiXSIpLG8rKzticmVhaztjYXNlIn0iOmNhc2UiKSI6Y2FzZSJdIjp2YXIgZz1hLnBvcCgpO209PT1nP28tLToodSh2LWYpLHI9ZyxkPSExKX0rK3Y+aCYmKGQ9ITEpfX13aGlsZShkKTtyZXR1cm4gcnx8bnVsbH0sbC5hdXRvQ29tbWVudEFic29yYj0hMCxsLmNvbW1lbnRTdG9yZT1bXSxsLmZpbmlzaGVkPSExLGwucGVlaz1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKWlmKGUuY2hhckF0KGwuaStpKSE9PXQuY2hhckF0KGkpKXJldHVybiExO3JldHVybiEwfXJldHVybiB0LnRlc3Qocyl9LGwucGVla0NoYXI9ZnVuY3Rpb24odCl7cmV0dXJuIGUuY2hhckF0KGwuaSk9PT10fSxsLmN1cnJlbnRDaGFyPWZ1bmN0aW9uKCl7cmV0dXJuIGUuY2hhckF0KGwuaSl9LGwucHJldkNoYXI9ZnVuY3Rpb24oKXtyZXR1cm4gZS5jaGFyQXQobC5pLTEpfSxsLmdldElucHV0PWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGwucGVla05vdE51bWVyaWM9ZnVuY3Rpb24oKXt2YXIgdD1lLmNoYXJDb2RlQXQobC5pKTtyZXR1cm4gdD41N3x8dDw0M3x8NDc9PT10fHw0ND09PXR9LGwuc3RhcnQ9ZnVuY3Rpb24obixhLGMpe2U9bixsLmk9dD1vPWk9MCxyPWE/ZnVuY3Rpb24oZSx0KXt2YXIgaSxuLHIscyxvLGEsbCx1LGMsaD1lLmxlbmd0aCxmPTAscD0wLHY9W10sZD0wO2Z1bmN0aW9uIG0odCl7dmFyIGk9by1kO2k8NTEyJiYhdHx8IWl8fCh2LnB1c2goZS5zbGljZShkLG8rMSkpLGQ9bysxKX1mb3Iobz0wO288aDtvKyspaWYoISgobD1lLmNoYXJDb2RlQXQobykpPj05NyYmbDw9MTIyfHxsPDM0KSlzd2l0Y2gobCl7Y2FzZSA0MDpwKyssbj1vO2NvbnRpbnVlO2Nhc2UgNDE6aWYoLS1wPDApcmV0dXJuIHQoIm1pc3Npbmcgb3BlbmluZyBgKGAiLG8pO2NvbnRpbnVlO2Nhc2UgNTk6cHx8bSgpO2NvbnRpbnVlO2Nhc2UgMTIzOmYrKyxpPW87Y29udGludWU7Y2FzZSAxMjU6aWYoLS1mPDApcmV0dXJuIHQoIm1pc3Npbmcgb3BlbmluZyBge2AiLG8pO2Z8fHB8fG0oKTtjb250aW51ZTtjYXNlIDkyOmlmKG88aC0xKXtvKys7Y29udGludWV9cmV0dXJuIHQoInVuZXNjYXBlZCBgXFxgIixvKTtjYXNlIDM0OmNhc2UgMzk6Y2FzZSA5Njpmb3IoYz0wLGE9byxvKz0xO288aDtvKyspaWYoISgodT1lLmNoYXJDb2RlQXQobykpPjk2KSl7aWYodT09bCl7Yz0xO2JyZWFrfWlmKDkyPT11KXtpZihvPT1oLTEpcmV0dXJuIHQoInVuZXNjYXBlZCBgXFxgIixvKTtvKyt9fWlmKGMpY29udGludWU7cmV0dXJuIHQoInVubWF0Y2hlZCBgIitTdHJpbmcuZnJvbUNoYXJDb2RlKGwpKyJgIixhKTtjYXNlIDQ3OmlmKHB8fG89PWgtMSljb250aW51ZTtpZig0Nz09KHU9ZS5jaGFyQ29kZUF0KG8rMSkpKWZvcihvKz0yO288aCYmKCEoKHU9ZS5jaGFyQ29kZUF0KG8pKTw9MTMpfHwxMCE9dSYmMTMhPXUpO28rKyk7ZWxzZSBpZig0Mj09dSl7Zm9yKHI9YT1vLG8rPTI7bzxoLTEmJigxMjU9PSh1PWUuY2hhckNvZGVBdChvKSkmJihzPW8pLDQyIT11fHw0NyE9ZS5jaGFyQ29kZUF0KG8rMSkpO28rKyk7aWYobz09aC0xKXJldHVybiB0KCJtaXNzaW5nIGNsb3NpbmcgYCovYCIsYSk7bysrfWNvbnRpbnVlO2Nhc2UgNDI6aWYobzxoLTEmJjQ3PT1lLmNoYXJDb2RlQXQobysxKSlyZXR1cm4gdCgidW5tYXRjaGVkIGAvKmAiLG8pO2NvbnRpbnVlfXJldHVybiAwIT09Zj90KHI+aSYmcz5yPyJtaXNzaW5nIGNsb3NpbmcgYH1gIG9yIGAqL2AiOiJtaXNzaW5nIGNsb3NpbmcgYH1gIixpKTowIT09cD90KCJtaXNzaW5nIGNsb3NpbmcgYClgIixuKToobSghMCksdil9KG4sYyk6W25dLHM9clswXSx1KDApfSxsLmVuZD1mdW5jdGlvbigpe3ZhciB0LHI9bC5pPj1lLmxlbmd0aDtyZXR1cm4gbC5pPGkmJih0PW4sbC5pPWkpLHtpc0ZpbmlzaGVkOnIsZnVydGhlc3Q6bC5pLGZ1cnRoZXN0UG9zc2libGVFcnJvck1lc3NhZ2U6dCxmdXJ0aGVzdFJlYWNoZWRFbmQ6bC5pPj1lLmxlbmd0aC0xLGZ1cnRoZXN0Q2hhcjplW2wuaV19fSxsfSxVZT1mdW5jdGlvbiBlKHQsaSxuKXt2YXIgcixzPUJlKCk7ZnVuY3Rpb24gbyhlLHQpe3Rocm93IG5ldyBPKHtpbmRleDpzLmksZmlsZW5hbWU6bi5maWxlbmFtZSx0eXBlOnR8fCJTeW50YXgiLG1lc3NhZ2U6ZX0saSl9ZnVuY3Rpb24gYShlLHQpe3ZhciBpPWUgaW5zdGFuY2VvZiBGdW5jdGlvbj9lLmNhbGwocik6cy4kcmUoZSk7aWYoaSlyZXR1cm4gaTtvKHR8fCgic3RyaW5nIj09dHlwZW9mIGU/ImV4cGVjdGVkICciK2UrIicgZ290ICciK3MuY3VycmVudENoYXIoKSsiJyI6InVuZXhwZWN0ZWQgdG9rZW4iKSl9ZnVuY3Rpb24gbChlLHQpe2lmKHMuJGNoYXIoZSkpcmV0dXJuIGU7byh0fHwiZXhwZWN0ZWQgJyIrZSsiJyBnb3QgJyIrcy5jdXJyZW50Q2hhcigpKyInIil9ZnVuY3Rpb24gdShlKXt2YXIgdD1uLmZpbGVuYW1lO3JldHVybntsaW5lTnVtYmVyOkMoZSxzLmdldElucHV0KCkpLmxpbmUrMSxmaWxlTmFtZTp0fX1yZXR1cm57cGFyc2VySW5wdXQ6cyxpbXBvcnRzOmksZmlsZUluZm86bixwYXJzZU5vZGU6ZnVuY3Rpb24oZSx0LG4sbyxhKXt2YXIgbCx1PVtdLGM9czt0cnl7Yy5zdGFydChlLCExLChmdW5jdGlvbihlLHQpe2Eoe21lc3NhZ2U6ZSxpbmRleDp0K259KX0pKTtmb3IodmFyIGg9MCxmPXZvaWQgMCxwPXZvaWQgMDtmPXRbaF07aCsrKWlmKHA9Yy5pLGw9cltmXSgpKXt0cnl7bC5faW5kZXg9cCtuLGwuX2ZpbGVJbmZvPW99Y2F0Y2goZSl7fXUucHVzaChsKX1lbHNlIHUucHVzaChudWxsKTtjLmVuZCgpLmlzRmluaXNoZWQ/YShudWxsLHUpOmEoITAsbnVsbCl9Y2F0Y2goZSl7dGhyb3cgbmV3IE8oe2luZGV4OmUuaW5kZXgrbixtZXNzYWdlOmUubWVzc2FnZX0saSxvLmZpbGVuYW1lKX19LHBhcnNlOmZ1bmN0aW9uKHIsbyxhKXt2YXIgbCx1LGMsaCxmPW51bGwscD0iIjtpZih1PWEmJmEuZ2xvYmFsVmFycz9lLnNlcmlhbGl6ZVZhcnMoYS5nbG9iYWxWYXJzKSsiXG4iOiIiLGM9YSYmYS5tb2RpZnlWYXJzPyJcbiIrZS5zZXJpYWxpemVWYXJzKGEubW9kaWZ5VmFycyk6IiIsdC5wbHVnaW5NYW5hZ2VyKWZvcih2YXIgdj10LnBsdWdpbk1hbmFnZXIuZ2V0UHJlUHJvY2Vzc29ycygpLGQ9MDtkPHYubGVuZ3RoO2QrKylyPXZbZF0ucHJvY2VzcyhyLHtjb250ZXh0OnQsaW1wb3J0czppLGZpbGVJbmZvOm59KTsodXx8YSYmYS5iYW5uZXIpJiYocD0oYSYmYS5iYW5uZXI/YS5iYW5uZXI6IiIpK3UsKGg9aS5jb250ZW50c0lnbm9yZWRDaGFycylbbi5maWxlbmFtZV09aFtuLmZpbGVuYW1lXXx8MCxoW24uZmlsZW5hbWVdKz1wLmxlbmd0aCkscj1wKyhyPXIucmVwbGFjZSgvXHJcbj8vZywiXG4iKSkucmVwbGFjZSgvXlx1RkVGRi8sIiIpK2MsaS5jb250ZW50c1tuLmZpbGVuYW1lXT1yO3RyeXtzLnN0YXJ0KHIsdC5jaHVua0lucHV0LChmdW5jdGlvbihlLHQpe3Rocm93IG5ldyBPKHtpbmRleDp0LHR5cGU6IlBhcnNlIixtZXNzYWdlOmUsZmlsZW5hbWU6bi5maWxlbmFtZX0saSl9KSksQ2UuTm9kZS5wcm90b3R5cGUucGFyc2U9dGhpcyxsPW5ldyBDZS5SdWxlc2V0KG51bGwsdGhpcy5wYXJzZXJzLnByaW1hcnkoKSksQ2UuTm9kZS5wcm90b3R5cGUucm9vdE5vZGU9bCxsLnJvb3Q9ITAsbC5maXJzdFJvb3Q9ITAsbC5mdW5jdGlvblJlZ2lzdHJ5PUguaW5oZXJpdCgpfWNhdGNoKGUpe3JldHVybiBvKG5ldyBPKGUsaSxuLmZpbGVuYW1lKSl9dmFyIG09cy5lbmQoKTtpZighbS5pc0ZpbmlzaGVkKXt2YXIgZz1tLmZ1cnRoZXN0UG9zc2libGVFcnJvck1lc3NhZ2U7Z3x8KGc9IlVucmVjb2duaXNlZCBpbnB1dCIsIn0iPT09bS5mdXJ0aGVzdENoYXI/Zys9Ii4gUG9zc2libHkgbWlzc2luZyBvcGVuaW5nICd7JyI6IikiPT09bS5mdXJ0aGVzdENoYXI/Zys9Ii4gUG9zc2libHkgbWlzc2luZyBvcGVuaW5nICcoJyI6bS5mdXJ0aGVzdFJlYWNoZWRFbmQmJihnKz0iLiBQb3NzaWJseSBtaXNzaW5nIHNvbWV0aGluZyIpKSxmPW5ldyBPKHt0eXBlOiJQYXJzZSIsbWVzc2FnZTpnLGluZGV4Om0uZnVydGhlc3QsZmlsZW5hbWU6bi5maWxlbmFtZX0saSl9dmFyIHk9ZnVuY3Rpb24oZSl7cmV0dXJuKGU9Znx8ZXx8aS5lcnJvcik/KGUgaW5zdGFuY2VvZiBPfHwoZT1uZXcgTyhlLGksbi5maWxlbmFtZSkpLG8oZSkpOm8obnVsbCxsKX07aWYoITE9PT10LnByb2Nlc3NJbXBvcnRzKXJldHVybiB5KCk7bmV3IERlLkltcG9ydFZpc2l0b3IoaSx5KS5ydW4obCl9LHBhcnNlcnM6cj17cHJpbWFyeTpmdW5jdGlvbigpe2Zvcih2YXIgZSx0PXRoaXMubWl4aW4saT1bXTs7KXtmb3IoO2U9dGhpcy5jb21tZW50KCk7KWkucHVzaChlKTtpZihzLmZpbmlzaGVkKWJyZWFrO2lmKHMucGVlaygifSIpKWJyZWFrO2lmKGU9dGhpcy5leHRlbmRSdWxlKCkpaT1pLmNvbmNhdChlKTtlbHNlIGlmKGU9dC5kZWZpbml0aW9uKCl8fHRoaXMuZGVjbGFyYXRpb24oKXx8dC5jYWxsKCExLCExKXx8dGhpcy5ydWxlc2V0KCl8fHRoaXMudmFyaWFibGVDYWxsKCl8fHRoaXMuZW50aXRpZXMuY2FsbCgpfHx0aGlzLmF0cnVsZSgpKWkucHVzaChlKTtlbHNle2Zvcih2YXIgbj0hMTtzLiRjaGFyKCI7Iik7KW49ITA7aWYoIW4pYnJlYWt9fXJldHVybiBpfSxjb21tZW50OmZ1bmN0aW9uKCl7aWYocy5jb21tZW50U3RvcmUubGVuZ3RoKXt2YXIgZT1zLmNvbW1lbnRTdG9yZS5zaGlmdCgpO3JldHVybiBuZXcgQ2UuQ29tbWVudChlLnRleHQsZS5pc0xpbmVDb21tZW50LGUuaW5kZXgsbil9fSxlbnRpdGllczp7bWl4aW5Mb29rdXA6ZnVuY3Rpb24oKXtyZXR1cm4gci5taXhpbi5jYWxsKCEwLCEwKX0scXVvdGVkOmZ1bmN0aW9uKGUpe3ZhciB0LGk9cy5pLHI9ITE7aWYocy5zYXZlKCkscy4kY2hhcigifiIpKXI9ITA7ZWxzZSBpZihlKXJldHVybiB2b2lkIHMucmVzdG9yZSgpO2lmKHQ9cy4kcXVvdGVkKCkpcmV0dXJuIHMuZm9yZ2V0KCksbmV3IENlLlF1b3RlZCh0LmNoYXJBdCgwKSx0LnN1YnN0cigxLHQubGVuZ3RoLTIpLHIsaSxuKTtzLnJlc3RvcmUoKX0sa2V5d29yZDpmdW5jdGlvbigpe3ZhciBlPXMuJGNoYXIoIiUiKXx8cy4kcmUoL15cWz8oPzpbXHctXXxcXCg/OltBLUZhLWYwLTldezEsNn0gP3xbXkEtRmEtZjAtOV0pKStcXT8vKTtpZihlKXJldHVybiBDZS5Db2xvci5mcm9tS2V5d29yZChlKXx8bmV3IENlLktleXdvcmQoZSl9LGNhbGw6ZnVuY3Rpb24oKXt2YXIgZSx0LGkscj1zLmk7aWYoIXMucGVlaygvXnVybFwoL2kpKWlmKHMuc2F2ZSgpLGU9cy4kcmUoL14oW1x3LV0rfCV8fnxwcm9naWQ6W1x3XC5dKylcKC8pKXtpZihlPWVbMV0sKGk9dGhpcy5jdXN0b21GdW5jQ2FsbChlKSkmJih0PWkucGFyc2UoKSkmJmkuc3RvcClyZXR1cm4gcy5mb3JnZXQoKSx0O2lmKHQ9dGhpcy5hcmd1bWVudHModCkscy4kY2hhcigiKSIpKXJldHVybiBzLmZvcmdldCgpLG5ldyBDZS5DYWxsKGUsdCxyLG4pO3MucmVzdG9yZSgiQ291bGQgbm90IHBhcnNlIGNhbGwgYXJndW1lbnRzIG9yIG1pc3NpbmcgJyknIil9ZWxzZSBzLmZvcmdldCgpfSxjdXN0b21GdW5jQ2FsbDpmdW5jdGlvbihlKXtyZXR1cm57YWxwaGE6dChyLmllQWxwaGEsITApLGJvb2xlYW46dChpKSxpZjp0KGkpfVtlLnRvTG93ZXJDYXNlKCldO2Z1bmN0aW9uIHQoZSx0KXtyZXR1cm57cGFyc2U6ZSxzdG9wOnR9fWZ1bmN0aW9uIGkoKXtyZXR1cm5bYShyLmNvbmRpdGlvbiwiZXhwZWN0ZWQgY29uZGl0aW9uIildfX0sYXJndW1lbnRzOmZ1bmN0aW9uKGUpe3ZhciB0LGksbj1lfHxbXSxvPVtdO2ZvcihzLnNhdmUoKTs7KXtpZihlKWU9ITE7ZWxzZXtpZighKGk9ci5kZXRhY2hlZFJ1bGVzZXQoKXx8dGhpcy5hc3NpZ25tZW50KCl8fHIuZXhwcmVzc2lvbigpKSlicmVhaztpLnZhbHVlJiYxPT1pLnZhbHVlLmxlbmd0aCYmKGk9aS52YWx1ZVswXSksbi5wdXNoKGkpfXMuJGNoYXIoIiwiKXx8KHMuJGNoYXIoIjsiKXx8dCkmJih0PSEwLGk9bi5sZW5ndGg8MT9uWzBdOm5ldyBDZS5WYWx1ZShuKSxvLnB1c2goaSksbj1bXSl9cmV0dXJuIHMuZm9yZ2V0KCksdD9vOm59LGxpdGVyYWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaW1lbnNpb24oKXx8dGhpcy5jb2xvcigpfHx0aGlzLnF1b3RlZCgpfHx0aGlzLnVuaWNvZGVEZXNjcmlwdG9yKCl9LGFzc2lnbm1lbnQ6ZnVuY3Rpb24oKXt2YXIgZSx0O2lmKHMuc2F2ZSgpLGU9cy4kcmUoL15cdysoPz1ccz89KS9pKSlpZihzLiRjaGFyKCI9Iikpe2lmKHQ9ci5lbnRpdHkoKSlyZXR1cm4gcy5mb3JnZXQoKSxuZXcgQ2UuQXNzaWdubWVudChlLHQpO3MucmVzdG9yZSgpfWVsc2Ugcy5yZXN0b3JlKCk7ZWxzZSBzLnJlc3RvcmUoKX0sdXJsOmZ1bmN0aW9uKCl7dmFyIGUsdD1zLmk7aWYocy5hdXRvQ29tbWVudEFic29yYj0hMSxzLiRzdHIoInVybCgiKSlyZXR1cm4gZT10aGlzLnF1b3RlZCgpfHx0aGlzLnZhcmlhYmxlKCl8fHRoaXMucHJvcGVydHkoKXx8cy4kcmUoL14oPzooPzpcXFtcKFwpJyJdKXxbXlwoXCknIl0pKy8pfHwiIixzLmF1dG9Db21tZW50QWJzb3JiPSEwLGwoIikiKSxuZXcgQ2UuVVJMKG51bGwhPWUudmFsdWV8fGUgaW5zdGFuY2VvZiBDZS5WYXJpYWJsZXx8ZSBpbnN0YW5jZW9mIENlLlByb3BlcnR5P2U6bmV3IENlLkFub255bW91cyhlLHQpLHQsbik7cy5hdXRvQ29tbWVudEFic29yYj0hMH0sdmFyaWFibGU6ZnVuY3Rpb24oKXt2YXIgZSx0LGk9cy5pO2lmKHMuc2F2ZSgpLCJAIj09PXMuY3VycmVudENoYXIoKSYmKHQ9cy4kcmUoL15AQD9bXHctXSsvKSkpe2lmKCIoIj09PShlPXMuY3VycmVudENoYXIoKSl8fCJbIj09PWUmJiFzLnByZXZDaGFyKCkubWF0Y2goL15ccy8pKXt2YXIgbz1yLnZhcmlhYmxlQ2FsbCh0KTtpZihvKXJldHVybiBzLmZvcmdldCgpLG99cmV0dXJuIHMuZm9yZ2V0KCksbmV3IENlLlZhcmlhYmxlKHQsaSxuKX1zLnJlc3RvcmUoKX0sdmFyaWFibGVDdXJseTpmdW5jdGlvbigpe3ZhciBlLHQ9cy5pO2lmKCJAIj09PXMuY3VycmVudENoYXIoKSYmKGU9cy4kcmUoL15AXHsoW1x3LV0rKVx9LykpKXJldHVybiBuZXcgQ2UuVmFyaWFibGUoIkAiK2VbMV0sdCxuKX0scHJvcGVydHk6ZnVuY3Rpb24oKXt2YXIgZSx0PXMuaTtpZigiJCI9PT1zLmN1cnJlbnRDaGFyKCkmJihlPXMuJHJlKC9eXCRbXHctXSsvKSkpcmV0dXJuIG5ldyBDZS5Qcm9wZXJ0eShlLHQsbil9LHByb3BlcnR5Q3VybHk6ZnVuY3Rpb24oKXt2YXIgZSx0PXMuaTtpZigiJCI9PT1zLmN1cnJlbnRDaGFyKCkmJihlPXMuJHJlKC9eXCRceyhbXHctXSspXH0vKSkpcmV0dXJuIG5ldyBDZS5Qcm9wZXJ0eSgiJCIrZVsxXSx0LG4pfSxjb2xvcjpmdW5jdGlvbigpe3ZhciBlO2lmKHMuc2F2ZSgpLCIjIj09PXMuY3VycmVudENoYXIoKSYmKGU9cy4kcmUoL14jKFtBLUZhLWYwLTldezh9fFtBLUZhLWYwLTldezZ9fFtBLUZhLWYwLTldezMsNH0pKFtcdy4jXFtdKT8vKSkmJiFlWzJdKXJldHVybiBzLmZvcmdldCgpLG5ldyBDZS5Db2xvcihlWzFdLHZvaWQgMCxlWzBdKTtzLnJlc3RvcmUoKX0sY29sb3JLZXl3b3JkOmZ1bmN0aW9uKCl7cy5zYXZlKCk7dmFyIGU9cy5hdXRvQ29tbWVudEFic29yYjtzLmF1dG9Db21tZW50QWJzb3JiPSExO3ZhciB0PXMuJHJlKC9eW19BLVphLXotXVtfQS1aYS16MC05LV0rLyk7aWYocy5hdXRvQ29tbWVudEFic29yYj1lLHQpe3MucmVzdG9yZSgpO3ZhciBpPUNlLkNvbG9yLmZyb21LZXl3b3JkKHQpO3JldHVybiBpPyhzLiRzdHIodCksaSk6dm9pZCAwfXMuZm9yZ2V0KCl9LGRpbWVuc2lvbjpmdW5jdGlvbigpe2lmKCFzLnBlZWtOb3ROdW1lcmljKCkpe3ZhciBlPXMuJHJlKC9eKFsrLV0/XGQqXC4/XGQrKSglfFthLXpfXSspPy9pKTtyZXR1cm4gZT9uZXcgQ2UuRGltZW5zaW9uKGVbMV0sZVsyXSk6dm9pZCAwfX0sdW5pY29kZURlc2NyaXB0b3I6ZnVuY3Rpb24oKXt2YXIgZTtpZihlPXMuJHJlKC9eVVwrWzAtOWEtZkEtRj9dKyhcLVswLTlhLWZBLUY/XSspPy8pKXJldHVybiBuZXcgQ2UuVW5pY29kZURlc2NyaXB0b3IoZVswXSl9LGphdmFzY3JpcHQ6ZnVuY3Rpb24oKXt2YXIgZSx0PXMuaTtzLnNhdmUoKTt2YXIgaT1zLiRjaGFyKCJ+Iik7aWYocy4kY2hhcigiYCIpKXtpZihlPXMuJHJlKC9eW15gXSpgLykpcmV0dXJuIHMuZm9yZ2V0KCksbmV3IENlLkphdmFTY3JpcHQoZS5zdWJzdHIoMCxlLmxlbmd0aC0xKSxCb29sZWFuKGkpLHQsbik7cy5yZXN0b3JlKCJpbnZhbGlkIGphdmFzY3JpcHQgZGVmaW5pdGlvbiIpfWVsc2Ugcy5yZXN0b3JlKCl9fSx2YXJpYWJsZTpmdW5jdGlvbigpe3ZhciBlO2lmKCJAIj09PXMuY3VycmVudENoYXIoKSYmKGU9cy4kcmUoL14oQFtcdy1dKylccyo6LykpKXJldHVybiBlWzFdfSx2YXJpYWJsZUNhbGw6ZnVuY3Rpb24oZSl7dmFyIHQsaT1zLmksbz0hIWUsYT1lO2lmKHMuc2F2ZSgpLGF8fCJAIj09PXMuY3VycmVudENoYXIoKSYmKGE9cy4kcmUoL14oQFtcdy1dKykoXChccypcKSk/LykpKXtpZighKHQ9dGhpcy5taXhpbi5ydWxlTG9va3VwcygpKSYmKG8mJiIoKSIhPT1zLiRzdHIoIigpIil8fCIoKSIhPT1hWzJdKSlyZXR1cm4gdm9pZCBzLnJlc3RvcmUoIk1pc3NpbmcgJ1suLi5dJyBsb29rdXAgaW4gdmFyaWFibGUgY2FsbCIpO298fChhPWFbMV0pO3ZhciBsPW5ldyBDZS5WYXJpYWJsZUNhbGwoYSxpLG4pO3JldHVybiFvJiZyLmVuZCgpPyhzLmZvcmdldCgpLGwpOihzLmZvcmdldCgpLG5ldyBDZS5OYW1lc3BhY2VWYWx1ZShsLHQsaSxuKSl9cy5yZXN0b3JlKCl9LGV4dGVuZDpmdW5jdGlvbihlKXt2YXIgdCxpLHIsbCx1LGM9cy5pO2lmKHMuJHN0cihlPyImOmV4dGVuZCgiOiI6ZXh0ZW5kKCIpKXtkb3tmb3Iocj1udWxsLHQ9bnVsbDshKHI9cy4kcmUoL14oYWxsKSg/PVxzKihcKXwsKSkvKSkmJihpPXRoaXMuZWxlbWVudCgpKTspdD90LnB1c2goaSk6dD1baV07cj1yJiZyWzFdLHR8fG8oIk1pc3NpbmcgdGFyZ2V0IHNlbGVjdG9yIGZvciA6ZXh0ZW5kKCkuIiksdT1uZXcgQ2UuRXh0ZW5kKG5ldyBDZS5TZWxlY3Rvcih0KSxyLGMsbiksbD9sLnB1c2godSk6bD1bdV19d2hpbGUocy4kY2hhcigiLCIpKTtyZXR1cm4gYSgvXlwpLyksZSYmYSgvXjsvKSxsfX0sZXh0ZW5kUnVsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmV4dGVuZCghMCl9LG1peGluOntjYWxsOmZ1bmN0aW9uKGUsdCl7dmFyIGksbyxhLHUsYz1zLmN1cnJlbnRDaGFyKCksaD0hMSxmPXMuaTtpZigiLiI9PT1jfHwiIyI9PT1jKXtpZihzLnNhdmUoKSxvPXRoaXMuZWxlbWVudHMoKSl7aWYocy4kY2hhcigiKCIpJiYoYT10aGlzLmFyZ3MoITApLmFyZ3MsbCgiKSIpLHU9ITApLCExIT09dCYmKGk9dGhpcy5ydWxlTG9va3VwcygpKSwhMD09PXQmJiFpKXJldHVybiB2b2lkIHMucmVzdG9yZSgpO2lmKGUmJiFpJiYhdSlyZXR1cm4gdm9pZCBzLnJlc3RvcmUoKTtpZighZSYmci5pbXBvcnRhbnQoKSYmKGg9ITApLGV8fHIuZW5kKCkpe3MuZm9yZ2V0KCk7dmFyIHA9bmV3IENlLm1peGluLkNhbGwobyxhLGYsbiwhaSYmaCk7cmV0dXJuIGk/bmV3IENlLk5hbWVzcGFjZVZhbHVlKHAsaSk6cH19cy5yZXN0b3JlKCl9fSxlbGVtZW50czpmdW5jdGlvbigpe2Zvcih2YXIgZSx0LGkscixvLGE9L15bIy5dKD86W1x3LV18XFwoPzpbQS1GYS1mMC05XXsxLDZ9ID98W15BLUZhLWYwLTldKSkrLztvPXMuaSx0PXMuJHJlKGEpOylyPW5ldyBDZS5FbGVtZW50KGksdCwhMSxvLG4pLGU/ZS5wdXNoKHIpOmU9W3JdLGk9cy4kY2hhcigiPiIpO3JldHVybiBlfSxhcmdzOmZ1bmN0aW9uKGUpe3ZhciB0LGksbixhLGwsdSxjLGg9ci5lbnRpdGllcyxmPXthcmdzOm51bGwsdmFyaWFkaWM6ITF9LHA9W10sdj1bXSxkPVtdLG09ITA7Zm9yKHMuc2F2ZSgpOzspe2lmKGUpdT1yLmRldGFjaGVkUnVsZXNldCgpfHxyLmV4cHJlc3Npb24oKTtlbHNle2lmKHMuY29tbWVudFN0b3JlLmxlbmd0aD0wLHMuJHN0cigiLi4uIikpe2YudmFyaWFkaWM9ITAscy4kY2hhcigiOyIpJiYhdCYmKHQ9ITApLCh0P3Y6ZCkucHVzaCh7dmFyaWFkaWM6ITB9KTticmVha311PWgudmFyaWFibGUoKXx8aC5wcm9wZXJ0eSgpfHxoLmxpdGVyYWwoKXx8aC5rZXl3b3JkKCl8fHRoaXMuY2FsbCghMCl9aWYoIXV8fCFtKWJyZWFrO2E9bnVsbCx1LnRocm93QXdheUNvbW1lbnRzJiZ1LnRocm93QXdheUNvbW1lbnRzKCksbD11O3ZhciBnPW51bGw7aWYoZT91LnZhbHVlJiYxPT11LnZhbHVlLmxlbmd0aCYmKGc9dS52YWx1ZVswXSk6Zz11LGcmJihnIGluc3RhbmNlb2YgQ2UuVmFyaWFibGV8fGcgaW5zdGFuY2VvZiBDZS5Qcm9wZXJ0eSkpaWYocy4kY2hhcigiOiIpKXtpZihwLmxlbmd0aD4wJiYodCYmbygiQ2Fubm90IG1peCA7IGFuZCAsIGFzIGRlbGltaXRlciB0eXBlcyIpLGk9ITApLCEobD1yLmRldGFjaGVkUnVsZXNldCgpfHxyLmV4cHJlc3Npb24oKSkpe2lmKCFlKXJldHVybiBzLnJlc3RvcmUoKSxmLmFyZ3M9W10sZjtvKCJjb3VsZCBub3QgdW5kZXJzdGFuZCB2YWx1ZSBmb3IgbmFtZWQgYXJndW1lbnQiKX1hPW49Zy5uYW1lfWVsc2UgaWYocy4kc3RyKCIuLi4iKSl7aWYoIWUpe2YudmFyaWFkaWM9ITAscy4kY2hhcigiOyIpJiYhdCYmKHQ9ITApLCh0P3Y6ZCkucHVzaCh7bmFtZTp1Lm5hbWUsdmFyaWFkaWM6ITB9KTticmVha31jPSEwfWVsc2UgZXx8KG49YT1nLm5hbWUsbD1udWxsKTtsJiZwLnB1c2gobCksZC5wdXNoKHtuYW1lOmEsdmFsdWU6bCxleHBhbmQ6Y30pLHMuJGNoYXIoIiwiKT9tPSEwOigobT0iOyI9PT1zLiRjaGFyKCI7IikpfHx0KSYmKGkmJm8oIkNhbm5vdCBtaXggOyBhbmQgLCBhcyBkZWxpbWl0ZXIgdHlwZXMiKSx0PSEwLHAubGVuZ3RoPjEmJihsPW5ldyBDZS5WYWx1ZShwKSksdi5wdXNoKHtuYW1lOm4sdmFsdWU6bCxleHBhbmQ6Y30pLG49bnVsbCxwPVtdLGk9ITEpfXJldHVybiBzLmZvcmdldCgpLGYuYXJncz10P3Y6ZCxmfSxkZWZpbml0aW9uOmZ1bmN0aW9uKCl7dmFyIGUsdCxpLG4sbz1bXSxsPSExO2lmKCEoIi4iIT09cy5jdXJyZW50Q2hhcigpJiYiIyIhPT1zLmN1cnJlbnRDaGFyKCl8fHMucGVlaygvXltee10qXH0vKSkpaWYocy5zYXZlKCksdD1zLiRyZSgvXihbIy5dKD86W1x3LV18XFwoPzpbQS1GYS1mMC05XXsxLDZ9ID98W15BLUZhLWYwLTldKSkrKVxzKlwoLykpe2U9dFsxXTt2YXIgdT10aGlzLmFyZ3MoITEpO2lmKG89dS5hcmdzLGw9dS52YXJpYWRpYywhcy4kY2hhcigiKSIpKXJldHVybiB2b2lkIHMucmVzdG9yZSgiTWlzc2luZyBjbG9zaW5nICcpJyIpO2lmKHMuY29tbWVudFN0b3JlLmxlbmd0aD0wLHMuJHN0cigid2hlbiIpJiYobj1hKHIuY29uZGl0aW9ucywiZXhwZWN0ZWQgY29uZGl0aW9uIikpLGk9ci5ibG9jaygpKXJldHVybiBzLmZvcmdldCgpLG5ldyBDZS5taXhpbi5EZWZpbml0aW9uKGUsbyxpLG4sbCk7cy5yZXN0b3JlKCl9ZWxzZSBzLnJlc3RvcmUoKX0scnVsZUxvb2t1cHM6ZnVuY3Rpb24oKXt2YXIgZSx0PVtdO2lmKCJbIj09PXMuY3VycmVudENoYXIoKSl7Zm9yKDs7KXtpZihzLnNhdmUoKSwhKGU9dGhpcy5sb29rdXBWYWx1ZSgpKSYmIiIhPT1lKXtzLnJlc3RvcmUoKTticmVha310LnB1c2goZSkscy5mb3JnZXQoKX1yZXR1cm4gdC5sZW5ndGg+MD90OnZvaWQgMH19LGxvb2t1cFZhbHVlOmZ1bmN0aW9uKCl7aWYocy5zYXZlKCkscy4kY2hhcigiWyIpKXt2YXIgZT1zLiRyZSgvXig/OltAJF17MCwyfSlbX2EtekEtWjAtOS1dKi8pO2lmKHMuJGNoYXIoIl0iKSlyZXR1cm4gZXx8IiI9PT1lPyhzLmZvcmdldCgpLGUpOnZvaWQgcy5yZXN0b3JlKCk7cy5yZXN0b3JlKCl9ZWxzZSBzLnJlc3RvcmUoKX19LGVudGl0eTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZW50aXRpZXM7cmV0dXJuIHRoaXMuY29tbWVudCgpfHxlLmxpdGVyYWwoKXx8ZS52YXJpYWJsZSgpfHxlLnVybCgpfHxlLnByb3BlcnR5KCl8fGUuY2FsbCgpfHxlLmtleXdvcmQoKXx8dGhpcy5taXhpbi5jYWxsKCEwKXx8ZS5qYXZhc2NyaXB0KCl9LGVuZDpmdW5jdGlvbigpe3JldHVybiBzLiRjaGFyKCI7Iil8fHMucGVlaygifSIpfSxpZUFscGhhOmZ1bmN0aW9uKCl7dmFyIGU7aWYocy4kcmUoL15vcGFjaXR5PS9pKSlyZXR1cm4oZT1zLiRyZSgvXlxkKy8pKXx8KGU9IkB7IisoZT1hKHIuZW50aXRpZXMudmFyaWFibGUsIkNvdWxkIG5vdCBwYXJzZSBhbHBoYSIpKS5uYW1lLnNsaWNlKDEpKyJ9IiksbCgiKSIpLG5ldyBDZS5RdW90ZWQoIiIsImFscGhhKG9wYWNpdHk9IitlKyIpIil9LGVsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgZSx0LGkscj1zLmk7aWYodD10aGlzLmNvbWJpbmF0b3IoKSwoZT1zLiRyZSgvXig/OlxkK1wuXGQrfFxkKyklLyl8fHMuJHJlKC9eKD86Wy4jXT98OiopKD86W1x3LV18W15ceDAwLVx4OWZdfFxcKD86W0EtRmEtZjAtOV17MSw2fSA/fFteQS1GYS1mMC05XSkpKy8pfHxzLiRjaGFyKCIqIil8fHMuJGNoYXIoIiYiKXx8dGhpcy5hdHRyaWJ1dGUoKXx8cy4kcmUoL15cKFteJigpQF0rXCkvKXx8cy4kcmUoL15bXC4jOl0oPz1AKS8pfHx0aGlzLmVudGl0aWVzLnZhcmlhYmxlQ3VybHkoKSl8fChzLnNhdmUoKSxzLiRjaGFyKCIoIik/KGk9dGhpcy5zZWxlY3RvcighMSkpJiZzLiRjaGFyKCIpIik/KGU9bmV3IENlLlBhcmVuKGkpLHMuZm9yZ2V0KCkpOnMucmVzdG9yZSgiTWlzc2luZyBjbG9zaW5nICcpJyIpOnMuZm9yZ2V0KCkpLGUpcmV0dXJuIG5ldyBDZS5FbGVtZW50KHQsZSxlIGluc3RhbmNlb2YgQ2UuVmFyaWFibGUscixuKX0sY29tYmluYXRvcjpmdW5jdGlvbigpe3ZhciBlPXMuY3VycmVudENoYXIoKTtpZigiLyI9PT1lKXtzLnNhdmUoKTt2YXIgdD1zLiRyZSgvXlwvW2Etel0rXC8vaSk7aWYodClyZXR1cm4gcy5mb3JnZXQoKSxuZXcgQ2UuQ29tYmluYXRvcih0KTtzLnJlc3RvcmUoKX1pZigiPiI9PT1lfHwiKyI9PT1lfHwifiI9PT1lfHwifCI9PT1lfHwiXiI9PT1lKXtmb3Iocy5pKyssIl4iPT09ZSYmIl4iPT09cy5jdXJyZW50Q2hhcigpJiYoZT0iXl4iLHMuaSsrKTtzLmlzV2hpdGVzcGFjZSgpOylzLmkrKztyZXR1cm4gbmV3IENlLkNvbWJpbmF0b3IoZSl9cmV0dXJuIHMuaXNXaGl0ZXNwYWNlKC0xKT9uZXcgQ2UuQ29tYmluYXRvcigiICIpOm5ldyBDZS5Db21iaW5hdG9yKG51bGwpfSxzZWxlY3RvcjpmdW5jdGlvbihlKXt2YXIgdCxpLHIsbCx1LGMsaCxmPXMuaTtmb3IoZT0hMSE9PWU7KGUmJihpPXRoaXMuZXh0ZW5kKCkpfHxlJiYoYz1zLiRzdHIoIndoZW4iKSl8fChsPXRoaXMuZWxlbWVudCgpKSkmJihjP2g9YSh0aGlzLmNvbmRpdGlvbnMsImV4cGVjdGVkIGNvbmRpdGlvbiIpOmg/bygiQ1NTIGd1YXJkIGNhbiBvbmx5IGJlIHVzZWQgYXQgdGhlIGVuZCBvZiBzZWxlY3RvciIpOmk/dT11P3UuY29uY2F0KGkpOmk6KHUmJm8oIkV4dGVuZCBjYW4gb25seSBiZSB1c2VkIGF0IHRoZSBlbmQgb2Ygc2VsZWN0b3IiKSxyPXMuY3VycmVudENoYXIoKSx0P3QucHVzaChsKTp0PVtsXSxsPW51bGwpLCJ7IiE9PXImJiJ9IiE9PXImJiI7IiE9PXImJiIsIiE9PXImJiIpIiE9PXIpOyk7aWYodClyZXR1cm4gbmV3IENlLlNlbGVjdG9yKHQsdSxoLGYsbik7dSYmbygiRXh0ZW5kIG11c3QgYmUgdXNlZCB0byBleHRlbmQgYSBzZWxlY3RvciwgaXQgY2Fubm90IGJlIHVzZWQgb24gaXRzIG93biIpfSxzZWxlY3RvcnM6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdDsoZT10aGlzLnNlbGVjdG9yKCkpJiYodD90LnB1c2goZSk6dD1bZV0scy5jb21tZW50U3RvcmUubGVuZ3RoPTAsZS5jb25kaXRpb24mJnQubGVuZ3RoPjEmJm8oIkd1YXJkcyBhcmUgb25seSBjdXJyZW50bHkgYWxsb3dlZCBvbiBhIHNpbmdsZSBzZWxlY3Rvci4iKSxzLiRjaGFyKCIsIikpOyllLmNvbmRpdGlvbiYmbygiR3VhcmRzIGFyZSBvbmx5IGN1cnJlbnRseSBhbGxvd2VkIG9uIGEgc2luZ2xlIHNlbGVjdG9yLiIpLHMuY29tbWVudFN0b3JlLmxlbmd0aD0wO3JldHVybiB0fSxhdHRyaWJ1dGU6ZnVuY3Rpb24oKXtpZihzLiRjaGFyKCJbIikpe3ZhciBlLHQsaSxuPXRoaXMuZW50aXRpZXM7cmV0dXJuKGU9bi52YXJpYWJsZUN1cmx5KCkpfHwoZT1hKC9eKD86W19BLVphLXowLTktXCpdKlx8KT8oPzpbX0EtWmEtejAtOS1dfFxcLikrLykpLChpPXMuJHJlKC9eW3x+KiReXT89LykpJiYodD1uLnF1b3RlZCgpfHxzLiRyZSgvXlswLTldKyUvKXx8cy4kcmUoL15bXHctXSsvKXx8bi52YXJpYWJsZUN1cmx5KCkpLGwoIl0iKSxuZXcgQ2UuQXR0cmlidXRlKGUsaSx0KX19LGJsb2NrOmZ1bmN0aW9uKCl7dmFyIGU7aWYocy4kY2hhcigieyIpJiYoZT10aGlzLnByaW1hcnkoKSkmJnMuJGNoYXIoIn0iKSlyZXR1cm4gZX0sYmxvY2tSdWxlc2V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ibG9jaygpO3JldHVybiBlJiYoZT1uZXcgQ2UuUnVsZXNldChudWxsLGUpKSxlfSxkZXRhY2hlZFJ1bGVzZXQ6ZnVuY3Rpb24oKXt2YXIgZSx0LGk7aWYocy5zYXZlKCksIXMuJHJlKC9eWy4jXVwoLyl8fCh0PShlPXRoaXMubWl4aW4uYXJncyghMSkpLmFyZ3MsaT1lLnZhcmlhZGljLHMuJGNoYXIoIikiKSkpe3ZhciBuPXRoaXMuYmxvY2tSdWxlc2V0KCk7aWYobilyZXR1cm4gcy5mb3JnZXQoKSx0P25ldyBDZS5taXhpbi5EZWZpbml0aW9uKG51bGwsdCxuLG51bGwsaSk6bmV3IENlLkRldGFjaGVkUnVsZXNldChuKTtzLnJlc3RvcmUoKX1lbHNlIHMucmVzdG9yZSgpfSxydWxlc2V0OmZ1bmN0aW9uKCl7dmFyIGUsaSxuO2lmKHMuc2F2ZSgpLHQuZHVtcExpbmVOdW1iZXJzJiYobj11KHMuaSkpLChlPXRoaXMuc2VsZWN0b3JzKCkpJiYoaT10aGlzLmJsb2NrKCkpKXtzLmZvcmdldCgpO3ZhciByPW5ldyBDZS5SdWxlc2V0KGUsaSx0LnN0cmljdEltcG9ydHMpO3JldHVybiB0LmR1bXBMaW5lTnVtYmVycyYmKHIuZGVidWdJbmZvPW4pLHJ9cy5yZXN0b3JlKCl9LGRlY2xhcmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGUsdCxpLHIsbyxhLGw9cy5pLHU9cy5jdXJyZW50Q2hhcigpO2lmKCIuIiE9PXUmJiIjIiE9PXUmJiImIiE9PXUmJiI6IiE9PXUpaWYocy5zYXZlKCksZT10aGlzLnZhcmlhYmxlKCl8fHRoaXMucnVsZVByb3BlcnR5KCkpe2lmKChhPSJzdHJpbmciPT10eXBlb2YgZSkmJih0PXRoaXMuZGV0YWNoZWRSdWxlc2V0KCkpJiYoaT0hMCkscy5jb21tZW50U3RvcmUubGVuZ3RoPTAsIXQpe2lmKG89IWEmJmUubGVuZ3RoPjEmJmUucG9wKCkudmFsdWUsdD1lWzBdLnZhbHVlJiYiLS0iPT09ZVswXS52YWx1ZS5zbGljZSgwLDIpP3RoaXMucGVybWlzc2l2ZVZhbHVlKCk6dGhpcy5hbm9ueW1vdXNWYWx1ZSgpKXJldHVybiBzLmZvcmdldCgpLG5ldyBDZS5EZWNsYXJhdGlvbihlLHQsITEsbyxsLG4pO3R8fCh0PXRoaXMudmFsdWUoKSksdD9yPXRoaXMuaW1wb3J0YW50KCk6YSYmKHQ9dGhpcy5wZXJtaXNzaXZlVmFsdWUoKSl9aWYodCYmKHRoaXMuZW5kKCl8fGkpKXJldHVybiBzLmZvcmdldCgpLG5ldyBDZS5EZWNsYXJhdGlvbihlLHQscixvLGwsbik7cy5yZXN0b3JlKCl9ZWxzZSBzLnJlc3RvcmUoKX0sYW5vbnltb3VzVmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1zLmksdD1zLiRyZSgvXihbXi4jQFwkK1wvJyIqYCg7e30tXSopOy8pO2lmKHQpcmV0dXJuIG5ldyBDZS5Bbm9ueW1vdXModFsxXSxlKX0scGVybWlzc2l2ZVZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LGkscixhLGw9ZXx8IjsiLHU9cy5pLGM9W107ZnVuY3Rpb24gaCgpe3ZhciBlPXMuY3VycmVudENoYXIoKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGw/ZT09PWw6bC50ZXN0KGUpfWlmKCFoKCkpe2E9W107ZG97KChpPXRoaXMuY29tbWVudCgpKXx8KGk9dGhpcy5lbnRpdHkoKSkpJiZhLnB1c2goaSl9d2hpbGUoaSk7aWYocj1oKCksYS5sZW5ndGg+MCl7aWYoYT1uZXcgQ2UuRXhwcmVzc2lvbihhKSxyKXJldHVybiBhO2MucHVzaChhKSwiICI9PT1zLnByZXZDaGFyKCkmJmMucHVzaChuZXcgQ2UuQW5vbnltb3VzKCIgIix1KSl9aWYocy5zYXZlKCksYT1zLiRwYXJzZVVudGlsKGwpKXtpZigic3RyaW5nIj09dHlwZW9mIGEmJm8oIkV4cGVjdGVkICciK2ErIiciLCJQYXJzZSIpLDE9PT1hLmxlbmd0aCYmIiAiPT09YVswXSlyZXR1cm4gcy5mb3JnZXQoKSxuZXcgQ2UuQW5vbnltb3VzKCIiLHUpO3ZhciBmPXZvaWQgMDtmb3IodD0wO3Q8YS5sZW5ndGg7dCsrKWlmKGY9YVt0XSxBcnJheS5pc0FycmF5KGYpKWMucHVzaChuZXcgQ2UuUXVvdGVkKGZbMF0sZlsxXSwhMCx1LG4pKTtlbHNle3Q9PT1hLmxlbmd0aC0xJiYoZj1mLnRyaW0oKSk7dmFyIHA9bmV3IENlLlF1b3RlZCgiJyIsZiwhMCx1LG4pO3AudmFyaWFibGVSZWdleD0vQChbXHctXSspL2cscC5wcm9wUmVnZXg9L1wkKFtcdy1dKykvZyxjLnB1c2gocCl9cmV0dXJuIHMuZm9yZ2V0KCksbmV3IENlLkV4cHJlc3Npb24oYywhMCl9cy5yZXN0b3JlKCl9fSxpbXBvcnQ6ZnVuY3Rpb24oKXt2YXIgZSx0LGk9cy5pLHI9cy4kcmUoL15AaW1wb3J0P1xzKy8pO2lmKHIpe3ZhciBhPShyP3RoaXMuaW1wb3J0T3B0aW9ucygpOm51bGwpfHx7fTtpZihlPXRoaXMuZW50aXRpZXMucXVvdGVkKCl8fHRoaXMuZW50aXRpZXMudXJsKCkpcmV0dXJuIHQ9dGhpcy5tZWRpYUZlYXR1cmVzKCkscy4kY2hhcigiOyIpfHwocy5pPWksbygibWlzc2luZyBzZW1pLWNvbG9uIG9yIHVucmVjb2duaXNlZCBtZWRpYSBmZWF0dXJlcyBvbiBpbXBvcnQiKSksdD10JiZuZXcgQ2UuVmFsdWUodCksbmV3IENlLkltcG9ydChlLHQsYSxpLG4pO3MuaT1pLG8oIm1hbGZvcm1lZCBpbXBvcnQgc3RhdGVtZW50Iil9fSxpbXBvcnRPcHRpb25zOmZ1bmN0aW9uKCl7dmFyIGUsdCxpLG49e307aWYoIXMuJGNoYXIoIigiKSlyZXR1cm4gbnVsbDtkb3tpZihlPXRoaXMuaW1wb3J0T3B0aW9uKCkpe3N3aXRjaChpPSEwLHQ9ZSl7Y2FzZSJjc3MiOnQ9Imxlc3MiLGk9ITE7YnJlYWs7Y2FzZSJvbmNlIjp0PSJtdWx0aXBsZSIsaT0hMX1pZihuW3RdPWksIXMuJGNoYXIoIiwiKSlicmVha319d2hpbGUoZSk7cmV0dXJuIGwoIikiKSxufSxpbXBvcnRPcHRpb246ZnVuY3Rpb24oKXt2YXIgZT1zLiRyZSgvXihsZXNzfGNzc3xtdWx0aXBsZXxvbmNlfGlubGluZXxyZWZlcmVuY2V8b3B0aW9uYWwpLyk7aWYoZSlyZXR1cm4gZVsxXX0sbWVkaWFGZWF0dXJlOmZ1bmN0aW9uKCl7dmFyIGUsdCxpPXRoaXMuZW50aXRpZXMscj1bXTtzLnNhdmUoKTtkb3soZT1pLmtleXdvcmQoKXx8aS52YXJpYWJsZSgpfHxpLm1peGluTG9va3VwKCkpP3IucHVzaChlKTpzLiRjaGFyKCIoIikmJih0PXRoaXMucHJvcGVydHkoKSxlPXRoaXMudmFsdWUoKSxzLiRjaGFyKCIpIik/dCYmZT9yLnB1c2gobmV3IENlLlBhcmVuKG5ldyBDZS5EZWNsYXJhdGlvbih0LGUsbnVsbCxudWxsLHMuaSxuLCEwKSkpOmU/ci5wdXNoKG5ldyBDZS5QYXJlbihlKSk6bygiYmFkbHkgZm9ybWVkIG1lZGlhIGZlYXR1cmUgZGVmaW5pdGlvbiIpOm8oIk1pc3NpbmcgY2xvc2luZyAnKSciLCJQYXJzZSIpKX13aGlsZShlKTtpZihzLmZvcmdldCgpLHIubGVuZ3RoPjApcmV0dXJuIG5ldyBDZS5FeHByZXNzaW9uKHIpfSxtZWRpYUZlYXR1cmVzOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLmVudGl0aWVzLGk9W107ZG97aWYoZT10aGlzLm1lZGlhRmVhdHVyZSgpKXtpZihpLnB1c2goZSksIXMuJGNoYXIoIiwiKSlicmVha31lbHNlIGlmKChlPXQudmFyaWFibGUoKXx8dC5taXhpbkxvb2t1cCgpKSYmKGkucHVzaChlKSwhcy4kY2hhcigiLCIpKSlicmVha313aGlsZShlKTtyZXR1cm4gaS5sZW5ndGg+MD9pOm51bGx9LG1lZGlhOmZ1bmN0aW9uKCl7dmFyIGUsaSxyLGEsbD1zLmk7aWYodC5kdW1wTGluZU51bWJlcnMmJihhPXUobCkpLHMuc2F2ZSgpLHMuJHN0cigiQG1lZGlhIikpcmV0dXJuIGU9dGhpcy5tZWRpYUZlYXR1cmVzKCksKGk9dGhpcy5ibG9jaygpKXx8bygibWVkaWEgZGVmaW5pdGlvbnMgcmVxdWlyZSBibG9jayBzdGF0ZW1lbnRzIGFmdGVyIGFueSBmZWF0dXJlcyIpLHMuZm9yZ2V0KCkscj1uZXcgQ2UuTWVkaWEoaSxlLGwsbiksdC5kdW1wTGluZU51bWJlcnMmJihyLmRlYnVnSW5mbz1hKSxyO3MucmVzdG9yZSgpfSxwbHVnaW46ZnVuY3Rpb24oKXt2YXIgZSx0LGkscj1zLmk7aWYocy4kcmUoL15AcGx1Z2luP1xzKy8pKXtpZihpPSh0PXRoaXMucGx1Z2luQXJncygpKT97cGx1Z2luQXJnczp0LGlzUGx1Z2luOiEwfTp7aXNQbHVnaW46ITB9LGU9dGhpcy5lbnRpdGllcy5xdW90ZWQoKXx8dGhpcy5lbnRpdGllcy51cmwoKSlyZXR1cm4gcy4kY2hhcigiOyIpfHwocy5pPXIsbygibWlzc2luZyBzZW1pLWNvbG9uIG9uIEBwbHVnaW4iKSksbmV3IENlLkltcG9ydChlLG51bGwsaSxyLG4pO3MuaT1yLG8oIm1hbGZvcm1lZCBAcGx1Z2luIHN0YXRlbWVudCIpfX0scGx1Z2luQXJnczpmdW5jdGlvbigpe2lmKHMuc2F2ZSgpLCFzLiRjaGFyKCIoIikpcmV0dXJuIHMucmVzdG9yZSgpLG51bGw7dmFyIGU9cy4kcmUoL15ccyooW15cKTtdKylcKVxzKi8pO3JldHVybiBlWzFdPyhzLmZvcmdldCgpLGVbMV0udHJpbSgpKToocy5yZXN0b3JlKCksbnVsbCl9LGF0cnVsZTpmdW5jdGlvbigpe3ZhciBlLGkscixhLGwsYyxoLGY9cy5pLHA9ITAsdj0hMDtpZigiQCI9PT1zLmN1cnJlbnRDaGFyKCkpe2lmKGk9dGhpcy5pbXBvcnQoKXx8dGhpcy5wbHVnaW4oKXx8dGhpcy5tZWRpYSgpKXJldHVybiBpO2lmKHMuc2F2ZSgpLGU9cy4kcmUoL15AW2Etei1dKy8pKXtzd2l0Y2goYT1lLCItIj09ZS5jaGFyQXQoMSkmJmUuaW5kZXhPZigiLSIsMik+MCYmKGE9IkAiK2Uuc2xpY2UoZS5pbmRleE9mKCItIiwyKSsxKSksYSl7Y2FzZSJAY2hhcnNldCI6bD0hMCxwPSExO2JyZWFrO2Nhc2UiQG5hbWVzcGFjZSI6Yz0hMCxwPSExO2JyZWFrO2Nhc2UiQGtleWZyYW1lcyI6Y2FzZSJAY291bnRlci1zdHlsZSI6bD0hMDticmVhaztjYXNlIkBkb2N1bWVudCI6Y2FzZSJAc3VwcG9ydHMiOmg9ITAsdj0hMTticmVhaztkZWZhdWx0Omg9ITB9aWYocy5jb21tZW50U3RvcmUubGVuZ3RoPTAsbD8oaT10aGlzLmVudGl0eSgpKXx8bygiZXhwZWN0ZWQgIitlKyIgaWRlbnRpZmllciIpOmM/KGk9dGhpcy5leHByZXNzaW9uKCkpfHxvKCJleHBlY3RlZCAiK2UrIiBleHByZXNzaW9uIik6aCYmKGk9dGhpcy5wZXJtaXNzaXZlVmFsdWUoL15beztdLykscD0ieyI9PT1zLmN1cnJlbnRDaGFyKCksaT9pLnZhbHVlfHwoaT1udWxsKTpwfHwiOyI9PT1zLmN1cnJlbnRDaGFyKCl8fG8oZSsiIHJ1bGUgaXMgbWlzc2luZyBibG9jayBvciBlbmRpbmcgc2VtaS1jb2xvbiIpKSxwJiYocj10aGlzLmJsb2NrUnVsZXNldCgpKSxyfHwhcCYmaSYmcy4kY2hhcigiOyIpKXJldHVybiBzLmZvcmdldCgpLG5ldyBDZS5BdFJ1bGUoZSxpLHIsZixuLHQuZHVtcExpbmVOdW1iZXJzP3UoZik6bnVsbCx2KTtzLnJlc3RvcmUoImF0LXJ1bGUgb3B0aW9ucyBub3QgcmVjb2duaXNlZCIpfX19LHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdD1bXSxpPXMuaTtkb3tpZigoZT10aGlzLmV4cHJlc3Npb24oKSkmJih0LnB1c2goZSksIXMuJGNoYXIoIiwiKSkpYnJlYWt9d2hpbGUoZSk7aWYodC5sZW5ndGg+MClyZXR1cm4gbmV3IENlLlZhbHVlKHQsaSl9LGltcG9ydGFudDpmdW5jdGlvbigpe2lmKCIhIj09PXMuY3VycmVudENoYXIoKSlyZXR1cm4gcy4kcmUoL14hICppbXBvcnRhbnQvKX0sc3ViOmZ1bmN0aW9uKCl7dmFyIGUsdDtpZihzLnNhdmUoKSxzLiRjaGFyKCIoIikpcmV0dXJuKGU9dGhpcy5hZGRpdGlvbigpKSYmcy4kY2hhcigiKSIpPyhzLmZvcmdldCgpLCh0PW5ldyBDZS5FeHByZXNzaW9uKFtlXSkpLnBhcmVucz0hMCx0KTp2b2lkIHMucmVzdG9yZSgiRXhwZWN0ZWQgJyknIik7cy5yZXN0b3JlKCl9LG11bHRpcGxpY2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGUsdCxpLG4scjtpZihlPXRoaXMub3BlcmFuZCgpKXtmb3Iocj1zLmlzV2hpdGVzcGFjZSgtMSk7IXMucGVlaygvXlwvWypcL10vKTspe2lmKHMuc2F2ZSgpLCEoaT1zLiRjaGFyKCIvIil8fHMuJGNoYXIoIioiKXx8cy4kc3RyKCIuLyIpKSl7cy5mb3JnZXQoKTticmVha31pZighKHQ9dGhpcy5vcGVyYW5kKCkpKXtzLnJlc3RvcmUoKTticmVha31zLmZvcmdldCgpLGUucGFyZW5zSW5PcD0hMCx0LnBhcmVuc0luT3A9ITAsbj1uZXcgQ2UuT3BlcmF0aW9uKGksW258fGUsdF0scikscj1zLmlzV2hpdGVzcGFjZSgtMSl9cmV0dXJuIG58fGV9fSxhZGRpdGlvbjpmdW5jdGlvbigpe3ZhciBlLHQsaSxuLHI7aWYoZT10aGlzLm11bHRpcGxpY2F0aW9uKCkpe2ZvcihyPXMuaXNXaGl0ZXNwYWNlKC0xKTsoaT1zLiRyZSgvXlstK11ccysvKXx8IXImJihzLiRjaGFyKCIrIil8fHMuJGNoYXIoIi0iKSkpJiYodD10aGlzLm11bHRpcGxpY2F0aW9uKCkpOyllLnBhcmVuc0luT3A9ITAsdC5wYXJlbnNJbk9wPSEwLG49bmV3IENlLk9wZXJhdGlvbihpLFtufHxlLHRdLHIpLHI9cy5pc1doaXRlc3BhY2UoLTEpO3JldHVybiBufHxlfX0sY29uZGl0aW9uczpmdW5jdGlvbigpe3ZhciBlLHQsaSxuPXMuaTtpZihlPXRoaXMuY29uZGl0aW9uKCEwKSl7Zm9yKDtzLnBlZWsoL14sXHMqKG5vdFxzKik/XCgvKSYmcy4kY2hhcigiLCIpJiYodD10aGlzLmNvbmRpdGlvbighMCkpOylpPW5ldyBDZS5Db25kaXRpb24oIm9yIixpfHxlLHQsbik7cmV0dXJuIGl8fGV9fSxjb25kaXRpb246ZnVuY3Rpb24oZSl7dmFyIHQsaSxuO2lmKHQ9dGhpcy5jb25kaXRpb25BbmQoZSkpe2lmKGk9cy4kc3RyKCJvciIpKXtpZighKG49dGhpcy5jb25kaXRpb24oZSkpKXJldHVybjt0PW5ldyBDZS5Db25kaXRpb24oaSx0LG4pfXJldHVybiB0fX0sY29uZGl0aW9uQW5kOmZ1bmN0aW9uKGUpe3ZhciB0LGksbixyLG89dGhpcztpZih0PShyPW8ubmVnYXRlZENvbmRpdGlvbihlKXx8by5wYXJlbnRoZXNpc0NvbmRpdGlvbihlKSl8fGU/cjpvLmF0b21pY0NvbmRpdGlvbihlKSl7aWYoaT1zLiRzdHIoImFuZCIpKXtpZighKG49dGhpcy5jb25kaXRpb25BbmQoZSkpKXJldHVybjt0PW5ldyBDZS5Db25kaXRpb24oaSx0LG4pfXJldHVybiB0fX0sbmVnYXRlZENvbmRpdGlvbjpmdW5jdGlvbihlKXtpZihzLiRzdHIoIm5vdCIpKXt2YXIgdD10aGlzLnBhcmVudGhlc2lzQ29uZGl0aW9uKGUpO3JldHVybiB0JiYodC5uZWdhdGU9IXQubmVnYXRlKSx0fX0scGFyZW50aGVzaXNDb25kaXRpb246ZnVuY3Rpb24oZSl7dmFyIHQ7aWYocy5zYXZlKCkscy4kc3RyKCIoIikpe2lmKHQ9ZnVuY3Rpb24odCl7dmFyIGk7aWYocy5zYXZlKCksaT10LmNvbmRpdGlvbihlKSl7aWYocy4kY2hhcigiKSIpKXJldHVybiBzLmZvcmdldCgpLGk7cy5yZXN0b3JlKCl9ZWxzZSBzLnJlc3RvcmUoKX0odGhpcykpcmV0dXJuIHMuZm9yZ2V0KCksdDtpZih0PXRoaXMuYXRvbWljQ29uZGl0aW9uKGUpKXtpZihzLiRjaGFyKCIpIikpcmV0dXJuIHMuZm9yZ2V0KCksdDtzLnJlc3RvcmUoImV4cGVjdGVkICcpJyBnb3QgJyIrcy5jdXJyZW50Q2hhcigpKyInIil9ZWxzZSBzLnJlc3RvcmUoKX1lbHNlIHMucmVzdG9yZSgpfSxhdG9taWNDb25kaXRpb246ZnVuY3Rpb24oZSl7dmFyIHQsaSxuLHIsYT10aGlzLmVudGl0aWVzLGw9cy5pO2Z1bmN0aW9uIHUoKXtyZXR1cm4gdGhpcy5hZGRpdGlvbigpfHxhLmtleXdvcmQoKXx8YS5xdW90ZWQoKXx8YS5taXhpbkxvb2t1cCgpfWlmKHQ9KHU9dS5iaW5kKHRoaXMpKSgpKXJldHVybiBzLiRjaGFyKCI+Iik/cj1zLiRjaGFyKCI9Iik/Ij49IjoiPiI6cy4kY2hhcigiPCIpP3I9cy4kY2hhcigiPSIpPyI8PSI6IjwiOnMuJGNoYXIoIj0iKSYmKHI9cy4kY2hhcigiPiIpPyI9PiI6cy4kY2hhcigiPCIpPyI9PCI6Ij0iKSxyPyhpPXUoKSk/bj1uZXcgQ2UuQ29uZGl0aW9uKHIsdCxpLGwsITEpOm8oImV4cGVjdGVkIGV4cHJlc3Npb24iKTpuPW5ldyBDZS5Db25kaXRpb24oIj0iLHQsbmV3IENlLktleXdvcmQoInRydWUiKSxsLCExKSxufSxvcGVyYW5kOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLmVudGl0aWVzO3MucGVlaygvXi1bQFwkXChdLykmJihlPXMuJGNoYXIoIi0iKSk7dmFyIGk9dGhpcy5zdWIoKXx8dC5kaW1lbnNpb24oKXx8dC5jb2xvcigpfHx0LnZhcmlhYmxlKCl8fHQucHJvcGVydHkoKXx8dC5jYWxsKCl8fHQucXVvdGVkKCEwKXx8dC5jb2xvcktleXdvcmQoKXx8dC5taXhpbkxvb2t1cCgpO3JldHVybiBlJiYoaS5wYXJlbnNJbk9wPSEwLGk9bmV3IENlLk5lZ2F0aXZlKGkpKSxpfSxleHByZXNzaW9uOmZ1bmN0aW9uKCl7dmFyIGUsdCxpPVtdLG49cy5pO2RveyhlPXRoaXMuY29tbWVudCgpKT9pLnB1c2goZSk6KChlPXRoaXMuYWRkaXRpb24oKXx8dGhpcy5lbnRpdHkoKSlpbnN0YW5jZW9mIENlLkNvbW1lbnQmJihlPW51bGwpLGUmJihpLnB1c2goZSkscy5wZWVrKC9eXC9bXC8qXS8pfHwodD1zLiRjaGFyKCIvIikpJiZpLnB1c2gobmV3IENlLkFub255bW91cyh0LG4pKSkpfXdoaWxlKGUpO2lmKGkubGVuZ3RoPjApcmV0dXJuIG5ldyBDZS5FeHByZXNzaW9uKGkpfSxwcm9wZXJ0eTpmdW5jdGlvbigpe3ZhciBlPXMuJHJlKC9eKFwqPy0/W19hLXpBLVowLTktXSspXHMqOi8pO2lmKGUpcmV0dXJuIGVbMV19LHJ1bGVQcm9wZXJ0eTpmdW5jdGlvbigpe3ZhciBlLHQsaT1bXSxyPVtdO3Muc2F2ZSgpO3ZhciBvPXMuJHJlKC9eKFtfYS16QS1aMC05LV0rKVxzKjovKTtpZihvKXJldHVybiBpPVtuZXcgQ2UuS2V5d29yZChvWzFdKV0scy5mb3JnZXQoKSxpO2Z1bmN0aW9uIGEoZSl7dmFyIHQ9cy5pLG49cy4kcmUoZSk7aWYobilyZXR1cm4gci5wdXNoKHQpLGkucHVzaChuWzFdKX1mb3IoYSgvXihcKj8pLyk7YSgvXigoPzpbXHctXSspfCg/OltAXCRdXHtbXHctXStcfSkpLyk7KTtpZihpLmxlbmd0aD4xJiZhKC9eKCg/OlwrX3xcKyk/KVxzKjovKSl7Zm9yKHMuZm9yZ2V0KCksIiI9PT1pWzBdJiYoaS5zaGlmdCgpLHIuc2hpZnQoKSksdD0wO3Q8aS5sZW5ndGg7dCsrKWU9aVt0XSxpW3RdPSJAIiE9PWUuY2hhckF0KDApJiYiJCIhPT1lLmNoYXJBdCgwKT9uZXcgQ2UuS2V5d29yZChlKToiQCI9PT1lLmNoYXJBdCgwKT9uZXcgQ2UuVmFyaWFibGUoIkAiK2Uuc2xpY2UoMiwtMSksclt0XSxuKTpuZXcgQ2UuUHJvcGVydHkoIiQiK2Uuc2xpY2UoMiwtMSksclt0XSxuKTtyZXR1cm4gaX1zLnJlc3RvcmUoKX19fX07ZnVuY3Rpb24gcWUoZSx0LGksbil7cmV0dXJuIHQuZXZhbChlKT9pLmV2YWwoZSk6bj9uLmV2YWwoZSk6bmV3IGp9ZnVuY3Rpb24gVGUoZSx0KXt0cnl7cmV0dXJuIHQuZXZhbChlKSxMLlRydWV9Y2F0Y2goZSl7cmV0dXJuIEwuRmFsc2V9fVVlLnNlcmlhbGl6ZVZhcnM9ZnVuY3Rpb24oZSl7dmFyIHQ9IiI7Zm9yKHZhciBpIGluIGUpaWYoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSxpKSl7dmFyIG49ZVtpXTt0Kz0oIkAiPT09aVswXT8iIjoiQCIpK2krIjogIituKygiOyI9PT1TdHJpbmcobikuc2xpY2UoLTEpPyIiOiI7Iil9cmV0dXJuIHR9LHFlLmV2YWxBcmdzPSExLFRlLmV2YWxBcmdzPSExO3ZhciB6ZSxHZT17aXNkZWZpbmVkOlRlLGJvb2xlYW46ZnVuY3Rpb24oZSl7cmV0dXJuIGU/TC5UcnVlOkwuRmFsc2V9LGlmOnFlfTtmdW5jdGlvbiBXZShlKXtyZXR1cm4gTWF0aC5taW4oMSxNYXRoLm1heCgwLGUpKX1mdW5jdGlvbiBKZShlLHQpe3ZhciBpPXplLmhzbGEodC5oLHQucyx0LmwsdC5hKTtpZihpKXJldHVybiBlLnZhbHVlJiYvXihyZ2J8aHNsKS8udGVzdChlLnZhbHVlKT9pLnZhbHVlPWUudmFsdWU6aS52YWx1ZT0icmdiIixpfWZ1bmN0aW9uIEhlKGUpe2lmKGUudG9IU0wpcmV0dXJuIGUudG9IU0woKTt0aHJvdyBuZXcgRXJyb3IoIkFyZ3VtZW50IGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gYSBjb2xvciIpfWZ1bmN0aW9uIFFlKGUpe2lmKGUudG9IU1YpcmV0dXJuIGUudG9IU1YoKTt0aHJvdyBuZXcgRXJyb3IoIkFyZ3VtZW50IGNhbm5vdCBiZSBldmFsdWF0ZWQgdG8gYSBjb2xvciIpfWZ1bmN0aW9uIEtlKGUpe2lmKGUgaW5zdGFuY2VvZiBlZSlyZXR1cm4gcGFyc2VGbG9hdChlLnVuaXQuaXMoIiUiKT9lLnZhbHVlLzEwMDplLnZhbHVlKTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIGU7dGhyb3d7dHlwZToiQXJndW1lbnQiLG1lc3NhZ2U6ImNvbG9yIGZ1bmN0aW9ucyB0YWtlIG51bWJlcnMgYXMgcGFyYW1ldGVycyJ9fXZhciBaZT16ZT17cmdiOmZ1bmN0aW9uKGUsdCxpKXt2YXIgbj0xO2lmKGUgaW5zdGFuY2VvZiBuZSl7dmFyIHI9ZS52YWx1ZTtpZihlPXJbMF0sdD1yWzFdLChpPXJbMl0paW5zdGFuY2VvZiBpZSl7dmFyIHM9aTtpPXMub3BlcmFuZHNbMF0sbj1zLm9wZXJhbmRzWzFdfX12YXIgbz16ZS5yZ2JhKGUsdCxpLG4pO2lmKG8pcmV0dXJuIG8udmFsdWU9InJnYiIsb30scmdiYTpmdW5jdGlvbihlLHQsaSxuKXt0cnl7aWYoZSBpbnN0YW5jZW9mIGMpcmV0dXJuIG49dD9LZSh0KTplLmFscGhhLG5ldyBjKGUucmdiLG4sInJnYmEiKTt2YXIgcj1bZSx0LGldLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGk9MjU1LCh0PWUpaW5zdGFuY2VvZiBlZSYmdC51bml0LmlzKCIlIik/cGFyc2VGbG9hdCh0LnZhbHVlKmkvMTAwKTpLZSh0KTt2YXIgdCxpfSkpO3JldHVybiBuPUtlKG4pLG5ldyBjKHIsbiwicmdiYSIpfWNhdGNoKGUpe319LGhzbDpmdW5jdGlvbihlLHQsaSl7dmFyIG49MTtpZihlIGluc3RhbmNlb2YgbmUpe3ZhciByPWUudmFsdWU7aWYoZT1yWzBdLHQ9clsxXSwoaT1yWzJdKWluc3RhbmNlb2YgaWUpe3ZhciBzPWk7aT1zLm9wZXJhbmRzWzBdLG49cy5vcGVyYW5kc1sxXX19dmFyIG89emUuaHNsYShlLHQsaSxuKTtpZihvKXJldHVybiBvLnZhbHVlPSJoc2wiLG99LGhzbGE6ZnVuY3Rpb24oZSx0LGksbil7dHJ5e2lmKGUgaW5zdGFuY2VvZiBjKXJldHVybiBuPXQ/S2UodCk6ZS5hbHBoYSxuZXcgYyhlLnJnYixuLCJoc2xhIik7dmFyIHIscztmdW5jdGlvbiBvKGUpe3JldHVybiA2KihlPWU8MD9lKzE6ZT4xP2UtMTplKTwxP3IrKHMtcikqZSo2OjIqZTwxP3M6MyplPDI/cisocy1yKSooMi8zLWUpKjY6cn1lPUtlKGUpJTM2MC8zNjAsdD1XZShLZSh0KSksaT1XZShLZShpKSksbj1XZShLZShuKSkscj0yKmktKHM9aTw9LjU/aSoodCsxKTppK3QtaSp0KTt2YXIgYT1bMjU1Km8oZSsxLzMpLDI1NSpvKGUpLDI1NSpvKGUtMS8zKV07cmV0dXJuIG49S2UobiksbmV3IGMoYSxuLCJoc2xhIil9Y2F0Y2goZSl7fX0saHN2OmZ1bmN0aW9uKGUsdCxpKXtyZXR1cm4gemUuaHN2YShlLHQsaSwxKX0saHN2YTpmdW5jdGlvbihlLHQsaSxuKXt2YXIgcixzO2U9S2UoZSklMzYwLzM2MCozNjAsdD1LZSh0KSxpPUtlKGkpLG49S2Uobik7dmFyIG89W2ksaSooMS10KSxpKigxLShzPWUvNjAtKHI9TWF0aC5mbG9vcihlLzYwJTYpKSkqdCksaSooMS0oMS1zKSp0KV0sYT1bWzAsMywxXSxbMiwwLDFdLFsxLDAsM10sWzEsMiwwXSxbMywxLDBdLFswLDEsMl1dO3JldHVybiB6ZS5yZ2JhKDI1NSpvW2Fbcl1bMF1dLDI1NSpvW2Fbcl1bMV1dLDI1NSpvW2Fbcl1bMl1dLG4pfSxodWU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBlZShIZShlKS5oKX0sc2F0dXJhdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGVlKDEwMCpIZShlKS5zLCIlIil9LGxpZ2h0bmVzczpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGVlKDEwMCpIZShlKS5sLCIlIil9LGhzdmh1ZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGVlKFFlKGUpLmgpfSxoc3ZzYXR1cmF0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZWUoMTAwKlFlKGUpLnMsIiUiKX0saHN2dmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBlZSgxMDAqUWUoZSkudiwiJSIpfSxyZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBlZShlLnJnYlswXSl9LGdyZWVuOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZWUoZS5yZ2JbMV0pfSxibHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZWUoZS5yZ2JbMl0pfSxhbHBoYTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGVlKEhlKGUpLmEpfSxsdW1hOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZWUoZS5sdW1hKCkqZS5hbHBoYSoxMDAsIiUiKX0sbHVtaW5hbmNlOmZ1bmN0aW9uKGUpe3ZhciB0PS4yMTI2KmUucmdiWzBdLzI1NSsuNzE1MiplLnJnYlsxXS8yNTUrLjA3MjIqZS5yZ2JbMl0vMjU1O3JldHVybiBuZXcgZWUodCplLmFscGhhKjEwMCwiJSIpfSxzYXR1cmF0ZTpmdW5jdGlvbihlLHQsaSl7aWYoIWUucmdiKXJldHVybiBudWxsO3ZhciBuPUhlKGUpO3JldHVybiB2b2lkIDAhPT1pJiYicmVsYXRpdmUiPT09aS52YWx1ZT9uLnMrPW4ucyp0LnZhbHVlLzEwMDpuLnMrPXQudmFsdWUvMTAwLG4ucz1XZShuLnMpLEplKGUsbil9LGRlc2F0dXJhdGU6ZnVuY3Rpb24oZSx0LGkpe3ZhciBuPUhlKGUpO3JldHVybiB2b2lkIDAhPT1pJiYicmVsYXRpdmUiPT09aS52YWx1ZT9uLnMtPW4ucyp0LnZhbHVlLzEwMDpuLnMtPXQudmFsdWUvMTAwLG4ucz1XZShuLnMpLEplKGUsbil9LGxpZ2h0ZW46ZnVuY3Rpb24oZSx0LGkpe3ZhciBuPUhlKGUpO3JldHVybiB2b2lkIDAhPT1pJiYicmVsYXRpdmUiPT09aS52YWx1ZT9uLmwrPW4ubCp0LnZhbHVlLzEwMDpuLmwrPXQudmFsdWUvMTAwLG4ubD1XZShuLmwpLEplKGUsbil9LGRhcmtlbjpmdW5jdGlvbihlLHQsaSl7dmFyIG49SGUoZSk7cmV0dXJuIHZvaWQgMCE9PWkmJiJyZWxhdGl2ZSI9PT1pLnZhbHVlP24ubC09bi5sKnQudmFsdWUvMTAwOm4ubC09dC52YWx1ZS8xMDAsbi5sPVdlKG4ubCksSmUoZSxuKX0sZmFkZWluOmZ1bmN0aW9uKGUsdCxpKXt2YXIgbj1IZShlKTtyZXR1cm4gdm9pZCAwIT09aSYmInJlbGF0aXZlIj09PWkudmFsdWU/bi5hKz1uLmEqdC52YWx1ZS8xMDA6bi5hKz10LnZhbHVlLzEwMCxuLmE9V2Uobi5hKSxKZShlLG4pfSxmYWRlb3V0OmZ1bmN0aW9uKGUsdCxpKXt2YXIgbj1IZShlKTtyZXR1cm4gdm9pZCAwIT09aSYmInJlbGF0aXZlIj09PWkudmFsdWU/bi5hLT1uLmEqdC52YWx1ZS8xMDA6bi5hLT10LnZhbHVlLzEwMCxuLmE9V2Uobi5hKSxKZShlLG4pfSxmYWRlOmZ1bmN0aW9uKGUsdCl7dmFyIGk9SGUoZSk7cmV0dXJuIGkuYT10LnZhbHVlLzEwMCxpLmE9V2UoaS5hKSxKZShlLGkpfSxzcGluOmZ1bmN0aW9uKGUsdCl7dmFyIGk9SGUoZSksbj0oaS5oK3QudmFsdWUpJTM2MDtyZXR1cm4gaS5oPW48MD8zNjArbjpuLEplKGUsaSl9LG1peDpmdW5jdGlvbihlLHQsaSl7aXx8KGk9bmV3IGVlKDUwKSk7dmFyIG49aS52YWx1ZS8xMDAscj0yKm4tMSxzPUhlKGUpLmEtSGUodCkuYSxvPSgocipzPT0tMT9yOihyK3MpLygxK3IqcykpKzEpLzIsYT0xLW8sbD1bZS5yZ2JbMF0qbyt0LnJnYlswXSphLGUucmdiWzFdKm8rdC5yZ2JbMV0qYSxlLnJnYlsyXSpvK3QucmdiWzJdKmFdLHU9ZS5hbHBoYSpuK3QuYWxwaGEqKDEtbik7cmV0dXJuIG5ldyBjKGwsdSl9LGdyZXlzY2FsZTpmdW5jdGlvbihlKXtyZXR1cm4gemUuZGVzYXR1cmF0ZShlLG5ldyBlZSgxMDApKX0sY29udHJhc3Q6ZnVuY3Rpb24oZSx0LGksbil7aWYoIWUucmdiKXJldHVybiBudWxsO2lmKHZvaWQgMD09PWkmJihpPXplLnJnYmEoMjU1LDI1NSwyNTUsMSkpLHZvaWQgMD09PXQmJih0PXplLnJnYmEoMCwwLDAsMSkpLHQubHVtYSgpPmkubHVtYSgpKXt2YXIgcj1pO2k9dCx0PXJ9cmV0dXJuIG49dm9pZCAwPT09bj8uNDM6S2UobiksZS5sdW1hKCk8bj9pOnR9LGFyZ2I6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBqKGUudG9BUkdCKCkpfSxjb2xvcjpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgdWUmJi9eIyhbQS1GYS1mMC05XXs4fXxbQS1GYS1mMC05XXs2fXxbQS1GYS1mMC05XXszLDR9KSQvaS50ZXN0KGUudmFsdWUpKXt2YXIgdD1lLnZhbHVlLnNsaWNlKDEpO3JldHVybiBuZXcgYyh0LHZvaWQgMCwiIyIrdCl9aWYoZSBpbnN0YW5jZW9mIGN8fChlPWMuZnJvbUtleXdvcmQoZS52YWx1ZSkpKXJldHVybiBlLnZhbHVlPXZvaWQgMCxlO3Rocm93e3R5cGU6IkFyZ3VtZW50IixtZXNzYWdlOiJhcmd1bWVudCBtdXN0IGJlIGEgY29sb3Iga2V5d29yZCBvciAzfDR8Nnw4IGRpZ2l0IGhleCBlLmcuICNGRkYifX0sdGludDpmdW5jdGlvbihlLHQpe3JldHVybiB6ZS5taXgoemUucmdiKDI1NSwyNTUsMjU1KSxlLHQpfSxzaGFkZTpmdW5jdGlvbihlLHQpe3JldHVybiB6ZS5taXgoemUucmdiKDAsMCwwKSxlLHQpfX07ZnVuY3Rpb24gWGUoZSx0LGkpe3ZhciBuLHIscyxvLGE9dC5hbHBoYSxsPWkuYWxwaGEsdT1bXTtzPWwrYSooMS1sKTtmb3IodmFyIGg9MDtoPDM7aCsrKW89ZShuPXQucmdiW2hdLzI1NSxyPWkucmdiW2hdLzI1NSkscyYmKG89KGwqcithKihuLWwqKG4rci1vKSkpL3MpLHVbaF09MjU1Km87cmV0dXJuIG5ldyBjKHUscyl9dmFyIFllPXttdWx0aXBseTpmdW5jdGlvbihlLHQpe3JldHVybiBlKnR9LHNjcmVlbjpmdW5jdGlvbihlLHQpe3JldHVybiBlK3QtZSp0fSxvdmVybGF5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUqPTIpPD0xP1llLm11bHRpcGx5KGUsdCk6WWUuc2NyZWVuKGUtMSx0KX0sc29mdGxpZ2h0OmZ1bmN0aW9uKGUsdCl7dmFyIGk9MSxuPWU7cmV0dXJuIHQ+LjUmJihuPTEsaT1lPi4yNT9NYXRoLnNxcnQoZSk6KCgxNiplLTEyKSplKzQpKmUpLGUtKDEtMip0KSpuKihpLWUpfSxoYXJkbGlnaHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWWUub3ZlcmxheSh0LGUpfSxkaWZmZXJlbmNlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIE1hdGguYWJzKGUtdCl9LGV4Y2x1c2lvbjpmdW5jdGlvbihlLHQpe3JldHVybiBlK3QtMiplKnR9LGF2ZXJhZ2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZSt0KS8yfSxuZWdhdGlvbjpmdW5jdGlvbihlLHQpe3JldHVybiAxLU1hdGguYWJzKGUrdC0xKX19O2Zvcih2YXIgZXQgaW4gWWUpWWUuaGFzT3duUHJvcGVydHkoZXQpJiYoWGVbZXRdPVhlLmJpbmQobnVsbCxZZVtldF0pKTt2YXIgdHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZS52YWx1ZSk/ZS52YWx1ZTpBcnJheShlKX0saXQ9e19TRUxGOmZ1bmN0aW9uKGUpe3JldHVybiBlfSwifiI6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF07cmV0dXJuIDE9PT1lLmxlbmd0aD9lWzBdOm5ldyAkKGUpfSxleHRyYWN0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dC52YWx1ZS0xLHR0KGUpW3RdfSxsZW5ndGg6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBlZSh0dChlKS5sZW5ndGgpfSxyYW5nZTpmdW5jdGlvbihlLHQsaSl7dmFyIG4scixzPTEsbz1bXTt0PyhyPXQsbj1lLnZhbHVlLGkmJihzPWkudmFsdWUpKToobj0xLHI9ZSk7Zm9yKHZhciBhPW47YTw9ci52YWx1ZTthKz1zKW8ucHVzaChuZXcgZWUoYSxyLnVuaXQpKTtyZXR1cm4gbmV3IG5lKG8pfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIGksbixyPXRoaXMscz1bXSxvPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdT9lLmV2YWwoci5jb250ZXh0KTplfTtuPSFlLnZhbHVlfHxlIGluc3RhbmNlb2YgdWU/ZS5ydWxlc2V0P28oZS5ydWxlc2V0KS5ydWxlczplLnJ1bGVzP2UucnVsZXMubWFwKG8pOkFycmF5LmlzQXJyYXkoZSk/ZS5tYXAobyk6W28oZSldOkFycmF5LmlzQXJyYXkoZS52YWx1ZSk/ZS52YWx1ZS5tYXAobyk6W28oZS52YWx1ZSldO3ZhciBhPSJAdmFsdWUiLGw9IkBrZXkiLGM9IkBpbmRleCI7dC5wYXJhbXM/KGE9dC5wYXJhbXNbMF0mJnQucGFyYW1zWzBdLm5hbWUsbD10LnBhcmFtc1sxXSYmdC5wYXJhbXNbMV0ubmFtZSxjPXQucGFyYW1zWzJdJiZ0LnBhcmFtc1syXS5uYW1lLHQ9dC5ydWxlcyk6dD10LnJ1bGVzZXQ7Zm9yKHZhciBoPTA7aDxuLmxlbmd0aDtoKyspe3ZhciBmPXZvaWQgMCxwPXZvaWQgMCx2PW5baF07diBpbnN0YW5jZW9mIEQ/KGY9InN0cmluZyI9PXR5cGVvZiB2Lm5hbWU/di5uYW1lOnYubmFtZVswXS52YWx1ZSxwPXYudmFsdWUpOihmPW5ldyBlZShoKzEpLHA9diksdiBpbnN0YW5jZW9mIFV8fChpPXQucnVsZXMuc2xpY2UoMCksYSYmaS5wdXNoKG5ldyBEKGEscCwhMSwhMSx0aGlzLmluZGV4LHRoaXMuY3VycmVudEZpbGVJbmZvKSksYyYmaS5wdXNoKG5ldyBEKGMsbmV3IGVlKGgrMSksITEsITEsdGhpcy5pbmRleCx0aGlzLmN1cnJlbnRGaWxlSW5mbykpLGwmJmkucHVzaChuZXcgRChsLGYsITEsITEsdGhpcy5pbmRleCx0aGlzLmN1cnJlbnRGaWxlSW5mbykpLHMucHVzaChuZXcgSyhbbmV3IEYoW25ldyBtKCIiLCImIildKV0saSx0LnN0cmljdEltcG9ydHMsdC52aXNpYmlsaXR5SW5mbygpKSkpfXJldHVybiBuZXcgSyhbbmV3IEYoW25ldyBtKCIiLCImIildKV0scyx0LnN0cmljdEltcG9ydHMsdC52aXNpYmlsaXR5SW5mbygpKS5ldmFsKHRoaXMuY29udGV4dCl9fSxudD1mdW5jdGlvbihlLHQsaSl7aWYoIShpIGluc3RhbmNlb2YgZWUpKXRocm93e3R5cGU6IkFyZ3VtZW50IixtZXNzYWdlOiJhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIn07cmV0dXJuIG51bGw9PXQ/dD1pLnVuaXQ6aT1pLnVuaWZ5KCksbmV3IGVlKGUocGFyc2VGbG9hdChpLnZhbHVlKSksdCl9LHJ0PXtjZWlsOm51bGwsZmxvb3I6bnVsbCxzcXJ0Om51bGwsYWJzOm51bGwsdGFuOiIiLHNpbjoiIixjb3M6IiIsYXRhbjoicmFkIixhc2luOiJyYWQiLGFjb3M6InJhZCJ9O2Zvcih2YXIgc3QgaW4gcnQpcnQuaGFzT3duUHJvcGVydHkoc3QpJiYocnRbc3RdPW50LmJpbmQobnVsbCxNYXRoW3N0XSxydFtzdF0pKTtydC5yb3VuZD1mdW5jdGlvbihlLHQpe3ZhciBpPXZvaWQgMD09PXQ/MDp0LnZhbHVlO3JldHVybiBudCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9GaXhlZChpKX0pLG51bGwsZSl9O3ZhciBvdD1mdW5jdGlvbihlLHQpe3N3aXRjaCgodD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KSkubGVuZ3RoKXtjYXNlIDA6dGhyb3d7dHlwZToiQXJndW1lbnQiLG1lc3NhZ2U6Im9uZSBvciBtb3JlIGFyZ3VtZW50cyByZXF1aXJlZCJ9fXZhciBpLG4scixzLG8sYSxsLHUsYz1bXSxoPXt9O2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspaWYoKHI9dFtpXSlpbnN0YW5jZW9mIGVlKWlmKGw9IiIhPT0oYT0iIj09PShzPSIiPT09ci51bml0LnRvU3RyaW5nKCkmJnZvaWQgMCE9PXU/bmV3IGVlKHIudmFsdWUsdSkudW5pZnkoKTpyLnVuaWZ5KCkpLnVuaXQudG9TdHJpbmcoKSYmdm9pZCAwIT09bD9sOnMudW5pdC50b1N0cmluZygpKSYmdm9pZCAwPT09bHx8IiIhPT1hJiYiIj09PWNbMF0udW5pZnkoKS51bml0LnRvU3RyaW5nKCk/YTpsLHU9IiIhPT1hJiZ2b2lkIDA9PT11P3IudW5pdC50b1N0cmluZygpOnUsdm9pZCAwIT09KG49dm9pZCAwIT09aFsiIl0mJiIiIT09YSYmYT09PWw/aFsiIl06aFthXSkpbz0iIj09PWNbbl0udW5pdC50b1N0cmluZygpJiZ2b2lkIDAhPT11P25ldyBlZShjW25dLnZhbHVlLHUpLnVuaWZ5KCk6Y1tuXS51bmlmeSgpLChlJiZzLnZhbHVlPG8udmFsdWV8fCFlJiZzLnZhbHVlPm8udmFsdWUpJiYoY1tuXT1yKTtlbHNle2lmKHZvaWQgMCE9PWwmJmEhPT1sKXRocm93e3R5cGU6IkFyZ3VtZW50IixtZXNzYWdlOiJpbmNvbXBhdGlibGUgdHlwZXMifTtoW2FdPWMubGVuZ3RoLGMucHVzaChyKX1lbHNlIEFycmF5LmlzQXJyYXkodFtpXS52YWx1ZSkmJkFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHQsQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodFtpXS52YWx1ZSkpO3JldHVybiAxPT1jLmxlbmd0aD9jWzBdOih0PWMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS50b0NTUyh0aGlzLmNvbnRleHQpfSkpLmpvaW4odGhpcy5jb250ZXh0LmNvbXByZXNzPyIsIjoiLCAiKSxuZXcgaigoZT8ibWluIjoibWF4IikrIigiK3QrIikiKSl9LGF0PXttaW46ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF07dHJ5e3JldHVybiBvdCghMCxlKX1jYXRjaChlKXt9fSxtYXg6ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF07dHJ5e3JldHVybiBvdCghMSxlKX1jYXRjaChlKXt9fSxjb252ZXJ0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29udmVydFRvKHQudmFsdWUpfSxwaTpmdW5jdGlvbigpe3JldHVybiBuZXcgZWUoTWF0aC5QSSl9LG1vZDpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgZWUoZS52YWx1ZSV0LnZhbHVlLGUudW5pdCl9LHBvdzpmdW5jdGlvbihlLHQpe2lmKCJudW1iZXIiPT10eXBlb2YgZSYmIm51bWJlciI9PXR5cGVvZiB0KWU9bmV3IGVlKGUpLHQ9bmV3IGVlKHQpO2Vsc2UgaWYoIShlIGluc3RhbmNlb2YgZWUmJnQgaW5zdGFuY2VvZiBlZSkpdGhyb3d7dHlwZToiQXJndW1lbnQiLG1lc3NhZ2U6ImFyZ3VtZW50cyBtdXN0IGJlIG51bWJlcnMifTtyZXR1cm4gbmV3IGVlKE1hdGgucG93KGUudmFsdWUsdC52YWx1ZSksZS51bml0KX0scGVyY2VudGFnZTpmdW5jdGlvbihlKXtyZXR1cm4gbnQoKGZ1bmN0aW9uKGUpe3JldHVybiAxMDAqZX0pLCIlIixlKX19LGx0PXtlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdWUoJyInLGUgaW5zdGFuY2VvZiB2ZT9lLmV2YWx1YXRlZDplLnZhbHVlLCEwKX0sZXNjYXBlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgaihlbmNvZGVVUkkoZS52YWx1ZSkucmVwbGFjZSgvPS9nLCIlM0QiKS5yZXBsYWNlKC86L2csIiUzQSIpLnJlcGxhY2UoLyMvZywiJTIzIikucmVwbGFjZSgvOy9nLCIlM0IiKS5yZXBsYWNlKC9cKC9nLCIlMjgiKS5yZXBsYWNlKC9cKS9nLCIlMjkiKSl9LHJlcGxhY2U6ZnVuY3Rpb24oZSx0LGksbil7dmFyIHI9ZS52YWx1ZTtyZXR1cm4gaT0iUXVvdGVkIj09PWkudHlwZT9pLnZhbHVlOmkudG9DU1MoKSxyPXIucmVwbGFjZShuZXcgUmVnRXhwKHQudmFsdWUsbj9uLnZhbHVlOiIiKSxpKSxuZXcgdWUoZS5xdW90ZXx8IiIscixlLmVzY2FwZWQpfSwiJSI6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxpPWUudmFsdWUsbj1mdW5jdGlvbihlKXtpPWkucmVwbGFjZSgvJVtzZGFdL2ksKGZ1bmN0aW9uKGkpe3ZhciBuPSJRdW90ZWQiPT09dFtlXS50eXBlJiZpLm1hdGNoKC9zL2kpP3RbZV0udmFsdWU6dFtlXS50b0NTUygpO3JldHVybiBpLm1hdGNoKC9bQS1aXSQvKT9lbmNvZGVVUklDb21wb25lbnQobik6bn0pKX0scj0wO3I8dC5sZW5ndGg7cisrKW4ocik7cmV0dXJuIGk9aS5yZXBsYWNlKC8lJS9nLCIlIiksbmV3IHVlKGUucXVvdGV8fCIiLGksZS5lc2NhcGVkKX19LHV0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiB0P0wuVHJ1ZTpMLkZhbHNlfSxjdD1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQpdGhyb3d7dHlwZToiQXJndW1lbnQiLG1lc3NhZ2U6Im1pc3NpbmcgdGhlIHJlcXVpcmVkIHNlY29uZCBhcmd1bWVudCB0byBpc3VuaXQuIn07aWYoInN0cmluZyIhPXR5cGVvZih0PSJzdHJpbmciPT10eXBlb2YgdC52YWx1ZT90LnZhbHVlOnQpKXRocm93e3R5cGU6IkFyZ3VtZW50IixtZXNzYWdlOiJTZWNvbmQgYXJndW1lbnQgdG8gaXN1bml0IHNob3VsZCBiZSBhIHVuaXQgb3IgYSBzdHJpbmcuIn07cmV0dXJuIGUgaW5zdGFuY2VvZiBlZSYmZS51bml0LmlzKHQpP0wuVHJ1ZTpMLkZhbHNlfSxodD17aXNydWxlc2V0OmZ1bmN0aW9uKGUpe3JldHVybiB1dChlLFgpfSxpc2NvbG9yOmZ1bmN0aW9uKGUpe3JldHVybiB1dChlLGMpfSxpc251bWJlcjpmdW5jdGlvbihlKXtyZXR1cm4gdXQoZSxlZSl9LGlzc3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiB1dChlLHVlKX0saXNrZXl3b3JkOmZ1bmN0aW9uKGUpe3JldHVybiB1dChlLEwpfSxpc3VybDpmdW5jdGlvbihlKXtyZXR1cm4gdXQoZSxjZSl9LGlzcGl4ZWw6ZnVuY3Rpb24oZSl7cmV0dXJuIGN0KGUsInB4Iil9LGlzcGVyY2VudGFnZTpmdW5jdGlvbihlKXtyZXR1cm4gY3QoZSwiJSIpfSxpc2VtOmZ1bmN0aW9uKGUpe3JldHVybiBjdChlLCJlbSIpfSxpc3VuaXQ6Y3QsdW5pdDpmdW5jdGlvbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIGVlKSl0aHJvd3t0eXBlOiJBcmd1bWVudCIsbWVzc2FnZToidGhlIGZpcnN0IGFyZ3VtZW50IHRvIHVuaXQgbXVzdCBiZSBhIG51bWJlciIrKGUgaW5zdGFuY2VvZiBpZT8iLiBIYXZlIHlvdSBmb3Jnb3R0ZW4gcGFyZW50aGVzaXM/IjoiIil9O3JldHVybiB0PXQ/dCBpbnN0YW5jZW9mIEw/dC52YWx1ZTp0LnRvQ1NTKCk6IiIsbmV3IGVlKGUudmFsdWUsdCl9LCJnZXQtdW5pdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBqKGUudW5pdCl9fSxmdD1mdW5jdGlvbihlKXt2YXIgdD17ZnVuY3Rpb25SZWdpc3RyeTpILGZ1bmN0aW9uQ2FsbGVyOnJlfTtyZXR1cm4gSC5hZGRNdWx0aXBsZShHZSksSC5hZGQoImRlZmF1bHQiLFEuZXZhbC5iaW5kKFEpKSxILmFkZE11bHRpcGxlKFplKSxILmFkZE11bHRpcGxlKFhlKSxILmFkZE11bHRpcGxlKGZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBjZSh0LGUuaW5kZXgsZS5jdXJyZW50RmlsZUluZm8pLmV2YWwoZS5jb250ZXh0KX07cmV0dXJueyJkYXRhLXVyaSI6ZnVuY3Rpb24oaSxuKXtufHwobj1pLGk9bnVsbCk7dmFyIHM9aSYmaS52YWx1ZSxvPW4udmFsdWUsYT10aGlzLmN1cnJlbnRGaWxlSW5mbyxsPWEucmV3cml0ZVVybHM/YS5jdXJyZW50RGlyZWN0b3J5OmEuZW50cnlQYXRoLHU9by5pbmRleE9mKCIjIiksYz0iIjstMSE9PXUmJihjPW8uc2xpY2UodSksbz1vLnNsaWNlKDAsdSkpO3ZhciBoPV8odGhpcy5jb250ZXh0KTtoLnJhd0J1ZmZlcj0hMDt2YXIgZj1lLmdldEZpbGVNYW5hZ2VyKG8sbCxoLGUsITApO2lmKCFmKXJldHVybiB0KHRoaXMsbik7dmFyIHA9ITE7aWYoaSlwPS87YmFzZTY0JC8udGVzdChzKTtlbHNle2lmKCJpbWFnZS9zdmcreG1sIj09PShzPWUubWltZUxvb2t1cChvKSkpcD0hMTtlbHNle3ZhciB2PWUuY2hhcnNldExvb2t1cChzKTtwPVsiVVMtQVNDSUkiLCJVVEYtOCJdLmluZGV4T2Yodik8MH1wJiYocys9IjtiYXNlNjQiKX12YXIgZD1mLmxvYWRGaWxlU3luYyhvLGwsaCxlKTtpZighZC5jb250ZW50cylyZXR1cm4gci53YXJuKCJTa2lwcGVkIGRhdGEtdXJpIGVtYmVkZGluZyBvZiAiK28rIiBiZWNhdXNlIGZpbGUgbm90IGZvdW5kIiksdCh0aGlzLG58fGkpO3ZhciBtPWQuY29udGVudHM7aWYocCYmIWUuZW5jb2RlQmFzZTY0KXJldHVybiB0KHRoaXMsbik7dmFyIGc9ImRhdGE6IitzKyIsIisobT1wP2UuZW5jb2RlQmFzZTY0KG0pOmVuY29kZVVSSUNvbXBvbmVudChtKSkrYztyZXR1cm4gbmV3IGNlKG5ldyB1ZSgnIicrZysnIicsZywhMSx0aGlzLmluZGV4LHRoaXMuY3VycmVudEZpbGVJbmZvKSx0aGlzLmluZGV4LHRoaXMuY3VycmVudEZpbGVJbmZvKX19fShlKSksSC5hZGRNdWx0aXBsZShpdCksSC5hZGRNdWx0aXBsZShydCksSC5hZGRNdWx0aXBsZShhdCksSC5hZGRNdWx0aXBsZShsdCksSC5hZGRNdWx0aXBsZSh7InN2Zy1ncmFkaWVudCI6ZnVuY3Rpb24oZSl7dmFyIHQsaSxuLHIscyxvLGEsbCx1PSJsaW5lYXIiLGg9J3g9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiJyxmPXtjb21wcmVzczohMX0scD1lLnRvQ1NTKGYpO2Z1bmN0aW9uIHYoKXt0aHJvd3t0eXBlOiJBcmd1bWVudCIsbWVzc2FnZToic3ZnLWdyYWRpZW50IGV4cGVjdHMgZGlyZWN0aW9uLCBzdGFydF9jb2xvciBbc3RhcnRfcG9zaXRpb25dLCBbY29sb3IgcG9zaXRpb24sXS4uLiwgZW5kX2NvbG9yIFtlbmRfcG9zaXRpb25dIG9yIGRpcmVjdGlvbiwgY29sb3IgbGlzdCJ9fXN3aXRjaCgyPT1hcmd1bWVudHMubGVuZ3RoPyhhcmd1bWVudHNbMV0udmFsdWUubGVuZ3RoPDImJnYoKSx0PWFyZ3VtZW50c1sxXS52YWx1ZSk6YXJndW1lbnRzLmxlbmd0aDwzP3YoKTp0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxwKXtjYXNlInRvIGJvdHRvbSI6aT0neDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiJzticmVhaztjYXNlInRvIHJpZ2h0IjppPSd4MT0iMCUiIHkxPSIwJSIgeDI9IjEwMCUiIHkyPSIwJSInO2JyZWFrO2Nhc2UidG8gYm90dG9tIHJpZ2h0IjppPSd4MT0iMCUiIHkxPSIwJSIgeDI9IjEwMCUiIHkyPSIxMDAlIic7YnJlYWs7Y2FzZSJ0byB0b3AgcmlnaHQiOmk9J3gxPSIwJSIgeTE9IjEwMCUiIHgyPSIxMDAlIiB5Mj0iMCUiJzticmVhaztjYXNlImVsbGlwc2UiOmNhc2UiZWxsaXBzZSBhdCBjZW50ZXIiOnU9InJhZGlhbCIsaT0nY3g9IjUwJSIgY3k9IjUwJSIgcj0iNzUlIicsaD0neD0iLTUwIiB5PSItNTAiIHdpZHRoPSIxMDEiIGhlaWdodD0iMTAxIic7YnJlYWs7ZGVmYXVsdDp0aHJvd3t0eXBlOiJBcmd1bWVudCIsbWVzc2FnZToic3ZnLWdyYWRpZW50IGRpcmVjdGlvbiBtdXN0IGJlICd0byBib3R0b20nLCAndG8gcmlnaHQnLCAndG8gYm90dG9tIHJpZ2h0JywgJ3RvIHRvcCByaWdodCcgb3IgJ2VsbGlwc2UgYXQgY2VudGVyJyJ9fWZvcihuPSc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDEgMSI+PCcrdSsnR3JhZGllbnQgaWQ9ImciICcraSsiPiIscj0wO3I8dC5sZW5ndGg7cis9MSl0W3JdaW5zdGFuY2VvZiBuZT8ocz10W3JdLnZhbHVlWzBdLG89dFtyXS52YWx1ZVsxXSk6KHM9dFtyXSxvPXZvaWQgMCkscyBpbnN0YW5jZW9mIGMmJigoMD09PXJ8fHIrMT09PXQubGVuZ3RoKSYmdm9pZCAwPT09b3x8byBpbnN0YW5jZW9mIGVlKXx8digpLGE9bz9vLnRvQ1NTKGYpOjA9PT1yPyIwJSI6IjEwMCUiLGw9cy5hbHBoYSxuKz0nPHN0b3Agb2Zmc2V0PSInK2ErJyIgc3RvcC1jb2xvcj0iJytzLnRvUkdCKCkrJyInKyhsPDE/JyBzdG9wLW9wYWNpdHk9IicrbCsnIic6IiIpKyIvPiI7cmV0dXJuIG4rPSI8LyIrdSsiR3JhZGllbnQ+PHJlY3QgIitoKycgZmlsbD0idXJsKCNnKSIgLz48L3N2Zz4nLG49ZW5jb2RlVVJJQ29tcG9uZW50KG4pLG5ldyBjZShuZXcgdWUoIiciKyhuPSJkYXRhOmltYWdlL3N2Zyt4bWwsIituKSsiJyIsbiwhMSx0aGlzLmluZGV4LHRoaXMuY3VycmVudEZpbGVJbmZvKSx0aGlzLmluZGV4LHRoaXMuY3VycmVudEZpbGVJbmZvKX19KSxILmFkZE11bHRpcGxlKGh0KSx0fTtmdW5jdGlvbiBwdChlLHQpe3ZhciBpLG49KHQ9dHx8e30pLnZhcmlhYmxlcyxyPW5ldyBxLkV2YWwodCk7Im9iamVjdCIhPXR5cGVvZiBufHxBcnJheS5pc0FycmF5KG4pfHwobj1PYmplY3Qua2V5cyhuKS5tYXAoKGZ1bmN0aW9uKGUpe3ZhciB0PW5bZV07cmV0dXJuIHQgaW5zdGFuY2VvZiBDZS5WYWx1ZXx8KHQgaW5zdGFuY2VvZiBDZS5FeHByZXNzaW9ufHwodD1uZXcgQ2UuRXhwcmVzc2lvbihbdF0pKSx0PW5ldyBDZS5WYWx1ZShbdF0pKSxuZXcgQ2UuRGVjbGFyYXRpb24oIkAiK2UsdCwhMSxudWxsLDApfSkpLHIuZnJhbWVzPVtuZXcgQ2UuUnVsZXNldChudWxsLG4pXSk7dmFyIHMsbyxhPVtuZXcgRGUuSm9pblNlbGVjdG9yVmlzaXRvcixuZXcgRGUuTWFya1Zpc2libGVTZWxlY3RvcnNWaXNpdG9yKCEwKSxuZXcgRGUuRXh0ZW5kVmlzaXRvcixuZXcgRGUuVG9DU1NWaXNpdG9yKHtjb21wcmVzczpCb29sZWFuKHQuY29tcHJlc3MpfSldLGw9W107aWYodC5wbHVnaW5NYW5hZ2VyKXtvPXQucGx1Z2luTWFuYWdlci52aXNpdG9yKCk7Zm9yKHZhciB1PTA7dTwyO3UrKylmb3Ioby5maXJzdCgpO3M9by5nZXQoKTspcy5pc1ByZUV2YWxWaXNpdG9yPzAhPT11JiYtMSE9PWwuaW5kZXhPZihzKXx8KGwucHVzaChzKSxzLnJ1bihlKSk6MCE9PXUmJi0xIT09YS5pbmRleE9mKHMpfHwocy5pc1ByZVZpc2l0b3I/YS51bnNoaWZ0KHMpOmEucHVzaChzKSl9aT1lLmV2YWwocik7Zm9yKHU9MDt1PGEubGVuZ3RoO3UrKylhW3VdLnJ1bihpKTtpZih0LnBsdWdpbk1hbmFnZXIpZm9yKG8uZmlyc3QoKTtzPW8uZ2V0KCk7KS0xPT09YS5pbmRleE9mKHMpJiYtMT09PWwuaW5kZXhPZihzKSYmcy5ydW4oaSk7cmV0dXJuIGl9dmFyIHZ0LGR0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLmxlc3M9ZSx0aGlzLnZpc2l0b3JzPVtdLHRoaXMucHJlUHJvY2Vzc29ycz1bXSx0aGlzLnBvc3RQcm9jZXNzb3JzPVtdLHRoaXMuaW5zdGFsbGVkUGx1Z2lucz1bXSx0aGlzLmZpbGVNYW5hZ2Vycz1bXSx0aGlzLml0ZXJhdG9yPS0xLHRoaXMucGx1Z2luQ2FjaGU9e30sdGhpcy5Mb2FkZXI9bmV3IGUuUGx1Z2luTG9hZGVyKGUpfXJldHVybiBlLnByb3RvdHlwZS5hZGRQbHVnaW5zPWZ1bmN0aW9uKGUpe2lmKGUpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy5hZGRQbHVnaW4oZVt0XSl9LGUucHJvdG90eXBlLmFkZFBsdWdpbj1mdW5jdGlvbihlLHQsaSl7dGhpcy5pbnN0YWxsZWRQbHVnaW5zLnB1c2goZSksdCYmKHRoaXMucGx1Z2luQ2FjaGVbdF09ZSksZS5pbnN0YWxsJiZlLmluc3RhbGwodGhpcy5sZXNzLHRoaXMsaXx8dGhpcy5sZXNzLmZ1bmN0aW9ucy5mdW5jdGlvblJlZ2lzdHJ5KX0sZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBsdWdpbkNhY2hlW2VdfSxlLnByb3RvdHlwZS5hZGRWaXNpdG9yPWZ1bmN0aW9uKGUpe3RoaXMudmlzaXRvcnMucHVzaChlKX0sZS5wcm90b3R5cGUuYWRkUHJlUHJvY2Vzc29yPWZ1bmN0aW9uKGUsdCl7dmFyIGk7Zm9yKGk9MDtpPHRoaXMucHJlUHJvY2Vzc29ycy5sZW5ndGgmJiEodGhpcy5wcmVQcm9jZXNzb3JzW2ldLnByaW9yaXR5Pj10KTtpKyspO3RoaXMucHJlUHJvY2Vzc29ycy5zcGxpY2UoaSwwLHtwcmVQcm9jZXNzb3I6ZSxwcmlvcml0eTp0fSl9LGUucHJvdG90eXBlLmFkZFBvc3RQcm9jZXNzb3I9ZnVuY3Rpb24oZSx0KXt2YXIgaTtmb3IoaT0wO2k8dGhpcy5wb3N0UHJvY2Vzc29ycy5sZW5ndGgmJiEodGhpcy5wb3N0UHJvY2Vzc29yc1tpXS5wcmlvcml0eT49dCk7aSsrKTt0aGlzLnBvc3RQcm9jZXNzb3JzLnNwbGljZShpLDAse3Bvc3RQcm9jZXNzb3I6ZSxwcmlvcml0eTp0fSl9LGUucHJvdG90eXBlLmFkZEZpbGVNYW5hZ2VyPWZ1bmN0aW9uKGUpe3RoaXMuZmlsZU1hbmFnZXJzLnB1c2goZSl9LGUucHJvdG90eXBlLmdldFByZVByb2Nlc3NvcnM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8dGhpcy5wcmVQcm9jZXNzb3JzLmxlbmd0aDt0KyspZS5wdXNoKHRoaXMucHJlUHJvY2Vzc29yc1t0XS5wcmVQcm9jZXNzb3IpO3JldHVybiBlfSxlLnByb3RvdHlwZS5nZXRQb3N0UHJvY2Vzc29ycz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTA7dDx0aGlzLnBvc3RQcm9jZXNzb3JzLmxlbmd0aDt0KyspZS5wdXNoKHRoaXMucG9zdFByb2Nlc3NvcnNbdF0ucG9zdFByb2Nlc3Nvcik7cmV0dXJuIGV9LGUucHJvdG90eXBlLmdldFZpc2l0b3JzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlzaXRvcnN9LGUucHJvdG90eXBlLnZpc2l0b3I9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybntmaXJzdDpmdW5jdGlvbigpe3JldHVybiBlLml0ZXJhdG9yPS0xLGUudmlzaXRvcnNbZS5pdGVyYXRvcl19LGdldDpmdW5jdGlvbigpe3JldHVybiBlLml0ZXJhdG9yKz0xLGUudmlzaXRvcnNbZS5pdGVyYXRvcl19fX0sZS5wcm90b3R5cGUuZ2V0RmlsZU1hbmFnZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsZU1hbmFnZXJzfSxlfSgpLG10PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIXQmJnZ0fHwodnQ9bmV3IGR0KGUpKSx2dH07dmFyIGd0LHl0LGJ0PWZ1bmN0aW9uKGUpe3ZhciB0PWUubWF0Y2goL152KFxkezEsMn0pXC4oXGR7MSwyfSlcLihcZHsxLDJ9KSg/Oi0oWzAtOUEtWmEtei0uXSspKT8oPzpcKyhbMC05QS1aYS16LS5dKykpPyQvKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBwYXJzZTogIitlKTtyZXR1cm57bWFqb3I6cGFyc2VJbnQodFsxXSwxMCksbWlub3I6cGFyc2VJbnQodFsyXSwxMCkscGF0Y2g6cGFyc2VJbnQodFszXSwxMCkscHJlOnRbNF18fCIiLGJ1aWxkOnRbNV18fCIifX07ZnVuY3Rpb24gd3QoZSx0KXt2YXIgaSxuLG8sYTtvPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSx0KXt0aGlzLnJvb3Q9ZSx0aGlzLmltcG9ydHM9dH1yZXR1cm4gdC5wcm90b3R5cGUudG9DU1M9ZnVuY3Rpb24odCl7dmFyIGksbixzPXt9O3RyeXtpPXB0KHRoaXMucm9vdCx0KX1jYXRjaChlKXt0aHJvdyBuZXcgTyhlLHRoaXMuaW1wb3J0cyl9dHJ5e3ZhciBvPUJvb2xlYW4odC5jb21wcmVzcyk7byYmci53YXJuKCJUaGUgY29tcHJlc3Mgb3B0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFdlIHJlY29tbWVuZCB5b3UgdXNlIGEgZGVkaWNhdGVkIGNzcyBtaW5pZmllciwgZm9yIGluc3RhbmNlIHNlZSBsZXNzLXBsdWdpbi1jbGVhbi1jc3MuIik7dmFyIGE9e2NvbXByZXNzOm8sZHVtcExpbmVOdW1iZXJzOnQuZHVtcExpbmVOdW1iZXJzLHN0cmljdFVuaXRzOkJvb2xlYW4odC5zdHJpY3RVbml0cyksbnVtUHJlY2lzaW9uOjh9O3Quc291cmNlTWFwPyhuPW5ldyBlKHQuc291cmNlTWFwKSxzLmNzcz1uLnRvQ1NTKGksYSx0aGlzLmltcG9ydHMpKTpzLmNzcz1pLnRvQ1NTKGEpfWNhdGNoKGUpe3Rocm93IG5ldyBPKGUsdGhpcy5pbXBvcnRzKX1pZih0LnBsdWdpbk1hbmFnZXIpZm9yKHZhciBsPXQucGx1Z2luTWFuYWdlci5nZXRQb3N0UHJvY2Vzc29ycygpLHU9MDt1PGwubGVuZ3RoO3UrKylzLmNzcz1sW3VdLnByb2Nlc3Mocy5jc3Mse3NvdXJjZU1hcDpuLG9wdGlvbnM6dCxpbXBvcnRzOnRoaXMuaW1wb3J0c30pO2Zvcih2YXIgYyBpbiB0LnNvdXJjZU1hcCYmKHMubWFwPW4uZ2V0RXh0ZXJuYWxTb3VyY2VNYXAoKSkscy5pbXBvcnRzPVtdLHRoaXMuaW1wb3J0cy5maWxlcyl0aGlzLmltcG9ydHMuZmlsZXMuaGFzT3duUHJvcGVydHkoYykmJmMhPT10aGlzLmltcG9ydHMucm9vdEZpbGVuYW1lJiZzLmltcG9ydHMucHVzaChjKTtyZXR1cm4gc30sdH0oKX0obj1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIGkoZSl7dGhpcy5vcHRpb25zPWV9cmV0dXJuIGkucHJvdG90eXBlLnRvQ1NTPWZ1bmN0aW9uKHQsaSxuKXt2YXIgcj1uZXcgZSh7Y29udGVudHNJZ25vcmVkQ2hhcnNNYXA6bi5jb250ZW50c0lnbm9yZWRDaGFycyxyb290Tm9kZTp0LGNvbnRlbnRzTWFwOm4uY29udGVudHMsc291cmNlTWFwRmlsZW5hbWU6dGhpcy5vcHRpb25zLnNvdXJjZU1hcEZpbGVuYW1lLHNvdXJjZU1hcFVSTDp0aGlzLm9wdGlvbnMuc291cmNlTWFwVVJMLG91dHB1dEZpbGVuYW1lOnRoaXMub3B0aW9ucy5zb3VyY2VNYXBPdXRwdXRGaWxlbmFtZSxzb3VyY2VNYXBCYXNlcGF0aDp0aGlzLm9wdGlvbnMuc291cmNlTWFwQmFzZXBhdGgsc291cmNlTWFwUm9vdHBhdGg6dGhpcy5vcHRpb25zLnNvdXJjZU1hcFJvb3RwYXRoLG91dHB1dFNvdXJjZUZpbGVzOnRoaXMub3B0aW9ucy5vdXRwdXRTb3VyY2VGaWxlcyxzb3VyY2VNYXBHZW5lcmF0b3I6dGhpcy5vcHRpb25zLnNvdXJjZU1hcEdlbmVyYXRvcixzb3VyY2VNYXBGaWxlSW5saW5lOnRoaXMub3B0aW9ucy5zb3VyY2VNYXBGaWxlSW5saW5lLGRpc2FibGVTb3VyY2VtYXBBbm5vdGF0aW9uOnRoaXMub3B0aW9ucy5kaXNhYmxlU291cmNlbWFwQW5ub3RhdGlvbn0pLHM9ci50b0NTUyhpKTtyZXR1cm4gdGhpcy5zb3VyY2VNYXA9ci5zb3VyY2VNYXAsdGhpcy5zb3VyY2VNYXBVUkw9ci5zb3VyY2VNYXBVUkwsdGhpcy5vcHRpb25zLnNvdXJjZU1hcElucHV0RmlsZW5hbWUmJih0aGlzLnNvdXJjZU1hcElucHV0RmlsZW5hbWU9ci5ub3JtYWxpemVGaWxlbmFtZSh0aGlzLm9wdGlvbnMuc291cmNlTWFwSW5wdXRGaWxlbmFtZSkpLHZvaWQgMCE9PXRoaXMub3B0aW9ucy5zb3VyY2VNYXBCYXNlcGF0aCYmdm9pZCAwIT09dGhpcy5zb3VyY2VNYXBVUkwmJih0aGlzLnNvdXJjZU1hcFVSTD1yLnJlbW92ZUJhc2VwYXRoKHRoaXMuc291cmNlTWFwVVJMKSkscyt0aGlzLmdldENTU0FwcGVuZGFnZSgpfSxpLnByb3RvdHlwZS5nZXRDU1NBcHBlbmRhZ2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNvdXJjZU1hcFVSTDtpZih0aGlzLm9wdGlvbnMuc291cmNlTWFwRmlsZUlubGluZSl7aWYodm9pZCAwPT09dGhpcy5zb3VyY2VNYXApcmV0dXJuIiI7ZT0iZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCwiK3QuZW5jb2RlQmFzZTY0KHRoaXMuc291cmNlTWFwKX1yZXR1cm4gdGhpcy5vcHRpb25zLmRpc2FibGVTb3VyY2VtYXBBbm5vdGF0aW9uPyIiOmU/Ii8qIyBzb3VyY2VNYXBwaW5nVVJMPSIrZSsiICovIjoiIn0saS5wcm90b3R5cGUuZ2V0RXh0ZXJuYWxTb3VyY2VNYXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb3VyY2VNYXB9LGkucHJvdG90eXBlLnNldEV4dGVybmFsU291cmNlTWFwPWZ1bmN0aW9uKGUpe3RoaXMuc291cmNlTWFwPWV9LGkucHJvdG90eXBlLmlzSW5saW5lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5zb3VyY2VNYXBGaWxlSW5saW5lfSxpLnByb3RvdHlwZS5nZXRTb3VyY2VNYXBVUkw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zb3VyY2VNYXBVUkx9LGkucHJvdG90eXBlLmdldE91dHB1dEZpbGVuYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5zb3VyY2VNYXBPdXRwdXRGaWxlbmFtZX0saS5wcm90b3R5cGUuZ2V0SW5wdXRGaWxlbmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNvdXJjZU1hcElucHV0RmlsZW5hbWV9LGl9KCl9KGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9jc3M9W10sdGhpcy5fcm9vdE5vZGU9dC5yb290Tm9kZSx0aGlzLl9jb250ZW50c01hcD10LmNvbnRlbnRzTWFwLHRoaXMuX2NvbnRlbnRzSWdub3JlZENoYXJzTWFwPXQuY29udGVudHNJZ25vcmVkQ2hhcnNNYXAsdC5zb3VyY2VNYXBGaWxlbmFtZSYmKHRoaXMuX3NvdXJjZU1hcEZpbGVuYW1lPXQuc291cmNlTWFwRmlsZW5hbWUucmVwbGFjZSgvXFwvZywiLyIpKSx0aGlzLl9vdXRwdXRGaWxlbmFtZT10Lm91dHB1dEZpbGVuYW1lLHRoaXMuc291cmNlTWFwVVJMPXQuc291cmNlTWFwVVJMLHQuc291cmNlTWFwQmFzZXBhdGgmJih0aGlzLl9zb3VyY2VNYXBCYXNlcGF0aD10LnNvdXJjZU1hcEJhc2VwYXRoLnJlcGxhY2UoL1xcL2csIi8iKSksdC5zb3VyY2VNYXBSb290cGF0aD8odGhpcy5fc291cmNlTWFwUm9vdHBhdGg9dC5zb3VyY2VNYXBSb290cGF0aC5yZXBsYWNlKC9cXC9nLCIvIiksIi8iIT09dGhpcy5fc291cmNlTWFwUm9vdHBhdGguY2hhckF0KHRoaXMuX3NvdXJjZU1hcFJvb3RwYXRoLmxlbmd0aC0xKSYmKHRoaXMuX3NvdXJjZU1hcFJvb3RwYXRoKz0iLyIpKTp0aGlzLl9zb3VyY2VNYXBSb290cGF0aD0iIix0aGlzLl9vdXRwdXRTb3VyY2VGaWxlcz10Lm91dHB1dFNvdXJjZUZpbGVzLHRoaXMuX3NvdXJjZU1hcEdlbmVyYXRvckNvbnN0cnVjdG9yPWUuZ2V0U291cmNlTWFwR2VuZXJhdG9yKCksdGhpcy5fbGluZU51bWJlcj0wLHRoaXMuX2NvbHVtbj0wfXJldHVybiB0LnByb3RvdHlwZS5yZW1vdmVCYXNlcGF0aD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fc291cmNlTWFwQmFzZXBhdGgmJjA9PT1lLmluZGV4T2YodGhpcy5fc291cmNlTWFwQmFzZXBhdGgpJiYoIlxcIiE9PShlPWUuc3Vic3RyaW5nKHRoaXMuX3NvdXJjZU1hcEJhc2VwYXRoLmxlbmd0aCkpLmNoYXJBdCgwKSYmIi8iIT09ZS5jaGFyQXQoMCl8fChlPWUuc3Vic3RyaW5nKDEpKSksZX0sdC5wcm90b3R5cGUubm9ybWFsaXplRmlsZW5hbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5yZXBsYWNlKC9cXC9nLCIvIiksZT10aGlzLnJlbW92ZUJhc2VwYXRoKGUpLCh0aGlzLl9zb3VyY2VNYXBSb290cGF0aHx8IiIpK2V9LHQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlLHQsaSxuKXtpZihlKXt2YXIgcixzLG8sYSxsO2lmKHQmJnQuZmlsZW5hbWUpe3ZhciB1PXRoaXMuX2NvbnRlbnRzTWFwW3QuZmlsZW5hbWVdO2lmKHRoaXMuX2NvbnRlbnRzSWdub3JlZENoYXJzTWFwW3QuZmlsZW5hbWVdJiYoKGktPXRoaXMuX2NvbnRlbnRzSWdub3JlZENoYXJzTWFwW3QuZmlsZW5hbWVdKTwwJiYoaT0wKSx1PXUuc2xpY2UodGhpcy5fY29udGVudHNJZ25vcmVkQ2hhcnNNYXBbdC5maWxlbmFtZV0pKSx2b2lkIDA9PT11KXJldHVybiB2b2lkIHRoaXMuX2Nzcy5wdXNoKGUpO2E9KHM9KHU9dS5zdWJzdHJpbmcoMCxpKSkuc3BsaXQoIlxuIikpW3MubGVuZ3RoLTFdfWlmKG89KHI9ZS5zcGxpdCgiXG4iKSlbci5sZW5ndGgtMV0sdCYmdC5maWxlbmFtZSlpZihuKWZvcihsPTA7bDxyLmxlbmd0aDtsKyspdGhpcy5fc291cmNlTWFwR2VuZXJhdG9yLmFkZE1hcHBpbmcoe2dlbmVyYXRlZDp7bGluZTp0aGlzLl9saW5lTnVtYmVyK2wrMSxjb2x1bW46MD09PWw/dGhpcy5fY29sdW1uOjB9LG9yaWdpbmFsOntsaW5lOnMubGVuZ3RoK2wsY29sdW1uOjA9PT1sP2EubGVuZ3RoOjB9LHNvdXJjZTp0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKHQuZmlsZW5hbWUpfSk7ZWxzZSB0aGlzLl9zb3VyY2VNYXBHZW5lcmF0b3IuYWRkTWFwcGluZyh7Z2VuZXJhdGVkOntsaW5lOnRoaXMuX2xpbmVOdW1iZXIrMSxjb2x1bW46dGhpcy5fY29sdW1ufSxvcmlnaW5hbDp7bGluZTpzLmxlbmd0aCxjb2x1bW46YS5sZW5ndGh9LHNvdXJjZTp0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKHQuZmlsZW5hbWUpfSk7MT09PXIubGVuZ3RoP3RoaXMuX2NvbHVtbis9by5sZW5ndGg6KHRoaXMuX2xpbmVOdW1iZXIrPXIubGVuZ3RoLTEsdGhpcy5fY29sdW1uPW8ubGVuZ3RoKSx0aGlzLl9jc3MucHVzaChlKX19LHQucHJvdG90eXBlLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuX2Nzcy5sZW5ndGh9LHQucHJvdG90eXBlLnRvQ1NTPWZ1bmN0aW9uKGUpe2lmKHRoaXMuX3NvdXJjZU1hcEdlbmVyYXRvcj1uZXcgdGhpcy5fc291cmNlTWFwR2VuZXJhdG9yQ29uc3RydWN0b3Ioe2ZpbGU6dGhpcy5fb3V0cHV0RmlsZW5hbWUsc291cmNlUm9vdDpudWxsfSksdGhpcy5fb3V0cHV0U291cmNlRmlsZXMpZm9yKHZhciB0IGluIHRoaXMuX2NvbnRlbnRzTWFwKWlmKHRoaXMuX2NvbnRlbnRzTWFwLmhhc093blByb3BlcnR5KHQpKXt2YXIgaT10aGlzLl9jb250ZW50c01hcFt0XTt0aGlzLl9jb250ZW50c0lnbm9yZWRDaGFyc01hcFt0XSYmKGk9aS5zbGljZSh0aGlzLl9jb250ZW50c0lnbm9yZWRDaGFyc01hcFt0XSkpLHRoaXMuX3NvdXJjZU1hcEdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHRoaXMubm9ybWFsaXplRmlsZW5hbWUodCksaSl9aWYodGhpcy5fcm9vdE5vZGUuZ2VuQ1NTKGUsdGhpcyksdGhpcy5fY3NzLmxlbmd0aD4wKXt2YXIgbj12b2lkIDAscj1KU09OLnN0cmluZ2lmeSh0aGlzLl9zb3VyY2VNYXBHZW5lcmF0b3IudG9KU09OKCkpO3RoaXMuc291cmNlTWFwVVJMP249dGhpcy5zb3VyY2VNYXBVUkw6dGhpcy5fc291cmNlTWFwRmlsZW5hbWUmJihuPXRoaXMuX3NvdXJjZU1hcEZpbGVuYW1lKSx0aGlzLnNvdXJjZU1hcFVSTD1uLHRoaXMuc291cmNlTWFwPXJ9cmV0dXJuIHRoaXMuX2Nzcy5qb2luKCIiKX0sdH0oKX0oZT1uZXcgcyhlLHQpKSxlKSksYT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsdCxpKXt0aGlzLmxlc3M9ZSx0aGlzLnJvb3RGaWxlbmFtZT1pLmZpbGVuYW1lLHRoaXMucGF0aHM9dC5wYXRoc3x8W10sdGhpcy5jb250ZW50cz17fSx0aGlzLmNvbnRlbnRzSWdub3JlZENoYXJzPXt9LHRoaXMubWltZT10Lm1pbWUsdGhpcy5lcnJvcj1udWxsLHRoaXMuY29udGV4dD10LHRoaXMucXVldWU9W10sdGhpcy5maWxlcz17fX1yZXR1cm4gdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0LGksbixzLG8pe3ZhciBhPXRoaXMsbD10aGlzLmNvbnRleHQucGx1Z2luTWFuYWdlci5Mb2FkZXI7dGhpcy5xdWV1ZS5wdXNoKHQpO3ZhciB1PWZ1bmN0aW9uKGUsaSxuKXthLnF1ZXVlLnNwbGljZShhLnF1ZXVlLmluZGV4T2YodCksMSk7dmFyIGw9bj09PWEucm9vdEZpbGVuYW1lO3Mub3B0aW9uYWwmJmU/KG8obnVsbCx7cnVsZXM6W119LCExLG51bGwpLHIuaW5mbygiVGhlIGZpbGUgIituKyIgd2FzIHNraXBwZWQgYmVjYXVzZSBpdCB3YXMgbm90IGZvdW5kIGFuZCB0aGUgaW1wb3J0IHdhcyBtYXJrZWQgb3B0aW9uYWwuIikpOihhLmZpbGVzW25dfHxzLmlubGluZXx8KGEuZmlsZXNbbl09e3Jvb3Q6aSxvcHRpb25zOnN9KSxlJiYhYS5lcnJvciYmKGEuZXJyb3I9ZSksbyhlLGksbCxuKSl9LGM9e3Jld3JpdGVVcmxzOnRoaXMuY29udGV4dC5yZXdyaXRlVXJscyxlbnRyeVBhdGg6bi5lbnRyeVBhdGgscm9vdHBhdGg6bi5yb290cGF0aCxyb290RmlsZW5hbWU6bi5yb290RmlsZW5hbWV9LGg9ZS5nZXRGaWxlTWFuYWdlcih0LG4uY3VycmVudERpcmVjdG9yeSx0aGlzLmNvbnRleHQsZSk7aWYoaCl7dmFyIGYscCx2PWZ1bmN0aW9uKGUpe3ZhciB0LGk9ZS5maWxlbmFtZSxyPWUuY29udGVudHMucmVwbGFjZSgvXlx1RkVGRi8sIiIpO2MuY3VycmVudERpcmVjdG9yeT1oLmdldFBhdGgoaSksYy5yZXdyaXRlVXJscyYmKGMucm9vdHBhdGg9aC5qb2luKGEuY29udGV4dC5yb290cGF0aHx8IiIsaC5wYXRoRGlmZihjLmN1cnJlbnREaXJlY3RvcnksYy5lbnRyeVBhdGgpKSwhaC5pc1BhdGhBYnNvbHV0ZShjLnJvb3RwYXRoKSYmaC5hbHdheXNNYWtlUGF0aHNBYnNvbHV0ZSgpJiYoYy5yb290cGF0aD1oLmpvaW4oYy5lbnRyeVBhdGgsYy5yb290cGF0aCkpKSxjLmZpbGVuYW1lPWk7dmFyIG89bmV3IHEuUGFyc2UoYS5jb250ZXh0KTtvLnByb2Nlc3NJbXBvcnRzPSExLGEuY29udGVudHNbaV09ciwobi5yZWZlcmVuY2V8fHMucmVmZXJlbmNlKSYmKGMucmVmZXJlbmNlPSEwKSxzLmlzUGx1Z2luPyh0PWwuZXZhbFBsdWdpbihyLG8sYSxzLnBsdWdpbkFyZ3MsYykpaW5zdGFuY2VvZiBPP3UodCxudWxsLGkpOnUobnVsbCx0LGkpOnMuaW5saW5lP3UobnVsbCxyLGkpOiFhLmZpbGVzW2ldfHxhLmZpbGVzW2ldLm9wdGlvbnMubXVsdGlwbGV8fHMubXVsdGlwbGU/bmV3IFVlKG8sYSxjKS5wYXJzZShyLChmdW5jdGlvbihlLHQpe3UoZSx0LGkpfSkpOnUobnVsbCxhLmZpbGVzW2ldLnJvb3QsaSl9LGQ9Xyh0aGlzLmNvbnRleHQpO2kmJihkLmV4dD1zLmlzUGx1Z2luPyIuanMiOiIubGVzcyIpLHMuaXNQbHVnaW4/KGQubWltZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCIsZC5zeW5jSW1wb3J0P2Y9bC5sb2FkUGx1Z2luU3luYyh0LG4uY3VycmVudERpcmVjdG9yeSxkLGUsaCk6cD1sLmxvYWRQbHVnaW4odCxuLmN1cnJlbnREaXJlY3RvcnksZCxlLGgpKTpkLnN5bmNJbXBvcnQ/Zj1oLmxvYWRGaWxlU3luYyh0LG4uY3VycmVudERpcmVjdG9yeSxkLGUpOnA9aC5sb2FkRmlsZSh0LG4uY3VycmVudERpcmVjdG9yeSxkLGUsKGZ1bmN0aW9uKGUsdCl7ZT91KGUpOnYodCl9KSksZj9mLmZpbGVuYW1lP3YoZik6dShmKTpwJiZwLnRoZW4odix1KX1lbHNlIHUoe21lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIGEgZmlsZS1tYW5hZ2VyIGZvciAiK3R9KX0sdH0oKX0oZSk7dmFyIHUsYz1mdW5jdGlvbihlLHQsaSl7dmFyIG49ZnVuY3Rpb24oZSxpLHIpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBpPyhyPWksaT1NKHRoaXMub3B0aW9ucyx7fSkpOmk9TSh0aGlzLm9wdGlvbnMsaXx8e30pLCFyKXt2YXIgcz10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxyKXtuLmNhbGwocyxlLGksKGZ1bmN0aW9uKGUsaSl7ZT9yKGUpOnQoaSl9KSl9KSl9dGhpcy5wYXJzZShlLGksKGZ1bmN0aW9uKGUsaSxuLHMpe2lmKGUpcmV0dXJuIHIoZSk7dmFyIG87dHJ5e289bmV3IHQoaSxuKS50b0NTUyhzKX1jYXRjaChlKXtyZXR1cm4gcihlKX1yKG51bGwsbyl9KSl9O3JldHVybiBufSgwLG8pLGg9ZnVuY3Rpb24oZSx0LGkpe3ZhciBuPWZ1bmN0aW9uKGUsdCxyKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdD8ocj10LHQ9TSh0aGlzLm9wdGlvbnMse30pKTp0PU0odGhpcy5vcHRpb25zLHR8fHt9KSwhcil7dmFyIHM9dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGkscil7bi5jYWxsKHMsZSx0LChmdW5jdGlvbihlLHQpe2U/cihlKTppKHQpfSkpfSkpfXZhciBvLGE9dm9pZCAwLGw9bmV3IG10KHRoaXMsIXQucmVVc2VQbHVnaW5NYW5hZ2VyKTtpZih0LnBsdWdpbk1hbmFnZXI9bCxvPW5ldyBxLlBhcnNlKHQpLHQucm9vdEZpbGVJbmZvKWE9dC5yb290RmlsZUluZm87ZWxzZXt2YXIgdT10LmZpbGVuYW1lfHwiaW5wdXQiLGM9dS5yZXBsYWNlKC9bXlwvXFxdKiQvLCIiKTsoYT17ZmlsZW5hbWU6dSxyZXdyaXRlVXJsczpvLnJld3JpdGVVcmxzLHJvb3RwYXRoOm8ucm9vdHBhdGh8fCIiLGN1cnJlbnREaXJlY3Rvcnk6YyxlbnRyeVBhdGg6Yyxyb290RmlsZW5hbWU6dX0pLnJvb3RwYXRoJiYiLyIhPT1hLnJvb3RwYXRoLnNsaWNlKC0xKSYmKGEucm9vdHBhdGgrPSIvIil9dmFyIGg9bmV3IGkodGhpcyxvLGEpO3RoaXMuaW1wb3J0TWFuYWdlcj1oLHQucGx1Z2lucyYmdC5wbHVnaW5zLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0LGk7aWYoZS5maWxlQ29udGVudCl7aWYoaT1lLmZpbGVDb250ZW50LnJlcGxhY2UoL15cdUZFRkYvLCIiKSwodD1sLkxvYWRlci5ldmFsUGx1Z2luKGksbyxoLGUub3B0aW9ucyxlLmZpbGVuYW1lKSlpbnN0YW5jZW9mIE8pcmV0dXJuIHIodCl9ZWxzZSBsLmFkZFBsdWdpbihlKX0pKSxuZXcgVWUobyxoLGEpLnBhcnNlKGUsKGZ1bmN0aW9uKGUsaSl7aWYoZSlyZXR1cm4gcihlKTtyKG51bGwsaSxoLHQpfSksdCl9O3JldHVybiBufSgwLDAsYSksZj1idCgidjQuMS4yIikscD17dmVyc2lvbjpbZi5tYWpvcixmLm1pbm9yLGYucGF0Y2hdLGRhdGE6bCx0cmVlOkNlLEVudmlyb25tZW50OnMsQWJzdHJhY3RGaWxlTWFuYWdlcjprZSxBYnN0cmFjdFBsdWdpbkxvYWRlcjpfZSxlbnZpcm9ubWVudDplLHZpc2l0b3JzOkRlLFBhcnNlcjpVZSxmdW5jdGlvbnM6ZnQoZSksY29udGV4dHM6cSxTb3VyY2VNYXBPdXRwdXQ6aSxTb3VyY2VNYXBCdWlsZGVyOm4sUGFyc2VUcmVlOm8sSW1wb3J0TWFuYWdlcjphLHJlbmRlcjpjLHBhcnNlOmgsTGVzc0Vycm9yOk8sdHJhbnNmb3JtVHJlZTpwdCx1dGlsczpQLFBsdWdpbk1hbmFnZXI6bXQsbG9nZ2VyOnJ9LHY9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSk7cmV0dXJuIGUuYXBwbHkodCxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpLHR9fSxkPU9iamVjdC5jcmVhdGUocCk7Zm9yKHZhciBtIGluIHAudHJlZSlpZigiZnVuY3Rpb24iPT10eXBlb2YodT1wLnRyZWVbbV0pKWRbbS50b0xvd2VyQ2FzZSgpXT12KHUpO2Vsc2UgZm9yKHZhciBnIGluIGRbbV09T2JqZWN0LmNyZWF0ZShudWxsKSx1KWRbbV1bZy50b0xvd2VyQ2FzZSgpXT12KHVbZ10pO3JldHVybiBwLnBhcnNlPXAucGFyc2UuYmluZChkKSxwLnJlbmRlcj1wLnJlbmRlci5iaW5kKGQpLGR9dmFyIHh0PXt9LFN0PWZ1bmN0aW9uKCl7fTtTdC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihuZXcga2Use2Fsd2F5c01ha2VQYXRoc0Fic29sdXRlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGpvaW46ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT90aGlzLmV4dHJhY3RVcmxQYXJ0cyh0LGUpLnBhdGg6dH0sZG9YSFI6ZnVuY3Rpb24oZSx0LGksbil7dmFyIHI9bmV3IFhNTEh0dHBSZXF1ZXN0LHM9IWd0LmlzRmlsZVByb3RvY29sfHxndC5maWxlQXN5bmM7ZnVuY3Rpb24gbyh0LGksbil7dC5zdGF0dXM+PTIwMCYmdC5zdGF0dXM8MzAwP2kodC5yZXNwb25zZVRleHQsdC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKToiZnVuY3Rpb24iPT10eXBlb2YgbiYmbih0LnN0YXR1cyxlKX0iZnVuY3Rpb24iPT10eXBlb2Ygci5vdmVycmlkZU1pbWVUeXBlJiZyLm92ZXJyaWRlTWltZVR5cGUoInRleHQvY3NzIikseXQuZGVidWcoIlhIUjogR2V0dGluZyAnIitlKyInIiksci5vcGVuKCJHRVQiLGUscyksci5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLHR8fCJ0ZXh0L3gtbGVzcywgdGV4dC9jc3M7IHE9MC45LCAqLyo7IHE9MC41Iiksci5zZW5kKG51bGwpLGd0LmlzRmlsZVByb3RvY29sJiYhZ3QuZmlsZUFzeW5jPzA9PT1yLnN0YXR1c3x8ci5zdGF0dXM+PTIwMCYmci5zdGF0dXM8MzAwP2koci5yZXNwb25zZVRleHQpOm4oci5zdGF0dXMsZSk6cz9yLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PXIucmVhZHlTdGF0ZSYmbyhyLGksbil9Om8ocixpLG4pfSxzdXBwb3J0czpmdW5jdGlvbigpe3JldHVybiEwfSxjbGVhckZpbGVDYWNoZTpmdW5jdGlvbigpe3h0PXt9fSxsb2FkRmlsZTpmdW5jdGlvbihlLHQsaSxuKXt0JiYhdGhpcy5pc1BhdGhBYnNvbHV0ZShlKSYmKGU9dCtlKSxlPWkuZXh0P3RoaXMudHJ5QXBwZW5kRXh0ZW5zaW9uKGUsaS5leHQpOmUsaT1pfHx7fTt2YXIgcj10aGlzLmV4dHJhY3RVcmxQYXJ0cyhlLHdpbmRvdy5sb2NhdGlvbi5ocmVmKS51cmwscz10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSx0KXtpZihpLnVzZUZpbGVDYWNoZSYmeHRbcl0pdHJ5e3ZhciBuPXh0W3JdO3JldHVybiBlKHtjb250ZW50czpuLGZpbGVuYW1lOnIsd2ViSW5mbzp7bGFzdE1vZGlmaWVkOm5ldyBEYXRlfX0pfWNhdGNoKGUpe3JldHVybiB0KHtmaWxlbmFtZTpyLG1lc3NhZ2U6IkVycm9yIGxvYWRpbmcgZmlsZSAiK3IrIiBlcnJvciB3YXMgIitlLm1lc3NhZ2V9KX1zLmRvWEhSKHIsaS5taW1lLChmdW5jdGlvbih0LGkpe3h0W3JdPXQsZSh7Y29udGVudHM6dCxmaWxlbmFtZTpyLHdlYkluZm86e2xhc3RNb2RpZmllZDppfX0pfSksKGZ1bmN0aW9uKGUsaSl7dCh7dHlwZToiRmlsZSIsbWVzc2FnZToiJyIraSsiJyB3YXNuJ3QgZm91bmQgKCIrZSsiKSIsaHJlZjpyfSl9KSl9KSl9fSk7dmFyIEl0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGd0PWUseXQ9dCxTdH0sQ3Q9ZnVuY3Rpb24oZSl7dGhpcy5sZXNzPWV9O0N0LnByb3RvdHlwZT1PYmplY3QuYXNzaWduKG5ldyBfZSx7bG9hZFBsdWdpbjpmdW5jdGlvbihlLHQsaSxuLHIpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocyxvKXtyLmxvYWRGaWxlKGUsdCxpLG4pLnRoZW4ocykuY2F0Y2gobyl9KSl9fSk7dmFyIGt0PWZ1bmN0aW9uKHQsbixyKXtyZXR1cm57YWRkOmZ1bmN0aW9uKHMsbyl7ci5lcnJvclJlcG9ydGluZyYmImh0bWwiIT09ci5lcnJvclJlcG9ydGluZz8iY29uc29sZSI9PT1yLmVycm9yUmVwb3J0aW5nP2Z1bmN0aW9uKGUsdCl7dmFyIGk9ZS5maWxlbmFtZXx8dCxzPVtdLG89KGUudHlwZXx8IlN5bnRheCIpKyJFcnJvcjogIisoZS5tZXNzYWdlfHwiVGhlcmUgaXMgYW4gZXJyb3IgaW4geW91ciAubGVzcyBmaWxlIikrIiBpbiAiK2ksYT1mdW5jdGlvbihlLHQsaSl7dm9pZCAwIT09ZS5leHRyYWN0W3RdJiZzLnB1c2goIntsaW5lfSB7Y29udGVudH0iLnJlcGxhY2UoL1x7bGluZVx9LywocGFyc2VJbnQoZS5saW5lLDEwKXx8MCkrKHQtMSkpLnJlcGxhY2UoL1x7Y2xhc3NcfS8saSkucmVwbGFjZSgvXHtjb250ZW50XH0vLGUuZXh0cmFjdFt0XSkpfTtlLmxpbmUmJihhKGUsMCwiIiksYShlLDEsImxpbmUiKSxhKGUsMiwiIiksbys9IiBvbiBsaW5lICIrZS5saW5lKyIsIGNvbHVtbiAiKyhlLmNvbHVtbisxKSsiOlxuIitzLmpvaW4oIlxuIikpLGUuc3RhY2smJihlLmV4dHJhY3R8fHIubG9nTGV2ZWw+PTQpJiYobys9IlxuU3RhY2sgVHJhY2VcbiIrZS5zdGFjayksbi5sb2dnZXIuZXJyb3Iobyl9KHMsbyk6ImZ1bmN0aW9uIj09dHlwZW9mIHIuZXJyb3JSZXBvcnRpbmcmJnIuZXJyb3JSZXBvcnRpbmcoImFkZCIscyxvKTpmdW5jdGlvbihuLHMpe3ZhciBvLGEsbD0ibGVzcy1lcnJvci1tZXNzYWdlOiIrZShzfHwiIiksdT10LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9W10saD1uLmZpbGVuYW1lfHxzLGY9aC5tYXRjaCgvKFteXC9dKyhcPy4qKT8pJC8pWzFdO3UuaWQ9bCx1LmNsYXNzTmFtZT0ibGVzcy1lcnJvci1tZXNzYWdlIixhPSI8aDM+Iisobi50eXBlfHwiU3ludGF4IikrIkVycm9yOiAiKyhuLm1lc3NhZ2V8fCJUaGVyZSBpcyBhbiBlcnJvciBpbiB5b3VyIC5sZXNzIGZpbGUiKSsnPC9oMz48cD5pbiA8YSBocmVmPSInK2grJyI+JytmKyI8L2E+ICI7dmFyIHA9ZnVuY3Rpb24oZSx0LGkpe3ZvaWQgMCE9PWUuZXh0cmFjdFt0XSYmYy5wdXNoKCc8bGk+PGxhYmVsPntsaW5lfTwvbGFiZWw+PHByZSBjbGFzcz0ie2NsYXNzfSI+e2NvbnRlbnR9PC9wcmU+PC9saT4nLnJlcGxhY2UoL1x7bGluZVx9LywocGFyc2VJbnQoZS5saW5lLDEwKXx8MCkrKHQtMSkpLnJlcGxhY2UoL1x7Y2xhc3NcfS8saSkucmVwbGFjZSgvXHtjb250ZW50XH0vLGUuZXh0cmFjdFt0XSkpfTtuLmxpbmUmJihwKG4sMCwiIikscChuLDEsImxpbmUiKSxwKG4sMiwiIiksYSs9Im9uIGxpbmUgIituLmxpbmUrIiwgY29sdW1uICIrKG4uY29sdW1uKzEpKyI6PC9wPjx1bD4iK2Muam9pbigiIikrIjwvdWw+Iiksbi5zdGFjayYmKG4uZXh0cmFjdHx8ci5sb2dMZXZlbD49NCkmJihhKz0iPGJyLz5TdGFjayBUcmFjZTwvYnIgLz4iK24uc3RhY2suc3BsaXQoIlxuIikuc2xpY2UoMSkuam9pbigiPGJyLz4iKSksdS5pbm5lckhUTUw9YSxpKHQuZG9jdW1lbnQsWyIubGVzcy1lcnJvci1tZXNzYWdlIHVsLCAubGVzcy1lcnJvci1tZXNzYWdlIGxpIHsiLCJsaXN0LXN0eWxlLXR5cGU6IG5vbmU7IiwibWFyZ2luLXJpZ2h0OiAxNXB4OyIsInBhZGRpbmc6IDRweCAwOyIsIm1hcmdpbjogMDsiLCJ9IiwiLmxlc3MtZXJyb3ItbWVzc2FnZSBsYWJlbCB7IiwiZm9udC1zaXplOiAxMnB4OyIsIm1hcmdpbi1yaWdodDogMTVweDsiLCJwYWRkaW5nOiA0cHggMDsiLCJjb2xvcjogI2NjNzc3NzsiLCJ9IiwiLmxlc3MtZXJyb3ItbWVzc2FnZSBwcmUgeyIsImNvbG9yOiAjZGQ2NjY2OyIsInBhZGRpbmc6IDRweCAwOyIsIm1hcmdpbjogMDsiLCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IiwifSIsIi5sZXNzLWVycm9yLW1lc3NhZ2UgcHJlLmxpbmUgeyIsImNvbG9yOiAjZmYwMDAwOyIsIn0iLCIubGVzcy1lcnJvci1tZXNzYWdlIGgzIHsiLCJmb250LXNpemU6IDIwcHg7IiwiZm9udC13ZWlnaHQ6IGJvbGQ7IiwicGFkZGluZzogMTVweCAwIDVweCAwOyIsIm1hcmdpbjogMDsiLCJ9IiwiLmxlc3MtZXJyb3ItbWVzc2FnZSBhIHsiLCJjb2xvcjogIzEwYSIsIn0iLCIubGVzcy1lcnJvci1tZXNzYWdlIC5lcnJvciB7IiwiY29sb3I6IHJlZDsiLCJmb250LXdlaWdodDogYm9sZDsiLCJwYWRkaW5nLWJvdHRvbTogMnB4OyIsImJvcmRlci1ib3R0b206IDFweCBkYXNoZWQgcmVkOyIsIn0iXS5qb2luKCJcbiIpLHt0aXRsZToiZXJyb3ItbWVzc2FnZSJ9KSx1LnN0eWxlLmNzc1RleHQ9WyJmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWYiLCJib3JkZXI6IDFweCBzb2xpZCAjZTAwIiwiYmFja2dyb3VuZC1jb2xvcjogI2VlZSIsImJvcmRlci1yYWRpdXM6IDVweCIsIi13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4IiwiLW1vei1ib3JkZXItcmFkaXVzOiA1cHgiLCJjb2xvcjogI2UwMCIsInBhZGRpbmc6IDE1cHgiLCJtYXJnaW4tYm90dG9tOiAxNXB4Il0uam9pbigiOyIpLCJkZXZlbG9wbWVudCI9PT1yLmVudiYmKG89c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7dmFyIGU9dC5kb2N1bWVudCxpPWUuYm9keTtpJiYoZS5nZXRFbGVtZW50QnlJZChsKT9pLnJlcGxhY2VDaGlsZCh1LGUuZ2V0RWxlbWVudEJ5SWQobCkpOmkuaW5zZXJ0QmVmb3JlKHUsaS5maXJzdENoaWxkKSxjbGVhckludGVydmFsKG8pKX0pLDEwKSl9KHMsbyl9LHJlbW92ZTpmdW5jdGlvbihpKXtyLmVycm9yUmVwb3J0aW5nJiYiaHRtbCIhPT1yLmVycm9yUmVwb3J0aW5nPyJjb25zb2xlIj09PXIuZXJyb3JSZXBvcnRpbmd8fCJmdW5jdGlvbiI9PXR5cGVvZiByLmVycm9yUmVwb3J0aW5nJiZyLmVycm9yUmVwb3J0aW5nKCJyZW1vdmUiLGkpOmZ1bmN0aW9uKGkpe3ZhciBuPXQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxlc3MtZXJyb3ItbWVzc2FnZToiK2UoaSkpO24mJm4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKX0oaSl9fX0sX3Q9e2phdmFzY3JpcHRFbmFibGVkOiExLGRlcGVuZHM6ITEsY29tcHJlc3M6ITEsbGludDohMSxwYXRoczpbXSxjb2xvcjohMCxzdHJpY3RJbXBvcnRzOiExLGluc2VjdXJlOiExLHJvb3RwYXRoOiIiLHJld3JpdGVVcmxzOiExLG1hdGg6MSxzdHJpY3RVbml0czohMSxnbG9iYWxWYXJzOm51bGwsbW9kaWZ5VmFyczpudWxsLHVybEFyZ3M6IiJ9O2lmKHdpbmRvdy5sZXNzKWZvcih2YXIgQXQgaW4gd2luZG93Lmxlc3Mpd2luZG93Lmxlc3MuaGFzT3duUHJvcGVydHkoQXQpJiYoX3RbQXRdPXdpbmRvdy5sZXNzW0F0XSk7IWZ1bmN0aW9uKGUsaSl7dChpLG4oZSkpLHZvaWQgMD09PWkuaXNGaWxlUHJvdG9jb2wmJihpLmlzRmlsZVByb3RvY29sPS9eKGZpbGV8KGNocm9tZXxzYWZhcmkpKC1leHRlbnNpb24pP3xyZXNvdXJjZXxxcmN8YXBwKTovLnRlc3QoZS5sb2NhdGlvbi5wcm90b2NvbCkpLGkuYXN5bmM9aS5hc3luY3x8ITEsaS5maWxlQXN5bmM9aS5maWxlQXN5bmN8fCExLGkucG9sbD1pLnBvbGx8fChpLmlzRmlsZVByb3RvY29sPzFlMzoxNTAwKSxpLmVudj1pLmVudnx8KCIxMjcuMC4wLjEiPT1lLmxvY2F0aW9uLmhvc3RuYW1lfHwiMC4wLjAuMCI9PWUubG9jYXRpb24uaG9zdG5hbWV8fCJsb2NhbGhvc3QiPT1lLmxvY2F0aW9uLmhvc3RuYW1lfHxlLmxvY2F0aW9uLnBvcnQmJmUubG9jYXRpb24ucG9ydC5sZW5ndGg+MHx8aS5pc0ZpbGVQcm90b2NvbD8iZGV2ZWxvcG1lbnQiOiJwcm9kdWN0aW9uIik7dmFyIHI9LyFkdW1wTGluZU51bWJlcnM6KGNvbW1lbnRzfG1lZGlhcXVlcnl8YWxsKS8uZXhlYyhlLmxvY2F0aW9uLmhhc2gpO3ImJihpLmR1bXBMaW5lTnVtYmVycz1yWzFdKSx2b2lkIDA9PT1pLnVzZUZpbGVDYWNoZSYmKGkudXNlRmlsZUNhY2hlPSEwKSx2b2lkIDA9PT1pLm9uUmVhZHkmJihpLm9uUmVhZHk9ITApLGkucmVsYXRpdmVVcmxzJiYoaS5yZXdyaXRlVXJscz0iYWxsIil9KHdpbmRvdyxfdCksX3QucGx1Z2lucz1fdC5wbHVnaW5zfHxbXSx3aW5kb3cuTEVTU19QTFVHSU5TJiYoX3QucGx1Z2lucz1fdC5wbHVnaW5zLmNvbmNhdCh3aW5kb3cuTEVTU19QTFVHSU5TKSk7dmFyIE10LEV0LFB0LFJ0PWZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5kb2N1bWVudCxzPXd0KCk7cy5vcHRpb25zPW47dmFyIG89cy5lbnZpcm9ubWVudCxhPUl0KG4scy5sb2dnZXIpLGw9bmV3IGE7by5hZGRGaWxlTWFuYWdlcihsKSxzLkZpbGVNYW5hZ2VyPWEscy5QbHVnaW5Mb2FkZXI9Q3QsZnVuY3Rpb24oZSx0KXt0LmxvZ0xldmVsPXZvaWQgMCE9PXQubG9nTGV2ZWw/dC5sb2dMZXZlbDoiZGV2ZWxvcG1lbnQiPT09dC5lbnY/MzoxLHQubG9nZ2Vyc3x8KHQubG9nZ2Vycz1be2RlYnVnOmZ1bmN0aW9uKGUpe3QubG9nTGV2ZWw+PTQmJmNvbnNvbGUubG9nKGUpfSxpbmZvOmZ1bmN0aW9uKGUpe3QubG9nTGV2ZWw+PTMmJmNvbnNvbGUubG9nKGUpfSx3YXJuOmZ1bmN0aW9uKGUpe3QubG9nTGV2ZWw+PTImJmNvbnNvbGUud2FybihlKX0sZXJyb3I6ZnVuY3Rpb24oZSl7dC5sb2dMZXZlbD49MSYmY29uc29sZS5lcnJvcihlKX19XSk7Zm9yKHZhciBpPTA7aTx0LmxvZ2dlcnMubGVuZ3RoO2krKyllLmxvZ2dlci5hZGRMaXN0ZW5lcih0LmxvZ2dlcnNbaV0pfShzLG4pO3ZhciB1PWt0KGUscyxuKSxjPXMuY2FjaGU9bi5jYWNoZXx8ZnVuY3Rpb24oZSx0LGkpe3ZhciBuPW51bGw7aWYoImRldmVsb3BtZW50IiE9PXQuZW52KXRyeXtuPXZvaWQgMD09PWUubG9jYWxTdG9yYWdlP251bGw6ZS5sb2NhbFN0b3JhZ2V9Y2F0Y2goZSl7fXJldHVybntzZXRDU1M6ZnVuY3Rpb24oZSx0LHIscyl7aWYobil7aS5pbmZvKCJzYXZpbmcgIitlKyIgdG8gY2FjaGUuIik7dHJ5e24uc2V0SXRlbShlLHMpLG4uc2V0SXRlbShlKyI6dGltZXN0YW1wIix0KSxyJiZuLnNldEl0ZW0oZSsiOnZhcnMiLEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaCh0KXtpLmVycm9yKCdmYWlsZWQgdG8gc2F2ZSAiJytlKyciIHRvIGxvY2FsIHN0b3JhZ2UgZm9yIGNhY2hpbmcuJyl9fX0sZ2V0Q1NTOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcj1uJiZuLmdldEl0ZW0oZSkscz1uJiZuLmdldEl0ZW0oZSsiOnRpbWVzdGFtcCIpLG89biYmbi5nZXRJdGVtKGUrIjp2YXJzIik7aWYoaT1pfHx7fSxvPW98fCJ7fSIscyYmdC5sYXN0TW9kaWZpZWQmJm5ldyBEYXRlKHQubGFzdE1vZGlmaWVkKS52YWx1ZU9mKCk9PT1uZXcgRGF0ZShzKS52YWx1ZU9mKCkmJkpTT04uc3RyaW5naWZ5KGkpPT09bylyZXR1cm4gcn19fShlLG4scy5sb2dnZXIpOyFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aHJvd3t0eXBlOiJSdW50aW1lIixtZXNzYWdlOiJJbWFnZSBzaXplIGZ1bmN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiBicm93c2VyIHZlcnNpb24gb2YgbGVzcyJ9fXZhciB0PXsiaW1hZ2Utc2l6ZSI6ZnVuY3Rpb24odCl7cmV0dXJuIGUoKSwtMX0sImltYWdlLXdpZHRoIjpmdW5jdGlvbih0KXtyZXR1cm4gZSgpLC0xfSwiaW1hZ2UtaGVpZ2h0IjpmdW5jdGlvbih0KXtyZXR1cm4gZSgpLC0xfX07SC5hZGRNdWx0aXBsZSh0KX0ocy5lbnZpcm9ubWVudCksbi5mdW5jdGlvbnMmJnMuZnVuY3Rpb25zLmZ1bmN0aW9uUmVnaXN0cnkuYWRkTXVsdGlwbGUobi5mdW5jdGlvbnMpO3ZhciBoPS9edGV4dFwvKHgtKT9sZXNzJC87ZnVuY3Rpb24gZihlKXt2YXIgdD17fTtmb3IodmFyIGkgaW4gZSllLmhhc093blByb3BlcnR5KGkpJiYodFtpXT1lW2ldKTtyZXR1cm4gdH1mdW5jdGlvbiBwKGUsdCl7dmFyIGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWkuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSk7cmV0dXJuIGUuYXBwbHkodCxuKX19ZnVuY3Rpb24gdihlKXtmb3IodmFyIHQsaT1yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzdHlsZSIpLG89MDtvPGkubGVuZ3RoO28rKylpZigodD1pW29dKS50eXBlLm1hdGNoKGgpKXt2YXIgYT1mKG4pO2EubW9kaWZ5VmFycz1lO3ZhciBsPXQuaW5uZXJIVE1MfHwiIjthLmZpbGVuYW1lPXIubG9jYXRpb24uaHJlZi5yZXBsYWNlKC8jLiokLywiIikscy5yZW5kZXIobCxhLHAoKGZ1bmN0aW9uKGUsdCxpKXt0P3UuYWRkKHQsImlubGluZSIpOihlLnR5cGU9InRleHQvY3NzIixlLnN0eWxlU2hlZXQ/ZS5zdHlsZVNoZWV0LmNzc1RleHQ9aS5jc3M6ZS5pbm5lckhUTUw9aS5jc3MpfSksbnVsbCx0KSl9fWZ1bmN0aW9uIGQoZSxpLHIsYSxoKXt2YXIgcD1mKG4pO3QocCxlKSxwLm1pbWU9ZS50eXBlLGgmJihwLm1vZGlmeVZhcnM9aCksbC5sb2FkRmlsZShlLmhyZWYsbnVsbCxwLG8pLnRoZW4oKGZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0KXt2YXIgbj10LmNvbnRlbnRzLG89dC5maWxlbmFtZSxoPXQud2ViSW5mbyxmPXtjdXJyZW50RGlyZWN0b3J5OmwuZ2V0UGF0aChvKSxmaWxlbmFtZTpvLHJvb3RGaWxlbmFtZTpvLHJld3JpdGVVcmxzOnAucmV3cml0ZVVybHN9O2lmKGYuZW50cnlQYXRoPWYuY3VycmVudERpcmVjdG9yeSxmLnJvb3RwYXRoPXAucm9vdHBhdGh8fGYuY3VycmVudERpcmVjdG9yeSxoKXtoLnJlbWFpbmluZz1hO3ZhciB2PWMuZ2V0Q1NTKG8saCxwLm1vZGlmeVZhcnMpO2lmKCFyJiZ2KXJldHVybiBoLmxvY2FsPSEwLHZvaWQgaShudWxsLHYsbixlLGgsbyl9dS5yZW1vdmUobykscC5yb290RmlsZUluZm89ZixzLnJlbmRlcihuLHAsKGZ1bmN0aW9uKHQscil7dD8odC5ocmVmPW8saSh0KSk6KGMuc2V0Q1NTKGUuaHJlZixoLmxhc3RNb2RpZmllZCxwLm1vZGlmeVZhcnMsci5jc3MpLGkobnVsbCxyLmNzcyxuLGUsaCxvKSl9KSl9KHQpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtjb25zb2xlLmxvZyhlKSxpKGUpfSkpfWZ1bmN0aW9uIG0oZSx0LGkpe2Zvcih2YXIgbj0wO248cy5zaGVldHMubGVuZ3RoO24rKylkKHMuc2hlZXRzW25dLGUsdCxzLnNoZWV0cy5sZW5ndGgtKG4rMSksaSl9cmV0dXJuIHMud2F0Y2g9ZnVuY3Rpb24oKXtyZXR1cm4gcy53YXRjaE1vZGV8fChzLmVudj0iZGV2ZWxvcG1lbnQiLCJkZXZlbG9wbWVudCI9PT1zLmVudiYmKHMud2F0Y2hUaW1lcj1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtzLndhdGNoTW9kZSYmKGwuY2xlYXJGaWxlQ2FjaGUoKSxtKChmdW5jdGlvbih0LG4scixzLG8pe3Q/dS5hZGQodCx0LmhyZWZ8fHMuaHJlZik6biYmaShlLmRvY3VtZW50LG4scyl9KSkpfSksbi5wb2xsKSkpLHRoaXMud2F0Y2hNb2RlPSEwLCEwfSxzLnVud2F0Y2g9ZnVuY3Rpb24oKXtyZXR1cm4gY2xlYXJJbnRlcnZhbChzLndhdGNoVGltZXIpLHRoaXMud2F0Y2hNb2RlPSExLCExfSxzLnJlZ2lzdGVyU3R5bGVzaGVldHNJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciBlPXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKTtzLnNoZWV0cz1bXTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKykoInN0eWxlc2hlZXQvbGVzcyI9PT1lW3RdLnJlbHx8ZVt0XS5yZWwubWF0Y2goL3N0eWxlc2hlZXQvKSYmZVt0XS50eXBlLm1hdGNoKGgpKSYmcy5zaGVldHMucHVzaChlW3RdKX0scy5yZWdpc3RlclN0eWxlc2hlZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihlLHQpe3MucmVnaXN0ZXJTdHlsZXNoZWV0c0ltbWVkaWF0ZWx5KCksZSgpfSkpfSxzLm1vZGlmeVZhcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHMucmVmcmVzaCghMCxlLCExKX0scy5yZWZyZXNoPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4odHx8cikmJiExIT09ciYmbC5jbGVhckZpbGVDYWNoZSgpLG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe3ZhciBhLGwsYyxoO2E9bD1uZXcgRGF0ZSwwPT09KGg9cy5zaGVldHMubGVuZ3RoKT8obD1uZXcgRGF0ZSxjPWwtYSxzLmxvZ2dlci5pbmZvKCJMZXNzIGhhcyBmaW5pc2hlZCBhbmQgbm8gc2hlZXRzIHdlcmUgbG9hZGVkLiIpLHIoe3N0YXJ0VGltZTphLGVuZFRpbWU6bCx0b3RhbE1pbGxpc2Vjb25kczpjLHNoZWV0czpzLnNoZWV0cy5sZW5ndGh9KSk6bSgoZnVuY3Rpb24odCxuLGYscCx2KXtpZih0KXJldHVybiB1LmFkZCh0LHQuaHJlZnx8cC5ocmVmKSx2b2lkIG8odCk7di5sb2NhbD9zLmxvZ2dlci5pbmZvKCJMb2FkaW5nICIrcC5ocmVmKyIgZnJvbSBjYWNoZS4iKTpzLmxvZ2dlci5pbmZvKCJSZW5kZXJlZCAiK3AuaHJlZisiIHN1Y2Nlc3NmdWxseS4iKSxpKGUuZG9jdW1lbnQsbixwKSxzLmxvZ2dlci5pbmZvKCJDU1MgZm9yICIrcC5ocmVmKyIgZ2VuZXJhdGVkIGluICIrKG5ldyBEYXRlLWwpKyJtcyIpLDA9PT0tLWgmJihjPW5ldyBEYXRlLWEscy5sb2dnZXIuaW5mbygiTGVzcyBoYXMgZmluaXNoZWQuIENTUyBnZW5lcmF0ZWQgaW4gIitjKyJtcyIpLHIoe3N0YXJ0VGltZTphLGVuZFRpbWU6bCx0b3RhbE1pbGxpc2Vjb25kczpjLHNoZWV0czpzLnNoZWV0cy5sZW5ndGh9KSksbD1uZXcgRGF0ZX0pLHQsbiksdihuKX0pKX0scy5yZWZyZXNoU3R5bGVzPXYsc30od2luZG93LF90KTtmdW5jdGlvbiBPdChlKXtlLmZpbGVuYW1lJiZjb25zb2xlLndhcm4oZSksX3QuYXN5bmN8fEV0LnJlbW92ZUNoaWxkKFB0KX1yZXR1cm4gd2luZG93Lmxlc3M9UnQsX3Qub25SZWFkeSYmKC8hd2F0Y2gvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhhc2gpJiZSdC53YXRjaCgpLF90LmFzeW5jfHwoTXQ9ImJvZHkgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQgfSIsRXQ9ZG9jdW1lbnQuaGVhZHx8ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXSwoUHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKSkudHlwZT0idGV4dC9jc3MiLFB0LnN0eWxlU2hlZXQ/UHQuc3R5bGVTaGVldC5jc3NUZXh0PU10OlB0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKE10KSksRXQuYXBwZW5kQ2hpbGQoUHQpKSxSdC5yZWdpc3RlclN0eWxlc2hlZXRzSW1tZWRpYXRlbHkoKSxSdC5wYWdlTG9hZEZpbmlzaGVkPVJ0LnJlZnJlc2goImRldmVsb3BtZW50Ij09PVJ0LmVudikudGhlbihPdCxPdCkpLFJ0fSkpOwovLyMgc291cmNlTWFwcGluZ1VSTD1sZXNzLm1pbi5qcy5tYXAK"},{"meta":{"name":"md5-wasm.min.js","url":"https://lib.baomitu.com/md5-wasm/1.2.0/md5-wasm.min.js","ts":1670421067148,"mimetype":"text/javascript"},"source":"IWZ1bmN0aW9uKCl7Y29uc3QgQT0iZnVuY3Rpb24iPT10eXBlb2YgYXRvYj9hdG9iOiJmdW5jdGlvbiI9PXR5cGVvZiBCdWZmZXI/ZnVuY3Rpb24oQSl7cmV0dXJuIEJ1ZmZlci5mcm9tKEEsImJhc2U2NCIpLnRvU3RyaW5nKCJiaW5hcnkiKX06byxCPUEoIkFHRnpiUUVBQUFBQkRBTmdBWDhBWUFBQVlBQUJmd0llQWdkcGJYQnZjblJ6QTJ4dlp3QUFCMmx0Y0c5eWRITURiV1Z0QWdBQkF6SXhBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdJQ0FnSUFBQUFBQUFhWUFSdC9BVUdCeHBTNkJndC9BVUdKMTdiK2ZndC9BVUgrdWV2RmVRdC9BVUgycU1tQkFRdC9BVUVBQzM4QlFRQUxmd0ZCQUF0L0FVRUFDMzhCUVFBTGZ3RkJBQXQvQVVFQUMzOEJRUUFMZndGQkFBdC9BVUVBQzM4QlFRQUxmd0ZCQUF0L0FVRUFDMzhCUVFBTGZ3RkJBQXQvQVVFQUMzOEJRUUFMZndGQkFBdC9BVUVBQzM4QlFRQUxmd0ZCQUF0L0FVRUFDMzhCUVFBTEI3b0NKUWh2Ym1WR2RXeHNRUUFZQ0c5dVpVWjFiR3hDQUJrSWIyNWxSblZzYkVNQUdnaHZibVZHZFd4c1JBQWJCV3h2YjNCekFBRUViRzl2Y0FBQ0JYQnlhVzFsQUFNRmJHOXZjRUVBQkFac2IyOXdRVEVBQlFac2IyOXdRVElBQmdac2IyOXdRVE1BQndac2IyOXdRVFFBQ0FWc2IyOXdRZ0FKQm14dmIzQkNNUUFLQm14dmIzQkNNZ0FMQm14dmIzQkNNd0FNQm14dmIzQkNOQUFOQld4dmIzQkRBQTRHYkc5dmNFTXhBQThHYkc5dmNFTXlBQkFHYkc5dmNFTXpBQkVHYkc5dmNFTTBBQklGYkc5dmNFUUFFd1pzYjI5d1JERUFGQVpzYjI5d1JESUFGUVpzYjI5d1JETUFGZ1pzYjI5d1JEUUFGd1JuWlhSQkFDZ0VaMlYwUWdBcEJHZGxkRU1BS2dSblpYUkVBQ3NFWjJWMFdBQXNCSE5sZEVFQUxRUnpaWFJDQUM0RWMyVjBRd0F2QkhObGRFUUFNQVJ6WlhSWUFERUt6QTB4V3dFQmYwRUFKQWdnQUVFR2RDRUJBa0FEUUNNSUlBRkdEUUVqQUNRRUl3RWtCU01DSkFZakF5UUhFQUlqQkNNQWFpUUFJd1VqQVdva0FTTUdJd0pxSkFJakJ5TURhaVFESXdoQndBQnFKQWdNQUFzTEl3Z2pHbW9rR2dzVEFDTUlJeHBxSkFrUUF4QUVFQWtRRGhBVEM2SUJBRUVBSXdscUtBSUFKQXBCQkNNSmFpZ0NBQ1FMUVFnakNXb29BZ0FrREVFTUl3bHFLQUlBSkExQkVDTUphaWdDQUNRT1FSUWpDV29vQWdBa0QwRVlJd2xxS0FJQUpCQkJIQ01KYWlnQ0FDUVJRU0FqQ1dvb0FnQWtFa0VrSXdscUtBSUFKQk5CS0NNSmFpZ0NBQ1FVUVN3akNXb29BZ0FrRlVFd0l3bHFLQUlBSkJaQk5DTUphaWdDQUNRWFFUZ2pDV29vQWdBa0dFRThJd2xxS0FJQUpCa0xDZ0FRQlJBR0VBY1FDQXN1QUVINHlLcTdmU01LYWhBWVFkYnVuc1orSXd0cUVCdEIyK0dCb1FJakRHb1FHa0h1bmZlTmZDTU5haEFaQ3kwQVFhK2Y4S3QvSXc1cUVCaEJxb3lmdkFRakQyb1FHMEdUak1IQmVpTVFhaEFhUVlHcW1tb2pFV29RR1Fzc0FFSFlzWUxNQmlNU2FoQVlRYS92azlwNEl4TnFFQnRCc2JkOUl4UnFFQnBCdnEvenluZ2pGV29RR1FzdEFFR2lvc0RjQmlNV2FoQVlRWlBqNFd3akYyb1FHMEdPaCtXemVpTVlhaEFhUWFHUTBNMEVJeGxxRUJrTENnQVFDaEFMRUF3UURRc3VBRUhpeXZpd2Z5TUxhaEFjUWNEbWdvSjhJeEJxRUI5QjBiVDVzZ0lqRldvUUhrR3FqOXZOZmlNS2FoQWRDeTBBUWQyZ3ZMRjlJdzlxRUJ4QjA2aVFFaU1VYWhBZlFZSE5oOFY5SXhscUVCNUJ5UGZQdm40akRtb1FIUXN1QUVIbW00ZVBBaU1UYWhBY1FkYVAzSmw4SXhocUVCOUJoNXZVcG44akRXb1FIa0h0cWVpcUJDTVNhaEFkQ3kwQVFZWFNqODk2SXhkcUVCeEIrTWUrWnlNTWFoQWZRZG1GdkxzR0l4RnFFQjVCaXBtcDZYZ2pGbW9RSFFzS0FCQVBFQkFRRVJBU0N5c0FRY0x5YUNNUGFoQWdRWUh0eDd0NEl4SnFFQ05Cb3NMMTdBWWpGV29RSWtHTThKUnZJeGhxRUNFTExnQkJ4TlQ3cFhvakMyb1FJRUdwbi92ZUJDTU9haEFqUWVDVzdiVi9JeEZxRUNKQjhQais5WHNqRkdvUUlRc3RBRUhHL2UzRUFpTVhhaEFnUWZyUGhOVitJd3BxRUNOQmhlRzhwMzBqRFdvUUlrR0Z1cUFrSXhCcUVDRUxMZ0JCdWFEVHpuMGpFMm9RSUVIbHMrNjJmaU1XYWhBalFmajVpZjBCSXhscUVDSkI1YXl4cFh3akRHb1FJUXNLQUJBVUVCVVFGaEFYQ3kwQVFjVEVwS0YvSXdwcUVDUkJsLytybVFRakVXb1FKMEdueDlEY2VpTVlhaEFtUWJuQXptUWpEMm9RSlFzdEFFSERzKzJxQmlNV2FoQWtRWktacy9oNEl3MXFFQ2RCL2VpL2Z5TVVhaEFtUWRHN2theDRJd3RxRUNVTExRQkJ6L3loL1FZakVtb1FKRUhnemJOeEl4bHFFQ2RCbElhRm1Ib2pFR29RSmtHaG82RHdCQ01YYWhBbEN5NEFRWUw5emJwL0l3NXFFQ1JCdGVUcjZYc2pGV29RSjBHN3BkL1dBaU1NYWhBbVFaR25tOXgrSXhOcUVDVUxLQUVCZjBGL0l3RnpJd054SXdFakFuRnlJd0JxSUFCcUlnRkJCM1FnQVVFWmRuSWpBV29rQUFzb0FRRi9RWDhqQW5NakFIRWpBaU1EY1hJakFXb2dBR29pQVVFV2RDQUJRUXAyY2lNQ2FpUUJDeWdCQVg5QmZ5TURjeU1CY1NNREl3QnhjaU1DYWlBQWFpSUJRUkYwSUFGQkQzWnlJd05xSkFJTEtBRUJmMEYvSXdCekl3SnhJd0FqQVhGeUl3TnFJQUJxSWdGQkRIUWdBVUVVZG5JakFHb2tBd3NvQVFGL0l3SkJmeU1EYzNFakFTTURjWElqQUdvZ0FHb2lBVUVGZENBQlFSdDJjaU1CYWlRQUN5Z0JBWDhqQTBGL0l3QnpjU01DSXdCeGNpTUJhaUFBYWlJQlFSUjBJQUZCREhaeUl3SnFKQUVMS0FFQmZ5TUFRWDhqQVhOeEl3TWpBWEZ5SXdKcUlBQnFJZ0ZCRG5RZ0FVRVNkbklqQTJva0Fnc29BUUYvSXdGQmZ5TUNjM0VqQUNNQ2NYSWpBMm9nQUdvaUFVRUpkQ0FCUVJkMmNpTUFhaVFEQ3lJQkFYOGpBU01DY3lNRGN5TUFhaUFBYWlJQlFRUjBJQUZCSEhaeUl3RnFKQUFMSWdFQmZ5TUNJd056SXdCekl3RnFJQUJxSWdGQkYzUWdBVUVKZG5JakFtb2tBUXNpQVFGL0l3TWpBSE1qQVhNakFtb2dBR29pQVVFUWRDQUJRUkIyY2lNRGFpUUNDeUlCQVg4akFDTUJjeU1DY3lNRGFpQUFhaUlCUVF0MElBRkJGWFp5SXdCcUpBTUxKUUVCZjBGL0l3TnpJd0Z5SXdKekl3QnFJQUJxSWdGQkJuUWdBVUVhZG5JakFXb2tBQXNsQVFGL1FYOGpBSE1qQW5JakEzTWpBV29nQUdvaUFVRVZkQ0FCUVF0MmNpTUNhaVFCQ3lVQkFYOUJmeU1CY3lNRGNpTUFjeU1DYWlBQWFpSUJRUTkwSUFGQkVYWnlJd05xSkFJTEpRRUJmMEYvSXdKekl3QnlJd0Z6SXdOcUlBQnFJZ0ZCQ25RZ0FVRVdkbklqQUdva0F3c0VBQ01BQ3dRQUl3RUxCQUFqQWdzRUFDTURDd1FBSXhvTEJnQWdBQ1FBQ3dZQUlBQWtBUXNHQUNBQUpBSUxCZ0FnQUNRREN3WUFJQUFrR2dzQTZnUUVibUZ0WlFHU0F6SUFBMnh2WndFRmJHOXZjSE1DQkd4dmIzQURCWEJ5YVcxbEJBVnNiMjl3UVFVR2JHOXZjRUV4Qmdac2IyOXdRVElIQm14dmIzQkJNd2dHYkc5dmNFRTBDUVZzYjI5d1Fnb0diRzl2Y0VJeEN3WnNiMjl3UWpJTUJteHZiM0JDTXcwR2JHOXZjRUkwRGdWc2IyOXdRdzhHYkc5dmNFTXhFQVpzYjI5d1F6SVJCbXh2YjNCRE14SUdiRzl2Y0VNMEV3VnNiMjl3UkJRR2JHOXZjRVF4RlFac2IyOXdSRElXQm14dmIzQkVNeGNHYkc5dmNFUTBHQWh2Ym1WR2RXeHNRUmtJYjI1bFJuVnNiRUlhQ0c5dVpVWjFiR3hER3dodmJtVkdkV3hzUkJ3SWRIZHZSblZzYkVFZENIUjNiMFoxYkd4Q0hnaDBkMjlHZFd4c1F4OElkSGR2Um5Wc2JFUWdDSFJ5WlVaMWJHeEJJUWgwY21WR2RXeHNRaUlJZEhKbFJuVnNiRU1qQ0hSeVpVWjFiR3hFSkFoeGRXRkdkV3hzUVNVSWNYVmhSblZzYkVJbUNIRjFZVVoxYkd4REp3aHhkV0ZHZFd4c1JDZ0VaMlYwUVNrRVoyVjBRaW9FWjJWMFF5c0VaMlYwUkN3RVoyVjBXQzBFYzJWMFFTNEVjMlYwUWk4RWMyVjBRekFFYzJWMFJERUVjMlYwV0FMTkFUSUFBUUFBQVFJQUFBRUliblZ0Ykc5dmNITUNBQU1BQkFBRkFBWUFCd0FJQUFrQUNnQUxBQXdBRFFBT0FBOEFFQUFSQUJJQUV3QVVBQlVBRmdBWEFCZ0NBQUFCQVc0WkFnQUFBUUZ1R2dJQUFBRUJiaHNDQUFBQkFXNGNBZ0FBQVFGdUhRSUFBQUVCYmg0Q0FBQUJBVzRmQWdBQUFRRnVJQUlBQUFFQmJpRUNBQUFCQVc0aUFnQUFBUUZ1SXdJQUFBRUJiaVFDQUFBQkFXNGxBZ0FBQVFGdUpnSUFBQUVCYmljQ0FBQUJBVzRvQUNrQUtnQXJBQ3dBTFFFQUFDNEJBQUF2QVFBQU1BRUFBREVCQUFBPSIpLGE9ISghV2ViQXNzZW1ibHl8fEE9PT1vKSYmZnVuY3Rpb24oQSl7dmFyIEIsUSxvLEU9LTE7Qj1BLmxlbmd0aC0xLFE9bmV3IEFycmF5QnVmZmVyKEEubGVuZ3RoKSxvPW5ldyBVaW50OEFycmF5KFEpO2Zvcig7Qj5FKys7KW9bRV09QS5jaGFyQ29kZUF0KEUpO3JldHVybiBvfShCKS5idWZmZXIsTD17cm90bDpmdW5jdGlvbihBLEIpe3JldHVybiBBPDxCfEE+Pj4zMi1CfSxlbmRpYW46ZnVuY3Rpb24oQSl7aWYoQS5jb25zdHJ1Y3Rvcj09TnVtYmVyKXJldHVybiAxNjcxMTkzNSZMLnJvdGwoQSw4KXw0Mjc4MjU1MzYwJkwucm90bChBLDI0KTtmb3IodmFyIEI9MDtCPEEubGVuZ3RoO0IrKylBW0JdPUwuZW5kaWFuKEFbQl0pO3JldHVybiBBfSxieXRlc1RvV29yZHM6ZnVuY3Rpb24oQSl7Zm9yKHZhciBCPVtdLFE9MCxvPTA7UTxBLmxlbmd0aDtRKyssbys9OClCW28+Pj41XXw9QVtRXTw8MjQtbyUzMjtyZXR1cm4gQn0sd29yZHNUb0J5dGVzOmZ1bmN0aW9uKEEpe2Zvcih2YXIgQj1bXSxRPTA7UTwzMipBLmxlbmd0aDtRKz04KUIucHVzaChBW1E+Pj41XT4+PjI0LVElMzImMjU1KTtyZXR1cm4gQn0sYnl0ZXNUb0hleDpmdW5jdGlvbihBKXtmb3IodmFyIEI9W10sUT0wO1E8QS5sZW5ndGg7USsrKUIucHVzaCgoQVtRXT4+PjQpLnRvU3RyaW5nKDE2KSksQi5wdXNoKCgxNSZBW1FdKS50b1N0cmluZygxNikpO3JldHVybiBCLmpvaW4oIiIpfX0saz02MTQ0MCxYPU1hdGguZmxvb3IoMTYqayoxLjA2NjY2NjY2NyksZz0iUGFyYW1ldGVyIG11c3QgYmUgQnVmZmVyLCBBcnJheUJ1ZmZlciBvciBVaW50OEFycmF5IjthfHxjb25zb2xlLmxvZygiV2ViQXNzZW1ibHkgbm90IGF2YWlsYWJsZSBvciBXQVNNIG1vZHVsZSBjb3VsZCBub3QgYmUgZGVjb2RlZDsgbWQ1V0FTTSB3aWxsIGZhbGwgYmFjayB0byBKYXZhU2NyaXB0IiksIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzJiYobW9kdWxlLmV4cG9ydHM9USksImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJtZDVXQVNNIixbXSxmdW5jdGlvbigpe3JldHVybiBRfSksInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cubWQ1V0FTTT1RKTtmdW5jdGlvbiBRKEEpe3ZhciBCLFEsbyxFLG4sdCxXLG0sRCxxLEosWixVLFIsSCxwO2NvbnN0IGU9ZnVuY3Rpb24oQSxCKXtBPUwud29yZHNUb0J5dGVzKGZ1bmN0aW9uKEEpeyhuZXcgRGF0ZSkuZ2V0VGltZSgpO2Zvcih2YXIgQixRLG8sRSxuLHQsZSxJLHIsQyxpLHcscyxhLGcsZixNLGMsYixHLHU9MTczMjU4NDE5Myx5PS0yNzE3MzM4NzksZD0tMTczMjU4NDE5NCx4PTI3MTczMzg3OCxGPTgqQS5sZW5ndGgsaj1MLmJ5dGVzVG9Xb3JkcyhBKSxsPTA7bDxqLmxlbmd0aDtsKyspaltsXT0xNjcxMTkzNSYoaltsXTw8OHxqW2xdPj4+MjQpfDQyNzgyNTUzNjAmKGpbbF08PDI0fGpbbF0+Pj44KTtqW0Y+Pj41XXw9MTI4PDxGJTMyLGpbMTQrKDY0K0Y+Pj45PDw0KV09Rjtmb3IodmFyIGg9MDtoPGoubGVuZ3RoO2grPTE2KU09dSxjPXksYj1kLEc9eCxCPWpbaCswXT4+PjAsUT1qW2grMV0+Pj4wLG89altoKzJdPj4+MCxFPWpbaCszXT4+PjAsbj1qW2grNF0+Pj4wLHQ9altoKzVdPj4+MCxlPWpbaCs2XT4+PjAsST1qW2grN10+Pj4wLHI9altoKzhdPj4+MCxDPWpbaCs5XT4+PjAsaT1qW2grMTBdPj4+MCx3PWpbaCsxMV0+Pj4wLHM9altoKzEyXT4+PjAsYT1qW2grMTNdPj4+MCxnPWpbaCsxNF0+Pj4wLGY9altoKzE1XT4+PjAsdT12KDcsMjUsdSsoeSZkfH55JngpK0ItNjgwODc2OTM2KSt5LHg9digxMiwyMCx4Kyh1Jnl8fnUmZCkrUS0zODk1NjQ1ODYpK3UsZD12KDE3LDE1LGQrKHgmdXx+eCZ5KStvKzYwNjEwNTgxOSkreCx5PXYoMjIsMTAseSsoZCZ4fH5kJnUpK0UtMTA0NDUyNTMzMCkrZCx1PXYoNywyNSx1Kyh5JmR8fnkmeCkrbi0xNzY0MTg4OTcpK3kseD12KDEyLDIwLHgrKHUmeXx+dSZkKSt0KzEyMDAwODA0MjYpK3UsZD12KDE3LDE1LGQrKHgmdXx+eCZ5KStlLTE0NzMyMzEzNDEpK3gseT12KDIyLDEwLHkrKGQmeHx+ZCZ1KStJLTQ1NzA1OTgzKStkLHU9dig3LDI1LHUrKHkmZHx+eSZ4KStyKzE3NzAwMzU0MTYpK3kseD12KDEyLDIwLHgrKHUmeXx+dSZkKStDLTE5NTg0MTQ0MTcpK3UsZD12KDE3LDE1LGQrKHgmdXx+eCZ5KStpLTQyMDYzKSt4LHk9digyMiwxMCx5KyhkJnh8fmQmdSkrdy0xOTkwNDA0MTYyKStkLHU9dig3LDI1LHUrKHkmZHx+eSZ4KStzKzE4MDQ2MDM2ODIpK3kseD12KDEyLDIwLHgrKHUmeXx+dSZkKSthLTQwMzQxMTAxKSt1LGQ9digxNywxNSxkKyh4JnV8fngmeSkrZy0xNTAyMDAyMjkwKSt4LHk9digyMiwxMCx5KyhkJnh8fmQmdSkrZisxMjM2NTM1MzI5KStkLHU9dig1LDI3LHUrKHkmeHxkJn54KStRLTE2NTc5NjUxMCkreSx4PXYoOSwyMyx4Kyh1JmR8eSZ+ZCkrZS0xMDY5NTAxNjMyKSt1LGQ9digxNCwxOCxkKyh4Jnl8dSZ+eSkrdys2NDM3MTc3MTMpK3gseT12KDIwLDEyLHkrKGQmdXx4Jn51KStCLTM3Mzg5NzMwMikrZCx1PXYoNSwyNyx1Kyh5Jnh8ZCZ+eCkrdC03MDE1NTg2OTEpK3kseD12KDksMjMseCsodSZkfHkmfmQpK2krMzgwMTYwODMpK3UsZD12KDE0LDE4LGQrKHgmeXx1Jn55KStmLTY2MDQ3ODMzNSkreCx5PXYoMjAsMTIseSsoZCZ1fHgmfnUpK24tNDA1NTM3ODQ4KStkLHU9dig1LDI3LHUrKHkmeHxkJn54KStDKzU2ODQ0NjQzOCkreSx4PXYoOSwyMyx4Kyh1JmR8eSZ+ZCkrZy0xMDE5ODAzNjkwKSt1LGQ9digxNCwxOCxkKyh4Jnl8dSZ+eSkrRS0xODczNjM5NjEpK3gseT12KDIwLDEyLHkrKGQmdXx4Jn51KStyKzExNjM1MzE1MDEpK2QsdT12KDUsMjcsdSsoeSZ4fGQmfngpK2EtMTQ0NDY4MTQ2NykreSx4PXYoOSwyMyx4Kyh1JmR8eSZ+ZCkrby01MTQwMzc4NCkrdSxkPXYoMTQsMTgsZCsoeCZ5fHUmfnkpK0krMTczNTMyODQ3MykreCx5PXYoMjAsMTIseSsoZCZ1fHgmfnUpK3MtMTkyNjYwNzczNCkrZCx1PXYoNCwyOCx1Kyh5XmReeCkrdC0zNzg1NTgpK3kseD12KDExLDIxLHgrKHVeeV5kKStyLTIwMjI1NzQ0NjMpK3UsZD12KDE2LDE2LGQrKHhedV55KSt3KzE4MzkwMzA1NjIpK3gseT12KDIzLDkseSsoZF54XnUpK2ctMzUzMDk1NTYpK2QsdT12KDQsMjgsdSsoeV5kXngpK1EtMTUzMDk5MjA2MCkreSx4PXYoMTEsMjEseCsodV55XmQpK24rMTI3Mjg5MzM1MykrdSxkPXYoMTYsMTYsZCsoeF51XnkpK0ktMTU1NDk3NjMyKSt4LHk9digyMyw5LHkrKGReeF51KStpLTEwOTQ3MzA2NDApK2QsdT12KDQsMjgsdSsoeV5kXngpK2ErNjgxMjc5MTc0KSt5LHg9digxMSwyMSx4Kyh1XnleZCkrQi0zNTg1MzcyMjIpK3UsZD12KDE2LDE2LGQrKHhedV55KStFLTcyMjUyMTk3OSkreCx5PXYoMjMsOSx5KyhkXnhedSkrZSs3NjAyOTE4OSkrZCx1PXYoNCwyOCx1Kyh5XmReeCkrQy02NDAzNjQ0ODcpK3kseD12KDExLDIxLHgrKHVeeV5kKStzLTQyMTgxNTgzNSkrdSxkPXYoMTYsMTYsZCsoeF51XnkpK2YrNTMwNzQyNTIwKSt4LHk9digyMyw5LHkrKGReeF51KStvLTk5NTMzODY1MSkrZCx1PXYoNiwyNix1KyhkXih5fH54KSkrQi0xOTg2MzA4NDQpK3kseD12KDEwLDIyLHgrKHleKHV8fmQpKStJKzExMjY4OTE0MTUpK3UsZD12KDE1LDE3LGQrKHVeKHh8fnkpKStnLTE0MTYzNTQ5MDUpK3gseT12KDIxLDExLHkrKHheKGR8fnUpKSt0LTU3NDM0MDU1KStkLHU9dig2LDI2LHUrKGReKHl8fngpKStzKzE3MDA0ODU1NzEpK3kseD12KDEwLDIyLHgrKHleKHV8fmQpKStFLTE4OTQ5ODY2MDYpK3UsZD12KDE1LDE3LGQrKHVeKHh8fnkpKStpLTEwNTE1MjMpK3gseT12KDIxLDExLHkrKHheKGR8fnUpKStRLTIwNTQ5MjI3OTkpK2QsdT12KDYsMjYsdSsoZF4oeXx+eCkpK3IrMTg3MzMxMzM1OSkreSx4PXYoMTAsMjIseCsoeV4odXx+ZCkpK2YtMzA2MTE3NDQpK3UsZD12KDE1LDE3LGQrKHVeKHh8fnkpKStlLTE1NjAxOTgzODApK3gseT12KDIxLDExLHkrKHheKGR8fnUpKSthKzEzMDkxNTE2NDkpK2QsdT12KDYsMjYsdSsoZF4oeXx+eCkpK24tMTQ1NTIzMDcwKSt5LHg9digxMCwyMix4Kyh5Xih1fH5kKSkrdy0xMTIwMjEwMzc5KSt1LGQ9digxNSwxNyxkKyh1Xih4fH55KSkrbys3MTg3ODcyNTkpK3gseT12KDIxLDExLHkrKHheKGR8fnUpKStDLTM0MzQ4NTU1MSkrZCx1PXUrTT4+PjAseT15K2M+Pj4wLGQ9ZCtiPj4+MCx4PXgrRz4+PjA7cmV0dXJuIEwuZW5kaWFuKFt1LHksZCx4XSk7ZnVuY3Rpb24gdihBLEIsUSl7cmV0dXJuIFE8PEF8UT4+PkJ9fShBKSk7cmV0dXJuIEImJkIuYXNCeXRlcz9BOkwuYnl0ZXNUb0hleChBKX0sST1mdW5jdGlvbihBLEIsUSxvKXtyZXR1cm4gVz1CLmxvb3BzLEIubG9vcCxtPUIuZ2V0QSxxPUIuZ2V0QixaPUIuZ2V0QyxSPUIuZ2V0RCxCLmdldFgsRD1CLnNldEEsSj1CLnNldEIsVT1CLnNldEMsSD1CLnNldEQsQi5zZXRYLHA9USxBPUwud29yZHNUb0J5dGVzKGkoQSkpLG8mJm8uYXNCeXRlcz9BOkwuYnl0ZXNUb0hleChBKX0scj17fSxDPShuZXcgRGF0ZSkuZ2V0VGltZSgpO2Z1bmN0aW9uIGkoQSl7KG5ldyBEYXRlKS5nZXRUaW1lKCk7dmFyIEIsUSxvLEUsbix0LGUsSSxyLEMsaSx3LHMsYSxnLGYsTSxjLGIsRyx1LHksZD0xNzMyNTg0MTkzLHg9LTI3MTczMzg3OSxGPS0xNzMyNTg0MTk0LGo9MjcxNzMzODc4LGw9MCxoPTgqQS5sZW5ndGg7Zm9yKCFmdW5jdGlvbihBLEIpe3ZhciBRLG8sRSxuLHQ9LTEsZT1NYXRoLmZsb29yKChBLmxlbmd0aC0xKS80KSxJPTA7Zm9yKDtlLTg+dCsrOylJPXQ8PDIsQlt0XT1BW0krMF18QVtJKzFdPDw4fEFbSSsyXTw8MTZ8QVtJKzNdPDwyNDt0LS07Zm9yKDtlPnQrKzspUT12b2lkIDA9PT1BWyhJPXQ8PDIpKzBdPzA6QVtJKzBdLG89dm9pZCAwPT09QVtJKzFdPzA6QVtJKzFdLEU9dm9pZCAwPT09QVtJKzJdPzA6QVtJKzJdLG49dm9pZCAwPT09QVtJKzNdPzA6QVtJKzNdLEJbdF09UXxvPDw4fEU8PDE2fG48PDI0fShBLHApLHBbaD4+PjVdfD0xMjg8PGglMzIseT0xNSsoNjQrKHBbMTQrKDY0K2g+Pj45PDw0KV09aCk+Pj45PDw0KSx1PXA7bDx5Oyl5PmwrWD8oRChkKSxKKHgpLFUoRiksSChqKSxXKGspLGwrPTE2KmssZD1tKCkseD1xKCksRj1aKCksaj1SKCksMCk6KE09ZCxjPXgsYj1GLEc9aixCPXVbbCswXT4+PjAsUT11W2wrMV0+Pj4wLG89dVtsKzJdPj4+MCxFPXVbbCszXT4+PjAsbj11W2wrNF0+Pj4wLHQ9dVtsKzVdPj4+MCxlPXVbbCs2XT4+PjAsST11W2wrN10+Pj4wLHI9dVtsKzhdPj4+MCxDPXVbbCs5XT4+PjAsaT11W2wrMTBdPj4+MCx3PXVbbCsxMV0+Pj4wLHM9dVtsKzEyXT4+PjAsYT11W2wrMTNdPj4+MCxnPXVbbCsxNF0+Pj4wLGY9dVtsKzE1XT4+PjAsZD12KDcsMjUsZCsoeCZGfH54JmopK0ItNjgwODc2OTM2KSt4LGo9digxMiwyMCxqKyhkJnh8fmQmRikrUS0zODk1NjQ1ODYpK2QsRj12KDE3LDE1LEYrKGomZHx+aiZ4KStvKzYwNjEwNTgxOSkraix4PXYoMjIsMTAseCsoRiZqfH5GJmQpK0UtMTA0NDUyNTMzMCkrRixkPXYoNywyNSxkKyh4JkZ8fngmaikrbi0xNzY0MTg4OTcpK3gsaj12KDEyLDIwLGorKGQmeHx+ZCZGKSt0KzEyMDAwODA0MjYpK2QsRj12KDE3LDE1LEYrKGomZHx+aiZ4KStlLTE0NzMyMzEzNDEpK2oseD12KDIyLDEwLHgrKEYmanx+RiZkKStJLTQ1NzA1OTgzKStGLGQ9dig3LDI1LGQrKHgmRnx+eCZqKStyKzE3NzAwMzU0MTYpK3gsaj12KDEyLDIwLGorKGQmeHx+ZCZGKStDLTE5NTg0MTQ0MTcpK2QsRj12KDE3LDE1LEYrKGomZHx+aiZ4KStpLTQyMDYzKStqLHg9digyMiwxMCx4KyhGJmp8fkYmZCkrdy0xOTkwNDA0MTYyKStGLGQ9dig3LDI1LGQrKHgmRnx+eCZqKStzKzE4MDQ2MDM2ODIpK3gsaj12KDEyLDIwLGorKGQmeHx+ZCZGKSthLTQwMzQxMTAxKStkLEY9digxNywxNSxGKyhqJmR8fmomeCkrZy0xNTAyMDAyMjkwKStqLHg9digyMiwxMCx4KyhGJmp8fkYmZCkrZisxMjM2NTM1MzI5KStGLGQ9dig1LDI3LGQrKHgmanxGJn5qKStRLTE2NTc5NjUxMCkreCxqPXYoOSwyMyxqKyhkJkZ8eCZ+RikrZS0xMDY5NTAxNjMyKStkLEY9digxNCwxOCxGKyhqJnh8ZCZ+eCkrdys2NDM3MTc3MTMpK2oseD12KDIwLDEyLHgrKEYmZHxqJn5kKStCLTM3Mzg5NzMwMikrRixkPXYoNSwyNyxkKyh4Jmp8RiZ+aikrdC03MDE1NTg2OTEpK3gsaj12KDksMjMsaisoZCZGfHgmfkYpK2krMzgwMTYwODMpK2QsRj12KDE0LDE4LEYrKGomeHxkJn54KStmLTY2MDQ3ODMzNSkraix4PXYoMjAsMTIseCsoRiZkfGomfmQpK24tNDA1NTM3ODQ4KStGLGQ9dig1LDI3LGQrKHgmanxGJn5qKStDKzU2ODQ0NjQzOCkreCxqPXYoOSwyMyxqKyhkJkZ8eCZ+RikrZy0xMDE5ODAzNjkwKStkLEY9digxNCwxOCxGKyhqJnh8ZCZ+eCkrRS0xODczNjM5NjEpK2oseD12KDIwLDEyLHgrKEYmZHxqJn5kKStyKzExNjM1MzE1MDEpK0YsZD12KDUsMjcsZCsoeCZqfEYmfmopK2EtMTQ0NDY4MTQ2NykreCxqPXYoOSwyMyxqKyhkJkZ8eCZ+Rikrby01MTQwMzc4NCkrZCxGPXYoMTQsMTgsRisoaiZ4fGQmfngpK0krMTczNTMyODQ3Mykraix4PXYoMjAsMTIseCsoRiZkfGomfmQpK3MtMTkyNjYwNzczNCkrRixkPXYoNCwyOCxkKyh4XkZeaikrdC0zNzg1NTgpK3gsaj12KDExLDIxLGorKGReeF5GKStyLTIwMjI1NzQ0NjMpK2QsRj12KDE2LDE2LEYrKGpeZF54KSt3KzE4MzkwMzA1NjIpK2oseD12KDIzLDkseCsoRl5qXmQpK2ctMzUzMDk1NTYpK0YsZD12KDQsMjgsZCsoeF5GXmopK1EtMTUzMDk5MjA2MCkreCxqPXYoMTEsMjEsaisoZF54XkYpK24rMTI3Mjg5MzM1MykrZCxGPXYoMTYsMTYsRisoal5kXngpK0ktMTU1NDk3NjMyKStqLHg9digyMyw5LHgrKEZeal5kKStpLTEwOTQ3MzA2NDApK0YsZD12KDQsMjgsZCsoeF5GXmopK2ErNjgxMjc5MTc0KSt4LGo9digxMSwyMSxqKyhkXnheRikrQi0zNTg1MzcyMjIpK2QsRj12KDE2LDE2LEYrKGpeZF54KStFLTcyMjUyMTk3OSkraix4PXYoMjMsOSx4KyhGXmpeZCkrZSs3NjAyOTE4OSkrRixkPXYoNCwyOCxkKyh4XkZeaikrQy02NDAzNjQ0ODcpK3gsaj12KDExLDIxLGorKGReeF5GKStzLTQyMTgxNTgzNSkrZCxGPXYoMTYsMTYsRisoal5kXngpK2YrNTMwNzQyNTIwKStqLHg9digyMyw5LHgrKEZeal5kKStvLTk5NTMzODY1MSkrRixkPXYoNiwyNixkKyhGXih4fH5qKSkrQi0xOTg2MzA4NDQpK3gsaj12KDEwLDIyLGorKHheKGR8fkYpKStJKzExMjY4OTE0MTUpK2QsRj12KDE1LDE3LEYrKGReKGp8fngpKStnLTE0MTYzNTQ5MDUpK2oseD12KDIxLDExLHgrKGpeKEZ8fmQpKSt0LTU3NDM0MDU1KStGLGQ9dig2LDI2LGQrKEZeKHh8fmopKStzKzE3MDA0ODU1NzEpK3gsaj12KDEwLDIyLGorKHheKGR8fkYpKStFLTE4OTQ5ODY2MDYpK2QsRj12KDE1LDE3LEYrKGReKGp8fngpKStpLTEwNTE1MjMpK2oseD12KDIxLDExLHgrKGpeKEZ8fmQpKStRLTIwNTQ5MjI3OTkpK0YsZD12KDYsMjYsZCsoRl4oeHx+aikpK3IrMTg3MzMxMzM1OSkreCxqPXYoMTAsMjIsaisoeF4oZHx+RikpK2YtMzA2MTE3NDQpK2QsRj12KDE1LDE3LEYrKGReKGp8fngpKStlLTE1NjAxOTgzODApK2oseD12KDIxLDExLHgrKGpeKEZ8fmQpKSthKzEzMDkxNTE2NDkpK0YsZD12KDYsMjYsZCsoRl4oeHx+aikpK24tMTQ1NTIzMDcwKSt4LGo9digxMCwyMixqKyh4XihkfH5GKSkrdy0xMTIwMjEwMzc5KStkLEY9digxNSwxNyxGKyhkXihqfH54KSkrbys3MTg3ODcyNTkpK2oseD12KDIxLDExLHgrKGpeKEZ8fmQpKStDLTM0MzQ4NTU1MSkrRixsKz0xNixkPWQrTT4+PjAseD14K2M+Pj4wLEY9RitiPj4+MCxqPWorRz4+PjApO3JldHVybiBMLmVuZGlhbihbZCx4LEYsal0pO2Z1bmN0aW9uIHYoQSxCLFEpe3JldHVybiBRPDxBfFE+Pj5CfX1yZXR1cm4gci50aGVuPWZ1bmN0aW9uKEEpe3JldHVybiBvPUEsdygpLHJ9LHIuY2F0Y2g9ZnVuY3Rpb24oQSl7cmV0dXJuIEU9QSxyfSxBJiYib2JqZWN0Ij09dHlwZW9mIEE/ImZ1bmN0aW9uIj09dHlwZW9mIEJ1ZmZlciYmQS5jb25zdHJ1Y3Rvcj09PUJ1ZmZlcj9RPUE6QS5jb25zdHJ1Y3Rvcj09PVVpbnQ4QXJyYXl8fEEuY29uc3RydWN0b3I9PT1BcnJheUJ1ZmZlcj9RPUEuY29uc3RydWN0b3I9PT1BcnJheUJ1ZmZlcj9uZXcgVWludDhBcnJheShBKTpBOnMobmV3IFR5cGVFcnJvcihnKSk6cyhuZXcgVHlwZUVycm9yKGcpKSxRJiYoQT1RLmxlbmd0aCxhJiZBPlg/MjY4MzY5OTIwPEE/cyhuZXcgRXJyb3IoIlBhcmFtZXRlciBleGNlZWRzIG1heCBzaXplIG9mIDI1NS45IE1ieXRlcyIpKTooQT1uZXcgV2ViQXNzZW1ibHkuTWVtb3J5KHtpbml0aWFsOjMyZTY8QT82NGU2PEE/MTI4ZTY8QT80MDk2OjIwNDg6MTAyNDo1MTJ9KSxCPW5ldyBVaW50MzJBcnJheShBLmJ1ZmZlciksQT17aW1wb3J0czp7bWVtOkEsbG9nOmNvbnNvbGUubG9nfX0sV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoYSxBKS50aGVuKGZ1bmN0aW9uKEEpe3coSShRLEEuaW5zdGFuY2UuZXhwb3J0cyxCKSl9KSk6dyhlKFEpKSkscjtmdW5jdGlvbiB3KEEpe3ZhciBCPUJvb2xlYW4oQSk/QTpuO0Jvb2xlYW4oQSkmJih0PShuZXcgRGF0ZSkuZ2V0VGltZSgpKSwiZnVuY3Rpb24iPT10eXBlb2Ygbz9Cb29sZWFuKEIpJiYobyhCLHQtQyksbz1FPW51bGwpOkJvb2xlYW4oQSkmJihuPUEpfWZ1bmN0aW9uIHMoQSl7ImZ1bmN0aW9uIj09dHlwZW9mIEUmJkUoQSl9fWZ1bmN0aW9uIG8oQSl7cmV0dXJuIEF9fSgpOw=="}]},{"name":"网页限制解除(改)","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_prototypes":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_excludes":["*www.bilibili.com/video*","*www.bilibili.com/v*","*www.bilibili.com/bangumi*","*www.youtube.com/watch*","*www.panda.tv*"],"orig_includes":[],"orig_matches":["*://*/*"],"orig_noframes":null,"orig_run_at":"document-start","use_blockers":[],"use_connects":[],"use_excludes":["/(^[^:\\/#\\?]*:\\/\\/([^#\\?\\/]*\\.)?cn\\.bing\\.com(:[0-9]{1,5})?\\/.*$)/","/(^[^:\\/#\\?]*:\\/\\/([^#\\?\\/]*\\.)?login\\.microsoftonline\\.com(:[0-9]{1,5})?\\/.*$)/","/(^[^:\\/#\\?]*:\\/\\/([^#\\?\\/]*\\.)?docs\\.qq\\.com(:[0-9]{1,5})?\\/.*$)/"],"use_includes":[],"use_matches":[]},"run_at":null,"tab_types":null},"storage":{"ts":1624620458095,"data":{"rwl_userData":"o{\"status\":1,\"version\":0.1,\"message\":\"啦啦啦,啦啦啦,我是卖报的小行家\",\"positionTop\":33,\"positionLeft\":0,\"positionRight\":\"auto\",\"addBtn\":false,\"connectToTheServer\":true,\"waitUpload\":[],\"currentURL\":\"https://www.icourse163.org/spoc/learn/JUST-1450439173?tid=1450895444#/learn/content?type=detail&id=1218032971&sm=1\",\"rules\":{\"rule_def\":{\"name\":\"default\",\"hook_eventNames\":\"contextmenu|select|selectstart|copy|cut|dragstart|mousemove|beforeunload\",\"unhook_eventNames\":\"mousedown|mouseup|keydown|keyup\",\"dom0\":true,\"hook_addEventListener\":true,\"hook_preventDefault\":true,\"hook_set_returnValue\":true,\"add_css\":true},\"rule_plus\":{\"name\":\"default\",\"hook_eventNames\":\"contextmenu|select|selectstart|copy|cut|dragstart|mousedown|mouseup|mousemove|beforeunload\",\"unhook_eventNames\":\"keydown|keyup\",\"dom0\":true,\"hook_addEventListener\":true,\"hook_preventDefault\":true,\"hook_set_returnValue\":true,\"add_css\":true},\"rule_zhihu\":{\"name\":\"default\",\"hook_eventNames\":\"contextmenu|select|selectstart|copy|cut|dragstart|mousemove\",\"unhook_eventNames\":\"keydown|keyup\",\"dom0\":true,\"hook_addEventListener\":true,\"hook_preventDefault\":true,\"hook_set_returnValue\":true,\"add_css\":true}},\"data\":[\"b.faloo.com\",\"bbs.coocaa.com\",\"blog.csdn.net\",\"book.hjsm.tom.com\",\"book.zhulang.com\",\"book.zongheng.com\",\"chokstick.com\",\"chuangshi.qq.com\",\"city.udn.com\",\"cutelisa55.pixnet.net\",\"huayu.baidu.com\",\"imac.hk\",\"life.tw\",\"luxmuscles.com\",\"movie.douban.com\",\"news.missevan.com\",\"read.qidian.com\",\"vipreader.qidian.com\",\"www.15yan.com\",\"www.17k.com\",\"www.18183.com\",\"www.360doc.com\",\"www.antpedia.com\",\"www.bilibili.com\",\"www.cn-ki.net\",\"www.coco01.net\",\"www.eyu.com\",\"www.hongshu.com\",\"www.hongxiu.com\",\"www.icourse163.org\",\"www.imooc.com\",\"www.jjwxc.net\",\"www.pigai.org\",\"www.ppkao.com\",\"www.readnovel.com\",\"www.ruiwen.com\",\"www.sdifen.com\",\"www.shangc.net\",\"www.tadu.com\",\"www.xxsy.net\",\"www.z3z4.com\",\"www.zhihu.com\",\"yuedu.163.com\"],\"addBtnaddBtn\":true,\"shortcut\":3}"}},"enabled":false,"position":2,"file_url":"https://greasyfork.org/scripts/28497-remove-web-limits-modified/code/Remove%20web%20limits(modified).user.js","uuid":"8f899bf0-35a0-4742-bcc4-4a23b1d99e91","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWVzcGFjZSAgICAgICAgIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vdXNlcnMvMTA2MjIyLXF4aW4taQoKLy8gQG5hbWUgICAgICAgICAgICAgIOe9kemhtemZkOWItuino+mZpCjmlLkpCi8vIEBuYW1lOmVuICAgICAgICAgICBSZW1vdmUgd2ViIGxpbWl0cyhtb2RpZmllZCkKLy8gQG5hbWU6emggICAgICAgICAgIOe9kemhtemZkOWItuino+mZpCjmlLkpCi8vIEBuYW1lOnpoLUNOICAgICAgICDnvZHpobXpmZDliLbop6PpmaQo5pS5KQovLyBAbmFtZTpqYSAgICAgICAgICAg44Km44Kn44OW44Gu6KaP5Yi257ep5ZKMKOWkieabtCkKCi8vIEBhdXRob3IgICAgICAgICAgICBDYXQ3MyAmIGlxeGluKOS/ruaUuSkgCi8vIEBjb250cmlidXRvciAgICAgICBpcXhpbgoKLy8gQGRlc2NyaXB0aW9uICAgICAgIOmAmuadgOWkp+mDqOWIhue9keermSzlj6/ku6Xop6PpmaTnpoHmraLlpI3liLbjgIHliarliIfjgIHpgInmi6nmlofmnKzjgIHlj7PplK7oj5zljZXnmoTpmZDliLbjgILljp/kvZzogIVjYXQ3Myzlm6DkuLrlkozmkJzntKLot7PovazohJrmnKzlhrLnqoEs6YGC6L+b6KGM5LqG5pS55Yqo44CCCi8vIEBkZXNjcmlwdGlvbjplbiAgICBQYXNzIHRvIGtpbGwgbW9zdCBvZiB0aGUgc2l0ZSwgeW91IGNhbiBsaWZ0IHRoZSByZXN0cmljdGlvbnMgcHJvaGliaXRlZCB0byBjb3B5LCBjdXQsIHNlbGVjdCB0aGUgdGV4dCwgcmlnaHQtY2xpY2sgbWVudS5yZXZpc2VkIHZlcnNpb24KLy8gQGRlc2NyaXB0aW9uOnpoICAgIOmAmuadgOWkp+mDqOWIhue9keermSzlj6/ku6Xop6PpmaTnpoHmraLlpI3liLbjgIHliarliIfjgIHpgInmi6nmlofmnKzjgIHlj7PplK7oj5zljZXnmoTpmZDliLbjgILljp/kvZzogIVjYXQ3Myzlm6DkuLrlkozmkJzntKLot7PovazohJrmnKzlhrLnqoEs6YGC6L+b6KGM5LqG5pS55YqoCi8vIEBkZXNjcmlwdGlvbjp6aC1DTiDpgJrmnYDlpKfpg6jliIbnvZHnq5ks5Y+v5Lul6Kej6Zmk56aB5q2i5aSN5Yi244CB5Ymq5YiH44CB6YCJ5oup5paH5pys44CB5Y+z6ZSu6I+c5Y2V55qE6ZmQ5Yi244CC5Y6f5L2c6ICFY2F0NzMs5Zug5Li65ZKM5pCc57Si6Lez6L2s6ISa5pys5Yay56qBLOmBgui/m+ihjOS6huaUueWKqAovLyBAZGVzY3JpcHRpb246emgtVFcg6YCa5q665aSn6YOo5YiG57ay56uZLOWPr+S7peino+mZpOemgeatouW+qeWItuOAgeWJquWIh+OAgemBuOaTh+aWh+acrOOAgeWPs+mNteiPnOWWrueahOmZkOWItuOAggovLyBAZGVzY3JpcHRpb246amEgICAg44K144Kk44OI44Gu44G744Go44KT44Gp44KS5q6644GZ44Gf44KB44Gr5rih44GX44CB44GC44Gq44Gf44Gv44CB44Kz44OU44O85YiH44KK5Y+W44KK44CB44OG44Kt44K544OI44CB5Y+z44Kv44Oq44OD44Kv44Oh44OL44Ol44O844KS6YG45oqe44GZ44KL44GT44Go44Gv56aB5q2i44Gu5Yi26ZmQ44KS6Kej6Zmk44GZ44KL44GT44Go44GM44Gn44GN44G+44GZ44CCCgovLyBAZGVzY3JpcHRpb24gICAgICAg5Y6f5L2c6ICFaHR0cHM6Ly93d3cuZ2l0aHViLmNvbS9DYXQ3MzczLyzlm6DkuLrlkozmkJzntKLot7PovazohJrmnKzlhrLnqoEs6YGC6L+b6KGM5LqG5pS55YqoCi8vIEBob21lcGFnZVVSTCAgICAgICBodHRwczovL2NhdDczNzMuZ2l0aHViLmlvL3JlbW92ZS13ZWItbGltaXRzLwovLyBAc3VwcG9ydFVSTCAgICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzI4NDk3CgovLyBAaWNvbiAgICAgICAgICAgICAgIGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBUUFBQURaYzdKL0FBQUJwRWxFUVZSNG5PM1Z2MnVVUVJERzhjL2ViU01XcWF5MHRyQVRBeHJVU2kxUzJBaVdGb0pZcE5DZ29CalVSc0hXSktlTlJmQXZzRGdGaXhRcUtkUFoyVmlFaUNKWUJPUXU4ZjFoRVhPNTk3MTNqN01VZkxaNmQyYS9POHZNTzBPekRuaW45S3UyTWp2dWF3MDd4Z1NBWUVWWGUyaW5kTWhqOTJ6cEtKTG5CaEY4TURleWU5aG42emJONzBlUmlxQ3cwMkJyYTN1cDhCQkx1MUZFQnhzQnVjWHFXNGNzejBVTGU0am9yU0NNdVBVODlib1JFTERNSGlJNlk4VjY1YmJDVVRjY2M3MFJrYU93S0xPZzBJa3lYYTlxVGpPdTJMQXM2Tlp1RDg2aHJkVHl4Uk5Ua1VxcWRoWGxIcm5nR1JWRVpzTXBKd2V4OUR4SVpTSFljbGVzSWI2NUxDb0hnSXM2NlVKcTZidERCWkhaclBoOFY2WUJPWDY2TGJPa1RHY2tCWWltQlcyRlZUTmV1T1pOeXJGSjIzNllsNE5TeTVTYlZtMVBEdmhvZHFneU1sZWRUZFJsQXREenFmTDl0Zmt3VXR5YVJrdjlMd0ZqOUIvdzd3UHljWE9ocWxKMHlaSEtQQ2hNaTVNQ2lNNDdYaHNvcGJWSkFVSGZyWWJtTi9FVG9OKzAyZUxQZno5T1l5WmhGSnpXMUpuM2xUc3hhS1FqQ2twNTJqeTQ1cjFadlNiVGI5TTBkNFBCb3pHWkFBQUFBRWxGVGtTdVFtQ0MKCi8vIEB2ZXJzaW9uICAgICAgICAgICA0LjQuMAovLyBAbGljZW5zZSAgICAgICAgICAgTEdQTHYzCgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovLyovKgovLyBAZXhjbHVkZSAgICAgICAgKnd3dy5iaWxpYmlsaS5jb20vdmlkZW8qCi8vIEBleGNsdWRlICAgICAgICAqd3d3LmJpbGliaWxpLmNvbS92KgovLyBAZXhjbHVkZSAgICAgICAgKnd3dy5iaWxpYmlsaS5jb20vYmFuZ3VtaSoKLy8gQGV4Y2x1ZGUgICAgICAgICp3d3cueW91dHViZS5jb20vd2F0Y2gqCi8vIEBleGNsdWRlICAgICAgICAqd3d3LnBhbmRhLnR2KgoKLy8gQGNvbm5lY3QgICAgIGVlbW0ubWUKLy8gQGdyYW50ICAgICAgIEdNX2dldFZhbHVlCi8vIEBncmFudCAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgR01fYWRkU3R5bGUKLy8gQGdyYW50ICAgICAgIEdNX2RlbGV0ZVZhbHVlCi8vIEBncmFudCAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgR01fc2V0Q2xpcGJvYXJkCi8vIEBncmFudCAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kCi8vIEBydW4tYXQgICAgICBkb2N1bWVudC1zdGFydAovLyA9PS9Vc2VyU2NyaXB0PT0KKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBzZXR0aW5nRGF0YSA9IHsKICAgICAgICAic3RhdHVzIjoxLAogICAgICAgICJ2ZXJzaW9uIiA6IDAuMSwKICAgICAgICAibWVzc2FnZSIgOiAi5ZWm5ZWm5ZWmLOWVpuWVpuWVpizmiJHmmK/ljZbmiqXnmoTlsI/ooYzlrrYiLAogICAgICAgICJwb3NpdGlvblRvcCI6IjAiLAogICAgICAgICJwb3NpdGlvbkxlZnQiOiIwIiwKICAgICAgICAicG9zaXRpb25SaWdodCI6ImF1dG8iLAogICAgICAgICJhZGRCdG4iIDogdHJ1ZSwKICAgICAgICAiY29ubmVjdFRvVGhlU2VydmVyIiA6IGZhbHNlLAogICAgICAgICJ3YWl0VXBsb2FkIjpbXSwKICAgICAgICAiY3VycmVudFVSTCI6Im51bGwiLAogICAgICAgICJzaG9ydGN1dCI6MywKICAgICAgICAvLyDln5/lkI3op4TliJnliJfooagKICAgICAgICAicnVsZXMiIDogewogICAgICAgICAgICAicnVsZV9kZWYiOiB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJkZWZhdWx0IiwKICAgICAgICAgICAgICAgICJob29rX2V2ZW50TmFtZXMiOiAiY29udGV4dG1lbnV8c2VsZWN0fHNlbGVjdHN0YXJ0fGNvcHl8Y3V0fGRyYWdzdGFydHxtb3VzZW1vdmV8YmVmb3JldW5sb2FkIiwKICAgICAgICAgICAgICAgICJ1bmhvb2tfZXZlbnROYW1lcyI6ICJtb3VzZWRvd258bW91c2V1cHxrZXlkb3dufGtleXVwIiwKICAgICAgICAgICAgICAgICJkb20wIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJob29rX2FkZEV2ZW50TGlzdGVuZXIiOiB0cnVlLAogICAgICAgICAgICAgICAgImhvb2tfcHJldmVudERlZmF1bHQiOiB0cnVlLAogICAgICAgICAgICAgICAgImhvb2tfc2V0X3JldHVyblZhbHVlIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJhZGRfY3NzIjogdHJ1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICAicnVsZV9wbHVzIjogewogICAgICAgICAgICAgICAgIm5hbWUiOiAiZGVmYXVsdCIsCiAgICAgICAgICAgICAgICAiaG9va19ldmVudE5hbWVzIjogImNvbnRleHRtZW51fHNlbGVjdHxzZWxlY3RzdGFydHxjb3B5fGN1dHxkcmFnc3RhcnR8bW91c2Vkb3dufG1vdXNldXB8bW91c2Vtb3ZlfGJlZm9yZXVubG9hZCIsCiAgICAgICAgICAgICAgICAidW5ob29rX2V2ZW50TmFtZXMiOiAia2V5ZG93bnxrZXl1cCIsCiAgICAgICAgICAgICAgICAiZG9tMCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaG9va19hZGRFdmVudExpc3RlbmVyIjogdHJ1ZSwKICAgICAgICAgICAgICAgICJob29rX3ByZXZlbnREZWZhdWx0IjogdHJ1ZSwKICAgICAgICAgICAgICAgICJob29rX3NldF9yZXR1cm5WYWx1ZSI6IHRydWUsCiAgICAgICAgICAgICAgICAiYWRkX2NzcyI6IHRydWUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJ1bGVfemhpaHUiOiB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJkZWZhdWx0IiwKICAgICAgICAgICAgICAgICJob29rX2V2ZW50TmFtZXMiOiAiY29udGV4dG1lbnV8c2VsZWN0fHNlbGVjdHN0YXJ0fGNvcHl8Y3V0fGRyYWdzdGFydHxtb3VzZW1vdmUiLAogICAgICAgICAgICAgICAgInVuaG9va19ldmVudE5hbWVzIjogImtleWRvd258a2V5dXAiLAogICAgICAgICAgICAgICAgImRvbTAiOiB0cnVlLAogICAgICAgICAgICAgICAgImhvb2tfYWRkRXZlbnRMaXN0ZW5lciI6IHRydWUsCiAgICAgICAgICAgICAgICAiaG9va19wcmV2ZW50RGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICAgICAiaG9va19zZXRfcmV0dXJuVmFsdWUiOiB0cnVlLAogICAgICAgICAgICAgICAgImFkZF9jc3MiOiB0cnVlCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJkYXRhIjogWwogICAgICAgICAgICAiYi5mYWxvby5jb20iLAogICAgICAgICAgICAiYmJzLmNvb2NhYS5jb20iLAogICAgICAgICAgICAiYm9vay5oanNtLnRvbS5jb20iLAogICAgICAgICAgICAiYm9vay56aHVsYW5nLmNvbSIsCiAgICAgICAgICAgICJib29rLnpvbmdoZW5nLmNvbSIsCiAgICAgICAgICAgICJjaG9rc3RpY2suY29tIiwKICAgICAgICAgICAgImNodWFuZ3NoaS5xcS5jb20iLAogICAgICAgICAgICAiY2l0eS51ZG4uY29tIiwKICAgICAgICAgICAgImN1dGVsaXNhNTUucGl4bmV0Lm5ldCIsCiAgICAgICAgICAgICJodWF5dS5iYWlkdS5jb20iLAogICAgICAgICAgICAiaW1hYy5oayIsCiAgICAgICAgICAgICJsaWZlLnR3IiwKICAgICAgICAgICAgImx1eG11c2NsZXMuY29tIiwKICAgICAgICAgICAgIm5ld3MubWlzc2V2YW4uY29tIiwKICAgICAgICAgICAgInJlYWQucWlkaWFuLmNvbSIsCiAgICAgICAgICAgICJ3d3cuMTV5YW4uY29tIiwKICAgICAgICAgICAgInd3dy4xN2suY29tIiwKICAgICAgICAgICAgInd3dy4xODE4My5jb20iLAogICAgICAgICAgICAid3d3LjM2MGRvYy5jb20iLAogICAgICAgICAgICAid3d3LmNvY28wMS5uZXQiLAogICAgICAgICAgICAid3d3LmV5dS5jb20iLAogICAgICAgICAgICAid3d3LmhvbmdzaHUuY29tIiwKICAgICAgICAgICAgInd3dy5ob25neGl1LmNvbSIsCiAgICAgICAgICAgICJ3d3cuaW1vb2MuY29tIiwKICAgICAgICAgICAgInd3dy5qand4Yy5uZXQiLAogICAgICAgICAgICAid3d3LnJlYWRub3ZlbC5jb20iLAogICAgICAgICAgICAid3d3LnRhZHUuY29tIiwKICAgICAgICAgICAgInd3dy54eHN5Lm5ldCIsCiAgICAgICAgICAgICJ3d3cuejN6NC5jb20iLAogICAgICAgICAgICAid3d3LnpoaWh1LmNvbSIsCiAgICAgICAgICAgICJ5dWVkdS4xNjMuY29tIiwKICAgICAgICAgICAgInd3dy5wcGthby5jb20iLAogICAgICAgICAgICAibW92aWUuZG91YmFuLmNvbSIsCiAgICAgICAgICAgICJ3d3cucnVpd2VuLmNvbSIsCiAgICAgICAgICAgICJ2aXByZWFkZXIucWlkaWFuLmNvbSIsCiAgICAgICAgICAgICJ3d3cucGlnYWkub3JnIiwKICAgICAgICAgICAgInd3dy5zaGFuZ2MubmV0IiwKICAgICAgICAgICAgInd3dy5teWh0bG1lYm9vay5jb20iLAogICAgICAgICAgICAid3d3Lnl1cXVlLmNvbSIsCiAgICAgICAgICAgICJ3d3cubG9uZ21hYm9va2NuLmNvbSIsCiAgICAgICAgICAgICJ3d3cuYWxwaGFwb2xpcy5jby5qcCIsCiAgICAgICAgICAgICJ3d3cuc2RpZmVuLmNvbSIKICAgICAgICBdCiAgICB9CgogICAgdmFyIHJ3bF91c2VyRGF0YSA9IG51bGw7CiAgICB2YXIgaG9zdG5hbWUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7CiAgICB2YXIgYnRuX25vZGUgPSBudWxsOyAgIAogICAgdmFyIHJ1bGUgPSBudWxsOwogICAgdmFyIGxpc3QgPSBudWxsOwogICAgdmFyIGhhc0ZyYW1lID0gZmFsc2U7CgogICAgLy8g5YKo5a2Y5ZCN56ewCiAgICB2YXIgc3RvcmFnZU5hbWUgPSAiaXF4aW5TdG9yYWdlTmFtZSI7CiAgICAvLyDopoHlpITnkIbnmoQgZXZlbnQg5YiX6KGoCiAgICB2YXIgaG9va19ldmVudE5hbWVzLCB1bmhvb2tfZXZlbnROYW1lcywgZXZlbnROYW1lczsKICAgIC8vIOWCqOWtmOiiqyBIb29rIOeahOWHveaVsAogICAgdmFyIEV2ZW50VGFyZ2V0X2FkZEV2ZW50TGlzdGVuZXIgPSBFdmVudFRhcmdldC5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcjsKICAgIHZhciBkb2N1bWVudF9hZGRFdmVudExpc3RlbmVyID0gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcjsKICAgIHZhciBFdmVudF9wcmV2ZW50RGVmYXVsdCA9IEV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdDsKCiAgICAvLyDmn6XnnIvmnKzlnLDmmK/lkKblrZjlnKjml6fmlbDmja4KICAgIHJ3bF91c2VyRGF0YSA9IEdNX2dldFZhbHVlKCJyd2xfdXNlckRhdGEiKTsKICAgIGlmKCFyd2xfdXNlckRhdGEpewogICAgICAgIHJ3bF91c2VyRGF0YSA9IHNldHRpbmdEYXRhCiAgICAgICAgLy8gR01fc2V0VmFsdWUoInJ3bF91c2VyRGF0YSIscndsX3VzZXJEYXRhKTsKICAgIH0KICAgIC8vIOiHquWKqOabtOaWsOaVsOaNrgogICAgZm9yKGxldCB2YWx1ZSBpbiBzZXR0aW5nRGF0YSl7CiAgICAgICAgaWYoIXJ3bF91c2VyRGF0YS5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkpewogICAgICAgICAgICByd2xfdXNlckRhdGFbdmFsdWVdID0gc2V0dGluZ0RhdGFbdmFsdWVdOwogICAgICAgICAgICBHTV9zZXRWYWx1ZSgicndsX3VzZXJEYXRhIixyd2xfdXNlckRhdGEpOwogICAgICAgIH0KICAgIH0KCiAgICB2ZXJzaW9uX3VwXzNfdG9fNCgpOwoKICAgIC8vIOiOt+WPlum7keWQjeWNlee9keermQogICAgbGlzdCA9IGdldF9ibGFja19saXN0KCk7CgogICAgLy8g5re75Yqg5oyJ6ZKuCiAgICAvLyBpZihyd2xfdXNlckRhdGEuYWRkQnRuKXsKICAgICAgICBhZGRCdG4oKTsgIC8vIOa3u+WKoAogICAgICAgIGJ0bl9ub2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJsYWNrX25vZGUiKTsKCiAgICAgICAgdmFyIHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKICAgICAgICAgICAgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJsYWNrX25vZGUiKSl7CiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICAgICAgICAgIHF4aW5TdGFydCgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYWRkQnRuKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LDUwMCkKCiAgICAvLyB9CgogICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgi5aSN5Yi26ZmQ5Yi26Kej6ZmkIOiuvue9riIsIHNldE1lbnUpCiAgICB2YXIgdXNlclNldHRpbmcgPSBHTV9nZXRWYWx1ZSgicndsX3VzZXJEYXRhIik7CgogICAgLy8gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t5Ye95pWwIGZ1bmMKCiAgICBmdW5jdGlvbiBxeGluU3RhcnQoKXsKICAgICAgICBjb25zb2xlLmxvZygi6ISa5pysOiDlpI3liLbpmZDliLbop6PpmaQo5pS5KSAtLS0g5byA5aeL5omn6KGMIC0tLSDlj5HluIPogIU6IHF4aW4gLS0tIEdpdEh1YjogaHR0cHM6Ly9naXRodWIuY29tL3F4aW5HaXRIdWIvUmVtb3ZlLXdlYi1saW1pdHMtIik7CiAgICAgICAgYWRkRHJhZ0V2ZW4oKTsKICAgICAgICBzZXRCdG5DbGljaygpOwoKICAgICAgICAvLyDmo4Dmn6XmmK/lkKblnKjpu5HlkI3ljZXkuK0KICAgICAgICBpZihjaGVja19ibGFja19saXN0KGxpc3QsaG9zdG5hbWUpKXsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmKHJ3bF91c2VyRGF0YS5hZGRCdG4pewogICAgICAgICAgICAgICAgICAgIGJ0bl9ub2RlLmNoZWNrZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCLohJrmnKxyd2wt6ZSZ6K+v77yaXG4gYnRuX25vZGUgOiAlc1xuJXNcbuiEmuacrHJ3bC3plJnor6/kvY3nva7vvJogYnRuX25vZGUuY2hlY2tlZCA9IHRydWU7IixidG5fbm9kZSxlKTsKICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIGluaXQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvL+a3u+WKoOaMiemSriBmdW5jCiAgICBmdW5jdGlvbiBhZGRCdG4oKXsKICAgICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInJlbW92ZS13ZWItbGltaXRzLWlxeGluIik7CiAgICAgICAgbm9kZS5pZCA9ICJyd2wtaXF4aW4iOwogICAgICAgIG5vZGUuY2xhc3NOYW1lID0gInJ3bC1leGVtcHQiOwoKICAgICAgICAvLyDlho3mrKHmiZPlvIDnqpflj6PlsI/kuo7kuYvliY3nqpflj6PnmoTmg4XlhrUs5a+86Ie05oyJ6ZKu5Ye6546w5Zyo5Y+v6KeG56qX5Y+j5LmL5aSWCiAgICAgICAgdmFyIHNjcmVlbkNsaWVudEhlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7CiAgICAgICAgdmFyIHRlbXBIZWlnaHQ7CiAgICAgICAgaWYgKHJ3bF91c2VyRGF0YS5wb3NpdGlvblRvcD5zY3JlZW5DbGllbnRIZWlnaHQpewogICAgICAgICAgICB0ZW1wSGVpZ2h0ICA9IHNjcmVlbkNsaWVudEhlaWdodCAtNDA7CiAgICAgICAgfSBlbHNlewogICAgICAgICAgICB0ZW1wSGVpZ2h0ID0gcndsX3VzZXJEYXRhLnBvc2l0aW9uVG9wOwogICAgICAgIH0KICAgICAgICAvLyDmlLnlj5jnqpflj6PlpKflsI/nmoTmg4XlhrUKICAgICAgICB3aW5kb3cub25yZXNpemU9ZnVuY3Rpb24oKXsgIAogICAgICAgICAgICB2YXIgc2NyZWVuQ2xpZW50SGVpZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDsKICAgICAgICAgICAgdmFyIHRlbXBIZWlnaHQ7CgogICAgICAgICAgICBpZiAocndsX3VzZXJEYXRhLnBvc2l0aW9uVG9wPnNjcmVlbkNsaWVudEhlaWdodCl7CiAgICAgICAgICAgICAgICAgICAgdGVtcEhlaWdodCAgPSBzY3JlZW5DbGllbnRIZWlnaHQgLTQwOwogICAgICAgICAgICB9IGVsc2V7CiAgICAgICAgICAgICAgICB0ZW1wSGVpZ2h0ID0gcndsX3VzZXJEYXRhLnBvc2l0aW9uVG9wOwogICAgICAgICAgICB9CgogICAgICAgICAgICBub2RlLnN0eWxlLnRvcCA9ICB0ZW1wSGVpZ2h0ICsgInB4IjsKICAgICAgICB9CgogICAgICAgIHRlbXBIZWlnaHQgPSB0ZW1wSGVpZ2h0PDA/MDp0ZW1wSGVpZ2h0CiAgICAgICAgbm9kZS5zdHlsZS5jc3NUZXh0ID0gInBvc2l0aW9uOmZpeGVkO3RvcDoiK3RlbXBIZWlnaHQrInB4O2xlZnQ6Iityd2xfdXNlckRhdGEucG9zaXRpb25MZWZ0KyJweDtyaWdodDoiK3J3bF91c2VyRGF0YS5wb3NpdGlvblJpZ2h0KyJweDsiOwogICAgICAgIC8vIG5vZGUuaW5uZXJIVE1MID0gJzxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IiIgaWQ9ImJsYWNrX25vZGUiPum7keWQjeWNlTwvbGFiZWw+PHF4aW5idXR0b24gaWQ9ImRlbGV0ZSI+ZGVsZXRlPC9idHRvbj4nOwogICAgICAgIC8vIG5vZGUuaW5uZXJIVE1MID0gJzxsYWJlbD7pmZDliLbop6PpmaQgPGlucHV0IHR5cGU9ImNoZWNrYm94IiAgbmFtZT0iIiBpZD0iYmxhY2tfbm9kZSI+PC9sYWJlbD4nOwogICAgICAgIG5vZGUuaW5uZXJIVE1MID0gJzxxeGluYnV0dG9uIHR5cGU9InF4aW5idXR0b24iIGlkPSJyd2wtc2V0YnRuIj4gc2V0IDwvcXhpbmJ1dHRvbj4gPGxhbGFsYSBzdHlsZT0iY3Vyc29yOm1vdmU7IGZvbnQtc2l6ZToxMnB4OyI+6ZmQ5Yi26Kej6ZmkPC9sYWxhbGE+IDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iIiBpZD0iYmxhY2tfbm9kZSIgPic7CiAgICAgICAgaWYod2luZG93LnNlbGYgPT09IHdpbmRvdy50b3ApewogICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYm9keSIpKXsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgicndsLWFjdGl2ZS1pcXhpbiIpOwogICAgICAgIH0pOwogICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKCJyd2wtYWN0aXZlLWlxeGluIik7CiAgICAgICAgICAgICAgICBibGFja19jaGVjayhibGFja19ub2RlLmNoZWNrZWQpOwogICAgICAgICAgICB9LDEwMCkKICAgICAgICB9KTsKCiAgICAgICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgICAgICBzdHlsZS50eXBlPSJ0ZXh0L2NzcyI7CgogICAgICAgIHZhciBzdHlsZUlubmVyID0gIiNyd2wtaXF4aW57IiArCiAgICAgICAgICAgICAgICAicG9zaXRpb246Zml4ZWQ7IiArCiAgICAgICAgICAgICAgICAidHJhbnNmb3JtOnRyYW5zbGF0ZSgtOTVweCwwKTsiICsKICAgICAgICAgICAgICAgICJ3aWR0aDo4NXB4OyIgKwogICAgICAgICAgICAgICAgImhlaWdodDoyNXB4OyIgKwogICAgICAgICAgICAgICAgImZvbnQtc2l6ZToxMnB4OyIgKwogICAgICAgICAgICAgICAgImZvbnQtd2VpZ2h0OiA1MDA7IiArCiAgICAgICAgICAgICAgICAiZm9udC1mYW1pbHk6VmVyZGFuYSwgQXJpYWwsICflrovkvZMnOyIgKwogICAgICAgICAgICAgICAgImNvbG9yOiNmZmY7IiArCiAgICAgICAgICAgICAgICAiYmFja2dyb3VuZDojMzMzOyIgKwogICAgICAgICAgICAgICAgInotaW5kZXg6MjE0NzQ4MzY0NzsiICsKICAgICAgICAgICAgICAgICJtYXJnaW46IDA7IiArCiAgICAgICAgICAgICAgICAib3BhY2l0eTowLjA1OyIgKwogICAgICAgICAgICAgICAgInRyYW5zaXRpb246MC4zczsiICsKICAgICAgICAgICAgICAgICJvdmVyZmxvdzpoaWRkZW47IiArCiAgICAgICAgICAgICAgICAidXNlci1zZWxlY3Q6bm9uZTsiICsKICAgICAgICAgICAgICAgICJ0ZXh0LWFsaWduOmNlbnRlcjsiICsKICAgICAgICAgICAgICAgICJ3aGl0ZS1zcGFjZTpub3dyYXA7IiArCiAgICAgICAgICAgICAgICAibGluZS1oZWlnaHQ6MjVweDsiICsKICAgICAgICAgICAgICAgICJwYWRkaW5nOjAgMTZweDsiICsKICAgICAgICAgICAgICAgICJib3JkZXI6MXB4IHNvbGlkICNjY2M7IiArCiAgICAgICAgICAgICAgICAiYm9yZGVyLXdpZHRoOjFweCAxcHggMXB4IDA7IiArCiAgICAgICAgICAgICAgICAiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NXB4OyIgKwogICAgICAgICAgICAgICAgImJveC1zaXppbmc6IGNvbnRlbnQtYm94OyIgKwogICAgICAgICAgICAifSIgKwogICAgICAgICAgICAiI3J3bC1pcXhpbiBpbnB1dHsiICsKICAgICAgICAgICAgICAgICJtYXJnaW46IDA7IiArCiAgICAgICAgICAgICAgICAicGFkZGluZzogMDsiICsKICAgICAgICAgICAgICAgICJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7IiArCiAgICAgICAgICAgICAgICAiLXdlYmtpdC1hcHBlYXJhbmNlOmNoZWNrYm94OyIgKwogICAgICAgICAgICAgICAgIi1tb3otYXBwZWFyYW5jZTpjaGVja2JveDsiICsKICAgICAgICAgICAgICAgICJwb3NpdGlvbjogc3RhdGljOyIgKwogICAgICAgICAgICAgICAgImNsaXA6IGF1dG87IiArCiAgICAgICAgICAgICAgICAib3BhY2l0eTogMTsiICsKICAgICAgICAgICAgICAgICJjdXJzb3I6IHBvaW50ZXI7IiArCiAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICIjcndsLWlxeGluLnJ3bC1hY3RpdmUtaXF4aW57IiArCiAgICAgICAgICAgICAgICAibGVmdDogMHB4OyIgKwogICAgICAgICAgICAgICAgInRyYW5zZm9ybTp0cmFuc2xhdGUoMCwwKTsiICsKICAgICAgICAgICAgICAgICJvcGFjaXR5OiAwLjk7IiArCiAgICAgICAgICAgICAgICAiaGVpZ2h0OiAzMnB4OyIgKwogICAgICAgICAgICAgICAgImxpbmUtaGVpZ2h0OiAzMnB4IiArCiAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICIjcndsLWlxeGluIGxhYmVseyIgKwogICAgICAgICAgICAgICAgIm1hcmdpbjowOyIgKwogICAgICAgICAgICAgICAgInBhZGRpbmc6MDsiICsKICAgICAgICAgICAgICAgICJmb250LXdlaWdodDo1MDA7IiArCiAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICIjcndsLWlxeGluICNyd2wtc2V0YnRueyIgKwogICAgICAgICAgICAgICAgIm1hcmdpbjogMCA0cHggMCAwOyIgKwogICAgICAgICAgICAgICAgInBhZGRpbmc6IDAgMCAwIDRweDsiICsKICAgICAgICAgICAgICAgICJib3JkZXI6IG5vbmU7IiArCiAgICAgICAgICAgICAgICAiYm9yZGVyLXJhZGl1czogMnB4OyIgKwogICAgICAgICAgICAgICAgImN1cnNvcjogcG9pbnRlcjsiICsKICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kOiAjZmZmOyIgKwogICAgICAgICAgICAgICAgImNvbG9yOiAjMDAwOyIgKwogICAgICAgICAgICAifSIgKwogICAgICAgICAgICAiICIKICAgICAgICAgICAgCiAgICAgICAgaWYoIXJ3bF91c2VyRGF0YS5hZGRCdG4pewogICAgICAgICAgICB2YXIgc3R5bGVUZW1wID0gIiNyd2wtaXF4aW57ZGlzcGxheTpub25lfSI7CiAgICAgICAgICAgIHN0eWxlLmlubmVySFRNTCA9IHN0eWxlSW5uZXIgKyBzdHlsZVRlbXA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3R5bGUuaW5uZXJIVE1MID0gc3R5bGVJbm5lcjsKICAgICAgICB9CiAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3J3bC1pcXhpbiIpKXsKICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIumAmui/h3N0eWxl5o+S5YWlIik7CiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyd2wtaXF4aW4iKS5hcHBlbmRDaGlsZChzdHlsZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIumAmui/h0dN5o+S5YWlIik7CiAgICAgICAgICAgIEdNX2FkZFN0eWxlKHN0eWxlSW5uZXIpOwogICAgICAgIH0KICAgIH07CgogICAgLy8g57uZ5oyJ6ZKu57uR5a6a54K55Ye75LqL5Lu2CiAgICBmdW5jdGlvbiBzZXRCdG5DbGljaygpeyAgCiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3J3bC1zZXRidG4iKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsc2V0TWVudSk7CiAgICB9CgogICAgLy8g6I+c5Y2VCiAgICAgZnVuY3Rpb24gc2V0TWVudSgpewogICAgICAgICAgICB2YXIgb2xkRWRpdEJveCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyd2wtc2V0TWVudSIpOwogICAgICAgICAgICBpZihvbGRFZGl0Qm94KXsKICAgICAgICAgICAgICAgIG9sZEVkaXRCb3gucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvbGRFZGl0Qm94KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdXNlclNldHRpbmcgPSBHTV9nZXRWYWx1ZSgicndsX3VzZXJEYXRhIik7CiAgICAgICAgICAgIHZhciB1cGxvYWRfY2hlY2tlZCA9IHVzZXJTZXR0aW5nLmNvbm5lY3RUb1RoZVNlcnZlcj8iY2hlY2tlZCI6IiI7CiAgICAgICAgICAgIHZhciBidG5jaGVja2VkID0gIHVzZXJTZXR0aW5nLmFkZEJ0bj8nY2hlY2tlZCc6JycKCiAgICAgICAgICAgIHZhciBvZG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgIG9kb20uaWQgPSAicndsLXNldE1lbnUiOwogICAgICAgICAgICBvZG9tLnN0eWxlLmNzc1RleHQgPSJwb3NpdGlvbjogZml4ZWQ7IiArCiAgICAgICAgICAgICAgICAidG9wOiAxMDBweDsiICsKICAgICAgICAgICAgICAgICJsZWZ0OiA1MHB4OyIgKwogICAgICAgICAgICAgICAgInBhZGRpbmc6IDEwcHg7IiArCiAgICAgICAgICAgICAgICAiYmFja2dyb3VuZDogI2ZmZjsiICsKICAgICAgICAgICAgICAgICJib3JkZXItcmFkaXVzOiA0cHg7IjsKICAgICAgICAgICAgR01fYWRkU3R5bGUoIiNyd2wtc2V0TWVudVNhdmUsIiArCiAgICAgICAgICAgICAgICAiI3J3bC1yZXNldCwiICsKICAgICAgICAgICAgICAgICIjcndsLXNldE1lbnVDbG9zZXsiICsKICAgICAgICAgICAgICAgICAgICAibWFyZ2luOiAwOyIgKwogICAgICAgICAgICAgICAgICAgICJwYWRkaW5nOiAwIDJweDsiICsKICAgICAgICAgICAgICAgICAgICAiYm9yZGVyOiBub25lOyIgKwogICAgICAgICAgICAgICAgICAgICJib3JkZXItcmFkaXVzOiAycHg7IiArCiAgICAgICAgICAgICAgICAgICAgImN1cnNvcjogcG9pbnRlcjsiICsKICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZDogI2ZmZjsiICsKICAgICAgICAgICAgICAgICAgICAiY29sb3I6ICMwMDA7IiArCiAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgIiNyd2wtcmVzZXR7IiArCiAgICAgICAgICAgICAgICAgICAgImJvcmRlcjogMXB4IHNvbGlkICM2NjY7IiArCiAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgIiNyd2wtc2V0TWVudVNhdmV7IiArCiAgICAgICAgICAgICAgICAgICAgImJvcmRlcjogMXB4IHNvbGlkIGdyZWVuOyIgKwogICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICIjcndsLXNldE1lbnVDbG9zZXsiICsKICAgICAgICAgICAgICAgICAgICAiYm9yZGVyOiAxcHggc29saWQgcmVkOyIgKwogICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICIjcndsLXNldE1lbnV7IiArCiAgICAgICAgICAgICAgICAgICAgInRleHQtYWxpZ246bGVmdDsiICsKICAgICAgICAgICAgICAgICAgICAiZm9udC1zaXplOjE0cHg7IiArCiAgICAgICAgICAgICAgICAgICAgInotaW5kZXg6OTk5OTk5OyIgKwogICAgICAgICAgICAgICAgICAgICJib3JkZXI6IDFweCBzb2xpZCBjb3JuZmxvd2VyYmx1ZTsiICsKICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAiI3J3bC1zZXRNZW51IHB7IiArCiAgICAgICAgICAgICAgICAgICAgIm1hcmdpbjo1cHggYXV0bzsiICsKICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAiICIpCiAgICAgICAgICAgIHZhciBpbm5lckggPSAiIiArCiAgICAgICAgICAgICAgICAiPHA+6Led56a76aG26YOo6Led56a777yI5Y2V5L2NIOWDj+e0oO+8iSA8aW5wdXQgaWQ9J3Bvc2l0aW9udG9wJyB0eXBlPSd0ZXh0JyB2YWx1ZT0iICsgdXNlclNldHRpbmcucG9zaXRpb25Ub3AgKyAiPjwvcD4iICsgIiIgKwogICAgICAgICAgICAgICAgLy8gIjxsYWJlcmw+IDxwPuWFgeiuuOS4iuS8oOm7keWQjeWNlTxpbnB1dCBpZD0ndXBsb2FkY2hlY2tlZCcgIHR5cGU9J2NoZWNrYm94JyAiICsgdXBsb2FkX2NoZWNrZWQgKyAiPjwvcD4iICsgIjwvbGFiZXJsPiIgKwogICAgICAgICAgICAgICAgIjxwIGlkPSdyd2wtc2hvcnRjdXRzJyB0aXRsZT0n5b+r5o236ZSuJz7lv6vmjbfplK7vvJoiICsKICAgICAgICAgICAgICAgICAgICAiPHNlbGVjdCBpZD0ncndsLXNob3J0Y3V0Jz4iICsKICAgICAgICAgICAgICAgICAgICAgICAgIjxvcHRpb24gdmFsdWU9J29mZiciICsgKHVzZXJTZXR0aW5nLnNob3J0Y3V0ID09IDA/InNlbGVjdGVkIjoiIikgICsgIj7lhbPpl608L29wdGlvbj4iICsKICAgICAgICAgICAgICAgICAgICAgICAgIjxvcHRpb24gdmFsdWU9J2YxJyIgKyAodXNlclNldHRpbmcuc2hvcnRjdXQgPT0gMT8ic2VsZWN0ZWQiOiIiKSAgKyAiPiBGMSA8L29wdGlvbj4iICsKICAgICAgICAgICAgICAgICAgICAgICAgIjxvcHRpb24gdmFsdWU9J2N0cmxmMSciICsgKHVzZXJTZXR0aW5nLnNob3J0Y3V0ID09IDI/InNlbGVjdGVkIjoiIikgICsgIj5jdHJsICsgRjE8L29wdGlvbj4iICsKICAgICAgICAgICAgICAgICAgICAgICAgIjxvcHRpb24gdmFsdWU9J2N0cmxjJyIgKyAodXNlclNldHRpbmcuc2hvcnRjdXQgPT0gMz8ic2VsZWN0ZWQiOiIiKSAgKyAiPmN0cmwgKyBDPC9vcHRpb24+IiArCiAgICAgICAgICAgICAgICAgICAgIjwvc2VsZWN0PiIgKwogICAgICAgICAgICAgICAgIjwvcD4gIiArCiAgICAgICAgICAgICAgICAiPGxhYmVybD4gPHA+5pi+56S65oyJ6ZKuPGlucHV0IGlkPSdidG5jaGVja2VkJyAgdHlwZT0nY2hlY2tib3gnICIgKyBidG5jaGVja2VkICsgIj4g54K55Ye76ISa5pys566h55CG5omp5bGV5Y+v5Lul5YaN5qyh5omT5byA6K6+572uPC9wPiIgKyAiPC9sYWJlcmw+IiArCiAgICAgICAgICAgICAgICAiPHA+6Zeu6aKY5Y+N6aaI5Zyw5Z2AOiA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcXhpbkdpdEh1Yi9SZW1vdmUtd2ViLWxpbWl0cy0nPkdpdEh1YihxeGluKTwvYT4sIDxhIGhyZWY9J2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy8yODQ5Ny1yZW1vdmUtd2ViLWxpbWl0cy1tb2RpZmllZCc+R3JlYXN5Rm9yayhxeGluKTwvYT4gIDwvUD4iICsKICAgICAgICAgICAgICAgICI8cD7pobnnm67ljp/kvZzogIXkuLogPGEgaHJlZj0naHR0cHM6Ly9jYXQ3MzczLmdpdGh1Yi5pby9yZW1vdmUtd2ViLWxpbWl0cy8nPmNhdDczNzM8L2E+LCA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vQ2F0NzM3My9yZW1vdmUtd2ViLWxpbWl0cyc+6aG555uu5Li76aG1PC9hPiA8L1A+IiArCiAgICAgICAgICAgICAgICAiPHA+5pys5Lq65Y+q5piv5Lia5L2Z5pe26Ze06L+b6KGM5LqG5L+u5pS577yM6K6p5YW26IO957un57ut5bel5L2cPC9QPiIgKwogICAgICAgICAgICAgICAgIjxwPiAgPC9QPiIgKwogICAgICAgICAgICAgICAgLy8gIjxwPjxzPuaYvuekuuaMiemSru+8iOW+hea3u+WKoO+8iTwvcz48L3A+IiArCiAgICAgICAgICAgICAgICAvLyAiPHA+PHM+5oyJ6ZKu6YCP5piO5bqm77yI5b6F5re75Yqg77yJPC9zPjwvcD4iICsKICAgICAgICAgICAgICAgIC8vICI8cD48cz7lv6vpgJ/lpI3liLbvvIjlvoXmt7vliqDvvIk8L3M+PC9wPiIgKwogICAgICAgICAgICAgICAgLy8gIjxwPjxzPuWFtuS7liAo5b6F5re75Yqg77yJPC9zPjwvcD4iICsKICAgICAgICAgICAgICAgICI8cD7mlbDmja7lrZjlgqjmlrnlvI/kuLpKU09OLOWmguiLpeWcqOatpOS/ruaUuSzms6jmhI/lvJXlj7fpgJflj7c8L1A+IiArCiAgICAgICAgICAgICAgICAiPHRleHRhcmVhIHdyYXA9J29mZicgY29scz0nNDUnIHJvd3M9JzIwJyBzdHlsZT0nb3ZlcmZsb3c6YXV0bztib3JkZXItcmFkaXVzOjRweDsnPiIgKyBKU09OLnN0cmluZ2lmeSh1c2VyU2V0dGluZy5kYXRhLGZhbHNlLDQpICsgIjwvdGV4dGFyZWE+IiArIAogICAgICAgICAgICAgICAgIjxicj4iICsKICAgICAgICAgICAgICAgICI8cXhpbmJ1dHRvbiBpZD0ncndsLXJlc2V0Jz7muIXnqbrorr7nva48L3F4aW5idXR0b24+ICZuYnNwOyZuYnNwOyZuYnNwOyIgKwogICAgICAgICAgICAgICAgIjxxeGluYnV0dG9uIGlkPSdyd2wtc2V0TWVudVNhdmUnPuS/neWtmDwvcXhpbmJ1dHRvbj4gJm5ic3A7Jm5ic3A7Jm5ic3A7IiArCiAgICAgICAgICAgICAgICAiPHF4aW5idXR0b24gaWQ9J3J3bC1zZXRNZW51Q2xvc2UnIG9uY2xpY2s9J3RoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucGFyZW50Tm9kZSk7JyB0aXRsZT0n5aaC5p6c5peg5rOV5YWz6ZetIOivt+WIt+aWsOeVjOmdoicgPuWFs+mXrTwvcXhpbmJ1dHRvbj4gJm5ic3A7Jm5ic3A7Jm5ic3A7IiArCiAgICAgICAgICAgICAgICAiPHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZTowLjdlbTsnPi0tfCBxeGluIHY0LjQuMCAyMDIwLTA4LTAzIHwtLTwvc3Bhbj4iICsKICAgICAgICAgICAgICAgICIiCiAgICAgICAgICAgICIiOwogICAgICAgICAgICBvZG9tLmlubmVySFRNTCA9IGlubmVySDsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvZG9tKTsKCiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyd2wtc2V0TWVudVNhdmUiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsc2F2ZVNldHRpbmcpOwogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcndsLXNldE1lbnVDbG9zZSIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixjbG9zZU1lbnUpOwogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcndsLXJlc2V0IikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHJ3bFJlc2V0KTsKCiAgICAgICAgfQoKICAgIC8vIOS/neWtmOmAiemhuQogICAgZnVuY3Rpb24gc2F2ZVNldHRpbmcoKXsKICAgICAgICB2YXIgcG9zaXRpb25Ub3AgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcndsLXNldE1lbnUgI3Bvc2l0aW9udG9wIikudmFsdWU7CiAgICAgICAgLy8gdmFyIHVwbG9hZENoZWNrZWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjcndsLXNldE1lbnUgI3VwbG9hZGNoZWNrZWQiKS5jaGVja2VkOwogICAgICAgIHZhciBzaG9ydGN1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyd2wtc2V0TWVudSAjcndsLXNob3J0Y3V0Iikuc2VsZWN0ZWRJbmRleDsKICAgICAgICB2YXIgYWRkQnRuQ2hlY2tlZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyd2wtc2V0TWVudSAjYnRuY2hlY2tlZCIpLmNoZWNrZWQ7CiAgICAgICAgdmFyIGNvZGV2YWx1ZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyd2wtc2V0TWVudSB0ZXh0YXJlYSIpLnZhbHVlOwogICAgICAgIGlmKGNvZGV2YWx1ZSl7CiAgICAgICAgICAgIHZhciB1c2VyU2V0dGluZyA9IEdNX2dldFZhbHVlKCJyd2xfdXNlckRhdGEiKTsKCiAgICAgICAgICAgIHVzZXJTZXR0aW5nLmFkZEJ0biA9IGFkZEJ0bkNoZWNrZWQ7CiAgICAgICAgICAgIHVzZXJTZXR0aW5nLmRhdGEgPSBKU09OLnBhcnNlKGNvZGV2YWx1ZSk7CiAgICAgICAgICAgIHVzZXJTZXR0aW5nLnBvc2l0aW9uVG9wID0gcGFyc2VJbnQocG9zaXRpb25Ub3ApOwogICAgICAgICAgICB1c2VyU2V0dGluZy5zaG9ydGN1dCA9IHBhcnNlSW50KHNob3J0Y3V0KTsKICAgICAgICAgICAgLy8gdXNlclNldHRpbmcuY29ubmVjdFRvVGhlU2VydmVyID0gdXBsb2FkQ2hlY2tlZDsKCiAgICAgICAgICAgIEdNX3NldFZhbHVlKCJyd2xfdXNlckRhdGEiLHVzZXJTZXR0aW5nKTsKICAgICAgICAgICAgLy8g5Yi35paw6aG16Z2iCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgfSwzMDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFsZXJ0KCLovpPlhaXkuLrnqboiKTsKICAgICAgICAgICAgLy8gdGhpcy5yZXNldCgpOwogICAgICAgIH0KICAgICAgICBjbG9zZU1lbnUoKTsKICAgIH0KICAgIC8vIOWkjeWOn+iPnOWNlQogICAgZnVuY3Rpb24gcndsUmVzZXQoKXsKICAgICAgICBHTV9kZWxldGVWYWx1ZSgicndsX3VzZXJEYXRhIik7CiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgfQoKICAgIC8v5YWz6Zet6I+c5Y2VCiAgICBmdW5jdGlvbiBjbG9zZU1lbnUoKXsKICAgICAgICB2YXIgb2xkRWRpdEJveCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyd2wtc2V0TWVudSIpOwogICAgICAgIGlmKG9sZEVkaXRCb3gpewogICAgICAgICAgICBvbGRFZGl0Qm94LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob2xkRWRpdEJveCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgLy8g5aKe5Yqg5ouW5ou95LqL5Lu2IOi/m+ihjOe7keWumgogICAgZnVuY3Rpb24gYWRkRHJhZ0V2ZW4oKXsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBkcmFnQnRuKCkKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiZHJhZ0J0buWHveaVsCDmiqXplJkiKTsKICAgICAgICAgICAgfQogICAgICAgIH0sMTAwMCkKICAgICAgICAvLyBkcmFnQnRuKCk7ICAvLyDlop7liqDmi5bliqjkuovku7YKICAgIH0KCiAgICAvLyDlop7liqDmi5bliqjkuovku7YgZnVuYwogICAgZnVuY3Rpb24gZHJhZ0J0bigpewogICAgICAgIHZhciByd2xfbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNyd2wtaXF4aW4iKTsKICAgICAgICByd2xfbm9kZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGZ1bmN0aW9uKGV2ZW50KXsKICAgICAgICAgICAgcndsX25vZGUuc3R5bGUudHJhbnNpdGlvbiA9ICJudWxsIjsKICAgICAgICAgICAgdmFyIGRpc1ggPSBldmVudC5jbGllbnRYIC0gcndsX25vZGUub2Zmc2V0TGVmdDsKICAgICAgICAgICAgdmFyIGRpc1kgPSBldmVudC5jbGllbnRZIC0gcndsX25vZGUub2Zmc2V0VG9wOwoKICAgICAgICAgICAgdmFyIG1vdmUgPSBmdW5jdGlvbihldmVudCl7CiAgICAgICAgICAgICAgICByd2xfbm9kZS5zdHlsZS5sZWZ0ID0gZXZlbnQuY2xpZW50WCAtIGRpc1ggKyAicHgiIDsKICAgICAgICAgICAgICAgIHJ3bF9ub2RlLnN0eWxlLnRvcCAgPSBldmVudC5jbGllbnRZIC0gZGlzWSArICJweCIgOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLG1vdmUpOwogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIixmdW5jdGlvbigpewogICAgICAgICAgICAgICAgcndsX25vZGUuc3R5bGUudHJhbnNpdGlvbiA9ICIwLjNzIjsKICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsbW92ZSk7CiAgICAgICAgICAgICAgICAvLyDmraTlh73mlbDlhoXmiYDmnInnmoTms6jph4ror63lj6Xpg73mmK/mnInnlKjnmoQKICAgICAgICAgICAgICAgICAgICAvLyDlvIDlkK/lkI4s5Y+v5ouW5Yqo5Yiw5bGP5bmV5Y+z5L6nLOS9huWwmuacqua3u+WKoGNzcwogICAgICAgICAgICAgICAgICAgIC8vIOWcqOS4iumdoua3u+WKoCByd2wtYWN0aXZlLWlxeGluIOeahOWcsOaWueWKoOS4iuWIpOaWreW3puWPsyzlnKjliqDkuIrnm7jlupTnmoRjc3PljbPlj68KICAgICAgICAgICAgICAgICAgICAvLyDmh5IgMjAxOC0wNC0xOCAyMTo1MTozMgogICAgICAgICAgICAgICAgLy8gdmFyIGJvZHlXaWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7CiAgICAgICAgICAgICAgICB2YXIgcndsX25vZGVXaWR0aCA9IHJ3bF9ub2RlLm9mZnNldExlZnQgKyByd2xfbm9kZS5vZmZzZXRXaWR0aC8yOwogICAgICAgICAgICAgICAgLy8gaWYocndsX25vZGVXaWR0aCA+IGJvZHlXaWR0aC8yKXsKICAgICAgICAgICAgICAgIC8vICAgICByd2xfbm9kZS5zdHlsZS5sZWZ0ID0gImF1dG8iOwogICAgICAgICAgICAgICAgLy8gICAgIHJ3bF9ub2RlLnN0eWxlLnJpZ2h0ID0gMDsKICAgICAgICAgICAgICAgIC8vICAgICByd2xfdXNlckRhdGEucG9zaXRpb25MZWZ0ID0gImF1dG8iOwogICAgICAgICAgICAgICAgLy8gICAgIHJ3bF91c2VyRGF0YS5wb3NpdGlvblJpZ2h0ID0gIjAiOwogICAgICAgICAgICAgICAgLy8gfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByd2xfbm9kZS5zdHlsZS5yaWdodCA9IHJ3bF91c2VyRGF0YS5wb3NpdGlvblJpZ2h0ID0gImF1dG8iOwogICAgICAgICAgICAgICAgICAgIHJ3bF9ub2RlLnN0eWxlLmxlZnQgPSByd2xfdXNlckRhdGEucG9zaXRpb25MZWZ0ID0gIDA7CiAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICByd2xfdXNlckRhdGEucG9zaXRpb25Ub3AgPSByd2xfbm9kZS5vZmZzZXRUb3A7CiAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgicndsX3VzZXJEYXRhIixyd2xfdXNlckRhdGEpOwoKICAgICAgICAgICAgfSkKICAgICAgICB9KQogICAgfQoKICAgIC8vIOWIneWni+WMliBpbml0IGZ1bmMgIOi/memHjOaJjeaYr+aguOW/gwogICAgZnVuY3Rpb24gaW5pdCgpIHsKICAgICAgICAvLyDpkojlr7nkuKrliKvnvZHnq5nph4flj5bkuI3lkIznmoTnrZbnlaUKICAgICAgICBydWxlID0gY2xlYXIoKTsKICAgICAgICAvLyDorr7nva4gZXZlbnQg5YiX6KGoCiAgICAgICAgaG9va19ldmVudE5hbWVzID0gcnVsZS5ob29rX2V2ZW50TmFtZXMuc3BsaXQoInwiKTsKICAgICAgICAvLyBUT0RPIEFsbG93ZWQgdG8gcmV0dXJuIHZhbHVlCiAgICAgICAgdW5ob29rX2V2ZW50TmFtZXMgPSBydWxlLnVuaG9va19ldmVudE5hbWVzLnNwbGl0KCJ8Iik7CiAgICAgICAgZXZlbnROYW1lcyA9IGhvb2tfZXZlbnROYW1lcy5jb25jYXQodW5ob29rX2V2ZW50TmFtZXMpOwoKICAgICAgICAvLyDosIPnlKjmuIXnkIYgRE9NMCBldmVudCDmlrnms5XnmoTlvqrnjq8KICAgICAgICBpZihydWxlLmRvbTApIHsKICAgICAgICAgICAgc2V0SW50ZXJ2YWwoY2xlYXJMb29wLCA1ICogMTAwMCk7CiAgICAgICAgICAgIHNldFRpbWVvdXQoY2xlYXJMb29wLCAxNTAwKTsKICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBjbGVhckxvb3AsIHRydWUpOwogICAgICAgICAgICBjbGVhckxvb3AoKTsKICAgICAgICB9CgogICAgICAgIC8vIGhvb2sgYWRkRXZlbnRMaXN0ZW5lciAvL+WvvOiHtOaQnOe0oui3s+i9rOWkseaViOeahOWOn+WboAogICAgICAgIGlmKHJ1bGUuaG9va19hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgICAgIEV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcjsKICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciA9IGFkZEV2ZW50TGlzdGVuZXI7CgogICAgICAgICAgICBpZihoYXNGcmFtZSl7CiAgICAgICAgICAgICAgICBmb3IobGV0IGkgPSAwO2k8aGFzRnJhbWUubGVuZ3RoO2krKyl7CiAgICAgICAgICAgICAgICAgICAgaGFzRnJhbWVbaV0uY29udGVudFdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyID0gYWRkRXZlbnRMaXN0ZW5lcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIC8vIGhvb2sgcHJldmVudERlZmF1bHQKICAgICAgICBpZihydWxlLmhvb2tfcHJldmVudERlZmF1bHQpIHsKICAgICAgICAgICAgRXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZihob29rX2V2ZW50TmFtZXMuaW5kZXhPZih0aGlzLnR5cGUpIDwgMCkgewogICAgICAgICAgICAgICAgICAgIEV2ZW50X3ByZXZlbnREZWZhdWx0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZihoYXNGcmFtZSl7CiAgICAgICAgICAgICAgICBmb3IobGV0IGkgPSAwO2k8aGFzRnJhbWUubGVuZ3RoO2krKyl7CiAgICAgICAgICAgICAgICAgICAgaGFzRnJhbWVbaV0uY29udGVudFdpbmRvdy5FdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaG9va19ldmVudE5hbWVzLmluZGV4T2YodGhpcy50eXBlKSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50X3ByZXZlbnREZWZhdWx0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBIb29rIHNldCByZXR1cm5WYWx1ZQogICAgICAgIGlmKHJ1bGUuaG9va19zZXRfcmV0dXJuVmFsdWUpIHsKICAgICAgICAgICAgRXZlbnQucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oJ3JldHVyblZhbHVlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZih0aGlzLnJldHVyblZhbHVlICE9PSB0cnVlICYmIGhvb2tfZXZlbnROYW1lcy5pbmRleE9mKHRoaXMudHlwZSkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuVmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIOa3u+WKoENTUyAgICAgLy8gY29uc29sZS5kZWJ1ZygndXJsOiAnICsgdXJsLCAnc3RvcmFnZU5hbWXvvJonICsgc3RvcmFnZU5hbWUsICdydWxlOiAnICsgcnVsZS5uYW1lKTsKICAgICAgICBpZihydWxlLmFkZF9jc3MpIHsKICAgICAgICAgICAgR01fYWRkU3R5bGUoJ2h0bWwsIDpub3QoW2NsYXNzKj0icndsLWV4ZW1wdCJdKSB7LXdlYmtpdC11c2VyLXNlbGVjdDp0ZXh0IWltcG9ydGFudDsgLW1vei11c2VyLXNlbGVjdDp0ZXh0IWltcG9ydGFudDt9IDpub3QoW2NsYXNzKj0icndsLWV4ZW1wdCJdKSA6OnNlbGVjdGlvbiB7Y29sb3I6I2ZmZjsgYmFja2dyb3VuZDojMzM5MEZGIWltcG9ydGFudDt9Jyk7CiAgICAgICAgfSAvL2Vsc2UgewogICAgICAgICAgICAvL0dNX2FkZFN0eWxlKCdodG1sLCA6bm90KFtjbGFzcyo9InJ3bC1leGVtcHQiXSkgey13ZWJraXQtdXNlci1zZWxlY3Q6dGV4dCFpbXBvcnRhbnQ7IC1tb3otdXNlci1zZWxlY3Q6dGV4dCFpbXBvcnRhbnQ7fScpOwogICAgICAgIC8vfQogICAgfQoKICAgIC8vIEhvb2sgYWRkRXZlbnRMaXN0ZW5lciBwcm9jCiAgICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGZ1bmMsIHVzZUNhcHR1cmUpIHsKICAgICAgICB2YXIgX2FkZEV2ZW50TGlzdGVuZXIgPSB0aGlzID09PSBkb2N1bWVudCA/IGRvY3VtZW50X2FkZEV2ZW50TGlzdGVuZXIgOiBFdmVudFRhcmdldF9hZGRFdmVudExpc3RlbmVyOwogICAgICAgIGlmKGhvb2tfZXZlbnROYW1lcy5pbmRleE9mKHR5cGUpID49IDApIHsKICAgICAgICAgICAgX2FkZEV2ZW50TGlzdGVuZXIuYXBwbHkodGhpcywgW3R5cGUsIHJldHVyblRydWUsIHVzZUNhcHR1cmVdKTsKICAgICAgICB9IGVsc2UgaWYodW5ob29rX2V2ZW50TmFtZXMuaW5kZXhPZih0eXBlKSA+PSAwKSB7CiAgICAgICAgICAgIHZhciBmdW5jc05hbWUgPSBzdG9yYWdlTmFtZSArIHR5cGUgKyAodXNlQ2FwdHVyZSA/ICd0JyA6ICdmJyk7CgogICAgICAgICAgICBpZih0aGlzW2Z1bmNzTmFtZV0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdGhpc1tmdW5jc05hbWVdID0gW107CiAgICAgICAgICAgICAgICBfYWRkRXZlbnRMaXN0ZW5lci5hcHBseSh0aGlzLCBbdHlwZSwgdXNlQ2FwdHVyZSA/IHVuaG9va190IDogdW5ob29rX2YsIHVzZUNhcHR1cmVdKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpc1tmdW5jc05hbWVdLnB1c2goZnVuYyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX2FkZEV2ZW50TGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICB9CgogICAgLy8g5riF55CG5b6q546vCiAgICBmdW5jdGlvbiBjbGVhckxvb3AoKSB7CiAgICAgICAgcnVsZSA9IGNsZWFyKCkgLy8g5a+55LqO5Yqo5oCB55Sf5oiQ55qE6IqC54K5LOmaj+aXtuajgOa1iwogICAgICAgIHZhciBlbGVtZW50cyA9IGdldEVsZW1lbnRzKCk7CgogICAgICAgIGZvcih2YXIgaSBpbiBlbGVtZW50cykgewogICAgICAgICAgZm9yKHZhciBqIGluIGV2ZW50TmFtZXMpIHsKICAgICAgICAgICAgdmFyIG5hbWUgPSAnb24nICsgZXZlbnROYW1lc1tqXTsKCiAgICAgICAgICAgIC8vIDs/5pyq6Kej5YazCiAgICAgICAgICAgICAgICAvLyAyMDE4LTA0LTAyIGVsZW1lbnRz5Lit5Lya5pyJ5a2X56ym5Liy5Ye6546wLOWOn+eJiOS4jeS8mizpl67popjkuI3mmI4s5qC55pys5Y6f5Zug5bCa5pyq6Kej5YazCiAgICAgICAgICAgICAgICAvLyDnm7jlhbPlj43ppoggIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vZm9ydW0vZGlzY3Vzc2lvbi8zNjAxNAogICAgICAgICAgICAgICAgLy8g6Zeu6aKY54mI5pys5Y+3ICB2My4wLjcKICAgICAgICAgICAgICAgIC8vIOmXrumimOihpeWFhSAgIOS5i+WJjeWPr+S7peS9v+eUqCzlhbfkvZPniYjmnKzmnKrmtYvvvIgyMDE4LTA0LTAyIDIxOjI3OjUz77yJLOWOn+eJiOWPr+S7peS9v+eUqAogICAgICAgICAgICBpZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZWxlbWVudHNbaV0pPT0iW29iamVjdCBTdHJpbmddIil7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZWxlbWVudHNbaV0pCiAgICAgICAgICAgIC8vIGlmKHR5cGVvZiBlbGVtZW50c1tpXVtuYW1lXSA9PT0gIm9iamVjdCIpewogICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2codHlwZW9mIGVsZW1lbnRzW2ldW25hbWVdKQogICAgICAgICAgICAvLyB9CiAgICAgICAgICAgIGlmKGVsZW1lbnRzW2ldW25hbWVdICE9PSBudWxsICYmIGVsZW1lbnRzW2ldW25hbWVdICE9PSBvbnh4eCkgewogICAgICAgICAgICAgICAgaWYodW5ob29rX2V2ZW50TmFtZXMuaW5kZXhPZihldmVudE5hbWVzW2pdKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHNbaV1bc3RvcmFnZU5hbWUgKyBuYW1lXSA9IGVsZW1lbnRzW2ldW25hbWVdOwogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzW2ldW25hbWVdID0gb254eHg7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlbGVtZW50c1tpXVtuYW1lXSA9IG51bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGRvY3VtZW50Lm9ubW91c2Vkb3duID0gZnVuY3Rpb24oKXtyZXR1cm4gdHJ1ZTt9OwogICAgfQoKICAgIC8vIOi/lOWbnnRydWXnmoTlh73mlbAKICAgIGZ1bmN0aW9uIHJldHVyblRydWUoZSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gdW5ob29rX3QoZSkgewogICAgICAgIHJldHVybiB1bmhvb2soZSwgdGhpcywgc3RvcmFnZU5hbWUgKyBlLnR5cGUgKyAndCcpOwogICAgfQogICAgZnVuY3Rpb24gdW5ob29rX2YoZSkgewogICAgICAgIHJldHVybiB1bmhvb2soZSwgdGhpcywgc3RvcmFnZU5hbWUgKyBlLnR5cGUgKyAnZicpOwogICAgfQogICAgZnVuY3Rpb24gdW5ob29rKGUsIHNlbGYsIGZ1bmNzTmFtZSkgewogICAgICAgIHZhciBsaXN0ID0gc2VsZltmdW5jc05hbWVdOwogICAgICAgIGZvcih2YXIgaSBpbiBsaXN0KSB7CiAgICAgICAgICAgIGxpc3RbaV0oZSk7CiAgICAgICAgfQoKICAgICAgICBlLnJldHVyblZhbHVlID0gdHJ1ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGZ1bmN0aW9uIG9ueHh4KGUpIHsKICAgICAgICB2YXIgbmFtZSA9IHN0b3JhZ2VOYW1lICsgJ29uJyArIGUudHlwZTsKICAgICAgICB0aGlzW25hbWVdKGUpOwoKICAgICAgICBlLnJldHVyblZhbHVlID0gdHJ1ZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyDojrflj5bmiYDmnInlhYPntKAg5YyF5ousZG9jdW1lbnQKICAgIGZ1bmN0aW9uIGdldEVsZW1lbnRzKCkgewogICAgICAgIHZhciBlbGVtZW50cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJykpOwogICAgICAgIGVsZW1lbnRzLnB1c2goZG9jdW1lbnQpOwoKICAgICAgICAvLyDlvqrnjq/miYDmnIkgZnJhbWUg56qX5Y+jCiAgICAgICAgdmFyIGZyYW1lcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImZyYW1lIikKICAgICAgICBpZihmcmFtZXMpewogICAgICAgICAgICBoYXNGcmFtZSA9IGZyYW1lczsKICAgICAgICAgICAgdmFyIGZyYW1lc19lbGVtZW50OwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDtpPGZyYW1lcy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgICAgIGZyYW1lc19lbGVtZW50ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJhbWVzW2ldLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiKiIpKQogICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaChmcmFtZXNbaV0uY29udGVudFdpbmRvdy5kb2N1bWVudCkKICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gZWxlbWVudHMuY29uY2F0KGZyYW1lc19lbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZWxlbWVudHM7CiAgICB9OwoKICAgIC8vIOiOt+WPlum7keWQjeWNlee9keermSBGdW5jCiAgICBmdW5jdGlvbiBnZXRfYmxhY2tfbGlzdCgpewogICAgICAgIC8vIOS5i+WJjeeJiOacrOWPr+iDveWvvOiHtOWtmOWCqOepuueahOWtl+espuS4sgogICAgICAgICAgICAvLyAyMDE4LTA2LTExIDE1OjExOjQ0IOS/neeVmSzlvZPlrrnplJnlpITnkIYKICAgICAgICB2YXIgZGF0YV90ZW1wID0gcndsX3VzZXJEYXRhLmRhdGE7CiAgICAgICAgZGF0YV90ZW1wID0gZGF0YV90ZW1wLmZpbHRlcihmdW5jdGlvbihpdGVtKXsKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmxlbmd0aD4xOwogICAgICAgICAgICB9KQogICAgICAgIHJldHVybiBkYXRhX3RlbXA7CiAgICB9CiAgICAKICAgIC8vIOajgOafpeaYr+WQpuWtmOWcqOS6jum7keWQjeWNleS4rSDov5Tlm57kvY3nva4gZnVuYwogICAgZnVuY3Rpb24gY2hlY2tfYmxhY2tfbGlzdChsaXN0LGhvc3QpewogICAgICAgIGZvcihsZXQgaT0wO2k8bGlzdC5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgaWYofmhvc3RuYW1lLmluZGV4T2YobGlzdFtpXSkpewogICAgICAgICAgICAgICAgcmV0dXJuIGkrMTsgIC8v5LiH5LiA5Yy56YWN5Yiw56ys5LiA5LiqLOi/lOWbnjAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8g6byg5qCH54K55Ye75ZCO5oyJ6ZKu5ZCOIOajgOafpeaYr+WQpuWcqOm7keWQjeWNlQogICAgZnVuY3Rpb24gYmxhY2tfY2hlY2soYm9vbCl7CiAgICAgICAgdmFyIGxpc3QgPSBHTV9nZXRWYWx1ZSgicndsX3VzZXJEYXRhIikuZGF0YQogICAgICAgIHZhciBjaGVjayA9IGNoZWNrX2JsYWNrX2xpc3QobGlzdCxob3N0bmFtZSk7CgogICAgICAgIGlmIChib29sICYmICFjaGVjaykgewogICAgICAgICAgICBsaXN0ID0gbGlzdC5jb25jYXQoaG9zdG5hbWUpOwogICAgICAgICAgICAvLyBjb25zb2xlLmxvZygi6YCJ5LitIOS4jeWcqOm7keWQjeWNlSwg5aKe5YqgIixob3N0bmFtZSxsaXN0KTsKICAgICAgICAgICAgcndsX3VzZXJEYXRhLndhaXRVcGxvYWQucHVzaChob3N0bmFtZSk7IC8v5YeG5aSH5LiK5LygCiAgICAgICAgICAgIHJ3bF91c2VyRGF0YS5jdXJyZW50VVJMID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJhZnRlcjogIixyd2xfdXNlckRhdGEud2FpdFVwbG9hZCkKCiAgICAgICAgICAgIHNhdmVEYXRhKGxpc3QpOwogICAgICAgICAgICBpbml0KCk7CgogICAgICAgIH1lbHNlIGlmKCFib29sICYmIGNoZWNrKXsKICAgICAgICAgICAgbGlzdC5zcGxpY2UoY2hlY2stMSwxKTsKICAgICAgICAgICAgc2F2ZURhdGEobGlzdCk7CiAgICAgICAgICAgIC8vIOWIt+aWsOmhtemdogogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuWIt+aWsOmhtemdomxvYWRpbmciKTsKICAgICAgICAgICAgfSwzNTApOwogICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOS/neWtmOacrOWcsOaVsOaNrizlubblsIbmlbDmja7kuIrkvKDoh7PmnI3liqHlmagKICAgIGZ1bmN0aW9uIHNhdmVEYXRhKGxpc3RzKXsKICAgICAgICBsaXN0cyA9IGxpc3RzLmZpbHRlcihmdW5jdGlvbihpdGVtKXsKICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubGVuZ3RoPjE7CiAgICAgICAgfSkKCiAgICAgICAgLy8g5pu05paw5pWw5o2uCiAgICAgICAgcndsX3VzZXJEYXRhLmRhdGEgPSBsaXN0cy5zb3J0KCk7CgogICAgICAgIC8vIOWwhuacrOWcsOm7keWQjeWNleS4iuS8oAogICAgICAgIC8vIGlmIChyd2xfdXNlckRhdGEud2FpdFVwbG9hZC5sZW5ndGggPiAwICYmIHJ3bF91c2VyRGF0YS5jb25uZWN0VG9UaGVTZXJ2ZXIpewogICAgICAgIC8vICAgICAvLyBjb25zb2xlLmxvZygicndsIDog5LiK5LygLi4uIixyd2xfdXNlckRhdGEud2FpdFVwbG9hZCk7CiAgICAgICAgLy8gICAgIC8vIGNvbnNvbGUubG9nKCJyd2wgOiDlvIDlp4vkuIrkvKAtLS0tLSIpOwogICAgICAgIC8vICAgICBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgLy8gICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgLy8gICAgICAgLy8gdXJsOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwL3Rvb2wvdGVzdGFqYXgvIiwKICAgICAgICAvLyAgICAgICB1cmw6ICJodHRwOi8vZWVtbS5tZS90b29sL3J3bF91cGxvYWQvIiwKICAgICAgICAvLyAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShyd2xfdXNlckRhdGEpLAogICAgICAgIC8vICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAvLyAgICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIgogICAgICAgIC8vICAgICAgIH0sCiAgICAgICAgLy8gICAgICAgb25sb2FkOiBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgIC8vICAgICAgICAgLy8gY29uc29sZS5sb2coInJ3bCA6IOS4iuS8oOaIkOWKny0tLS0iKTsKICAgICAgICAvLyAgICAgICB9CiAgICAgICAgLy8gICAgIH0pOwogICAgICAgIC8vICAgICByd2xfdXNlckRhdGEud2FpdFVwbG9hZCA9IFtdOwogICAgICAgIC8vIH0KCiAgICAgICAgR01fc2V0VmFsdWUoInJ3bF91c2VyRGF0YSIscndsX3VzZXJEYXRhKTsKICAgICAgICByZXR1cm4gcndsX3VzZXJEYXRhOwogICAgfQoKICAgIC8vIOaVsOe7hOWOu+mHjQogICAgZnVuY3Rpb24gdW5pcXVlKGFycikgewogICAgICB2YXIgcmV0ID0gW10KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgaXRlbSA9IGFycltpXQogICAgICAgIGlmIChyZXQuaW5kZXhPZihpdGVtKSA9PT0gLTEpIHsKICAgICAgICAgIHJldC5wdXNoKGl0ZW0pCiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXQ7CiAgICB9CgogICAgLy8g5aSN5Yi25Yiw5Ymq6LS05p2/CiAgICBmdW5jdGlvbiBzZXRDbGlwYm9hcmQoKXsKICAgICAgICB2YXIgdGV4dF9vYmogPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgdmFyIHRleHQgPSB0ZXh0X29iai50b1N0cmluZygpOwogICAgICAgIEdNX3NldENsaXBib2FyZCh0ZXh0KTsKCiAgICB9CgogICAgLy8g5b+r5o236ZSuIEYx77yIY3RybCtmMe+8iSDlpI3liLYgCiAgICBmdW5jdGlvbiBob3RrZXkoKSB7CiAgICAgICAgdmFyIGEgPSB3aW5kb3cuZXZlbnQua2V5Q29kZTsKICAgICAgICAvLyBpZiAoKGEgPT0gMTEyKSAmJiAoZXZlbnQuY3RybEtleSkpIHsKICAgICAgICBpZiAoYSA9PSAxMTIgJiYgdXNlclNldHRpbmcuc2hvcnRjdXQgPT0gMSkgewogICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBzZXRDbGlwYm9hcmQoKTsKICAgICAgICAgICAgZXZlbnQua2V5Q29kZT0wOwogICAgICAgICAgICBldmVudC5yZXR1cm5WYWx1ZT1mYWxzZTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAKICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMTEyICYmIChldmVudC5jdHJsS2V5KSAmJiB1c2VyU2V0dGluZy5zaG9ydGN1dCA9PSAyKXsKICAgICAgICAgICAgc2V0Q2xpcGJvYXJkKCk7CiAgICAgICAgfSBlbHNlIGlmKChhID09IDY3KSAmJiAoZXZlbnQuY3RybEtleSkgJiYgdXNlclNldHRpbmcuc2hvcnRjdXQgPT0gMyl7CiAgICAgICAgICAgIHNldENsaXBib2FyZCgpOwogICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIuWFs+mXreS6huW/q+aNt+mUriIpOwogICAgICAgIH0KICAgIH0gCiAgICBkb2N1bWVudC5vbmtleWRvd24gPSBob3RrZXk7IC8v5b2Tb25rZXlkb3duIOS6i+S7tuWPkeeUn+aXtuiwg+eUqGhvdGtleeWHveaVsCAgCgogICAgLy8g6YOo5YiG572R56uZ6YeH55So5LqG5YW25LuW55qE6Ziy5aSN5Yi25omL5q61CiAgICBmdW5jdGlvbiBjbGVhcigpewogICAgICAgIC8vIGNvbnNvbGUubG9nKCLov5vlhaVjbGVhciIsaG9zdG5hbWUscndsX3VzZXJEYXRhLnJ1bGVzKTsKICAgICAgICBzd2l0Y2ggKGhvc3RuYW1lKXsKICAgICAgICAgICAgY2FzZSAid3d3LnozejQuY29tIjogY2xlYXJfY292ZXJzKCIubW92aWVkb3duYWRkaXYiKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgImh1YXl1LmJhaWR1LmNvbSI6IGNsZWFyX2NvdmVycygiI2pxQ29udGV4dE1lbnUiKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInd3dy5teWh0bG1lYm9vay5jb20iOiBjbGVhcl9jb3ZlcnMoImltZy5mdWxsaW1nIik7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJ6aGlodS5jb20iOgogICAgICAgICAgICBjYXNlICJ3d3cuemhpaHUuY29tIjogcmV0dXJuIHJ3bF91c2VyRGF0YS5ydWxlcy5ydWxlX3poaWh1OyBicmVhazsKICAgICAgICAgICAgY2FzZSAidC5iaWxpYmlsaS5jb20iOiBjbGVhcl9saW5rX2JpbGliaWxpKCk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJ3d3cudXNsc29mdHdhcmUuY29tIjogY2xlYXJfY292ZXJzKCIucHJvdGVjdF9jb250ZW50cy1vdmVybGF5Iik7Y2xlYXJfY292ZXJzKCIucHJvdGVjdF9hbGVydCIpOyByZXR1cm4gcndsX3VzZXJEYXRhLnJ1bGVzLnJ1bGVfcGx1czsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInd3dy5sb25nbWFib29rY24uY29tIjogY2xlYXJfY292ZXJzKCIuZnVsbGltZyIpOyByZXR1cm4gcndsX3VzZXJEYXRhLnJ1bGVzLnJ1bGVfcGx1czsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgInd3dy5zaGFuZ2MubmV0IjogcmV0dXJuIHJ3bF91c2VyRGF0YS5ydWxlcy5ydWxlX3BsdXM7IGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcndsX3VzZXJEYXRhLnJ1bGVzLnJ1bGVfZGVmOwogICAgfQogICAgLy8g5Y676Zmk6KaG55uW5bGCCiAgICBmdW5jdGlvbiBjbGVhcl9jb3ZlcnMoZWxlKXsKICAgICAgICB2YXIgb2RpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlKTsKICAgICAgICBpZihvZGl2KXsKICAgICAgICAgICAgb2Rpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9kaXYpOwogICAgICAgIH0KICAgIH0KICAgIC8vIGLnq5nlsIbmloflrZfltYzlpZflnKjpk77mjqXkuK0KICAgIGZ1bmN0aW9uIGNsZWFyX2xpbmtfYmlsaWJpbGkoKXsKICAgICAgICB2YXIgb2RpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5kZXNjcmlwdGlvbiIpOwogICAgICAgIGlmKG9kaXYpewogICAgICAgICAgICB2YXIgdERpdiA9IG9kaXYucXVlcnlTZWxlY3RvcigiLmNvbnRlbnQtZWxsaXBzaXMiKTsKICAgICAgICAgICAgdmFyIGFEaXYgPSBvZGl2LnF1ZXJ5U2VsZWN0b3IoImEiKTsKICAgICAgICAgICAgIG9kaXYuYXBwZW5kQ2hpbGQodERpdik7CiAgICAgICAgfQogICAgfQoKICAgIC8vIDMueC54IOi/h+a4oSA0LngueCDniYjmnKwKICAgIGZ1bmN0aW9uIHZlcnNpb25fdXBfM190b180KCl7CiAgICAgICAgdmFyIG9sZF92ZXJzaW9uID0gR01fZ2V0VmFsdWUoImJsYWNrX2xpc3QiKTsKICAgICAgICBpZighb2xkX3ZlcnNpb24pe3JldHVybn07CiAgICAgICAgcndsX3VzZXJEYXRhLmRhdGEgPSB1bmlxdWUocndsX3VzZXJEYXRhLmRhdGEuY29uY2F0KG9sZF92ZXJzaW9uLmRhdGEpKTsKICAgICAgICBHTV9zZXRWYWx1ZSgicndsX3VzZXJEYXRhIixyd2xfdXNlckRhdGEpOwoKICAgICAgICBHTV9kZWxldGVWYWx1ZSgiYmxhY2tfbGlzdCIpOwogICAgICAgIEdNX2RlbGV0ZVZhbHVlKCJyd2xfdXNlcmRhdGEiKTsKICAgIH0KfSkoKTsg"},{"name":"吾爱破解论坛_百度网盘链接激活 && 提取码自动补全","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_prototypes":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_excludes":["*://www.52pojie.cn/forum.php?mod=post&action=newthread*","*://www.52pojie.cn/forum.php?mod=post&action=edit*"],"orig_includes":[],"orig_matches":["*://www.52pojie.cn/*","*://pan.baidu.com/share/*","*://www.lanzous.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":["pan.baidu.com"],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"tab_types":null},"storage":{"ts":1624620458103,"data":{}},"enabled":true,"position":3,"file_url":"https://greasyfork.org/scripts/30117-%E5%90%BE%E7%88%B1%E7%A0%B4%E8%A7%A3%E8%AE%BA%E5%9D%9B-%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E9%93%BE%E6%8E%A5%E6%BF%80%E6%B4%BB-%E6%8F%90%E5%8F%96%E7%A0%81%E8%87%AA%E5%8A%A8%E8%A1%A5%E5%85%A8/code/%E5%90%BE%E7%88%B1%E7%A0%B4%E8%A7%A3%E8%AE%BA%E5%9D%9B_%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98%E9%93%BE%E6%8E%A5%E6%BF%80%E6%B4%BB%20%20%E6%8F%90%E5%8F%96%E7%A0%81%E8%87%AA%E5%8A%A8%E8%A1%A5%E5%85%A8.user.js","uuid":"7c9db904-99e0-43c9-bb91-746133bd12bd","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQGljb24gICAgICAgICBodHRwOi8vcGFuLmJhaWR1LmNvbS9ib3gtc3RhdGljL2Rpc2stc3lzdGVtL2ltYWdlcy9mYXZpY29uLmljbwovLyBAbmFtZSAgICAgICAgIOWQvueIseegtOino+iuuuWdm1/nmb7luqbnvZHnm5jpk77mjqXmv4DmtLsgJiYg5o+Q5Y+W56CB6Ieq5Yqo6KGl5YWoCi8vIEBuYW1lc3BhY2UgICAgNTJwb2ppZV9wYW5fYXV0b2NvbXBsZXRpb24KLy8gQGF1dGhvciAgICAgICDnjI7pmrzkuLbmraLmiIg8MTY0OTk5MTkwNUBxcS5jb20+44CBU3BhY2U8Mjk0NjE5MDI3QHFxLmNvbT4KLy8gQGRlc2NyaXB0aW9uICDmv4DmtLvlkL7niLHnoLTop6PorrrlnZvkuK3nmoTnvZHnm5jpk77mjqXvvIzlubboh6rliqjooaXlhajmj5Dlj5bnoIHnhLblkI7ot7PovazliLDliIbkuqvlnLDlnYAKLy8gQHN1cHBvcnRVUkwgICBodHRwczovL2dpdGVlLmNvbS9ubjIwMDQzMy9zY3JpcHRfc3luY2hyb25pemF0aW9uL3RyZWUvbWFzdGVyLyVFNyVCRCU5MSVFNyU5QiU5OCVFOCU4NCU5QSVFNiU5QyVBQwovLyBAZXhjbHVkZSAgICAgICo6Ly93d3cuNTJwb2ppZS5jbi9mb3J1bS5waHA/bW9kPXBvc3QmYWN0aW9uPW5ld3RocmVhZCoKLy8gQGV4Y2x1ZGUgICAgICAqOi8vd3d3LjUycG9qaWUuY24vZm9ydW0ucGhwP21vZD1wb3N0JmFjdGlvbj1lZGl0KgovLyBAbWF0Y2ggICAgICAgICo6Ly93d3cuNTJwb2ppZS5jbi8qCi8vIEBtYXRjaCAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vc2hhcmUvKgovLyBAbWF0Y2ggICAgICAgICo6Ly93d3cubGFuem91cy5jb20vKgovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vY2RuLmJvb3Rjc3MuY29tL2pxdWVyeS8xLjguMy9qcXVlcnkubWluLmpzCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9jZG4uYm9vdGNzcy5jb20vanF1ZXJ5LWNvb2tpZS8xLjQuMS9qcXVlcnkuY29va2llLm1pbi5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vY2RuLmJvb3Rjc3MuY29tL2xpbW9udGUtc3dlZXRhbGVydDIvNy4yOC41L3N3ZWV0YWxlcnQyLmFsbC5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vZGFya21vZGUtanNAMS40LjAvbGliL2Rhcmttb2RlLWpzLm1pbi5qcwovLyBAdmVyc2lvbiAgICAgIDAuMS4zLjUKLy8gQGdyYW50ICAgICAgICB1bnNhZmVXaW5kb3cKLy8gQGdyYW50ICAgICAgICBHTV9hZGRTdHlsZQovLyBAZ3JhbnQgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0Ci8vID09L1VzZXJTY3JpcHQ9PQooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8g6Ieq5a6a5LmJQ1NT5qC35byPLeW8gOWniyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgLyog5paH56ug5YaF6YOo6ZO+5o6lQ1NTICovCiAgICBHTV9hZGRTdHlsZSgnLm15X2JhaWR1X2xpbmt7cGFkZGluZzoycHggMnB4O3RleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50O2JhY2tncm91bmQ6ICNmZmYhaW1wb3J0YW50O2NvbG9yOiAjMDBiZmZmIWltcG9ydGFudDtib3JkZXI6IDFweCBzb2xpZCAjMDBiZmZmO2JvcmRlci1yYWRpdXM6IDZweDt0cmFuc2l0aW9uOiAuM3MgYmFja2dyb3VuZCBsaW5lYXIsLjJzIGNvbG9yIGxpbmVhcjt9Lm15X2JhaWR1X2xpbms6aG92ZXJ7cGFkZGluZzoycHggMnB4O3RleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50O2JhY2tncm91bmQ6ICMwMGJmZmYhaW1wb3J0YW50O2NvbG9yOiAjZmZmIWltcG9ydGFudDtib3JkZXI6IDFweCBzb2xpZCAjMDBiZmZmO2JvcmRlci1yYWRpdXM6IDZweDt0cmFuc2l0aW9uOiAuM3MgYmFja2dyb3VuZCBsaW5lYXIsLjJzIGNvbG9yIGxpbmVhcjt9Jyk7CiAgICBHTV9hZGRTdHlsZSgnLm15X2JhaWR1X2xpbmtfZGVzdHJveSB7Y3Vyc29yOiBub3QtYWxsb3dlZDt0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaCAhaW1wb3J0YW50O2NvbG9yOiAjZmY2YjY4ICFpbXBvcnRhbnQ7Ym9yZGVyOiAxcHggc29saWQgI2ZmNmI2ODt9Jyk7CgogICAgLyog6KGo5qC8Q1NTICovCiAgICBHTV9hZGRTdHlsZSgnLmp6Y291bnR7YmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMjQwcHggIWltcG9ydGFudDt9Lmp6Y291bnQ6aG92ZXJ7YmFja2dyb3VuZC1wb3NpdGlvbjogLTQwcHggLTI0MHB4ICFpbXBvcnRhbnQ7fScpOwogICAgR01fYWRkU3R5bGUoJ3RhYmxlLm15X2JhaWR1X2xpbmtfdGFibGUge21hcmdpbjogMCBhdXRvO30nKTsKICAgIEdNX2FkZFN0eWxlKCcubXlfYmFpZHVfbGlua190YWJsZT50Ym9keT50cj50ZCwgLm15X2JhaWR1X2xpbmtfdGFibGU+dGJvZHk+dHI+dGgsIC5teV9iYWlkdV9saW5rX3RhYmxlPnRmb290PnRyPnRkLCAubXlfYmFpZHVfbGlua190YWJsZT50Zm9vdD50cj50aCwgLm15X2JhaWR1X2xpbmtfdGFibGU+dGhlYWQ+dHI+dGQsIC5teV9iYWlkdV9saW5rX3RhYmxlPnRoZWFkPnRyPnRoIHtwYWRkaW5nOiAxMHB4O2xpbmUtaGVpZ2h0OiAxLjQyODU3MTQzO3ZlcnRpY2FsLWFsaWduOiB0b3A7Ym9yZGVyOiAxcHggc29saWQgI0Y1RjVGNTt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojM0Y1MUI1ICFpbXBvcnRhbnR9Jyk7CiAgICBHTV9hZGRTdHlsZSgnLm15X2JhaWR1X2xpbmtfdGFibGU+dGJvZHk+dHI+dGQ+YSwgLm15X2JhaWR1X2xpbmtfdGFibGU+dGJvZHk+dHI+dGg+YSwgLm15X2JhaWR1X2xpbmtfdGFibGU+dGZvb3Q+dHI+dGQ+YSwgLm15X2JhaWR1X2xpbmtfdGFibGU+dGZvb3Q+dHI+dGg+YSwgLm15X2JhaWR1X2xpbmtfdGFibGU+dGhlYWQ+dHI+dGQ+YSwgLm15X2JhaWR1X2xpbmtfdGFibGU+dGhlYWQ+dHI+dGg+YSB7Y29sb3I6ICMwMGJmZmYvKiAhaW1wb3J0YW50ICovOy8qIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OyAqL30nKTsKCiAgICAvKiDlj7PkvqfmjInpkq5DU1MgKi8KICAgIEdNX2FkZFN0eWxlKCcjcGFuY291bnR7Zm9udC1zaXplOiAyNXB4O2ZvbnQtd2VpZ2h0OiBib2xkO2xpbmUtaGVpZ2h0OiAzOHB4ICFpbXBvcnRhbnQ7Y29sb3I6ICNmZmYgIWltcG9ydGFudDtib3JkZXI6IDFweCBzb2xpZCAjMDBiZmZmO2JvcmRlci1yYWRpdXM6IDUwcHg7YmFja2dyb3VuZDogIzIxOTZGMyAhaW1wb3J0YW50O2JveC1zaGFkb3c6IDAgMnB4IDJweCAwIHJnYmEoMCwwLDAsMC4xMiksIDAgM3B4IDFweCAtMnB4IHJnYmEoMCwwLDAsMC4wNiksIDAgMXB4IDVweCAwIHJnYmEoMCwwLDAsMC4xMik7dHJhbnNpdGlvbjogLjNzIGJhY2tncm91bmQgbGluZWFyLC4ycyBjb2xvciBsaW5lYXI7fScpCiAgICBHTV9hZGRTdHlsZSgnI3BhbmNvdW50OmhvdmVye2JhY2tncm91bmQ6ICM1MzUyZWQgIWltcG9ydGFudDt0cmFuc2l0aW9uOiAuM3MgYmFja2dyb3VuZCBsaW5lYXIsLjJzIGNvbG9yIGxpbmVhcjt9JykKICAgIEdNX2FkZFN0eWxlKCcuanpjb3VudCA+IC5jbG91ZF9fbG9nby1kZWwge3Bvc2l0aW9uOiByZWxhdGl2ZTtyaWdodDogLTEwMDAwcHg7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHRyYW5zcGFyZW50O2ZpbHRlcjogZHJvcC1zaGFkb3coLTEwMDAwcHggMCAjZmZmKTt9JykKCiAgICAvKiDpgInmi6nmoYZDU1MgKi8KICAgIEdNX2FkZFN0eWxlKCIucGFuX25vdGljZV9sYWJlbHtkaXNwbGF5OmlubGluZS1ibG9jazt0b3A6IDRweDt3aWR0aDozNHB4O2hlaWdodDoxOHB4O2JhY2tncm91bmQ6I2NjYztib3JkZXItcmFkaXVzOjMwcHg7Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC10cmFuc2l0aW9uOi4zcyBlYXNlO3RyYW5zaXRpb246LjNzIGVhc2V9LnBhbl9ub3RpY2VfbGFiZWw6YWZ0ZXJ7Y29udGVudDonJztkaXNwbGF5OmJsb2NrO3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Ym9yZGVyLXJhZGl1czoxMDAlO2JhY2tncm91bmQ6I2ZmZjtib3gtc2hhZG93OjAgMXB4IDFweCByZ2JhKDAsMCwwLC4xKTtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjFweDt0b3A6MXB4Oy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7LXdlYmtpdC10cmFuc2l0aW9uOi4zcyBlYXNlO3RyYW5zaXRpb246LjNzIGVhc2V9LnBhbl9ub3RpY2Vfc2xpZGV7d2lkdGg6NTBweDtoZWlnaHQ6MjBweH0ucGFuX25vdGljZV9zbGlkZSBpbnB1dDpjaGVja2VkK2xhYmVse2JhY2tncm91bmQ6IzM0YmY0OTt0cmFuc2l0aW9uOi4zcyBlYXNlO30ucGFuX25vdGljZV9zbGlkZSBpbnB1dDpjaGVja2VkK2xhYmVsOmFmdGVye2xlZnQ6MTdweH0iKQoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8g6Ieq5a6a5LmJQ1NT5qC35byPLee7k+adnyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8g5YWo5bGA5Y+Y6YePLeW8gOWniyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgdmFyIFBMVUdJTl9OQU1FID0gJ+WQvueIseegtOino+iuuuWdm1/nmb7luqbnvZHnm5jpk77mjqXmv4DmtLsgJiYg5o+Q5Y+W56CB6Ieq5Yqo6KGl5YWoJzsKICAgIHZhciBsb2NhdGlvbiA9IHNlbGYubG9jYXRpb247CiAgICB2YXIgbG9jYXRpb25fcGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTsKCiAgICAvLyDpk77mjqUKICAgIHZhciBwYW5MaW5rcyA9IG5ldyBBcnJheTsKCiAgICAvLyDpk77mjqXmlbDph48KICAgIHZhciBwYW5MaW5rc0NvdW50cyA9IG5ldyBBcnJheTsKCiAgICAvLyDpk77mjqXlr4bnoIEKICAgIHZhciBwYW5MaW5rc1Bhc3N3b3JkID0gbmV3IEFycmF5OwoKICAgIC8vIOaPkOWPlueggeato+WImQogICAgdmFyIHBhblB3ZFBhdHRlcm4gPSAvXHMqW14o6Kej5Y6LfOWOi+e8qSldKOWvhnzmj5Dlj5Yp56CBW++8mjpdP1sgQS1aYS16MC05XSsvZzsKCiAgICAvLyDliKDpmaRodG1s5qCH562+5q2j5YiZCiAgICB2YXIgaHRtbFRhZ1BhdHRlcm4gPSAvPCgiW14iXSoifCdbXiddKid8W14nIj5dKSo+L2c7CgogICAgLy8g5o6S6Zmk5paH5a2XCiAgICB2YXIgZXhjbHVkZV9hcnJheSA9IFsn5L2/55So6K665Z2b6ZmE5Lu25LiK5Lyg5qC35pys5Y6L57yp5YyF5pe25b+F6aG75L2/55So5Y6L57yp5a+G56CB5L+d5oqk77yM5Y6L57yp5a+G56CBOjUycG9qaWXvvIzlkKbliJnkvJrlr7zoh7TorrrlnZvooqvmnYDmr5Lova/ku7bnrYnor6/miqXvvIzorrrlnZvmnInmnYPpmo/ml7bliKDpmaTnm7jlhbPpmYTku7blkozluJblrZDvvIEnXTsKCiAgICAvLyDlkI7nu61yZXF1aXJl5peg5rOV5byV5YWl5o+S5Lu25pe277yM5Zyo5q2k5byV5YWl56ys5LiJ5pa55o+S5Lu2CiAgICB2YXIgUkVRVUlSRV9BUlJBWSA9IFt7CiAgICAgICAgbmFtZTogJ25vdGkuanMnLAogICAgICAgIGRlc2NyaXB0aW9uOiAn5ZC+54ixanPpgJrnn6Xmj5Lku7YnLAogICAgICAgIHVybDogJ2h0dHBzOi8vd3d3LjUycG9qaWUuY24vc291cmNlL3BsdWdpbi9ub3RpL3RlbXBsYXRlL25vdGkuanMnCiAgICB9XTsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIOWFqOWxgOWPmOmHjy3nu5PmnZ8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8g6Ieq5a6a5LmJ5Ye95pWwLeW8gOWniyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgLyoqCiAgICAgKiDmjqfliLblj7DosIPor5XovpPlh7rmoLflvI8g6K2m5ZGK5qC35byPCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBb6KaB5Yqg5qC35byP55qE5YaF5a65XQogICAgICovCiAgICB2YXIgV2FybmluZyA9IGZ1bmN0aW9uIChzdHJpbmcpIHsKICAgICAgICBjb25zb2xlLmxvZygnJWMgWyFdICcgKyBzdHJpbmcsICdjb2xvcjojRkY5ODAwO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zaXplOjEycHgnKTsKICAgIH0KCiAgICAvKioKICAgICAqIOaOp+WItuWPsOiwg+ivlei+k+WHuuagt+W8jyDlh7rplJnmoLflvI8KICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIFvopoHliqDmoLflvI/nmoTlhoXlrrldCiAgICAgKi8KICAgIHZhciBFcnJvciA9IGZ1bmN0aW9uIChzdHJpbmcpIHsKICAgICAgICBjb25zb2xlLmxvZygnJWMgWyFdICcgKyBzdHJpbmcsICdjb2xvcjojRkY1NzIyO2ZvbnQtd2VpZ2h0OmJvbGQ7Zm9udC1zaXplOjEycHgnKTsKICAgIH0KCiAgICAvKioKICAgICAqIOaOp+WItuWPsOiwg+ivlei+k+WHuuagt+W8jyDmiJDlip/moLflvI8KICAgICAqCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIFvopoHliqDmoLflvI/nmoTlhoXlrrldCiAgICAgKi8KICAgIHZhciBTdWNjZXNzID0gZnVuY3Rpb24gKHN0cmluZykgewogICAgICAgIGNvbnNvbGUubG9nKCclYyBbIV0gJyArIHN0cmluZywgJ2NvbG9yOiM4QkMzNEE7Zm9udC13ZWlnaHQ6Ym9sZDtmb250LXNpemU6MTJweCcpOwogICAgfQoKICAgIC8qKgogICAgICog5o6n5Yi25Y+w6LCD6K+V6L6T5Ye65qC35byPIOS/oeaBr+agt+W8jwogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgW+imgeWKoOagt+W8j+eahOWGheWuuV0KICAgICAqLwogICAgdmFyIEluZm8gPSBmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICAgICAgY29uc29sZS5sb2coJyVjIFsqXSAnICsgc3RyaW5nLCAnY29sb3I6IzIxOTZGMztmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToxMnB4Jyk7CiAgICB9CgogICAgLyoqCiAgICAgKiDmnaXmnaHku4vnu40KICAgICAqLwogICAgV2FybmluZygi5o+S5Lu25ZCN56ew77yaIiArIFBMVUdJTl9OQU1FKTsKCiAgICAvKioKICAgICAqIOaXoOazlXJlcXVpcmXml7bvvIzmj5Lku7blvJXnlKjms6jlhaUt5byA5aeLCiAgICAgKi8KICAgICQuZWFjaChSRVFVSVJFX0FSUkFZLCBmdW5jdGlvbiAoaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwogICAgICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7CiAgICAgICAgc2NyaXB0LnNyYyA9IHZhbHVlLnVybDsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7CiAgICAgICAgSW5mbygn6LCD6K+V6L6T5Ye677yaXHJcbuOAkOW8leWFpeesrOS4ieaWuWpz5o+S5Lu244CRXHJcbicgKyAn5o+S5Lu25ZCNIC0+ICcgKyB2YWx1ZS5uYW1lICsgJ1xyXG7mj4/ov7AgLT4gJyArIHZhbHVlLmRlc2NyaXB0aW9uICsgJ1xyXG7lnLDlnYAgLT4gJyArIHZhbHVlLnVybCArICdcclxuJyk7CiAgICB9KTsKCiAgICAvKioKICAgICAqIG5vdGnmj5Lku7Yg5o+Q56S6572R55uY6ZO+5o6l5pWw6YePCiAgICAgKgogICAgICogQHBhcmFtICBwYW5MaW5rQ291bnRzIFvmlbDph49dCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5vdHlQYW5Db3VudHMocGFuTGlua0NvdW50cykgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG5ldyBOb3R5KHsKICAgICAgICAgICAgICAgIHRleHQ6ICfmjqLmtYvliLDnvZHnm5jpk77mjqXmlbDph4/vvJonICsgcGFuTGlua0NvdW50cyArICfkuKosPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iX1Nob3dQYW5MaW5rcygpOyI+54K55Ye75p+l55yLPC9hPicsCiAgICAgICAgICAgICAgICBsYXlvdXQ6ICdib3R0b21SaWdodCcsCiAgICAgICAgICAgICAgICB0aGVtZTogJ21pbnQnLAogICAgICAgICAgICAgICAgY2xvc2VXaXRoOiBbJ2NsaWNrJ10sCiAgICAgICAgICAgICAgICB0eXBlOiAncG9zdCcKICAgICAgICAgICAgfSkuc2hvdygpOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBFcnJvcign6LCD6K+V6L6T5Ye677yaJywgZXJyKTsKICAgICAgICB9CiAgICB9CgoKICAgIC8qKgogICAgICog5pWw57uE5pON5L2c57G7CiAgICAgKi8KICAgIHZhciBhcnJheVRvb2wgPSB7CiAgICAgICAgLyoqCiAgICAgICAgICog5YiG5Ymy5a2X56ym5LiyCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0geyp9IHN0ciDlvoXliIblibLmloflrZcKICAgICAgICAgKiBAcGFyYW0geyp9IHJ1bGUg5YiG5Ymy6KeE5YiZCiAgICAgICAgICovCiAgICAgICAgZ2V0U3BsaXQ6IGZ1bmN0aW9uIChzdHIsIHJ1bGUpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5zcGxpdChydWxlKTsKICAgICAgICB9LAogICAgICAgIC8qKgogICAgICAgICAqIOiOt+WPluaPkOWPlueggQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHsqfSBhcnJheSDmlbDnu4QKICAgICAgICAgKi8KICAgICAgICBnZXRVYm91bmQ6IGZ1bmN0aW9uIChhcnJheSkgewogICAgICAgICAgICB2YXIgc3RyID0gKGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdKS5yZXBsYWNlKC8oXlxzKil8KFxzKiQpL2csICIiKTsKICAgICAgICAgICAgcmV0dXJuIHN0ciA/IHN0ciA6ICItIjsKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICog5pWw57uE5Yig6Zmk5oyH5a6a5YWD57SgCiAgICAgKi8KICAgIEFycmF5LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAodmFsKSB7CiAgICAgICAgdmFyIG5ld0FycmF5ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICh2YWwgIT0gdGhpc1tpXSkgewogICAgICAgICAgICAgICAgbmV3QXJyYXkucHVzaCh0aGlzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3QXJyYXk7CiAgICB9OwoKICAgIC8qKgogICAgICog5pu/5o2i5a2X56ym5LiyCiAgICAgKiBAcGFyYW0geyp9IHN0ciDlvoXmm7/mjaLmlofmnKwKICAgICAqIEBwYXJhbSB7Kn0gcmVwbGFjZUFycmF5IOaDs+imgeabv+aNoueahOaVsOaNrgogICAgICogQHBhcmFtIHsqfSBuZWVkU3RyIOaDs+imgeWwhuabv+aNouaVsOaNruabv+aNouS4uuS7gOS5iAogICAgICovCiAgICB2YXIgZ2V0UGFzc1N0ciA9IGZ1bmN0aW9uIChzdHIsIHJlcGxhY2VBcnJheSwgbmVlZFN0cikgewogICAgICAgICQuZWFjaChyZXBsYWNlQXJyYXksIGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UodmFsdWUsIChuZWVkU3RyIHx8ICcnKSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHN0cjsKICAgIH0KCiAgICAvKioKICAgICAqIOiOt+WPluaPkOWPlueggeWHveaVsAogICAgICoKICAgICAqIEBwYXJhbSBwYXNzIOato+WImeagoemqjOmAmui/h+eahOWtl+espuS4sgogICAgICogQHBhcmFtIHZhbHVlIOe9keebmOmTvuaOpeS4juaPkOWPlueggeWtl+espuS4sgogICAgICovCiAgICB2YXIgYWN0aXZlTGlua3MgPSBmdW5jdGlvbiAocGFzcywgdmFsdWUpIHsKICAgICAgICB2YXIgcGFzc3dkQ291bnQgPSAwOwogICAgICAgICQodmFsdWUpLmZpbmQoIi5teV9iYWlkdV9saW5rIikuZWFjaChmdW5jdGlvbiAoaSwgdikgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIG9faHJlZiA9ICQodikuYXR0cigiaHJlZiIpOwogICAgICAgICAgICAgICAgdmFyIG9faHJlZl9leGNsdWRlX3BhYXMgPSBvX2hyZWYuc3Vic3RyKDAsIChvX2hyZWYubGFzdEluZGV4T2YoJyMnKSA+IDAgPyBvX2hyZWYubGFzdEluZGV4T2YoJyMnKSA6IG9faHJlZi5sZW5ndGgpKTsKICAgICAgICAgICAgICAgIC8vIOmYsuatouWHuueOsOmHjeWkjeaVsOaNrgogICAgICAgICAgICAgICAgaWYgKCQuaW5BcnJheShvX2hyZWYsIHBhbkxpbmtzKSA8IDAgJiYgJC5pbkFycmF5KG9faHJlZl9leGNsdWRlX3BhYXMsIHBhbkxpbmtzKSkgewogICAgICAgICAgICAgICAgICAgIC8vIOWIpOaWremTvuaOpeaYr+WQpuecn+eahOWtmOWcqOWvhueggSzpmLLmraLlr4bnoIHkuI7nvZHnm5jpk77mjqXkuI3ljLnphY3nmoTnirblhrUKICAgICAgICAgICAgICAgICAgICAvLyDmn6Xmib5h5qCH562+55qE54i25YWD57Sg5YaF5a65LOWIpOaWreeItuWFg+e0oOWGheWuueS4reaYr+WQpuWMheWQq+aPkOWPlueggQogICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRIdG1sID0gJCh2KS5wYXJlbnQoKS5odG1sKCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzRXhpc3RQYXNzd2QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50SHRtbC5tYXRjaChwYW5Qd2RQYXR0ZXJuKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpc0V4aXN0UGFzc3dkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRIdG1sID0gJCh2KS5wYXJlbnQoKS5wYXJlbnQoKS5odG1sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRIdG1sLm1hdGNoKHBhblB3ZFBhdHRlcm4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4aXN0UGFzc3dkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRXhpc3RQYXNzd2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8g6I635Y+W5a+G56CBCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXNzQXJyYXkgPSBhcnJheVRvb2wuZ2V0U3BsaXQocGFzc1twYXNzd2RDb3VudF0sICI6Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzQXJyYXkubGVuZ3RoIDwgMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc0FycmF5ID0gYXJyYXlUb29sLmdldFNwbGl0KHBhc3NbcGFzc3dkQ291bnRdLCAi77yaIikKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy8g5ou85o6l5paw55qE572R55uY6ZO+5o6lCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuX2hyZWYgPSBvX2hyZWYgKyAiIyIgKyBhcnJheVRvb2wuZ2V0VWJvdW5kKHBhc3NBcnJheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICQodikuYXR0cigiaHJlZiIsIG5faHJlZik7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bnvZHnm5jmlbDph4/jgIHpk77mjqXjgIHlr4bnoIHvvIzlrZjlhaXmlbDnu4QKICAgICAgICAgICAgICAgICAgICAgICAgcGFuTGlua3MucHVzaChvX2hyZWYpOwogICAgICAgICAgICAgICAgICAgICAgICBwYW5MaW5rc1Bhc3N3b3JkLnB1c2goYXJyYXlUb29sLmdldFVib3VuZChwYXNzQXJyYXkpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vRGVidWcKICAgICAgICAgICAgICAgICAgICAgICAgSW5mbygn6LCD6K+V6L6T5Ye677yaVVJMIC0+ICcgKyBvX2hyZWYgKyAnIOaPkOWPlueggSAtPiAnICsgYXJyYXlUb29sLmdldFVib3VuZChwYXNzQXJyYXkpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOatpemVvysxCiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3ZENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIEVycm9yKCfosIPor5XovpPlh7rvvJonLCBlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiDmuLLmn5PnvZHnm5jpk77mjqXkuLrok53pk74KICAgICAqCiAgICAgKiBAcGFyYW0geyp9IHJlIOmdnuiTnemTvuato+WImQogICAgICogQHBhcmFtIHsqfSBucmUg5bey5piv6JOd6ZO+5q2j5YiZCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFjdGl2ZWxpbmsocmUsIG5yZSkgewogICAgICAgICQoJy5wbGMnKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKCiAgICAgICAgICAgIC8vIOW3suaYr+iTnemTvgogICAgICAgICAgICB2YXIgbnJlTGluayA9ICgkKHRoaXMpLmh0bWwoKSkubWF0Y2gobnJlKTsKICAgICAgICAgICAgLy8g6Z2e6JOd6ZO+CiAgICAgICAgICAgIHZhciByZUxpbmsgPSAoJCh0aGlzKS5odG1sKCkpLm1hdGNoKHJlKTsKICAgICAgICAgICAgLy8g6Z2e6JOd6ZO+5YmU6Zmk6JOd6ZO+5pWw5o2uCiAgICAgICAgICAgIGlmIChucmVMaW5rICYmIG5yZUxpbmsubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgJC5lYWNoKG5yZUxpbmssIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgICAgICByZUxpbmsgPSByZUxpbmsucmVtb3ZlKHYuc3Vic3RyKHYuaW5kZXhPZignIicpICsgMSkpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChyZUxpbmspIHsKICAgICAgICAgICAgICAgIHZhciBzcyA9ICQodGhpcykuaHRtbCgpOwogICAgICAgICAgICAgICAgLy8g5q2k5aSELy8kMeS4jeefpemBk+S4uuS9leWKoC8vCiAgICAgICAgICAgICAgICAvLyBzcyA9IHNzLnJlcGxhY2UocmUsICc8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iLy8kMSIgY2xhc3M9Im15X2JhaWR1X2xpbmsiPiQxPC9hPicpOwogICAgICAgICAgICAgICAgLy8g5q2k5aSE5YWo5bGA5pu/5o2i5Lya5a2Y5Zyo5bCG6JOd6ZO+5pu/5o2i5Z2P55qE5pON5L2cCiAgICAgICAgICAgICAgICAvLyBzcyA9IHNzLnJlcGxhY2UocmUsICc8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iJDEiIGNsYXNzPSJteV9iYWlkdV9saW5rIj4kMTwvYT4nKTsKCiAgICAgICAgICAgICAgICAvLyDljZXkuKrljZXkuKrmm7/mjaIKICAgICAgICAgICAgICAgICQuZWFjaChyZUxpbmssIGZ1bmN0aW9uKGksIHYpIHsKICAgICAgICAgICAgICAgICAgICBzcyA9IHNzLnJlcGxhY2UodiwgJzxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSInICsgdiArICciIGNsYXNzPSJteV9iYWlkdV9saW5rIj4nICsgdiArICc8L2E+Jyk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAkKHRoaXMpLmh0bWwoc3MpOwogICAgICAgICAgICAgICAgLy8g5riy5p+T5a6M5q+V5a2Y5YWl5pWw57uECiAgICAgICAgICAgICAgICBwYW5MaW5rc0NvdW50cy5wdXNoKHJlTGluayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChucmVMaW5rKSB7CiAgICAgICAgICAgICAgICB2YXIgc3MgPSAkKHRoaXMpLmh0bWwoKTsKICAgICAgICAgICAgICAgIHNzID0gc3MucmVwbGFjZShucmUsICckMSIgY2xhc3M9Im15X2JhaWR1X2xpbmsiJyk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmh0bWwoc3MpOwogICAgICAgICAgICAgICAgLy8g5riy5p+T5a6M5q+V5a2Y5YWl5pWw57uECiAgICAgICAgICAgICAgICBwYW5MaW5rc0NvdW50cy5wdXNoKG5yZUxpbmspOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyDmj5Dlj5bnoIHkuI7nvZHnm5jpk77mjqXmi7zmjqXvvIzmj5Dlj5bnvZHnm5jlr4bnoIHml7bvvIzlhYjliKDpmaRodG1s5qCH562+CiAgICAgICAgICAgIC8vIHZhciBwYXNzID0gKCgkKHZhbHVlKS5odG1sKCkpLnJlcGxhY2UoaHRtbFRhZ1BhdHRlcm4sICIiKSkubWF0Y2gocGFuUHdkUGF0dGVybik7CiAgICAgICAgICAgIHZhciBwYXNzID0gZ2V0UGFzc1N0cigkKHZhbHVlKS5odG1sKCksIGV4Y2x1ZGVfYXJyYXkpLm1hdGNoKHBhblB3ZFBhdHRlcm4pOwogICAgICAgICAgICBpZiAocGFzcyAmJiAocmVMaW5rIHx8IG5yZUxpbmspKSB7CiAgICAgICAgICAgICAgICBhY3RpdmVMaW5rcyhwYXNzLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiDmj5Dlj5bnvZHnm5jpk77mjqXkuK3nmoTlr4bnoIEKICAgICAqCiAgICAgKiBAcGFyYW0geyp9IHJ1bGUg5o+Q5Y+W6KeE5YiZ5q2j5YiZCiAgICAgKi8KICAgIHZhciBnZXRDb2RlID0gZnVuY3Rpb24gKHJ1bGUpIHsKICAgICAgICB2YXIgY29kZSA9IGxvY2F0aW9uLmhhc2guc2xpY2UoMSwgNSk7CiAgICAgICAgaWYgKChydWxlIHx8IC8oW2EtelxkXXs0fSkvaS5leGVjKGNvZGUpKSkgewogICAgICAgICAgICBjb2RlID0gUmVnRXhwLiQxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29kZTsKICAgIH07CgogICAgLyoqCiAgICAgKiDliKTmlq3nvZHnm5jpk77mjqXmmK/lkKblpLHmlYgKICAgICAqCiAgICAgKiBAcGFyYW0geyp9IHBhbkxpbmtzSW5mbyDlvLnlh7rmoYbooajmoLxodG1s5Luj56CBCiAgICAgKiBAcGFyYW0geyp9IHBhbkxpbmtzX0NvdW50cyDmjqLmtYvkuKrmlbAKICAgICAqLwogICAgZnVuY3Rpb24gdmFsaWRhdGVMaW5rKHBhbkxpbmtzSW5mbywgcGFuTGlua3NfQ291bnRzKSB7CiAgICAgICAgLy8gb2xvYWTmiJDlip/nmoTmlbDph48KICAgICAgICB2YXIgc3luY0NvdW50ID0gMDsKICAgICAgICAvLyDmiafooYzmrKHmlbAKICAgICAgICB2YXIgYWxsQ291bnQgPSAwOwogICAgICAgICQoJy5wbGMnKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHsKICAgICAgICAgICAgdmFyIHBhbkxpbmtBcnJheSA9ICQodmFsdWUpLmZpbmQoIi5teV9iYWlkdV9saW5rIik7CiAgICAgICAgICAgIGlmIChwYW5MaW5rQXJyYXkubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgLy8g572R55uY6ZO+5o6lCiAgICAgICAgICAgICAgICB2YXIgcGFuTGlua1VybCA9ICcnOwogICAgICAgICAgICAgICAgLy8g5o+Q5Y+WaGFzaOWvhueggQogICAgICAgICAgICAgICAgdmFyIGhhc2hQYXNzd29yZCA9ICcnOwogICAgICAgICAgICAgICAgJC5lYWNoKHBhbkxpbmtBcnJheSwgZnVuY3Rpb24gKGksIHYpIHsKICAgICAgICAgICAgICAgICAgICBwYW5MaW5rVXJsID0gJCh2KS5hdHRyKCdocmVmJyk7CiAgICAgICAgICAgICAgICAgICAgLy8g5Y+R6YCBZ2V06K+35rGC77yM5Yik5pat572R55uY5piv5ZCm5aSx5pWICiAgICAgICAgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHBhbkxpbmtVcmwsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHBhbkxpbmtVcmwsCiAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDpu5jorqTpnZ7lpLHmlYjpk77mjqUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0ludmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICog6K6+572u5aSx5pWI6ZO+5o6l55qE5Yig6Zmk57q/LeW8gOWniwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UucmVzcG9uc2VUZXh0LmluZGV4T2YoJzx0aXRsZT7nmb7luqbnvZHnm5gt6ZO+5o6l5LiN5a2Y5ZyoPC90aXRsZT4nKSA+IDAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5yZXNwb25zZVRleHQuaW5kZXhPZign5ZWK5ZOm77yM5p2l5pma5LqG77yM6K+l5YiG5Lqr5paH5Lu25bey6L+H5pyfJykgPiAwIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVzcG9uc2VUZXh0LmluZGV4T2YoJ+WViuWTpu+8jOS9oOadpeaZmuS6hu+8jOWIhuS6q+eahOaWh+S7tuW3sue7j+iiq+WIoOmZpOS6hu+8jOS4i+asoeimgeaXqeeCueWTn+OAgicpID4gMCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlc3BvbnNlVGV4dC5pbmRleE9mKCfllYrlk6bvvIzkvaDmnaXmmZrkuobvvIzliIbkuqvnmoTmlofku7blt7Lnu4/ooqvlj5bmtojkuobvvIzkuIvmrKHopoHml6nngrnlk5/jgIInKSA+IDAgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5yZXNwb25zZVRleHQuaW5kZXhPZign5ZWK5ZOm77yB6ZO+5o6l6ZSZ6K+v5rKh5om+5Yiw5paH5Lu277yM6K+35omT5byA5q2j56Gu55qE5YiG5Lqr6ZO+5o6lIScpID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWIoOmZpOagh+iusAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodikuYWRkQ2xhc3MoJ215X2JhaWR1X2xpbmtfZGVzdHJveScpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSkuY3NzKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6K6+572u5Li65aSx5pWI54q25oCBCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbnZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICog6K6+572u5aSx5pWI6ZO+5o6l55qE5Yig6Zmk57q/Lee7k+adnwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDooajmoLzmi7zmjqUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8oJ+iwg+ivlei+k+WHuu+8micgKyAn5bqP5Y+3IC0+ICcgKyAoYWxsQ291bnQgKyAxKSArICfmnIDnu4jor7fmsYLpk77mjqUgLT4gJyArIHJlc3BvbnNlLmZpbmFsVXJsICsgJyDorr/pl67lnLDlnYAgLT4gJyArIHJlc3BvbnNlLmNvbnRleHQgKyAnIOaYr+WQpuWkseaViCAtPiAnICsgaXNJbnZhbGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoYXNoUGFzc3dvcmRJbmRleCA9IChyZXNwb25zZS5jb250ZXh0KS5sYXN0SW5kZXhPZignIycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2hQYXNzd29yZEluZGV4ICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaFBhc3N3b3JkID0gKHJlc3BvbnNlLmNvbnRleHQpLnN1YnN0cihoYXNoUGFzc3dvcmRJbmRleCArIDEsIChyZXNwb25zZS5jb250ZXh0KS5sZW5ndGggLSBoYXNoUGFzc3dvcmRJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ21SZXF1ZXN0VXJsID0gKHJlc3BvbnNlLmNvbnRleHQpLnN1YnN0cigwLCAoaGFzaFBhc3N3b3JkSW5kZXggPiAwID8gaGFzaFBhc3N3b3JkSW5kZXggOiAocmVzcG9uc2UuY29udGV4dCkubGVuZ3RoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCsrc3luY0NvdW50KSA8PSBwYW5MaW5rcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzaFBhc3N3b3JkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW52YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuTGlua3NJbmZvICs9ICc8dHI+PHRkPicgKyAoYWxsQ291bnQgKyAxKSArICc8L3RkPjx0ZD48YSB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9Im15X2JhaWR1X2xpbmtfZGVzdHJveSIgZGlzYWJsZWQ9ImRpc2FibGVkIiBzdHlsZT0icG9pbnRlci1ldmVudHM6IG5vbmU7IiBocmVmPSInICsgcmVzcG9uc2UuY29udGV4dCArICciPicgKyBnbVJlcXVlc3RVcmwgKyAnPC9hPjwvdGQ+PHRkPicgKyBoYXNoUGFzc3dvcmQgKyAnPC90ZD48L3RyPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5MaW5rc0luZm8gKz0gJzx0cj48dGQ+JyArIChhbGxDb3VudCArIDEpICsgJzwvdGQ+PHRkPjxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSInICsgcmVzcG9uc2UuY29udGV4dCArICciPicgKyBnbVJlcXVlc3RVcmwgKyAnPC9hPjwvdGQ+PHRkPicgKyBoYXNoUGFzc3dvcmQgKyAnPC90ZD48L3RyPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbnZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5MaW5rc0luZm8gKz0gJzx0cj48dGQ+JyArIChhbGxDb3VudCArIDEpICsgJzwvdGQ+PHRkPjxhIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0ibXlfYmFpZHVfbGlua19kZXN0cm95IiBkaXNhYmxlZD0iZGlzYWJsZWQiIHN0eWxlPSJwb2ludGVyLWV2ZW50czogbm9uZTsiIGhyZWY9IicgKyByZXNwb25zZS5jb250ZXh0ICsgJyI+JyArIGdtUmVxdWVzdFVybCArICc8L2E+PC90ZD48dGQ+LSAtIC0gLTwvdGQ+PC90cj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuTGlua3NJbmZvICs9ICc8dHI+PHRkPicgKyAoYWxsQ291bnQgKyAxKSArICc8L3RkPjx0ZD48YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iJyArIHJlc3BvbnNlLmNvbnRleHQgKyAnIj4nICsgZ21SZXF1ZXN0VXJsICsgJzwvYT48L3RkPjx0ZD4tIC0gLSAtPC90ZD48L3RyPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmnIDlkI7kuIDkuKrmuLLmn5Plrozmr5XlkI7vvIzmuLLmn5Pmlrnms5UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYW5MaW5rcy5sZW5ndGggPT0gc3luY0NvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuTGlua3NJbmZvICs9ICc8L3Rib2R5Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuTGlua3NJbmZvICs9ICc8L3RhYmxlPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zYWZlV2luZG93Ll9TaG93UGFuTGlua3MgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YWwoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDY1MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn5o6i5rWL5Yiw572R55uY6ZO+5o6l5pWw6YeP77yaJyArIHBhbkxpbmtzX0NvdW50cyArICfkuKonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2luZm8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbDogcGFuTGlua3NJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7orqQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24uaHJlZi5tYXRjaCgvKD86aHR0cHM/OlwvXC8pPyh3d3dcLjUycG9qaWVcLmNuXC8oKHRocmVhZFwtLitcLmh0bWwpfChmb3J1bVwucGhwXD9tb2Q9dmlld3RocmVhZFwmdGlkPVx3LispKSkvZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2p6NTJ0b3AnKS5wcmVwZW5kKCc8c3Bhbj48YSBpZD0icGFuY291bnQiIHRpdGxlPSLmjqLmtYvliLDnvZHnm5jpk77mjqXmlbDph4/vvJonICsgcGFuTGlua3NfQ291bnRzICsgJ+S4qiIgY2xhc3M9Imp6Y291bnQiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIG9uY2xpY2s9Il9TaG93UGFuTGlua3MoKTsiPjxpbWcgY2xhc3M9ImNsb3VkX19sb2dvLWRlbCIgc3JjPSJodHRwczovL2dpdGVlLmNvbS9ubjIwMDQzMy9zY3JpcHRfc3luY2hyb25pemF0aW9uL3Jhdy9tYXN0ZXIvJUU3JUJEJTkxJUU3JTlCJTk4JUU4JTg0JTlBJUU2JTlDJUFDL2Nsb3VkLnBuZyI+PC9hPjwvc3Bhbj4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxDb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICog5Yid5aeL5YyWCiAgICAgKi8KICAgIGZ1bmN0aW9uIGluaXQoKSB7CiAgICAgICAgLy8g572R55uY6YCa55+l6YCJ5oupCiAgICAgICAgdmFyICRpbnB1dFRhZyA9ICQoJzxsYWJlbCBjbGFzcz0icGFuX25vdGljZV9zbGlkZSI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icGFuX25vdGljZSIgaGlkZGVuPjxsYWJlbCBmb3I9InBhbl9ub3RpY2UiIGNsYXNzPSJwYW5fbm90aWNlX2xhYmVsIj48L2xhYmVsPue9keebmOaOoua1i+mAmuefpTwvbGFiZWw+JykuY2hhbmdlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCQoJyNwYW5fbm90aWNlJykuaXMoJzpjaGVja2VkJykpIHsKICAgICAgICAgICAgICAgICQuY29va2llKCdvcGVuX3Bhbl9ub3RpY2UnLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQuY29va2llKCdvcGVuX3Bhbl9ub3RpY2UnLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgdmFyICRsYWJlbFRhZyA9ICQoJzxsYWJlbD4nKS5hcHBlbmQoJGlucHV0VGFnKS5hcHBlbmQoJzxzcGFuIGNsYXNzPSJwaXBlIj4mbmJzcDt8PC9zcGFuPicpOwogICAgICAgICQoJyNoZCcpLmZpbmQoJyNwbV9udGMnKS5iZWZvcmUoJGxhYmVsVGFnKTsKCiAgICAgICAgLy8gY29va2ll5Li6dHJ1ZeaXtgogICAgICAgIGlmICgkLmNvb2tpZSgnb3Blbl9wYW5fbm90aWNlJykgPT0gJ3RydWUnKSB7CiAgICAgICAgICAgICQoJyNwYW5fbm90aWNlJykuYXR0cigiY2hlY2tlZCIsICdjaGVja2VkJyk7CiAgICAgICAgfQoKICAgICAgICAvLyDnmb7luqbnvZHnm5jok53pk74KICAgICAgICB2YXIgcmVfYmFpZHUgPSAvKCg/Omh0dHBzPzpcL1wvKT8oPzp5dW58cGFufGV5dW4pXC5iYWlkdVwuY29tXC8oPzpzXC9cdyooKCgtKT9cdyopKik/fHNoYXJlXC9cUypcZFx3KikpL2c7CiAgICAgICAgdmFyIHJlX2V4X2JhaWR1ID0gLyhocmVmPSJodHRwcz86XC9cLyh5dW58cGFufGV5dW4pXC5iYWlkdVwuY29tXC8oPzpzXC9cdyooKCgtKT9cdyopKik/fHNoYXJlXC9cUypcZFx3KikpL2c7CiAgICAgICAgYWN0aXZlbGluayhyZV9iYWlkdSwgcmVfZXhfYmFpZHUpOwogICAgICAgIC8vIOiTneWlj+e9keebmOiTnemTvgogICAgICAgIHZhciByZV9sYW56b3UgPSAvKCg/Omh0dHBzPzpcL1wvKT8ocGFufHd3dylcLmxhbnpvdShzKT9cLmNvbVwvKD86XHcqfFxkKSkvZzsKICAgICAgICB2YXIgcmVfZXhfbGFuem91ID0gLyhocmVmPSJodHRwcz86XC9cLyhwYW58d3d3KVwubGFuem91KHMpP1wuY29tXC8oPzpcdyp8XGQpKS9nOwogICAgICAgIGFjdGl2ZWxpbmsocmVfbGFuem91LCByZV9leF9sYW56b3UpOwogICAgICAgIC8vIDM2MOe9keebmOiTnemTvgogICAgICAgIHZhciByZV8zNjAgPSAvKCg/Omh0dHBzPzpcL1wvKT95dW5wYW5cLjM2MFwuY25cLyg/Olx3KnxcZCkpL2c7CiAgICAgICAgdmFyIHJlX2V4XzM2MCA9IC8oaHJlZj0iaHR0cHM/OlwvXC95dW5wYW5cLjM2MFwuY25cLyg/Olx3KnxcZCkpL2c7CiAgICAgICAgYWN0aXZlbGluayhyZV8zNjAsIHJlX2V4XzM2MCk7CiAgICB9CgogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyDoh6rlrprkuYnlh73mlbAt57uT5p2fIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAkKGZ1bmN0aW9uICgpIHsKICAgICAgICAvKioKICAgICAgICAgKiDliJ3lp4vljJYKICAgICAgICAgKi8KICAgICAgICBpbml0KCk7CgogICAgICAgIGNvbnN0IGRhcmttb2RlID0gIG5ldyBEYXJrbW9kZSgpOwoKICAgICAgICBjb25zb2xlLmxvZygkLmNvb2tpZSgnZGFya21vZGUnKSk7CiAgICAgICAgaWYgKCQuY29va2llKCdkYXJrbW9kZScpID09ICd0cnVlJykgewogICAgICAgICAgICBpZiAoIWRhcmttb2RlLmlzQWN0aXZhdGVkKCkpIHsKICAgICAgICAgICAgICAgIGRhcmttb2RlLnRvZ2dsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIOmhtemdouWPs+S+p+aWsOWinuaMiemSriDlvIDlp4sgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICBpZiAoZG9jdW1lbnQuZG9tYWluID09ICJ3d3cuNTJwb2ppZS5jbiIpIHsKICAgICAgICAgICAgdmFyIGltZ1RhZyA9ICQoJzxpbWc+JykuYWRkQ2xhc3MoJ2Nsb3VkX19sb2dvLWRlbCcpLmF0dHIoJ3NyYycsICdodHRwczovL2dpdGVlLmNvbS9ubjIwMDQzMy9zY3JpcHRfc3luY2hyb25pemF0aW9uL3Jhdy9tYXN0ZXIvJUU3JUJEJTkxJUU3JTlCJTk4JUU4JTg0JTlBJUU2JTlDJUFDL2Rhcmttb2RlLnBuZycpOwogICAgICAgICAgICB2YXIgYVRhZyA9ICQoJzxhPicpLmF0dHIoJ3RpdGxlJywgJ+WIh+aNouaYvOWknOaooeW8jycpCiAgICAgICAgICAgICAgICAuYXR0cignaHJlZicsICdqYXZhc2NyaXB0OnZvaWQoMCk7JykKICAgICAgICAgICAgICAgIC5jc3MoJ2JvcmRlci1yYWRpdXMnLCAnMjBweCcpCiAgICAgICAgICAgICAgICAuY2xpY2soZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgZGFya21vZGUudG9nZ2xlKCk7CiAgICAgICAgICAgICAgICAgICAgJC5jb29raWUoJ2Rhcmttb2RlJywgZGFya21vZGUuaXNBY3RpdmF0ZWQoKSk7CiAgICAgICAgICAgICAgICB9KS5hcHBlbmQoaW1nVGFnKTsKICAgICAgICAgICAgdmFyIHNwYW5UYWcgPSAkKCc8c3Bhbj4nKS5hcHBlbmQoYVRhZyk7CiAgICAgICAgICAgICQoJyNqejUydG9wJykucHJlcGVuZChzcGFuVGFnKTsKICAgICAgICB9CgogICAgICAgIHZhciBwYW5MaW5rc0luZm8gPSAiIjsKICAgICAgICB2YXIgcGFuTGlua3NfQ291bnRzID0gcGFuTGlua3MubGVuZ3RoOwogICAgICAgIHZhciBzd2FsVHlwZSA9ICIiOwogICAgICAgIGlmIChwYW5MaW5rc19Db3VudHMgPiAwKSB7CiAgICAgICAgICAgIHBhbkxpbmtzSW5mbyArPSAnPHRhYmxlIGNsYXNzPSJteV9iYWlkdV9saW5rX3RhYmxlIj4nOwogICAgICAgICAgICBwYW5MaW5rc0luZm8gKz0gJzx0aGVhZD4nOwogICAgICAgICAgICBwYW5MaW5rc0luZm8gKz0gJzx0cj4nOwogICAgICAgICAgICBwYW5MaW5rc0luZm8gKz0gJzx0aD48Yj4jPC9iPjwvdGg+JzsKICAgICAgICAgICAgcGFuTGlua3NJbmZvICs9ICc8dGg+PGI+572R55uY6ZO+5o6lPC9iPjwvdGg+JzsKICAgICAgICAgICAgcGFuTGlua3NJbmZvICs9ICc8dGg+PGI+5a+G56CBPC9iPjwvdGg+JzsKICAgICAgICAgICAgcGFuTGlua3NJbmZvICs9ICc8L3RyPic7CiAgICAgICAgICAgIHBhbkxpbmtzSW5mbyArPSAnPC90aGVhZD4nOwogICAgICAgICAgICBwYW5MaW5rc0luZm8gKz0gJzx0Ym9keT4nOwogICAgICAgICAgICAvLyDmo4DmtYvnvZHnm5jliIbkuqvmmK/lkKblpLHmlYgKICAgICAgICAgICAgdmFsaWRhdGVMaW5rKHBhbkxpbmtzSW5mbywgcGFuTGlua3NfQ291bnRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwYW5MaW5rc0luZm8gPSAi5b2T5YmN6aG15pyq5qOA5rWL5Yiw5bim5a+G56CB55qE572R55uY6ZO+5o6lIjsKICAgICAgICAgICAgc3dhbFR5cGUgPSAid2FybmluZyI7CiAgICAgICAgICAgIHVuc2FmZVdpbmRvdy5fU2hvd1BhbkxpbmtzID0gKCkgPT4gewogICAgICAgICAgICAgICAgc3dhbCh7CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDY1MCwKICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+aOoua1i+WIsOe9keebmOmTvuaOpeaVsOmHj++8micgKyBwYW5MaW5rc19Db3VudHMgKyAn5LiqJywKICAgICAgICAgICAgICAgICAgICB0eXBlOiBzd2FsVHlwZSwKICAgICAgICAgICAgICAgICAgICBodG1sOiBwYW5MaW5rc0luZm8sCiAgICAgICAgICAgICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu6K6kJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxvY2F0aW9uLmhyZWYubWF0Y2goLyg/Omh0dHBzPzpcL1wvKT8od3d3XC41MnBvamllXC5jblwvKCh0aHJlYWRcLS4rXC5odG1sKXwoZm9ydW1cLnBocFw/bW9kPXZpZXd0aHJlYWRcJnRpZD1cdy4rKSkpL2cpKSB7CiAgICAgICAgICAgICAgICAkKCcjano1MnRvcCcpLnByZXBlbmQoJzxzcGFuPjxhIGlkPSJwYW5jb3VudCIgdGl0bGU9IuaOoua1i+WIsOe9keebmOmTvuaOpeaVsOmHj++8micgKyBwYW5MaW5rc19Db3VudHMgKyAn5LiqIiBjbGFzcz0ianpjb3VudCIgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgb25jbGljaz0iX1Nob3dQYW5MaW5rcygpOyI+PGltZyBjbGFzcz0iY2xvdWRfX2xvZ28tZGVsIiBzcmM9Imh0dHBzOi8vZ2l0ZWUuY29tL25uMjAwNDMzL3NjcmlwdF9zeW5jaHJvbml6YXRpb24vcmF3L21hc3Rlci8lRTclQkQlOTElRTclOUIlOTglRTglODQlOUElRTYlOUMlQUMvY2xvdWQucG5nIj48L2E+PC9zcGFuPicpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIOmhtemdouWPs+S+p+aWsOWinuaMiemSriDnu5PmnZ8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAgICAgICAvLyDlj7PkuIvop5Jub3R55o+Q6YaSCiAgICAgICAgaWYgKCQuY29va2llKCdvcGVuX3Bhbl9ub3RpY2UnKSA9PSAndHJ1ZScpIHsKICAgICAgICAgICAgbm90eVBhbkNvdW50cyhwYW5MaW5rc19Db3VudHMpOwogICAgICAgIH0KCiAgICAgICAgLy9kZWJ1ZwogICAgICAgIEluZm8oJ+iwg+ivlei+k+WHuu+8muaOoua1i+WIsOe9keebmOmTvuaOpeaVsOmHjycgKyBwYW5MaW5rc19Db3VudHMgKyAn5LiqJyk7CgogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiog572R55uY6aG16Z2i77yM5o+Q5Y+W56CB6Ieq5Yqo6KGl5YWo5Yqf6IO9LeW8gOWniyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgLy/nmb7luqbnvZHnm5jmj5Dlj5bnoIHoh6rliqjooaXlhagKICAgICAgICBpZiAobG9jYXRpb25fcGF0aG5hbWUuaW5kZXhPZigiL3NoYXJlLyIpICE9IC0xICYmICQoJ2Zvcm0gaW5wdXQnKSAhPSBudWxsKSB7CiAgICAgICAgICAgIHZhciBjb2RlID0gZ2V0Q29kZSgpOwogICAgICAgICAgICBpZiAoY29kZSkgewogICAgICAgICAgICAgICAgLy8g5pyJ5o+Q5Y+W56CB5pe25omN54K55Ye75o+Q5Lqk5oyJ6ZKuCiAgICAgICAgICAgICAgICAkKCdmb3JtIGlucHV0JykudmFsKGNvZGUpOwogICAgICAgICAgICAgICAgJCgnZm9ybSBhW3RpdGxlPeaPkOWPluaWh+S7tl0nKS5jbGljaygpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyDok53lpY/nvZHnm5jmj5Dlj5bnoIHoh6rliqjooaXlhagKCiAgICAgICAgaWYgKGxvY2F0aW9uX3BhdGhuYW1lLmluZGV4T2YoIi9mbiIpID09IC0xICYmIChsb2NhdGlvbi5ocmVmKS5pbmRleE9mKCIvd3d3LmxhbnpvdXMuY29tLyIpICE9IC0xKSB7CiAgICAgICAgICAgIHZhciBjb2RlID0gZ2V0Q29kZSgpOwogICAgICAgICAgICBpZiAoY29kZSkgewogICAgICAgICAgICAgICAgaWYgKCQoJ2lmcmFtZScpICE9IG51bGwgJiYgJCgnI2Jsb2NrYnl0ZS1icy1zaWRlYmFyJykubGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgICAgICAgIC8vIOaOkumZpGNocm9tZeS5puetvuaPkuS7tuW5suaJsAogICAgICAgICAgICAgICAgICAgIHZhciBpZnJhbWVPYmogPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaWZyYW1lJylbMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZU9iaikgewogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWVPYmouY29udGVudFdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHdkJykudmFsdWUgPSBjb2RlOwogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWVPYmouY29udGVudFdpbmRvdy5kb3duX3AoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCQoJyNwd2Rsb2FkIGlucHV0I3B3ZCcpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAvL+esrOS6jOeJiOi+k+WFpeWvhueggemhtQogICAgICAgICAgICAgICAgICAgICQoJyNwd2Rsb2FkIGlucHV0I3B3ZCcpLnZhbChjb2RlKTsKICAgICAgICAgICAgICAgICAgICAkKCdpbnB1dCNzdWInKS5jbGljaygpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL+esrOS4ieeJiOi+k+WFpeWvhueggemhtQoKICAgICAgICAgICAgICAgICAgICAvLyQoJyNwd2QnKS5hdHRyKCJ2YWx1ZSIsY29kZSk7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B3ZCcpLnZhbHVlID0gY29kZTsKICAgICAgICAgICAgICAgICAgICBkb3duX3AoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIOe9keebmOmhtemdou+8jOaPkOWPlueggeiHquWKqOihpeWFqOWKn+iDvS3nu5PmnZ8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgfSk7Cgp9KSgpOw==","requires":[{"meta":{"name":"jquery.min.js","url":"https://cdn.bootcss.com/jquery/1.8.3/jquery.min.js","ts":1647165650335,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2MS44LjMganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwooZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBfKGUpe3ZhciB0PU1bZV09e307cmV0dXJuIHYuZWFjaChlLnNwbGl0KHkpLGZ1bmN0aW9uKGUsbil7dFtuXT0hMH0pLHR9ZnVuY3Rpb24gSChlLG4scil7aWYocj09PXQmJmUubm9kZVR5cGU9PT0xKXt2YXIgaT0iZGF0YS0iK24ucmVwbGFjZShQLCItJDEiKS50b0xvd2VyQ2FzZSgpO3I9ZS5nZXRBdHRyaWJ1dGUoaSk7aWYodHlwZW9mIHI9PSJzdHJpbmciKXt0cnl7cj1yPT09InRydWUiPyEwOnI9PT0iZmFsc2UiPyExOnI9PT0ibnVsbCI/bnVsbDorcisiIj09PXI/K3I6RC50ZXN0KHIpP3YucGFyc2VKU09OKHIpOnJ9Y2F0Y2gocyl7fXYuZGF0YShlLG4scil9ZWxzZSByPXR9cmV0dXJuIHJ9ZnVuY3Rpb24gQihlKXt2YXIgdDtmb3IodCBpbiBlKXtpZih0PT09ImRhdGEiJiZ2LmlzRW1wdHlPYmplY3QoZVt0XSkpY29udGludWU7aWYodCE9PSJ0b0pTT04iKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGV0KCl7cmV0dXJuITF9ZnVuY3Rpb24gdHQoKXtyZXR1cm4hMH1mdW5jdGlvbiB1dChlKXtyZXR1cm4hZXx8IWUucGFyZW50Tm9kZXx8ZS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gYXQoZSx0KXtkbyBlPWVbdF07d2hpbGUoZSYmZS5ub2RlVHlwZSE9PTEpO3JldHVybiBlfWZ1bmN0aW9uIGZ0KGUsdCxuKXt0PXR8fDA7aWYodi5pc0Z1bmN0aW9uKHQpKXJldHVybiB2LmdyZXAoZSxmdW5jdGlvbihlLHIpe3ZhciBpPSEhdC5jYWxsKGUscixlKTtyZXR1cm4gaT09PW59KTtpZih0Lm5vZGVUeXBlKXJldHVybiB2LmdyZXAoZSxmdW5jdGlvbihlLHIpe3JldHVybiBlPT09dD09PW59KTtpZih0eXBlb2YgdD09InN0cmluZyIpe3ZhciByPXYuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVUeXBlPT09MX0pO2lmKGl0LnRlc3QodCkpcmV0dXJuIHYuZmlsdGVyKHQsciwhbik7dD12LmZpbHRlcih0LHIpfXJldHVybiB2LmdyZXAoZSxmdW5jdGlvbihlLHIpe3JldHVybiB2LmluQXJyYXkoZSx0KT49MD09PW59KX1mdW5jdGlvbiBsdChlKXt2YXIgdD1jdC5zcGxpdCgifCIpLG49ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aWYobi5jcmVhdGVFbGVtZW50KXdoaWxlKHQubGVuZ3RoKW4uY3JlYXRlRWxlbWVudCh0LnBvcCgpKTtyZXR1cm4gbn1mdW5jdGlvbiBMdChlLHQpe3JldHVybiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpWzBdfHxlLmFwcGVuZENoaWxkKGUub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHQpKX1mdW5jdGlvbiBBdChlLHQpe2lmKHQubm9kZVR5cGUhPT0xfHwhdi5oYXNEYXRhKGUpKXJldHVybjt2YXIgbixyLGkscz12Ll9kYXRhKGUpLG89di5fZGF0YSh0LHMpLHU9cy5ldmVudHM7aWYodSl7ZGVsZXRlIG8uaGFuZGxlLG8uZXZlbnRzPXt9O2ZvcihuIGluIHUpZm9yKHI9MCxpPXVbbl0ubGVuZ3RoO3I8aTtyKyspdi5ldmVudC5hZGQodCxuLHVbbl1bcl0pfW8uZGF0YSYmKG8uZGF0YT12LmV4dGVuZCh7fSxvLmRhdGEpKX1mdW5jdGlvbiBPdChlLHQpe3ZhciBuO2lmKHQubm9kZVR5cGUhPT0xKXJldHVybjt0LmNsZWFyQXR0cmlidXRlcyYmdC5jbGVhckF0dHJpYnV0ZXMoKSx0Lm1lcmdlQXR0cmlidXRlcyYmdC5tZXJnZUF0dHJpYnV0ZXMoZSksbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj09PSJvYmplY3QiPyh0LnBhcmVudE5vZGUmJih0Lm91dGVySFRNTD1lLm91dGVySFRNTCksdi5zdXBwb3J0Lmh0bWw1Q2xvbmUmJmUuaW5uZXJIVE1MJiYhdi50cmltKHQuaW5uZXJIVE1MKSYmKHQuaW5uZXJIVE1MPWUuaW5uZXJIVE1MKSk6bj09PSJpbnB1dCImJkV0LnRlc3QoZS50eXBlKT8odC5kZWZhdWx0Q2hlY2tlZD10LmNoZWNrZWQ9ZS5jaGVja2VkLHQudmFsdWUhPT1lLnZhbHVlJiYodC52YWx1ZT1lLnZhbHVlKSk6bj09PSJvcHRpb24iP3Quc2VsZWN0ZWQ9ZS5kZWZhdWx0U2VsZWN0ZWQ6bj09PSJpbnB1dCJ8fG49PT0idGV4dGFyZWEiP3QuZGVmYXVsdFZhbHVlPWUuZGVmYXVsdFZhbHVlOm49PT0ic2NyaXB0IiYmdC50ZXh0IT09ZS50ZXh0JiYodC50ZXh0PWUudGV4dCksdC5yZW1vdmVBdHRyaWJ1dGUodi5leHBhbmRvKX1mdW5jdGlvbiBNdChlKXtyZXR1cm4gdHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTp0eXBlb2YgZS5xdWVyeVNlbGVjdG9yQWxsIT0idW5kZWZpbmVkIj9lLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTpbXX1mdW5jdGlvbiBfdChlKXtFdC50ZXN0KGUudHlwZSkmJihlLmRlZmF1bHRDaGVja2VkPWUuY2hlY2tlZCl9ZnVuY3Rpb24gUXQoZSx0KXtpZih0IGluIGUpcmV0dXJuIHQ7dmFyIG49dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpLHI9dCxpPUp0Lmxlbmd0aDt3aGlsZShpLS0pe3Q9SnRbaV0rbjtpZih0IGluIGUpcmV0dXJuIHR9cmV0dXJuIHJ9ZnVuY3Rpb24gR3QoZSx0KXtyZXR1cm4gZT10fHxlLHYuY3NzKGUsImRpc3BsYXkiKT09PSJub25lInx8IXYuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfWZ1bmN0aW9uIFl0KGUsdCl7dmFyIG4scixpPVtdLHM9MCxvPWUubGVuZ3RoO2Zvcig7czxvO3MrKyl7bj1lW3NdO2lmKCFuLnN0eWxlKWNvbnRpbnVlO2lbc109di5fZGF0YShuLCJvbGRkaXNwbGF5IiksdD8oIWlbc10mJm4uc3R5bGUuZGlzcGxheT09PSJub25lIiYmKG4uc3R5bGUuZGlzcGxheT0iIiksbi5zdHlsZS5kaXNwbGF5PT09IiImJkd0KG4pJiYoaVtzXT12Ll9kYXRhKG4sIm9sZGRpc3BsYXkiLG5uKG4ubm9kZU5hbWUpKSkpOihyPUR0KG4sImRpc3BsYXkiKSwhaVtzXSYmciE9PSJub25lIiYmdi5fZGF0YShuLCJvbGRkaXNwbGF5IixyKSl9Zm9yKHM9MDtzPG87cysrKXtuPWVbc107aWYoIW4uc3R5bGUpY29udGludWU7aWYoIXR8fG4uc3R5bGUuZGlzcGxheT09PSJub25lInx8bi5zdHlsZS5kaXNwbGF5PT09IiIpbi5zdHlsZS5kaXNwbGF5PXQ/aVtzXXx8IiI6Im5vbmUifXJldHVybiBlfWZ1bmN0aW9uIFp0KGUsdCxuKXt2YXIgcj1SdC5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsxXS0obnx8MCkpKyhyWzJdfHwicHgiKTp0fWZ1bmN0aW9uIGVuKGUsdCxuLHIpe3ZhciBpPW49PT0ocj8iYm9yZGVyIjoiY29udGVudCIpPzQ6dD09PSJ3aWR0aCI/MTowLHM9MDtmb3IoO2k8NDtpKz0yKW49PT0ibWFyZ2luIiYmKHMrPXYuY3NzKGUsbiskdFtpXSwhMCkpLHI/KG49PT0iY29udGVudCImJihzLT1wYXJzZUZsb2F0KER0KGUsInBhZGRpbmciKyR0W2ldKSl8fDApLG4hPT0ibWFyZ2luIiYmKHMtPXBhcnNlRmxvYXQoRHQoZSwiYm9yZGVyIiskdFtpXSsiV2lkdGgiKSl8fDApKToocys9cGFyc2VGbG9hdChEdChlLCJwYWRkaW5nIiskdFtpXSkpfHwwLG4hPT0icGFkZGluZyImJihzKz1wYXJzZUZsb2F0KER0KGUsImJvcmRlciIrJHRbaV0rIldpZHRoIikpfHwwKSk7cmV0dXJuIHN9ZnVuY3Rpb24gdG4oZSx0LG4pe3ZhciByPXQ9PT0id2lkdGgiP2Uub2Zmc2V0V2lkdGg6ZS5vZmZzZXRIZWlnaHQsaT0hMCxzPXYuc3VwcG9ydC5ib3hTaXppbmcmJnYuY3NzKGUsImJveFNpemluZyIpPT09ImJvcmRlci1ib3giO2lmKHI8PTB8fHI9PW51bGwpe3I9RHQoZSx0KTtpZihyPDB8fHI9PW51bGwpcj1lLnN0eWxlW3RdO2lmKFV0LnRlc3QocikpcmV0dXJuIHI7aT1zJiYodi5zdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlfHxyPT09ZS5zdHlsZVt0XSkscj1wYXJzZUZsb2F0KHIpfHwwfXJldHVybiByK2VuKGUsdCxufHwocz8iYm9yZGVyIjoiY29udGVudCIpLGkpKyJweCJ9ZnVuY3Rpb24gbm4oZSl7aWYoV3RbZV0pcmV0dXJuIFd0W2VdO3ZhciB0PXYoIjwiK2UrIj4iKS5hcHBlbmRUbyhpLmJvZHkpLG49dC5jc3MoImRpc3BsYXkiKTt0LnJlbW92ZSgpO2lmKG49PT0ibm9uZSJ8fG49PT0iIil7UHQ9aS5ib2R5LmFwcGVuZENoaWxkKFB0fHx2LmV4dGVuZChpLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLHtmcmFtZUJvcmRlcjowLHdpZHRoOjAsaGVpZ2h0OjB9KSk7aWYoIUh0fHwhUHQuY3JlYXRlRWxlbWVudClIdD0oUHQuY29udGVudFdpbmRvd3x8UHQuY29udGVudERvY3VtZW50KS5kb2N1bWVudCxIdC53cml0ZSgiPCFkb2N0eXBlIGh0bWw+PGh0bWw+PGJvZHk+IiksSHQuY2xvc2UoKTt0PUh0LmJvZHkuYXBwZW5kQ2hpbGQoSHQuY3JlYXRlRWxlbWVudChlKSksbj1EdCh0LCJkaXNwbGF5IiksaS5ib2R5LnJlbW92ZUNoaWxkKFB0KX1yZXR1cm4gV3RbZV09bixufWZ1bmN0aW9uIGZuKGUsdCxuLHIpe3ZhciBpO2lmKHYuaXNBcnJheSh0KSl2LmVhY2godCxmdW5jdGlvbih0LGkpe258fHNuLnRlc3QoZSk/cihlLGkpOmZuKGUrIlsiKyh0eXBlb2YgaT09Im9iamVjdCI/dDoiIikrIl0iLGksbixyKX0pO2Vsc2UgaWYoIW4mJnYudHlwZSh0KT09PSJvYmplY3QiKWZvcihpIGluIHQpZm4oZSsiWyIraSsiXSIsdFtpXSxuLHIpO2Vsc2UgcihlLHQpfWZ1bmN0aW9uIENuKGUpe3JldHVybiBmdW5jdGlvbih0LG4pe3R5cGVvZiB0IT0ic3RyaW5nIiYmKG49dCx0PSIqIik7dmFyIHIsaSxzLG89dC50b0xvd2VyQ2FzZSgpLnNwbGl0KHkpLHU9MCxhPW8ubGVuZ3RoO2lmKHYuaXNGdW5jdGlvbihuKSlmb3IoO3U8YTt1Kyspcj1vW3VdLHM9L15cKy8udGVzdChyKSxzJiYocj1yLnN1YnN0cigxKXx8IioiKSxpPWVbcl09ZVtyXXx8W10saVtzPyJ1bnNoaWZ0IjoicHVzaCJdKG4pfX1mdW5jdGlvbiBrbihlLG4scixpLHMsbyl7cz1zfHxuLmRhdGFUeXBlc1swXSxvPW98fHt9LG9bc109ITA7dmFyIHUsYT1lW3NdLGY9MCxsPWE/YS5sZW5ndGg6MCxjPWU9PT1Tbjtmb3IoO2Y8bCYmKGN8fCF1KTtmKyspdT1hW2ZdKG4scixpKSx0eXBlb2YgdT09InN0cmluZyImJighY3x8b1t1XT91PXQ6KG4uZGF0YVR5cGVzLnVuc2hpZnQodSksdT1rbihlLG4scixpLHUsbykpKTtyZXR1cm4oY3x8IXUpJiYhb1siKiJdJiYodT1rbihlLG4scixpLCIqIixvKSksdX1mdW5jdGlvbiBMbihlLG4pe3ZhciByLGkscz12LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKHIgaW4gbiluW3JdIT09dCYmKChzW3JdP2U6aXx8KGk9e30pKVtyXT1uW3JdKTtpJiZ2LmV4dGVuZCghMCxlLGkpfWZ1bmN0aW9uIEFuKGUsbixyKXt2YXIgaSxzLG8sdSxhPWUuY29udGVudHMsZj1lLmRhdGFUeXBlcyxsPWUucmVzcG9uc2VGaWVsZHM7Zm9yKHMgaW4gbClzIGluIHImJihuW2xbc11dPXJbc10pO3doaWxlKGZbMF09PT0iKiIpZi5zaGlmdCgpLGk9PT10JiYoaT1lLm1pbWVUeXBlfHxuLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSk7aWYoaSlmb3IocyBpbiBhKWlmKGFbc10mJmFbc10udGVzdChpKSl7Zi51bnNoaWZ0KHMpO2JyZWFrfWlmKGZbMF1pbiByKW89ZlswXTtlbHNle2ZvcihzIGluIHIpe2lmKCFmWzBdfHxlLmNvbnZlcnRlcnNbcysiICIrZlswXV0pe289czticmVha311fHwodT1zKX1vPW98fHV9aWYobylyZXR1cm4gbyE9PWZbMF0mJmYudW5zaGlmdChvKSxyW29dfWZ1bmN0aW9uIE9uKGUsdCl7dmFyIG4scixpLHMsbz1lLmRhdGFUeXBlcy5zbGljZSgpLHU9b1swXSxhPXt9LGY9MDtlLmRhdGFGaWx0ZXImJih0PWUuZGF0YUZpbHRlcih0LGUuZGF0YVR5cGUpKTtpZihvWzFdKWZvcihuIGluIGUuY29udmVydGVycylhW24udG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW25dO2Zvcig7aT1vWysrZl07KWlmKGkhPT0iKiIpe2lmKHUhPT0iKiImJnUhPT1pKXtuPWFbdSsiICIraV18fGFbIiogIitpXTtpZighbilmb3IociBpbiBhKXtzPXIuc3BsaXQoIiAiKTtpZihzWzFdPT09aSl7bj1hW3UrIiAiK3NbMF1dfHxhWyIqICIrc1swXV07aWYobil7bj09PSEwP249YVtyXTphW3JdIT09ITAmJihpPXNbMF0sby5zcGxpY2UoZi0tLDAsaSkpO2JyZWFrfX19aWYobiE9PSEwKWlmKG4mJmVbInRocm93cyJdKXQ9bih0KTtlbHNlIHRyeXt0PW4odCl9Y2F0Y2gobCl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6bj9sOiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitpfX19dT1pfXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX1mdW5jdGlvbiBGbigpe3RyeXtyZXR1cm4gbmV3IGUuWE1MSHR0cFJlcXVlc3R9Y2F0Y2godCl7fX1mdW5jdGlvbiBJbigpe3RyeXtyZXR1cm4gbmV3IGUuQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKX1jYXRjaCh0KXt9fWZ1bmN0aW9uICRuKCl7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtxbj10fSwwKSxxbj12Lm5vdygpfWZ1bmN0aW9uIEpuKGUsdCl7di5lYWNoKHQsZnVuY3Rpb24odCxuKXt2YXIgcj0oVm5bdF18fFtdKS5jb25jYXQoVm5bIioiXSksaT0wLHM9ci5sZW5ndGg7Zm9yKDtpPHM7aSsrKWlmKHJbaV0uY2FsbChlLHQsbikpcmV0dXJufSl9ZnVuY3Rpb24gS24oZSx0LG4pe3ZhciByLGk9MCxzPTAsbz1Ybi5sZW5ndGgsdT12LkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIGEuZWxlbX0pLGE9ZnVuY3Rpb24oKXt2YXIgdD1xbnx8JG4oKSxuPU1hdGgubWF4KDAsZi5zdGFydFRpbWUrZi5kdXJhdGlvbi10KSxyPW4vZi5kdXJhdGlvbnx8MCxpPTEtcixzPTAsbz1mLnR3ZWVucy5sZW5ndGg7Zm9yKDtzPG87cysrKWYudHdlZW5zW3NdLnJ1bihpKTtyZXR1cm4gdS5ub3RpZnlXaXRoKGUsW2YsaSxuXSksaTwxJiZvP246KHUucmVzb2x2ZVdpdGgoZSxbZl0pLCExKX0sZj11LnByb21pc2Uoe2VsZW06ZSxwcm9wczp2LmV4dGVuZCh7fSx0KSxvcHRzOnYuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6dCxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6cW58fCRuKCksZHVyYXRpb246bi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24odCxuLHIpe3ZhciBpPXYuVHdlZW4oZSxmLm9wdHMsdCxuLGYub3B0cy5zcGVjaWFsRWFzaW5nW3RdfHxmLm9wdHMuZWFzaW5nKTtyZXR1cm4gZi50d2VlbnMucHVzaChpKSxpfSxzdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPTAscj10P2YudHdlZW5zLmxlbmd0aDowO2Zvcig7bjxyO24rKylmLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIHQ/dS5yZXNvbHZlV2l0aChlLFtmLHRdKTp1LnJlamVjdFdpdGgoZSxbZix0XSksdGhpc319KSxsPWYucHJvcHM7UW4obCxmLm9wdHMuc3BlY2lhbEVhc2luZyk7Zm9yKDtpPG87aSsrKXtyPVhuW2ldLmNhbGwoZixlLGwsZi5vcHRzKTtpZihyKXJldHVybiByfXJldHVybiBKbihmLGwpLHYuaXNGdW5jdGlvbihmLm9wdHMuc3RhcnQpJiZmLm9wdHMuc3RhcnQuY2FsbChlLGYpLHYuZngudGltZXIodi5leHRlbmQoYSx7YW5pbTpmLHF1ZXVlOmYub3B0cy5xdWV1ZSxlbGVtOmV9KSksZi5wcm9ncmVzcyhmLm9wdHMucHJvZ3Jlc3MpLmRvbmUoZi5vcHRzLmRvbmUsZi5vcHRzLmNvbXBsZXRlKS5mYWlsKGYub3B0cy5mYWlsKS5hbHdheXMoZi5vcHRzLmFsd2F5cyl9ZnVuY3Rpb24gUW4oZSx0KXt2YXIgbixyLGkscyxvO2ZvcihuIGluIGUpe3I9di5jYW1lbENhc2UobiksaT10W3JdLHM9ZVtuXSx2LmlzQXJyYXkocykmJihpPXNbMV0scz1lW25dPXNbMF0pLG4hPT1yJiYoZVtyXT1zLGRlbGV0ZSBlW25dKSxvPXYuY3NzSG9va3Nbcl07aWYobyYmImV4cGFuZCJpbiBvKXtzPW8uZXhwYW5kKHMpLGRlbGV0ZSBlW3JdO2ZvcihuIGluIHMpbiBpbiBlfHwoZVtuXT1zW25dLHRbbl09aSl9ZWxzZSB0W3JdPWl9fWZ1bmN0aW9uIEduKGUsdCxuKXt2YXIgcixpLHMsbyx1LGEsZixsLGMsaD10aGlzLHA9ZS5zdHlsZSxkPXt9LG09W10sZz1lLm5vZGVUeXBlJiZHdChlKTtuLnF1ZXVlfHwobD12Ll9xdWV1ZUhvb2tzKGUsImZ4IiksbC51bnF1ZXVlZD09bnVsbCYmKGwudW5xdWV1ZWQ9MCxjPWwuZW1wdHkuZmlyZSxsLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtsLnVucXVldWVkfHxjKCl9KSxsLnVucXVldWVkKyssaC5hbHdheXMoZnVuY3Rpb24oKXtoLmFsd2F5cyhmdW5jdGlvbigpe2wudW5xdWV1ZWQtLSx2LnF1ZXVlKGUsImZ4IikubGVuZ3RofHxsLmVtcHR5LmZpcmUoKX0pfSkpLGUubm9kZVR5cGU9PT0xJiYoImhlaWdodCJpbiB0fHwid2lkdGgiaW4gdCkmJihuLm92ZXJmbG93PVtwLm92ZXJmbG93LHAub3ZlcmZsb3dYLHAub3ZlcmZsb3dZXSx2LmNzcyhlLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmdi5jc3MoZSwiZmxvYXQiKT09PSJub25lIiYmKCF2LnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dHx8bm4oZS5ub2RlTmFtZSk9PT0iaW5saW5lIj9wLmRpc3BsYXk9ImlubGluZS1ibG9jayI6cC56b29tPTEpKSxuLm92ZXJmbG93JiYocC5vdmVyZmxvdz0iaGlkZGVuIix2LnN1cHBvcnQuc2hyaW5rV3JhcEJsb2Nrc3x8aC5kb25lKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKTtmb3IociBpbiB0KXtzPXRbcl07aWYoVW4uZXhlYyhzKSl7ZGVsZXRlIHRbcl0sYT1hfHxzPT09InRvZ2dsZSI7aWYocz09PShnPyJoaWRlIjoic2hvdyIpKWNvbnRpbnVlO20ucHVzaChyKX19bz1tLmxlbmd0aDtpZihvKXt1PXYuX2RhdGEoZSwiZnhzaG93Iil8fHYuX2RhdGEoZSwiZnhzaG93Iix7fSksImhpZGRlbiJpbiB1JiYoZz11LmhpZGRlbiksYSYmKHUuaGlkZGVuPSFnKSxnP3YoZSkuc2hvdygpOmguZG9uZShmdW5jdGlvbigpe3YoZSkuaGlkZSgpfSksaC5kb25lKGZ1bmN0aW9uKCl7dmFyIHQ7di5yZW1vdmVEYXRhKGUsImZ4c2hvdyIsITApO2Zvcih0IGluIGQpdi5zdHlsZShlLHQsZFt0XSl9KTtmb3Iocj0wO3I8bztyKyspaT1tW3JdLGY9aC5jcmVhdGVUd2VlbihpLGc/dVtpXTowKSxkW2ldPXVbaV18fHYuc3R5bGUoZSxpKSxpIGluIHV8fCh1W2ldPWYuc3RhcnQsZyYmKGYuZW5kPWYuc3RhcnQsZi5zdGFydD1pPT09IndpZHRoInx8aT09PSJoZWlnaHQiPzE6MCkpfX1mdW5jdGlvbiBZbihlLHQsbixyLGkpe3JldHVybiBuZXcgWW4ucHJvdG90eXBlLmluaXQoZSx0LG4scixpKX1mdW5jdGlvbiBabihlLHQpe3ZhciBuLHI9e2hlaWdodDplfSxpPTA7dD10PzE6MDtmb3IoO2k8NDtpKz0yLXQpbj0kdFtpXSxyWyJtYXJnaW4iK25dPXJbInBhZGRpbmciK25dPWU7cmV0dXJuIHQmJihyLm9wYWNpdHk9ci53aWR0aD1lKSxyfWZ1bmN0aW9uIHRyKGUpe3JldHVybiB2LmlzV2luZG93KGUpP2U6ZS5ub2RlVHlwZT09PTk/ZS5kZWZhdWx0Vmlld3x8ZS5wYXJlbnRXaW5kb3c6ITF9dmFyIG4scixpPWUuZG9jdW1lbnQscz1lLmxvY2F0aW9uLG89ZS5uYXZpZ2F0b3IsdT1lLmpRdWVyeSxhPWUuJCxmPUFycmF5LnByb3RvdHlwZS5wdXNoLGw9QXJyYXkucHJvdG90eXBlLnNsaWNlLGM9QXJyYXkucHJvdG90eXBlLmluZGV4T2YsaD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLHA9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxkPVN0cmluZy5wcm90b3R5cGUudHJpbSx2PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyB2LmZuLmluaXQoZSx0LG4pfSxtPS9bXC0rXT8oPzpcZCpcLnwpXGQrKD86W2VFXVtcLStdP1xkK3wpLy5zb3VyY2UsZz0vXFMvLHk9L1xzKy8sYj0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csdz0vXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8sRT0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLFM9L15bXF0sOnt9XHNdKiQvLHg9Lyg/Ol58OnwsKSg/OlxzKlxbKSsvZyxUPS9cXCg/OlsiXFxcL2JmbnJ0XXx1W1xkYS1mQS1GXXs0fSkvZyxOPS8iW14iXFxcclxuXSoifHRydWV8ZmFsc2V8bnVsbHwtPyg/OlxkXGQqXC58KVxkKyg/OltlRV1bXC0rXT9cZCt8KS9nLEM9L14tbXMtLyxrPS8tKFtcZGEtel0pL2dpLEw9ZnVuY3Rpb24oZSx0KXtyZXR1cm4odCsiIikudG9VcHBlckNhc2UoKX0sQT1mdW5jdGlvbigpe2kuYWRkRXZlbnRMaXN0ZW5lcj8oaS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixBLCExKSx2LnJlYWR5KCkpOmkucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSImJihpLmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEEpLHYucmVhZHkoKSl9LE89e307di5mbj12LnByb3RvdHlwZT17Y29uc3RydWN0b3I6dixpbml0OmZ1bmN0aW9uKGUsbixyKXt2YXIgcyxvLHUsYTtpZighZSlyZXR1cm4gdGhpcztpZihlLm5vZGVUeXBlKXJldHVybiB0aGlzLmNvbnRleHQ9dGhpc1swXT1lLHRoaXMubGVuZ3RoPTEsdGhpcztpZih0eXBlb2YgZT09InN0cmluZyIpe2UuY2hhckF0KDApPT09IjwiJiZlLmNoYXJBdChlLmxlbmd0aC0xKT09PSI+IiYmZS5sZW5ndGg+PTM/cz1bbnVsbCxlLG51bGxdOnM9dy5leGVjKGUpO2lmKHMmJihzWzFdfHwhbikpe2lmKHNbMV0pcmV0dXJuIG49biBpbnN0YW5jZW9mIHY/blswXTpuLGE9biYmbi5ub2RlVHlwZT9uLm93bmVyRG9jdW1lbnR8fG46aSxlPXYucGFyc2VIVE1MKHNbMV0sYSwhMCksRS50ZXN0KHNbMV0pJiZ2LmlzUGxhaW5PYmplY3QobikmJnRoaXMuYXR0ci5jYWxsKGUsbiwhMCksdi5tZXJnZSh0aGlzLGUpO289aS5nZXRFbGVtZW50QnlJZChzWzJdKTtpZihvJiZvLnBhcmVudE5vZGUpe2lmKG8uaWQhPT1zWzJdKXJldHVybiByLmZpbmQoZSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPW99cmV0dXJuIHRoaXMuY29udGV4dD1pLHRoaXMuc2VsZWN0b3I9ZSx0aGlzfXJldHVybiFufHxuLmpxdWVyeT8obnx8cikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKG4pLmZpbmQoZSl9cmV0dXJuIHYuaXNGdW5jdGlvbihlKT9yLnJlYWR5KGUpOihlLnNlbGVjdG9yIT09dCYmKHRoaXMuc2VsZWN0b3I9ZS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9ZS5jb250ZXh0KSx2Lm1ha2VBcnJheShlLHRoaXMpKX0sc2VsZWN0b3I6IiIsanF1ZXJ5OiIxLjguMyIsbGVuZ3RoOjAsc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBsLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gZT09bnVsbD90aGlzLnRvQXJyYXkoKTplPDA/dGhpc1t0aGlzLmxlbmd0aCtlXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXYubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGUpO3JldHVybiByLnByZXZPYmplY3Q9dGhpcyxyLmNvbnRleHQ9dGhpcy5jb250ZXh0LHQ9PT0iZmluZCI/ci5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyh0aGlzLnNlbGVjdG9yPyIgIjoiIikrbjp0JiYoci5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyIuIit0KyIoIituKyIpIikscn0sZWFjaDpmdW5jdGlvbihlLHQpe3JldHVybiB2LmVhY2godGhpcyxlLHQpfSxyZWFkeTpmdW5jdGlvbihlKXtyZXR1cm4gdi5yZWFkeS5wcm9taXNlKCkuZG9uZShlKSx0aGlzfSxlcTpmdW5jdGlvbihlKXtyZXR1cm4gZT0rZSxlPT09LTE/dGhpcy5zbGljZShlKTp0aGlzLnNsaWNlKGUsZSsxKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobC5hcHBseSh0aGlzLGFyZ3VtZW50cyksInNsaWNlIixsLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHYubWFwKHRoaXMsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHQsbix0KX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpmLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfSx2LmZuLmluaXQucHJvdG90eXBlPXYuZm4sdi5leHRlbmQ9di5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSxuLHIsaSxzLG8sdT1hcmd1bWVudHNbMF18fHt9LGE9MSxmPWFyZ3VtZW50cy5sZW5ndGgsbD0hMTt0eXBlb2YgdT09ImJvb2xlYW4iJiYobD11LHU9YXJndW1lbnRzWzFdfHx7fSxhPTIpLHR5cGVvZiB1IT0ib2JqZWN0IiYmIXYuaXNGdW5jdGlvbih1KSYmKHU9e30pLGY9PT1hJiYodT10aGlzLC0tYSk7Zm9yKDthPGY7YSsrKWlmKChlPWFyZ3VtZW50c1thXSkhPW51bGwpZm9yKG4gaW4gZSl7cj11W25dLGk9ZVtuXTtpZih1PT09aSljb250aW51ZTtsJiZpJiYodi5pc1BsYWluT2JqZWN0KGkpfHwocz12LmlzQXJyYXkoaSkpKT8ocz8ocz0hMSxvPXImJnYuaXNBcnJheShyKT9yOltdKTpvPXImJnYuaXNQbGFpbk9iamVjdChyKT9yOnt9LHVbbl09di5leHRlbmQobCxvLGkpKTppIT09dCYmKHVbbl09aSl9cmV0dXJuIHV9LHYuZXh0ZW5kKHtub0NvbmZsaWN0OmZ1bmN0aW9uKHQpe3JldHVybiBlLiQ9PT12JiYoZS4kPWEpLHQmJmUualF1ZXJ5PT09diYmKGUualF1ZXJ5PXUpLHZ9LGlzUmVhZHk6ITEscmVhZHlXYWl0OjEsaG9sZFJlYWR5OmZ1bmN0aW9uKGUpe2U/di5yZWFkeVdhaXQrKzp2LnJlYWR5KCEwKX0scmVhZHk6ZnVuY3Rpb24oZSl7aWYoZT09PSEwPy0tdi5yZWFkeVdhaXQ6di5pc1JlYWR5KXJldHVybjtpZighaS5ib2R5KXJldHVybiBzZXRUaW1lb3V0KHYucmVhZHksMSk7di5pc1JlYWR5PSEwO2lmKGUhPT0hMCYmLS12LnJlYWR5V2FpdD4wKXJldHVybjtyLnJlc29sdmVXaXRoKGksW3ZdKSx2LmZuLnRyaWdnZXImJnYoaSkudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5Iil9LGlzRnVuY3Rpb246ZnVuY3Rpb24oZSl7cmV0dXJuIHYudHlwZShlKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIHYudHlwZShlKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGUpe3JldHVybiBlIT1udWxsJiZlPT1lLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGUpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KGUpKSYmaXNGaW5pdGUoZSl9LHR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PW51bGw/U3RyaW5nKGUpOk9baC5jYWxsKGUpXXx8Im9iamVjdCJ9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7aWYoIWV8fHYudHlwZShlKSE9PSJvYmplY3QifHxlLm5vZGVUeXBlfHx2LmlzV2luZG93KGUpKXJldHVybiExO3RyeXtpZihlLmNvbnN0cnVjdG9yJiYhcC5jYWxsKGUsImNvbnN0cnVjdG9yIikmJiFwLmNhbGwoZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMX1jYXRjaChuKXtyZXR1cm4hMX12YXIgcjtmb3IociBpbiBlKTtyZXR1cm4gcj09PXR8fHAuY2FsbChlLHIpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihlKX0scGFyc2VIVE1MOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4hZXx8dHlwZW9mIGUhPSJzdHJpbmciP251bGw6KHR5cGVvZiB0PT0iYm9vbGVhbiImJihuPXQsdD0wKSx0PXR8fGksKHI9RS5leGVjKGUpKT9bdC5jcmVhdGVFbGVtZW50KHJbMV0pXToocj12LmJ1aWxkRnJhZ21lbnQoW2VdLHQsbj9udWxsOltdKSx2Lm1lcmdlKFtdLChyLmNhY2hlYWJsZT92LmNsb25lKHIuZnJhZ21lbnQpOnIuZnJhZ21lbnQpLmNoaWxkTm9kZXMpKSl9LHBhcnNlSlNPTjpmdW5jdGlvbih0KXtpZighdHx8dHlwZW9mIHQhPSJzdHJpbmciKXJldHVybiBudWxsO3Q9di50cmltKHQpO2lmKGUuSlNPTiYmZS5KU09OLnBhcnNlKXJldHVybiBlLkpTT04ucGFyc2UodCk7aWYoUy50ZXN0KHQucmVwbGFjZShULCJAIikucmVwbGFjZShOLCJdIikucmVwbGFjZSh4LCIiKSkpcmV0dXJuKG5ldyBGdW5jdGlvbigicmV0dXJuICIrdCkpKCk7di5lcnJvcigiSW52YWxpZCBKU09OOiAiK3QpfSxwYXJzZVhNTDpmdW5jdGlvbihuKXt2YXIgcixpO2lmKCFufHx0eXBlb2YgbiE9InN0cmluZyIpcmV0dXJuIG51bGw7dHJ5e2UuRE9NUGFyc2VyPyhpPW5ldyBET01QYXJzZXIscj1pLnBhcnNlRnJvbVN0cmluZyhuLCJ0ZXh0L3htbCIpKToocj1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLHIuYXN5bmM9ImZhbHNlIixyLmxvYWRYTUwobikpfWNhdGNoKHMpe3I9dH1yZXR1cm4oIXJ8fCFyLmRvY3VtZW50RWxlbWVudHx8ci5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZ2LmVycm9yKCJJbnZhbGlkIFhNTDogIituKSxyfSxub29wOmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKHQpe3QmJmcudGVzdCh0KSYmKGUuZXhlY1NjcmlwdHx8ZnVuY3Rpb24odCl7ZS5ldmFsLmNhbGwoZSx0KX0pKHQpfSxjYW1lbENhc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShDLCJtcy0iKS5yZXBsYWNlKGssTCl9LG5vZGVOYW1lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihlLG4scil7dmFyIGkscz0wLG89ZS5sZW5ndGgsdT1vPT09dHx8di5pc0Z1bmN0aW9uKGUpO2lmKHIpe2lmKHUpe2ZvcihpIGluIGUpaWYobi5hcHBseShlW2ldLHIpPT09ITEpYnJlYWt9ZWxzZSBmb3IoO3M8bzspaWYobi5hcHBseShlW3MrK10scik9PT0hMSlicmVha31lbHNlIGlmKHUpe2ZvcihpIGluIGUpaWYobi5jYWxsKGVbaV0saSxlW2ldKT09PSExKWJyZWFrfWVsc2UgZm9yKDtzPG87KWlmKG4uY2FsbChlW3NdLHMsZVtzKytdKT09PSExKWJyZWFrO3JldHVybiBlfSx0cmltOmQmJiFkLmNhbGwoIlx1ZmVmZlx1MDBhMCIpP2Z1bmN0aW9uKGUpe3JldHVybiBlPT1udWxsPyIiOmQuY2FsbChlKX06ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PW51bGw/IiI6KGUrIiIpLnJlcGxhY2UoYiwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9dHx8W107cmV0dXJuIGUhPW51bGwmJihuPXYudHlwZShlKSxlLmxlbmd0aD09bnVsbHx8bj09PSJzdHJpbmcifHxuPT09ImZ1bmN0aW9uInx8bj09PSJyZWdleHAifHx2LmlzV2luZG93KGUpP2YuY2FsbChyLGUpOnYubWVyZ2UocixlKSkscn0saW5BcnJheTpmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYodCl7aWYoYylyZXR1cm4gYy5jYWxsKHQsZSxuKTtyPXQubGVuZ3RoLG49bj9uPDA/TWF0aC5tYXgoMCxyK24pOm46MDtmb3IoO248cjtuKyspaWYobiBpbiB0JiZ0W25dPT09ZSlyZXR1cm4gbn1yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oZSxuKXt2YXIgcj1uLmxlbmd0aCxpPWUubGVuZ3RoLHM9MDtpZih0eXBlb2Ygcj09Im51bWJlciIpZm9yKDtzPHI7cysrKWVbaSsrXT1uW3NdO2Vsc2Ugd2hpbGUobltzXSE9PXQpZVtpKytdPW5bcysrXTtyZXR1cm4gZS5sZW5ndGg9aSxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPVtdLHM9MCxvPWUubGVuZ3RoO249ISFuO2Zvcig7czxvO3MrKylyPSEhdChlW3NdLHMpLG4hPT1yJiZpLnB1c2goZVtzXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLG4scil7dmFyIGkscyxvPVtdLHU9MCxhPWUubGVuZ3RoLGY9ZSBpbnN0YW5jZW9mIHZ8fGEhPT10JiZ0eXBlb2YgYT09Im51bWJlciImJihhPjAmJmVbMF0mJmVbYS0xXXx8YT09PTB8fHYuaXNBcnJheShlKSk7aWYoZilmb3IoO3U8YTt1KyspaT1uKGVbdV0sdSxyKSxpIT1udWxsJiYob1tvLmxlbmd0aF09aSk7ZWxzZSBmb3IocyBpbiBlKWk9bihlW3NdLHMsciksaSE9bnVsbCYmKG9bby5sZW5ndGhdPWkpO3JldHVybiBvLmNvbmNhdC5hcHBseShbXSxvKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGUsbil7dmFyIHIsaSxzO3JldHVybiB0eXBlb2Ygbj09InN0cmluZyImJihyPWVbbl0sbj1lLGU9ciksdi5pc0Z1bmN0aW9uKGUpPyhpPWwuY2FsbChhcmd1bWVudHMsMikscz1mdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KG4saS5jb25jYXQobC5jYWxsKGFyZ3VtZW50cykpKX0scy5ndWlkPWUuZ3VpZD1lLmd1aWR8fHYuZ3VpZCsrLHMpOnR9LGFjY2VzczpmdW5jdGlvbihlLG4scixpLHMsbyx1KXt2YXIgYSxmPXI9PW51bGwsbD0wLGM9ZS5sZW5ndGg7aWYociYmdHlwZW9mIHI9PSJvYmplY3QiKXtmb3IobCBpbiByKXYuYWNjZXNzKGUsbixsLHJbbF0sMSxvLGkpO3M9MX1lbHNlIGlmKGkhPT10KXthPXU9PT10JiZ2LmlzRnVuY3Rpb24oaSksZiYmKGE/KGE9bixuPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYS5jYWxsKHYoZSksbil9KToobi5jYWxsKGUsaSksbj1udWxsKSk7aWYobilmb3IoO2w8YztsKyspbihlW2xdLHIsYT9pLmNhbGwoZVtsXSxsLG4oZVtsXSxyKSk6aSx1KTtzPTF9cmV0dXJuIHM/ZTpmP24uY2FsbChlKTpjP24oZVswXSxyKTpvfSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX19KSx2LnJlYWR5LnByb21pc2U9ZnVuY3Rpb24odCl7aWYoIXIpe3I9di5EZWZlcnJlZCgpO2lmKGkucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpc2V0VGltZW91dCh2LnJlYWR5LDEpO2Vsc2UgaWYoaS5hZGRFdmVudExpc3RlbmVyKWkuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQSwhMSksZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix2LnJlYWR5LCExKTtlbHNle2kuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQSksZS5hdHRhY2hFdmVudCgib25sb2FkIix2LnJlYWR5KTt2YXIgbj0hMTt0cnl7bj1lLmZyYW1lRWxlbWVudD09bnVsbCYmaS5kb2N1bWVudEVsZW1lbnR9Y2F0Y2gocyl7fW4mJm4uZG9TY3JvbGwmJmZ1bmN0aW9uIG8oKXtpZighdi5pc1JlYWR5KXt0cnl7bi5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGUpe3JldHVybiBzZXRUaW1lb3V0KG8sNTApfXYucmVhZHkoKX19KCl9fXJldHVybiByLnByb21pc2UodCl9LHYuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe09bIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSksbj12KGkpO3ZhciBNPXt9O3YuQ2FsbGJhY2tzPWZ1bmN0aW9uKGUpe2U9dHlwZW9mIGU9PSJzdHJpbmciP01bZV18fF8oZSk6di5leHRlbmQoe30sZSk7dmFyIG4scixpLHMsbyx1LGE9W10sZj0hZS5vbmNlJiZbXSxsPWZ1bmN0aW9uKHQpe249ZS5tZW1vcnkmJnQscj0hMCx1PXN8fDAscz0wLG89YS5sZW5ndGgsaT0hMDtmb3IoO2EmJnU8bzt1KyspaWYoYVt1XS5hcHBseSh0WzBdLHRbMV0pPT09ITEmJmUuc3RvcE9uRmFsc2Upe249ITE7YnJlYWt9aT0hMSxhJiYoZj9mLmxlbmd0aCYmbChmLnNoaWZ0KCkpOm4/YT1bXTpjLmRpc2FibGUoKSl9LGM9e2FkZDpmdW5jdGlvbigpe2lmKGEpe3ZhciB0PWEubGVuZ3RoOyhmdW5jdGlvbiByKHQpe3YuZWFjaCh0LGZ1bmN0aW9uKHQsbil7dmFyIGk9di50eXBlKG4pO2k9PT0iZnVuY3Rpb24iPyghZS51bmlxdWV8fCFjLmhhcyhuKSkmJmEucHVzaChuKTpuJiZuLmxlbmd0aCYmaSE9PSJzdHJpbmciJiZyKG4pfSl9KShhcmd1bWVudHMpLGk/bz1hLmxlbmd0aDpuJiYocz10LGwobikpfXJldHVybiB0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gYSYmdi5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihlLHQpe3ZhciBuO3doaWxlKChuPXYuaW5BcnJheSh0LGEsbikpPi0xKWEuc3BsaWNlKG4sMSksaSYmKG48PW8mJm8tLSxuPD11JiZ1LS0pfSksdGhpc30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiB2LmluQXJyYXkoZSxhKT4tMX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gYT1bXSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9Zj1uPXQsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hYX0sbG9jazpmdW5jdGlvbigpe3JldHVybiBmPXQsbnx8Yy5kaXNhYmxlKCksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIWZ9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dHx8W10sdD1bZSx0LnNsaWNlP3Quc2xpY2UoKTp0XSxhJiYoIXJ8fGYpJiYoaT9mLnB1c2godCk6bCh0KSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBjLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBjfSx2LmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9W1sicmVzb2x2ZSIsImRvbmUiLHYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsdi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsdi5DYWxsYmFja3MoIm1lbW9yeSIpXV0sbj0icGVuZGluZyIscj17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGkuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB2LkRlZmVycmVkKGZ1bmN0aW9uKG4pe3YuZWFjaCh0LGZ1bmN0aW9uKHQscil7dmFyIHM9clswXSxvPWVbdF07aVtyWzFdXSh2LmlzRnVuY3Rpb24obyk/ZnVuY3Rpb24oKXt2YXIgZT1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlJiZ2LmlzRnVuY3Rpb24oZS5wcm9taXNlKT9lLnByb21pc2UoKS5kb25lKG4ucmVzb2x2ZSkuZmFpbChuLnJlamVjdCkucHJvZ3Jlc3Mobi5ub3RpZnkpOm5bcysiV2l0aCJdKHRoaXM9PT1pP246dGhpcyxbZV0pfTpuW3NdKX0pLGU9bnVsbH0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gZSE9bnVsbD92LmV4dGVuZChlLHIpOnJ9fSxpPXt9O3JldHVybiByLnBpcGU9ci50aGVuLHYuZWFjaCh0LGZ1bmN0aW9uKGUscyl7dmFyIG89c1syXSx1PXNbM107cltzWzFdXT1vLmFkZCx1JiZvLmFkZChmdW5jdGlvbigpe249dX0sdFtlXjFdWzJdLmRpc2FibGUsdFsyXVsyXS5sb2NrKSxpW3NbMF1dPW8uZmlyZSxpW3NbMF0rIldpdGgiXT1vLmZpcmVXaXRofSksci5wcm9taXNlKGkpLGUmJmUuY2FsbChpLGkpLGl9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWwuY2FsbChhcmd1bWVudHMpLHI9bi5sZW5ndGgsaT1yIT09MXx8ZSYmdi5pc0Z1bmN0aW9uKGUucHJvbWlzZSk/cjowLHM9aT09PTE/ZTp2LkRlZmVycmVkKCksbz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3RbZV09dGhpcyxuW2VdPWFyZ3VtZW50cy5sZW5ndGg+MT9sLmNhbGwoYXJndW1lbnRzKTpyLG49PT11P3Mubm90aWZ5V2l0aCh0LG4pOi0taXx8cy5yZXNvbHZlV2l0aCh0LG4pfX0sdSxhLGY7aWYocj4xKXt1PW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKSxmPW5ldyBBcnJheShyKTtmb3IoO3Q8cjt0Kyspblt0XSYmdi5pc0Z1bmN0aW9uKG5bdF0ucHJvbWlzZSk/blt0XS5wcm9taXNlKCkuZG9uZShvKHQsZixuKSkuZmFpbChzLnJlamVjdCkucHJvZ3Jlc3Mobyh0LGEsdSkpOi0taX1yZXR1cm4gaXx8cy5yZXNvbHZlV2l0aChmLG4pLHMucHJvbWlzZSgpfX0pLHYuc3VwcG9ydD1mdW5jdGlvbigpe3ZhciB0LG4scixzLG8sdSxhLGYsbCxjLGgscD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Auc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IikscC5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsbj1wLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikscj1wLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoIW58fCFyfHwhbi5sZW5ndGgpcmV0dXJue307cz1pLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLG89cy5hcHBlbmRDaGlsZChpLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSx1PXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sci5zdHlsZS5jc3NUZXh0PSJ0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNSIsdD17bGVhZGluZ1doaXRlc3BhY2U6cC5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohcC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChyLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ci5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNS8udGVzdChyLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhci5zdHlsZS5jc3NGbG9hdCxjaGVja09uOnUudmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOm8uc2VsZWN0ZWQsZ2V0U2V0QXR0cmlidXRlOnAuY2xhc3NOYW1lIT09InQiLGVuY3R5cGU6ISFpLmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGh0bWw1Q2xvbmU6aS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCE9PSI8Om5hdj48LzpuYXY+Iixib3hNb2RlbDppLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCIsc3VibWl0QnViYmxlczohMCxjaGFuZ2VCdWJibGVzOiEwLGZvY3VzaW5CdWJibGVzOiExLGRlbGV0ZUV4cGFuZG86ITAsbm9DbG9uZUV2ZW50OiEwLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ITEsc2hyaW5rV3JhcEJsb2NrczohMSxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwLGJveFNpemluZ1JlbGlhYmxlOiEwLHBpeGVsUG9zaXRpb246ITF9LHUuY2hlY2tlZD0hMCx0Lm5vQ2xvbmVDaGVja2VkPXUuY2xvbmVOb2RlKCEwKS5jaGVja2VkLHMuZGlzYWJsZWQ9ITAsdC5vcHREaXNhYmxlZD0hby5kaXNhYmxlZDt0cnl7ZGVsZXRlIHAudGVzdH1jYXRjaChkKXt0LmRlbGV0ZUV4cGFuZG89ITF9IXAuYWRkRXZlbnRMaXN0ZW5lciYmcC5hdHRhY2hFdmVudCYmcC5maXJlRXZlbnQmJihwLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixoPWZ1bmN0aW9uKCl7dC5ub0Nsb25lRXZlbnQ9ITF9KSxwLmNsb25lTm9kZSghMCkuZmlyZUV2ZW50KCJvbmNsaWNrIikscC5kZXRhY2hFdmVudCgib25jbGljayIsaCkpLHU9aS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLHUudmFsdWU9InQiLHUuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSx0LnJhZGlvVmFsdWU9dS52YWx1ZT09PSJ0Iix1LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSx1LnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSxwLmFwcGVuZENoaWxkKHUpLGE9aS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksYS5hcHBlbmRDaGlsZChwLmxhc3RDaGlsZCksdC5jaGVja0Nsb25lPWEuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLHQuYXBwZW5kQ2hlY2tlZD11LmNoZWNrZWQsYS5yZW1vdmVDaGlsZCh1KSxhLmFwcGVuZENoaWxkKHApO2lmKHAuYXR0YWNoRXZlbnQpZm9yKGwgaW57c3VibWl0OiEwLGNoYW5nZTohMCxmb2N1c2luOiEwfSlmPSJvbiIrbCxjPWYgaW4gcCxjfHwocC5zZXRBdHRyaWJ1dGUoZiwicmV0dXJuOyIpLGM9dHlwZW9mIHBbZl09PSJmdW5jdGlvbiIpLHRbbCsiQnViYmxlcyJdPWM7cmV0dXJuIHYoZnVuY3Rpb24oKXt2YXIgbixyLHMsbyx1PSJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47IixhPWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTtpZighYSlyZXR1cm47bj1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG4uc3R5bGUuY3NzVGV4dD0idmlzaWJpbGl0eTpoaWRkZW47Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7bWFyZ2luLXRvcDoxcHgiLGEuaW5zZXJ0QmVmb3JlKG4sYS5maXJzdENoaWxkKSxyPWkuY3JlYXRlRWxlbWVudCgiZGl2Iiksbi5hcHBlbmRDaGlsZChyKSxyLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQ+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIscz1yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLHNbMF0uc3R5bGUuY3NzVGV4dD0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSIsYz1zWzBdLm9mZnNldEhlaWdodD09PTAsc1swXS5zdHlsZS5kaXNwbGF5PSIiLHNbMV0uc3R5bGUuZGlzcGxheT0ibm9uZSIsdC5yZWxpYWJsZUhpZGRlbk9mZnNldHM9YyYmc1swXS5vZmZzZXRIZWlnaHQ9PT0wLHIuaW5uZXJIVE1MPSIiLHIuc3R5bGUuY3NzVGV4dD0iYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94Oy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MXB4O2JvcmRlcjoxcHg7ZGlzcGxheTpibG9jazt3aWR0aDo0cHg7bWFyZ2luLXRvcDoxJTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MSU7Iix0LmJveFNpemluZz1yLm9mZnNldFdpZHRoPT09NCx0LmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PWEub2Zmc2V0VG9wIT09MSxlLmdldENvbXB1dGVkU3R5bGUmJih0LnBpeGVsUG9zaXRpb249KGUuZ2V0Q29tcHV0ZWRTdHlsZShyLG51bGwpfHx7fSkudG9wIT09IjElIix0LmJveFNpemluZ1JlbGlhYmxlPShlLmdldENvbXB1dGVkU3R5bGUocixudWxsKXx8e3dpZHRoOiI0cHgifSkud2lkdGg9PT0iNHB4IixvPWkuY3JlYXRlRWxlbWVudCgiZGl2Iiksby5zdHlsZS5jc3NUZXh0PXIuc3R5bGUuY3NzVGV4dD11LG8uc3R5bGUubWFyZ2luUmlnaHQ9by5zdHlsZS53aWR0aD0iMCIsci5zdHlsZS53aWR0aD0iMXB4IixyLmFwcGVuZENoaWxkKG8pLHQucmVsaWFibGVNYXJnaW5SaWdodD0hcGFyc2VGbG9hdCgoZS5nZXRDb21wdXRlZFN0eWxlKG8sbnVsbCl8fHt9KS5tYXJnaW5SaWdodCkpLHR5cGVvZiByLnN0eWxlLnpvb20hPSJ1bmRlZmluZWQiJiYoci5pbm5lckhUTUw9IiIsci5zdHlsZS5jc3NUZXh0PXUrIndpZHRoOjFweDtwYWRkaW5nOjFweDtkaXNwbGF5OmlubGluZTt6b29tOjEiLHQuaW5saW5lQmxvY2tOZWVkc0xheW91dD1yLm9mZnNldFdpZHRoPT09MyxyLnN0eWxlLmRpc3BsYXk9ImJsb2NrIixyLnN0eWxlLm92ZXJmbG93PSJ2aXNpYmxlIixyLmlubmVySFRNTD0iPGRpdj48L2Rpdj4iLHIuZmlyc3RDaGlsZC5zdHlsZS53aWR0aD0iNXB4Iix0LnNocmlua1dyYXBCbG9ja3M9ci5vZmZzZXRXaWR0aCE9PTMsbi5zdHlsZS56b29tPTEpLGEucmVtb3ZlQ2hpbGQobiksbj1yPXM9bz1udWxsfSksYS5yZW1vdmVDaGlsZChwKSxuPXI9cz1vPXU9YT1wPW51bGwsdH0oKTt2YXIgRD0vKD86XHtbXHNcU10qXH18XFtbXHNcU10qXF0pJC8sUD0vKFtBLVpdKS9nO3YuZXh0ZW5kKHtjYWNoZTp7fSxkZWxldGVkSWRzOltdLHV1aWQ6MCxleHBhbmRvOiJqUXVlcnkiKyh2LmZuLmpxdWVyeStNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxub0RhdGE6e2VtYmVkOiEwLG9iamVjdDoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIixhcHBsZXQ6ITB9LGhhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5ub2RlVHlwZT92LmNhY2hlW2Vbdi5leHBhbmRvXV06ZVt2LmV4cGFuZG9dLCEhZSYmIUIoZSl9LGRhdGE6ZnVuY3Rpb24oZSxuLHIsaSl7aWYoIXYuYWNjZXB0RGF0YShlKSlyZXR1cm47dmFyIHMsbyx1PXYuZXhwYW5kbyxhPXR5cGVvZiBuPT0ic3RyaW5nIixmPWUubm9kZVR5cGUsbD1mP3YuY2FjaGU6ZSxjPWY/ZVt1XTplW3VdJiZ1O2lmKCghY3x8IWxbY118fCFpJiYhbFtjXS5kYXRhKSYmYSYmcj09PXQpcmV0dXJuO2N8fChmP2VbdV09Yz12LmRlbGV0ZWRJZHMucG9wKCl8fHYuZ3VpZCsrOmM9dSksbFtjXXx8KGxbY109e30sZnx8KGxbY10udG9KU09OPXYubm9vcCkpO2lmKHR5cGVvZiBuPT0ib2JqZWN0Inx8dHlwZW9mIG49PSJmdW5jdGlvbiIpaT9sW2NdPXYuZXh0ZW5kKGxbY10sbik6bFtjXS5kYXRhPXYuZXh0ZW5kKGxbY10uZGF0YSxuKTtyZXR1cm4gcz1sW2NdLGl8fChzLmRhdGF8fChzLmRhdGE9e30pLHM9cy5kYXRhKSxyIT09dCYmKHNbdi5jYW1lbENhc2UobildPXIpLGE/KG89c1tuXSxvPT1udWxsJiYobz1zW3YuY2FtZWxDYXNlKG4pXSkpOm89cyxvfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCxuKXtpZighdi5hY2NlcHREYXRhKGUpKXJldHVybjt2YXIgcixpLHMsbz1lLm5vZGVUeXBlLHU9bz92LmNhY2hlOmUsYT1vP2Vbdi5leHBhbmRvXTp2LmV4cGFuZG87aWYoIXVbYV0pcmV0dXJuO2lmKHQpe3I9bj91W2FdOnVbYV0uZGF0YTtpZihyKXt2LmlzQXJyYXkodCl8fCh0IGluIHI/dD1bdF06KHQ9di5jYW1lbENhc2UodCksdCBpbiByP3Q9W3RdOnQ9dC5zcGxpdCgiICIpKSk7Zm9yKGk9MCxzPXQubGVuZ3RoO2k8cztpKyspZGVsZXRlIHJbdFtpXV07aWYoIShuP0I6di5pc0VtcHR5T2JqZWN0KShyKSlyZXR1cm59fWlmKCFuKXtkZWxldGUgdVthXS5kYXRhO2lmKCFCKHVbYV0pKXJldHVybn1vP3YuY2xlYW5EYXRhKFtlXSwhMCk6di5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fHUhPXUud2luZG93P2RlbGV0ZSB1W2FdOnVbYV09bnVsbH0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2LmRhdGEoZSx0LG4sITApfSxhY2NlcHREYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUmJnYubm9EYXRhW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07cmV0dXJuIXR8fHQhPT0hMCYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PXR9fSksdi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oZSxuKXt2YXIgcixpLHMsbyx1LGE9dGhpc1swXSxmPTAsbD1udWxsO2lmKGU9PT10KXtpZih0aGlzLmxlbmd0aCl7bD12LmRhdGEoYSk7aWYoYS5ub2RlVHlwZT09PTEmJiF2Ll9kYXRhKGEsInBhcnNlZEF0dHJzIikpe3M9YS5hdHRyaWJ1dGVzO2Zvcih1PXMubGVuZ3RoO2Y8dTtmKyspbz1zW2ZdLm5hbWUsby5pbmRleE9mKCJkYXRhLSIpfHwobz12LmNhbWVsQ2FzZShvLnN1YnN0cmluZyg1KSksSChhLG8sbFtvXSkpO3YuX2RhdGEoYSwicGFyc2VkQXR0cnMiLCEwKX19cmV0dXJuIGx9cmV0dXJuIHR5cGVvZiBlPT0ib2JqZWN0Ij90aGlzLmVhY2goZnVuY3Rpb24oKXt2LmRhdGEodGhpcyxlKX0pOihyPWUuc3BsaXQoIi4iLDIpLHJbMV09clsxXT8iLiIrclsxXToiIixpPXJbMV0rIiEiLHYuYWNjZXNzKHRoaXMsZnVuY3Rpb24obil7aWYobj09PXQpcmV0dXJuIGw9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIraSxbclswXV0pLGw9PT10JiZhJiYobD12LmRhdGEoYSxlKSxsPUgoYSxlLGwpKSxsPT09dCYmclsxXT90aGlzLmRhdGEoclswXSk6bDtyWzFdPW4sdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dih0aGlzKTt0LnRyaWdnZXJIYW5kbGVyKCJzZXREYXRhIitpLHIpLHYuZGF0YSh0aGlzLGUsbiksdC50cmlnZ2VySGFuZGxlcigiY2hhbmdlRGF0YSIraSxyKX0pfSxudWxsLG4sYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITEpKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5yZW1vdmVEYXRhKHRoaXMsZSl9KX19KSx2LmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKGUpcmV0dXJuIHQ9KHR8fCJmeCIpKyJxdWV1ZSIscj12Ll9kYXRhKGUsdCksbiYmKCFyfHx2LmlzQXJyYXkobik/cj12Ll9kYXRhKGUsdCx2Lm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ImZ4Ijt2YXIgbj12LnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxzPXYuX3F1ZXVlSG9va3MoZSx0KSxvPWZ1bmN0aW9uKCl7di5kZXF1ZXVlKGUsdCl9O2k9PT0iaW5wcm9ncmVzcyImJihpPW4uc2hpZnQoKSxyLS0pLGkmJih0PT09ImZ4IiYmbi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIHMuc3RvcCxpLmNhbGwoZSxvLHMpKSwhciYmcyYmcy5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIHYuX2RhdGEoZSxuKXx8di5fZGF0YShlLG4se2VtcHR5OnYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe3YucmVtb3ZlRGF0YShlLHQrInF1ZXVlIiwhMCksdi5yZW1vdmVEYXRhKGUsbiwhMCl9KX0pfX0pLHYuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLG4pe3ZhciByPTI7cmV0dXJuIHR5cGVvZiBlIT0ic3RyaW5nIiYmKG49ZSxlPSJmeCIsci0tKSxhcmd1bWVudHMubGVuZ3RoPHI/di5xdWV1ZSh0aGlzWzBdLGUpOm49PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9di5xdWV1ZSh0aGlzLGUsbik7di5fcXVldWVIb29rcyh0aGlzLGUpLGU9PT0iZngiJiZ0WzBdIT09ImlucHJvZ3Jlc3MiJiZ2LmRlcXVldWUodGhpcyxlKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2LmRlcXVldWUodGhpcyxlKX0pfSxkZWxheTpmdW5jdGlvbihlLHQpe3JldHVybiBlPXYuZng/di5meC5zcGVlZHNbZV18fGU6ZSx0PXR8fCJmeCIsdGhpcy5xdWV1ZSh0LGZ1bmN0aW9uKHQsbil7dmFyIHI9c2V0VGltZW91dCh0LGUpO24uc3RvcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChyKX19KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5xdWV1ZShlfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihlLG4pe3ZhciByLGk9MSxzPXYuRGVmZXJyZWQoKSxvPXRoaXMsdT10aGlzLmxlbmd0aCxhPWZ1bmN0aW9uKCl7LS1pfHxzLnJlc29sdmVXaXRoKG8sW29dKX07dHlwZW9mIGUhPSJzdHJpbmciJiYobj1lLGU9dCksZT1lfHwiZngiO3doaWxlKHUtLSlyPXYuX2RhdGEob1t1XSxlKyJxdWV1ZUhvb2tzIiksciYmci5lbXB0eSYmKGkrKyxyLmVtcHR5LmFkZChhKSk7cmV0dXJuIGEoKSxzLnByb21pc2Uobil9fSk7dmFyIGosRixJLHE9L1tcdFxyXG5dL2csUj0vXHIvZyxVPS9eKD86YnV0dG9ufGlucHV0KSQvaSx6PS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLFc9L15hKD86cmVhfCkkL2ksWD0vXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSxWPXYuc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGU7di5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdi5hY2Nlc3ModGhpcyx2LmF0dHIsZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3YucmVtb3ZlQXR0cih0aGlzLGUpfSl9LHByb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdi5hY2Nlc3ModGhpcyx2LnByb3AsZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9di5wcm9wRml4W2VdfHxlLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2VdPXQsZGVsZXRlIHRoaXNbZV19Y2F0Y2gobil7fX0pfSxhZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxzLG8sdTtpZih2LmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt2KHRoaXMpLmFkZENsYXNzKGUuY2FsbCh0aGlzLHQsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGUmJnR5cGVvZiBlPT0ic3RyaW5nIil7dD1lLnNwbGl0KHkpO2ZvcihuPTAscj10aGlzLmxlbmd0aDtuPHI7bisrKXtpPXRoaXNbbl07aWYoaS5ub2RlVHlwZT09PTEpaWYoIWkuY2xhc3NOYW1lJiZ0Lmxlbmd0aD09PTEpaS5jbGFzc05hbWU9ZTtlbHNle3M9IiAiK2kuY2xhc3NOYW1lKyIgIjtmb3Iobz0wLHU9dC5sZW5ndGg7bzx1O28rKylzLmluZGV4T2YoIiAiK3Rbb10rIiAiKTwwJiYocys9dFtvXSsiICIpO2kuY2xhc3NOYW1lPXYudHJpbShzKX19fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihlKXt2YXIgbixyLGkscyxvLHUsYTtpZih2LmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt2KHRoaXMpLnJlbW92ZUNsYXNzKGUuY2FsbCh0aGlzLHQsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGUmJnR5cGVvZiBlPT0ic3RyaW5nInx8ZT09PXQpe249KGV8fCIiKS5zcGxpdCh5KTtmb3IodT0wLGE9dGhpcy5sZW5ndGg7dTxhO3UrKyl7aT10aGlzW3VdO2lmKGkubm9kZVR5cGU9PT0xJiZpLmNsYXNzTmFtZSl7cj0oIiAiK2kuY2xhc3NOYW1lKyIgIikucmVwbGFjZShxLCIgIik7Zm9yKHM9MCxvPW4ubGVuZ3RoO3M8bztzKyspd2hpbGUoci5pbmRleE9mKCIgIituW3NdKyIgIik+PTApcj1yLnJlcGxhY2UoIiAiK25bc10rIiAiLCIgIik7aS5jbGFzc05hbWU9ZT92LnRyaW0ocik6IiJ9fX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZSxyPXR5cGVvZiB0PT0iYm9vbGVhbiI7cmV0dXJuIHYuaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24obil7dih0aGlzKS50b2dnbGVDbGFzcyhlLmNhbGwodGhpcyxuLHRoaXMuY2xhc3NOYW1lLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYobj09PSJzdHJpbmciKXt2YXIgaSxzPTAsbz12KHRoaXMpLHU9dCxhPWUuc3BsaXQoeSk7d2hpbGUoaT1hW3MrK10pdT1yP3U6IW8uaGFzQ2xhc3MoaSksb1t1PyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oaSl9ZWxzZSBpZihuPT09InVuZGVmaW5lZCJ8fG49PT0iYm9vbGVhbiIpdGhpcy5jbGFzc05hbWUmJnYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxlPT09ITE/IiI6di5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIifSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0PSIgIitlKyIgIixuPTAscj10aGlzLmxlbmd0aDtmb3IoO248cjtuKyspaWYodGhpc1tuXS5ub2RlVHlwZT09PTEmJigiICIrdGhpc1tuXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHEsIiAiKS5pbmRleE9mKHQpPj0wKXJldHVybiEwO3JldHVybiExfSx2YWw6ZnVuY3Rpb24oZSl7dmFyIG4scixpLHM9dGhpc1swXTtpZighYXJndW1lbnRzLmxlbmd0aCl7aWYocylyZXR1cm4gbj12LnZhbEhvb2tzW3MudHlwZV18fHYudmFsSG9va3Nbcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxuJiYiZ2V0ImluIG4mJihyPW4uZ2V0KHMsInZhbHVlIikpIT09dD9yOihyPXMudmFsdWUsdHlwZW9mIHI9PSJzdHJpbmciP3IucmVwbGFjZShSLCIiKTpyPT1udWxsPyIiOnIpO3JldHVybn1yZXR1cm4gaT12LmlzRnVuY3Rpb24oZSksdGhpcy5lYWNoKGZ1bmN0aW9uKHIpe3ZhciBzLG89dih0aGlzKTtpZih0aGlzLm5vZGVUeXBlIT09MSlyZXR1cm47aT9zPWUuY2FsbCh0aGlzLHIsby52YWwoKSk6cz1lLHM9PW51bGw/cz0iIjp0eXBlb2Ygcz09Im51bWJlciI/cys9IiI6di5pc0FycmF5KHMpJiYocz12Lm1hcChzLGZ1bmN0aW9uKGUpe3JldHVybiBlPT1udWxsPyIiOmUrIiJ9KSksbj12LnZhbEhvb2tzW3RoaXMudHlwZV18fHYudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtpZighbnx8ISgic2V0ImluIG4pfHxuLnNldCh0aGlzLHMsInZhbHVlIik9PT10KXRoaXMudmFsdWU9c30pfX0pLHYuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdHRyaWJ1dGVzLnZhbHVlO3JldHVybiF0fHx0LnNwZWNpZmllZD9lLnZhbHVlOmUudGV4dH19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLm9wdGlvbnMsaT1lLnNlbGVjdGVkSW5kZXgscz1lLnR5cGU9PT0ic2VsZWN0LW9uZSJ8fGk8MCxvPXM/bnVsbDpbXSx1PXM/aSsxOnIubGVuZ3RoLGE9aTwwP3U6cz9pOjA7Zm9yKDthPHU7YSsrKXtuPXJbYV07aWYoKG4uc2VsZWN0ZWR8fGE9PT1pKSYmKHYuc3VwcG9ydC5vcHREaXNhYmxlZD8hbi5kaXNhYmxlZDpuLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IXYubm9kZU5hbWUobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7dD12KG4pLnZhbCgpO2lmKHMpcmV0dXJuIHQ7by5wdXNoKHQpfX1yZXR1cm4gb30sc2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49di5tYWtlQXJyYXkodCk7cmV0dXJuIHYoZSkuZmluZCgib3B0aW9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9di5pbkFycmF5KHYodGhpcykudmFsKCksbik+PTB9KSxuLmxlbmd0aHx8KGUuc2VsZWN0ZWRJbmRleD0tMSksbn19fSxhdHRyRm46e30sYXR0cjpmdW5jdGlvbihlLG4scixpKXt2YXIgcyxvLHUsYT1lLm5vZGVUeXBlO2lmKCFlfHxhPT09M3x8YT09PTh8fGE9PT0yKXJldHVybjtpZihpJiZ2LmlzRnVuY3Rpb24odi5mbltuXSkpcmV0dXJuIHYoZSlbbl0ocik7aWYodHlwZW9mIGUuZ2V0QXR0cmlidXRlPT0idW5kZWZpbmVkIilyZXR1cm4gdi5wcm9wKGUsbixyKTt1PWEhPT0xfHwhdi5pc1hNTERvYyhlKSx1JiYobj1uLnRvTG93ZXJDYXNlKCksbz12LmF0dHJIb29rc1tuXXx8KFgudGVzdChuKT9GOmopKTtpZihyIT09dCl7aWYocj09PW51bGwpe3YucmVtb3ZlQXR0cihlLG4pO3JldHVybn1yZXR1cm4gbyYmInNldCJpbiBvJiZ1JiYocz1vLnNldChlLHIsbikpIT09dD9zOihlLnNldEF0dHJpYnV0ZShuLHIrIiIpLHIpfXJldHVybiBvJiYiZ2V0ImluIG8mJnUmJihzPW8uZ2V0KGUsbikpIT09bnVsbD9zOihzPWUuZ2V0QXR0cmlidXRlKG4pLHM9PT1udWxsP3Q6cyl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxvPTA7aWYodCYmZS5ub2RlVHlwZT09PTEpe3I9dC5zcGxpdCh5KTtmb3IoO288ci5sZW5ndGg7bysrKWk9cltvXSxpJiYobj12LnByb3BGaXhbaV18fGkscz1YLnRlc3QoaSksc3x8di5hdHRyKGUsaSwiIiksZS5yZW1vdmVBdHRyaWJ1dGUoVj9pOm4pLHMmJm4gaW4gZSYmKGVbbl09ITEpKX19LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoVS50ZXN0KGUubm9kZU5hbWUpJiZlLnBhcmVudE5vZGUpdi5lcnJvcigidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIik7ZWxzZSBpZighdi5zdXBwb3J0LnJhZGlvVmFsdWUmJnQ9PT0icmFkaW8iJiZ2Lm5vZGVOYW1lKGUsImlucHV0Iikpe3ZhciBuPWUudmFsdWU7cmV0dXJuIGUuc2V0QXR0cmlidXRlKCJ0eXBlIix0KSxuJiYoZS52YWx1ZT1uKSx0fX19LHZhbHVlOntnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaiYmdi5ub2RlTmFtZShlLCJidXR0b24iKT9qLmdldChlLHQpOnQgaW4gZT9lLnZhbHVlOm51bGx9LHNldDpmdW5jdGlvbihlLHQsbil7aWYoaiYmdi5ub2RlTmFtZShlLCJidXR0b24iKSlyZXR1cm4gai5zZXQoZSx0LG4pO2UudmFsdWU9dH19fSxwcm9wRml4Ont0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJyZWFkT25seSIsImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsY2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIixjb250ZW50ZWRpdGFibGU6ImNvbnRlbnRFZGl0YWJsZSJ9LHByb3A6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLHMsbyx1PWUubm9kZVR5cGU7aWYoIWV8fHU9PT0zfHx1PT09OHx8dT09PTIpcmV0dXJuO3JldHVybiBvPXUhPT0xfHwhdi5pc1hNTERvYyhlKSxvJiYobj12LnByb3BGaXhbbl18fG4scz12LnByb3BIb29rc1tuXSksciE9PXQ/cyYmInNldCJpbiBzJiYoaT1zLnNldChlLHIsbikpIT09dD9pOmVbbl09cjpzJiYiZ2V0ImluIHMmJihpPXMuZ2V0KGUsbikpIT09bnVsbD9pOmVbbl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgbj1lLmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7cmV0dXJuIG4mJm4uc3BlY2lmaWVkP3BhcnNlSW50KG4udmFsdWUsMTApOnoudGVzdChlLm5vZGVOYW1lKXx8Vy50ZXN0KGUubm9kZU5hbWUpJiZlLmhyZWY/MDp0fX19fSksRj17Z2V0OmZ1bmN0aW9uKGUsbil7dmFyIHIsaT12LnByb3AoZSxuKTtyZXR1cm4gaT09PSEwfHx0eXBlb2YgaSE9ImJvb2xlYW4iJiYocj1lLmdldEF0dHJpYnV0ZU5vZGUobikpJiZyLm5vZGVWYWx1ZSE9PSExP24udG9Mb3dlckNhc2UoKTp0fSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiB0PT09ITE/di5yZW1vdmVBdHRyKGUsbik6KHI9di5wcm9wRml4W25dfHxuLHIgaW4gZSYmKGVbcl09ITApLGUuc2V0QXR0cmlidXRlKG4sbi50b0xvd2VyQ2FzZSgpKSksbn19LFZ8fChJPXtuYW1lOiEwLGlkOiEwLGNvb3JkczohMH0saj12LnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGUsbil7dmFyIHI7cmV0dXJuIHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKG4pLHImJihJW25dP3IudmFsdWUhPT0iIjpyLnNwZWNpZmllZCk/ci52YWx1ZTp0fSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZ2V0QXR0cmlidXRlTm9kZShuKTtyZXR1cm4gcnx8KHI9aS5jcmVhdGVBdHRyaWJ1dGUobiksZS5zZXRBdHRyaWJ1dGVOb2RlKHIpKSxyLnZhbHVlPXQrIiJ9fSx2LmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGUsdCl7di5hdHRySG9va3NbdF09di5leHRlbmQodi5hdHRySG9va3NbdF0se3NldDpmdW5jdGlvbihlLG4pe2lmKG49PT0iIilyZXR1cm4gZS5zZXRBdHRyaWJ1dGUodCwiYXV0byIpLG59fSl9KSx2LmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e2dldDpqLmdldCxzZXQ6ZnVuY3Rpb24oZSx0LG4pe3Q9PT0iIiYmKHQ9ImZhbHNlIiksai5zZXQoZSx0LG4pfX0pLHYuc3VwcG9ydC5ocmVmTm9ybWFsaXplZHx8di5lYWNoKFsiaHJlZiIsInNyYyIsIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oZSxuKXt2LmF0dHJIb29rc1tuXT12LmV4dGVuZCh2LmF0dHJIb29rc1tuXSx7Z2V0OmZ1bmN0aW9uKGUpe3ZhciByPWUuZ2V0QXR0cmlidXRlKG4sMik7cmV0dXJuIHI9PT1udWxsP3Q6cn19KX0pLHYuc3VwcG9ydC5zdHlsZXx8KHYuYXR0ckhvb2tzLnN0eWxlPXtnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpfHx0fSxzZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zdHlsZS5jc3NUZXh0PXQrIiJ9fSksdi5zdXBwb3J0Lm9wdFNlbGVjdGVkfHwodi5wcm9wSG9va3Muc2VsZWN0ZWQ9di5leHRlbmQodi5wcm9wSG9va3Muc2VsZWN0ZWQse2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJih0LnNlbGVjdGVkSW5kZXgsdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH19KSksdi5zdXBwb3J0LmVuY3R5cGV8fCh2LnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKSx2LnN1cHBvcnQuY2hlY2tPbnx8di5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7di52YWxIb29rc1t0aGlzXT17Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjplLnZhbHVlfX19KSx2LmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXt2LnZhbEhvb2tzW3RoaXNdPXYuZXh0ZW5kKHYudmFsSG9va3NbdGhpc10se3NldDpmdW5jdGlvbihlLHQpe2lmKHYuaXNBcnJheSh0KSlyZXR1cm4gZS5jaGVja2VkPXYuaW5BcnJheSh2KGUpLnZhbCgpLHQpPj0wfX0pfSk7dmFyICQ9L14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLEo9L14oW15cLl0qfCkoPzpcLiguKyl8KSQvLEs9Lyg/Ol58XHMpaG92ZXIoXC5cUyt8KVxiLyxRPS9ea2V5LyxHPS9eKD86bW91c2V8Y29udGV4dG1lbnUpfGNsaWNrLyxZPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxaPWZ1bmN0aW9uKGUpe3JldHVybiB2LmV2ZW50LnNwZWNpYWwuaG92ZXI/ZTplLnJlcGxhY2UoSywibW91c2VlbnRlciQxIG1vdXNlbGVhdmUkMSIpfTt2LmV2ZW50PXthZGQ6ZnVuY3Rpb24oZSxuLHIsaSxzKXt2YXIgbyx1LGEsZixsLGMsaCxwLGQsbSxnO2lmKGUubm9kZVR5cGU9PT0zfHxlLm5vZGVUeXBlPT09OHx8IW58fCFyfHwhKG89di5fZGF0YShlKSkpcmV0dXJuO3IuaGFuZGxlciYmKGQ9cixyPWQuaGFuZGxlcixzPWQuc2VsZWN0b3IpLHIuZ3VpZHx8KHIuZ3VpZD12Lmd1aWQrKyksYT1vLmV2ZW50cyxhfHwoby5ldmVudHM9YT17fSksdT1vLmhhbmRsZSx1fHwoby5oYW5kbGU9dT1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIHY9PSJ1bmRlZmluZWQifHwhIWUmJnYuZXZlbnQudHJpZ2dlcmVkPT09ZS50eXBlP3Q6di5ldmVudC5kaXNwYXRjaC5hcHBseSh1LmVsZW0sYXJndW1lbnRzKX0sdS5lbGVtPWUpLG49di50cmltKFoobikpLnNwbGl0KCIgIik7Zm9yKGY9MDtmPG4ubGVuZ3RoO2YrKyl7bD1KLmV4ZWMobltmXSl8fFtdLGM9bFsxXSxoPShsWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZz12LmV2ZW50LnNwZWNpYWxbY118fHt9LGM9KHM/Zy5kZWxlZ2F0ZVR5cGU6Zy5iaW5kVHlwZSl8fGMsZz12LmV2ZW50LnNwZWNpYWxbY118fHt9LHA9di5leHRlbmQoe3R5cGU6YyxvcmlnVHlwZTpsWzFdLGRhdGE6aSxoYW5kbGVyOnIsZ3VpZDpyLmd1aWQsc2VsZWN0b3I6cyxuZWVkc0NvbnRleHQ6cyYmdi5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KHMpLG5hbWVzcGFjZTpoLmpvaW4oIi4iKX0sZCksbT1hW2NdO2lmKCFtKXttPWFbY109W10sbS5kZWxlZ2F0ZUNvdW50PTA7aWYoIWcuc2V0dXB8fGcuc2V0dXAuY2FsbChlLGksaCx1KT09PSExKWUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoYyx1LCExKTplLmF0dGFjaEV2ZW50JiZlLmF0dGFjaEV2ZW50KCJvbiIrYyx1KX1nLmFkZCYmKGcuYWRkLmNhbGwoZSxwKSxwLmhhbmRsZXIuZ3VpZHx8KHAuaGFuZGxlci5ndWlkPXIuZ3VpZCkpLHM/bS5zcGxpY2UobS5kZWxlZ2F0ZUNvdW50KyssMCxwKTptLnB1c2gocCksdi5ldmVudC5nbG9iYWxbY109ITB9ZT1udWxsfSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHMsbyx1LGEsZixsLGMsaCxwLGQsbSxnPXYuaGFzRGF0YShlKSYmdi5fZGF0YShlKTtpZighZ3x8IShoPWcuZXZlbnRzKSlyZXR1cm47dD12LnRyaW0oWih0fHwiIikpLnNwbGl0KCIgIik7Zm9yKHM9MDtzPHQubGVuZ3RoO3MrKyl7bz1KLmV4ZWModFtzXSl8fFtdLHU9YT1vWzFdLGY9b1syXTtpZighdSl7Zm9yKHUgaW4gaCl2LmV2ZW50LnJlbW92ZShlLHUrdFtzXSxuLHIsITApO2NvbnRpbnVlfXA9di5ldmVudC5zcGVjaWFsW3VdfHx7fSx1PShyP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHx1LGQ9aFt1XXx8W10sbD1kLmxlbmd0aCxmPWY/bmV3IFJlZ0V4cCgiKF58XFwuKSIrZi5zcGxpdCgiLiIpLnNvcnQoKS5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsO2ZvcihjPTA7YzxkLmxlbmd0aDtjKyspbT1kW2NdLChpfHxhPT09bS5vcmlnVHlwZSkmJighbnx8bi5ndWlkPT09bS5ndWlkKSYmKCFmfHxmLnRlc3QobS5uYW1lc3BhY2UpKSYmKCFyfHxyPT09bS5zZWxlY3Rvcnx8cj09PSIqKiImJm0uc2VsZWN0b3IpJiYoZC5zcGxpY2UoYy0tLDEpLG0uc2VsZWN0b3ImJmQuZGVsZWdhdGVDb3VudC0tLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGUsbSkpO2QubGVuZ3RoPT09MCYmbCE9PWQubGVuZ3RoJiYoKCFwLnRlYXJkb3dufHxwLnRlYXJkb3duLmNhbGwoZSxmLGcuaGFuZGxlKT09PSExKSYmdi5yZW1vdmVFdmVudChlLHUsZy5oYW5kbGUpLGRlbGV0ZSBoW3VdKX12LmlzRW1wdHlPYmplY3QoaCkmJihkZWxldGUgZy5oYW5kbGUsdi5yZW1vdmVEYXRhKGUsImV2ZW50cyIsITApKX0sY3VzdG9tRXZlbnQ6e2dldERhdGE6ITAsc2V0RGF0YTohMCxjaGFuZ2VEYXRhOiEwfSx0cmlnZ2VyOmZ1bmN0aW9uKG4scixzLG8pe2lmKCFzfHxzLm5vZGVUeXBlIT09MyYmcy5ub2RlVHlwZSE9PTgpe3ZhciB1LGEsZixsLGMsaCxwLGQsbSxnLHk9bi50eXBlfHxuLGI9W107aWYoWS50ZXN0KHkrdi5ldmVudC50cmlnZ2VyZWQpKXJldHVybjt5LmluZGV4T2YoIiEiKT49MCYmKHk9eS5zbGljZSgwLC0xKSxhPSEwKSx5LmluZGV4T2YoIi4iKT49MCYmKGI9eS5zcGxpdCgiLiIpLHk9Yi5zaGlmdCgpLGIuc29ydCgpKTtpZigoIXN8fHYuZXZlbnQuY3VzdG9tRXZlbnRbeV0pJiYhdi5ldmVudC5nbG9iYWxbeV0pcmV0dXJuO249dHlwZW9mIG49PSJvYmplY3QiP25bdi5leHBhbmRvXT9uOm5ldyB2LkV2ZW50KHksbik6bmV3IHYuRXZlbnQoeSksbi50eXBlPXksbi5pc1RyaWdnZXI9ITAsbi5leGNsdXNpdmU9YSxuLm5hbWVzcGFjZT1iLmpvaW4oIi4iKSxuLm5hbWVzcGFjZV9yZT1uLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitiLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsaD15LmluZGV4T2YoIjoiKTwwPyJvbiIreToiIjtpZighcyl7dT12LmNhY2hlO2ZvcihmIGluIHUpdVtmXS5ldmVudHMmJnVbZl0uZXZlbnRzW3ldJiZ2LmV2ZW50LnRyaWdnZXIobixyLHVbZl0uaGFuZGxlLmVsZW0sITApO3JldHVybn1uLnJlc3VsdD10LG4udGFyZ2V0fHwobi50YXJnZXQ9cykscj1yIT1udWxsP3YubWFrZUFycmF5KHIpOltdLHIudW5zaGlmdChuKSxwPXYuZXZlbnQuc3BlY2lhbFt5XXx8e307aWYocC50cmlnZ2VyJiZwLnRyaWdnZXIuYXBwbHkocyxyKT09PSExKXJldHVybjttPVtbcyxwLmJpbmRUeXBlfHx5XV07aWYoIW8mJiFwLm5vQnViYmxlJiYhdi5pc1dpbmRvdyhzKSl7Zz1wLmRlbGVnYXRlVHlwZXx8eSxsPVkudGVzdChnK3kpP3M6cy5wYXJlbnROb2RlO2ZvcihjPXM7bDtsPWwucGFyZW50Tm9kZSltLnB1c2goW2wsZ10pLGM9bDtjPT09KHMub3duZXJEb2N1bWVudHx8aSkmJm0ucHVzaChbYy5kZWZhdWx0Vmlld3x8Yy5wYXJlbnRXaW5kb3d8fGUsZ10pfWZvcihmPTA7ZjxtLmxlbmd0aCYmIW4uaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtmKyspbD1tW2ZdWzBdLG4udHlwZT1tW2ZdWzFdLGQ9KHYuX2RhdGEobCwiZXZlbnRzIil8fHt9KVtuLnR5cGVdJiZ2Ll9kYXRhKGwsImhhbmRsZSIpLGQmJmQuYXBwbHkobCxyKSxkPWgmJmxbaF0sZCYmdi5hY2NlcHREYXRhKGwpJiZkLmFwcGx5JiZkLmFwcGx5KGwscik9PT0hMSYmbi5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBuLnR5cGU9eSwhbyYmIW4uaXNEZWZhdWx0UHJldmVudGVkKCkmJighcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShzLm93bmVyRG9jdW1lbnQscik9PT0hMSkmJih5IT09ImNsaWNrInx8IXYubm9kZU5hbWUocywiYSIpKSYmdi5hY2NlcHREYXRhKHMpJiZoJiZzW3ldJiYoeSE9PSJmb2N1cyImJnkhPT0iYmx1ciJ8fG4udGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiF2LmlzV2luZG93KHMpJiYoYz1zW2hdLGMmJihzW2hdPW51bGwpLHYuZXZlbnQudHJpZ2dlcmVkPXksc1t5XSgpLHYuZXZlbnQudHJpZ2dlcmVkPXQsYyYmKHNbaF09YykpLG4ucmVzdWx0fXJldHVybn0sZGlzcGF0Y2g6ZnVuY3Rpb24obil7bj12LmV2ZW50LmZpeChufHxlLmV2ZW50KTt2YXIgcixpLHMsbyx1LGEsZixjLGgscCxkPSh2Ll9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbbi50eXBlXXx8W10sbT1kLmRlbGVnYXRlQ291bnQsZz1sLmNhbGwoYXJndW1lbnRzKSx5PSFuLmV4Y2x1c2l2ZSYmIW4ubmFtZXNwYWNlLGI9di5ldmVudC5zcGVjaWFsW24udHlwZV18fHt9LHc9W107Z1swXT1uLG4uZGVsZWdhdGVUYXJnZXQ9dGhpcztpZihiLnByZURpc3BhdGNoJiZiLnByZURpc3BhdGNoLmNhbGwodGhpcyxuKT09PSExKXJldHVybjtpZihtJiYoIW4uYnV0dG9ufHxuLnR5cGUhPT0iY2xpY2siKSlmb3Iocz1uLnRhcmdldDtzIT10aGlzO3M9cy5wYXJlbnROb2RlfHx0aGlzKWlmKHMuZGlzYWJsZWQhPT0hMHx8bi50eXBlIT09ImNsaWNrIil7dT17fSxmPVtdO2ZvcihyPTA7cjxtO3IrKyljPWRbcl0saD1jLnNlbGVjdG9yLHVbaF09PT10JiYodVtoXT1jLm5lZWRzQ29udGV4dD92KGgsdGhpcykuaW5kZXgocyk+PTA6di5maW5kKGgsdGhpcyxudWxsLFtzXSkubGVuZ3RoKSx1W2hdJiZmLnB1c2goYyk7Zi5sZW5ndGgmJncucHVzaCh7ZWxlbTpzLG1hdGNoZXM6Zn0pfWQubGVuZ3RoPm0mJncucHVzaCh7ZWxlbTp0aGlzLG1hdGNoZXM6ZC5zbGljZShtKX0pO2ZvcihyPTA7cjx3Lmxlbmd0aCYmIW4uaXNQcm9wYWdhdGlvblN0b3BwZWQoKTtyKyspe2E9d1tyXSxuLmN1cnJlbnRUYXJnZXQ9YS5lbGVtO2ZvcihpPTA7aTxhLm1hdGNoZXMubGVuZ3RoJiYhbi5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpO2krKyl7Yz1hLm1hdGNoZXNbaV07aWYoeXx8IW4ubmFtZXNwYWNlJiYhYy5uYW1lc3BhY2V8fG4ubmFtZXNwYWNlX3JlJiZuLm5hbWVzcGFjZV9yZS50ZXN0KGMubmFtZXNwYWNlKSluLmRhdGE9Yy5kYXRhLG4uaGFuZGxlT2JqPWMsbz0oKHYuZXZlbnQuc3BlY2lhbFtjLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8Yy5oYW5kbGVyKS5hcHBseShhLmVsZW0sZyksbyE9PXQmJihuLnJlc3VsdD1vLG89PT0hMSYmKG4ucHJldmVudERlZmF1bHQoKSxuLnN0b3BQcm9wYWdhdGlvbigpKSl9fXJldHVybiBiLnBvc3REaXNwYXRjaCYmYi5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLG4pLG4ucmVzdWx0fSxwcm9wczoiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUud2hpY2g9PW51bGwmJihlLndoaWNoPXQuY2hhckNvZGUhPW51bGw/dC5jaGFyQ29kZTp0LmtleUNvZGUpLGV9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50Ii5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihlLG4pe3ZhciByLHMsbyx1PW4uYnV0dG9uLGE9bi5mcm9tRWxlbWVudDtyZXR1cm4gZS5wYWdlWD09bnVsbCYmbi5jbGllbnRYIT1udWxsJiYocj1lLnRhcmdldC5vd25lckRvY3VtZW50fHxpLHM9ci5kb2N1bWVudEVsZW1lbnQsbz1yLmJvZHksZS5wYWdlWD1uLmNsaWVudFgrKHMmJnMuc2Nyb2xsTGVmdHx8byYmby5zY3JvbGxMZWZ0fHwwKS0ocyYmcy5jbGllbnRMZWZ0fHxvJiZvLmNsaWVudExlZnR8fDApLGUucGFnZVk9bi5jbGllbnRZKyhzJiZzLnNjcm9sbFRvcHx8byYmby5zY3JvbGxUb3B8fDApLShzJiZzLmNsaWVudFRvcHx8byYmby5jbGllbnRUb3B8fDApKSwhZS5yZWxhdGVkVGFyZ2V0JiZhJiYoZS5yZWxhdGVkVGFyZ2V0PWE9PT1lLnRhcmdldD9uLnRvRWxlbWVudDphKSwhZS53aGljaCYmdSE9PXQmJihlLndoaWNoPXUmMT8xOnUmMj8zOnUmND8yOjApLGV9fSxmaXg6ZnVuY3Rpb24oZSl7aWYoZVt2LmV4cGFuZG9dKXJldHVybiBlO3ZhciB0LG4scj1lLHM9di5ldmVudC5maXhIb29rc1tlLnR5cGVdfHx7fSxvPXMucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQocy5wcm9wcyk6dGhpcy5wcm9wcztlPXYuRXZlbnQocik7Zm9yKHQ9by5sZW5ndGg7dDspbj1vWy0tdF0sZVtuXT1yW25dO3JldHVybiBlLnRhcmdldHx8KGUudGFyZ2V0PXIuc3JjRWxlbWVudHx8aSksZS50YXJnZXQubm9kZVR5cGU9PT0zJiYoZS50YXJnZXQ9ZS50YXJnZXQucGFyZW50Tm9kZSksZS5tZXRhS2V5PSEhZS5tZXRhS2V5LHMuZmlsdGVyP3MuZmlsdGVyKGUscik6ZX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOntkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOntkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihlLHQsbil7di5pc1dpbmRvdyh0aGlzKSYmKHRoaXMub25iZWZvcmV1bmxvYWQ9bil9LHRlYXJkb3duOmZ1bmN0aW9uKGUsdCl7dGhpcy5vbmJlZm9yZXVubG9hZD09PXQmJih0aGlzLm9uYmVmb3JldW5sb2FkPW51bGwpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXYuZXh0ZW5kKG5ldyB2LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7cj92LmV2ZW50LnRyaWdnZXIoaSxudWxsLHQpOnYuZXZlbnQuZGlzcGF0Y2guY2FsbCh0LGkpLGkuaXNEZWZhdWx0UHJldmVudGVkKCkmJm4ucHJldmVudERlZmF1bHQoKX19LHYuZXZlbnQuaGFuZGxlPXYuZXZlbnQuZGlzcGF0Y2gsdi5yZW1vdmVFdmVudD1pLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMSl9OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0ib24iK3Q7ZS5kZXRhY2hFdmVudCYmKHR5cGVvZiBlW3JdPT0idW5kZWZpbmVkIiYmKGVbcl09bnVsbCksZS5kZXRhY2hFdmVudChyLG4pKX0sdi5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHYuRXZlbnQpKXJldHVybiBuZXcgdi5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fGUucmV0dXJuVmFsdWU9PT0hMXx8ZS5nZXRQcmV2ZW50RGVmYXVsdCYmZS5nZXRQcmV2ZW50RGVmYXVsdCgpP3R0OmV0KTp0aGlzLnR5cGU9ZSx0JiZ2LmV4dGVuZCh0aGlzLHQpLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHx2Lm5vdygpLHRoaXNbdi5leHBhbmRvXT0hMH0sdi5FdmVudC5wcm90b3R5cGU9e3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9dHQ7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKCFlKXJldHVybjtlLnByZXZlbnREZWZhdWx0P2UucHJldmVudERlZmF1bHQoKTplLnJldHVyblZhbHVlPSExfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXR0O3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDtpZighZSlyZXR1cm47ZS5zdG9wUHJvcGFnYXRpb24mJmUuc3RvcFByb3BhZ2F0aW9uKCksZS5jYW5jZWxCdWJibGU9ITB9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9dHQsdGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOmV0LGlzUHJvcGFnYXRpb25TdG9wcGVkOmV0LGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmV0fSx2LmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihlLHQpe3YuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LHM9ZS5oYW5kbGVPYmosbz1zLnNlbGVjdG9yO2lmKCFpfHxpIT09ciYmIXYuY29udGFpbnMocixpKSllLnR5cGU9cy5vcmlnVHlwZSxuPXMuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS50eXBlPXQ7cmV0dXJuIG59fX0pLHYuc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwodi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtpZih2Lm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTt2LmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGUpe3ZhciBuPWUudGFyZ2V0LHI9di5ub2RlTmFtZShuLCJpbnB1dCIpfHx2Lm5vZGVOYW1lKG4sImJ1dHRvbiIpP24uZm9ybTp0O3ImJiF2Ll9kYXRhKHIsIl9zdWJtaXRfYXR0YWNoZWQiKSYmKHYuZXZlbnQuYWRkKHIsInN1Ym1pdC5fc3VibWl0IixmdW5jdGlvbihlKXtlLl9zdWJtaXRfYnViYmxlPSEwfSksdi5fZGF0YShyLCJfc3VibWl0X2F0dGFjaGVkIiwhMCkpfSl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihlKXtlLl9zdWJtaXRfYnViYmxlJiYoZGVsZXRlIGUuX3N1Ym1pdF9idWJibGUsdGhpcy5wYXJlbnROb2RlJiYhZS5pc1RyaWdnZXImJnYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGUsITApKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtpZih2Lm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTt2LmV2ZW50LnJlbW92ZSh0aGlzLCIuX3N1Ym1pdCIpfX0pLHYuc3VwcG9ydC5jaGFuZ2VCdWJibGVzfHwodi5ldmVudC5zcGVjaWFsLmNoYW5nZT17c2V0dXA6ZnVuY3Rpb24oKXtpZigkLnRlc3QodGhpcy5ub2RlTmFtZSkpe2lmKHRoaXMudHlwZT09PSJjaGVja2JveCJ8fHRoaXMudHlwZT09PSJyYWRpbyIpdi5ldmVudC5hZGQodGhpcywicHJvcGVydHljaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oZSl7ZS5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZT09PSJjaGVja2VkIiYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMCl9KSx2LmV2ZW50LmFkZCh0aGlzLCJjbGljay5fY2hhbmdlIixmdW5jdGlvbihlKXt0aGlzLl9qdXN0X2NoYW5nZWQmJiFlLmlzVHJpZ2dlciYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMSksdi5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLGUsITApfSk7cmV0dXJuITF9di5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7JC50ZXN0KHQubm9kZU5hbWUpJiYhdi5fZGF0YSh0LCJfY2hhbmdlX2F0dGFjaGVkIikmJih2LmV2ZW50LmFkZCh0LCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiYhZS5pc1NpbXVsYXRlZCYmIWUuaXNUcmlnZ2VyJiZ2LmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMucGFyZW50Tm9kZSxlLCEwKX0pLHYuX2RhdGEodCwiX2NoYW5nZV9hdHRhY2hlZCIsITApKX0pfSxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQ7aWYodGhpcyE9PXR8fGUuaXNTaW11bGF0ZWR8fGUuaXNUcmlnZ2VyfHx0LnR5cGUhPT0icmFkaW8iJiZ0LnR5cGUhPT0iY2hlY2tib3giKXJldHVybiBlLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtyZXR1cm4gdi5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFuZ2UiKSwhJC50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLHYuc3VwcG9ydC5mb2N1c2luQnViYmxlc3x8di5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihlLHQpe3ZhciBuPTAscj1mdW5jdGlvbihlKXt2LmV2ZW50LnNpbXVsYXRlKHQsZS50YXJnZXQsdi5ldmVudC5maXgoZSksITApfTt2LmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7bisrPT09MCYmaS5hZGRFdmVudExpc3RlbmVyKGUsciwhMCl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7LS1uPT09MCYmaS5yZW1vdmVFdmVudExpc3RlbmVyKGUsciwhMCl9fX0pLHYuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihlLG4scixpLHMpe3ZhciBvLHU7aWYodHlwZW9mIGU9PSJvYmplY3QiKXt0eXBlb2YgbiE9InN0cmluZyImJihyPXJ8fG4sbj10KTtmb3IodSBpbiBlKXRoaXMub24odSxuLHIsZVt1XSxzKTtyZXR1cm4gdGhpc31yPT1udWxsJiZpPT1udWxsPyhpPW4scj1uPXQpOmk9PW51bGwmJih0eXBlb2Ygbj09InN0cmluZyI/KGk9cixyPXQpOihpPXIscj1uLG49dCkpO2lmKGk9PT0hMSlpPWV0O2Vsc2UgaWYoIWkpcmV0dXJuIHRoaXM7cmV0dXJuIHM9PT0xJiYobz1pLGk9ZnVuY3Rpb24oZSl7cmV0dXJuIHYoKS5vZmYoZSksby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGkuZ3VpZD1vLmd1aWR8fChvLmd1aWQ9di5ndWlkKyspKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2LmV2ZW50LmFkZCh0aGlzLGUsaSxyLG4pfSl9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbihlLHQsbixyLDEpfSxvZmY6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLHM7aWYoZSYmZS5wcmV2ZW50RGVmYXVsdCYmZS5oYW5kbGVPYmopcmV0dXJuIGk9ZS5oYW5kbGVPYmosdihlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoaS5uYW1lc3BhY2U/aS5vcmlnVHlwZSsiLiIraS5uYW1lc3BhY2U6aS5vcmlnVHlwZSxpLnNlbGVjdG9yLGkuaGFuZGxlciksdGhpcztpZih0eXBlb2YgZT09Im9iamVjdCIpe2ZvcihzIGluIGUpdGhpcy5vZmYocyxuLGVbc10pO3JldHVybiB0aGlzfWlmKG49PT0hMXx8dHlwZW9mIG49PSJmdW5jdGlvbiIpcj1uLG49dDtyZXR1cm4gcj09PSExJiYocj1ldCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5ldmVudC5yZW1vdmUodGhpcyxlLHIsbil9KX0sYmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGxpdmU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2KHRoaXMuY29udGV4dCkub24oZSx0aGlzLnNlbGVjdG9yLHQsbiksdGhpc30sZGllOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYodGhpcy5jb250ZXh0KS5vZmYoZSx0aGlzLnNlbGVjdG9yfHwiKioiLHQpLHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9LHRyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe2lmKHRoaXNbMF0pcmV0dXJuIHYuZXZlbnQudHJpZ2dlcihlLHQsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMsbj1lLmd1aWR8fHYuZ3VpZCsrLHI9MCxpPWZ1bmN0aW9uKG4pe3ZhciBpPSh2Ll9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2UuZ3VpZCl8fDApJXI7cmV0dXJuIHYuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrZS5ndWlkLGkrMSksbi5wcmV2ZW50RGVmYXVsdCgpLHRbaV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwhMX07aS5ndWlkPW47d2hpbGUocjx0Lmxlbmd0aCl0W3IrK10uZ3VpZD1uO3JldHVybiB0aGlzLmNsaWNrKGkpfSxob3ZlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoZSkubW91c2VsZWF2ZSh0fHxlKX19KSx2LmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXt2LmZuW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG49PW51bGwmJihuPWUsZT1udWxsKSxhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbih0LG51bGwsZSxuKTp0aGlzLnRyaWdnZXIodCl9LFEudGVzdCh0KSYmKHYuZXZlbnQuZml4SG9va3NbdF09di5ldmVudC5rZXlIb29rcyksRy50ZXN0KHQpJiYodi5ldmVudC5maXhIb29rc1t0XT12LmV2ZW50Lm1vdXNlSG9va3MpfSksZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBudChlLHQsbixyKXtuPW58fFtdLHQ9dHx8Zzt2YXIgaSxzLGEsZixsPXQubm9kZVR5cGU7aWYoIWV8fHR5cGVvZiBlIT0ic3RyaW5nIilyZXR1cm4gbjtpZihsIT09MSYmbCE9PTkpcmV0dXJuW107YT1vKHQpO2lmKCFhJiYhcilpZihpPVIuZXhlYyhlKSlpZihmPWlbMV0pe2lmKGw9PT05KXtzPXQuZ2V0RWxlbWVudEJ5SWQoZik7aWYoIXN8fCFzLnBhcmVudE5vZGUpcmV0dXJuIG47aWYocy5pZD09PWYpcmV0dXJuIG4ucHVzaChzKSxufWVsc2UgaWYodC5vd25lckRvY3VtZW50JiYocz10Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZikpJiZ1KHQscykmJnMuaWQ9PT1mKXJldHVybiBuLnB1c2gocyksbn1lbHNle2lmKGlbMl0pcmV0dXJuIFMuYXBwbHkobix4LmNhbGwodC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKSwwKSksbjtpZigoZj1pWzNdKSYmWiYmdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBTLmFwcGx5KG4seC5jYWxsKHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmKSwwKSksbn1yZXR1cm4gdnQoZS5yZXBsYWNlKGosIiQxIiksdCxuLHIsYSl9ZnVuY3Rpb24gcnQoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gbj09PSJpbnB1dCImJnQudHlwZT09PWV9fWZ1bmN0aW9uIGl0KGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKG49PT0iaW5wdXQifHxuPT09ImJ1dHRvbiIpJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBzdChlKXtyZXR1cm4gTihmdW5jdGlvbih0KXtyZXR1cm4gdD0rdCxOKGZ1bmN0aW9uKG4scil7dmFyIGkscz1lKFtdLG4ubGVuZ3RoLHQpLG89cy5sZW5ndGg7d2hpbGUoby0tKW5baT1zW29dXSYmKG5baV09IShyW2ldPW5baV0pKX0pfSl9ZnVuY3Rpb24gb3QoZSx0LG4pe2lmKGU9PT10KXJldHVybiBuO3ZhciByPWUubmV4dFNpYmxpbmc7d2hpbGUocil7aWYocj09PXQpcmV0dXJuLTE7cj1yLm5leHRTaWJsaW5nfXJldHVybiAxfWZ1bmN0aW9uIHV0KGUsdCl7dmFyIG4scixzLG8sdSxhLGYsbD1MW2RdW2UrIiAiXTtpZihsKXJldHVybiB0PzA6bC5zbGljZSgwKTt1PWUsYT1bXSxmPWkucHJlRmlsdGVyO3doaWxlKHUpe2lmKCFufHwocj1GLmV4ZWModSkpKXImJih1PXUuc2xpY2UoclswXS5sZW5ndGgpfHx1KSxhLnB1c2gocz1bXSk7bj0hMTtpZihyPUkuZXhlYyh1KSlzLnB1c2gobj1uZXcgbShyLnNoaWZ0KCkpKSx1PXUuc2xpY2Uobi5sZW5ndGgpLG4udHlwZT1yWzBdLnJlcGxhY2UoaiwiICIpO2ZvcihvIGluIGkuZmlsdGVyKShyPUpbb10uZXhlYyh1KSkmJighZltvXXx8KHI9ZltvXShyKSkpJiYocy5wdXNoKG49bmV3IG0oci5zaGlmdCgpKSksdT11LnNsaWNlKG4ubGVuZ3RoKSxuLnR5cGU9byxuLm1hdGNoZXM9cik7aWYoIW4pYnJlYWt9cmV0dXJuIHQ/dS5sZW5ndGg6dT9udC5lcnJvcihlKTpMKGUsYSkuc2xpY2UoMCl9ZnVuY3Rpb24gYXQoZSx0LHIpe3ZhciBpPXQuZGlyLHM9ciYmdC5kaXI9PT0icGFyZW50Tm9kZSIsbz13Kys7cmV0dXJuIHQuZmlyc3Q/ZnVuY3Rpb24odCxuLHIpe3doaWxlKHQ9dFtpXSlpZihzfHx0Lm5vZGVUeXBlPT09MSlyZXR1cm4gZSh0LG4scil9OmZ1bmN0aW9uKHQscix1KXtpZighdSl7dmFyIGEsZj1iKyIgIitvKyIgIixsPWYrbjt3aGlsZSh0PXRbaV0paWYoc3x8dC5ub2RlVHlwZT09PTEpe2lmKChhPXRbZF0pPT09bClyZXR1cm4gdC5zaXpzZXQ7aWYodHlwZW9mIGE9PSJzdHJpbmciJiZhLmluZGV4T2YoZik9PT0wKXtpZih0LnNpenNldClyZXR1cm4gdH1lbHNle3RbZF09bDtpZihlKHQscix1KSlyZXR1cm4gdC5zaXpzZXQ9ITAsdDt0LnNpenNldD0hMX19fWVsc2Ugd2hpbGUodD10W2ldKWlmKHN8fHQubm9kZVR5cGU9PT0xKWlmKGUodCxyLHUpKXJldHVybiB0fX1mdW5jdGlvbiBmdChlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5jdGlvbih0LG4scil7dmFyIGk9ZS5sZW5ndGg7d2hpbGUoaS0tKWlmKCFlW2ldKHQsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06ZVswXX1mdW5jdGlvbiBsdChlLHQsbixyLGkpe3ZhciBzLG89W10sdT0wLGE9ZS5sZW5ndGgsZj10IT1udWxsO2Zvcig7dTxhO3UrKylpZihzPWVbdV0paWYoIW58fG4ocyxyLGkpKW8ucHVzaChzKSxmJiZ0LnB1c2godSk7cmV0dXJuIG99ZnVuY3Rpb24gY3QoZSx0LG4scixpLHMpe3JldHVybiByJiYhcltkXSYmKHI9Y3QocikpLGkmJiFpW2RdJiYoaT1jdChpLHMpKSxOKGZ1bmN0aW9uKHMsbyx1LGEpe3ZhciBmLGwsYyxoPVtdLHA9W10sZD1vLmxlbmd0aCx2PXN8fGR0KHR8fCIqIix1Lm5vZGVUeXBlP1t1XTp1LFtdKSxtPWUmJihzfHwhdCk/bHQodixoLGUsdSxhKTp2LGc9bj9pfHwocz9lOmR8fHIpP1tdOm86bTtuJiZuKG0sZyx1LGEpO2lmKHIpe2Y9bHQoZyxwKSxyKGYsW10sdSxhKSxsPWYubGVuZ3RoO3doaWxlKGwtLSlpZihjPWZbbF0pZ1twW2xdXT0hKG1bcFtsXV09Yyl9aWYocyl7aWYoaXx8ZSl7aWYoaSl7Zj1bXSxsPWcubGVuZ3RoO3doaWxlKGwtLSkoYz1nW2xdKSYmZi5wdXNoKG1bbF09Yyk7aShudWxsLGc9W10sZixhKX1sPWcubGVuZ3RoO3doaWxlKGwtLSkoYz1nW2xdKSYmKGY9aT9ULmNhbGwocyxjKTpoW2xdKT4tMSYmKHNbZl09IShvW2ZdPWMpKX19ZWxzZSBnPWx0KGc9PT1vP2cuc3BsaWNlKGQsZy5sZW5ndGgpOmcpLGk/aShudWxsLG8sZyxhKTpTLmFwcGx5KG8sZyl9KX1mdW5jdGlvbiBodChlKXt2YXIgdCxuLHIscz1lLmxlbmd0aCxvPWkucmVsYXRpdmVbZVswXS50eXBlXSx1PW98fGkucmVsYXRpdmVbIiAiXSxhPW8/MTowLGY9YXQoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSx1LCEwKSxsPWF0KGZ1bmN0aW9uKGUpe3JldHVybiBULmNhbGwodCxlKT4tMX0sdSwhMCksaD1bZnVuY3Rpb24oZSxuLHIpe3JldHVybiFvJiYocnx8biE9PWMpfHwoKHQ9bikubm9kZVR5cGU/ZihlLG4scik6bChlLG4scikpfV07Zm9yKDthPHM7YSsrKWlmKG49aS5yZWxhdGl2ZVtlW2FdLnR5cGVdKWg9W2F0KGZ0KGgpLG4pXTtlbHNle249aS5maWx0ZXJbZVthXS50eXBlXS5hcHBseShudWxsLGVbYV0ubWF0Y2hlcyk7aWYobltkXSl7cj0rK2E7Zm9yKDtyPHM7cisrKWlmKGkucmVsYXRpdmVbZVtyXS50eXBlXSlicmVhaztyZXR1cm4gY3QoYT4xJiZmdChoKSxhPjEmJmUuc2xpY2UoMCxhLTEpLmpvaW4oIiIpLnJlcGxhY2UoaiwiJDEiKSxuLGE8ciYmaHQoZS5zbGljZShhLHIpKSxyPHMmJmh0KGU9ZS5zbGljZShyKSkscjxzJiZlLmpvaW4oIiIpKX1oLnB1c2gobil9cmV0dXJuIGZ0KGgpfWZ1bmN0aW9uIHB0KGUsdCl7dmFyIHI9dC5sZW5ndGg+MCxzPWUubGVuZ3RoPjAsbz1mdW5jdGlvbih1LGEsZixsLGgpe3ZhciBwLGQsdixtPVtdLHk9MCx3PSIwIix4PXUmJltdLFQ9aCE9bnVsbCxOPWMsQz11fHxzJiZpLmZpbmQuVEFHKCIqIixoJiZhLnBhcmVudE5vZGV8fGEpLGs9Yis9Tj09bnVsbD8xOk1hdGguRTtUJiYoYz1hIT09ZyYmYSxuPW8uZWwpO2Zvcig7KHA9Q1t3XSkhPW51bGw7dysrKXtpZihzJiZwKXtmb3IoZD0wO3Y9ZVtkXTtkKyspaWYodihwLGEsZikpe2wucHVzaChwKTticmVha31UJiYoYj1rLG49KytvLmVsKX1yJiYoKHA9IXYmJnApJiZ5LS0sdSYmeC5wdXNoKHApKX15Kz13O2lmKHImJnchPT15KXtmb3IoZD0wO3Y9dFtkXTtkKyspdih4LG0sYSxmKTtpZih1KXtpZih5PjApd2hpbGUody0tKSF4W3ddJiYhbVt3XSYmKG1bd109RS5jYWxsKGwpKTttPWx0KG0pfVMuYXBwbHkobCxtKSxUJiYhdSYmbS5sZW5ndGg+MCYmeSt0Lmxlbmd0aD4xJiZudC51bmlxdWVTb3J0KGwpfXJldHVybiBUJiYoYj1rLGM9TikseH07cmV0dXJuIG8uZWw9MCxyP04obyk6b31mdW5jdGlvbiBkdChlLHQsbil7dmFyIHI9MCxpPXQubGVuZ3RoO2Zvcig7cjxpO3IrKyludChlLHRbcl0sbik7cmV0dXJuIG59ZnVuY3Rpb24gdnQoZSx0LG4scixzKXt2YXIgbyx1LGYsbCxjLGg9dXQoZSkscD1oLmxlbmd0aDtpZighciYmaC5sZW5ndGg9PT0xKXt1PWhbMF09aFswXS5zbGljZSgwKTtpZih1Lmxlbmd0aD4yJiYoZj11WzBdKS50eXBlPT09IklEIiYmdC5ub2RlVHlwZT09PTkmJiFzJiZpLnJlbGF0aXZlW3VbMV0udHlwZV0pe3Q9aS5maW5kLklEKGYubWF0Y2hlc1swXS5yZXBsYWNlKCQsIiIpLHQscylbMF07aWYoIXQpcmV0dXJuIG47ZT1lLnNsaWNlKHUuc2hpZnQoKS5sZW5ndGgpfWZvcihvPUouUE9TLnRlc3QoZSk/LTE6dS5sZW5ndGgtMTtvPj0wO28tLSl7Zj11W29dO2lmKGkucmVsYXRpdmVbbD1mLnR5cGVdKWJyZWFrO2lmKGM9aS5maW5kW2xdKWlmKHI9YyhmLm1hdGNoZXNbMF0ucmVwbGFjZSgkLCIiKSx6LnRlc3QodVswXS50eXBlKSYmdC5wYXJlbnROb2RlfHx0LHMpKXt1LnNwbGljZShvLDEpLGU9ci5sZW5ndGgmJnUuam9pbigiIik7aWYoIWUpcmV0dXJuIFMuYXBwbHkobix4LmNhbGwociwwKSksbjticmVha319fXJldHVybiBhKGUsaCkocix0LHMsbix6LnRlc3QoZSkpLG59ZnVuY3Rpb24gbXQoKXt9dmFyIG4scixpLHMsbyx1LGEsZixsLGMsaD0hMCxwPSJ1bmRlZmluZWQiLGQ9KCJzaXpjYWNoZSIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgiLiIsIiIpLG09U3RyaW5nLGc9ZS5kb2N1bWVudCx5PWcuZG9jdW1lbnRFbGVtZW50LGI9MCx3PTAsRT1bXS5wb3AsUz1bXS5wdXNoLHg9W10uc2xpY2UsVD1bXS5pbmRleE9mfHxmdW5jdGlvbihlKXt2YXIgdD0wLG49dGhpcy5sZW5ndGg7Zm9yKDt0PG47dCsrKWlmKHRoaXNbdF09PT1lKXJldHVybiB0O3JldHVybi0xfSxOPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbZF09dD09bnVsbHx8dCxlfSxDPWZ1bmN0aW9uKCl7dmFyIGU9e30sdD1bXTtyZXR1cm4gTihmdW5jdGlvbihuLHIpe3JldHVybiB0LnB1c2gobik+aS5jYWNoZUxlbmd0aCYmZGVsZXRlIGVbdC5zaGlmdCgpXSxlW24rIiAiXT1yfSxlKX0saz1DKCksTD1DKCksQT1DKCksTz0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTT0iKD86XFxcXC58Wy1cXHddfFteXFx4MDAtXFx4YTBdKSsiLF89TS5yZXBsYWNlKCJ3IiwidyMiKSxEPSIoWypeJHwhfl0/PSkiLFA9IlxcWyIrTysiKigiK00rIikiK08rIiooPzoiK0QrTysiKig/OihbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDN8KCIrXysiKXwpfCkiK08rIipcXF0iLEg9IjooIitNKyIpKD86XFwoKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcMnwoW14oKVtcXF1dKnwoPzooPzoiK1ArIil8W146XXxcXFxcLikqfC4qKSlcXCl8KSIsQj0iOihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK08rIiooKD86LVxcZCk/XFxkKikiK08rIipcXCl8KSg/PVteLV18JCkiLGo9bmV3IFJlZ0V4cCgiXiIrTysiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitPKyIrJCIsImciKSxGPW5ldyBSZWdFeHAoIl4iK08rIiosIitPKyIqIiksST1uZXcgUmVnRXhwKCJeIitPKyIqKFtcXHgyMFxcdFxcclxcblxcZj4rfl0pIitPKyIqIikscT1uZXcgUmVnRXhwKEgpLFI9L14oPzojKFtcd1wtXSspfChcdyspfFwuKFtcd1wtXSspKSQvLFU9L146bm90Lyx6PS9bXHgyMFx0XHJcblxmXSpbK35dLyxXPS86bm90XCgkLyxYPS9oXGQvaSxWPS9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2ksJD0vXFwoPyFcXCkvZyxKPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLE5BTUU6bmV3IFJlZ0V4cCgiXlxcW25hbWU9WydcIl0/KCIrTSsiKVsnXCJdP1xcXSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTS5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrUCksUFNFVURPOm5ldyBSZWdFeHAoIl4iK0gpLFBPUzpuZXcgUmVnRXhwKEIsImkiKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fG50aHxmaXJzdHxsYXN0KS1jaGlsZCg/OlxcKCIrTysiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTysiKig/OihbKy1dfCkiK08rIiooXFxkKyl8KSkiK08rIipcXCl8KSIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTysiKls+K35dfCIrQiwiaSIpfSxLPWZ1bmN0aW9uKGUpe3ZhciB0PWcuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiBlKHQpfWNhdGNoKG4pe3JldHVybiExfWZpbmFsbHl7dD1udWxsfX0sUT1LKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKGcuY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSksRz1LKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsZS5maXJzdENoaWxkJiZ0eXBlb2YgZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9PXAmJmUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIjIn0pLFk9SyhmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iPHNlbGVjdD48L3NlbGVjdD4iO3ZhciB0PXR5cGVvZiBlLmxhc3RDaGlsZC5nZXRBdHRyaWJ1dGUoIm11bHRpcGxlIik7cmV0dXJuIHQhPT0iYm9vbGVhbiImJnQhPT0ic3RyaW5nIn0pLFo9SyhmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J2hpZGRlbiBlJz48L2Rpdj48ZGl2IGNsYXNzPSdoaWRkZW4nPjwvZGl2PiIsIWUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZXx8IWUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD8hMTooZS5sYXN0Q2hpbGQuY2xhc3NOYW1lPSJlIixlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg9PT0yKX0pLGV0PUsoZnVuY3Rpb24oZSl7ZS5pZD1kKzAsZS5pbm5lckhUTUw9IjxhIG5hbWU9JyIrZCsiJz48L2E+PGRpdiBuYW1lPSciK2QrIic+PC9kaXY+Iix5Lmluc2VydEJlZm9yZShlLHkuZmlyc3RDaGlsZCk7dmFyIHQ9Zy5nZXRFbGVtZW50c0J5TmFtZSYmZy5nZXRFbGVtZW50c0J5TmFtZShkKS5sZW5ndGg9PT0yK2cuZ2V0RWxlbWVudHNCeU5hbWUoZCswKS5sZW5ndGg7cmV0dXJuIHI9IWcuZ2V0RWxlbWVudEJ5SWQoZCkseS5yZW1vdmVDaGlsZChlKSx0fSk7dHJ5e3guY2FsbCh5LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godHQpe3g9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXTtmb3IoO3Q9dGhpc1tlXTtlKyspbi5wdXNoKHQpO3JldHVybiBufX1udC5tYXRjaGVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG50KGUsbnVsbCxudWxsLHQpfSxudC5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnQodCxudWxsLG51bGwsW2VdKS5sZW5ndGg+MH0scz1udC5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLGk9ZS5ub2RlVHlwZTtpZihpKXtpZihpPT09MXx8aT09PTl8fGk9PT0xMSl7aWYodHlwZW9mIGUudGV4dENvbnRlbnQ9PSJzdHJpbmciKXJldHVybiBlLnRleHRDb250ZW50O2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyluKz1zKGUpfWVsc2UgaWYoaT09PTN8fGk9PT00KXJldHVybiBlLm5vZGVWYWx1ZX1lbHNlIGZvcig7dD1lW3JdO3IrKyluKz1zKHQpO3JldHVybiBufSxvPW50LmlzWE1MPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJihlLm93bmVyRG9jdW1lbnR8fGUpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gdD90Lm5vZGVOYW1lIT09IkhUTUwiOiExfSx1PW50LmNvbnRhaW5zPXkuY29udGFpbnM/ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm5vZGVUeXBlPT09OT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISEociYmci5ub2RlVHlwZT09PTEmJm4uY29udGFpbnMmJm4uY29udGFpbnMocikpfTp5LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIHQmJiEhKGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkmMTYpfTpmdW5jdGlvbihlLHQpe3doaWxlKHQ9dC5wYXJlbnROb2RlKWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSxudC5hdHRyPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1vKGUpO3JldHVybiByfHwodD10LnRvTG93ZXJDYXNlKCkpLChuPWkuYXR0ckhhbmRsZVt0XSk/bihlKTpyfHxZP2UuZ2V0QXR0cmlidXRlKHQpOihuPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSxuP3R5cGVvZiBlW3RdPT0iYm9vbGVhbiI/ZVt0XT90Om51bGw6bi5zcGVjaWZpZWQ/bi52YWx1ZTpudWxsOm51bGwpfSxpPW50LnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOk4sbWF0Y2g6SixhdHRySGFuZGxlOkc/e306e2hyZWY6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJocmVmIiwyKX0sdHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoInR5cGUiKX19LGZpbmQ6e0lEOnI/ZnVuY3Rpb24oZSx0LG4pe2lmKHR5cGVvZiB0LmdldEVsZW1lbnRCeUlkIT09cCYmIW4pe3ZhciByPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIHImJnIucGFyZW50Tm9kZT9bcl06W119fTpmdW5jdGlvbihlLG4scil7aWYodHlwZW9mIG4uZ2V0RWxlbWVudEJ5SWQhPT1wJiYhcil7dmFyIGk9bi5nZXRFbGVtZW50QnlJZChlKTtyZXR1cm4gaT9pLmlkPT09ZXx8dHlwZW9mIGkuZ2V0QXR0cmlidXRlTm9kZSE9PXAmJmkuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS52YWx1ZT09PWU/W2ldOnQ6W119fSxUQUc6UT9mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lIT09cClyZXR1cm4gdC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2lmKGU9PT0iKiIpe3ZhciByLGk9W10scz0wO2Zvcig7cj1uW3NdO3MrKylyLm5vZGVUeXBlPT09MSYmaS5wdXNoKHIpO3JldHVybiBpfXJldHVybiBufSxOQU1FOmV0JiZmdW5jdGlvbihlLHQpe2lmKHR5cGVvZiB0LmdldEVsZW1lbnRzQnlOYW1lIT09cClyZXR1cm4gdC5nZXRFbGVtZW50c0J5TmFtZShuYW1lKX0sQ0xBU1M6WiYmZnVuY3Rpb24oZSx0LG4pe2lmKHR5cGVvZiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPT1wJiYhbilyZXR1cm4gdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpfX0scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKCQsIiIpLGVbM109KGVbNF18fGVbNV18fCIiKS5yZXBsYWNlKCQsIiIpLGVbMl09PT0ifj0iJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLGVbMV09PT0ibnRoIj8oZVsyXXx8bnQuZXJyb3IoZVswXSksZVszXT0rKGVbM10/ZVs0XSsoZVs1XXx8MSk6MiooZVsyXT09PSJldmVuInx8ZVsyXT09PSJvZGQiKSksZVs0XT0rKGVbNl0rZVs3XXx8ZVsyXT09PSJvZGQiKSk6ZVsyXSYmbnQuZXJyb3IoZVswXSksZX0sUFNFVURPOmZ1bmN0aW9uKGUpe3ZhciB0LG47aWYoSi5DSElMRC50ZXN0KGVbMF0pKXJldHVybiBudWxsO2lmKGVbM10pZVsyXT1lWzNdO2Vsc2UgaWYodD1lWzRdKXEudGVzdCh0KSYmKG49dXQodCwhMCkpJiYobj10LmluZGV4T2YoIikiLHQubGVuZ3RoLW4pLXQubGVuZ3RoKSYmKHQ9dC5zbGljZSgwLG4pLGVbMF09ZVswXS5zbGljZSgwLG4pKSxlWzJdPXQ7cmV0dXJuIGUuc2xpY2UoMCwzKX19LGZpbHRlcjp7SUQ6cj9mdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoJCwiIiksZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJpZCIpPT09ZX19OmZ1bmN0aW9uKGUpe3JldHVybiBlPWUucmVwbGFjZSgkLCIiKSxmdW5jdGlvbih0KXt2YXIgbj10eXBlb2YgdC5nZXRBdHRyaWJ1dGVOb2RlIT09cCYmdC5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09ZX19LFRBRzpmdW5jdGlvbihlKXtyZXR1cm4gZT09PSIqIj9mdW5jdGlvbigpe3JldHVybiEwfTooZT1lLnJlcGxhY2UoJCwiIikudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXtyZXR1cm4gdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZX0pfSxDTEFTUzpmdW5jdGlvbihlKXt2YXIgdD1rW2RdW2UrIiAiXTtyZXR1cm4gdHx8KHQ9bmV3IFJlZ0V4cCgiKF58IitPKyIpIitlKyIoIitPKyJ8JCkiKSkmJmsoZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KGUuY2xhc3NOYW1lfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGUhPT1wJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihyLGkpe3ZhciBzPW50LmF0dHIocixlKTtyZXR1cm4gcz09bnVsbD90PT09IiE9Ijp0PyhzKz0iIix0PT09Ij0iP3M9PT1uOnQ9PT0iIT0iP3MhPT1uOnQ9PT0iXj0iP24mJnMuaW5kZXhPZihuKT09PTA6dD09PSIqPSI/biYmcy5pbmRleE9mKG4pPi0xOnQ9PT0iJD0iP24mJnMuc3Vic3RyKHMubGVuZ3RoLW4ubGVuZ3RoKT09PW46dD09PSJ+PSI/KCIgIitzKyIgIikuaW5kZXhPZihuKT4tMTp0PT09Inw9Ij9zPT09bnx8cy5zdWJzdHIoMCxuLmxlbmd0aCsxKT09PW4rIi0iOiExKTohMH19LENISUxEOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBlPT09Im50aCI/ZnVuY3Rpb24oZSl7dmFyIHQsaSxzPWUucGFyZW50Tm9kZTtpZihuPT09MSYmcj09PTApcmV0dXJuITA7aWYocyl7aT0wO2Zvcih0PXMuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZylpZih0Lm5vZGVUeXBlPT09MSl7aSsrO2lmKGU9PT10KWJyZWFrfX1yZXR1cm4gaS09cixpPT09bnx8aSVuPT09MCYmaS9uPj0wfTpmdW5jdGlvbih0KXt2YXIgbj10O3N3aXRjaChlKXtjYXNlIm9ubHkiOmNhc2UiZmlyc3QiOndoaWxlKG49bi5wcmV2aW91c1NpYmxpbmcpaWYobi5ub2RlVHlwZT09PTEpcmV0dXJuITE7aWYoZT09PSJmaXJzdCIpcmV0dXJuITA7bj10O2Nhc2UibGFzdCI6d2hpbGUobj1uLm5leHRTaWJsaW5nKWlmKG4ubm9kZVR5cGU9PT0xKXJldHVybiExO3JldHVybiEwfX19LFBTRVVETzpmdW5jdGlvbihlLHQpe3ZhciBuLHI9aS5wc2V1ZG9zW2VdfHxpLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8bnQuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIitlKTtyZXR1cm4gcltkXT9yKHQpOnIubGVuZ3RoPjE/KG49W2UsZSwiIix0XSxpLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT9OKGZ1bmN0aW9uKGUsbil7dmFyIGkscz1yKGUsdCksbz1zLmxlbmd0aDt3aGlsZShvLS0paT1ULmNhbGwoZSxzW29dKSxlW2ldPSEobltpXT1zW29dKX0pOmZ1bmN0aW9uKGUpe3JldHVybiByKGUsMCxuKX0pOnJ9fSxwc2V1ZG9zOntub3Q6TihmdW5jdGlvbihlKXt2YXIgdD1bXSxuPVtdLHI9YShlLnJlcGxhY2UoaiwiJDEiKSk7cmV0dXJuIHJbZF0/TihmdW5jdGlvbihlLHQsbixpKXt2YXIgcyxvPXIoZSxudWxsLGksW10pLHU9ZS5sZW5ndGg7d2hpbGUodS0tKWlmKHM9b1t1XSllW3VdPSEodFt1XT1zKX0pOmZ1bmN0aW9uKGUsaSxzKXtyZXR1cm4gdFswXT1lLHIodCxudWxsLHMsbiksIW4ucG9wKCl9fSksaGFzOk4oZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBudChlLHQpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOk4oZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybih0LnRleHRDb250ZW50fHx0LmlubmVyVGV4dHx8cyh0KSkuaW5kZXhPZihlKT4tMX19KSxlbmFibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0PT09ImlucHV0IiYmISFlLmNoZWNrZWR8fHQ9PT0ib3B0aW9uIiYmISFlLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxlLnNlbGVjdGVkPT09ITB9LHBhcmVudDpmdW5jdGlvbihlKXtyZXR1cm4haS5wc2V1ZG9zLmVtcHR5KGUpfSxlbXB0eTpmdW5jdGlvbihlKXt2YXIgdDtlPWUuZmlyc3RDaGlsZDt3aGlsZShlKXtpZihlLm5vZGVOYW1lPiJAInx8KHQ9ZS5ub2RlVHlwZSk9PT0zfHx0PT09NClyZXR1cm4hMTtlPWUubmV4dFNpYmxpbmd9cmV0dXJuITB9LGhlYWRlcjpmdW5jdGlvbihlKXtyZXR1cm4gWC50ZXN0KGUubm9kZU5hbWUpfSx0ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuIGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJih0PWUudHlwZSk9PT0idGV4dCImJigobj1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKT09bnVsbHx8bi50b0xvd2VyQ2FzZSgpPT09dCl9LHJhZGlvOnJ0KCJyYWRpbyIpLGNoZWNrYm94OnJ0KCJjaGVja2JveCIpLGZpbGU6cnQoImZpbGUiKSxwYXNzd29yZDpydCgicGFzc3dvcmQiKSxpbWFnZTpydCgiaW1hZ2UiKSxzdWJtaXQ6aXQoInN1Ym1pdCIpLHJlc2V0Oml0KCJyZXNldCIpLGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHQ9PT0iaW5wdXQiJiZlLnR5cGU9PT0iYnV0dG9uInx8dD09PSJidXR0b24ifSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gVi50ZXN0KGUubm9kZU5hbWUpfSxmb2N1czpmdW5jdGlvbihlKXt2YXIgdD1lLm93bmVyRG9jdW1lbnQ7cmV0dXJuIGU9PT10LmFjdGl2ZUVsZW1lbnQmJighdC5oYXNGb2N1c3x8dC5oYXNGb2N1cygpKSYmISEoZS50eXBlfHxlLmhyZWZ8fH5lLnRhYkluZGV4KX0sYWN0aXZlOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09ZS5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9LGZpcnN0OnN0KGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpzdChmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6c3QoZnVuY3Rpb24oZSx0LG4pe3JldHVybltuPDA/bit0Om5dfSksZXZlbjpzdChmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpzdChmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OnN0KGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOy0tcj49MDspZS5wdXNoKHIpO3JldHVybiBlfSksZ3Q6c3QoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47KytyPHQ7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0sZj15LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10PyhsPSEwLDApOighZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IXQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpJjQpPy0xOjF9OmZ1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGw9ITAsMDtpZihlLnNvdXJjZUluZGV4JiZ0LnNvdXJjZUluZGV4KXJldHVybiBlLnNvdXJjZUluZGV4LXQuc291cmNlSW5kZXg7dmFyIG4scixpPVtdLHM9W10sbz1lLnBhcmVudE5vZGUsdT10LnBhcmVudE5vZGUsYT1vO2lmKG89PT11KXJldHVybiBvdChlLHQpO2lmKCFvKXJldHVybi0xO2lmKCF1KXJldHVybiAxO3doaWxlKGEpaS51bnNoaWZ0KGEpLGE9YS5wYXJlbnROb2RlO2E9dTt3aGlsZShhKXMudW5zaGlmdChhKSxhPWEucGFyZW50Tm9kZTtuPWkubGVuZ3RoLHI9cy5sZW5ndGg7Zm9yKHZhciBmPTA7ZjxuJiZmPHI7ZisrKWlmKGlbZl0hPT1zW2ZdKXJldHVybiBvdChpW2ZdLHNbZl0pO3JldHVybiBmPT09bj9vdChlLHNbZl0sLTEpOm90KGlbZl0sdCwxKX0sWzAsMF0uc29ydChmKSxoPSFsLG50LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxyPTEsaT0wO2w9aCxlLnNvcnQoZik7aWYobCl7Zm9yKDt0PWVbcl07cisrKXQ9PT1lW3ItMV0mJihpPW4ucHVzaChyKSk7d2hpbGUoaS0tKWUuc3BsaWNlKG5baV0sMSl9cmV0dXJuIGV9LG50LmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitlKX0sYT1udC5jb21waWxlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPVtdLHM9QVtkXVtlKyIgIl07aWYoIXMpe3R8fCh0PXV0KGUpKSxuPXQubGVuZ3RoO3doaWxlKG4tLSlzPWh0KHRbbl0pLHNbZF0/ci5wdXNoKHMpOmkucHVzaChzKTtzPUEoZSxwdChpLHIpKX1yZXR1cm4gc30sZy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBlLHQ9dnQsbj0vJ3xcXC9nLHI9L1w9W1x4MjBcdFxyXG5cZl0qKFteJyJcXV0qKVtceDIwXHRcclxuXGZdKlxdL2csaT1bIjpmb2N1cyJdLHM9WyI6YWN0aXZlIl0sdT15Lm1hdGNoZXNTZWxlY3Rvcnx8eS5tb3pNYXRjaGVzU2VsZWN0b3J8fHkud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHx5Lm9NYXRjaGVzU2VsZWN0b3J8fHkubXNNYXRjaGVzU2VsZWN0b3I7SyhmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iPHNlbGVjdD48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsZS5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHxpLnB1c2goIlxcWyIrTysiKig/OmNoZWNrZWR8ZGlzYWJsZWR8aXNtYXB8bXVsdGlwbGV8cmVhZG9ubHl8c2VsZWN0ZWR8dmFsdWUpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8aS5wdXNoKCI6Y2hlY2tlZCIpfSksSyhmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iPHAgdGVzdD0nJz48L3A+IixlLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0ZXN0Xj0nJ10iKS5sZW5ndGgmJmkucHVzaCgiWypeJF09IitPKyIqKD86XCJcInwnJykiKSxlLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J2hpZGRlbicvPiIsZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aHx8aS5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpfSksaT1uZXcgUmVnRXhwKGkuam9pbigifCIpKSx2dD1mdW5jdGlvbihlLHIscyxvLHUpe2lmKCFvJiYhdSYmIWkudGVzdChlKSl7dmFyIGEsZixsPSEwLGM9ZCxoPXIscD1yLm5vZGVUeXBlPT09OSYmZTtpZihyLm5vZGVUeXBlPT09MSYmci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im9iamVjdCIpe2E9dXQoZSksKGw9ci5nZXRBdHRyaWJ1dGUoImlkIikpP2M9bC5yZXBsYWNlKG4sIlxcJCYiKTpyLnNldEF0dHJpYnV0ZSgiaWQiLGMpLGM9IltpZD0nIitjKyInXSAiLGY9YS5sZW5ndGg7d2hpbGUoZi0tKWFbZl09YythW2ZdLmpvaW4oIiIpO2g9ei50ZXN0KGUpJiZyLnBhcmVudE5vZGV8fHIscD1hLmpvaW4oIiwiKX1pZihwKXRyeXtyZXR1cm4gUy5hcHBseShzLHguY2FsbChoLnF1ZXJ5U2VsZWN0b3JBbGwocCksMCkpLHN9Y2F0Y2godil7fWZpbmFsbHl7bHx8ci5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fXJldHVybiB0KGUscixzLG8sdSl9LHUmJihLKGZ1bmN0aW9uKHQpe2U9dS5jYWxsKHQsImRpdiIpO3RyeXt1LmNhbGwodCwiW3Rlc3QhPScnXTpzaXp6bGUiKSxzLnB1c2goIiE9IixIKX1jYXRjaChuKXt9fSkscz1uZXcgUmVnRXhwKHMuam9pbigifCIpKSxudC5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24odCxuKXtuPW4ucmVwbGFjZShyLCI9JyQxJ10iKTtpZighbyh0KSYmIXMudGVzdChuKSYmIWkudGVzdChuKSl0cnl7dmFyIGE9dS5jYWxsKHQsbik7aWYoYXx8ZXx8dC5kb2N1bWVudCYmdC5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBhfWNhdGNoKGYpe31yZXR1cm4gbnQobixudWxsLG51bGwsW3RdKS5sZW5ndGg+MH0pfSgpLGkucHNldWRvcy5udGg9aS5wc2V1ZG9zLmVxLGkuZmlsdGVycz1tdC5wcm90b3R5cGU9aS5wc2V1ZG9zLGkuc2V0RmlsdGVycz1uZXcgbXQsbnQuYXR0cj12LmF0dHIsdi5maW5kPW50LHYuZXhwcj1udC5zZWxlY3RvcnMsdi5leHByWyI6Il09di5leHByLnBzZXVkb3Msdi51bmlxdWU9bnQudW5pcXVlU29ydCx2LnRleHQ9bnQuZ2V0VGV4dCx2LmlzWE1MRG9jPW50LmlzWE1MLHYuY29udGFpbnM9bnQuY29udGFpbnN9KGUpO3ZhciBudD0vVW50aWwkLyxydD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxpdD0vXi5bXjojXFtcLixdKiQvLHN0PXYuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQsb3Q9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07di5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGkscyxvLHU9dGhpcztpZih0eXBlb2YgZSE9InN0cmluZyIpcmV0dXJuIHYoZSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHQ9MCxuPXUubGVuZ3RoO3Q8bjt0KyspaWYodi5jb250YWlucyh1W3RdLHRoaXMpKXJldHVybiEwfSk7bz10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsZSk7Zm9yKHQ9MCxuPXRoaXMubGVuZ3RoO3Q8bjt0Kyspe3I9by5sZW5ndGgsdi5maW5kKGUsdGhpc1t0XSxvKTtpZih0PjApZm9yKGk9cjtpPG8ubGVuZ3RoO2krKylmb3Iocz0wO3M8cjtzKyspaWYob1tzXT09PW9baV0pe28uc3BsaWNlKGktLSwxKTticmVha319cmV0dXJuIG99LGhhczpmdW5jdGlvbihlKXt2YXIgdCxuPXYoZSx0aGlzKSxyPW4ubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7dDxyO3QrKylpZih2LmNvbnRhaW5zKHRoaXMsblt0XSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmdCh0aGlzLGUsITEpLCJub3QiLGUpfSxmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGZ0KHRoaXMsZSwhMCksImZpbHRlciIsZSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhZSYmKHR5cGVvZiBlPT0ic3RyaW5nIj9zdC50ZXN0KGUpP3YoZSx0aGlzLmNvbnRleHQpLmluZGV4KHRoaXNbMF0pPj0wOnYuZmlsdGVyKGUsdGhpcykubGVuZ3RoPjA6dGhpcy5maWx0ZXIoZSkubGVuZ3RoPjApfSxjbG9zZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLGk9dGhpcy5sZW5ndGgscz1bXSxvPXN0LnRlc3QoZSl8fHR5cGVvZiBlIT0ic3RyaW5nIj92KGUsdHx8dGhpcy5jb250ZXh0KTowO2Zvcig7cjxpO3IrKyl7bj10aGlzW3JdO3doaWxlKG4mJm4ub3duZXJEb2N1bWVudCYmbiE9PXQmJm4ubm9kZVR5cGUhPT0xMSl7aWYobz9vLmluZGV4KG4pPi0xOnYuZmluZC5tYXRjaGVzU2VsZWN0b3IobixlKSl7cy5wdXNoKG4pO2JyZWFrfW49bi5wYXJlbnROb2RlfX1yZXR1cm4gcz1zLmxlbmd0aD4xP3YudW5pcXVlKHMpOnMsdGhpcy5wdXNoU3RhY2socywiY2xvc2VzdCIsZSl9LGluZGV4OmZ1bmN0aW9uKGUpe3JldHVybiBlP3R5cGVvZiBlPT0ic3RyaW5nIj92LmluQXJyYXkodGhpc1swXSx2KGUpKTp2LmluQXJyYXkoZS5qcXVlcnk/ZVswXTplLHRoaXMpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBlPT0ic3RyaW5nIj92KGUsdCk6di5tYWtlQXJyYXkoZSYmZS5ub2RlVHlwZT9bZV06ZSkscj12Lm1lcmdlKHRoaXMuZ2V0KCksbik7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHV0KG5bMF0pfHx1dChyWzBdKT9yOnYudW5pcXVlKHIpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQoZT09bnVsbD90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSksdi5mbi5hbmRTZWxmPXYuZm4uYWRkQmFjayx2LmVhY2goe3BhcmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQubm9kZVR5cGUhPT0xMT90Om51bGx9LHBhcmVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuZGlyKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdi5kaXIoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGF0KGUsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oZSl7cmV0dXJuIGF0KGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiB2LmRpcihlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiB2LmRpcihlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdi5kaXIoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2LmRpcihlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4gdi5zaWJsaW5nKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gdi5zaWJsaW5nKGUuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiB2Lm5vZGVOYW1lKGUsImlmcmFtZSIpP2UuY29udGVudERvY3VtZW50fHxlLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ6di5tZXJnZShbXSxlLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oZSx0KXt2LmZuW2VdPWZ1bmN0aW9uKG4scil7dmFyIGk9di5tYXAodGhpcyx0LG4pO3JldHVybiBudC50ZXN0KGUpfHwocj1uKSxyJiZ0eXBlb2Ygcj09InN0cmluZyImJihpPXYuZmlsdGVyKHIsaSkpLGk9dGhpcy5sZW5ndGg+MSYmIW90W2VdP3YudW5pcXVlKGkpOmksdGhpcy5sZW5ndGg+MSYmcnQudGVzdChlKSYmKGk9aS5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKGksZSxsLmNhbGwoYXJndW1lbnRzKS5qb2luKCIsIikpfX0pLHYuZXh0ZW5kKHtmaWx0ZXI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSx0Lmxlbmd0aD09PTE/di5maW5kLm1hdGNoZXNTZWxlY3Rvcih0WzBdLGUpP1t0WzBdXTpbXTp2LmZpbmQubWF0Y2hlcyhlLHQpfSxkaXI6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPVtdLHM9ZVtuXTt3aGlsZShzJiZzLm5vZGVUeXBlIT09OSYmKHI9PT10fHxzLm5vZGVUeXBlIT09MXx8IXYocykuaXMocikpKXMubm9kZVR5cGU9PT0xJiZpLnB1c2gocykscz1zW25dO3JldHVybiBpfSxzaWJsaW5nOmZ1bmN0aW9uKGUsdCl7dmFyIG49W107Zm9yKDtlO2U9ZS5uZXh0U2libGluZyllLm5vZGVUeXBlPT09MSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn19KTt2YXIgY3Q9ImFiYnJ8YXJ0aWNsZXxhc2lkZXxhdWRpb3xiZGl8Y2FudmFzfGRhdGF8ZGF0YWxpc3R8ZGV0YWlsc3xmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8aGVhZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRpbWV8dmlkZW8iLGh0PS8galF1ZXJ5XGQrPSIoPzpudWxsfFxkKykiL2cscHQ9L15ccysvLGR0PS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksdnQ9LzwoW1x3Ol0rKS8sbXQ9Lzx0Ym9keS9pLGd0PS88fCYjP1x3KzsvLHl0PS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksYnQ9LzwoPzpzY3JpcHR8b2JqZWN0fGVtYmVkfG9wdGlvbnxzdHlsZSkvaSx3dD1uZXcgUmVnRXhwKCI8KD86IitjdCsiKVtcXHMvPl0iLCJpIiksRXQ9L14oPzpjaGVja2JveHxyYWRpbykkLyxTdD0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSx4dD0vXC8oamF2YXxlY21hKXNjcmlwdC9pLFR0PS9eXHMqPCEoPzpcW0NEQVRBXFt8XC1cLSl8W1xdXC1dezJ9PlxzKiQvZyxOdD17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfSxDdD1sdChpKSxrdD1DdC5hcHBlbmRDaGlsZChpLmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtOdC5vcHRncm91cD1OdC5vcHRpb24sTnQudGJvZHk9TnQudGZvb3Q9TnQuY29sZ3JvdXA9TnQuY2FwdGlvbj1OdC50aGVhZCxOdC50aD1OdC50ZCx2LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8KE50Ll9kZWZhdWx0PVsxLCJYPGRpdj4iLCI8L2Rpdj4iXSksdi5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10P3YudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGkpLmNyZWF0ZVRleHROb2RlKGUpKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSx3cmFwQWxsOmZ1bmN0aW9uKGUpe2lmKHYuaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3YodGhpcykud3JhcEFsbChlLmNhbGwodGhpcyx0KSl9KTtpZih0aGlzWzBdKXt2YXIgdD12KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdENoaWxkJiZlLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xKWU9ZS5maXJzdENoaWxkO3JldHVybiBlfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7dih0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dih0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD12LmlzRnVuY3Rpb24oZSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXt2KHRoaXMpLndyYXBBbGwodD9lLmNhbGwodGhpcyxuKTplKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7di5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fHYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oZSl7KHRoaXMubm9kZVR5cGU9PT0xfHx0aGlzLm5vZGVUeXBlPT09MTEpJiZ0aGlzLmFwcGVuZENoaWxkKGUpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oZSl7KHRoaXMubm9kZVR5cGU9PT0xfHx0aGlzLm5vZGVUeXBlPT09MTEpJiZ0aGlzLmluc2VydEJlZm9yZShlLHRoaXMuZmlyc3RDaGlsZCl9KX0sYmVmb3JlOmZ1bmN0aW9uKCl7aWYoIXV0KHRoaXNbMF0pKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMSxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgZT12LmNsZWFuKGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHYubWVyZ2UoZSx0aGlzKSwiYmVmb3JlIix0aGlzLnNlbGVjdG9yKX19LGFmdGVyOmZ1bmN0aW9uKCl7aWYoIXV0KHRoaXNbMF0pKXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMSxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KTtpZihhcmd1bWVudHMubGVuZ3RoKXt2YXIgZT12LmNsZWFuKGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHYubWVyZ2UodGhpcyxlKSwiYWZ0ZXIiLHRoaXMuc2VsZWN0b3IpfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2Zvcig7KG49dGhpc1tyXSkhPW51bGw7cisrKWlmKCFlfHx2LmZpbHRlcihlLFtuXSkubGVuZ3RoKSF0JiZuLm5vZGVUeXBlPT09MSYmKHYuY2xlYW5EYXRhKG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksdi5jbGVhbkRhdGEoW25dKSksbi5wYXJlbnROb2RlJiZuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobik7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7dmFyIGUsdD0wO2Zvcig7KGU9dGhpc1t0XSkhPW51bGw7dCsrKXtlLm5vZGVUeXBlPT09MSYmdi5jbGVhbkRhdGEoZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKTt3aGlsZShlLmZpcnN0Q2hpbGQpZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpfXJldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihlLHQpe3JldHVybiBlPWU9PW51bGw/ITE6ZSx0PXQ9PW51bGw/ZTp0LHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHYuY2xvbmUodGhpcyxlLHQpfSl9LGh0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7dmFyIG49dGhpc1swXXx8e30scj0wLGk9dGhpcy5sZW5ndGg7aWYoZT09PXQpcmV0dXJuIG4ubm9kZVR5cGU9PT0xP24uaW5uZXJIVE1MLnJlcGxhY2UoaHQsIiIpOnQ7aWYodHlwZW9mIGU9PSJzdHJpbmciJiYheXQudGVzdChlKSYmKHYuc3VwcG9ydC5odG1sU2VyaWFsaXplfHwhd3QudGVzdChlKSkmJih2LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2V8fCFwdC50ZXN0KGUpKSYmIU50Wyh2dC5leGVjKGUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7ZT1lLnJlcGxhY2UoZHQsIjwkMT48LyQyPiIpO3RyeXtmb3IoO3I8aTtyKyspbj10aGlzW3JdfHx7fSxuLm5vZGVUeXBlPT09MSYmKHYuY2xlYW5EYXRhKG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksbi5pbm5lckhUTUw9ZSk7bj0wfWNhdGNoKHMpe319biYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbihlKXtyZXR1cm4gdXQodGhpc1swXSk/dGhpcy5sZW5ndGg/dGhpcy5wdXNoU3RhY2sodih2LmlzRnVuY3Rpb24oZSk/ZSgpOmUpLCJyZXBsYWNlV2l0aCIsZSk6dGhpczp2LmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPXYodGhpcykscj1uLmh0bWwoKTtuLnJlcGxhY2VXaXRoKGUuY2FsbCh0aGlzLHQscikpfSk6KHR5cGVvZiBlIT0ic3RyaW5nIiYmKGU9dihlKS5kZXRhY2goKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5uZXh0U2libGluZyxuPXRoaXMucGFyZW50Tm9kZTt2KHRoaXMpLnJlbW92ZSgpLHQ/dih0KS5iZWZvcmUoZSk6dihuKS5hcHBlbmQoZSl9KSl9LGRldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZW1vdmUoZSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGUsbixyKXtlPVtdLmNvbmNhdC5hcHBseShbXSxlKTt2YXIgaSxzLG8sdSxhPTAsZj1lWzBdLGw9W10sYz10aGlzLmxlbmd0aDtpZighdi5zdXBwb3J0LmNoZWNrQ2xvbmUmJmM+MSYmdHlwZW9mIGY9PSJzdHJpbmciJiZTdC50ZXN0KGYpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2KHRoaXMpLmRvbU1hbmlwKGUsbixyKX0pO2lmKHYuaXNGdW5jdGlvbihmKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpe3ZhciBzPXYodGhpcyk7ZVswXT1mLmNhbGwodGhpcyxpLG4/cy5odG1sKCk6dCkscy5kb21NYW5pcChlLG4scil9KTtpZih0aGlzWzBdKXtpPXYuYnVpbGRGcmFnbWVudChlLHRoaXMsbCksbz1pLmZyYWdtZW50LHM9by5maXJzdENoaWxkLG8uY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiYobz1zKTtpZihzKXtuPW4mJnYubm9kZU5hbWUocywidHIiKTtmb3IodT1pLmNhY2hlYWJsZXx8Yy0xO2E8YzthKyspci5jYWxsKG4mJnYubm9kZU5hbWUodGhpc1thXSwidGFibGUiKT9MdCh0aGlzW2FdLCJ0Ym9keSIpOnRoaXNbYV0sYT09PXU/bzp2LmNsb25lKG8sITAsITApKX1vPXM9bnVsbCxsLmxlbmd0aCYmdi5lYWNoKGwsZnVuY3Rpb24oZSx0KXt0LnNyYz92LmFqYXg/di5hamF4KHt1cmw6dC5zcmMsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KTp2LmVycm9yKCJubyBhamF4Iik6di5nbG9iYWxFdmFsKCh0LnRleHR8fHQudGV4dENvbnRlbnR8fHQuaW5uZXJIVE1MfHwiIikucmVwbGFjZShUdCwiIikpLHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfSl9cmV0dXJuIHRoaXN9fSksdi5idWlsZEZyYWdtZW50PWZ1bmN0aW9uKGUsbixyKXt2YXIgcyxvLHUsYT1lWzBdO3JldHVybiBuPW58fGksbj0hbi5ub2RlVHlwZSYmblswXXx8bixuPW4ub3duZXJEb2N1bWVudHx8bixlLmxlbmd0aD09PTEmJnR5cGVvZiBhPT0ic3RyaW5nIiYmYS5sZW5ndGg8NTEyJiZuPT09aSYmYS5jaGFyQXQoMCk9PT0iPCImJiFidC50ZXN0KGEpJiYodi5zdXBwb3J0LmNoZWNrQ2xvbmV8fCFTdC50ZXN0KGEpKSYmKHYuc3VwcG9ydC5odG1sNUNsb25lfHwhd3QudGVzdChhKSkmJihvPSEwLHM9di5mcmFnbWVudHNbYV0sdT1zIT09dCksc3x8KHM9bi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksdi5jbGVhbihlLG4scyxyKSxvJiYodi5mcmFnbWVudHNbYV09dSYmcykpLHtmcmFnbWVudDpzLGNhY2hlYWJsZTpvfX0sdi5mcmFnbWVudHM9e30sdi5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oZSx0KXt2LmZuW2VdPWZ1bmN0aW9uKG4pe3ZhciByLGk9MCxzPVtdLG89dihuKSx1PW8ubGVuZ3RoLGE9dGhpcy5sZW5ndGg9PT0xJiZ0aGlzWzBdLnBhcmVudE5vZGU7aWYoKGE9PW51bGx8fGEmJmEubm9kZVR5cGU9PT0xMSYmYS5jaGlsZE5vZGVzLmxlbmd0aD09PTEpJiZ1PT09MSlyZXR1cm4gb1t0XSh0aGlzWzBdKSx0aGlzO2Zvcig7aTx1O2krKylyPShpPjA/dGhpcy5jbG9uZSghMCk6dGhpcykuZ2V0KCksdihvW2ldKVt0XShyKSxzPXMuY29uY2F0KHIpO3JldHVybiB0aGlzLnB1c2hTdGFjayhzLGUsby5zZWxlY3Rvcil9fSksdi5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHMsbzt2LnN1cHBvcnQuaHRtbDVDbG9uZXx8di5pc1hNTERvYyhlKXx8IXd0LnRlc3QoIjwiK2Uubm9kZU5hbWUrIj4iKT9vPWUuY2xvbmVOb2RlKCEwKTooa3QuaW5uZXJIVE1MPWUub3V0ZXJIVE1MLGt0LnJlbW92ZUNoaWxkKG89a3QuZmlyc3RDaGlsZCkpO2lmKCghdi5zdXBwb3J0Lm5vQ2xvbmVFdmVudHx8IXYuc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCkmJihlLm5vZGVUeXBlPT09MXx8ZS5ub2RlVHlwZT09PTExKSYmIXYuaXNYTUxEb2MoZSkpe090KGUsbykscj1NdChlKSxpPU10KG8pO2ZvcihzPTA7cltzXTsrK3MpaVtzXSYmT3QocltzXSxpW3NdKX1pZih0KXtBdChlLG8pO2lmKG4pe3I9TXQoZSksaT1NdChvKTtmb3Iocz0wO3Jbc107KytzKUF0KHJbc10saVtzXSl9fXJldHVybiByPWk9bnVsbCxvfSxjbGVhbjpmdW5jdGlvbihlLHQsbixyKXt2YXIgcyxvLHUsYSxmLGwsYyxoLHAsZCxtLGcseT10PT09aSYmQ3QsYj1bXTtpZighdHx8dHlwZW9mIHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD09InVuZGVmaW5lZCIpdD1pO2ZvcihzPTA7KHU9ZVtzXSkhPW51bGw7cysrKXt0eXBlb2YgdT09Im51bWJlciImJih1Kz0iIik7aWYoIXUpY29udGludWU7aWYodHlwZW9mIHU9PSJzdHJpbmciKWlmKCFndC50ZXN0KHUpKXU9dC5jcmVhdGVUZXh0Tm9kZSh1KTtlbHNle3k9eXx8bHQodCksYz10LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHkuYXBwZW5kQ2hpbGQoYyksdT11LnJlcGxhY2UoZHQsIjwkMT48LyQyPiIpLGE9KHZ0LmV4ZWModSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksZj1OdFthXXx8TnQuX2RlZmF1bHQsbD1mWzBdLGMuaW5uZXJIVE1MPWZbMV0rdStmWzJdO3doaWxlKGwtLSljPWMubGFzdENoaWxkO2lmKCF2LnN1cHBvcnQudGJvZHkpe2g9bXQudGVzdCh1KSxwPWE9PT0idGFibGUiJiYhaD9jLmZpcnN0Q2hpbGQmJmMuZmlyc3RDaGlsZC5jaGlsZE5vZGVzOmZbMV09PT0iPHRhYmxlPiImJiFoP2MuY2hpbGROb2RlczpbXTtmb3Iobz1wLmxlbmd0aC0xO28+PTA7LS1vKXYubm9kZU5hbWUocFtvXSwidGJvZHkiKSYmIXBbb10uY2hpbGROb2Rlcy5sZW5ndGgmJnBbb10ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwW29dKX0hdi5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlJiZwdC50ZXN0KHUpJiZjLmluc2VydEJlZm9yZSh0LmNyZWF0ZVRleHROb2RlKHB0LmV4ZWModSlbMF0pLGMuZmlyc3RDaGlsZCksdT1jLmNoaWxkTm9kZXMsYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpfXUubm9kZVR5cGU/Yi5wdXNoKHUpOnYubWVyZ2UoYix1KX1jJiYodT1jPXk9bnVsbCk7aWYoIXYuc3VwcG9ydC5hcHBlbmRDaGVja2VkKWZvcihzPTA7KHU9YltzXSkhPW51bGw7cysrKXYubm9kZU5hbWUodSwiaW5wdXQiKT9fdCh1KTp0eXBlb2YgdS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCImJnYuZ3JlcCh1LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLF90KTtpZihuKXttPWZ1bmN0aW9uKGUpe2lmKCFlLnR5cGV8fHh0LnRlc3QoZS50eXBlKSlyZXR1cm4gcj9yLnB1c2goZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTplKTpuLmFwcGVuZENoaWxkKGUpfTtmb3Iocz0wOyh1PWJbc10pIT1udWxsO3MrKylpZighdi5ub2RlTmFtZSh1LCJzY3JpcHQiKXx8IW0odSkpbi5hcHBlbmRDaGlsZCh1KSx0eXBlb2YgdS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCImJihnPXYuZ3JlcCh2Lm1lcmdlKFtdLHUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpKSxtKSxiLnNwbGljZS5hcHBseShiLFtzKzEsMF0uY29uY2F0KGcpKSxzKz1nLmxlbmd0aCl9cmV0dXJuIGJ9LGNsZWFuRGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxzLG89MCx1PXYuZXhwYW5kbyxhPXYuY2FjaGUsZj12LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyxsPXYuZXZlbnQuc3BlY2lhbDtmb3IoOyhpPWVbb10pIT1udWxsO28rKylpZih0fHx2LmFjY2VwdERhdGEoaSkpe3I9aVt1XSxuPXImJmFbcl07aWYobil7aWYobi5ldmVudHMpZm9yKHMgaW4gbi5ldmVudHMpbFtzXT92LmV2ZW50LnJlbW92ZShpLHMpOnYucmVtb3ZlRXZlbnQoaSxzLG4uaGFuZGxlKTthW3JdJiYoZGVsZXRlIGFbcl0sZj9kZWxldGUgaVt1XTppLnJlbW92ZUF0dHJpYnV0ZT9pLnJlbW92ZUF0dHJpYnV0ZSh1KTppW3VdPW51bGwsdi5kZWxldGVkSWRzLnB1c2gocikpfX19fSksZnVuY3Rpb24oKXt2YXIgZSx0O3YudWFNYXRjaD1mdW5jdGlvbihlKXtlPWUudG9Mb3dlckNhc2UoKTt2YXIgdD0vKGNocm9tZSlbIFwvXShbXHcuXSspLy5leGVjKGUpfHwvKHdlYmtpdClbIFwvXShbXHcuXSspLy5leGVjKGUpfHwvKG9wZXJhKSg/Oi4qdmVyc2lvbnwpWyBcL10oW1x3Ll0rKS8uZXhlYyhlKXx8Lyhtc2llKSAoW1x3Ll0rKS8uZXhlYyhlKXx8ZS5pbmRleE9mKCJjb21wYXRpYmxlIik8MCYmLyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKXwpLy5leGVjKGUpfHxbXTtyZXR1cm57YnJvd3Nlcjp0WzFdfHwiIix2ZXJzaW9uOnRbMl18fCIwIn19LGU9di51YU1hdGNoKG8udXNlckFnZW50KSx0PXt9LGUuYnJvd3NlciYmKHRbZS5icm93c2VyXT0hMCx0LnZlcnNpb249ZS52ZXJzaW9uKSx0LmNocm9tZT90LndlYmtpdD0hMDp0LndlYmtpdCYmKHQuc2FmYXJpPSEwKSx2LmJyb3dzZXI9dCx2LnN1Yj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXtyZXR1cm4gbmV3IGUuZm4uaW5pdCh0LG4pfXYuZXh0ZW5kKCEwLGUsdGhpcyksZS5zdXBlcmNsYXNzPXRoaXMsZS5mbj1lLnByb3RvdHlwZT10aGlzKCksZS5mbi5jb25zdHJ1Y3Rvcj1lLGUuc3ViPXRoaXMuc3ViLGUuZm4uaW5pdD1mdW5jdGlvbihyLGkpe3JldHVybiBpJiZpIGluc3RhbmNlb2YgdiYmIShpIGluc3RhbmNlb2YgZSkmJihpPWUoaSkpLHYuZm4uaW5pdC5jYWxsKHRoaXMscixpLHQpfSxlLmZuLmluaXQucHJvdG90eXBlPWUuZm47dmFyIHQ9ZShpKTtyZXR1cm4gZX19KCk7dmFyIER0LFB0LEh0LEJ0PS9hbHBoYVwoW14pXSpcKS9pLGp0PS9vcGFjaXR5PShbXildKikvLEZ0PS9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLyxJdD0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8scXQ9L15tYXJnaW4vLFJ0PW5ldyBSZWdFeHAoIl4oIittKyIpKC4qKSQiLCJpIiksVXQ9bmV3IFJlZ0V4cCgiXigiK20rIikoPyFweClbYS16JV0rJCIsImkiKSx6dD1uZXcgUmVnRXhwKCJeKFstK10pPSgiK20rIikiLCJpIiksV3Q9e0JPRFk6ImJsb2NrIn0sWHQ9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFZ0PXtsZXR0ZXJTcGFjaW5nOjAsZm9udFdlaWdodDo0MDB9LCR0PVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sSnQ9WyJXZWJraXQiLCJPIiwiTW96IiwibXMiXSxLdD12LmZuLnRvZ2dsZTt2LmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGUsbil7cmV0dXJuIHYuYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSxuLHIpe3JldHVybiByIT09dD92LnN0eWxlKGUsbixyKTp2LmNzcyhlLG4pfSxlLG4sYXJndW1lbnRzLmxlbmd0aD4xKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiBZdCh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBZdCh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIGU9PSJib29sZWFuIjtyZXR1cm4gdi5pc0Z1bmN0aW9uKGUpJiZ2LmlzRnVuY3Rpb24odCk/S3QuYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuZWFjaChmdW5jdGlvbigpeyhuP2U6R3QodGhpcykpP3YodGhpcykuc2hvdygpOnYodGhpcykuaGlkZSgpfSl9fSksdi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj1EdChlLCJvcGFjaXR5Iik7cmV0dXJuIG49PT0iIj8iMSI6bn19fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6di5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihlLG4scixpKXtpZighZXx8ZS5ub2RlVHlwZT09PTN8fGUubm9kZVR5cGU9PT04fHwhZS5zdHlsZSlyZXR1cm47dmFyIHMsbyx1LGE9di5jYW1lbENhc2UobiksZj1lLnN0eWxlO249di5jc3NQcm9wc1thXXx8KHYuY3NzUHJvcHNbYV09UXQoZixhKSksdT12LmNzc0hvb2tzW25dfHx2LmNzc0hvb2tzW2FdO2lmKHI9PT10KXJldHVybiB1JiYiZ2V0ImluIHUmJihzPXUuZ2V0KGUsITEsaSkpIT09dD9zOmZbbl07bz10eXBlb2YgcixvPT09InN0cmluZyImJihzPXp0LmV4ZWMocikpJiYocj0oc1sxXSsxKSpzWzJdK3BhcnNlRmxvYXQodi5jc3MoZSxuKSksbz0ibnVtYmVyIik7aWYocj09bnVsbHx8bz09PSJudW1iZXIiJiZpc05hTihyKSlyZXR1cm47bz09PSJudW1iZXIiJiYhdi5jc3NOdW1iZXJbYV0mJihyKz0icHgiKTtpZighdXx8ISgic2V0ImluIHUpfHwocj11LnNldChlLHIsaSkpIT09dCl0cnl7ZltuXT1yfWNhdGNoKGwpe319LGNzczpmdW5jdGlvbihlLG4scixpKXt2YXIgcyxvLHUsYT12LmNhbWVsQ2FzZShuKTtyZXR1cm4gbj12LmNzc1Byb3BzW2FdfHwodi5jc3NQcm9wc1thXT1RdChlLnN0eWxlLGEpKSx1PXYuY3NzSG9va3Nbbl18fHYuY3NzSG9va3NbYV0sdSYmImdldCJpbiB1JiYocz11LmdldChlLCEwLGkpKSxzPT09dCYmKHM9RHQoZSxuKSkscz09PSJub3JtYWwiJiZuIGluIFZ0JiYocz1WdFtuXSkscnx8aSE9PXQ/KG89cGFyc2VGbG9hdChzKSxyfHx2LmlzTnVtZXJpYyhvKT9vfHwwOnMpOnN9LHN3YXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGkscz17fTtmb3IoaSBpbiB0KXNbaV09ZS5zdHlsZVtpXSxlLnN0eWxlW2ldPXRbaV07cj1uLmNhbGwoZSk7Zm9yKGkgaW4gdCllLnN0eWxlW2ldPXNbaV07cmV0dXJuIHJ9fSksZS5nZXRDb21wdXRlZFN0eWxlP0R0PWZ1bmN0aW9uKHQsbil7dmFyIHIsaSxzLG8sdT1lLmdldENvbXB1dGVkU3R5bGUodCxudWxsKSxhPXQuc3R5bGU7cmV0dXJuIHUmJihyPXUuZ2V0UHJvcGVydHlWYWx1ZShuKXx8dVtuXSxyPT09IiImJiF2LmNvbnRhaW5zKHQub3duZXJEb2N1bWVudCx0KSYmKHI9di5zdHlsZSh0LG4pKSxVdC50ZXN0KHIpJiZxdC50ZXN0KG4pJiYoaT1hLndpZHRoLHM9YS5taW5XaWR0aCxvPWEubWF4V2lkdGgsYS5taW5XaWR0aD1hLm1heFdpZHRoPWEud2lkdGg9cixyPXUud2lkdGgsYS53aWR0aD1pLGEubWluV2lkdGg9cyxhLm1heFdpZHRoPW8pKSxyfTppLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihEdD1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLmN1cnJlbnRTdHlsZSYmZS5jdXJyZW50U3R5bGVbdF0scz1lLnN0eWxlO3JldHVybiBpPT1udWxsJiZzJiZzW3RdJiYoaT1zW3RdKSxVdC50ZXN0KGkpJiYhRnQudGVzdCh0KSYmKG49cy5sZWZ0LHI9ZS5ydW50aW1lU3R5bGUmJmUucnVudGltZVN0eWxlLmxlZnQsciYmKGUucnVudGltZVN0eWxlLmxlZnQ9ZS5jdXJyZW50U3R5bGUubGVmdCkscy5sZWZ0PXQ9PT0iZm9udFNpemUiPyIxZW0iOmksaT1zLnBpeGVsTGVmdCsicHgiLHMubGVmdD1uLHImJihlLnJ1bnRpbWVTdHlsZS5sZWZ0PXIpKSxpPT09IiI/ImF1dG8iOml9KSx2LmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGUsdCl7di5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbixyKXtpZihuKXJldHVybiBlLm9mZnNldFdpZHRoPT09MCYmSXQudGVzdChEdChlLCJkaXNwbGF5IikpP3Yuc3dhcChlLFh0LGZ1bmN0aW9uKCl7cmV0dXJuIHRuKGUsdCxyKX0pOnRuKGUsdCxyKX0sc2V0OmZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gWnQoZSxuLHI/ZW4oZSx0LHIsdi5zdXBwb3J0LmJveFNpemluZyYmdi5jc3MoZSwiYm94U2l6aW5nIik9PT0iYm9yZGVyLWJveCIpOjApfX19KSx2LnN1cHBvcnQub3BhY2l0eXx8KHYuY3NzSG9va3Mub3BhY2l0eT17Z2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGp0LnRlc3QoKHQmJmUuY3VycmVudFN0eWxlP2UuY3VycmVudFN0eWxlLmZpbHRlcjplLnN0eWxlLmZpbHRlcil8fCIiKT8uMDEqcGFyc2VGbG9hdChSZWdFeHAuJDEpKyIiOnQ/IjEiOiIifSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnN0eWxlLHI9ZS5jdXJyZW50U3R5bGUsaT12LmlzTnVtZXJpYyh0KT8iYWxwaGEob3BhY2l0eT0iK3QqMTAwKyIpIjoiIixzPXImJnIuZmlsdGVyfHxuLmZpbHRlcnx8IiI7bi56b29tPTE7aWYodD49MSYmdi50cmltKHMucmVwbGFjZShCdCwiIikpPT09IiImJm4ucmVtb3ZlQXR0cmlidXRlKXtuLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIik7aWYociYmIXIuZmlsdGVyKXJldHVybn1uLmZpbHRlcj1CdC50ZXN0KHMpP3MucmVwbGFjZShCdCxpKTpzKyIgIitpfX0pLHYoZnVuY3Rpb24oKXt2LnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KHYuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihlLHQpe3JldHVybiB2LnN3YXAoZSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sZnVuY3Rpb24oKXtpZih0KXJldHVybiBEdChlLCJtYXJnaW5SaWdodCIpfSl9fSksIXYuc3VwcG9ydC5waXhlbFBvc2l0aW9uJiZ2LmZuLnBvc2l0aW9uJiZ2LmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSx0KXt2LmNzc0hvb2tzW3RdPXtnZXQ6ZnVuY3Rpb24oZSxuKXtpZihuKXt2YXIgcj1EdChlLHQpO3JldHVybiBVdC50ZXN0KHIpP3YoZSkucG9zaXRpb24oKVt0XSsicHgiOnJ9fX19KX0pLHYuZXhwciYmdi5leHByLmZpbHRlcnMmJih2LmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIGUub2Zmc2V0V2lkdGg9PT0wJiZlLm9mZnNldEhlaWdodD09PTB8fCF2LnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYoZS5zdHlsZSYmZS5zdHlsZS5kaXNwbGF5fHxEdChlLCJkaXNwbGF5IikpPT09Im5vbmUifSx2LmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGUpe3JldHVybiF2LmV4cHIuZmlsdGVycy5oaWRkZW4oZSl9KSx2LmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihlLHQpe3YuY3NzSG9va3NbZSt0XT17ZXhwYW5kOmZ1bmN0aW9uKG4pe3ZhciByLGk9dHlwZW9mIG49PSJzdHJpbmciP24uc3BsaXQoIiAiKTpbbl0scz17fTtmb3Iocj0wO3I8NDtyKyspc1tlKyR0W3JdK3RdPWlbcl18fGlbci0yXXx8aVswXTtyZXR1cm4gc319LHF0LnRlc3QoZSl8fCh2LmNzc0hvb2tzW2UrdF0uc2V0PVp0KX0pO3ZhciBybj0vJTIwL2csc249L1xbXF0kLyxvbj0vXHI/XG4vZyx1bj0vXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksYW49L14oPzpzZWxlY3R8dGV4dGFyZWEpL2k7di5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiB2LnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHM/di5tYWtlQXJyYXkodGhpcy5lbGVtZW50cyk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUmJiF0aGlzLmRpc2FibGVkJiYodGhpcy5jaGVja2VkfHxhbi50ZXN0KHRoaXMubm9kZU5hbWUpfHx1bi50ZXN0KHRoaXMudHlwZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49dih0aGlzKS52YWwoKTtyZXR1cm4gbj09bnVsbD9udWxsOnYuaXNBcnJheShuKT92Lm1hcChuLGZ1bmN0aW9uKGUsbil7cmV0dXJue25hbWU6dC5uYW1lLHZhbHVlOmUucmVwbGFjZShvbiwiXHJcbiIpfX0pOntuYW1lOnQubmFtZSx2YWx1ZTpuLnJlcGxhY2Uob24sIlxyXG4iKX19KS5nZXQoKX19KSx2LnBhcmFtPWZ1bmN0aW9uKGUsbil7dmFyIHIsaT1bXSxzPWZ1bmN0aW9uKGUsdCl7dD12LmlzRnVuY3Rpb24odCk/dCgpOnQ9PW51bGw/IiI6dCxpW2kubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KX07bj09PXQmJihuPXYuYWpheFNldHRpbmdzJiZ2LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7aWYodi5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIXYuaXNQbGFpbk9iamVjdChlKSl2LmVhY2goZSxmdW5jdGlvbigpe3ModGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IociBpbiBlKWZuKHIsZVtyXSxuLHMpO3JldHVybiBpLmpvaW4oIiYiKS5yZXBsYWNlKHJuLCIrIil9O3ZhciBsbixjbixobj0vIy4qJC8scG49L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9tZyxkbj0vXig/OmFib3V0fGFwcHxhcHBcLXN0b3JhZ2V8LitcLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLHZuPS9eKD86R0VUfEhFQUQpJC8sbW49L15cL1wvLyxnbj0vXD8vLHluPS88c2NyaXB0XGJbXjxdKig/Oig/ITxcL3NjcmlwdD4pPFtePF0qKSo8XC9zY3JpcHQ+L2dpLGJuPS8oWz8mXSlfPVteJl0qLyx3bj0vXihbXHdcK1wuXC1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspfCl8KS8sRW49di5mbi5sb2FkLFNuPXt9LHhuPXt9LFRuPVsiKi8iXStbIioiXTt0cnl7Y249cy5ocmVmfWNhdGNoKE5uKXtjbj1pLmNyZWF0ZUVsZW1lbnQoImEiKSxjbi5ocmVmPSIiLGNuPWNuLmhyZWZ9bG49d24uZXhlYyhjbi50b0xvd2VyQ2FzZSgpKXx8W10sdi5mbi5sb2FkPWZ1bmN0aW9uKGUsbixyKXtpZih0eXBlb2YgZSE9InN0cmluZyImJkVuKXJldHVybiBFbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO3ZhciBpLHMsbyx1PXRoaXMsYT1lLmluZGV4T2YoIiAiKTtyZXR1cm4gYT49MCYmKGk9ZS5zbGljZShhLGUubGVuZ3RoKSxlPWUuc2xpY2UoMCxhKSksdi5pc0Z1bmN0aW9uKG4pPyhyPW4sbj10KTpuJiZ0eXBlb2Ygbj09Im9iamVjdCImJihzPSJQT1NUIiksdi5hamF4KHt1cmw6ZSx0eXBlOnMsZGF0YVR5cGU6Imh0bWwiLGRhdGE6bixjb21wbGV0ZTpmdW5jdGlvbihlLHQpe3ImJnUuZWFjaChyLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX19KS5kb25lKGZ1bmN0aW9uKGUpe289YXJndW1lbnRzLHUuaHRtbChpP3YoIjxkaXY+IikuYXBwZW5kKGUucmVwbGFjZSh5biwiIikpLmZpbmQoaSk6ZSl9KSx0aGlzfSx2LmVhY2goImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7di5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbih0LGUpfX0pLHYuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihlLG4pe3Zbbl09ZnVuY3Rpb24oZSxyLGkscyl7cmV0dXJuIHYuaXNGdW5jdGlvbihyKSYmKHM9c3x8aSxpPXIscj10KSx2LmFqYXgoe3R5cGU6bix1cmw6ZSxkYXRhOnIsc3VjY2VzczppLGRhdGFUeXBlOnN9KX19KSx2LmV4dGVuZCh7Z2V0U2NyaXB0OmZ1bmN0aW9uKGUsbil7cmV0dXJuIHYuZ2V0KGUsdCxuLCJzY3JpcHQiKX0sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHYuZ2V0KGUsdCxuLCJqc29uIil9LGFqYXhTZXR1cDpmdW5jdGlvbihlLHQpe3JldHVybiB0P0xuKGUsdi5hamF4U2V0dGluZ3MpOih0PWUsZT12LmFqYXhTZXR0aW5ncyksTG4oZSx0KSxlfSxhamF4U2V0dGluZ3M6e3VybDpjbixpc0xvY2FsOmRuLnRlc3QobG5bMV0pLGdsb2JhbDohMCx0eXBlOiJHRVQiLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGFjY2VwdHM6e3htbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsaHRtbDoidGV4dC9odG1sIix0ZXh0OiJ0ZXh0L3BsYWluIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLCIqIjpUbn0sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOmUuU3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOnYucGFyc2VKU09OLCJ0ZXh0IHhtbCI6di5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e2NvbnRleHQ6ITAsdXJsOiEwfX0sYWpheFByZWZpbHRlcjpDbihTbiksYWpheFRyYW5zcG9ydDpDbih4biksYWpheDpmdW5jdGlvbihlLG4pe2Z1bmN0aW9uIFQoZSxuLHMsYSl7dmFyIGwseSxiLHcsUyxUPW47aWYoRT09PTIpcmV0dXJuO0U9Mix1JiZjbGVhclRpbWVvdXQodSksbz10LGk9YXx8IiIseC5yZWFkeVN0YXRlPWU+MD80OjAscyYmKHc9QW4oYyx4LHMpKTtpZihlPj0yMDAmJmU8MzAwfHxlPT09MzA0KWMuaWZNb2RpZmllZCYmKFM9eC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLFMmJih2Lmxhc3RNb2RpZmllZFtyXT1TKSxTPXguZ2V0UmVzcG9uc2VIZWFkZXIoIkV0YWciKSxTJiYodi5ldGFnW3JdPVMpKSxlPT09MzA0PyhUPSJub3Rtb2RpZmllZCIsbD0hMCk6KGw9T24oYyx3KSxUPWwuc3RhdGUseT1sLmRhdGEsYj1sLmVycm9yLGw9IWIpO2Vsc2V7Yj1UO2lmKCFUfHxlKVQ9ImVycm9yIixlPDAmJihlPTApfXguc3RhdHVzPWUseC5zdGF0dXNUZXh0PShufHxUKSsiIixsP2QucmVzb2x2ZVdpdGgoaCxbeSxULHhdKTpkLnJlamVjdFdpdGgoaCxbeCxULGJdKSx4LnN0YXR1c0NvZGUoZyksZz10LGYmJnAudHJpZ2dlcigiYWpheCIrKGw/IlN1Y2Nlc3MiOiJFcnJvciIpLFt4LGMsbD95OmJdKSxtLmZpcmVXaXRoKGgsW3gsVF0pLGYmJihwLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3gsY10pLC0tdi5hY3RpdmV8fHYuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSl9dHlwZW9mIGU9PSJvYmplY3QiJiYobj1lLGU9dCksbj1ufHx7fTt2YXIgcixpLHMsbyx1LGEsZixsLGM9di5hamF4U2V0dXAoe30sbiksaD1jLmNvbnRleHR8fGMscD1oIT09YyYmKGgubm9kZVR5cGV8fGggaW5zdGFuY2VvZiB2KT92KGgpOnYuZXZlbnQsZD12LkRlZmVycmVkKCksbT12LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxnPWMuc3RhdHVzQ29kZXx8e30sYj17fSx3PXt9LEU9MCxTPSJjYW5jZWxlZCIseD17cmVhZHlTdGF0ZTowLHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXtpZighRSl7dmFyIG49ZS50b0xvd2VyQ2FzZSgpO2U9d1tuXT13W25dfHxlLGJbZV09dH1yZXR1cm4gdGhpc30sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIEU9PT0yP2k6bnVsbH0sZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIG47aWYoRT09PTIpe2lmKCFzKXtzPXt9O3doaWxlKG49cG4uZXhlYyhpKSlzW25bMV0udG9Mb3dlckNhc2UoKV09blsyXX1uPXNbZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbj09PXQ/bnVsbDpufSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBFfHwoYy5taW1lVHlwZT1lKSx0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXtyZXR1cm4gZT1lfHxTLG8mJm8uYWJvcnQoZSksVCgwLGUpLHRoaXN9fTtkLnByb21pc2UoeCkseC5zdWNjZXNzPXguZG9uZSx4LmVycm9yPXguZmFpbCx4LmNvbXBsZXRlPW0uYWRkLHguc3RhdHVzQ29kZT1mdW5jdGlvbihlKXtpZihlKXt2YXIgdDtpZihFPDIpZm9yKHQgaW4gZSlnW3RdPVtnW3RdLGVbdF1dO2Vsc2UgdD1lW3guc3RhdHVzXSx4LmFsd2F5cyh0KX1yZXR1cm4gdGhpc30sYy51cmw9KChlfHxjLnVybCkrIiIpLnJlcGxhY2UoaG4sIiIpLnJlcGxhY2UobW4sbG5bMV0rIi8vIiksYy5kYXRhVHlwZXM9di50cmltKGMuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5zcGxpdCh5KSxjLmNyb3NzRG9tYWluPT1udWxsJiYoYT13bi5leGVjKGMudXJsLnRvTG93ZXJDYXNlKCkpLGMuY3Jvc3NEb21haW49ISghYXx8YVsxXT09PWxuWzFdJiZhWzJdPT09bG5bMl0mJihhWzNdfHwoYVsxXT09PSJodHRwOiI/ODA6NDQzKSk9PShsblszXXx8KGxuWzFdPT09Imh0dHA6Ij84MDo0NDMpKSkpLGMuZGF0YSYmYy5wcm9jZXNzRGF0YSYmdHlwZW9mIGMuZGF0YSE9InN0cmluZyImJihjLmRhdGE9di5wYXJhbShjLmRhdGEsYy50cmFkaXRpb25hbCkpLGtuKFNuLGMsbix4KTtpZihFPT09MilyZXR1cm4geDtmPWMuZ2xvYmFsLGMudHlwZT1jLnR5cGUudG9VcHBlckNhc2UoKSxjLmhhc0NvbnRlbnQ9IXZuLnRlc3QoYy50eXBlKSxmJiZ2LmFjdGl2ZSsrPT09MCYmdi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtpZighYy5oYXNDb250ZW50KXtjLmRhdGEmJihjLnVybCs9KGduLnRlc3QoYy51cmwpPyImIjoiPyIpK2MuZGF0YSxkZWxldGUgYy5kYXRhKSxyPWMudXJsO2lmKGMuY2FjaGU9PT0hMSl7dmFyIE49di5ub3coKSxDPWMudXJsLnJlcGxhY2UoYm4sIiQxXz0iK04pO2MudXJsPUMrKEM9PT1jLnVybD8oZ24udGVzdChjLnVybCk/IiYiOiI/IikrIl89IitOOiIiKX19KGMuZGF0YSYmYy5oYXNDb250ZW50JiZjLmNvbnRlbnRUeXBlIT09ITF8fG4uY29udGVudFR5cGUpJiZ4LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsYy5jb250ZW50VHlwZSksYy5pZk1vZGlmaWVkJiYocj1yfHxjLnVybCx2Lmxhc3RNb2RpZmllZFtyXSYmeC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsdi5sYXN0TW9kaWZpZWRbcl0pLHYuZXRhZ1tyXSYmeC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIix2LmV0YWdbcl0pKSx4LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsYy5kYXRhVHlwZXNbMF0mJmMuYWNjZXB0c1tjLmRhdGFUeXBlc1swXV0/Yy5hY2NlcHRzW2MuZGF0YVR5cGVzWzBdXSsoYy5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitUbisiOyBxPTAuMDEiOiIiKTpjLmFjY2VwdHNbIioiXSk7Zm9yKGwgaW4gYy5oZWFkZXJzKXguc2V0UmVxdWVzdEhlYWRlcihsLGMuaGVhZGVyc1tsXSk7aWYoIWMuYmVmb3JlU2VuZHx8Yy5iZWZvcmVTZW5kLmNhbGwoaCx4LGMpIT09ITEmJkUhPT0yKXtTPSJhYm9ydCI7Zm9yKGwgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0peFtsXShjW2xdKTtvPWtuKHhuLGMsbix4KTtpZighbylUKC0xLCJObyBUcmFuc3BvcnQiKTtlbHNle3gucmVhZHlTdGF0ZT0xLGYmJnAudHJpZ2dlcigiYWpheFNlbmQiLFt4LGNdKSxjLmFzeW5jJiZjLnRpbWVvdXQ+MCYmKHU9c2V0VGltZW91dChmdW5jdGlvbigpe3guYWJvcnQoInRpbWVvdXQiKX0sYy50aW1lb3V0KSk7dHJ5e0U9MSxvLnNlbmQoYixUKX1jYXRjaChrKXtpZighKEU8MikpdGhyb3cgaztUKC0xLGspfX1yZXR1cm4geH1yZXR1cm4geC5hYm9ydCgpfSxhY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fX0pO3ZhciBNbj1bXSxfbj0vXD8vLERuPS8oPSlcPyg/PSZ8JCl8XD9cPy8sUG49di5ub3coKTt2LmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9TW4ucG9wKCl8fHYuZXhwYW5kbysiXyIrUG4rKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLHYuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24obixyLGkpe3ZhciBzLG8sdSxhPW4uZGF0YSxmPW4udXJsLGw9bi5qc29ucCE9PSExLGM9bCYmRG4udGVzdChmKSxoPWwmJiFjJiZ0eXBlb2YgYT09InN0cmluZyImJiEobi5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZEbi50ZXN0KGEpO2lmKG4uZGF0YVR5cGVzWzBdPT09Impzb25wInx8Y3x8aClyZXR1cm4gcz1uLmpzb25wQ2FsbGJhY2s9di5pc0Z1bmN0aW9uKG4uanNvbnBDYWxsYmFjayk/bi5qc29ucENhbGxiYWNrKCk6bi5qc29ucENhbGxiYWNrLG89ZVtzXSxjP24udXJsPWYucmVwbGFjZShEbiwiJDEiK3MpOmg/bi5kYXRhPWEucmVwbGFjZShEbiwiJDEiK3MpOmwmJihuLnVybCs9KF9uLnRlc3QoZik/IiYiOiI/Iikrbi5qc29ucCsiPSIrcyksbi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIHV8fHYuZXJyb3IocysiIHdhcyBub3QgY2FsbGVkIiksdVswXX0sbi5kYXRhVHlwZXNbMF09Impzb24iLGVbc109ZnVuY3Rpb24oKXt1PWFyZ3VtZW50c30saS5hbHdheXMoZnVuY3Rpb24oKXtlW3NdPW8sbltzXSYmKG4uanNvbnBDYWxsYmFjaz1yLmpzb25wQ2FsbGJhY2ssTW4ucHVzaChzKSksdSYmdi5pc0Z1bmN0aW9uKG8pJiZvKHVbMF0pLHU9bz10fSksInNjcmlwdCJ9KSx2LmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L2phdmFzY3JpcHR8ZWNtYXNjcmlwdC99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIHYuZ2xvYmFsRXZhbChlKSxlfX19KSx2LmFqYXhQcmVmaWx0ZXIoInNjcmlwdCIsZnVuY3Rpb24oZSl7ZS5jYWNoZT09PXQmJihlLmNhY2hlPSExKSxlLmNyb3NzRG9tYWluJiYoZS50eXBlPSJHRVQiLGUuZ2xvYmFsPSExKX0pLHYuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihlKXtpZihlLmNyb3NzRG9tYWluKXt2YXIgbixyPWkuaGVhZHx8aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdfHxpLmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihzLG8pe249aS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxuLmFzeW5jPSJhc3luYyIsZS5zY3JpcHRDaGFyc2V0JiYobi5jaGFyc2V0PWUuc2NyaXB0Q2hhcnNldCksbi5zcmM9ZS51cmwsbi5vbmxvYWQ9bi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oZSxpKXtpZihpfHwhbi5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KG4ucmVhZHlTdGF0ZSkpbi5vbmxvYWQ9bi5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxyJiZuLnBhcmVudE5vZGUmJnIucmVtb3ZlQ2hpbGQobiksbj10LGl8fG8oMjAwLCJzdWNjZXNzIil9LHIuaW5zZXJ0QmVmb3JlKG4sci5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuLm9ubG9hZCgwLDEpfX19fSk7dmFyIEhuLEJuPWUuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe2Zvcih2YXIgZSBpbiBIbilIbltlXSgwLDEpfTohMSxqbj0wO3YuYWpheFNldHRpbmdzLnhocj1lLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc0xvY2FsJiZGbigpfHxJbigpfTpGbixmdW5jdGlvbihlKXt2LmV4dGVuZCh2LnN1cHBvcnQse2FqYXg6ISFlLGNvcnM6ISFlJiYid2l0aENyZWRlbnRpYWxzImluIGV9KX0odi5hamF4U2V0dGluZ3MueGhyKCkpLHYuc3VwcG9ydC5hamF4JiZ2LmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24obil7aWYoIW4uY3Jvc3NEb21haW58fHYuc3VwcG9ydC5jb3JzKXt2YXIgcjtyZXR1cm57c2VuZDpmdW5jdGlvbihpLHMpe3ZhciBvLHUsYT1uLnhocigpO24udXNlcm5hbWU/YS5vcGVuKG4udHlwZSxuLnVybCxuLmFzeW5jLG4udXNlcm5hbWUsbi5wYXNzd29yZCk6YS5vcGVuKG4udHlwZSxuLnVybCxuLmFzeW5jKTtpZihuLnhockZpZWxkcylmb3IodSBpbiBuLnhockZpZWxkcylhW3VdPW4ueGhyRmllbGRzW3VdO24ubWltZVR5cGUmJmEub3ZlcnJpZGVNaW1lVHlwZSYmYS5vdmVycmlkZU1pbWVUeXBlKG4ubWltZVR5cGUpLCFuLmNyb3NzRG9tYWluJiYhaVsiWC1SZXF1ZXN0ZWQtV2l0aCJdJiYoaVsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO3RyeXtmb3IodSBpbiBpKWEuc2V0UmVxdWVzdEhlYWRlcih1LGlbdV0pfWNhdGNoKGYpe31hLnNlbmQobi5oYXNDb250ZW50JiZuLmRhdGF8fG51bGwpLHI9ZnVuY3Rpb24oZSxpKXt2YXIgdSxmLGwsYyxoO3RyeXtpZihyJiYoaXx8YS5yZWFkeVN0YXRlPT09NCkpe3I9dCxvJiYoYS5vbnJlYWR5c3RhdGVjaGFuZ2U9di5ub29wLEJuJiZkZWxldGUgSG5bb10pO2lmKGkpYS5yZWFkeVN0YXRlIT09NCYmYS5hYm9ydCgpO2Vsc2V7dT1hLnN0YXR1cyxsPWEuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksYz17fSxoPWEucmVzcG9uc2VYTUwsaCYmaC5kb2N1bWVudEVsZW1lbnQmJihjLnhtbD1oKTt0cnl7Yy50ZXh0PWEucmVzcG9uc2VUZXh0fWNhdGNoKHApe310cnl7Zj1hLnN0YXR1c1RleHR9Y2F0Y2gocCl7Zj0iIn0hdSYmbi5pc0xvY2FsJiYhbi5jcm9zc0RvbWFpbj91PWMudGV4dD8yMDA6NDA0OnU9PT0xMjIzJiYodT0yMDQpfX19Y2F0Y2goZCl7aXx8cygtMSxkKX1jJiZzKHUsZixjLGwpfSxuLmFzeW5jP2EucmVhZHlTdGF0ZT09PTQ/c2V0VGltZW91dChyLDApOihvPSsram4sQm4mJihIbnx8KEhuPXt9LHYoZSkudW5sb2FkKEJuKSksSG5bb109ciksYS5vbnJlYWR5c3RhdGVjaGFuZ2U9cik6cigpfSxhYm9ydDpmdW5jdGlvbigpe3ImJnIoMCwxKX19fX0pO3ZhciBxbixSbixVbj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sem49bmV3IFJlZ0V4cCgiXig/OihbLStdKT18KSgiK20rIikoW2EteiVdKikkIiwiaSIpLFduPS9xdWV1ZUhvb2tzJC8sWG49W0duXSxWbj17IioiOltmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT10aGlzLmNyZWF0ZVR3ZWVuKGUsdCkscz16bi5leGVjKHQpLG89aS5jdXIoKSx1PStvfHwwLGE9MSxmPTIwO2lmKHMpe249K3NbMl0scj1zWzNdfHwodi5jc3NOdW1iZXJbZV0/IiI6InB4Iik7aWYociE9PSJweCImJnUpe3U9di5jc3MoaS5lbGVtLGUsITApfHxufHwxO2RvIGE9YXx8Ii41Iix1Lz1hLHYuc3R5bGUoaS5lbGVtLGUsdStyKTt3aGlsZShhIT09KGE9aS5jdXIoKS9vKSYmYSE9PTEmJi0tZil9aS51bml0PXIsaS5zdGFydD11LGkuZW5kPXNbMV0/dSsoc1sxXSsxKSpuOm59cmV0dXJuIGl9XX07di5BbmltYXRpb249di5leHRlbmQoS24se3R3ZWVuZXI6ZnVuY3Rpb24oZSx0KXt2LmlzRnVuY3Rpb24oZSk/KHQ9ZSxlPVsiKiJdKTplPWUuc3BsaXQoIiAiKTt2YXIgbixyPTAsaT1lLmxlbmd0aDtmb3IoO3I8aTtyKyspbj1lW3JdLFZuW25dPVZuW25dfHxbXSxWbltuXS51bnNoaWZ0KHQpfSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P1huLnVuc2hpZnQoZSk6WG4ucHVzaChlKX19KSx2LlR3ZWVuPVluLFluLnByb3RvdHlwZT17Y29uc3RydWN0b3I6WW4saW5pdDpmdW5jdGlvbihlLHQsbixyLGkscyl7dGhpcy5lbGVtPWUsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9aXx8InN3aW5nIix0aGlzLm9wdGlvbnM9dCx0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9cix0aGlzLnVuaXQ9c3x8KHYuY3NzTnVtYmVyW25dPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgZT1Zbi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6WW4ucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49WW4ucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz10PXYuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpZbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxZbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9WW4ucHJvdG90eXBlLFluLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gZS5lbGVtW2UucHJvcF09PW51bGx8fCEhZS5lbGVtLnN0eWxlJiZlLmVsZW0uc3R5bGVbZS5wcm9wXSE9bnVsbD8odD12LmNzcyhlLmVsZW0sZS5wcm9wLCExLCIiKSwhdHx8dD09PSJhdXRvIj8wOnQpOmUuZWxlbVtlLnByb3BdfSxzZXQ6ZnVuY3Rpb24oZSl7di5meC5zdGVwW2UucHJvcF0/di5meC5zdGVwW2UucHJvcF0oZSk6ZS5lbGVtLnN0eWxlJiYoZS5lbGVtLnN0eWxlW3YuY3NzUHJvcHNbZS5wcm9wXV0hPW51bGx8fHYuY3NzSG9va3NbZS5wcm9wXSk/di5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCk6ZS5lbGVtW2UucHJvcF09ZS5ub3d9fX0sWW4ucHJvcEhvb2tzLnNjcm9sbFRvcD1Zbi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSx2LmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUsdCl7dmFyIG49di5mblt0XTt2LmZuW3RdPWZ1bmN0aW9uKHIsaSxzKXtyZXR1cm4gcj09bnVsbHx8dHlwZW9mIHI9PSJib29sZWFuInx8IWUmJnYuaXNGdW5jdGlvbihyKSYmdi5pc0Z1bmN0aW9uKGkpP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShabih0LCEwKSxyLGkscyl9fSksdi5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoR3QpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXYuaXNFbXB0eU9iamVjdChlKSxzPXYuc3BlZWQodCxuLHIpLG89ZnVuY3Rpb24oKXt2YXIgdD1Lbih0aGlzLHYuZXh0ZW5kKHt9LGUpLHMpO2kmJnQuc3RvcCghMCl9O3JldHVybiBpfHxzLnF1ZXVlPT09ITE/dGhpcy5lYWNoKG8pOnRoaXMucXVldWUocy5xdWV1ZSxvKX0sc3RvcDpmdW5jdGlvbihlLG4scil7dmFyIGk9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChyKX07cmV0dXJuIHR5cGVvZiBlIT0ic3RyaW5nIiYmKHI9bixuPWUsZT10KSxuJiZlIT09ITEmJnRoaXMucXVldWUoZXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ITAsbj1lIT1udWxsJiZlKyJxdWV1ZUhvb2tzIixzPXYudGltZXJzLG89di5fZGF0YSh0aGlzKTtpZihuKW9bbl0mJm9bbl0uc3RvcCYmaShvW25dKTtlbHNlIGZvcihuIGluIG8pb1tuXSYmb1tuXS5zdG9wJiZXbi50ZXN0KG4pJiZpKG9bbl0pO2ZvcihuPXMubGVuZ3RoO24tLTspc1tuXS5lbGVtPT09dGhpcyYmKGU9PW51bGx8fHNbbl0ucXVldWU9PT1lKSYmKHNbbl0uYW5pbS5zdG9wKHIpLHQ9ITEscy5zcGxpY2UobiwxKSk7KHR8fCFyKSYmdi5kZXF1ZXVlKHRoaXMsZSl9KX19KSx2LmVhY2goe3NsaWRlRG93bjpabigic2hvdyIpLHNsaWRlVXA6Wm4oImhpZGUiKSxzbGlkZVRvZ2dsZTpabigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe3YuZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSksdi5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmdHlwZW9mIGU9PSJvYmplY3QiP3YuZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8di5pc0Z1bmN0aW9uKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiF2LmlzRnVuY3Rpb24odCkmJnR9O3IuZHVyYXRpb249di5meC5vZmY/MDp0eXBlb2Ygci5kdXJhdGlvbj09Im51bWJlciI/ci5kdXJhdGlvbjpyLmR1cmF0aW9uIGluIHYuZnguc3BlZWRzP3YuZnguc3BlZWRzW3IuZHVyYXRpb25dOnYuZnguc3BlZWRzLl9kZWZhdWx0O2lmKHIucXVldWU9PW51bGx8fHIucXVldWU9PT0hMClyLnF1ZXVlPSJmeCI7cmV0dXJuIHIub2xkPXIuY29tcGxldGUsci5jb21wbGV0ZT1mdW5jdGlvbigpe3YuaXNGdW5jdGlvbihyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmdi5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LHYuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn19LHYudGltZXJzPVtdLHYuZng9WW4ucHJvdG90eXBlLmluaXQsdi5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsbj12LnRpbWVycyxyPTA7cW49di5ub3coKTtmb3IoO3I8bi5sZW5ndGg7cisrKWU9bltyXSwhZSgpJiZuW3JdPT09ZSYmbi5zcGxpY2Uoci0tLDEpO24ubGVuZ3RofHx2LmZ4LnN0b3AoKSxxbj10fSx2LmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe2UoKSYmdi50aW1lcnMucHVzaChlKSYmIVJuJiYoUm49c2V0SW50ZXJ2YWwodi5meC50aWNrLHYuZnguaW50ZXJ2YWwpKX0sdi5meC5pbnRlcnZhbD0xMyx2LmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKFJuKSxSbj1udWxsfSx2LmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSx2LmZ4LnN0ZXA9e30sdi5leHByJiZ2LmV4cHIuZmlsdGVycyYmKHYuZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGUpe3JldHVybiB2LmdyZXAodi50aW1lcnMsZnVuY3Rpb24odCl7cmV0dXJuIGU9PT10LmVsZW19KS5sZW5ndGh9KTt2YXIgZXI9L14oPzpib2R5fGh0bWwpJC9pO3YuZm4ub2Zmc2V0PWZ1bmN0aW9uKGUpe2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGU9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGUsdCl9KTt2YXIgbixyLGkscyxvLHUsYSxmPXt0b3A6MCxsZWZ0OjB9LGw9dGhpc1swXSxjPWwmJmwub3duZXJEb2N1bWVudDtpZighYylyZXR1cm47cmV0dXJuKHI9Yy5ib2R5KT09PWw/di5vZmZzZXQuYm9keU9mZnNldChsKToobj1jLmRvY3VtZW50RWxlbWVudCx2LmNvbnRhaW5zKG4sbCk/KHR5cGVvZiBsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCE9InVuZGVmaW5lZCImJihmPWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLGk9dHIoYykscz1uLmNsaWVudFRvcHx8ci5jbGllbnRUb3B8fDAsbz1uLmNsaWVudExlZnR8fHIuY2xpZW50TGVmdHx8MCx1PWkucGFnZVlPZmZzZXR8fG4uc2Nyb2xsVG9wLGE9aS5wYWdlWE9mZnNldHx8bi5zY3JvbGxMZWZ0LHt0b3A6Zi50b3ArdS1zLGxlZnQ6Zi5sZWZ0K2Etb30pOmYpfSx2Lm9mZnNldD17Ym9keU9mZnNldDpmdW5jdGlvbihlKXt2YXIgdD1lLm9mZnNldFRvcCxuPWUub2Zmc2V0TGVmdDtyZXR1cm4gdi5zdXBwb3J0LmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0JiYodCs9cGFyc2VGbG9hdCh2LmNzcyhlLCJtYXJnaW5Ub3AiKSl8fDAsbis9cGFyc2VGbG9hdCh2LmNzcyhlLCJtYXJnaW5MZWZ0IikpfHwwKSx7dG9wOnQsbGVmdDpufX0sc2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj12LmNzcyhlLCJwb3NpdGlvbiIpO3I9PT0ic3RhdGljIiYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIik7dmFyIGk9dihlKSxzPWkub2Zmc2V0KCksbz12LmNzcyhlLCJ0b3AiKSx1PXYuY3NzKGUsImxlZnQiKSxhPShyPT09ImFic29sdXRlInx8cj09PSJmaXhlZCIpJiZ2LmluQXJyYXkoImF1dG8iLFtvLHVdKT4tMSxmPXt9LGw9e30sYyxoO2E/KGw9aS5wb3NpdGlvbigpLGM9bC50b3AsaD1sLmxlZnQpOihjPXBhcnNlRmxvYXQobyl8fDAsaD1wYXJzZUZsb2F0KHUpfHwwKSx2LmlzRnVuY3Rpb24odCkmJih0PXQuY2FsbChlLG4scykpLHQudG9wIT1udWxsJiYoZi50b3A9dC50b3Atcy50b3ArYyksdC5sZWZ0IT1udWxsJiYoZi5sZWZ0PXQubGVmdC1zLmxlZnQraCksInVzaW5nImluIHQ/dC51c2luZy5jYWxsKGUsZik6aS5jc3MoZil9fSx2LmZuLmV4dGVuZCh7cG9zaXRpb246ZnVuY3Rpb24oKXtpZighdGhpc1swXSlyZXR1cm47dmFyIGU9dGhpc1swXSx0PXRoaXMub2Zmc2V0UGFyZW50KCksbj10aGlzLm9mZnNldCgpLHI9ZXIudGVzdCh0WzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTp0Lm9mZnNldCgpO3JldHVybiBuLnRvcC09cGFyc2VGbG9hdCh2LmNzcyhlLCJtYXJnaW5Ub3AiKSl8fDAsbi5sZWZ0LT1wYXJzZUZsb2F0KHYuY3NzKGUsIm1hcmdpbkxlZnQiKSl8fDAsci50b3ArPXBhcnNlRmxvYXQodi5jc3ModFswXSwiYm9yZGVyVG9wV2lkdGgiKSl8fDAsci5sZWZ0Kz1wYXJzZUZsb2F0KHYuY3NzKHRbMF0sImJvcmRlckxlZnRXaWR0aCIpKXx8MCx7dG9wOm4udG9wLXIudG9wLGxlZnQ6bi5sZWZ0LXIubGVmdH19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXMub2Zmc2V0UGFyZW50fHxpLmJvZHk7d2hpbGUoZSYmIWVyLnRlc3QoZS5ub2RlTmFtZSkmJnYuY3NzKGUsInBvc2l0aW9uIik9PT0ic3RhdGljIillPWUub2Zmc2V0UGFyZW50O3JldHVybiBlfHxpLmJvZHl9KX19KSx2LmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oZSxuKXt2YXIgcj0vWS8udGVzdChuKTt2LmZuW2VdPWZ1bmN0aW9uKGkpe3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUsaSxzKXt2YXIgbz10cihlKTtpZihzPT09dClyZXR1cm4gbz9uIGluIG8/b1tuXTpvLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtpXTplW2ldO28/by5zY3JvbGxUbyhyP3Yobykuc2Nyb2xsTGVmdCgpOnMscj9zOnYobykuc2Nyb2xsVG9wKCkpOmVbaV09c30sZSxpLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksdi5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oZSxuKXt2LmVhY2goe3BhZGRpbmc6ImlubmVyIitlLGNvbnRlbnQ6biwiIjoib3V0ZXIiK2V9LGZ1bmN0aW9uKHIsaSl7di5mbltpXT1mdW5jdGlvbihpLHMpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGgmJihyfHx0eXBlb2YgaSE9ImJvb2xlYW4iKSx1PXJ8fChpPT09ITB8fHM9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIHYuYWNjZXNzKHRoaXMsZnVuY3Rpb24obixyLGkpe3ZhciBzO3JldHVybiB2LmlzV2luZG93KG4pP24uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2VdOm4ubm9kZVR5cGU9PT05PyhzPW4uZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KG4uYm9keVsic2Nyb2xsIitlXSxzWyJzY3JvbGwiK2VdLG4uYm9keVsib2Zmc2V0IitlXSxzWyJvZmZzZXQiK2VdLHNbImNsaWVudCIrZV0pKTppPT09dD92LmNzcyhuLHIsaSx1KTp2LnN0eWxlKG4scixpLHUpfSxuLG8/aTp0LG8sbnVsbCl9fSl9KSxlLmpRdWVyeT1lLiQ9dix0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIHZ9KX0pKHdpbmRvdyk7"},{"meta":{"name":"jquery.cookie.min.js","url":"https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.min.js","ts":1647165650320,"mimetype":"text/javascript"},"source":"LyohIGpxdWVyeS5jb29raWUgdjEuNC4xIHwgTUlUICovCiFmdW5jdGlvbihhKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImpxdWVyeSJdLGEpOiJvYmplY3QiPT10eXBlb2YgZXhwb3J0cz9hKHJlcXVpcmUoImpxdWVyeSIpKTphKGpRdWVyeSl9KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuIGgucmF3P2E6ZW5jb2RlVVJJQ29tcG9uZW50KGEpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIGgucmF3P2E6ZGVjb2RlVVJJQ29tcG9uZW50KGEpfWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGIoaC5qc29uP0pTT04uc3RyaW5naWZ5KGEpOlN0cmluZyhhKSl9ZnVuY3Rpb24gZShhKXswPT09YS5pbmRleE9mKCciJykmJihhPWEuc2xpY2UoMSwtMSkucmVwbGFjZSgvXFwiL2csJyInKS5yZXBsYWNlKC9cXFxcL2csIlxcIikpO3RyeXtyZXR1cm4gYT1kZWNvZGVVUklDb21wb25lbnQoYS5yZXBsYWNlKGcsIiAiKSksaC5qc29uP0pTT04ucGFyc2UoYSk6YX1jYXRjaChiKXt9fWZ1bmN0aW9uIGYoYixjKXt2YXIgZD1oLnJhdz9iOmUoYik7cmV0dXJuIGEuaXNGdW5jdGlvbihjKT9jKGQpOmR9dmFyIGc9L1wrL2csaD1hLmNvb2tpZT1mdW5jdGlvbihlLGcsaSl7aWYodm9pZCAwIT09ZyYmIWEuaXNGdW5jdGlvbihnKSl7aWYoaT1hLmV4dGVuZCh7fSxoLmRlZmF1bHRzLGkpLCJudW1iZXIiPT10eXBlb2YgaS5leHBpcmVzKXt2YXIgaj1pLmV4cGlyZXMsaz1pLmV4cGlyZXM9bmV3IERhdGU7ay5zZXRUaW1lKCtrKzg2NGU1KmopfXJldHVybiBkb2N1bWVudC5jb29raWU9W2IoZSksIj0iLGQoZyksaS5leHBpcmVzPyI7IGV4cGlyZXM9IitpLmV4cGlyZXMudG9VVENTdHJpbmcoKToiIixpLnBhdGg/IjsgcGF0aD0iK2kucGF0aDoiIixpLmRvbWFpbj8iOyBkb21haW49IitpLmRvbWFpbjoiIixpLnNlY3VyZT8iOyBzZWN1cmUiOiIiXS5qb2luKCIiKX1mb3IodmFyIGw9ZT92b2lkIDA6e30sbT1kb2N1bWVudC5jb29raWU/ZG9jdW1lbnQuY29va2llLnNwbGl0KCI7ICIpOltdLG49MCxvPW0ubGVuZ3RoO28+bjtuKyspe3ZhciBwPW1bbl0uc3BsaXQoIj0iKSxxPWMocC5zaGlmdCgpKSxyPXAuam9pbigiPSIpO2lmKGUmJmU9PT1xKXtsPWYocixnKTticmVha31lfHx2b2lkIDA9PT0ocj1mKHIpKXx8KGxbcV09cil9cmV0dXJuIGx9O2guZGVmYXVsdHM9e30sYS5yZW1vdmVDb29raWU9ZnVuY3Rpb24oYixjKXtyZXR1cm4gdm9pZCAwPT09YS5jb29raWUoYik/ITE6KGEuY29va2llKGIsIiIsYS5leHRlbmQoe30sYyx7ZXhwaXJlczotMX0pKSwhYS5jb29raWUoYikpfX0pOwo="},{"meta":{"name":"sweetalert2.all.js","url":"https://cdn.bootcss.com/limonte-sweetalert2/7.28.5/sweetalert2.all.js","ts":1647165650332,"mimetype":"text/javascript"},"source":"LyohCiogc3dlZXRhbGVydDIgdjcuMjguNQoqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KKi8oZnVuY3Rpb24oZ2xvYmFsLGZhY3Rvcnkpe3R5cGVvZiBleHBvcnRzPT09J29iamVjdCcmJnR5cGVvZiBtb2R1bGUhPT0ndW5kZWZpbmVkJz9tb2R1bGUuZXhwb3J0cz1mYWN0b3J5KCk6dHlwZW9mIGRlZmluZT09PSdmdW5jdGlvbicmJmRlZmluZS5hbWQ/ZGVmaW5lKGZhY3RvcnkpOihnbG9iYWwuU3dlZXRhbGVydDI9ZmFjdG9yeSgpKTt9KHRoaXMsKGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2Z1bmN0aW9uIF90eXBlb2Yob2JqKXtpZih0eXBlb2YgU3ltYm9sPT09ImZ1bmN0aW9uIiYmdHlwZW9mIFN5bWJvbC5pdGVyYXRvcj09PSJzeW1ib2wiKXtfdHlwZW9mPWZ1bmN0aW9uKG9iail7cmV0dXJuIHR5cGVvZiBvYmo7fTt9ZWxzZXtfdHlwZW9mPWZ1bmN0aW9uKG9iail7cmV0dXJuIG9iaiYmdHlwZW9mIFN5bWJvbD09PSJmdW5jdGlvbiImJm9iai5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmb2JqIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2Ygb2JqO307fQpyZXR1cm4gX3R5cGVvZihvYmopO30KZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTt9fQpmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZigidmFsdWUiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fQpmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9CmZ1bmN0aW9uIF9leHRlbmRzKCl7X2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV07fX19CnJldHVybiB0YXJnZXQ7fTtyZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcyxhcmd1bWVudHMpO30KZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09ImZ1bmN0aW9uIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7fQpzdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk7fQpmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobyl7X2dldFByb3RvdHlwZU9mPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pe3JldHVybiBvLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO307cmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTt9CmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLHApe19zZXRQcm90b3R5cGVPZj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLHApe28uX19wcm90b19fPXA7cmV0dXJuIG87fTtyZXR1cm4gX3NldFByb3RvdHlwZU9mKG8scCk7fQpmdW5jdGlvbiBpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKXtpZih0eXBlb2YgUmVmbGVjdD09PSJ1bmRlZmluZWQifHwhUmVmbGVjdC5jb25zdHJ1Y3QpcmV0dXJuIGZhbHNlO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuIGZhbHNlO2lmKHR5cGVvZiBQcm94eT09PSJmdW5jdGlvbiIpcmV0dXJuIHRydWU7dHJ5e0RhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSxmdW5jdGlvbigpe30pKTtyZXR1cm4gdHJ1ZTt9Y2F0Y2goZSl7cmV0dXJuIGZhbHNlO319CmZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LGFyZ3MsQ2xhc3Mpe2lmKGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpKXtfY29uc3RydWN0PVJlZmxlY3QuY29uc3RydWN0O31lbHNle19jb25zdHJ1Y3Q9ZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsYXJncyxDbGFzcyl7dmFyIGE9W251bGxdO2EucHVzaC5hcHBseShhLGFyZ3MpO3ZhciBDb25zdHJ1Y3Rvcj1GdW5jdGlvbi5iaW5kLmFwcGx5KFBhcmVudCxhKTt2YXIgaW5zdGFuY2U9bmV3IENvbnN0cnVjdG9yKCk7aWYoQ2xhc3MpX3NldFByb3RvdHlwZU9mKGluc3RhbmNlLENsYXNzLnByb3RvdHlwZSk7cmV0dXJuIGluc3RhbmNlO307fQpyZXR1cm4gX2NvbnN0cnVjdC5hcHBseShudWxsLGFyZ3VtZW50cyk7fQpmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpe2lmKHNlbGY9PT12b2lkIDApe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7fQpyZXR1cm4gc2VsZjt9CmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoY2FsbCYmKHR5cGVvZiBjYWxsPT09Im9iamVjdCJ8fHR5cGVvZiBjYWxsPT09ImZ1bmN0aW9uIikpe3JldHVybiBjYWxsO30KcmV0dXJuIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7fQpmdW5jdGlvbiBfc3VwZXJQcm9wQmFzZShvYmplY3QscHJvcGVydHkpe3doaWxlKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LHByb3BlcnR5KSl7b2JqZWN0PV9nZXRQcm90b3R5cGVPZihvYmplY3QpO2lmKG9iamVjdD09PW51bGwpYnJlYWs7fQpyZXR1cm4gb2JqZWN0O30KZnVuY3Rpb24gX2dldCh0YXJnZXQscHJvcGVydHkscmVjZWl2ZXIpe2lmKHR5cGVvZiBSZWZsZWN0IT09InVuZGVmaW5lZCImJlJlZmxlY3QuZ2V0KXtfZ2V0PVJlZmxlY3QuZ2V0O31lbHNle19nZXQ9ZnVuY3Rpb24gX2dldCh0YXJnZXQscHJvcGVydHkscmVjZWl2ZXIpe3ZhciBiYXNlPV9zdXBlclByb3BCYXNlKHRhcmdldCxwcm9wZXJ0eSk7aWYoIWJhc2UpcmV0dXJuO3ZhciBkZXNjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSxwcm9wZXJ0eSk7aWYoZGVzYy5nZXQpe3JldHVybiBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKTt9CnJldHVybiBkZXNjLnZhbHVlO307fQpyZXR1cm4gX2dldCh0YXJnZXQscHJvcGVydHkscmVjZWl2ZXJ8fHRhcmdldCk7fQp2YXIgY29uc29sZVByZWZpeD0nU3dlZXRBbGVydDI6Jzt2YXIgdW5pcXVlQXJyYXk9ZnVuY3Rpb24gdW5pcXVlQXJyYXkoYXJyKXt2YXIgcmVzdWx0PVtdO2Zvcih2YXIgaT0wO2k8YXJyLmxlbmd0aDtpKyspe2lmKHJlc3VsdC5pbmRleE9mKGFycltpXSk9PT0tMSl7cmVzdWx0LnB1c2goYXJyW2ldKTt9fQpyZXR1cm4gcmVzdWx0O307dmFyIHRvQXJyYXk9ZnVuY3Rpb24gdG9BcnJheShub2RlTGlzdCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5vZGVMaXN0KTt9O3ZhciBmb3JtYXRJbnB1dE9wdGlvbnM9ZnVuY3Rpb24gZm9ybWF0SW5wdXRPcHRpb25zKGlucHV0T3B0aW9ucyl7dmFyIHJlc3VsdD1bXTtpZih0eXBlb2YgTWFwIT09J3VuZGVmaW5lZCcmJmlucHV0T3B0aW9ucyBpbnN0YW5jZW9mIE1hcCl7aW5wdXRPcHRpb25zLmZvckVhY2goZnVuY3Rpb24odmFsdWUsa2V5KXtyZXN1bHQucHVzaChba2V5LHZhbHVlXSk7fSk7fWVsc2V7T2JqZWN0LmtleXMoaW5wdXRPcHRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7cmVzdWx0LnB1c2goW2tleSxpbnB1dE9wdGlvbnNba2V5XV0pO30pO30KcmV0dXJuIHJlc3VsdDt9O3ZhciB3YXJuPWZ1bmN0aW9uIHdhcm4obWVzc2FnZSl7Y29uc29sZS53YXJuKCIiLmNvbmNhdChjb25zb2xlUHJlZml4LCIgIikuY29uY2F0KG1lc3NhZ2UpKTt9O3ZhciBlcnJvcj1mdW5jdGlvbiBlcnJvcihtZXNzYWdlKXtjb25zb2xlLmVycm9yKCIiLmNvbmNhdChjb25zb2xlUHJlZml4LCIgIikuY29uY2F0KG1lc3NhZ2UpKTt9O3ZhciBwcmV2aW91c1dhcm5PbmNlTWVzc2FnZXM9W107dmFyIHdhcm5PbmNlPWZ1bmN0aW9uIHdhcm5PbmNlKG1lc3NhZ2Upe2lmKCEocHJldmlvdXNXYXJuT25jZU1lc3NhZ2VzLmluZGV4T2YobWVzc2FnZSkhPT0tMSkpe3ByZXZpb3VzV2Fybk9uY2VNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO3dhcm4obWVzc2FnZSk7fX07dmFyIGNhbGxJZkZ1bmN0aW9uPWZ1bmN0aW9uIGNhbGxJZkZ1bmN0aW9uKGFyZyl7cmV0dXJuIHR5cGVvZiBhcmc9PT0nZnVuY3Rpb24nP2FyZygpOmFyZzt9O3ZhciBpc1RoZW5hYmxlPWZ1bmN0aW9uIGlzVGhlbmFibGUoYXJnKXtyZXR1cm4gYXJnJiZfdHlwZW9mKGFyZyk9PT0nb2JqZWN0JyYmdHlwZW9mIGFyZy50aGVuPT09J2Z1bmN0aW9uJzt9O3ZhciBEaXNtaXNzUmVhc29uPU9iamVjdC5mcmVlemUoe2NhbmNlbDonY2FuY2VsJyxiYWNrZHJvcDonb3ZlcmxheScsY2xvc2U6J2Nsb3NlJyxlc2M6J2VzYycsdGltZXI6J3RpbWVyJ30pO3ZhciBhcmdzVG9QYXJhbXM9ZnVuY3Rpb24gYXJnc1RvUGFyYW1zKGFyZ3Mpe3ZhciBwYXJhbXM9e307c3dpdGNoKF90eXBlb2YoYXJnc1swXSkpe2Nhc2UgJ29iamVjdCc6X2V4dGVuZHMocGFyYW1zLGFyZ3NbMF0pO2JyZWFrO2RlZmF1bHQ6Wyd0aXRsZScsJ2h0bWwnLCd0eXBlJ10uZm9yRWFjaChmdW5jdGlvbihuYW1lLGluZGV4KXtzd2l0Y2goX3R5cGVvZihhcmdzW2luZGV4XSkpe2Nhc2UgJ3N0cmluZyc6cGFyYW1zW25hbWVdPWFyZ3NbaW5kZXhdO2JyZWFrO2Nhc2UgJ3VuZGVmaW5lZCc6YnJlYWs7ZGVmYXVsdDplcnJvcigiVW5leHBlY3RlZCB0eXBlIG9mICIuY29uY2F0KG5hbWUsIiEgRXhwZWN0ZWQgXCJzdHJpbmdcIiwgZ290ICIpLmNvbmNhdChfdHlwZW9mKGFyZ3NbaW5kZXhdKSkpO319KTt9CnJldHVybiBwYXJhbXM7fTt2YXIgYWRhcHRJbnB1dFZhbGlkYXRvcj1mdW5jdGlvbiBhZGFwdElucHV0VmFsaWRhdG9yKGxlZ2FjeVZhbGlkYXRvcil7cmV0dXJuIGZ1bmN0aW9uIGFkYXB0ZWRJbnB1dFZhbGlkYXRvcihpbnB1dFZhbHVlLGV4dHJhUGFyYW1zKXtyZXR1cm4gbGVnYWN5VmFsaWRhdG9yLmNhbGwodGhpcyxpbnB1dFZhbHVlLGV4dHJhUGFyYW1zKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHVuZGVmaW5lZDt9LGZ1bmN0aW9uKHZhbGlkYXRpb25NZXNzYWdlKXtyZXR1cm4gdmFsaWRhdGlvbk1lc3NhZ2U7fSk7fTt9O3ZhciBzd2FsUHJlZml4PSdzd2FsMi0nO3ZhciBwcmVmaXg9ZnVuY3Rpb24gcHJlZml4KGl0ZW1zKXt2YXIgcmVzdWx0PXt9O2Zvcih2YXIgaSBpbiBpdGVtcyl7cmVzdWx0W2l0ZW1zW2ldXT1zd2FsUHJlZml4K2l0ZW1zW2ldO30KcmV0dXJuIHJlc3VsdDt9O3ZhciBzd2FsQ2xhc3Nlcz1wcmVmaXgoWydjb250YWluZXInLCdzaG93bicsJ2hlaWdodC1hdXRvJywnaW9zZml4JywncG9wdXAnLCdtb2RhbCcsJ25vLWJhY2tkcm9wJywndG9hc3QnLCd0b2FzdC1zaG93bicsJ3RvYXN0LWNvbHVtbicsJ2ZhZGUnLCdzaG93JywnaGlkZScsJ25vYW5pbWF0aW9uJywnY2xvc2UnLCd0aXRsZScsJ2hlYWRlcicsJ2NvbnRlbnQnLCdhY3Rpb25zJywnY29uZmlybScsJ2NhbmNlbCcsJ2Zvb3RlcicsJ2ljb24nLCdpY29uLXRleHQnLCdpbWFnZScsJ2lucHV0JywnZmlsZScsJ3JhbmdlJywnc2VsZWN0JywncmFkaW8nLCdjaGVja2JveCcsJ2xhYmVsJywndGV4dGFyZWEnLCdpbnB1dGVycm9yJywndmFsaWRhdGlvbi1tZXNzYWdlJywncHJvZ3Jlc3NzdGVwcycsJ2FjdGl2ZXByb2dyZXNzc3RlcCcsJ3Byb2dyZXNzY2lyY2xlJywncHJvZ3Jlc3NsaW5lJywnbG9hZGluZycsJ3N0eWxlZCcsJ3RvcCcsJ3RvcC1zdGFydCcsJ3RvcC1lbmQnLCd0b3AtbGVmdCcsJ3RvcC1yaWdodCcsJ2NlbnRlcicsJ2NlbnRlci1zdGFydCcsJ2NlbnRlci1lbmQnLCdjZW50ZXItbGVmdCcsJ2NlbnRlci1yaWdodCcsJ2JvdHRvbScsJ2JvdHRvbS1zdGFydCcsJ2JvdHRvbS1lbmQnLCdib3R0b20tbGVmdCcsJ2JvdHRvbS1yaWdodCcsJ2dyb3ctcm93JywnZ3Jvdy1jb2x1bW4nLCdncm93LWZ1bGxzY3JlZW4nXSk7dmFyIGljb25UeXBlcz1wcmVmaXgoWydzdWNjZXNzJywnd2FybmluZycsJ2luZm8nLCdxdWVzdGlvbicsJ2Vycm9yJ10pO3ZhciBzdGF0ZXM9e3ByZXZpb3VzQm9keVBhZGRpbmc6bnVsbH07dmFyIGhhc0NsYXNzPWZ1bmN0aW9uIGhhc0NsYXNzKGVsZW0sY2xhc3NOYW1lKXtyZXR1cm4gZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTt9O3ZhciBmb2N1c0lucHV0PWZ1bmN0aW9uIGZvY3VzSW5wdXQoaW5wdXQpe2lucHV0LmZvY3VzKCk7aWYoaW5wdXQudHlwZSE9PSdmaWxlJyl7dmFyIHZhbD1pbnB1dC52YWx1ZTtpbnB1dC52YWx1ZT0nJztpbnB1dC52YWx1ZT12YWw7fX07dmFyIGFkZE9yUmVtb3ZlQ2xhc3M9ZnVuY3Rpb24gYWRkT3JSZW1vdmVDbGFzcyh0YXJnZXQsY2xhc3NMaXN0LGFkZCl7aWYoIXRhcmdldHx8IWNsYXNzTGlzdCl7cmV0dXJuO30KaWYodHlwZW9mIGNsYXNzTGlzdD09PSdzdHJpbmcnKXtjbGFzc0xpc3Q9Y2xhc3NMaXN0LnNwbGl0KC9ccysvKS5maWx0ZXIoQm9vbGVhbik7fQpjbGFzc0xpc3QuZm9yRWFjaChmdW5jdGlvbihjbGFzc05hbWUpe2lmKHRhcmdldC5mb3JFYWNoKXt0YXJnZXQuZm9yRWFjaChmdW5jdGlvbihlbGVtKXthZGQ/ZWxlbS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk6ZWxlbS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7fSk7fWVsc2V7YWRkP3RhcmdldC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk6dGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTt9fSk7fTt2YXIgYWRkQ2xhc3M9ZnVuY3Rpb24gYWRkQ2xhc3ModGFyZ2V0LGNsYXNzTGlzdCl7YWRkT3JSZW1vdmVDbGFzcyh0YXJnZXQsY2xhc3NMaXN0LHRydWUpO307dmFyIHJlbW92ZUNsYXNzPWZ1bmN0aW9uIHJlbW92ZUNsYXNzKHRhcmdldCxjbGFzc0xpc3Qpe2FkZE9yUmVtb3ZlQ2xhc3ModGFyZ2V0LGNsYXNzTGlzdCxmYWxzZSk7fTt2YXIgZ2V0Q2hpbGRCeUNsYXNzPWZ1bmN0aW9uIGdldENoaWxkQnlDbGFzcyhlbGVtLGNsYXNzTmFtZSl7Zm9yKHZhciBpPTA7aTxlbGVtLmNoaWxkTm9kZXMubGVuZ3RoO2krKyl7aWYoaGFzQ2xhc3MoZWxlbS5jaGlsZE5vZGVzW2ldLGNsYXNzTmFtZSkpe3JldHVybiBlbGVtLmNoaWxkTm9kZXNbaV07fX19O3ZhciBzaG93PWZ1bmN0aW9uIHNob3coZWxlbSl7ZWxlbS5zdHlsZS5vcGFjaXR5PScnO2VsZW0uc3R5bGUuZGlzcGxheT1lbGVtLmlkPT09c3dhbENsYXNzZXMuY29udGVudD8nYmxvY2snOidmbGV4Jzt9O3ZhciBoaWRlPWZ1bmN0aW9uIGhpZGUoZWxlbSl7ZWxlbS5zdHlsZS5vcGFjaXR5PScnO2VsZW0uc3R5bGUuZGlzcGxheT0nbm9uZSc7fTt2YXIgaXNWaXNpYmxlPWZ1bmN0aW9uIGlzVmlzaWJsZShlbGVtKXtyZXR1cm4gZWxlbSYmKGVsZW0ub2Zmc2V0V2lkdGh8fGVsZW0ub2Zmc2V0SGVpZ2h0fHxlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKTt9O3ZhciBnZXRDb250YWluZXI9ZnVuY3Rpb24gZ2V0Q29udGFpbmVyKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcignLicrc3dhbENsYXNzZXMuY29udGFpbmVyKTt9O3ZhciBlbGVtZW50QnlDbGFzcz1mdW5jdGlvbiBlbGVtZW50QnlDbGFzcyhjbGFzc05hbWUpe3ZhciBjb250YWluZXI9Z2V0Q29udGFpbmVyKCk7cmV0dXJuIGNvbnRhaW5lcj9jb250YWluZXIucXVlcnlTZWxlY3RvcignLicrY2xhc3NOYW1lKTpudWxsO307dmFyIGdldFBvcHVwPWZ1bmN0aW9uIGdldFBvcHVwKCl7cmV0dXJuIGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLnBvcHVwKTt9O3ZhciBnZXRJY29ucz1mdW5jdGlvbiBnZXRJY29ucygpe3ZhciBwb3B1cD1nZXRQb3B1cCgpO3JldHVybiB0b0FycmF5KHBvcHVwLnF1ZXJ5U2VsZWN0b3JBbGwoJy4nK3N3YWxDbGFzc2VzLmljb24pKTt9O3ZhciBnZXRUaXRsZT1mdW5jdGlvbiBnZXRUaXRsZSgpe3JldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlcy50aXRsZSk7fTt2YXIgZ2V0Q29udGVudD1mdW5jdGlvbiBnZXRDb250ZW50KCl7cmV0dXJuIGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLmNvbnRlbnQpO307dmFyIGdldEltYWdlPWZ1bmN0aW9uIGdldEltYWdlKCl7cmV0dXJuIGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLmltYWdlKTt9O3ZhciBnZXRQcm9ncmVzc1N0ZXBzPWZ1bmN0aW9uIGdldFByb2dyZXNzU3RlcHMoKXtyZXR1cm4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXMucHJvZ3Jlc3NzdGVwcyk7fTt2YXIgZ2V0VmFsaWRhdGlvbk1lc3NhZ2U9ZnVuY3Rpb24gZ2V0VmFsaWRhdGlvbk1lc3NhZ2UoKXtyZXR1cm4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXNbJ3ZhbGlkYXRpb24tbWVzc2FnZSddKTt9O3ZhciBnZXRDb25maXJtQnV0dG9uPWZ1bmN0aW9uIGdldENvbmZpcm1CdXR0b24oKXtyZXR1cm4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXMuY29uZmlybSk7fTt2YXIgZ2V0Q2FuY2VsQnV0dG9uPWZ1bmN0aW9uIGdldENhbmNlbEJ1dHRvbigpe3JldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlcy5jYW5jZWwpO307dmFyIGdldEJ1dHRvbnNXcmFwcGVyPWZ1bmN0aW9uIGdldEJ1dHRvbnNXcmFwcGVyKCl7d2Fybk9uY2UoInN3YWwuZ2V0QnV0dG9uc1dyYXBwZXIoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZSwgdXNlIHN3YWwuZ2V0QWN0aW9ucygpIGluc3RlYWQiKTtyZXR1cm4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXMuYWN0aW9ucyk7fTt2YXIgZ2V0QWN0aW9ucz1mdW5jdGlvbiBnZXRBY3Rpb25zKCl7cmV0dXJuIGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLmFjdGlvbnMpO307dmFyIGdldEZvb3Rlcj1mdW5jdGlvbiBnZXRGb290ZXIoKXtyZXR1cm4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXMuZm9vdGVyKTt9O3ZhciBnZXRDbG9zZUJ1dHRvbj1mdW5jdGlvbiBnZXRDbG9zZUJ1dHRvbigpe3JldHVybiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlcy5jbG9zZSk7fTt2YXIgZ2V0Rm9jdXNhYmxlRWxlbWVudHM9ZnVuY3Rpb24gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoKXt2YXIgZm9jdXNhYmxlRWxlbWVudHNXaXRoVGFiaW5kZXg9dG9BcnJheShnZXRQb3B1cCgpLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0YWJpbmRleF06bm90KFt0YWJpbmRleD0iLTEiXSk6bm90KFt0YWJpbmRleD0iMCJdKScpKS5zb3J0KGZ1bmN0aW9uKGEsYil7YT1wYXJzZUludChhLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSk7Yj1wYXJzZUludChiLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSk7aWYoYT5iKXtyZXR1cm4gMTt9ZWxzZSBpZihhPGIpe3JldHVybi0xO30KcmV0dXJuIDA7fSk7dmFyIG90aGVyRm9jdXNhYmxlRWxlbWVudHM9dG9BcnJheShnZXRQb3B1cCgpLnF1ZXJ5U2VsZWN0b3JBbGwoJ2FbaHJlZl0sIGFyZWFbaHJlZl0sIGlucHV0Om5vdChbZGlzYWJsZWRdKSwgc2VsZWN0Om5vdChbZGlzYWJsZWRdKSwgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLCBidXR0b246bm90KFtkaXNhYmxlZF0pLCBpZnJhbWUsIG9iamVjdCwgZW1iZWQsIFt0YWJpbmRleD0iMCJdLCBbY29udGVudGVkaXRhYmxlXSwgYXVkaW9bY29udHJvbHNdLCB2aWRlb1tjb250cm9sc10nKSkuZmlsdGVyKGZ1bmN0aW9uKGVsKXtyZXR1cm4gZWwuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpIT09Jy0xJzt9KTtyZXR1cm4gdW5pcXVlQXJyYXkoZm9jdXNhYmxlRWxlbWVudHNXaXRoVGFiaW5kZXguY29uY2F0KG90aGVyRm9jdXNhYmxlRWxlbWVudHMpKS5maWx0ZXIoZnVuY3Rpb24oZWwpe3JldHVybiBpc1Zpc2libGUoZWwpO30pO307dmFyIGlzTW9kYWw9ZnVuY3Rpb24gaXNNb2RhbCgpe3JldHVybiFpc1RvYXN0KCkmJiFkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucyhzd2FsQ2xhc3Nlc1snbm8tYmFja2Ryb3AnXSk7fTt2YXIgaXNUb2FzdD1mdW5jdGlvbiBpc1RvYXN0KCl7cmV0dXJuIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKHN3YWxDbGFzc2VzWyd0b2FzdC1zaG93biddKTt9O3ZhciBpc0xvYWRpbmc9ZnVuY3Rpb24gaXNMb2FkaW5nKCl7cmV0dXJuIGdldFBvcHVwKCkuaGFzQXR0cmlidXRlKCdkYXRhLWxvYWRpbmcnKTt9O3ZhciBpc05vZGVFbnY9ZnVuY3Rpb24gaXNOb2RlRW52KCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c9PT0ndW5kZWZpbmVkJ3x8dHlwZW9mIGRvY3VtZW50PT09J3VuZGVmaW5lZCc7fTt2YXIgc3dlZXRIVE1MPSJcbiA8ZGl2IGFyaWEtbGFiZWxsZWRieT1cIiIuY29uY2F0KHN3YWxDbGFzc2VzLnRpdGxlLCJcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLmNvbnRlbnQsIlwiIGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLnBvcHVwLCJcIiB0YWJpbmRleD1cIi0xXCI+XG4gICA8ZGl2IGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLmhlYWRlciwiXCI+XG4gICAgIDx1bCBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5wcm9ncmVzc3N0ZXBzLCJcIj48L3VsPlxuICAgICA8ZGl2IGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLmljb24sIiAiKS5jb25jYXQoaWNvblR5cGVzLmVycm9yLCJcIj5cbiAgICAgICA8c3BhbiBjbGFzcz1cInN3YWwyLXgtbWFya1wiPjxzcGFuIGNsYXNzPVwic3dhbDIteC1tYXJrLWxpbmUtbGVmdFwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cInN3YWwyLXgtbWFyay1saW5lLXJpZ2h0XCI+PC9zcGFuPjwvc3Bhbj5cbiAgICAgPC9kaXY+XG4gICAgIDxkaXYgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMuaWNvbiwiICIpLmNvbmNhdChpY29uVHlwZXMucXVlc3Rpb24sIlwiPlxuICAgICAgIDxzcGFuIGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzWydpY29uLXRleHQnXSwiXCI+Pzwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICA8ZGl2IGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLmljb24sIiAiKS5jb25jYXQoaWNvblR5cGVzLndhcm5pbmcsIlwiPlxuICAgICAgIDxzcGFuIGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzWydpY29uLXRleHQnXSwiXCI+ITwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICA8ZGl2IGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLmljb24sIiAiKS5jb25jYXQoaWNvblR5cGVzLmluZm8sIlwiPlxuICAgICAgIDxzcGFuIGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzWydpY29uLXRleHQnXSwiXCI+aTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICA8ZGl2IGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLmljb24sIiAiKS5jb25jYXQoaWNvblR5cGVzLnN1Y2Nlc3MsIlwiPlxuICAgICAgIDxkaXYgY2xhc3M9XCJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtbGVmdFwiPjwvZGl2PlxuICAgICAgIDxzcGFuIGNsYXNzPVwic3dhbDItc3VjY2Vzcy1saW5lLXRpcFwiPjwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJzd2FsMi1zdWNjZXNzLWxpbmUtbG9uZ1wiPjwvc3Bhbj5cbiAgICAgICA8ZGl2IGNsYXNzPVwic3dhbDItc3VjY2Vzcy1yaW5nXCI+PC9kaXY+IDxkaXYgY2xhc3M9XCJzd2FsMi1zdWNjZXNzLWZpeFwiPjwvZGl2PlxuICAgICAgIDxkaXYgY2xhc3M9XCJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtcmlnaHRcIj48L2Rpdj5cbiAgICAgPC9kaXY+XG4gICAgIDxpbWcgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMuaW1hZ2UsIlwiIC8+XG4gICAgIDxoMiBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy50aXRsZSwiXCIgaWQ9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMudGl0bGUsIlwiPjwvaDI+XG4gICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLmNsb3NlLCJcIj5ceEQ3PC9idXR0b24+XG4gICA8L2Rpdj5cbiAgIDxkaXYgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMuY29udGVudCwiXCI+XG4gICAgIDxkaXYgaWQ9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMuY29udGVudCwiXCI+PC9kaXY+XG4gICAgIDxpbnB1dCBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5pbnB1dCwiXCIgLz5cbiAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMuZmlsZSwiXCIgLz5cbiAgICAgPGRpdiBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5yYW5nZSwiXCI+XG4gICAgICAgPGlucHV0IHR5cGU9XCJyYW5nZVwiIC8+XG4gICAgICAgPG91dHB1dD48L291dHB1dD5cbiAgICAgPC9kaXY+XG4gICAgIDxzZWxlY3QgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMuc2VsZWN0LCJcIj48L3NlbGVjdD5cbiAgICAgPGRpdiBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5yYWRpbywiXCI+PC9kaXY+XG4gICAgIDxsYWJlbCBmb3I9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMuY2hlY2tib3gsIlwiIGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLmNoZWNrYm94LCJcIj5cbiAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgLz5cbiAgICAgICA8c3BhbiBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5sYWJlbCwiXCI+PC9zcGFuPlxuICAgICA8L2xhYmVsPlxuICAgICA8dGV4dGFyZWEgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXMudGV4dGFyZWEsIlwiPjwvdGV4dGFyZWE+XG4gICAgIDxkaXYgY2xhc3M9XCIiKS5jb25jYXQoc3dhbENsYXNzZXNbJ3ZhbGlkYXRpb24tbWVzc2FnZSddLCJcIiBpZD1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlc1sndmFsaWRhdGlvbi1tZXNzYWdlJ10sIlwiPjwvZGl2PlxuICAgPC9kaXY+XG4gICA8ZGl2IGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLmFjdGlvbnMsIlwiPlxuICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5jb25maXJtLCJcIj5PSzwvYnV0dG9uPlxuICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIiIpLmNvbmNhdChzd2FsQ2xhc3Nlcy5jYW5jZWwsIlwiPkNhbmNlbDwvYnV0dG9uPlxuICAgPC9kaXY+XG4gICA8ZGl2IGNsYXNzPVwiIikuY29uY2F0KHN3YWxDbGFzc2VzLmZvb3RlciwiXCI+XG4gICA8L2Rpdj5cbiA8L2Rpdj5cbiIpLnJlcGxhY2UoLyhefFxuKVxzKi9nLCcnKTt2YXIgaW5pdD1mdW5jdGlvbiBpbml0KHBhcmFtcyl7dmFyIGM9Z2V0Q29udGFpbmVyKCk7aWYoYyl7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpO3JlbW92ZUNsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keV0sW3N3YWxDbGFzc2VzWyduby1iYWNrZHJvcCddLHN3YWxDbGFzc2VzWyd0b2FzdC1zaG93biddLHN3YWxDbGFzc2VzWydoYXMtY29sdW1uJ11dKTt9CmlmKGlzTm9kZUVudigpKXtlcnJvcignU3dlZXRBbGVydDIgcmVxdWlyZXMgZG9jdW1lbnQgdG8gaW5pdGlhbGl6ZScpO3JldHVybjt9CnZhciBjb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7Y29udGFpbmVyLmNsYXNzTmFtZT1zd2FsQ2xhc3Nlcy5jb250YWluZXI7Y29udGFpbmVyLmlubmVySFRNTD1zd2VldEhUTUw7dmFyIHRhcmdldEVsZW1lbnQ9dHlwZW9mIHBhcmFtcy50YXJnZXQ9PT0nc3RyaW5nJz9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHBhcmFtcy50YXJnZXQpOnBhcmFtcy50YXJnZXQ7dGFyZ2V0RWxlbWVudC5hcHBlbmRDaGlsZChjb250YWluZXIpO3ZhciBwb3B1cD1nZXRQb3B1cCgpO3ZhciBjb250ZW50PWdldENvbnRlbnQoKTt2YXIgaW5wdXQ9Z2V0Q2hpbGRCeUNsYXNzKGNvbnRlbnQsc3dhbENsYXNzZXMuaW5wdXQpO3ZhciBmaWxlPWdldENoaWxkQnlDbGFzcyhjb250ZW50LHN3YWxDbGFzc2VzLmZpbGUpO3ZhciByYW5nZT1jb250ZW50LnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChzd2FsQ2xhc3Nlcy5yYW5nZSwiIGlucHV0IikpO3ZhciByYW5nZU91dHB1dD1jb250ZW50LnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChzd2FsQ2xhc3Nlcy5yYW5nZSwiIG91dHB1dCIpKTt2YXIgc2VsZWN0PWdldENoaWxkQnlDbGFzcyhjb250ZW50LHN3YWxDbGFzc2VzLnNlbGVjdCk7dmFyIGNoZWNrYm94PWNvbnRlbnQucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KHN3YWxDbGFzc2VzLmNoZWNrYm94LCIgaW5wdXQiKSk7dmFyIHRleHRhcmVhPWdldENoaWxkQnlDbGFzcyhjb250ZW50LHN3YWxDbGFzc2VzLnRleHRhcmVhKTtwb3B1cC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLHBhcmFtcy50b2FzdD8nYWxlcnQnOidkaWFsb2cnKTtwb3B1cC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScscGFyYW1zLnRvYXN0Pydwb2xpdGUnOidhc3NlcnRpdmUnKTtpZighcGFyYW1zLnRvYXN0KXtwb3B1cC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCd0cnVlJyk7fQp2YXIgb2xkSW5wdXRWYWw7dmFyIHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2U9ZnVuY3Rpb24gcmVzZXRWYWxpZGF0aW9uTWVzc2FnZShlKXtpZihTd2FsLmlzVmlzaWJsZSgpJiZvbGRJbnB1dFZhbCE9PWUudGFyZ2V0LnZhbHVlKXtTd2FsLnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKTt9Cm9sZElucHV0VmFsPWUudGFyZ2V0LnZhbHVlO307aW5wdXQub25pbnB1dD1yZXNldFZhbGlkYXRpb25NZXNzYWdlO2ZpbGUub25jaGFuZ2U9cmVzZXRWYWxpZGF0aW9uTWVzc2FnZTtzZWxlY3Qub25jaGFuZ2U9cmVzZXRWYWxpZGF0aW9uTWVzc2FnZTtjaGVja2JveC5vbmNoYW5nZT1yZXNldFZhbGlkYXRpb25NZXNzYWdlO3RleHRhcmVhLm9uaW5wdXQ9cmVzZXRWYWxpZGF0aW9uTWVzc2FnZTtyYW5nZS5vbmlucHV0PWZ1bmN0aW9uKGUpe3Jlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoZSk7cmFuZ2VPdXRwdXQudmFsdWU9cmFuZ2UudmFsdWU7fTtyYW5nZS5vbmNoYW5nZT1mdW5jdGlvbihlKXtyZXNldFZhbGlkYXRpb25NZXNzYWdlKGUpO3JhbmdlLm5leHRTaWJsaW5nLnZhbHVlPXJhbmdlLnZhbHVlO307cmV0dXJuIHBvcHVwO307dmFyIHBhcnNlSHRtbFRvQ29udGFpbmVyPWZ1bmN0aW9uIHBhcnNlSHRtbFRvQ29udGFpbmVyKHBhcmFtLHRhcmdldCl7aWYoIXBhcmFtKXtyZXR1cm4gaGlkZSh0YXJnZXQpO30KaWYoX3R5cGVvZihwYXJhbSk9PT0nb2JqZWN0Jyl7dGFyZ2V0LmlubmVySFRNTD0nJztpZigwIGluIHBhcmFtKXtmb3IodmFyIGk9MDtpIGluIHBhcmFtO2krKyl7dGFyZ2V0LmFwcGVuZENoaWxkKHBhcmFtW2ldLmNsb25lTm9kZSh0cnVlKSk7fX1lbHNle3RhcmdldC5hcHBlbmRDaGlsZChwYXJhbS5jbG9uZU5vZGUodHJ1ZSkpO319ZWxzZSBpZihwYXJhbSl7dGFyZ2V0LmlubmVySFRNTD1wYXJhbTt9CnNob3codGFyZ2V0KTt9O3ZhciBhbmltYXRpb25FbmRFdmVudD1mdW5jdGlvbigpe2lmKGlzTm9kZUVudigpKXtyZXR1cm4gZmFsc2U7fQp2YXIgdGVzdEVsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO3ZhciB0cmFuc0VuZEV2ZW50TmFtZXM9eydXZWJraXRBbmltYXRpb24nOid3ZWJraXRBbmltYXRpb25FbmQnLCdPQW5pbWF0aW9uJzonb0FuaW1hdGlvbkVuZCBvYW5pbWF0aW9uZW5kJywnYW5pbWF0aW9uJzonYW5pbWF0aW9uZW5kJ307Zm9yKHZhciBpIGluIHRyYW5zRW5kRXZlbnROYW1lcyl7aWYodHJhbnNFbmRFdmVudE5hbWVzLmhhc093blByb3BlcnR5KGkpJiZ0eXBlb2YgdGVzdEVsLnN0eWxlW2ldIT09J3VuZGVmaW5lZCcpe3JldHVybiB0cmFuc0VuZEV2ZW50TmFtZXNbaV07fX0KcmV0dXJuIGZhbHNlO30oKTt2YXIgbWVhc3VyZVNjcm9sbGJhcj1mdW5jdGlvbiBtZWFzdXJlU2Nyb2xsYmFyKCl7dmFyIHN1cHBvcnRzVG91Y2g9J29udG91Y2hzdGFydCdpbiB3aW5kb3d8fG5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzO2lmKHN1cHBvcnRzVG91Y2gpe3JldHVybiAwO30KdmFyIHNjcm9sbERpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtzY3JvbGxEaXYuc3R5bGUud2lkdGg9JzUwcHgnO3Njcm9sbERpdi5zdHlsZS5oZWlnaHQ9JzUwcHgnO3Njcm9sbERpdi5zdHlsZS5vdmVyZmxvdz0nc2Nyb2xsJztkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcm9sbERpdik7dmFyIHNjcm9sbGJhcldpZHRoPXNjcm9sbERpdi5vZmZzZXRXaWR0aC1zY3JvbGxEaXYuY2xpZW50V2lkdGg7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzY3JvbGxEaXYpO3JldHVybiBzY3JvbGxiYXJXaWR0aDt9O3ZhciByZW5kZXJBY3Rpb25zPWZ1bmN0aW9uIHJlbmRlckFjdGlvbnMocGFyYW1zKXt2YXIgYWN0aW9ucz1nZXRBY3Rpb25zKCk7dmFyIGNvbmZpcm1CdXR0b249Z2V0Q29uZmlybUJ1dHRvbigpO3ZhciBjYW5jZWxCdXR0b249Z2V0Q2FuY2VsQnV0dG9uKCk7aWYoIXBhcmFtcy5zaG93Q29uZmlybUJ1dHRvbiYmIXBhcmFtcy5zaG93Q2FuY2VsQnV0dG9uKXtoaWRlKGFjdGlvbnMpO31lbHNle3Nob3coYWN0aW9ucyk7fQppZihwYXJhbXMuc2hvd0NhbmNlbEJ1dHRvbil7Y2FuY2VsQnV0dG9uLnN0eWxlLmRpc3BsYXk9J2lubGluZS1ibG9jayc7fWVsc2V7aGlkZShjYW5jZWxCdXR0b24pO30KaWYocGFyYW1zLnNob3dDb25maXJtQnV0dG9uKXtjb25maXJtQnV0dG9uLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdkaXNwbGF5Jyk7fWVsc2V7aGlkZShjb25maXJtQnV0dG9uKTt9CmNvbmZpcm1CdXR0b24uaW5uZXJIVE1MPXBhcmFtcy5jb25maXJtQnV0dG9uVGV4dDtjYW5jZWxCdXR0b24uaW5uZXJIVE1MPXBhcmFtcy5jYW5jZWxCdXR0b25UZXh0O2NvbmZpcm1CdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyxwYXJhbXMuY29uZmlybUJ1dHRvbkFyaWFMYWJlbCk7Y2FuY2VsQnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcscGFyYW1zLmNhbmNlbEJ1dHRvbkFyaWFMYWJlbCk7Y29uZmlybUJ1dHRvbi5jbGFzc05hbWU9c3dhbENsYXNzZXMuY29uZmlybTthZGRDbGFzcyhjb25maXJtQnV0dG9uLHBhcmFtcy5jb25maXJtQnV0dG9uQ2xhc3MpO2NhbmNlbEJ1dHRvbi5jbGFzc05hbWU9c3dhbENsYXNzZXMuY2FuY2VsO2FkZENsYXNzKGNhbmNlbEJ1dHRvbixwYXJhbXMuY2FuY2VsQnV0dG9uQ2xhc3MpO2lmKHBhcmFtcy5idXR0b25zU3R5bGluZyl7YWRkQ2xhc3MoW2NvbmZpcm1CdXR0b24sY2FuY2VsQnV0dG9uXSxzd2FsQ2xhc3Nlcy5zdHlsZWQpO2lmKHBhcmFtcy5jb25maXJtQnV0dG9uQ29sb3Ipe2NvbmZpcm1CdXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yPXBhcmFtcy5jb25maXJtQnV0dG9uQ29sb3I7fQppZihwYXJhbXMuY2FuY2VsQnV0dG9uQ29sb3Ipe2NhbmNlbEJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9cGFyYW1zLmNhbmNlbEJ1dHRvbkNvbG9yO30KdmFyIGNvbmZpcm1CdXR0b25CYWNrZ3JvdW5kQ29sb3I9d2luZG93LmdldENvbXB1dGVkU3R5bGUoY29uZmlybUJ1dHRvbikuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpO2NvbmZpcm1CdXR0b24uc3R5bGUuYm9yZGVyTGVmdENvbG9yPWNvbmZpcm1CdXR0b25CYWNrZ3JvdW5kQ29sb3I7Y29uZmlybUJ1dHRvbi5zdHlsZS5ib3JkZXJSaWdodENvbG9yPWNvbmZpcm1CdXR0b25CYWNrZ3JvdW5kQ29sb3I7fWVsc2V7cmVtb3ZlQ2xhc3MoW2NvbmZpcm1CdXR0b24sY2FuY2VsQnV0dG9uXSxzd2FsQ2xhc3Nlcy5zdHlsZWQpO2NvbmZpcm1CdXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yPWNvbmZpcm1CdXR0b24uc3R5bGUuYm9yZGVyTGVmdENvbG9yPWNvbmZpcm1CdXR0b24uc3R5bGUuYm9yZGVyUmlnaHRDb2xvcj0nJztjYW5jZWxCdXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yPWNhbmNlbEJ1dHRvbi5zdHlsZS5ib3JkZXJMZWZ0Q29sb3I9Y2FuY2VsQnV0dG9uLnN0eWxlLmJvcmRlclJpZ2h0Q29sb3I9Jyc7fX07dmFyIHJlbmRlckNvbnRlbnQ9ZnVuY3Rpb24gcmVuZGVyQ29udGVudChwYXJhbXMpe3ZhciBjb250ZW50PWdldENvbnRlbnQoKS5xdWVyeVNlbGVjdG9yKCcjJytzd2FsQ2xhc3Nlcy5jb250ZW50KTtpZihwYXJhbXMuaHRtbCl7cGFyc2VIdG1sVG9Db250YWluZXIocGFyYW1zLmh0bWwsY29udGVudCk7fWVsc2UgaWYocGFyYW1zLnRleHQpe2NvbnRlbnQudGV4dENvbnRlbnQ9cGFyYW1zLnRleHQ7c2hvdyhjb250ZW50KTt9ZWxzZXtoaWRlKGNvbnRlbnQpO319O3ZhciByZW5kZXJJY29uPWZ1bmN0aW9uIHJlbmRlckljb24ocGFyYW1zKXt2YXIgaWNvbnM9Z2V0SWNvbnMoKTtmb3IodmFyIGk9MDtpPGljb25zLmxlbmd0aDtpKyspe2hpZGUoaWNvbnNbaV0pO30KaWYocGFyYW1zLnR5cGUpe2lmKE9iamVjdC5rZXlzKGljb25UeXBlcykuaW5kZXhPZihwYXJhbXMudHlwZSkhPT0tMSl7dmFyIGljb249U3dhbC5nZXRQb3B1cCgpLnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChzd2FsQ2xhc3Nlcy5pY29uLCIuIikuY29uY2F0KGljb25UeXBlc1twYXJhbXMudHlwZV0pKTtzaG93KGljb24pO2lmKHBhcmFtcy5hbmltYXRpb24pe2FkZENsYXNzKGljb24sInN3YWwyLWFuaW1hdGUtIi5jb25jYXQocGFyYW1zLnR5cGUsIi1pY29uIikpO319ZWxzZXtlcnJvcigiVW5rbm93biB0eXBlISBFeHBlY3RlZCBcInN1Y2Nlc3NcIiwgXCJlcnJvclwiLCBcIndhcm5pbmdcIiwgXCJpbmZvXCIgb3IgXCJxdWVzdGlvblwiLCBnb3QgXCIiLmNvbmNhdChwYXJhbXMudHlwZSwiXCIiKSk7fX19O3ZhciByZW5kZXJJbWFnZT1mdW5jdGlvbiByZW5kZXJJbWFnZShwYXJhbXMpe3ZhciBpbWFnZT1nZXRJbWFnZSgpO2lmKHBhcmFtcy5pbWFnZVVybCl7aW1hZ2Uuc2V0QXR0cmlidXRlKCdzcmMnLHBhcmFtcy5pbWFnZVVybCk7aW1hZ2Uuc2V0QXR0cmlidXRlKCdhbHQnLHBhcmFtcy5pbWFnZUFsdCk7c2hvdyhpbWFnZSk7aWYocGFyYW1zLmltYWdlV2lkdGgpe2ltYWdlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLHBhcmFtcy5pbWFnZVdpZHRoKTt9ZWxzZXtpbWFnZS5yZW1vdmVBdHRyaWJ1dGUoJ3dpZHRoJyk7fQppZihwYXJhbXMuaW1hZ2VIZWlnaHQpe2ltYWdlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JyxwYXJhbXMuaW1hZ2VIZWlnaHQpO31lbHNle2ltYWdlLnJlbW92ZUF0dHJpYnV0ZSgnaGVpZ2h0Jyk7fQppbWFnZS5jbGFzc05hbWU9c3dhbENsYXNzZXMuaW1hZ2U7aWYocGFyYW1zLmltYWdlQ2xhc3Mpe2FkZENsYXNzKGltYWdlLHBhcmFtcy5pbWFnZUNsYXNzKTt9fWVsc2V7aGlkZShpbWFnZSk7fX07dmFyIHJlbmRlclByb2dyZXNzU3RlcHM9ZnVuY3Rpb24gcmVuZGVyUHJvZ3Jlc3NTdGVwcyhwYXJhbXMpe3ZhciBwcm9ncmVzc1N0ZXBzQ29udGFpbmVyPWdldFByb2dyZXNzU3RlcHMoKTt2YXIgY3VycmVudFByb2dyZXNzU3RlcD1wYXJzZUludChwYXJhbXMuY3VycmVudFByb2dyZXNzU3RlcD09PW51bGw/U3dhbC5nZXRRdWV1ZVN0ZXAoKTpwYXJhbXMuY3VycmVudFByb2dyZXNzU3RlcCwxMCk7aWYocGFyYW1zLnByb2dyZXNzU3RlcHMmJnBhcmFtcy5wcm9ncmVzc1N0ZXBzLmxlbmd0aCl7c2hvdyhwcm9ncmVzc1N0ZXBzQ29udGFpbmVyKTtwcm9ncmVzc1N0ZXBzQ29udGFpbmVyLmlubmVySFRNTD0nJztpZihjdXJyZW50UHJvZ3Jlc3NTdGVwPj1wYXJhbXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGgpe3dhcm4oJ0ludmFsaWQgY3VycmVudFByb2dyZXNzU3RlcCBwYXJhbWV0ZXIsIGl0IHNob3VsZCBiZSBsZXNzIHRoYW4gcHJvZ3Jlc3NTdGVwcy5sZW5ndGggJysnKGN1cnJlbnRQcm9ncmVzc1N0ZXAgbGlrZSBKUyBhcnJheXMgc3RhcnRzIGZyb20gMCknKTt9CnBhcmFtcy5wcm9ncmVzc1N0ZXBzLmZvckVhY2goZnVuY3Rpb24oc3RlcCxpbmRleCl7dmFyIGNpcmNsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO2FkZENsYXNzKGNpcmNsZSxzd2FsQ2xhc3Nlcy5wcm9ncmVzc2NpcmNsZSk7Y2lyY2xlLmlubmVySFRNTD1zdGVwO2lmKGluZGV4PT09Y3VycmVudFByb2dyZXNzU3RlcCl7YWRkQ2xhc3MoY2lyY2xlLHN3YWxDbGFzc2VzLmFjdGl2ZXByb2dyZXNzc3RlcCk7fQpwcm9ncmVzc1N0ZXBzQ29udGFpbmVyLmFwcGVuZENoaWxkKGNpcmNsZSk7aWYoaW5kZXghPT1wYXJhbXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGgtMSl7dmFyIGxpbmU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTthZGRDbGFzcyhsaW5lLHN3YWxDbGFzc2VzLnByb2dyZXNzbGluZSk7aWYocGFyYW1zLnByb2dyZXNzU3RlcHNEaXN0YW5jZSl7bGluZS5zdHlsZS53aWR0aD1wYXJhbXMucHJvZ3Jlc3NTdGVwc0Rpc3RhbmNlO30KcHJvZ3Jlc3NTdGVwc0NvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5lKTt9fSk7fWVsc2V7aGlkZShwcm9ncmVzc1N0ZXBzQ29udGFpbmVyKTt9fTt2YXIgcmVuZGVyVGl0bGU9ZnVuY3Rpb24gcmVuZGVyVGl0bGUocGFyYW1zKXt2YXIgdGl0bGU9Z2V0VGl0bGUoKTtpZihwYXJhbXMudGl0bGVUZXh0KXt0aXRsZS5pbm5lclRleHQ9cGFyYW1zLnRpdGxlVGV4dDt9ZWxzZSBpZihwYXJhbXMudGl0bGUpe2lmKHR5cGVvZiBwYXJhbXMudGl0bGU9PT0nc3RyaW5nJyl7cGFyYW1zLnRpdGxlPXBhcmFtcy50aXRsZS5zcGxpdCgnXG4nKS5qb2luKCc8YnIgLz4nKTt9CnBhcnNlSHRtbFRvQ29udGFpbmVyKHBhcmFtcy50aXRsZSx0aXRsZSk7fX07dmFyIGZpeFNjcm9sbGJhcj1mdW5jdGlvbiBmaXhTY3JvbGxiYXIoKXtpZihzdGF0ZXMucHJldmlvdXNCb2R5UGFkZGluZyE9PW51bGwpe3JldHVybjt9CmlmKGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0PndpbmRvdy5pbm5lckhlaWdodCl7c3RhdGVzLnByZXZpb3VzQm9keVBhZGRpbmc9cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy1yaWdodCcpKTtkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1zdGF0ZXMucHJldmlvdXNCb2R5UGFkZGluZyttZWFzdXJlU2Nyb2xsYmFyKCkrJ3B4Jzt9fTt2YXIgdW5kb1Njcm9sbGJhcj1mdW5jdGlvbiB1bmRvU2Nyb2xsYmFyKCl7aWYoc3RhdGVzLnByZXZpb3VzQm9keVBhZGRpbmchPT1udWxsKXtkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1zdGF0ZXMucHJldmlvdXNCb2R5UGFkZGluZztzdGF0ZXMucHJldmlvdXNCb2R5UGFkZGluZz1udWxsO319O3ZhciBpT1NmaXg9ZnVuY3Rpb24gaU9TZml4KCl7dmFyIGlPUz0vaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXdpbmRvdy5NU1N0cmVhbTtpZihpT1MmJiFoYXNDbGFzcyhkb2N1bWVudC5ib2R5LHN3YWxDbGFzc2VzLmlvc2ZpeCkpe3ZhciBvZmZzZXQ9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7ZG9jdW1lbnQuYm9keS5zdHlsZS50b3A9b2Zmc2V0Ki0xKydweCc7YWRkQ2xhc3MoZG9jdW1lbnQuYm9keSxzd2FsQ2xhc3Nlcy5pb3NmaXgpO319O3ZhciB1bmRvSU9TZml4PWZ1bmN0aW9uIHVuZG9JT1NmaXgoKXtpZihoYXNDbGFzcyhkb2N1bWVudC5ib2R5LHN3YWxDbGFzc2VzLmlvc2ZpeCkpe3ZhciBvZmZzZXQ9cGFyc2VJbnQoZG9jdW1lbnQuYm9keS5zdHlsZS50b3AsMTApO3JlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksc3dhbENsYXNzZXMuaW9zZml4KTtkb2N1bWVudC5ib2R5LnN0eWxlLnRvcD0nJztkb2N1bWVudC5ib2R5LnNjcm9sbFRvcD1vZmZzZXQqLTE7fX07dmFyIHNldEFyaWFIaWRkZW49ZnVuY3Rpb24gc2V0QXJpYUhpZGRlbigpe3ZhciBib2R5Q2hpbGRyZW49dG9BcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtib2R5Q2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlbCl7aWYoZWw9PT1nZXRDb250YWluZXIoKXx8ZWwuY29udGFpbnMoZ2V0Q29udGFpbmVyKCkpKXtyZXR1cm47fQppZihlbC5oYXNBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJykpe2VsLnNldEF0dHJpYnV0ZSgnZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbicsZWwuZ2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicpKTt9CmVsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCd0cnVlJyk7fSk7fTt2YXIgdW5zZXRBcmlhSGlkZGVuPWZ1bmN0aW9uIHVuc2V0QXJpYUhpZGRlbigpe3ZhciBib2R5Q2hpbGRyZW49dG9BcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtib2R5Q2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihlbCl7aWYoZWwuaGFzQXR0cmlidXRlKCdkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuJykpe2VsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbicpKTtlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtcHJldmlvdXMtYXJpYS1oaWRkZW4nKTt9ZWxzZXtlbC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7fX0pO307dmFyIFJFU1RPUkVfRk9DVVNfVElNRU9VVD0xMDA7dmFyIGdsb2JhbFN0YXRlPXt9O3ZhciByZXN0b3JlQWN0aXZlRWxlbWVudD1mdW5jdGlvbiByZXN0b3JlQWN0aXZlRWxlbWVudCgpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKXt2YXIgeD13aW5kb3cuc2Nyb2xsWDt2YXIgeT13aW5kb3cuc2Nyb2xsWTtnbG9iYWxTdGF0ZS5yZXN0b3JlRm9jdXNUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihnbG9iYWxTdGF0ZS5wcmV2aW91c0FjdGl2ZUVsZW1lbnQmJmdsb2JhbFN0YXRlLnByZXZpb3VzQWN0aXZlRWxlbWVudC5mb2N1cyl7Z2xvYmFsU3RhdGUucHJldmlvdXNBY3RpdmVFbGVtZW50LmZvY3VzKCk7Z2xvYmFsU3RhdGUucHJldmlvdXNBY3RpdmVFbGVtZW50PW51bGw7fWVsc2UgaWYoZG9jdW1lbnQuYm9keSl7ZG9jdW1lbnQuYm9keS5mb2N1cygpO30KcmVzb2x2ZSgpO30sUkVTVE9SRV9GT0NVU19USU1FT1VUKTtpZih0eXBlb2YgeCE9PSd1bmRlZmluZWQnJiZ0eXBlb2YgeSE9PSd1bmRlZmluZWQnKXt3aW5kb3cuc2Nyb2xsVG8oeCx5KTt9fSk7fTt2YXIgY2xvc2U9ZnVuY3Rpb24gY2xvc2Uob25DbG9zZSxvbkFmdGVyQ2xvc2Upe3ZhciBjb250YWluZXI9Z2V0Q29udGFpbmVyKCk7dmFyIHBvcHVwPWdldFBvcHVwKCk7aWYoIXBvcHVwKXtyZXR1cm47fQppZihvbkNsb3NlIT09bnVsbCYmdHlwZW9mIG9uQ2xvc2U9PT0nZnVuY3Rpb24nKXtvbkNsb3NlKHBvcHVwKTt9CnJlbW92ZUNsYXNzKHBvcHVwLHN3YWxDbGFzc2VzLnNob3cpO2FkZENsYXNzKHBvcHVwLHN3YWxDbGFzc2VzLmhpZGUpO3ZhciByZW1vdmVQb3B1cEFuZFJlc2V0U3RhdGU9ZnVuY3Rpb24gcmVtb3ZlUG9wdXBBbmRSZXNldFN0YXRlKCl7aWYoIWlzVG9hc3QoKSl7cmVzdG9yZUFjdGl2ZUVsZW1lbnQoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIHRyaWdnZXJPbkFmdGVyQ2xvc2Uob25BZnRlckNsb3NlKTt9KTtnbG9iYWxTdGF0ZS5rZXlkb3duVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyLHtjYXB0dXJlOmdsb2JhbFN0YXRlLmtleWRvd25MaXN0ZW5lckNhcHR1cmV9KTtnbG9iYWxTdGF0ZS5rZXlkb3duSGFuZGxlckFkZGVkPWZhbHNlO31lbHNle3RyaWdnZXJPbkFmdGVyQ2xvc2Uob25BZnRlckNsb3NlKTt9CmlmKGNvbnRhaW5lci5wYXJlbnROb2RlKXtjb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjb250YWluZXIpO30KcmVtb3ZlQ2xhc3MoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxbc3dhbENsYXNzZXMuc2hvd24sc3dhbENsYXNzZXNbJ2hlaWdodC1hdXRvJ10sc3dhbENsYXNzZXNbJ25vLWJhY2tkcm9wJ10sc3dhbENsYXNzZXNbJ3RvYXN0LXNob3duJ10sc3dhbENsYXNzZXNbJ3RvYXN0LWNvbHVtbiddXSk7aWYoaXNNb2RhbCgpKXt1bmRvU2Nyb2xsYmFyKCk7dW5kb0lPU2ZpeCgpO3Vuc2V0QXJpYUhpZGRlbigpO319O2lmKGFuaW1hdGlvbkVuZEV2ZW50JiYhaGFzQ2xhc3MocG9wdXAsc3dhbENsYXNzZXMubm9hbmltYXRpb24pKXtwb3B1cC5hZGRFdmVudExpc3RlbmVyKGFuaW1hdGlvbkVuZEV2ZW50LGZ1bmN0aW9uIHN3YWxDbG9zZUV2ZW50RmluaXNoZWQoKXtwb3B1cC5yZW1vdmVFdmVudExpc3RlbmVyKGFuaW1hdGlvbkVuZEV2ZW50LHN3YWxDbG9zZUV2ZW50RmluaXNoZWQpO2lmKGhhc0NsYXNzKHBvcHVwLHN3YWxDbGFzc2VzLmhpZGUpKXtyZW1vdmVQb3B1cEFuZFJlc2V0U3RhdGUoKTt9fSk7fWVsc2V7cmVtb3ZlUG9wdXBBbmRSZXNldFN0YXRlKCk7fX07dmFyIHRyaWdnZXJPbkFmdGVyQ2xvc2U9ZnVuY3Rpb24gdHJpZ2dlck9uQWZ0ZXJDbG9zZShvbkFmdGVyQ2xvc2Upe2lmKG9uQWZ0ZXJDbG9zZSE9PW51bGwmJnR5cGVvZiBvbkFmdGVyQ2xvc2U9PT0nZnVuY3Rpb24nKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7b25BZnRlckNsb3NlKCk7fSk7fX07dmFyIGlzVmlzaWJsZSQxPWZ1bmN0aW9uIGlzVmlzaWJsZSgpe3JldHVybiEhZ2V0UG9wdXAoKTt9O3ZhciBjbGlja0NvbmZpcm09ZnVuY3Rpb24gY2xpY2tDb25maXJtKCl7cmV0dXJuIGdldENvbmZpcm1CdXR0b24oKS5jbGljaygpO307dmFyIGNsaWNrQ2FuY2VsPWZ1bmN0aW9uIGNsaWNrQ2FuY2VsKCl7cmV0dXJuIGdldENhbmNlbEJ1dHRvbigpLmNsaWNrKCk7fTtmdW5jdGlvbiBmaXJlKCl7dmFyIFN3YWw9dGhpcztmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPW5ldyBBcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKyl7YXJnc1tfa2V5XT1hcmd1bWVudHNbX2tleV07fQpyZXR1cm4gX2NvbnN0cnVjdChTd2FsLGFyZ3MpO30KZnVuY3Rpb24gd2l0aE5vTmV3S2V5d29yZChQYXJlbnRTd2FsKXt2YXIgTm9OZXdLZXl3b3JkU3dhbD1mdW5jdGlvbiBOb05ld0tleXdvcmRTd2FsKCl7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1uZXcgQXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO30KaWYoISh0aGlzIGluc3RhbmNlb2YgTm9OZXdLZXl3b3JkU3dhbCkpe3JldHVybiBfY29uc3RydWN0KE5vTmV3S2V5d29yZFN3YWwsYXJncyk7fQpPYmplY3QuZ2V0UHJvdG90eXBlT2YoTm9OZXdLZXl3b3JkU3dhbCkuYXBwbHkodGhpcyxhcmdzKTt9O05vTmV3S2V5d29yZFN3YWwucHJvdG90eXBlPV9leHRlbmRzKE9iamVjdC5jcmVhdGUoUGFyZW50U3dhbC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpOb05ld0tleXdvcmRTd2FsfSk7aWYodHlwZW9mIE9iamVjdC5zZXRQcm90b3R5cGVPZj09PSdmdW5jdGlvbicpe09iamVjdC5zZXRQcm90b3R5cGVPZihOb05ld0tleXdvcmRTd2FsLFBhcmVudFN3YWwpO31lbHNle05vTmV3S2V5d29yZFN3YWwuX19wcm90b19fPVBhcmVudFN3YWw7fQpyZXR1cm4gTm9OZXdLZXl3b3JkU3dhbDt9CnZhciBkZWZhdWx0UGFyYW1zPXt0aXRsZTonJyx0aXRsZVRleHQ6JycsdGV4dDonJyxodG1sOicnLGZvb3RlcjonJyx0eXBlOm51bGwsdG9hc3Q6ZmFsc2UsY3VzdG9tQ2xhc3M6JycsdGFyZ2V0Oidib2R5JyxiYWNrZHJvcDp0cnVlLGFuaW1hdGlvbjp0cnVlLGhlaWdodEF1dG86dHJ1ZSxhbGxvd091dHNpZGVDbGljazp0cnVlLGFsbG93RXNjYXBlS2V5OnRydWUsYWxsb3dFbnRlcktleTp0cnVlLHN0b3BLZXlkb3duUHJvcGFnYXRpb246dHJ1ZSxrZXlkb3duTGlzdGVuZXJDYXB0dXJlOmZhbHNlLHNob3dDb25maXJtQnV0dG9uOnRydWUsc2hvd0NhbmNlbEJ1dHRvbjpmYWxzZSxwcmVDb25maXJtOm51bGwsY29uZmlybUJ1dHRvblRleHQ6J09LJyxjb25maXJtQnV0dG9uQXJpYUxhYmVsOicnLGNvbmZpcm1CdXR0b25Db2xvcjpudWxsLGNvbmZpcm1CdXR0b25DbGFzczpudWxsLGNhbmNlbEJ1dHRvblRleHQ6J0NhbmNlbCcsY2FuY2VsQnV0dG9uQXJpYUxhYmVsOicnLGNhbmNlbEJ1dHRvbkNvbG9yOm51bGwsY2FuY2VsQnV0dG9uQ2xhc3M6bnVsbCxidXR0b25zU3R5bGluZzp0cnVlLHJldmVyc2VCdXR0b25zOmZhbHNlLGZvY3VzQ29uZmlybTp0cnVlLGZvY3VzQ2FuY2VsOmZhbHNlLHNob3dDbG9zZUJ1dHRvbjpmYWxzZSxjbG9zZUJ1dHRvbkFyaWFMYWJlbDonQ2xvc2UgdGhpcyBkaWFsb2cnLHNob3dMb2FkZXJPbkNvbmZpcm06ZmFsc2UsaW1hZ2VVcmw6bnVsbCxpbWFnZVdpZHRoOm51bGwsaW1hZ2VIZWlnaHQ6bnVsbCxpbWFnZUFsdDonJyxpbWFnZUNsYXNzOm51bGwsdGltZXI6bnVsbCx3aWR0aDpudWxsLHBhZGRpbmc6bnVsbCxiYWNrZ3JvdW5kOm51bGwsaW5wdXQ6bnVsbCxpbnB1dFBsYWNlaG9sZGVyOicnLGlucHV0VmFsdWU6JycsaW5wdXRPcHRpb25zOnt9LGlucHV0QXV0b1RyaW06dHJ1ZSxpbnB1dENsYXNzOm51bGwsaW5wdXRBdHRyaWJ1dGVzOnt9LGlucHV0VmFsaWRhdG9yOm51bGwsdmFsaWRhdGlvbk1lc3NhZ2U6bnVsbCxncm93OmZhbHNlLHBvc2l0aW9uOidjZW50ZXInLHByb2dyZXNzU3RlcHM6W10sY3VycmVudFByb2dyZXNzU3RlcDpudWxsLHByb2dyZXNzU3RlcHNEaXN0YW5jZTpudWxsLG9uQmVmb3JlT3BlbjpudWxsLG9uQWZ0ZXJDbG9zZTpudWxsLG9uT3BlbjpudWxsLG9uQ2xvc2U6bnVsbCx1c2VSZWplY3Rpb25zOmZhbHNlLGV4cGVjdFJlamVjdGlvbnM6ZmFsc2V9O3ZhciBkZXByZWNhdGVkUGFyYW1zPVsndXNlUmVqZWN0aW9ucycsJ2V4cGVjdFJlamVjdGlvbnMnLCdleHRyYVBhcmFtcyddO3ZhciB0b2FzdEluY29tcGF0aWJsZVBhcmFtcz1bJ2FsbG93T3V0c2lkZUNsaWNrJywnYWxsb3dFbnRlcktleScsJ2JhY2tkcm9wJywnZm9jdXNDb25maXJtJywnZm9jdXNDYW5jZWwnLCdoZWlnaHRBdXRvJywna2V5ZG93bkxpc3RlbmVyQ2FwdHVyZSddO3ZhciBpc1ZhbGlkUGFyYW1ldGVyPWZ1bmN0aW9uIGlzVmFsaWRQYXJhbWV0ZXIocGFyYW1OYW1lKXtyZXR1cm4gZGVmYXVsdFBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbU5hbWUpfHxwYXJhbU5hbWU9PT0nZXh0cmFQYXJhbXMnO307dmFyIGlzRGVwcmVjYXRlZFBhcmFtZXRlcj1mdW5jdGlvbiBpc0RlcHJlY2F0ZWRQYXJhbWV0ZXIocGFyYW1OYW1lKXtyZXR1cm4gZGVwcmVjYXRlZFBhcmFtcy5pbmRleE9mKHBhcmFtTmFtZSkhPT0tMTt9O3ZhciBzaG93V2FybmluZ3NGb3JQYXJhbXM9ZnVuY3Rpb24gc2hvd1dhcm5pbmdzRm9yUGFyYW1zKHBhcmFtcyl7Zm9yKHZhciBwYXJhbSBpbiBwYXJhbXMpe2lmKCFpc1ZhbGlkUGFyYW1ldGVyKHBhcmFtKSl7d2FybigiVW5rbm93biBwYXJhbWV0ZXIgXCIiLmNvbmNhdChwYXJhbSwiXCIiKSk7fQppZihwYXJhbXMudG9hc3QmJnRvYXN0SW5jb21wYXRpYmxlUGFyYW1zLmluZGV4T2YocGFyYW0pIT09LTEpe3dhcm4oIlRoZSBwYXJhbWV0ZXIgXCIiLmNvbmNhdChwYXJhbSwiXCIgaXMgaW5jb21wYXRpYmxlIHdpdGggdG9hc3RzIikpO30KaWYoaXNEZXByZWNhdGVkUGFyYW1ldGVyKHBhcmFtKSl7d2Fybk9uY2UoIlRoZSBwYXJhbWV0ZXIgXCIiLmNvbmNhdChwYXJhbSwiXCIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuIikpO319fTt2YXIgZGVwcmVjYXRpb25XYXJuaW5nPSJcInNldERlZmF1bHRzXCIgJiBcInJlc2V0RGVmYXVsdHNcIiBtZXRob2RzIGFyZSBkZXByZWNhdGVkIGluIGZhdm9yIG9mIFwibWl4aW5cIiBtZXRob2QgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLiBGb3IgbmV3IHByb2plY3RzLCB1c2UgXCJtaXhpblwiLiBGb3IgcGFzdCBwcm9qZWN0cyBhbHJlYWR5IHVzaW5nIFwic2V0RGVmYXVsdHNcIiwgc3VwcG9ydCB3aWxsIGJlIHByb3ZpZGVkIHRocm91Z2ggYW4gYWRkaXRpb25hbCBwYWNrYWdlLiI7dmFyIGRlZmF1bHRzPXt9O2Z1bmN0aW9uIHdpdGhHbG9iYWxEZWZhdWx0cyhQYXJlbnRTd2FsKXt2YXIgU3dhbFdpdGhHbG9iYWxEZWZhdWx0cz1mdW5jdGlvbihfUGFyZW50U3dhbCl7X2luaGVyaXRzKFN3YWxXaXRoR2xvYmFsRGVmYXVsdHMsX1BhcmVudFN3YWwpO2Z1bmN0aW9uIFN3YWxXaXRoR2xvYmFsRGVmYXVsdHMoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxTd2FsV2l0aEdsb2JhbERlZmF1bHRzKTtyZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcyxfZ2V0UHJvdG90eXBlT2YoU3dhbFdpdGhHbG9iYWxEZWZhdWx0cykuYXBwbHkodGhpcyxhcmd1bWVudHMpKTt9Cl9jcmVhdGVDbGFzcyhTd2FsV2l0aEdsb2JhbERlZmF1bHRzLFt7a2V5OiJfbWFpbiIsdmFsdWU6ZnVuY3Rpb24gX21haW4ocGFyYW1zKXtyZXR1cm4gX2dldChfZ2V0UHJvdG90eXBlT2YoU3dhbFdpdGhHbG9iYWxEZWZhdWx0cy5wcm90b3R5cGUpLCJfbWFpbiIsdGhpcykuY2FsbCh0aGlzLF9leHRlbmRzKHt9LGRlZmF1bHRzLHBhcmFtcykpO319XSxbe2tleToic2V0RGVmYXVsdHMiLHZhbHVlOmZ1bmN0aW9uIHNldERlZmF1bHRzKHBhcmFtcyl7d2Fybk9uY2UoZGVwcmVjYXRpb25XYXJuaW5nKTtpZighcGFyYW1zfHxfdHlwZW9mKHBhcmFtcykhPT0nb2JqZWN0Jyl7dGhyb3cgbmV3IFR5cGVFcnJvcignU3dlZXRBbGVydDI6IFRoZSBhcmd1bWVudCBmb3Igc2V0RGVmYXVsdHMoKSBpcyByZXF1aXJlZCBhbmQgaGFzIHRvIGJlIGEgb2JqZWN0Jyk7fQpzaG93V2FybmluZ3NGb3JQYXJhbXMocGFyYW1zKTtPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goZnVuY3Rpb24ocGFyYW0pe2lmKFBhcmVudFN3YWwuaXNWYWxpZFBhcmFtZXRlcihwYXJhbSkpe2RlZmF1bHRzW3BhcmFtXT1wYXJhbXNbcGFyYW1dO319KTt9fSx7a2V5OiJyZXNldERlZmF1bHRzIix2YWx1ZTpmdW5jdGlvbiByZXNldERlZmF1bHRzKCl7d2Fybk9uY2UoZGVwcmVjYXRpb25XYXJuaW5nKTtkZWZhdWx0cz17fTt9fV0pO3JldHVybiBTd2FsV2l0aEdsb2JhbERlZmF1bHRzO30oUGFyZW50U3dhbCk7aWYodHlwZW9mIHdpbmRvdyE9PSd1bmRlZmluZWQnJiZfdHlwZW9mKHdpbmRvdy5fc3dhbERlZmF1bHRzKT09PSdvYmplY3QnKXtTd2FsV2l0aEdsb2JhbERlZmF1bHRzLnNldERlZmF1bHRzKHdpbmRvdy5fc3dhbERlZmF1bHRzKTt9CnJldHVybiBTd2FsV2l0aEdsb2JhbERlZmF1bHRzO30KZnVuY3Rpb24gbWl4aW4obWl4aW5QYXJhbXMpe3JldHVybiB3aXRoTm9OZXdLZXl3b3JkKGZ1bmN0aW9uKF90aGlzKXtfaW5oZXJpdHMoTWl4aW5Td2FsLF90aGlzKTtmdW5jdGlvbiBNaXhpblN3YWwoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxNaXhpblN3YWwpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLF9nZXRQcm90b3R5cGVPZihNaXhpblN3YWwpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7fQpfY3JlYXRlQ2xhc3MoTWl4aW5Td2FsLFt7a2V5OiJfbWFpbiIsdmFsdWU6ZnVuY3Rpb24gX21haW4ocGFyYW1zKXtyZXR1cm4gX2dldChfZ2V0UHJvdG90eXBlT2YoTWl4aW5Td2FsLnByb3RvdHlwZSksIl9tYWluIix0aGlzKS5jYWxsKHRoaXMsX2V4dGVuZHMoe30sbWl4aW5QYXJhbXMscGFyYW1zKSk7fX1dKTtyZXR1cm4gTWl4aW5Td2FsO30odGhpcykpO30KdmFyIGN1cnJlbnRTdGVwcz1bXTt2YXIgcXVldWU9ZnVuY3Rpb24gcXVldWUoc3RlcHMpe3ZhciBzd2FsPXRoaXM7Y3VycmVudFN0ZXBzPXN0ZXBzO3ZhciByZXNldFF1ZXVlPWZ1bmN0aW9uIHJlc2V0UXVldWUoKXtjdXJyZW50U3RlcHM9W107ZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtc3dhbDItcXVldWUtc3RlcCcpO307dmFyIHF1ZXVlUmVzdWx0PVtdO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKXsoZnVuY3Rpb24gc3RlcChpLGNhbGxiYWNrKXtpZihpPGN1cnJlbnRTdGVwcy5sZW5ndGgpe2RvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKCdkYXRhLXN3YWwyLXF1ZXVlLXN0ZXAnLGkpO3N3YWwoY3VycmVudFN0ZXBzW2ldKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCl7aWYodHlwZW9mIHJlc3VsdC52YWx1ZSE9PSd1bmRlZmluZWQnKXtxdWV1ZVJlc3VsdC5wdXNoKHJlc3VsdC52YWx1ZSk7c3RlcChpKzEsY2FsbGJhY2spO31lbHNle3Jlc2V0UXVldWUoKTtyZXNvbHZlKHtkaXNtaXNzOnJlc3VsdC5kaXNtaXNzfSk7fX0pO31lbHNle3Jlc2V0UXVldWUoKTtyZXNvbHZlKHt2YWx1ZTpxdWV1ZVJlc3VsdH0pO319KSgwKTt9KTt9O3ZhciBnZXRRdWV1ZVN0ZXA9ZnVuY3Rpb24gZ2V0UXVldWVTdGVwKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLXN3YWwyLXF1ZXVlLXN0ZXAnKTt9O3ZhciBpbnNlcnRRdWV1ZVN0ZXA9ZnVuY3Rpb24gaW5zZXJ0UXVldWVTdGVwKHN0ZXAsaW5kZXgpe2lmKGluZGV4JiZpbmRleDxjdXJyZW50U3RlcHMubGVuZ3RoKXtyZXR1cm4gY3VycmVudFN0ZXBzLnNwbGljZShpbmRleCwwLHN0ZXApO30KcmV0dXJuIGN1cnJlbnRTdGVwcy5wdXNoKHN0ZXApO307dmFyIGRlbGV0ZVF1ZXVlU3RlcD1mdW5jdGlvbiBkZWxldGVRdWV1ZVN0ZXAoaW5kZXgpe2lmKHR5cGVvZiBjdXJyZW50U3RlcHNbaW5kZXhdIT09J3VuZGVmaW5lZCcpe2N1cnJlbnRTdGVwcy5zcGxpY2UoaW5kZXgsMSk7fX07dmFyIHNob3dMb2FkaW5nPWZ1bmN0aW9uIHNob3dMb2FkaW5nKCl7dmFyIHBvcHVwPWdldFBvcHVwKCk7aWYoIXBvcHVwKXtTd2FsKCcnKTt9CnBvcHVwPWdldFBvcHVwKCk7dmFyIGFjdGlvbnM9Z2V0QWN0aW9ucygpO3ZhciBjb25maXJtQnV0dG9uPWdldENvbmZpcm1CdXR0b24oKTt2YXIgY2FuY2VsQnV0dG9uPWdldENhbmNlbEJ1dHRvbigpO3Nob3coYWN0aW9ucyk7c2hvdyhjb25maXJtQnV0dG9uKTthZGRDbGFzcyhbcG9wdXAsYWN0aW9uc10sc3dhbENsYXNzZXMubG9hZGluZyk7Y29uZmlybUJ1dHRvbi5kaXNhYmxlZD10cnVlO2NhbmNlbEJ1dHRvbi5kaXNhYmxlZD10cnVlO3BvcHVwLnNldEF0dHJpYnV0ZSgnZGF0YS1sb2FkaW5nJyx0cnVlKTtwb3B1cC5zZXRBdHRyaWJ1dGUoJ2FyaWEtYnVzeScsdHJ1ZSk7cG9wdXAuZm9jdXMoKTt9O3ZhciBnZXRUaW1lckxlZnQ9ZnVuY3Rpb24gZ2V0VGltZXJMZWZ0KCl7cmV0dXJuIGdsb2JhbFN0YXRlLnRpbWVvdXQmJmdsb2JhbFN0YXRlLnRpbWVvdXQuZ2V0VGltZXJMZWZ0KCk7fTt2YXIgc3RhdGljTWV0aG9kcz1PYmplY3QuZnJlZXplKHtpc1ZhbGlkUGFyYW1ldGVyOmlzVmFsaWRQYXJhbWV0ZXIsaXNEZXByZWNhdGVkUGFyYW1ldGVyOmlzRGVwcmVjYXRlZFBhcmFtZXRlcixhcmdzVG9QYXJhbXM6YXJnc1RvUGFyYW1zLGFkYXB0SW5wdXRWYWxpZGF0b3I6YWRhcHRJbnB1dFZhbGlkYXRvcixjbG9zZTpjbG9zZSxjbG9zZVBvcHVwOmNsb3NlLGNsb3NlTW9kYWw6Y2xvc2UsY2xvc2VUb2FzdDpjbG9zZSxpc1Zpc2libGU6aXNWaXNpYmxlJDEsY2xpY2tDb25maXJtOmNsaWNrQ29uZmlybSxjbGlja0NhbmNlbDpjbGlja0NhbmNlbCxnZXRDb250YWluZXI6Z2V0Q29udGFpbmVyLGdldFBvcHVwOmdldFBvcHVwLGdldFRpdGxlOmdldFRpdGxlLGdldENvbnRlbnQ6Z2V0Q29udGVudCxnZXRJbWFnZTpnZXRJbWFnZSxnZXRJY29uczpnZXRJY29ucyxnZXRDbG9zZUJ1dHRvbjpnZXRDbG9zZUJ1dHRvbixnZXRCdXR0b25zV3JhcHBlcjpnZXRCdXR0b25zV3JhcHBlcixnZXRBY3Rpb25zOmdldEFjdGlvbnMsZ2V0Q29uZmlybUJ1dHRvbjpnZXRDb25maXJtQnV0dG9uLGdldENhbmNlbEJ1dHRvbjpnZXRDYW5jZWxCdXR0b24sZ2V0Rm9vdGVyOmdldEZvb3RlcixnZXRGb2N1c2FibGVFbGVtZW50czpnZXRGb2N1c2FibGVFbGVtZW50cyxnZXRWYWxpZGF0aW9uTWVzc2FnZTpnZXRWYWxpZGF0aW9uTWVzc2FnZSxpc0xvYWRpbmc6aXNMb2FkaW5nLGZpcmU6ZmlyZSxtaXhpbjptaXhpbixxdWV1ZTpxdWV1ZSxnZXRRdWV1ZVN0ZXA6Z2V0UXVldWVTdGVwLGluc2VydFF1ZXVlU3RlcDppbnNlcnRRdWV1ZVN0ZXAsZGVsZXRlUXVldWVTdGVwOmRlbGV0ZVF1ZXVlU3RlcCxzaG93TG9hZGluZzpzaG93TG9hZGluZyxlbmFibGVMb2FkaW5nOnNob3dMb2FkaW5nLGdldFRpbWVyTGVmdDpnZXRUaW1lckxlZnR9KTt2YXIgX1N5bWJvbD10eXBlb2YgU3ltYm9sPT09J2Z1bmN0aW9uJz9TeW1ib2w6ZnVuY3Rpb24oKXt2YXIgaWRDb3VudGVyPTA7ZnVuY3Rpb24gX1N5bWJvbChrZXkpe3JldHVybiAnX18nK2tleSsnXycrTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjFlOSkrJ18nKyArK2lkQ291bnRlcisnX18nO30KX1N5bWJvbC5pdGVyYXRvcj1fU3ltYm9sKCdTeW1ib2wuaXRlcmF0b3InKTtyZXR1cm4gX1N5bWJvbDt9KCk7dmFyIFdlYWtNYXAkMT10eXBlb2YgV2Vha01hcD09PSdmdW5jdGlvbic/V2Vha01hcDpmdW5jdGlvbihzLGRQLGhPUCl7ZnVuY3Rpb24gV2Vha01hcCgpe2RQKHRoaXMscyx7dmFsdWU6X1N5bWJvbCgnV2Vha01hcCcpfSk7fQpXZWFrTWFwLnByb3RvdHlwZT17J2RlbGV0ZSc6ZnVuY3Rpb24gZGVsKG8pe2RlbGV0ZSBvW3RoaXNbc11dO30sZ2V0OmZ1bmN0aW9uIGdldChvKXtyZXR1cm4gb1t0aGlzW3NdXTt9LGhhczpmdW5jdGlvbiBoYXMobyl7cmV0dXJuIGhPUC5jYWxsKG8sdGhpc1tzXSk7fSxzZXQ6ZnVuY3Rpb24gc2V0KG8sdil7ZFAobyx0aGlzW3NdLHtjb25maWd1cmFibGU6dHJ1ZSx2YWx1ZTp2fSk7fX07cmV0dXJuIFdlYWtNYXA7fShfU3ltYm9sKCdXZWFrTWFwJyksT2JqZWN0LmRlZmluZVByb3BlcnR5LHt9Lmhhc093blByb3BlcnR5KTt2YXIgcHJpdmF0ZVByb3BzPXtwcm9taXNlOm5ldyBXZWFrTWFwJDEoKSxpbm5lclBhcmFtczpuZXcgV2Vha01hcCQxKCksZG9tQ2FjaGU6bmV3IFdlYWtNYXAkMSgpfTtmdW5jdGlvbiBoaWRlTG9hZGluZygpe3ZhciBpbm5lclBhcmFtcz1wcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpO3ZhciBkb21DYWNoZT1wcml2YXRlUHJvcHMuZG9tQ2FjaGUuZ2V0KHRoaXMpO2lmKCFpbm5lclBhcmFtcy5zaG93Q29uZmlybUJ1dHRvbil7aGlkZShkb21DYWNoZS5jb25maXJtQnV0dG9uKTtpZighaW5uZXJQYXJhbXMuc2hvd0NhbmNlbEJ1dHRvbil7aGlkZShkb21DYWNoZS5hY3Rpb25zKTt9fQpyZW1vdmVDbGFzcyhbZG9tQ2FjaGUucG9wdXAsZG9tQ2FjaGUuYWN0aW9uc10sc3dhbENsYXNzZXMubG9hZGluZyk7ZG9tQ2FjaGUucG9wdXAucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWJ1c3knKTtkb21DYWNoZS5wb3B1cC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtbG9hZGluZycpO2RvbUNhY2hlLmNvbmZpcm1CdXR0b24uZGlzYWJsZWQ9ZmFsc2U7ZG9tQ2FjaGUuY2FuY2VsQnV0dG9uLmRpc2FibGVkPWZhbHNlO30KZnVuY3Rpb24gZ2V0SW5wdXQoaW5wdXRUeXBlKXt2YXIgaW5uZXJQYXJhbXM9cHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldCh0aGlzKTt2YXIgZG9tQ2FjaGU9cHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldCh0aGlzKTtpbnB1dFR5cGU9aW5wdXRUeXBlfHxpbm5lclBhcmFtcy5pbnB1dDtpZighaW5wdXRUeXBlKXtyZXR1cm4gbnVsbDt9CnN3aXRjaChpbnB1dFR5cGUpe2Nhc2UgJ3NlbGVjdCc6Y2FzZSAndGV4dGFyZWEnOmNhc2UgJ2ZpbGUnOnJldHVybiBnZXRDaGlsZEJ5Q2xhc3MoZG9tQ2FjaGUuY29udGVudCxzd2FsQ2xhc3Nlc1tpbnB1dFR5cGVdKTtjYXNlICdjaGVja2JveCc6cmV0dXJuIGRvbUNhY2hlLnBvcHVwLnF1ZXJ5U2VsZWN0b3IoIi4iLmNvbmNhdChzd2FsQ2xhc3Nlcy5jaGVja2JveCwiIGlucHV0IikpO2Nhc2UgJ3JhZGlvJzpyZXR1cm4gZG9tQ2FjaGUucG9wdXAucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KHN3YWxDbGFzc2VzLnJhZGlvLCIgaW5wdXQ6Y2hlY2tlZCIpKXx8ZG9tQ2FjaGUucG9wdXAucXVlcnlTZWxlY3RvcigiLiIuY29uY2F0KHN3YWxDbGFzc2VzLnJhZGlvLCIgaW5wdXQ6Zmlyc3QtY2hpbGQiKSk7Y2FzZSAncmFuZ2UnOnJldHVybiBkb21DYWNoZS5wb3B1cC5xdWVyeVNlbGVjdG9yKCIuIi5jb25jYXQoc3dhbENsYXNzZXMucmFuZ2UsIiBpbnB1dCIpKTtkZWZhdWx0OnJldHVybiBnZXRDaGlsZEJ5Q2xhc3MoZG9tQ2FjaGUuY29udGVudCxzd2FsQ2xhc3Nlcy5pbnB1dCk7fX0KZnVuY3Rpb24gZW5hYmxlQnV0dG9ucygpe3ZhciBkb21DYWNoZT1wcml2YXRlUHJvcHMuZG9tQ2FjaGUuZ2V0KHRoaXMpO2RvbUNhY2hlLmNvbmZpcm1CdXR0b24uZGlzYWJsZWQ9ZmFsc2U7ZG9tQ2FjaGUuY2FuY2VsQnV0dG9uLmRpc2FibGVkPWZhbHNlO30KZnVuY3Rpb24gZGlzYWJsZUJ1dHRvbnMoKXt2YXIgZG9tQ2FjaGU9cHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldCh0aGlzKTtkb21DYWNoZS5jb25maXJtQnV0dG9uLmRpc2FibGVkPXRydWU7ZG9tQ2FjaGUuY2FuY2VsQnV0dG9uLmRpc2FibGVkPXRydWU7fQpmdW5jdGlvbiBlbmFibGVDb25maXJtQnV0dG9uKCl7dmFyIGRvbUNhY2hlPXByaXZhdGVQcm9wcy5kb21DYWNoZS5nZXQodGhpcyk7ZG9tQ2FjaGUuY29uZmlybUJ1dHRvbi5kaXNhYmxlZD1mYWxzZTt9CmZ1bmN0aW9uIGRpc2FibGVDb25maXJtQnV0dG9uKCl7dmFyIGRvbUNhY2hlPXByaXZhdGVQcm9wcy5kb21DYWNoZS5nZXQodGhpcyk7ZG9tQ2FjaGUuY29uZmlybUJ1dHRvbi5kaXNhYmxlZD10cnVlO30KZnVuY3Rpb24gZW5hYmxlSW5wdXQoKXt2YXIgaW5wdXQ9dGhpcy5nZXRJbnB1dCgpO2lmKCFpbnB1dCl7cmV0dXJuIGZhbHNlO30KaWYoaW5wdXQudHlwZT09PSdyYWRpbycpe3ZhciByYWRpb3NDb250YWluZXI9aW5wdXQucGFyZW50Tm9kZS5wYXJlbnROb2RlO3ZhciByYWRpb3M9cmFkaW9zQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0Jyk7Zm9yKHZhciBpPTA7aTxyYWRpb3MubGVuZ3RoO2krKyl7cmFkaW9zW2ldLmRpc2FibGVkPWZhbHNlO319ZWxzZXtpbnB1dC5kaXNhYmxlZD1mYWxzZTt9fQpmdW5jdGlvbiBkaXNhYmxlSW5wdXQoKXt2YXIgaW5wdXQ9dGhpcy5nZXRJbnB1dCgpO2lmKCFpbnB1dCl7cmV0dXJuIGZhbHNlO30KaWYoaW5wdXQmJmlucHV0LnR5cGU9PT0ncmFkaW8nKXt2YXIgcmFkaW9zQ29udGFpbmVyPWlucHV0LnBhcmVudE5vZGUucGFyZW50Tm9kZTt2YXIgcmFkaW9zPXJhZGlvc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpO2Zvcih2YXIgaT0wO2k8cmFkaW9zLmxlbmd0aDtpKyspe3JhZGlvc1tpXS5kaXNhYmxlZD10cnVlO319ZWxzZXtpbnB1dC5kaXNhYmxlZD10cnVlO319CmZ1bmN0aW9uIHNob3dWYWxpZGF0aW9uTWVzc2FnZShlcnJvciQkMSl7dmFyIGRvbUNhY2hlPXByaXZhdGVQcm9wcy5kb21DYWNoZS5nZXQodGhpcyk7ZG9tQ2FjaGUudmFsaWRhdGlvbk1lc3NhZ2UuaW5uZXJIVE1MPWVycm9yJCQxO3ZhciBwb3B1cENvbXB1dGVkU3R5bGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9tQ2FjaGUucG9wdXApO2RvbUNhY2hlLnZhbGlkYXRpb25NZXNzYWdlLnN0eWxlLm1hcmdpbkxlZnQ9Ii0iLmNvbmNhdChwb3B1cENvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy1sZWZ0JykpO2RvbUNhY2hlLnZhbGlkYXRpb25NZXNzYWdlLnN0eWxlLm1hcmdpblJpZ2h0PSItIi5jb25jYXQocG9wdXBDb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctcmlnaHQnKSk7c2hvdyhkb21DYWNoZS52YWxpZGF0aW9uTWVzc2FnZSk7dmFyIGlucHV0PXRoaXMuZ2V0SW5wdXQoKTtpZihpbnB1dCl7aW5wdXQuc2V0QXR0cmlidXRlKCdhcmlhLWludmFsaWQnLHRydWUpO2lucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRCeScsc3dhbENsYXNzZXNbJ3ZhbGlkYXRpb24tbWVzc2FnZSddKTtmb2N1c0lucHV0KGlucHV0KTthZGRDbGFzcyhpbnB1dCxzd2FsQ2xhc3Nlcy5pbnB1dGVycm9yKTt9fQpmdW5jdGlvbiByZXNldFZhbGlkYXRpb25NZXNzYWdlKCl7dmFyIGRvbUNhY2hlPXByaXZhdGVQcm9wcy5kb21DYWNoZS5nZXQodGhpcyk7aWYoZG9tQ2FjaGUudmFsaWRhdGlvbk1lc3NhZ2Upe2hpZGUoZG9tQ2FjaGUudmFsaWRhdGlvbk1lc3NhZ2UpO30KdmFyIGlucHV0PXRoaXMuZ2V0SW5wdXQoKTtpZihpbnB1dCl7aW5wdXQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWludmFsaWQnKTtpbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkQnknKTtyZW1vdmVDbGFzcyhpbnB1dCxzd2FsQ2xhc3Nlcy5pbnB1dGVycm9yKTt9fQpmdW5jdGlvbiByZXNldFZhbGlkYXRpb25FcnJvcigpe3dhcm5PbmNlKCJTd2FsLnJlc2V0VmFsaWRhdGlvbkVycm9yKCkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UsIHVzZSBTd2FsLnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSBpbnN0ZWFkIik7cmVzZXRWYWxpZGF0aW9uTWVzc2FnZS5iaW5kKHRoaXMpKCk7fQpmdW5jdGlvbiBzaG93VmFsaWRhdGlvbkVycm9yKGVycm9yJCQxKXt3YXJuT25jZSgiU3dhbC5zaG93VmFsaWRhdGlvbkVycm9yKCkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UsIHVzZSBTd2FsLnNob3dWYWxpZGF0aW9uTWVzc2FnZSgpIGluc3RlYWQiKTtzaG93VmFsaWRhdGlvbk1lc3NhZ2UuYmluZCh0aGlzKShlcnJvciQkMSk7fQpmdW5jdGlvbiBnZXRQcm9ncmVzc1N0ZXBzJDEoKXt2YXIgaW5uZXJQYXJhbXM9cHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldCh0aGlzKTtyZXR1cm4gaW5uZXJQYXJhbXMucHJvZ3Jlc3NTdGVwczt9CmZ1bmN0aW9uIHNldFByb2dyZXNzU3RlcHMocHJvZ3Jlc3NTdGVwcyl7dmFyIGlubmVyUGFyYW1zPXByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQodGhpcyk7dmFyIHVwZGF0ZWRQYXJhbXM9X2V4dGVuZHMoe30saW5uZXJQYXJhbXMse3Byb2dyZXNzU3RlcHM6cHJvZ3Jlc3NTdGVwc30pO3ByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5zZXQodGhpcyx1cGRhdGVkUGFyYW1zKTtyZW5kZXJQcm9ncmVzc1N0ZXBzKHVwZGF0ZWRQYXJhbXMpO30KZnVuY3Rpb24gc2hvd1Byb2dyZXNzU3RlcHMoKXt2YXIgZG9tQ2FjaGU9cHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldCh0aGlzKTtzaG93KGRvbUNhY2hlLnByb2dyZXNzU3RlcHMpO30KZnVuY3Rpb24gaGlkZVByb2dyZXNzU3RlcHMoKXt2YXIgZG9tQ2FjaGU9cHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldCh0aGlzKTtoaWRlKGRvbUNhY2hlLnByb2dyZXNzU3RlcHMpO30KdmFyIFRpbWVyPWZ1bmN0aW9uIFRpbWVyKGNhbGxiYWNrLGRlbGF5KXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxUaW1lcik7dmFyIGlkLHN0YXJ0ZWQscnVubmluZzt2YXIgcmVtYWluaW5nPWRlbGF5O3RoaXMuc3RhcnQ9ZnVuY3Rpb24oKXtydW5uaW5nPXRydWU7c3RhcnRlZD1uZXcgRGF0ZSgpO2lkPXNldFRpbWVvdXQoY2FsbGJhY2sscmVtYWluaW5nKTt9O3RoaXMuc3RvcD1mdW5jdGlvbigpe3J1bm5pbmc9ZmFsc2U7Y2xlYXJUaW1lb3V0KGlkKTtyZW1haW5pbmctPW5ldyBEYXRlKCktc3RhcnRlZDt9O3RoaXMuZ2V0VGltZXJMZWZ0PWZ1bmN0aW9uKCl7aWYocnVubmluZyl7dGhpcy5zdG9wKCk7dGhpcy5zdGFydCgpO30KcmV0dXJuIHJlbWFpbmluZzt9O3RoaXMuc3RhcnQoKTt9O3ZhciBkZWZhdWx0SW5wdXRWYWxpZGF0b3JzPXtlbWFpbDpmdW5jdGlvbiBlbWFpbChzdHJpbmcsZXh0cmFQYXJhbXMpe3JldHVybiAvXlthLXpBLVowLTkuK18tXStAW2EtekEtWjAtOS4tXStcLlthLXpBLVowLTktXXsyLDI0fSQvLnRlc3Qoc3RyaW5nKT9Qcm9taXNlLnJlc29sdmUoKTpQcm9taXNlLnJlamVjdChleHRyYVBhcmFtcyYmZXh0cmFQYXJhbXMudmFsaWRhdGlvbk1lc3NhZ2U/ZXh0cmFQYXJhbXMudmFsaWRhdGlvbk1lc3NhZ2U6J0ludmFsaWQgZW1haWwgYWRkcmVzcycpO30sdXJsOmZ1bmN0aW9uIHVybChzdHJpbmcsZXh0cmFQYXJhbXMpe3JldHVybiAvXmh0dHBzPzpcL1wvKHd3d1wuKT9bLWEtekEtWjAtOUA6JS5fK34jPV17MiwyNTZ9XC5bYS16XXsyLDZ9XGIoWy1hLXpBLVowLTlAOiVfKy5+Iz8mLy89XSopJC8udGVzdChzdHJpbmcpP1Byb21pc2UucmVzb2x2ZSgpOlByb21pc2UucmVqZWN0KGV4dHJhUGFyYW1zJiZleHRyYVBhcmFtcy52YWxpZGF0aW9uTWVzc2FnZT9leHRyYVBhcmFtcy52YWxpZGF0aW9uTWVzc2FnZTonSW52YWxpZCBVUkwnKTt9fTtmdW5jdGlvbiBzZXRQYXJhbWV0ZXJzKHBhcmFtcyl7aWYoIXBhcmFtcy5pbnB1dFZhbGlkYXRvcil7T2JqZWN0LmtleXMoZGVmYXVsdElucHV0VmFsaWRhdG9ycykuZm9yRWFjaChmdW5jdGlvbihrZXkpe2lmKHBhcmFtcy5pbnB1dD09PWtleSl7cGFyYW1zLmlucHV0VmFsaWRhdG9yPXBhcmFtcy5leHBlY3RSZWplY3Rpb25zP2RlZmF1bHRJbnB1dFZhbGlkYXRvcnNba2V5XTpTd2FsLmFkYXB0SW5wdXRWYWxpZGF0b3IoZGVmYXVsdElucHV0VmFsaWRhdG9yc1trZXldKTt9fSk7fQppZihwYXJhbXMudmFsaWRhdGlvbk1lc3NhZ2Upe2lmKF90eXBlb2YocGFyYW1zLmV4dHJhUGFyYW1zKSE9PSdvYmplY3QnKXtwYXJhbXMuZXh0cmFQYXJhbXM9e307fQpwYXJhbXMuZXh0cmFQYXJhbXMudmFsaWRhdGlvbk1lc3NhZ2U9cGFyYW1zLnZhbGlkYXRpb25NZXNzYWdlO30KaWYoIXBhcmFtcy50YXJnZXR8fHR5cGVvZiBwYXJhbXMudGFyZ2V0PT09J3N0cmluZycmJiFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHBhcmFtcy50YXJnZXQpfHx0eXBlb2YgcGFyYW1zLnRhcmdldCE9PSdzdHJpbmcnJiYhcGFyYW1zLnRhcmdldC5hcHBlbmRDaGlsZCl7d2FybignVGFyZ2V0IHBhcmFtZXRlciBpcyBub3QgdmFsaWQsIGRlZmF1bHRpbmcgdG8gImJvZHkiJyk7cGFyYW1zLnRhcmdldD0nYm9keSc7fQp2YXIgcG9wdXA7dmFyIG9sZFBvcHVwPWdldFBvcHVwKCk7dmFyIHRhcmdldEVsZW1lbnQ9dHlwZW9mIHBhcmFtcy50YXJnZXQ9PT0nc3RyaW5nJz9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHBhcmFtcy50YXJnZXQpOnBhcmFtcy50YXJnZXQ7aWYob2xkUG9wdXAmJnRhcmdldEVsZW1lbnQmJm9sZFBvcHVwLnBhcmVudE5vZGUhPT10YXJnZXRFbGVtZW50LnBhcmVudE5vZGUpe3BvcHVwPWluaXQocGFyYW1zKTt9ZWxzZXtwb3B1cD1vbGRQb3B1cHx8aW5pdChwYXJhbXMpO30KaWYocGFyYW1zLndpZHRoKXtwb3B1cC5zdHlsZS53aWR0aD10eXBlb2YgcGFyYW1zLndpZHRoPT09J251bWJlcic/cGFyYW1zLndpZHRoKydweCc6cGFyYW1zLndpZHRoO30KaWYocGFyYW1zLnBhZGRpbmcpe3BvcHVwLnN0eWxlLnBhZGRpbmc9dHlwZW9mIHBhcmFtcy5wYWRkaW5nPT09J251bWJlcic/cGFyYW1zLnBhZGRpbmcrJ3B4JzpwYXJhbXMucGFkZGluZzt9CmlmKHBhcmFtcy5iYWNrZ3JvdW5kKXtwb3B1cC5zdHlsZS5iYWNrZ3JvdW5kPXBhcmFtcy5iYWNrZ3JvdW5kO30KdmFyIHBvcHVwQmFja2dyb3VuZENvbG9yPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBvcHVwKS5nZXRQcm9wZXJ0eVZhbHVlKCdiYWNrZ3JvdW5kLWNvbG9yJyk7dmFyIHN1Y2Nlc3NJY29uUGFydHM9cG9wdXAucXVlcnlTZWxlY3RvckFsbCgnW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdLCAuc3dhbDItc3VjY2Vzcy1maXgnKTtmb3IodmFyIGk9MDtpPHN1Y2Nlc3NJY29uUGFydHMubGVuZ3RoO2krKyl7c3VjY2Vzc0ljb25QYXJ0c1tpXS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9cG9wdXBCYWNrZ3JvdW5kQ29sb3I7fQp2YXIgY29udGFpbmVyPWdldENvbnRhaW5lcigpO3ZhciBjbG9zZUJ1dHRvbj1nZXRDbG9zZUJ1dHRvbigpO3ZhciBmb290ZXI9Z2V0Rm9vdGVyKCk7cmVuZGVyVGl0bGUocGFyYW1zKTtyZW5kZXJDb250ZW50KHBhcmFtcyk7aWYodHlwZW9mIHBhcmFtcy5iYWNrZHJvcD09PSdzdHJpbmcnKXtnZXRDb250YWluZXIoKS5zdHlsZS5iYWNrZ3JvdW5kPXBhcmFtcy5iYWNrZHJvcDt9ZWxzZSBpZighcGFyYW1zLmJhY2tkcm9wKXthZGRDbGFzcyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLHN3YWxDbGFzc2VzWyduby1iYWNrZHJvcCddKTt9CmlmKCFwYXJhbXMuYmFja2Ryb3AmJnBhcmFtcy5hbGxvd091dHNpZGVDbGljayl7d2FybignImFsbG93T3V0c2lkZUNsaWNrIiBwYXJhbWV0ZXIgcmVxdWlyZXMgYGJhY2tkcm9wYCBwYXJhbWV0ZXIgdG8gYmUgc2V0IHRvIGB0cnVlYCcpO30KaWYocGFyYW1zLnBvc2l0aW9uIGluIHN3YWxDbGFzc2VzKXthZGRDbGFzcyhjb250YWluZXIsc3dhbENsYXNzZXNbcGFyYW1zLnBvc2l0aW9uXSk7fWVsc2V7d2FybignVGhlICJwb3NpdGlvbiIgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCwgZGVmYXVsdGluZyB0byAiY2VudGVyIicpO2FkZENsYXNzKGNvbnRhaW5lcixzd2FsQ2xhc3Nlcy5jZW50ZXIpO30KaWYocGFyYW1zLmdyb3cmJnR5cGVvZiBwYXJhbXMuZ3Jvdz09PSdzdHJpbmcnKXt2YXIgZ3Jvd0NsYXNzPSdncm93LScrcGFyYW1zLmdyb3c7aWYoZ3Jvd0NsYXNzIGluIHN3YWxDbGFzc2VzKXthZGRDbGFzcyhjb250YWluZXIsc3dhbENsYXNzZXNbZ3Jvd0NsYXNzXSk7fX0KaWYodHlwZW9mIHBhcmFtcy5hbmltYXRpb249PT0nZnVuY3Rpb24nKXtwYXJhbXMuYW5pbWF0aW9uPXBhcmFtcy5hbmltYXRpb24uY2FsbCgpO30KaWYocGFyYW1zLnNob3dDbG9zZUJ1dHRvbil7Y2xvc2VCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyxwYXJhbXMuY2xvc2VCdXR0b25BcmlhTGFiZWwpO3Nob3coY2xvc2VCdXR0b24pO31lbHNle2hpZGUoY2xvc2VCdXR0b24pO30KcG9wdXAuY2xhc3NOYW1lPXN3YWxDbGFzc2VzLnBvcHVwO2lmKHBhcmFtcy50b2FzdCl7YWRkQ2xhc3MoW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCxkb2N1bWVudC5ib2R5XSxzd2FsQ2xhc3Nlc1sndG9hc3Qtc2hvd24nXSk7YWRkQ2xhc3MocG9wdXAsc3dhbENsYXNzZXMudG9hc3QpO31lbHNle2FkZENsYXNzKHBvcHVwLHN3YWxDbGFzc2VzLm1vZGFsKTt9CmlmKHBhcmFtcy5jdXN0b21DbGFzcyl7YWRkQ2xhc3MocG9wdXAscGFyYW1zLmN1c3RvbUNsYXNzKTt9CnJlbmRlclByb2dyZXNzU3RlcHMocGFyYW1zKTtyZW5kZXJJY29uKHBhcmFtcyk7cmVuZGVySW1hZ2UocGFyYW1zKTtyZW5kZXJBY3Rpb25zKHBhcmFtcyk7cGFyc2VIdG1sVG9Db250YWluZXIocGFyYW1zLmZvb3Rlcixmb290ZXIpO2lmKHBhcmFtcy5hbmltYXRpb249PT10cnVlKXtyZW1vdmVDbGFzcyhwb3B1cCxzd2FsQ2xhc3Nlcy5ub2FuaW1hdGlvbik7fWVsc2V7YWRkQ2xhc3MocG9wdXAsc3dhbENsYXNzZXMubm9hbmltYXRpb24pO30KaWYocGFyYW1zLnNob3dMb2FkZXJPbkNvbmZpcm0mJiFwYXJhbXMucHJlQ29uZmlybSl7d2Fybignc2hvd0xvYWRlck9uQ29uZmlybSBpcyBzZXQgdG8gdHJ1ZSwgYnV0IHByZUNvbmZpcm0gaXMgbm90IGRlZmluZWQuXG4nKydzaG93TG9hZGVyT25Db25maXJtIHNob3VsZCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggcHJlQ29uZmlybSwgc2VlIHVzYWdlIGV4YW1wbGU6XG4nKydodHRwczovL3N3ZWV0YWxlcnQyLmdpdGh1Yi5pby8jYWpheC1yZXF1ZXN0Jyk7fX0KdmFyIG9wZW5Qb3B1cD1mdW5jdGlvbiBvcGVuUG9wdXAocGFyYW1zKXt2YXIgY29udGFpbmVyPWdldENvbnRhaW5lcigpO3ZhciBwb3B1cD1nZXRQb3B1cCgpO2lmKHBhcmFtcy5vbkJlZm9yZU9wZW4hPT1udWxsJiZ0eXBlb2YgcGFyYW1zLm9uQmVmb3JlT3Blbj09PSdmdW5jdGlvbicpe3BhcmFtcy5vbkJlZm9yZU9wZW4ocG9wdXApO30KaWYocGFyYW1zLmFuaW1hdGlvbil7YWRkQ2xhc3MocG9wdXAsc3dhbENsYXNzZXMuc2hvdyk7YWRkQ2xhc3MoY29udGFpbmVyLHN3YWxDbGFzc2VzLmZhZGUpO3JlbW92ZUNsYXNzKHBvcHVwLHN3YWxDbGFzc2VzLmhpZGUpO31lbHNle3JlbW92ZUNsYXNzKHBvcHVwLHN3YWxDbGFzc2VzLmZhZGUpO30Kc2hvdyhwb3B1cCk7Y29udGFpbmVyLnN0eWxlLm92ZXJmbG93WT0naGlkZGVuJztpZihhbmltYXRpb25FbmRFdmVudCYmIWhhc0NsYXNzKHBvcHVwLHN3YWxDbGFzc2VzLm5vYW5pbWF0aW9uKSl7cG9wdXAuYWRkRXZlbnRMaXN0ZW5lcihhbmltYXRpb25FbmRFdmVudCxmdW5jdGlvbiBzd2FsQ2xvc2VFdmVudEZpbmlzaGVkKCl7cG9wdXAucmVtb3ZlRXZlbnRMaXN0ZW5lcihhbmltYXRpb25FbmRFdmVudCxzd2FsQ2xvc2VFdmVudEZpbmlzaGVkKTtjb250YWluZXIuc3R5bGUub3ZlcmZsb3dZPSdhdXRvJzt9KTt9ZWxzZXtjb250YWluZXIuc3R5bGUub3ZlcmZsb3dZPSdhdXRvJzt9CmFkZENsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZG9jdW1lbnQuYm9keSxjb250YWluZXJdLHN3YWxDbGFzc2VzLnNob3duKTtpZihwYXJhbXMuaGVpZ2h0QXV0byYmcGFyYW1zLmJhY2tkcm9wJiYhcGFyYW1zLnRvYXN0KXthZGRDbGFzcyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGRvY3VtZW50LmJvZHldLHN3YWxDbGFzc2VzWydoZWlnaHQtYXV0byddKTt9CmlmKGlzTW9kYWwoKSl7Zml4U2Nyb2xsYmFyKCk7aU9TZml4KCk7c2V0QXJpYUhpZGRlbigpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjb250YWluZXIuc2Nyb2xsVG9wPTA7fSk7fQppZighaXNUb2FzdCgpJiYhZ2xvYmFsU3RhdGUucHJldmlvdXNBY3RpdmVFbGVtZW50KXtnbG9iYWxTdGF0ZS5wcmV2aW91c0FjdGl2ZUVsZW1lbnQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDt9CmlmKHBhcmFtcy5vbk9wZW4hPT1udWxsJiZ0eXBlb2YgcGFyYW1zLm9uT3Blbj09PSdmdW5jdGlvbicpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtwYXJhbXMub25PcGVuKHBvcHVwKTt9KTt9fTtmdW5jdGlvbiBfbWFpbih1c2VyUGFyYW1zKXt2YXIgX3RoaXM9dGhpcztzaG93V2FybmluZ3NGb3JQYXJhbXModXNlclBhcmFtcyk7dmFyIGlubmVyUGFyYW1zPV9leHRlbmRzKHt9LGRlZmF1bHRQYXJhbXMsdXNlclBhcmFtcyk7c2V0UGFyYW1ldGVycyhpbm5lclBhcmFtcyk7T2JqZWN0LmZyZWV6ZShpbm5lclBhcmFtcyk7cHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLnNldCh0aGlzLGlubmVyUGFyYW1zKTtpZihnbG9iYWxTdGF0ZS50aW1lb3V0KXtnbG9iYWxTdGF0ZS50aW1lb3V0LnN0b3AoKTtkZWxldGUgZ2xvYmFsU3RhdGUudGltZW91dDt9CmNsZWFyVGltZW91dChnbG9iYWxTdGF0ZS5yZXN0b3JlRm9jdXNUaW1lb3V0KTt2YXIgZG9tQ2FjaGU9e3BvcHVwOmdldFBvcHVwKCksY29udGFpbmVyOmdldENvbnRhaW5lcigpLGNvbnRlbnQ6Z2V0Q29udGVudCgpLGFjdGlvbnM6Z2V0QWN0aW9ucygpLGNvbmZpcm1CdXR0b246Z2V0Q29uZmlybUJ1dHRvbigpLGNhbmNlbEJ1dHRvbjpnZXRDYW5jZWxCdXR0b24oKSxjbG9zZUJ1dHRvbjpnZXRDbG9zZUJ1dHRvbigpLHZhbGlkYXRpb25NZXNzYWdlOmdldFZhbGlkYXRpb25NZXNzYWdlKCkscHJvZ3Jlc3NTdGVwczpnZXRQcm9ncmVzc1N0ZXBzKCl9O3ByaXZhdGVQcm9wcy5kb21DYWNoZS5zZXQodGhpcyxkb21DYWNoZSk7dmFyIGNvbnN0cnVjdG9yPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUscmVqZWN0KXt2YXIgc3VjY2VlZFdpdGg9ZnVuY3Rpb24gc3VjY2VlZFdpdGgodmFsdWUpe2NvbnN0cnVjdG9yLmNsb3NlUG9wdXAoaW5uZXJQYXJhbXMub25DbG9zZSxpbm5lclBhcmFtcy5vbkFmdGVyQ2xvc2UpO2lmKGlubmVyUGFyYW1zLnVzZVJlamVjdGlvbnMpe3Jlc29sdmUodmFsdWUpO31lbHNle3Jlc29sdmUoe3ZhbHVlOnZhbHVlfSk7fX07dmFyIGRpc21pc3NXaXRoPWZ1bmN0aW9uIGRpc21pc3NXaXRoKGRpc21pc3Mpe2NvbnN0cnVjdG9yLmNsb3NlUG9wdXAoaW5uZXJQYXJhbXMub25DbG9zZSxpbm5lclBhcmFtcy5vbkFmdGVyQ2xvc2UpO2lmKGlubmVyUGFyYW1zLnVzZVJlamVjdGlvbnMpe3JlamVjdChkaXNtaXNzKTt9ZWxzZXtyZXNvbHZlKHtkaXNtaXNzOmRpc21pc3N9KTt9fTt2YXIgZXJyb3JXaXRoPWZ1bmN0aW9uIGVycm9yV2l0aChlcnJvciQkMSl7Y29uc3RydWN0b3IuY2xvc2VQb3B1cChpbm5lclBhcmFtcy5vbkNsb3NlLGlubmVyUGFyYW1zLm9uQWZ0ZXJDbG9zZSk7cmVqZWN0KGVycm9yJCQxKTt9O2lmKGlubmVyUGFyYW1zLnRpbWVyKXtnbG9iYWxTdGF0ZS50aW1lb3V0PW5ldyBUaW1lcihmdW5jdGlvbigpe2Rpc21pc3NXaXRoKCd0aW1lcicpO2RlbGV0ZSBnbG9iYWxTdGF0ZS50aW1lb3V0O30saW5uZXJQYXJhbXMudGltZXIpO30KdmFyIGdldElucHV0VmFsdWU9ZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZSgpe3ZhciBpbnB1dD1fdGhpcy5nZXRJbnB1dCgpO2lmKCFpbnB1dCl7cmV0dXJuIG51bGw7fQpzd2l0Y2goaW5uZXJQYXJhbXMuaW5wdXQpe2Nhc2UgJ2NoZWNrYm94JzpyZXR1cm4gaW5wdXQuY2hlY2tlZD8xOjA7Y2FzZSAncmFkaW8nOnJldHVybiBpbnB1dC5jaGVja2VkP2lucHV0LnZhbHVlOm51bGw7Y2FzZSAnZmlsZSc6cmV0dXJuIGlucHV0LmZpbGVzLmxlbmd0aD9pbnB1dC5maWxlc1swXTpudWxsO2RlZmF1bHQ6cmV0dXJuIGlubmVyUGFyYW1zLmlucHV0QXV0b1RyaW0/aW5wdXQudmFsdWUudHJpbSgpOmlucHV0LnZhbHVlO319O2lmKGlubmVyUGFyYW1zLmlucHV0KXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGlucHV0PV90aGlzLmdldElucHV0KCk7aWYoaW5wdXQpe2ZvY3VzSW5wdXQoaW5wdXQpO319LDApO30KdmFyIGNvbmZpcm09ZnVuY3Rpb24gY29uZmlybSh2YWx1ZSl7aWYoaW5uZXJQYXJhbXMuc2hvd0xvYWRlck9uQ29uZmlybSl7Y29uc3RydWN0b3Iuc2hvd0xvYWRpbmcoKTt9CmlmKGlubmVyUGFyYW1zLnByZUNvbmZpcm0pe190aGlzLnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKTt2YXIgcHJlQ29uZmlybVByb21pc2U9UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBpbm5lclBhcmFtcy5wcmVDb25maXJtKHZhbHVlLGlubmVyUGFyYW1zLmV4dHJhUGFyYW1zKTt9KTtpZihpbm5lclBhcmFtcy5leHBlY3RSZWplY3Rpb25zKXtwcmVDb25maXJtUHJvbWlzZS50aGVuKGZ1bmN0aW9uKHByZUNvbmZpcm1WYWx1ZSl7cmV0dXJuIHN1Y2NlZWRXaXRoKHByZUNvbmZpcm1WYWx1ZXx8dmFsdWUpO30sZnVuY3Rpb24odmFsaWRhdGlvbk1lc3NhZ2Upe190aGlzLmhpZGVMb2FkaW5nKCk7aWYodmFsaWRhdGlvbk1lc3NhZ2Upe190aGlzLnNob3dWYWxpZGF0aW9uTWVzc2FnZSh2YWxpZGF0aW9uTWVzc2FnZSk7fX0pO31lbHNle3ByZUNvbmZpcm1Qcm9taXNlLnRoZW4oZnVuY3Rpb24ocHJlQ29uZmlybVZhbHVlKXtpZihpc1Zpc2libGUoZG9tQ2FjaGUudmFsaWRhdGlvbk1lc3NhZ2UpfHxwcmVDb25maXJtVmFsdWU9PT1mYWxzZSl7X3RoaXMuaGlkZUxvYWRpbmcoKTt9ZWxzZXtzdWNjZWVkV2l0aChwcmVDb25maXJtVmFsdWV8fHZhbHVlKTt9fSxmdW5jdGlvbihlcnJvciQkMSl7cmV0dXJuIGVycm9yV2l0aChlcnJvciQkMSk7fSk7fX1lbHNle3N1Y2NlZWRXaXRoKHZhbHVlKTt9fTt2YXIgb25CdXR0b25FdmVudD1mdW5jdGlvbiBvbkJ1dHRvbkV2ZW50KGUpe3ZhciB0YXJnZXQ9ZS50YXJnZXQ7dmFyIGNvbmZpcm1CdXR0b249ZG9tQ2FjaGUuY29uZmlybUJ1dHRvbixjYW5jZWxCdXR0b249ZG9tQ2FjaGUuY2FuY2VsQnV0dG9uO3ZhciB0YXJnZXRlZENvbmZpcm09Y29uZmlybUJ1dHRvbiYmKGNvbmZpcm1CdXR0b249PT10YXJnZXR8fGNvbmZpcm1CdXR0b24uY29udGFpbnModGFyZ2V0KSk7dmFyIHRhcmdldGVkQ2FuY2VsPWNhbmNlbEJ1dHRvbiYmKGNhbmNlbEJ1dHRvbj09PXRhcmdldHx8Y2FuY2VsQnV0dG9uLmNvbnRhaW5zKHRhcmdldCkpO3N3aXRjaChlLnR5cGUpe2Nhc2UgJ2NsaWNrJzppZih0YXJnZXRlZENvbmZpcm0mJmNvbnN0cnVjdG9yLmlzVmlzaWJsZSgpKXtfdGhpcy5kaXNhYmxlQnV0dG9ucygpO2lmKGlubmVyUGFyYW1zLmlucHV0KXt2YXIgaW5wdXRWYWx1ZT1nZXRJbnB1dFZhbHVlKCk7aWYoaW5uZXJQYXJhbXMuaW5wdXRWYWxpZGF0b3Ipe190aGlzLmRpc2FibGVJbnB1dCgpO3ZhciB2YWxpZGF0aW9uUHJvbWlzZT1Qcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGlubmVyUGFyYW1zLmlucHV0VmFsaWRhdG9yKGlucHV0VmFsdWUsaW5uZXJQYXJhbXMuZXh0cmFQYXJhbXMpO30pO2lmKGlubmVyUGFyYW1zLmV4cGVjdFJlamVjdGlvbnMpe3ZhbGlkYXRpb25Qcm9taXNlLnRoZW4oZnVuY3Rpb24oKXtfdGhpcy5lbmFibGVCdXR0b25zKCk7X3RoaXMuZW5hYmxlSW5wdXQoKTtjb25maXJtKGlucHV0VmFsdWUpO30sZnVuY3Rpb24odmFsaWRhdGlvbk1lc3NhZ2Upe190aGlzLmVuYWJsZUJ1dHRvbnMoKTtfdGhpcy5lbmFibGVJbnB1dCgpO2lmKHZhbGlkYXRpb25NZXNzYWdlKXtfdGhpcy5zaG93VmFsaWRhdGlvbk1lc3NhZ2UodmFsaWRhdGlvbk1lc3NhZ2UpO319KTt9ZWxzZXt2YWxpZGF0aW9uUHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbGlkYXRpb25NZXNzYWdlKXtfdGhpcy5lbmFibGVCdXR0b25zKCk7X3RoaXMuZW5hYmxlSW5wdXQoKTtpZih2YWxpZGF0aW9uTWVzc2FnZSl7X3RoaXMuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKHZhbGlkYXRpb25NZXNzYWdlKTt9ZWxzZXtjb25maXJtKGlucHV0VmFsdWUpO319LGZ1bmN0aW9uKGVycm9yJCQxKXtyZXR1cm4gZXJyb3JXaXRoKGVycm9yJCQxKTt9KTt9fWVsc2V7Y29uZmlybShpbnB1dFZhbHVlKTt9fWVsc2V7Y29uZmlybSh0cnVlKTt9fWVsc2UgaWYodGFyZ2V0ZWRDYW5jZWwmJmNvbnN0cnVjdG9yLmlzVmlzaWJsZSgpKXtfdGhpcy5kaXNhYmxlQnV0dG9ucygpO2Rpc21pc3NXaXRoKGNvbnN0cnVjdG9yLkRpc21pc3NSZWFzb24uY2FuY2VsKTt9CmJyZWFrO2RlZmF1bHQ6fX07dmFyIGJ1dHRvbnM9ZG9tQ2FjaGUucG9wdXAucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJyk7Zm9yKHZhciBpPTA7aTxidXR0b25zLmxlbmd0aDtpKyspe2J1dHRvbnNbaV0ub25jbGljaz1vbkJ1dHRvbkV2ZW50O2J1dHRvbnNbaV0ub25tb3VzZW92ZXI9b25CdXR0b25FdmVudDtidXR0b25zW2ldLm9ubW91c2VvdXQ9b25CdXR0b25FdmVudDtidXR0b25zW2ldLm9ubW91c2Vkb3duPW9uQnV0dG9uRXZlbnQ7fQpkb21DYWNoZS5jbG9zZUJ1dHRvbi5vbmNsaWNrPWZ1bmN0aW9uKCl7ZGlzbWlzc1dpdGgoY29uc3RydWN0b3IuRGlzbWlzc1JlYXNvbi5jbG9zZSk7fTtpZihpbm5lclBhcmFtcy50b2FzdCl7ZG9tQ2FjaGUucG9wdXAub25jbGljaz1mdW5jdGlvbigpe2lmKGlubmVyUGFyYW1zLnNob3dDb25maXJtQnV0dG9ufHxpbm5lclBhcmFtcy5zaG93Q2FuY2VsQnV0dG9ufHxpbm5lclBhcmFtcy5zaG93Q2xvc2VCdXR0b258fGlubmVyUGFyYW1zLmlucHV0KXtyZXR1cm47fQpkaXNtaXNzV2l0aChjb25zdHJ1Y3Rvci5EaXNtaXNzUmVhc29uLmNsb3NlKTt9O31lbHNle3ZhciBpZ25vcmVPdXRzaWRlQ2xpY2s9ZmFsc2U7ZG9tQ2FjaGUucG9wdXAub25tb3VzZWRvd249ZnVuY3Rpb24oKXtkb21DYWNoZS5jb250YWluZXIub25tb3VzZXVwPWZ1bmN0aW9uKGUpe2RvbUNhY2hlLmNvbnRhaW5lci5vbm1vdXNldXA9dW5kZWZpbmVkO2lmKGUudGFyZ2V0PT09ZG9tQ2FjaGUuY29udGFpbmVyKXtpZ25vcmVPdXRzaWRlQ2xpY2s9dHJ1ZTt9fTt9O2RvbUNhY2hlLmNvbnRhaW5lci5vbm1vdXNlZG93bj1mdW5jdGlvbigpe2RvbUNhY2hlLnBvcHVwLm9ubW91c2V1cD1mdW5jdGlvbihlKXtkb21DYWNoZS5wb3B1cC5vbm1vdXNldXA9dW5kZWZpbmVkO2lmKGUudGFyZ2V0PT09ZG9tQ2FjaGUucG9wdXB8fGRvbUNhY2hlLnBvcHVwLmNvbnRhaW5zKGUudGFyZ2V0KSl7aWdub3JlT3V0c2lkZUNsaWNrPXRydWU7fX07fTtkb21DYWNoZS5jb250YWluZXIub25jbGljaz1mdW5jdGlvbihlKXtpZihpZ25vcmVPdXRzaWRlQ2xpY2spe2lnbm9yZU91dHNpZGVDbGljaz1mYWxzZTtyZXR1cm47fQppZihlLnRhcmdldCE9PWRvbUNhY2hlLmNvbnRhaW5lcil7cmV0dXJuO30KaWYoY2FsbElmRnVuY3Rpb24oaW5uZXJQYXJhbXMuYWxsb3dPdXRzaWRlQ2xpY2spKXtkaXNtaXNzV2l0aChjb25zdHJ1Y3Rvci5EaXNtaXNzUmVhc29uLmJhY2tkcm9wKTt9fTt9CmlmKGlubmVyUGFyYW1zLnJldmVyc2VCdXR0b25zKXtkb21DYWNoZS5jb25maXJtQnV0dG9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRvbUNhY2hlLmNhbmNlbEJ1dHRvbixkb21DYWNoZS5jb25maXJtQnV0dG9uKTt9ZWxzZXtkb21DYWNoZS5jb25maXJtQnV0dG9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRvbUNhY2hlLmNvbmZpcm1CdXR0b24sZG9tQ2FjaGUuY2FuY2VsQnV0dG9uKTt9CnZhciBzZXRGb2N1cz1mdW5jdGlvbiBzZXRGb2N1cyhpbmRleCxpbmNyZW1lbnQpe3ZhciBmb2N1c2FibGVFbGVtZW50cz1nZXRGb2N1c2FibGVFbGVtZW50cyhpbm5lclBhcmFtcy5mb2N1c0NhbmNlbCk7Zm9yKHZhciBfaT0wO19pPGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aDtfaSsrKXtpbmRleD1pbmRleCtpbmNyZW1lbnQ7aWYoaW5kZXg9PT1mb2N1c2FibGVFbGVtZW50cy5sZW5ndGgpe2luZGV4PTA7fWVsc2UgaWYoaW5kZXg9PT0tMSl7aW5kZXg9Zm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoLTE7fQpyZXR1cm4gZm9jdXNhYmxlRWxlbWVudHNbaW5kZXhdLmZvY3VzKCk7fQpkb21DYWNoZS5wb3B1cC5mb2N1cygpO307dmFyIGtleWRvd25IYW5kbGVyPWZ1bmN0aW9uIGtleWRvd25IYW5kbGVyKGUsaW5uZXJQYXJhbXMpe2lmKGlubmVyUGFyYW1zLnN0b3BLZXlkb3duUHJvcGFnYXRpb24pe2Uuc3RvcFByb3BhZ2F0aW9uKCk7fQp2YXIgYXJyb3dLZXlzPVsnQXJyb3dMZWZ0JywnQXJyb3dSaWdodCcsJ0Fycm93VXAnLCdBcnJvd0Rvd24nLCdMZWZ0JywnUmlnaHQnLCdVcCcsJ0Rvd24nXTtpZihlLmtleT09PSdFbnRlcicmJiFlLmlzQ29tcG9zaW5nKXtpZihlLnRhcmdldCYmX3RoaXMuZ2V0SW5wdXQoKSYmZS50YXJnZXQub3V0ZXJIVE1MPT09X3RoaXMuZ2V0SW5wdXQoKS5vdXRlckhUTUwpe2lmKFsndGV4dGFyZWEnLCdmaWxlJ10uaW5kZXhPZihpbm5lclBhcmFtcy5pbnB1dCkhPT0tMSl7cmV0dXJuO30KY29uc3RydWN0b3IuY2xpY2tDb25maXJtKCk7ZS5wcmV2ZW50RGVmYXVsdCgpO319ZWxzZSBpZihlLmtleT09PSdUYWInKXt2YXIgdGFyZ2V0RWxlbWVudD1lLnRhcmdldDt2YXIgZm9jdXNhYmxlRWxlbWVudHM9Z2V0Rm9jdXNhYmxlRWxlbWVudHMoaW5uZXJQYXJhbXMuZm9jdXNDYW5jZWwpO3ZhciBidG5JbmRleD0tMTtmb3IodmFyIF9pMj0wO19pMjxmb2N1c2FibGVFbGVtZW50cy5sZW5ndGg7X2kyKyspe2lmKHRhcmdldEVsZW1lbnQ9PT1mb2N1c2FibGVFbGVtZW50c1tfaTJdKXtidG5JbmRleD1faTI7YnJlYWs7fX0KaWYoIWUuc2hpZnRLZXkpe3NldEZvY3VzKGJ0bkluZGV4LDEpO31lbHNle3NldEZvY3VzKGJ0bkluZGV4LC0xKTt9CmUuc3RvcFByb3BhZ2F0aW9uKCk7ZS5wcmV2ZW50RGVmYXVsdCgpO31lbHNlIGlmKGFycm93S2V5cy5pbmRleE9mKGUua2V5KSE9PS0xKXtpZihkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09ZG9tQ2FjaGUuY29uZmlybUJ1dHRvbiYmaXNWaXNpYmxlKGRvbUNhY2hlLmNhbmNlbEJ1dHRvbikpe2RvbUNhY2hlLmNhbmNlbEJ1dHRvbi5mb2N1cygpO31lbHNlIGlmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1kb21DYWNoZS5jYW5jZWxCdXR0b24mJmlzVmlzaWJsZShkb21DYWNoZS5jb25maXJtQnV0dG9uKSl7ZG9tQ2FjaGUuY29uZmlybUJ1dHRvbi5mb2N1cygpO319ZWxzZSBpZigoZS5rZXk9PT0nRXNjYXBlJ3x8ZS5rZXk9PT0nRXNjJykmJmNhbGxJZkZ1bmN0aW9uKGlubmVyUGFyYW1zLmFsbG93RXNjYXBlS2V5KT09PXRydWUpe2Rpc21pc3NXaXRoKGNvbnN0cnVjdG9yLkRpc21pc3NSZWFzb24uZXNjKTt9fTtpZihnbG9iYWxTdGF0ZS5rZXlkb3duSGFuZGxlckFkZGVkKXtnbG9iYWxTdGF0ZS5rZXlkb3duVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyLHtjYXB0dXJlOmdsb2JhbFN0YXRlLmtleWRvd25MaXN0ZW5lckNhcHR1cmV9KTtnbG9iYWxTdGF0ZS5rZXlkb3duSGFuZGxlckFkZGVkPWZhbHNlO30KaWYoIWlubmVyUGFyYW1zLnRvYXN0KXtnbG9iYWxTdGF0ZS5rZXlkb3duSGFuZGxlcj1mdW5jdGlvbihlKXtyZXR1cm4ga2V5ZG93bkhhbmRsZXIoZSxpbm5lclBhcmFtcyk7fTtnbG9iYWxTdGF0ZS5rZXlkb3duVGFyZ2V0PWlubmVyUGFyYW1zLmtleWRvd25MaXN0ZW5lckNhcHR1cmU/d2luZG93OmRvbUNhY2hlLnBvcHVwO2dsb2JhbFN0YXRlLmtleWRvd25MaXN0ZW5lckNhcHR1cmU9aW5uZXJQYXJhbXMua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZTtnbG9iYWxTdGF0ZS5rZXlkb3duVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyLHtjYXB0dXJlOmdsb2JhbFN0YXRlLmtleWRvd25MaXN0ZW5lckNhcHR1cmV9KTtnbG9iYWxTdGF0ZS5rZXlkb3duSGFuZGxlckFkZGVkPXRydWU7fQpfdGhpcy5lbmFibGVCdXR0b25zKCk7X3RoaXMuaGlkZUxvYWRpbmcoKTtfdGhpcy5yZXNldFZhbGlkYXRpb25NZXNzYWdlKCk7aWYoaW5uZXJQYXJhbXMudG9hc3QmJihpbm5lclBhcmFtcy5pbnB1dHx8aW5uZXJQYXJhbXMuZm9vdGVyfHxpbm5lclBhcmFtcy5zaG93Q2xvc2VCdXR0b24pKXthZGRDbGFzcyhkb2N1bWVudC5ib2R5LHN3YWxDbGFzc2VzWyd0b2FzdC1jb2x1bW4nXSk7fWVsc2V7cmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSxzd2FsQ2xhc3Nlc1sndG9hc3QtY29sdW1uJ10pO30KdmFyIGlucHV0VHlwZXM9WydpbnB1dCcsJ2ZpbGUnLCdyYW5nZScsJ3NlbGVjdCcsJ3JhZGlvJywnY2hlY2tib3gnLCd0ZXh0YXJlYSddO3ZhciBpbnB1dDtmb3IodmFyIF9pMz0wO19pMzxpbnB1dFR5cGVzLmxlbmd0aDtfaTMrKyl7dmFyIGlucHV0Q2xhc3M9c3dhbENsYXNzZXNbaW5wdXRUeXBlc1tfaTNdXTt2YXIgaW5wdXRDb250YWluZXI9Z2V0Q2hpbGRCeUNsYXNzKGRvbUNhY2hlLmNvbnRlbnQsaW5wdXRDbGFzcyk7aW5wdXQ9X3RoaXMuZ2V0SW5wdXQoaW5wdXRUeXBlc1tfaTNdKTtpZihpbnB1dCl7Zm9yKHZhciBqIGluIGlucHV0LmF0dHJpYnV0ZXMpe2lmKGlucHV0LmF0dHJpYnV0ZXMuaGFzT3duUHJvcGVydHkoaikpe3ZhciBhdHRyTmFtZT1pbnB1dC5hdHRyaWJ1dGVzW2pdLm5hbWU7aWYoYXR0ck5hbWUhPT0ndHlwZScmJmF0dHJOYW1lIT09J3ZhbHVlJyl7aW5wdXQucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTt9fX0KZm9yKHZhciBhdHRyIGluIGlubmVyUGFyYW1zLmlucHV0QXR0cmlidXRlcyl7aW5wdXQuc2V0QXR0cmlidXRlKGF0dHIsaW5uZXJQYXJhbXMuaW5wdXRBdHRyaWJ1dGVzW2F0dHJdKTt9fQppbnB1dENvbnRhaW5lci5jbGFzc05hbWU9aW5wdXRDbGFzcztpZihpbm5lclBhcmFtcy5pbnB1dENsYXNzKXthZGRDbGFzcyhpbnB1dENvbnRhaW5lcixpbm5lclBhcmFtcy5pbnB1dENsYXNzKTt9CmhpZGUoaW5wdXRDb250YWluZXIpO30KdmFyIHBvcHVsYXRlSW5wdXRPcHRpb25zO3N3aXRjaChpbm5lclBhcmFtcy5pbnB1dCl7Y2FzZSAndGV4dCc6Y2FzZSAnZW1haWwnOmNhc2UgJ3Bhc3N3b3JkJzpjYXNlICdudW1iZXInOmNhc2UgJ3RlbCc6Y2FzZSAndXJsJzp7aW5wdXQ9Z2V0Q2hpbGRCeUNsYXNzKGRvbUNhY2hlLmNvbnRlbnQsc3dhbENsYXNzZXMuaW5wdXQpO2lmKHR5cGVvZiBpbm5lclBhcmFtcy5pbnB1dFZhbHVlPT09J3N0cmluZyd8fHR5cGVvZiBpbm5lclBhcmFtcy5pbnB1dFZhbHVlPT09J251bWJlcicpe2lucHV0LnZhbHVlPWlubmVyUGFyYW1zLmlucHV0VmFsdWU7fWVsc2V7d2FybigiVW5leHBlY3RlZCB0eXBlIG9mIGlucHV0VmFsdWUhIEV4cGVjdGVkIFwic3RyaW5nXCIgb3IgXCJudW1iZXJcIiwgZ290IFwiIi5jb25jYXQoX3R5cGVvZihpbm5lclBhcmFtcy5pbnB1dFZhbHVlKSwiXCIiKSk7fQppbnB1dC5wbGFjZWhvbGRlcj1pbm5lclBhcmFtcy5pbnB1dFBsYWNlaG9sZGVyO2lucHV0LnR5cGU9aW5uZXJQYXJhbXMuaW5wdXQ7c2hvdyhpbnB1dCk7YnJlYWs7fQpjYXNlICdmaWxlJzp7aW5wdXQ9Z2V0Q2hpbGRCeUNsYXNzKGRvbUNhY2hlLmNvbnRlbnQsc3dhbENsYXNzZXMuZmlsZSk7aW5wdXQucGxhY2Vob2xkZXI9aW5uZXJQYXJhbXMuaW5wdXRQbGFjZWhvbGRlcjtpbnB1dC50eXBlPWlubmVyUGFyYW1zLmlucHV0O3Nob3coaW5wdXQpO2JyZWFrO30KY2FzZSAncmFuZ2UnOnt2YXIgcmFuZ2U9Z2V0Q2hpbGRCeUNsYXNzKGRvbUNhY2hlLmNvbnRlbnQsc3dhbENsYXNzZXMucmFuZ2UpO3ZhciByYW5nZUlucHV0PXJhbmdlLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7dmFyIHJhbmdlT3V0cHV0PXJhbmdlLnF1ZXJ5U2VsZWN0b3IoJ291dHB1dCcpO3JhbmdlSW5wdXQudmFsdWU9aW5uZXJQYXJhbXMuaW5wdXRWYWx1ZTtyYW5nZUlucHV0LnR5cGU9aW5uZXJQYXJhbXMuaW5wdXQ7cmFuZ2VPdXRwdXQudmFsdWU9aW5uZXJQYXJhbXMuaW5wdXRWYWx1ZTtzaG93KHJhbmdlKTticmVhazt9CmNhc2UgJ3NlbGVjdCc6e3ZhciBzZWxlY3Q9Z2V0Q2hpbGRCeUNsYXNzKGRvbUNhY2hlLmNvbnRlbnQsc3dhbENsYXNzZXMuc2VsZWN0KTtzZWxlY3QuaW5uZXJIVE1MPScnO2lmKGlubmVyUGFyYW1zLmlucHV0UGxhY2Vob2xkZXIpe3ZhciBwbGFjZWhvbGRlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtwbGFjZWhvbGRlci5pbm5lckhUTUw9aW5uZXJQYXJhbXMuaW5wdXRQbGFjZWhvbGRlcjtwbGFjZWhvbGRlci52YWx1ZT0nJztwbGFjZWhvbGRlci5kaXNhYmxlZD10cnVlO3BsYWNlaG9sZGVyLnNlbGVjdGVkPXRydWU7c2VsZWN0LmFwcGVuZENoaWxkKHBsYWNlaG9sZGVyKTt9CnBvcHVsYXRlSW5wdXRPcHRpb25zPWZ1bmN0aW9uIHBvcHVsYXRlSW5wdXRPcHRpb25zKGlucHV0T3B0aW9ucyl7aW5wdXRPcHRpb25zLmZvckVhY2goZnVuY3Rpb24oaW5wdXRPcHRpb24pe3ZhciBvcHRpb25WYWx1ZT1pbnB1dE9wdGlvblswXTt2YXIgb3B0aW9uTGFiZWw9aW5wdXRPcHRpb25bMV07dmFyIG9wdGlvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtvcHRpb24udmFsdWU9b3B0aW9uVmFsdWU7b3B0aW9uLmlubmVySFRNTD1vcHRpb25MYWJlbDtpZihpbm5lclBhcmFtcy5pbnB1dFZhbHVlLnRvU3RyaW5nKCk9PT1vcHRpb25WYWx1ZS50b1N0cmluZygpKXtvcHRpb24uc2VsZWN0ZWQ9dHJ1ZTt9CnNlbGVjdC5hcHBlbmRDaGlsZChvcHRpb24pO30pO3Nob3coc2VsZWN0KTtzZWxlY3QuZm9jdXMoKTt9O2JyZWFrO30KY2FzZSAncmFkaW8nOnt2YXIgcmFkaW89Z2V0Q2hpbGRCeUNsYXNzKGRvbUNhY2hlLmNvbnRlbnQsc3dhbENsYXNzZXMucmFkaW8pO3JhZGlvLmlubmVySFRNTD0nJztwb3B1bGF0ZUlucHV0T3B0aW9ucz1mdW5jdGlvbiBwb3B1bGF0ZUlucHV0T3B0aW9ucyhpbnB1dE9wdGlvbnMpe2lucHV0T3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGlucHV0T3B0aW9uKXt2YXIgcmFkaW9WYWx1ZT1pbnB1dE9wdGlvblswXTt2YXIgcmFkaW9MYWJlbD1pbnB1dE9wdGlvblsxXTt2YXIgcmFkaW9JbnB1dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO3ZhciByYWRpb0xhYmVsRWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO3JhZGlvSW5wdXQudHlwZT0ncmFkaW8nO3JhZGlvSW5wdXQubmFtZT1zd2FsQ2xhc3Nlcy5yYWRpbztyYWRpb0lucHV0LnZhbHVlPXJhZGlvVmFsdWU7aWYoaW5uZXJQYXJhbXMuaW5wdXRWYWx1ZS50b1N0cmluZygpPT09cmFkaW9WYWx1ZS50b1N0cmluZygpKXtyYWRpb0lucHV0LmNoZWNrZWQ9dHJ1ZTt9CnZhciBsYWJlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7bGFiZWwuaW5uZXJIVE1MPXJhZGlvTGFiZWw7bGFiZWwuY2xhc3NOYW1lPXN3YWxDbGFzc2VzLmxhYmVsO3JhZGlvTGFiZWxFbGVtZW50LmFwcGVuZENoaWxkKHJhZGlvSW5wdXQpO3JhZGlvTGFiZWxFbGVtZW50LmFwcGVuZENoaWxkKGxhYmVsKTtyYWRpby5hcHBlbmRDaGlsZChyYWRpb0xhYmVsRWxlbWVudCk7fSk7c2hvdyhyYWRpbyk7dmFyIHJhZGlvcz1yYWRpby5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpO2lmKHJhZGlvcy5sZW5ndGgpe3JhZGlvc1swXS5mb2N1cygpO319O2JyZWFrO30KY2FzZSAnY2hlY2tib3gnOnt2YXIgY2hlY2tib3g9Z2V0Q2hpbGRCeUNsYXNzKGRvbUNhY2hlLmNvbnRlbnQsc3dhbENsYXNzZXMuY2hlY2tib3gpO3ZhciBjaGVja2JveElucHV0PV90aGlzLmdldElucHV0KCdjaGVja2JveCcpO2NoZWNrYm94SW5wdXQudHlwZT0nY2hlY2tib3gnO2NoZWNrYm94SW5wdXQudmFsdWU9MTtjaGVja2JveElucHV0LmlkPXN3YWxDbGFzc2VzLmNoZWNrYm94O2NoZWNrYm94SW5wdXQuY2hlY2tlZD1Cb29sZWFuKGlubmVyUGFyYW1zLmlucHV0VmFsdWUpO3ZhciBsYWJlbD1jaGVja2JveC5xdWVyeVNlbGVjdG9yKCdzcGFuJyk7bGFiZWwuaW5uZXJIVE1MPWlubmVyUGFyYW1zLmlucHV0UGxhY2Vob2xkZXI7c2hvdyhjaGVja2JveCk7YnJlYWs7fQpjYXNlICd0ZXh0YXJlYSc6e3ZhciB0ZXh0YXJlYT1nZXRDaGlsZEJ5Q2xhc3MoZG9tQ2FjaGUuY29udGVudCxzd2FsQ2xhc3Nlcy50ZXh0YXJlYSk7dGV4dGFyZWEudmFsdWU9aW5uZXJQYXJhbXMuaW5wdXRWYWx1ZTt0ZXh0YXJlYS5wbGFjZWhvbGRlcj1pbm5lclBhcmFtcy5pbnB1dFBsYWNlaG9sZGVyO3Nob3codGV4dGFyZWEpO2JyZWFrO30KY2FzZSBudWxsOnticmVhazt9CmRlZmF1bHQ6ZXJyb3IoIlVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dCEgRXhwZWN0ZWQgXCJ0ZXh0XCIsIFwiZW1haWxcIiwgXCJwYXNzd29yZFwiLCBcIm51bWJlclwiLCBcInRlbFwiLCBcInNlbGVjdFwiLCBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiwgXCJ0ZXh0YXJlYVwiLCBcImZpbGVcIiBvciBcInVybFwiLCBnb3QgXCIiLmNvbmNhdChpbm5lclBhcmFtcy5pbnB1dCwiXCIiKSk7YnJlYWs7fQppZihpbm5lclBhcmFtcy5pbnB1dD09PSdzZWxlY3QnfHxpbm5lclBhcmFtcy5pbnB1dD09PSdyYWRpbycpe3ZhciBwcm9jZXNzSW5wdXRPcHRpb25zPWZ1bmN0aW9uIHByb2Nlc3NJbnB1dE9wdGlvbnMoaW5wdXRPcHRpb25zKXtyZXR1cm4gcG9wdWxhdGVJbnB1dE9wdGlvbnMoZm9ybWF0SW5wdXRPcHRpb25zKGlucHV0T3B0aW9ucykpO307aWYoaXNUaGVuYWJsZShpbm5lclBhcmFtcy5pbnB1dE9wdGlvbnMpKXtjb25zdHJ1Y3Rvci5zaG93TG9hZGluZygpO2lubmVyUGFyYW1zLmlucHV0T3B0aW9ucy50aGVuKGZ1bmN0aW9uKGlucHV0T3B0aW9ucyl7X3RoaXMuaGlkZUxvYWRpbmcoKTtwcm9jZXNzSW5wdXRPcHRpb25zKGlucHV0T3B0aW9ucyk7fSk7fWVsc2UgaWYoX3R5cGVvZihpbm5lclBhcmFtcy5pbnB1dE9wdGlvbnMpPT09J29iamVjdCcpe3Byb2Nlc3NJbnB1dE9wdGlvbnMoaW5uZXJQYXJhbXMuaW5wdXRPcHRpb25zKTt9ZWxzZXtlcnJvcigiVW5leHBlY3RlZCB0eXBlIG9mIGlucHV0T3B0aW9ucyEgRXhwZWN0ZWQgb2JqZWN0LCBNYXAgb3IgUHJvbWlzZSwgZ290ICIuY29uY2F0KF90eXBlb2YoaW5uZXJQYXJhbXMuaW5wdXRPcHRpb25zKSkpO319ZWxzZSBpZihbJ3RleHQnLCdlbWFpbCcsJ251bWJlcicsJ3RlbCcsJ3RleHRhcmVhJ10uaW5kZXhPZihpbm5lclBhcmFtcy5pbnB1dCkhPT0tMSYmaXNUaGVuYWJsZShpbm5lclBhcmFtcy5pbnB1dFZhbHVlKSl7Y29uc3RydWN0b3Iuc2hvd0xvYWRpbmcoKTtoaWRlKGlucHV0KTtpbm5lclBhcmFtcy5pbnB1dFZhbHVlLnRoZW4oZnVuY3Rpb24oaW5wdXRWYWx1ZSl7aW5wdXQudmFsdWU9aW5uZXJQYXJhbXMuaW5wdXQ9PT0nbnVtYmVyJz9wYXJzZUZsb2F0KGlucHV0VmFsdWUpfHwwOmlucHV0VmFsdWUrJyc7c2hvdyhpbnB1dCk7aW5wdXQuZm9jdXMoKTtfdGhpcy5oaWRlTG9hZGluZygpO30pLmNhdGNoKGZ1bmN0aW9uKGVycil7ZXJyb3IoJ0Vycm9yIGluIGlucHV0VmFsdWUgcHJvbWlzZTogJytlcnIpO2lucHV0LnZhbHVlPScnO3Nob3coaW5wdXQpO2lucHV0LmZvY3VzKCk7X3RoaXMuaGlkZUxvYWRpbmcoKTt9KTt9Cm9wZW5Qb3B1cChpbm5lclBhcmFtcyk7aWYoIWlubmVyUGFyYW1zLnRvYXN0KXtpZighY2FsbElmRnVuY3Rpb24oaW5uZXJQYXJhbXMuYWxsb3dFbnRlcktleSkpe2lmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpe2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpO319ZWxzZSBpZihpbm5lclBhcmFtcy5mb2N1c0NhbmNlbCYmaXNWaXNpYmxlKGRvbUNhY2hlLmNhbmNlbEJ1dHRvbikpe2RvbUNhY2hlLmNhbmNlbEJ1dHRvbi5mb2N1cygpO31lbHNlIGlmKGlubmVyUGFyYW1zLmZvY3VzQ29uZmlybSYmaXNWaXNpYmxlKGRvbUNhY2hlLmNvbmZpcm1CdXR0b24pKXtkb21DYWNoZS5jb25maXJtQnV0dG9uLmZvY3VzKCk7fWVsc2V7c2V0Rm9jdXMoLTEsMSk7fX0KZG9tQ2FjaGUuY29udGFpbmVyLnNjcm9sbFRvcD0wO30pO30KdmFyIGluc3RhbmNlTWV0aG9kcz1PYmplY3QuZnJlZXplKHtoaWRlTG9hZGluZzpoaWRlTG9hZGluZyxkaXNhYmxlTG9hZGluZzpoaWRlTG9hZGluZyxnZXRJbnB1dDpnZXRJbnB1dCxlbmFibGVCdXR0b25zOmVuYWJsZUJ1dHRvbnMsZGlzYWJsZUJ1dHRvbnM6ZGlzYWJsZUJ1dHRvbnMsZW5hYmxlQ29uZmlybUJ1dHRvbjplbmFibGVDb25maXJtQnV0dG9uLGRpc2FibGVDb25maXJtQnV0dG9uOmRpc2FibGVDb25maXJtQnV0dG9uLGVuYWJsZUlucHV0OmVuYWJsZUlucHV0LGRpc2FibGVJbnB1dDpkaXNhYmxlSW5wdXQsc2hvd1ZhbGlkYXRpb25NZXNzYWdlOnNob3dWYWxpZGF0aW9uTWVzc2FnZSxyZXNldFZhbGlkYXRpb25NZXNzYWdlOnJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UscmVzZXRWYWxpZGF0aW9uRXJyb3I6cmVzZXRWYWxpZGF0aW9uRXJyb3Isc2hvd1ZhbGlkYXRpb25FcnJvcjpzaG93VmFsaWRhdGlvbkVycm9yLGdldFByb2dyZXNzU3RlcHM6Z2V0UHJvZ3Jlc3NTdGVwcyQxLHNldFByb2dyZXNzU3RlcHM6c2V0UHJvZ3Jlc3NTdGVwcyxzaG93UHJvZ3Jlc3NTdGVwczpzaG93UHJvZ3Jlc3NTdGVwcyxoaWRlUHJvZ3Jlc3NTdGVwczpoaWRlUHJvZ3Jlc3NTdGVwcyxfbWFpbjpfbWFpbn0pO3ZhciBjdXJyZW50SW5zdGFuY2U7ZnVuY3Rpb24gU3dlZXRBbGVydCgpe2lmKHR5cGVvZiB3aW5kb3c9PT0ndW5kZWZpbmVkJyl7cmV0dXJuO30KaWYodHlwZW9mIFByb21pc2U9PT0ndW5kZWZpbmVkJyl7ZXJyb3IoJ1RoaXMgcGFja2FnZSByZXF1aXJlcyBhIFByb21pc2UgbGlicmFyeSwgcGxlYXNlIGluY2x1ZGUgYSBzaGltIHRvIGVuYWJsZSBpdCBpbiB0aGlzIGJyb3dzZXIgKFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3N3ZWV0YWxlcnQyL3N3ZWV0YWxlcnQyL3dpa2kvTWlncmF0aW9uLWZyb20tU3dlZXRBbGVydC10by1Td2VldEFsZXJ0MiMxLWllLXN1cHBvcnQpJyk7fQpmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPW5ldyBBcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKyl7YXJnc1tfa2V5XT1hcmd1bWVudHNbX2tleV07fQppZihhcmdzLmxlbmd0aD09PTApe2Vycm9yKCdBdCBsZWFzdCAxIGFyZ3VtZW50IGlzIGV4cGVjdGVkIScpO3JldHVybiBmYWxzZTt9CmN1cnJlbnRJbnN0YW5jZT10aGlzO3ZhciBvdXRlclBhcmFtcz1PYmplY3QuZnJlZXplKHRoaXMuY29uc3RydWN0b3IuYXJnc1RvUGFyYW1zKGFyZ3MpKTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwYXJhbXM6e3ZhbHVlOm91dGVyUGFyYW1zLHdyaXRhYmxlOmZhbHNlLGVudW1lcmFibGU6dHJ1ZX19KTt2YXIgcHJvbWlzZT10aGlzLl9tYWluKHRoaXMucGFyYW1zKTtwcml2YXRlUHJvcHMucHJvbWlzZS5zZXQodGhpcyxwcm9taXNlKTt9ClN3ZWV0QWxlcnQucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24ob25GdWxmaWxsZWQsb25SZWplY3RlZCl7dmFyIHByb21pc2U9cHJpdmF0ZVByb3BzLnByb21pc2UuZ2V0KHRoaXMpO3JldHVybiBwcm9taXNlLnRoZW4ob25GdWxmaWxsZWQsb25SZWplY3RlZCk7fTtTd2VldEFsZXJ0LnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihvblJlamVjdGVkKXt2YXIgcHJvbWlzZT1wcml2YXRlUHJvcHMucHJvbWlzZS5nZXQodGhpcyk7cmV0dXJuIHByb21pc2UuY2F0Y2gob25SZWplY3RlZCk7fTtTd2VldEFsZXJ0LnByb3RvdHlwZS5maW5hbGx5PWZ1bmN0aW9uKG9uRmluYWxseSl7dmFyIHByb21pc2U9cHJpdmF0ZVByb3BzLnByb21pc2UuZ2V0KHRoaXMpO3JldHVybiBwcm9taXNlLmZpbmFsbHkob25GaW5hbGx5KTt9O19leHRlbmRzKFN3ZWV0QWxlcnQucHJvdG90eXBlLGluc3RhbmNlTWV0aG9kcyk7X2V4dGVuZHMoU3dlZXRBbGVydCxzdGF0aWNNZXRob2RzKTtPYmplY3Qua2V5cyhpbnN0YW5jZU1ldGhvZHMpLmZvckVhY2goZnVuY3Rpb24oa2V5KXtTd2VldEFsZXJ0W2tleV09ZnVuY3Rpb24oKXtpZihjdXJyZW50SW5zdGFuY2Upe3ZhciBfY3VycmVudEluc3RhbmNlO3JldHVybihfY3VycmVudEluc3RhbmNlPWN1cnJlbnRJbnN0YW5jZSlba2V5XS5hcHBseShfY3VycmVudEluc3RhbmNlLGFyZ3VtZW50cyk7fX07fSk7U3dlZXRBbGVydC5EaXNtaXNzUmVhc29uPURpc21pc3NSZWFzb247U3dlZXRBbGVydC5ub29wPWZ1bmN0aW9uKCl7fTt2YXIgU3dhbD13aXRoTm9OZXdLZXl3b3JkKHdpdGhHbG9iYWxEZWZhdWx0cyhTd2VldEFsZXJ0KSk7U3dhbC5kZWZhdWx0PVN3YWw7cmV0dXJuIFN3YWw7fSkpKTtpZih0eXBlb2Ygd2luZG93IT09J3VuZGVmaW5lZCcmJndpbmRvdy5Td2VldGFsZXJ0Mil7d2luZG93LlN3ZWV0YWxlcnQyLnZlcnNpb249JzcuMjguNSc7d2luZG93LnN3YWw9d2luZG93LnN3ZWV0QWxlcnQ9d2luZG93LlN3YWw9d2luZG93LlN3ZWV0QWxlcnQ9d2luZG93LlN3ZWV0YWxlcnQyfQoidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZmdW5jdGlvbihlLHQpe3ZhciBuPWUuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtpZihlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQobiksbi5zdHlsZVNoZWV0KW4uc3R5bGVTaGVldC5kaXNhYmxlZHx8KG4uc3R5bGVTaGVldC5jc3NUZXh0PXQpO2Vsc2UgdHJ5e24uaW5uZXJIVE1MPXR9Y2F0Y2goZSl7bi5pbm5lclRleHQ9dH19KGRvY3VtZW50LCJALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItc2hvdyB7XG4iKwoiICAwJSB7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjcpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC43KTsgfVxuIisKIiAgNDUlIHtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMDUpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wNSk7IH1cbiIrCiIgIDgwJSB7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjk1KTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTUpOyB9XG4iKwoiICAxMDAlIHtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7IH0gfVxuIisKIlxuIisKIkBrZXlmcmFtZXMgc3dhbDItc2hvdyB7XG4iKwoiICAwJSB7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjcpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC43KTsgfVxuIisKIiAgNDUlIHtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMDUpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wNSk7IH1cbiIrCiIgIDgwJSB7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjk1KTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOTUpOyB9XG4iKwoiICAxMDAlIHtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7IH0gfVxuIisKIlxuIisKIkAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1oaWRlIHtcbiIrCiIgIDAlIHtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4iKwoiICAgIG9wYWNpdHk6IDE7IH1cbiIrCiIgIDEwMCUge1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC41KTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNSk7XG4iKwoiICAgIG9wYWNpdHk6IDA7IH0gfVxuIisKIlxuIisKIkBrZXlmcmFtZXMgc3dhbDItaGlkZSB7XG4iKwoiICAwJSB7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuIisKIiAgICBvcGFjaXR5OiAxOyB9XG4iKwoiICAxMDAlIHtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNSk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjUpO1xuIisKIiAgICBvcGFjaXR5OiAwOyB9IH1cbiIrCiJcbiIrCiJALXdlYmtpdC1rZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwIHtcbiIrCiIgIDAlIHtcbiIrCiIgICAgdG9wOiAxLjE4NzVlbTtcbiIrCiIgICAgbGVmdDogLjA2MjVlbTtcbiIrCiIgICAgd2lkdGg6IDA7IH1cbiIrCiIgIDU0JSB7XG4iKwoiICAgIHRvcDogMS4wNjI1ZW07XG4iKwoiICAgIGxlZnQ6IC4xMjVlbTtcbiIrCiIgICAgd2lkdGg6IDA7IH1cbiIrCiIgIDcwJSB7XG4iKwoiICAgIHRvcDogMi4xODc1ZW07XG4iKwoiICAgIGxlZnQ6IC0uMzc1ZW07XG4iKwoiICAgIHdpZHRoOiAzLjEyNWVtOyB9XG4iKwoiICA4NCUge1xuIisKIiAgICB0b3A6IDNlbTtcbiIrCiIgICAgbGVmdDogMS4zMTI1ZW07XG4iKwoiICAgIHdpZHRoOiAxLjA2MjVlbTsgfVxuIisKIiAgMTAwJSB7XG4iKwoiICAgIHRvcDogMi44MTI1ZW07XG4iKwoiICAgIGxlZnQ6IC44NzVlbTtcbiIrCiIgICAgd2lkdGg6IDEuNTYyNWVtOyB9IH1cbiIrCiJcbiIrCiJAa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcCB7XG4iKwoiICAwJSB7XG4iKwoiICAgIHRvcDogMS4xODc1ZW07XG4iKwoiICAgIGxlZnQ6IC4wNjI1ZW07XG4iKwoiICAgIHdpZHRoOiAwOyB9XG4iKwoiICA1NCUge1xuIisKIiAgICB0b3A6IDEuMDYyNWVtO1xuIisKIiAgICBsZWZ0OiAuMTI1ZW07XG4iKwoiICAgIHdpZHRoOiAwOyB9XG4iKwoiICA3MCUge1xuIisKIiAgICB0b3A6IDIuMTg3NWVtO1xuIisKIiAgICBsZWZ0OiAtLjM3NWVtO1xuIisKIiAgICB3aWR0aDogMy4xMjVlbTsgfVxuIisKIiAgODQlIHtcbiIrCiIgICAgdG9wOiAzZW07XG4iKwoiICAgIGxlZnQ6IDEuMzEyNWVtO1xuIisKIiAgICB3aWR0aDogMS4wNjI1ZW07IH1cbiIrCiIgIDEwMCUge1xuIisKIiAgICB0b3A6IDIuODEyNWVtO1xuIisKIiAgICBsZWZ0OiAuODc1ZW07XG4iKwoiICAgIHdpZHRoOiAxLjU2MjVlbTsgfSB9XG4iKwoiXG4iKwoiQC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcge1xuIisKIiAgMCUge1xuIisKIiAgICB0b3A6IDMuMzc1ZW07XG4iKwoiICAgIHJpZ2h0OiAyLjg3NWVtO1xuIisKIiAgICB3aWR0aDogMDsgfVxuIisKIiAgNjUlIHtcbiIrCiIgICAgdG9wOiAzLjM3NWVtO1xuIisKIiAgICByaWdodDogMi44NzVlbTtcbiIrCiIgICAgd2lkdGg6IDA7IH1cbiIrCiIgIDg0JSB7XG4iKwoiICAgIHRvcDogMi4xODc1ZW07XG4iKwoiICAgIHJpZ2h0OiAwO1xuIisKIiAgICB3aWR0aDogMy40Mzc1ZW07IH1cbiIrCiIgIDEwMCUge1xuIisKIiAgICB0b3A6IDIuMzc1ZW07XG4iKwoiICAgIHJpZ2h0OiAuNWVtO1xuIisKIiAgICB3aWR0aDogMi45Mzc1ZW07IH0gfVxuIisKIlxuIisKIkBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZyB7XG4iKwoiICAwJSB7XG4iKwoiICAgIHRvcDogMy4zNzVlbTtcbiIrCiIgICAgcmlnaHQ6IDIuODc1ZW07XG4iKwoiICAgIHdpZHRoOiAwOyB9XG4iKwoiICA2NSUge1xuIisKIiAgICB0b3A6IDMuMzc1ZW07XG4iKwoiICAgIHJpZ2h0OiAyLjg3NWVtO1xuIisKIiAgICB3aWR0aDogMDsgfVxuIisKIiAgODQlIHtcbiIrCiIgICAgdG9wOiAyLjE4NzVlbTtcbiIrCiIgICAgcmlnaHQ6IDA7XG4iKwoiICAgIHdpZHRoOiAzLjQzNzVlbTsgfVxuIisKIiAgMTAwJSB7XG4iKwoiICAgIHRvcDogMi4zNzVlbTtcbiIrCiIgICAgcmlnaHQ6IC41ZW07XG4iKwoiICAgIHdpZHRoOiAyLjkzNzVlbTsgfSB9XG4iKwoiXG4iKwoiQC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1zdWNjZXNzLWNpcmN1bGFyLWxpbmUge1xuIisKIiAgMCUge1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC00NWRlZyk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTsgfVxuIisKIiAgNSUge1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC00NWRlZyk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTsgfVxuIisKIiAgMTIlIHtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDA1ZGVnKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDA1ZGVnKTsgfVxuIisKIiAgMTAwJSB7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQwNWRlZyk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQwNWRlZyk7IH0gfVxuIisKIlxuIisKIkBrZXlmcmFtZXMgc3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZSB7XG4iKwoiICAwJSB7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpOyB9XG4iKwoiICA1JSB7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpOyB9XG4iKwoiICAxMiUge1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC00MDVkZWcpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC00MDVkZWcpOyB9XG4iKwoiICAxMDAlIHtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDA1ZGVnKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDA1ZGVnKTsgfSB9XG4iKwoiXG4iKwoiQC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3IteC1tYXJrIHtcbiIrCiIgIDAlIHtcbiIrCiIgICAgbWFyZ2luLXRvcDogMS42MjVlbTtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNCk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjQpO1xuIisKIiAgICBvcGFjaXR5OiAwOyB9XG4iKwoiICA1MCUge1xuIisKIiAgICBtYXJnaW4tdG9wOiAxLjYyNWVtO1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC40KTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNCk7XG4iKwoiICAgIG9wYWNpdHk6IDA7IH1cbiIrCiIgIDgwJSB7XG4iKwoiICAgIG1hcmdpbi10b3A6IC0uMzc1ZW07XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjE1KTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMTUpOyB9XG4iKwoiICAxMDAlIHtcbiIrCiIgICAgbWFyZ2luLXRvcDogMDtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4iKwoiICAgIG9wYWNpdHk6IDE7IH0gfVxuIisKIlxuIisKIkBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmsge1xuIisKIiAgMCUge1xuIisKIiAgICBtYXJnaW4tdG9wOiAxLjYyNWVtO1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC40KTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNCk7XG4iKwoiICAgIG9wYWNpdHk6IDA7IH1cbiIrCiIgIDUwJSB7XG4iKwoiICAgIG1hcmdpbi10b3A6IDEuNjI1ZW07XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjQpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC40KTtcbiIrCiIgICAgb3BhY2l0eTogMDsgfVxuIisKIiAgODAlIHtcbiIrCiIgICAgbWFyZ2luLXRvcDogLS4zNzVlbTtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMTUpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xNSk7IH1cbiIrCiIgIDEwMCUge1xuIisKIiAgICBtYXJnaW4tdG9wOiAwO1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTtcbiIrCiIgICAgb3BhY2l0eTogMTsgfSB9XG4iKwoiXG4iKwoiQC13ZWJraXQta2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiB7XG4iKwoiICAwJSB7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGVYKDEwMGRlZyk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGVYKDEwMGRlZyk7XG4iKwoiICAgIG9wYWNpdHk6IDA7IH1cbiIrCiIgIDEwMCUge1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlWCgwZGVnKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZVgoMGRlZyk7XG4iKwoiICAgIG9wYWNpdHk6IDE7IH0gfVxuIisKIlxuIisKIkBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1lcnJvci1pY29uIHtcbiIrCiIgIDAlIHtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZVgoMTAwZGVnKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTAwZGVnKTtcbiIrCiIgICAgb3BhY2l0eTogMDsgfVxuIisKIiAgMTAwJSB7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGVYKDBkZWcpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlWCgwZGVnKTtcbiIrCiIgICAgb3BhY2l0eTogMTsgfSB9XG4iKwoiXG4iKwoiYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyIHtcbiIrCiIgIHBvc2l0aW9uOiBmaXhlZDtcbiIrCiIgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyB9XG4iKwoiICBib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItc2hvd24ge1xuIisKIiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgfVxuIisKIiAgYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcCB7XG4iKwoiICAgIHRvcDogMDtcbiIrCiIgICAgcmlnaHQ6IGF1dG87XG4iKwoiICAgIGJvdHRvbTogYXV0bztcbiIrCiIgICAgbGVmdDogNTAlO1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7IH1cbiIrCiIgIGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtZW5kLCBib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXJpZ2h0IHtcbiIrCiIgICAgdG9wOiAwO1xuIisKIiAgICByaWdodDogMDtcbiIrCiIgICAgYm90dG9tOiBhdXRvO1xuIisKIiAgICBsZWZ0OiBhdXRvOyB9XG4iKwoiICBib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0LCBib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLWxlZnQge1xuIisKIiAgICB0b3A6IDA7XG4iKwoiICAgIHJpZ2h0OiBhdXRvO1xuIisKIiAgICBib3R0b206IGF1dG87XG4iKwoiICAgIGxlZnQ6IDA7IH1cbiIrCiIgIGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItc3RhcnQsIGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItbGVmdCB7XG4iKwoiICAgIHRvcDogNTAlO1xuIisKIiAgICByaWdodDogYXV0bztcbiIrCiIgICAgYm90dG9tOiBhdXRvO1xuIisKIiAgICBsZWZ0OiAwO1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7IH1cbiIrCiIgIGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXIge1xuIisKIiAgICB0b3A6IDUwJTtcbiIrCiIgICAgcmlnaHQ6IGF1dG87XG4iKwoiICAgIGJvdHRvbTogYXV0bztcbiIrCiIgICAgbGVmdDogNTAlO1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOyB9XG4iKwoiICBib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWVuZCwgYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1yaWdodCB7XG4iKwoiICAgIHRvcDogNTAlO1xuIisKIiAgICByaWdodDogMDtcbiIrCiIgICAgYm90dG9tOiBhdXRvO1xuIisKIiAgICBsZWZ0OiBhdXRvO1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7IH1cbiIrCiIgIGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tc3RhcnQsIGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tbGVmdCB7XG4iKwoiICAgIHRvcDogYXV0bztcbiIrCiIgICAgcmlnaHQ6IGF1dG87XG4iKwoiICAgIGJvdHRvbTogMDtcbiIrCiIgICAgbGVmdDogMDsgfVxuIisKIiAgYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbSB7XG4iKwoiICAgIHRvcDogYXV0bztcbiIrCiIgICAgcmlnaHQ6IGF1dG87XG4iKwoiICAgIGJvdHRvbTogMDtcbiIrCiIgICAgbGVmdDogNTAlO1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7IH1cbiIrCiIgIGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kLCBib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXJpZ2h0IHtcbiIrCiIgICAgdG9wOiBhdXRvO1xuIisKIiAgICByaWdodDogMDtcbiIrCiIgICAgYm90dG9tOiAwO1xuIisKIiAgICBsZWZ0OiBhdXRvOyB9XG4iKwoiXG4iKwoiYm9keS5zd2FsMi10b2FzdC1jb2x1bW4gLnN3YWwyLXRvYXN0IHtcbiIrCiIgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4iKwoiICBhbGlnbi1pdGVtczogc3RyZXRjaDsgfVxuIisKIiAgYm9keS5zd2FsMi10b2FzdC1jb2x1bW4gLnN3YWwyLXRvYXN0IC5zd2FsMi1hY3Rpb25zIHtcbiIrCiIgICAgZmxleDogMTtcbiIrCiIgICAgYWxpZ24tc2VsZjogc3RyZXRjaDtcbiIrCiIgICAgaGVpZ2h0OiAyLjJlbTtcbiIrCiIgICAgbWFyZ2luLXRvcDogLjMxMjVlbTsgfVxuIisKIiAgYm9keS5zd2FsMi10b2FzdC1jb2x1bW4gLnN3YWwyLXRvYXN0IC5zd2FsMi1sb2FkaW5nIHtcbiIrCiIgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IH1cbiIrCiIgIGJvZHkuc3dhbDItdG9hc3QtY29sdW1uIC5zd2FsMi10b2FzdCAuc3dhbDItaW5wdXQge1xuIisKIiAgICBoZWlnaHQ6IDJlbTtcbiIrCiIgICAgbWFyZ2luOiAuMzEyNWVtIGF1dG87XG4iKwoiICAgIGZvbnQtc2l6ZTogMWVtOyB9XG4iKwoiICBib2R5LnN3YWwyLXRvYXN0LWNvbHVtbiAuc3dhbDItdG9hc3QgLnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZSB7XG4iKwoiICAgIGZvbnQtc2l6ZTogMWVtOyB9XG4iKwoiXG4iKwoiLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IHtcbiIrCiIgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4iKwoiICBhbGlnbi1pdGVtczogY2VudGVyO1xuIisKIiAgd2lkdGg6IGF1dG87XG4iKwoiICBwYWRkaW5nOiAwLjYyNWVtO1xuIisKIiAgYm94LXNoYWRvdzogMCAwIDAuNjI1ZW0gI2Q5ZDlkOTtcbiIrCiIgIG92ZXJmbG93LXk6IGhpZGRlbjsgfVxuIisKIiAgLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1oZWFkZXIge1xuIisKIiAgICBmbGV4LWRpcmVjdGlvbjogcm93OyB9XG4iKwoiICAuc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXRpdGxlIHtcbiIrCiIgICAgZmxleC1ncm93OiAxO1xuIisKIiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4iKwoiICAgIG1hcmdpbjogMCAuNmVtO1xuIisKIiAgICBmb250LXNpemU6IDFlbTsgfVxuIisKIiAgLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1mb290ZXIge1xuIisKIiAgICBtYXJnaW46IDAuNWVtIDAgMDtcbiIrCiIgICAgcGFkZGluZzogMC41ZW0gMCAwO1xuIisKIiAgICBmb250LXNpemU6IDAuOGVtOyB9XG4iKwoiICAuc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWNsb3NlIHtcbiIrCiIgICAgcG9zaXRpb246IGluaXRpYWw7XG4iKwoiICAgIHdpZHRoOiAwLjhlbTtcbiIrCiIgICAgaGVpZ2h0OiAwLjhlbTtcbiIrCiIgICAgbGluZS1oZWlnaHQ6IDAuODsgfVxuIisKIiAgLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1jb250ZW50IHtcbiIrCiIgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuIisKIiAgICBmb250LXNpemU6IDFlbTsgfVxuIisKIiAgLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uIHtcbiIrCiIgICAgd2lkdGg6IDJlbTtcbiIrCiIgICAgbWluLXdpZHRoOiAyZW07XG4iKwoiICAgIGhlaWdodDogMmVtO1xuIisKIiAgICBtYXJnaW46IDA7IH1cbiIrCiIgICAgLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uLXRleHQge1xuIisKIiAgICAgIGZvbnQtc2l6ZTogMmVtO1xuIisKIiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuIisKIiAgICAgIGxpbmUtaGVpZ2h0OiAxZW07IH1cbiIrCiIgICAgLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtcmluZyB7XG4iKwoiICAgICAgd2lkdGg6IDJlbTtcbiIrCiIgICAgICBoZWlnaHQ6IDJlbTsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj0nc3dhbDIteC1tYXJrLWxpbmUnXSB7XG4iKwoiICAgICAgdG9wOiAuODc1ZW07XG4iKwoiICAgICAgd2lkdGg6IDEuMzc1ZW07IH1cbiIrCiIgICAgICAuc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj0nc3dhbDIteC1tYXJrLWxpbmUnXVtjbGFzcyQ9J2xlZnQnXSB7XG4iKwoiICAgICAgICBsZWZ0OiAuMzEyNWVtOyB9XG4iKwoiICAgICAgLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uLnN3YWwyLWVycm9yIFtjbGFzc149J3N3YWwyLXgtbWFyay1saW5lJ11bY2xhc3MkPSdyaWdodCddIHtcbiIrCiIgICAgICAgIHJpZ2h0OiAuMzEyNWVtOyB9XG4iKwoiICAuc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWFjdGlvbnMge1xuIisKIiAgICBoZWlnaHQ6IGF1dG87XG4iKwoiICAgIG1hcmdpbjogMCAuMzEyNWVtOyB9XG4iKwoiICAuc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN0eWxlZCB7XG4iKwoiICAgIG1hcmdpbjogMCAuMzEyNWVtO1xuIisKIiAgICBwYWRkaW5nOiAuMzEyNWVtIC42MjVlbTtcbiIrCiIgICAgZm9udC1zaXplOiAxZW07IH1cbiIrCiIgICAgLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdHlsZWQ6Zm9jdXMge1xuIisKIiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDAuMDYyNWVtICNmZmYsIDAgMCAwIDAuMTI1ZW0gcmdiYSg1MCwgMTAwLCAxNTAsIDAuNCk7IH1cbiIrCiIgIC5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyB7XG4iKwoiICAgIGJvcmRlci1jb2xvcjogI2E1ZGM4NjsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj0nc3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lJ10ge1xuIisKIiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIrCiIgICAgICB3aWR0aDogMmVtO1xuIisKIiAgICAgIGhlaWdodDogMi44MTI1ZW07XG4iKwoiICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XG4iKwoiICAgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XG4iKwoiICAgICAgYm9yZGVyLXJhZGl1czogNTAlOyB9XG4iKwoiICAgICAgLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149J3N3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZSddW2NsYXNzJD0nbGVmdCddIHtcbiIrCiIgICAgICAgIHRvcDogLS4yNWVtO1xuIisKIiAgICAgICAgbGVmdDogLS45Mzc1ZW07XG4iKwoiICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC00NWRlZyk7XG4iKwoiICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC00NWRlZyk7XG4iKwoiICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IDJlbSAyZW07XG4iKwoiICAgICAgICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDJlbSAyZW07XG4iKwoiICAgICAgICBib3JkZXItcmFkaXVzOiA0ZW0gMCAwIDRlbTsgfVxuIisKIiAgICAgIC5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePSdzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUnXVtjbGFzcyQ9J3JpZ2h0J10ge1xuIisKIiAgICAgICAgdG9wOiAtLjI1ZW07XG4iKwoiICAgICAgICBsZWZ0OiAuOTM3NWVtO1xuIisKIiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiAwIDJlbTtcbiIrCiIgICAgICAgICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogMCAyZW07XG4iKwoiICAgICAgICBib3JkZXItcmFkaXVzOiAwIDRlbSA0ZW0gMDsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtcmluZyB7XG4iKwoiICAgICAgd2lkdGg6IDJlbTtcbiIrCiIgICAgICBoZWlnaHQ6IDJlbTsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtZml4IHtcbiIrCiIgICAgICB0b3A6IDA7XG4iKwoiICAgICAgbGVmdDogLjQzNzVlbTtcbiIrCiIgICAgICB3aWR0aDogLjQzNzVlbTtcbiIrCiIgICAgICBoZWlnaHQ6IDIuNjg3NWVtOyB9XG4iKwoiICAgIC5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePSdzd2FsMi1zdWNjZXNzLWxpbmUnXSB7XG4iKwoiICAgICAgaGVpZ2h0OiAuMzEyNWVtOyB9XG4iKwoiICAgICAgLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149J3N3YWwyLXN1Y2Nlc3MtbGluZSddW2NsYXNzJD0ndGlwJ10ge1xuIisKIiAgICAgICAgdG9wOiAxLjEyNWVtO1xuIisKIiAgICAgICAgbGVmdDogLjE4NzVlbTtcbiIrCiIgICAgICAgIHdpZHRoOiAuNzVlbTsgfVxuIisKIiAgICAgIC5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePSdzd2FsMi1zdWNjZXNzLWxpbmUnXVtjbGFzcyQ9J2xvbmcnXSB7XG4iKwoiICAgICAgICB0b3A6IC45Mzc1ZW07XG4iKwoiICAgICAgICByaWdodDogLjE4NzVlbTtcbiIrCiIgICAgICAgIHdpZHRoOiAxLjM3NWVtOyB9XG4iKwoiICAuc3dhbDItcG9wdXAuc3dhbDItdG9hc3Quc3dhbDItc2hvdyB7XG4iKwoiICAgIC13ZWJraXQtYW5pbWF0aW9uOiBzaG93U3dlZXRUb2FzdCAuNXM7XG4iKwoiICAgICAgICAgICAgYW5pbWF0aW9uOiBzaG93U3dlZXRUb2FzdCAuNXM7IH1cbiIrCiIgIC5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdC5zd2FsMi1oaWRlIHtcbiIrCiIgICAgLXdlYmtpdC1hbmltYXRpb246IGhpZGVTd2VldFRvYXN0IC4ycyBmb3J3YXJkcztcbiIrCiIgICAgICAgICAgICBhbmltYXRpb246IGhpZGVTd2VldFRvYXN0IC4ycyBmb3J3YXJkczsgfVxuIisKIiAgLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1hbmltYXRlLXN1Y2Nlc3MtaWNvbiAuc3dhbDItc3VjY2Vzcy1saW5lLXRpcCB7XG4iKwoiICAgIC13ZWJraXQtYW5pbWF0aW9uOiBhbmltYXRlLXRvYXN0LXN1Y2Nlc3MtdGlwIC43NXM7XG4iKwoiICAgICAgICAgICAgYW5pbWF0aW9uOiBhbmltYXRlLXRvYXN0LXN1Y2Nlc3MtdGlwIC43NXM7IH1cbiIrCiIgIC5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWljb24gLnN3YWwyLXN1Y2Nlc3MtbGluZS1sb25nIHtcbiIrCiIgICAgLXdlYmtpdC1hbmltYXRpb246IGFuaW1hdGUtdG9hc3Qtc3VjY2Vzcy1sb25nIC43NXM7XG4iKwoiICAgICAgICAgICAgYW5pbWF0aW9uOiBhbmltYXRlLXRvYXN0LXN1Y2Nlc3MtbG9uZyAuNzVzOyB9XG4iKwoiXG4iKwoiQC13ZWJraXQta2V5ZnJhbWVzIHNob3dTd2VldFRvYXN0IHtcbiIrCiIgIDAlIHtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTAuNjI1ZW0pIHJvdGF0ZVooMmRlZyk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0wLjYyNWVtKSByb3RhdGVaKDJkZWcpO1xuIisKIiAgICBvcGFjaXR5OiAwOyB9XG4iKwoiICAzMyUge1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSByb3RhdGVaKC0yZGVnKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCkgcm90YXRlWigtMmRlZyk7XG4iKwoiICAgIG9wYWNpdHk6IC41OyB9XG4iKwoiICA2NiUge1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwLjMxMjVlbSkgcm90YXRlWigyZGVnKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMC4zMTI1ZW0pIHJvdGF0ZVooMmRlZyk7XG4iKwoiICAgIG9wYWNpdHk6IC43OyB9XG4iKwoiICAxMDAlIHtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCkgcm90YXRlWigwKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCkgcm90YXRlWigwKTtcbiIrCiIgICAgb3BhY2l0eTogMTsgfSB9XG4iKwoiXG4iKwoiQGtleWZyYW1lcyBzaG93U3dlZXRUb2FzdCB7XG4iKwoiICAwJSB7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0wLjYyNWVtKSByb3RhdGVaKDJkZWcpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMC42MjVlbSkgcm90YXRlWigyZGVnKTtcbiIrCiIgICAgb3BhY2l0eTogMDsgfVxuIisKIiAgMzMlIHtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCkgcm90YXRlWigtMmRlZyk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHJvdGF0ZVooLTJkZWcpO1xuIisKIiAgICBvcGFjaXR5OiAuNTsgfVxuIisKIiAgNjYlIHtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMC4zMTI1ZW0pIHJvdGF0ZVooMmRlZyk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDAuMzEyNWVtKSByb3RhdGVaKDJkZWcpO1xuIisKIiAgICBvcGFjaXR5OiAuNzsgfVxuIisKIiAgMTAwJSB7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHJvdGF0ZVooMCk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHJvdGF0ZVooMCk7XG4iKwoiICAgIG9wYWNpdHk6IDE7IH0gfVxuIisKIlxuIisKIkAtd2Via2l0LWtleWZyYW1lcyBoaWRlU3dlZXRUb2FzdCB7XG4iKwoiICAwJSB7XG4iKwoiICAgIG9wYWNpdHk6IDE7IH1cbiIrCiIgIDMzJSB7XG4iKwoiICAgIG9wYWNpdHk6IC41OyB9XG4iKwoiICAxMDAlIHtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZVooMWRlZyk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGVaKDFkZWcpO1xuIisKIiAgICBvcGFjaXR5OiAwOyB9IH1cbiIrCiJcbiIrCiJAa2V5ZnJhbWVzIGhpZGVTd2VldFRvYXN0IHtcbiIrCiIgIDAlIHtcbiIrCiIgICAgb3BhY2l0eTogMTsgfVxuIisKIiAgMzMlIHtcbiIrCiIgICAgb3BhY2l0eTogLjU7IH1cbiIrCiIgIDEwMCUge1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlWigxZGVnKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZVooMWRlZyk7XG4iKwoiICAgIG9wYWNpdHk6IDA7IH0gfVxuIisKIlxuIisKIkAtd2Via2l0LWtleWZyYW1lcyBhbmltYXRlLXRvYXN0LXN1Y2Nlc3MtdGlwIHtcbiIrCiIgIDAlIHtcbiIrCiIgICAgdG9wOiAuNTYyNWVtO1xuIisKIiAgICBsZWZ0OiAuMDYyNWVtO1xuIisKIiAgICB3aWR0aDogMDsgfVxuIisKIiAgNTQlIHtcbiIrCiIgICAgdG9wOiAuMTI1ZW07XG4iKwoiICAgIGxlZnQ6IC4xMjVlbTtcbiIrCiIgICAgd2lkdGg6IDA7IH1cbiIrCiIgIDcwJSB7XG4iKwoiICAgIHRvcDogLjYyNWVtO1xuIisKIiAgICBsZWZ0OiAtLjI1ZW07XG4iKwoiICAgIHdpZHRoOiAxLjYyNWVtOyB9XG4iKwoiICA4NCUge1xuIisKIiAgICB0b3A6IDEuMDYyNWVtO1xuIisKIiAgICBsZWZ0OiAuNzVlbTtcbiIrCiIgICAgd2lkdGg6IC41ZW07IH1cbiIrCiIgIDEwMCUge1xuIisKIiAgICB0b3A6IDEuMTI1ZW07XG4iKwoiICAgIGxlZnQ6IC4xODc1ZW07XG4iKwoiICAgIHdpZHRoOiAuNzVlbTsgfSB9XG4iKwoiXG4iKwoiQGtleWZyYW1lcyBhbmltYXRlLXRvYXN0LXN1Y2Nlc3MtdGlwIHtcbiIrCiIgIDAlIHtcbiIrCiIgICAgdG9wOiAuNTYyNWVtO1xuIisKIiAgICBsZWZ0OiAuMDYyNWVtO1xuIisKIiAgICB3aWR0aDogMDsgfVxuIisKIiAgNTQlIHtcbiIrCiIgICAgdG9wOiAuMTI1ZW07XG4iKwoiICAgIGxlZnQ6IC4xMjVlbTtcbiIrCiIgICAgd2lkdGg6IDA7IH1cbiIrCiIgIDcwJSB7XG4iKwoiICAgIHRvcDogLjYyNWVtO1xuIisKIiAgICBsZWZ0OiAtLjI1ZW07XG4iKwoiICAgIHdpZHRoOiAxLjYyNWVtOyB9XG4iKwoiICA4NCUge1xuIisKIiAgICB0b3A6IDEuMDYyNWVtO1xuIisKIiAgICBsZWZ0OiAuNzVlbTtcbiIrCiIgICAgd2lkdGg6IC41ZW07IH1cbiIrCiIgIDEwMCUge1xuIisKIiAgICB0b3A6IDEuMTI1ZW07XG4iKwoiICAgIGxlZnQ6IC4xODc1ZW07XG4iKwoiICAgIHdpZHRoOiAuNzVlbTsgfSB9XG4iKwoiXG4iKwoiQC13ZWJraXQta2V5ZnJhbWVzIGFuaW1hdGUtdG9hc3Qtc3VjY2Vzcy1sb25nIHtcbiIrCiIgIDAlIHtcbiIrCiIgICAgdG9wOiAxLjYyNWVtO1xuIisKIiAgICByaWdodDogMS4zNzVlbTtcbiIrCiIgICAgd2lkdGg6IDA7IH1cbiIrCiIgIDY1JSB7XG4iKwoiICAgIHRvcDogMS4yNWVtO1xuIisKIiAgICByaWdodDogLjkzNzVlbTtcbiIrCiIgICAgd2lkdGg6IDA7IH1cbiIrCiIgIDg0JSB7XG4iKwoiICAgIHRvcDogLjkzNzVlbTtcbiIrCiIgICAgcmlnaHQ6IDA7XG4iKwoiICAgIHdpZHRoOiAxLjEyNWVtOyB9XG4iKwoiICAxMDAlIHtcbiIrCiIgICAgdG9wOiAuOTM3NWVtO1xuIisKIiAgICByaWdodDogLjE4NzVlbTtcbiIrCiIgICAgd2lkdGg6IDEuMzc1ZW07IH0gfVxuIisKIlxuIisKIkBrZXlmcmFtZXMgYW5pbWF0ZS10b2FzdC1zdWNjZXNzLWxvbmcge1xuIisKIiAgMCUge1xuIisKIiAgICB0b3A6IDEuNjI1ZW07XG4iKwoiICAgIHJpZ2h0OiAxLjM3NWVtO1xuIisKIiAgICB3aWR0aDogMDsgfVxuIisKIiAgNjUlIHtcbiIrCiIgICAgdG9wOiAxLjI1ZW07XG4iKwoiICAgIHJpZ2h0OiAuOTM3NWVtO1xuIisKIiAgICB3aWR0aDogMDsgfVxuIisKIiAgODQlIHtcbiIrCiIgICAgdG9wOiAuOTM3NWVtO1xuIisKIiAgICByaWdodDogMDtcbiIrCiIgICAgd2lkdGg6IDEuMTI1ZW07IH1cbiIrCiIgIDEwMCUge1xuIisKIiAgICB0b3A6IC45Mzc1ZW07XG4iKwoiICAgIHJpZ2h0OiAuMTg3NWVtO1xuIisKIiAgICB3aWR0aDogMS4zNzVlbTsgfSB9XG4iKwoiXG4iKwoiYm9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wKTpub3QoLnN3YWwyLXRvYXN0LXNob3duKSB7XG4iKwoiICBvdmVyZmxvdy15OiBoaWRkZW47IH1cbiIrCiJcbiIrCiJib2R5LnN3YWwyLWhlaWdodC1hdXRvIHtcbiIrCiIgIGhlaWdodDogYXV0byAhaW1wb3J0YW50OyB9XG4iKwoiXG4iKwoiYm9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItc2hvd24ge1xuIisKIiAgdG9wOiBhdXRvO1xuIisKIiAgcmlnaHQ6IGF1dG87XG4iKwoiICBib3R0b206IGF1dG87XG4iKwoiICBsZWZ0OiBhdXRvO1xuIisKIiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH1cbiIrCiIgIGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLXNob3duID4gLnN3YWwyLW1vZGFsIHtcbiIrCiIgICAgYm94LXNoYWRvdzogMCAwIDEwcHggcmdiYSgwLCAwLCAwLCAwLjQpOyB9XG4iKwoiICBib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1zaG93bi5zd2FsMi10b3Age1xuIisKIiAgICB0b3A6IDA7XG4iKwoiICAgIGxlZnQ6IDUwJTtcbiIrCiIgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOyB9XG4iKwoiICBib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1zaG93bi5zd2FsMi10b3Atc3RhcnQsIGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLXNob3duLnN3YWwyLXRvcC1sZWZ0IHtcbiIrCiIgICAgdG9wOiAwO1xuIisKIiAgICBsZWZ0OiAwOyB9XG4iKwoiICBib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1zaG93bi5zd2FsMi10b3AtZW5kLCBib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1zaG93bi5zd2FsMi10b3AtcmlnaHQge1xuIisKIiAgICB0b3A6IDA7XG4iKwoiICAgIHJpZ2h0OiAwOyB9XG4iKwoiICBib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1zaG93bi5zd2FsMi1jZW50ZXIge1xuIisKIiAgICB0b3A6IDUwJTtcbiIrCiIgICAgbGVmdDogNTAlO1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOyB9XG4iKwoiICBib2R5LnN3YWwyLW5vLWJhY2tkcm9wIC5zd2FsMi1zaG93bi5zd2FsMi1jZW50ZXItc3RhcnQsIGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLXNob3duLnN3YWwyLWNlbnRlci1sZWZ0IHtcbiIrCiIgICAgdG9wOiA1MCU7XG4iKwoiICAgIGxlZnQ6IDA7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuIisKIiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsgfVxuIisKIiAgYm9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItc2hvd24uc3dhbDItY2VudGVyLWVuZCwgYm9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItc2hvd24uc3dhbDItY2VudGVyLXJpZ2h0IHtcbiIrCiIgICAgdG9wOiA1MCU7XG4iKwoiICAgIHJpZ2h0OiAwO1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7IH1cbiIrCiIgIGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLXNob3duLnN3YWwyLWJvdHRvbSB7XG4iKwoiICAgIGJvdHRvbTogMDtcbiIrCiIgICAgbGVmdDogNTAlO1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiIrCiIgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7IH1cbiIrCiIgIGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLXNob3duLnN3YWwyLWJvdHRvbS1zdGFydCwgYm9keS5zd2FsMi1uby1iYWNrZHJvcCAuc3dhbDItc2hvd24uc3dhbDItYm90dG9tLWxlZnQge1xuIisKIiAgICBib3R0b206IDA7XG4iKwoiICAgIGxlZnQ6IDA7IH1cbiIrCiIgIGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLXNob3duLnN3YWwyLWJvdHRvbS1lbmQsIGJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLXNob3duLnN3YWwyLWJvdHRvbS1yaWdodCB7XG4iKwoiICAgIHJpZ2h0OiAwO1xuIisKIiAgICBib3R0b206IDA7IH1cbiIrCiJcbiIrCiIuc3dhbDItY29udGFpbmVyIHtcbiIrCiIgIGRpc3BsYXk6IGZsZXg7XG4iKwoiICBwb3NpdGlvbjogZml4ZWQ7XG4iKwoiICB0b3A6IDA7XG4iKwoiICByaWdodDogMDtcbiIrCiIgIGJvdHRvbTogMDtcbiIrCiIgIGxlZnQ6IDA7XG4iKwoiICBmbGV4LWRpcmVjdGlvbjogcm93O1xuIisKIiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiIrCiIgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuIisKIiAgcGFkZGluZzogMTBweDtcbiIrCiIgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuIisKIiAgei1pbmRleDogMTA2MDtcbiIrCiIgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiIrCiIgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsgfVxuIisKIiAgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3Age1xuIisKIiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfVxuIisKIiAgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3Atc3RhcnQsIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLWxlZnQge1xuIisKIiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiIrCiIgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OyB9XG4iKwoiICAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1lbmQsIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXJpZ2h0IHtcbiIrCiIgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4iKwoiICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7IH1cbiIrCiIgIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyIHtcbiIrCiIgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgfVxuIisKIiAgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItc3RhcnQsIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWxlZnQge1xuIisKIiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuIisKIiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7IH1cbiIrCiIgIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWVuZCwgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItcmlnaHQge1xuIisKIiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuIisKIiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOyB9XG4iKwoiICAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbSB7XG4iKwoiICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxuIisKIiAgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tc3RhcnQsIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWxlZnQge1xuIisKIiAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7XG4iKwoiICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsgfVxuIisKIiAgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kLCAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1yaWdodCB7XG4iKwoiICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcbiIrCiIgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsgfVxuIisKIiAgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWZ1bGxzY3JlZW4gPiAuc3dhbDItbW9kYWwge1xuIisKIiAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7XG4iKwoiICAgIGZsZXg6IDE7XG4iKwoiICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7XG4iKwoiICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyB9XG4iKwoiICAuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctcm93ID4gLnN3YWwyLW1vZGFsIHtcbiIrCiIgICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O1xuIisKIiAgICBmbGV4OiAxO1xuIisKIiAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7XG4iKwoiICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyB9XG4iKwoiICAuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uIHtcbiIrCiIgICAgZmxleDogMTtcbiIrCiIgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgfVxuIisKIiAgICAuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLXRvcCwgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1jZW50ZXIsIC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItYm90dG9tIHtcbiIrCiIgICAgICBhbGlnbi1pdGVtczogY2VudGVyOyB9XG4iKwoiICAgIC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItdG9wLXN0YXJ0LCAuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLWNlbnRlci1zdGFydCwgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1ib3R0b20tc3RhcnQsIC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItdG9wLWxlZnQsIC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItY2VudGVyLWxlZnQsIC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItYm90dG9tLWxlZnQge1xuIisKIiAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OyB9XG4iKwoiICAgIC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItdG9wLWVuZCwgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1jZW50ZXItZW5kLCAuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLWJvdHRvbS1lbmQsIC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4uc3dhbDItdG9wLXJpZ2h0LCAuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uLnN3YWwyLWNlbnRlci1yaWdodCwgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWNvbHVtbi5zd2FsMi1ib3R0b20tcmlnaHQge1xuIisKIiAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsgfVxuIisKIiAgICAuc3dhbDItY29udGFpbmVyLnN3YWwyLWdyb3ctY29sdW1uID4gLnN3YWwyLW1vZGFsIHtcbiIrCiIgICAgICBkaXNwbGF5OiBmbGV4ICFpbXBvcnRhbnQ7XG4iKwoiICAgICAgZmxleDogMTtcbiIrCiIgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7XG4iKwoiICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IH1cbiIrCiIgIC5zd2FsMi1jb250YWluZXI6bm90KC5zd2FsMi10b3ApOm5vdCguc3dhbDItdG9wLXN0YXJ0KTpub3QoLnN3YWwyLXRvcC1lbmQpOm5vdCguc3dhbDItdG9wLWxlZnQpOm5vdCguc3dhbDItdG9wLXJpZ2h0KTpub3QoLnN3YWwyLWNlbnRlci1zdGFydCk6bm90KC5zd2FsMi1jZW50ZXItZW5kKTpub3QoLnN3YWwyLWNlbnRlci1sZWZ0KTpub3QoLnN3YWwyLWNlbnRlci1yaWdodCk6bm90KC5zd2FsMi1ib3R0b20pOm5vdCguc3dhbDItYm90dG9tLXN0YXJ0KTpub3QoLnN3YWwyLWJvdHRvbS1lbmQpOm5vdCguc3dhbDItYm90dG9tLWxlZnQpOm5vdCguc3dhbDItYm90dG9tLXJpZ2h0KTpub3QoLnN3YWwyLWdyb3ctZnVsbHNjcmVlbikgPiAuc3dhbDItbW9kYWwge1xuIisKIiAgICBtYXJnaW46IGF1dG87IH1cbiIrCiIgIEBtZWRpYSBhbGwgYW5kICgtbXMtaGlnaC1jb250cmFzdDogbm9uZSksICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKSB7XG4iKwoiICAgIC5zd2FsMi1jb250YWluZXIgLnN3YWwyLW1vZGFsIHtcbiIrCiIgICAgICBtYXJnaW46IDAgIWltcG9ydGFudDsgfSB9XG4iKwoiICAuc3dhbDItY29udGFpbmVyLnN3YWwyLWZhZGUge1xuIisKIiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIC4xczsgfVxuIisKIiAgLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1zaG93biB7XG4iKwoiICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC40KTsgfVxuIisKIlxuIisKIi5zd2FsMi1wb3B1cCB7XG4iKwoiICBkaXNwbGF5OiBub25lO1xuIisKIiAgcG9zaXRpb246IHJlbGF0aXZlO1xuIisKIiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiIrCiIgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuIisKIiAgd2lkdGg6IDMyZW07XG4iKwoiICBtYXgtd2lkdGg6IDEwMCU7XG4iKwoiICBwYWRkaW5nOiAxLjI1ZW07XG4iKwoiICBib3JkZXItcmFkaXVzOiAwLjMxMjVlbTtcbiIrCiIgIGJhY2tncm91bmQ6ICNmZmY7XG4iKwoiICBmb250LWZhbWlseTogaW5oZXJpdDtcbiIrCiIgIGZvbnQtc2l6ZTogMXJlbTtcbiIrCiIgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH1cbiIrCiIgIC5zd2FsMi1wb3B1cDpmb2N1cyB7XG4iKwoiICAgIG91dGxpbmU6IG5vbmU7IH1cbiIrCiIgIC5zd2FsMi1wb3B1cC5zd2FsMi1sb2FkaW5nIHtcbiIrCiIgICAgb3ZlcmZsb3cteTogaGlkZGVuOyB9XG4iKwoiICAuc3dhbDItcG9wdXAgLnN3YWwyLWhlYWRlciB7XG4iKwoiICAgIGRpc3BsYXk6IGZsZXg7XG4iKwoiICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4iKwoiICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IH1cbiIrCiIgIC5zd2FsMi1wb3B1cCAuc3dhbDItdGl0bGUge1xuIisKIiAgICBkaXNwbGF5OiBibG9jaztcbiIrCiIgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuIisKIiAgICBtYXgtd2lkdGg6IDEwMCU7XG4iKwoiICAgIG1hcmdpbjogMCAwIDAuNGVtO1xuIisKIiAgICBwYWRkaW5nOiAwO1xuIisKIiAgICBjb2xvcjogIzU5NTk1OTtcbiIrCiIgICAgZm9udC1zaXplOiAxLjg3NWVtO1xuIisKIiAgICBmb250LXdlaWdodDogNjAwO1xuIisKIiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4iKwoiICAgIHRleHQtdHJhbnNmb3JtOiBub25lO1xuIisKIiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IH1cbiIrCiIgIC5zd2FsMi1wb3B1cCAuc3dhbDItYWN0aW9ucyB7XG4iKwoiICAgIGZsZXgtd3JhcDogd3JhcDtcbiIrCiIgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiIrCiIgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4iKwoiICAgIG1hcmdpbjogMS4yNWVtIGF1dG8gMDtcbiIrCiIgICAgei1pbmRleDogMTsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLWFjdGlvbnM6bm90KC5zd2FsMi1sb2FkaW5nKSAuc3dhbDItc3R5bGVkW2Rpc2FibGVkXSB7XG4iKwoiICAgICAgb3BhY2l0eTogLjQ7IH1cbiIrCiIgICAgLnN3YWwyLXBvcHVwIC5zd2FsMi1hY3Rpb25zOm5vdCguc3dhbDItbG9hZGluZykgLnN3YWwyLXN0eWxlZDpob3ZlciB7XG4iKwoiICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHJnYmEoMCwgMCwgMCwgMC4xKSwgcmdiYSgwLCAwLCAwLCAwLjEpKTsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLWFjdGlvbnM6bm90KC5zd2FsMi1sb2FkaW5nKSAuc3dhbDItc3R5bGVkOmFjdGl2ZSB7XG4iKwoiICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHJnYmEoMCwgMCwgMCwgMC4yKSwgcmdiYSgwLCAwLCAwLCAwLjIpKTsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLWFjdGlvbnMuc3dhbDItbG9hZGluZyAuc3dhbDItc3R5bGVkLnN3YWwyLWNvbmZpcm0ge1xuIisKIiAgICAgIHdpZHRoOiAyLjVlbTtcbiIrCiIgICAgICBoZWlnaHQ6IDIuNWVtO1xuIisKIiAgICAgIG1hcmdpbjogLjQ2ODc1ZW07XG4iKwoiICAgICAgcGFkZGluZzogMDtcbiIrCiIgICAgICBib3JkZXI6IC4yNWVtIHNvbGlkIHRyYW5zcGFyZW50O1xuIisKIiAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4iKwoiICAgICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiIrCiIgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuIisKIiAgICAgIGNvbG9yOiB0cmFuc3BhcmVudDtcbiIrCiIgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4iKwoiICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiIrCiIgICAgICAtd2Via2l0LWFuaW1hdGlvbjogc3dhbDItcm90YXRlLWxvYWRpbmcgMS41cyBsaW5lYXIgMHMgaW5maW5pdGUgbm9ybWFsO1xuIisKIiAgICAgICAgICAgICAgYW5pbWF0aW9uOiBzd2FsMi1yb3RhdGUtbG9hZGluZyAxLjVzIGxpbmVhciAwcyBpbmZpbml0ZSBub3JtYWw7XG4iKwoiICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiIrCiIgICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuIisKIiAgICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4iKwoiICAgICAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLWFjdGlvbnMuc3dhbDItbG9hZGluZyAuc3dhbDItc3R5bGVkLnN3YWwyLWNhbmNlbCB7XG4iKwoiICAgICAgbWFyZ2luLXJpZ2h0OiAzMHB4O1xuIisKIiAgICAgIG1hcmdpbi1sZWZ0OiAzMHB4OyB9XG4iKwoiICAgIC5zd2FsMi1wb3B1cCAuc3dhbDItYWN0aW9ucy5zd2FsMi1sb2FkaW5nIDpub3QoLnN3YWwyLXN0eWxlZCkuc3dhbDItY29uZmlybTo6YWZ0ZXIge1xuIisKIiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiIrCiIgICAgICB3aWR0aDogMTVweDtcbiIrCiIgICAgICBoZWlnaHQ6IDE1cHg7XG4iKwoiICAgICAgbWFyZ2luLWxlZnQ6IDVweDtcbiIrCiIgICAgICBib3JkZXI6IDNweCBzb2xpZCAjOTk5OTk5O1xuIisKIiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiIrCiIgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xuIisKIiAgICAgIGJveC1zaGFkb3c6IDFweCAxcHggMXB4ICNmZmY7XG4iKwoiICAgICAgY29udGVudDogJyc7XG4iKwoiICAgICAgLXdlYmtpdC1hbmltYXRpb246IHN3YWwyLXJvdGF0ZS1sb2FkaW5nIDEuNXMgbGluZWFyIDBzIGluZmluaXRlIG5vcm1hbDtcbiIrCiIgICAgICAgICAgICAgIGFuaW1hdGlvbjogc3dhbDItcm90YXRlLWxvYWRpbmcgMS41cyBsaW5lYXIgMHMgaW5maW5pdGUgbm9ybWFsOyB9XG4iKwoiICAuc3dhbDItcG9wdXAgLnN3YWwyLXN0eWxlZCB7XG4iKwoiICAgIG1hcmdpbjogLjMxMjVlbTtcbiIrCiIgICAgcGFkZGluZzogLjYyNWVtIDJlbTtcbiIrCiIgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiIrCiIgICAgYm94LXNoYWRvdzogbm9uZTsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLXN0eWxlZDpub3QoW2Rpc2FibGVkXSkge1xuIisKIiAgICAgIGN1cnNvcjogcG9pbnRlcjsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLXN0eWxlZC5zd2FsMi1jb25maXJtIHtcbiIrCiIgICAgICBib3JkZXI6IDA7XG4iKwoiICAgICAgYm9yZGVyLXJhZGl1czogMC4yNWVtO1xuIisKIiAgICAgIGJhY2tncm91bmQ6IGluaXRpYWw7XG4iKwoiICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzMwODVkNjtcbiIrCiIgICAgICBjb2xvcjogI2ZmZjtcbiIrCiIgICAgICBmb250LXNpemU6IDEuMDYyNWVtOyB9XG4iKwoiICAgIC5zd2FsMi1wb3B1cCAuc3dhbDItc3R5bGVkLnN3YWwyLWNhbmNlbCB7XG4iKwoiICAgICAgYm9yZGVyOiAwO1xuIisKIiAgICAgIGJvcmRlci1yYWRpdXM6IDAuMjVlbTtcbiIrCiIgICAgICBiYWNrZ3JvdW5kOiBpbml0aWFsO1xuIisKIiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNhYWE7XG4iKwoiICAgICAgY29sb3I6ICNmZmY7XG4iKwoiICAgICAgZm9udC1zaXplOiAxLjA2MjVlbTsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLXN0eWxlZDpmb2N1cyB7XG4iKwoiICAgICAgb3V0bGluZTogbm9uZTtcbiIrCiIgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggI2ZmZiwgMCAwIDAgNHB4IHJnYmEoNTAsIDEwMCwgMTUwLCAwLjQpOyB9XG4iKwoiICAgIC5zd2FsMi1wb3B1cCAuc3dhbDItc3R5bGVkOjotbW96LWZvY3VzLWlubmVyIHtcbiIrCiIgICAgICBib3JkZXI6IDA7IH1cbiIrCiIgIC5zd2FsMi1wb3B1cCAuc3dhbDItZm9vdGVyIHtcbiIrCiIgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4iKwoiICAgIG1hcmdpbjogMS4yNWVtIDAgMDtcbiIrCiIgICAgcGFkZGluZzogMWVtIDAgMDtcbiIrCiIgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlZWU7XG4iKwoiICAgIGNvbG9yOiAjNTQ1NDU0O1xuIisKIiAgICBmb250LXNpemU6IDFlbTsgfVxuIisKIiAgLnN3YWwyLXBvcHVwIC5zd2FsMi1pbWFnZSB7XG4iKwoiICAgIG1heC13aWR0aDogMTAwJTtcbiIrCiIgICAgbWFyZ2luOiAxLjI1ZW0gYXV0bzsgfVxuIisKIiAgLnN3YWwyLXBvcHVwIC5zd2FsMi1jbG9zZSB7XG4iKwoiICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIrCiIgICAgdG9wOiAwO1xuIisKIiAgICByaWdodDogMDtcbiIrCiIgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4iKwoiICAgIHdpZHRoOiAxLjJlbTtcbiIrCiIgICAgaGVpZ2h0OiAxLjJlbTtcbiIrCiIgICAgcGFkZGluZzogMDtcbiIrCiIgICAgdHJhbnNpdGlvbjogY29sb3IgMC4xcyBlYXNlLW91dDtcbiIrCiIgICAgYm9yZGVyOiBub25lO1xuIisKIiAgICBib3JkZXItcmFkaXVzOiAwO1xuIisKIiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiIrCiIgICAgY29sb3I6ICNjY2NjY2M7XG4iKwoiICAgIGZvbnQtZmFtaWx5OiBzZXJpZjtcbiIrCiIgICAgZm9udC1zaXplOiAyLjVlbTtcbiIrCiIgICAgbGluZS1oZWlnaHQ6IDEuMjtcbiIrCiIgICAgY3Vyc29yOiBwb2ludGVyO1xuIisKIiAgICBvdmVyZmxvdzogaGlkZGVuOyB9XG4iKwoiICAgIC5zd2FsMi1wb3B1cCAuc3dhbDItY2xvc2U6aG92ZXIge1xuIisKIiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lO1xuIisKIiAgICAgICAgICAgICAgdHJhbnNmb3JtOiBub25lO1xuIisKIiAgICAgIGNvbG9yOiAjZjI3NDc0OyB9XG4iKwoiICAuc3dhbDItcG9wdXAgPiAuc3dhbDItaW5wdXQsXG4iKwoiICAuc3dhbDItcG9wdXAgPiAuc3dhbDItZmlsZSxcbiIrCiIgIC5zd2FsMi1wb3B1cCA+IC5zd2FsMi10ZXh0YXJlYSxcbiIrCiIgIC5zd2FsMi1wb3B1cCA+IC5zd2FsMi1zZWxlY3QsXG4iKwoiICAuc3dhbDItcG9wdXAgPiAuc3dhbDItcmFkaW8sXG4iKwoiICAuc3dhbDItcG9wdXAgPiAuc3dhbDItY2hlY2tib3gge1xuIisKIiAgICBkaXNwbGF5OiBub25lOyB9XG4iKwoiICAuc3dhbDItcG9wdXAgLnN3YWwyLWNvbnRlbnQge1xuIisKIiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiIrCiIgICAgbWFyZ2luOiAwO1xuIisKIiAgICBwYWRkaW5nOiAwO1xuIisKIiAgICBjb2xvcjogIzU0NTQ1NDtcbiIrCiIgICAgZm9udC1zaXplOiAxLjEyNWVtO1xuIisKIiAgICBmb250LXdlaWdodDogMzAwO1xuIisKIiAgICBsaW5lLWhlaWdodDogbm9ybWFsO1xuIisKIiAgICB6LWluZGV4OiAxO1xuIisKIiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IH1cbiIrCiIgIC5zd2FsMi1wb3B1cCAjc3dhbDItY29udGVudCB7XG4iKwoiICAgIHRleHQtYWxpZ246IGNlbnRlcjsgfVxuIisKIiAgLnN3YWwyLXBvcHVwIC5zd2FsMi1pbnB1dCxcbiIrCiIgIC5zd2FsMi1wb3B1cCAuc3dhbDItZmlsZSxcbiIrCiIgIC5zd2FsMi1wb3B1cCAuc3dhbDItdGV4dGFyZWEsXG4iKwoiICAuc3dhbDItcG9wdXAgLnN3YWwyLXNlbGVjdCxcbiIrCiIgIC5zd2FsMi1wb3B1cCAuc3dhbDItcmFkaW8sXG4iKwoiICAuc3dhbDItcG9wdXAgLnN3YWwyLWNoZWNrYm94IHtcbiIrCiIgICAgbWFyZ2luOiAxZW0gYXV0bzsgfVxuIisKIiAgLnN3YWwyLXBvcHVwIC5zd2FsMi1pbnB1dCxcbiIrCiIgIC5zd2FsMi1wb3B1cCAuc3dhbDItZmlsZSxcbiIrCiIgIC5zd2FsMi1wb3B1cCAuc3dhbDItdGV4dGFyZWEge1xuIisKIiAgICB3aWR0aDogMTAwJTtcbiIrCiIgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIC4zcywgYm94LXNoYWRvdyAuM3M7XG4iKwoiICAgIGJvcmRlcjogMXB4IHNvbGlkICNkOWQ5ZDk7XG4iKwoiICAgIGJvcmRlci1yYWRpdXM6IDAuMTg3NWVtO1xuIisKIiAgICBmb250LXNpemU6IDEuMTI1ZW07XG4iKwoiICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMDYpO1xuIisKIiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9XG4iKwoiICAgIC5zd2FsMi1wb3B1cCAuc3dhbDItaW5wdXQuc3dhbDItaW5wdXRlcnJvcixcbiIrCiIgICAgLnN3YWwyLXBvcHVwIC5zd2FsMi1maWxlLnN3YWwyLWlucHV0ZXJyb3IsXG4iKwoiICAgIC5zd2FsMi1wb3B1cCAuc3dhbDItdGV4dGFyZWEuc3dhbDItaW5wdXRlcnJvciB7XG4iKwoiICAgICAgYm9yZGVyLWNvbG9yOiAjZjI3NDc0ICFpbXBvcnRhbnQ7XG4iKwoiICAgICAgYm94LXNoYWRvdzogMCAwIDJweCAjZjI3NDc0ICFpbXBvcnRhbnQ7IH1cbiIrCiIgICAgLnN3YWwyLXBvcHVwIC5zd2FsMi1pbnB1dDpmb2N1cyxcbiIrCiIgICAgLnN3YWwyLXBvcHVwIC5zd2FsMi1maWxlOmZvY3VzLFxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLXRleHRhcmVhOmZvY3VzIHtcbiIrCiIgICAgICBib3JkZXI6IDFweCBzb2xpZCAjYjRkYmVkO1xuIisKIiAgICAgIG91dGxpbmU6IG5vbmU7XG4iKwoiICAgICAgYm94LXNoYWRvdzogMCAwIDNweCAjYzRlNmY1OyB9XG4iKwoiICAgIC5zd2FsMi1wb3B1cCAuc3dhbDItaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIsXG4iKwoiICAgIC5zd2FsMi1wb3B1cCAuc3dhbDItZmlsZTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcixcbiIrCiIgICAgLnN3YWwyLXBvcHVwIC5zd2FsMi10ZXh0YXJlYTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4iKwoiICAgICAgY29sb3I6ICNjY2NjY2M7IH1cbiIrCiIgICAgLnN3YWwyLXBvcHVwIC5zd2FsMi1pbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIsXG4iKwoiICAgIC5zd2FsMi1wb3B1cCAuc3dhbDItZmlsZTotbXMtaW5wdXQtcGxhY2Vob2xkZXIsXG4iKwoiICAgIC5zd2FsMi1wb3B1cCAuc3dhbDItdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHtcbiIrCiIgICAgICBjb2xvcjogI2NjY2NjYzsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLWlucHV0OjotbXMtaW5wdXQtcGxhY2Vob2xkZXIsXG4iKwoiICAgIC5zd2FsMi1wb3B1cCAuc3dhbDItZmlsZTo6LW1zLWlucHV0LXBsYWNlaG9sZGVyLFxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLXRleHRhcmVhOjotbXMtaW5wdXQtcGxhY2Vob2xkZXIge1xuIisKIiAgICAgIGNvbG9yOiAjY2NjY2NjOyB9XG4iKwoiICAgIC5zd2FsMi1wb3B1cCAuc3dhbDItaW5wdXQ6OnBsYWNlaG9sZGVyLFxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLWZpbGU6OnBsYWNlaG9sZGVyLFxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLXRleHRhcmVhOjpwbGFjZWhvbGRlciB7XG4iKwoiICAgICAgY29sb3I6ICNjY2NjY2M7IH1cbiIrCiIgIC5zd2FsMi1wb3B1cCAuc3dhbDItcmFuZ2UgaW5wdXQge1xuIisKIiAgICB3aWR0aDogODAlOyB9XG4iKwoiICAuc3dhbDItcG9wdXAgLnN3YWwyLXJhbmdlIG91dHB1dCB7XG4iKwoiICAgIHdpZHRoOiAyMCU7XG4iKwoiICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4iKwoiICAgIHRleHQtYWxpZ246IGNlbnRlcjsgfVxuIisKIiAgLnN3YWwyLXBvcHVwIC5zd2FsMi1yYW5nZSBpbnB1dCxcbiIrCiIgIC5zd2FsMi1wb3B1cCAuc3dhbDItcmFuZ2Ugb3V0cHV0IHtcbiIrCiIgICAgaGVpZ2h0OiAyLjYyNWVtO1xuIisKIiAgICBtYXJnaW46IDFlbSBhdXRvO1xuIisKIiAgICBwYWRkaW5nOiAwO1xuIisKIiAgICBmb250LXNpemU6IDEuMTI1ZW07XG4iKwoiICAgIGxpbmUtaGVpZ2h0OiAyLjYyNWVtOyB9XG4iKwoiICAuc3dhbDItcG9wdXAgLnN3YWwyLWlucHV0IHtcbiIrCiIgICAgaGVpZ2h0OiAyLjYyNWVtO1xuIisKIiAgICBwYWRkaW5nOiAwIDAuNzVlbTsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLWlucHV0W3R5cGU9J251bWJlciddIHtcbiIrCiIgICAgICBtYXgtd2lkdGg6IDEwZW07IH1cbiIrCiIgIC5zd2FsMi1wb3B1cCAuc3dhbDItZmlsZSB7XG4iKwoiICAgIGZvbnQtc2l6ZTogMS4xMjVlbTsgfVxuIisKIiAgLnN3YWwyLXBvcHVwIC5zd2FsMi10ZXh0YXJlYSB7XG4iKwoiICAgIGhlaWdodDogNi43NWVtO1xuIisKIiAgICBwYWRkaW5nOiAwLjc1ZW07IH1cbiIrCiIgIC5zd2FsMi1wb3B1cCAuc3dhbDItc2VsZWN0IHtcbiIrCiIgICAgbWluLXdpZHRoOiA1MCU7XG4iKwoiICAgIG1heC13aWR0aDogMTAwJTtcbiIrCiIgICAgcGFkZGluZzogLjM3NWVtIC42MjVlbTtcbiIrCiIgICAgY29sb3I6ICM1NDU0NTQ7XG4iKwoiICAgIGZvbnQtc2l6ZTogMS4xMjVlbTsgfVxuIisKIiAgLnN3YWwyLXBvcHVwIC5zd2FsMi1yYWRpbyxcbiIrCiIgIC5zd2FsMi1wb3B1cCAuc3dhbDItY2hlY2tib3gge1xuIisKIiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuIisKIiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLXJhZGlvIGxhYmVsLFxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLWNoZWNrYm94IGxhYmVsIHtcbiIrCiIgICAgICBtYXJnaW46IDAgLjZlbTtcbiIrCiIgICAgICBmb250LXNpemU6IDEuMTI1ZW07IH1cbiIrCiIgICAgLnN3YWwyLXBvcHVwIC5zd2FsMi1yYWRpbyBpbnB1dCxcbiIrCiIgICAgLnN3YWwyLXBvcHVwIC5zd2FsMi1jaGVja2JveCBpbnB1dCB7XG4iKwoiICAgICAgbWFyZ2luOiAwIC40ZW07IH1cbiIrCiIgIC5zd2FsMi1wb3B1cCAuc3dhbDItdmFsaWRhdGlvbi1tZXNzYWdlIHtcbiIrCiIgICAgZGlzcGxheTogbm9uZTtcbiIrCiIgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiIrCiIgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4iKwoiICAgIHBhZGRpbmc6IDAuNjI1ZW07XG4iKwoiICAgIGJhY2tncm91bmQ6ICNmMGYwZjA7XG4iKwoiICAgIGNvbG9yOiAjNjY2NjY2O1xuIisKIiAgICBmb250LXNpemU6IDFlbTtcbiIrCiIgICAgZm9udC13ZWlnaHQ6IDMwMDtcbiIrCiIgICAgb3ZlcmZsb3c6IGhpZGRlbjsgfVxuIisKIiAgICAuc3dhbDItcG9wdXAgLnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZTo6YmVmb3JlIHtcbiIrCiIgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4iKwoiICAgICAgd2lkdGg6IDEuNWVtO1xuIisKIiAgICAgIG1pbi13aWR0aDogMS41ZW07XG4iKwoiICAgICAgaGVpZ2h0OiAxLjVlbTtcbiIrCiIgICAgICBtYXJnaW46IDAgLjYyNWVtO1xuIisKIiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiIrCiIgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjI3NDc0O1xuIisKIiAgICAgIGNvbG9yOiAjZmZmO1xuIisKIiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4iKwoiICAgICAgbGluZS1oZWlnaHQ6IDEuNWVtO1xuIisKIiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiIrCiIgICAgICBjb250ZW50OiAnISc7XG4iKwoiICAgICAgem9vbTogbm9ybWFsOyB9XG4iKwoiXG4iKwoiQHN1cHBvcnRzICgtbXMtYWNjZWxlcmF0b3I6IHRydWUpIHtcbiIrCiIgIC5zd2FsMi1yYW5nZSBpbnB1dCB7XG4iKwoiICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH1cbiIrCiIgIC5zd2FsMi1yYW5nZSBvdXRwdXQge1xuIisKIiAgICBkaXNwbGF5OiBub25lOyB9IH1cbiIrCiJcbiIrCiJAbWVkaWEgYWxsIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IG5vbmUpLCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSkge1xuIisKIiAgLnN3YWwyLXJhbmdlIGlucHV0IHtcbiIrCiIgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsgfVxuIisKIiAgLnN3YWwyLXJhbmdlIG91dHB1dCB7XG4iKwoiICAgIGRpc3BsYXk6IG5vbmU7IH0gfVxuIisKIlxuIisKIkAtbW96LWRvY3VtZW50IHVybC1wcmVmaXgoKSB7XG4iKwoiICAuc3dhbDItY2xvc2U6Zm9jdXMge1xuIisKIiAgICBvdXRsaW5lOiAycHggc29saWQgcmdiYSg1MCwgMTAwLCAxNTAsIDAuNCk7IH0gfVxuIisKIlxuIisKIi5zd2FsMi1pY29uIHtcbiIrCiIgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiIrCiIgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuIisKIiAgd2lkdGg6IDVlbTtcbiIrCiIgIGhlaWdodDogNWVtO1xuIisKIiAgbWFyZ2luOiAxLjI1ZW0gYXV0byAxLjg3NWVtO1xuIisKIiAgYm9yZGVyOiAuMjVlbSBzb2xpZCB0cmFuc3BhcmVudDtcbiIrCiIgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiIrCiIgIGxpbmUtaGVpZ2h0OiA1ZW07XG4iKwoiICBjdXJzb3I6IGRlZmF1bHQ7XG4iKwoiICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiIrCiIgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4iKwoiICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuIisKIiAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcbiIrCiIgICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4iKwoiICB6b29tOiBub3JtYWw7IH1cbiIrCiIgIC5zd2FsMi1pY29uLXRleHQge1xuIisKIiAgICBmb250LXNpemU6IDMuNzVlbTsgfVxuIisKIiAgLnN3YWwyLWljb24uc3dhbDItZXJyb3Ige1xuIisKIiAgICBib3JkZXItY29sb3I6ICNmMjc0NzQ7IH1cbiIrCiIgICAgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgLnN3YWwyLXgtbWFyayB7XG4iKwoiICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuIisKIiAgICAgIGZsZXgtZ3JvdzogMTsgfVxuIisKIiAgICAuc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePSdzd2FsMi14LW1hcmstbGluZSddIHtcbiIrCiIgICAgICBkaXNwbGF5OiBibG9jaztcbiIrCiIgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iKwoiICAgICAgdG9wOiAyLjMxMjVlbTtcbiIrCiIgICAgICB3aWR0aDogMi45Mzc1ZW07XG4iKwoiICAgICAgaGVpZ2h0OiAuMzEyNWVtO1xuIisKIiAgICAgIGJvcmRlci1yYWRpdXM6IC4xMjVlbTtcbiIrCiIgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjI3NDc0OyB9XG4iKwoiICAgICAgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj0nc3dhbDIteC1tYXJrLWxpbmUnXVtjbGFzcyQ9J2xlZnQnXSB7XG4iKwoiICAgICAgICBsZWZ0OiAxLjA2MjVlbTtcbiIrCiIgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuIisKIiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7IH1cbiIrCiIgICAgICAuc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePSdzd2FsMi14LW1hcmstbGluZSddW2NsYXNzJD0ncmlnaHQnXSB7XG4iKwoiICAgICAgICByaWdodDogMWVtO1xuIisKIiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xuIisKIiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpOyB9XG4iKwoiICAuc3dhbDItaWNvbi5zd2FsMi13YXJuaW5nIHtcbiIrCiIgICAgYm9yZGVyLWNvbG9yOiAjZmFjZWE4O1xuIisKIiAgICBjb2xvcjogI2Y4YmI4NjsgfVxuIisKIiAgLnN3YWwyLWljb24uc3dhbDItaW5mbyB7XG4iKwoiICAgIGJvcmRlci1jb2xvcjogIzlkZTBmNjtcbiIrCiIgICAgY29sb3I6ICMzZmMzZWU7IH1cbiIrCiIgIC5zd2FsMi1pY29uLnN3YWwyLXF1ZXN0aW9uIHtcbiIrCiIgICAgYm9yZGVyLWNvbG9yOiAjYzlkYWUxO1xuIisKIiAgICBjb2xvcjogIzg3YWRiZDsgfVxuIisKIiAgLnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyB7XG4iKwoiICAgIGJvcmRlci1jb2xvcjogI2E1ZGM4NjsgfVxuIisKIiAgICAuc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149J3N3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZSddIHtcbiIrCiIgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iKwoiICAgICAgd2lkdGg6IDMuNzVlbTtcbiIrCiIgICAgICBoZWlnaHQ6IDcuNWVtO1xuIisKIiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuIisKIiAgICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuIisKIiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsgfVxuIisKIiAgICAgIC5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj0nc3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lJ11bY2xhc3MkPSdsZWZ0J10ge1xuIisKIiAgICAgICAgdG9wOiAtLjQzNzVlbTtcbiIrCiIgICAgICAgIGxlZnQ6IC0yLjA2MzVlbTtcbiIrCiIgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTtcbiIrCiIgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTtcbiIrCiIgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogMy43NWVtIDMuNzVlbTtcbiIrCiIgICAgICAgICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogMy43NWVtIDMuNzVlbTtcbiIrCiIgICAgICAgIGJvcmRlci1yYWRpdXM6IDcuNWVtIDAgMCA3LjVlbTsgfVxuIisKIiAgICAgIC5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj0nc3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lJ11bY2xhc3MkPSdyaWdodCddIHtcbiIrCiIgICAgICAgIHRvcDogLS42ODc1ZW07XG4iKwoiICAgICAgICBsZWZ0OiAxLjg3NWVtO1xuIisKIiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xuIisKIiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xuIisKIiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiAwIDMuNzVlbTtcbiIrCiIgICAgICAgICAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogMCAzLjc1ZW07XG4iKwoiICAgICAgICBib3JkZXItcmFkaXVzOiAwIDcuNWVtIDcuNWVtIDA7IH1cbiIrCiIgICAgLnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1yaW5nIHtcbiIrCiIgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4iKwoiICAgICAgdG9wOiAtLjI1ZW07XG4iKwoiICAgICAgbGVmdDogLS4yNWVtO1xuIisKIiAgICAgIHdpZHRoOiAxMDAlO1xuIisKIiAgICAgIGhlaWdodDogMTAwJTtcbiIrCiIgICAgICBib3JkZXI6IDAuMjVlbSBzb2xpZCByZ2JhKDE2NSwgMjIwLCAxMzQsIDAuMyk7XG4iKwoiICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuIisKIiAgICAgIHotaW5kZXg6IDI7XG4iKwoiICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7IH1cbiIrCiIgICAgLnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1maXgge1xuIisKIiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIrCiIgICAgICB0b3A6IC41ZW07XG4iKwoiICAgICAgbGVmdDogMS42MjVlbTtcbiIrCiIgICAgICB3aWR0aDogLjQzNzVlbTtcbiIrCiIgICAgICBoZWlnaHQ6IDUuNjI1ZW07XG4iKwoiICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xuIisKIiAgICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTtcbiIrCiIgICAgICB6LWluZGV4OiAxOyB9XG4iKwoiICAgIC5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj0nc3dhbDItc3VjY2Vzcy1saW5lJ10ge1xuIisKIiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuIisKIiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiIrCiIgICAgICBoZWlnaHQ6IC4zMTI1ZW07XG4iKwoiICAgICAgYm9yZGVyLXJhZGl1czogLjEyNWVtO1xuIisKIiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNhNWRjODY7XG4iKwoiICAgICAgei1pbmRleDogMjsgfVxuIisKIiAgICAgIC5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj0nc3dhbDItc3VjY2Vzcy1saW5lJ11bY2xhc3MkPSd0aXAnXSB7XG4iKwoiICAgICAgICB0b3A6IDIuODc1ZW07XG4iKwoiICAgICAgICBsZWZ0OiAuODc1ZW07XG4iKwoiICAgICAgICB3aWR0aDogMS41NjI1ZW07XG4iKwoiICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQ1ZGVnKTtcbiIrCiIgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpOyB9XG4iKwoiICAgICAgLnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePSdzd2FsMi1zdWNjZXNzLWxpbmUnXVtjbGFzcyQ9J2xvbmcnXSB7XG4iKwoiICAgICAgICB0b3A6IDIuMzc1ZW07XG4iKwoiICAgICAgICByaWdodDogLjVlbTtcbiIrCiIgICAgICAgIHdpZHRoOiAyLjkzNzVlbTtcbiIrCiIgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTtcbiIrCiIgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKTsgfVxuIisKIlxuIisKIi5zd2FsMi1wcm9ncmVzc3N0ZXBzIHtcbiIrCiIgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4iKwoiICBtYXJnaW46IDAgMCAxLjI1ZW07XG4iKwoiICBwYWRkaW5nOiAwO1xuIisKIiAgZm9udC13ZWlnaHQ6IDYwMDsgfVxuIisKIiAgLnN3YWwyLXByb2dyZXNzc3RlcHMgbGkge1xuIisKIiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4iKwoiICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgfVxuIisKIiAgLnN3YWwyLXByb2dyZXNzc3RlcHMgLnN3YWwyLXByb2dyZXNzY2lyY2xlIHtcbiIrCiIgICAgd2lkdGg6IDJlbTtcbiIrCiIgICAgaGVpZ2h0OiAyZW07XG4iKwoiICAgIGJvcmRlci1yYWRpdXM6IDJlbTtcbiIrCiIgICAgYmFja2dyb3VuZDogIzMwODVkNjtcbiIrCiIgICAgY29sb3I6ICNmZmY7XG4iKwoiICAgIGxpbmUtaGVpZ2h0OiAyZW07XG4iKwoiICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiIrCiIgICAgei1pbmRleDogMjA7IH1cbiIrCiIgICAgLnN3YWwyLXByb2dyZXNzc3RlcHMgLnN3YWwyLXByb2dyZXNzY2lyY2xlOmZpcnN0LWNoaWxkIHtcbiIrCiIgICAgICBtYXJnaW4tbGVmdDogMDsgfVxuIisKIiAgICAuc3dhbDItcHJvZ3Jlc3NzdGVwcyAuc3dhbDItcHJvZ3Jlc3NjaXJjbGU6bGFzdC1jaGlsZCB7XG4iKwoiICAgICAgbWFyZ2luLXJpZ2h0OiAwOyB9XG4iKwoiICAgIC5zd2FsMi1wcm9ncmVzc3N0ZXBzIC5zd2FsMi1wcm9ncmVzc2NpcmNsZS5zd2FsMi1hY3RpdmVwcm9ncmVzc3N0ZXAge1xuIisKIiAgICAgIGJhY2tncm91bmQ6ICMzMDg1ZDY7IH1cbiIrCiIgICAgICAuc3dhbDItcHJvZ3Jlc3NzdGVwcyAuc3dhbDItcHJvZ3Jlc3NjaXJjbGUuc3dhbDItYWN0aXZlcHJvZ3Jlc3NzdGVwIH4gLnN3YWwyLXByb2dyZXNzY2lyY2xlIHtcbiIrCiIgICAgICAgIGJhY2tncm91bmQ6ICNhZGQ4ZTY7IH1cbiIrCiIgICAgICAuc3dhbDItcHJvZ3Jlc3NzdGVwcyAuc3dhbDItcHJvZ3Jlc3NjaXJjbGUuc3dhbDItYWN0aXZlcHJvZ3Jlc3NzdGVwIH4gLnN3YWwyLXByb2dyZXNzbGluZSB7XG4iKwoiICAgICAgICBiYWNrZ3JvdW5kOiAjYWRkOGU2OyB9XG4iKwoiICAuc3dhbDItcHJvZ3Jlc3NzdGVwcyAuc3dhbDItcHJvZ3Jlc3NsaW5lIHtcbiIrCiIgICAgd2lkdGg6IDIuNWVtO1xuIisKIiAgICBoZWlnaHQ6IC40ZW07XG4iKwoiICAgIG1hcmdpbjogMCAtMXB4O1xuIisKIiAgICBiYWNrZ3JvdW5kOiAjMzA4NWQ2O1xuIisKIiAgICB6LWluZGV4OiAxMDsgfVxuIisKIlxuIisKIltjbGFzc149J3N3YWwyJ10ge1xuIisKIiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsgfVxuIisKIlxuIisKIi5zd2FsMi1zaG93IHtcbiIrCiIgIC13ZWJraXQtYW5pbWF0aW9uOiBzd2FsMi1zaG93IDAuM3M7XG4iKwoiICAgICAgICAgIGFuaW1hdGlvbjogc3dhbDItc2hvdyAwLjNzOyB9XG4iKwoiICAuc3dhbDItc2hvdy5zd2FsMi1ub2FuaW1hdGlvbiB7XG4iKwoiICAgIC13ZWJraXQtYW5pbWF0aW9uOiBub25lO1xuIisKIiAgICAgICAgICAgIGFuaW1hdGlvbjogbm9uZTsgfVxuIisKIlxuIisKIi5zd2FsMi1oaWRlIHtcbiIrCiIgIC13ZWJraXQtYW5pbWF0aW9uOiBzd2FsMi1oaWRlIDAuMTVzIGZvcndhcmRzO1xuIisKIiAgICAgICAgICBhbmltYXRpb246IHN3YWwyLWhpZGUgMC4xNXMgZm9yd2FyZHM7IH1cbiIrCiIgIC5zd2FsMi1oaWRlLnN3YWwyLW5vYW5pbWF0aW9uIHtcbiIrCiIgICAgLXdlYmtpdC1hbmltYXRpb246IG5vbmU7XG4iKwoiICAgICAgICAgICAgYW5pbWF0aW9uOiBub25lOyB9XG4iKwoiXG4iKwoiW2Rpcj0ncnRsJ10gLnN3YWwyLWNsb3NlIHtcbiIrCiIgIHJpZ2h0OiBhdXRvO1xuIisKIiAgbGVmdDogMDsgfVxuIisKIlxuIisKIi5zd2FsMi1hbmltYXRlLXN1Y2Nlc3MtaWNvbiAuc3dhbDItc3VjY2Vzcy1saW5lLXRpcCB7XG4iKwoiICAtd2Via2l0LWFuaW1hdGlvbjogc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwIDAuNzVzO1xuIisKIiAgICAgICAgICBhbmltYXRpb246IHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcCAwLjc1czsgfVxuIisKIlxuIisKIi5zd2FsMi1hbmltYXRlLXN1Y2Nlc3MtaWNvbiAuc3dhbDItc3VjY2Vzcy1saW5lLWxvbmcge1xuIisKIiAgLXdlYmtpdC1hbmltYXRpb246IHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgMC43NXM7XG4iKwoiICAgICAgICAgIGFuaW1hdGlvbjogc3dhbDItYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZyAwLjc1czsgfVxuIisKIlxuIisKIi5zd2FsMi1hbmltYXRlLXN1Y2Nlc3MtaWNvbiAuc3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lLXJpZ2h0IHtcbiIrCiIgIC13ZWJraXQtYW5pbWF0aW9uOiBzd2FsMi1yb3RhdGUtc3VjY2Vzcy1jaXJjdWxhci1saW5lIDQuMjVzIGVhc2UtaW47XG4iKwoiICAgICAgICAgIGFuaW1hdGlvbjogc3dhbDItcm90YXRlLXN1Y2Nlc3MtY2lyY3VsYXItbGluZSA0LjI1cyBlYXNlLWluOyB9XG4iKwoiXG4iKwoiLnN3YWwyLWFuaW1hdGUtZXJyb3ItaWNvbiB7XG4iKwoiICAtd2Via2l0LWFuaW1hdGlvbjogc3dhbDItYW5pbWF0ZS1lcnJvci1pY29uIDAuNXM7XG4iKwoiICAgICAgICAgIGFuaW1hdGlvbjogc3dhbDItYW5pbWF0ZS1lcnJvci1pY29uIDAuNXM7IH1cbiIrCiIgIC5zd2FsMi1hbmltYXRlLWVycm9yLWljb24gLnN3YWwyLXgtbWFyayB7XG4iKwoiICAgIC13ZWJraXQtYW5pbWF0aW9uOiBzd2FsMi1hbmltYXRlLWVycm9yLXgtbWFyayAwLjVzO1xuIisKIiAgICAgICAgICAgIGFuaW1hdGlvbjogc3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmsgMC41czsgfVxuIisKIlxuIisKIkAtd2Via2l0LWtleWZyYW1lcyBzd2FsMi1yb3RhdGUtbG9hZGluZyB7XG4iKwoiICAwJSB7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cbiIrCiIgIDEwMCUge1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfSB9XG4iKwoiXG4iKwoiQGtleWZyYW1lcyBzd2FsMi1yb3RhdGUtbG9hZGluZyB7XG4iKwoiICAwJSB7XG4iKwoiICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7IH1cbiIrCiIgIDEwMCUge1xuIisKIiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4iKwoiICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfSB9XG4iKwoiXG4iKwoiQG1lZGlhIHByaW50IHtcbiIrCiIgIGJvZHkuc3dhbDItc2hvd246bm90KC5zd2FsMi1uby1iYWNrZHJvcCk6bm90KC5zd2FsMi10b2FzdC1zaG93bikge1xuIisKIiAgICBvdmVyZmxvdy15OiBzY3JvbGwgIWltcG9ydGFudDsgfVxuIisKIiAgICBib2R5LnN3YWwyLXNob3duOm5vdCguc3dhbDItbm8tYmFja2Ryb3ApOm5vdCguc3dhbDItdG9hc3Qtc2hvd24pID4gW2FyaWEtaGlkZGVuPSd0cnVlJ10ge1xuIisKIiAgICAgIGRpc3BsYXk6IG5vbmU7IH1cbiIrCiIgICAgYm9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wKTpub3QoLnN3YWwyLXRvYXN0LXNob3duKSAuc3dhbDItY29udGFpbmVyIHtcbiIrCiIgICAgICBwb3NpdGlvbjogaW5pdGlhbCAhaW1wb3J0YW50OyB9IH0iKTs="},{"meta":{"name":"darkmode-js.min.js","url":"https://cdn.jsdelivr.net/npm/darkmode-js@1.4.0/lib/darkmode-js.min.js","ts":1647165650071,"mimetype":"text/javascript"},"source":"IWZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoImRhcmttb2RlLWpzIixbXSx0KToib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0c1siZGFya21vZGUtanMiXT10KCk6ZVsiZGFya21vZGUtanMiXT10KCl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9e307ZnVuY3Rpb24gbihvKXtpZih0W29dKXJldHVybiB0W29dLmV4cG9ydHM7dmFyIGE9dFtvXT17aTpvLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGVbb10uY2FsbChhLmV4cG9ydHMsYSxhLmV4cG9ydHMsbiksYS5sPSEwLGEuZXhwb3J0c31yZXR1cm4gbi5tPWUsbi5jPXQsbi5kPWZ1bmN0aW9uKGUsdCxvKXtuLm8oZSx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxnZXQ6b30pfSxuLnI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKGUsdCl7aWYoMSZ0JiYoZT1uKGUpKSw4JnQpcmV0dXJuIGU7aWYoNCZ0JiYib2JqZWN0Ij09dHlwZW9mIGUmJmUmJmUuX19lc01vZHVsZSlyZXR1cm4gZTt2YXIgbz1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihvKSxPYmplY3QuZGVmaW5lUHJvcGVydHkobywiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6ZX0pLDImdCYmInN0cmluZyIhPXR5cGVvZiBlKWZvcih2YXIgYSBpbiBlKW4uZChvLGEsZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19LmJpbmQobnVsbCxhKSk7cmV0dXJuIG99LG4ubj1mdW5jdGlvbihlKXt2YXIgdD1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gbi5kKHQsImEiLHQpLHR9LG4ubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sbi5wPSIiLG4obi5zPTApfShbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5kZWZhdWx0PXZvaWQgMDt2YXIgbyxhPShvPW4oMSkpJiZvLl9fZXNNb2R1bGU/bzp7ZGVmYXVsdDpvfTt2YXIgcj1hLmRlZmF1bHQ7dC5kZWZhdWx0PXIsZnVuY3Rpb24oZSl7ZS5EYXJrbW9kZT1hLmRlZmF1bHR9KHdpbmRvdyksZS5leHBvcnRzPXQuZGVmYXVsdH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBvPXRbbl07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxvLmtleSxvKX19T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD12b2lkIDA7dmFyIGE9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpeyFmdW5jdGlvbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLGUpO3ZhciBuPXQmJnQuYm90dG9tfHwiMzJweCIsbz10JiZ0LnJpZ2h0fHwiMzJweCIsYT10JiZ0LmxlZnR8fCJ1bnNldCIscj10JiZ0LnRpbWV8fCIwLjNzIixkPXQmJnQubWl4Q29sb3J8fCIjZmZmIixpPXQmJnQuYmFja2dyb3VuZENvbG9yfHwiI2ZmZiIscz10JiZ0LmJ1dHRvbkNvbG9yRGFya3x8IiMxMDBmMmMiLGw9dCYmdC5idXR0b25Db2xvckxpZ2h0fHwiI2ZmZiIsYz10JiZ0LmxhYmVsfHwiIix1PXQmJnQuc2F2ZUluQ29va2llcyxtPSF0fHwhMSE9PXQuYXV0b01hdGNoT3NUaGVtZSxmPSJcbiAgICAgIC5kYXJrbW9kZS1sYXllciB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIGJhY2tncm91bmQ6ICIuY29uY2F0KGQsIjtcbiAgICAgICAgdHJhbnNpdGlvbjogYWxsICIpLmNvbmNhdChyLCIgZWFzZTtcbiAgICAgICAgbWl4LWJsZW5kLW1vZGU6IGRpZmZlcmVuY2U7XG4gICAgICB9XG5cbiAgICAgIC5kYXJrbW9kZS1sYXllci0tYnV0dG9uIHtcbiAgICAgICAgd2lkdGg6IDIuOXJlbTtcbiAgICAgICAgaGVpZ2h0OiAyLjlyZW07XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgcmlnaHQ6ICIpLmNvbmNhdChvLCI7XG4gICAgICAgIGJvdHRvbTogIikuY29uY2F0KG4sIjtcbiAgICAgICAgbGVmdDogIikuY29uY2F0KGEsIjtcbiAgICAgIH1cblxuICAgICAgLmRhcmttb2RlLWxheWVyLS1zaW1wbGUge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgIWltcG9ydGFudDtcbiAgICAgIH1cblxuICAgICAgLmRhcmttb2RlLWxheWVyLS1leHBhbmRlZCB7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMTAwKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAgIH1cblxuICAgICAgLmRhcmttb2RlLWxheWVyLS1uby10cmFuc2l0aW9uIHtcbiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLmRhcmttb2RlLXRvZ2dsZSB7XG4gICAgICAgIGJhY2tncm91bmQ6ICIpLmNvbmNhdChzLCI7XG4gICAgICAgIHdpZHRoOiAzcmVtO1xuICAgICAgICBoZWlnaHQ6IDNyZW07XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICByaWdodDogIikuY29uY2F0KG8sIjtcbiAgICAgICAgYm90dG9tOiAiKS5jb25jYXQobiwiO1xuICAgICAgICBsZWZ0OiAiKS5jb25jYXQoYSwiO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjVzIGVhc2U7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgfVxuXG4gICAgICAuZGFya21vZGUtdG9nZ2xlLS13aGl0ZSB7XG4gICAgICAgIGJhY2tncm91bmQ6ICIpLmNvbmNhdChsLCI7XG4gICAgICB9XG5cbiAgICAgIC5kYXJrbW9kZS1iYWNrZ3JvdW5kIHtcbiAgICAgICAgYmFja2dyb3VuZDogIikuY29uY2F0KGksIjtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgei1pbmRleDogLTEwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICB9XG5cbiAgICAgIGltZywgLmRhcmttb2RlLWlnbm9yZSB7XG4gICAgICAgIGlzb2xhdGlvbjogaXNvbGF0ZTtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgfVxuXG4gICAgICBAbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSksICgtbXMtaGlnaC1jb250cmFzdDogbm9uZSkge1xuICAgICAgICAuZGFya21vZGUtdG9nZ2xlIHtkaXNwbGF5OiBub25lICFpbXBvcnRhbnR9XG4gICAgICB9XG5cbiAgICAgIEBzdXBwb3J0cyAoLW1zLWltZS1hbGlnbjphdXRvKSwgKC1tcy1hY2NlbGVyYXRvcjp0cnVlKSB7XG4gICAgICAgIC5kYXJrbW9kZS10b2dnbGUge2Rpc3BsYXk6IG5vbmUgIWltcG9ydGFudH1cbiAgICAgIH1cbiAgICAiKSxwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt5LmlubmVySFRNTD1jLHAuY2xhc3NMaXN0LmFkZCgiZGFya21vZGUtbGF5ZXIiKSxnLmNsYXNzTGlzdC5hZGQoImRhcmttb2RlLWJhY2tncm91bmQiKTt2YXIgYj0idHJ1ZSI9PT13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oImRhcmttb2RlIiksaz1tJiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIpLm1hdGNoZXMsaD1udWxsPT09d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKCJkYXJrbW9kZSIpOyghMD09PWImJnV8fGgmJmspJiYocC5jbGFzc0xpc3QuYWRkKCJkYXJrbW9kZS1sYXllci0tZXhwYW5kZWQiLCJkYXJrbW9kZS1sYXllci0tc2ltcGxlIiwiZGFya21vZGUtbGF5ZXItLW5vLXRyYW5zaXRpb24iKSx5LmNsYXNzTGlzdC5hZGQoImRhcmttb2RlLXRvZ2dsZS0td2hpdGUiKSxkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImRhcmttb2RlLS1hY3RpdmF0ZWQiKSksZG9jdW1lbnQuYm9keS5pbnNlcnRCZWZvcmUoeSxkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQpLGRvY3VtZW50LmJvZHkuaW5zZXJ0QmVmb3JlKHAsZG9jdW1lbnQuYm9keS5maXJzdENoaWxkKSxkb2N1bWVudC5ib2R5Lmluc2VydEJlZm9yZShnLGRvY3VtZW50LmJvZHkuZmlyc3RDaGlsZCksdGhpcy5hZGRTdHlsZShmKSx0aGlzLmJ1dHRvbj15LHRoaXMubGF5ZXI9cCx0aGlzLnNhdmVJbkNvb2tpZXM9dSx0aGlzLnRpbWU9cn12YXIgdCxuLGE7cmV0dXJuIHQ9ZSwobj1be2tleToiYWRkU3R5bGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTt0LnNldEF0dHJpYnV0ZSgicmVsIiwic3R5bGVzaGVldCIpLHQuc2V0QXR0cmlidXRlKCJ0eXBlIiwidGV4dC9jc3MiKSx0LnNldEF0dHJpYnV0ZSgiaHJlZiIsImRhdGE6dGV4dC9jc3M7Y2hhcnNldD1VVEYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChlKSksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KX19LHtrZXk6InNob3dXaWRnZXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuYnV0dG9uLG49dGhpcy5sYXllcixvPTFlMypwYXJzZUZsb2F0KHRoaXMudGltZSk7dC5jbGFzc0xpc3QuYWRkKCJkYXJrbW9kZS10b2dnbGUiKSxuLmNsYXNzTGlzdC5hZGQoImRhcmttb2RlLWxheWVyLS1idXR0b24iKSx0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3ZhciBhPWUuaXNBY3RpdmF0ZWQoKTthPyhuLmNsYXNzTGlzdC5yZW1vdmUoImRhcmttb2RlLWxheWVyLS1zaW1wbGUiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5jbGFzc0xpc3QucmVtb3ZlKCJkYXJrbW9kZS1sYXllci0tbm8tdHJhbnNpdGlvbiIpLG4uY2xhc3NMaXN0LnJlbW92ZSgiZGFya21vZGUtbGF5ZXItLWV4cGFuZGVkIil9LDEpKToobi5jbGFzc0xpc3QuYWRkKCJkYXJrbW9kZS1sYXllci0tZXhwYW5kZWQiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5jbGFzc0xpc3QuYWRkKCJkYXJrbW9kZS1sYXllci0tbm8tdHJhbnNpdGlvbiIpLG4uY2xhc3NMaXN0LmFkZCgiZGFya21vZGUtbGF5ZXItLXNpbXBsZSIpfSxvKSksdC5jbGFzc0xpc3QudG9nZ2xlKCJkYXJrbW9kZS10b2dnbGUtLXdoaXRlIiksZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCJkYXJrbW9kZS0tYWN0aXZhdGVkIiksd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCJkYXJrbW9kZSIsIWEpfSl9fSx7a2V5OiJ0b2dnbGUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sYXllcix0PXRoaXMuaXNBY3RpdmF0ZWQoKTtlLmNsYXNzTGlzdC50b2dnbGUoImRhcmttb2RlLWxheWVyLS1zaW1wbGUiKSxkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoImRhcmttb2RlLS1hY3RpdmF0ZWQiKSx3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oImRhcmttb2RlIiwhdCl9fSx7a2V5OiJpc0FjdGl2YXRlZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoImRhcmttb2RlLS1hY3RpdmF0ZWQiKX19XSkmJm8odC5wcm90b3R5cGUsbiksYSYmbyh0LGEpLGV9KCk7dC5kZWZhdWx0PWEsZS5leHBvcnRzPXQuZGVmYXVsdH1dKX0pOw=="}]},{"name":"知网PDF下载助手","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":["http://image.cnki.net/*"],"orig_includes":["http*://*.cnki.net/*","http*://*.cnki.net.*/*","*/DefaultResult/Index*","*/defaultresult/index*","*/KNS8/AdvSearch*","*/detail.aspx*","*/CatalogViewPage.aspx*","*/Article/*","*/kns/brief/*","*/kns55/brief/*","*/grid2008/brief/*","*/detail/detail.aspx*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"sandbox":null,"tab_types":null,"unwrap":null},"storage":{"ts":1624620458198,"data":{}},"enabled":true,"position":4,"file_url":"https://greasyfork.org/scripts/390733-%E7%9F%A5%E7%BD%91pdf%E4%B8%8B%E8%BD%BD%E5%8A%A9%E6%89%8B/code/%E7%9F%A5%E7%BD%91PDF%E4%B8%8B%E8%BD%BD%E5%8A%A9%E6%89%8B.user.js","uuid":"eef4c09c-6690-4b12-95b8-53ee929e4614","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgIOefpee9kVBERuS4i+i9veWKqeaJiwovLyBAdmVyc2lvbiAgICAgICAgMy43LjEwCi8vIEBhdXRob3IgICAgICAgICBTdXBlcm5vdmEKLy8gQGRlc2NyaXB0aW9uICAgIOebtOaOpeS4i+i9veefpee9kVBERuagvOW8j+iuuuaWhzsg5LiL6L295Y2a5aOr6K665paH55uu5b2VOyDmibnph4/kuIvovb3mlofnjK4KLy8gQGluY2x1ZGUgICAgICAgIGh0dHAqOi8vKi5jbmtpLm5ldC8qCi8vIEBpbmNsdWRlICAgICAgICBodHRwKjovLyouY25raS5uZXQuKi8qCi8vIEBpbmNsdWRlICAgICAgICAqL0RlZmF1bHRSZXN1bHQvSW5kZXgqCi8vIEBpbmNsdWRlICAgICAgICAqL2RlZmF1bHRyZXN1bHQvaW5kZXgqCi8vIEBpbmNsdWRlICAgICAgICAqL0tOUzgvQWR2U2VhcmNoKgovLyBAaW5jbHVkZSAgICAgICAgKi9kZXRhaWwuYXNweCoKLy8gQGluY2x1ZGUgICAgICAgICovQ2F0YWxvZ1ZpZXdQYWdlLmFzcHgqCi8vIEBpbmNsdWRlICAgICAgICAqL0FydGljbGUvKgovLyBAaW5jbHVkZSAgICAgICAgKi9rbnMvYnJpZWYvKgovLyBAaW5jbHVkZSAgICAgICAgKi9rbnM1NS9icmllZi8qCi8vIEBpbmNsdWRlICAgICAgICAqL2dyaWQyMDA4L2JyaWVmLyoKLy8gQGluY2x1ZGUgICAgICAgICovZGV0YWlsL2RldGFpbC5hc3B4KgovLyBAZXhjbHVkZSAgICAgICAgaHR0cDovL2ltYWdlLmNua2kubmV0LyoKLy8gQHJ1bi1hdCAgICAgICAgIGRvY3VtZW50LWlkbGUKLy8gQGljb24gICAgICAgICAgIGh0dHBzOi8vY25raS5uZXQvZmF2aWNvbi5pY28KLy8gQGdyYW50ICAgICAgICAgIHVuc2FmZVdpbmRvdwovLyBAZ3JhbnQgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkCi8vIEBncmFudCAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgICAgR01fbm90aWZpY2F0aW9uCi8vIEBsaWNlbnNlICAgICAgICBNSVQKLy8gQG5hbWVzcGFjZSBodHRwczovL2dpdGh1Yi5jb20vc3VwZXJub3ZhWmhhbmdKaWFYaW5nL1RhbXBlcm1vbmtleS8KLy8gPT0vVXNlclNjcmlwdD09CgondXNlIHN0cmljdCc7CnZhciAkID0gdW5zYWZlV2luZG93LmpRdWVyeTsKCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgdmFyIG15dXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICB2YXIgaXNEZXRhaWxQYWdlID0gbXl1cmwubWF0Y2goLyhhcnRpY2xlfGRldGFpbFwuYXNweCkvZykgPyB0cnVlOiBmYWxzZTsgLy8g54K56L+b5paH54yu5ZCO55qE6K+m5oOF6aG1CgogICAgaWYgKGlzRGV0YWlsUGFnZSA9PT0gZmFsc2UpIHsKICAgICAgICAvLyDlr7nlupTmma7pgJrmo4DntKLlkozpq5jnuqfmo4DntKIKICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigia25zOCIpICE9IC0xIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIktOUzgiKSAhPSAtMSl7CiAgICAgICAgICAgICQoZG9jdW1lbnQpLmFqYXhTdWNjZXNzKGZ1bmN0aW9uKGV2ZW50LCB4aHIsIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MudXJsLmluZGV4T2YoJy9CcmllZi9HZXRHcmlkVGFibGVIdG1sJykgKyAxKSB7CiAgICAgICAgICAgICAgICAgICAgLy8g5aaC5p6c5piv5Zu95YaF54mILCDmlLnmiJDmtbflpJbniYgKICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiY2huLm92ZXJzZWEiKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICQoJy5mejE0JykubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5mejE0JykuZXEoaSkuYXR0cignaHJlZicsICJodHRwczovL2Nobi5vdmVyc2VhLmNua2kubmV0L2tjbXMvZGV0YWlsL2RldGFpbC5hc3B4IiArICQoJy5mejE0JykuZXEoaSkuYXR0cignaHJlZicpLnJlcGxhY2UoJ1wva25zOFwvRGV0YWlsJywgJycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyDkv67mlLnkuIvovb3mjInpkq4KICAgICAgICAgICAgICAgICAgICB2YXIgZG93bl9idG5zID0gJCgnLmRvd25sb2FkbGluaycpOwogICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkb3duX2J0bnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG93bl9idG5zLmVxKGkpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjQzdGRkZGJykubW91c2VvdmVyKGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aXRsZT0iQ0FK5LiL6L29IjsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwZGZfZG93bl9idG4gPSBkb3duX2J0bnMuZXEoaSkuY2xvbmUoKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnI0M3RkZDNycpLm1vdXNlb3ZlcihmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGl0bGU9IlBERuS4i+i9vSI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBwZGZfZG93bl9idG4uYXR0cignaHJlZicsICJodHRwczovL2Nobi5vdmVyc2VhLmNua2kubmV0IiArIHBkZl9kb3duX2J0bi5hdHRyKCdocmVmJykpCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25fYnRucy5lcShpKS5hZnRlcihwZGZfZG93bl9idG4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyDlnKjlkI7pnaLmlrDlop7kuIDkuKrmibnph4/kuIvovb3mjInpkq4sIOWKn+iDveS4uuS4i+i9vXBkZuagvOW8j+iuuuaWhwogICAgICAgICAgICAgICAgICAgICQoJy5idWxrZG93bmxvYWQuZXhwb3J0JykuZXEoMCkuYWZ0ZXIoJCgnLmJ1bGtkb3dubG9hZC5leHBvcnQnKS5lcSgwKS5jbG9uZSgpLmh0bWwoJCgnLmJ1bGtkb3dubG9hZC5leHBvcnQnKS5lcSgwKS5odG1sKCkucmVwbGFjZSgn5LiL6L29JywgJ1BERicpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdidWxrZG93bmxvYWQnKS5jbGljayhmdW5jdGlvbiAoKSB7IC8vIOeCueWHu+S4i+i9veaMiemSruWQjueahOihjOS4ugogICAgICAgICAgICAgICAgICAgICAgICAvLyDojrflj5bliLDli77pgInnmoTmlofnjK4sIOS4i+i9veWFtnBkZueJiAogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICQoJ2lucHV0LmNiSXRlbScpLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCgnaW5wdXQuY2JJdGVtJykuZXEoaSkuYXR0cignY2hlY2tlZCcpID09ICdjaGVja2VkJykgeyAvLyDlj6rpkojlr7nli77pgInkuK3nmoRpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAoMTAwMCkudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oJCgnLmRvd25sb2FkbGluaycpLmVxKDIgKiBpICsgMSkuYXR0cignaHJlZicpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJC5maWxlbmFtZUNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgfSkuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNDN0ZGQzcnKSk7CiAgICAgICAgICAgICAgICAgICAgJCgnLmJ1bGtkb3dubG9hZC5leHBvcnQnKS5lcSgwKS5odG1sKCQoJy5idWxrZG93bmxvYWQuZXhwb3J0JykuZXEoMCkuaHRtbCgpLnJlcGxhY2UoJ+S4i+i9vScsICdDQUonKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnYnVsa2Rvd25sb2FkJykuY2xpY2soZnVuY3Rpb24gKCkgeyAvLyDngrnlh7vkuIvovb3mjInpkq7lkI7nmoTooYzkuLoKICAgICAgICAgICAgICAgICAgICAgICAgLy8g6I635Y+W5Yiw5Yu+6YCJ55qE5paH54yuLCDkuIvovb3lhbZjYWrniYgKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkKCdpbnB1dC5jYkl0ZW0nKS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoJ2lucHV0LmNiSXRlbScpLmVxKGkpLmF0dHIoJ2NoZWNrZWQnKSA9PSAnY2hlY2tlZCcpIHsgLy8g5Y+q6ZKI5a+55Yu+6YCJ5Lit55qEaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwKDEwMDApLnRoZW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKCQoJy5kb3dubG9hZGxpbmsnKS5lcSgyICogaSkuYXR0cignaHJlZicpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJC5maWxlbmFtZUNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgfSkuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNDN0ZGRkYnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoJ3RoJykuZXEoOCkuY3NzKCd3aWR0aCcsICcxNCUnKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8g5Y+q5a+5IuWNmuehleiuuuaWhyLor6bmg4XpobXlgZrkvJjljJYsIOWQpuWImeW9seWTjeacn+WIiumhtemdoueahOaYvuekugogICAgICAgIC8vIOadpeiHqjogaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzM3MTkzOAogICAgICAgIGlmIChsb2NhdGlvbi5zZWFyY2gubWF0Y2goL2RiY29kZT1DW0RNXVtGTV1EL2kpIHx8ICQoJy5idG4taHRtbCcpLmh0bWwoKSA9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgLy8g5pW05pys5LiL6L295pu/5o2i5Li6Q0FK5LiL6L29CiAgICAgICAgICAgICQoIi5idG4tZGxjYWoiKS5maXJzdCgpLmh0bWwoJCgiLmJ0bi1kbGNhaiIpLmZpcnN0KCkuaHRtbCgpLnJlcGxhY2UoIkNBSuaVtOacrCIsICJDQUoiKSk7IC8vIOato+WImeS4jeefpeS4uuS7gOS5iOeUqOS4jeS6huS6hgogICAgICAgICAgICB2YXIgcGRmX3VybDsKICAgICAgICAgICAgdmFyIHBkZl9kb3duOwogICAgICAgICAgICB2YXIgY29udGVudF91cmw7CiAgICAgICAgICAgIGlmIChteXVybC5pbmRleE9mKCdjaG4ub3ZlcnNlYScpICE9IC0xKSB7IC8vIOi/m+WFpeS6hua1t+WklueJiOmhtemdogogICAgICAgICAgICAgICAgLy8g5Yig6Zmk5Y6f5aeLUERG5LiL6L295oyJ6ZKu5bm26I635Y+WcGRm5paH5Lu255qEdXJsCiAgICAgICAgICAgICAgICBwZGZfdXJsID0gJCgiLmJ0bi1kbHBkZiIpLnJlbW92ZSgpLmZpbmQoImEiKS5hdHRyKCJocmVmIik7CiAgICAgICAgICAgICAgICAvLyDmt7vliqDmlrDnmoRQREbkuIvovb0KICAgICAgICAgICAgICAgIHBkZl9kb3duID0gJCgnPGxpIGNsYXNzPSJidG4tZGxwZGYiPjxhIG9uY2xpY2s9IldyaXRlS3JzRG93bkxvZygpIiB0YXJnZXQ9Il9ibGFuayIgaWQ9InBkZkRvd24iIG5hbWU9InBkZkRvd24iIGhyZWY9JyArIHBkZl91cmwgKyAnID48aT48L2k+UERG5LiL6L29PC9hPjwvbGk+Jyk7CiAgICAgICAgICAgICAgICAkKCIuYnRuLWRsY2FqIikuZmlyc3QoKS5hZnRlcihwZGZfZG93bik7CiAgICAgICAgICAgICAgICAvLyDku47liIbnq6DkuIvovb3ojrflj5bnm67lvZXnmoRVUkwKICAgICAgICAgICAgICAgIGlmICgkKCIjY2FqRG93bjEiKS50ZXh0KCkudHJpbSgpID09ICdDQUrliIbnq6DkuIvovb0nKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGVudF91cmwgPSAkKCIjY2FqRG93bjEiKS5hdHRyKCJocmVmIikgfHwgJz8nOwogICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdXJsID0gImh0dHBzOi8vY2huLm92ZXJzZWEuY25raS5uZXQva2Ntcy9EZXRhaWwvRG93bkRldGFpbC5hc3B4IiArIGNvbnRlbnRfdXJsLm1hdGNoKC9cPy4qLylbMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRfdXJsLmluZGV4T2YoIiZkb3dudHlwZT1jYXRhbG9nIikgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF91cmwgPSBjb250ZW50X3VybCArICImZG93bnR5cGU9Y2F0YWxvZyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHttZXRob2Q6ICdHRVQnLCB1cmw6IGNvbnRlbnRfdXJsLCBvbmxvYWQ6IG1hbmFnZV9jb250ZW50c30pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgeyAvLyDov5vlhaXkuoblm73lhoXniYjpobXpnaIKICAgICAgICAgICAgICAgIC8vICQoIiNwZGZEb3duIikuaHRtbCgkKCIjcGRmRG93biIpLmh0bWwoKS5yZXBsYWNlKCLliIbpobXkuIvovb0iLCAiUERG5LiL6L29IikpOwogICAgICAgICAgICAgICAgLy8gR01feG1saHR0cFJlcXVlc3Qoe21ldGhvZDogJ0dFVCcsIHVybDogImh0dHBzOi8vY2huLm92ZXJzZWEuY25raS5uZXQvS0NNUy9kZXRhaWwvZGV0YWlsLmFzcHgiICsgd2luZG93LmxvY2F0aW9uLmhyZWYubWF0Y2goL1w/LiovKVswXSwgb25sb2FkOiBmdW5jdGlvbiAoeGhyKSB7CiAgICAgICAgICAgICAgICAvLyAgICAgJCgiI3BkZkRvd24iKS5hdHRyKCdocmVmJywgImh0dHBzOi8vY2huLm92ZXJzZWEuY25raS5uZXQiICsgJCgiI3BkZkRvd24xIiwgeGhyLnJlc3BvbnNlVGV4dCkuYXR0cigiaHJlZiIpKTsKICAgICAgICAgICAgICAgIC8vIH19KTsKICAgICAgICAgICAgICAgIC8vIOS7juWIhueroOS4i+i9veiOt+WPluebruW9leeahFVSTAogICAgICAgICAgICAgICAgaWYgKCQoIi5idG4tZGxjYWoiKS5lcSgxKS50ZXh0KCkudHJpbSgpID09ICfliIbnq6DkuIvovb0nKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGVudF91cmwgPSAkKCIuYnRuLWRsY2FqIikuZXEoMSkuZmluZCgnYScpLmF0dHIoImhyZWYiKSB8fCAnPyc7CiAgICAgICAgICAgICAgICAgICAgY29udGVudF91cmwgPSAiaHR0cHM6Ly9rbnMuY25raS5uZXQva2Ntcy9EZXRhaWwvRG93bkRldGFpbC5hc3B4IiArIGNvbnRlbnRfdXJsLm1hdGNoKC9cPy4qLylbMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRfdXJsLmluZGV4T2YoIiZkb3dudHlwZT1jYXRhbG9nIikgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF91cmwgPSBjb250ZW50X3VybCArICImZG93bnR5cGU9Y2F0YWxvZyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHttZXRob2Q6ICdHRVQnLCB1cmw6IGNvbnRlbnRfdXJsLCBvbmxvYWQ6IG1hbmFnZV9jb250ZW50c30pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIOWPs+S+p+a3u+WKoOS9v+eUqOivtOaYjgogICAgICAgICAgICAkKCIub3BlcmF0ZS1idG4iKS5hcHBlbmQoJCgnPGxpIGNsYXNzPSJidG4tcGhvbmUiPjxhIHRhcmdldD0iX2JsYW5rIiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJ2hyZWY9Imh0dHBzOi8vbXAud2VpeGluLnFxLmNvbS9zP19fYml6PU16VTVNVFk0TkRVek1nPT0mbWlkPTIyNDc0ODQzODQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyZpZHg9MSZzbj02YTEzNWU4MjQ3OTNkMjZiNWJkODg4NGI3OGMxZjc1MSZjaGtzbT1mZTJhNzUzYmM5NWRmYzJkM2E1ZjYnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJzM4MzU1M2ZjMzY5ODk0YzUwMjE2MTljODViYjc1NTQ1ODNiZGNiOGMxMDYyNGJmMmE3MDk3ZTEmdG9rZW49NDYyNjUxNDkxJmxhbmc9emhfQ04jcmQiPjxpPjwvaT7ohJrmnKzor7TmmI48L2E+PC9saT4nKSk7CiAgICAgICAgICAgIC8vIOWPs+S+p+W6lemDqOa3u+WKoOW3peWFt+S4i+i9vShQZGdDb250ZW50RWRpdG9yKQogICAgICAgICAgICAkKCIub3B0cy1kb3duIikuZXEoMCkuYXBwZW5kKCQoJzxkaXYgY2xhc3M9ImZsIGluZm8iIHN0eWxlPSJmb250LXNpemU6IDEzcHg7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2RkZDsiPjxwIGNsYXNzPSJ0b3RhbC1pbmZvcm0iIHN0eWxlPSJtYXJnaW4tbGVmdDogM3B4Ij4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICc8c3Bhbj48YSBocmVmPSJodHRwczovL3Bhbi5iYWlkdS5jb20vcy8xVm9KbEVxUG5QTjhINm9rbEFaMGJHUSIgdGFyZ2V0PSJfYmxhbmsiPueCueWHu+S4i+i9veebruW9leWQiOW5tui9r+S7tuWPiuivtOaYjjwvYT48YnIgLz7mj5Dlj5bnoIE6IHk3N2Y8YnIgLz7kuIvovb1QREbor7fliY3lvoDnn6XnvZHmtbflpJbniYg8L3NwYW4+JykpCiAgICAgICAgfQogICAgICAgIC8vIOenu+mZpOWFs+S6jkNBSueahOS/oeaBrwogICAgICAgICQoIi5mbC5pbmZvIikuZmluZCgiZGl2IikucmVtb3ZlKCk7CiAgICB9Cn0pOwoKLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk1MTA1Ny83Nzk1MTI4CmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHsKICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGltZSkpOwp9CgpmdW5jdGlvbiBnZXRfY29udGVudChjbnRfbGlzdCl7CiAgICAvLyDmtbflpJbniYjkuIvovb3nm67lvZXnmoTmlrnms5XkuI3ooYzkuoYsIOaUueS7juWIhueroOS4i+i9vei9rOaNogogICAgdmFyIGNvbnRlbnRzID0gIiI7CiAgICBjbnRfbGlzdC5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjbnRfaXRlbSA9ICQodGhpcykuZmluZCgnYScpLnRleHQoKTsKICAgICAgICB2YXIgY250X3BhZ2UgPSAkKHRoaXMpLmZpbmQoJy5wYWdlJykudGV4dCgpLnNwbGl0KCctJylbMF07CiAgICAgICAgdmFyIHByZXZfc3BhY2VfbGVuZ3RoID0gJCh0aGlzKS5hdHRyKCdjbGFzcycpLnNwbGl0KCctJylbMV0gKiA0OwogICAgICAgIGNvbnRlbnRzID0gY29udGVudHMgKyBjbnRfaXRlbS50cmltKCkucmVwbGFjZSgvJm5ic3A7L2csICIgIikucGFkU3RhcnQocHJldl9zcGFjZV9sZW5ndGggKyBjbnRfaXRlbS50cmltKCkubGVuZ3RoLCAnICcpICsgIlx0IiArIGNudF9wYWdlICsgIlxyXG4iOwogICAgfSkKICAgIHJldHVybiBjb250ZW50czsKfQoKLy8g5p2l6IeqOiBodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvMzcxOTM4CmZ1bmN0aW9uIG1hbmFnZV9jb250ZW50cyh4aHIpIHsKICAgIHZhciBjbnRfbGlzdCA9ICQoIi5scy1jaGFwdGVycyIsIHhoci5yZXNwb25zZVRleHQpOwogICAgdmFyIGNvbnRlbnRzID0gZ2V0X2NvbnRlbnQoY250X2xpc3QpOyAvLyDnm67lvZXlhoXlrrkKICAgIC8vIOa3u+WKoOebruW9leWkjeWItgogICAgJCgnLmJ0bi1kbHBkZicpLmZpcnN0KCkuYWZ0ZXIoJCgnPGxpIGNsYXNzPSJidG4tZGxwZGYiPjxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiPuebruW9leWkjeWItjwvYT48L2xpPicpLmNsaWNrKGZ1bmN0aW9uKCkgewogICAgICAgIEdNX3NldENsaXBib2FyZChjb250ZW50cyk7IC8vIOi/kOeUqOayueeMtOiEmuacrOiHquW4pueahOWkjeWItuWHveaVsAogICAgICAgIEdNX25vdGlmaWNhdGlvbign55uu5b2V5bey5aSN5Yi25Yiw5Ymq6LS05p2/Jyk7CiAgICB9KSk7CiAgICAvLyDmt7vliqDnm67lvZXkuIvovb0KICAgICQoJy5idG4tZGxwZGYnKS5maXJzdCgpLmFmdGVyKCQoJzxsaSBjbGFzcz0iYnRuLWRsY2FqIj48YT7nm67lvZXkuIvovb08L2E+PC9saT4nKS5jbGljayhmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZGF0YSA9IG5ldyBCbG9iKFtjb250ZW50c10se3R5cGU6InRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgifSk7CiAgICAgICAgJCh0aGlzKS5maW5kKCdhJykuYXR0cigiZG93bmxvYWQiLCAn55uu5b2VXycgKyAkKCcud3gtdGl0IGgxOmZpcnN0LWNoaWxkKCknKS50ZXh0KCkudHJpbSgpICsgJy50eHQnKTsKICAgICAgICAkKHRoaXMpLmZpbmQoJ2EnKS5hdHRyKCJocmVmIiwgd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoZGF0YSkpOwogICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKGRhdGEpOwogICAgfSkpOwp9Cg=="},{"name":"searchEngineJump 搜索引擎快捷跳转","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":["*://mega.nz/*"],"orig_includes":[],"orig_matches":["*://**/*"],"orig_noframes":null,"orig_run_at":"document-end","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"sandbox":null,"tab_types":null,"unwrap":null},"storage":{"ts":1674998952767,"data":{"searchEngineJumpData":"o{\"status\": 1,\"message\": \"$相关说明$(status: 这个在将来或许很重要)...(version: 若有新功能加入,靠这个版本号识别)...(addSearchItems: 允许更新时,添加新的搜索网站到你的搜索列表)...(modifySearchItems: 允许更新时,修改你的搜索列表中的项目)...(closeBtn: 设置页面右上角的“关闭”按钮是否显示。true显示,false隐藏)...(newtab: 新标签页打开。0为默认设置,1为新标签页打开)...(foldlist: 折叠当前搜索分类列表。true为折叠,false为展开。)...(setBtnOpacity: 设置按钮的透明度,值为0-1之间的数,0为透明,1为完全显示,中间值半透明。注:-1为直接关闭按钮,关闭之前请确定自己知道如何再次打开它)...(debug: debug模式,开启后,控制台会输出一些信息,“关闭并保存”按钮将不会在刷新页面)...(fixedTop: 将搜索栏固定到顶端。 true开启,false关闭)...(fixedTopUpward: 固定顶端后,搜索栏下拉不会出现,只有上拉时才出现。 true开启,false关闭)...(baiduOffset: 在百度页面鼠标划过的菜单会出现位移,若有使用其他的style样式,可以修改这个来修复二级菜单的偏移)...(getIcon: 自己添加搜索后获取图标的方式。0为自动,能连接谷歌的情况下用谷歌获取,无法连接的情况下,域名加favicon.ico获取;1为域名加favicon获取,2为使用谷歌获取,3为使用dnspot的服务获取(不建议使用)。或者添加网址,关键字使用%s代替,未测试)...(allOpen:一键搜索,点击相关分类后,打开该分类下的所有搜索)...(HideTheSameLink:隐藏同站链接。默认开启,百度页面会隐藏百度搜索。如果想在同一个搜索网站,但是想通过不同语言来搜索, 可以选择false来实现)...(center:是否居中显示,主要是为了兼容脚本 ac 百度 : 0 不居中,强制在左。 1, 强制居中 。 2,自动判断)...(icon: 图标的显示方式, 0 关闭文字, 只保留图标, 1 显示网站图标,2 显示抽象图标。当脚本中不存在抽象图标时,显示网站图标)...(transtion: 是否有动画效果, true为开启所有动画效果,false关闭所有动画(包括模糊效果)。)(engineDetails: 第一个值为分类列表标题名称,第二个值与enginelist相关联,必须匹配,第三个值true为显示列表,false为禁用列表。排列顺序与跳转栏上的显示顺序相同,可以用它将分类列表按自己喜欢排序)...(engineList: 各个搜索的相关信息)(rules: 已弃用--将搜索样式插入到目标网页,同脚本中的rules设置相同,优先级高于脚本中自带的规则。自带了360搜索,可仿写)...\",\"version\": 5,\"addSearchItems\": true,\"modifySearchItems\": true,\"connectToTheServer\": true,\"closeBtn\": true,\"newtab\": 0,\"foldlist\": true,\"setBtnOpacity\": \"0.8\",\"debug\": false,\"fixedTop\": true,\"fixedTopUpward\": false,\"baiduOffset\": -120,\"getIcon\": 0,\"engineDetails\": [[\"网页\",\"web\",true],[\"翻译\",\"translate\",true],[\"知识\",\"knowledge\",true],[\"图片\",\"image\",true],[\"视频\",\"video\",true],[\"音乐\",\"music\",true],[\"学术\",\"scholar\",true],[\"社交\",\"sociality\",true],[\"购物\",\"shopping\",true],[\"下载\",\"download\",true],[\"新闻\",\"news\",true],[\"mine\",\"mine\",true]],\"engineList\": {\"web\": [{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAD1klEQVR4nMWXbWhbVRjHf+cmTZq3hU67tcvmaql2L2q3FdTqkEodTESZ+GEKExX3YTrRyhCmMnDgCkP8EHwBnV+UMRyIiGLZLG7TMq22MsegOErrSmnarFub0CbN6z1+KLnNzb1JbmLF59M5T57z/H835zlvQkopqcCklBQbIoRACFFJOoQVgJyooiiWkqqqahmmJEClwtWAFAVQVbVq4UpymQIUG5CdmiR5/gfSl4bIjI+hRiMgJcoqP7aNzTjaduDs2o0tsMEyhAHALDA7HSL26Qck+89BuZIRAueDnXgOvIatYV1ZCB2AWUCir5eF4HFkYrG0cCGHy43v0Ns4O3eVhNBaZsUW//Jz5o+/U7E4gFyMkxr81eBXFEW3jO35APnVmujrJfbZR6bJ7c0tOO59AFtjAIQgG5okNfgLmdERLab2sSfxdR82h8vTEnLJdOLZqUnm9j+DTCZ0A22NAbzdh3G032eaODU0wPz7x3Du7MR78JBpTCGEkFLKwnmJBV8l/t2AbkDN5rvw9wQRPl/pxPEYwu0pGQPLtWBYBXJxjGz/FuLnGkkO1QOgrL6FuhOnUPx1ZRNXakrhNiDDp8Gm4t41iWfPNYRD4nnx4H8iLqXEXjj/cvaC1nZsjmAPeHF07V5xcQ3A4IwN6/q2O+4HuyFMs66emGXBI3ucdG7R5zLujekZXVe4WiwLlLNQxLiLrsxpY9FSGSsANfW6royPGEKqNY/TeCwbJld4tyJnw1p/OjLMGjVDjWJeBz++Zb7m/55R2X9Cv4Wv9RsBlMLLgqh7WGufSa7n6VAzvdd+MhUpZb+PZg2+Oxttei0hTADW7iWNnfcW7uHo/A4S2Pj4yiluJiKWxRcSkq9+S+t8t92q0FDwDwghlmpAVdVlp6uJTzxv8nWiSfPNJqJ0/9xDNDVfVjydhXe/STIb0xfco236KcxpKjmSfNt79wHc9lqd76+5MfadfYP+0B9FxUci47z0/WkGx1I6/2qP4PHtegDdaZgjyj+Qzoz3c2QgaCrUtCpAR8N2NngbEEJwffEml64Pc/nGVSQSW6IFd/gVRGZp+z76VC07W5fnP19LAyjckgFOXv2W4J9fFP3iUiayPlzhl3mhvY3nH3LofsvX0j5ZCKGrBYB9rU9wrON13HZXxQCKPc6zj0wZxHNXdU3XyqV0On6DDy+fpG/iIqqFh1T7mq10b3uOTXXNBvGSl9JSgQBTsRn6Ji4yGL7CaHSCuWQUKcHv9LHRt45t9ZvoWt9Ba93thrGWr+XlBlRjFT9Mcva/Ps3+DciKPU5LwZgmq+J5/g/N4OUGvdHwnQAAAABJRU5ErkJggg==\",\"name\": \"Google\",\"url\": \"https://www.google.com/search?q=%s&ie=utf-8&oe=utf-8\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABpElEQVR4nKWTvUtbURjGfzcf5prqEBFMBpWCHUIVISKRoIgQ3QQRRNBM1UHqX+AiLg4uQpeCiKigIkIkf4DgYAmVQBDEL2iHVIsfaGpi1Nxrck+HaGLMzSB5xuec9znP+5z3lYQQghJgKKW4qMDW9gPNbaf4AwkA5hbiTE1HSWuFd016AhubCZ6eBEurdzgcJr59vwXA45bp8VqLO4j+yzxhtWboKpuB8/NU9vyF13UQ3lPwjVzibpWZnLAhWySGByupqzWxG1JoaizjU4OZ4G4Sj1vOKYhnzMxGhdMVEU5XRPz6rQo9dHSfCacrIlbW41ku68lhz5iRLRLV1UYOjlT6hy4Y8F1w9jdFUhFc36QBODxSC1sYGqzEZjPwsd5MLKbxZeyKu0Qmk9HxK9YW7XjcMqGwgrcrF6T0dpCub9L4Ri75c5p6TdP0uYzl+Rpki1T8F2JxTbcYYP9AZfRrzpWugD+Q0C1+QXhPwR+4Ly5gNufb04Om5a9O3iT29X5gJ/jIj2CSuloTne3lGI3wM6RwfKLS2mJhoL8iT6AgxPei5G38Dx7mvwaRBxETAAAAAElFTkSuQmCC\",\"name\": \"百度\",\"url\": \"https://www.baidu.com/s?wd=%s&ie=utf-8\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB5ElEQVQ4jZ2Tv0sbYRyHX5Uzl8bLVNrSToUOHbr0T2gHqf1Baf8AvcUruNcpd5e75BK9H0Q9gptCogZKh6J2kWtDhkpxkmCwOIidijpYECoI5unQNo0QauwHnuUD78PL9/2+on9w0ItrWiSraiSNjER9w8NRTFUjuQvimhaJuKZ9ThaLJHyfGzMz3AxDRC6H7LooQYDi+50JApJhiJBVNVJ8nx7TZKhU4svhIYX1dW4XCsRsm4FstjOOg+K6fwXCMHiysMCfvKhUELp+OcHjcrkleL60hEil/l/wslKhxzAQuk6vaRLPZC5/g9dra5jVKvdnZ5FtG5FKIVkWSjeCB3NzvFpeBuD7yQnvd3YYW13lztQUsm1fLHhUKnE1n6e+v0973mxtIaXTJDKZLoY4Ps71yUneNhqt/uPuLrJlceUiwcP5ea5NTJCt1fh2fNzq321vI6XT/xacNZuUNzdpHBy0Dp41m1Tqde4Vi/RbVucZPG1bpPbU9vZ4triIlE7TZ5qdXyFmWdzyfYobG/w4PQXg69ERYysrKI6D0PXzu9Am+KAEAYrjELNthGEwVC5jVqvcDUOErv/6E45znlwOxfMQ8ujop2QYorguiueRcF16HQeRzSLl8wz87hXXPY/nkZye5icfi28JEi0cegAAAABJRU5ErkJggg==\",\"name\": \"必应\",\"url\": \"https://cn.bing.com/search?q=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADiElEQVQ4jXWTfVDTBRjHn+uyi8KAbWz7/TbeNzeUeNkLCljGS3hrspDUsC7vqivz5cI/OtQ7vSxNrpvdkQx0k10M5FYgztECgfOoM7kurs6IFx1ja7xsgMiLAySDffvDtLrs8/fz+T7PH8+X6BFIQymxOGb1WyWy8COH13LL9svCSgtEoTt4RMyj5h/CIRKfSImsMKu4NrOKZ6vZwDafz2Tbajaw9ur1wibzemHj+7Lwo0S06j9yYtgqRX0m216lFDS0FCR3Obcl3/FvFmJCFwt/0Rr0aOPGrVlsuymduVShEljDiCL+3hxCUbWZTLtBwfuqXyeZCThqsTTUj0BrPUZ2psGTE4mxQilmt8twLT/WVaUSXvgsjW8hoseJiOhYUuTpSqWw8YYmPjC6JQ5TtXqsLAYAAMu3fLj9eSk8eQw8OimmXpGjMzfWaU5nv94RvfodkoQ+se6cmm2+tDGqe1Ijxm+HXsd4IIi5+WUAQBDA6MRdePdq4c4Xw12wBlNFifginW0tTxN8Sa9Gh+02qlh7v0ayOJTNh8d4Ev7AMq4P+BAM3g/4rm8KvdVn4H6exWCOHMMaOTqzY1wGJXORDkg5H1ermZYRnQyubCEG9R/Av7CCsnOd+P3eCgCg68YCbnZ0YGyXCLf0AowfjML1PMm8UcHaqVTOO1WjFnWMFMjgyhWjZ48OC3/cPx9YRnD6POArAoZSsfT9k7jTEIHR/THoyZXerVYzLfReQvjRs0qRw7NFBmd+HH4pTMXk6Mhf/jTg4WDGRBjex4f33Th43ojHoEaG7nzJXKWSsdHLwmd2VSmE9h9flMwNaqT4NSca3mudeMCs4xDGj4fgdiUfc1YOJssF8OpkcGTF9FUomIvEIRIb0li7RSX+dqxAjt6NAgxYDA8Dpq116E+JhHdzPJxaKfpyZBjWymFQsPZPkvgWIiLancA9Up7C2K5sivd6XxCh98MS+JYmMDzvxqJ7AN2FctSVKtC9dS18LyWiXh3dZVKK257jPaV98IxPn0oWNpYlCera1cxN/55itLpt2H45A3uvbMObjiy89pMWP7ydioZk0dXyFNZWIuGW/asLoUR8fZLQenod325MlzsuXLVMHnMeRIXrLC67G4OHP8roPZ4hajI9y7YdSOB9+n+FfKw4KmLfSUlEbdPOvJ9dJv3sUnMTZmqM9yypsd+ckHLNm7ghW/8p/Alp3+8i87OHIgAAAABJRU5ErkJggg==\",\"name\": \"DDG\",\"url\": \"https://duckduckgo.com/?q=%s\",\"disable\": \"true\"},{\"favicon\": \"data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB60lEQVR4nIWTvWtTURTAf+e+GpPWRFptmigIDhWELo5+DKLCMxZEJfVjEhTqok4O/geik2MdOuhUm4ogpTS6iNQoRV3sIOqQgpiX2NKEprH58B2HvMQEUnO3ezi/3/m4XKHD2fvywrCr1oirbvWPuh9XYs8znfIApPUSmR97KHAbaY8rVIBxx0487iz4ML4tsrrmCAxsVckTpRw7cbQ1ZgCiq2vLDViVSatAb8ZOSMZOiEttCFj0qh2Jzo8l2jqIJOM3BJmowxJ3Tk8/61Q9koxPCnINwHXN/mzsaRrACDzwcl5vBQM49sx1VDcARNxHLSNIqG51b/5vfgAVuV/vm+NtOwAI6sb3rgKVhTqP75+gpvTlK2SswM5ughoa9a9XQdGmYKK0pF9CKZYqi7e6CT5XF+5+63vLlcKP5UZMirODUz1GLgFsL2pQLv4qdoLLc7sPKeYTQEnN1YFR5wmA6DS+8o5wuT6jbmLMwUAsm26Ff8+GT4nhFYBCPnAm19/sAKD0InzY9JBqEspPRd8g+FE5IULIg93NcnmXz+c7aYnMqOqUAeg9m3unRofVe2eEPSJyWZBzDRjVtN+SUP/5Qt4S2efVP9D2aQBKc4PHBO6IyohCVeA9uPf8oytfW/PWk0PhoJ3NdVt81/MXwby4bACYqGIAAAAASUVORK5CYII=\",\"name\": \"360\",\"url\": \"https://www.so.com/s?ie=utf-8&q=%s\"},{\"favicon\": \"data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAG7klEQVR4nLWX36sdVxXHP9+9Z+bc8yNNcrG1RTEFkwhtLQVFCwWrVf+Biu9RAvYhrQUffBSkT4IaC62gxYq2DwX7JCoWRVpFaWlioS82TVNigtY2jTdNcu85M7P38mHtmXPwoQ+CA4fZs8+es75rfb/ru/fRPTxiXbz8IkovIH6XOz3/MidX/B+uT/LwpKrjvWb6gln+TJ22P617eMRa3qNmhmEI9StdvqjA3ye64UymP6uYXkt5dbbr+gunefzK+wd5aF+sOKQYD+dsRzA72tjBw5bDrRgfNnKVaMl0NOxH9/CIJVoiNRVzRKDjOpmWTE/FDAmWXEIYGZJkHbA35UYyPUYi0zWZbqux7QgZwwAwy0zYxsiISMu/6VkCUDGjAkrwBZGaGTeRSbTseEry25YOYiSMFI0Us/qthgWGlfmMWSJqjtGTSUSbgIyJbQOwx7tMuYmWHVquFhBAxZw5HyzxRMOCRnM6rhUA5h/JaSqgnDK8LoDJCFY7avObEKLCSGzZQVquULGPnr01gCHNiikNC0yeUaMDPH7mXhYHa6b7Ij9++FWe+9H5AoZSZoegEvS+Y4f42mN3snul49rlnq/f/ieiGrIlOl1HJva4TGRKpic4BQ0VM2pmVJpRs6DRPiYs+OlD51hs18Q68JXv3EET59SaUTGl1pRGUxrNqZnRhDnHv/9x6klg/00TnvrmOWrNiEypNaNmTqUtpnyAyBaAAxChfCKBQFDlY9W8+tw1zr50DYDJPHL8B7dRhS3qsEWtBbUcUB1mHPvubWztiwCce/kar/56l6gGFc6kiBCBiDz0UIHauVLACXYQQZGgyMkvvU5Orur7jt/MDdtTghqChMqaxYEJX3zgFtdChu/df5agUD4RZBiZrESrq7S8twbQsyKrJ9NhJFDClMiuenbeXvHCz97xF6I48fQRKMJDGQNOPH2EWHmmf3zqHa683Y5ahORVUCZQEalBtgYwCnF4wYdIQvKiPHniTdpdD3r75/Zz6K45lIJ95M4pt9+3H4B2L/PkiTcRhil7IJX+KlR02mWAFihtVMwElEi09GrJrMhqSbTknHjmW+dHuCd+fhTJQMaJp46OrfmLb5+n6zpMyRtVPYkVvZb07NFrSSCOrRuGMrqjZRJdaauNdhZken77+AUvLXDz4Sl3f3mbT92/zS1HpgBcvdTxm0cvopCdPjmlWdmTK+3u3sDaB4xcuOwxbdiowrhwSPGJB8/wjWfuAODYySNsXj956AxJ7YjaTBgia4VZ5w6pJclaKs3pbTVooNipjExXBNmXcUfPEitzp371Fm+9sQvAbH/FbL972b/O7fHSL/9Z3htE3JO1GueyeiC4rkpqowYyyblib+SqZ4/EkkznYy1JLHn0q6f57+ux468UB+0wdSRWrh0ciKkHrMx5MhsArGwgLetnKzvAoOL1zLm/7nD21M4Y/I3TO7x+6t3yo1ZEbQVQX2byBv8C4oYIcZGIqmS8IrHCWJFpSbbOKNGR6PnLsxdHAH9+9kJZ4/t8piOxJNmSniW5bL9D9j17RZRFhCKSsbEsEMGKGeBCDAQwwySwTMppBJCSlxkr+6YNafWDnEnWMuyqIpJYEmgcQE9LZItkLUGRZBAkMgEs+dgMSSRAprGkAKqMZGsAQiTzds7mM5lMtq5oPhCo1xVIXMNs7sq15CAQMncv2xj7HZrpWoCTWRgzNCtNbGsNySoGb0nmgqYA8xORTcnqCqpM7+EJFkrQcs+uGpmYLOIIoJoIM+8kMCwPIIp0rRsrNrRkzy4Vi6ECPaH0PZZ9L7Bi9BYIkiOWCNnnFWxNQW30rHxNCTpWwEqbG1jRiesubIrQOzSbe7gMpICZ797GuvxZAUxMF9UIYLaosZzX56MxeAaDPNKSSKQRxAgg060zBoIFIGPy8A6k7Gbm9MR6/SOKmcSyWO/6eDZ0Q6IvYEIp/3L8rgBIBDJmvT8plGNfKNJx65BFxyijmojVrqu6mUZ668bAyVKhoSC0iJmRWfkxwBhbfvxjEqgI1Jhy2QmDO4CcDrkwBigIkdWNz1i5F4aHljMDWQ0YvS2B4FTT0XBgOBUPZumlklzpSQGZ18EFKReSoyLbGoCRNkBknxtO81AAiWwrX7upgbX7d+6K1nvWljG5iGQe1KujsYyDTzqIzjMe1T9Q4DZvAzUwtuWoAW1I0+gx895gKGx5NOjBOhGWVt4sXzdmTISqMfSGNYselZOQg9gAQNkNCxUtSv+oQnU+K/1N0hsh6HXL+bWu6y6e5odXeZ/rEzw4j7UOhRCPWs6Hs9nHMD5qmVvN7EOQGl8ZNkQYL70o2R8Qv2+768+/whPd+wX5X6+7OF439fxejM9n47OTdOPd/wHi0RkhxZ/TiQAAAABJRU5ErkJggg==\",\"name\": \"yahoo\",\"url\": \"https://search.yahoo.com/search;?p=%s\",\"disable\": \"true\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAGRUlEQVR4nK2XfYwV1RXAf+fO8HZ3UCwM2a5bWNS6+AcYBYSW4LQbqLR+FHb9woBRMcY2aUzaGhsbm9SQ/qFNP9K0f2iN+FEJ0I2gFLRFQWF0/Vjxg9g0fKmgYlkcimsdeMvOnP5x73s7+3iyG+tN3rszd84953fvPffcc4VRljQKm4HvAwuA84GzgbHu82fAe8CbwFZgYxAnfaPRK6MwPAO4C1gM+KPkzYB1wD1BnLz+hQDSKBwP/Aa4udD8MvAU0APsAY4CBjgDaAfmApcD3yj0eRj4SRAnR0cNkEbhRcDjQBugwF/caP51qtEU+k8D7gSWORsfAJ1BnOwYESCNwvnARqAJ2AvcGMRJz2gM19H1TeBR7OwcA64I4mTr5wKkUTgb2OaMbwauDeLkky9ivKDzDGAt8F0H0RHEyasnAaRRGAJvAy3AP4BFQZwMFJUdW9BcQqQRYYyIeK53BgyiDKhquemZQ3kdiBLwBHApcBC4MIiTw7UAa4AlwC5gThAn/QBpx8TxYsxPMXKDGGlDACOup6sV+6coue5BeU5z3USum5u29pWd/nFALzAVWB3EydIqQBqF84AXnKo5QZy85owvFGNW48kEMWING0HEGZbCCqpaBlXI7U9z7SfTDZrnPw6e/zhxzv0KdufMC+Kkx7jud7r64arxb08cJ8asqxr3BPEM4hnwBXyDeIK4Gt+2V2U8QYyMw5PrxZjTAZzuR5ytXwCYNAonYfcuwL1V5zAyFSNjq8aNU2pBHhDPtOMbr7TugOCb8eKZi8QzPxRPHsOTI1V5O2ufFVziXjfT30ujsM0HOt1S9ARxsqsqZuS0yrQPU+YZMLKm9Nf39lZES937jwI73O/+ga7JnkKHYJao5teIklZkgzjZlUbhi8DFQJcBvuW+baJYRD6pOpwZMi5GEE+6Tyw7564T13+9hTqltP79rOHJD7Y0bPzwVoy0IEMANbYiH7jQvbwyHIBdGPlYRCYWQfAEjJkgnvwKkbsHb2rfiLIK1U3+o3uP1cI0bjpYrsNYiQMXGGy4BdhXlGh65lCKsBihDxEQsU4v1g8wgvjii286xZdujBwevOHcNSeWnhPVm5Wa8o6r2wzQ4F6OnkT/1Ec9CNNFeBAhQ6QaA6x/GOcTBjEyFmEJRrafuO7s1waumTL/FAAVWyVTaBxTT7Jhw4eHS+vfvwU4D3s6HqkGoAqIey7EtVnAloGuyd3lRZMm1FFbtWWsQgCaT0FMqXv/vjFr3r0D1VbQK1FWk2u/ZrkNPNVoqLaDra5Gdfvxy1obatSd5eojBnuuA0wrShxf2HL68UvPLM6QRV/1Ttl/ZO96b+XupZppM4P51ZrpNs10CEQtiGOZhuolNWraXb3PAJWMpaMooaqzUF4vX966qLx4Ut28wX9od9lbuftx/6HdHeT58gqEFkHsc3tN14td3WuAp91LZxqFQymXaiOqF6jyJLnuLHdO/tHAVW2fu0w6qE+TK5Ul0cp5YEGyilwahR42+AH83ccevQlwJrAIm8tBToOKIqKoMF1E/6Twx4Gr2t5ApAcje0Tod4qmaJYvs6NVhs2ErYciLHQ5Wwmw2Q/iZCCNwj8DPwdWpFG4IYiTQXL9r/Vudc6dAyKKmSmiM1GxfiYy5HiVEec5ZNVT8S1yfa4w+l86kPuDOClXnOzX2L05DbgDoOn5w1vItV3z/B4y3a+5G1mWo5mig/Xr6vdcMzJ9QPO8o2lLXyWxuR2YDvwH+B0MT0iWAyuBQWBBECfbi2t8fGHLDIzMQ5iNkaki0gq0Ivhuy5VVtY9cd6JsI9e1jZv/faCgfxbwEjYG3BLEyYPDAJzQWuBaoB/4ThAnvXxJxeWGbwC9QZwsqbTX7vPlwIvAOGBrGoVdXxaAS27vBm4rtpsaoRSbnDwLnAasS6NwZRqFX/1/AdIovAS4j0LScxJAgfQy4LfYcLIc2JdG4R/cOo5kaEYahVMK7yaNwtux8aYJaHa7ARjhbphG4Vzg9wy/ah3CZj47gTLwKTAROBd7NfsaNrrOBWZjvX2O67sKuLmY7o94OXUg84EfYJdn7EjiwN+AfwIrXNunwM+COLmvVnhUAAWQRmAmMAN7on3F6TgCHMBez3uDOCmnUdiATfV3ACuCODlYT+f/AI/5j7xJD7XhAAAAAElFTkSuQmCC\",\"name\": \"搜狗\",\"url\": \"https://www.sogou.com/web?query=%s\",\"disable\": \"true\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA9ElEQVR4nO2WTUoDQRBGX5txIMRs/EFBAm49iEfxBN5J8AAeZwwkgmTR6e6ZHsNMDO2iFkEyibqQcVG1+aq74KvXteky9w8p0WMc9dlcARRAARRAARTgXwBk+z5jYyA/3p7zvDv/Ltp2N2/XoilBNj4Rw6sLuDyXwuRa9OxUdDz6ajoc/hwAYLUSrertnV2KmpT6XUiyvzBtGplxjPLksooA+FAB4HzZDdA0a2Ksmb2+4XzJYmFxPlBM51jr8aHCLgPOBQDqd5ntx2ZzECgbDPbWzOPTcyqmM5wvKV7mOw26zA8Z/jbMze2dLqUKoAAKoAC9xic+GmK9S0OJvAAAAABJRU5ErkJggg==\",\"name\": \"Startpage\",\"url\": \"https://www.startpage.com/do/asearch$post$query\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADHklEQVR4nLXXXYhVVRQH8N9cJxzRoXLGFKK0SQvRyRJ9kCAq6iH6JBNliB6CYhIfJCoMpHwoUCqiMJR6UHooqCAoKoIesrTQCckUI/ogLSoLScKISpse1j6c45kz9547d/zDZe9z9vr4r33X2msfJh+7z4JNMAXPYlMbOl24ZjKcz8fnGE2/7YlQEb2T4agKDRzCFbgdQwUi52FBSb6/MD+3U+dTsBF/FpwWfxcWZHsq9JdP1PEtOJKc7MH0Cpnr8Ddm4dOK9csK832YV9f5OfIIr28hO4qH0vzqwvtpOFHXYREjyehNNeUzouvRhx3p/WAaP2ploFGYd2EZ/sJ7NQl8k8ZpWIHF6bk7jdeW5AfGMzSQHD9X03GGNWIH/sWWNP+4sP5BXUPvJuWpbRK4MundjUfFjjxp7A7e2crQKL5s03mG73EQe/F1spUdUkNY2Ey5gRlpvnOCBL7CcRzDi/gCP4nzY4YagT0hmE8UW+XV8FQaYRhLMVuelN1l5YbI3n0dEDiBb0WT2oXfcU+a7xfVdSrJnhqrzq9Y2wGB++U78Goal4uS3IBFuCqRGYMGzscfHRA4LXrFSyIPiGP3ArwvKuJSbK5S7sZ3uKgDAnNEr7hPlNu9ItqZuA1z5XkxBo3Een4HBHrFQXRa5FOvyIkRPINbk9xwSe/ibHKHSI6+CRJ4WZ4Dz8v7yR6x9S3RlxQeaCJT1Y4zvIMfxaXlgAhmJd5K67UaWxZBFXbgrnHWesTWZ/pHsVoE04035cf7qmYE9iYDXRVrg6JJvVCxtiTp7RRZ/iFuSGuPp/GHZo6L2Ip/REuuQn9y9h9ewdOixLLob8RjIvMz+bYwNRk61kRmvSjb8t1wGJeLJNzozK5avJrN1uL2PBeHcVL0+lbICBzHz4X3A/Im1yyBKzGzYPiSGgQ+w9sVazfXcVaVdBnmiVbaI7Z9F17DLyK6deIEfR1viEhPisOtduK1Qj+2qf4mGBVVAA+K/58zvxUmDb+JrZ4lvweOlGTKX0iDpefxqqsWlopbThb5J6KLwsNpHCrplE/WRzohUBcb2lX4H+8RvvN6tC5LAAAAAElFTkSuQmCC\",\"name\": \"秘迹搜索\",\"url\": \"https://mijisou.com/?q=%s&category_general=on&time_range=&language=zh-CN\"},{\"favicon\": \"https://yandex.com/favicon.ico\",\"name\": \"yandex\",\"url\": \"https://yandex.com/search/?text=%s\",\"blank\": \"_blank\"}],\"translate\": [{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC/UlEQVQ4jYWTT0ybdRyH34MH4wVjovG2ZIl60IMXNTgoDtlG/wAy49bt4r+8XSFm2SZGox6WWNnal45SbKAbygKbShAT38yMNC9LMGyQsS5OdGtpOwqNvNkLLbwv76+KJns8lES9jG/yXJ98kidf6bGn6vY42tWEo/2SVutXtZotHEcT2o5q33vSdlfbpk68OQSH4uCNw8F+ONAPhwbhlQ9mbkuS9NADBY72S1e8cXg9ItgfEbR2bxH5k5aw+PuRJ5994YGCGr+qeePQ2i1whQRuReAMCZq6BC0992k6+nVCfuetE7J8pEOW5Q6fz/e+LMsdbW1tH7pcrgNSjV/V3uiD5rAgNr7BzB2TyzdM3u63aThVxjcgSGcKCNvCtm0sy8I0TWzbZm1tDellv6o1RSE2bpGcX+fjbzcIjG1w+AvBvqDApQhGxlMsZNOsrhgY9+6h6zq6rmNZFlL1EVVr7oXrKZOOCzbeXpvLSZPxpIl81sYR+IPPLi6RufMr0aERpm/ewiwV0fXlyoJqn6p5eiBx02RgwmJfUBBSLQr6Ov4vbeo7NzkYXiZ6foxPzvQRHvyGyPAo/SM/kM0vVQTNUfCds5lNrzM5ZzKT+lfmCpVxKwLl/E9cvXaNxORVOuNDpLM5VovFimB/DPaeFnh7BSe/2+D4sE1jsFLDrQj2hjY53jdHOP4VysAFrkxNoy//TqlUQnrRp2qtMfB0CRqDgvrPBQ2dW0lDNq5QpYbcV+IjJc6xUz2kUmmWFhcxDAOp2p+YqgjKeLrKuJXKZNcWzpCNMyioD6wTvTjFqPojp88NM/fbbVYMA+kZd6C7JQaeHvBEwNN9H/d/cHZt0qiUcXT+RXB0maVcmu/HNSanr7OyYiBJkvTwozt27a7aufvVqp21/+Pxp+uddd6xhYZ3b7Dr8BRnBn8ml02zcDdHLpdF13W2fbbnX2o/W/faBJ8GJpi79QvpdIr5+XkymQzF4ur2gqonnttzUkmSSmXJ5++Szy9SKBQwDIPZ2eTaP/p6Y/2tPjpQAAAAAElFTkSuQmCC\",\"name\": \"谷歌翻译\",\"url\": \"https://translate.google.com/?q=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAABGdBTUEAALGPC/xhBQAAAC1QTFRFT6b44O/+Uaf44fD+Uaf4T6b4U6j44fD+Uaf4GYr12+39F4n1Gov1////FIj1B6sNLAAAAAl0Uk5T50ThROTm5kPip4USNgAAAFZJREFUCNdVzbEJAmEQBeFtxR6sy9gOrEZL+Tt4i4mB3O1Xg8EhaDYMA1PXBfutLsCr1gFbGffkoegxFKQpad0UnZlWtHGYSfybJL/NwrB9p886L3ifPt+ucPSWYnodAAAAAElFTkSuQmCC\",\"name\": \"百度翻译\",\"url\": \"http://fanyi.baidu.com/#auto/zh/%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA2ElEQVQ4jWNgGFQggps34Y2i2v83imr/78gpvZdgYFBgYGBg8OXkCUMWx2sITOEbRbX/MAMYGBgEkMVxahZiYJCBKTonLX+fkDgG0GNlNYIpnCQsOh8mbsjCYgkTXy8uvR+nAcgK0/gECmDifpw8oTDxMgGhBpwGOLKzu8MU7peSOW/BweFgyMJimc4rUAQT9+TiCiDKC7gwUsBiBezIzoUFGrKr8GnGBgSQDYjg5k3Aq7pFSKTfgoPDwYKDwyGNT6CAZNtx+RuqWYCgAXfklN6jayTo7AEHAIjTnaHLaQtfAAAAAElFTkSuQmCC\",\"name\": \"有道词典\",\"url\": \"http://dict.youdao.com/search?q=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB5ElEQVQ4jZ2Tv0sbYRyHX5Uzl8bLVNrSToUOHbr0T2gHqf1Baf8AvcUruNcpd5e75BK9H0Q9gptCogZKh6J2kWtDhkpxkmCwOIidijpYECoI5unQNo0QauwHnuUD78PL9/2+on9w0ItrWiSraiSNjER9w8NRTFUjuQvimhaJuKZ9ThaLJHyfGzMz3AxDRC6H7LooQYDi+50JApJhiJBVNVJ8nx7TZKhU4svhIYX1dW4XCsRsm4FstjOOg+K6fwXCMHiysMCfvKhUELp+OcHjcrkleL60hEil/l/wslKhxzAQuk6vaRLPZC5/g9dra5jVKvdnZ5FtG5FKIVkWSjeCB3NzvFpeBuD7yQnvd3YYW13lztQUsm1fLHhUKnE1n6e+v0973mxtIaXTJDKZLoY4Ps71yUneNhqt/uPuLrJlceUiwcP5ea5NTJCt1fh2fNzq321vI6XT/xacNZuUNzdpHBy0Dp41m1Tqde4Vi/RbVucZPG1bpPbU9vZ4triIlE7TZ5qdXyFmWdzyfYobG/w4PQXg69ERYysrKI6D0PXzu9Am+KAEAYrjELNthGEwVC5jVqvcDUOErv/6E45znlwOxfMQ8ujop2QYorguiueRcF16HQeRzSLl8wz87hXXPY/nkZye5icfi28JEi0cegAAAABJRU5ErkJggg==\",\"name\": \"必应翻译\",\"url\": \"http://cn.bing.com/dict/search?q=%s\"},{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIAAAAgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAcdJREFUeJyFkk9rE1EUxX/3pZMJxtCRuim01k03IkKJCI0E9Bu4VgxxpZaKurf+ofEDqHUhFCKKuuwHUCiKBgRL24WloVZd1KIVTFprMQ2d6yKZzEsZ07u6575zzpw7XCGi+gula6AjIIMAKNO+7lz/djM7v5srNugbL10R4X6UaVB/67XUzzunNwNsgubog7k3oB3FAMmk99sbmRxoMxguLp7vTu3LHvCSqGrjRXVKIA3+GaAMEHMSVL7MQCz+tW2FTLGswaC6scXC1aG21QDSjz44S7Oz28ZxQRVFN9cn8imTKZbzNjFKDDBz8Xhd3K4hmgkF2Q9gVBkNafqi0/7r9y7M2dgbfZwzIqRbct8872TQZH1qdTBsVHUnGBjRw3vrORS0AltGkJeW4+09DUTiITBPjHFrZ8NHerJPF3r/p+2+PPnextWJ3Lx5e+5YJRjE410sf/612l8o5XaL+8ZLrxJe7wlVv5lW7zbXaNSpZ8u6uLRK3IkR3hI1EVwrP9t/KtQ21qg+zAtYp7z2/UePLW6sa4sb33VTB1vitgRh1HcfReRI1D9Q1bGVsZMFexZ5dQO3phO+415CGVShDrxeuZGZiuL+A2DYnV2Yre6zAAAAAElFTkSuQmCC\",\"name\": \"Forvo发音\",\"url\": \"https://zh.forvo.com/search/%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB3klEQVQ4jaXSMUhqURzH8YuBrSbiIIKIS4vo4ORQgyJCBg5Fuuqgsyh3tKFwUsjFycEIwq0lBMc7RLQFIl4RnLxXzqbe4Yp0v28I6vle+F70h99y4Hw45///S9SO+Ukkasf8XovFgkKhgCzLrFYrdtZXgBCCw8NDbDYbnU7n+4Cu67hcLlKpFEKI7wOPj4/Y7Xaen595eXmhUqmg6/r/AUIIQqEQBwcH5PN5HA4HTqcTVVW37mma9t6fP4GrqyskSfqIx+Oh1+sBsNlseHp6olwuE4lEuLy8/BsYj8fc3NwQCATw+/0Mh0NM0+Tu7o5Go0GhUKBerxMOh4nFYl/3wDAMms0mPp+P+/t7ptMpXq+XYrGIaZqs12vOzs5QFGUbGAwG9Pt9FEUhm80iSRJHR0dMJhNOTk6oVCoAtNttzs/P2Ww2n4CmabjdbhwOB7FYDL/fjyzLCCGwLItSqUQwGKRarbK3t0c6nWa5XH4Cs9mM09NTcrkco9GIWq3G7e0tlmUBMJ1OiUajxONxWq0Wqqry9va2/YXFYvExynQ6zfX1NZlMhvF4/HFuGMbuPdA0jWQySbVaRdd19vf3ubi4YL1e/3uRXl9fyefzJBIJ5vM5AN1ul4eHh/fn7gR+kF/ZQQ/WnEhepgAAAABJRU5ErkJggg==\",\"name\": \"CNKI翻译\",\"url\": \"http://dict.cnki.net/dict_result.aspx?searchword=%s\",\"disable\": \"true\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABJElEQVQ4jY2TMWrEMBBFdQYJuU23BsM2gbQBFSl0AEsEs+CzxClETpALpEwbttjGJ9hiwXLh1uf4W81EcpRNBgTfo9HTeDQjlnmCk7q4xrbP1joErEPIfGJsezipsbWPt5eiTo0BJfOqwjJPAAAnNevUorE54Hw6ZoCSzmN2ENFY3jifjlkNurpBNDbTFAcAl/0DRFc3DEhrkeptNgRwUkNQ4H8BTurfAV5V6OoGz4/3nHZXN3BSIxrL+ibgryIWAVQY+r9bOo1nwOvB/6j+Vqc+ryrWwqsdtrbME74+3/l7HUKxkZzUEJf9U+ZMe2Eb7O9UBnJSf/fBMk/cLOntqa1DgJOaZ4NrQJNXSrMEoUszAL01vXc0FusQ+BCNL+1FYzG2Pa51VtKhEx+TOgAAAABJRU5ErkJggg==\",\"name\": \"汉典\",\"url\": \"http://www.zdic.net/sousuo/?q=%s\"},{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIACAAgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAkdJREFUeJx1k81LbVUYxn9n7y1+g3qPWYMosaKyVBp07yDJwFuUUKOoaU0v0SwuTRravHF/QFA0CQoHJTQJvHDR6IMUvXCvYpkfR49Hj573eRrsvY9KtWCxWO96n2e9H89bAZhd2XoVuG08aXvIMna5hWVUnqE9W8uSPl16eXyhMruyddPwre2USyCVJFJ+j9IuLCE5JL2eGX9sO82d//fXS2CXJKmk25nl59ogm7epc+OhQY4ED/d1U+3qpNY44ZuNTb6sQ8MgqSDXRCKrKuXsUyc1br0wzlBPN+XK0pSx4Wt8+OIEn48/Qn80kQJFEBHVrMgHWzzdnQKQVip89fs6PR0d9HZkjA/0MjP6KE+NDPPJaJ0PVneKOgTZlbwSA5BU4KfOwTzvM/H1doPV3Z957YnHeOXJUR7/4wFrkWCJRKF2SK0Qp62g2cptEWWo4vvDJmQd/Lr9F890pvm7gkwReQoSh9Fku37MTqNBblf7LQGqPV1gk2BKXKZoV5TaWZP7h8fsHDWIKPudR/NmtZ+hrk4AlmonSBUkkYWi7Xhu2Nzb56TVYjpt4sSkmJdGhnhn8lkAfly7x0YLrEAuIigJxgb6eHcqd3yPf6/N/Rof3V29UGVOELuSrlkCZ/8Bg3qzyRfLv/HZ+g57RdcK4f1def67Oz9YmpFEn87pcSADhdNpmN0IWqaYC7d1Y3sxU8S8pGkr0gOZ/aI4V7TfnhNdmlKH7fnkl7nrC4rWnEKLCh2EotDFRQesizpZOrC0aOmNP99/a+EfiilTPoj1fYcAAAAASUVORK5CYII=\",\"name\": \"海词\",\"url\": \"http://dict.cn/%s\"}],\"knowledge\": [{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACk0lEQVQ4jY2SS0hUcRTGzyLcRI9Nm8BlbaqFm9xFi+hhm9EgrVZBUETOI3VsUGeiN/RGAqFyGmcRFCFUFJRFWCs1k3LunZnGbOb+73W0ssfo3HEG+7W4E4iBtPjg4xz48Z2PI7J+Z4Psj/ZJ/Z0+qQ//v/ZH+2TX+YjIvmi/nJtBQhNIu4UETMcHraUVyiKnvyPSEHkhQQtpjlN5JkXrw0mkSUcaNcSjI81xxKc7fqFaEkjQRKQ+3CdBC3FrnHv2hUS2wPauDDXditqoSeXZMTZeGWd3WOHqMXH1mGy7abD6ZAppM8qADotlLXGG0nmGzQL54jyTv0oMpPPsDRv0j82ifpR4a9iMKBuAmrCJNKfLgFbFnogipmwqWuI8iuXwPMgiR2KIT2fEtKmNmMjRGOLVGVY2e6LWAkC7SfW1cdaeSiGHPvAiOcPBuxZyaBRx67xTNq4e0+nleJy3yqZuMWBV6CM7bitc3QptskDn62lqbxlUXR5nIJOnLmoibg1pijP8D+CEwhU2GMjYDBo2dvE3+tQcA2mbM8+/8ObTLLU9SwGCFuJPIG6NFW1JdNNmw6Vx5PAo4nVOWDpB0EJaE4hHZ8uNDKXiPPeGfrI8kETcGu+UTU1YOSUe1RjM5BeV+Bfg1rg//JMnsRxPYzl63/+iwqujT87R9HiKNYEErrBiKldyEjQtBDRq7L5lAFDdmWZlIMn7TJ7N1z9z8eU3coV5UtkCI2aBV6lZqq6nEX+mDAiYbOlM8yNXorN/2nldn866C2NUnk0hxzQuvvyKpzfr7LzlV+5QiByI9kvHBJuufmZrl+Es/AnkRBJpXuD9CcQXR/xJpLWsUBaRXecjcnoaCRhOpHbDIS/W4nkoi7TEi38AwHibcZoJerYAAAAASUVORK5CYII=\",\"name\": \"知乎\",\"url\": \"http://www.zhihu.com/search?q=%s\"},{\"favicon\": \"data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACKklEQVR4nM2Xva3yMBSG3xPdBai8Ah0WS1iUiCYbeINITBAWyApImSAjuKOgSUYwFRv43ILryCR2IN8VN58lGr/E5zm/TgiR5Zzj2P5vV5ZlNNzrNz5l9BVMtoTx0Gb214aHa3EAWiL84Vo8AosDfAHAbrfD7XaDEAKr1aoXu64DAFwuF2y326R+PB5RluWTfr/fsdlscDqdRs92XYf1eo3z+fxoB/8rioIBMBExEbG1lkO9rmsWQvR6qDnnWErJRMRVVY20siyZiFgp9bT/BGCt5TzPkwZCSAAjzT87BA/h27ZNA3gIb6BpmiiEBxx6CoDruh7931rLSik2xoy0EYBzjoUQDICllFEAKSUDYCFE760xhpVSUe+bpolGLAlQVVXv5TBnzjlu27aHFEKwMSaZMh+xPM/fB7DW9l6myLXWPWSe5yyEmASIpSYJ4L1MdUOYcyKKFlcYzVhXvAQIi01rPamHtRCrp5T2EsD3NRFxWZaTaYgVrFJqMjUvAZqmYSJKdoQ3npobAJLRewvA5zBWjMaY/nCvh1Fq2zZZ+bMAvKfDIRP2fJgGX4xa62RhzgYY9rxS6iklfg54CD/33zn7LYBw/vvDw2hYa0cFmZqi/wQwvKRid0R4h0gpJ1tvNsAwzFO1krqOfw3g3KPai6JI6v4OmXPm15zXp6IosN/vk/rhcMD1ep1z5OPL6Me7P19ZltHiL6X/B0Dsq/Xjhn9sRg1/qiZijn4DhUA2yPD/DEEAAAAASUVORK5CYII=\",\"name\": \"维基\",\"url\": \"http://zh.wikipedia.org/wiki/%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABpElEQVR4nKWTvUtbURjGfzcf5prqEBFMBpWCHUIVISKRoIgQ3QQRRNBM1UHqX+AiLg4uQpeCiKigIkIkf4DgYAmVQBDEL2iHVIsfaGpi1Nxrck+HaGLMzSB5xuec9znP+5z3lYQQghJgKKW4qMDW9gPNbaf4AwkA5hbiTE1HSWuFd016AhubCZ6eBEurdzgcJr59vwXA45bp8VqLO4j+yzxhtWboKpuB8/NU9vyF13UQ3lPwjVzibpWZnLAhWySGByupqzWxG1JoaizjU4OZ4G4Sj1vOKYhnzMxGhdMVEU5XRPz6rQo9dHSfCacrIlbW41ku68lhz5iRLRLV1UYOjlT6hy4Y8F1w9jdFUhFc36QBODxSC1sYGqzEZjPwsd5MLKbxZeyKu0Qmk9HxK9YW7XjcMqGwgrcrF6T0dpCub9L4Ri75c5p6TdP0uYzl+Rpki1T8F2JxTbcYYP9AZfRrzpWugD+Q0C1+QXhPwR+4Ly5gNufb04Om5a9O3iT29X5gJ/jIj2CSuloTne3lGI3wM6RwfKLS2mJhoL8iT6AgxPei5G38Dx7mvwaRBxETAAAAAElFTkSuQmCC\",\"name\": \"百度百科\",\"url\": \"http://baike.baidu.com/search/word?pic=1&sug=1&word=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABpElEQVR4nKWTvUtbURjGfzcf5prqEBFMBpWCHUIVISKRoIgQ3QQRRNBM1UHqX+AiLg4uQpeCiKigIkIkf4DgYAmVQBDEL2iHVIsfaGpi1Nxrck+HaGLMzSB5xuec9znP+5z3lYQQghJgKKW4qMDW9gPNbaf4AwkA5hbiTE1HSWuFd016AhubCZ6eBEurdzgcJr59vwXA45bp8VqLO4j+yzxhtWboKpuB8/NU9vyF13UQ3lPwjVzibpWZnLAhWySGByupqzWxG1JoaizjU4OZ4G4Sj1vOKYhnzMxGhdMVEU5XRPz6rQo9dHSfCacrIlbW41ku68lhz5iRLRLV1UYOjlT6hy4Y8F1w9jdFUhFc36QBODxSC1sYGqzEZjPwsd5MLKbxZeyKu0Qmk9HxK9YW7XjcMqGwgrcrF6T0dpCub9L4Ri75c5p6TdP0uYzl+Rpki1T8F2JxTbcYYP9AZfRrzpWugD+Q0C1+QXhPwR+4Ly5gNufb04Om5a9O3iT29X5gJ/jIj2CSuloTne3lGI3wM6RwfKLS2mJhoL8iT6AgxPei5G38Dx7mvwaRBxETAAAAAElFTkSuQmCC\",\"name\": \"百度文库\",\"url\": \"http://wenku.baidu.com/search?word=%s&ie=utf-8\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACsklEQVQ4jZ3SWUgTcBwH8H+QeDCpLUXR2vKGyZzHFuq8ErMi1PBK01LSBKdplgeYCPWQZWFgGV2GQhbpQ4XNSs3l0XRTZ+pm6hRiTtnmXOKZZfv2EstSevD3/P18H778CNnmOfmYHSSE7NquJylVjq1O3pTQbWH3Y7YpZcNBhn1uFpz/5SzNdhOGOZXQTa2Ji60XJdgr3ibndBWjtXKSi7Ju33lCCHWTsnY28Uoud3tyo5Oruv/Jb/VO/4Hlsj7Pn8VSD5SM+KB83Ae3J5lIr2Z2bcLc41YZtYrAtc7FaPTqz6JPx4dkNg3CmRjUjnFRKHZFUgcb2SNchJ13ufUXZvJMj76a8YfmRwOWvg9ANlcE2VwhZPqLGNJloXM6ETWjQeB3s5Eg9Qcz1D5uozcpf+0+Il6IhELfhKn5z5BqL6BPm4ZeTSrE6kQIp6LwXBGJq4P+yO7mGWh0mrtRO3ma8xpVAeiYiYZcVwOFXoCB2TyoV5qhXHwG3eoHKBcFqFdE4NqwF3JbuF8pFIq1sSD0BDWzeS4EzcrD0K/JAAASdS4AYG19HdolFQCgS12BkgF7ZApYGkIIzVgQdoqW16jh4eUkD+plMdYNK2hTpQIAZLoGNCjifxfcQ26PHfhNbL2lJbH6M2CgRVTtBAvVI87QrkoAAIIvcQCAIV0d6sajAABC1SOc6WCAX++tIITs3Dgi7fJbx/kK+V50Td+FfFaIx6MHMarrxouJK7gpDYdcK8HDwUvg97ERUeBSuekHAk7uKbo+xkKByAH5H+koFrsgt8sBWe1uyGhlIaHRFSltbOQLgxaodub0rV53R2yp3dNSOReZIi5S33OQ9I6D2CYOYgTeSBP5oUh06Jt7kE3kVth4wcmMgrw3Icr8/iPI6Q9HVk8gzrUHGNIfhLTs97Dx/Tf/C0aUi3kge/guAAAAAElFTkSuQmCC\",\"name\": \"豆丁文档\",\"url\": \"http://www.docin.com/search.do?searchcat=2&searchType_banner=p&nkey=%s\",\"disable\": \"true\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACRElEQVQ4jY2SzUvTcRzHv5dunjqEHWJrzqVGPqxLeUkR/4PPd79Nk/QgFV6GWmhRoCAooWaSumUpiVD0DBVIUkqkl/UA5W/zYU0z0HBqkaZzk1d/gM56nz+f1+X1UmqXuYwKXFKCFhdaG7g9Hna727Hs7Gyn6DKczsbA7T4z9mzoY/jp8MRcXcODgEjVvyEilRQXt5Nmuc6pwkG6+r/iG1ikoPgRx080BUXOJoeIlGM/VB8+mt6J2rcfW0YP+YUvOFn0kvyCYWw2PwcPFvm0W3aHiFSSmV6NRwz+RHrxiMbiuIXD8RBLVhei3YgW3JIMoDWlWlgPPyFu3mBj1o/WgiEajwi/pvtILNxLDnBpIRr2EzebYLIDgq2shduJB30Q7gSzjVioA3ElARjiIREdgm8DEGwmMeljfbaD7Zl2CHYRMx9DdBwxkii1plqthgjxpS/E5rrhczeEOtkONcNEB6yEcGsh1Wq1JjWhlEoREe70XBr4NP586udyID4RGJzq7akb0FqjlErZ61kppZTdbs9yiUaLUCpChQjiLvm/EpVSSotws3WY2JEstmzHiOTk4a/xzYih94ZUVXm92lVOS0v/+shohLHRIAlbLuNvTMbemjRcu78ucm6vEktpbevn9Yi5NT2zycz3BVbTclic/0FkbpOh0RCNV+9GzkgSC2II7z68Z2p+kd8J2EhzQmYqK/ZcVteWmV2aZuKViXiSpix4vV5qay9QerqMhQOO6ELe4e1ZS0b04pVaLtecp766bkdIfwF25n38sMbXHQAAAABJRU5ErkJggg==\",\"name\": \"爱问知识\",\"url\": \"http://iask.sina.com.cn/search?searchWord=%s\",\"disable\": \"true\"},{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIABPAgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAhZJREFUeJyN011ozXEcx/HXOc7mnON4mM0Wo7V5ahJtaTIkuSFFQnGjFrmRxIVy48KN5E7K0412Qx7WmodyQexCuSCxhRUlDzPLtrOj7cw5/n8XkzO2C5+736fv99Pv/ft9v/yr96bJSo7zIZQUioy1ouOKHjrpjjNCVX/57Za4oA9Txtqjabdt9kmdOrPVapKS8EOvK54KTDGEwByBapN1KJKS0m6XphjIalSsQajYiIRhxJWq1eexNnERk5yU1CLpnk++KvVtIsZlQve1uSV0aIwf0eyzZ3boVDIeYbQoqsU6GbMt0q7RR6026LdZaL6MTfKKRFHqgfW2mWdw9BGfWOiSTl+0yTvsuddarTRsqX4HRQ2qttERszSql7HMA9sKv9BlldB0m9TYq0G5i3qcFsgoMijmvrQZ7qrS4LmELgMmQ+w3QKWoPl1KVEuLa5HVpNiAwEzDDhuSMCjw3UZDipQJCwF94kK1XnmjV6cae+SFKuSkZe1TJyIAB3BepYieAkKAEjftNNVua/SbKSnvqx6BuHNuOOeqy84aUCanXEJ3ISAuLy9lru9iBqStENNhuVCIGV6a6q2cXt0q5MTU+lJAWOqRF4676pScb9KOqbTfW91CzHfdSh2g1WrF8hb7XLjBWu0qbJWxwIj1KhyyxTXbf6/OuzHLlTVH1AcRP8dP4kRqdtQT5X/Od9S77sT/Nf+HfgGu7K8KC1PzBgAAAABJRU5ErkJggg==\",\"name\": \"萌娘百科\",\"url\": \"https://zh.moegirl.org.cn/%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIAA8AQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAQNJREFUeJxjFGk1/89ABHCTZmYwUGdlYGBgYDg+7w5cnIkYzQwMDHDNX9/+RBFnElRbRpTtuAATAwMDAyuPCV4DVEX+wdmfXn7HNIBHqgiv7dzC7HD+86sf4Wx2IU1EGBDjFXSgwyKGGojYvAILPBj4+fk3nC3ILopqAI9UEYoh+AKPXUiTgYEBSzQihwdy4DEwoEahDosYdgMYGCBeQQ88BgbUGBBkF8VtAI9UEYOirBhu5/MiwgVnSkw0nowhBotCHU4r/AZEKfMyKPPLMARpLsFqOMz5OA2IVYIEljK/DIo4chTiNABmOwyUWhxgYGBAxAAs+nAaALMdGSB7BRZ9MAAAP2Q1NvsvI2QAAAAASUVORK5CYII=\",\"name\": \"果壳\",\"url\": \"http://www.guokr.com/search/all/?wd=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACk0lEQVQ4jY2SS0hUcRTGzyLcRI9Nm8BlbaqFm9xFi+hhm9EgrVZBUETOI3VsUGeiN/RGAqFyGmcRFCFUFJRFWCs1k3LunZnGbOb+73W0ssfo3HEG+7W4E4iBtPjg4xz48Z2PI7J+Z4Psj/ZJ/Z0+qQ//v/ZH+2TX+YjIvmi/nJtBQhNIu4UETMcHraUVyiKnvyPSEHkhQQtpjlN5JkXrw0mkSUcaNcSjI81xxKc7fqFaEkjQRKQ+3CdBC3FrnHv2hUS2wPauDDXditqoSeXZMTZeGWd3WOHqMXH1mGy7abD6ZAppM8qADotlLXGG0nmGzQL54jyTv0oMpPPsDRv0j82ifpR4a9iMKBuAmrCJNKfLgFbFnogipmwqWuI8iuXwPMgiR2KIT2fEtKmNmMjRGOLVGVY2e6LWAkC7SfW1cdaeSiGHPvAiOcPBuxZyaBRx67xTNq4e0+nleJy3yqZuMWBV6CM7bitc3QptskDn62lqbxlUXR5nIJOnLmoibg1pijP8D+CEwhU2GMjYDBo2dvE3+tQcA2mbM8+/8ObTLLU9SwGCFuJPIG6NFW1JdNNmw6Vx5PAo4nVOWDpB0EJaE4hHZ8uNDKXiPPeGfrI8kETcGu+UTU1YOSUe1RjM5BeV+Bfg1rg//JMnsRxPYzl63/+iwqujT87R9HiKNYEErrBiKldyEjQtBDRq7L5lAFDdmWZlIMn7TJ7N1z9z8eU3coV5UtkCI2aBV6lZqq6nEX+mDAiYbOlM8yNXorN/2nldn866C2NUnk0hxzQuvvyKpzfr7LzlV+5QiByI9kvHBJuufmZrl+Es/AnkRBJpXuD9CcQXR/xJpLWsUBaRXecjcnoaCRhOpHbDIS/W4nkoi7TEi38AwHibcZoJerYAAAAASUVORK5CYII=\",\"name\": \"知乎(搜狗)\",\"url\": \"http://zhihu.sogou.com/zhihu?ie=utf8&query=%s\",\"disable\": \"true\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADQUlEQVR4nO2WXYhUZRjHf8+ZzS0Jw9oUtMSa2V0TI1MJwqiETSzNWnFnxkzpoi5CSqKLCIwGL2Shqz4uFvoAtZCZYEet9GI1Ay+EDRQ1ktWZvNiIVNA+2V3dc/5eNDvunPPOeLS9Uv9X5zw8z/P/vec9vM8Lt3Szy+Im7kkx5W+PTnyWCRYYTBc0A2cMymb0kaCYHmBgQgEKj3OHzvGOxJvA1Ks0k6A4yWPTqlOc+N8AhRRzJfKCedUC4yjGF+bxEz5DwMxALDfjZYmmStMhYGOmzKfXDVBIMVdwUOLuarLHxzaft9Jf40fykywMoI9xX8kz3k2X6L5mgN453HNplKMSM8eFD2ZKPGWGGkCvDMSuGgOPlzKn2FGvxnMFL15iS8gcS7C5kTlAusRujCM1QfHhtw/X/3ciAMUUSYPXQuEL9ggHGplXQY1ijb+4959h3o4NcBEyim7NYde+OwECfowExZrYAIhnHXnlOOYVlRw9Hyy00x4PAGaFAwZ/xLY3/nSF5TM7HoAxPVJsDMf1b064c6VoXzeAOB9lojkuwIiY4oqbcSYegDHogLorLgDelYNrvG5r4rQr3hT14nvgsRBUcuwx38ZzCnjFoBW4U/ALRq/Xwrb0IYYsYFrExRjszFIi5+INEyWip5bgUeXwdrUzA5/diC6J+RIpxFICenSW/uIcZgcBixwmn1mOwPUFIgCrBzgG9IYIWgpf8cQLA/wmjw0Y3Ubt2BXMGxllD2JpzeKNc02T6XGZQ51ZsDPJ/SNwXFzZe4N9mTLPjL0feJrbz/7KdonVDZrLS7C86yR76+U4Z8GLZQa9BM9XxioAgo58im7l/qtZ8gPD0+5jHXCsjrlvxoZG5pW8+sq38qTEDsSMaoHRr8p9wIy/NMoKiS2Oxp2ZMjurC8jh8T4KD7Sr3oi+aaPlX58Pxl84Ysn4PFviVYB8Gx3y6QP2Z8t0XBPAmArtPCCf9cAyYIHEpEqD34GfMRZLtQeWwXdm9AewHpE0+ChTZuN1AYQ1NuNXHOcCQL6V9xSwuWGRsTBb4vCEAIRV6CKhI2yVWFvH/JNsiTei4QmUcnj5L1lj4nWMhxAJjBN49GROsnUivW7pxtFlNM8U1KJDSwUAAAAASUVORK5CYII=\",\"name\": \"Quora\",\"url\": \"https://www.quora.com/search?q=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACRklEQVR4nM3XXWjPURzH8dcfUVsekjuhZVa0mI3kIeUhzcMFkvJ0sSgXLpCSkljZhRQXKLlAUliJkodSyhXSPJQ8jF14KuXG04rR/i7Omf2a/2y/bf/9fet0zu90Ht7nez7fc84vk81mFdIGFHR2DOqqQXPthLxMXLz3Jf4DD/Q1wDTcRXkhAIbjJmbgEkb0N8BnbEIWpTiHgfkGGIhJie+L2B/L1ajLN8ARPMDmRN0+XI3lnVidL4BxWIEhOI4zKEIr1uEFMjiFyfkAeI2puB2/N+AeygQ9LI95ES5jVF8DwAcsxAFBfOW4j1V4HqGyKNGJKHsCsBbLEn1/YRdW4hOGoR6HcEPQhAh6sLcAw3EUV9CIbbGO4ObpeCTs/XbcwknhXPgmeKVXAKPxJJbH4zDeRqgyvMJMnI5t5qBBEGkFTvQW4CnmoipO8gNDsUVY3XXMw8aYvqMl9mvKNWBPRfgANRiDPXgvuL0a1/BMUP8iLMa7zgZKA7BEiO+J2tX8UTj5SrBGuIgI23EEs7VvWU7r8j2QsB2YH8vNeIyHgjceCsfweeFG3IoFONbVoGkAfuKLEGbFmBVTm7UIq23AHdTia48ATp2t/1NOHOTVwpaVCidgZcyrMBKDY11lbL9UiIr0ANHaXquZRF2rEP+NuJCoHxtBKmI+RdRD/fi6LKxu2p0cp1sAaexNTJfSdkwDkPb9nnPFHa3gj9I0HujWitJawT2QyfVrFsOwr//ZMjXr/36dFdwD/9JAXva8oxXcAzk10J/2Gw08e05AgXJ5AAAAAElFTkSuQmCC\",\"name\": \"stackoverflow\",\"url\": \"https://stackoverflow.com/search?q=%s\"}],\"image\": [{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAD1klEQVR4nMWXbWhbVRjHf+cmTZq3hU67tcvmaql2L2q3FdTqkEodTESZ+GEKExX3YTrRyhCmMnDgCkP8EHwBnV+UMRyIiGLZLG7TMq22MsegOErrSmnarFub0CbN6z1+KLnNzb1JbmLF59M5T57z/H835zlvQkopqcCklBQbIoRACFFJOoQVgJyooiiWkqqqahmmJEClwtWAFAVQVbVq4UpymQIUG5CdmiR5/gfSl4bIjI+hRiMgJcoqP7aNzTjaduDs2o0tsMEyhAHALDA7HSL26Qck+89BuZIRAueDnXgOvIatYV1ZCB2AWUCir5eF4HFkYrG0cCGHy43v0Ns4O3eVhNBaZsUW//Jz5o+/U7E4gFyMkxr81eBXFEW3jO35APnVmujrJfbZR6bJ7c0tOO59AFtjAIQgG5okNfgLmdERLab2sSfxdR82h8vTEnLJdOLZqUnm9j+DTCZ0A22NAbzdh3G032eaODU0wPz7x3Du7MR78JBpTCGEkFLKwnmJBV8l/t2AbkDN5rvw9wQRPl/pxPEYwu0pGQPLtWBYBXJxjGz/FuLnGkkO1QOgrL6FuhOnUPx1ZRNXakrhNiDDp8Gm4t41iWfPNYRD4nnx4H8iLqXEXjj/cvaC1nZsjmAPeHF07V5xcQ3A4IwN6/q2O+4HuyFMs66emGXBI3ucdG7R5zLujekZXVe4WiwLlLNQxLiLrsxpY9FSGSsANfW6royPGEKqNY/TeCwbJld4tyJnw1p/OjLMGjVDjWJeBz++Zb7m/55R2X9Cv4Wv9RsBlMLLgqh7WGufSa7n6VAzvdd+MhUpZb+PZg2+Oxttei0hTADW7iWNnfcW7uHo/A4S2Pj4yiluJiKWxRcSkq9+S+t8t92q0FDwDwghlmpAVdVlp6uJTzxv8nWiSfPNJqJ0/9xDNDVfVjydhXe/STIb0xfco236KcxpKjmSfNt79wHc9lqd76+5MfadfYP+0B9FxUci47z0/WkGx1I6/2qP4PHtegDdaZgjyj+Qzoz3c2QgaCrUtCpAR8N2NngbEEJwffEml64Pc/nGVSQSW6IFd/gVRGZp+z76VC07W5fnP19LAyjckgFOXv2W4J9fFP3iUiayPlzhl3mhvY3nH3LofsvX0j5ZCKGrBYB9rU9wrON13HZXxQCKPc6zj0wZxHNXdU3XyqV0On6DDy+fpG/iIqqFh1T7mq10b3uOTXXNBvGSl9JSgQBTsRn6Ji4yGL7CaHSCuWQUKcHv9LHRt45t9ZvoWt9Ba93thrGWr+XlBlRjFT9Mcva/Ps3+DciKPU5LwZgmq+J5/g/N4OUGvdHwnQAAAABJRU5ErkJggg==\",\"name\": \"谷歌图片\",\"url\": \"https://www.google.com/search?q=%s&tbm=isch\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABpElEQVR4nKWTvUtbURjGfzcf5prqEBFMBpWCHUIVISKRoIgQ3QQRRNBM1UHqX+AiLg4uQpeCiKigIkIkf4DgYAmVQBDEL2iHVIsfaGpi1Nxrck+HaGLMzSB5xuec9znP+5z3lYQQghJgKKW4qMDW9gPNbaf4AwkA5hbiTE1HSWuFd016AhubCZ6eBEurdzgcJr59vwXA45bp8VqLO4j+yzxhtWboKpuB8/NU9vyF13UQ3lPwjVzibpWZnLAhWySGByupqzWxG1JoaizjU4OZ4G4Sj1vOKYhnzMxGhdMVEU5XRPz6rQo9dHSfCacrIlbW41ku68lhz5iRLRLV1UYOjlT6hy4Y8F1w9jdFUhFc36QBODxSC1sYGqzEZjPwsd5MLKbxZeyKu0Qmk9HxK9YW7XjcMqGwgrcrF6T0dpCub9L4Ri75c5p6TdP0uYzl+Rpki1T8F2JxTbcYYP9AZfRrzpWugD+Q0C1+QXhPwR+4Ly5gNufb04Om5a9O3iT29X5gJ/jIj2CSuloTne3lGI3wM6RwfKLS2mJhoL8iT6AgxPei5G38Dx7mvwaRBxETAAAAAElFTkSuQmCC\",\"name\": \"百度图片\",\"url\": \"http://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB5ElEQVQ4jZ2Tv0sbYRyHX5Uzl8bLVNrSToUOHbr0T2gHqf1Baf8AvcUruNcpd5e75BK9H0Q9gptCogZKh6J2kWtDhkpxkmCwOIidijpYECoI5unQNo0QauwHnuUD78PL9/2+on9w0ItrWiSraiSNjER9w8NRTFUjuQvimhaJuKZ9ThaLJHyfGzMz3AxDRC6H7LooQYDi+50JApJhiJBVNVJ8nx7TZKhU4svhIYX1dW4XCsRsm4FstjOOg+K6fwXCMHiysMCfvKhUELp+OcHjcrkleL60hEil/l/wslKhxzAQuk6vaRLPZC5/g9dra5jVKvdnZ5FtG5FKIVkWSjeCB3NzvFpeBuD7yQnvd3YYW13lztQUsm1fLHhUKnE1n6e+v0973mxtIaXTJDKZLoY4Ps71yUneNhqt/uPuLrJlceUiwcP5ea5NTJCt1fh2fNzq321vI6XT/xacNZuUNzdpHBy0Dp41m1Tqde4Vi/RbVucZPG1bpPbU9vZ4triIlE7TZ5qdXyFmWdzyfYobG/w4PQXg69ERYysrKI6D0PXzu9Am+KAEAYrjELNthGEwVC5jVqvcDUOErv/6E45znlwOxfMQ8ujop2QYorguiueRcF16HQeRzSLl8wz87hXXPY/nkZye5icfi28JEi0cegAAAABJRU5ErkJggg==\",\"name\": \"必应图片\",\"url\": \"https://www.bing.com/images/search?q=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACaElEQVQ4jY2TS0iUYRSGjwupXYsIAqFdDl13tclNd6WgZVQULZrB6ddsbhA1FwkyNQOjCMz805nxMiM6ajq/OkjZxQElLS0sK6NQI7QkCCrTnhbfmBMatXj54PDxfO97zvlERERM245IlqbLXut/StNlj7VM0kzbRdZlHBVfJ+LtQDzGgtwGci6KuKN/1ueVH0Nc9bMi+3KD4u1AnGHEHkK0IHIyiNhDLD/TQIozrGpaEHGE1D1nGHGGEF8nIpnZt8QdRaxBUh0hDvl70HtHaR4ao/XZBLHn72kcHONwoAc5XYucqkFcCYjHQGSHRRdXC8eCcQbHp3kwOsnxQBxTQRurPBHSL7Ria3jE568zdL/6wGp3REHmASv3a3rkxRTfZ+cAWHsxipyoVK/Z69RpriK9oI0fcz/pH/vEMkdIxfUYSHlFhd40Mo29aQCATZc6kNyapKxhZdlchaPlMQCW+j7EGkg0s+SqnlZ8F0u4D4DNJUsAnGEkt4b1RQYAxvAEolWrCaVmaXqKsxlngv5XQF4taedvA9D39iOSV6sAssuiiy2C618ArZqtpTEA6p+8U2N1RxHZa9XF3vQbsKG4fTHAFkLMVfj73gCQVd6tIniMxYAtpTE1BWtAKduP5FTjbR8C4Nr9l0hOddIeJAD2ZjWFh6OTlPe8xmcMYWse4HLXMIPj00x9+YYt0q/c2euSAJnZlckOdl6/w4GybrztT7lyb4TCrmEO+uOsONuoHCWvswJoleJsxZFwYCoyEHPVQgRrQOW11S1ubH4MkTUbd4tWM1MYnwAg42Yv4mpZ+gcmyxdDrDcmfgF4QGAxnLBCrgAAAABJRU5ErkJggg==\",\"name\": \"pixiv\",\"url\": \"http://www.pixiv.net/search.php?word=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA+klEQVQ4jWNgGAUIIKBqwKCfUMSgGZXJwCklhy6twSCoW8BpUZTFaZIjz8CviCprXtbFkHX3PxynXPrGoBIQC5Ou57Fv/C/Z+B+Gf4jV/szgMs6EyMq7BqJoRjaEQ1zRmUXRFVkzsiEaDIK6DAwuE1ZgNSDr7n8Gvbj8Wfy+c7AZ8F+y8X8tl30dA4PrlNU4DdBPKFrCH7QUlwGNPE4tDAzqoclYNaff+MMgoGoQwaYdhcsAGxY5G0g4eExZh2GAUVY1LBCX8wevQNfcyevShRoTim4hDHZNMxls6yczSJjao0ejP5ta4Axe35mT+DwnO7MoupKfXoYfAABPvsL2GuU3QwAAAABJRU5ErkJggg==\",\"name\": \"flickr\",\"url\": \"http://www.flickr.com/search/?q=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC1klEQVQ4jYXOyU+TeQDG8Z//gIkxXogxXky8TTIeRhMzcSEdoKW0SIFibYuJLFbZVGyxlLbQFoqoBEhEBSlbA4xxNwq9zMXMeTLO0b4vWOhGoSKBUfHrAZdEEZ/kOT6fPMJtNLVPelpD92yNobv1ttCd2vNTI5aqhx0lxpv6/ftNO3fs2LN7+/a95Qd/r75VZBgPGsyTE0ZzaMJ4MvTQXBYSU772v/nrOdx/zIeJe6wF/+Td4CjvAqOsdl/n3xNlqf+Kjellh4dVfycrrVdY8XWw2noFOnoQD5yuEE8mWQyOsxAYJdU3SKovQMJ/lZmSUiK5OiI5Bcg5BUQqqom7fcScXuJOL288lzcAAsMkr/UwXVyKpMxHyitEUuqQFBrCmbnMmMqIubzEXb4NgMEgqdtDRMqr10d5RV+BrHwkhYaXh3OYKa0g0dxG2uNHjDU0PvoCjIwT93Uga/TIGv33wB9awpkqXh5Rkqi5iORoeSM6LZbedWCCheExIpZzSOpiZE3JxoBCTfhwNvPHDIwbzCGhP3TItPb4GYtjd0jdHGDGVI6k0W8OZOaSVORxYd9vzSJj27Zd8sDwwsrdB8z33GBaX4qsPf7zBwUGBtX5j4QQQnRVWvp5OkWy6zrTRSbk/E2AI0qkbC3Js+d5cbomKYQQYndGxt7ZoZH0cm8/8o8AhYbwURWyupDZs+eIXbATr7UiPqcsW3Xmfd8QEZ0RSV2EpCokrDy23iwtsqqQV+YK5i46mLM6iNbZWKyzfQWEEMKr03WtNraQqKonUlnDq/IqIqdrma21ErO7ibl8RC+5mau3E62zkf4WEEJsadLrfcuBEd4ODJPq7iVxtZuE/xrxFj8xRwvRBuemgBBCiKxfftU+t7v++b+3n7c9N0i3dzLf3Ea8yUOswUm03k6szsbrHwGfsrX4wMGTwVOVT144XHPznnaWmttYcnp5bXezZG1izdrER/CEaFr9QFrRAAAAAElFTkSuQmCC\",\"name\": \"花瓣\",\"url\": \"http://huaban.com/search/?q=%s\"},{\"favicon\": \"data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACOElEQVR4nH2T30vTYRTGP1txcttXU77DpQmbyVIpKLELhxdJYBE2MyIiasWUHOzP6Cb7cbcQotSL6raigTUpo8QLozQoAyEXUpJSqV/TWbvwdCEu54YPvPA+vO95znMeOLABp9tOam9vnwIkk5M6NvZek8lJBYjH4yoiyibYN5KGQADVVSzL0h0OF76qPZimG8uy9NXgIA67fXN9Lhrq6zQaiahlWTr+8ZOKiFqWleFbOrgVi+noh3FmZ2cAePL4IQBnTrUCMPJmZOvuA4mEiog2NQY0GomoaTi1qTGgtX5/xkVPT0+Wi+3rl+nvM2o4HUxMfCbSEeJuXx+vh4ZYTv2h0lvBqs2GXZXS0lLyCgCMvnvL/O9Frly9TqGrkOnpr/xNp/ky9Q3TdAOwaC3kz2B32S6br9KP1+cDYMGax2UYANTUVAPQHYtx/kLItlEgi7SHwzr38xcdnZdZWk4BsJJKobrKza4uJqemSKfTWTWZEQYSCT0RDFJulvDIbVJbU43D6eLli+fE+58CsC2dJh6PazAYzBIBQES0LdiaSXvzOXrksK7/yZtBlddLf+IZS6mVHHGAcGd0LZu5H/lDrCgvA+DO7e68ApcuhgA4drwl97G2eq86QEVEH9y/l2M/dO6sioi2NDerp7hI28Ph/2PsLChQ03Cqz+NW03Bq3f59WcXr+xCNRLSpMaAioiKiN651rYk01NepaTjVU1ykIqKHDh7IcTA8PKyekmIVEfV53Oor82RW+x9KpTd/hADUEAAAAABJRU5ErkJggg==\",\"name\": \"easyicon\",\"url\": \"http://www.easyicon.net/iconsearch/%s/\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACD0lEQVR4nO1WsW4UMRB9sxsECAmlpbrbRKwpKE4nk0i0/AQSogGlSInID/ABKegoEimioCC/kJYiySKCkE7aC8rtUdKgSClQyHlSBN95N/batyQVN5U9nnnvzazXNjCz/92oSVKWiPcAnlfcR3KQL16rgCwRHBKn1Ki7NPz+5coEhBJXTQ5yL350XeShubUKnQDMZ7Lo3zBdH4F4IRFntvC6TjgXsnb6B0Rz04CNcy3CXXluARWQW7fjmw97vVPXesSq0y0OvzpFUNySR70fVR7rHthPxK+qT5NnbbFhq1BRdGD6L1XMo6GNyyqAgHlzrsE+L6RPQHhpy9GWJWL8+7HCal2sU0DJmD9MhrRzMcCxHOTk+K4dPXg0zN+VxLXFrldAlqRb5lwW/WcAkLXSBxNfPj8OUPzKV8PYCEteAcz01Joc4a0dlN4EC7DCVvGA39ZIxje7ANy9UgEAts3Jbut+BwBk0V/7F6JgAbLIV8x5HEWTXQ1+7QM0N+Z+kp6UFhl7XgE20/83gdZNv+6Oywh0pySuyJeDBDDjp0vESMX3tG95eHgwyeFTs/rQSyz4KNYWchfsLYrHkcKnMtMURzFwUVEdietIzhLBl8gB2MiBBtex7sA074S6rtVuwmqiryvTknsFWADWnYENyIMEaCA5yIn+/h2+9is16oaQA02f5e10E0QvKu5Gz/KZzewcjEjYbJKZwQoAAAAASUVORK5CYII=\",\"name\": \"Pinterest\",\"url\": \"https://www.pinterest.com/search/pins/?q=%s&rs=typed&term_meta\"}],\"video\": [{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAByElEQVR4nO2WTy/EQBjGf1M9ES4rQSzdlkVw2KtIcMBdfB1fQ3wWXEQiTtgI4k8k/gbBRdzYjkO33VUz7WyWuuwzeZPp9O37PH3ft52BFlr4Z4j6i7vJUZkFaf7oLOKNJjcTI5mQhxg8PheRgKvxbMlDFE7OhQ0gZTL/p9+8PtsSynXrcqwofQlJJgmsc2k5mjdqqriXY0Vp+ylvDxC6yM8PiqcXPL688DY91VAGfNQ8lpQBgakB9HZ3M3J2QcfqWkPPqsxKS39QgtqoR//8PF3rG7SvrHzzUQ1dbLMSxEpRjz7XBdflaXaO18UF8H1lDKEpgW3S31EPJDj3OA5sbALwVCrRlsvFFagF+CafmOZhpQiAchmAh0IBe8gDQKoTg61Z/84fZsBMBz2Ow/P7O22eV8uextdO+wlVJQRBDBUcekM/1uINHAkwq4CsCkh2Lrue9p42AyZfgSVEqESJgwTiEDoewwwEiMfYL6QT1wSo122TuspqF4aue94w+BVjctD3j9jNO6kSop1MCPNOjEG3owqAnf5kEbqttFkB0/fXZueBj8rfnVeiV9vuG8z0VDTzcFM7koXY6h3IRMTc423zNW2hhd/CF3jZLaCW4/+vAAAAAElFTkSuQmCC\",\"name\": \"youtube\",\"url\": \"https://www.youtube.com/results?search_query=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACTElEQVQ4jY2QMUsbcRjGH7n73z+m4g0OblkDpkOgRT/AKeRCYvwHzxDBBOLUzU/gF+gkjlLoKlTBxQvxCqe5u4iFkw6CATfddLPSCIWnU8/E1rYP/Jbnfd/f8ALPIqUsj4+Pe1LK8lCXBeAB8AzDeP38JokQ4u309PSP2dlZmqbZByANw8iZpvm1UCgwn88znU5/+pvgzcTExGB/f5+O4xDAewC5hYUFPj4+cn5+/huA+osCADAMw8lms8zlcpycnPySTqff2bbNVqtFALWX7kpSSk8I4aVSqVDXdY6NjdE0TU5NTVHXdQJgKpWKhBCelNLTNO0DAAkAlVar9T0MQ/Z6PYZhyDAMGUURgyBgt9tNul/96ekpd3d3mclkDqDrenR+fs7t7W0qpVitVhOUUgnD/fLyMm9ubri2tkYIIT73ej0Wi0Vubm7S930GQcBOp8N2u50w3M/MzNB1XTabTUII4UVRRKUUz87OuLOzQ8dxeH19zeFsbW1xZWWFd3d3rNVqPDw8ZKPReBJUq1WGYUilFAHw+Ph4RGBZFgEwjmPW63W6rjsqUEqx0+mw3+/T930OBoMRweXlJX3f5/39Pcvl8p8F7XY7OdjY2ODc3FzCxcVFMisUCr8LlpaW6Pt+shTH8cgTHx4eklmpVHr6ga7rQRzHrFQqzOfztG2btm3TcRzW6/WExcVF2rbNYrFI0zTZ7Xa5vr5OaJr2cW9vj1dXVzw6OqLruv/k5OSEt7e3tCxrAACvMpnMwerqKhuNxn/RbDZpWdZA07TKT3uI/eaBFtmBAAAAAElFTkSuQmCC\",\"name\": \"bilibili\",\"url\": \"http://search.bilibili.com/all?keyword=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABnElEQVQ4jZ2Sv2vCUBDHv4OFYEAeRrFihjeYLl3eILRDhkcXKQg6tWAHs4W6WBAq2CWCFLe4CS7ZOhWyuHTK4uDmpKtD/4As3dOhOYk/SrGBg3fc+37u7vsCAOztPud/DXhEseoUN7cX6Qbi7/Yi3Vh1ihuqT+pZDwADAIyqzE2KKWatfEDiY/W5XVgCAGatfEBdm0K1mkK1+pI5NAF1jgWsKVSLIE2hWr92GFWZCwCUJ1ea24Xl14BHfckcAIDJFTmpZz0qUJhckX8CyINRlbnnDDw5kckVmVzB5Ip8vMo87ayw/wIUnz093AceMxkAWF8yh8z87Onh233Ov8yfCbpgckVSo7ldWMa7s1h+zjV77Gfunl0SKNcNS+t6AUqGUG8enuhMdc0e+5o99gEAqXJF6tN1pE/XEYkpz9Tajtb1AjoTgOqpckXuAJLiorsIUTLESYB9MQD8C5B/eV+SSScBNHvs70MIwFpD78CzkiEOTGStoZcEZmptZ5t3vaDoLkJ9uo4Krx+bn3lKhtjuTT9GDImfliWhW3Hs0Tdk6pGCP1WKswAAAABJRU5ErkJggg==\",\"name\": \"优酷\",\"url\": \"http://www.soku.com/search_video/q_%s\"},{\"favicon\": \"data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACNUlEQVR4nK2SS0iUYRSGn/P/42UcLCXDIoykaKhlSVCbGlu1MkgSJKE20saoyG2Q7QNpF0RIi6goXKQkLoIQhjBCNBAddFLGWw0q3ua/nxa/82eF0KID3+K7vC/Peb8DO+pKWi80p9W5mtbH/GPJzs3loUAFkOKp6GylbSR7UmLtZmDoAI06gE4P78+2nj7FvorPuB64HnieHF41tdD00c/sSqDvREHpPXF2zj24eAgRBBida2d4phORkCiEMu73peTh7wZvRQGeNJzbiu/JVYSC0EQERnIdfJm9HRmpqDN40SxHQp2BDTjgyHLcsn2aEkNcivfjOAa2E3Cytpu2M/WUmrPYruI6lKbe+0GqX4+GBM8MRaA7VYsI3Kqbj/BWvEle5htDIoGJpTbS2a5tOiHmm/UGFmBBwfax7AAliAyqY8e5eSBHmVeHZfkcqerBdn0sByxH2fDd0Rh2mJBl+wjClreKIWa4MBlf72Vxc4piNpZtIGj41aJPY1gCohTsAAE2/B+YlLDsZHk+3RKFZ3s1vB4ZRUTDFmAqc6PsTgw7jHtzrdqPlefNnonrLBbGoz5F4EPmBQtrKRDdNtQ3ufZ4M0AMJ+x374qxtVITVH5b/RoJx+Y7GVsozsI2NpLMd8QniznFsJnAkGTD0rLftzdARPg084ip/DUoCgFBX63fS7T8NYkAerdkMBuv+p5MZFqVkl8X4W3WtRLHeCDBn+LoSVRdGx4iZjggOqR+4vxuwv9WPwHg2/J5NFR2OgAAAABJRU5ErkJggg==\",\"name\": \"腾讯视频\",\"url\": \"https://v.qq.com/x/search/?q=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADfElEQVQ4jX3MbUzUdQDA8b/1xrW1tlhrtmatF1qrVk5opajLUScgJtoIxXjQ1iobqzaV1MCWqZm2EumO8+C4Bw4OMsC8EGgeWkqi8vy/P8cBJ8cdTwccj/6u+4/79qLVy77b9+1Hcvb4Q2/oukS6SRZZ5YrItLpEpkUW71pkkVgRFO+b/xTZpjaRYXGLTKtLZJUrYpdZFhpdl6htHwpJSSVukkr7SDV5iNcqpJR5eK9S5hW74LjRyrcXCkmyTbKn0kuKsY94rUKa1cN2k4fXi3uRMiwusblYIafKS0FjgG0lCqvLwphs5/EVPk+sXZD9k4/kkl52mvspaAqwUddLvE4hy6IIKUHbKfKbAtwcmqfZO4dveoHnKiDb1EqbLpkXqyOsqoY1himGphZpH7mPdyrMSecIa87cEdLnlwbFF40BfmyZoEYOsQgMd15G+9UOFMMWhg3x1J3YSGdLHTfno/zcOcW/7atQhLTV0C2OXvHjUGbIKXcTBGZvFcEhCbX4SdA+AoclFp2HqFqE75tH/wMK6geFlGNTRFiNAnDs+hK3w9B2PgH13EOM6V5iTL+WvwofpjV/BUEV6obg+G/D2LtCHKsfFNIHdrcgusTcEuT5obPmBDN5EsEfnmBK/zKh4hcY18cy+tkDdBW9ybAKehe4/CEO/zIgpCyrIpx+ldnQGO1nXgXdMqKODSg6DSHtM8yeXo773AbUoBuqH6PxwxWw4CcgIMvqEtLRSx5xbQFqzPlwRCJ33TLWxq3nXscNVG0Mc2cfJSg3kLb3INt3ZhAtkGg8GYdjHs5e9QqpWRkXWj8cOfA23F3Jyth9SMtXoQYHWGo+yMwtI0QmiXn8aR6MWQfBWvK+/Jhv2iPc9k4KKc3YLVYXBflE7wChsL+ogafW5xIdbSI67UUdkWHOyabsU8Tt/RrCPnIvh3j2Ow/bDN1C2m2WRYK+l7fq70OfA3QfEf69HGabQa6CHjtMXyVyx86S9gD06Pm0IcBrF3ykl8n/AFvN99hT42f8j2oi1aeIdNcy0X+N8dZaxlouMqE4CSu/ol48zex1C/sdwySU+cgwuYSUWOom1eRmt9XDFtsomivzaCrHSDQMkGwLkGIbJbF0EI0tQGLDPBr7OO+YPaSX95OgdyPV3h0KbSrsEOkmWewwKiL1/y51iVSjItJNsthc1CFMN7yhvwH03PqrfJ8h8gAAAABJRU5ErkJggg==\",\"name\": \"acfan\",\"url\": \"http://www.acfun.cn/search/?#query=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABjElEQVQ4ja2SPS+DURTH/9yXPs/tc59WWxK9tfkCFgwiNLUIQWMhqhEsQopFRcTCwOAlIp2MEiFBwmcghobZ5i1I6iUm2zVoG1KetImT/HKm80v+5xzgq9xJZm2kXN6jEFCLUqsOtPlRKv1u1+hp7l4uWVAPGr6RQX0nlZ512ZslCxpAW6+zgiSz1v9LwBpA2yKER8OE9+SIEB5tIq4OAJajYIS6k49S6Vup9I0M5rmVQZ2RSi9yz7ajYIyKhYyt9F126DuvUukV5tn5VTDD5GouQgvh3T3EiHcSI9ZBjMEuYgxFiTHcTnifDfh+FcwxawsABUBKXuKVVa3PRFVmT/jTh8J3cSACl7l+IgLpUeqeBVBeIGgEjTxnl/UglX6WoQI+7Bp9LipfAXgKBAEgmHJVHB+LwMWO6T/bzePLc2D4TmPMnARQ5pSGF527iBKdxIgNMDPRz8zxPmZODDAzEWfmVC8xRiygynE6wa2llz/+4M0O6TXu3XcUxJk5dZ897c9PVPpJKj3/dW58AkPWtgVm+sp6AAAAAElFTkSuQmCC\",\"name\": \"乐视\",\"url\": \"http://so.letv.com/s?wd=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACk0lEQVQ4jW2SXUhTYRjHf2furH1vns0tc+p01YbSaRRGFGmElRWhRVR0VzeBCUkRKRQUURFBUYtMsAsvwqSLboqKii76oOjLLsKwLBLOjsM+iBEiEk8XOtCDD7zwwvv//57/+7wvWEpX1WUXqud33U1XPn+2cuHgm4bk9xeNqc+Xl1f0eiFi1c8s+wHNd6gzWpxZ7XXtrHBQMx/itR413RYPdbysXzQ80qxPnFkay8zp3jXP1V7ncPS74BbQD6ywavbGQm25lrTcXJN4OOtgS5G6L4oyDogNRYDfpdCUBN0KaYp4t+da0nJcX3AeAB+EU9gmAFGnzH8B2xlcmTElJBk8N6yQW8vjT7Lblv7zQZj1FHUVzNOAdoBruHsNRRMzlJCPkUVja7E3FQBxB6nRzbqc0MsuosKwfdpcBJOAE+Aq7l4DTQybJmY0KWagUnpw3wb8AN8aUuMvG2uGscFPUMSOIgrkC10yBQCaGASksL+Cqw/gQ13C/LKhJo8Xfi7DLo6p+JOAfVaCGesxvo/VsBhgKJ3IDzWk/rAV9XMvPtmPUw7gEmC3FfCV4EQrjo5CuhgsNPWEPK2rHqQFNWOiyQBBGUOTbjw5gIu4rxtocg//W+sPvBMKvzKXJKSzouQsXoiMEJzMKSEx0OQXmjzA/zoJej32DdYnvGLz9GVLy2SktmoSCALQifOsYQtL1rlg+r5B+UQwfw53dzOOPZso2nEC16UBAjljXolkY+VysCR4bBa5B/dtMxCX0Qpdst6YGPinp188a5BZX1S6wlq/NRkAR3Ce+l6amvixrlnGVm2U0bIayXrLxVAjYqDJsFI83urwdMxpnlH+o3bv6UclVR8GwlXmO2fUvE/g/WGcJwG3VfwfeW39pYdUeeAAAAAASUVORK5CYII=\",\"name\": \"搜狐\",\"url\": \"http://so.tv.sohu.com/mts?wd=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAASUlEQVQ4jWNgoCYwMTH5b2Ji8p9ceZwKidZIsY2kYhQDSAW0MYAUg8h2AbJltA8DWGiTZQB6lJHlApK8QFFCghlCMMmSoZYgAAAvUMVwhox/egAAAABJRU5ErkJggg==\",\"name\": \"niconico\",\"url\": \"http://www.nicovideo.jp/search/%s\"},{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIABLAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAARJJREFUeJylk71KxFAQhb8bw7IKgbW0sxUuiPgA2ttsodhaLOwDiBDyALKNnYWBFJYiKttspUhaQRAh4GMoBDSkuRZOdHTDkrgHBs6dnzNT3ANzwkSJXQUOgPVuJ+gDFGVe29ztBEh9DDwD5z7wBPT+Nr5/5BOdW1oMdtSzL7Hly/Db8SBbbnN6lNhXYLvNTC1MGFsHHAJrwEDVJsA9cCKbUrWx4qmnBlYARsPMzFh4JPENX5Q2G1x7BewKv6uSnpzTBBeKn2mBX3DO1V4zGmbXdXxKoC2mBE5v9h/nUnx4udwLY+vC2N426TdRYh3//4k9UxH4MQsw0wvKbKkPbCBu5MsgFGWOt4A2D0WZ6wVjxI2fleZQvCOg+1AAAAAASUVORK5CYII=\",\"name\": \"爱奇艺\",\"url\": \"http://so.iqiyi.com/so/q_%s\"}],\"music\": [{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAGF0lEQVR4nK1XSW8cxxl9X1cvMz0LZ+FwGZIjU4Y2G1kMSaAAH5xLFCCXALGTU46Bz0Fy8A8Ikpvhg/+Bk4MBI0EM5GAocRApgBJDkbwQshjIorgMzX1IzkzP1l39fBiyydEMRSrWd+kGvqrvvXr1qvpr4DkHSXneNU8GXfZm3nvzF3w4nmE1meTiSJF/Ll3kaeY+F7bLudGBYCoUuA8/Rqbw8rE4xrcF/yj1Qg+4iERPX2k8vvzaU+efioDHPc4WC9xJZblm5yLADZKlZA1FrwbPDeCYAbZUHguVDnbzChAbU53cs6/qaGzFpuklhrkwMsKF3CQXh9J864fXIxLzo8NcyY/w8ejhNlDvkh65/Ol/uEkWn1b/2L0haX0xPd7J1wChgh1qtCdzKCzU4dSXonlfZwtsKwtjDRPxxtIze2rgFrC8eaGcy3cSje6i/FgAxsYx8dn9HnAA8I0QscCHZ/rgZvnCcyFQvvTSHMSCEwCeqbH6k9cxsvapiNl12IGsZZKaCQSGgZZFzH73+3O8eZdLZPy0BPokuzF1nmf8TbgdGyKCiXu3PpMz5195ctwHr/+UP/j4Fgx20FDxruthwlc+UmEdC4kEvj57DVf/8aFbEmmeikCLLbJwDtUgwE4shP2z6zj77h+iMSTlvq6H+eJFBEEAEQHJ6BlCoOCDMAEAbRMIGwas5dvZ6ez07okEtosvshLWkPEMhG4So+tf9Sm0mC3RkPZhgX1wANAGYFtxIOhAaw1FoOYESFgOJuYfQKyhvno9HvAbu4j73f0cBP5lcYwW2tDKRNM20FQNTHxxE4pAIDEQgmZLY3xjxZrfrcEXQaplAXWNhdKlQQIcErjzu9/Ss8xoVfuS9xDMNoiOApTuILvjoLBRBUYm8a/pKaTbPhIdQOk6RCR4LWxI6cE9hLYBGIJYO8R64cW+KzsCOPv7d+GEAmgTa6/OHBAJD/J/S09TK4FJgRE3MVx7jJTW0OLg5zdvo+5oNB2AoUTEZbQomfVZxP0mmsqB1WqhzlUOJOBbPsxQ4OomLn/4l77j+UIiUgWaJirWoQ9gAoFdhQoIFbPx13OX9EEqKXl5lJlC3vOxEw/hDV8brEDbUvCUgm8KRKRPqry3FTn+YSWADRXlOrYBay8JGAKDwLWdVs/cq4uzajvVgaOJdth7IvtWeuDoJ8NzVZR/KWVBwYSIQETgGQEMKxPlVUc/2ZhwpFEDEJ0aq4+AsgwEyocdqoFdTXN65rCaCkF4ADXqBrEBBwlUo/yGsEdFEeEeU1G+7c1f7yOQqQDpToAAJlbfeTsy30Gc//dHcrCChg6wnT6Dty6fxwdXXoUVG0bV1pF6+b0HfQoaporyjthbEbmDlzmMMJG1IUYAAJjcXutRYYmMT738o8b66icIjHjPDXjwbJshCvYUhsr3+hRczY0xAPdr33FFSs0eBS50ynCCLstBPiiJNOXLG7KQPjcwLyJIJ4sDwQHA2Tdf1zelyIkRAbFtCY1D9/69dHWgG2cW7qjJ7bnsZCWEYghLgFYxg7GNWYzMfz4Q/NaP3+CemYDSDnK+OWhI99bj+39iOT/G5dwotzK5U3W1AEBdOXZss13h3QvjXMyWuDQ8xs9vvN/bQz45oYIcK4UYUn6IpkkYm2tP/ZyeFHOxApOJ7hGOtw3kNr+CxN0It+8eqHPbdVs+mmaXaHXIbvy/4NXSDJNu950kcsu3sRIzLh4d00egJNL85/degRt0MNS0kHLyoFEktx/98rTA9MhduNyrL4AwULU1wj0L25kpTErsfycXIK3t37zJB4U8K6kCl3JnuZ5wuWOl+cdf/frY/f7kvzfZlnFuFItcyxS4nBtlOT/Gpjt57JyndrHUddaGJlB1ui2eEOj4LeiUIFkzUIsJqEOkKKhKC0kj3XOMXT/EvLZxxSsbg74vwAk/JqKSkq7vyb4qqFsaMRVDzTBBEzAhcEShZlkY9t2+OyR3/657tbEix4GfqECkBGkAy86jwpVG2icgAbRhQWmBCoGaAwy1O6g6gKUyGJ+7l0UmUz3aT3wrAkeIWCLikzTQXjmH2ZU5OAC+M+4evd2eJb4BbtLzYTTAjpAAAAAASUVORK5CYII=\",\"name\": \"网易音乐\",\"url\": \"http://music.163.com/#/search/m/?s=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABfUlEQVQ4jZ2RTUsCURiF/SFton27qIgoQ9skidJSF5qu2gZRtGrVan6ABJGbIqiwDz9CLSINIceKcNOoV8MpxQ9EJ2uc62nTiJUj6gt3c7nnOec9V6VSGIZQ2GLCr8MQCqX3LRFDKKysAFNUgNrLY8qdwehJEqtsCSvPn8oQhlAsP9RhZQXog1lo3ElMul7o4mEcW4EkVTufsBHNw3xXqCsCxvcib/pgFjofgeaCYMyVwOZ1Gh5SARN9h9aTgtafgzlSFjtC1mJFwXCZxtwpRydcCcyfc9RDKqh+iZQXREiSRPEzhrM4/y+BMyvilq/iOFXBAVfG33ks1sEQCoOPK3RuPZzDbqbWcmo0RAoAktSgTQByyYod2MI52G9e8UGbLddwsYH7ktjbF8oAOYHsyBCKnRp6AwSyVcjiroJOAIZQHJHKYIB2SDtAvlvaduz3DLGwQmt3Y6iMoXWHt+8kFlbAwlUes/48RmZ09r7XkUHGUBnD01rTQAAZ0q3Qb/EHnAbFqFNRAAAAAElFTkSuQmCC\",\"name\": \"一听\",\"url\": \"http://so.1ting.com/all.do?q=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADKElEQVQ4jY3MTWyTBRzH8X/fni7GXdSYwAFCRFG3cNgOcvGiTjjonDPdWhgO1rGCQ7c5R6cTxjTRqTQDQxZEJTFcyKZMaTSQQOJhkBAdZoBjSEyskq17+ry0T1/Wpzzt18MWbxoPn/x//8tXROT+d56V9z5rkVPHX/7/Pm+RUzvrZI801UiIcReMrYoJfCAr+xOBj/7FmFAcdSHb66SLI27METfmsItMbC2F872Yh91kPt2IdbJ+xXgt1onN//zZsbVYIy4kuFnCjLoxhwT9DSFzbBPlzF/o/UJxOoajzuGo81TsLOWciqPOU07NY194EyMqSLBWwoy4SH+4hvzXXRSvHKWSUymcHyA/0YZ5uBq9z0tp/nsKF97G6PdiHlSwDnpID7lXApUBIT/VTaVoUfrt4sq99QOUy2RitWh7hNLcOfJnX0PrEowDQibqxox6kOATEi73Cfl4lOLPpzGGHsBZuI62X3AWrpM5uoVUh2DPTlK6cwkj+hDaPiH9lhej34sEN0m4vF/IfzuAPXMGc3g9zuJN9D4/zsJNMkeeIvWqULz6FZWcRjn9J9aJRsxuF0bPasDZK+SnBrGvfYNx6FGcxV/ReqtxkrdJf7wFNSTYs+fITfSQPR1h+cfjGBEXWrcXCW6UsNMpZL/cSWXZwlF/p3KviJO8TaWQxnz3cdSAYM/GyU8OoDYLqQ7B3OtDj/hWA/t8aJFq9GgN1sl2nNQfGMP1GNHHSO12o7YK9i9xchODLLUKqQ4fRqeCFlaQ4AYJOxE/aouQ3CYYB2pwknfQe9ZRnPkOY6iO5AuCfS1O7swgS68IqXYFY5eC1q4ggQ2ecCnkxhpvx75xCefuHBW7gHP3FmVjAXsmzuJWwb5xkdzEIZKNgrrDj97mJ7XDj7Su93TeC3kxh58h+8XrpN/fht77JFrnGlK7HiQTC7D0kov82VEyx9pYanShBv3oIT9a0I8E13m62H0fVrNgvShYTYLVLGQDbrIBD1aTkA1VkW3xkG31rexQFcvbq8iHqpCH/fLI1NO+qz89rySmG/7Dc57EdIMvMd2gJC43KImZrUpirN47+TcxcooW8TIPDAAAAABJRU5ErkJggg==\",\"name\": \"虾米音乐\",\"url\": \"http://www.xiami.com/search?key=%s\"},{\"favicon\": \"data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC10lEQVR4nH2QX2iVdRjHP8/z/N73Pec929TZwmrdtEltOupCTGZ/bMbqIopVjGqQwSS7iBGBCV0EgTKsROiP2aIu+ne1AodFlOkKyiLUi63QrDCULoTcVs2d857znqeLMxdB+IXvxfOH5/l+v9w3mvqhM/t8YHeT75vc6qMfD/i9o0U/cnbM79kV+/YPev3dY8/4Ay+2+GdnXvX7X2j2h/e2+cHTL/nA7uYjYWRoD6aBdWv66O5cj4pRzTNEhMG7Ruho76Fay1jR0kYcEp4dfouFyjx5vUaeVzfJg3uW+bquzRw7eZgoRFSqFRTj5p5+vp3+lGpWpq31Gub+vkBPZy8nTn1JrZaxtmMDP5+bQs2MEz9NsjJtZ3jDGDde1Y8afP/j55gahUKJvy7OkpOxuriZ4fVjJMUSv/7+A6qKqgmrr+jl9W1TdHWsoee6tTy28TnMBF1kLhnvP3GBwb6nkFXfsOXOLcjS3IS7u0cAGP/6ZULs1HSOrF7BTDAT+jufpFBMmD1/EWoJhWKECo0nGhQRB0DFKOd/EiWw9Y4daFDMAo9u2gnA9oluTIQQFA2CBkXNFITGARUOHH+HuODEaY0srxCHlCQ1yvM5HmpEkRIixazBoGZcgoiSJAXipFEP3jLExtbG9/2Ht6GmWGzEkaFmjRCDKrooQU0Iqrx96A2SArSvWsbKK5vJsgpTMxMEVSwoFilBLzH8a0EENChJSFjekjJfhgU5y8lT50iiFIDIhMikkYEuZjD5234W5nKmZw4uedv70WuUSgl/2DhvTj+y1J+dmaeWgUUBM0VGxjvcWRJxWfzfXuhq76X72tv58OguBnufR0T45Pgr9N/0ON+dPsCtNzxENc9476sdDN02yvm5X1heupo4FBk/uhNtKrbi7sRRkTpVHKcQp7g7pUILKkrda4QQ4V4nTVZQsBT3OqqCPD1x/Re494n8V5y7c/me01QOyT8DBfBJpwjHJQAAAABJRU5ErkJggg==\",\"name\": \"音悦Tai\",\"url\": \"http://so.yinyuetai.com/?keyword=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADMklEQVQ4jY2TbVATdADG/3cBDgkNN2QyZWMhoKQwtLIyQ/DgaPvAAUVddUjU2UUdd3Z1vmR2B3VxUWhJqyBS0vAlDo7VImCWsPM4KcC0BtgYgzFjzcmY42Uovz7lnZ3n+Xx+fs+X53mEuDvJ1E+G7L5LrwjaqFmed6D8ibqaU6mdpd8s78ozLrny6M7FvUKIkDuSccrwRyy/Vg14ffUcdmt56aKcp87cR/a3S9C3rsHavcG2Pl6ScVtYs06ePePpmMXXQs/km1Q4tlDQJiOrPpw3GlR4/9JyfSwd34UH5rc8GPL0LXBoqFh11WmYXPC1sHC1lsnxfZRZNLzbloitL4fZoXwCl3TMDaXjP6/hsil6WhouEm8GfFyeU7vgbeaG+3OuT1Qwb99J9wUdr55O4FJvJtO/a/H3Z+HvS2OqW4PHFEPNW6GN//GLPMOHfPOuagLj+wmM7WFmoJhr/fkc6XmMyva1TJ3NwNuVxuSZzXg6NLgMSuwnlwaEEBFCtjQ4dW78IHP2t5m1ljBj3YH/z2K85ixGTI+zz6yh58dU3MZNuL5/iImmZJzHVYwfW4YySqQLdYxk2/TQbvyWHfgtz+MfLGDGVsKVjnRchof5uXUD77UmcPmUBufxZBxHkxitUzJaKyVJIfKFTBa80XtuO96eAqb6c7k2kIt/5FncYyX8NFDE4T+0lJoTaWuIY/TrNYzUxGOrXsXwp1JipGKbEEJI7E1b/f+0Z+ExZ+I9r8PhLmLM/xpn/36R0l+SeO6HFbx+MhLbF3EM69VYDyqwVETMCyGkQggh3i9eWe/Qr8ZaqeBcUwodzjw6HTmcHtFR99tm8uojyPwqlL4aJbYvVQx/puDQC2EtN2uUSIT6YlWsz/aRgoY6OYVGBbvaV3PAnMIHpiT2t8ZR0hzJ4LFYRo+qGNSvmI0IE+tuGVOqOiTXUrky0FUVRXbtYtKqF6HV38srJ+Tsao+m2RTLhDEBR+P9N9LWBxfeds7qqKCMznfk9u8+jOSZcglby4LY/kkYBoMSl2kt/UdUzmT1Pbo7HkoIIdkUH1xYWbTsRMteea+xLLqvujSyMT1F8rIQIuz/5n8BdBDOUVi5DnwAAAAASUVORK5CYII=\",\"name\": \"QQ音乐\",\"url\": \"https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABpElEQVR4nKWTvUtbURjGfzcf5prqEBFMBpWCHUIVISKRoIgQ3QQRRNBM1UHqX+AiLg4uQpeCiKigIkIkf4DgYAmVQBDEL2iHVIsfaGpi1Nxrck+HaGLMzSB5xuec9znP+5z3lYQQghJgKKW4qMDW9gPNbaf4AwkA5hbiTE1HSWuFd016AhubCZ6eBEurdzgcJr59vwXA45bp8VqLO4j+yzxhtWboKpuB8/NU9vyF13UQ3lPwjVzibpWZnLAhWySGByupqzWxG1JoaizjU4OZ4G4Sj1vOKYhnzMxGhdMVEU5XRPz6rQo9dHSfCacrIlbW41ku68lhz5iRLRLV1UYOjlT6hy4Y8F1w9jdFUhFc36QBODxSC1sYGqzEZjPwsd5MLKbxZeyKu0Qmk9HxK9YW7XjcMqGwgrcrF6T0dpCub9L4Ri75c5p6TdP0uYzl+Rpki1T8F2JxTbcYYP9AZfRrzpWugD+Q0C1+QXhPwR+4Ly5gNufb04Om5a9O3iT29X5gJ/jIj2CSuloTne3lGI3wM6RwfKLS2mJhoL8iT6AgxPei5G38Dx7mvwaRBxETAAAAAElFTkSuQmCC\",\"name\": \"百度音乐\",\"url\": \"http://music.baidu.com/search?ie=utf-8&oe=utf-8&key=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC+klEQVR4nIWTX2hbZRiHn++ck3OapMu2oG3WCm2XUJm4zihK/TN0rQ6ZcxsIq0w6hG0XE/FC2BgqInhR6o0yN8U/IBYVp2PMC91VsReheFFdt27FaknDTE66Lmt7mpwkPfnO+byoE4SpD7zwXvze5+blB7fHiIRI73iw5dt3j6VVsi06BMRvFxS3FguSsfbkwY6e3hMnDwVmulOCUiA0KtLk/E8uJ89dreSn7ONLS5XPgSqACMGRF0798LEZshBizahpgtL8NOXJT7lu6Ow48DC6JlBK8fuSjVSSX94fr9gTpVbx/ScDas4J8dFsN4mOu0ktXGAwUuCeWAiEABTvTBYYv78ZLR7FX3SIZRyG97Wz642f3zKK+TyHn01xcKdL11NH2PV4C6m4jywBmgaGzqHWEOZUmWq1yNCJJ2FwMyISJf/iKEbY0nNApykX6dqzjYmnU5z5epL9hkvLepOzWZ/hvRt4rfcBRDRG/dI4ZGeIPDNAADnt1zknACDwUIDrChK772PE02lrD3Hm9UfZ5DvUM6P4dhb5h00jW8DPfQEgtc/OZ69lphbXXqEU0pfkl4uUPAcME2FZEAQoT1IbG0cWlolslyjnKgIKxvbWcD294LHz5QzFVsFN2wPF2ug6wrLwb7oE5TrBimTd/m6EkUcYHehctjXpB/PeDZcvewRqxiC4VEYFCsVfAl3SmHNpXLHw7WacD4vI5W0IazMCPO3OqJlrVMuslivITX2Et5ymacyiMl2G1d9QCyMEhSj4ArP7DpSrWDk1hQgnWYWc8cGEPXRvk/tqX3s45q9cp27PQ/Io4doIhjmLaEoAywBsONyDMjeCFuWr72ZXAAzAeynjrO9vq42qhOpTgYQgIGhK4AcFhNVFaKuNqjYQVhcT06Xgkd1vvyLh9C0BAKO216/b556LpB47q4XXrfVAb0ZYncSPprk2X2NLeuibG05t4F8K+DfN8YeeX2p5YlCNvdevnItvqt6td80A5v8d/gMdhg340YLUf+X+BAnLRacR4gVKAAAAAElFTkSuQmCC\",\"name\": \"酷我音乐\",\"url\": \"http://sou.kuwo.cn/ws/NSearch?type=all&key=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIAByAgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAjlJREFUeJytkz9oU1EUxn8v7zW5xNekhSL+QxoUmmBxUozRxcUOgg2pgkJxrWBBqh0cdROqg5BBBaeKgkIIIkLawUFsaoUsUtLaDKUNVklKQhrb25j3rkNfYqx2EDxwl3PP9333fPccjW0RTZhngT4gAoScdBaYAlLJWHWitV5rAXYDw8CQEMI0dB2XSwfAti3qloWUsgo8AuLJWHWxVbU7mjDHL73pUlcm96lsKa1sZau6XWsey64rW9lq5utrFU2Y444ghsMxLIQY9Lg97NkVoMd/AltZfC7PUJR5iht5ANatCvOlaYQQg1LKb8Co4fQ85G5zA3B893k0TWMsc5m5Unq7RQC429xIKYeiCXPCBfQJIUxN27Kju72XwsbyjmAATdMQQphAnwFEDF1vXgY7IqzXK/QHRpq5oswzX0pTlPlmzsFEDCDUcBvAa/jwGj6igRt/KM+XP3A3cwGg8UMhY3vRs9xtVjfyFGWepbVZvIaPYOdJ+gMjBDvDnNp7kfcrL3+9BMjathXW9S2uyaUnvxGu1ytkCimW1mYZi6TpEgeArdkAsi5gqm5ZOxrWiKu9caeNaQAczJQLSEkpq0qpvwIHDt3i8Zkch/3HeLX4gLlSGqVUYypTGkA0Yd4TQtz0uD0cbD9CT0eY/sB1vIYfl6bz5XuO5wt3+LT6FoDN2iZSyvvJWHW0YWL82tGH507vHwg2lJercyyUP/Ju5QWZQgoApRS1HzWklE+BOPyHZWoStBD90zr/BDWFAshUlB4uAAAAAElFTkSuQmCC\",\"name\": \"5sing\",\"url\": \"http://search.5sing.kugou.com/?keyword=%s\",\"blank\": \"_blank\"}],\"scholar\": [{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACqklEQVQ4jYWT2UtUURzHL/QH1LMP9hKVNUKFWpP7TDrjU9uEo4WPWlERUbSoueSMaTWjTBCRGV3HiCsSWrTQApVSZBtZWEZSUWZkC3PPne3OzKeHK1NKy4Hfyzl8P+d3vt/fkSRJmpWSVbU9vbxbMZXJSnqZrMx3yErqmrN/r7V+Zf76jjNz5mYXSilZldtKfGBrA5sXcg7Dpg5wX/lzNV+FlmuwsRNy6r9HJFO5v9feBlaXILNWxenT+Pgtzr/W2Oc4azwalqMgLXZ29di9JMXj/xH3P4pybjDKhvYg1qMgpZfKyko3lPk0xr9PF7/4EOfTjwQAiQRcfqpjrlMZeBVjc2eI/FaQ5jlkZWs3qKHENPH7yTg5DYKKExp6DGJxcLRprHILAJr7w5hdIC1wyMquHmNj3/kQN57rALz9Eie/SZBRo/JwLAZAtRLC4jIA7r4pQHqprBS0QkaNysLdAXbKIQAiOjh9Gml7VOS7kaSooGkGwFQqKzYvWFyCgiZBbqPg3mvjRv9ABNPeANeHdSbVBOu8GvYWA9ByMcyKmQCLS5DToFLSKlDuR/kmEox+Moyt6w2TtidAUbPgyKUwZceDWI7MAFhdRgdL9quk7ghw8bGeNPXdZJzKjiCZNSpZtSp5jQKb9zeA1SUw16ms9WqcvBlhcDTG4KsYoxO/ohXhBFWng5jrVCwuQbHnN0B2vaDiRJCJqdzvvtRZfUyQ3SA4dSuCbtjC0JsY5npBYRLg9PfaPEYK14f15NA4fRpLD6jkHxKY9ga4PWKcvRyPk9toGF7sBWmR45S/pN0Y5a6BaLLdroEoGTUqy6oNc99NGk85dCHM8oMCqzuIvQ2k2XPzLAWNX9UiD9i90D0EE8Yo8GQc/A/g2QSMfIHaPsg9DMUe4/dmbrnz8CdxKwtDTtdexQAAAABJRU5ErkJggg==\",\"name\": \"谷歌学术\",\"url\": \"https://scholar.google.com/scholar?hl=zh-CN&q=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABpElEQVR4nKWTvUtbURjGfzcf5prqEBFMBpWCHUIVISKRoIgQ3QQRRNBM1UHqX+AiLg4uQpeCiKigIkIkf4DgYAmVQBDEL2iHVIsfaGpi1Nxrck+HaGLMzSB5xuec9znP+5z3lYQQghJgKKW4qMDW9gPNbaf4AwkA5hbiTE1HSWuFd016AhubCZ6eBEurdzgcJr59vwXA45bp8VqLO4j+yzxhtWboKpuB8/NU9vyF13UQ3lPwjVzibpWZnLAhWySGByupqzWxG1JoaizjU4OZ4G4Sj1vOKYhnzMxGhdMVEU5XRPz6rQo9dHSfCacrIlbW41ku68lhz5iRLRLV1UYOjlT6hy4Y8F1w9jdFUhFc36QBODxSC1sYGqzEZjPwsd5MLKbxZeyKu0Qmk9HxK9YW7XjcMqGwgrcrF6T0dpCub9L4Ri75c5p6TdP0uYzl+Rpki1T8F2JxTbcYYP9AZfRrzpWugD+Q0C1+QXhPwR+4Ly5gNufb04Om5a9O3iT29X5gJ/jIj2CSuloTne3lGI3wM6RwfKLS2mJhoL8iT6AgxPei5G38Dx7mvwaRBxETAAAAAElFTkSuQmCC\",\"name\": \"百度学术\",\"url\": \"http://xueshu.baidu.com/s?wd=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB3klEQVQ4jaXSMUhqURzH8YuBrSbiIIKIS4vo4ORQgyJCBg5Fuuqgsyh3tKFwUsjFycEIwq0lBMc7RLQFIl4RnLxXzqbe4Yp0v28I6vle+F70h99y4Hw45///S9SO+Ukkasf8XovFgkKhgCzLrFYrdtZXgBCCw8NDbDYbnU7n+4Cu67hcLlKpFEKI7wOPj4/Y7Xaen595eXmhUqmg6/r/AUIIQqEQBwcH5PN5HA4HTqcTVVW37mma9t6fP4GrqyskSfqIx+Oh1+sBsNlseHp6olwuE4lEuLy8/BsYj8fc3NwQCATw+/0Mh0NM0+Tu7o5Go0GhUKBerxMOh4nFYl/3wDAMms0mPp+P+/t7ptMpXq+XYrGIaZqs12vOzs5QFGUbGAwG9Pt9FEUhm80iSRJHR0dMJhNOTk6oVCoAtNttzs/P2Ww2n4CmabjdbhwOB7FYDL/fjyzLCCGwLItSqUQwGKRarbK3t0c6nWa5XH4Cs9mM09NTcrkco9GIWq3G7e0tlmUBMJ1OiUajxONxWq0Wqqry9va2/YXFYvExynQ6zfX1NZlMhvF4/HFuGMbuPdA0jWQySbVaRdd19vf3ubi4YL1e/3uRXl9fyefzJBIJ5vM5AN1ul4eHh/fn7gR+kF/ZQQ/WnEhepgAAAABJRU5ErkJggg==\",\"name\": \"知网\",\"url\": \"http://epub.cnki.net/kns/brief/default_result.aspx?txt_1_value1=%s&dbPrefix=SCDB&db_opt=CJFQ%2CCJFN%2CCDFD%2CCMFD%2CCPFD%2CIPFD%2CCCND%2CCCJD%2CHBRD&singleDB=SCDB&action=scdbsearch\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABJ0lEQVQ4jdWSvY4BURhAPwoS8TuTqESC3lN4DZGYVqGTaPQa4g1UYjqxdN5EoURI/CQ0M9/ZYnYya9fsRrHFFqe5Jzm5936ftEXatog9EZm+ii1iy1xkQbUKlgXNpodlQb0O8TjUao/O940GJJPIRGRKr4fCd0wTXa2eO4BK5SPQ6XiHqh6Ans+oYaCz2aPz/e0GpdJfBk4nL7BcPn+C60K5/MsNTBMdj9HDAd1uA3Y7dLOBYvGHwPWKFgqoSCiI/BC4XNB8HrUsdDRCB4OA4RDt98EwwgOcz2guFzpG/sEYXwp0uziuq59x73d1DEOdxUK/Osd11XUcDfag1UKPx2DO+z2s194nhuwB/h7MRd6IxSCbhXTaI5OBVAoiEUgkHp1PKgXRKO8NfBp7UCxd2QAAAABJRU5ErkJggg==\",\"name\": \"万方\",\"url\": \"http://s.g.wanfangdata.com.cn/Paper.aspx?q=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACJ0lEQVQ4jZWT3UtTYRzHT+w4pzddeRFdBAbd1Z8giXtJz9mKvBDCxMqkrK57u6kEyx13zjHWIl8TEbMptaLpZMeMCgdBS8dSRC8WWAS9UJRS1j5d7AWnjuqB78UPHj58n+f7+wpFLp0il45Z1hBs7nVS0krPdoXM/YyEIpdOgaRSWt/JGZ9BvWeUOiXIUXWMxvZxGrQQTd4wTd4wrkv3sDh1LOsBYpVKaX0XPaEYmfPx6wqHlSAHLt/nlDdMZO4tyWSSHXUdmKrUXECxS0eUVIS9V3kYWQTAiCYQKlpT1itaESs9BKYWqHU/QrApuYDsYFMYnJwF4PH0G0RJxeLUKJQ1BKubbYdusvNIF2ZZzQOwKww9mcsCTJKKKKmU1PgoPzvElkoPBZK68RM3AxjRRMp++TWO6yFGns3nT2EzwIcvyzyILBB+mWD1128GJl7nvP2vgOjie6zn/Ow77+d5fInhp/P/BzCiCQSrG6GsBfsFP/1GHMHRhsX5j4BMCoWyxtaD19l1rBuzrGGWVYr3t+cH3Jmc2xijU8NU5UFwKFwZmGLPyb7sMmUBZllDKGvhbtrBxKv0ItmVlMpaqG4O8O7TN7bX3kKU1gDMskZJjY/G9nG+r/wEYPnHKg1aCMfFYaqbA6gjLwCYX/pMYdpVFmCq9LD7xG36jTg9oRgdwWm6x2L0heN0js7QOx5jcHKW3lCM0zcMxPVdyKmzdY3SFc6ptKMtJ4U/fkBXz/LD6BYAAAAASUVORK5CYII=\",\"name\": \"EBSCO\",\"url\": \"http://web.b.ebscohost.com/ehost/results?sid=8e76c941-084d-4b93-b05a-d5f182196017%40sessionmgr102&vid=1&hid=128&bquery=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABr0lEQVQ4jZ2TPYobQRCFvyNUMpGTjgQbGAqBEZs1i5AD4VWzBoNgF1cihB0NONyk1/mgEwxzgmFuMHMD6Sa7RxgHQ8uzI+HAFRXUT79+7xVMQjPUO/zxFyfv8ONcM3Tafw4nuHZPlxZM62lBu6dzgrsYNsWKNQcA/YAW9xyKew5xSSy/UhWfh1qx5mCKvVsS74ivz7wB2CcsrogAAiIgmqGmWP+bHuD1mbd4N/RgitVbGic4zdBwQxAQm2NxSSwfqI4/OYUZwRSrv9FohtZbGlOMckPVv9ALSP1IAxA+EsYQNUPTYPs08NS/0JcbKvIFeZgRNEM1Q53gwg1hSqIpZoqVG6roiWFGyBfk9JG+j/Te4cOMkN+SX5PLO3x+OzzmHT7NnRFETyw3VKZYviC/QDAfmE9IzwgSB+P/HXecxiic4GyOAdSPNAJy5mCsQvtEFz1RM/S451RvaeKSmIZtjnmHF5CzClMftN/pTDHN0OQDgLj6u+idD5JMyYkCUj5QFevBhcUXDnE1oBKQ5MQLop3g2h1dgnlNBZtj7e7KLYwjHVP7gy5dY8r/eY3/G38A1vO4VlociLQAAAAASUVORK5CYII=\",\"name\": \"WOS\",\"url\": \"http://apps.webofknowledge.com/UA_GeneralSearch.do?fieldCount=3&action=search&product=UA&search_mode=GeneralSearch&max_field_count=25&max_field_notice=Notice%3A+You+cannot+add+another+field.&input_invalid_notice=Search+Error%3A+Please+enter+a+search+term.&input_invalid_notice_limits=+%3Cbr%2F%3ENote%3A+Fields+displayed+in+scrolling+boxes+must+be+combined+with+at+least+one+other+search+field.&sa_img_alt=Select+terms+from+the+index&value(input1)=%s&value%28select1%29=TI&value%28hidInput1%29=initVoid&value%28hidShowIcon1%29=0&value%28bool_1_2%29=AND&value%28input2%29=&value%28select2%29=AU&value%28hidInput2%29=initAuthor&value%28hidShowIcon2%29=1&value%28bool_2_3%29=AND&value%28input3%29=&value%28select3%29=SO&value%28hidInput3%29=initSource&value%28hidShowIcon3%29=1&limitStatus=collapsed&expand_alt=Expand+these+settings&expand_title=Expand+these+settings&collapse_alt=Collapse+these+settings&collapse_title=Collapse+these+settings&SinceLastVisit_UTC=&SinceLastVisit_DATE=×panStatus=display%3A+block&timeSpanCollapsedListStatus=display%3A+none&period=Range+Selection&range=ALL&ssStatus=display%3Anone&ss_lemmatization=On&ss_query_language=&rsStatus=display%3Anone&rs_rec_per_page=10&rs_sort_by=PY.D%3BLD.D%3BVL.D%3BSO.A%3BPG.A%3BAU.A&rs_refinePanel=visibility%3Ashow\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADl0lEQVQ4jS2RS0zbdQCA/3cvJh71ollMICN0FhpwbBlZx+Zg0NdC3/23pbQ8B91YGQOtCAOZJQrIaillLVDgJ6+BPMTJU91Bl7mwOBQQjEuGzJMHTbx8HvD+5Uu+fFLGSy/XlipVQlaohC1NKeT0TOFSZgm3MlvYUtOF+ViKMB9LEbbUdOFWZgk5TXnEKVRCTkkTkkeRMb/cEGS+sZb1T5r54sZVRpwuhq1ONsUU+6tr7C2v8jg5TtLh5uv2Bta7mllqaWDRX49kS1OKe9eqCBvP0u+8RNynI+rIp/nEcdqyT/HX4Qv+/fsfomYnd4xq4j4NAyWFDFboSJjsSLbjSjEbqKXPdpGBEi19lgJWoteZD1XRVZTD1uoyz59uM1hup18uoM9eSMSSz0CJjmGHG0lWqETCZKfPns9Mq5fuwrOETRfpNeQRNqp5srjEwdYO4zfKGasz06vPY/ZWGZ3nThHTWpBsqQqx8tF7DFYYmGnx0u8o5MPT2UwFS2jPUbI5t8Qf27vEnBbW4wG++tSPCNiZft9DTP+/YLUzyFCFHlHvYK6jgpD6FBFrAWHTeX76coXDnT169VrmbvuYD1VyS6Uk5iwiZrAiyYpMMSK7GHAXMtHkouN0FiN+MzOtpfTocvnt4fc839ohJpu569EwVFlM3GsgYslnrNSH5M7MEuELOlpU6QyU6Ih7DWwM3iTpNxPKO8mzzR85+GWXXq2GHl0uC53VDFYW06vPY+HdAJIt9S2xGAww21bK/fA1OvNOU/vKa/Ro1ISNeWx/84DD3T367UaGqi8T9+rp1qi5/urrDFqdSI40pZj2VzHR6GC2vYzlSB3JKya+TTYx0+Zh/4eHHGztcNdtZaJJRtTZWI3VE3UUEdWYkFxKlejXGmlVKYi5tEw0ygx4tIzV2bhzWc32xgN+f/yEhM9BxPIOwzUmQuocItZ8Rj1eJGuqQiwG61kIlSMCNrouFXA7921C5zL5rDifP/ee8WhqluYTGYiAlc8bZKKOIkZqTExUVx1tvN92kz7bBbo1ZxitvcLPa+tMNtSxtbzMi1/3GaupYbLJzr0PSrljOM90sIS4V0//UUKWGHN7SZQbGKoyErUU8V0iydOVNR7dmyPhKmPEb2Ej0cjoVTsfX8il48xJxhucDFncSNY33pxfvBJg1F3GbN11kg4Pw3Y3k9V+hK+SIYsT4a1gzFNBUi5lxFXGqLuMqepaplw+/gNcwmcGmhKGRAAAAABJRU5ErkJggg==\",\"name\": \"JSTOR\",\"url\": \"http://www.jstor.org/action/doAdvancedSearch?q0=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAuElEQVQ4jbWRsQ2EMAxFMwjFzULHJvR0GeAaKL2GV4jEANmBiorqOipf5ejH+Dg46b5kRYLv5x8niKNl3SQSC6fs/a4UvOamG0pxyrKs231A24+H8xKg7cdi1ukKjcTngEhcjBobT72SC0ADmjA6pyxNN/gApHPKEoklElcAHYJLDRpdjXaJNrL9FjCaNnrTTwEK0RfAl7gMsCBPH3eAzfYaWN5eDgnuqgLs8ySv5+Nr7fP0J8AvegOhkGr6AYHSEgAAAABJRU5ErkJggg==\",\"name\": \"Springer\",\"url\": \"http://rd.springer.com/search?query=%s\"}],\"sociality\": [{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABR0lEQVQ4jWNgGEyAH5e4bXhCgX1ibqOVb2gCklpU9ealvRuRFMCBau3cCwxTzvxnmHbhP8PEk//1yyfvl6xb9sDGLywJRaFh/+ZTDBNP/rfOrZ8PM11VW9uAYcnj/wxr3iHwwvv/eZfc/mxkZeeEYoBvdnkdw5p3/xnm3PjP37TunXVu/XyH3LopKJqhODCrtIKBgYEHxQCDliVH4YpWvvrPMOfGf4aZVzA0M6x595+Xl1cEI6RcfIPDeFc8/oxNAzLWWHjuNq5Y4PFvmT6fkCH++dWNuAxgcPAJCteYc+Y2PttFRUUlcBrAwMDA7x4UEWUzbcchbJotbW3tcWq0zq2fz1+38h1D597/DPNvo2h2nrBmG1QzMy4DmNXU1DR8I2IT/FtnLYThkPKWTs+g0HA1NTUNfJqRAY+kpKQ8DEP9y06MxoEDAKUW4Kpi1NnUAAAAAElFTkSuQmCC\",\"name\": \"Twitter\",\"url\": \"https://twitter.com/search/%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACOElEQVQ4jZXST0jTYRjA8UfQNd2w3DqERIQQBmFQNPFgHVwI2SHokKTQpaB/RJvZ/JPLhWWkCcq2lCIhFILyEHaoYEr9LE1/bXMzqYOYTmeUOT2olWjfDjYV+qcvfC4vL194eR6R7Zqjkqf3SK5ubfL0HslJuCeSr1ekciNSmoAUa1bPvh6pMCJyRNcmJVqqntehjvhXLa02EynSIpKr80iJlmrFSceHLtoHlP/qGfGxs3ZvNKD3yGUDYtWw5XoaJqeZzPoD7Gs4+JsMdzYmZxYxxQakUIfYjdFAEnI+lpa+VgCmv88QmZ1k6uvUkonZSaIn3WVGLLGI3bAiYInjYfARAObbh0i+ksLmyh1Lkh1bud/bAoDJmYVY4v4e2HQ1FTkhyNkVjgt1L+v/FYil9d1TANydd6hsu0mN4qZGcVGjuHA8u4Z3tBeADHf2H75QoKX0iYPP0+MADEaGCX7sp//TewJjb/k2PwdAz4iP1KrdSIF2ZcCAFCUhZwTr40sAHG46hpyLQQr1iC0R/1gfEzMREsqSEeu6xffLASNSEI+cFrZV72F+YZ5GtRk5JchJIeXGLhZ+LNDse7B4Z4lFLiZGx7i4SLe67qKGvPSO9S2NSw15UYd7GIqEABif/oI6rKKO+jG5zIhNsxxoeN2ILxzgzaif9oEOXgx24gsH8IWDdIe8tA8ovBrqxhcO4gsHSHft/xXI1ytSbkQuxCNWzerZEhGHEZEcXZNUGBF7ElK2BuUGxLZh7icJ8DyZ0CDAawAAAABJRU5ErkJggg==\",\"name\": \"豆瓣\",\"url\": \"http://www.douban.com/search?source=suggest&q=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABpElEQVR4nKWTvUtbURjGfzcf5prqEBFMBpWCHUIVISKRoIgQ3QQRRNBM1UHqX+AiLg4uQpeCiKigIkIkf4DgYAmVQBDEL2iHVIsfaGpi1Nxrck+HaGLMzSB5xuec9znP+5z3lYQQghJgKKW4qMDW9gPNbaf4AwkA5hbiTE1HSWuFd016AhubCZ6eBEurdzgcJr59vwXA45bp8VqLO4j+yzxhtWboKpuB8/NU9vyF13UQ3lPwjVzibpWZnLAhWySGByupqzWxG1JoaizjU4OZ4G4Sj1vOKYhnzMxGhdMVEU5XRPz6rQo9dHSfCacrIlbW41ku68lhz5iRLRLV1UYOjlT6hy4Y8F1w9jdFUhFc36QBODxSC1sYGqzEZjPwsd5MLKbxZeyKu0Qmk9HxK9YW7XjcMqGwgrcrF6T0dpCub9L4Ri75c5p6TdP0uYzl+Rpki1T8F2JxTbcYYP9AZfRrzpWugD+Q0C1+QXhPwR+4Ly5gNufb04Om5a9O3iT29X5gJ/jIj2CSuloTne3lGI3wM6RwfKLS2mJhoL8iT6AgxPei5G38Dx7mvwaRBxETAAAAAElFTkSuQmCC\",\"name\": \"百度贴吧\",\"url\": \"http://tieba.baidu.com/f?kw=%s&ie=utf-8\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADd0lEQVQ4jXXMaUyTBxzH8SfbK98sMjXAoEAB0YHLRuCNjnMLMxhissQd2RYPZgzOuBcsWbIsmbAwNhG6FaaAlhadghzLmFAw8MxyFCiUlkMOW+5SEChFwvGUcn33QvTNsn/yyf/36isIgrBXfvJcdnyGRoz/SSPGpReJMbui0orEY2nP/4t9NK1IPJZeLEak5lQdCIs4I8g/PK/80uTmvHmDZJObs13rfGKQ+NQgkWx0cdYo8VG7xKk2ic87XbvW+cK8zQcavUuITtc0nu50cbx2mgStnfdqpkg3LWByuLCvbjK1uknHnIvvOx3E1UxxvHaaEw+nSWqY50StHeHoDyrxVMsysQ8mift7Au3kCu6tHUT7Cjk9Cyh6F9DZV1nf2ub+8BJRVRO8X20joW6G+KoxhMjvCsSkR4u8XT6MZsjJ9g5cbp4mrNRKyD0LIfcshJVa+UY/w84OKHochJePEFNt490KC8Jb314Xo7WzJFaNIG1uk9k5i0zdT2ylFUX3PDnmOaIrrMjUA/xqnmNe2iC20kp4+QgRJQMIb6bmikdKLKT+M8qCtEFksZngQiPi+DNeXN2oE3l+J1F3e3CsbZCstRBw00SYqgsh8OscMfCmiR8bhxlxruGj0BFeoGduxfUysCi5eadAj1zZhG1J4nLtAAdyGgnKa0Hwu5QtyvI7uVD9mOX1TUJvNBOtbmdJcr8MVPTP4HFVJPJWK07JzccV3ezPfoSfsgnhja+yxACVmfBb7fTNLXPyvpmmcSdKwwQp2gFS6y3I81p4JaOBa23jTCxJBF1vwTtXj6+yCcEzJUs8WNyPV24rhwsNZOpHMU4vslfRgpCpQ/hZx55rTVyse8Lm9g4XH1p4TdGMb34H3soWhP0pWWLwXSueN4zICoz0zM5xWjvIEY2ZjDYbVw02dJPPWHZvcaXVhkeeAZ8CIzJVN96/tz8PHCwbZ19hL59p++maGcVX1c25+gn6HBK9DonbgwskVll5Pb8bWVEf/uo+Am4P4pNvRNh36Tfd4b+e4qWx8EtHF2VDJrzUFvzvPMFbPYi3ehBP9SDemiEC/7AQtCu4dBQ/VR+Cx5krdaH1a8jL7ZQMNVDwuBW/smkOVU4RsuvQf9gIrXHip+pBeNU3KNEz/c+n8pIxEh70EVPVT0DJOIGlY/8rqGwS/6Je9iRduPMvGb/OaZ8pffkAAAAASUVORK5CYII=\",\"name\": \"腾讯微博\",\"url\": \"http://search.t.qq.com/index.php?k=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACpElEQVQ4jb2SXUiTcRTGH9CZNmeyvXO+2163tSWaFWmsMmtpSpC1EBNDJaiky0AEL6S0D4pKHVFpXmTaB5FdtIuEqBslBCMqKyNDUFKpLQ2rOb9y/s/pIlYUeBFBz+U55wfnBw/wHxO7zowNa4zIAKD6a3pPOkpG6zA+WoeJ50fwJi8VOxc91gLKzpjYwjUq1cbwLA7QbluJHVuSkespxsWpywi5HNj+JxtToZWOv7As980kp3G/1T4pAXJ42VCCpp5q9KZbkHmhFC091ej7JQgk3JLND4LJK3nckcJ+Rwr3W+yTOUuW5rvV6pIqrXRib6L6QI0bp7uq8NRlx7aRs/gc5uO9RqU76EjlUZOF3+llGjGYaECSZ/t0CV8+KTaeSU7jLr190GWM3N68H9d2rEaB34PZH6/pE9umbCt42GBmX3YezRytJXH9JoVaWjlQWcUfMjfzmKzwsySrzwDYAGCtAmdDEZqRGR2d609azr6UVRy40kJibo7eDg/Tw+5uGvT5SAhB8z4/TVRW0ZCshO4ZlccZkdFbfro36PVtAesKnrrrZSEEnfF4CAABIJ1OR16vl4QQtDA/Tx93FfC02cbdim1IA0gAgDvx0qPpfDcLIehJby9pNBoqKioit9tNKpWKnE4nCSFICEHjhyvIn2DkfqtjMqyCGrXG8y07j5mYOzo7aavLRYFAgLKysggAHSwvJyEEhfx+8m1y8YzFwU16QzuAiHBpzA+khFd88hQvBINcW1/P63NyOE6WqXDfPhqbnubQ4BB/LS7loMnC90yWHgkw/tYeCZDr1eqW97sLJ7ntBr++1MgDV1uZO+4zHzvBX9Od/FJv8FfrpHMA4hetsAVILYuIOOSREi+3GpX2xrhlt2tUMed3R0WVGYGkRcF/yXdyajYEKzT4iQAAAABJRU5ErkJggg==\",\"name\": \"新浪微博\",\"url\": \"http://s.weibo.com/weibo/%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAl0lEQVQ4jWNgoAbQtE48bOXX9J8UrGmdeBhugEvs7P8eSYtJwi6xs//DDcCnMCx31f9j5x79//X7z//3H7//v3H3NVyOKAP2n7j3Hx2QZMDXbz///////39+3RK4/0kyAAZcYmdhyOE1ABd4/PwjZQYsWXecOANg/oUBGN8hYhJ5YYBNbjgZYOJRdZhUA8w9a48QmVfxAwATIfnUl6gLIAAAAABJRU5ErkJggg==\",\"name\": \"Facebook\",\"url\": \"https://www.facebook.com/search/results.php?q=%s\"},{\"favicon\": \"data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR4nG2TT0iUURTFf/d93zeiFkJkFLXJkhYFbYIQIhdZ6EyG0DCWRLZLWrcvgoK2bdwFLUSKIKMCW4hkZgsRMaRFmiMVhSgurNCcee+0cPwz4uU9eFzOue/ce7jGtsjfvrVfszO/kEBCIYCEJQl1z/ttO74skc9lJAQl0kYBKOUCxbhi+diLt1XrHLf+mMmltb36ThEX/lVOX2zcwDqAmWyzkJACWtNQdtFmbZWU5bPpUYB4uuvaPubnQaKYVFDb/aTsx5+dWWIgQpv9Svi/S6cAnJubm0PCR6kN8sjNTj49uAvA7GqBZe8RYu2UFArybecf2de2JmHGnsfPABjoaIMgnBkEEeGpdsahOMIFqO3pY+ZKhiqMGBFT6hlg/P4dVPSknHG292VZKxPtrZx8+gqAw72v+dKeoQZwqGQbsLvuCGZGtMP0VxSYzKWRxGg2zbL3eAmHwvqsOXr1esl3MZJrZSibBuDzw3ugQApjMpchMVFdstCmMo0yM1aCONjTt6P3H7It1JhjlwkwTJ5E8CeERlf/5p2hQALkOy7h/61sEBcnxnl/uYUEqEA4g8REghE54/Tg6FAMsFIsLFdEcWU18O1Glu+rRQjgDFIG1QYpwAUwDEP88DoOW3ZhqvmMDAgIL1jwAScRAQkQmzAZzsRvXxxoGBxrgi27UN8/bIsFP+YkEsSByEghEtMaSGAm5nw4sU4uU7A1Pp5r6N7r6AJYCh4TLKwWmi4Mjw9sx/4HkrAQwN8GM6wAAAAASUVORK5CYII=\",\"name\": \"Google+\",\"url\": \"https://plus.google.com/s/%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAF9ElEQVR4nL2XS2xdZxHHfzPn3CfXjxvHiWMntZvEaZ2mjWs1VIqqREjUooIFD4UdEiwrEAvEplIKK1iCQEKAoBDRVS3EIiJQkvRFUiTciCRYSWOH0NRNr4nt2r5++9xzvmFxjq+vH0mchjJXcxfffOeb/zw1I98dOkwNtQPHgF6gE2gF0jwYBUAJGALOAH3A8LLQr7n4LPBDoAfQB1RaS2mgI+HPEht4PAFTVdQLnACeWq3cMByGAwzBR0klEocRAXY/YBT4dKKrF2IPtAM/IHZ3jWqHT4566aSJg+RkGxm2oKRYZJyAMpN2lUm7whITCALIZoG0JjoHfYxjCD21Nnuk2C7PsEs+R1EeI0Xdho9HssSs3eRDe41b9ipLTCKbj14PxjHfsF5s+SsjQxOd+jV26XP45GtCsJ4UnwbZR73spdkOcdX9nLINbRaEAr1KnO2AkaaRx73v8LB+GY8siEMERNZbLyLxucQ50CyH6NYXaJSuOwLegDqVJPaCslu/Sos8gxErHiu9z7mTLzP4j/OYrTwqIpTeG+Tcyd9xY6AfzDAiGqST/fo8WZrYZHK2KkbaLKKRLh7SL1Qlzjn+ef5VLr71R945+wfmp8tVT0RhyKW/nuLiW6foP/175menERGMiCbppk2excxiDHfntBqGAdv0MBmKVeQiSnFbK/lCPVtbO0hlslWbVJXmto5E1k4qncESoaC06FF8Cjgi7B4/HzM8ydDII2u8Yzx+uJedex6jUGwincuzokXoPvJ52h/tpq7YTCqTAwxfwVfHDmmnTZ5gNLrCopshshBBk1JdTb5heJYlLY3r4uan0mx7aE8cY9tAtnMPglGXNhqyQj4FvoInBdrdC8y5Cf4TXOfawjn+tfB3AptfVyE+Bk4iHBU2qnVzG2e0AVnPsaMg1GcUT1bOAQpekYK3hZZ0J/vzn+HGYj9vTP2akeA6WgNCDQhtnnkrbajoTsrzPnQ0KsWsoAKiiqjW3DEQQxRSmqErd5QvNb1IW7prVW4oBs4qjEcXk95+b/IV2uqEvB+DcVHE5UsXGbx2tRoqEWFqcpK/vX2OiY/GMXHsyOyjt/gtCrq1WiUa14AwEp1n0l1D8O5pfTEr1GUEI66IkZESv/3VL3j5xEuUy1NJgxLefP0sv/zZT3nzjddABGcRHdlu9ueP4iz2gpoZZrBgo1yrvMSSfXTXVqpAXdqq2WJm1Nc3cPDJHrr2HyCbzS4LeHj3Hp44+CTt7R3VClLx2Jt7Gl8ymBny7YGnbDlmAuzyn+NA6nmyspWNupmKY+8WKKT8qlRECMMQEUF1NfgwDPH9lbFDUMYqN/lN6ZvMRGPLHojjYQbvV05xOfgRoc0hyB3rd1VYzPA8b51yYJXyZXIWxSEw8NfWt+EQUviSo2LzzNowGdlCRhpQ0ph5VCIjmUvum0SE6XCUxWgWLGlEqy7g06w93A77uV7pYyIaICNF8tpCXloAoTy3jyPZr9zTMxuRmXFj/h0Ct4CIrveAoLwXnGTa3SSwMiIeS65MOfp34iHj9lQTO3MddH7qaZxtrnQhTsAPFq5weeZ0kpNJH6hlZwHj4WUCm4lL0mJYgofgofjMhBP8aezH3Fp8F5W7l22tYePBMH8e+wkTwYex9wzUnLGaAVNwsF4Ws5hya+FdXim9yMD0WSKroOKtSdg4gVU8VDzGg2H6Rr7P9bl+xLT6lm9mAR9j9heUkcUhXil9j0cKh+kqHGFX7gB1fhO+pIgsZDacoByO0pKJh66JoJQML9WwB76ZlYhn9vsmQVmM5rhU/gsD069T8Io0pLaT1hyhCyiHt5mPpmnLPsqhxi+yPb2byaCEriRvyTezoY8LoBZIZCFlN8pU5TYk7X15VL8xd4EP5q/gawpMaj0w5DtzZ4g3lv/RNrSyH1j1XwhskcAtJicG4IAzitFnZheWO+L/kS9g9PlmNmzYcYwTrNmOPkEqIRwHhjVpRGcM+0biCfcJWu3MrN+wrwNnzCzZjuNgnTazQdas54Y90HouyLr1XESGl/PwvyqcdNFgnYiiAAAAAElFTkSuQmCC\",\"name\": \"微信搜索\",\"url\": \"http://weixin.sogou.com/weixin?ie=utf8&type=2&query=%s\"}],\"shopping\": [{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAqUlEQVQ4jaWTsRGAIAxFs4Gj0DgGtTtQOIY7sAO1EzCOOxgLiCQRUfTf/TtE/zPBCAAAGAPiMvU5BgQRJjkj1zfe7JAguEw5tKfQPBYAX5NWn/YzpADmsQRWLyHcdP8C0IGa+H4TUGtFgy8AZ2Tp3RVwgH7b6wpaLfw6g8cWuGpnwStErHxG/aA2Vw4XQAxpLBtj2xxl+h82OwgQXd/5DGudpX0VOtMVPgBRELV9pv7F+wAAAABJRU5ErkJggg==\",\"name\": \"淘宝\",\"url\": \"http://s.taobao.com/search?q=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACoElEQVQ4jZWTW0iTYRjHdxcUfrPZtq+cm25LxaQSQ4tO2IkKO1yEQVEERWJFYUQJQQUZUWQG0QGKIgoCS4pVBlKapH6fztNsW+zQZnOW5GGyxFkQvy4+LbUguvjxvu//efjxXDyvqmCaUFymFitKBf1/U6YWK1TlgljVMzsNt96qoLPi1lqUc/w+zng21tsjpqEqFfQVbr0VWWv+CykKsxSkhGQkjUl5a824ddYJglkpyDoLrRm5dK7Kx25dSEdOHq5NBQqbt9OxZA3Nxnm/hJMEUkIyTeJcfPuPEKmuwb11B+ErN4j5Aww73jHc6eRrcyufb96hMy8fSWPCNUmgMdE0O5Wuk2f51tODd08R/bYqYv4AwZLT+IqK6Xv0hNFQNwPPXvJu7RacmpQ/BcGSM8QCQTy7C+mrtBF5VUd71jIapou0ZuYSLr/G974+ui+U41Qb/y0YelOPY+k6GuMSaZwh4li5gahsZ8D2Ak/aov8QqA1IGhOtmbn0V9oYfFWLPydvikCcS/DE6b8LBANSvJH27BUMVFUz+LIa34KlYwKdhUbBgKyzEDp/mdGPITw799FfaWOo9i0dS9bQMF1PY9wcvHsPEgt00Xv7Hu7EdFSlgrbifVIGbVnL8OwuJCrbGXY4cW7cRv/T50Rlu7IDi1fjP3SMaEsbI14/nl37ccablAm6Vm/iy8PHjHj9jPj8dJ06R0t6NpHqGn6MfiPyuo6hunpGvH6iTS0Ejp3Ebp6PS2tRBMHl6wmXXeXT9dv4DhylJS0bSZPMh8PH6b37gM+37tF75z6hsxdx5RfQbMxA1pgmbKLWjKQ2IAkGpPgk5IRkZK0ZKT4JKS5RyQWD0jPT+Kvu1llRXRLEqrCYiktr+c3Yr5uUTam5dVbC+lR+AkXUXUZHV2HdAAAAAElFTkSuQmCC\",\"name\": \"京东\",\"url\": \"http://search.jd.com/Search?keyword=%s&enc=utf-8\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABMUlEQVQ4ja1TQU7CQBR9xNWwpUTJNF0A4VCEhVvjBRo5AAR2pjHxAO0C40JMqXgDTfQE0mqiB8CFganxuTBtaKdFYvzJ28x/7/2Z/+cDJWFU0fBtzHwbgVFFo4xXGE0DndBBxAnICRg6iJoGOltFgy6GaxcqEZVh7UINuhhqBspD/Js4gfIQawa7ihNkxK062ptJy7I0Qf6sVUcbACAFzMUpwkLy9ICc7hcahA4iKWDi5gS3+Worr0I+nZH8Iklycc6VW9FudW3D1w0u9sj7Q2px1/vJbXB9GzNIATN08Jwm3q5IkpZlZUCSfL1MxZGDFylg6k38/EiLZsQkGb/rTdTG+HBEqqX+BLUkH4+Lx/gvH2nUw3gXE+UhHvUw3roXf1qmfNQEZNDHPOhjXhOQZbxvFy/H102X8MIAAAAASUVORK5CYII=\",\"name\": \"苏宁\",\"url\": \"http://search.suning.com/%s/\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACHklEQVQ4jY3QT0jTYRzH8a9d0m1M8rbMZklQbjRDOpSnHXSTjpFHvVgH0UODwShJWn8gGXXRi6Q1lIpfWYwCYZkQwWqHdhrYH/UwgxmzGU5sv7Hf3h3CJ3U5+sJzeL58ntfzfR4REbHZbPZgMHhL+8+ampp61Nvbe0lE9ondbj+SSqWW2VWRSIRAIED/wABjY2Osrq7ujhAOhyclFArd3d5cWFzE4XQiIjuWtbaWN3NzZYhMT08/39qUSiU6PB5EBLPFwp3hYYaGhqgxmRARvJ2d5YCmadrWxjAMfD4f7e3t3B8fVyG3242I4GppwTCMvYHtFYvFGBkd5bLPx2G7HRHhRHMzuq5XBpLJJGfb2tTbzRYLFqsVEaHZ4agM5PN5TrW2IiIcrK8nGo2ysbGB1+tFRHA4nZWBRCKhbvb7/Sp00uVSE1T8xA/xuAI6PB4ymQzjExOICFVVVVRXV/N6dnZvYD2X42hTk0JqzGZEhEMNDap3PXjzX0BJNeLxOG63mwN1dTQ2NnJ1cJB0Os2Fri4CgQCGnoO1edhcUcBT9Hn4dA8K6wrK/syhF4plb+b7W4hdhPc9CngGRfg8AjNnIHEF1j4Chb+HjCJsLsPSQ3h3HpK34cvoH6Cvr69fBX8kYO4cPDGBZoaXx+DVcXhRD5oVZk7DtwjoWeAX+XxeFxHZHw6HJ3fNCZnHsHQDFq7BygMwvu5IZLPZte7u7p7fLX31eStakCQAAAAASUVORK5CYII=\",\"name\": \"亚马逊\",\"url\": \"http://www.amazon.cn/s/ref=nb_sb_noss?field-keywords=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAQElEQVQ4jWNgYGBg2MzA8J8czADTvIOB4f9+EvEOmCGbydAMwxgGEAtoZwA6RtdA0AujBgxLA4hOyhRlJkqzMwCOOAUjv7eE+gAAAABJRU5ErkJggg==\",\"name\": \"天猫\",\"url\": \"http://list.tmall.com/search_product.htm?q=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA4UlEQVQ4jaWTMQqEMBBF03iAxcLCzspTCJ5B8AYWsnfYYi+gVxFyh1SKIKQTCw/gkiYWwt/KoCZmA/shTSbzBn7+kMUP0T8C42HEQ/8IIGmDdZ5OtcUPsfghiK15yDNI3gIAJG2M7zTAPnWuKxwlaaNqtwBGPHRpoqbu2oRwA1ynHjXX1T2AR7EySvIWmxAa4PN62wE8itWlCTAWpbsHJg155gYYi9II6NLEDXBnZJcmv3PAiAdJG615E+LkkTVI1wwA0GJsBazzpAEkb90Adz9gBezbyIgHUTydAWob/wV8ARTCpDZEwN5jAAAAAElFTkSuQmCC\",\"name\": \"1号店\",\"url\": \"http://search.yhd.com/c0-0/k%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAqUlEQVQ4jaWTsRGAIAxFs4Gj0DgGtTtQOIY7sAO1EzCOOxgLiCQRUfTf/TtE/zPBCAAAGAPiMvU5BgQRJjkj1zfe7JAguEw5tKfQPBYAX5NWn/YzpADmsQRWLyHcdP8C0IGa+H4TUGtFgy8AZ2Tp3RVwgH7b6wpaLfw6g8cWuGpnwStErHxG/aA2Vw4XQAxpLBtj2xxl+h82OwgQXd/5DGudpX0VOtMVPgBRELV9pv7F+wAAAABJRU5ErkJggg==\",\"name\": \"闲鱼\",\"url\": \"https://s.2.taobao.com/list/list.htm?q=%s&search_type=item&_input_charset=utf8\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACQElEQVR4nG2ST0iUURTFf+d9g2V/NKSgRYSriLCZ0jLie+Gi3LWqoKCFEYG0tHBTREgQSLWQCIRoWVCbKKKC/oD0fVGG5Iy2KDCiRQTBUBJh+vluC2dkHDurxzvvnnvuuU/U4H1X17ooy16Y2QAAUgfwEedWyawH6MknyefaGlc9FON4CFiH1C7nHkjaXEjTi5Juy+wm4Amhpej9rWUCRe+v5NO0L8qyu4uMdB3AYHZtFDVKinHunaBY8v7ZUgdmW8e7uppcLre/ShgMAwh2T2fZDzNLK9RQMBsoen8EwI3v3dsm6eDOkZGfYX7+PmZfgIvAyep0SI8Nphe7Sq8E3QDORdFEzUgHkFqBAUEGQAinsxD6CknSXDs7Zm8n4vhQNcQ/1CGfJKtL3hvSnpw0Vs8bDJnU7xbyUnfJ+zMG56sPJuN4s8FVpBOSNtYLSFpj0OkW3Nh34FqUZcOYXV45O9scYFAhTLlyeYXB14rtl0tEwDmgAEwBtL15U0Y6t2V0dBrp2Bw8DC0tf4EblZrbdUYm3fYkmay3V/T+iEGIzDKDe4LBUhzPVbJRPkkEFAL0C6DkvVVquw0OyyyYtB44YHB8R5I8Le7bd4oQLlXzMLOZQpo2OgBXLq+oJNvuzO4ibSokyVGg18GTkvcms5s1YfZGudyGSg4L+NTZ2TTT0PArnySqcbR0dWa/JZ2dC+FRx+vX35YIVFHyfgJoq7u+Y/ABswuFNG2s28T/UfL+gZm1CrYBz2dnZg7vGhtb9uH+Affd7MpRvsLpAAAAAElFTkSuQmCC\",\"name\": \"值得买\",\"url\": \"http://search.smzdm.com/?c=home&s=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIADzAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAbpJREFUeJylk0ssXGEUx39zZ+a2g1QX7DxjMwzKJF2IR0iEWIxlV6KZeGQaEhZWbHRTsVCPJq5IG48IiYiFErZNmngUCYmgqGBFMljWq2Nx6l7XXAvxT76c73z/c/7fOd/DBhDyuqcAH0/Dd9vqVrmiJ794CZ29Bp2TB/NrYgHiEqBLA5frLsIX8rqnFH3nji9QUATdfULn5oOqQkys+K2fIL/Q4P+LKPq0vgaWF6EhIL7TKVZVxVZXwMoS1L439WELed0h3XM64eoKJqYhOcWI2tyAto/we0v4e1BMXm0drGxK8p89aGmCo0NI9cDwuLTwAEYFJWXQ9hnOzyDgh51tI8qTCdo3iIyCdz7Y27UQcDjg+jpsBx2JSTA5C1oPfNUsBHLy5OQf4uYfHOzD5DjM/YCICCh4q9MOfdalSRVWmJsRgZNj8GSYKCOj8QNkZllUcAOnQVDsEBcPZ6ePCMz/lPEY0tIh+jV0tpuWjWssLoVfG7CwLmXePSCXC95kw8AYXF7CyKBJwDhEd5qM5law2+HiLwSD8pRVVZIDflhbDRMI/4mVVeCvgVfR0v9AP4wOWzU2ZIPnfedbccyGGmWXmM8AAAAASUVORK5CYII=\",\"name\": \"当当网\",\"url\": \"http://search.dangdang.com/?key=%s\",\"blank\": \"_blank\"}],\"download\": [{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIACJAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAVBJREFUeJzVkk0rhGEUhq/neT9mGGYwZSXlIz9gsiJWo1gQxaT8BUuUnSws/ARbyyklCzXKwsJCERurIWtlZmpoGu/rHAtiGDSxctdZPJ3T/dzn6sC/UHqd9PQm6a96thGDeBPXiQgHI6ukfmWws8x1oqWF7iSnw0us1PZM7SOzTX6gLd4XiqChIaiCBoIIqBjCRyiU7ymUyOY2yNQnEDoAjLzGM2AsGPv+T3usmZ7O2NzsGlqXYOaQfJeb6JOqoAEEgUEDgRCeAqAC9klxQwirUCw9NELgZ5ndcTTe6RBFiKsSVYhZiPrQ7ILnAP5recAtV2aL/g8Q9yfR1qQl6guOtURc8BzBcwy+A54LvgXfU/wris72C6s3iBN7mPsbyVbu3mAiNfVJhW/3yQ2ycjKPXi5a/TWUoyFSFwvo+RS9jczXXeLoMWdaZkzKjRn8Wc/HVG5h5+kwfgAAAABJRU5ErkJggg==\",\"name\": \"BTSOW\",\"url\": \"https://btso.pw/search/%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAD1klEQVR4nMWXbWhbVRjHf+cmTZq3hU67tcvmaql2L2q3FdTqkEodTESZ+GEKExX3YTrRyhCmMnDgCkP8EHwBnV+UMRyIiGLZLG7TMq22MsegOErrSmnarFub0CbN6z1+KLnNzb1JbmLF59M5T57z/H835zlvQkopqcCklBQbIoRACFFJOoQVgJyooiiWkqqqahmmJEClwtWAFAVQVbVq4UpymQIUG5CdmiR5/gfSl4bIjI+hRiMgJcoqP7aNzTjaduDs2o0tsMEyhAHALDA7HSL26Qck+89BuZIRAueDnXgOvIatYV1ZCB2AWUCir5eF4HFkYrG0cCGHy43v0Ns4O3eVhNBaZsUW//Jz5o+/U7E4gFyMkxr81eBXFEW3jO35APnVmujrJfbZR6bJ7c0tOO59AFtjAIQgG5okNfgLmdERLab2sSfxdR82h8vTEnLJdOLZqUnm9j+DTCZ0A22NAbzdh3G032eaODU0wPz7x3Du7MR78JBpTCGEkFLKwnmJBV8l/t2AbkDN5rvw9wQRPl/pxPEYwu0pGQPLtWBYBXJxjGz/FuLnGkkO1QOgrL6FuhOnUPx1ZRNXakrhNiDDp8Gm4t41iWfPNYRD4nnx4H8iLqXEXjj/cvaC1nZsjmAPeHF07V5xcQ3A4IwN6/q2O+4HuyFMs66emGXBI3ucdG7R5zLujekZXVe4WiwLlLNQxLiLrsxpY9FSGSsANfW6royPGEKqNY/TeCwbJld4tyJnw1p/OjLMGjVDjWJeBz++Zb7m/55R2X9Cv4Wv9RsBlMLLgqh7WGufSa7n6VAzvdd+MhUpZb+PZg2+Oxttei0hTADW7iWNnfcW7uHo/A4S2Pj4yiluJiKWxRcSkq9+S+t8t92q0FDwDwghlmpAVdVlp6uJTzxv8nWiSfPNJqJ0/9xDNDVfVjydhXe/STIb0xfco236KcxpKjmSfNt79wHc9lqd76+5MfadfYP+0B9FxUci47z0/WkGx1I6/2qP4PHtegDdaZgjyj+Qzoz3c2QgaCrUtCpAR8N2NngbEEJwffEml64Pc/nGVSQSW6IFd/gVRGZp+z76VC07W5fnP19LAyjckgFOXv2W4J9fFP3iUiayPlzhl3mhvY3nH3LofsvX0j5ZCKGrBYB9rU9wrON13HZXxQCKPc6zj0wZxHNXdU3XyqV0On6DDy+fpG/iIqqFh1T7mq10b3uOTXXNBvGSl9JSgQBTsRn6Ji4yGL7CaHSCuWQUKcHv9LHRt45t9ZvoWt9Ba93thrGWr+XlBlRjFT9Mcva/Ps3+DciKPU5LwZgmq+J5/g/N4OUGvdHwnQAAAABJRU5ErkJggg==\",\"name\": \"谷歌搜索\",\"url\": \"https://cse.google.com/?q=%s&newwindow=1&cx=006100883259189159113%3Atwgohm0sz8q\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC1ElEQVR4nCXTyY7cRACA4b9c5a3tdi8z6e4JsygzTKJIcwJxyTPwfDwJnDjNBQgicCFESiRamSW9jt2r7barXBz43uETP02srSws04JD7tBUPv0RtHwAGC8tgxC+fyV4mMPNAMZryy9Lwd2TRu01VAeYTva8+e6YsoDbv1LiqMdun+HJkJeXHlHT8CJy+JxazjoOL2rBeC5QsxWkU8siaxjfafqx4OV1F7B0vA6ykdS1ZaYl/ZZhGCkeU83bj5pdblGzZcFwFHJ+McBRmnRnCbFIqSiNBXPAOIJ3D4ZAKk5VzqxUBL2Q/SJHbfca12wJByEEClNpssaQaUGaHohcwdmRywKXNKv48aHg8qsu89UWmgbneNgmLeHnX6fcTyzSkRS1x+0fcz5/qdkeJFFXIQr4+EmzLRLefdiQO22c0wRV19AKY6Ijh0KDdOH+3wkXF22+vW7DwfL7+wWLDBrj8eabFunGMF8tifMYB8ANBYd8QSM0xhquzk+oVw1uU+DFFiE6CNenn0ieJZrLkU9CyJFyUSjLdLzm9NmAr08UERWTnWCyXbOpz+j4lkHHkEQtzp9LTA1uy2KDkNqxqDKzXA18Li5CdjuN9jzu7kp6SUIImHXDsB3QTqB0DOVBMh8f2G+h7AWoOBBcn4ek2YFKeJCDFgIAzwKOZK/hyyMsVxnrrOLm9Qjh7OiXCnW/2PG87YGS1AZkY0iOFPapAqD2NL/9uSQXCa7oEokNw5Fks4tQyqB6wza3759wNLy+iYmkR7XLKfGQLpjG5eqqy9Oqpt2SXJ/3iY3huC/5NN6jAgkngx7T6YIo8FGqIokUs6xmU0CrbXl1EsDAASnAVJSVQgNRO8DphJZ+1wFASuh0PPbZmtNRl7d/PzDNGkoLbvh/z9z4PK5hNsnoJBLxwz/Wrraa+RPYpiA2UFiN348BeBznWEcTBz6HqqRxXOLQ5fTYJ+pI/gNDt17HeSMTvQAAAABJRU5ErkJggg==\",\"name\": \"动漫花园\",\"url\": \"https://dmhy.anoneko.com/topics/list?keyword=%s\"},{\"favicon\": \"data:image/jpeg;base64,AAABAAEAEBAAAAAAIAA2AgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgCAAAAkJFoNgAAAf1JREFUeJx9kj9r8nAQxy8xLQatGmPtIoiigoKCoAZHyeQutEtBHHRpl7yELq6+AP+8AIcWOxURQRzMIDhEyeLilIKDQYUg+eWeIT48VujzWe4Ovtzd9zgKEeEvl/kVFEXZCWMHVVUlSTIMg6bpK6ndpV6vPz4+nmtE7Pf7v/W2qVQqtvI8gWHOyc3NDSGE4zhCyH6/BwDLshDx9vbWFvxYIJ1Oz+fz5+fnXq8ny3KtVnt/f282m5f2mMtFWZblef50Or2+vjqdTtM0X15eFEWx5/zzhIjtdtsuvV7v5cy7uzuHwwEAhULhdDoh4vVNdF0Ph8MulwsAEomEYRiEEAA4Ho9nD8vlUpIk0zTtToIg5PN5n88HAMViURAEjuMAIBgMMgxDCKHG43GpVHp7e3O73Q8PDxzHHQ4H0zTtVVmWpWmapulcLjcYDKbTKTMcDgFgPB5blhWJRDKZjCiKqVTKPvRut1utVqqqdrvdVquVTqepr6+vz89PRVEajcZiseh0OtvtNhAIxONxTdMMw4jFYqFQ6Pv7W9M0QgiFiJqmJZNJn88XjUbv7+89Hk8ikbAsS5ZlVVV5ns9msx8fH6IoVqtVQMT9fu/3+yVJ0nUdf6Lr+mQyeXp6AoDZbIaIgIimaY5Go+12i7+w2WzK5fJ6vUZE6j8vfQki2h/+B8UpLqpv9VygAAAAAElFTkSuQmCC\",\"name\": \"海盗湾\",\"url\": \"https://thepiratebay.org/search/%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACbklEQVR4nK2RPWhTYRSGn+/+5LdJk2pDa6soVkEH8R8Vi9VJXAQHcbQ46mBVFBe1gzjVRVFcXBy0VITSQeiirT+gWAfFtpZq06ZN0jbeNJrcJPfe3M+hWIhdFH3hwFne53DeF/5RInFzo/Ti3RE79/H93xhTt3fO6FpgUOTuH9n3Y2H8FUKhaWFUFZ24AMbljisY2b3lvDllKvL6+gc9UwDJW1vOVexSly50Gjo+CQFg3G21nZKhlaVNtP78nG9Pa8yZiOOm0pRTKYpTE+TeviZ60vvctgptITWIDK9ZF23vjSsA0bTi99ZohII+svNdMSc+icxkqMxncOZnsYxviCaJY5lttbEAhINOtL03DqAAiM4BR0Q2m2qdwO/3YIx04GYNKrksTjaDlfhCzSGHyAYfwiupXav6f2Wh/FrkylMBNIm/ReAJeyjVdWPNJLAys9SeLhPZFED4XEzW0HPBWVUFkFcPaD4JpfIBUCG42UWps9FaU4TPzBFobkGNVECFJxdHcG2zswqQHm1ottNJFt55lmryN5fxbJ1Fb9yPvmISgOTXFrAtXMfeWAVo7O6Ol6anCdhFRntWI20BlovulejqIFgSaQue3RgGwOP1Di/LwOh7TCExhf1mAmmpuEUFNy8Wp6gw9KieSrmIrmvU1K+4tAyQQ9yZ+/yB76bJ0/MlZIElgCzAcN/iGyFNcw739xvLALteDJ1Omko+WZRkv5nY+QZkAWQBeq9JcCyiAR+xVY1LFVYBAI5PxEMef+ilJlUenR3HzSu4hTDWbImVQZ91YmxMHBwYcPgTPdyy7Vj63tFE3+7tZ6/+dui/6ifLWRWj5AzXVgAAAABJRU5ErkJggg==\",\"name\": \"veryCD\",\"url\": \"http://www.verycd.com/search/folders/%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIAAwAgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAfdJREFUeJylkUtoE0Ech79dJWYjSau2qcW0jZDSLoZYRfFRsLYHEcWD9OCh14AgiIg30YOCJzGHetNcLZ681GcPFgMaPTT1AaZK0NAmbvPYWBOy26YJ66EkkF2bi38YGGbm++Y/vwFTBWXJMK+1KvF/YICtZrjHLUFcbykLx3XBIgCYOOUj8jFNUJaM0PQUupJEU37ye+EzyaTC8+hiE9wQBGXJ6HFLLBd0lrI6oekp1NgsWuYX2cQ3Hs0kLDdbOnButzPQ7+HouTOkZx7z+tU75r/nNwUtgmP+LtScykLiJUmlzI9UoSXYENTDKmo1RAFezC9z6+YVvn76gudt1Ehlii1FQj2Di+NDlEpl9o5cwHv+OoIgcP/SaTq0Re7GOxpA7EOkSSbWO9jm2sGefQEq+Tiqmmf05Cj7nX/oP+Dj6cMbzL1/w+S92xw8cqLpe8V6e06vj+6xcWztO1GfXOXaYI4aa5TXJe48eMburk6Gh0f+nYHDvoXKSgE1NgvA2koBgIxSoluWmTg+xuFDQ+TzWaugPpmLRPEHBgAoqwr6amXjwK4+ens3RrVatYYYlCXD43aQymqWTdfZywT8gzgcdirrVUKTYUuIQlCWDNnbTp/Hha5VSCwVSec0wnFdMAdmhhtPEEWBzjYbtNnQV2ukc9qmgLn+AvHN01EAtz5WAAAAAElFTkSuQmCC\",\"name\": \"ED2000\",\"url\": \"http://www.ed2000.com/FileList.asp?PageIndex=1&SearchWord=%s&searchMethod=ED2000\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADQUlEQVQ4jS2SS2hcdRTGDwW789FUNFCRihtB3YoLNy6mKGJFbBeCgtqdKKh1J4SK0NZFFxEVgiSahy1im2Zim0wSG/ImadBkknY6mZjHzGSm87xz79z3vf87PxeTxbf8ft855zsiZ893HR0u+C9Oabw3bzBfDii7EVVXkch7XNmwuZy0+G3boWAr8nbEbDXg5FjRl7Pnu0T+PPCfSWi8NaczV/apuBF1T5GsBQxkHAYzDomcR9VVVN2IDS3kgyWDFyY1jtw48OXorTqvTDe4U/IpO21zw4vQvYjlUsByKUD3I3Q/YrcZcilp8dGSwWvTDR4fqyNPJTRGiz5FJ6LiKhZLPgVLYQYtnLAtK2hRtBW/b7t8n7T4bKXJGzM6JxIaMpj32Lciio7ids6jL+0wlvVoeBFRq0XUaqH7EZN5j6GMw5VNm69WTU7P6Tw3oSFbpmLfUgzsuFxct+hNOyw+9LGCCBW1UK0WdtBeZ/AQ8OVdk7dndU5OaMgDM+RiyubjJYML/1qMHqabQYuaG1FzI6ygPcV4zuNS0uLTlSanZnQ6ExryyZrJS1MaZ+YNerYcKm77iAVLMZb1GM96FCyF7rer7cs4fLho8OqdBo/eriMyUqNzvM7X6xZ5S1E+TN03Q65uu/yadujfcvjPCKm4EQe24psNi+cnNY6M1hC5XuXNZYN0U5G1IzYbIQVbUXEjto2Q7ns2361ZfLtusa6F5OyIjKk4vdJEhmtIbEYnqYc8MBV/VwLemde5sGmRsxRFp/04X6yavL9gcGbBYLoSkDYVSSMkNqsjSS0gZYTEiz5PT2h0JjRentL4fM1kx1RkrYjFasDrszrPTmicmNQYKfqkjJBkI0BSDZ943qVjuIZcryIjNR75q85jY3XevdvkfjMkbSpulXyeHK8jw1U6btYYybukGgES32tyfHAf6c8jV0vIH5U2aLiK3KwRWzBI6iEpQxEv+HTcqCIDBTqGsozsmcix7lVffryH9GSQvj2k/wAZetiGXSsj18qcmtZINgJSekA853B8YBf5OcUTP/zji8TOdcnlJV+615Gf7iM9W8gvO0jvHtK331bvHrHxIsm6R0rziO8aHOte9SV2rut/2AZGwaMpOBUAAAAASUVORK5CYII=\",\"name\": \"人人影视\",\"url\": \"http://www.zimuzu.tv/search/index?keyword=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFn0lEQVR4nM1Xa2xURRT+zu3SFtKXZZeHYqFQwGxVEhQLhFQRjPERwdpdCGWDGCRYa/ylRkNYN/pLNARsiWB8pAuN3ZboH5GXGEFbaqIGlFViMXERIdtS6VI3bLt7jz/mzr1z7+5WSfzhSe7O7J1vzvnmzJkz5xKkBIMaQiE9q6+OA1ganbJOBwdAVAWgxhjtB3NMA4V7vPGOrLlOUfTTuEAAXl+ksAyDjQTeD7CYQkYLFiB2qmEwtKYE3N3RLv/oePrHJbDE13oURCv/ieS4wnyst6vlgRsi4PVFCssRT4FyDMvFZxsCg6whB2aYPUW5vEFyb6UsPuv+gojqWdHDxu+cqkpsbV6B+dUeMUYEZoauM/pjV/Dym5/h8sA1qBuktjrzib7aweWqPZtxb7TWBaJ6NukTZH9+tQfh7WtN42LRgqamEebNciOyaz0qKyYp8+wtkVbvjda67B5QZImvje28xSpffPpePLbCC8q1JQYRdez1ts9x8Mtzpg6n9Ha1ZO+UGXAOvx1v34ziIov0wNAItu08ivOxKxhJjqKitBgvbKpH/aLZKCiwHLpyw7tIXh9zEIUIKyUwCTCCjgZSBsxkQET4+qNmU8Hezj58eOBb5RhKvFC1/621qJ5RCQAYuprE6uZ2pDMZB1b0h9lTFPWeTWsAUIbBRmbBkJnM9pap5bYVtH/yHRgqBgCT+X/bziMmtrJiEhZ6b7Zh1X4ZBhsRCuma4M77FUeZveoZN4GZzSeT0bMw6i73/zZkw294/C7kF2FTE8eQDbdKdaL/++VhEJEZYBNcBVkYa554hq4mcT01huupMfTHrljjDhzAQDCo0VJf23omhPMELHoiVgwwM+qb3kEmnQd8g0JAQNPBARGeMOJDYUiM7kNnrAlEONnxDNq3+7HmkTuNOapHlFa+lxip20ox0KEHNBBVqSmXQWCyEsjb+3rxffSijXnNTDee37AMu19djWnuUjDJeQDIaOV/qRMAG3YEHgBpVVTnax3TiFxsHVJBz/wvZLN/ETY+sSivO5kZOz44ia7DP9idbHpFuT2N9wykqc7XOkYEl8AohuW2KNsts+KqFd68RABg647DON533nFxqYtigzTSVOdv/UkDbhNYAueMRid7gb7njhl4ZctyTJlcYhKU90PnwdPY1d4zrj4GftaIOSbYwcgWyHHCWHnHxnvGN2cuoKEljI+P/Ihrf6VM40SENQ8vwIPL5madQlL0EXOM6nxt6zVC+L84WJXlE/Hp3o22d0vW7M6xdiHMCGh93ngHwGJlMPMriBlfdWxBb2czejubse7RBVByKmRsk3QNM/4cTqLh2fYsg+Y5YHsi6vPGOzQJk+qs/7DdbvfVzYZMFuS4643zB2bCpYERG4GykiIFaxQ3bDyhkK4hFNKZqckYhRkPIFy8PGzm9dvnTjOdZwYWZ4dYUWGB7T5IjKSsRdt90wQYFVEC7m6ZCNXnaM8vAmrkg+meUocPyExy8rl/8Ry7Hce4xCfg7hYEgkEt2uUf1cHHJEJ4iLGns8+m60BrAFM9JQIDibUsTPOUYFuLVUSnM7qCYblT0MHHot6zaQSDmq3GWuxvtTmKAFRNr8Ce1xpQXjrRUpzOINofx6nTMUwsnoD6u6tx6/QKaIq6P+IJPPlSBNeSKVOXzEu9kRwlGSA/QgZSNrQh4Tf8qJnpxr+RS/EEGp7bl13CM5CAvTzPW5ZLejIjFxa6cOi9p1BcNGFc45mMjoc2vY+RZCqLAOt84pSjLLeXuQYZb7TWVQ5RIzqvj4ICDYFVC1EzazLmzXJjdCyDc78O4PyFIUQOnkE6rdvrWqMzDFEDOgn/Dz7NHFvgFG+01lWGwUYitW502nBcegDAJD5Oc6zaTiCX5PtUDwY18XmuB0BaFYAaBgNM/QSOMSgsUjsw7ie6ovNvYr7e8pZ+VIUAAAAASUVORK5CYII=\",\"name\": \"subHD字幕\",\"url\": \"http://subhd.com/search0/%s\",\"blank\": \"_blank\"},{\"favicon\": \"https://mikanani.me/favicon.ico\",\"name\": \"蜜柑计划\",\"url\": \"https://mikanani.me/Home/Search?searchstr=%s\",\"blank\": \"_blank\"}],\"news\": [{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAERElEQVR4nO2WTWhcVRTHf/e++crko/kyX201jQitIOnGhcWqUBWLSGgRVNCVFqouXFQFa0XQXRRcWBpBURRBo9JWcZGWghhqbVOK1I8uLEksmKS2yTRt5iszc+9x8Wbmzbx5mca1OfB4vHvOPf//+bjnPliT/7uoesq7v9k3o6JOn1gBBAFE3HfpG+C6FZqR8krJRhSQK8z+8eSh9SthhOoRWLTZPklaRDxIEWFagIxlZF2KRzov09/4A/suPc3ocqSCZJGOVn31MOoS8Ms8ihsGDug0j982z2DLONgomFaeWfc3o1cG/ou7mxMoiDBt4VYD77Utsrt7HEwWpAEQsC24YQpbW39h7KtOpjbGGFrvgAY0dOu6Va5PYNpqRlqW2Nt7EgoLUGgE4lCufkkEbIT471e5f0a41tzCdE+M4YE4X0bzdQnU0JOLjw2xcG6U8GyUXN29NTwWTvejvu+CmHF1YsFaQloRijeTibf/5LS2j7cd/GR/IAGZGJwnfK3j6o3nQMxN0GsJ5JcUS0ciqGil3jWyOPRcOoLWYfJNzbO6oWGs/dPDzyoAObNRMDlAg55j18+p4PMpHqb4vyVoTco6C4weayIf2YYCxJortxw/060BMOnzKO2F5C/xKsBXmSRA0IBY+ytuyKC2LWzF2LwXRjGiygfvqQSvQvBFX0m4nFFRCNB14uxDZQKu5E+txFoAI7BcAGurwQVIG0gZ9502kCoIaQNWqEmqIFhjpkouysdQ3Zt4QE51SSn6kiwsw+ieGH2dHtc9IxlmkkJIw+UsTLweJ0iOTeR443iejoiXSRB0InGgZKOrdjgeWwESOXjqLqcKHODN3Q5zy6XuriMV5VRAQUCh6Dh38YuaDABQyP9FiP5SBj54IsKdm0K8+tF1TvwTptGBRB56ItARUYhAbxQ2v5UGwIigcMuFQJMDMe1xSRpoU9Xnq5qAXR5Ds7dksqXfVR+dDbO5EXYMaArWS93YpCVn4cOhMMbW9rtSiqWMcHDcnYY5Acd3vqsIqO3p5+VH7rHCoOvAXe9wwFh4aVesavPHb6cIA9sHwzXgJRER3h/Pg0DaQiHvNXttBgDyfA0ugflFQ2erw+m0sDOiUK8kQMAMt6G1IqagKwrq5UQRzY8OhBQPt0fKRzGZyZysCjqI9aPvpATg+HXL1IthNvREsRYmZwy3b3DQCs7/meW1bw2JHHz3QgMmYHIfPZXj898MjcXmfvdw09zgWar+D3TttuIQEeHBFsV9h5ZdQw13bHTBL0xm2PGZe1NlDXS1aXo7a5+BHk2m4PkNpznvxwrMwM7hZFUys8bt/qRxO7uveNmUjC6kBFsxBU1RuSmqaAp50/PE/qYavOD/AV8tY7oa1F/qLXHPb8UFGDyuV0Ogjr2r9xn4gfyXVD1/qyewghf/vbCi+Qr7AwkowogED1kJ+JCKhaASiIBSgf2+JmvCvyV4A+6kXQlFAAAAAElFTkSuQmCC\",\"name\": \"谷歌中文\",\"url\": \"https://news.google.com/search?q=%s&hl=zh-CN&gl=CN&ceid=CN:zh-Hans\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABpElEQVR4nKWTvUtbURjGfzcf5prqEBFMBpWCHUIVISKRoIgQ3QQRRNBM1UHqX+AiLg4uQpeCiKigIkIkf4DgYAmVQBDEL2iHVIsfaGpi1Nxrck+HaGLMzSB5xuec9znP+5z3lYQQghJgKKW4qMDW9gPNbaf4AwkA5hbiTE1HSWuFd016AhubCZ6eBEurdzgcJr59vwXA45bp8VqLO4j+yzxhtWboKpuB8/NU9vyF13UQ3lPwjVzibpWZnLAhWySGByupqzWxG1JoaizjU4OZ4G4Sj1vOKYhnzMxGhdMVEU5XRPz6rQo9dHSfCacrIlbW41ku68lhz5iRLRLV1UYOjlT6hy4Y8F1w9jdFUhFc36QBODxSC1sYGqzEZjPwsd5MLKbxZeyKu0Qmk9HxK9YW7XjcMqGwgrcrF6T0dpCub9L4Ri75c5p6TdP0uYzl+Rpki1T8F2JxTbcYYP9AZfRrzpWugD+Q0C1+QXhPwR+4Ly5gNufb04Om5a9O3iT29X5gJ/jIj2CSuloTne3lGI3wM6RwfKLS2mJhoL8iT6AgxPei5G38Dx7mvwaRBxETAAAAAElFTkSuQmCC\",\"name\": \"百度新闻\",\"url\": \"http://news.baidu.com/ns?word=%s&tn=news&from=news&cl=2&rn=20&ct=1\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIACtAAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAHRJREFUeJytUUEOwDAIokv//2V3cnFUaJONUyWIaIGPGB0ZQAjxor9c8wBGbeqMXwbcHEAEEM5kdlFdZIY1ULc4MthFTywRd1N5reUXqqC7AQ9oI2Zjclwrczup1vU9lUilYDwGndBx2/gp5OjyiGoFx/+CG9j1PAn7jkYoAAAAAElFTkSuQmCC\",\"name\": \"网易-百度\",\"url\": \"https://www.baidu.com/s?wd=%s%20site%3Anews.163.com\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIACtAAAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAHRJREFUeJytUUEOwDAIokv//2V3cnFUaJONUyWIaIGPGB0ZQAjxor9c8wBGbeqMXwbcHEAEEM5kdlFdZIY1ULc4MthFTywRd1N5reUXqqC7AQ9oI2Zjclwrczup1vU9lUilYDwGndBx2/gp5OjyiGoFx/+CG9j1PAn7jkYoAAAAAElFTkSuQmCC\",\"name\": \"网易-谷歌\",\"url\": \"https://www.google.com.hk/search?q=site:news.163.com+%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAC50lEQVR4nG2TS2hcdRTGf/87c+/NHTOZR2ybtEoz7SILWyRqCmKCKeJrI2gJFRc2G4siRF0qglpRcaFFAoqgFkWxtkLdFNGWToSmEGo19EFN2hKSdGaatCb3ZmbuzH0eF7HoVA/84Cw+Pj4O31HcMtG0Nqu09p7otr2sJJ7noYnnsBA2mHnOuqWdc8OT4//WazcXmWZESsOipXf3OOkfqKVeJ6nnMRGuhy6mROzrfbb48I+7V/5jINOM0P35AcIZnMReku07MAwDy7L4dGA/XdY6phqLnKqcYnTrruye8VFpiS2NoyKLL0q0PCau64rn+xKGoURRJFEUyfTSZfli5pBs+35AXi2+ICfnf5HCd/1FAC26lJ0ldsE7TV2G0HUdPZnk3LzDiTmb7e8c4/ycwZ6tu/ig720aCYOJ0k8cHPx4CECJ85HgX4NgDr/zALquM7Wwyj1fnWlJufzyA2RSOldvlBn74316Owq8O3PwLQ2zF5q/QupBEokEAIcv2GCmWth/fBalFN25Ddzf/RgT1ybZnOp6Q8P9Hfwp0LeglALgy6UGtLW1MHZlFQClFI9u2slg4XF0CdFonoHIBu8sAEfOLVH2ANNqwU53rB0cQIS+7L3MezYazUlEAjD7iEV4cvt69nVpYJhgtP2NzvIzhTWDOCYW4Wp1AT8Ox7W6egRQuMsniKJorY2WSW/g8fRGg34zZlscsmB7BEFAve4SxzFeUCVWvEKF/MjipcuyYttSq9fF8zyJokjiOG7hz/GT0vz5uFSs9VK+8y554ujwP2Wq3L5xZfHrb8R2HKnVatJoNsX3fQmCQFZXq1L95DMpk18j0SnlZKdsPnJ3FkDdNCmTl/R7r8GmLrwLVzAG+uH0JI1jh5CwicqYqIyFMky8by/23YEz1WIAUNLzReOpLUMq047WkUbLZNGyObRsJ1p2He6Hh6kWf8sVcOxbv7hlSuTevH7foDijL8mNHUNSIleskOn5P+1fu3twDSB3ukoAAAAASUVORK5CYII=\",\"name\": \"腾讯新闻\",\"url\": \"https://www.sogou.com/sogou?site=news.qq.com&query=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIACBAwAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAA0hJREFUeJxNk11MW3UAxX/39t/ellLAAgUyEBFwIAsOAkNkakxMNjcJ0S1u0ZGZGT+S+WD0wcQn49P0ZZJo0LkYI5i56RwjIzoS2ISEIAzHpxLsYBIKLR+Fln7cllv+PiDVk5zH80tOco7S5kACKOwos6qGrNrHWZ8aZysYIH3vo2hZ2cRWV1i98xuh+7P8X0r7vwCA0jNv4qyqYebCZxQ3n6Hw2EmC7hnWRoYwIhGEzUbYs8DspW+Jr/tRALEbzj/aREHTcQbeaObpy51YXTn0nTpOZHGB7PqD2HLz0FeXMcJhXPUH8f7aixEOQbsDecmVIr3Dg7KroUrOXb8qg54FeflBp+x5qVFu+rwyFoslHV5bldNffyl/KMmVbQ6kEA4HeYeOEl1ZQbFacT17mP4XD2PJzKLuq3YUITAM47/SVhsFJ04hTYKht19DZDxWTUZ1LRszf5J7pInArBvfQD/Vn36BISVS10noOsJuTzKi3iVyG18gr6sD1V5aBlYb24ZB6t5yVocGAcg4UI9/fJRbzz/DzSermDz3EYZhYGxtkUgkmO/4kYKXT6PaCovY2gyi5RciLRrxcAhtTwHbUnL/ynfkHGrEmrcHX18vK8ODBOfusa2qBOfuYcTjqNaCQvTlZVL3VaLabKSWV2DJzOLuu2cRaelszrrZ33IBQ9fx3x1hKxJh7c4Qluwcgn/NoMqEgf3hErZjMVKKikmrqCSz4SmCUxMsdl4l/9gJTCkpbM5MY9I0EnqU0KwbYbcTnv8b4fm+jf2t36B7lxBmMwBl731A8etnMWlWVE3D19O9s9KaOgKTYyhIZDxGZH4OdaW3G9+NDhyFDyGESNrmzMRityOEwN3aQnp5Bc59lSx2XSejtIzAxBjBiTFUgOlzH7J07QqqYWA2m5NWEwaj779D4I9JGi62ExgdIepZIL24BE/nT8Q31nemnIhEWPrlBv7fhxGONIQjjeiyD2//bUxmC8/1DGDSNG6/9Sq1n7TgvthKfGMdBVB23ygecFJ0shlbTi7xUAjFbCarupbs6hoWun9m6vPzlLxymqjPx+T5j9l9cBKwDUjA8UgZrgNPYHXloPvXWBsfRVEUXLV1+Kcm8PbdSoZR4B+hMGuvciFlvwAAAABJRU5ErkJggg==\",\"name\": \"凤凰新闻\",\"url\": \"http://search.ifeng.com/sofeng/search.action?q=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAF/ElEQVR4nI2XXWxURRTHf3Pv3W2loC2flggFET8KSRURo2h8MFFj+AokoAYffIIHHwwESRRfxAcxkVoSTMQnQsAYJaAPopbU2qqhCAJaTW1pawWjtNqy61J7d/fe48Pe2T17WdBJJmfuzNwz5/zPmZn/mPdBDOAAbiQ99W0iSdQ2qi1K6hpGMojJfDRmxx3Aswr1Arpao2y18+LFLky0kO63Y/b/UPV7ttOpUF3KkXCUjC+uFVfqM6pPO+Jp5YmonaA8FFbGDdBKoRzykBLkJuqzBqG+PavQKtde63YcCVt0DujixDzXxtp1QouAVW49TypENDIe5aGwxSq2nlvlJoaANsT2e9eLeyUEKiWjKOXxBa1RUA5/cRfoxdzIy4RCRCOjcyFuABRibrdbQOV8MWos0AhU2nLaMGvA9UJgvdRoWI9dhYaj/vvfCNgxbXA8BEHMOwuz9hwlhWgX2Kq9D1yXsQce4JIIbk0N9Pdzf38/f86aRV9TE9POn2fxwECZ171PPMGwMdzd2oqbzxMAeWPoe+wxvD/+YLy+Huerr5iZyZQOrjaQTpBvQE6DfOt58s/YmIiIDH39tZx9913pOXBAPluxQn565x0REbnY0SEiIicefVQmQDIg327fLn4mI0Pt7SIi8sX69XIBpMfzRETk+5YWERE5sHixdIK0g7SCOPpsDx2H7PPPU11bS8/hw/z28cekLl4k/ddf5EZGmLl8OUE2y+9vv83gkSMsbGnh99pafGOYtHQpQ4cOcXHfPgDu3b27PGFNKWv0mo6O6Yy2Nh5sbqZz2zbmP/44TS+8wPTZs0kPDmJ8n6obbuDv4WEa33wT47pMXbSIm/v7uUmkYNiZM9yzezentm6luq6O3jvvpCoI0CUebk8PNDzyCJcvXGDx5s1UTZ5M5y23sCCVot4mYjJJYAz58XHmrVrFL0ePMm/NGkaMIZtKYYBcOo1TU0PvwYM0vP46oxs2MBeuMsKW4qmaTyYB+GH/fuoWLOD4unUsTKWKO8AA6XS6kL1BgIgwPjTE9zt3Yk6eZO5DDxUSMgxZ8uqrOK7L/NWruW1wEBEpC4EupWPdKTTHR0cBqB4ZuWqyMQaMQYIAI8KCjc8SXrrE9KVLmdHYSGQBhCG3rl3L4LFPmFxfT5jLFfqvZ4Dj+wA0LFsGQN2WLVeTjMhzz/W4fP48E2OjNLW00LtvH4hAEOC6Lu3rNzDc3c3Y2XOcbW6GiQlQuaAPLqd4jotAkGf2svsY6+lh0Zo19E2bxpVEgpzjEBiDl0xiRDAI7qRJ9Lz2GsZ1yZw+zVh3d8HLIEC+bOfHl16m8bnnyPT24iYSSGSASPm96VmKFAIfNi5i3ZmznHnrLX76dYj7z52jauasEmsYv8LwwAAmDJlUV8c9+/fT2dfHg0c/onvnTggF8X3yNTUs6eygesoUlr+xi+6DB0lWVxcNCCmdmp5mMPN7ezn2zNM8eeg9fv7wA77b9QZVN07B9ycwGBzXJZ9KseyVV5BcnhBYeOIE7vRpzH3qKbr37KG6thZclxA419xM07YXGe7oBMfhdgRct5w7tIK0gXSAdIGcAvm0vl6Ob9okksmIXLkiks0Vai4v4vsy2nVC2hsaJA2SBml7+GHJDQ+L+FmRrC+DIBdABkCO3nWXiO+L+Fnp3LFDWo2RdpDjIJ+BmM9BPApbLUnhYEgWAGdgzhyq6meTqK4q3pZeIkGiq4uFmUzxig2AnjlzyK5ciZw6xR0nTxIAuWhscONGmDoVs3cvU4IAP+rPA+YYiL0JqygxImuIZkbX4wNx+q0NyF5DFnNA0yciaS20XEAzWn0daz4YqH91O4xVvb29QCnIUTr14vTpvzihdUQvmlPSOmSrnePZhTRh0BDHmfB/kVIbAs0HtdSGCrFz4FrKAirTck21tWJb80oGFSTWAE2VteJKsY4bAOUhiL8J4zmh5wng5WNKbcI5lAikRSDOBW1bo6ehzleQofoWol0Qhz0OLcqYa72M7Jx4KCqFRr8hi4QkfvM5sYn60RF/nMZ1xJ/lcei18f8CXzwtfnAJiVYAAAAASUVORK5CYII=\",\"name\": \"CNN\",\"url\": \"https://edition.cnn.com/search/?q=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAq0lEQVR4nO2USwrDMAwFn0vvZR1NvtnzydRN06iNf4FAoGg2NmIUy4oSIAiCILiZ5Pa26F/qPX4jJEESqjrMXPUAQFW7/qEDZoZSCkQEAD6r8095JOFXEfFuahaQ3mG/bxUw8/yhHdKzFd0Sa629xCUv54xSyvAZhxkA9jZt763HzJtdoFvAVZCEiHwN3mhoDYB5SNoWx/5ZnfJU1Uj23Pv/AwtOEARB8Oe8AEX8nWWaRvY7AAAAAElFTkSuQmCC\",\"name\": \"BBC\",\"url\": \"https://www.bbc.co.uk/search?q=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAALEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/CxLj/wsS4/8LEuP/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w==\",\"name\": \"Economis\",\"url\": \"https://www.google.com/search?q=site:www.economist.com%20%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFN0lEQVR4nMWXTYhTVxTHf+/lJTHJzCTRDE61jiLFhWBBhJbSdiEoVHBTqFoFXVgoiNBNu9GN9mNTLbSF0lpKC1JcVK0iLkQobVEKghWsX6jggFO1MyVOzEsmMy8m79/FmZjJJFH7feBw3/2fc885755zv2CKJA1K+kzSTUl1/fNUl/SrpM8lLWI6SVolqfgvOO1GRUmrABxJg8BFoA/A933i8ThhGBKGIY7j4LoujuMA4HkelUqFyclJOlFfXx+Tk5NUq9U2WSqVIplMNro+sMwDdjScA7iuSxAERCIRwjDEdV1qtRqu6yIJ13WJxWK4rtsxgEgkQjwex/O8Nlk0Gm2JFdjhAWuno6VSiVqtBvDgr6fShOM45HI5KpUKlUqlYwC5XI5yudxxhtLp9MwgXvKAedORarVKNpulVqtRKBQeBJLNZhkbG0MSqVSKeDzeMYBoNEpPTw+JRKJNFovFQIJqFYpFuHfvSQ9om8tSqUQYhsRiMYIgIJPJkMlkKI+PQxBQGR1lYmQEfB98H9f3cUsl3FKJmEQ9n6deKDzAGhwpl21Mc3Y8R4cPi2KRBvu3b0OxiFsuk6pWqebzRMfHcX0fFYsQBDgzI/4b5Aj0D9rrTIkEDAzA8DDU6y2i9lLtRp4H/f2QTMKNG62ylSvhiy/g2DHL8RNPGA8MWJtOg+PAnDkwNtY6VjaklZ9/Xlq3Tlq5som99ZZtIT/91Krb3y/dvm2yUkm6elX67jtp/37po4+ku3dNNjQkJRJtvjoHsH27DQoC6YUXDNu507Dvv2/VfeMN6auvpN27pYULpWjU8Geeka5dszH790t9fe1+ugYA0r590vXr0pEjUiwmvfuuGTtxolXPcaQNG6TLl00+Oip9841Urdrfr1/f2f5DA0gkpAULpHS6ie3ZYw6OHetsLBKRDhxo3fF//93SsGJF1wDa91PPg2+/tYo9fdoKCGDWLGuDoL1AX3wRzpyBTZvgyhXYsgXefhtGRmDtWvjkE9izBwYH2921IbUarF8Pp07B009bdW/YAI2db+Yhs2yZ8d69MDpqq+Sdd2BoCDZvhlyuyUuX2o89chWAFVNPj6Vi+XLLvSSdOSPt2mUpcRzpvfdMdvasVfr4ePdDePXqNj+tM9DTAz/+2Iw4mbT1O52efdb4wAEz8dRTttEMD8P58zB/PqxZAxcuwJdfwnPP2fa7cyfcvduevpaIZs+WLl2SfvhBOnRI+vRT6ejR5h8EgbVvvimlUs1x778vFQrSq69Kr71mOidPms7Nm9bfuvVPLkOQBgak4WEz8PXX0rZt9v3bb1IuZzrz5kkTE9KdO5a2Dz4wnb17Tf7yy9bP523TemgA8+dL585ZLsfGpFrNBp89K82aJbmu9PPPhh0+bGM+/ND6u3dLmYx06pR0/Lg0d27T7saN0iuvWD3NCKD1MFq8GA4ehHv3jAsFaz/+GG7dMp3BQVi0yPJ68SJkMjAxAV0uKI+i/+Y0fAg9/mn4uOQ4hIkEYTKJGu3UdzSdxuvrg1TKVlgyGXosWWLAdE4m27FpeAnMSSKBkklrp5xl5s6lMjlJ0OFO2Nvbi5dKTYdCj2vXWpR83+94pX7kjwMRwHFdIq7b8Vbc6SbtASHT7oXRaLTrlftxyHXdrjYikchMKPSAO8CTDaRcLjMxMfGXA+jv7+9qI5vN2s24SSOOpM+B1xvI/fv3CcPwLwcQjUap1+sdbXieN3MW9jmyh+IvTL2O8vn8vzYDmUyG3t7eRtcHlgH/7+P0AUlaJHs6/6r/8Hn+B0w7zXRC+ZfTAAAAAElFTkSuQmCC\",\"name\": \"今日头条\",\"url\": \"https://www.toutiao.com/search/?keyword=%E4%B8%96%E7%95%8C%E6%9D%AF\",\"blank\": \"_blank\"}],\"mine\": [{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABi0lEQVR4nJ2VsU4CQRRFzy66GCtLrWysjMbEyi+wNFHBmGDpH1jYWJtAq5WxpoFEorXxB6xs1CBBI4WJVhpNoPBayMAuuzOw3FcwvMe5eTOzy0OYIGCHMk3ayBJf3FMmTxCieotN6lZwMOpsRQzIUBwZNlEk0zdIjwtR7BqQGwsXIicg4HVsgxYBFGzlGS1pepjFHlSSCiUZ/ehQS9rVerJB1eOZeUKapINNXjz14jMbzdhxWImn5oi2dCa3FuObCH85HoJL0o3mIgYeMt0o3qBVbaZ659LlfpOOyCHza5/ewsPjKJXJv0L7ORjhDIwSDnGi+/kxAv6QfAsIvY+At5SxGSxbkEshtKqanpS1PwcmGgN4xfE6hZ4DowXqlitLkh9PlVJe42e8rYvIBr4dG6ANj0mF/ZBBw2Xw7HOX1NY5Hlfd9b2r/1ufmq22gcc18OYyqA39U53Smr3aIosg7zJwRt4MltJYeEn0R9tJavw0NNqEYDvVcM31uH6WgAJVmnSsYIcmVQrh8f4HufpcPqh3SFcAAAAASUVORK5CYII=\",\"name\": \"MDN\",\"url\": \"https://developer.mozilla.org/zh-CN/search?q=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAADAFBMVEXRa1hIvVUBriaErG7//vzQx7e116nq4M2Dy4FmYktwx3Tt48/y6NQXsTH+7uK2fGBhwmhoxW7Wg3HEMxe8EAD78Nqn0plRvluZ0ZLKQizNs6qupZZ0zX/9/+3669vM5cUxt0QlszpQqV6HhoPP3L1YwWKYooEQujB9ynxWUTgly0Tp38yhlIhAkEAldSRdOC706tbw5dL/8ezInXD169iK1JO7u6n+9ODAJQSY2J+Wrc+z4bLluKpnkcWbyYz/++CMzYcAqQz25dd90Yn90/ll020qwEPk28j5/OjhueEstkDfoo7k2NP+68n/5+CmSj3i2MX85dI6ukzx+ufhqp7+8/r39er29uP77NU0kjgvvEQ4LBc8nEFOzVqQvY0evzvN+f/m+drt8uHpxbnb5s7s7dpwomfb0cA3p0Ti7tfB473n3bzc7dDe3szr//9SZH0Avij37tng1ssttT7dk4Xf4t6U4ZOm3Kh81ntaelrv6Os/WC6I3Ik+iDvuzr/z2M6AgICBgYGCgoKDg4OEhISFhYWGhoaHh4eIiIiJiYmKioqLi4uMjIyNjY2Ojo6Pj4+QkJCRkZGSkpKTk5OUlJSVlZWWlpaXl5eYmJiZmZmampqbm5ucnJydnZ2enp6fn5+goKChoaGioqKjo6OkpKSlpaWmpqanp6eoqKipqamqqqqrq6usrKytra2urq6vr6+wsLCxsbGysrKzs7O0tLS1tbW2tra3t7e4uLi5ubm6urq7u7u8vLy9vb2+vr6/v7/AwMDBwcHCwsLDw8PExMTFxcXGxsbHx8fIyMjJycnKysrLy8vMzMzNzc3Ozs7Pz8/Q0NDR0dHS0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6+vr7+/v8/Pz9/f3+/v7////XnzsNAAAAmklEQVR4nF3KQQuCMADF8U2EQT1hklJCQSIhbIdCCtepRodgpxB26eKxj+ChL99mhOm7/OHHI8AdD+AFeZzXRXEhTLKKSuZyYD49xFM4T+E0hpttprAeQ2x5YAZYJEsb6KgHHweN3f6DSnL/iLTa/B5lWOq21SpMdZum5Cn4nguTi+ydCWMEAVZVR/mOAqAd8AWgBz8H12qGYR9XXh8E2WsxgQAAAABJRU5ErkJggg==\",\"name\": \"Can I Use\",\"url\": \"http://caniuse.com/#search=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADLElEQVR4nM1Xz2sTQRT+dpNScqhJW7ZJ9mx706RJ0/SHbRHR/8Cz9ORBBBEUEfwjBJVePHhQFPUiIi09SNqkSbtJU70p6dH+IOChQmpNss9Ddqezu7NJmgT0LQPZN/O+75s3bzI7wD826QxjPURUawtUktrGbWfggK7rR3bnxWjc8v51p+AIlGVZBkAdC9B1nQXbCZuZXYwsy648bh1yvV6vA8D9Bw+xvLLSNrlFSPFUiMfjEXKJnJ5arVYDgMj4REfEdvtSzAMAvF6vg8/hqFWrBACRWKIn5EzEttYQ0ddn4bS8VE3yHs3cIaKYR6VSOfD7/WHTJ3P9YSJykCuKgp1tDTvGDNoxt/FEBJ/PF+J9LAMnJycEAFFb6s9CbDc7Fo/X398vAYDX8A+ACJH4pBOFmm7jpiaMtOHJAPD7+PiIiBqdthaJJUBEHbVmeKqqjjEBLMhQzbdifrNjAcX8phCTiLBbKn1jS0BEGJ9IOrJlkndlgngeUwbQ11AsylhnM+fbtpZzxTUF+BrpFzw9ECDCXrhyjQlgSyAq2a7TDyC1tu7AHvT7LQKO+ZT0WsCdu/ccvvdvX1uWoEq6LlyC8cQUSNe7a6LH6DMFgIhQyGUE+6W7QoxNzjTFtAhwK8RYcqYj8pu3botnbxR3YGjoPBMwODx8jhWi0fLZNPsdT84inpxti/jxk2eIJ2ehaQXh7PPZtDn7XYA7jH6WywQA8alLrFgKuTSm5y7jT7VqKaJCLi0sOD7WzczYIUWRWAYMh0oAVpc/WgA31j87QIR/ry2pgXwuDeLIgdPTEAD2iQgBbo8CjfrQsutWAS7bs9m2fffmJYgINxYXr/N+xydZ+fCQACAxPcd8dgFuxsfYzcRQgkH3TzLDPOWDgxoATMzMOzpfvXiOsdFRIYlo/OqnDxgMBBrkoZCDT7Y7ANSVUMhDRNAyKWiZlOUk+bG377oD7KeOlkmxJRWRuwkAAH0kHJbM4traWMPWxhoAYGF+rmURmuMJwNOlpUcj4fCZLya8DRzu7TmuZu1YUFVbXs3cMsDbr6CqSkFV9X4vlbJuszfbhWj0qjFeakX+X9hfKwNpwLLdyLQAAAAASUVORK5CYII=\",\"name\": \"GitHub\",\"url\": \"https://github.com/search?utf8=✓&q=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACHklEQVR4nIWTX0jTURTHP+fu59xUCJLGCgp0IIPSIvLPg9JTvZq+RBj5WJGySWVPKSH0ZCSWD/ZiFAQVqQUVBulbaQT2IkVEUhISPrTptE23e3pYm26t+sLlHrjnfL/3fM+9Qh4Gp5ubVOSmqlSLIACqGkUY8bp83acP3drYmi+ZYGSq3RP1RudFxJ9PmgOVU6GG0bs5BCNT7Z7lkuUVwPlncZaEi6GGsf4swcD0sUW14p954S6cryAoKoJ/j6VybxLEHAzVPZp1Bl63HBHB//2bYe6N2dLUJhqD68xKgANflpj7GCewL4m1qQnAJwPTLZ9ECJS7K2ja3gFogRuneRX4mYowsdSHIKRc7HJECAAYceEu2rRARECV6Ooa28pKUU0Tp0xRNseVpNXkqxljeDz5ig/zC0RiqywsLnGhf5jYWryQO00mv/j4+T6qqyoJVuzm3tNJaqoquN59ls6rN3j/+WtuubDgqJIQoRjAWsv9a5eZmnmHqiWyHAOgd+gOw71duIsc1lKRTUExE0aE51tZrbUcrq1h545yzp1oJmUtPWfacvzJoLN29KWzXhw76U6UxRJ2BSOu7GGZtyQnOTNdVft757YImn5IMy1XBHoKjfAP29JbPFw/7gUwAOH6sV5Fh9I6/1vEExvWl/UhE4TrxzvUchRl9a/qyoMfdftLLzU+WclvLQeDb1uDNqltiAZREgIPPY7vWf5XBvgFMS/Jw/yUPqwAAAAASUVORK5CYII=\",\"name\": \"w3c\",\"url\": \"http://www.runoob.com/?s=%s\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3ggEBCQHM3fXsAAAAVdJREFUOMudkz2qwkAUhc/goBaGJBgUtBCZyj0ILkpwAW7Bws4yO3AHLiCtEFD8KVREkoiFxZzX5A2KGfN4F04zMN+ce+5c4LMUgDmANYBnrnV+plBSi+FwyHq9TgA2LQpvCiEiABwMBtzv95RSfoNEHy8DYBzHrNVqVEr9BWKcqNFoxF6vx3a7zc1mYyC73a4MogBg7vs+z+czO50OW60Wt9stK5UKp9Mpj8cjq9WqDTBHnjAdxzGQZrPJw+HA31oulzbAWgLoA0CWZVBKIY5jzGYzdLtdE9DlcrFNrY98zobqOA6TJKHW2jg4nU5sNBpFDp6mhVe5rsvVasUwDHm9Xqm15u12o+/7Hy0gD8KatOd5vN/v1FozTVN6nkchxFuI6hsAAIMg4OPxMJCXdtTbR7JJCMEgCJhlGUlyPB4XfumozInrupxMJpRSRtZlKoNYl+m/6/wDuWAjtPfsQuwAAAAASUVORK5CYII=\",\"name\": \"GreasyFork\",\"url\": \"https://greasyfork.org/scripts?q=%s&utf8=✓\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIACBAgAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAkhJREFUeJytk19IU2EYxp9z5s40ZzSRkWOQJIog0dzmH2aECFEIhiSCoN2oECJYYUI3QjqlQdqdF6bYRcwLUQhRxBBkXgQqKaKRjWFYMmnmyMN2FMzv6SI9FnXRvwe+m4f3+/G+L88rCSGIf1ACAEiS9NcA+VfmdjiMT1tbv0cQQpAkhRD8sL7OOxUVdAB0JyXx3doajxVaWWG1w8Eal4s1Lhdr3W7OTU9TB7ycmmKJ1UonwFKrlbfLy+ltbCRJxlWVFTk5zAPoPHqXLRZGIxEmAMBGMIj2hgbg8BCdfj8uejzY0zT0d3VhX9Nwt6oKqenpuNfTA0mWQQDnsrNxJi0NeLO4yCs2GwtMJr4KBPSWnw8O0tvUxIVAgBcMBo729fFxayuf+nyMqapeh/b6ejolif2dnbqpRqMssdk47vdzZmyMTlnWW88D2FJZeQK4npnJktRURiMR3ez3+VhgNvN9KMTPOzt82NzMF8PD/Li5ydDqKmuKini8O+QbjXzW3a1/nh0fZ57RyJ6WFr3oWEII9ra1sbaw8ARwKSWFb5eW+OXggKMDAyw2m3nT4+GepnF2YoJPOjoYU1W+np/n/epquo1G9nm9OlS6VVrKpORkaLEYFmZmcDYjA72Tk1ASE3EjNxfns7KgxePYDIUgGQwoLivDo5ERKIryLUjB5WVes9vpkmU+qKvjdjhMktwIBpmvKPryrtrtnBwa4r6m/TCWdDQL9jUNp8zm7xOKlbk5xHd3cdpiQbbDAcVk+inJkhCC//2Y/kRfASoRrtb2v2kbAAAAAElFTkSuQmCC\",\"name\": \"人生05电影\",\"url\": \"http://www.rs05.com/search.php?s=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADfElEQVR4nF2TQUxTdxzHv7//e319pH3QEi3MAYMpqWZj1c1lESIz0WwLXmZl7CAXjCYzuyCJJPVgPAy8zZglEuRA5sLJiIlm4ExmQtDilmVgQrDCsq2WuRRKoX20tO+9//vtglni9/z5fk7fLzEzXs+T8+f3rTx6VItSSV2fn4/qVVVjX25szACQ3xLt72Oee8XS64LfYrHe9bm5Do/P50mOjxvEHJZESx8MDKzv6O5mZ3bWHz9z5s8t0/wOzDPqq+JPx49/nJqY+CIYDkcPj46+wa6L5N27YNuGZD5gmyZ21dcjnUxCWtZHKJU+8er6VQEAP9TUtIZ7esbbR0a+lqZZLUslu6atzYlcvCgl4BLgCE2zXdd1lm7edMxcziKgOhCJfKMCQGFlJZpfWqp+LxYrldfXPc9u3IC+cyf9Oz0tBOBKQAURCyEgVBXBhgbFSqcdaVlCAAAB+7Nzcy67rvJWZyftO3eOVuNxpB4+ZAmQBFitqCAA3NLfT9GFBT4wOEiObbvqtmCjnMkQiLA0PMyKYUDVdaH7fNTU2cl1HR1Ue/Qou8xkNDZybnGRVuNx8vr9qjpFFCDAkYUC2ZubqNq7l6x8nkPt7fjs0CGEWlsZAJVzOSKAnw0N0e+XLrnlTEbUHjy4JjKVlbUuUOEyO7JUonI2i2AkQm6xiF/6+vDjkSN0a88e/DE6CiJCenqazUzGNUIhrj12bEj8VSjU6Iax693+flfRNKpsbqZQa6v458EDyHIZgXCYpGWBpQQAaJWVEIAiNG3r/StXBgRL+XbTiRM+f1OT/WtvL3kMg8vZLDd2deHT+/fRNjzMkQsXgO3BqYbBBJAsFh1zcdFW5xXlxZuTkykzkZAfXrv2TiGV4uWJCTR2dWFhbIzTjx9TLpFAJBYDtjUMsDcUyq/OzEB87zg/b62urjWfPbubhHCmTp8mUhTKJRLs5PMkPB6spdNgAMxMiqa5BEAJBmdnL1+WKgDYwJ2ng4OfF1MpKR2HG6JRpfjyJf6+d889PDJCu0+domBLC4iINb9fAlB9qhooAxAA8BXzLW8gcMeoq9MVXdde3L6tFJJJJZ9MiumeHlJ9PgQjEUjLEuVs1uvRdeuppl3VAoH/37g8OVllZbP9ievXA8l43OvXtJDrOHV6MLiDdL2+8eRJ2KYZ31xeTnoDgalCd/dw3fPn4j+2Ya+YXX1PBgAAAABJRU5ErkJggg==\",\"name\": \"射手网(伪)\",\"url\": \"http://assrt.net/sub/?searchword=%s\",\"blank\": \"_blank\"},{\"favicon\": \"data:image/x-icon;base64,AAABAAEAEBAAAAAAIAALAwAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAtJJREFUeJydU0tIVGEU/v57r3dmdJzG0a6T6UyaM6GZYkJhBRZE9EJcCEVpVIuIyGhRi6hNBC5bBBJRqxgiopoWlVZoVvQgUsuaIZPyNabzuukd5zre199CMaMk6IPDgXP4vvNxDgdYBKET/GKt30D+Vrx8alu5JCn5Jl4Mfg9zwpoyy7j2JjV8qLXr3wLnfV4UBB2bSyqXt7gKM0vtdjMkSUU0nOzu7Qqfbjj3tGNRgRgFHl3YsnPL7iK/IJh4EIBQAkoMEINC/KFrT+8N7Nmf77yrHvb9KXC7qdxaVlfe7/EucRJQTM9oYBiCkYEEXEWZmJY1RKOK+OROYFVZrTDR91At4n7zn2evdzgtzgedI1BUQJI0yLKKowe8aO2IYGhEQoaVOIrLlx1LDbPipu2OSvK5dS9vzx5XfIEhVGulfq+k14VjMzDVuBAKxUAjERjTMsCxYCzpyF2aA9PzyLh130p71MB1LqkzXSSRb1ufln0rN8+01ZyYgduVicl0DY6cJdCyV0FTOBAiw2KKw11iQzzP6szyZmGsW4xwUJRXxZXOI6mUcsq92g4GAAWFyVyBZenrAMLO75tSBUbyLXjpLQwdCA2IPczHz+GW4cGplKdklgwQUL4YbMYGEMKBAQEDgAEFQ9LAWjdCT3Ojv18KMkZOGxPrSxpiVJbkpA5Np0ilVMCyBoQuPBEBQEDmMjWvfRVIjFUNVbfJJD4R53wndzmFwoymAo/tIM9DqNpxBoQxzRF+wQCgGxSBZ88bK3c2+QCAybJlofHivXFLw46zr9vHaghLBg2qzk4C5sMAoGoaPrx8eTN4tfnGvDdKKQcAycQM7sff4X3zJVt1he3KikJPvUVwgbAsdINO/fgaYEY7/Wb7asG99Xh7aKEAAwC6rmM0JqJv8hp6H6s297cXtZMOjyhDmKAZrGymiplXk+kjSfZLz6evMb/fL//xWf+Dnxs2M3yo2q6nAAAAAElFTkSuQmCC\",\"name\": \"游戏-3dm\",\"url\": \"http://so.3dmgame.com/?type=4&keyword=%s\",\"blank\": \"_blank\"}]},\"rules\": [{\"name\": \"360\",\"url\": \"/^https?:\\\\/\\\\/www\\\\.so\\\\.com\\\\/s\\\\?/\",\"enabled\": true,\"engineList\": \"web\",\"fixedTop\": 50,\"style\": \"padding: 10px 0 0 120px;margin-bottom:-10px;z-index:3001;\",\"insertIntoDoc\": {\"keyword\": \"//input[@name='q']\",\"target\": \"css;#tabs-wrap\",\"where\": \"afterEnd\"}}],\"allOpen\": false,\"center\": 2,\"icon\": 1,\"transtion\": true,\"HideTheSameLink\": true,\"selectSearch\": true}"}},"enabled":true,"position":5,"file_url":"https://greasyfork.org/scripts/27752-searchenginejump-%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E5%BF%AB%E6%8D%B7%E8%B7%B3%E8%BD%AC/code/searchEngineJump%20%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E5%BF%AB%E6%8D%B7%E8%B7%B3%E8%BD%AC.user.js","uuid":"597bd725-f9fb-4872-9f78-93dcb44b5558","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgIHNlYXJjaEVuZ2luZUp1bXAg5pCc57Si5byV5pOO5b+r5o236Lez6L2sCi8vIEBhdXRob3IgICAgICAgICBOTEYm6ZSQ57uPKOS/ruaUuSkgJiBpcXhpbijkv67mlLkpCi8vIEBjb250cmlidXRvciAgICBpcXhpbgovLyBAZGVzY3JpcHRpb24gICAg5pa55L6/55qE5Zyo5ZCE5Liq5pCc57Si5byV5pOO5LmL6Ze06Lez6L2sLOWinuWKoOWPr+inhuWMluiuvue9ruiPnOWNlSzog73mm7Tlj4vlpb3nmoToh6rlrprkuYnorr7nva4s5L+u5aSN55m+5bqm5pCc57Si5qC35byP5Lii5aSx55qE6Zeu6aKYCi8vIEB2ZXJzaW9uICAgICAgICA1LjI2LjQKLy8gQGNyZWF0ZWQgICAgICAgIDIwMTEtMDctMDIKLy8gQGxhc3RVcGRhdGVkICAgIDIwMjItMTEtMjQKCi8vIEBuYW1lc3BhY2UgICAgICBodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvMjc3NTItc2VhcmNoZW5naW5lanVtcAovLyBAaG9tZXBhZ2UgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3F4aW5HaXRIdWIvc2VhcmNoRW5naW5lSnVtcAovLyBAcmVxdWlyZSAgICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzQwODAwOS10b2diay9jb2RlL3RvR0JLLmpzP3ZlcnNpb249ODMyNzk5Ci8vIEBpY29uICAgICAgICAgICBkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVlBQUFCemVucjBBQUFGU0VsRVFWUjRuTVdYWDRoZFZ4WEdmMnZmZTg5a0pnNjFpYTBEWXpNVE1Xbm9RMEZKdEttdEpzRml4VDhEQlNtWXRHTUxncTBQQ3FNRUt3bXhZelNHeVVQQkI3WFJOaTBGQzZKdHdZb3ZnY1Mwa2xKRDhTSGFrb0V4WWhMUUZrd245L2FlT2Z2N2ZEaTNTU3RKNW80bXVONE83TDMyYjMzcno5NEgvczhXUzEwY3ZSM3lWUWFZKyt3bmtFU2t3REsyc015MUV3WER0elJSemlCaHUrZEdERzQ4c21TQTVrVVAvL3dtQUZJa3JOd2lHTU9zQnpZQVF3VHpFRWVCWThCSk8xZll0Ris0bGFHUHYvaS9BZnoxQzFzQVl3bmdaaUttc0RjREkwRHJIVXRMNERSd01HQW1VblZjQ3RwSFBzclFiUy8xRFpEZStWRkhibEt6aUlqWUJqd0QzSXU1QVJCd0JqZ0puQWt3TUFhK3orWlpxWEVYOFZaZzBUNzg0YVVEekgzdWswRHRWUXZsVnNNandHcE1CM2dhdUF1OGllQjJZRFB3eFI1Z0YvZ1ErTWVvTlVGekFDSTRkK2ltdmdET3AwQlZSV28yQVc2MmVSaTh3dlkvd050cmdHaERMKzdhL2dJY0JMWUJ1NEhyc1BkU3pyOEsvSmxjTGsyQmFDUXN0U3hOMlZwdHVZTzkzYW43V0VTMFV5T1JHZzFXZnUwUUtpdnlRaGZiNTZ5aG40QjNZbmV3MWtEMW9EVGZKRjIwdmk4TllCdmpNVnViYldIck9kdFBod2FBWVBWdmZzOEhmMXUzMmJKYkR0WFZiZ0Z2QWo0QU9nVEd6aFBoR01kVi93Q3ZidG1BSlN5dHR6Uml1V3Y3Q2R0dEFsWS9mL2lpbXdkdmZRR2lBZm10Y3pnL2puT0o4L3R4dFJibnZnQXU2RlNQdGcxQUMzd0dQQXZnV0dSWXFpU293THdDMVJ1NEdvRnlGUGMzWk04RGZHUExCMWpaWGxoZTc0c1M2QUFjK082dkwrdGc2TGFYMkxQL1NTQTZ0a3BjWWVlZTM2LzBEL0M3VmU5Qndaczk3aUxNRU1EQUU1TjA3ejF3U1FlYnZsL3kzS2tBR0RJVXNySHBScDhBQ2VER3czOGtaZFBNUHRySUxodloxeVo1VFpKeHZud3VXNDBHelNTYURhMXZKcTFvSlhWYktaOXFwdjVxb082Q3FyNVVMQit6Zk5yeWdPWDdMUytQbENnZXUrZWltei8xdzB5V2FUVFNjSXFZVEVFUmNEb2lYb3ZGYXVkZEFBQTIyQ2VSRHlLRC9CbmtiZDMyUE5nVWowOVMvR3dyVU10K3gxNGhpV1ZGSTFMRVZ5UGlkZ2dpNGhmT251djNucjhBRUdDNXNqMWorNFR0QWN1N2k0SGxEd0xMcVJhd01tdG1uaWRuNkpZTEdJYTdDL21id0hlQWdZQVRRZXhQalZDVnhjWmQ3U1VBQ0RDRWZSeXpuWG9NcjhTYXdmNGxjRGR3STdBS1dBZHNzLzByMmRPeXI2a0ZwQ243aGl5UFJsRFk1bU03ejEwVzRGMUtGVCsvcDZad0RrZ1QySHVOMTlUejN5WFdHK05uSjh1UjloMEZTU3RTUkFGQndBbWJwdTN4YlAvVDlyemtwMnp2dHQyUnpjdmZHMTVFQWFDOC84bTZGa2dtcFdkc1R5RC9DT3R2OWVzbmoxaGFaWHZFdGlYUDJkNWpjNmVzKzNxSHY4LzJ1TzF2MmQ0aGVkQTJIL24ydnhaWDRMd1MrNzhFMVBjRHFwckFPUFphbzlHeHM1UE5rYzZkWFVLbkl1STFaOCtsUmlqTG84QVIyK09XcWVlQlM4bjdiRThiZDJ4NFpjOTdGd2NBYVAzMDd2cXlpWGk3UXpCaTdPeVhHZWw4R2tKRUJBRlVXVVJFSVhsbkwvTEN2Z0JoZVo5aDJsTEh5dnhwNXJyRkFaWmlHM2UxNnpsaUJtM3ZzRDBsdTZpNWphMGF3cHBXcmpyS21lT1BqQUwvVVFQL3JmMWgxMUJQSkhja1QvZGtMK3ZEamVYQzBwUnkzcUdjQjIyeDlvSFpLd2NBY1BUaDVVaW16clduZXhHWGxyQ0ZsQXZsYWtxNWVpaVgzZUx0U1huRkFBQmUzajFjLzBQZ1RwMXo3N05VS21lc2pITXVsS3V0dHE5WC9lcStzZ0FBeDM1d1RaME9xV05yV3FyMktWZWxxb3FjRjNET0wxcjVkU3RmSFFDb1cwM0s5QXB1V3JuYW0vUENuSE4rU3RaRFJIU0sxakxnQ25YQnBleW1yLzhkUytTRmJtSDdlaXUvVGtRbk5ScmtxbUwyMFhWWEZ3Qmc3UU96UkFTU3NESkZheG5kc3NQc28rdXU5dEg5MmI4Qm93U3lQYy9pWnRFQUFBQUFTVVZPUks1Q1lJST0KLy8gQGxpY2Vuc2UgICAgICAgIE1JVAoKLy8gQG1hdGNoICAgICAgICAqOi8vKiovKgovLyBAZXhjbHVkZSAgICAgICAgICo6Ly9tZWdhLm56LyoKCi8vIEBncmFudCAgICAgICBHTV9nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgR01fc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgIEdNX2FkZFN0eWxlCi8vIEBncmFudCAgICAgICBHTV9kZWxldGVWYWx1ZQovLyBAZ3JhbnQgICAgICAgR01fc2V0Q2xpcGJvYXJkCi8vIEBncmFudCAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kCi8vIEBncmFudCAgICAgICBHTV9vcGVuSW5UYWIKLy8gQGdyYW50ICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0Ci8vIEBydW4tYXQgICAgICBkb2N1bWVudC1lbmQKCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uICgpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBjb25zb2xlLmxvZygi6ISa5pysOiDmkJzntKLlvJXmk47lv6vmjbfot7PovawgLS0tIOW8gOWni+aJp+ihjCAtLS0g5Y+R5biD6ICFOiBxeGluIC0tLSBHaXRIdWI6aHR0cHM6Ly9naXRodWIuY29tL3F4aW5HaXRIdWIvc2VhcmNoRW5naW5lSnVtcCDihpAg6Zeu6aKY5Y+N6aaI5Zyw5Z2AIikKICAgIGZ1bmN0aW9uIGlxeGluc3RhcnQoKXsKICAgICAgICAvLyDmoLnmja7op4TliJnmiormkJzntKLlvJXmk47liJfooajmj5LlhaXliLDmjIflrprnvZHnq5kKICAgICAgICB2YXIgcnVsZXMgPSBbCiAgICAgICAgICAgIC8vIOe9kemhteaQnOe0oi8vLy8vLy8vLy8vLy/nrKzkuIDkuKrlj6/ku6XlvZPmqKHmnb/nnIsKICAgICAgICAgICAge25hbWU6ICJnb29nbGXnvZHpobXmkJzntKIiLC8vIOS9oOimgeWKoOi9veeahOe9keermeeahOWQjeWtlyjmlrnkvr/oh6rlt7Hmn6Xmib4pCiAgICAgICAgICAgICAgICAvLyDmmK/lkKblkK/nlKguCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgLy8g5Zyo5ZOq5Liq572R56uZ5LiK5Yqg6L29LOato+WImS4KICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL3d3d1wuZ29vZ2xlKD86XC5bQS16XXsyLDN9KXsxLDJ9XC9bXj9dK1w/KD8hdGJtPSkoPzomP3E9fCg/OlteI10oPyEmdGJtPSkpKz8mcT0pKD86Lig/ISZ0Ym09KSkqJHwoXmh0dHBzPzpcL1wveG4tLWZsdzM1MWVcLm1sXC9zZWFyY2hcP3E9KS8sCiAgICAgICAgICAgICAgICAvLyDliqDovb3lk6rkuKrnsbvlnovnmoTliJfooag6CiAgICAgICAgICAgICAgICAvLyBbJ3dlYid8J211c2ljJ3wndmlkZW8nfCdpbWFnZSd8J2Rvd25sb2FkJ3wnc2hvcHBpbmcnfCd0cmFuc2xhdGUnfCdrbm93bGVkZ2UnfCdzb2NpYWxpdHknXQogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogJ3dlYicsCiAgICAgICAgICAgICAgICAvLyDmt7vliqDkuIDkuKpjbGFzcywg55So5p2l5L2/55So55uu5qCH572R56uZ55qE5qC35byPCiAgICAgICAgICAgICAgICBjbGFzczogInM2Sk02ZCIsICAKICAgICAgICAgICAgICAgIC8vIOiLpeWbuuWumuWIsOmhtuagjyzmmK/lkKbnu5nkuIDkuKrpq5jluqYKICAgICAgICAgICAgICAgIGZpeGVkVG9wOiA1MiwKICAgICAgICAgICAgICAgIC8vIOWbuuWumuWIsOmhtuagjywg5YW85a65YWPnmb7luqbnlKgKICAgICAgICAgICAgICAgIC8vIGZpeGVkVG9wMjo4OCwKICAgICAgICAgICAgICAgIC8vICDnu5nlvJXmk47liJfooajnmoTmoLflvI8gCiAgICAgICAgICAgICAgICBzdHlsZTogJ1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiAxMDA7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6NXB4O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOi01cHg7XAogICAgICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICAvLyDnu5nlvJXmk47liJfooajnmoTmoLflvI8g77yI4oCcc3R5bGVfQUNCYWlkdeKAnSDlj6/pgIks5piv5Li65LqG5YW85a65IOKAnEFDIEJhaWR14oCdIOiEmuacrO+8iQogICAgICAgICAgICAgICAgc3R5bGVfQUNCYWlkdTogJ1wKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDEwMDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDo1cHg7XAogICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIC8vIOaPkuWFpeaWh+ahoyznm7jlhbMKICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQg5bCG5byV5pOO6Lez6L2s5bel5YW35qCP5o+S5YWl5Yiw5paH5qGj55qE5p+Q5Liq5YWD57SgCiAgICAgICAgICAgICAgICAgICAgICAgIC8vICjor7fkvb/nlKh4cGF0aOWMuemFjSzmr5TlpoI6ICcvLypbQGlkPSJzdWJmb3JtX2N0cmwiXScgIOaIluiAhSBjc3PljLnphY0o6K+35Yqg5LiKICdjc3M7JyDnmoTliY3nvIApLOavlOWmgjogJ2Nzczsjc3ViZm9ybV9jdHJsJyApOwogICAgICAgICAgICAgICAgICAgIC8vIGtleXdvcmQg5L2/55SoIHhwYXRoIOaIluiAhSBjc3PpgInkuK3kuIDkuKpmb3JtIGlucHV05YWD57SgIOaIluiAhSDor6XpobnmmK/kuIDkuKrlh73mlbAs5L2/55So6L+U5Zue5YC8CiAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmUg5Zub56eNOgogICAgICAgICAgICAgICAgICAgICAgICAvLyAnYmVmb3JlQmVnaW4nKOaPkuWFpeWIsOe7meWumuWFg+e0oOeahOWJjemdoikgOwogICAgICAgICAgICAgICAgICAgICAgICAvLyAnYWZ0ZXJCZWdpbico5L2c5Li657uZ5a6a5YWD57Sg55qE56ys5LiA5Liq5a2Q5YWD57SgKSA7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vICdiZWZvcmVFbmQnICjkvZzkuLrnu5nlrprlhYPntKDnmoTmnIDlkI7kuIDkuKrlrZDlhYPntKApIDsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2FmdGVyRW5kJyjmj5LlhaXliLDnu5nlrprlhYPntKDnmoTlkI7pnaIpOy4KICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7I2FwcGJhcicsCiAgICAgICAgICAgICAgICAgICAgLy8g6IulIGtleXdvcmQg5L2/55So5Ye95pWw6I635Y+WCiAgICAgICAgICAgICAgICAgICAgLy8ga2V5d29yZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB2YXIgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbHN0LWliJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChpbnB1dCkgcmV0dXJuIGlucHV0LnZhbHVlOwogICAgICAgICAgICAgICAgICAgIC8vIH0sCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJy8vaW5wdXRbQG5hbWU9InEiXScsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdiZWZvcmVCZWdpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgLy8g5L+u5pS55rqQ572R6aG155So5p2l6YCC5bqU6Lez6L2s5qCP77yI5Y+v6YCJ77yJCiAgICAgICAgICAgICAgICAvLyBzdHlsaXNoOiAnYm9keS52YXNxICNoZHRiTWVudXMuaGR0Yi10ZC1ve3RvcDoxMDBweCAhaW1wb3J0YW50O30gI2hkdGJNZW51c3t0b3A6OTJweDttYXJnaW4tdG9wOjMwcHg7fScKICAgICAgICAgICAgICAgIHN0eWxpc2g6ICcjYXBwYmFyLmhkdGItYWItb3toZWlnaHQ6MHB4ICFpbXBvcnRhbnQ7fSAjaGR0Yk1lbnVze3Bvc2l0aW9uOnVuc2V0fScKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJnb29nbGUtaGFzaC1xdWVyeSIsLy8g5LiN5Yi35paw6aG16Z2i5pi+56S65pCc57Si57uT5p6c55qEZ29vZ2xlCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvd3d3XC5nb29nbGUoPzpcLltBLXpdezIsM30pezEsMn1cL1teI10qIyg/OiY/cT18Lis/JnE9KS4rLywKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICd3ZWInLAogICAgICAgICAgICAgICAgc3R5bGU6ICdcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDE0MnB4O1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiAxMDA7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6NXB4O1wKICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICBzdHlsZV9BQ0JhaWR1OiAnXAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgei1pbmRleDogMTAwO1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOjVweDtcCiAgICAgICAgICAgICAgICAnLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsjYXBwYmFyJywKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsc3QtaWInKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0KSByZXR1cm4gaW5wdXQudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2JlZm9yZUJlZ2luJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzdHlsaXNoOiAnYm9keS52YXNxICNoZHRiTWVudXMuaGR0Yi10ZC1ve3RvcDoxMDBweCAhaW1wb3J0YW50fScKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLnmb7luqbnvZHpobXmkJzntKIiLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvd3d3XC5iYWlkdVwuY29tXC8oPzpzfGJhaWR1KS8sCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogIndlYiIsCiAgICAgICAgICAgICAgICBmaXhlZFRvcDo3MCwKICAgICAgICAgICAgICAgIGZpeGVkVG9wMjo4OCwKICAgICAgICAgICAgICAgIC8vIGZpeGVkVG9wVGFyZ2V0OiAiY3NzOy5zX2Zvcm0gIiwKICAgICAgICAgICAgICAgIGZpeGVkVG9wVGFyZ2V0OiAiY3NzOyN3cmFwcGVyX3dyYXBwZXIiLAogICAgICAgICAgICAgICAgLy8gZml4ZWRUb3BXaGVyZToiYmVmb3JlRW5kIiwKICAgICAgICAgICAgICAgIGZpeGVkVG9wV2hlcmU6ImJlZm9yZUJlZ2luIiwKICAgICAgICAgICAgICAgIHN0eWxlOiAnXAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6OHB4O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAtNXB4O1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiAxMDE7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAxNDRweDtcCiAgICAgICAgICAgICAgICAnLAogICAgICAgICAgICAgICAgc3R5bGVfQUNCYWlkdTogJ1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IC01cHg7XAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDk5O1wKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDowcHggIWltcG9ydGFudDtcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNDgsMjQ4LDI0OCwwLjQpO1wKICAgICAgICAgICAgICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7XAogICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnY3NzO2lucHV0I2t3JywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7I3NfdGFiJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyRW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzdHlsaXNoOiIuaGVhZEJsb2NrLC5zZV9jb21tb25faGludHtkaXNwbGF5Om5vbmUgIWltcG9ydGFudH0gI3dyYXBwZXI+LnJlc3VsdC1tb2xlY3VsZXt6LWluZGV4OjMwMCAhaW1wb3J0YW50fSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLlv4XlupTnvZHpobXmkJzntKIiLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvW14uXSpcLmJpbmdcLmNvbVwvc2VhcmNoLywKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAid2ViIiwKICAgICAgICAgICAgICAgIHN0eWxlOiAnXAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDoxNXB4O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOjZweDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDE0OHB4O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOi0xMHB4O1wKICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICBzdHlsZV9BQ0JhaWR1OiAnXAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IC0xMjBweDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAwcHg7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206LTIwcHg7XAogICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnY3NzOyNzYl9mb3JtX3EnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsjYl9jb250ZW50JywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2JlZm9yZUJlZ2luJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAiRERHIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL2R1Y2tkdWNrZ29cLmNvbVwvKi9pLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJ3ZWIiLAogICAgICAgICAgICAgICAgc3R5bGU6ICdcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDo1cHg7XAogICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnLy9pbnB1dFtAbmFtZT0icSJdJywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7LnJlc3VsdHMtLW1haW4nLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYmVmb3JlQmVnaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6IumbheiZjue9kemhteaQnOe0oiIsCiAgICAgICAgICAgICAgICB1cmw6L15odHRwcz86XC9cL3NlYXJjaFwueWFob29cLmNvbVwvc2VhcmNoL2ksCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiJ3ZWIiLAogICAgICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgICAgZml4ZWRUb3A6NTQsCiAgICAgICAgICAgICAgICBzdHlsZToiXAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OjEyMnB4O1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOnsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOidjc3M7I3lzY2hzcCcsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Oidjc3M7I2hvcml6b250YWwtYmFyJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTonYWZ0ZXJCZWdpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZToi6ZuF6JmO5pel5pys572R6aG15pCc57SiIiwKICAgICAgICAgICAgICAgIHVybDovXmh0dHBzPzpcL1wvc2VhcmNoXC55YWhvb1wuY29cLmpwXC9zZWFyY2gvaSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6IndlYiIsCiAgICAgICAgICAgICAgICBlbmFibGVkOnRydWUsCiAgICAgICAgICAgICAgICBzdHlsZToiXAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OjBweDtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6MTA1MHB4O1wKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OmZsZXg7XAogICAgICAgICAgICAgICAgICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XAogICAgICAgICAgICAgICAgICAgIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW46IGF1dG87XAogICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6ewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6Jy8vaW5wdXRbQG5hbWU9InAiXScsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Oidjc3M7LkhlYWRlcl9faW5uZXInLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOidhZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZToi5Y+w5rm+6ZuF6JmO572R6aG15pCc57SiIiwKICAgICAgICAgICAgICAgIHVybDovXmh0dHBzPzpcL1wvdHdcLnNlYXJjaFwueWFob29cLmNvbVwvc2VhcmNoL2ksCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiJ3ZWIiLAogICAgICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgICAgZml4ZWRUb3A6NTIsCiAgICAgICAgICAgICAgICBzdHlsZToiXAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0Oi0xMHB4O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOjEwcHg7XAogICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6ewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6J2NzczsjeXNjaHNwJywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6J2NzczsjcmVzdWx0cycsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6J2FmdGVyQmVnaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6InNlYXJ4IiwKICAgICAgICAgICAgICAgIHVybDovXmh0dHBzPzpcL1wvc2VhcnhcLm1lXC9cP3EvaSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6IndlYiIsCiAgICAgICAgICAgICAgICBlbmFibGVkOnRydWUsCiAgICAgICAgICAgICAgICBzdHlsZToiXAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0Oi0xMHB4O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOjEwcHg7XAogICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6ewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6J2NzczsjcScsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Oidjc3M7I2NhdGVnb3JpZXMnLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOidiZWZvcmVCZWdpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuaQnOeLlyIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC93d3dcLnNvZ291XC5jb21cLyg/OndlYnxzKS8sCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogIndlYiIsCiAgICAgICAgICAgICAgICBmaXhlZFRvcDo2MCwKICAgICAgICAgICAgICAgIHN0eWxlOiAiXAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6LTQ2cHg7XAogICAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5O1wKICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6LTVweDtcCiAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgc3R5bGVfQUNCYWlkdTogIlwKICAgICAgICAgICAgICAgICAgICAgICAgdG9wOi00NnB4O1wKICAgICAgICAgICAgICAgICAgICAgICAgei1pbmRleDo5OTtcCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OjYwcHg7XAogICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDBweCAhaW1wb3J0YW50O1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogImNzczsjdXBxdWVyeSIsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAiY3NzOyN3cmFwcGVyIiwKICAgICAgICAgICAgICAgICAgICB3aGVyZTogImFmdGVyQmVnaW4iLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHN0eWxpc2g6IiNmbG9hdF91cGhpbnR7ZGlzcGxheTpub25lO30iLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZToieWFuZGV4IiwKICAgICAgICAgICAgICAgIHVybDovXmh0dHBzPzpcL1wveWFuZGV4XC4oPzpjb218cnUpXC9zZWFyY2gvaSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6IndlYiIsCiAgICAgICAgICAgICAgICBlbmFibGVkOnRydWUsCiAgICAgICAgICAgICAgICBmaXhlZFRvcDo5NiwKICAgICAgICAgICAgICAgIGNsYXNzOiJtYWluX19jZW50ZXIiLAogICAgICAgICAgICAgICAgc3R5bGU6IlwKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6MHB4O1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOnsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOidjc3M7LmlucHV0X19jb250cm9sJywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6J2NzczsubWFpbicsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6J2JlZm9yZUJlZ2luJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzdHlsaXNoOiIubWFpbiAubWFpbl9fY2VudGVye3BhZGRpbmctdG9wOjBweH0iCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAiZ29vZ2xl572R6aG15YiG57G75pCc57SiIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC93d3dcLmdvb2dsZSg/OlwuW0Etel17MiwzfSl7MSwyfVwvW14/XStcPyg/OnRibT0pKD86Jj9xPXwoPzpbXiNdKD8hJnRibT0pKSs/JnE9KSg/Oi4oPyEmdGJtPSkpKiQvLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogJ3dlYicsCiAgICAgICAgICAgICAgICBzdHlsZTogJ1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogMTQycHg7XAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDEwMDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDo1cHg7XAogICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7I2FwcGJhcicsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJy8vaW5wdXRbQG5hbWU9InEiXScsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdiZWZvcmVCZWdpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3R5bGlzaDogJ2JvZHkudmFzcSAjaGR0Yk1lbnVzLmhkdGItdGQtb3t0b3A6MTAwcHggIWltcG9ydGFudH0nCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAic3RhcnRwYWdlIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICB1cmw6L15odHRwcz86XC9cLyh3d3dcLik/c3RhcnRwYWdlXC5jb21cL1thLXpBLVpdezIsM31cL3NlYXJjaC8sCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAnd2ViJywKICAgICAgICAgICAgICAgIGZpeGVkVG9wOjEwMywKICAgICAgICAgICAgICAgIHN0eWxlOiAnXAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDEwMDtcCiAgICAgICAgICAgICAgICAnLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsubGF5b3V0LXdlYl9fbWFpbmxpbmUnLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICcvL2lucHV0W0BuYW1lPSJxdWVyeSJdJywKICAgICAgICAgICAgICAgICAgICAvLyB3aGVyZTogJ2JlZm9yZUJlZ2luJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyQmVnaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJzdGFydHBhZ2UyIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICB1cmw6L15odHRwcz86XC9cL3d3d1wuc3RhcnRwYWdlXC5jb21cL2RvXC9hc2VhcmNoLywKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICd3ZWInLAogICAgICAgICAgICAgICAgZml4ZWRUb3A6IDEwMiwKICAgICAgICAgICAgICAgIGZpeGVkVG9wQ29sb3I6IiMyMDJjNDYiLAogICAgICAgICAgICAgICAgbmlnaHRNb2RlOiB0cnVlLAogICAgICAgICAgICAgICAgc3R5bGU6ICdcCiAgICAgICAgICAgICAgICAgICAgei1pbmRleDogMTAwO1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogMTM1cHg7XAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiNjY2M7XAogICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7LmxheW91dC13ZWJfX2hlYWRlcicsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJy8vaW5wdXRbQG5hbWU9InF1ZXJ5Il0nLAogICAgICAgICAgICAgICAgICAgIC8vIHdoZXJlOiAnYmVmb3JlQmVnaW4nLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYmVmb3JlRW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzdHlsaXNoOiIubGF5b3V0LXdlYl9fYm9keXttYXJnaW4tdG9wOjExMHB4O30iLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogImluZmluaXR5bmV3dGFiIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICB1cmw6L15odHRwcz86XC9cL2dvb2dsZVwuaW5maW5pdHluZXd0YWJcLmNvbVwvXD9xL2ksCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAnd2ViJywKICAgICAgICAgICAgICAgIHN0eWxlOiAnXAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDEwMDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMjBweDtcCiAgICAgICAgICAgICAgICAnLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2Nzczsuc2VhcmNoLXR5cGVzJywKICAgICAgICAgICAgICAgICAgICAvLyBrZXl3b3JkOiAnY3NzO2lucHV0LmdzYy1pbnB1dCcsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJy8vaW5wdXRbQG5hbWU9InNlYXJjaCJdJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyQmVnaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJlY29zaWEiLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIHVybDovXmh0dHBzPzpcL1wvd3d3XC5lY29zaWFcLm9yZ1wvc2VhcmNoXD8vaSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICd3ZWInLAogICAgICAgICAgICAgICAgc3R5bGU6ICdcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IC0xMHB4O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOiAtMjBweDtcCiAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxO1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7XAogICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7Lm1haW5saW5lJywKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnLy9pbnB1dFtAbmFtZT0icSJdJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyQmVnaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJm5pCcIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9mc291ZnNvdVwuY29tXC9zZWFyY2gvLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogJ3dlYicsCiAgICAgICAgICAgICAgICBmaXhlZFRvcDogMTExLAogICAgICAgICAgICAgICAgc3R5bGU6ICdcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDUwcHg7XAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IC05OTk5OTtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDo1cHg7XAogICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIHN0eWxlX0FDQmFpZHU6ICdcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiAtOTk5OTk7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6NXB4O1wKICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy5pbnB1dC13aXRoLXN1Z2dlc3Rpb24nLAogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYXJjaC1pbnB1dCcpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQpIHJldHVybiBpbnB1dC52YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYmVmb3JlRW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzdHlsaXNoOiAnLnRhYnMtYm90dG9tLWJvcmRlcnt0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAzMnB4KTsgIWltcG9ydGFudH0nCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAiYnJhdmUiLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vc2VhcmNoLmJyYXZlLmNvbS9zZWFyY2g/cT0wCiAgICAgICAgICAgICAgICB1cmw6L15odHRwcz86XC9cL3NlYXJjaFwuYnJhdmVcLmNvbVwvc2VhcmNoXD8vaSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICd3ZWInLAogICAgICAgICAgICAgICAgY2xhc3M6ICJjb250YWluZXItODAiLAogICAgICAgICAgICAgICAgc3R5bGU6ICdcCiAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxO1wKICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOyNzZWFyY2gtbWFpbicsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJy8vaW5wdXRbQG5hbWU9InEiXScsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdiZWZvcmVCZWdpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIm5lZXZhIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICAvLyBodHRwczovL25lZXZhLmNvbS9zZWFyY2g/cT0wCiAgICAgICAgICAgICAgICB1cmw6L15odHRwcz86XC9cL25lZXZhXC5jb21cL3NlYXJjaFw/L2ksCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAnd2ViJywKICAgICAgICAgICAgICAgIGZpeGVkVG9wOiA4MCwKICAgICAgICAgICAgICAgIHN0eWxlOiAnXAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTtcCiAgICAgICAgICAgICAgICAnLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2Nzczsjc2VhcmNoIGhlYWRlcicsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJy8vaW5wdXRbQG5hbWU9InEiXScsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8g55+l6K+GCiAgICAgICAgICAgIHtuYW1lOiAi55m+5bqm55m+56eR6K+N5p2hIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL2JhaWtlXC5iYWlkdVwuY29tXC9pdGVtLywKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJrbm93bGVkZ2UiLAogICAgICAgICAgICAgICAgZml4ZWRUb3A6NjUsCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmO1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzczsjcXVlcnknLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsubmF2YmFyLXdyYXBwZXInLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYmVmb3JlQmVnaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLnmb7luqbnmb7np5HmkJzntKIiLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvYmFpa2VcLmJhaWR1XC5jb21cL3NlYXJjaC8sCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAia25vd2xlZGdlIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBmaXhlZFRvcDo1NiwKICAgICAgICAgICAgICAgIHN0eWxlOiAiXAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMTIwcHg7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjogNXB4IDAgLTEwcHggMHB4O1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzczsjcXVlcnknLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsuaGVhZGVyLXdyYXBwZXInLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYWZ0ZXJFbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLnmb7luqbmloflupMiLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvd2Vua3VcLmJhaWR1XC5jb21cL3NlYXJjaC9pLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogImtub3dsZWRnZSIsCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZml4ZWRUb3A6IDk2LAogICAgICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogNnB4O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOi0xNnB4O1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjA7XAogICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2t3IikudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy5iZC13cmFwJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyQmVnaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLnmb7luqbnn6XpgZMiLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvemhpZGFvXC5iYWlkdVwuY29tXC9zZWFyY2gvaSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJrbm93bGVkZ2UiLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIHN0eWxlOiAiXAogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTVlNWU1O1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTVlNTtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMXB4O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDoxMTJweDtcCiAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdjc3M7I2t3JywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7I2hlYWRlcicsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIue7tOWfuueZvuenkSIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9cRHsyLDV9XC53aWtpcGVkaWFcLm9yZ1wvd2lraS9pLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogImtub3dsZWRnZSIsCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMTRlbTtcCiAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zdWJzdHJpbmcod2luZG93LmxvY2F0aW9uLmhyZWYubGFzdEluZGV4T2YoIi8iKSsxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmwpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsjbXctaGVhZCcsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckJlZ2luJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi55+l5LmOIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL3d3d1wuemhpaHVcLmNvbVwvc2VhcmNoXD8vaSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJrbm93bGVkZ2UiLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIGZpeGVkVG9wOjUyLAogICAgICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiA1cHggYXV0byAwcHg7XAogICAgICAgICAgICAgICAgICAgIHdpZHRoOjk2MHB4O1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjE5O1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmO1wKICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggMCByZ2JhKDAsMzQsNzcsLjA1KTsgIFwKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiA1cHggMjBweDsgXAogICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgIC8vIOWFvOWuueKAnOefpeS5juaOkueJiOS8mOWMluKAnQogICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy8yMTY1OQogICAgICAgICAgICAgICAgc3R5bGVfWmhpaHVDaGVuZ2xpbno6ICJcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiA1cHggYXV0byAwcHg7XAogICAgICAgICAgICAgICAgICAgIHdpZHRoOjY1NHB4O1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjE5O1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmO1wKICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggMCByZ2JhKDAsMzQsNzcsLjA1KTsgIFwKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiA1cHggMjBweDsgXAogICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnY3NzOy5JbnB1dCcsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiJjc3M7LkFwcC1tYWluIC5TZWFyY2hUYWJzIiwKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyRW5kJywgLy9iZWZvcmVCZWdpbgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHN0eWxpc2g6Ii5Ub3BTZWFyY2guQ2FyZHttYXJnaW46MzBweCBhdXRvO30iLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuS6kuWKqOeZvuenkeaQnOe0oumhtSIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9zb1wuYmFpa2VcLmNvbVwvZG9jL2ksCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAia25vd2xlZGdlIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBzdHlsZTogIlwKICAgICAgICAgICAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2U1ZTVlNTtcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTVlNTtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMXB4O1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzczsuYWNfaW5wdXQnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsuYmstaGVhZCcsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuS6kuWKqOeZvuenkeivjeadoemhtSIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC93d3dcLmJhaWtlXC5jb21cL3dpa2kvaSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJrbm93bGVkZ2UiLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIHN0eWxlOiAiXAogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZTVlNWU1O1wKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTVlNWU1O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxcHg7XAogICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnY3NzOy5hY19pbnB1dCcsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy5iay1oZWFkJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyRW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi6LGG5LiB5paH5qGjIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL3d3d1wuZG9jaW5cLmNvbVwvc2VhcmNoXC5kby8sCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAia25vd2xlZGdlIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBzdHlsZTogIlwKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjowIGF1dG87XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmctdG9wOjFweDtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXRvcDoxcHggc29saWQgIzAwMDAwO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjRDlFMUY3O1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzczsjdG9wc2VhcmNoJywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7LmRvY19oZF9taW5pJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyRW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi55+l5LmOKOaQnOeLlykiLAogICAgICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvemhpaHVcLnNvZ291XC5jb21cL3poaWh1LywKICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAnd2ViJywKICAgICAgICAgICAgICAgICAgIGZpeGVkVG9wOjU1LAogICAgICAgICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IGF1dG87XAogICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMDBweDtcCiAgICAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5O1wKICAgICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnY3NzOyN1cHF1ZXJ5JywKICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsjaGVhZGVyJywKICAgICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYWZ0ZXJFbmQnLAogICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgIHN0eWxpc2g6ICcuaGVhZGVyeyBtYXJnaW4tYm90dG9tOiA1cHg7IH0nCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi5b6u5L+h5pCc54uXIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL3dlaXhpblwuc29nb3VcLmNvbVwvd2VpeGluXD8vLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJ3ZWIiLAogICAgICAgICAgICAgICAgZml4ZWRUb3A6NTUsCiAgICAgICAgICAgICAgICBzdHlsZTogIndpZHRoOiAxMDAwcHg7bWFyZ2luOiA4cHggYXV0byAtNXB4O3otaW5kZXg6OTk7IiwKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAiLy9pbnB1dFtAbmFtZT0ncXVlcnknXSIsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAiY3NzOy5oZWFkZXItYm94IiwKICAgICAgICAgICAgICAgICAgICB3aGVyZTogImFmdGVyRW5kIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAiUXVvcmEiLAogICAgICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LnF1b3JhLmNvbS9zZWFyY2g/cT1jaGluYQogICAgICAgICAgICAgICAgdXJsOiAgL15odHRwcz86XC9cL3d3d1wucXVvcmFcLmNvbVwvc2VhcmNoXD8vaSwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAia25vd2xlZGdlIiwKICAgICAgICAgICAgICAgIGZpeGVkVG9wOjUzLAogICAgICAgICAgICAgICAgc3R5bGU6ICJ3aWR0aDogMTAwMHB4O21hcmdpbjogMHB4IGF1dG8gMHB4OyBwYWRkaW5nLWxlZnQ6MTgwcHg7IiwKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3Vic3RyaW5nKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmxhc3RJbmRleE9mKCI9IikrMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICJjc3M7LlNpdGVIZWFkZXIiLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAiYmVmb3JlRW5kIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAic3RhY2tvdmVyZmxvdyIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9zdGFja292ZXJmbG93XC5jb21cL3NlYXJjaFw/L2ksCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogImtub3dsZWRnZSIsCiAgICAgICAgICAgICAgICBmaXhlZFRvcDo1MCwKICAgICAgICAgICAgICAgIHN0eWxlOiAid2lkdGg6IDEwMDBweDttYXJnaW46IDhweCBhdXRvIDBweDt6LWluZGV4Ojk5OyIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogIi8vaW5wdXRbQG5hbWU9J3EnXSIsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAiY3NzOy50b3AtYmFyIiwKICAgICAgICAgICAgICAgICAgICB3aGVyZTogImFmdGVyRW5kIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgoKICAgICAgICAgICAgLy8g6KeG6aKR572R56uZCiAgICAgICAgICAgIHtuYW1lOiAi5LyY6YW3IiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL3d3d1wuc29rdVwuY29tXC9zZWFyY2hfdmlkZW9cLy8sCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAidmlkZW8iLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIGZpeGVkVG9wOjU0LAogICAgICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6MTE5MHB4O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW46MCBhdXRvO1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5O1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzczsjaGVhZHEnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2Nzczsuc2tfY29udGFpbmVyJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2JlZm9yZUJlZ2luJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi5Zyf6LGGIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL3d3d1wuc29rdVwuY29tXC90XC9uaXNlYXJjaFwvLywKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAidmlkZW8iLAogICAgICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4O1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI0ZDNjUwMDtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNGQzY1MDA7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdjc3M7I2hlYWRxJywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7Ym9keSA+IC5za19jb250YWluZXInLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYmVmb3JlQmVnaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLlk5Tlk6nlk5Tlk6kiLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvc2VhcmNoXC5iaWxpYmlsaVwuY29tXC9hbGwvLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJ2aWRlbyIsCiAgICAgICAgICAgICAgICAvLyBmaXhlZFRvcDo2MiwKICAgICAgICAgICAgICAgIHN0eWxlOiAiXAogICAgICAgICAgICAgICAgICAgIHdpZHRoOjk4MHB4O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW46MTBweCBhdXRvIC01cHg7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyO1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAgLy8ga2V5d29yZDogJ2Nzczsjc2VhcmNoLWtleXdvcmQnLCAgIC8v5penCiAgICAgICAgICAgICAgICAgICAgLy8gdGFyZ2V0OiAnY3NzOy5maWx0ZXItd3JhcCcsICAgICAvL+aXpwogICAgICAgICAgICAgICAgICAgIC8vIGtleXdvcmQ6ICdjc3M7LnNlYXJjaC1pbnB1dC1lbCcsCiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NlYXJjaC1rZXl3b3JkIikpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzZWFyY2gta2V5d29yZCIpLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnNlYXJjaC1pbnB1dC1lbCIpLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQ6ICdjc3M7LnNlYXJjaC1pbnB1dCcsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuaGVhZC1jb250YWluIikpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuaGVhZC1jb250YWluIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnNlYXJjaC1pbnB1dCIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyRW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAiQWNGdW4iLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvd3d3XC5hY2Z1blwuY25cL3NlYXJjaC8sCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInZpZGVvIiwKICAgICAgICAgICAgICAgIGZpeGVkVG9wOjQ2LAogICAgICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6OTgwcHg7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjogLTMwcHggMCAxMHB4IDA7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyO1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2Nzczsjc2VhcmNoLXRleHQtLXN0YW5kYWxvbmUnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2Nzczsuc2VhcmNoX19tYWluX19jb250YWluZXInLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYWZ0ZXJFbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJZb3VUdWJlIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL3d3d1wueW91dHViZVwuY29tXC9yZXN1bHRzLywKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAidmlkZW8iLAogICAgICAgICAgICAgICAgZml4ZWRUb3A6NTYsCiAgICAgICAgICAgICAgICBzdHlsZTogIlwKICAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6IDYycHg7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IC04MHB4O1wKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91ZDojZmZmO1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzcztpbnB1dCNzZWFyY2gnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsjcGFnZS1tYW5hZ2VyJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2JlZm9yZUJlZ2luJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAibmljb25pY28iLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvd3d3XC5uaWNvdmlkZW9cLmpwXC9zZWFyY2hcLy8sCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInZpZGVvIiwKICAgICAgICAgICAgICAgIHN0eWxlOiAiXAogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjRThFOEU4O1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0U4RThFODtcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2Nzczsjc2VhcmNoX3VuaXRlZCcsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy50YWdMaXN0Qm94JywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2JlZm9yZUJlZ2luJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAiSXFpeWkiLAogICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL3NvXC5pcWl5aVwuY29tXC9zb1wvcS8sCiAgICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAidmlkZW8iLAogICAgICAgICAgICAgICAgIGZpeGVkVG9wOjYwLAogICAgICAgICAgICAgICAgIHN0eWxlOiAnXAogICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46MCBhdXRvO1wKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6MTE4MHB4O1wKICAgICAgICAgICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzczsjZGF0YS13aWRnZXQtc2VhcmNod29yZCcsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy5tb2Rfc2VhcmNoX2hlYWRlcicsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckVuZCcKICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuiFvuiur+inhumikSIsCiAgICAgICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvdlwucXFcLmNvbVwveFwvc2VhcmNoL2ksCiAgICAgICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInZpZGVvIiwKICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGZpeGVkVG9wOjYwLAogICAgICAgICAgICAgICAgICAgIHN0eWxlOiAid2lkdGg6MTE0MHB4O21hcmdpbjowIGF1dG87IiwKICAgICAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2Nzczsja2V5d29yZHMnLAogICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2Nzczsuc2l0ZV9oZWFkX3NpbXBsZScsCiAgICAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckVuZCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLmqLHoirHliqjmvKsiLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvd3d3XC5pbW9tb2VcLmFpXC9zZWFyY2gvLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInZpZGVvIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBzdHlsZTogIiBcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6MTE0MHB4O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW46LTEwcHggYXV0byAxMHB4OyxcCiAgICAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnLy9pbnB1dFtAbmFtZT0ic2VhcmNod29yZCJdJywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7LmhlYWQnLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYWZ0ZXJFbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCgogICAgICAgICAgICAvLyDpn7PkuZAKICAgICAgICAgICAge25hbWU6ICLnmb7luqbpn7PkuZAiLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvbXVzaWNcLmJhaWR1XC5jb21cL3NlYXJjaC8sCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogIm11c2ljIiwKICAgICAgICAgICAgICAgIHN0eWxlOiAiXAogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IDBweCBzb2xpZCAjMDA2NEM0O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7XAogICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnY3NzOyN3dycsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy5uYXYtd3JhcHBlcicsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdiZWZvcmVCZWdpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuS4gOWQrOmfs+S5kCIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9zb1wuMXRpbmdcLmNvbVwvYWxsXC5kby8sCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogIm11c2ljIiwKICAgICAgICAgICAgICAgIHN0eWxlOiAiXAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMxM0IzMTA7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjMTNCMzEwO1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2Nzczsja2V5d29yZCcsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy5uYXYnLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYmVmb3JlQmVnaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJ4aWFtaSIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC93d3dcLnhpYW1pXC5jb21cL3NlYXJjaC8sCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogIm11c2ljIiwKICAgICAgICAgICAgICAgIHN0eWxlOiAiXAogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjOTNEM0ZGO1wKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XAogICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnY3NzOyNzZWFyY2hfdGV4dCcsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy5zZWFyY2hfcmVzdWx0JywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2JlZm9yZUJlZ2luJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAnUVHpn7PkuZAnLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvc1wubXVzaWNcLnFxXC5jb20vaSwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAnbXVzaWMnLAogICAgICAgICAgICAgICAgc3R5bGU6IlwKICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzJCNkRBRTtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICMyQjZEQUU7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdjc3M7I2tleXdvcmQnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsubW9kX3Nvc28nLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYWZ0ZXJFbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICfnvZHmmJPkupHpn7PkuZAnLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvbXVzaWNcLjE2M1wuY29tXC8uKj8jXC9zZWFyY2gvaSwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAnbXVzaWMnLAogICAgICAgICAgICAgICAgZml4ZWRUb3A6ODAsCiAgICAgICAgICAgICAgICBzdHlsZToiXAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy10b3A6OHB4O1wKICAgICAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6IChmdW5jdGlvbigpe3JldHVybiBkZWNvZGVVUkkoZG9jdW1lbnQuVVJMLm1hdGNoKC9zPSguKz8pKCZ8JCkvKVsxXSk7fSksCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy5tLXN1Ym5hdi5tLXN1Ym5hdi11cC5mLXByLmotdGZsYWcnLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYWZ0ZXJFbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICfpn7Pmgqblj7AnLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvc29cLnlpbnl1ZXRhaVwuY29tXC9cP2tleXdvcmQvLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICdtdXNpYycsCiAgICAgICAgICAgICAgICBzdHlsZToiXAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMkI2REFFO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgIzJCNkRBRTtcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wKICAgICAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnN1YnN0cmluZyh3aW5kb3cubG9jYXRpb24uaHJlZi5sYXN0SW5kZXhPZigiPSIpKzEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVybCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7LmNvbnRlbnQnLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYWZ0ZXJFbmQnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKCiAgICAgICAgICAgIC8vIOWbvueJhwogICAgICAgICAgICB7bmFtZTogIueZvuW6puWbvueJhyIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9pbWFnZVwuYmFpZHVcLmNvbVwvc2VhcmNoL2ksCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogImltYWdlIiwKICAgICAgICAgICAgICAgIGZpeGVkVG9wOjcwLCAgLy/lhbPpl63lhbPogZTogZTmg7PnmoTmg4XlhrXkuIsKICAgICAgICAgICAgICAgIC8vIGZpeGVkVG9wOjEzNSwgIC8vIAogICAgICAgICAgICAgICAgc3R5bGU6ICdcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6MTI3cHg7XAogICAgICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzcztpbnB1dCNrdycsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy5zX3RhYicsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuiwt+atjOWbvueJhyIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9cd3syLDEwfVwuZ29vZ2xlKD86XC5cRHsxLDN9KXsxLDJ9XC9bXj9dK1w/LiomdGJtPWlzY2gvaSwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAiaW1hZ2UiLAogICAgICAgICAgICAgICAgZml4ZWRUb3A6NTIsCiAgICAgICAgICAgICAgICBzdHlsZTogJ1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDoxMzZweDtcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMTBweCA1cHggMXB4IDIycHg7XAogICAgICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzcztpbnB1dFtuYW1lPXFdJywKICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQ6ICdjc3M7I3VjcycsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy5uZFlaZmMnLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYWZ0ZXJCZWdpbicsCiAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmU6ICdiZWZvcmVFbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLlv4XlupTlm77niYciLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvLipcLmJpbmdcLmNvbVwvaW1hZ2VzXC9zZWFyY2gvaSwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAiaW1hZ2UiLAogICAgICAgICAgICAgICAgc3R5bGU6ICdcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OjkwcHg7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6LTZweDtcCiAgICAgICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnY3NzOyNzYl9mb3JtX3EnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsjcmZQYW5lSW4nLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYWZ0ZXJCZWdpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogImZsaWNrciIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC93d3dcLmZsaWNrclwuY29tXC9zZWFyY2hcLy8sCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAiaW1hZ2UiLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIHN0eWxlOiAnXAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTk5OTtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6MTAwJTtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXRvcDoxcHggc29saWQgI0VCRjFGRjtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTowcHggc29saWQgI0VCRjFGRjtcCiAgICAgICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImF1dG9zdWdnZXN0LWlucHV0Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL3E9KFteJl0rKS9pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChtWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy51c2luZy1zbGVuZGVyLWFkdmFuY2VkLXBhbmVsJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyQmVnaW4nCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJwaXhpdiIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cDpcL1wvd3d3XC5waXhpdlwubmV0XC9zZWFyY2hcLnBocC9pLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogImltYWdlIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBzdHlsZTogJ1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDAgYXV0bztcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wKICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTog5b6u6L2v6ZuF6buRO1wKICAgICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzcztpbnB1dFtuYW1lPXdvcmRdJywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7Ym9keScsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdiZWZvcmVCZWdpbicKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi6Iqx55OjIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL2h1YWJhblwuY29tXC9zZWFyY2hcL1w/LywKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJpbWFnZSIsCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgc3R5bGU6ICdcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXRvcDoxcHggc29saWQgI0VCRjFGRjtcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wKICAgICAgICAgICAgICAgICAgICAnLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdjc3M7I3F1ZXJ5JywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7I3NlYXJjaF9zd2l0Y2gnLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYWZ0ZXJFbmQnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIlBpbnRlcmVzdCIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC93d3dcLnBpbnRlcmVzdFwuY29tXC9zZWFyY2hcLy8sCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAiaW1hZ2UiLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIHN0eWxlOiAnXAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDotMTFweDtcCiAgICAgICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnLy9pbnB1dFtAbmFtZT0icSJdJywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7LmhlYWRlckNvbnRhaW5lcicsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckVuZCcKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgoKICAgICAgICAgICAgLy8g6LWE5rqQ5LiL6L29CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5hbWU6ICfmtbfnm5fmub50aGVwaXJhdGViYXknLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvdGhlcGlyYXRlYmF5XC5vcmdcL3NlYXJjaC9pLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogJ2JpdHRvcnJlbnQnLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIHN0eWxlOiAnXAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgei1pbmRleDogOTk5OTtcCiAgICAgICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnY3NzOy5pbnB1dGJveCcsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOyNTZWFyY2hSZXN1bHRzJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2JlZm9yZUJlZ2luJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5hbWU6ICfliqjmvKvoirHlm60nLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvc2hhcmVcLmRtaHlcLm9yZ1wvdG9waWNzXC9saXN0XD9rZXl3b3JkXD0vaSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICdkb3dubG9hZCcsCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgc3R5bGU6ICdcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wKICAgICAgICAgICAgICAgICAgICAnLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdjc3M7I2tleXdvcmQnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsudGFibGUuY2xlYXInLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYmVmb3JlQmVnaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmFtZTogJ0VEMksnLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvd3d3XC5lZDIwMDBcLmNvbVwvZmlsZWxpc3RcLmFzcC9pLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogJ2Rvd25sb2FkJywKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2Nzczsuc2VhcmNodHh0JywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7LnRvcHNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuS6uuS6uuW9seinhiIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC93d3dcLnppbXV6dVwudHZcL3NlYXJjaFwvLywKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJkb3dubG9hZCIsCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgc3R5bGU6ICdcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMwMEFGRkY7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnLy9pbnB1dFtAbmFtZT0icSJdJywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7LkhlYWRlcicsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogInN1YkhE5a2X5bmVIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL3N1YmhkXC5jb21cL3NlYXJjaC9pLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogImRvd25sb2FkIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBzdHlsZTogIlwKICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAwcHggc29saWQgI0NBRDlFQTtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXRvcDogMHB4IHNvbGlkICNDQUQ5RUE7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgdG9wOiAtMjBweDtcCiAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdjc3M7I3NuJywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7Lm5hdmJhci5uYXZiYXItaW52ZXJzZScsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKCiAgICAgICAgICAgIC8v57+76K+R6K+N5YW4CiAgICAgICAgICAgIHtuYW1lOiAi6LC35q2M57+76K+RIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL3RyYW5zbGF0ZVwuZ29vZ2xlKD86XC5cRHsxLDR9KXsxLDJ9L2ksCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInRyYW5zbGF0ZSIsCiAgICAgICAgICAgICAgICBzdHlsZTogJ1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW46MTBweCAwcHggMHB4IDBweDtcCiAgICAgICAgICAgICAgICAnLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdjc3M7LkQ1YU9KYyAnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsuTU9rSDRlICcsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckJlZ2luJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi55m+5bqm57+76K+RIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL2ZhbnlpXC5iYWlkdVwuY29tL2ksCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInRyYW5zbGF0ZSIsCiAgICAgICAgICAgICAgICBzdHlsZTogJ1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW46IC0yMHB4IDAgMTBweCAwO1wKICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNiYWlkdV90cmFuc2xhdGVfaW5wdXQiKS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsuaW5uZXInLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYWZ0ZXJCZWdpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuW/heW6lOivjeWFuCIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC8uKlwuYmluZ1wuY29tXC9kaWN0XC9zZWFyY2hcP3FcPS9pLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJ0cmFuc2xhdGUiLAogICAgICAgICAgICAgICAgc3R5bGU6ICdcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OjE1cHg7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6NnB4O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogMTQ4cHg7XAogICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnY3NzOyNzYl9mb3JtX3EnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsjYl9oZWFkZXInLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYmVmb3JlRW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi5pyJ6YGT57+76K+RIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL2RpY3RcLnlvdWRhb1wuY29tXC9zZWFyY2gvaSwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAidHJhbnNsYXRlIiwKICAgICAgICAgICAgICAgIGZpeGVkVG9wOjY0LAogICAgICAgICAgICAgICAgc3R5bGU6ICdcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OjBweDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDoycHg7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyO1wKICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzczsjcXVlcnknLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsuYy10b3BiYXItd3JhcHBlcicsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdiZWZvcmVFbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLmnInpgZPnv7vor5EyIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL2RpY3RcLnlvdWRhb1wuY29tXC93L2ksCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInRyYW5zbGF0ZSIsCiAgICAgICAgICAgICAgICBmaXhlZFRvcDo2NCwKICAgICAgICAgICAgICAgIHN0eWxlOiAnXAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDowcHg7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6MnB4O1wKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjtcCiAgICAgICAgICAgICAgICAnLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdjc3M7I3F1ZXJ5JywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7LmMtdG9wYmFyLXdyYXBwZXInLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYmVmb3JlRW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi5rW36K+NIiwKICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvZGljdFwuY25cLy4vLAogICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAidHJhbnNsYXRlIiwKICAgICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgICAgei1pbmRleCA6IDk5O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4gOiAtMzBweCBhdXRvIDA7XAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIDogYWJzb2x1dGU7XAogICAgICAgICAgICAgICAgICAgIHdpZHRoIDogMTAwJTtcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbiA6IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnY3NzOyNxJywKICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsudG9wJywKICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYWZ0ZXJFbmQnCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICB9LAogICAgICAgICAgIHtuYW1lOiAi6YeR5bGx6K+N6Zy4IiwKICAgICAgICAgICAgICAgIC8vICAgIGh0dHBzOi8vd3d3LmljaWJhLmNvbS93b3JkP3c9dGVzdAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvd3d3XC5pY2liYVwuY29tXC93b3JkL2ksCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInRyYW5zbGF0ZSIsCiAgICAgICAgICAgICAgICBmaXhlZFRvcDoxMjIsCiAgICAgICAgICAgICAgICBzdHlsZTogJ1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4IDogMDtcCiAgICAgICAgICAgICAgICAnLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICcvL2lucHV0W0B0eXBlPSJzZWFyY2giXScsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy5TZWFyY2hfaW5wdXRfXzFxZ2lVJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyRW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyDotK3niakKICAgICAgICAgICAge25hbWU6ICLmt5jlrp3mkJzntKIiLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvc1wudGFvYmFvXC5jb21cL3NlYXJjaC8sCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInNob3BwaW5nIiwKICAgICAgICAgICAgICAgIHN0eWxlOiAiXAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHggMCAtMTBweCAxNzBweDtcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiA5OTtcCiAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3EnKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IGxvY2F0aW9uLnNlYXJjaC5tYXRjaCgvcT0oW14mXSspLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChtWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7LmhlYWRlci13cmFwZXInLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYWZ0ZXJFbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLlpKnnjKvotoXluILmkJzntKIiLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvbGlzdFwudG1hbGxcLmNvbVwvc2VhcmNoX3Byb2R1Y3RcLmh0bS4qZnJvbT1jaGFvc2hpL2ksCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInNob3BwaW5nIiwKICAgICAgICAgICAgICAgIGZpeGVkVG9wOjM3LAogICAgICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgICAgei1pbmRleDo5OTk5O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDJweCBhdXRvIC0xMHB4O1wKICAgICAgICAgICAgICAgICAgICBsZWZ0OjA7XAogICAgICAgICAgICAgICAgICAgIHJpZ2h0OjA7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyO1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTtcCiAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdjc3M7I21xJywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7LmhlYWRlckNvbicsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdiZWZvcmVCZWdpbicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuWkqeeMq+aQnOe0oiIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9saXN0XC50bWFsbFwuY29tXC9zZWFyY2hfcHJvZHVjdFwuaHRtL2ksCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInNob3BwaW5nIiwKICAgICAgICAgICAgICAgIGZpeGVkVG9wOjM0LAogICAgICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAxMHB4IGF1dG8gLTEwcHg7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyO1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzczsjbXEnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsuaGVhZGVyQ29uJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2JlZm9yZUJlZ2luJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi5Lqs5LicIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL3NlYXJjaFwuamRcLmNvbVwvU2VhcmNoLywKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAic2hvcHBpbmciLAogICAgICAgICAgICAgICAgc3R5bGU6IlwKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjsgXAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6IDVweDsgXAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IC0yMHB4OyBcCiAgICAgICAgICAgICAgICAgICAgIiwKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnY3NzOyNrZXknLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2Nzczsjby1oZWFkZXItMjAxMycsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuiLj+WugSIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9zZWFyY2hcLnN1bmluZ1wuY29tL2ksCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInNob3BwaW5nIiwKICAgICAgICAgICAgICAgIHN0eWxlOiAiXAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRTVFNUU1O1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI0U1RTVFNTtcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2Nzczsjc2VhcmNoS2V5d29yZHNIaWRkZW4nLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsubmctdG9vbGJhcicsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIjHlj7flupciLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvc2VhcmNoXC55aGRcLmNvbVwvYzAtMFwvay9pLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJzaG9wcGluZyIsCiAgICAgICAgICAgICAgICBzdHlsZTogIlwKICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0U1RTVFNTtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNFNUU1RTU7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdjc3M7I2tleXdvcmQnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsjZ2xvYmFsX3RvcF9iYXInLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOiAnYWZ0ZXJFbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLku4DkuYjlgLzlvpfkubAiLAogICAgICAgICAgICAgICAvLyBodHRwOi8vc2VhcmNoLnNtemRtLmNvbS8/Yz1ob21lJnM9JUU4JUE1JUJGJUU2JUI4JUI4JUU4JUFFJUIwCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9zZWFyY2hcLnNtemRtXC5jb21cL1w/L2ksCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInNob3BwaW5nIiwKICAgICAgICAgICAgICAgIGZpeGVkVG9wOjQwLAogICAgICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW46IC0xNXB4IDAgMTBweCAwO1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzczsjSl9zZWFyY2hfaW5wdXQnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2Nzczsuc2VhcmNoLWlubmVyJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyRW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi5Lqa6ams6YCKIiwKICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cuYW1hem9uLmNuL3M/az0lRTQlQkElOUElRTklQTklQUMlRTklODAlOEElRTclQkQlOTEKICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL3d3d1wuYW1hem9uXC5jblwvc1w/ay9pLAogICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJzaG9wcGluZyIsCiAgICAgICAgICAgICBzdHlsZTogIlwKICAgICAgICAgICAgICAgICBtYXJnaW46MnB4IDAgLTEwcHggMDtcCiAgICAgICAgICAgICAiLAogICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdjc3M7I3R3b3RhYnNlYXJjaHRleHRib3gnLAogICAgICAgICAgICAgICAgIHRhcmdldDogJ2Nzczsuc2ctcm93JywKICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyQmVnaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIHtuYW1lOiAiMTY4OCIsCiAgICAgICAgICAgIC8vIGh0dHBzOi8vcy4xNjg4LmNvbS9zZWxsb2ZmZXIvb2ZmZXJfc2VhcmNoLmh0bT9rZXl3b3Jkcz0lCiAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9zXC4xNjg4XC5jb21cL3NlbGxvZmZlclwvb2ZmZXJfc2VhcmNoL2ksCiAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgZW5naW5lTGlzdDogInNob3BwaW5nIiwKICAgICAgICAgICAgIGZpeGVkVG9wOjg4LAogICAgICAgICAgICAgY2xhc3M6InRhYi1jb250YWluZXIiLAogICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgbWFyZ2luOi0xMHB4IGF1dG8gNXB4O1wKICAgICAgICAgICAgICIsCiAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAga2V5d29yZDogJy8vaW5wdXRbQG5hbWU9ImtleXdvcmRzIl0nLAogICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsuaGVhZGVyLWNvbnRhaW5lcicsCiAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuaFouaFouS5sCIsCiAgICAgICAgICAgIC8vIGh0dHA6Ly9zcy5tYW5tYW5idXkuY29tL0RlZmF1bHQuYXNweD9rZXk9JXMKICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL3NzXC5tYW5tYW5idXlcLmNvbVwvRGVmYXVsdFwuYXNweFw/a2V5L2ksCiAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgZW5naW5lTGlzdDogInNob3BwaW5nIiwKICAgICAgICAgICAgIHN0eWxlOiAiXAogICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyO1wKICAgICAgICAgICAgICIsCiAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAga2V5d29yZDogJy8vaW5wdXRbQG5hbWU9ImtleSJdJywKICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7I3Jlc3VsdGNvbW1lbnQnLAogICAgICAgICAgICAgICAgIHdoZXJlOiAnYmVmb3JlQmVnaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCgogICAgICAgICAgICAvL+ekvuS6pAogICAgICAgICAgICB7bmFtZTogIuaWsOa1quW+ruWNmiIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9zXC53ZWlib1wuY29tXC93ZWlib1wvL2ksCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInNvY2lhbGl0eSIsCiAgICAgICAgICAgICAgICBmaXhlZFRvcDo0OCwKICAgICAgICAgICAgICAgIHN0eWxlOiAiXAogICAgICAgICAgICAgICAgICAgIC8vIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRTVFNUU1O1wKICAgICAgICAgICAgICAgICAgICAvLyBib3JkZXItdG9wOiAxcHggc29saWQgI0U1RTVFNTtcCiAgICAgICAgICAgICAgICAgICAgLy8gdGV4dC1hbGlnbjogY2VudGVyO1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2Nzczsuc2VhcmNoSW5wX2Zvcm0nLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsjcGxfY29tbW9uX3NlYXJjaFRvcCcsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6ICdhZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIueZvuW6pui0tOWQpyIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC90aWViYVwuYmFpZHVcLmNvbVwvZlwvc2VhcmNoL2ksCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInNvY2lhbGl0eSIsCiAgICAgICAgICAgICAgICBzdHlsZTogIlwKICAgICAgICAgICAgICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2U1ZTVlNTtcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2U1ZTVlNTtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMXB4O1wKICAgICAgICAgICAgICAgICIsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2Nzczsjd2QxJywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7LnNfY29udGFpbmVyLmNsZWFyZml4JywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2JlZm9yZUJlZ2luJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi6LGG55OjMSIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC8obW92aWV8bXVzaWN8Ym9vaylcLmRvdWJhblwuY29tXC9zdWJqZWN0X3NlYXJjaD8vLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJzb2NpYWxpdHkiLAogICAgICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNWU1ZTU7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDFweDtcCiAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdjc3M7I2lucC1xdWVyeScsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy5uYXYtc2Vjb25kYXJ5JywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyRW5kJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLosYbnk6MyIiwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL3d3d1wuZG91YmFuXC5jb21cL3NlYXJjaC9pLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJzb2NpYWxpdHkiLAogICAgICAgICAgICAgICAgc3R5bGU6ICJcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlNWU1ZTU7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlNWU1ZTU7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDFweDtcCiAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICdjc3M7I2lucCcsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOyNkYi1nbG9iYWwtbmF2JywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyRW5kJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCgogICAgICAgICAgICAvL+Wtpuacr+aQnOe0ouWIl+ihqAogICAgICAgICAgICB7bmFtZTogIueZvuW6puWtpuacryIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC94dWVzaHVcLmJhaWR1XC5jb21cLyg/OnN8YmFpZHUpLywKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAic2Nob2xhciIsCiAgICAgICAgICAgICAgICBzdHlsZTogJ1wKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjowcHg7XAogICAgICAgICAgICAgICAgICAgIHRvcDowcHg7XAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5OTk7XAogICAgICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzcztpbnB1dCNrdycsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOyNoZWFkX3dyJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2FmdGVyRW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi6LC35q2M5a2m5pyvIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9zY2hvbGFyXC5nb29nbGUoPzpcLlxEezEsM30pezEsMn1cL3NjaG9sYXJcPy8sCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAic2Nob2xhciIsCiAgICAgICAgICAgICAgICBzdHlsZTogJ1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246cmVsYXRpdmU7XAogICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdjc3M7I2dzX2FiJywKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOiAnLy9pbnB1dFtAbmFtZT0icSJdJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2JlZm9yZUJlZ2luJwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogImNua2kiLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHA6XC9cL3NlYXJjaFwuY25raVwubmV0XC9zZWFyY2hcLmFzcHgvaSwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAic2Nob2xhciIsCiAgICAgICAgICAgICAgICBzdHlsZTogJ1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6MTVweDtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXRvcDoxcHggc29saWQgI0Q5RTFGNztcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI0Q5RTFGNztcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDotMXB4O1wKICAgICAgICAgICAgICAgICAgICAnLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6J2NzczsjdHh0U2VhcmNoS2V5JywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6J2NzczsubWFpbicsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6J2FmdGVyQmVnaW4nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLnn6XnvZEiLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIHVybDogL15odHRwOlwvXC9lcHViXC5jbmtpXC5uZXRcL2tuc1wvYnJpZWZcL2RlZmF1bHRfcmVzdWx0XC5hc3B4L2ksCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAic2Nob2xhciIsCiAgICAgICAgICAgICAgICBzdHlsZTogJ1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjRTVFNUU1O1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItdG9wOjFweCBzb2xpZCAjRTVFNUU1O1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246cmVsYXRpdmU7XAogICAgICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDonY3NzOyN0eHRfMV92YWx1ZTEnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDonY3NzOyNUb3BTZWFyY2hCYXInLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOidhZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi5LiH5pa5IiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9zXC5nXC53YW5mYW5nZGF0YVwuY29tXC5jblwvUGFwZXJcLmFzcHgvaSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJzY2hvbGFyIiwKICAgICAgICAgICAgICAgIHN0eWxlOiAnXAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNFNUU1RTU7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6MXB4IHNvbGlkICNFNUU1RTU7XAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5O1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcCiAgICAgICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOidjc3M7I3F1ZXJ5Qm94JywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6J2NzczsjY29udGVudCcsCiAgICAgICAgICAgICAgICAgICAgd2hlcmU6J2JlZm9yZUJlZ2luJywKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJFQlNDTyIsCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHA6XC9cLy4qP2Vic2NvaG9zdFwuY29tXC8uKj9yZXN1bHRzL2ksCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAic2Nob2xhciIsCiAgICAgICAgICAgICAgICBzdHlsZTogJ1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjRTVFNUU1O1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItdG9wOjFweCBzb2xpZCAjRTVFNUU1O1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcCiAgICAgICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOidjc3M7I1NlYXJjaFRlcm0xJywKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6J2NzczsjZmluZEZpZWxkT3V0ZXInLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOidhZnRlcmVuZCcsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAiU3ByaW5nZXIiLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIHVybDogL15odHRwOlwvXC9saW5rXC5zcHJpbmdlclwuY29tXC9zZWFyY2hcP3F1ZXJ5PS9pLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDogInNjaG9sYXIiLAogICAgICAgICAgICAgICAgc3R5bGU6ICdcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI0U1RTVFNTtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXRvcDoxcHggc29saWQgI0U1RTVFNTtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246cmVsYXRpdmU7XAogICAgICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDonY3NzOyNxdWVyeScsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Oidjc3M7I2NvbnRlbnQnLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOidiZWZvcmVCZWdpbicsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAiSlNUT1IiLAogICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIHVybDogL15odHRwcz86Lio/anN0b3Iub3JnXC9hY3Rpb25cL2RvQWR2YW5jZWRTZWFyY2gvaSwKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICJzY2hvbGFyIiwKICAgICAgICAgICAgICAgIHN0eWxlOiAnXAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNFNUU1RTU7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6MXB4IHNvbGlkICNFNUU1RTU7XAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlO1wKICAgICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICBpbnNlcnRJbnRvRG9jOiB7CiAgICAgICAgICAgICAgICAgICAga2V5d29yZDonY3NzOyNzZWFyY2hCb3gnLAogICAgICAgICAgICAgICAgICAgIHRhcmdldDonY3NzOy50YWJzLXNlYXJjaC1yZXN1bHRzJywKICAgICAgICAgICAgICAgICAgICB3aGVyZTonYmVmb3JlQmVnaW4nLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy9odG1sIOWIl+ihqAogICAgICAgICAgICB7bmFtZTogInczYyIsCiAgICAgICAgICAgICAgICBlbmFibGVkOnRydWUsCiAgICAgICAgICAgICAgICB1cmw6L15odHRwcz86Lio/cnVub29iXC5jb21cLy9pLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDoibWluZSIsCiAgICAgICAgICAgICAgICBzdHlsZTogJ1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOjFweCBzb2xpZCAjRTVFNUU1O1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItdG9wOjFweCBzb2xpZCAjRTVFNUU1O1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7XAogICAgICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgICBrZXl3b3JkOmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnN1YnN0cmluZyh3aW5kb3cubG9jYXRpb24uaHJlZi5sYXN0SW5kZXhPZigiPSIpKzEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Oidjc3M7Lm5hdmlnYXRpb24nLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOidhZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5hbWU6ICJHaXRIdWIiLAogICAgICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgICAgdXJsOi9eaHR0cHM/OlwvXC9naXRodWJcLmNvbVwvc2VhcmNoLywKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6Im1pbmUiLAogICAgICAgICAgICAgICAgc3R5bGU6J1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7XAogICAgICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAga2V5d29yZDonLy9pbnB1dFtAbmFtZT0icSJdJywKICAgICAgICAgICAgICAgICAgIHRhcmdldDonY3NzOy5IZWFkZXInLAogICAgICAgICAgICAgICAgICAgd2hlcmU6J2FmdGVyRW5kJywKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuYW1lOiAiTUROIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6dHJ1ZSwKICAgICAgICAgICAgICAgIHVybDovXmh0dHBzPzpcL1wvZGV2ZWxvcGVyXC5tb3ppbGxhXC5vcmdcLy57Miw1fVwvc2VhcmNoLywKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6Im1pbmUiLAogICAgICAgICAgICAgICAgc3R5bGU6J1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7XAogICAgICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAga2V5d29yZDpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zdWJzdHJpbmcod2luZG93LmxvY2F0aW9uLmhyZWYubGFzdEluZGV4T2YoIj0iKSsxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgdGFyZ2V0Oidjc3M7LnJlc3VsdHMtc2VhcmNoLWZvcm0nLAogICAgICAgICAgICAgICAgICAgd2hlcmU6J2FmdGVyRW5kJywKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8g5YW25LuW6KGl5YWF77yMIOi/meS4quiEmuacrOWwhuS8muacnemHjeWei+aWueWQkeWPkeWxle+8jOWmguaenOWrjOW8g+S7o+eggei/h+Wkmu+8jOWPr+iHquihjOWIoOWHj+aXoOeUqOS7o+eggQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuYW1lOiAiaW5maW5pdHluZXd0YWIiLAogICAgICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgICAgLy9odHRwczovL2dvb2dsZS5pbmZpbml0eW5ld3RhYi5jb20vP3E96Iu55p6cCiAgICAgICAgICAgICAgICB1cmw6L15odHRwcz86XC9cL2dvb2dsZVwuaW5maW5pdHluZXd0YWJcLmNvbVwvXD9xLywKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6IndlYiIsCiAgICAgICAgICAgICAgICBzdHlsZTonXAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyO1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpmaXhlZDtcCiAgICAgICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTtcCiAgICAgICAgICAgICAgICAgICAgdG9wOjA7XAogICAgICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnY3NzOy5zZWFyY2hib3gtcmVzdWx0cycsCiAgICAgICAgICAgICAgICAgICAvLyBrZXl3b3JkOiAnLy9pbnB1dFtAbmFtZT0ic2VhcmNoIl0nLAogICAgICAgICAgICAgICAgICAga2V5d29yZDogJ2NzcztpbnB1dC5nc2MtaW5wdXQnLAogICAgICAgICAgICAgICAgICAgd2hlcmU6ICdiZWZvcmVCZWdpbicsCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmFtZTogIuWktOadoeaQnOe0oiIsCiAgICAgICAgICAgICAgICAvL2h0dHBzOi8vc28udG91dGlhby5jb20vc2VhcmNoCiAgICAgICAgICAgICAgICB1cmw6L15odHRwcz86XC9cL3NvXC50b3V0aWFvXC5jb21cL3NlYXJjaC8sCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiJ3ZWIiLAogICAgICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgICAgZml4ZWRUb3A6NzUsCiAgICAgICAgICAgICAgICBzdHlsZTonXAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OjE0NnB4O1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5O1wKICAgICAgICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsucmVzdWx0LWNvbnRlbnQnLAogICAgICAgICAgICAgICAgICAgLy8ga2V5d29yZDogJy8vaW5wdXRbQG5hbWU9InNlYXJjaCJdJywKICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ICcvL2lucHV0W0B0eXBlPSJzZWFyY2giXScsCiAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2JlZm9yZUVuZCcsCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmFtZTogIuaKlumfs+aQnOe0oiIsICAgCiAgICAgICAgICAgICAgICAvL2h0dHBzOi8vd3d3LmRvdXlpbi5jb20vc2VhcmNoLwogICAgICAgICAgICAgICAgdXJsOi9eaHR0cHM/OlwvXC93d3dcLmRvdXlpblwuY29tXC9zZWFyY2gvLAogICAgICAgICAgICAgICAgZW5naW5lTGlzdDoid2ViIiwKICAgICAgICAgICAgICAgIGVuYWJsZWQ6dHJ1ZSwKICAgICAgICAgICAgICAgIGZpeGVkVG9wOjE3NSwKICAgICAgICAgICAgICAgIGZpeGVkVG9wQ29sb3I6InJnYigyMiAyMyAzNCkiLAogICAgICAgICAgICAgICAgc3R5bGU6J1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW46LTEwcHggMCAwIC02cHg7XAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5OTk7XAogICAgICAgICAgICAgICAgICAgJywKICAgICAgICAgICAgICAgIGluc2VydEludG9Eb2M6IHsKICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsuQ0hVVXlBTmMnLAogICAgICAgICAgICAgICAgICAgLy8ga2V5d29yZDogJy8vaW5wdXRbQG5hbWU9InNlYXJjaCJdJywKICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPSJ0ZXh0Il0nKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQpIHJldHVybiBpbnB1dC52YWx1ZTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICB3aGVyZTogJ2JlZm9yZUVuZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3R5bGlzaDpgLkoxMjJZdU9Ne3BhZGRpbmctdG9wOjE0cHh9CiAgICAgICAgICAgICAgICAgICAgYm9keSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC0tZm9udC1jb2xvci1xeGluOiNjY2M7CiAgICAgICAgICAgICAgICAgICAgICAgIC0tYmFja2dyb3VuZC1jb2xvci1xeGluOiAjMTYxNzIyOwogICAgICAgICAgICAgICAgICAgICAgICAtLWJhY2tncm91bmQtYXZ0aXZlLWNvbG9yLXF4aW46ICM0MjQyNDI7CiAgICAgICAgICAgICAgICAgICAgICAgIC0tYmFja2dyb3VuZC1hY3RpdmUtZW5hYmxlLXF4aW46IzI3NDE0NDsKICAgICAgICAgICAgICAgICAgICAgICAgLS1iYWNrZ3JvdW5kLWFjdGl2ZS1kaXNhYmxlLXF4aW46IzU4MzUzNTsKICAgICAgICAgICAgICAgICAgICAgICAgLS1iYWNrZ3JvdW5kLWhvdmVyLWNvbG9yLXF4aW46ICM0MjQyNDI7CiAgICAgICAgICAgICAgICAgICAgICAgIC0tdHJpZ2dlci1zaG93bi1xeGluOiAjNDI0MjQyICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC0tc2VqLWRyb3AtbGlzdC1iYWNrZ3JvdW5kLXF4aW46cmdiYSgwLDAsMCwwLjcpOwogICAgICAgICAgICAgICAgICAgICAgICAtLWJhY2tncm91bmQtYnRuLXF4aW46IzI5MmYzNjsKICAgICAgICAgICAgICAgICAgICAgICAgLS1iYWNrZ3JvdW5kLXNldHRpbmctcXhpbjogIzE2MTcyMjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gIOeUqOaIt+ihpeWFhToga2lkemd5CiAgICAgICAgICAgIC8vICBodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvMjc3NTIvZGlzY3Vzc2lvbnMvOTA0OTcKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmFtZTogIuS8geafpeafpSIsCiAgICAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC93d3dcLnFjY1wuY29tXC8oPzp3ZWJ8ZmlybXwpLywKICAgICAgICAgICAgICAgIGVuZ2luZUxpc3Q6ICdlbnRlcnByaXNlJywKICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBmaXhlZFRvcDo1NiwKICAgICAgICAgICAgICAgIHN0eWxlOiAnXAogICAgICAgICAgICAgICAgICAgIHdpZHRoOjEyNTBweDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwIGF1dG87XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMTVweDtcCiAgICAgICAgICAgICAgICAnLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAga2V5d29yZDogJ2Nzczsjc2VhcmNoS2V5JywKICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsuYXBwLW5oZWFkZXInLAogICAgICAgICAgICAgICAgd2hlcmU6ICdBZnRlckVuZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3R5bGlzaDogJyAuYmlnc2VhcmNoLW5hdi5maXhlZCA+IC5uYXYtd3JhcCB7IHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDsgfScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5hbWU6ICLlpKnnnLzmn6UiLAogICAgICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvd3d3XC50aWFueWFuY2hhXC5jb21cLyg/OnNlYXJjaHxjb21wYW55KS8sCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0OiAnZW50ZXJwcmlzZScsCiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgZml4ZWRUb3A6NzMsCiAgICAgICAgICAgICAgICBzdHlsZTogJ1wKICAgICAgICAgICAgICAgICAgICB0b3A6ODBweDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwIGF1dG87XAogICAgICAgICAgICAgICAgICAgIHdpZHRoOjEyNDhweDtcCiAgICAgICAgICAgICAgICAnLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAga2V5d29yZDogJ2NzczsjaGVhZGVyLWNvbXBhbnktc2VhcmNoJywKICAgICAgICAgICAgICAgIHRhcmdldDogJ2NzczsudHljLWhlYWRlcicsCiAgICAgICAgICAgICAgICB3aGVyZTogJ0FmdGVyRW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzdHlsaXNoOiAnI3dlYi1jb250ZW50Lm10MTIye21hcmdpbi10b3A6OTBweCAhaW1wb3J0YW50fSAuc2VhcmNoLWJhcntwb3NpdGlvbjpzdGF0aWMgIWltcG9ydGFudH0nLAogICAgICAgICAgICB9LAoKCiAgICAgICAgICAgIC8vIOWbnuWutuayoee9kSznlKg4MDkw56uv5Y+j56a757q/5rWL6K+V5L2/55So44CCCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5hbWU6InRlc3QiLAogICAgICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgICAgdXJsOi9eaHR0cHM/OlwvXC8xMjdcLjBcLjBcLjE6ODA5MFwvLi8sCiAgICAgICAgICAgICAgICBzdHlsZToiXAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjoxNTBweDtcCiAgICAgICAgICAgICAgICAiLAogICAgICAgICAgICAgICAgaW5zZXJ0SW50b0RvYzogewogICAgICAgICAgICAgICAgICAgIGtleXdvcmQ6ZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9LAogICAgICAgICAgICAgICAgICAgIHRhcmdldDonY3NzO2JvZHknLAogICAgICAgICAgICAgICAgICAgIHdoZXJlOidiZWZvcmVFbmQnLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgXTsKICAgICAgICAKICAgICAgICAvLyDmnInkupvlm77moIfpnIDopoHph43lpI3kvb/nlKgKICAgICAgICB2YXIgaWNvbiA9e307CiAgICAgICAgaWNvbiA9IHsKICAgICAgICAgICAgZ29vZ2xlOiJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDJTNGeG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04JyUzRiUzRSUzQyEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE1LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgLS0lM0UlM0MhRE9DVFlQRSBzdmcgUFVCTElDICctLy9XM0MvL0RURCBTVkcgMS4xLy9FTicgJ2h0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCclM0UlM0NzdmcgdmVyc2lvbj0nMS4xJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHhtbG5zOnhsaW5rPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJyB4PScwcHgnIHk9JzBweCcgd2lkdGg9JzQ4cHgnIGhlaWdodD0nNDhweCcgdmlld0JveD0nMCAwIDQ4IDQ4JyBlbmFibGUtYmFja2dyb3VuZD0nbmV3IDAgMCA0OCA0OCcgeG1sOnNwYWNlPSdwcmVzZXJ2ZSclM0UlM0NwYXRoIGZpbGw9JyUyM0ZGQzEwNycgZD0nTTQzLjYxMSwyMC4wODNINDJWMjBIMjR2OGgxMS4zMDNjLTEuNjQ5LDQuNjU3LTYuMDgsOC0xMS4zMDMsOGMtNi42MjcsMC0xMi01LjM3My0xMi0xMiBjMC02LjYyNyw1LjM3My0xMiwxMi0xMmMzLjA1OSwwLDUuODQyLDEuMTU0LDcuOTYxLDMuMDM5bDUuNjU3LTUuNjU3QzM0LjA0Niw2LjA1MywyOS4yNjgsNCwyNCw0QzEyLjk1NSw0LDQsMTIuOTU1LDQsMjQgYzAsMTEuMDQ1LDguOTU1LDIwLDIwLDIwYzExLjA0NSwwLDIwLTguOTU1LDIwLTIwQzQ0LDIyLjY1OSw0My44NjIsMjEuMzUsNDMuNjExLDIwLjA4M3onLyUzRSUzQ3BhdGggZmlsbD0nJTIzRkYzRDAwJyBkPSdNNi4zMDYsMTQuNjkxbDYuNTcxLDQuODE5QzE0LjY1NSwxNS4xMDgsMTguOTYxLDEyLDI0LDEyYzMuMDU5LDAsNS44NDIsMS4xNTQsNy45NjEsMy4wMzlsNS42NTctNS42NTcgQzM0LjA0Niw2LjA1MywyOS4yNjgsNCwyNCw0QzE2LjMxOCw0LDkuNjU2LDguMzM3LDYuMzA2LDE0LjY5MXonLyUzRSUzQ3BhdGggZmlsbD0nJTIzNENBRjUwJyBkPSdNMjQsNDRjNS4xNjYsMCw5Ljg2LTEuOTc3LDEzLjQwOS01LjE5MmwtNi4xOS01LjIzOEMyOS4yMTEsMzUuMDkxLDI2LjcxNSwzNiwyNCwzNiBjLTUuMjAyLDAtOS42MTktMy4zMTctMTEuMjgzLTcuOTQ2bC02LjUyMiw1LjAyNUM5LjUwNSwzOS41NTYsMTYuMjI3LDQ0LDI0LDQ0eicvJTNFJTNDcGF0aCBmaWxsPSclMjMxOTc2RDInIGQ9J000My42MTEsMjAuMDgzSDQyVjIwSDI0djhoMTEuMzAzYy0wLjc5MiwyLjIzNy0yLjIzMSw0LjE2Ni00LjA4Nyw1LjU3MSBjMC4wMDEtMC4wMDEsMC4wMDItMC4wMDEsMC4wMDMtMC4wMDJsNi4xOSw1LjIzOEMzNi45NzEsMzkuMjA1LDQ0LDM0LDQ0LDI0QzQ0LDIyLjY1OSw0My44NjIsMjEuMzUsNDMuNjExLDIwLjA4M3onLyUzRSUzQy9zdmclM0UlMEEiLAogICAgICAgICAgICBiYWlkdToiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB0PScxNjY2ODgwNDYyNzEwJyBjbGFzcz0naWNvbicgdmlld0JveD0nMCAwIDEwMjQgMTAyNCcgdmVyc2lvbj0nMS4xJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHAtaWQ9JzM2NDA2JyB3aWR0aD0nMzInIGhlaWdodD0nMzInJTNFJTNDcGF0aCBkPSdNMjI2LjUyMiA1MzYuMDUzYzk2Ljk5My0yMC44MzkgODMuNzkyLTEzNi43NjEgODAuODc4LTE2Mi4wODktNC43NTgtMzkuMDY1LTUwLjY5MS0xMDcuMzQ2LTExMy4wNzUtMTAxLjk1Mi03OC40OTkgNy4wMzYtODkuOTU3IDEyMC40NDUtODkuOTU3IDEyMC40NDVDOTMuNzQ4IDQ0NC44NTcgMTI5Ljc2NCA1NTYuODU3IDIyNi41MjIgNTM2LjA1M3pNMzI5LjUxMiA3MzcuNjFjLTIuODQ4IDguMTc1LTkuMTggMjkuMDE0LTMuNjg2IDQ3LjE3MyAxMC44MjIgNDAuNzA3IDQ2LjE2OCA0Mi41NSA0Ni4xNjggNDIuNTVsNTAuNzkyIDBMNDIyLjc4NiA3MDMuMTY5IDM2OC40MSA3MDMuMTY5QzM0My45NTIgNzEwLjQ3MyAzMzIuMTU5IDcyOS40NjggMzI5LjUxMiA3MzcuNjF6TTQwNi41MzcgMzQxLjY2NmM1My41NzIgMCA5Ni44NTktNjEuNjQ2IDk2Ljg1OS0xMzcuOSAwLTc2LjEyLTQzLjI4Ny0xMzcuNzY3LTk2Ljg1OS0xMzcuNzY3LTUzLjQ3MiAwLTk2Ljg5MiA2MS42NDYtOTYuODkyIDEzNy43NjdDMzA5LjY0NSAyODAuMDE5IDM1My4wNjUgMzQxLjY2NiA0MDYuNTM3IDM0MS42NjZ6TTYzNy4yNDEgMzUwLjc3OWM3MS41OTggOS4yODEgMTE3LjYzMi02Ny4xNDEgMTI2Ljc3Ny0xMjUuMDM1IDkuMzQ5LTU3LjgyNy0zNi44NTQtMTI1LjAzNi04Ny41NDQtMTM2LjU2MS01MC43OTEtMTEuNjU5LTExNC4yMTMgNjkuNjg4LTExOS45NzYgMTIyLjc1N0M1NDkuNTk3IDI3Ni44MDMgNTY1Ljc3OSAzNDEuNTY2IDYzNy4yNDEgMzUwLjc3OXpNODEyLjY2NiA2OTEuMTc0YzAgMC0xMTAuNzYxLTg1LjcwMS0xNzUuNDI1LTE3OC4zMDUtODcuNjQ1LTEzNi41OTMtMjEyLjE3Ny04MS4wMTEtMjUzLjgyMi0xMS41NTgtNDEuNDc4IDY5LjQ1Mi0xMDYuMTA2IDExMy4zNzUtMTE1LjI4NiAxMjUtOS4zMTQgMTEuNDU4LTEzMy44MTMgNzguNjY2LTEwNi4xNzMgMjAxLjQyMyAyNy42NCAxMjIuNjkgMTI0LjcgMTIwLjM0NSAxMjQuNyAxMjAuMzQ1czcxLjUzIDcuMDM2IDE1NC41MTktMTEuNTI0YzgzLjAyMS0xOC40MjggMTU0LjQ4NCA0LjU5IDE1NC40ODQgNC41OXMxOTMuOTE5IDY0LjkyOSAyNDYuOTg4LTYwLjA3MkM4OTUuNjU1IDc1Ni4wMzcgODEyLjY2NiA2OTEuMTc0IDgxMi42NjYgNjkxLjE3NHpNNDgwLjg4MSA4NzcuMjUzIDM1NC44MDcgODc3LjI1M2MtNTQuNDQzLTEwLjg1NS03Ni4xMi00OC4wNDQtNzguODY3LTU0LjM0My0yLjY4LTYuNDMzLTE4LjEyNS0zNi4zMTctOS45NTEtODcuMTA5IDIzLjUyLTc2LjEyIDkwLjYyNy04MS42MTQgOTAuNjI3LTgxLjYxNGw2Ny4xMDcgMCAwLTgyLjQ4NSA1Ny4xNTcgMC44NzFMNDgwLjg4IDg3Ny4yNTN6TTcxNS42NzQgODc2LjM4MmwtMTQ1LjA3IDBjLTU2LjIxOS0xNC41MDgtNTguODY2LTU0LjQ0NC01OC44NjYtNTQuNDQ0TDUxMS43MzggNjYxLjQ5bDU4Ljg2Ni0wLjkzOCAwIDE0NC4xOTljMy41ODYgMTUuMzQ1IDIyLjY4MiAxOC4xNTkgMjIuNjgyIDE4LjE1OWw1OS43NzEgMEw2NTMuMDU3IDY2MS40OWw2Mi42MTggMEw3MTUuNjc1IDg3Ni4zODJ6TTkyMS4wNTEgNDQ4LjAwNmMwLTI3LjcwOC0yMy4wMTgtMTExLjEzLTEwOC4zODUtMTExLjEzLTg1LjUwMSAwLTk2LjkyNSA3OC43MzItOTYuOTI1IDEzNC4zODIgMCA1My4xMzYgNC40ODkgMTI3LjMxMyAxMTAuNjk1IDEyNC45MzVDOTMyLjY3NyA1OTMuODQ2IDkyMS4wNTEgNDc1Ljg4MSA5MjEuMDUxIDQ0OC4wMDZ6JyBwLWlkPSczNjQwNycgZmlsbD0nJTIzMDA4YmRkJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIsCiAgICAgICAgICAgIGJpbmc6J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUI1RWxFUVZRNGpaMlR2MHNiWVJ5SFg1VXpsOGJMVk5yU1RvVU9IYnIwVDJnSHFmMUJhZjhBdmNVcnVOY3BkNWU3NUJLOUgwUTlncHRDb2daS2g2SjJrV3REaGtweGttQ3dPSWlkaWpwWUVDb0k1dW5RTm8wUWF1d0hudVVENzhQTDkvMitvbjl3MEl0cldpU3JhaVNOakVSOXc4TlJURlVqdVF2aW1oYUp1S1o5VGhhTEpIeWZHek16M0F4RFJDNkg3TG9vUVlEaSs1MEpBcEpoaUpCVk5WSjhueDdUWktoVTRzdmhJWVgxZFc0WENzUnNtNEZzdGpPT2crSzZmd1hDTUhpeXNNQ2Z2S2hVRUxwK09jSGpjcmtsZUw2MGhFaWwvbC93c2xLaHh6QVF1azZ2YVJMUFpDNS9nOWRyYTVqVkt2ZG5aNUZ0RzVGS0lWa1dTamVDQjNOenZGcGVCdUQ3eVFudmQzWVlXMTNsenRRVXNtMWZMSGhVS25FMW42ZSt2MDk3M214dElhWFRKREtaTG9ZNFBzNzF5VW5lTmhxdC91UHVMckpsY2VVaXdjUDVlYTVOVEpDdDFmaDJmTnpxMzIxdkk2WFQveGFjTlp1VU56ZHBIQnkwRHA0MW0xVHFkZTRWaS9SYlZ1Y1pQRzFicFBiVTl2WjR0cmlJbEU3VFo1cWRYeUZtV2R6eWZZb2JHL3c0UFFYZzY5RVJZeXNyS0k2RDBQWHp1OUFtK0tBRUFZcmpFTE50aEdFd1ZDNWpWcXZjRFVPRXJ2LzZFNDV6bmx3T3hmTVE4dWpvcDJRWW9yZ3VpdWVSY0YxNkhRZVJ6U0xsOHd6ODdoWFhQWS9ua1p5ZTVpY2ZpMjhKRWkwY2VnQUFBQUJKUlU1RXJrSmdnZz09JywKICAgICAgICAgICAgZWRpdDoiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FRQUFBRFpjN0ovQUFBQ0RrbEVRVlI0bkpYVnpVdFVVUmpIOFkvbVNOS2traTJpd2lBcHhIUTFxLzZDK2d1c29DQjZveGJSUnFGTkw0c1d0UktxaFZTTElEZTFDcXBOaXdqS0lpbEtMS0tGRXIyWjJxSTB4eEhOMCtMT20rUE1PUE9jMVQySDcvZjVuY085OTFCZE5lcjMwem14S3JsMHhWMnpLSmpSb3k2YXFra3ZiYmRWTFB1VXErOCs1dUdYblZJTGtpN3FzeGd0TkR0clROTGNpakh2cmRZc2Z0MC93UThEWmdTemVxTVVEVzRJSmNlWUhjdndDZDFpZXMwS1p2V0kxVG5oSUg2NTc0T2xnZzBFNzR6bWhaOTAyajMwNGJ5NEN4cDVMUGp0UU5tankzWFBWSzJyZ21DQkNjR2dkVlhoZEJnVUJDTUV3Vk1OVmVJdkJNRkxpZktDOHZncm5kRkJsUkpVaEpjV0ZNZDNaZkd1ekZSeHdXcmR1M0tUeFFRVmhpOGxxQXBmS1ZoZjBkNGJjMi9PY2tHOVBrdXI3cjNURXcrMUZSTzBHeGRNMlZjMi9ISEJncjFJZjkzNVVUZmlnYnQ1K0MyN01lU285K201R0pZaXRsQ3dXUjJHOG9RWi9GZ1dYMWFGZ25aTUc4NTJ2NW5GUjRyaE1uKzJkRFZKWUZwS3F5MFNEa3NVaEY5RnNFMGJXZ3lJYTliSWFuaWhvRVVjRFRyU3o0dWVPVk1PTHhRa3pWa3JaY2FvTno3NTVybXBjbmloWU5naG0zdzI2WXMvNWNHY0lLZ1JCSkR5cUNJcXVqOEMxUHFLWnZISytxVnJKNWJNUndtR3RlclU2NHBra1p1cFdPM1JqWGt6VVpqOStqVlpNR0s2SXNFYUhUYmdqcE9TVVlaTC9wYTVtNHFQSWJ0eXpucEh2SmFxR0I1M08zM2g0VC8zVnpMdXpEaEU2QUFBQUFCSlJVNUVya0pnZ2c9PSIsCiAgICAgICAgICAgIGRlbDoiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FNQUFBQkVwSXJHQUFBREFGQk1WRVVBQUFEc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkgvLy85VlZWVldWbFpYVjFkWVdGaFpXVmxhV2xwYlcxdGNYRnhkWFYxZVhsNWZYMTlnWUdCaFlXRmlZbUpqWTJOa1pHUmxaV1ZtWm1abloyZG9hR2hwYVdscWFtcHJhMnRzYkd4dGJXMXVibTV2YjI5d2NIQnhjWEZ5Y25KemMzTjBkSFIxZFhWMmRuWjNkM2Q0ZUhoNWVYbDZlbnA3ZTN0OGZIeDlmWDErZm41L2YzK0FnSUNCZ1lHQ2dvS0RnNE9FaElTRmhZV0dob2FIaDRlSWlJaUppWW1LaW9xTGk0dU1qSXlOalkyT2pvNlBqNCtRa0pDUmtaR1NrcEtUazVPVWxKU1ZsWldXbHBhWGw1ZVltSmlabVptYW1wcWJtNXVjbkp5ZG5aMmVucDZmbjUrZ29LQ2hvYUdpb3FLam82T2twS1NscGFXbXBxYW5wNmVvcUtpcHFhbXFxcXFycTZ1c3JLeXRyYTJ1cnE2dnI2K3dzTEN4c2JHeXNyS3pzN08wdExTMXRiVzJ0cmEzdDdlNHVMaTV1Ym02dXJxN3U3dTh2THk5dmIyK3ZyNi92Ny9Bd01EQndjSEN3c0xEdzhQRXhNVEZ4Y1hHeHNiSHg4Zkl5TWpKeWNuS3lzckx5OHZNek16TnpjM096czdQejgvUTBORFIwZEhTMHRMVDA5UFUxTlRWMWRYVzF0YlgxOWZZMk5qWjJkbmEydHJiMjl2YzNOemQzZDNlM3Q3ZjM5L2c0T0RoNGVIaTR1TGo0K1BrNU9UbDVlWG01dWJuNStmbzZPanA2ZW5xNnVycjYrdnM3T3p0N2UzdTd1N3Y3Ky93OFBEeDhmSHk4dkx6OC9QMDlQVDE5ZlgyOXZiMzkvZjQrUGo1K2ZuNit2cjcrL3Y4L1B6OS9mMysvdjcvLy84ZGVqOVRBQUFBVTNSU1RsTUFBQUJtN1Avc1pnQUFBQlBPLy8vL3poUUFBQi9pLy8vLy8vLy8vK0lmQUFBZTRmdms0QUFBQUFBZC8rUTNHeHdBRlI4NUZRQmp6K0xQWSt2Ly8vL3I2Ly8vLy8vclpNL2g0YzlqQUJVZEhSVUFBUDBFY1BvQUFBRXVTVVJCVkhpYzdaUm5jOEl3REliZEVVWkhHQjBrRHNNT01jT010dEJCQjkzUXZjai8veTlWakIwQ3poMTMvZHozaXhUNU9WbVNZeU1rdExLNnRtNzRvWXhFTXBWR1VXMXNibTJiTThETVpIUDVPV0JuZDIrL1lObllBV0hiS2hSTDVjb2NRS2pyV0ZXUHVTRG1WUzNIcFVRdTFlb05Ra2lUTTl4cWQ3b0hvRzZuM2NLTU55SGNxTmZRNFZHUFVzcjduaDBGYksvUElkdzdQa0duWndPWk5ycUY5QWZuRitqeWFpZ0xpeFlwL2VIMURicTl1NGVBSHlPQUhoNUhhUHowRENuakFOam01ZlVOdlg5OFFvR0N4eW81RmptaDBLL3ZIMmh6QWkwS25xbnltTWdKclU2Z3plbVFCTStEWnBYMS9YQllVeUFZVFRBdVpUVWcrQXc4WmYrQnZ3SkxSNzMwc1BUalhnRDBIMllCMEJVQ2xYS3BHQWVFMXkrZnkyWk1mWDEyZ2RPcFpNTFFBZmtFL0FMN2U1dkdaRitkT1FBQUFBQkpSVTVFcmtKZ2dnPT0iLAogICAgICAgICAgICB3ZWIgOiAiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJ6ZEdGdVpHRnNiMjVsUFNKdWJ5SS9QandoUkU5RFZGbFFSU0J6ZG1jZ1VGVkNURWxESUNJdEx5OVhNME12TDBSVVJDQlRWa2NnTVM0eEx5OUZUaUlnSW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTDBkeVlYQm9hV056TDFOV1J5OHhMakV2UkZSRUwzTjJaekV4TG1SMFpDSStQSE4yWnlCMFBTSXhOakUxTnpnM01qZ3hOamN4SWlCamJHRnpjejBpYVdOdmJpSWdkbWxsZDBKdmVEMGlNQ0F3SURFd01qUWdNVEF5TkNJZ2RtVnljMmx2YmowaU1TNHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSEF0YVdROUlqTXlNak1pSUhkcFpIUm9QU0l4TmlJZ2FHVnBaMmgwUFNJeE5pSWdlRzFzYm5NNmVHeHBibXM5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZlR3hwYm1zaVBqeGtaV1p6UGp4emRIbHNaU0IwZVhCbFBTSjBaWGgwTDJOemN5SStQQzl6ZEhsc1pUNDhMMlJsWm5NK1BIQmhkR2dnWkQwaVRUazBPQzR3TXpJZ09UQXlMamM0Tkd3dE1qQTJMamszTmkweU1EWXVPVGMyUXpjNU55NDJPVFlnTmpJNExqa3lPQ0E0TXpJZ05UUXlMalV5T0NBNE16SWdORFE0WXpBdE1qRXlMakEyTkMweE56RXVPVE0yTFRNNE5DMHpPRFF0TXpnMFV6WTBJREl6TlM0NU16WWdOalFnTkRRNGN6RTNNUzQ1TXpZZ016ZzBJRE00TkNBek9EUmpPVFF1TlRJNElEQWdNVGd3TGpreU9DMHpOQzR6TURRZ01qUTNMamd3T0MwNU1DNDVNVEpzTWpBMkxqazNOaUF5TURZdU9UYzJZekUwTGpBeE5pQXhOQzR3TVRZZ016VXVORGc0SURFMUxqSXpNaUEwT0NBeUxqY3lRemsyTXk0eU5qUWdPVE00TGpJM01pQTVOakl1TURRNElEa3hOaTQ0SURrME9DNHdNeklnT1RBeUxqYzROSHBOTkRRNElEYzJPRU15TnpFdU1qWTBJRGMyT0NBeE1qZ2dOakkwTGpjek5pQXhNamdnTkRRNFV6STNNUzR5TmpRZ01USTRJRFEwT0NBeE1qaHpNekl3SURFME15NHlOalFnTXpJd0lETXlNRk0yTWpRdU56TTJJRGMyT0NBME5EZ2dOelk0ZWlJZ2NDMXBaRDBpTXpJeU5DSWdabWxzYkQwaUl6SmpNbU15WXlJK1BDOXdZWFJvUGp3dmMzWm5QZz09IiwKICAgICAgICAgICAgdHJhbnNsYXRlOiAiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB0PScxNjY2ODczNzM2MDM1JyBjbGFzcz0naWNvbicgdmlld0JveD0nMCAwIDEwMjQgMTAyNCcgdmVyc2lvbj0nMS4xJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHAtaWQ9JzE5NDIzJyB3aWR0aD0nMzInIGhlaWdodD0nMzInJTNFJTNDcGF0aCBkPSdNODYzLjI4ODg4OSA4NjEuODY2NjY3YzIyLjc1NTU1NiAwIDM4LjQtMjQuMTc3Nzc4IDI5Ljg2NjY2Ny00NS41MTExMTFMNzQzLjgyMjIyMiA0NjUuMDY2NjY3Yy0xNC4yMjIyMjItMzQuMTMzMzMzLTY0LTM0LjEzMzMzMy03OC4yMjIyMjIgMEw1MTYuMjY2NjY3IDgxNi4zNTU1NTZjLTguNTMzMzMzIDIxLjMzMzMzMyA3LjExMTExMSA0NS41MTExMTEgMjkuODY2NjY2IDQ1LjUxMTExMSAxMi44IDAgMjUuNi04LjUzMzMzMyAyOS44NjY2NjctMTkuOTExMTExbDM4LjQtOTYuNzExMTEyaDE3OS4ybDM4LjQgOTYuNzExMTEyYzUuNjg4ODg5IDExLjM3Nzc3OCAxNy4wNjY2NjcgMTkuOTExMTExIDMxLjI4ODg4OSAxOS45MTExMTF6TTYzNy4xNTU1NTYgNjg2LjkzMzMzM2w2Ni44NDQ0NDQtMTY5LjI0NDQ0NCA2Ni44NDQ0NDQgMTY5LjI0NDQ0NGgtMTMzLjY4ODg4OHpNNTgzLjExMTExMSAyOTEuNTU1NTU2aDg1LjMzMzMzM2MxNS42NDQ0NDQgMCAyOC40NDQ0NDQtMTIuOCAyOC40NDQ0NDUtMjguNDQ0NDQ1cy0xMi44LTI4LjQ0NDQ0NC0yOC40NDQ0NDUtMjguNDQ0NDQ0SDQ0MC44ODg4ODl2LTQ0LjA4ODg4OWMwLTE1LjY0NDQ0NC0xMi44LTI4LjQ0NDQ0NC0yOC40NDQ0NDUtMjguNDQ0NDQ1cy0yOC40NDQ0NDQgMTIuOC0yOC40NDQ0NDQgMjguNDQ0NDQ1djQ0LjA4ODg4OUgxNTYuNDQ0NDQ0Yy0xNS42NDQ0NDQgMC0yOC40NDQ0NDQgMTIuOC0yOC40NDQ0NDQgMjguNDQ0NDQ0czEyLjggMjguNDQ0NDQ0IDI4LjQ0NDQ0NCAyOC40NDQ0NDVoMzY2LjkzMzMzNGMtOS45NTU1NTYgMzIuNzExMTExLTIyLjc1NTU1NiA2NC0zOC40IDk1LjI4ODg4OC0xOS45MTExMTEgMzguNC00NS41MTExMTEgNzIuNTMzMzMzLTczLjk1NTU1NiAxMDMuODIyMjIzaC01LjY4ODg4OWMtOS45NTU1NTYtMTEuMzc3Nzc4LTI5Ljg2NjY2Ny0zMS4yODg4ODktNTEuMi02Mi41Nzc3NzgtOC41MzMzMzMtMTIuOC0xNy4wNjY2NjctMjUuNi0yNC4xNzc3NzctMzkuODIyMjIyLTUuNjg4ODg5LTkuOTU1NTU2LTE0LjIyMjIyMi0xNS42NDQ0NDQtMjUuNi0xNS42NDQ0NDUtMjEuMzMzMzMzIDAtMzUuNTU1NTU2IDIyLjc1NTU1Ni0yNS42IDQyLjY2NjY2NyA4LjUzMzMzMyAxNS42NDQ0NDQgMTcuMDY2NjY3IDMxLjI4ODg4OSAyNy4wMjIyMjIgNDUuNTExMTExIDE5LjkxMTExMSAyOS44NjY2NjcgMzguNCA0OS43Nzc3NzggNTIuNjIyMjIyIDY1LjQyMjIyMmw4LjUzMzMzMyA4LjUzMzMzNC0xNTcuODY2NjY2IDE1OS4yODg4ODhjLTExLjM3Nzc3OCAxMS4zNzc3NzgtMTEuMzc3Nzc4IDI4LjQ0NDQ0NCAwIDM5LjgyMjIyMyAxMS4zNzc3NzggMTEuMzc3Nzc4IDI4LjQ0NDQ0NCAxMS4zNzc3NzggMzkuODIyMjIyIDBsMTU3Ljg2NjY2Ny0xNTcuODY2NjY3YzI0LjE3Nzc3OCAyNS42IDUxLjIgNTIuNjIyMjIyIDc5LjY0NDQ0NCA3OS42NDQ0NDQgMTQuMjIyMjIyIDE0LjIyMjIyMiAzOS44MjIyMjIgOC41MzMzMzMgNDYuOTMzMzMzLTkuOTU1NTU1IDQuMjY2NjY3LTkuOTU1NTU2IDEuNDIyMjIyLTIyLjc1NTU1Ni03LjExMTExMS0zMS4yODg4ODktMjguNDQ0NDQ0LTI3LjAyMjIyMi01NC4wNDQ0NDQtNTQuMDQ0NDQ0LTc4LjIyMjIyMi03OS42NDQ0NDQgMzQuMTMzMzMzLTM2Ljk3Nzc3OCA2NC03OC4yMjIyMjIgODguMTc3Nzc4LTEyMi4zMTExMTIgMTkuOTExMTExLTM4LjQgMzUuNTU1NTU2LTc4LjIyMjIyMiA0Ni45MzMzMzMtMTIwLjg4ODg4OHonIHAtaWQ9JzE5NDI0JyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIsCiAgICAgICAgICAgIGtub3dsZWRnZToiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB0PScxNjY2ODc0MjU5MTYzJyBjbGFzcz0naWNvbicgdmlld0JveD0nMCAwIDEwMjQgMTAyNCcgdmVyc2lvbj0nMS4xJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHAtaWQ9JzI3OTc1JyB3aWR0aD0nMzInIGhlaWdodD0nMzInJTNFJTNDcGF0aCBkPSdNNTQ0LjMyIDY0OGE2NCA2NCAwIDEgMS02NC0wLjY0VjE3Mi44YTEyOCAxMjggMCAwIDEtMjMuOTM2LTkuMDI0bC00NC45MjgtMjIuNEExMjggMTI4IDAgMCAwIDM1NC40OTYgMTI4SDE5MmE2NCA2NCAwIDAgMC02NCA2NHY1NzUuNjhhNjQgNjQgMCAwIDAgNjQgNjRoMTYxLjc5MmExMjggMTI4IDAgMCAxIDU4LjE3NiAxNC4wMTZsNzEuMDQgMzYuMjI0YTY0IDY0IDAgMCAwIDU4LjE3NiAwbDcxLjE2OC0zNi4yODhhMTI4IDEyOCAwIDAgMSA1OC4xMTItMTMuOTUyaDE2MS45ODRhNjQgNjQgMCAwIDAgNjQtNjRWMTkyYTY0IDY0IDAgMCAwLTY0LTY0aC0xNTguMjA4YTEyOCAxMjggMCAwIDAtNTUuMDQgMTIuNDE2bC01MC44OCAyNC4yNTZhMTI4IDEyOCAwIDAgMS0yNCA4LjU3NnY0NzQuNzUyek02NzQuMjQgNjRoMTU4LjIwOGExMjggMTI4IDAgMCAxIDEyOCAxMjhWNzY3LjY4YTEyOCAxMjggMCAwIDEtMTI4IDEyOGgtMTYxLjkyYTY0IDY0IDAgMCAwLTI5LjEyIDcuMDRsLTcxLjE2OCAzNi4yMjRhMTI4IDEyOCAwIDAgMS0xMTYuMjg4IDBsLTcxLjA0LTM2LjIyNGE2NCA2NCAwIDAgMC0yOS4xMi03LjA0SDE5MmExMjggMTI4IDAgMCAxLTEyOC0xMjhWMTkyYTEyOCAxMjggMCAwIDEgMTI4LTEyOGgxNjIuNDk2YTE5MiAxOTIgMCAwIDEgODUuNDQgMjAuMDMybDQ0LjkyOCAyMi40YTY0IDY0IDAgMCAwIDU1LjkzNiAwLjQ0OGw1MC45NDQtMjQuMjU2QTE5MiAxOTIgMCAwIDEgNjc0LjI0IDY0eicgcC1pZD0nMjc5NzYnIGZpbGw9JyUyMzUxNTE1MSclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiLAogICAgICAgICAgICBpbWFnZToiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJ6ZEdGdVpHRnNiMjVsUFNKdWJ5SS9QandoUkU5RFZGbFFSU0J6ZG1jZ1VGVkNURWxESUNJdEx5OVhNME12TDBSVVJDQlRWa2NnTVM0eEx5OUZUaUlnSW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTDBkeVlYQm9hV056TDFOV1J5OHhMakV2UkZSRUwzTjJaekV4TG1SMFpDSStQSE4yWnlCMFBTSXhOakUxTnpnM05qWXpPREk0SWlCamJHRnpjejBpYVdOdmJpSWdkbWxsZDBKdmVEMGlNQ0F3SURFd01qY2dNVEF5TkNJZ2RtVnljMmx2YmowaU1TNHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSEF0YVdROUlqWXhNamNpSUhkcFpIUm9QU0l4Tmk0d05EWTROelVpSUdobGFXZG9kRDBpTVRZaUlIaHRiRzV6T25oc2FXNXJQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUwzaHNhVzVySWo0OFpHVm1jejQ4YzNSNWJHVWdkSGx3WlQwaWRHVjRkQzlqYzNNaVBqd3ZjM1I1YkdVK1BDOWtaV1p6UGp4d1lYUm9JR1E5SWswNU16WXVPVFlnT0RrdU5pQTROeTR3TkNBNE9TNDJRek00TGpRZ09Ea3VOaUF3SURFeU9DQXdJREUzTkM0d09Hd3dJRFk1TVM0eVl6QWdORGd1TmpRZ016Z3VOQ0E0Tnk0d05DQTROeTR3TkNBNE55NHdOR3c0TlRJdU5EZ2dNR00wT0M0Mk5DQXdJRGczTGpBMExUTTRMalFnT0RjdU1EUXRPRGN1TURSc01DMDJPVEV1TWtNeE1ESTBJREV5T0NBNU9EVXVOaUE0T1M0MklEa3pOaTQ1TmlBNE9TNDJlazA1TnpJdU9DQTROalV1TWpoak1DQXhOeTQ1TWkweE5TNHpOaUF6TlM0NE5DMHpOUzQ0TkNBek5TNDRORXc0Tnk0d05DQTVNREV1TVRKakxURTNMamt5SURBdE16VXVPRFF0TVRVdU16WXRNelV1T0RRdE16VXVPRFJNTlRFdU1pQTJOalV1Tm13eU5qRXVNVEl0TWpJd0xqRTJJREkzTXk0NU1pQXlOak11Tmpoak1UQXVNalFnTVRBdU1qUWdNak11TURRZ01UQXVNalFnTXpNdU1qZ2dNR3d4TXpBdU5UWXRNVEEzTGpVeUlESXhOUzR3TkNBeU1qQXVNVFpqTWk0MU5pQXlMalUySURVdU1USWdNaTQxTmlBM0xqWTRJRFV1TVRKTU9UY3lMamdnT0RZMUxqSTRlazA1TnpJdU9DQTNOVGN1Tnpac0xUSXdNaTR5TkMweU1EY3VNelpqTFRFd0xqSTBMVEV3TGpJMExUSTFMall0TVRBdU1qUXRNelV1T0RRdE1pNDFObXd0TVRNd0xqVTJJREV3Tnk0MU1rd3pNekF1TWpRZ016azBMakkwWXkweE1DNHlOQzB4TUM0eU5DMHlNeTR3TkMweE1DNHlOQzB6TXk0eU9DQXdiQzB5TkRVdU56WWdNakEwTGpoTU5URXVNaUF4TnpRdU1EaGpNQzB4Tnk0NU1pQXhOUzR6Tmkwek5TNDROQ0F6TlM0NE5DMHpOUzQ0Tkd3NE5USXVORGdnTUdNeE55NDVNaUF3SURNMUxqZzBJREUxTGpNMklETTFMamcwSURNMUxqZzBURGszTlM0ek5pQTNOVGN1TnpaNklpQndMV2xrUFNJMk1USTRJaUJtYVd4c1BTSWpOVEUxTVRVeElqNDhMM0JoZEdnK1BDOXpkbWMrIiwKICAgICAgICAgICAgdmlkZW86ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCemRHRnVaR0ZzYjI1bFBTSnVieUkvUGp3aFJFOURWRmxRUlNCemRtY2dVRlZDVEVsRElDSXRMeTlYTTBNdkwwUlVSQ0JUVmtjZ01TNHhMeTlGVGlJZ0ltaDBkSEE2THk5M2QzY3Vkek11YjNKbkwwZHlZWEJvYVdOekwxTldSeTh4TGpFdlJGUkVMM04yWnpFeExtUjBaQ0krUEhOMlp5QjBQU0l4TmpFMU56ZzRNVEl4TnpJNUlpQmpiR0Z6Y3owaWFXTnZiaUlnZG1sbGQwSnZlRDBpTUNBd0lERXdNalFnTVRBeU5DSWdkbVZ5YzJsdmJqMGlNUzR4SWlCNGJXeHVjejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNpSUhBdGFXUTlJakU0TnpFMklpQjNhV1IwYUQwaU1UWWlJR2hsYVdkb2REMGlNVFlpSUhodGJHNXpPbmhzYVc1clBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJajQ4WkdWbWN6NDhjM1I1YkdVZ2RIbHdaVDBpZEdWNGRDOWpjM01pUGp3dmMzUjViR1UrUEM5a1pXWnpQanh3WVhSb0lHUTlJazAwTWprdU1EWWdOekV6TGpJMVl5MDRMamN4SURBdE1UY3VORFl0TVM0NU9TMHlOUzQyTXkwMkxqQXlMVEU1TGpZekxUa3VOekV0TXpFdU9ESXRNamt1TWpjdE16RXVPREl0TlRFdU1EWldNelkyTGpnell6QXRNakV1TnprZ01USXVNVGt0TkRFdU16VWdNekV1T0RNdE5URXVNRFlnTVRrdU1ESXRPUzQwSURReExqSTFMVGN1TmprZ05UZ3VOVElnTkM0ek4yd3lNekl1TnlBeE5EUXVPRGtnTVM0ek1TQXdMams1WXpFMExqUTNJREV3TGpnM0lESXlMamMzSURJM0xqUTFJREl5TGpjM0lEUTFMalE0SURBZ01UZ3VNREl0T0M0eklETTBMall0TWpJdU56Y2dORFV1TkRoc0xURXVNekVnTUM0NU9TMHlNekl1TnlBeE5EUXVPRGxqTFRrdU9EWWdOaTQ0T0MweU1TNHpOQ0F4TUM0ek9TMHpNaTQ1SURFd0xqTTVlaUJ0TVRjdU5EWXRNekUwTGpnM2RqSXlOaTR5TTB3Mk1qZ3VNVGtnTlRFeExqVWdORFEyTGpVeUlETTVPQzR6T0hvZ2JUQWdNQ0lnY0MxcFpEMGlNVGczTVRjaUlHWnBiR3c5SWlNMU1UVXhOVEVpUGp3dmNHRjBhRDQ4Y0dGMGFDQmtQU0pOT0RjMkxqRTFJRGsyTUdndE56STRMak5ETmpZdU16TWdPVFl3SURBZ09EazBMakVnTUNBNE1UTXVNVEZXTWpBNUxqZzVRekFnTVRJNExqa2dOall1TXpNZ05qTWdNVFEzTGpnMUlEWXphRGN5T0M0eU9VTTVOVGN1TmpjZ05qTWdNVEF5TkNBeE1qZ3VPU0F4TURJMElESXdPUzQ0T1ZZNE1UTXVNV013SURneExUWTJMak16SURFME5pNDVMVEUwTnk0NE5TQXhORFl1T1hvZ2JTMDNNamd1TXkwNE1qSXVOVFpqTFRRd0xqSXhJREF0TnpJdU9UTWdNekl1TlMwM01pNDVNeUEzTWk0ME5WWTRNVE11TVdNd0lETTVMamsxSURNeUxqY3hJRGN5TGpRMUlEY3lMamt6SURjeUxqUTFhRGN5T0M0eU9XTTBNQzR5TVNBd0lEY3lMamt6TFRNeUxqVWdOekl1T1RNdE56SXVORFZXTWpBNUxqZzVZekF0TXprdU9UVXRNekl1TnpFdE56SXVORFV0TnpJdU9UTXROekl1TkRWSU1UUTNMamcxZWlCdE1DQXdJaUJ3TFdsa1BTSXhPRGN4T0NJZ1ptbHNiRDBpSXpVeE5URTFNU0krUEM5d1lYUm9Qand2YzNablBnPT0iLAogICAgICAgICAgICBtdXNpYzoiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB0PScxNjY2ODc0MDA1MTYyJyBjbGFzcz0naWNvbicgdmlld0JveD0nMCAwIDEwMjQgMTAyNCcgdmVyc2lvbj0nMS4xJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHAtaWQ9JzI1MDI2JyB3aWR0aD0nMzInIGhlaWdodD0nMzInJTNFJTNDcGF0aCBkPSdNODg5LjM3NDExOCAyNjguNTg5MTc2bDI1LjM1OTA1OC01NC41NzMxNzZMNDgxLjg4MjM1MyAxMy4wNzEwNTl2NTk1LjAwNDIzNWExNzMuNzc4ODI0IDE3My43Nzg4MjQgMCAwIDAtMTE0LjMyNjU4OC00My40ODk4ODJjLTk2Ljc5ODExOCAwLTE3NS41MjU2NDcgNzguNzg3NzY1LTE3NS41MjU2NDcgMTc1LjUyNTY0N3M3OC43Mjc1MjkgMTc1LjUyNTY0NyAxNzUuNTI1NjQ3IDE3NS41MjU2NDcgMTc1LjUyNTY0Ny03OC43ODc3NjUgMTc1LjUyNTY0Ny0xNzUuNTI1NjQ3YzAtMy4xOTI0NzEtMC43ODMwNTktNi4yMDQyMzUtMC45NjM3NjUtOS4yNzYyMzVWMTA3LjM5OTUyOWwzNDcuMjU2NDcxIDE2MS4xODk2NDd6IG0tNTIxLjgxODM1MyA1ODYuODEyMjM2Yy02My42MDg0NzEgMC0xMTUuMjkwMzUzLTUxLjY4MTg4Mi0xMTUuMjkwMzUzLTExNS4yOTAzNTNzNTEuNjgxODgyLTExNS4yOTAzNTMgMTE1LjI5MDM1My0xMTUuMjkwMzUzIDExNS4yOTAzNTMgNTEuNjgxODgyIDExNS4yOTAzNTMgMTE1LjI5MDM1My01MS43NDIxMTggMTE1LjI5MDM1My0xMTUuMjkwMzUzIDExNS4yOTAzNTN6JyBwLWlkPScyNTAyNyclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiLAogICAgICAgICAgICBzaG9wcGluZzoiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJ6ZEdGdVpHRnNiMjVsUFNKdWJ5SS9QandoUkU5RFZGbFFSU0J6ZG1jZ1VGVkNURWxESUNJdEx5OVhNME12TDBSVVJDQlRWa2NnTVM0eEx5OUZUaUlnSW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTDBkeVlYQm9hV056TDFOV1J5OHhMakV2UkZSRUwzTjJaekV4TG1SMFpDSStQSE4yWnlCMFBTSXhOakUxTnpnNE1qY3lNVFl3SWlCamJHRnpjejBpYVdOdmJpSWdkbWxsZDBKdmVEMGlNQ0F3SURFd01qUWdNVEF5TkNJZ2RtVnljMmx2YmowaU1TNHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSEF0YVdROUlqSXlOak16SWlCM2FXUjBhRDBpTVRZaUlHaGxhV2RvZEQwaU1UWWlJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklqNDhaR1ZtY3o0OGMzUjViR1VnZEhsd1pUMGlkR1Y0ZEM5amMzTWlQand2YzNSNWJHVStQQzlrWldaelBqeHdZWFJvSUdROUlrMDNOakF1T1RZZ056RXlMamsyU0RNM01pNDBPR010TXprdU5qZ2dNQzAzTkM0eU5DMHlPQzR4TmkwNE5DNDBPQzAyT1M0eE1rd3lNREF1TXpJZ01qY3hMak0yU0RFeU1DNDVObU10TVRjdU9USWdNQzB6TWkweE5DNHdPQzB6TWkwek1uTXhOQzR3T0Mwek1pQXpNaTB6TW1neE1EUXVPVFpqTVRRdU56SWdNQ0F5Tnk0MU1pQXhNQzR5TkNBek1TNHpOaUF5TkM0NU5tdzVNeTQwTkNBek9UWXVPR016TGpJZ01URXVOVElnTVRJdU1UWWdNVGt1T0RRZ01qSXVOQ0F4T1M0NE5HZ3pPRGN1T0RSak1UQXVNalFnTUNBeE9TNHlMVGd1TXpJZ01qSXVOQzB4T1M0NE5HdzFNeTQzTmkweU5URXVOVEpJTkRNMkxqUTRZeTB4Tnk0NU1pQXdMVE15TFRFMExqQTRMVE15TFRNeWN6RTBMakE0TFRNeUlETXlMVE15YURRek9TNDJPR001TGpZZ01DQXhPQzQxTmlBMExqUTRJREkwTGprMklERXlMakUySURVdU56WWdOeTQyT0NBNExqTXlJREUzTGpJNElEWXVOQ0F5Tmk0NE9Hd3ROakl1TURnZ01qa3dMalUyZGpBdU5qUmpMVEV3TGpJMElEUXdMak15TFRRMExqZ2dOamt1TVRJdE9EUXVORGdnTmprdU1USjZJaUJtYVd4c1BTSWpOVEUxTVRVeElpQndMV2xrUFNJeU1qWXpOQ0krUEM5d1lYUm9Qanh3WVhSb0lHUTlJazAwTVRjdU1qZ2dPREl4TGpFeWJTMDFPQzR5TkNBd1lUVTRMakkwSURVNExqSTBJREFnTVNBd0lERXhOaTQwT0NBd0lEVTRMakkwSURVNExqSTBJREFnTVNBd0xURXhOaTQwT0NBd1dpSWdabWxzYkQwaUl6VXhOVEUxTVNJZ2NDMXBaRDBpTWpJMk16VWlQand2Y0dGMGFENDhjR0YwYUNCa1BTSk5Oek13TGpnNElEZ3lNUzR4TW0wdE5UZ3VNalFnTUdFMU9DNHlOQ0ExT0M0eU5DQXdJREVnTUNBeE1UWXVORGdnTUNBMU9DNHlOQ0ExT0M0eU5DQXdJREVnTUMweE1UWXVORGdnTUZvaUlHWnBiR3c5SWlNMU1UVXhOVEVpSUhBdGFXUTlJakl5TmpNMklqNDhMM0JoZEdnK1BDOXpkbWMrIiwKICAgICAgICAgICAgc29jaWFsaXR5OiJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHQ9JzE2NjY4NzQzOTM0MDgnIGNsYXNzPSdpY29uJyB2aWV3Qm94PScwIDAgMTAyNCAxMDI0JyB2ZXJzaW9uPScxLjEnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgcC1pZD0nMjkwMzUnIHdpZHRoPSczMicgaGVpZ2h0PSczMiclM0UlM0NwYXRoIGQ9J00zLjM5IDMwMy4yOHY0NzMuNzNjMCAzNC4xMyAzNC42MiA2MS43OCA3Ny4yOCA2MS43OGgxNTQuNTh2MTAyLjk4YzAgMTEuMzkgMTUuOTQgMjIuNzQgMzAuMTggMjIuNzQgMC41MSAwIDAuNjkgMC4wMyAwLjc4IDAuMDcgOC4yNyAwLjk2IDIwLjM1LTMuODEgMjYuNTgtOC43NmwxNDYuMzUtMTE3LjAzaDM2Mi45YzQyLjY3IDAgNzcuMy0yNy42NiA3Ny4zLTYxLjc5VjMwMy4yOGMwLTM0LjEzLTM0LjYzLTYxLjc5LTc3LjMtNjEuNzlIODAuNjhjLTQyLjY3IDAtNzcuMjkgMjcuNjYtNzcuMjkgNjEuNzl6IG02Mi43IDI4LjM3YzAtMjIuMDcgMjIuNDEtMzkuOTkgNTAuMDEtMzkuOTloNjUwLjQ5YzI3LjYyIDAgNTAuMDEgMTcuOTEgNTAuMDEgMzkuOTl2NDIwLjAzYzAgMjIuMDgtMjIuNCAzOS45OS01MC4wMSAzOS45OWgtMzQ3LjVjLTIuMDMgMC44OS02Ljg1IDUtOC41NiA2LjM1TDI5MS4yNyA4OTMuNHYtODEuNzJjMC0xMS4wNS0xMS4xOS0yMC4wMS0yNS4wMy0yMC4wMUgxMTYuMTJjLTI3LjYyIDAtNTAuMDItMTcuOTEtNTAuMDItMzkuOTlsLTAuMDEtNDIwLjAzeiBtLTExLjE3LTcuNzcnIHAtaWQ9JzI5MDM2JyBmaWxsPSclMjM1MTUxNTEnJTNFJTNDL3BhdGglM0UlM0NwYXRoIGQ9J005MzUuNSA2OC42MUgyMTQuMTRjLTQyLjY2IDAtNzcuMjkgMjcuNjYtNzcuMjkgNjEuNzl2NjAuMjNhOTEuMDA2IDkxLjAwNiAwIDAgMSAyMS42Ny0yLjY4aDI5Ljg2VjE1MWMwLTIyLjcyIDIzLjA3LTQxLjE4IDUxLjUxLTQxLjE4aDY2OS44NGMyOC40NCAwIDUxLjUxIDE4LjQ1IDUxLjUxIDQxLjE4djQzMi41NGMwIDIyLjY1LTIyLjkgNDEuMDMtNTEuMTkgNDEuMTZ2NDEuMmgyNS40MmM0Mi42NyAwIDc3LjMtMjcuNjYgNzcuMy02MS43OFYxMzAuNGMwLjAyLTM0LjEzLTM0LjYtNjEuNzktNzcuMjctNjEuNzl6JyBwLWlkPScyOTAzNycgZmlsbD0nJTIzNTE1MTUxJyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBkPSdNMjEzLjE1IDUzNy43M2MwIDE2LjMgOC43IDMxLjM3IDIyLjgyIDM5LjUyYTQ1LjYwNSA0NS42MDUgMCAwIDAgNDUuNjQgMCA0NS42MzcgNDUuNjM3IDAgMCAwIDIyLjgyLTM5LjUyYzAtMTYuMy04LjY5LTMxLjM2LTIyLjgyLTM5LjUyYTQ1LjY1NCA0NS42NTQgMCAwIDAtNDUuNjQgMCA0NS42MjUgNDUuNjI1IDAgMCAwLTIyLjgyIDM5LjUyeiBtMCAwTTM5NS43NCA1MzcuNzNjMCAyNS4yIDIwLjQzIDQ1LjY0IDQ1LjYzIDQ1LjY0IDI1LjIxIDAgNDUuNjQtMjAuNDMgNDUuNjQtNDUuNjQgMC0xNi4zLTguNjktMzEuMzYtMjIuODEtMzkuNTJhNDUuNjU0IDQ1LjY1NCAwIDAgMC00NS42NCAwIDQ1LjYwNCA0NS42MDQgMCAwIDAtMjIuODIgMzkuNTJ6IG0wIDBNNTc4LjI5IDUzNy43M2MwIDE2LjMgOC42OSAzMS4zNyAyMi44MiAzOS41MmE0NS42MDUgNDUuNjA1IDAgMCAwIDQ1LjY0IDAgNDUuNjM3IDQ1LjYzNyAwIDAgMCAyMi44Mi0zOS41MmMwLTE2LjMtOC42OS0zMS4zNi0yMi44Mi0zOS41MmE0NS42NTQgNDUuNjU0IDAgMCAwLTQ1LjY0IDAgNDUuNjA0IDQ1LjYwNCAwIDAgMC0yMi44MiAzOS41MnogbTAgMCcgcC1pZD0nMjkwMzgnIGZpbGw9JyUyMzUxNTE1MSclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiLAogICAgICAgICAgICBkb3dubG9hZDoiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB0PScxNjY2ODczODg0OTUwJyBjbGFzcz0naWNvbicgdmlld0JveD0nMCAwIDEwMjQgMTAyNCcgdmVyc2lvbj0nMS4xJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHAtaWQ9JzIxNTkzJyB3aWR0aD0nMzInIGhlaWdodD0nMzInJTNFJTNDcGF0aCBkPSdNODA4LjE5MiAyNDYuNTI4YTMyMC4xNiAzMjAuMTYgMCAwIDAtNTkyLjM1MiAwQTIzOC41OTIgMjM4LjU5MiAwIDAgMCAzMiA0NzkuOTM2YzAgMTMyLjM1MiAxMDcuNjQ4IDI0MCAyNDAgMjQwaDkxLjQ4OGEzMiAzMiAwIDEgMCAwLTY0SDI3MmExNzYuMTkyIDE3Ni4xOTIgMCAwIDEtMTc2LTE3NiAxNzUuMDQgMTc1LjA0IDAgMCAxIDE0OC40OC0xNzMuODg4bDE5LjA0LTIuOTc2IDYuMjQtMTguMjRDMzA1LjI0OCAxODEuNDA4IDQwMi41OTIgMTExLjkzNiA1MTIgMTExLjkzNmEyNTYgMjU2IDAgMCAxIDI0Mi4yMDggMTcyLjg5Nmw2LjI3MiAxOC4yNCAxOS4wNCAyLjk3NkExNzUuMDQgMTc1LjA0IDAgMCAxIDkyOCA0NzkuOTM2YzAgOTcuMDI0LTc4Ljk3NiAxNzYtMTc2IDE3NmgtOTcuMjhhMzIgMzIgMCAxIDAgMCA2NGg5Ny4yOGMxMzIuMzUyIDAgMjQwLTEwNy42NDggMjQwLTI0MGEyMzguNTkyIDIzOC41OTIgMCAwIDAtMTgzLjgwOC0yMzMuNDA4eicgcC1pZD0nMjE1OTQnJTNFJTNDL3BhdGglM0UlM0NwYXRoIGQ9J002NDkuNzkyIDc4OS44ODhMNTQ0IDg3Ni40OFY0NDcuOTM2YTMyIDMyIDAgMCAwLTY0IDBWODc2LjQ4bC0xMDYuNzUyLTg3LjQyNGEzMS45NjggMzEuOTY4IDAgMSAwLTQwLjU0NCA0OS41MDRsMTU5LjA0IDEzMC4yNGEzMiAzMiAwIDAgMCA0MC41NzYgMGwxNTguMDQ4LTEyOS40NGEzMiAzMiAwIDEgMC00MC41NzYtNDkuNDcyeicgcC1pZD0nMjE1OTUnJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIiwKICAgICAgICAgICAgc2Nob2xhcjoiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJ6ZEdGdVpHRnNiMjVsUFNKdWJ5SS9QandoUkU5RFZGbFFSU0J6ZG1jZ1VGVkNURWxESUNJdEx5OVhNME12TDBSVVJDQlRWa2NnTVM0eEx5OUZUaUlnSW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTDBkeVlYQm9hV056TDFOV1J5OHhMakV2UkZSRUwzTjJaekV4TG1SMFpDSStQSE4yWnlCMFBTSXhOakUxTnpnNE5USTRNamd6SWlCamJHRnpjejBpYVdOdmJpSWdkbWxsZDBKdmVEMGlNQ0F3SURFd01qUWdNVEF5TkNJZ2RtVnljMmx2YmowaU1TNHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSEF0YVdROUlqSTNOREl6SWlCM2FXUjBhRDBpTVRZaUlHaGxhV2RvZEQwaU1UWWlJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklqNDhaR1ZtY3o0OGMzUjViR1VnZEhsd1pUMGlkR1Y0ZEM5amMzTWlQand2YzNSNWJHVStQQzlrWldaelBqeHdZWFJvSUdROUlrMHhOREV1T1RRZ05EQTNMalkyTm13ek5qZ3VORGsxSURFNU15NHhNU0F6TmpndU5EazBMVEU1TXk0eE1TMHpOamd1TkRrMExURTVNUzR3TmpSTU1UUXhMamswSURRd055NDJOalo2SUcwek56WXVOemd0TWpJM0xqTXliRFF3Tnk0ME16VWdNakV4TGpJMU5XTXhNaTQ1TWpFZ05pNDNJREV5TGprMk1TQXlOUzR4TmpnZ01DNHdOeUF6TVM0NU1qTk1OVEU0TGpjNUlEWXpOeTR3TkRKaE1UZ2dNVGdnTUNBd0lERXRNVFl1TnpFZ01FdzVOQzQyTkRVZ05ESXpMalV5TkdNdE1USXVPRGt5TFRZdU56VTFMVEV5TGpnMU1pMHlOUzR5TWpNZ01DNHdOeTB6TVM0NU1qTnNOREEzTGpRek5DMHlNVEV1TWpVMVlURTRJREU0SURBZ01DQXhJREUyTGpVM01TQXdlaUlnWm1sc2JEMGlJelV4TlRFMU1TSWdjQzFwWkQwaU1qYzBNalFpUGp3dmNHRjBhRDQ4Y0dGMGFDQmtQU0pOTnpNNExqUTBNeUEwT1RZdU9URTRZekF0T1M0NU5ERWdPQzR3TmkweE9DQXhPQzB4T0NBNUxqazBNU0F3SURFNElEZ3VNRFU1SURFNElERTRkakk1Tmk0eU9HRXhPQ0F4T0NBd0lEQWdNUzB4TUM0ek5UTWdNVFl1TWprMVREUTVOeTR5T1RnZ09UTTBMalk0TW1FeE9DQXhPQ0F3SURBZ01TMHhOUzQzTURFdE1DNHhPVGhzTFRJMU1DNHhPRE10TVRJMUxqRTVZVEU0SURFNElEQWdNQ0F4TFRrdU9UUTFMVEUyTGpBNU4xWTBPREV1TkdNd0xUa3VPVFF5SURndU1EWXRNVGdnTVRndE1UZ2dPUzQ1TkRFZ01DQXhPQ0E0TGpBMU9DQXhPQ0F4T0hZek1EQXVOamMzYkRJek1pNDBNelVnTVRFMkxqTXdPQ0F5TkRndU5UUXRNVEUyTGpZeU5GWTBPVFl1T1RFNGVpSWdabWxzYkQwaUl6VXhOVEUxTVNJZ2NDMXBaRDBpTWpjME1qVWlQand2Y0dGMGFENDhjR0YwYUNCa1BTSk5PRFkwTGpFeUlEVXhNQzQ1T0dNd0xUa3VPVFF5SURndU1EVTRMVEU0SURFNExURTRJRGt1T1RRZ01DQXhPQ0E0TGpBMU9DQXhPQ0F4T0hZeU1qa3VNRGszWXpBZ09TNDVOREV0T0M0d05pQXhPQzB4T0NBeE9DMDVMamswTWlBd0xURTRMVGd1TURVNUxURTRMVEU0VmpVeE1DNDVOemw2SWlCbWFXeHNQU0lqTlRFMU1UVXhJaUJ3TFdsa1BTSXlOelF5TmlJK1BDOXdZWFJvUGp3dmMzWm5QZz09IiwKICAgICAgICAgICAgbmV3czoiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJ6ZEdGdVpHRnNiMjVsUFNKdWJ5SS9QandoUkU5RFZGbFFSU0J6ZG1jZ1VGVkNURWxESUNJdEx5OVhNME12TDBSVVJDQlRWa2NnTVM0eEx5OUZUaUlnSW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTDBkeVlYQm9hV056TDFOV1J5OHhMakV2UkZSRUwzTjJaekV4TG1SMFpDSStQSE4yWnlCMFBTSXhOakUxTnpnNE5qQTVNak14SWlCamJHRnpjejBpYVdOdmJpSWdkbWxsZDBKdmVEMGlNQ0F3SURFd01qUWdNVEF5TkNJZ2RtVnljMmx2YmowaU1TNHhJaUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSEF0YVdROUlqSTRORGMwSWlCM2FXUjBhRDBpTVRZaUlHaGxhV2RvZEQwaU1UWWlJSGh0Ykc1ek9uaHNhVzVyUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMM2hzYVc1cklqNDhaR1ZtY3o0OGMzUjViR1VnZEhsd1pUMGlkR1Y0ZEM5amMzTWlQand2YzNSNWJHVStQQzlrWldaelBqeHdZWFJvSUdROUlrMDJOall1TURnM0lESXpPUzR5Tnpkb01UVTFMalkyZGkwek9DNDVNVE5vTFRFMU5TNDJObll6T0M0NU1UTjZJRzB0TnpjdU9ETXRNemd1T1RFemFDMHlNek11TkRsMk1qTXpMalE0T0dneU16TXVORGxXTWpBd0xqTTJOSG9nYlMwek9DNDVNVFVnTVRrMExqVTNOR2d0TVRVMUxqWTJkaTB4TlRVdU5qWm9NVFUxTGpZMmRqRTFOUzQyTm5vZ2JTMHhPVFF1TlRjMklETTRPUzR4TldnME5qWXVPVGd4ZGkwek9DNDVNVFZJTXpVMExqYzJObll6T0M0NU1UVjZUVGc0TUM0eE1Ua2dOalF1TVRaSU1qazJMak01TkdNdE5ESXVPVGcwSURBdE56Y3VPRE1nTXpRdU9EUTJMVGMzTGpneklEYzNMamd6ZGpFNUxqUTFPR2d0TnpjdU9ETmpMVFF5TGprNE5DQXdMVGMzTGpneU9DQXpOQzQ0TkRZdE56Y3VPREk0SURjM0xqZ3pkalkwTWk0d09UaGpNQ0EwTWk0NU9EUWdNelF1T0RRMUlEYzNMamd6SURjM0xqZ3lPQ0EzTnk0NE0wZzRPREF1TVRKak5ESXVPVGcySURBZ056Y3VPRE14TFRNMExqZzBOaUEzTnk0NE16RXROemN1T0ROV01UUXhMams1WXkwd0xqQXdNUzAwTWk0NU9EUXRNelF1T0RRMkxUYzNMamd6TFRjM0xqZ3pNaTAzTnk0NE0zb2diVE00TGpreE55QTRNVGN1TWpFMll6QWdNakV1TkRrekxURTNMalF5TkNBek9DNDVNVGN0TXpndU9URTNJRE00TGpreE4wZ3hOREF1TnpNMFl5MHlNUzQwT1RFZ01DMHpPQzQ1TVRVdE1UY3VOREkwTFRNNExqa3hOUzB6T0M0NU1UZFdNak01TGpJM04yTXdMVEl4TGpRNU1TQXhOeTQwTWpRdE16Z3VPVEV6SURNNExqa3hOUzB6T0M0NU1UTm9OemN1T0ROMk5UZ3pMamN5Tkdnek9DNDVNVFZXTVRReExqazVZekF0TWpFdU5Ea3pJREUzTGpReU1pMHpPQzQ1TVRVZ016Z3VPVEUxTFRNNExqa3hOVWc0T0RBdU1USmpNakV1TkRreklEQWdNemd1T1RFM0lERTNMalF5TWlBek9DNDVNVGNnTXpndU9URTFkamN6T1M0ek9EWjZJRzB0TlRZMExqSTNMVEl4TkM0d016Tm9ORFkyTGprNE1YWXRNemd1T1RFMVNETTFOQzQzTmpaMk16Z3VPVEUxZWlCdE16RXhMak15TVMwek16QXVOemMyYURFMU5TNDJObFl5T1RjdU5qVm9MVEUxTlM0Mk5uWXpPQzQ1TVRkNklHMHdJRGszTGpJNE5tZ3hOVFV1TmpaMkxUTTRMamt4TldndE1UVTFMalkyZGpNNExqa3hOWHBOTXpVMExqYzJOaUExTlRBdU5tZzBOall1T1RneGRpMHpPQzQ1TVRkSU16VTBMamMyTmxZMU5UQXVObm9pSUhBdGFXUTlJakk0TkRjMUlpQm1hV3hzUFNJak5URTFNVFV4SWo0OEwzQmhkR2crUEM5emRtYysiLAogICAgICAgICAgICBtaW5lOiJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHQ9JzE2NjY4NzQxMTEwMDAnIGNsYXNzPSdpY29uJyB2aWV3Qm94PScwIDAgMTAyNCAxMDI0JyB2ZXJzaW9uPScxLjEnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgcC1pZD0nMjcxNzknIHdpZHRoPSczMicgaGVpZ2h0PSczMiclM0UlM0NwYXRoIGQ9J005NDkuODg4IDQ1Ny4yNTg2NjdjMjYuMDY5MzMzLTI5LjgyNCAxMy44NjY2NjctNjcuNTItMjQuNzg5MzMzLTc2LjMwOTMzNEw2ODEuNzI4IDMyNS41NDY2NjdsLTEyNy43ODY2NjctMjE0LjY3NzMzNGMtMjAuMjY2NjY3LTM0LjA2OTMzMy01OS45MjUzMzMtMzQuMDkwNjY3LTgwLjIxMzMzMyAwbC0xMjcuNzg2NjY3IDIxNC42NzczMzQtMjQzLjM3MDY2NiA1NS4zODEzMzNjLTM4LjQ0MjY2NyA4Ljc0NjY2Ny01MC44NTg2NjcgNDYuNTA2NjY3LTI0Ljc4OTMzNCA3Ni4zMDkzMzNsMTY0LjM5NDY2NyAxODguMDUzMzM0LTIyLjYxMzMzMyAyNDguOTE3MzMzYy0zLjU4NCAzOS40NjY2NjcgMjguNDU4NjY3IDYyLjgwNTMzMyA2NC44OTYgNDcuMTQ2NjY3bDIzNy43ODEzMzMtMTAyLjAzNzMzNGEyMS4zMzMzMzMgMjEuMzMzMzMzIDAgMCAwLTE2LjgxMDY2Ny0zOS4yMTA2NjZMMjY3LjYyNjY2NyA5MDIuMTg2NjY3Yy02LjY5ODY2NyAyLjg4LTYuMjI5MzMzIDMuMjIxMzMzLTUuNTY4LTQuMDk2bDI0LjI3NzMzMy0yNjcuMDkzMzM0LTE3Ni40MjY2NjctMjAxLjgxMzMzM2MtNC43NTczMzMtNS40NjEzMzMtNC45MDY2NjctNS4wMzQ2NjcgMi4xMzMzMzQtNi42MzQ2NjdsMjYxLjIwNTMzMy01OS40MzQ2NjYgMTM3LjE1Mi0yMzAuNGMzLjczMzMzMy02LjI5MzMzMyAzLjEzNi02LjI5MzMzMyA2Ljg2OTMzMyAwbDEzNy4xNzMzMzQgMjMwLjQgMjYxLjIwNTMzMyA1OS40MzQ2NjZjNy4xMjUzMzMgMS42MjEzMzMgNi45NTQ2NjcgMS4wODggMi4xMzMzMzMgNi42MTMzMzRsLTE3Ni40MjY2NjYgMjAxLjgxMzMzMyAyNC4yNTYgMjY3LjA5MzMzM2EyMS4zMzMzMzMgMjEuMzMzMzMzIDAgMSAwIDQyLjQ5Ni0zLjg0bC0yMi42MTMzMzQtMjQ4LjkxNzMzMyAxNjQuMzk0NjY3LTE4OC4wNTMzMzN6JyBmaWxsPSclMjMzRDNEM0QnIHAtaWQ9JzI3MTgwJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIsCiAgICAgICAgfTsKCiAgICAgICAgLy8g5pCc57Si5byV5pOO5YiX6KGoCiAgICAgICAgdmFyIGVuZ2luZUxpc3QgPSB7fTsKCiAgICAgICAgLy8g572R6aG15pCc57Si5YiX6KGoCiAgICAgICAgZW5naW5lTGlzdC53ZWIgPSBbXTsKCiAgICAgICAgZW5naW5lTGlzdC53ZWJbMF0gPSB7CiAgICAgICAgICAgIG5hbWU6ICfnmb7luqYnLAogICAgICAgICAgICB1cmw6ICdodHRwczovL3d3dy5iYWlkdS5jb20vcz93ZD0lcyZpZT11dGYtOCcsCiAgICAgICAgICAgIGZhdmljb246IGljb24uYmFpZHUsCiAgICAgICAgfTsKICAgICAgICAvLyBlbmdpbmVMaXN0LndlYlswXSDkuK3pl7TnmoTmlbDlrZfooajnpLrmjpLluo8o5pWw5a2X5LiN6IO96YeN5aSNLOWQpuWImeWQjumdoueahOS8muimhuebluaOieWJjemdoueahCks6LaK5bCP5pWw5a2X6LaK6Z2g5YmNLOWwj+S6jjDor6XlvJXmk47kuI3kvJrmmL7npLrlnKjpobXpnaLkuIoKICAgICAgICBlbmdpbmVMaXN0LndlYlsxXSA9IHsKICAgICAgICAgICAgLy8g5pCc57Si5byV5pOO5ZCN56ewCiAgICAgICAgICAgIG5hbWU6ICdHb29nbGUnLAogICAgICAgICAgICAvLyDmkJzntKLlvJXmk47lnLDlnYAs5YWz6ZSu5a2X5Y+Y6YeP55SoJXPku6Pmm78KICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT0lcyZpZT11dGYtOCZvZT11dGYtOCcsCiAgICAgICAgICAgIC8vIOaQnOe0ouW8leaTjueahOermeeCueWbvuaghwogICAgICAgICAgICAvLyBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQ3lFbEVRVlE0alhXVDcydFRkeFRHdjR5TitjWS9vTUZHcVFwRDdaanRzQUYvb1BFWEdGaHRiVUVuNG1TVGF0U0pWdWEwVU5OU0VHLzAxVUFIMG02ZE4xaGRXNVNickUzc2drcjFoYjlsUlRGVzNVcHFjeTFOekUxeWMvUHJmdmFpYTdkTSs3dzg1M2tlem5NNFI0aDM4YUhkYnQ4Z1NaSmJVUlN2MysrL0pzdXlwNkdod1dtMVdzdmV3LzhYTnB0dGVUQVl2TUVNaUtqcXVNdmxhaFZDekhwSFhGZFhWNjlwV2hMQUhIdE5TbTduYmRNaFlvMTcwVTYxa0xrWm5EWlNGTVVyaEpnOUxhNnFxckxwdW00QTZGY3VNKzVZUmVSVEs1SHlVaUxsVmlKTFNvbFVMaUIyZUErbUZnZEFsbVdQRU9JRElZVDRhSEJ3OERhQTN0T0RhdnVFU01WOG9ydnFTWjcvQWYxWEQvSFc3MUhYVktLZGJzUFVVOU9UMU5UVTFBcTczYjRCZ1BoTEpyWXRZMnp4UXVLdHh6QVRXbEgrL012bllKcEZ0VUFnTUNEY2J2Y1pBSE9ralhTSElINTBMWVczaVpuMldJUm9OQm9UaXFKNEFmSVBxOG4xQ3dyREI0cElQdzVrY1A2azAraEowK2hKOCswdmFVNWVOZEN6azMwUkNBUUdBUEwzMTFQd0NualZYR1N3Kzd6T3ZJTWE1VWNUVkRRbCtPeDRBb2M3eWZnL1F3cFpsajBBNXBOdk1MMkNwL2QyRmhtRXhncmNlWkhuMFo5NTJxOW5xR2hLc09Oc0NpTVAyV3cySjV4TzUzNEE0ODFWM04xbExMMjRtZC9EZDk2YjJkV2RaZkYzR2kyOXhxUjVLRFFzU2twSzVrYWowWmhoRnRnVmJLT2tmVFVydTcra0srUmpOS2tTenlSNEZndlJIT3puOCtZSlZyYWtlZnhYSGdCSmtrNExJWVJ3dVZ5dEFPSFVHN2IySDhiYXNacjVuZXRZMi9zVm03MzdXSFpwQzNNNlZyRGszQWt1M0pxOGc5SFIwVEdMeFdLZE9zYVBmVDdmYndCYUxzV1pCeDFzdlBJMWkrUk5sUDI4anNxdUxXejNIOEUzY2cwQXd6QXlEb2ZqaS8rL3crek96czRMVTNtVFpwckhFOCs0cS83QmNHSmtlZy9oY1BoMWRYVjF6WXdmV1Z0Ylc5ZlgxK2RYVlhWOFNwVEw1ZkpEUTBOUEpFbHlXeXlXMHYveS93YnVvNjBCcFdreUFBQUFBQUJKUlU1RXJrSmdnZz09JywKICAgICAgICAgICAgZmF2aWNvbjogaWNvbi5nb29nbGUsCiAgICAgICAgICAgIC8vIOW8g+eUqO+8m+aQnOe0ouW8leaTjue8luegge+8iOm7mOiupHV0Zi0477yJ5aaC5p6c6Lez6L2s5ZCO5Lmx56CB5Y+v5Lul5aGr5YaZICdnYmsnCiAgICAgICAgICAgIC8vIOW8g+eUqO+8mmVuY29kaW5nOiAndXRmLTgnLAogICAgICAgICAgICAvLyDlpoLmnpznvZHnq5nkvb/nlKjnmoRnYmvnvJbnoIEKICAgICAgICAgICAgZ2JrOmZhbHNlLAogICAgICAgICAgICAvLyDmlrDmoIfnrb7pobXmiZPlvIAKICAgICAgICAgICAgLy8gYmxhbms6dHJ1ZSwKICAgICAgICAgICAgLy8g56aB55So6K+l5pCc57SiLCDlj6rlnKjorr7nva7kuK3mmL7npLror6XmkJzntKIKICAgICAgICAgICAgLy8gZGlzYWJsZTp0cnVlLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC53ZWJbMl0gPSB7CiAgICAgICAgICAgIG5hbWU6ICflv4XlupQnLAogICAgICAgICAgICB1cmw6ICdodHRwczovL2NuLmJpbmcuY29tL3NlYXJjaD9xPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogaWNvbi5iaW5nLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC53ZWJbM10gPSB7CiAgICAgICAgICAgIG5hbWU6ICczNjAnLAogICAgICAgICAgICB1cmw6ICdodHRwczovL3d3dy5zby5jb20vcz9pZT11dGYtOCZxPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UveC1pY29uO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUI2MGxFUVZSNG5JV1R2V3RUVVJUQWYrZStHcFBXUkZwdG1pZ0lEaFdFTG81K0RLTENNeFpFSmZWakVoVHFvazRPL2dlaWsyTWRPdWhVbTRvZ3BUUzZpTlFvUlYzc0lPcVFncGlYMk5LRXBySDU4QjJIdk1RRVVuTzNlemkvMy9tNFhLSEQyZnZ5d3JDcjFvaXJidldQdWg5WFlzOHpuZklBcFBVU21SOTdLSEFiYVk4clZJQnh4MDQ4N2l6NE1MNHRzcnJtQ0F4c1Zja1RwUnc3Y2JRMVpnQ2lxMnZMRFZpVlNhdEFiOFpPU01aT2lFdHRDRmowcWgySnpvOGwyanFJSk9NM0JKbW93eEozVGs4LzYxUTlrb3hQQ25JTndIWE4vbXpzYVJyQUNEendjbDV2QlFNNDlzeDFWRGNBUk54SExTTklxRzUxYi81dmZnQVZ1Vi92bStOdE93QUk2c2IzcmdLVmhUcVA3NStncHZUbEsyU3N3TTV1Z2hvYTlhOVhRZEdtWUtLMHBGOUNLWllxaTdlNkNUNVhGKzUrNjN2TGxjS1A1VVpNaXJPRFV6MUdMZ0ZzTDJwUUx2NHFkb0xMYzdzUEtlWVRRRW5OMVlGUjV3bUE2RFMrOG81d3VUNmpibUxNd1VBc20yNkZmOCtHVDRuaEZZQkNQbkFtMTkvc0FLRDBJbnpZOUpCcUVzcFBSZDhnK0ZFNUlVTElnOTNOY25tWHorYzdhWW5NcU9xVUFlZzltM3VuUm9mVmUyZUVQU0p5V1pCekRSalZ0TitTVVAvNVF0NFMyZWZWUDlEMmFRQktjNFBIQk82SXlvaENWZUE5dVBmOG95dGZXL1BXazBQaG9KM05kVnQ4MS9NWHdieTRiQUNZcUdJQUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgICAgICAvLyBkaXNhYmxlOnRydWUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LndlYls0XSA9IHsKICAgICAgICAgICAgbmFtZTogJ3lhaG9vJywKICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9zZWFyY2gueWFob28uY29tL3NlYXJjaDs/cD0lcycsCiAgICAgICAgICAgIGZhdmljb246ICJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHQ9JzE2NjY4NzI5Nzk0MTknIGNsYXNzPSdpY29uJyB2aWV3Qm94PScwIDAgMTAyNCAxMDI0JyB2ZXJzaW9uPScxLjEnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgcC1pZD0nMTM0NjYnIHdpZHRoPSczMicgaGVpZ2h0PSczMiclM0UlM0NwYXRoIGQ9J001MTMuMjE2IDY5LjU2OEMzMzIuMjI0IDY5LjU2OCAxNjEuMjE2IDQ1Ljc2IDAgMHYxMDI0YzE2MS40MDgtNDUuODI0IDMzMi40MTYtNjkuNjMyIDUxMy4yMTYtNjkuNjMyIDE3OC44MTYgMCAzNDkuMzc2IDIzLjIzMiA1MTAuNzg0IDY5LjYzMlYwYy0xNjEuNDA4IDQ2LjQtMzMxLjc3NiA2OS41NjgtNTEwLjc4NCA2OS41Njh6IG0yODMuNTg0IDg3LjQyNGwtNi4yMDggOS43OTJjLTUuODI0IDkuMjE2LTExLjAwOCAxNy4wMjQtMTguMTc2IDI4LjAzMi05LjYgMTQuNC0yNy41ODQgNDMuMDA4LTQ5LjIxNiA3OS44MDgtNi4wMTYgMTAuMTc2LTEzLjM3NiAyMi40LTIwLjk5MiAzNS41ODRsLTQ0LjAzMiA3NC4zNjgtMTYuMzg0IDI4LjYwOC00My4zOTIgNzUuNTg0Yy0xNC41OTIgMjUuNzkyLTI4Ljk5MiA1MS4yLTQzLjM5MiA3Ni40MTZ2MjUuNDA4YzAgMzUuMiAwLjc2OCA3My42IDEuOTg0IDEwNy43NzYgMC41NzYgMTUuNjE2IDEuMjE2IDQzLjM5MiAxLjk4NCA3Mi43NjggMC43NjggMzUuMDA4IDEuNiA3MS4yMzIgMi42MjQgODkuNmwwLjE5MiA1LjYzMnYwLjU3NmwtNi4wMTYtMS42LTYuOTc2LTEuNzkyYTE5Ny45NTIgMTk3Ljk1MiAwIDAgMC0yMi41OTItMy41ODQgMTcyLjIyNCAxNzIuMjI0IDAgMCAwLTI4LjQxNiAwIDE5NS43MTIgMTk1LjcxMiAwIDAgMC0yOS41NjggNS4zNzZsLTYuMDE2IDEuNnYtMC41NzZsMC4xOTItNS42MzJjMC44MzItMTguMTc2IDEuNzkyLTU0LjU5MiAyLjYyNC04OS42IDAuNTc2LTI5LjM3NiAxLjQwOC01Ny4yMTYgMS45ODQtNzIuNzY4YTI3MjEuOTIgMjcyMS45MiAwIDAgMCAxLjk4NC0xMDcuNzc2di0yNS40MDhMNDI1LjYgNDg4Ljc2OGMtMTQuMjA4LTI1LjAyNC0yOC45OTItNTAuNjI0LTQzLjItNzUuNTg0LTUuNjMyLTkuNi0xMS4wMDgtMTkuMi0xNi4zODQtMjguNjA4LTEyLjgtMjIuMjA4LTI5LjM3Ni00OS45ODQtNDQuMDMyLTc0LjM2OGEyMDM4Ljc4NCAyMDM4Ljc4NCAwIDAgMS0yMC45OTItMzUuNTg0IDE5ODYuMTEyIDE5ODYuMTEyIDAgMCAwLTQ5LjIxNi03OS44MDhjLTcuMTY4LTExLjAwOC0xMi40MTYtMTguODE2LTE4LjE3Ni0yOC4wMzJsLTYuMjA4LTkuNzkyIDExLjIgMy4yYzE0LjIwOCA0LjAzMiAyOC44IDYuMDE2IDQ0LjQxNiA2LjAxNnMzMC41OTItMS45ODQgNDQuNjA4LTYuMDE2bDMuMzkyLTEuMDI0IDEuNzkyIDMuMDA4YzI3LjU4NCA0OS43OTIgMTAxLjgyNCAxNzEuNzc2IDE0Ni4xNzYgMjQ0LjggMTUuMTY4IDI1LjIxNiAyNy4zOTIgNDQuOTkyIDMzLjQwOCA1NS4xNjh2LTAuMTkyIDAuMTkybDMzLjQwOC01NS4xNjhjNDQuNDE2LTcyLjgzMiAxMTguNTkyLTE5NC44MTYgMTQ2LjE3Ni0yNDQuOGwxLjc5Mi0zLjAwOCAzLjM5MiAxLjAyNGMxNC4wMTYgNC4wMzIgMjguOTkyIDYuMDE2IDQ0LjYwOCA2LjAxNnMzMC4yMDgtMS45ODQgNDQuNDE2LTYuMDE2bDEwLjYyNC0zLjJ6JyBwLWlkPScxMzQ2NycgZmlsbD0nJTIzNEMwN0EyJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIsCiAgICAgICAgICAgIGRpc2FibGU6dHJ1ZSwKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3Qud2ViWzVdID0gewogICAgICAgICAgICBuYW1lOiAn5pCc54uXJywKICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly93d3cuc29nb3UuY29tL3dlYj9xdWVyeT0lcycsCiAgICAgICAgICAgIGZhdmljb246ICJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHQ9JzE2NjY4NzI4NjA2NTUnIGNsYXNzPSdpY29uJyB2aWV3Qm94PScwIDAgMTAyNCAxMDI0JyB2ZXJzaW9uPScxLjEnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgcC1pZD0nMTE0OTYnIHdpZHRoPSczMicgaGVpZ2h0PSczMiclM0UlM0NwYXRoIGQ9J003MTYuOCAwYzE2OS42NjQgMCAzMDcuMiAxMzcuNTM2IDMwNy4yIDMwNy4ydjQwOS42YzAgMTY5LjY2NC0xMzcuNTM2IDMwNy4yLTMwNy4yIDMwNy4ySDMwNy4yQzEzNy41MzYgMTAyNCAwIDg4Ni40NjQgMCA3MTYuOFYzMDcuMkMwIDEzNy41MzYgMTM3LjUzNiAwIDMwNy4yIDBoNDA5LjZ6IG05MS45MDQgMzA1LjUzNmMtMTguMzA0LTIyLjAxNi0xNzYuMTc5Mi05Mi44Mzg0LTMzMy44NDk2LTg3LjY2NzItMTU3LjY3MDQgNS4xNzEyLTI3Ny41NjggODQuMzkwNC0yNzcuNTY4IDE1NS42ODY0IDAgNzEuMzA4OCAyMi41NDA4IDE2MS4zODI0IDI3Ny41NjggMTkyLjU2MzIgMjIxLjQ5MTIgMzAuMzM2IDExNC4zNDI0IDExMy44OTQ0IDAgMTEzLjg5NDRzLTE4MC4wODMyLTQxLjE3NzYtMjI4LjgyNTYtNDEuMTc3NmMtNDguNzQyNCAwLTgxLjg1NiA0Mi4zODA4LTIxLjIyMjQgOTYuNTg4OCA1NS4zNiA0OS40OTc2IDE1OC42MzA0IDYyLjEwNTYgMjUyLjg1MTIgNjkuNTY4QzU3MS44Nzg0IDgxMi40NTQ0IDgzMiA3OTQuODggODMyIDYzOC44MzUyYzAtMTUyLjkwODgtMjA1Ljg2MjQtMTk2LjM3NzYtMjk0LjUwMjQtMjA2LjA0MTYtODguNjI3Mi05LjY3NjgtMTMxLjEyMzItNDQuMDA2NC0xMzEuMTIzMi01OS4yMzg0IDAtMTUuNTI2NCAzNy41NTUyLTU0LjA1NDQgMTIzLjI1MTItNDQuMDk2IDg1LjY5NiA5Ljk1ODQgMTgyLjYzMDQgNDQuMDk2IDIyMS42OTYgNDQuMDk2IDM5LjA3ODQgMCA3NS42OTkyLTQ2LjAwMzIgNTcuMzgyNC02OC4wMTkyeicgZmlsbD0nJTIzRkY3RDJBJyBwLWlkPScxMTQ5NyclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiLAogICAgICAgICAgICBkaXNhYmxlOnRydWUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LndlYls2XSA9IHsKICAgICAgICAgICAgbmFtZTogJ1N0YXJ0cGFnZScsCiAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vd3d3LnN0YXJ0cGFnZS5jb20vZG8vYXNlYXJjaCRwb3N0JHF1ZXJ5JywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUE5RWxFUVZSNG5PMldUVW9EUVJCR1g1dHhJTVJzL0VGQkFtNDlpRWZ4Qk41SjhBQWVad3drZ21UUjZlNlpIc05NRE8yaUZrRXlpYnFRY1ZHMSthcTc0S3ZYdGVreTl3OHAwV01jOWRsY0FSUkFBUlJBQVJUZ1h3QmsrejVqWXlBLzNwN3p2RHYvTHRwMk4yL1hvaWxCTmo0Unc2c0x1RHlYd3VSYTlPeFVkRHo2YWpvYy9od0FZTFVTcmVydG5WMkttcFQ2WFVpeXZ6QnRHcGx4alBMa3Nvb0ErRkFCNEh6WkRkQTBhMktzbWIyKzRYekpZbUZ4UGxCTTUxanI4YUhDTGdQT0JRRHFkNW50eDJaekVDZ2JEUGJXek9QVGN5cW1NNXd2S1Y3bU93MjZ6QThaL2piTXplMmRMcVVLb0FBS29BQzl4aWMrR21LOVMwT0p2QUFBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgICAgIGRpc2FibGU6dHJ1ZSwKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3Qud2ViWzddID0gewogICAgICAgICAgICBuYW1lOiAnWWFuZGV4JywKICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly95YW5kZXguY29tL3NlYXJjaC8/dGV4dD0lcycsCiAgICAgICAgICAgIGZhdmljb246ICJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHQ9JzE2NjY4NzI2Mjg3MzQnIGNsYXNzPSdpY29uJyB2aWV3Qm94PScwIDAgMTAyNCAxMDI0JyB2ZXJzaW9uPScxLjEnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgcC1pZD0nMTA1MTYnIHdpZHRoPScyMDAnIGhlaWdodD0nMjAwJyUzRSUzQ3BhdGggZD0nTTQ1MSAxMDI0VjY5MS44TDIyOSA5NmgxMTEuNmwxNjMuNiA0NTkuNEw2OTIuNCAwaDEwMi42TDU1My42IDY5NS42VjEwMjRoLTEwMi42eicgcC1pZD0nMTA1MTcnIGZpbGw9JyUyM0ZDNDAxRCclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC53ZWJbOF0gPSB7CiAgICAgICAgICAgIG5hbWU6ICdEREcnLAogICAgICAgICAgICB1cmw6ICdodHRwczovL2R1Y2tkdWNrZ28uY29tLz9xPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQURpRWxFUVZRNGpYV1RmVkRUQlJqSG4rdXlpOEtBYld6Ny9UYmVOemVVZU5rTENsakdTM2hyc3BEVXNDN3ZxaXZ6NWNJL090UTd2U3hOcnB2ZGtReDBrMTBNNUZZZ3p0RUNnZk9vTTdrdXJzNklGeDFqYTd4c2dNaUxBeVNEZmZ2RHRMcnM4L2Z6K1Q3UEg4K1g2QkZJUXlteE9HYjFXeVd5OENPSDEzTEw5c3ZDU2d0RW9UdDRSTXlqNWgvQ0lSS2ZTSW1zTUt1NE5yT0taNnZad0RhZnoyVGJhamF3OXVyMXdpYnplbUhqKzdMd28wUzA2ajl5WXRncVJYMG0yMTZsRkRTMEZDUjNPYmNsMy9GdkZtSkNGd3QvMFJyMGFPUEdyVmxzdXltZHVWU2hFbGpEaUNMKzNoeENVYldaVEx0QndmdXFYeWVaQ1RocXNUVFVqMEJyUFVaMnBzR1RFNG14UWlsbXQ4dHdMVC9XVmFVU1h2Z3NqVzhob3NlSmlPaFlVdVRwU3FXdzhZWW1QakM2SlE1VHRYcXNMQVlBQU11M2ZMajllU2s4ZVF3OE9pbW1YcEdqTXpmV2FVNW52OTRSdmZvZGtvUStzZTZjbW0yK3RER3FlMUlqeG0rSFhzZDRJSWk1K1dVQVFCREE2TVJkZVBkcTRjNFh3MTJ3QmxORmlmZ2luVzB0VHhOOFNhOUdoKzAycWxoN3YwYXlPSlROaDhkNEV2N0FNcTRQK0JBTTNnLzRybThLdmRWbjRINmV4V0NPSE1NYU9UcXpZMXdHSlhPUkRrZzVIMWVybVpZUm5ReXViQ0VHOVIvQXY3Q0Nzbk9kK1AzZUNnQ2c2OFlDYm5aMFlHeVhDTGYwQW93ZmpNTDFQTW04VWNIYXFWVE9PMVdqRm5XTUZNamd5aFdqWjQ4T0MzL2NQeDlZUm5ENlBPQXJBb1pTc2ZUOWs3alRFSUhSL1RIb3laWGVyVll6TGZSZVF2alJzMHFSdzdORkJtZCtISDRwVE1YazZNaGYvalRnNFdER1JCamV4NGYzM1RoNDNvakhvRWFHN256SlhLV1NzZEhMd21kMlZTbUU5aDlmbE13TmFxVDROU2NhM211ZGVNQ3M0eERHajRmZ2RpVWZjMVlPSnNzRjhPcGtjR1RGOUZVb21JdkVJUkliMGxpN1JTWCtkcXhBanQ2TkFneFlEQThEcHExMTZFK0poSGR6UEp4YUtmcHlaQmpXeW1GUXNQWlBrdmdXSWlMYW5jQTlVcDdDMks1c2l2ZDZYeENoOThNUytKWW1NRHp2eHFKN0FOMkZjdFNWS3RDOWRTMThMeVdpWGgzZFpWS0syNTdqUGFWOThJeFBuMG9XTnBZbENlcmExY3hOLzU1aXRMcHQySDQ1QTN1dmJNT2JqaXk4OXBNV1A3eWRpb1prMGRYeUZOWldJdUdXL2FzTG9VUjhmWkxRZW5vZDMyNU1senN1WExWTUhuTWVSSVhyTEM2N0c0T0hQOHJvUFo0aGFqSTl5N1lkU09COStuK0ZmS3c0S21MZlNVbEViZFBPdko5ZEp2M3NVbk1UWm1xTTl5eXBzZCtja0hMTm03Z2hXLzhwL0FscDMrOGk4N09ISWdBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgICAgICBkaXNhYmxlOnRydWUsCiAgICAgICAgfTsKCgogICAgICAgIC8vIOinhumikeaQnOe0ouWIl+ihqAogICAgICAgIGVuZ2luZUxpc3QudmlkZW8gPSBbXTsKCiAgICAgICAgZW5naW5lTGlzdC52aWRlb1swXSA9IHsKICAgICAgICAgICAgbmFtZTogJ2JpbGliaWxpJywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL3NlYXJjaC5iaWxpYmlsaS5jb20vYWxsP2tleXdvcmQ9JXMnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQXdFbEVRVlE0amEyU3l3MkRRQXhFaHd2ZElIRWtsRU5GVUlJTjVFQWZ0R0FqaWdBNmNBNThrckJaYVpNd2tpKzducWZSN2dDN3pDTFFVS0RSQkQ0MW1vQ0dBbWFSZTltT0tVZ01yQXNheVZ5elpHQmRRR0pveDlRRm1FVmdiVDlDWHMyazkvY0VuY1VnS2NFeXJRc0JzKzZXNkN3R1NNcGdvenNsUURLRHhGQnI3bjI4czJyTk44Q01nL2F0RHQ4WndOcUR0WGNNNTNNdndKZkl1M2Q1Z2xCZENaaTNodDJDemZzM3Nrd0FhL1Z6a1Zpclo1V1BKRUV6ZzdWYXEveW5IaDB5T0xyQkxxbjNBQUFBQUVsRlRrU3VRbUNDJywKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3QudmlkZW9bMV0gPSB7CiAgICAgICAgICAgIG5hbWU6ICdZb3VUdWJlJywKICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vcmVzdWx0cz9zZWFyY2hfcXVlcnk9JXMnLAogICAgICAgICAgICBmYXZpY29uOiAiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB0PScxNjY2ODcyNDM3MTY3JyBjbGFzcz0naWNvbicgdmlld0JveD0nMCAwIDEwMjQgMTAyNCcgdmVyc2lvbj0nMS4xJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHAtaWQ9Jzg0MjknIHdpZHRoPSczMicgaGVpZ2h0PSczMiclM0UlM0NwYXRoIGQ9J000MjYuNjY2NjY3IDY4Mi42NjY2NjdWMzg0bDI1NiAxNDkuODQ1MzMzTDQyNi42NjY2NjcgNjgyLjY2NjY2N3ogbTU4Ny4wOTMzMzMtMzU1LjU0MTMzNHMtMTAuMDI2NjY3LTcxLjA0LTQwLjcwNC0xMDIuMzU3MzMzYy0zOC45NTQ2NjctNDEuMDg4LTgyLjYwMjY2Ny00MS4yNTg2NjctMTAyLjYxMzMzMy00My42NDhDNzI3LjE2OCAxNzAuNjY2NjY3IDUxMi4yMTMzMzMgMTcwLjY2NjY2NyA1MTIuMjEzMzMzIDE3MC42NjY2NjdoLTAuNDI2NjY2cy0yMTQuOTU0NjY3IDAtMzU4LjIyOTMzNCAxMC40NTMzMzNjLTIwLjA1MzMzMyAyLjM4OTMzMy02My42NTg2NjcgMi41Ni0xMDIuNjU2IDQzLjY0OC0zMC42NzczMzMgMzEuMzE3MzMzLTQwLjY2MTMzMyAxMDIuNC00MC42NjEzMzMgMTAyLjRTMCA0MTAuNTM4NjY3IDAgNDkzLjk1MnY3OC4yOTMzMzNjMCA4My40NTYgMTAuMjQgMTY2LjkxMiAxMC4yNCAxNjYuOTEyczkuOTg0IDcxLjA0IDQwLjY2MTMzMyAxMDIuMzU3MzM0YzM4Ljk5NzMzMyA0MS4wODggOTAuMTU0NjY3IDM5Ljc2NTMzMyAxMTIuOTM4NjY3IDQ0LjA3NDY2NkMyNDUuNzYgODkzLjU2OCA1MTIgODk2IDUxMiA4OTZzMjE1LjE2OC0wLjM0MTMzMyAzNTguNDQyNjY3LTEwLjc1MmMyMC4wNTMzMzMtMi40MzIgNjMuNjU4NjY3LTIuNjAyNjY3IDEwMi42MTMzMzMtNDMuNjkwNjY3IDMwLjcyLTMxLjMxNzMzMyA0MC43MDQtMTAyLjQgNDAuNzA0LTEwMi40czEwLjI0LTgzLjQxMzMzMyAxMC4yNC0xNjYuODY5MzMzdi03OC4yNTA2NjdjMC04My40NTYtMTAuMjQtMTY2LjkxMi0xMC4yNC0xNjYuOTEyeicgZmlsbD0nJTIzRkYwMDAwJyBwLWlkPSc4NDMwJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnZpZGVvWzJdID0gewogICAgICAgICAgICBuYW1lOiAn5LyY6YW3JywKICAgICAgICAgICAgdXJsOiAiaHR0cDovL3d3dy5zb2t1LmNvbS9zZWFyY2hfdmlkZW8vcV8lcyIsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFCbkVsRVFWUTRqWjJTdjJ2Q1VCREh2NE9GWUVBZVJyRmloamVZTGwzZUlMUkRoa2NYS1FnNnRXQUhzNFc2V0JBcTJDV0NGTGU0Q1M3Wk9oV3l1SFRLNHVEbXBLdEQvNEFzM2RPaE9Zay9TckdCZzNmYyszN3U3dnNDQU96dFB1ZC9EWGhFc2VvVU43Y1g2UWJpNy9ZaTNWaDFpaHVxVCtwWkR3QURBSXlxekUyS0tXYXRmRURpWS9XNVhWZ0NBR2F0ZkVCZG0wSzFta0sxK3BJNU5BRjFqZ1dzS1ZTTElFMmhXcjkyR0ZXWkN3Q1VKMWVhMjRYbDE0QkhmY2tjQUlESkZUbXBaejBxVUpoY2tYOEN5SU5SbGJubkREdzVrY2tWbVZ6QjVJcDh2TW84N2F5dy93SVVuejA5M0FjZU14a0FXRjh5aDh6ODdPbmgyMzNPdjh5ZkNicGdja1ZTbzdsZFdNYTdzMWgrempWNzdHZnVubDBTS05jTlMrdDZBVXFHVUc4ZW51aE1kYzBlKzVvOTlnRUFxWEpGNnROMXBFL1hFWWtwejlUYWp0YjFBam9UZ09xcGNrWHVBSkxpb3JzSVVUTEVTWUI5TVFEOEM1Qi9lVitTU1NjQk5IdnM3ME1Jd0ZwRDc4Q3praUVPVEdTdG9aY0VabXB0WjV0M3ZhRG9Ma0o5dW80S3J4K2JuM2xLaHRqdVRUOUdESW1mbGlXaFczSHMwVGRrNnBHQ1AxV0tzd0FBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnZpZGVvWzNdID0gewogICAgICAgICAgICBuYW1lOiAn6IW+6K6v6KeG6aKRJywKICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly92LnFxLmNvbS94L3NlYXJjaC8/cT0lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3gtaWNvbjtiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFDTlVsRVFWUjRuSzJTUzBpVVlSU0duL1AvNDJVY0xDWERJb3lrYUtobFNWQ2JHbHUxTWtnU0pLRTIwc2FveUcyUTdRTnBGMFJJaTZnb1hLUWtMb0lRaGpCQ05CQWRkRkxHV3cwcTN1YS9ueGEvODJlRjBLSUQzK0s3dkMvUGViOERPK3BLV2k4MHA5VzVtdGJIL0dQSnpzM2xvVUFGa09LcDZHeWxiU1I3VW1MdFptRG9BSTA2Z0U0UDc4KzJuajdGdm9yUHVCNjRIbmllSEY0MXRkRDAwYy9zU3FEdlJFSHBQWEYyemoyNGVBZ1JCQmlkYTJkNHBoT1JrQ2lFTXU3M3BlVGg3d1p2UlFHZU5KemJpdS9KVllTQzBFUUVSbklkZkptOUhSbXBxRE40MFN4SFFwMkJEVGpneUhMY3NuMmFFa05jaXZmak9BYTJFM0N5dHB1Mk0vV1VtclBZcnVJNmxLYmUrMEdxWDQrR0JNOE1SYUE3VllzSTNLcWJqL0JXdkVsZTVodERJb0dKcFRiUzJhNXRPaUhtbS9VR0ZtQkJ3ZmF4N0FBbGlBeXFZOGU1ZVNCSG1WZUhaZmtjcWVyQmRuMHNCeXhIMmZEZDBSaDJtSkJsK3dqQ2xyZUtJV2E0TUJsZjcyVnhjNHBpTnBadElHajQxYUpQWTFnQ29oVHNBQUUyL0IrWWxMRHNaSGsrM1JLRlozczF2QjRaUlVUREZtQXFjNlBzVGd3N2pIdHpyZHFQbGVmTm5vbnJMQmJHb3o1RjRFUG1CUXRyS1JEZE50UTN1Zlo0TTBBTUoreDM3NHF4dFZJVFZINWIvUm9KeCtZN0dWc296c0kyTnBMTWQ4UW5pem5Gc0puQWtHVEQwckxmdHpkQVJQZzA4NGlwL0RVb0NnRkJYNjNmUzdUOE5Za0FlcmRrTUJ1ditwNU1aRnFWa2w4WDRXM1d0UkxIZUNEQm4rTG9TVlJkR3g0aVpqZ2dPcVIrNHZ4dXd2OVdQd0hnMi9KNU5GUjJPZ0FBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnZpZGVvWzRdID0gewogICAgICAgICAgICBuYW1lOiAnQWNGdW4nLAogICAgICAgICAgICB1cmw6ICdodHRwczovL3d3dy5hY2Z1bi5jbi9zZWFyY2gvP3R5cGU9Y29tcGxleCZrZXl3b3JkPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQURmRWxFUVZRNGpYM01iVXpVZFFEQThiLzF4clcxdGxocnRtYXRGMXFyVms1b3BhakxVU2NnSnRvSXhYalExaW9icXphVjFNQ1dxWm0yRXVtTzgrQzRCdzRPTXNDOEVHZ2VXa3FpOHZ5L1A4Y0JKOGNkVHdjY2ovNnUrNC83OXFMVnk3N2I5KzFIY3ZiNFEyL291a1M2U1JaWjVZckl0THBFcGtVVzcxcGtrVmdSRk8rYi94VFpwamFSWVhHTFRLdExaSlVyWXBkWkZocGRsNmh0SHdwSlNTVnVra3I3U0RWNWlOY3FwSlI1ZUs5UzVoVzc0TGpSeXJjWENrbXlUYktuMGt1S3NZOTRyVUthMWNOMms0ZlhpM3VSTWl3dXNibFlJYWZLUzBGamdHMGxDcXZMd3BoczUvRVZQaytzWFpEOWs0L2trbDUybXZzcGFBcXdVZGRMdkU0aHk2SUlLVUhiS2ZLYkF0d2NtcWZaTzRkdmVvSG5LaURiMUVxYkxwa1hxeU9zcW9ZMWhpbUdwaFpwSDdtUGR5ck1TZWNJYTg3Y0VkTG5sd2JGRjQwQmZteVpvRVlPc1FnTWQxNUcrOVVPRk1NV2hnM3gxSjNZU0dkTEhUZm5vL3pjT2NXLzdhdFFoTFRWMEMyT1h2SGpVR2JJS1hjVEJHWnZGY0VoQ2JYNFNkQStBb2NsRnAySHFGcUU3NXRIL3dNSzZnZUZsR05UUkZpTkFuRHMraEszdzlCMlBnSDEzRU9NNlY1aVRMK1d2d29mcGpWL0JVRVY2b2JnK0cvRDJMdENIS3NmRk5JSGRyY2d1c1RjRXVUNW9iUG1CRE41RXNFZm5tQksvektoNGhjWTE4Y3krdGtEZEJXOXliQUtlaGU0L0NFTy96SWdwQ3lySXB4K2xkblFHTzFuWGdYZE1xS09EU2c2RFNIdE04eWVYbzc3M0FiVW9CdXFINlB4d3hXdzRDY2dJTXZxRXRMUlN4NXhiUUZxelBsd1JDSjMzVExXeHEzblhzY05WRzBNYzJjZkpTZzNrTGIzSU50M1poQXRrR2c4R1lkakhzNWU5UXFwV1JrWFdqOGNPZkEyM0YzSnl0aDlTTXRYb1FZSFdHbyt5TXd0STBRbWlYbjhhUjZNV1FmQld2SysvSmh2MmlQYzlrNEtLYzNZTFZZWEJmbEU3d0Noc0wrb2dhZlc1eElkYlNJNjdVVWRrV0hPeWFic1U4VHQvUnJDUG5JdmgzajJPdy9iRE4xQzJtMldSWUsrbDdmcTcwT2ZBM1FmRWY2OUhHYWJRYTZDSGp0TVh5Vnl4ODZTOWdEMDZQbTBJY0JyRjN5a2w4bi9BRnZOOTloVDQyZjhqMm9pMWFlSWROY3kwWCtOOGRaYXhsb3VNcUU0Q1N1L29sNDh6ZXgxQy9zZHd5U1UrY2d3dVlTVVdPb20xZVJtdDlYREZ0c29taXZ6YUNySFNEUU1rR3dMa0dJYkpiRjBFSTB0UUdMRFBCcjdPTytZUGFTWDk1T2dkeVBWM2gwS2JTcnNFT2ttV2V3d0tpTDEveTUxaVZTakl0Sk5zdGhjMUNGTU43eWh2d0gwM1BxcmZKOGg4Z0FBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnZpZGVvWzVdID0gewogICAgICAgICAgICBuYW1lOiAn5LmQ6KeGJywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL3NvLmxldHYuY29tL3M/d2Q9JXMnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQmpFbEVRVlE0amEyU1BTK0RVUlRILzl5WFBzL3RjNTlXV3hLOXRma0NGZ3dpTkxVSVFXTWhxaEVzUW9wRlJjVEN3T0FsSXAyTUVpRkJ3bWNnaG9iWjVpMUk2aVVtMnpWb0cxS2V0SW1UL0hLbTgwdis1eHpncTl4SlptMmtYTjZqRUZDTFVxc090UGxSS3YxdTEraHA3bDR1V1ZBUEdyNlJRWDBubFo1MTJac2xDeHBBVzYremdpU3oxdjlMd0JwQTJ5S0VSOE9FOStTSUVCNXRJcTRPQUphallJUzZrNDlTNlZ1cDlJME01cm1WUVoyUlNpOXl6N2FqWUl5S2hZeXQ5RjEyNkR1dlV1a1Y1dG41VlRERDVHb3VRZ3ZoM1QzRWlIY1NJOVpCak1FdVlneEZpVEhjVG5pZkRmaCtGY3d4YXdzQUJVQktYdUtWVmEzUFJGVm1UL2pUaDhKM2NTQUNsN2wrSWdMcFVlcWVCVkJlSUdnRWpUeG5sL1VnbFg2V29RSSs3QnA5TGlwZkFYZ0tCQUVnbUhKVkhCK0x3TVdPNlQvYnplUExjMkQ0VG1QTW5BUlE1cFNHRjUyN2lCS2R4SWdOTURQUno4enhQbVpPRERBekVXZm1WQzh4Uml5Z3luRTZ3YTJsbHovKzRNME82VFh1M1hjVXhKazVkWjg5N2M5UFZQcEpLajMvZFc1OEFrUFd0Z1ZtK3NwNkFBQUFBRWxGVGtTdVFtQ0MnLAogICAgICAgICAgICBibGFuazp0cnVlLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC52aWRlb1s2XSA9IHsKICAgICAgICAgICAgbmFtZTogJ+aQnOeLkCcsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly9zby50di5zb2h1LmNvbS9tdHM/d2Q9JXMnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQ2swbEVRVlE0alcyU1hVaFRZUmpIZjJmdXJIMXZuczB0YytwMDFZYlNhUlJHRkdtRWxSV2hSVlIwVnplQkNVa1JLUlFVVVJGQlVZdE1zQXN2d3FTTGJvcUtpaTc2b09qTExzS3dMQkxPanNNK2lCRWlFazhYT3RDREQ3end3dnYvLzU3Lys3d3ZXRXBYMVdVWHF1ZDMzVTFYUG4rMmN1SGdtNGJrOXhlTnFjK1hsMWYwZWlGaTFjOHMrd0hOZDZneldweFo3WFh0ckhCUU14L2l0UjQxM1JZUGRieXNYelE4MHF4UG5Ga2F5OHpwM2pYUDFWN25jUFM3NEJiUUQ2eXdhdmJHUW0yNWxyVGNYSk40T090Z1M1RzZMNG95RG9nTlJZRGZwZENVQk4wS2FZcDR0K2RhMG5KY1gzQWVBQitFVTlnbUFGR256SDhCMnhsY21URWxKQms4TjZ5UVc4dmpUN0xibHY3elFaajFGSFVWek5PQWRvQnJ1SHNOUlJNemxKQ1BrVVZqYTdFM0ZRQnhCNm5SemJxYzBNc3Vvc0t3ZmRwY0JKT0FFK0FxN2w0RFRReWJKbVkwS1dhZ1VucHczd2I4QU44YVV1TXZHMnVHc2NGUFVNU09JZ3JrQzEweUJRQ2FHQVNrc0wrQ3F3L2dRMTNDL0xLaEpvOFhmaTdETG82cCtKT0FmVmFDR2VzeHZvL1ZzQmhnS0ozSUR6V2svckFWOVhNdlB0bVBVdzdnRW1DM0ZmQ1Y0RVFyam81Q3VoZ3NOUFdFUEsyckhxUUZOV09peVFCQkdVT1Rianc1Z0l1NHJ4dG9jZy8vVytzUHZCTUt2ektYSktTem91UXNYb2lNRUp6TUtTRXgwT1FYbWp6QS96b0plajMyRGRZbnZHTHo5R1ZMeTJTa3Rtb1NDQUxRaWZPc1lRdEwxcmxnK3I1QitVUXdmdzUzZHpPT1Bac28ybkVDMTZVQkFqbGpYb2xrWStWeXNDUjRiQmE1Qi9kdE14Q1gwUXBkc3Q2WUdQaW5wMTg4YTVCWlgxUzZ3bHEvTlJrQVIzQ2UrbDZhbXZpeHJsbkdWbTJVMGJJYXlYckx4VkFqWXFESnNGSTgzdXJ3ZE14cG5sSCtvM2J2NlVjbFZSOEd3bFhtTzJmVXZFL2cvV0djSndHM1Zmd2ZlVzM5cFlkVWVlQUFBQUFBU1VWT1JLNUNZSUk9JywKICAgICAgICAgICAgYmxhbms6dHJ1ZSwKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3QudmlkZW9bN10gPSB7CiAgICAgICAgICAgIG5hbWU6ICduaWNvbmljbycsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly93d3cubmljb3ZpZGVvLmpwL3NlYXJjaC8lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBU1VsRVFWUTRqV05nb0NZd01USDViMkppOHA5Y2Vad0tpZFpJc1kya1loUURTQVcwTVlBVWc4aDJBYkpsdEE4RFdHaVRaUUI2bEpIbEFwSzhRRkZDZ2hsQ01NbVNvWllnQUFBdlVNVndob3gvZWdBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC52aWRlb1s4XSA9IHsKICAgICAgICAgICAgbmFtZTogJ+eIseWlh+iJuicsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly9zby5pcWl5aS5jb20vc28vcV8lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3gtaWNvbjtiYXNlNjQsQUFBQkFBRUFFQkFBQUFBQUlBQkxBUUFBRmdBQUFJbFFUa2NOQ2hvS0FBQUFEVWxJUkZJQUFBQVFBQUFBRUFnR0FBQUFIL1AvWVFBQUFSSkpSRUZVZUp5bGs3MUt4RkFRaGI4Ync3SUtnYlcwc3hVdWlQZ0EydHRzb2RoYUxPd0RpQkR5QUxLTm5ZV0JGSllpS3R0c3BVaGFRUkFoNEdNb0JEU2t1UlpPZEhURGtyZ0hCczZkbnpOVDNBTnp3a1NKWFFVT2dQVnVKK2dERkdWZTI5enRCRWg5RER3RDV6N3dCUFQrTnI1LzVCT2RXMW9NZHRTekw3SGx5L0RiOFNCYmJuTjZsTmhYWUx2TlRDMU1HRnNISEFKcndFRFZKc0E5Y0NLYlVyV3g0cW1uQmxZQVJzUE16Rmg0SlBFTlg1UTJHMXg3QmV3S3Y2dVNucHpUQkJlS24ybUJYM0RPMVY0ekdtYlhkWHhLb0MybUJFNXY5aC9uVW54NHVkd0xZK3ZDMk40MjZUZFJZaDMvLzRrOVV4SDRNUXN3MHd2S2JLa1BiQ0J1NU1zZ0ZHV090NEEyRDBXWjZ3Vmp4STJmbGVaUXZDT2crMUFBQUFBQVNVVk9SSzVDWUlJPScsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnZpZGVvWzldID0gewogICAgICAgICAgICBuYW1lOiAi5qix6Iqx5Yqo5ryrIiwKICAgICAgICAgICAgdXJsOiAiaHR0cDovL3d3dy5pbW9tb2UuaW4vc2VhcmNoLmFzcD9zZWFyY2h3b3JkPSVzIiwKICAgICAgICAgICAgZmF2aWNvbjogImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQmNBQUFBWENBWUFBQURnS3RTZ0FBQUVaRWxFUVZSSWliVlZUVzliUlJROWQyYmVlNjd0T2s3cXhxNFR4YVVKcWRTUVFKV3FFS2hBRk1RQ3NXR0RrTXFLQlVqOEJQYndEeENiL2dCWUFCVUlnZmdvcFFKUmFOb3FyVXBJbXRBa3JmUFYxRTZjT0xIZm01bUwzblBqSkNRVll0RXJ6ZUxkKytiTXZlZWVPNE5IYVJSaU0vT3VJMHpvdjdzQ1hndEF2VzBRUWtDUExjSmVubzMrSmxlQk9sTWtUK2FobE5xMW40ajJCdmZuS3RCZmpUR3YxSURBUXVaVDRMNkRSTC9kWmVyTGtNZ2tZSmQ5bU1rbDVrb056Z3RIeUQxKzZML0IvUnNMMEovZVpIRWlCM21xUU9SSm1QTlRiSC84RytxZFFWSlBaQnViQUZnQXdmVjVtSE4vc1R4OW1OeFRoNXV4RUJ5YjRPSHlaNWF4OXY3M1hMdGFoSDNnQzVkbXh0cUhGOWdmbVkyK3JUV3d4bXp0VzFoRjVZT2YySjh1TjMyaGlTYkh6QWcrLzVQVlMyR0orV1lHb1VrQXpwdjlSTmxrbzdwS0RmNWF2UmxYN1VrNEF6bndIM2QzOE52c2hMbStBQ2FDYy9ySUR1Q29mR05BWFNtRUNkVkc1aEhVTmJ3bnM4MDRQMGhPRk5LMEp6Z21TeXc2VWp0QVE4VUVNeVdJTHliWTc0aURZZ3B5b2d6cVNvTnYzSU4rcTUrRXA2QXZGeUV2emNJT2RiSUpORWxIN2FRRm5TbmkrOVdvU1Uzd3VRcHF3MFhXQ1FsbldVUFVMRVNoQlY3Q0lYVnRBWHAwRVJ2TDY5QlhpaXdIYzBCeEZmV1BoMWxYL1VaVE54c2FoRmwrZElrVkMvQlFKem1EZVpqeCs3QmZqck4rSmt1eTdEUHRqNUh4Q0dxMHpEcnRJa2hKMm5lOEU2bzFEaElVSmVhZnZjcG9jUkYvbzUvRUptZjIyMXVRSk1HaDlDWkxVV000NDRFdDRJMlUyTFRFeUd6NExHZlhXQmVTaEtSTHNaRWxGcU5MRUtLaDZhanhyL1VTTDFTM09BOXVMa0JmbTJQMzNSTWsyK0p3UXQ5OEJYcHNDVGpXQ3B1SkUrOTNvY2FXUUZhQUN5MXdodWRaVmpUTVJJbnRxUUp0OGl2VE1ZaUVzd1hPdDBzc0J0cWgydUpOcFlUS1lNMnc3WEZTbXFGdTNHUHVheWZqeVNoRmN6Skh3V1Naa1lxUnFBY1FYZ01RZ1lFeFpndWM0aDdSUnREVXFLMEhDQWNzbEorOE9NUHU5Q3BzUGduZHhSQ3JkZkQ5RGRhU1FJY1NKQi9Qd0o5YUJoWFNrREVIUWJFQ1dOb0czdDBHYy81MnhIM29KaW5ndENmZzVGSXd0OHBrWW9yOW5sWnlSeGJaNUJLdzVScmt3UVRrczRmaENRRmt0K245OXlLcnJvYmVJNnBrSVExaUMzTjF0aUVoSlNHRWpJTHExVjdRbWY1R3g1Wjk4TklHK0dnYnVhOTBFMTJlUSsyN1c5RThoRXFwWDVnQ0w2NURQVi9ZeWp3RWNWNThqUHhQcmpNVjBxUU94SnRENUg4enpzNWduaElEZVpqZURLbXFEOW5SQWdXQ24zS0FIMlpaejFWaGpBWlhOTnd6QXlUanprNmRoeVhWZjUyRy9XV2FuWmU3aVRKeG1KK25tY3NiY044N1NjS1IyTXZxbjkxa1hxbERQTjFCOG1nR1VqWCtDMi9GNXZpSHAzalBGZUNuWE5JWFo5Z0tRR2lHNkRrQWVnaHdOQjkzS3NCUUI3bDkyVjN4UFIrTGtEK3VCYkNPUUhEMkNqdERCVklETys5eFc2bkRuQnRsVXczZ3ZmMFV5VTBwYmdJLzdDWGFidjdZUFFSZmp6TnkrNkd5U1FvSHdKVFdPV3lzYUl2QmZmMFlTZTkvUEhQL0x0MVVhekREYzhCS25hTVpUKzhqMlhNQUlwdmNkdlB0Qm45MEJ1QWZDWjRrZEV6RXdDa0FBQUFBU1VWT1JLNUNZSUk9IiwKICAgICAgICAgICAgZ2JrOiAidHJ1ZSIsCiAgICAgICAgICAgIGRpc2FibGU6dHJ1ZSwKICAgICAgICAgICAgfQoKICAgICAgICAvLyDpn7PkuZDmkJzntKLliJfooagKICAgICAgICBlbmdpbmVMaXN0Lm11c2ljID0gW107CgogICAgICAgIGVuZ2luZUxpc3QubXVzaWNbMF0gPSB7CiAgICAgICAgICAgIG5hbWU6ICfnvZHmmJPpn7PkuZAnLAogICAgICAgICAgICB1cmw6ICdodHRwOi8vbXVzaWMuMTYzLmNvbS8jL3NlYXJjaC9tLz9zPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgdD0nMTY2Njg3MzA3MzEwMicgY2xhc3M9J2ljb24nIHZpZXdCb3g9JzAgMCAxMDI0IDEwMjQnIHZlcnNpb249JzEuMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyBwLWlkPScxNDY3Mycgd2lkdGg9JzIwMCcgaGVpZ2h0PScyMDAnJTNFJTNDcGF0aCBkPSdNNjA0LjcxMjk2IDYzLjkxMTI1M2MtNTMuNTQ4MzczIDE5LjY2NzYyNy05NS4wNjgxNiA3Ny4wMzg5MzMtOTUuMDY4MTYgMTMyLjIyMjI5MyAwIDE2LjM5MDgyNyAzLjgyMjkzMyA0My4xNjUwMTMgOC43NDE1NDcgNTkuNTU1ODQgNC45MTE3ODcgMTYuMzkwODI3IDcuNjQ1ODY3IDMwLjU5NzEyIDYuNTU3MDEzIDMxLjE0MzI1My0wLjU0NjEzMyAxLjA5MjI2Ny0xOC4wMzI2NCA5LjI4NzY4LTM4Ljc5MjUzMyAxOC41NzUzNi03Mi42Njk4NjcgMzMuMzMxMi0xMjQuNTc2NDI3IDEwMS4wNzkwNC0xMzQuOTU2MzczIDE3Ni40Nzk1NzMtMTguMDI5MjI3IDEyNi43NjA5NiA2MC4xMDE5NzMgMjMwLjU3NDA4IDE3My4yMDI3NzMgMjMwLjU3NDA4IDcyLjY2NjQ1MyAwIDEzNC45NTI5Ni00My4xNjUwMTMgMTYwLjYzMTQ2Ny0xMTAuMzY2NzIgMTYuOTQwMzczLTQ1Ljg5NTY4IDExLjQ3OTA0LTEwNC45MDUzODctMjAuMjEzNzYtMjA0Ljg5MjE2LTguMTkyLTI1LjY3ODUwNyA1NC42NDA2NCA5LjI4NzY4IDk1LjYxNzcwNyA1NC4wOTEwOTMgNTAuMjY4MTYgNTQuNjM3MjI3IDY4LjI5NzM4NyAxMzUuNTAyNTA3IDQ2Ljk4Nzk0NyAyMTQuMTc5ODQtMTkuMTI0OTA3IDY5LjM4OTY1My03Ny4wMzU1MiAxMzYuNTk4MTg3LTE0Ni40Mjg1ODcgMTY4LjI4NDE2LTE4NC42NzQ5ODcgODQuNjkxNjI3LTM4NS43MzczODctMTEuNDcyMjEzLTQ0MC45MjA3NDctMjEwLjg5OTYyNy0yMC43NjMzMDctNzQuODU0NC0xMy42NjAxNi0xNDUuMzM2MzIgMjIuNDAxNzA3LTIyMi45MjEzODcgMjcuODYzMDQtNjAuMTAxOTczIDg2LjMyNjYxMy0xMjAuMjAzOTQ3IDE0Ni45NzQ3Mi0xNTAuMjU0OTMzIDQ4LjYyNjM0Ny0yNC4wNDAxMDcgNTguNDYzNTczLTMyLjIzNTUyIDYyLjgzMjY0LTUyLjQ1MjY5MyAzLjgyNjM0Ny0xOC41NzUzNi04Ljc0MTU0Ny00NS44OTU2OC0yNS42Nzg1MDctNTUuMTgzMzYtMzYuMDYxODY3LTE5LjY3MTA0LTExOC4wMTk0MTMgMjEuMzA5NDQtMTkyLjg3MDQgOTYuMTYwNDI3LTY4Ljg0MzUyIDY4Ljg0MzUyLTEwMS42MjUxNzMgMTI4LjM5OTM2LTExOS42NTc4MTMgMjE2LjkxMzkyLTM4Ljc5MjUzMyAxODcuOTQ4MzczIDU3LjkxNzQ0IDM4Ny45MjE5MiAyMjcuODQgNDcwLjQyOTAxMyA2MS43NDAzNzMgMzAuNTk3MTIgMTEyLjU1MTI1MyA0Mi4wNjU5MiAxODIuNDkwNDUzIDQyLjA2NTkyIDE1NC4wNzc4NjcgMCAyODkuNTc2OTYtNzguNjczOTIgMzU1LjY4OTgxMy0yMDYuNTI3MTQ3IDMyLjc4MTY1My02Mi44MzI2NCA0MC45NzcwNjctMTAwLjUzMjkwNyAzNy43MDAyNjctMTc1LjkzMzQ0LTIuNzM0MDgtNzIuMTIzNzMzLTEwLjkyNjA4LTEwMi43MjA4NTMtNDAuOTgwNDgtMTUyLjQzOTQ2Ny00OS43MTg2MTMtODIuNTAzNjgtMTM0LjQwNjgyNy0xNDIuMDU5NTItMjE2LjM2NDM3My0xNTIuOTg1NmwtMjcuMzE2OTA3LTMuMjgwMjEzLTkuODQwNjQtMzIuNzgxNjUzYy0xMy42NTMzMzMtNDUuMzQ5NTQ3LTEyLjU2NDQ4LTYwLjEwMTk3MyA0LjM3MjQ4LTczLjIxMjU4NyAxOC4wMjkyMjctMTQuMjA2MjkzIDM3LjcwMDI2Ny0xNC43NTI0MjcgNjIuMjg2NTA3LTEuMDkyMjY3IDQ2LjQ0MTgxMyAyNi4yMjQ2NCA1NC42NDA2NCAyOC40MDkxNzMgNzMuMjE2IDIyLjM5ODI5MyAxOS4xMjQ5MDctNi4wMDc0NjcgMzYuMDU1MDQtMzAuMDQ3NTczIDM2LjA1NTA0LTUxLjM1NzAxMyAwLTE5LjY3MTA0LTI2Ljc2NzM2LTQ4LjA4MDIxMy02My45MjQ5MDctNjYuMTEyODUzQzY5Ni41MDc3MzMgNTUuMTY5NzA3IDYzOS42ODI1NiA1MC43OTcyMjcgNjA0LjcxMjk2IDYzLjkxMTI1M3pNNTc0LjY1ODU2IDQ2MC4wMzJjMTkuMTI4MzIgNzEuMDMxNDY3IDIwLjc2NjcyIDkxLjI0NTIyNyA5LjI5MTA5MyAxMTMuNjQ2OTMzLTE4LjU3NTM2IDM0Ljk2NjE4Ny03Mi42NjY0NTMgNDYuOTg3OTQ3LTk5LjQ0MDY0IDIxLjg1MjE2LTIyLjQwMTcwNy0yMC43NTk4OTMtMjkuNTAxNDQtMzkuODg0OC0yOS41MDE0NC03OC42NzczMzMgMC00MC40MzQzNDcgMTAuOTI2MDgtNjcuMjA1MTIgMzYuNjA0NTg3LTkwLjY5OTA5MyAxOC41Nzg3NzMtMTcuNDgzMDkzIDU3LjkxNzQ0LTM4LjI0NjQgNjIuMjg5OTItMzMuMzI3Nzg3QzU1NS41NDA0OCAzOTUuMDE0ODI3IDU2NC44MjgxNiA0MjUuMDY1ODEzIDU3NC42NTg1NiA0NjAuMDMyeicgcC1pZD0nMTQ2NzQnIGZpbGw9JyUyM2Q4MWUwNiclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5tdXNpY1sxXSA9IHsKICAgICAgICAgICAgbmFtZTogJ1FR6Z+z5LmQJywKICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly95LnFxLmNvbS9wb3J0YWwvc2VhcmNoLmh0bWwjcGFnZT0xJnNlYXJjaGlkPTEmcmVtb3RlcGxhY2U9dHh0LnlxcS50b3AmdD1zb25nJnc9JXMnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBRE1rbEVRVlE0alkyVGJWQVRkQURHLzNjQkRna05OMlF5WldNaG9LUXd0TEl5US9EZ2FQdkFBVVZkZFVqVTJVVWRkM1oxdm1SMkIzVnhVV2hKcXlCUzB2QWxEbzdWSW1DV3NQTTRLY0MwQnRnWWd6Rmp6Y21ZNDJVb3Z6N2xuWjNuK1h4K2ZzK1g1M21FdUR2SjFFK0c3TDVMcndqYXFGbWVkNkQ4aWJxYVU2bWRwZDhzNzhvekxybnk2TTdGdlVLSWtEdVNjY3J3Unl5L1ZnMTRmZlVjZG10NTZhS2NwODdjUi9hM1M5QzNyc0hhdmNHMlBsNlNjVnRZczA2ZVBlUHBtTVhYUXMva20xUTR0bERRSmlPclBwdzNHbFI0LzlKeWZTd2QzNFVINXJjOEdQTDBMWEJvcUZoMTFXbVlYUEMxc0hDMWxzbnhmWlJaTkx6YmxvaXRMNGZab1h3Q2wzVE1EYVhqUDYvaHNpbDZXaG91RW04R2ZGeWVVN3ZnYmVhRyszT3VUMVF3Yjk5Sjl3VWRyNTVPNEZKdkp0Ty9hL0gzWitIdlMyT3FXNFBIRkVQTlc2R04vL0dMUE1PSGZQT3VhZ0xqK3dtTTdXRm1vSmhyL2ZrYzZYbU15dmExVEozTndOdVZ4dVNaelhnNk5MZ01TdXdubHdhRUVCRkN0alE0ZFc3OElIUDJ0NW0xbGpCajNZSC96Mks4NWl4R1RJK3p6NnloNThkVTNNWk51TDUvaUltbVpKekhWWXdmVzRZeVNxUUxkWXhrMi9UUWJ2eVdIZmd0eitNZkxHREdWc0tWam5SY2hvZjV1WFVENzdVbWNQbVVCdWZ4WkJ4SGt4aXRVekphS3lWSklmS0ZUQmE4MFh0dU85NmVBcWI2YzdrMmtJdC81Rm5jWXlYOE5GREU0VCswbEpvVGFXdUlZL1RyTll6VXhHT3JYc1h3cDFKaXBHS2JFRUpJN0UxYi9mKzBaK0V4WitJOXI4UGhMbUxNL3hwbi8zNlIwbCtTZU82SEZieCtNaExiRjNFTTY5VllEeXF3VkVUTUN5R2tRZ2doM2k5ZVdlL1FyOFphcWVCY1V3b2R6anc2SFRtY0h0RlI5OXRtOHVvanlQd3FsTDRhSmJZdlZReC9wdURRQzJFdE4ydVVTSVQ2WWxXc3ovYVJnb1k2T1lWR0JidmFWM1BBbk1JSHBpVDJ0OFpSMGh6SjRMRllSbytxR05Tdm1JMElFK3R1R1ZPcU9pVFhVcmt5MEZVVlJYYnRZdEtxRjZIVjM4c3JKK1RzYW8rbTJSVExoREVCUitQOU45TFdCeGZlZHM3cXFLQ016bmZrOXU4K2pPU1pjZ2xieTRMWS9ra1lCb01TbDJrdC9VZFV6bVQxUGJvN0hrb0lJZGtVSDF4WVdiVHNSTXRlZWEreExMcXZ1alN5TVQxRjhySVFJdXovNW44QmRCRE9VVmk1RG53QUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgICAgICBibGFuazp0cnVlLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5tdXNpY1syXSA9IHsKICAgICAgICAgICAgbmFtZTogJ+eZvuW6pumfs+S5kCcsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly9tdXNpYy5iYWlkdS5jb20vc2VhcmNoP2llPXV0Zi04Jm9lPXV0Zi04JmtleT0lcycsCiAgICAgICAgICAgIGZhdmljb246IGljb24uYmFpZHUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0Lm11c2ljWzNdID0gewogICAgICAgICAgICBuYW1lOiAn6YW35oiR6Z+z5LmQJywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL3NvdS5rdXdvLmNuL3dzL05TZWFyY2g/dHlwZT1hbGwma2V5PSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUMra2xFUVZSNG5JV1RYMmhiWlJpSG4rK2NrM09hcE11Mm9HM1dDbTJYVUptNHppaEsvVE4wclE2WmN4c0lxMHc2aEcwWEUvRkMyQmdxSW5oUjZvMHlOOFUvSUJZVnAyUE1DOTFWc1JlaGVGRmR0MjdGYWtuRFRFNjZMbXQ3bXB3a1Bmbk8rYnlvRTRTcEQ3endYdnplNStibEI3ZkhpSVJJNzNpdzVkdDNqNlZWc2kwNkJNUnZGeFMzRmd1U3NmYmt3WTZlM2hNbkR3Vm11bE9DVWlBMEt0TGsvRTh1Sjg5ZHJlU243T05MUzVYUGdTcUFDTUdSRjA3OThMRVpzaEJpemFocGd0TDhOT1hKVDdsdTZPdzQ4REM2SmxCSzhmdVNqVlNTWDk0ZnI5Z1RwVmJ4L1NjRGFzNEo4ZEZzTjRtT3Uwa3RYR0F3VXVDZVdBaUVBQlR2VEJZWXY3OFpMUjdGWDNTSVpSeUc5N1d6NjQyZjN6S0srVHlIbjAxeGNLZEwxMU5IMlBWNEM2bTRqeXdCbWdhR3pxSFdFT1pVbVdxMXlOQ0pKMkZ3TXlJU0pmL2lLRWJZMG5OQXB5a1g2ZHF6alltblU1ejVlcEw5aGt2TGVwT3pXWi9odlJ0NHJmY0JSRFJHL2RJNFpHZUlQRE5BQURudDF6a25BQ0R3VUlEckNoSzc3MlBFMDJsckQzSG05VWZaNUR2VU02UDRkaGI1aDAwalc4RFBmUUVndGMvT1o2OWxwaGJYWHFFVTBwZmtsNHVVUEFjTUUyRlpFQVFvVDFJYkcwY1dsb2xzbHlqbktnSUt4dmJXY0QyOTRMSHo1UXpGVnNGTjJ3UEYydWc2d3JMd2I3b0U1VHJCaW1UZC9tNkVrVWNZSGVoY3RqWHBCL1BlRFpjdmV3UnF4aUM0VkVZRkNzVmZBbDNTbUhOcFhMSHc3V2FjRDR2STVXMElhek1DUE8zT3FKbHJWTXVzbGl2SVRYMkV0NXltYWN5aU1sMkcxZDlRQ3lNRWhTajRBclA3RHBTcldEazFoUWduV1lXYzhjR0VQWFJ2ay90cVgzczQ1cTljcDI3UFEvSW80ZG9JaGptTGFFb0F5d0JzT055RE1qZUNGdVdyNzJaWEFBekFleW5qck85dnE0MnFoT3BUZ1lRZ0lHaEs0QWNGaE5WRmFLdU5xallRVmhjVDA2WGdrZDF2dnlMaDlDMEJBS08yMTYvYjU1NkxwQjQ3cTRYWHJmVkFiMFpZbmNTUHByazJYMk5MZXVpYkcwNXQ0RjhLK0RmTjhZZWVYMnA1WWxDTnZkZXZuSXR2cXQ2dGQ4MEE1djhkL2dNZGhnMzQwWUxVZitYK0JBbkxSYWNSNGdWS0FBQUFBRWxGVGtTdVFtQ0MnLAogICAgICAgICAgICBibGFuazp0cnVlLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5tdXNpY1s0XSA9IHsKICAgICAgICAgICAgbmFtZTogJzVzaW5nJywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL3NlYXJjaC41c2luZy5rdWdvdS5jb20vP2tleXdvcmQ9JXMnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBQUFJQUJ5QWdBQUZnQUFBSWxRVGtjTkNob0tBQUFBRFVsSVJGSUFBQUFRQUFBQUVBZ0dBQUFBSC9QL1lRQUFBamxKUkVGVWVKeXRrejlvVTFFVXhuOHY3elc1eE5la2hTTCtReG9VbW1CeFVvelJ4Y1VPZ2cycGdrSnhyV0JCcWgwY2RST3FnNUJCQmFlS2drSUlJa0xhd1VGc2FvVXNVdExhREtVTlZrbEtRaHJiMjVqM3JrTmZZcXgyRUR4d2wzUFA5MzMzZlBjY2pXMFJUWmhuZ1Q0Z0FvU2NkQmFZQWxMSldIV2l0VjVyQVhZRHc4Q1FFTUkwZEIyWFN3ZkF0aTNxbG9XVXNnbzhBdUxKV0hXeFZiVTdtakRITDczcFVsY205NmxzS2Exc1phdTZYV3NleTY0clc5bHE1dXRyRlUyWTQ0NGdoc014TElRWTlMZzk3TmtWb01kL0FsdFpmQzdQVUpSNWlodDVBTmF0Q3ZPbGFZUVFnMUxLYjhDbzRmUTg1RzV6QTNCODkzazBUV01zYzVtNVVucTdSUUM0Mjl4SUtZZWlDWFBDQmZRSklVeE4yN0tqdTcyWHdzYnlqbUFBVGRNUVFwaEFud0ZFREYxdlhnWTdJcXpYSy9RSFJwcTVvc3d6WDBwVGxQbG16c0ZFRENEVWNCdkFhL2p3R2o2aWdSdC9LTStYUDNBM2N3R2c4VU1oWTN2UnM5eHRWamZ5RkdXZXBiVlp2SWFQWU9kSitnTWpCRHZEbk5wN2tmY3JMMys5Qk1qYXRoWFc5UzJ1eWFVbnZ4R3UxeXRrQ2ltVzFtWVppNlRwRWdlQXJka0FzaTVncW01Wk94cldpS3U5Y2FlTmFRQWN6SlFMU0VrcHEwcXB2d0lIRHQzaThaa2NoLzNIZUxYNGdMbFNHcVZVWXlwVEdrQTBZZDRUUXR6MHVEMGNiRDlDVDBlWS9zQjF2SVlmbDZiejVYdU81d3QzK0xUNkZvRE4yaVpTeXZ2SldIVzBZV0w4MnRHSDUwN3ZId2cybEplcmN5eVVQL0p1NVFXWlFnb0FwUlMxSHpXa2xFK0JPUHlIWldvU3RCRDkwenIvQkRXRkFzaFVsQjR1QUFBQUFFbEZUa1N1UW1DQycsCiAgICAgICAgICAgIGJsYW5rOnRydWUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0Lm11c2ljWzVdID0gewogICAgICAgICAgICBuYW1lOiAn5LiA5ZCsJywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL3NvLjF0aW5nLmNvbS9hbGwuZG8/cT0lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFCZlVsRVFWUTRqWjJSVFVzQ1VSaUYvU0Z0b24yN3FJZ29ROXNraWRKU0Y1cXUyZ1pSdEdyVmFuNkFCSkdiSXFpd0R6OUNMU0lOSWNlS2NOT29WOE1weFE5RUoydWM2Mm5UaUpVajZndDNjN25uT2VjOVY2VlNHSVpRMkdMQ3I4TVFDcVgzTFJGREtLeXNBRk5VZ05yTFk4cWR3ZWhKRXF0c0NTdlBuOG9RaGxBc1A5UmhaUVhvZzFsbzNFbE11bDdvNG1FY1c0RWtWVHVmc0JITnczeFhxQ3NDeHZjaWIvcGdGam9mZ2VhQ1lNeVZ3T1oxR2g1U0FSTjloOWFUZ3RhZmd6bFNGanRDMW1KRndYQ1p4dHdwUnlkY0NjeWZjOVJES3FoK2laUVhSRWlTUlBFemhyTTQveStCTXl2aWxxL2lPRlhCQVZmRzMza3Mxc0VRQ29PUEszUnVQWnpEYnFiV2NtbzBSQW9Ba3RTZ1RRQnl5WW9kMk1JNTJHOWU4VUdiTGRkd3NZSDdrdGpiRjhvQU9ZSHN5QkNLblJwNkF3U3lWY2ppcm9KT0FJWlFISkhLWUlCMlNEdEF2bHZhZHV6M0RMR3dRbXQzWTZpTW9YV0h0KzhrRmxiQXdsVWVzLzQ4Um1aMDlyN1hrVUhHVUJuRDAxclRRQUFaMHEzUWIvRUhuQWJGcUZOUkFBQUFBRWxGVGtTdVFtQ0MnLAogICAgICAgIH07CgogICAgICAgIC8vIOWbvueJh+aQnOe0ouWIl+ihqAogICAgICAgIGVuZ2luZUxpc3QuaW1hZ2UgPSBbXTsKCiAgICAgICAgZW5naW5lTGlzdC5pbWFnZVswXSA9IHsKICAgICAgICAgICAgbmFtZTogJ+eZvuW6puWbvueJhycsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly9pbWFnZS5iYWlkdS5jb20vc2VhcmNoL2luZGV4P3RuPWJhaWR1aW1hZ2UmaWU9dXRmLTgmd29yZD0lcycsCiAgICAgICAgICAgIGZhdmljb246IGljb24uYmFpZHUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LmltYWdlWzFdID0gewogICAgICAgICAgICBuYW1lOiAn6LC35q2M5Zu+54mHJywKICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT0lcyZ0Ym09aXNjaCcsCiAgICAgICAgICAgIGZhdmljb246IGljb24uZ29vZ2xlLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5pbWFnZVsyXSA9IHsKICAgICAgICAgICAgbmFtZTogJ+W/heW6lOWbvueJhycsCiAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vd3d3LmJpbmcuY29tL2ltYWdlcy9zZWFyY2g/cT0lcycsCiAgICAgICAgICAgIGZhdmljb246IGljb24uYmluZwogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5pbWFnZVszXSA9IHsKICAgICAgICAgICAgbmFtZTogJ3BpeGl2JywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL3d3dy5waXhpdi5uZXQvc2VhcmNoLnBocD93b3JkPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUNhRWxFUVZRNGpZMlRTMGlVWVJTR2p3dXBYWXNJQXFGZERsMTN0Y2xOZDZXZ1pWUVVMWnJCNmRkc2JoQTFGd2t5TlFPakNNejgwNW54TWlNNmFqcS9Pa2paeFFFbExTMHNLNk5RSTdRa0NDclRuaGJmbUJNYXRYajU0UER4Zk85N3p2bEVSRVJNMjQ1SWxxYkxYdXQvU3RObGo3Vk0wa3piUmRabEhCVmZKK0x0UUR6R2d0d0djaTZLdUtOLzF1ZVZIME5jOWJNaSszS0Q0dTFBbkdIRUhrSzBJSEl5aU5oRExEL1RRSW96ckdwYUVIR0UxRDFuR0hHR0VGOG5JcG5adDhRZFJheEJVaDBoRHZsNzBIdEhhUjRhby9YWkJMSG43MmtjSE9Od29BYzVYWXVjcWtGY0NZakhRR1NIUlJkWEM4ZUNjUWJIcDNrd09zbnhRQnhUUVJ1clBCSFNMN1JpYTNqRTU2OHpkTC82d0dwM1JFSG1BU3YzYTNya3hSVGZaK2NBV0hzeGlweW9WSy9aNjlScHJpSzlvSTBmY3ovcEgvdkVNa2RJeGZVWVNIbEZoZDQwTW8yOWFRQ0FUWmM2a055YXBLeGhaZGxjaGFQbE1RQ1crajdFR2tnMHMrU3FubFo4RjB1NEQ0RE5KVXNBbkdFa3Q0YjFSUVlBeHZBRW9sV3JDYVZtYVhxS3N4bG5ndjVYUUY0dGFlZHZBOUQzOWlPU1Y2c0Fzc3VpaXkyQzYxOEFyWnF0cFRFQTZwKzhVMk4xUnhIWmE5WEYzdlFic0tHNGZUSEFGa0xNVmZqNzNnQ1FWZDZ0SW5pTXhZQXRwVEUxQld0QUtkdVA1RlRqYlI4QzROcjlsMGhPZGRJZUpBRDJaaldGaDZPVGxQZTh4bWNNWVdzZTRITFhNSVBqMDB4OStZWXQwcS9jMmV1U0FKblpsY2tPZGw2L3c0R3licnp0VDdseWI0VENybUVPK3VPc09OdW9IQ1d2c3dKb2xlSnN4WkZ3WUNveUVIUFZRZ1JyUU9XMTFTMXViSDRNa1RVYmQ0dFdNMU1ZbndBZzQyWXY0bXBaK2djbXl4ZERyRGNtZmdGNFFHQXhuTEJDcmdBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5pbWFnZVs0XSA9IHsKICAgICAgICAgICAgbmFtZTogJ2ZsaWNrcicsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly93d3cuZmxpY2tyLmNvbS9zZWFyY2gvP3E9JXMnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQStrbEVRVlE0aldOZ0dBVUlJS0Jxd0tDZlVNU2dHWlhKd0NrbGh5NnR3U0NvVzhCcFVaVEZhWklqejhDdmlDcHJYdGJGa0hYM1B4eW5YUHJHb0JJUUM1T3U1N0Z2L0MvWitCK0dmNGpWL3N6Z01zNkV5TXE3QnFKb1JqYUVRMXpSbVVYUkZWa3pzaUVhRElLNkRBd3VFMVpnTlNEcjduOEd2Ymo4V2Z5K2M3QVo4Rit5OFg4dGwzMGRBNFBybE5VNERkQlBLRnJDSDdRVWx3R05QRTR0REF6cW9jbFlOYWZmK01NZ29Hb1F3YVlkaGNzQUd4WTVHMGc0ZUV4WmgyR0FVVlkxTEJDWDh3ZXZRTmZjeWV2U2hSb1RpbTRoREhaTk14bHM2eWN6U0pqYW8wZWpQNXRhNEF4ZTM1bVQrRHduTzdNb3VwS2ZYb1lmQUFCUHZzTDJHdVUzUXdBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5pbWFnZVs1XSA9IHsKICAgICAgICAgICAgbmFtZTogJ+iKseeToycsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly9odWFiYW4uY29tL3NlYXJjaC8/cT0lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFDMWtsRVFWUTRqWVhPeVUrVGVRREc4Wi8vZ0lreFhvZ3hYa3k4VFRJZVJoTXpjU0Vkb0tXMFNJRmliWXVKTEZiWlZHeXhsTGJRRm9xb0JFaEVCU2xiQTR4eE53cTl6TVhNZVRMTzBiNHZXT2hHb1NLQlVmSHJBWmRFRVova09UNmZQTUp0TkxWUGVscEQ5MnlOb2J2MXR0Q2Qydk5USTVhcWh4MGx4cHY2L2Z0Tk8zZnMyTE43Ky9hOTVRZC9yNzVWWkJnUEdzeVRFMFp6YU1KNE12VFFYQllTVTc3MnYvbnJPZHgvekllSmU2d0YvK1RkNENqdkFxT3NkbC9uM3hObHFmK0tqZWxsaDRkVmZ5Y3JyVmRZOFhXdzJub0ZPbm9RRDV5dUVFOG1XUXlPc3hBWUpkVTNTS292UU1KL2xabVNVaUs1T2lJNUJjZzVCVVFxcW9tN2ZjU2NYdUpPTDI4OGx6Y0FBc01rci9Vd1hWeUtwTXhIeWl0RVV1cVFGQnJDbWJuTW1NcUl1YnpFWGI0TmdNRWdxZHREUk1xcjEwZDVSVitCckh3a2hZYVhoM09ZS2EwZzBkeEcydU5IakRVMFB2b0NqSXdUOTNVZ2EvVElHdjMzd0I5YXdwa3FYaDVSa3FpNWlPUm9lU002TFpiZWRXQ0NoZUV4SXBaelNPcGlaRTNKeG9CQ1RmaHdOdlBIREl3YnpDR2hQM1RJdFBiNEdZdGpkMGpkSEdER1ZJNmswVzhPWk9hU1ZPUnhZZDl2elNKajI3WmQ4c0R3d3NyZEI4ejMzR0JhWDRxc1BmN3pCd1VHQnRYNWo0UVFRblJWV3ZwNU9rV3k2enJUUlNiay9FMkFJMHFrYkMzSnMrZDVjYm9tS1lRUVluZEd4dDdab1pIMGNtOC84bzhBaFlid1VSV3l1cERacytlSVhiQVRyN1VpUHFjc1czWG1mZDhRRVowUlNWMkVwQ29rckR5MjNpd3RzcXFRVitZSzVpNDZtTE02aU5iWldLeXpmUVdFRU1LcjAzV3ROcmFRcUtvblVsbkRxL0lxSXFkcm1hMjFFck83aWJsOFJDKzVtYXUzRTYyemtmNFdFRUpzYWRMcmZjdUJFZDRPREpQcTdpVnh0WnVFL3hyeEZqOHhSd3ZSQnVlbWdCQkNpS3hmZnRVK3Q3disrYiszbjdjOU4waTNkekxmM0VhOHlVT3N3VW0wM2s2c3pzYnJId0dmc3JYNHdNR1R3Vk9WVDE0NFhIUHpubmFXbXR0WWNucDViWGV6WkcxaXpkckVSL0NFYUZyOVFGclJBQUFBQUVsRlRrU3VRbUNDJywKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3QuaW1hZ2VbNl0gPSB7CiAgICAgICAgICAgIG5hbWU6ICdQaW50ZXJlc3QnLAogICAgICAgICAgICB1cmw6ICdodHRwczovL3d3dy5waW50ZXJlc3QuY29tL3NlYXJjaC9waW5zLz9xPSVzJnJzPXR5cGVkJnRlcm1fbWV0YScsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVlBQUFCemVucjBBQUFDRDBsRVFWUjRuTzFXc1c0VU1SQjlzeHNFQ0FtbHBicmJSS3dwS0U0bmswaTAvQVFTb2dHbFNJbklEL0FCS2Vnb0VpbWlvQ0Mva0pZaXlTS0NrRTdhQzhydFVkS2dTQ2xReUhsU0JOOTVOL2JhdHlRVk41VTlubm52emF6WE5qQ3ovOTJvU1ZLV2lQY0FubGZjUjNLUUwxNnJnQ3dSSEJLbjFLaTdOUHorNWNvRWhCSlhUUTV5TDM1MFhlU2h1YlVLblFETVo3TG8zekJkSDRGNElSRm50dkM2VGpnWHNuYjZCMFJ6MDRDTmN5M0NYWGx1QVJXUVc3Zmptdzk3dlZQWGVzU3EweTBPdnpwRlVOeVNSNzBmVlI3ckh0aFB4SytxVDVObmJiRmhxMUJSZEdENkwxWE1vNkdOeXlxQWdIbHpyc0UrTDZSUFFIaHB5OUdXSldMOCs3SENhbDJzVTBESm1EOU1oclJ6TWNDeEhPVGsrSzRkUFhnMHpOK1Z4TFhGcmxkQWxxUmI1bHdXL1djQWtMWFNCeE5mUGo4T1VQektWOFBZQ0V0ZUFjejAxSm9jNGEwZGxONEVDN0RDVnZHQTM5Wkl4amU3QU55OVVnRUF0czNKYnV0K0J3QmswVi83RjZKZ0FiTElWOHg1SEVXVFhRMSs3UU0wTitaK2twNlVGaGw3WGdFMjAvODNnZFpOdis2T3l3aDBweVN1eUplREJERGpwMHZFU01YM3RHOTVlSGd3eWVGVHMvclFTeXo0S05ZV2NoZnNMWXJIa2NLbk10TVVSekZ3VVZFZGlldEl6aExCbDhnQjJNaUJCdGV4N3NBMDc0UzZydFZ1d21xaXJ5dlRrbnNGV0FEV25ZRU55SU1FYUNBNXlJbisvaDIrOWlzMTZvYVFBMDJmNWUxMEUwUXZLdTVHei9LWnpld2NqRWpZYkpLWndRb0FBQUFBU1VWT1JLNUNZSUk9JywKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3QuaW1hZ2VbN10gPSB7CiAgICAgICAgICAgIG5hbWU6ICdZYW5kZXgnLAogICAgICAgICAgICB1cmw6ICdodHRwczovL3lhbmRleC5jb20vaW1hZ2VzL3NlYXJjaD9mcm9tPXRhYmJhciZ0ZXh0PSVzJywKICAgICAgICAgICAgZmF2aWNvbjogImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgdD0nMTY2Njg3MjYyODczNCcgY2xhc3M9J2ljb24nIHZpZXdCb3g9JzAgMCAxMDI0IDEwMjQnIHZlcnNpb249JzEuMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyBwLWlkPScxMDUxNicgd2lkdGg9JzIwMCcgaGVpZ2h0PScyMDAnJTNFJTNDcGF0aCBkPSdNNDUxIDEwMjRWNjkxLjhMMjI5IDk2aDExMS42bDE2My42IDQ1OS40TDY5Mi40IDBoMTAyLjZMNTUzLjYgNjk1LjZWMTAyNGgtMTAyLjZ6JyBwLWlkPScxMDUxNycgZmlsbD0nJTIzRkM0MDFEJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIsCiAgICAgICAgfTsKCiAgICAgICAgLy8g5LiL6L296LWE5rqQCiAgICAgICAgZW5naW5lTGlzdC5kb3dubG9hZCA9IFtdOwoKICAgICAgICBlbmdpbmVMaXN0LmRvd25sb2FkWzBdID0gewogICAgICAgICAgICBuYW1lOiAn5rW355uX5rm+JywKICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly90aGVwaXJhdGViYXkub3JnL3NlYXJjaC8lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LEFBQUJBQUVBRUJBQUFBQUFJQUEyQWdBQUZnQUFBSWxRVGtjTkNob0tBQUFBRFVsSVJGSUFBQUFRQUFBQUVBZ0NBQUFBa0pGb05nQUFBZjFKUkVGVWVKeDlrajlyOG5BUXh5OHhMUWF0R21QdElvaWlnb0tDb0FaSHllUXV0RXRCSEhScGw3eUVMcTYrQVArOEFJY1dPeFVSUVJ6TUlEaEV5ZUxpbElLRFFZVWcrZVdlSVQ0OFZ1anpXZTRPdnR6ZDl6Z0tFZUV2bC9rVkZFWFpDV01IVlZVbFNUSU1nNmJwSzZuZHBWNnZQejQrbm10RTdQZjd2L1cycVZRcXR2SThnV0hPeWMzTkRTR0U0emhDeUg2L0J3RExzaER4OXZiV0Z2eFlJSjFPeitmejUrZm5YcThueTNLdFZudC9mMjgybTVmMm1NdEZXWmJsZWY1ME9yMit2anFkVHRNMFgxNWVGRVd4NS96emhJanRkdHN1dlY3djVjeTd1enVId3dFQWhVTGhkRG9oNHZWTmRGMFBoOE11bHdzQUVvbUVZUmlFRUFBNEhvOW5EOHZsVXBJazB6VHRUb0lnNVBONW44OEhBTVZpVVJBRWp1TUFJQmdNTWd4RENLSEc0M0dwVkhwN2UzTzczUThQRHh6SEhRNEgwelR0VlZtV3BXbWFwdWxjTGpjWURLYlRLVE1jRGdGZ1BCNWJsaFdKUkRLWmpDaUtxVlRLUHZSdXQxdXRWcXFxZHJ2ZFZxdVZUcWVwcjYrdno4OVBSVkVhamNaaXNlaDBPdHZ0TmhBSXhPTnhUZE1NdzRqRllxRlE2UHY3VzlNMFFnaUZpSnFtSlpOSm44OFhqVWJ2Nys4OUhrOGlrYkFzUzVabFZWVjVuczltc3g4Zkg2SW9WcXRWUU1UOWZ1LzMreVZKMG5VZGY2THIrbVF5ZVhwNkFvRFpiSWFJZ0lpbWFZNUdvKzEyaTcrdzJXeks1Zko2dlVaRTZqOHZmUWtpMmgvK0I4VXBMcXB2OVZ5Z0FBQUFBRWxGVGtTdVFtQ0MnCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LmRvd25sb2FkWzFdID0gewogICAgICAgICAgICBuYW1lOiAn6LC35q2M5pCc57SiJywKICAgICAgICAgICAgYmxhbms6dHJ1ZSwKICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9jc2UuZ29vZ2xlLmNvbS8/cT0lcyZuZXd3aW5kb3c9MSZjeD0wMDYxMDA4ODMyNTkxODkxNTkxMTMlM0F0d2dvaG0wc3o4cScsCiAgICAgICAgICAgIGZhdmljb246IGljb24uZ29vZ2xlLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5kb3dubG9hZFsyXSA9IHsKICAgICAgICAgICAgbmFtZTogJ+WKqOa8q+iKseWbrScsCiAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vc2hhcmUuZG1oeS5vcmcvdG9waWNzL2xpc3Q/a2V5d29yZD0lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFDMUVsRVFWUjRuQ1hUeVk3Y1JBQ0E0YjljNWEzdGRpOHo2ZTRKc3lnelRLSkljd0p4eVRQd2ZEd0puRGpOQlFnaWNDRkVTaVJhbVNXOWp0MnI3YmFyWEJ6NDN1RVRQMDJzclN3czA0SkQ3dEJVUHYwUnRId0FHQzh0Z3hDK2Z5VjRtTVBOQU1acnl5OUx3ZDJUUnUwMVZBZVlUdmE4K2U2WXNvRGJ2MUxpcU1kdW4rSEprSmVYSGxIVDhDSnkrSnhhempvT0wyckJlQzVRc3hXa1U4c2lheGpmYWZxeDRPVjFGN0IwdkE2eWtkUzFaYVlsL1paaEdDa2VVODNiajVwZGJsR3paY0Z3RkhKK01jQlJtblJuQ2JGSXFTaU5CWFBBT0lKM0Q0WkFLazVWenF4VUJMMlEvU0pIYmZjYTEyd0pCeUVFQ2xOcHNzYVFhVUdhSG9oY3dkbVJ5d0tYTkt2NDhhSGc4cXN1ODlVV21nYm5lTmdtTGVIblg2ZmNUeXpTa1JTMXgrMGZjejUvcWRrZUpGRlhJUXI0K0VtekxSTGVmZGlRTzIyYzB3UlYxOUFLWTZJamgwS0RkT0grM3drWEYyMit2VzdEd2ZMNyt3V0xEQnJqOGVhYkZ1bkdNRjh0aWZNWUI4QU5CWWQ4UVNNMHhocXV6aytvVncxdVUrREZGaUU2Q05lbm4waWVKWnJMa1U5Q3lKRnlVU2pMZEx6bTlObUFyMDhVRVJXVG5XQ3lYYk9weitqNGxrSEhrRVF0enA5TFRBMXV5MktEa05xeHFES3pYQTE4TGk1Q2RqdU45anp1N2twNlNVSUltSFhEc0IzUVRxQjBET1ZCTWg4ZjJHK2g3QVdvT0JCY240ZWsyWUZLZUpDREZnSUF6d0tPWksvaHl5TXNWeG5yck9MbTlRamg3T2lYQ25XLzJQRzg3WUdTMUFaa1kwaU9GUGFwQXFEMk5MLzl1U1FYQ2E3b0Vva053NUZrczR0UXlxQjZ3emEzNzU5d05MeStpWW1rUjdYTEtmR1FMcGpHNWVxcXk5T3FwdDJTWEovM2lZM2h1Qy81Tk42akFna25neDdUNllJbzhGR3FJb2tVczZ4bVUwQ3JiWGwxRXNEQUFTbkFWSlNWUWdOUk84RHBoSlorMXdGQVN1aDBQUGJabXROUmw3ZC9QekROR2tvTGJ2aC96OXo0UEs1aE5zbm9KQkx4d3ovV3JyYWErUlBZcGlBMlVGaU4zNDhCZUJ6bldFY1RCejZIcXFSeFhPTFE1ZlRZSitwSS9nTkR0MTdIZVNNVHZRQUFBQUJKUlU1RXJrSmdnZz09JwogICAgICAgIH07CgoKICAgICAgICAvLyDotK3nianliJfooagKCiAgICAgICAgZW5naW5lTGlzdC5zaG9wcGluZyA9IFtdOwogICAgICAgIGVuZ2luZUxpc3Quc2hvcHBpbmdbMF0gPSB7CiAgICAgICAgICAgIG5hbWU6ICfmt5jlrp0nLAogICAgICAgICAgICB1cmw6ICdodHRwOi8vcy50YW9iYW8uY29tL3NlYXJjaD9xPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgdD0nMTY2Njg4MDIwMTcwMScgY2xhc3M9J2ljb24nIHZpZXdCb3g9JzAgMCAxMDI0IDEwMjQnIHZlcnNpb249JzEuMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyBwLWlkPSczMjA2OCcgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyUzRSUzQ3BhdGggZD0nTTIyOC45NiAxNzIuMTZhNzYuNjQgNzYuNjQgMCAxIDAgNzUuODQgNzYuNjQgNzYuMzIgNzYuMzIgMCAwIDAtNzUuODQtNzYuNjR6TTMxNy43NiA1MzUuNTJDMzA3LjUyIDQ1OC4yNCAxNjAgMzYwLjQ4IDE2MCAzNjAuNDhsLTU3LjYgODIuMjRzMTIzLjg0IDYxLjkyIDEzNC4wOCAxMTJTNjYuNTYgNzUzLjI4IDY2LjU2IDc1My4yOGwxMjggOTQuNHMxMzMuMjgtMjM1LjA0IDEyMy4yLTMxMi4xNnonIGZpbGw9JyUyM0ZFNTEwMCcgcC1pZD0nMzIwNjknJTNFJTNDL3BhdGglM0UlM0NwYXRoIGQ9J005NTcuNDQgMzgwLjk2YzAtNjYuODgtNjYuNC0xNTIuMzItMTc0LjcyLTE3MS41MnMtMjYzLjA0IDYwLTI4Ni44OCA2NC0zMC41Ni0zLjUyLTMwLjU2LTMuNTJsMjcuMi01My4xMkw0MDAgMTc4LjU2QTQxNiA0MTYgMCAwIDEgMzU1LjA0IDI4OGE0MjUuMjggNDI1LjI4IDAgMCAxLTc0LjcyIDkyLjY0TDMzOC4wOCA0MzJsNzYuMzItOTAuODggNTAuODggNS4xMkwzNzIgNDY0czMuMzYgMzkuNTIgMzIgNDEuMjggNzIuOTYtNjcuMDQgNzIuOTYtNjcuMDRsNTIuNDggMTAuNCAxLjc2IDY4LjY0SDM2MC4xNnY0Ni4yNGwxNjkuNiA1LjEydjE0NS45MnMtNDguOTYgNy4zNi03MC41Ni0yMy4yLTEyLjk2LTc4LjcyLTEyLjk2LTc4LjcyTDMzNiA2MDkuMjhzLTYuODggODQuNjQgMjIuNTYgMTI2Ljg4IDkwLjI0IDU3LjEyIDE1MiA1MS44NCAyMTUuODQtNzAuNzIgMjE1Ljg0LTcwLjcybDEwLjA4IDQ2LjQgODEuNDQtMzcuNzYtNDkuMTItMTMwLjQtNjYuMjQgMTMuNzYgNi44OCA1Ni42NC04MS42IDM2di0xMzAuNEw4MDAgNTY0LjY0di00OEg2MjQuOFY0NDhoMTY4di01NC44OEg1MTcuOTJsNDAuOC04MEE1NjIuODggNTYyLjg4IDAgMCAxIDY3OS4yIDI3MmM0OC02Ljg4IDY5LjQ0LTEwLjI0IDExMy42IDE3LjEyYTEwOC40OCAxMDguNDggMCAwIDEgNTAuODggNjcuMDR2MzgxLjc2YTk2IDk2IDAgMCAxLTYwLjk2IDUzLjEyYy00OCAxNi0xMjQtMS42LTEyNC0xLjZsLTYuNzIgNTMuMTJzMTI4IDI1Ljc2IDIxMC40LTguNDggOTUuMDQtMTMyLjE2IDk1LjA0LTEzMi4xNnonIGZpbGw9JyUyM0ZFNTEwMCcgcC1pZD0nMzIwNzAnJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIiwKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3Quc2hvcHBpbmdbMV0gPSB7CiAgICAgICAgICAgIG5hbWU6ICfkuqzkuJwnLAogICAgICAgICAgICB1cmw6ICdodHRwOi8vc2VhcmNoLmpkLmNvbS9TZWFyY2g/a2V5d29yZD0lcyZlbmM9dXRmLTgnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQ29FbEVRVlE0alpXVFcwaVRZUmpIZHhjVWZyUFp0cStjbTI1THhhUVNRNHRPMklrS08xeUVRVkVFUldKRllVUUpRUVVaVVdRRzBRR0tJZ29DUzRwVkJsS2FwSDZmenROc1crelFabk9XNUdHeXhGa1F2eTQrTGJVZ3V2anh2dS8vZWZqeFhEeXZxbUNhVUZ5bUZpdEtCZjEvVTZZV0sxVGxnbGpWTXpzTnQ5NnFvTFBpMWxxVWMvdyt6bmcyMXRzanBxRXFGZlFWYnIwVldXditDeWtLc3hTa2hHUWtqVWw1YTgyNGRkWUpnbGtweURvTHJSbTVkSzdLeDI1ZFNFZE9IcTVOQlFxYnQ5T3haQTNOeG5tL2hKTUVVa0l5VGVKY2ZQdVBFS211d2IxMUIrRXJONGo1QXd3NzNqSGM2ZVJyY3l1ZmI5NmhNeThmU1dQQ05VbWdNZEUwTzVXdWsyZjUxdE9EZDA4Ui9iWXFZdjRBd1pMVCtJcUs2WHYwaE5GUU53UFBYdkp1N1JhY21wUS9CY0dTTThRQ1FUeTdDK21ydEJGNVZVZDcxaklhcG91MFp1WVNMci9HOTc0K3VpK1U0MVFiL3kwWWVsT1BZK2s2R3VNU2Fad2g0bGk1Z2Foc1o4RDJBay9hb3Y4UXFBMUlHaE90bWJuMFY5b1lmRldMUHlkdmlrQ2NTL0RFNmI4TEJBTlN2SkgyN0JVTVZGVXorTElhMzRLbFl3S2RoVWJCZ0t5ekVEcC9tZEdQSVR3Nzk5RmZhV09vOWkwZFM5YlFNRjFQWTl3Y3ZIc1BFZ3QwMFh2N0h1N0VkRlNsZ3JiaWZWSUdiVm5MOE93dUpDcmJHWFk0Y1c3Y1J2L1Q1MFJsdTdJRGkxZmpQM1NNYUVzYkkxNC9ubDM3Y2NhYmxBbTZWbS9peThQSGpIajlqUGo4ZEowNlIwdDZOcEhxR242TWZpUHl1bzZodW5wR3ZINmlUUzBFanAzRWJwNlBTMnRSQk1IbDZ3bVhYZVhUOWR2NERoeWxKUzBiU1pQTWg4UEg2YjM3Z00rMzd0Rjc1ejZoc3hkeDVSZlFiTXhBMXBnbWJLTFdqS1EySUFrR3BQZ2s1SVJrWkswWktUNEpLUzVSeVFXRDBqUFQrS3Z1MWxsUlhSTEVxckNZaWt0citjM1lyNXVVVGFtNWRWYkMrbFIrQWtYVVhVWkhWMkhkQUFBQUFFbEZUa1N1UW1DQycsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnNob3BwaW5nWzJdID0gewogICAgICAgICAgICBuYW1lOiAn6IuP5a6BJywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL3NlYXJjaC5zdW5pbmcuY29tLyVzLycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFCTVVsRVFWUTRqYTFUUVU3Q1FCUjl4Tld3cFVUSk5GMEE0VkNFaFZ2akJSbzVBQVIycGpIeEFPMEM0MEpNcVhnRFRmUUUwbXFpQjhDRmdhbnh1VEJ0YUtkRll2ekoyOHgvNy8yWi8rY0RKV0ZVMGZCdHpId2JnVkZGbzR4WEdFMERuZEJCeEFuSUNSZzZpSm9HT2x0Rmd5NkdheGNxRVpWaDdVSU51aGhxQnNwRC9KczRnZklRYXdhN2loTmt4SzA2MnB0Snk3STBRZjZzVlVjYkFDQUZ6TVVwd2tMeTlJQ2M3aGNhaEE0aUtXRGk1Z1MzK1dvcnIwSStuWkg4SWtseWNjNlZXOUZ1ZFczRDF3MHU5c2o3UTJweDEvdkpiWEI5R3pOSUFUTjA4SndtM3E1SWtwWmxaVUNTZkwxTXhaR0RGeWxnNmszOC9FaUxac1FrR2IvclRkVEcrSEJFcXFYK0JMVWtINCtMeC9ndkgyblV3M2dYRStVaEh2VXczcm9YZjFxbWZOUUVaTkRIUE9oalhoT1FaYnh2RnkvSDEwMlg4TUlBQUFBQVNVVk9SSzVDWUlJPScsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnNob3BwaW5nWzNdID0gewogICAgICAgICAgICBuYW1lOiAn5Lqa6ams6YCKJywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL3d3dy5hbWF6b24uY24vcy9yZWY9bmJfc2Jfbm9zcz9maWVsZC1rZXl3b3Jkcz0lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFDSGtsRVFWUTRqWTNRVDBqVFlSekg4YTlkMG0xTThyYk1aa2xRYmpSRE9wU25IWFNUanBGSHZWZ0gwVU9Ed1NoSlduOGdHWFhSaTZRMWxJcGZXWXdDWVprUXdXcUhkaHJZSC9Vd2d4bXpHVTVzdjdIZjNoM0NKM1U1K3NKemVMNThudGZ6ZlI0UkViSFpiUFpnTUhoTCs4K2FtcHA2MU52YmUwbEU5b25kYmorU1NxV1cyVldSU0lSQUlFRC93QUJqWTJPc3JxN3VqaEFPaHljbEZBcmQzZDVjV0Z6RTRYUWlJanVXdGJhV04zTnpaWWhNVDA4LzM5cVVTaVU2UEI1RUJMUEZ3cDNoWVlhR2hxZ3htUkFSdkoyZDVZQ21hZHJXeGpBTWZENGY3ZTN0M0I4ZlZ5RzMyNDJJNEdwcHdUQ012WUh0Rll2RkdCa2Q1YkxQeDJHN0hSSGhSSE16dXE1WEJwTEpKR2ZiMnRUYnpSWUxGcXNWRWFIWjRhZ001UE41VHJXMklpSWNySzhuR28yeXNiR0IxK3RGUkhBNG5aV0JSQ0toYnZiNy9TcDAwdVZTRTFUOHhBL3h1QUk2UEI0eW1RempFeE9JQ0ZWVlZWUlhWL042ZG5adllEMlg0MmhUazBKcXpHWkVoRU1ORGFwM1BYanpYMEJKTmVMeE9HNjNtd04xZFRRMk5uSjFjSkIwT3MyRnJpNENnUUNHbm9PMWVkaGNVY0JUOUhuNGRBOEs2d3JLL3N5aEY0cGxiK2I3VzRoZGhQYzlDbmdHUmZnOEFqTm5JSEVGMWo0Q2hiK0hqQ0pzTHNQU1EzaDNIcEszNGN2b0g2Q3ZyNjlmQlg4a1lPNGNQREdCWm9hWHgrRFZjWGhSRDVvVlprN0R0d2pvV2VBWCtYeGVGeEhaSHc2SEozZk5DWm5Ic0hRREZxN0J5Z013dnU1SVpMUFp0ZTd1N3A3ZkxYMzFlU3Rha0NRQUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5zaG9wcGluZ1s0XSA9IHsKICAgICAgICAgICAgbmFtZTogJ+WkqeeMqycsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly9saXN0LnRtYWxsLmNvbS9zZWFyY2hfcHJvZHVjdC5odG0/cT0lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBUUVsRVFWUTRqV05nWUdCZzJNekE4SjhjekFEVHZJT0I0ZjkrRXZFT21DR2J5ZEFNd3hnR0VBdG9ad0E2UnRkQTBBdWpCZ3hMQTRoT3loUmxKa3F6TXdDT09BVWp2N2VFK2dBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5zaG9wcGluZ1s1XSA9IHsKICAgICAgICAgICAgbmFtZTogJ+WAvOW+l+S5sCcsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly9zZWFyY2guc216ZG0uY29tLz9jPWhvbWUmcz0lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFDUUVsRVFWUjRuRzJTVDBpVVVSVEZmK2Q5ZzJWL05LU2dSWVNyaUxDWjBqTGllK0dpM0xXcW9LQ0ZFWUcwdEhCVFJFZ1FTTFdRQ0lSb1dWQ2JLS0tDL29EMGZWR0c1SXkyS0RDaVJRVEJVQkpoK3ZsdUMyZGtIRHVyeHp2dm5udnV1VS9VNEgxWDE3b295MTZZMlFBQVVnZndFZWRXeWF3SDZNa255ZWZhR2xjOUZPTjRDRmlIMUM3bkhramFYRWpUaTVKdXkrd200QW1ocGVqOXJXVUNSZSt2NU5PMEw4cXl1NHVNZEIzQVlIWnRGRFZLaW5IdW5hQlk4djdaVWdkbVc4ZTd1cHBjTHJlL1NoZ01Bd2gyVDJmWkR6TkxLOVJRTUJzb2VuOEV3STN2M2RzbTZlRE9rWkdmWVg3K1BtWmZnSXZBeWVwMFNJOE5waGU3U3E4RTNRRE9SZEZFelVnSGtGcUJBVUVHUUFpbnN4RDZDa25TWERzN1ptOG40dmhRTmNRLzFDR2ZKS3RMM2h2U25wdzBWczhiREpuVTd4YnlVbmZKK3pNRzU2c1BKdU40czhGVnBCT1NOdFlMU0ZwajBPa1czTmgzNEZxVVpjT1lYVjQ1TzlzY1lGQWhUTGx5ZVlYQjE0cnRsMHRFd0RtZ0FFd0J0TDE1VTBZNnQyVjBkQnJwMkJ3OERDMHRmNEVibFpyYmRVWW0zZllrbWF5M1YvVCtpRUdJekRLRGU0TEJVaHpQVmJKUlBra0VGQUwwQzZEa3ZWVnF1dzBPeXl5WXRCNDRZSEI4UjVJOExlN2JkNG9RTGxYek1MT1pRcG8yT2dCWExxK29KTnZ1ek80aWJTb2t5VkdnMThHVGt2Y21zNXMxWWZaR3VkeUdTZzRMK05UWjJUVFQwUEFybnlTcWNiUjBkV2EvSloyZEMrRlJ4K3ZYMzVZSVZGSHlmZ0pvcTd1K1kvQUJzd3VGTkcyczI4VC9VZkwrZ1ptMUNyWUJ6MmRuWmc3dkdodGI5dUgrQWZmZDdNcFJ2c0xwQUFBQUFFbEZUa1N1UW1DQycsCiAgICAgICAgICAgIGJsYW5rOnRydWUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnNob3BwaW5nWzZdID0gewogICAgICAgICAgICBuYW1lOiAn5b2T5b2T572RJywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL3NlYXJjaC5kYW5nZGFuZy5jb20vP2tleT0lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3gtaWNvbjtiYXNlNjQsQUFBQkFBRUFFQkFBQUFBQUlBRHpBUUFBRmdBQUFJbFFUa2NOQ2hvS0FBQUFEVWxJUkZJQUFBQVFBQUFBRUFnR0FBQUFIL1AvWVFBQUFicEpSRUZVZUp5bGswc3NYR0VVeDM5elorYTJnMVFYN0R4ak13ektKRjJJUjBpRVdJeGxWNktaZUdRYUVoWldiSFJUc1ZDUEpxNUlHNDhJaVlpRkVyWk5tbmdVQ1ltZ3FHQkZNbGpXcTJOeDZsN1hYQXZ4VDc2Yzczei9jLzdmT2QvREJoRHl1cWNBSDAvRGQ5dnFWcm1pSjc5NENaMjlCcDJUQi9OcllnSGlFcUJMQTVmckxzSVg4cnFuRkgzbmppOVFVQVRkZlVMbjVvT3FRa3lzK0syZklML1E0UCtMS1BxMHZnYVdGNkVoSUw3VEtWWlZ4VlpYd01vUzFMNDM5V0VMZWQwaDNYTTY0ZW9LSnFZaE9jV0kydHlBdG8vd2UwdjRlMUJNWG0wZHJHeEs4cDg5YUdtQ28wTkk5Y0R3dUxUd0FFWUZKV1hROWhuT3p5RGdoNTF0SThxVENkbzNpSXlDZHo3WTI3VVFjRGpnK2pwc0J4MkpTVEE1QzFvUGZOVXNCSEx5NU9RZjR1WWZIT3pENURqTS9ZQ0lDQ2g0cTlNT2ZkYWxTUlZXbUpzUmdaTmo4R1NZS0NPajhRTmtabGxVY0FPblFWRHNFQmNQWjZlUENNei9sUEVZMHRJaCtqVjB0cHVXaldzc0xvVmZHN0N3TG1YZVBTQ1hDOTVrdzhBWVhGN0N5S0JKd0RoRWQ1cU01bGF3MitIaUx3U0Q4cFJWVlpJRGZsaGJEUk1JLzRtVlZlQ3ZnVmZSMHY5QVA0d09XelUyWklQbmZlZGJjY3lHR21XWG1NOEFBQUFBU1VWT1JLNUNZSUk9JywKICAgICAgICAgICAgYmxhbms6dHJ1ZSwKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3Quc2hvcHBpbmdbN10gPSB7CiAgICAgICAgICAgIG5hbWU6ICcxNjg4JywKICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9zLjE2ODguY29tL3NlbGxvZmZlci9vZmZlcl9zZWFyY2guaHRtP2tleXdvcmRzPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvaWNvO2Jhc2U2NCxBQUFCQUFFQUVCQUFBQUVBQ0FCb0JRQUFGZ0FBQUNnQUFBQVFBQUFBSUFBQUFBRUFDQUFBQUFBQVFBRUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUlDQkFBQUlpTUFBQndpQUFBVEV3QUJJejRBQXgwK0FBQXlNd0FHQ2hJQURCUWlBQUFuS3dBTEVoNEFDQllXQUFBd01nQU5Hak1BQ0F3UUFBd1lLZ0FCSHlBQUF3c0xBQUV6UGdBQkt6NEFEaDQ3QUFFN093QU1FQllBQmd3TUFBWUlEQUFISXo0QUFDd3NBQUFrSmdBQkZ4Y0FBU2MrQUFjZlBnQUJOVGNBQVE4UkFBOFhKd0FSR0NRQURoSVdBQXNiTndBTkR4UUFFQnd3QUFBM093QUJMejRBQmlzK0FBVTdQZ0FHSno0QUJSWVdBQVlQRUFBUEhUY0FCVGMrQUFVdlBnQUNCZ1lBQUNBaUFBUWpQZ0FDSUQ0QUFDb3VBQUFxTEFBS0RoUUFFQm9zQUFBTURnQUVNejRBQ3gwK0FBRTdQZ0FNRUJvQUJnd09BQW9LQ2dBQUxqQUFCQ1lvQUFRblBnQUJOejRBQlQ0K0FBUU5EZ0FNSUQ0QUFUNCtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUQvLy84QVFVUkVSRVFxUXhJb0tEQXBLeXNaR1Q1SFIwZEhSenc4UXhJb0V4TWRCQmtVSUVkSFIwZEhQRHhERWlnVEV4MHJPenNZQmtkSFIwZEhQRU1TRWhNVEtUczdIamduUjBkSFIwYzhReElTS0NrN096c05GVWRIUjBkSFJ6eERReEl3T3pzN0RURUFFU0E1TVFNOFBFTkRFanM3T3pzN1JVZEhSMGRISUJ3Y1BCSW9PenM3T3p0RlIwZEhSMGNEUnp4REV5ZzdPenM3RGtkSFIwZEhSMGRIUEIwVEtEczdPejhCUjBkSFIwZEhSMFFkSFJNb0dUczdPeUVSRzBkSFIwZEVCQVFkRXlnVE96czdPenNoR0J3ZlJEUUVCQjBUS0JJZE96czdPenNlTGdnRk5BUUVIUk1vS0JJVE96czdPenM3QlFVMEJBUWRFeE1vRWtOREtUczdPd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9JywKICAgICAgICAgICAgYmxhbms6dHJ1ZSwKICAgICAgICAgICAgZ2JrOnRydWUsCiAgICAgICAgfTsKCiAgICAgICAgLy/nv7vor5HliJfooagKICAgICAgICBlbmdpbmVMaXN0LnRyYW5zbGF0ZSA9IFtdOwoKICAgICAgICBlbmdpbmVMaXN0LnRyYW5zbGF0ZVswXSA9IHsKICAgICAgICAgICAgbmFtZTogJ+eZvuW6pue/u+ivkScsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly9mYW55aS5iYWlkdS5jb20vI2F1dG8vemgvJXMnLAogICAgICAgICAgICBmYXZpY29uOiAiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB0PScxNjY2ODc3MDM0MzY2JyBjbGFzcz0naWNvbicgdmlld0JveD0nMCAwIDEwMjQgMTAyNCcgdmVyc2lvbj0nMS4xJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHAtaWQ9JzI5OTQzJyB3aWR0aD0nMzInIGhlaWdodD0nMzInJTNFJTNDcGF0aCBkPSdNOTM4LjY2NjY2NyA5ODEuMzMzMzMzYy0xNy4wNjY2NjcgMC0yOS44NjY2NjctOC41MzMzMzMtMzguNC0yNS42bC01OS43MzMzMzQtMTE5LjQ2NjY2NmgtMjc3LjMzMzMzM2wtNTkuNzMzMzMzIDExOS40NjY2NjZjLTguNTMzMzMzIDIxLjMzMzMzMy0zNC4xMzMzMzMgMjkuODY2NjY3LTU1LjQ2NjY2NyAxNy4wNjY2NjctMjUuNi04LjUzMzMzMy0zNC4xMzMzMzMtMzQuMTMzMzMzLTIxLjMzMzMzMy01MS4ybDcyLjUzMzMzMy0xNDAuOCAxNDUuMDY2NjY3LTI5MC4xMzMzMzNjMTIuOC0yMS4zMzMzMzMgMzQuMTMzMzMzLTM4LjQgNTkuNzMzMzMzLTM4LjRzNDYuOTMzMzMzIDEyLjggNTkuNzMzMzMzIDM4LjRsMTQ1LjA2NjY2NyAyOTAuMTMzMzMzIDcyLjUzMzMzMyAxNDAuOGM4LjUzMzMzMyAyMS4zMzMzMzMgMCA0Ni45MzMzMzMtMTcuMDY2NjY2IDU1LjQ2NjY2Ny0xMi44IDQuMjY2NjY3LTE3LjA2NjY2NyA0LjI2NjY2Ny0yNS42IDQuMjY2NjY2eiBtLTMzMi44LTIyNi4xMzMzMzNoMTkybC05OC4xMzMzMzQtMTkyLTkzLjg2NjY2NiAxOTJ6TTg1LjMzMzMzMyA4NDQuOGMtMTcuMDY2NjY3IDAtMjkuODY2NjY3LTguNTMzMzMzLTM4LjQtMjUuNi04LjUzMzMzMy0yMS4zMzMzMzMgMC00Ni45MzMzMzMgMjEuMzMzMzM0LTU1LjQ2NjY2NyA5My44NjY2NjctNDYuOTMzMzMzIDE3OS4yLTExMC45MzMzMzMgMjQ3LjQ2NjY2Ni0xODcuNzMzMzMzLTQ2LjkzMzMzMy02NC04NS4zMzMzMzMtMTI4LTExMC45MzMzMzMtMTkyLTguNTMzMzMzLTIxLjMzMzMzMyA0LjI2NjY2Ny00Ni45MzMzMzMgMjUuNi01NS40NjY2NjcgMjEuMzMzMzMzLTguNTMzMzMzIDQ2LjkzMzMzMyA0LjI2NjY2NyA1NS40NjY2NjcgMjUuNiAyMS4zMzMzMzMgNTEuMiA0Ni45MzMzMzMgMTAyLjQgODEuMDY2NjY2IDE0OS4zMzMzMzQgNTkuNzMzMzMzLTg1LjMzMzMzMyAxMDIuNC0xNzkuMiAxMjgtMjgxLjZIODUuMzMzMzMzYy0yNS42IDAtNDIuNjY2NjY3LTE3LjA2NjY2Ny00Mi42NjY2NjYtNDIuNjY2NjY3czE3LjA2NjY2Ny00Mi42NjY2NjcgNDIuNjY2NjY2LTQyLjY2NjY2N2gyNDMuMlY4NS4zMzMzMzNjMC0yNS42IDE3LjA2NjY2Ny00Mi42NjY2NjcgNDIuNjY2NjY3LTQyLjY2NjY2NnM0Mi42NjY2NjcgMTcuMDY2NjY3IDQyLjY2NjY2NyA0Mi42NjY2NjZ2NTEuMmgyMzguOTMzMzMzYzI1LjYgMCA0Mi42NjY2NjcgMTcuMDY2NjY3IDQyLjY2NjY2NyA0Mi42NjY2NjdzLTE3LjA2NjY2NyA0Mi42NjY2NjctNDIuNjY2NjY3IDQyLjY2NjY2N2gtNjguMjY2NjY3Yy0yNS42IDEyOC04NS4zMzMzMzMgMjQ3LjQ2NjY2Ny0xNjIuMTMzMzMzIDM0OS44NjY2NjZsMjUuNiAyNS42YzE3LjA2NjY2NyAxNy4wNjY2NjcgMTcuMDY2NjY3IDQyLjY2NjY2NyAwIDU5LjczMzMzNC0xNy4wNjY2NjcgMTcuMDY2NjY3LTQyLjY2NjY2NyAxNy4wNjY2NjctNTkuNzMzMzMzIDBsLTE3LjA2NjY2Ny0xNy4wNjY2NjdjLTcyLjUzMzMzMyA4MS4wNjY2NjctMTYyLjEzMzMzMyAxNDkuMzMzMzMzLTI2NC41MzMzMzMgMjAwLjUzMzMzMy04LjUzMzMzMyAwLTE3LjA2NjY2NyA0LjI2NjY2Ny0yMS4zMzMzMzQgNC4yNjY2Njd6JyBwLWlkPScyOTk0NCcgZmlsbD0nJTIzMTI5NmRiJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSIsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnRyYW5zbGF0ZVsxXSA9IHsKICAgICAgICAgICAgbmFtZTogJ+iwt+atjOe/u+ivkScsCiAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vdHJhbnNsYXRlLmdvb2dsZS5jb20vP3E9JXMnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQy9VbEVRVlE0allXVFQweWJkUnlIMzRNSDR3VmpvdkcyWklsNjBJTVhOVGdvRHRsRy93QXk0OWJ0NHIrOFhTRm0yU1pHb3g2V1dObmFsNDVTYktBYnlnS2JTaEFUMzh5TU5DOUxNR3lRc1M1T2RHdHBPd3FOdk5rTExid3Y3NitLSm5zOGxFUzlqRy95WEo5OGtpZGY2YkduNnZZNDJ0V0VvLzJTVnV0WHRab3RIRWNUMm81cTMzdlNkbGZicGs2OE9RU0g0dUNOdzhGK09OQVBod2JobFE5bWJrdVM5TkFEQlk3MlMxZThjWGc5SXRnZkViUjJieEg1azVhdytQdVJKNTk5NFlHQ0dyK3FlZVBRMmkxd2hRUnVSZUFNQ1pxNkJDMDk5Mms2K25WQ2Z1ZXRFN0o4cEVPVzVRNmZ6L2UrTE1zZGJXMXRIN3BjcmdOU2pWL1YzdWlENXJBZ05yN0J6QjJUeXpkTTN1NjNhVGhWeGpjZ1NHY0tDTnZDdG0wc3k4STBUV3piWm0xdERlbGx2Nm8xUlNFMmJwR2NYK2ZqYnpjSWpHMXcrQXZCdnFEQXBRaEd4bE1zWk5Pc3JoZ1k5KzZoNnpxNnJtTlpGbEwxRVZWcjdvWHJLWk9PQ3piZVhwdkxTWlB4cElsODFzWVIrSVBQTGk2UnVmTXIwYUVScG0vZXdpd1YwZlhseW9KcW42cDVlaUJ4MDJSZ3dtSmZVQkJTTFFyNk92NHZiZW83TnprWVhpWjZmb3hQenZRUkh2eUd5UEFvL1NNL2tNMHZWUVROVWZDZHM1bE5yek01WnpLVCtsZm1DcFZ4S3dMbC9FOWN2WGFOeE9SVk91TkRwTE01Vm92RmltQi9EUGFlRm5oN0JTZS8yK0Q0c0UxanNGTERyUWoyaGpZNTNqZEhPUDRWeXNBRnJreE5veS8vVHFsVVFuclJwMnF0TWZCMENScURndnJQQlEyZFcwbEROcTVRcFliY1YrSWpKYzZ4VXoya1VtbVdGaGN4REFPcDJwK1lxZ2pLZUxyS3VKWEtaTmNXenBDTk15aW9ENndUdlRqRnFQb2pwODhOTS9mYmJWWU1BK2taZDZDN0pRYWVIdkJFd05OOUgvZC9jSFp0MHFpVWNYVCtSWEIwbWFWY211L0hOU2FucjdPeVlpQkprdlR3b3p0MjdhN2F1ZnZWcXAyMS8rUHhwK3VkZGQ2eGhZWjNiN0RyOEJSbkJuOG1sMDJ6Y0RkSExwZEYxM1cyZmJiblgyby9XL2ZhQko4R0pwaTc5UXZwZElyNStYa3ltUXpGNHVyMmdxb25udHR6VWttU1NtWEo1KytTenk5U0tCUXdESVBaMmVUYVAvcDZZLzJ0UGpwUUFBQUFBRWxGVGtTdVFtQ0MnLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC50cmFuc2xhdGVbMl0gPSB7CiAgICAgICAgICAgIG5hbWU6ICfmnInpgZPor43lhbgnLAogICAgICAgICAgICB1cmw6ICdodHRwOi8vZGljdC55b3VkYW8uY29tL3NlYXJjaD9xPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUEyRWxFUVZRNGpXTmdHRlFnZ3BzMzRZMmkydjgzaW1yLzc4Z3B2WmRnWUZCZ1lHQmc4T1hrQ1VNV3gyc0lUT0ViUmJYL01BTVlHQmdFa01WeGFoWmlZSkNCS1RvbkxYK2ZrRGdHMEdObE5ZSXBuQ1FzT2g4bWJzakNZZ2tUWHk4dXZSK25BY2dLMC9nRUNtRGlmcHc4b1REeE1nR2hCcHdHT0xLenU4TVU3cGVTT1cvQndlRmd5TUppbWM0clVBUVQ5K1RpQ2lES0M3Z3dVc0JpQmV6SXpvVUZHcktyOEduR0JnU1FEWWpnNWszQXE3cEZTS1RmZ29QRHdZS0R3eUdOVDZDQVpOdHgrUnVxV1lDZ0FYZmtsTjZqYXlUbzdBRUhBSWpUbmFITGFRdGZBQUFBQUVsRlRrU3VRbUNDJywKICAgICAgICAgICAgYmxhbms6dHJ1ZSwKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3QudHJhbnNsYXRlWzNdID0gewogICAgICAgICAgICBuYW1lOiAn5b+F5bqU6K+N5YW4JywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL2NuLmJpbmcuY29tL2RpY3Qvc2VhcmNoP3E9JXMnLAogICAgICAgICAgICBmYXZpY29uOiBpY29uLmJpbmcKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3QudHJhbnNsYXRlWzRdID0gewogICAgICAgICAgICBuYW1lOiAnRm9ydm/lj5Hpn7MnLAogICAgICAgICAgICB1cmw6ICdodHRwczovL3poLmZvcnZvLmNvbS9zZWFyY2gvJXMnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBQUFJQUFBQWdBQUZnQUFBSWxRVGtjTkNob0tBQUFBRFVsSVJGSUFBQUFRQUFBQUVBZ0dBQUFBSC9QL1lRQUFBY2RKUkVGVWVKeUZrazlyRTFFVXhYLzNwWk1KeHRDUnVpbTAxazAzSWtLSkNJMEU5QnU0Vmd4eHBaYUt1cmYrb2ZFRHFIVWhGQ0tLdXV3SFVDaUtCZ1JMMjRXbG9WWmQxS0lWVEZwck1RMmQ2eUtaekVzWjA3dTY1NzV6enB3N1hDR2krZ3VsYTZBaklJTUFLTk8rN2x6L2RqTTd2NXNyTnVnYkwxMFI0WDZVYVZCLzY3WFV6enVuTndOc2d1Ym9nN2szb0IzRkFNbWs5OXNibVJ4b014Z3VMcDd2VHUzTEh2Q1NxR3JqUlhWS0lBMytHYUFNRUhNU1ZMN01RQ3ordFcyRlRMR3N3YUM2c2NYQzFhRzIxUURTano0NFM3T3oyOFp4UVJWRk45Y244aW1US1piek5qRktEREJ6OFhoZDNLNGhtZ2tGMlE5Z1ZCa05hZnFpMC83cjl5N00yZGdiZlp3eklxUmJjdDg4NzJUUVpIMXFkVEJzVkhVbkdCalJ3M3ZyT1JTMEFsdEdrSmVXNCswOURVVGlJVEJQakhGclo4TkhlckpQRjNyL3ArMitQUG5leHRXSjNMeDVlKzVZSlJqRTQxMHNmLzYxMmw4bzVYYUwrOFpMcnhKZTd3bFZ2NWxXN3piWGFOU3BaOHU2dUxSSzNJa1IzaEkxRVZ3clA5dC9LdFEyMXFnK3pBdFlwN3oyL1VlUExXNnNhNHNiMzNWVEIxdml0Z1JoMUhjZlJlUkkxRDlRMWJHVnNaTUZleFo1ZFFPM3BoTys0MTVDR1ZTaERyeGV1WkdaaXVMK0EyRFluVjJZcmU2ekFBQUFBRWxGVGtTdVFtQ0MnLAogICAgICAgICAgICBibGFuazp0cnVlLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC50cmFuc2xhdGVbNV0gPSB7CiAgICAgICAgICAgIG5hbWU6ICdDTktJ57+76K+RJywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL2RpY3QuY25raS5uZXQvZGljdF9yZXN1bHQuYXNweD9zZWFyY2h3b3JkPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUIza2xFUVZRNGphWFNNVWhxVVJ6SDhZdUJyU2JpSUlLSVM0dm80T1JRZ3lKQ0JnNUZ1dXFnc3loM3RLRndVc2pGeWNFSXdxMGxCTWM3UkxRRklsNFJuTHhYenFiZTRZcDB2MjhJNnZsZStGNzBoOTl5NEh3NDUvLy9TOVNPK1Vra2FzZjhYb3ZGZ2tLaGdDekxyRllyZHRaWGdCQ0N3OE5EYkRZYm5VN24rNEN1NjdoY0xsS3BGRUtJN3dPUGo0L1k3WGFlbjU5NWVYbWhVcW1nNi9yL0FVSUlRcUVRQndjSDVQTjVIQTRIVHFjVFZWVzM3bW1hOXQ2ZlA0R3JxeXNrU2ZxSXgrT2gxK3NCc05sc2VIcDZvbHd1RTRsRXVMeTgvQnNZajhmYzNOd1FDQVR3Ky8wTWgwTk0wK1R1N281R28wR2hVS0JlcnhNT2g0bkZZbC8zd0RBTW1zMG1QcCtQKy90N3B0TXBYcStYWXJHSWFacXMxMnZPenM1UUZHVWJHQXdHOVB0OUZFVWhtODBpU1JKSFIwZE1KaE5PVGs2b1ZDb0F0TnR0enMvUDJXdzJuNENtYWJqZGJod09CN0ZZREwvZmp5ekxDQ0d3TEl0U3FVUXdHS1JhcmJLM3QwYzZuV2E1WEg0Q3M5bU0wOU5UY3JrY285R0lXcTNHN2UwdGxtVUJNSjFPaVVhanhPTnhXcTBXcXFyeTl2YTIvWVhGWXZFeHluUTZ6ZlgxTlpsTWh2RjQvSEZ1R01idVBkQTBqV1F5U2JWYVJkZDE5dmYzdWJpNFlMMWUvM3VSWGw5ZnllZnpKQklKNXZNNUFOMXVsNGVIaC9mbjdnUitrRi9aUVEvV25FaGVwZ0FBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgICAgIGRpc2FibGU6dHJ1ZSwKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3QudHJhbnNsYXRlWzZdID0gewogICAgICAgICAgICBuYW1lOiAn5rGJ5YW4JywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL3d3dy56ZGljLm5ldC9zb3VzdW8vP3E9JXMnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQkpFbEVRVlE0alkyVE1XckVNQkJGZFFZSnVVMjNCc00yZ2JRQkZTbDBBRXNFcytDenhDbEVUcEFMcEV3YnR0akdKOWhpd1hMaDF1ZjRXODFFY3BSTkJnVGZvOUhUZURRamxubUNrN3E0eHJiUDFqb0VyRVBJZkdKc2V6aXBzYldQdDVlaVRvMEJKZk9xd2pKUEFBQW5OZXZVb3JFNTRIdzZab0NTem1OMkVORlkzamlmamxrTnVycEJORGJURkFjQWwvMERSRmMzREVocmtlcHROZ1J3VWtOUTRIOEJUdXJmQVY1VjZPb0d6NC8zbkhaWE4zQlNJeHJMK2liZ3J5SVdBVlFZK3I5Yk9vMW53T3ZCLzZqK1ZxYytyeXJXd3FzZHRyYk1FNzQrMy9sN0hVS3hrWnpVRUpmOVUrWk1lMkViN085VUJuSlNmL2ZCTWsvY0xPbnRxYTFEZ0pPYVo0TnJRSk5YU3JNRW9Vc3pBTDAxdlhjMEZ1c1ErQkNOTCsxRll6RzJQYTUxVnRLaEV4K1RPZ0FBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgICAgIGRpc2FibGU6dHJ1ZSwKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3QudHJhbnNsYXRlWzddID0gewogICAgICAgICAgICBuYW1lOiAn5rW36K+NJywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL2RpY3QuY24vJXMnLAogICAgICAgICAgICBmYXZpY29uOiAiZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBQUFJQUNBQWdBQUZnQUFBSWxRVGtjTkNob0tBQUFBRFVsSVJGSUFBQUFRQUFBQUVBZ0dBQUFBSC9QL1lRQUFBa2RKUkVGVWVKeDFrODFMYlZVWXhuOW43eTErZzNxUFdZTW9zYUt5VkJwMDd5REp3RnVVVUtPb2FVMHYwU3d1VFJyYXZIRi9RRkEwQ1FvSEpUUUp2SERSNklNVXZYQ3ZZcGtmUjQ5SGo1NzNlUnJzdlk5S3RXQ3hXTzk2bjJlOUg4OWJBWmhkMlhvVnVHMDhhWHZJTW5hNWhXVlVucUU5Vzh1U1BsMTZlWHloTXJ1eWRkUHdyZTJVU3lDVkpGSitqOUl1TENFNUpMMmVHWDlzTzgyZC8vZlhTMkNYSkttazI1bmw1OW9nbTdlcGMrT2hRWTRFRC9kMVUrM3FwTlk0NFp1TlRiNnNROE1ncVNEWFJDS3JLdVhzVXljMWJyMHd6bEJQTitYSzBwU3g0V3Q4K09JRW40OC9Rbjgwa1FKRkVCSFZyTWdIV3p6ZG5RS1FWaXA4OWZzNlBSMGQ5SFprakEvME1qUDZLRStORFBQSmFKMFBWbmVLT2dUWmxid1NBNUJVNEtmT3dUenZNL0gxZG9QVjNaOTU3WW5IZU9YSlVSNy80d0Zya1dDSlJLRjJTSzBRcDYyZzJjcHRFV1dvNHZ2REptUWQvTHI5Rjg5MHB2bTdna3dSZVFvU2g5Rmt1MzdNVHFOQmJsZjdMUUdxUFYxZ2syQktYS1pvVjVUYVdaUDdoOGZzSERXSUtQdWRSL05tdForaHJrNEFsbW9uU0JVa2tZV2k3WGh1Mk56YjU2VFZZanB0NHNTa21KZEdobmhuOGxrQWZseTd4MFlMckVBdUlpZ0p4Z2I2ZUhjcWQzeVBmNi9OL1JvZjNWMjlVR1ZPRUx1U3Jsa0NaLzhCZzNxenlSZkx2L0haK2c1N1JkY0s0ZjFkZWY2N096OVltcEZFbjg3cGNTQURoZE5wbU4wSVdxYVlDN2QxWTNzeFU4UzhwR2tyMGdPWi9hSTRWN1RmbmhOZG1sS0g3Zm5rbDduckM0clduRUtMQ2gyRW90REZSUWVzaXpwWk9yQzBhT21OUDk5L2ErRWZpaWxUUG9qMWZZY0FBQUFBU1VWT1JLNUNZSUk9IiwKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3QudHJhbnNsYXRlWzhdID0gewogICAgICAgICAgICBuYW1lOiAnRGVlcEwnLAogICAgICAgICAgICB1cmw6ICdodHRwczovL3d3dy5kZWVwbC5jb20vdHJhbnNsYXRvciN6aC9lbi8lcycsCiAgICAgICAgICAgIGZhdmljb246ICJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUNOd0FBQWpjQjl3WkV3Z0FBQUJsMFJWaDBVMjltZEhkaGNtVUFkM2QzTG1sdWEzTmpZWEJsTG05eVo1dnVQQm9BQUFHWlNVUkJWRGlOalpLeGF4UkJGTVovYjJaSGJXSVRVeGtSQzRQbkJVVzBrMWdrb0ZsTVltSVI4Uit3MFVaQkZBdnRMQU1TMGlwQzBndUNkMEdPYTIzRUpHVFBrQlJDU0NOSEtpRWdNenZQd21qQ3VpdjNsZnQ5N3pmZjdCdWhRcmFXVG91Skx3RTBtbWY1MThhN3Nwd1VQeHdadmxtTG1zOEI0d1dyTFpoSFB2dXdVZzQ0TjlhZkdQY2M0VDVnSzRwRmdTVXYvakhycmU4SGdLSEpFNG56SFdCZ24vc1pkQnVZcVFCMVErNXJiTFIyRFVCeTFKODlHSWJFbU5tUU5XOERxeFdBZ2NTNUlRQlQ1dnFZUDNIMUd3OUFIeW9zQUtFQ1ZBNFF1S2ZJUE1oSFZLeWdWNE9WVThCeVQ0QkRzaUk2cldwdXNkYllVZGdwQnBMU01lR1RSTFl4Mm81cTlrVDBqYTJQM3hVNDAxT0RRSnoxbmVZZFZSa1Q5QzFneW9iL05nZy8zVmJpZkpmOVRWZzFMMlE0M1VDMWVvM2ViOEtmQjdPN3VSZjdUNzgyWW84aFhCRzRERnd2YVJnRkZvUDRHVHF0N3UvYkZ1VE9wNWRVOUJVdzh1L0JPaHF5NWZaLy80SHZOTDZFckhsTmtTbUZiNGU5WU0xV01WKzV4anhydk0rUDk5VkJuZ0kvcW5LOTZVSTY2T3JwRWhjblRoYXRYeC90aXFKSmREQTZBQUFBQUVsRlRrU3VRbUNDIiwKICAgICAgICAgICAgZGlzYWJsZTp0cnVlLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC50cmFuc2xhdGVbOV0gPSB7CiAgICAgICAgICAgIG5hbWU6ICfph5HlsbHor43pnLgnLAogICAgICAgICAgICB1cmw6ICdodHRwczovL3d3dy5pY2liYS5jb20vd29yZD93PSVzJywKICAgICAgICAgICAgZmF2aWNvbjogImRhdGE6aW1hZ2UveC1pY29uO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUNHRWxFUVZRNHk2V1R6VXVVVVJUR2YrZTg3K3YzQnd4WVRvdXBvWVZZZ1ZpTEZpUHRJckJORUxac0lVSVVGRVhRcWsxSS8wSlUyNG9XWlJGRml5RDdXaGhCRFdZZnE0ekNzUkVUZGZ3WUhMMzN0SGh0ZExTRjBJRUg3cjFjbm5PZTU1d2pQUDF1L0VlRVlyTHVhb2dwb0ppNExSRW9CaGlJUWEzQnRiYjNETFpkUWJ3UUlkU0pJQzcrOHkrSVBQNXBBS25xRWdNZHorbFl1c0d2d20vdVZvM1F1N09lT29Yc2JJa3p3OU9NTERpUURSTGk3Q0VEL2dKN3g5NFIxbzJSVEY3bmFGQkZ6OUFFdVpMblZLcWV3Y3cyT2wva3lTMGI2MDFUODRBSk5iblBNRCtCRDNaZ3pTYzUvbmFLTjdPT2I0dkdwUzhGc2pNbFRxY2JNR2VZcDR3UUR5Q1VhYldWZVJjd1dqUzh4YzlpeXRjNVQ3STZRcHhndXE0QzhVSk1zdXFLRzZVNVdPSmdZNEI0SlRBbGNrSW1FVEF5dllRaGlGK0RtbGZXS0EyMUdkemtWUjUydFhBdVhjdXhsb2duWFFuMkoyb1ltaXdocHBoZmcrSVZ2SllsR0RBK2RadnpINHAwcDVxNDNObkN4M21sLzlNQ0R3NGxhSzlWbEFpOGdGZENNUU16UkZiN0k1QVlWbnBlWFdUV2UrYUF0RUFBUkprRERKN280OTdOTzV4dDdRWnpjUnNCek1BRVNxK1RSSSsyYzFpSE4wL2QvU3pMRStQczNuTUVLWGhNSU1RTFNPeHM4VmtUK3JJQmRJWk5DeUtDTlRReDNaNmh0NUJlOVZ3SXplSVcvcEFVeFZ3RURzejlkV01EUWVNdStoYjNrZmZsd2hGdTVTMCtSSWl5YVZRcndodG1LeFhVc1FUQVdNSDhWdmF2TXNNZklyYnZRQlUzVmxnQUFBQUFTVVZPUks1Q1lJST0iLAogICAgICAgICAgICBibGFuazp0cnVlLAogICAgICAgIH07CgogICAgICAgIC8v55+l6K+G5YiX6KGoCiAgICAgICAgZW5naW5lTGlzdC5rbm93bGVkZ2UgPSBbXTsKICAgICAgICBlbmdpbmVMaXN0Lmtub3dsZWRnZVswXSA9IHsKICAgICAgICAgICAgbmFtZTogJ+efpeS5jicsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly93d3cuemhpaHUuY29tL3NlYXJjaD9xPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgdD0nMTY2Njg3MzEyMzc0MScgY2xhc3M9J2ljb24nIHZpZXdCb3g9JzAgMCAxMDI0IDEwMjQnIHZlcnNpb249JzEuMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyBwLWlkPScxNTY0Nicgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyUzRSUzQ3BhdGggZD0nTTUzOS4xMDEgNzY5Ljg0NGwtNzYuMTE3IDQ4LjQzLTk2LjA5NC0xNTEuMDYzYy0xOS44NDIgNjMuMjIxLTUyLjg1IDEyMC4xNzQtOTYuNDU1IDE3Mi40ODItMTguMTI4IDIxLjc4LTM2Ljk3NyA0MS4zOTYtNTguNjY3IDYyLjAwNC02Ljk5IDYuNjI5LTM0Ljk0NyAzMi4zMzItMzkuNTkyIDM2Ljk3NmwtNjMuNzYyLTYzLjc2MmM2LjI2OC02LjI2OCAzNS40ODktMzMuMTQzIDQxLjI2LTM4LjYgMTkuMzkxLTE4LjM5OCAzNS44NS0zNS42MjMgNTEuNDk3LTU0LjM4MiA1Ny4wODktNjguNDUyIDkxLjU0LTE0NC43NSA5Ni4zNjUtMjM1Ljg4NEgxMTcuNzQ5VjQ1NS44NmgxODAuMzczVjI3NS40ODVoLTM5LjE0Yy0zMS4wNyA1Ny4wODktNzAuMjU2IDEwMC4xOTgtMTE4LjA1NSAxMjguODMybC00Ni4zNTYtNzcuMjljNjIuOTA1LTM3Ljc4OCAxMDkuMzUxLTExNy40MjMgMTM2Ljk5My0yNDEuN2w4OC4wMjMgMTkuNTdjLTYuMzEzIDI4LjU0NC0xMy42NjQgNTUuMzMtMjIuMDUxIDgwLjQwMmgyMDMuNTA2djkwLjE4NkgzODguMzFWNDU1Ljg2aDExMi43MzN2OTAuMTg2aC0xMDQuMzlsMTQyLjQ1IDIyMy43OTl6IG0xNzMuMDY4LTMuMTU3bDUwLjMyNS00MC4yNjhoNzYuNzQ5VjI3NS40ODVINjU4Ljg2OVY3MjYuNDJoMzMuMTg5bDIwLjExMSA0MC4yNjh6TTU2OC42ODIgMTg1LjNIOTI5LjQzdjYzMS4zMDdINzk0LjE1bC0xMTIuNzMzIDkwLjE4Ni00NS4wOTQtOTAuMTg2aC02Ny42NFYxODUuMjk5eicgZmlsbD0nJTIzMEU4N0VBJyBwLWlkPScxNTY0NyclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5rbm93bGVkZ2VbMV0gPSB7CiAgICAgICAgICAgIG5hbWU6ICfnu7Tln7onLAogICAgICAgICAgICB1cmw6ICdodHRwOi8vemgud2lraXBlZGlhLm9yZy93aWtpLyVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UveC1pY29uO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUNLa2xFUVZSNG5NMlh2YTN5TUJTRzN4UGRCYWk4QWgwV1MxaVVpQ1liZUlOSVRCQVd5QXBJbVNBanVLT2dTVVl3RlJ2NDNJTHJ5Q1IySU44Vk41OGxHci9FNXptL1RnaVI1WnpqMlA1dlY1WmxOTnpyTno1bDlCVk10b1R4MEdiMjE0YUhhM0VBV2lMODRWbzhBb3NEZkFIQWJyZkQ3WGFERUFLcjFhb1h1NjREQUZ3dUYyeTMyNlIrUEI1Umx1V1Rmci9mc2Rsc2NEcWRSczkyWFlmMWVvM3orZnhvQi84cmlvSUJNQkV4RWJHMWxrTzlybXNXUXZSNnFEbm5XRXJKUk1SVlZZMjBzaXlaaUZncDliVC9CR0N0NVR6UGt3WkNTQUFqelQ4N0JBL2gyN1pOQTNnSWI2QnBtaWlFQnh4NkNvRHJ1aDc5MzFyTFNpazJ4b3kwRVlCempvVVFESUNsbEZFQUtTVURZQ0ZFNzYweGhwVlNVZSticG9sR0xBbFFWVlh2NVRCbnpqbHUyN2FIRkVLd01TYVpNaCt4UE0vZkI3RFc5bDZteUxYV1BXU2U1eXlFbUFTSXBTWUo0TDFNZFVPWWN5S0tGbGNZelZoWHZBUUlpMDFyUGFtSHRSQ3JwNVQyRXNEM05SRnhXWmFUYVlnVnJGSnFNalV2QVpxbVlTSktkb1EzbnBvYkFKTFJld3ZBNXpCV2pNYVkvbkN2aDFGcTJ6WlorYk1BdktmRElSUDJmSmdHWDR4YTYyUmh6Z1lZOXJ4UzZpa2xmZzU0Q0QvMzN6bjdMWUJ3L3Z2RHcyaFlhMGNGbVpxaS93UXd2S1JpZDBSNGgwZ3BKMXR2TnNBd3pGTzFrcnFPZnczZzNLUGFpNkpJNnY0T21YUG0xNXpYcDZJb3NOL3ZrL3JoY01EMWVwMXo1T1BMNk1lN1AxOVpsdEhpTDZYL0IwRHNxL1hqaG45c1JnMS9xaVppam40RGhVQTJ5UEQvREVFQUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5rbm93bGVkZ2VbMl0gPSB7CiAgICAgICAgICAgIG5hbWU6ICfnmb7luqbnmb7np5EnLAogICAgICAgICAgICB1cmw6ICdodHRwOi8vYmFpa2UuYmFpZHUuY29tL3NlYXJjaC93b3JkP3BpYz0xJnN1Zz0xJndvcmQ9JXMnLAogICAgICAgICAgICBmYXZpY29uOiBpY29uLmJhaWR1LAogICAgICAgICAgICBkaXNhYmxlOnRydWUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0Lmtub3dsZWRnZVszXSA9IHsKICAgICAgICAgICAgbmFtZTogJ+eZvuW6puaWh+W6kycsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly93ZW5rdS5iYWlkdS5jb20vc2VhcmNoP3dvcmQ9JXMmaWU9dXRmLTgnLAogICAgICAgICAgICBmYXZpY29uOiBpY29uLmJhaWR1LAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5rbm93bGVkZ2VbNF0gPSB7CiAgICAgICAgICAgIG5hbWU6ICfosYbkuIHmlofmoaMnLAogICAgICAgICAgICB1cmw6ICdodHRwOi8vd3d3LmRvY2luLmNvbS9zZWFyY2guZG8/c2VhcmNoY2F0PTImc2VhcmNoVHlwZV9iYW5uZXI9cCZua2V5PSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUNza2xFUVZRNGpaM1NXVWdUY0J3SDhIK1FlRENwTFVYUjJ2S0d5WnpIRnVxOEVyTWkxUEJLMDFMU0JLZHBsZ2VZQ1BXUVpXRmdHVjJHUWhicFE0WE5TczNsMFhSVForcG02aFJpVHRubVhPS1paZnYyRXN0U2V2RDMvUDE4SDc3OENObm1PZm1ZSFNTRTdOcXVKeWxWanExTzNwVFFiV0gzWTdZcFpjTkJobjF1RnB6LzVTek5kaE9HT1pYUVRhMkppNjBYSmRncjNpYm5kQldqdFhLU2k3SnUzM2xDQ0hXVHNuWTI4VW91ZDN0eW81T3J1di9KYi9WTy80SGxzajdQbjhWU0Q1U00rS0I4M0FlM0o1bElyMloyYmNMYzQxWVp0WXJBdGM3RmFQVHF6NkpQeDRka05nM0NtUmpVam5GUktIWkZVZ2NiMlNOY2hKMTN1ZlVYWnZKTWo3NmE4WWZtUndPV3ZnOUFObGNFMlZ3aFpQcUxHTkpsb1hNNkVUV2pRZUIzczVFZzlRY3oxRDV1b3pjcGYrMCtJbDZJaEVMZmhLbjV6NUJxTDZCUG00WmVUU3JFNmtRSXA2THdYQkdKcTRQK3lPN21HV2gwbXJ0Uk8zbWE4eHBWQWVpWWlZWmNWd09GWG9DQjJUeW9WNXFoWEh3RzNlb0hLQmNGcUZkRTROcXdGM0pidUY4cEZJcTFzU0QwQkRXemVTNEV6Y3JEMEsvSkFBQVNkUzRBWUcxOUhkb2xGUUNnUzEyQmtnRjdaQXBZR2tJSXpWZ1Fkb3FXMTZqaDRlVWtEK3BsTWRZTksyaFRwUUlBWkxvR05DamlmeGZjUTI2UEhmaE5iTDJsSmJINk0yQ2dSVlR0QkF2Vkk4N1Fya29BQUlJdmNRQ0FJVjBkNnNhakFBQkMxU09jNldDQVgrK3RJSVRzM0RnaTdmSmJ4L2tLK1Y1MFRkK0ZmRmFJeDZNSE1hcnJ4b3VKSzdncERZZGNLOEhEd1V2Zzk3RVJVZUJTdWVrSEFrN3VLYm8reGtLQnlBSDVIK2tvRnJzZ3Q4c0JXZTF1eUdobElhSFJGU2x0Yk9RTGd4YW9kdWIwclY1M1IyeXAzZE5TT1JlWklpNVMzM09ROUk2RDJDWU9ZZ1RlU0JQNW9VaDA2SnQ3a0Uza1Z0aDR3Y21NZ3J3M0ljcjgvaVBJNlE5SFZrOGd6clVIR05JZmhMVHM5N0R4L1RmL0MwYVVpM2tnZS9ndUFBQUFBRWxGVGtTdVFtQ0MnLAogICAgICAgICAgICBkaXNhYmxlOnRydWUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0Lmtub3dsZWRnZVs1XSA9IHsKICAgICAgICAgICAgbmFtZTogJ+eIsemXruefpeivhicsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly9pYXNrLnNpbmEuY29tLmNuL3NlYXJjaD9zZWFyY2hXb3JkPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUNSRWxFUVZRNGpZMlN6VXZUY1J6SHY1ZHVuanFFSFdKcnpxVkdQcXhMZVVrUi80UFBkNzlOay9RZ0ZWNkdXbWhSb0NBb29XYVN1bVVwaVZEMERCVklVa3FrbC9VQTVXL3pZVTB6MEhCcWthWnprMWQvZ001Nm56K2YxK1gxVW1xWHVZd0tYRktDRmhkYUc3ZzlIbmE3MjdIczdHeW42REtjenNiQTdUNHo5bXpvWS9qcDhNUmNYY09EZ0VqVnZ5RWlsUlFYdDVObXVjNnB3a0c2K3IvaUcxaWtvUGdSeDA4MEJVWE9Kb2VJbEdNL1ZCOCttdDZKMnJjZlcwWVArWVV2T0ZuMGt2eUNZV3cyUHdjUEZ2bTBXM2FIaUZTU21WNk5Sd3orUkhyeGlNYml1SVhEOFJCTFZoZWkzWWdXM0pJTW9EV2xXbGdQUHlGdTNtQmoxby9XZ2lFYWp3aS9wdnRJTE54TERuQnBJUnIyRXplYllMSURncTJzaGR1SkIzMFE3Z1N6alZpb0EzRWxBUmppSVJFZGdtOERFR3dtTWVsamZiYUQ3WmwyQ0hZUk14OURkQnd4a2lpMXBscXRoZ2p4cFMvRTVycmhjemVFT3RrT05jTkVCNnlFY0dzaDFXcTFKaldobEVvUkVlNzBYQnI0TlA1ODZ1ZHlJRDRSR0p6cTdha2IwRnFqbEVyWjYxa3BwWlRkYnM5eWlVYUxVQ3BDaFFqaUx2bS9FcFZTU290d3MzV1kySkVzdG16SGlPVGs0YS94ellpaDk0WlVWWG05MmxWT1Mwdi8rc2hvaExIUklBbGJMdU52VE1iZW1qUmN1Nzh1Y202dkVrdHBiZXZuOVlpNU5UMnp5Y3ozQlZiVGNsaWMvMEZrYnBPaDBSQ05WKzlHemtnU0MySUk3ejY4WjJwK2tkOEoyRWh6UW1ZcUsvWmNWdGVXbVYyYVp1S1ZpWGlTcGl4NHZWNXFheTlRZXJxTWhRT082RUxlNGUxWlMwYjA0cFZhTHRlY3A3NjZia2RJZndGMjVuMzhzTWJYSFFBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgICAgICBkaXNhYmxlOnRydWUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0Lmtub3dsZWRnZVs2XSA9IHsKICAgICAgICAgICAgbmFtZTogJ+iQjOWomOeZvuenkScsCiAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vemgubW9lZ2lybC5vcmcvJXMnLAogICAgICAgICAgICBmYXZpY29uOiAiZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBQUFJQUJQQWdBQUZnQUFBSWxRVGtjTkNob0tBQUFBRFVsSVJGSUFBQUFRQUFBQUVBZ0dBQUFBSC9QL1lRQUFBaFpKUkVGVWVKeU4wMTFvelhFY3gvSFhPYzdtbk9ONG1NMFdvN1Y1YWhKdGFUSWt1U0ZGUW5HakZybVJ4SVZ5NDhLTjVFN0swNDEyUXg3V21vZHlRZXhDdVNDeGhSVWxEelBMdHJPajdjdzUvbjhYa3pPMkM1KzczNmZ2OTlQdi9mdDl2L3lyOTZiSlNvN3pJWlFVaW95MW91T0tIanJwampOQ1ZYLzU3WmE0b0E5VHh0cWphYmR0OWttZE9yUFZhcEtTOEVPdks1NEtUREdFd0J5QmFwTjFLSktTMG02WHBoaklhbFNzUWFqWWlJUmh4SldxMWVleE5uRVJrNXlVMUNMcG5rKytLdlZ0SXNabFF2ZTF1U1YwYUl3ZjBleXpaM2JvVkRJZVliUW9xc1U2R2JNdDBxN1JSNjAyNkxkWmFMNk1UZktLUkZIcWdmVzJtV2R3OUJHZldPaVNUbCsweVR2c3VkZGFyVFJzcVg0SFJRMnF0dEVSc3pTcWw3SE1BOXNLdjlCbGxkQjBtOVRZcTBHNWkzcWNGc2dvTWlqbXZyUVo3cXJTNExtRUxnTW1RK3czUUtXb1BsMUtWRXVMYTVIVnBOaUF3RXpERGh1U01DanczVVpEaXBRSkN3Rjk0a0sxWG5talY2Y2FlK1NGS3VTa1plMVRKeUlBQjNCZXBZaWVBa0tBRWpmdE5OVnVhL1NiS1NudnF4NkJ1SE51T09lcXk4NGFVQ2FuWEVKM0lTQXVMeTlscnU5aUJxU3RFTk5odVZDSUdWNmE2cTJjWHQwcTVNVFUrbEpBV09xUkY0Njc2cFNjYjlLT3FiVGZXOTFDekhmZFNoMmcxV3JGOGhiN1hMakJXdTBxYkpXeHdJajFLaHl5eFRYYmY2L091ekhMbFRWSDFBY1JQOGRQNGtScWR0UVQ1WC9PZDlTNzdzVC9OZitIZmdHdTdLOEtDMVB6QmdBQUFBQkpSVTVFcmtKZ2dnPT0iLAogICAgICAgICAgICBibGFuazp0cnVlLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5rbm93bGVkZ2VbN10gPSB7CiAgICAgICAgICAgIG5hbWU6ICfnn6XkuY4o5pCc54uXKScsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly96aGlodS5zb2dvdS5jb20vemhpaHU/aWU9dXRmOCZxdWVyeT0lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFDazBsRVFWUTRqWTJTUzBoVWNSVEd6eUxjUkk5Tm04QmxiYXFGbTl4RmkraGhtOUVnclZaQlVFVE9JM1ZzVUdlaU4vUkdBcUZ5R21jUkZDRlVGSlJGV0NzMWszTHVuWm5HYk9iKzczVzBzc2ZvM0hFRys3VzRFNGlCdFBqZzR4ejQ4WjJQSTdKK1o0UHNqL1pKL1owK3FRLy92L1pIKzJUWCtZakl2bWkvbkp0QlFoTkl1NFVFVE1jSHJhVVZ5aUtudnlQU0VIa2hRUXRwamxONUprWHJ3MG1rU1VjYU5jU2pJODF4eEtjN2ZxRmFFa2pRUktRKzNDZEJDM0Zybkh2MmhVUzJ3UGF1RERYZGl0cW9TZVhaTVRaZUdXZDNXT0hxTVhIMW1HeTdhYkQ2WkFwcE04cUFEb3RsTFhHRzBubUd6UUw1NGp5VHYwb01wUFBzRFJ2MGo4MmlmcFI0YTlpTUtCdUFtckNKTktmTGdGYkZub2dpcG13cVd1SThpdVh3UE1naVIyS0lUMmZFdEttTm1NalJHT0xWR1ZZMmU2TFdBa0M3U2ZXMWNkYWVTaUdIUHZBaU9jUEJ1eFp5YUJSeDY3eFROcTRlMCtubGVKeTN5cVp1TVdCVjZDTTdiaXRjM1FwdHNrRG42MmxxYnhsVVhSNW5JSk9uTG1vaWJnMXBpalA4RCtDRXdoVTJHTWpZREJvMmR2RTMrdFFjQTJtYk04Ky84T2JUTExVOVN3R0NGdUpQSUc2TkZXMUpkTk5tdzZWeDVQQW80blZPV0RwQjBFSmFFNGhIWjh1TkRLWGlQUGVHZnJJOGtFVGNHdStVVFUxWU9TVWUxUmpNNUJlVitCZmcxcmcvL0pNbnNSeFBZemw2My8raXdxdWpUODdSOUhpS05ZRUVyckJpS2xkeUVqUXRCRFJxN0w1bEFGRGRtV1psSU1uN1RKN04xejl6OGVVM2NvVjVVdGtDSTJhQlY2bFpxcTZuRVgrbURBaVliT2xNOHlOWG9yTi8ybmxkbjg2NkMyTlVuazBoeHpRdXZ2eUtwemZyN0x6bFYrNVFpQnlJOWt2SEJKdXVmbVpybCtFcy9BbmtSQkpwWHVEOUNjUVhSL3hKcExXc1VCYVJYZWNqY25vYUNSaE9wSGJESVMvVzRua29pN1RFaTM4QXdIaWJjWm9KZXJZQUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgICAgICBkaXNhYmxlOnRydWUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0Lmtub3dsZWRnZVs4XSA9IHsKICAgICAgICAgICAgbmFtZTogJ1F1b3JhJywKICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly93d3cucXVvcmEuY29tL3NlYXJjaD9xPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQURRVWxFUVZSNG5PMldYWWhVWlJqSGY4K1p6UzBKdzlvVXRNU2EyVjBUSTFNSndxaUVUU3pOV25GbnhrenBvaTVDU3FLTENJd0dMMlNocXo0dUZ2b0F0WkNaWUVldDlHSTFBeStFRFJRMWt0V1p2TmlJVk5BKzJWM2RjLzVlTkR2dW5QUE9lTFM5VXY5WDV6dzh6L1AvdmVjOXZNOEx0M1N6eStJbTdra3g1VytQVG55V0NSWVlUQmMwQTJjTXltYjBrYUNZSG1CZ1FnRUtqM09IenZHT3hKdkExS3MwazZBNHlXUFRxbE9jK044QWhSUnpKZktDZWRVQzR5akdGK2J4RXo1RHdNeEFMRGZqWlltbVN0TWhZR09tektmWERWQklNVmR3VU9MdWFyTEh4emFmdDlKZjQwZnlreXdNb0k5eFg4a3ozazJYNkw1bWdONDUzSE5wbEtNU004ZUZEMlpLUEdXR0drQ3ZETVN1R2dPUGx6S24yRkd2eG5NRkwxNWlTOGdjUzdDNWtUbEF1c1J1akNNMVFmSGh0dy9YLzNjaUFNVVVTWVBYUXVFTDlnZ0hHcGxYUVkxaWpiKzQ5NTloM280TmNCRXlpbTdOWWRlK093RUNmb3dFeFpyWUFJaG5IWG5sT09ZVmxSdzlIeXkwMHg0UEFHYUZBd1oveExZMy9uU0Y1VE03SG9BeFBWSnNETWYxYjA2NGM2Vm9YemVBT0I5bG9qa3V3SWlZNG9xYmNTWWVnREhvZ0xvckxnRGVsWU5ydkc1cjRyUXIzaFQxNG52Z3NSQlVjdXd4MzhaekNuakZvQlc0VS9BTFJxL1h3cmIwSVlZc1lGckV4UmpzekZJaTUrSU5FeVdpcDViZ1VlWHdkclV6QTUvZGlDNkorUklweEZJQ2VuU1cvdUljWmdjQml4d21uMW1Pd1BVRklnQ3JCemdHOUlZSVdncGY4Y1FMQS93bWp3MFkzVWJ0MkJYTUd4bGxEMkpwemVLTmMwMlQ2WEdaUTUxWnNEUEovU053WEZ6WmU0TjltVExQakwwZmVKcmJ6LzdLZG9uVkRackxTN0M4NnlSNzYrVTRaOEdMWlFhOUJNOVh4aW9BZ281OGltN2wvcXRaOGdQRDArNWpIWENzanJsdnhvWkc1cFc4K3NxMzhxVEVEc1NNYW9IUnI4cDl3SXkvTk1vS2lTMk94cDJaTWp1ckM4amg4VDRLRDdTcjNvaSthYVBsWDU4UHhsODRZc240UEZ2aVZZQjhHeDN5NlFQMlo4dDBYQlBBbUFydFBDQ2Y5Y0F5WUlIRXBFcUQzNEdmTVJaTHRRZVd3WGRtOUFld0hwRTArQ2hUWnVOMUFZUTFOdU5YSE9jQ1FMNlY5eFN3dVdHUnNUQmI0dkNFQUlSVjZDS2hJMnlWV0Z2SC9KTnNpVGVpNFFtVWNuajVMMWxqNG5XTWh4QUpqQk40OUdST3NuVWl2VzdweHRGbE5NOFUxS0pEU3dVQUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5rbm93bGVkZ2VbOV0gPSB7CiAgICAgICAgICAgIG5hbWU6ICdzdGFja292ZXJmbG93JywKICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9zZWFyY2g/cT0lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVlBQUFCemVucjBBQUFDUmtsRVFWUjRuTTNYWFdqUFVSekg4ZGNmVVZzZWtqdWhaVmEwbUkza0llVWh6Y01Ga3ZKMHNTZ1hMcENTa2xqWmhSUVhLTGxBVWxpSmtvZFN5aFhTUEpROGpGMTRLdVhHMDRyUi9pN09tZjJhLzJ5L2JmLzlmZXQwenU5MEh0N25lejdmYzg0dms4MW1GZElHRkhSMkRPcXFRWFB0aEx4TVhMejNKZjRERC9RMXdEVGNSWGtoQUliakptYmdFa2IwTjhCbmJFSVdwVGlIZ2ZrR0dJaEppZStMMkIvTDFhakxOOEFSUE1EbVJOMCtYSTNsblZpZEw0QnhXSUVoT0k0ektFSXIxdUVGTWppRnlma0FlSTJwdUIyL04rQWV5Z1E5TEk5NUVTNWpWRjhEd0Fjc3hBRkJmT1c0ajFWNEhxR3lLTkdKS0hzQ3NCYkxFbjEvWVJkVzRoT0dvUjZIY0VQUWhBaDZzTGNBdzNFVVY5Q0liYkdPNE9icGVDVHMvWGJjd2tuaFhQZ21lS1ZYQUtQeEpKYkg0ekRlUnFneXZNSk1uSTV0NXFCQkVHa0ZUdlFXNENubW9pcE84Z05Ec1VWWTNYWE13OGFZdnFNbDltdktOV0JQUmZnQU5SaURQWGd2dUwwYTEvQk1VUDhpTE1hN3pnWktBN0JFaU8rSjJ0WDhVVGo1U3JCR3VJZ0kyM0VFczdWdldVN3I4ajJRc0IyWUg4dk5lSXlIZ2pjZUNzZndlZUZHM0lvRk9OYlZvR2tBZnVLTEVHYkZtQlZUbTdVSXEyM0FIZFRpYTQ4QVRwMnQvMU5PSE9UVndwYVZDaWRnWmN5ck1CS0RZMTFsYkw5VWlJcjBBTkhhWHF1WlJGMnJFUCtOdUpDb0h4dEJLbUkrUmRSRC9maTZMS3h1MnAwY3Axc0FhZXhOVEpmU2Rrd0RrUGI5bm5QRkhhM2dqOUkwSHVqV2l0SmF3VDJReWZWckZzT3dyLy9aTWpYci8zNmRGZHdELzlKQVh2YThveFhjQXprMTBKLzJHdzA4ZTA1QWdYSjVBQUFBQUVsRlRrU3VRbUNDJywKICAgICAgICB9OwoKICAgICAgICAvL+ekvuS6pOWIl+ihqAogICAgICAgIGVuZ2luZUxpc3Quc29jaWFsaXR5ID0gW107CgogICAgICAgIGVuZ2luZUxpc3Quc29jaWFsaXR5WzBdID0gewogICAgICAgICAgICBuYW1lOiAn55m+5bqm6LS05ZCnJywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL3RpZWJhLmJhaWR1LmNvbS9mP2t3PSVzJmllPXV0Zi04JywKICAgICAgICAgICAgZmF2aWNvbjogaWNvbi5iYWlkdSwKICAgICAgICAgICAgYmxhbms6dHJ1ZSwKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3Quc29jaWFsaXR5WzFdID0gewogICAgICAgICAgICBuYW1lOiAn5paw5rWq5b6u5Y2aJywKICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9zLndlaWJvLmNvbS93ZWlibz9xPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUNwRWxFUVZRNGpiMlNYVWlUY1JUR0g5Q1pObWV5dlhPKzIxNjN0U1dhRldtc01tdHBTcEMxRUJOREphaWt5MEFFTDZTMEQ0cEtIVkZwWG1UYUI1RmR0SXVFcUJzbEJDTXFLeU5EVUZLcExRMnJPYjl5L3MvcElsWVVlQkZCeitVNTV3Zm5Cdy93SHhPN3pvd05hNHpJQUtENmEzcFBPa3BHNnpBK1dvZUo1MGZ3Smk4Vk94YzkxZ0xLenBqWXdqVXExY2J3TEE3UWJsdUpIVnVTa2VzcHhzV3B5d2k1SE5qK0p4dFRvWldPdjdBczk4MGtwM0cvMVQ0cEFYSjQyVkNDcHA1cTlLWmJrSG1oRkMwOTFlajdKUWdrM0pMTkQ0TEpLM25ja2NKK1J3cjNXK3lUT1V1VzVydlY2cElxclhSaWI2TDZRSTBicDd1cThOUmx4N2FScy9nYzV1TzlScVU3NkVqbFVaT0YzK2xsR2pHWWFFQ1NaL3QwQ1Y4K0tUYWVTVTdqTHIxOTBHV00zTjY4SDlkMnJFYUIzNFBaSDYvcEU5dW1iQ3Q0MkdCbVgzWWV6Unl0SlhIOUpvVmFXamxRV2NVZk1qZnptS3p3c3lTcnp3RFlBR0N0QW1kREVacVJHUjJkNjA5YXpyNlVWUnk0MGtKaWJvN2VEZy9Udys1dUd2VDVTQWhCOHo0L1RWUlcwWkNzaE80WmxjY1prZEZiZnJvMzZQVnRBZXNLbnJyclpTRUVuZkY0Q0FBQklKMU9SMTZ2bDRRUXREQS9UeDkzRmZDMDJjYmRpbTFJQTBnQWdEdngwcVBwZkRjTEllaEpieTlwTkJvcUtpb2l0OXROS3BXS25FNG5DU0ZJQ0VIamh5dkluMkRrZnF0ak1xeUNHclhHOHkwN2o1bVlPem83YWF2TFJZRkFnTEt5c2dnQUhTd3ZKeUVFaGZ4KzhtMXk4WXpGd1UxNlF6dUFpSEJwekEra2hGZDg4aFF2QklOY1cxL1A2M055T0U2V3FYRGZQaHFibnViUTRCQi9MUzdsb01uQzkweVdIZ2t3L3RZZUNaRHIxZXFXOTdzTEo3bnRCcisrMU1nRFYxdVpPKzR6SHp2Qlg5T2QvRkp2OEZmcnBITUE0aGV0c0FWSUxZdUlPT1NSRWkrM0dwWDJ4cmhsdDJ0VU1lZDNSMFdWR1lHa1JjRi95WGR5YWpZRUt6VDRpUUFBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnNvY2lhbGl0eVsyXSA9IHsKICAgICAgICAgICAgbmFtZTogJ+aKlumfs+aQnOe0oicsCiAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vd3d3LmRvdXlpbi5jb20vc2VhcmNoLyVzJywKICAgICAgICAgICAgZmF2aWNvbjogImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgdD0nMTY2Njg3MzIxNTgwOScgY2xhc3M9J2ljb24nIHZpZXdCb3g9JzAgMCAxMDI5IDEwMjQnIHZlcnNpb249JzEuMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyBwLWlkPScxNzQ0Micgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyUzRSUzQ3BhdGggZD0nTTI1OS4zNzkyIDM4NS4zMzEybS0xNzAuNTk4NCAwYTE3MC41OTg0IDE3MC41OTg0IDAgMSAwIDM0MS4xOTY4IDAgMTcwLjU5ODQgMTcwLjU5ODQgMCAxIDAtMzQxLjE5NjggMFonIGZpbGw9JyUyMzAzRjlBRCcgcC1pZD0nMTc0NDMnJTNFJTNDL3BhdGglM0UlM0NwYXRoIGQ9J000MDMuOTY4IDU2OC40MjI0bS0xNzAuNTk4NCAwYTE3MC41OTg0IDE3MC41OTg0IDAgMSAwIDM0MS4xOTY4IDAgMTcwLjU5ODQgMTcwLjU5ODQgMCAxIDAtMzQxLjE5NjggMFonIGZpbGw9JyUyM0Y5RjkwQicgcC1pZD0nMTc0NDQnJTNFJTNDL3BhdGglM0UlM0NwYXRoIGQ9J002MzEuMzk4NCA2MjIuMjg0OG0tODguNjc4NCAwYTg4LjY3ODQgODguNjc4NCAwIDEgMCAxNzcuMzU2OCAwIDg4LjY3ODQgODguNjc4NCAwIDEgMC0xNzcuMzU2OCAwWicgZmlsbD0nJTIzMEZGNDIwJyBwLWlkPScxNzQ0NSclM0UlM0MvcGF0aCUzRSUzQ3BhdGggZD0nTTc1My4wNDk2IDU2NS4yNDhtLTg4LjY3ODQgMGE4OC42Nzg0IDg4LjY3ODQgMCAxIDAgMTc3LjM1NjggMCA4OC42Nzg0IDg4LjY3ODQgMCAxIDAtMTc3LjM1NjggMFonIGZpbGw9JyUyM0RBMERGNycgcC1pZD0nMTc0NDYnJTNFJTNDL3BhdGglM0UlM0NwYXRoIGQ9J001OTQuMDIyNCAzNjkuMzU2OG0tMjIzLjAyNzIgMGEyMjMuMDI3MiAyMjMuMDI3MiAwIDEgMCA0NDYuMDU0NCAwIDIyMy4wMjcyIDIyMy4wMjcyIDAgMSAwLTQ0Ni4wNTQ0IDBaJyBmaWxsPSclMjNGRjAwMDAnIHAtaWQ9JzE3NDQ3JyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBkPSdNOTAxLjEyIDEwMjRoLTc3OC4yNGMtNjcuNTg0IDAtMTIyLjg4LTU1LjI5Ni0xMjIuODgtMTIyLjg4VjEyMi44OGMwLTY3LjU4NCA1NS4yOTYtMTIyLjg4IDEyMi44OC0xMjIuODhoNzc4LjI0YzY3LjU4NCAwIDEyMi44OCA1NS4yOTYgMTIyLjg4IDEyMi44OHY3NzguMjRjMCA2Ny41ODQtNTUuMjk2IDEyMi44OC0xMjIuODggMTIyLjg4eicgZmlsbD0nJTIzMDcwMTAzJyBwLWlkPScxNzQ0OCclM0UlM0MvcGF0aCUzRSUzQ3BhdGggZD0nTTgyOS40NCAyNjguMDgzMmMtODkuNzAyNC0wLjEwMjQtMTYyLjMwNC03Mi44MDY0LTE2Mi4zMDQtMTYyLjQwNjQgMC0xLjAyNCAwLjEwMjQtMi4wNDggMC4xMDI0LTMuMDcyaC03Mi40OTkydi0xOS40NTZjLTAuNzE2OCA3LjM3MjgtMS4xMjY0IDE0Ljk1MDQtMS4xMjY0IDIyLjUyOHMwLjQwOTYgMTUuMDUyOCAxLjEyNjQgMjIuNTI4djU3Ni43MTY4aC0xLjc0MDhjMCA4OS43MDI0LTcyLjcwNCAxNjIuNDA2NC0xNjIuNDA2NCAxNjIuNDA2NHMtMTYyLjQwNjQtNzIuNzA0LTE2Mi40MDY0LTE2Mi40MDY0IDcyLjcwNC0xNjIuNDA2NCAxNjIuNDA2NC0xNjIuNDA2NGMzNi43NjE2IDAgNzAuNTUzNiAxMi4xODU2IDk3Ljc5MiAzMi43Njh2LTg1LjA5NDRhMjM0LjQ5NiAyMzQuNDk2IDAgMCAwLTk3Ljc5Mi0yMS4xOTY4Yy0xMzAuMzU1MiAwLTIzNS45Mjk2IDEwNS42NzY4LTIzNS45Mjk2IDIzNS45Mjk2IDAgMTMwLjM1NTIgMTA1LjY3NjggMjM1LjkyOTYgMjM1LjkyOTYgMjM1LjkyOTZzMjM1LjkyOTYtMTA1LjY3NjggMjM1LjkyOTYtMjM1LjkyOTZjMC0wLjcxNjggMC0xLjQzMzYtMC4xMDI0LTIuMTUwNGgwLjEwMjRWMjc2LjE3MjhhMjM1LjQxNzYgMjM1LjQxNzYgMCAwIDAgMTYyLjkxODQgNjUuNTM2di03My42MjU2eicgZmlsbD0nJTIzRkZGRkZGJyBwLWlkPScxNzQ0OSclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UiLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5zb2NpYWxpdHlbM10gPSB7CiAgICAgICAgICAgIG5hbWU6ICfosYbnk6MnLAogICAgICAgICAgICB1cmw6ICdodHRwOi8vd3d3LmRvdWJhbi5jb20vc2VhcmNoP3NvdXJjZT1zdWdnZXN0JnE9JXMnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQ09FbEVRVlE0alpYU1QwalRZUmpBOFVmUU5kMnczRHFFUklRUUJtRlFOUEZnSFZ3STJTSG9rS1RRcGFCL1JKdlovSlBMaFdXa0NjcTJsQ0loRklMeUVIYW9ZRXI5TEUxL2JYTXpxWU9ZVG1lVU9UMm9sV2pmRGpZVitxY3ZmQzR2TDE5NGVSNlI3WnFqa3FmM1NLNXViZkwwSHNsSnVDZVNyMWVrY2lOU21vQVVhMWJQdmg2cE1DSnlSTmNtSlZxcW50ZWhqdmhYTGEwMkV5blNJcEtyODBpSmxtckZTY2VITHRvSGxQL3FHZkd4czNadk5LRDN5R1VEWXRXdzVYb2FKcWVaelBvRDdHczQrSnNNZHpZbVp4WXh4UWFrVUlmWWpkRkFFbkkrbHBhK1ZnQ212ODhRbVoxazZ1dlVrb25aU2FJbjNXVkdMTEdJM2JBaVlJbmpZZkFSQU9iYmgwaStrc0xteWgxTGtoMWJ1ZC9iQW9ESm1ZVlk0djRlMkhRMUZUa2h5TmtWamd0MUwrdi9GWWlsOWQxVEFOeWRkNmhzdTBtTjRxWkdjVkdqdUhBOHU0WjN0QmVBREhmMkg3NVFvS1gwaVlQUDArTUFERWFHQ1g3c3AvL1Rld0pqYi9rMlB3ZEF6NGlQMUtyZFNJRjJaY0NBRkNVaFp3VHI0MHNBSEc0NmhweUxRUXIxaUMwUi8xZ2ZFek1SRXNxU0VldTZ4ZmZMQVNOU0VJK2NGclpWNzJGK1laNUd0Ums1SmNoSkllWEdMaForTE5Ec2U3QjRaNGxGTGlaR3g3aTRTTGU2N3FLR3ZQU085UzJOU3cxNVVZZDdHSXFFQUJpZi9vSTZyS0tPK2pHNXpJaE5zeHhvZU4ySUx4emd6YWlmOW9FT1hneDI0Z3NIOElXRGRJZTh0QThvdkJycXhoY080Z3NIU0hmdC94WEkxeXRTYmtRdXhDTld6ZXJaRWhHSEVaRWNYWk5VR0JGN0VsSzJCdVVHeExaaDdpY0o4RHlaMENEQWF3QUFBQUJKUlU1RXJrSmdnZz09JywKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3Quc29jaWFsaXR5WzRdID0gewogICAgICAgICAgICBuYW1lOiAnVHdpdHRlcicsCiAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vdHdpdHRlci5jb20vc2VhcmNoLyVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUJSMGxFUVZRNGpXTmdHRXlBSDVlNGJYaENnWDFpYnFPVmIyZ0NrbHBVOWVhbHZSdVJGTUNCYXUzY0N3eFR6dnhubUhiaFA4UEVrLy8xeXlmdmw2eGI5c0RHTHl3SlJhRmgvK1pUREJOUC9yZk9yWjhQTTExVlc5dUFZY25qL3d4cjNpSHd3dnYvZVpmYy9teGtaZWVFWW9CdmRua2R3NXAzL3hubTNQalAzN1R1blhWdS9YeUgzTG9wS0pxaE9EQ3J0SUtCZ1lFSHhRQ0RsaVZINFlwV3Z2clBNT2ZHZjRhWlZ6QTBNNng1OTUrWGwxY0VJNlJjZklQRGVGYzgvb3hOQXpMV1dIanVOcTVZNFBGdm1UNmZrQ0grK2RXTnVBeGdjUEFKQ3RlWWMrWTJQdHRGUlVVbGNCckF3TURBN3g0VUVXVXpiY2NoYkpvdGJXM3RjV3EwenEyZnoxKzM4aDFENTk3L0RQTnZvMmgybnJCbUcxUXpNeTREbU5YVTFEUjhJMklUL0Z0bkxZVGhrUEtXVHMrZzBIQTFOVFVOZkpxUkFZK2twS1E4REVQOXkwNk14b0VEQUtVVzRLcGkxTm5VQUFBQUFFbEZUa1N1UW1DQycsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnNvY2lhbGl0eVs1XSA9IHsKICAgICAgICAgICAgbmFtZTogJ0ZhY2Vib29rJywKICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL3NlYXJjaC9yZXN1bHRzLnBocD9xPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFsMGxFUVZRNGpXTmdvQWJRdEU0OGJPWFg5SjhVckdtZGVCaHVnRXZzN1A4ZVNZdEp3aTZ4cy8vRERjQ25NQ3gzMWY5ajV4NzkvL1g3ei8vM0g3Ly92M0gzTlZ5T0tBUDJuN2ozSHgyUVpNRFhiei8vLy8vLy8zOSszUks0LzBreUFBWmNZbWRoeU9FMUFCZDQvUHdqWlFZc1dYZWNPQU5nL29VQkdOOGhZaEo1WVlCTmJqZ1pZT0pSZFpoVUE4dzlhNDhRbVZmeEF3QVRJZm5VbDZnTElBQUFBQUJKUlU1RXJrSmdnZz09JywKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3Quc29jaWFsaXR5WzZdID0gewogICAgICAgICAgICBuYW1lOiAn5b6u5L+h5pCc57SiJywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL3dlaXhpbi5zb2dvdS5jb20vd2VpeGluP2llPXV0ZjgmdHlwZT0yJnF1ZXJ5PSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUY5RWxFUVZSNG5MMlhTMnhkWnhISGZ6UG4zQ2ZYanh2SGlXTW50WnZFYVoybWpXczFWSXFxUkVqVW9vSUZENFVkRWl3ckVBdkVwbElLSzFpQ1FFS0FvQkRSVlMzRUlpSlFrdlJGVWlUY2lDUllTV09IME5STnI0bnQycjUrKzl4enZtRnhqcSt2SDBtY2hqSlhjeGZmZk9lYi96dzFJOThkT2t3TnRRUEhnRjZnRTJnRjBqd1lCVUFKR0FMT0FIM0E4TExRcjduNExQQkRvQWZRQjFSYVMybWdJK0hQRWh0NFBBRlRWZFFMbkFDZVdxM2NNQnlHQXd6QlIwa2xFb2NSQVhZL1lCVDRkS0tyRjJJUHRBTS9JSFozaldxSFQ0NTY2YVNKZytSa0d4bTJvS1JZWkp5QU1wTjJsVW03d2hJVENBTElab0cwSmpvSGZZeGpDRDIxTm51azJDN1BzRXMrUjFFZUkwWGRobzlIc3NTczNlUkRlNDFiOWlwTFRDS2JqMTRQeGpIZnNGNXMrU3NqUXhPZCtqVjI2WFA0NUd0Q3NKNFVud2JaUjczc3Bka09jZFg5bkxJTmJSYUVBcjFLbk8yQWthYVJ4NzN2OExCK0dZOHNpRU1FUk5aYkx5THh1Y1E1MEN5SDZOWVhhSlN1T3dMZWdEcVZKUGFDc2x1L1NvczhneEVySGl1OXo3bVRMelA0ai9PWXJUd3FJcFRlRytUY3lkOXhZNkFmekRBaUdxU1QvZm84V1pyWVpISzJLa2JhTEtLUkxoN1NMMVFsempuK2VmNVZMcjcxUjk0NSt3Zm1wOHRWVDBSaHlLVy9udUxpVzZmb1AvMTc1bWVuRVJHTWlDYnBwazJleGN4aURIZm50QnFHQWR2ME1CbUtWZVFpU25GYksvbENQVnRiTzBobHNsV2JWSlhtdG81RTFrNHFuY0VTb2FDMDZGRjhDamdpN0I0L0h6TTh5ZERJSTJ1OFl6eCt1SmVkZXg2alVHd2luY3V6b2tYb1B2SjUyaC90cHE3WVRDcVRBd3hmd1ZmSERtbW5UWjVnTkxyQ29wc2hzaEJCazFKZFRiNWhlSllsTFkzcjR1YW4wbXg3YUU4Y1k5dEF0bk1QZ2xHWE5ocXlRajRGdm9JbkJkcmRDOHk1Q2Y0VFhPZmF3am4rdGZCM0FwdGZWeUUrQms0aUhCVTJxblZ6RzJlMEFWblBzYU1nMUdjVVQxYk9BUXBla1lLM2haWjBKL3Z6bitIR1lqOXZUUDJha2VBNldnTkNEUWh0bm5rcmJham9Uc3J6UG5RMEtzV3NvQUtpaXFqVzNERVFReFJTbXFFcmQ1UXZOYjFJVzdwclZXNG9CczRxakVjWGs5NStiL0lWMnVxRXZCK0RjVkhFNVVzWEdieDJ0Um9xRVdGcWNwSy92WDJPaVkvR01YSHN5T3lqdC9ndENycTFXaVVhMTRBd0VwMW4wbDFEOE81cGZURXIxR1VFSTY2SWtaRVN2LzNWTDNqNXhFdVV5MU5KZ3hMZWZQMHN2L3paVDNuempkZEFCR2NSSGRsdTl1ZVA0aXoyZ3BvWlpyQmdvMXlydk1TU2ZYVFhWcXBBWGRxcTJXSm0xTmMzY1BESkhycjJIeUNielM0TGVIajNIcDQ0K0NUdDdSM1ZDbEx4Mkp0N0dsOHltQm55N1lHbmJEbG1BdXp5bitOQTZubXlzcFdOdXBtS1krOFdLS1Q4cWxSRUNNTVFFVUYxTmZnd0RQSDlsYkZEVU1ZcU4vbE42WnZNUkdQTEhvampZUWJ2VjA1eE9mZ1JvYzBoeUIzcmQxVll6UEE4YjUxeVlKWHlaWElXeFNFdzhOZld0K0VRVXZpU28yTHp6Tm93R2RsQ1JocFEwcGg1VkNJam1VdnVtMFNFNlhDVXhXZ1dMR2xFcXk3ZzA2dzkzQTc3dVY3cFl5SWFJQ05GOHRwQ1hsb0FvVHkzanlQWnI5elRNeHVSbVhGai9oMEN0NENJcnZlQW9Md1huR1RhM1NTd01pSWVTNjVNT2ZwMzRpSGo5bFFUTzNNZGRIN3FhWnh0cm5RaFRzQVBGcTV3ZWVaMGtwTkpINmhsWndIajRXVUNtNGxMMG1KWWdvZmdvZmpNaEJQOGFlekgzRnA4RjVXN2wyMnRZZVBCTUg4ZSt3a1R3WWV4OXd6VW5MR2FBVk53c0Y0V3M1aHlhK0ZkWGltOXlNRDBXU0tyb09LdFNkZzRnVlU4VkR6R2cySDZScjdQOWJsK3hMVDZsbTltQVI5ajloZVVrY1VoWGlsOWowY0toK2txSEdGWDdnQjFmaE8rcElnc1pEYWNvQnlPMHBLSmg2NkpvSlFNTDlXd0I3NlpsWWhuOXZzbVFWbU01cmhVL2dzRDA2OVQ4SW8wcExhVDFoeWhDeWlIdDVtUHBtbkxQc3FoeGkreVBiMmJ5YUNFcmlSdnlUZXpvWThMb0JaSVpDRmxOOHBVNVRZazdYMTVWTDh4ZDRFUDVxL2dhd3BNYWowdzVEdHpaNGczbHYvUk5yU3lIMWoxWHdoc2tjQXRKaWNHNElBeml0Rm5aaGVXTytML2tTOWc5UGxtTm16WWNZd1RyTm1PUGtFcUlSd0hoalZwUkdjTSswYmlDZmNKV3UzTXJOK3dyd05uekN6Wmp1TmduVGF6UWRhczU0WTkwSG91eUxyMVhFU0dsL1B3dnlxY2RORmduWWlpQUFBQUFFbEZUa1N1UW1DQycsCiAgICAgICAgfTsKCgogICAgICAgIC8vIOWtpuacr+aQnOe0ouWIl+ihqAogICAgICAgIGVuZ2luZUxpc3Quc2Nob2xhciA9IFtdOwoKICAgICAgICBlbmdpbmVMaXN0LnNjaG9sYXJbMF0gPSB7CiAgICAgICAgICAgIG5hbWU6ICfosLfmrYzlrabmnK8nLAogICAgICAgICAgICB1cmw6ICdodHRwczovL3NjaG9sYXIuZ29vZ2xlLmNvbS9zY2hvbGFyP2hsPXpoLUNOJnE9JXMnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQ3FrbEVRVlE0allXVDJVdFVVUnpITC9RSDFMTVA5aEtWTlVLRldwUDdURHJqVTl1RW80V1BXbEVSVWJTb3VlU01hVFdqVEJDUkdWM0hpQ3NTV3JUUUFwVlNaQnRaV0VaU1VXWmtDM1BQbmUzT3pLZUhLMU5LeTRIZnl6bDhQK2QzdnQvZmtTUkptcFdTVmJVOXZieGJNWlhKU25xWnJNeDN5RXJxbXJOL3I3VitaZjc2ampOejVtWVhTaWxabGR0S2ZHQnJBNXNYY2c3RHBnNXdYL2x6TlYrRmxtdXdzUk55NnI5SEpGTzV2OWZlQmxhWElMTld4ZW5UK1BndHpyL1cyT2M0YXp3YWxxTWdMWFoyOWRpOUpNWGoveEgzUDRweWJqREtodllnMXFNZ3BaZkt5a28zbFBrMHhyOVBGNy80RU9mVGp3UUFpUVJjZnFwanJsTVplQlZqYzJlSS9GYVE1amxrWldzM3FLSEVOUEg3eVRnNURZS0tFeHA2REdKeGNMUnBySElMQUpyN3c1aGRJQzF3eU1xdUhtTmozL2tRTjU3ckFMejlFaWUvU1pCUm8vSndMQVpBdFJMQzRqSUE3cjRwUUhxcHJCUzBRa2FOeXNMZEFYYktJUUFpT2poOUdtbDdWT1M3a2FTb29Ha0d3RlFxS3pZdldGeUNnaVpCYnFQZzNtdmpSdjlBQk5QZUFOZUhkU2JWQk91OEd2WVdBOUJ5TWN5S21RQ0xTNURUb0ZMU0tsRHVSL2ttRW94K01veXQ2dzJUdGlkQVViUGd5S1V3WmNlRFdJN01BRmhkUmdkTDlxdWs3Z2h3OGJHZU5QWGRaSnpLamlDWk5TcFp0U3A1alFLYjl6ZUExU1V3MTZtczlXcWN2QmxoY0RURzRLc1lveE8vb2hYaEJGV25nNWpyVkN3dVFiSG5OMEIydmFEaVJKQ0pxZHp2dnRSWmZVeVEzU0E0ZFN1Q2J0akMwSnNZNW5wQllSTGc5UGZhUEVZSzE0ZjE1TkE0ZlJwTEQ2amtIeEtZOWdhNFBXS2N2UnlQazl0b0dGN3NCV21SNDVTL3BOMFk1YTZCYUxMZHJvRW9HVFVxeTZvTmM5OU5Hazg1ZENITThvTUNxenVJdlEyazJYUHpMQVdOWDlVaUQ5aTkwRDBFRThZbzhHUWMvQS9nMlFTTWZJSGFQc2c5RE1VZTQvZG1icm56OENkeEt3dERUdGRleFFBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5zY2hvbGFyWzFdID0gewogICAgICAgICAgICBuYW1lOiAn55m+5bqm5a2m5pyvJywKICAgICAgICAgICAgdXJsOiAnaHR0cDovL3h1ZXNodS5iYWlkdS5jb20vcz93ZD0lcycsCiAgICAgICAgICAgIGZhdmljb246IGljb24uYmFpZHUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnNjaG9sYXJbMl0gPSB7CiAgICAgICAgICAgIG5hbWU6ICfnn6XnvZEnLAogICAgICAgICAgICB1cmw6ICdodHRwczovL2tucy5jbmtpLm5ldC9rbnM4L2RlZmF1bHRyZXN1bHQvaW5kZXg/Y29kZT1TQ0RCJmt3PSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUIza2xFUVZRNGphWFNNVWhxVVJ6SDhZdUJyU2JpSUlLSVM0dm80T1JRZ3lKQ0JnNUZ1dXFnc3loM3RLRndVc2pGeWNFSXdxMGxCTWM3UkxRRklsNFJuTHhYenFiZTRZcDB2MjhJNnZsZStGNzBoOTl5NEh3NDUvLy9TOVNPK1Vra2FzZjhYb3ZGZ2tLaGdDekxyRllyZHRaWGdCQ0N3OE5EYkRZYm5VN24rNEN1NjdoY0xsS3BGRUtJN3dPUGo0L1k3WGFlbjU5NWVYbWhVcW1nNi9yL0FVSUlRcUVRQndjSDVQTjVIQTRIVHFjVFZWVzM3bW1hOXQ2ZlA0R3JxeXNrU2ZxSXgrT2gxK3NCc05sc2VIcDZvbHd1RTRsRXVMeTgvQnNZajhmYzNOd1FDQVR3Ky8wTWgwTk0wK1R1N281R28wR2hVS0JlcnhNT2g0bkZZbC8zd0RBTW1zMG1QcCtQKy90N3B0TXBYcStYWXJHSWFacXMxMnZPenM1UUZHVWJHQXdHOVB0OUZFVWhtODBpU1JKSFIwZE1KaE5PVGs2b1ZDb0F0TnR0enMvUDJXdzJuNENtYWJqZGJod09CN0ZZREwvZmp5ekxDQ0d3TEl0U3FVUXdHS1JhcmJLM3QwYzZuV2E1WEg0Q3M5bU0wOU5UY3JrY285R0lXcTNHN2UwdGxtVUJNSjFPaVVhanhPTnhXcTBXcXFyeTl2YTIvWVhGWXZFeHluUTZ6ZlgxTlpsTWh2RjQvSEZ1R01idVBkQTBqV1F5U2JWYVJkZDE5dmYzdWJpNFlMMWUvM3VSWGw5ZnllZnpKQklKNXZNNUFOMXVsNGVIaC9mbjdnUitrRi9aUVEvV25FaGVwZ0FBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnNjaG9sYXJbM10gPSB7CiAgICAgICAgICAgIG5hbWU6ICfkuIfmlrknLAogICAgICAgICAgICB1cmw6ICdodHRwOi8vcy5nLndhbmZhbmdkYXRhLmNvbS5jbi9QYXBlci5hc3B4P3E9JXMnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQkowbEVRVlE0amRXU3ZZNEJVUmhBUHdvUzhUdVRxRVNDM2xONERaR1lWcUdUYVBRYTRnMVVZanF4ZE41RW9VUkkvQ1EwTTkvWlluWXlhOWZzUnJIRkZxZTVKem01OTM2ZnRFWGF0b2c5RVptK2lpMWl5MXhrUWJVS2xnWE5wb2RsUWIwTzhUalVhby9POTQwR0pKUElSR1JLcjRmQ2Qwd1RYYTJlTzRCSzVTUFE2WGlIcWg2QW5zK29ZYUN6MmFQei9lMEdwZEpmQms0bkw3QmNQbitDNjBLNS9Nc05UQk1kajlIREFkMXVBM1k3ZExPQll2R0h3UFdLRmdxb1NDaUkvQkM0WE5COEhyVXNkRFJDQjRPQTRSRHQ5OEV3d2dPY3oyZ3VGenBHL3NFWVh3cDB1eml1cTU5eDczZDFERU9keFVLL09zZDExWFVjRGZhZzFVS1B4MkRPK3oyczE5NG5odXdCL2g3TVJkNkl4U0NiaFhUYUk1T0JWQW9pRVVna0hwMVBLZ1hSS084TmZCcDdVQ3hkMlFBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5zY2hvbGFyWzRdID0gewogICAgICAgICAgICBuYW1lOiAnRUJTQ08nLAogICAgICAgICAgICB1cmw6ICdodHRwOi8vd2ViLmIuZWJzY29ob3N0LmNvbS9laG9zdC9yZXN1bHRzP3NpZD04ZTc2Yzk0MS0wODRkLTRiOTMtYjA1YS1kNWYxODIxOTYwMTclNDBzZXNzaW9ubWdyMTAyJnZpZD0xJmhpZD0xMjgmYnF1ZXJ5PSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUNKMGxFUVZRNGpaV1QzVXRUWVJ6SFQrdzRwemRkZVJGZEJBYmQxWjhnaVh0Sno5bUt2QkRDeE1xa3JLNTd1NmtFeXgxM3pqSFdJbDhURWJNcHRhTHBaTWVNQ2dkQlM4ZFNSQzhXV0FTOVVKUlMxajVkN0FXbmp1cUI3OFVQSGo1OG4rZjcrd3BGTHAwaWw0NVoxaEJzN25WUzBrclBkb1hNL1l5RUlwZE9nYVJTV3QvSkdaOUJ2V2VVT2lYSVVYV014dlp4R3JRUVRkNHdUZDR3cmt2M3NEaDFMT3NCWXBWS2FYMFhQYUVZbWZQeDZ3cUhsU0FITHQvbmxEZE1aTzR0eVdTU0hYVWRtS3JVWEVDeFMwZVVWSVM5VjNrWVdRVEFpQ1lRS2xwVDFpdGFFU3M5QktZV3FIVS9RckFwdVlEc1lGTVluSndGNFBIMEcwUkp4ZUxVS0pRMUJLdWJiWWR1c3ZOSUYyWlp6UU93S3d3OW1jc0NUSktLS0ttVTFQZ29QenZFbGtvUEJaSzY4Uk0zQXhqUlJNcCsrVFdPNnlGR25zM25UMkV6d0ljdnl6eUlMQkIrbVdEMTEyOEdKbDdudlAydmdPamllNnpuL093NzcrZDVmSW5ocC9QL0J6Q2lDUVNyRzZHc0Jmc0ZQLzFHSE1IUmhzWDVqNEJNQ29XeXh0YUQxOWwxckJ1enJHR1dWWXIzdCtjSDNKbWMyeGlqVThOVTVVRndLRndabUdMUHliN3NNbVVCWmxsREtHdmhidHJCeEt2MEl0bVZsTXBhcUc0TzhPN1RON2JYM2tLVTFnRE1za1pKalkvRzluRytyL3dFWVBuSEtnMWFDTWZGWWFxYkE2Z2pMd0NZWC9wTVlkcFZGbUNxOUxEN3hHMzZqVGc5b1JnZHdXbTZ4MkwwaGVOMGpzN1FPeDVqY0hLVzNsQ00wemNNeFBWZHlLbXpkWTNTRmM2cHRLTXRKNFUvZmtCWHovTEQ2QllBQUFBQVNVVk9SSzVDWUlJPScsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnNjaG9sYXJbNV0gPSB7CiAgICAgICAgICAgIG5hbWU6ICdXT1MnLAogICAgICAgICAgICB1cmw6ICdodHRwOi8vYXBwcy53ZWJvZmtub3dsZWRnZS5jb20vVUFfR2VuZXJhbFNlYXJjaC5kbz9maWVsZENvdW50PTMmYWN0aW9uPXNlYXJjaCZwcm9kdWN0PVVBJnNlYXJjaF9tb2RlPUdlbmVyYWxTZWFyY2gmbWF4X2ZpZWxkX2NvdW50PTI1Jm1heF9maWVsZF9ub3RpY2U9Tm90aWNlJTNBK1lvdStjYW5ub3QrYWRkK2Fub3RoZXIrZmllbGQuJmlucHV0X2ludmFsaWRfbm90aWNlPVNlYXJjaCtFcnJvciUzQStQbGVhc2UrZW50ZXIrYStzZWFyY2grdGVybS4maW5wdXRfaW52YWxpZF9ub3RpY2VfbGltaXRzPSslM0NiciUyRiUzRU5vdGUlM0ErRmllbGRzK2Rpc3BsYXllZCtpbitzY3JvbGxpbmcrYm94ZXMrbXVzdCtiZStjb21iaW5lZCt3aXRoK2F0K2xlYXN0K29uZStvdGhlcitzZWFyY2grZmllbGQuJnNhX2ltZ19hbHQ9U2VsZWN0K3Rlcm1zK2Zyb20rdGhlK2luZGV4JnZhbHVlKGlucHV0MSk9JXMmdmFsdWUlMjhzZWxlY3QxJTI5PVRJJnZhbHVlJTI4aGlkSW5wdXQxJTI5PWluaXRWb2lkJnZhbHVlJTI4aGlkU2hvd0ljb24xJTI5PTAmdmFsdWUlMjhib29sXzFfMiUyOT1BTkQmdmFsdWUlMjhpbnB1dDIlMjk9JnZhbHVlJTI4c2VsZWN0MiUyOT1BVSZ2YWx1ZSUyOGhpZElucHV0MiUyOT1pbml0QXV0aG9yJnZhbHVlJTI4aGlkU2hvd0ljb24yJTI5PTEmdmFsdWUlMjhib29sXzJfMyUyOT1BTkQmdmFsdWUlMjhpbnB1dDMlMjk9JnZhbHVlJTI4c2VsZWN0MyUyOT1TTyZ2YWx1ZSUyOGhpZElucHV0MyUyOT1pbml0U291cmNlJnZhbHVlJTI4aGlkU2hvd0ljb24zJTI5PTEmbGltaXRTdGF0dXM9Y29sbGFwc2VkJmV4cGFuZF9hbHQ9RXhwYW5kK3RoZXNlK3NldHRpbmdzJmV4cGFuZF90aXRsZT1FeHBhbmQrdGhlc2Urc2V0dGluZ3MmY29sbGFwc2VfYWx0PUNvbGxhcHNlK3RoZXNlK3NldHRpbmdzJmNvbGxhcHNlX3RpdGxlPUNvbGxhcHNlK3RoZXNlK3NldHRpbmdzJlNpbmNlTGFzdFZpc2l0X1VUQz0mU2luY2VMYXN0VmlzaXRfREFURT0mdGltZXNwYW5TdGF0dXM9ZGlzcGxheSUzQStibG9jayZ0aW1lU3BhbkNvbGxhcHNlZExpc3RTdGF0dXM9ZGlzcGxheSUzQStub25lJnBlcmlvZD1SYW5nZStTZWxlY3Rpb24mcmFuZ2U9QUxMJnNzU3RhdHVzPWRpc3BsYXklM0Fub25lJnNzX2xlbW1hdGl6YXRpb249T24mc3NfcXVlcnlfbGFuZ3VhZ2U9JnJzU3RhdHVzPWRpc3BsYXklM0Fub25lJnJzX3JlY19wZXJfcGFnZT0xMCZyc19zb3J0X2J5PVBZLkQlM0JMRC5EJTNCVkwuRCUzQlNPLkElM0JQRy5BJTNCQVUuQSZyc19yZWZpbmVQYW5lbD12aXNpYmlsaXR5JTNBc2hvdycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFCcjBsRVFWUTRqWjJUUFlvYlFSQ0Z2eU5VTXBHVGpnUWJHQXFCRVpzMWk1QUQ0Vld6Qm9OZ0YxY2loQjBOT055azEvbWdFd3h6Z21GdU1ITUQ2U2E3UnhnSFE4dXpJK0hBRlJYVVQ3OSs3eFZNUWpQVU8venhGeWZ2OE9OY00zVGFmdzRudUhaUGx4Wk02MmxCdTZkemdyc1lOc1dLTlFjQS9ZQVc5eHlLZXc1eFNTeS9VaFdmaDFxeDVtQ0t2VnNTNzRpdno3d0IyQ2Nzcm9nQUFpSWdtcUdtV1ArYkh1RDFtYmQ0Ti9SZ2l0VmJHaWM0emRCd1F4QVFtMk54U1N3ZnFJNC9PWVVad1JTcnY5Rm9odFpiR2xPTWNrUFZ2OUFMU1AxSUF4QStFc1lRTlVQVFlQczA4TlMvMEpjYkt2SUZlWmdSTkVNMVE1M2d3ZzFoU3FJcFpvcVZHNnJvaVdGR3lCZms5Skcrai9UZTRjT01rTitTWDVQTE8zeCtPenptSFQ3Tm5SRkVUeXczVktaWXZpQy9RREFmbUU5SXp3Z1NCK1AvSFhlY3hpaWM0R3lPQWRTUE5BSnk1bUNzUXZ0RUZ6MVJNL1M0NTFSdmFlS1NtSVp0am5tSEY1Q3pDbE1mdE4vcFRESE4wT1FEZ0xqNnUraWRENUpNeVlrQ1VqNVFGZXZCaGNVWERuRTFvQktRNU1RTG9wM2cyaDFkZ25sTkJadGo3ZTdLTFl3akhWUDdneTVkWThyL2VZMy9HMzhBMXZPNFZsb2NpTFFBQUFBQVNVVk9SSzVDWUlJPScsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnNjaG9sYXJbNl0gPSB7CiAgICAgICAgICAgIG5hbWU6ICdKU1RPUicsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly93d3cuanN0b3Iub3JnL2FjdGlvbi9kb0FkdmFuY2VkU2VhcmNoP3EwPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQURsMGxFUVZRNGpTMlJTMHpiZFFDQS8zY3ZKaDcxb2xsTUlDTjBGaHB3YkJsWngrWmcwTmRDMy8yM3BiUThCOTFZR1FPdENBT1pKUXJJYWlsbExWRGdKNitCUE1USlU5MUJsN213T0JRUWpFdUd6Sk1IVGJ4OEh2RCs1VXUrZkZMR1N5L1hsaXBWUWxhb2hDMU5LZVQwVE9GU1pnbTNNbHZZVXRPRitWaUtNQjlMRWJiVWRPRldaZ2s1VFhuRUtWUkNUa2tUa2tlUk1iL2NFR1Mrc1piMVQ1cjU0c1pWUnB3dWhxMU9Oc1VVKzZ0cjdDMnY4amc1VHRMaDV1djJCdGE3bWxscWFXRFJYNDlrUzFPS2U5ZXFDQnZQMHUrOFJOeW5JK3JJcC9uRWNkcXlUL0hYNFF2Ky9mc2ZvbVluZDR4cTRqNE5BeVdGREZib1NKanNTTGJqU2pFYnFLWFBkcEdCRWkxOWxnSldvdGVaRDFYUlZaVEQxdW95ejU5dU0xaHVwMTh1b005ZVNNU1N6MENKam1HSEcwbFdxRVRDWktmUG5zOU1xNWZ1d3JPRVRSZnBOZVFSTnFwNXNyakV3ZFlPNHpmS0dhc3owNnZQWS9aV0daM25UaEhUV3BCc3FRcXg4dEY3REZZWW1HbngwdThvNU1QVDJVd0ZTMmpQVWJJNXQ4UWYyN3ZFbkJiVzR3RysrdFNQQ05pWmZ0OURUUCsvWUxVenlGQ0ZIbEh2WUs2amdwRDZGQkZyQVdIVGVYNzZjb1hEblQxNjlWcm1idnVZRDFWeVM2VWs1aXdpWnJBaXlZcE1NU0s3R0hBWE10SGtvdU4wRmlOK016T3RwZlRvY3ZudDRmYzgzOW9oSnB1NTY5RXdWRmxNM0dzZ1lzbG5yTlNINU03TUV1RUxPbHBVNlF5VTZJaDdEV3dNM2lUcE54UEtPOG16elI4NStHV1hYcTJHSGwwdUM1M1ZERllXMDZ2UFkrSGRBSkl0OVMyeEdBd3cyMWJLL2ZBMU92Tk9VL3ZLYS9SbzFJU05lV3gvODRERDNUMzY3VWFHcWk4VDkrcnAxcWk1L3VyckRGcWRTSTQwcFpqMlZ6SFI2R0Mydll6bFNCM0pLeWErVFRZeDArWmgvNGVISEd6dGNOZHRaYUpKUnRUWldJM1ZFM1VVRWRXWWtGeEtsZWpYR21sVktZaTV0RXcweWd4NHRJelYyYmh6V2MzMnhnTitmL3lFaE05QnhQSU93elVtUXVvY0l0WjhSajFlSkd1cVFpd0c2MWtJbFNNQ05yb3VGWEE3OTIxQzV6TDVyRGlmUC9lZThXaHFsdVlUR1lpQWxjOGJaS0tPSWtacVRFeFVWeDF0dk45Mmt6N2JCYm8xWnhpdHZjTFBhK3RNTnRTeHRiek1pMS8zR2F1cFliTEp6cjBQU3Jsak9NOTBzSVM0VjAvL1VVS1dHSE43U1pRYkdLb3lFclVVOFYwaXlkT1ZOUjdkbXlQaEttUEViMkVqMGNqb1ZUc2ZYOGlsNDh4SnhodWNERm5jU05ZMzNweGZ2QkpnMUYzR2JOMTFrZzRQdzNZM2s5VitoSytTSVlzVDRhMWd6Rk5CVWk1bHhGWEdxTHVNcWVwYXBsdysvZ05jd21jR21oS0dSQUFBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LnNjaG9sYXJbN10gPSB7CiAgICAgICAgICAgIG5hbWU6ICdTcHJpbmdlcicsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly9yZC5zcHJpbmdlci5jb20vc2VhcmNoP3F1ZXJ5PSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUF1RWxFUVZRNGpiV1JzUTJFTUF4Rk13akZ6VUxISnZSMEdlQWFLTDJHVjRqRUFObUJpb3JxT2lwZjVlakgrRGc0NmI1a1JZTHY1eDhuaUtObDNTUVNDNmZzL2E0VXZPYW1HMHB4eXJLczIzMUEyNCtIOHhLZzdjZGkxdWtLamNUbmdFaGNqQm9iVDcyU0MwQURtakE2cHl4Tk4vZ0FwSFBLRW9rbEVsY0FIWUpMRFJwZGpYYUpOckw5RmpDYU5uclRUd0VLMFJmQWw3Z01zQ0JQSDNlQXpmWWFXTjVlRGdudXFnTHM4eVN2NStOcjdmUDBKOEF2ZWdPaGtHcjZBWUhTRWdBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgIH07CgogICAgICAgIGVuZ2luZUxpc3QubmV3cyA9IFtdOwoKICAgICAgICBlbmdpbmVMaXN0Lm5ld3NbMF0gPSB7CiAgICAgICAgICAgIG5hbWU6ICLosLfmrYzkuK3mlociLAogICAgICAgICAgICB1cmw6ICJodHRwczovL25ld3MuZ29vZ2xlLmNvbS9zZWFyY2g/cT0lcyZobD16aC1DTiZnbD1DTiZjZWlkPUNOOnpoLUhhbnMiLAogICAgICAgICAgICBmYXZpY29uOiJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVlBQUFCemVucjBBQUFFUkVsRVFWUjRuTzJXVFdoY1ZSVEhmL2UrK2Nya28va3lYMjAxalFpdElPbkdoY1dxVUJXTFNHZ1JWTkNWRnFvdVhGUUZhMFhRWFJSY1dCcEJVUlJCbzlKV2NaR1dnaGhxYlZPSzFJOHVMRWtzbUtTMnlUUnQ1aXN6Yys5eDhXYm16Yng1bWNhMU9mQjR2SHZPUGYvLytiam5QbGlULzd1b2VzcTd2OWszbzZKT24xZ0JCQUZFM0hmcEcrQzZGWnFSOGtySlJoU1FLOHorOGVTaDlTdGhoT29SV0xUWlBrbGFSRHhJRVdGYWdJeGxaRjJLUnpvdjA5LzRBL3N1UGMzb2NxU0NaSkdPVm4zMU1Pb1M4TXM4aWhzR0R1ZzBqOTgyejJETE9OZ29tRmFlV2ZjM28xY0cvb3U3bXhNb2lEQnQ0VllENzdVdHNydDdIRXdXcEFFUXNDMjRZUXBiVzM5aDdLdE9wamJHR0ZydmdBWTBkT3U2VmE1UFlOcHFSbHFXMk50N0Vnb0xVR2dFNGxDdWZra0ViSVQ0NzFlNWYwYTQxdHpDZEUrTTRZRTRYMGJ6ZFFuVTBKT0xqdzJ4Y0c2VThHeVVYTjI5TlR3V1R2ZWp2dStDbUhGMVlzRmFRbG9SaWplVGliZi81TFMyajdjZC9HUi9JQUdaR0p3bmZLM2o2bzNuUU14TjBHc0o1SmNVUzBjaXFHaWwzald5T1BSY09vTFdZZkpOemJPNm9XR3MvZFBEenlvQU9iTlJNRGxBZzU1ajE4K3A0UE1wSHFiNHZ5Vm9UY282QzR3ZWF5SWYyWVlDeEpvcnR4dy8wNjBCTU9uektPMkY1Qy94S3NCWG1TUkEwSUJZK3l0dXlLQzJMV3pGMkx3WFJqR2l5Z2Z2cVFTdlF2QkZYMG00bkZGUkNOQjE0dXhEWlFLdTVFK3R4Rm9BSTdCY0FHdXJ3UVZJRzBnWjk1MDJrQ29JYVFOV3FFbXFJRmhqcGtvdXlzZFEzWnQ0UUU1MVNTbjZraXdzdytpZUdIMmRIdGM5SXhsbWtrSkl3K1VzVEx3ZUowaU9UZVI0NDNpZWpvaVhTUkIwSW5HZ1pLT3JkamdlV3dFU09YanFMcWNLSE9ETjNRNXp5Nlh1cmlNVjVWUkFRVUNoNkRoMzhZdWFEQUJReVA5RmlQNVNCajU0SXNLZG0wSzgrdEYxVHZ3VHB0R0JSQjU2SXRBUlVZaEFieFEydjVVR3dJaWdjTXVGUUpNRE1lMXhTUnBvVTlYbnE1cUFYUjVEczdka3NxWGZWUitkRGJPNUVYWU1hQXJXUzkzWXBDVm40Y09oTU1iVzlydFNpcVdNY0hEY25ZWTVBY2QzdnFzSXFPM3A1K1ZIN3JIQ29PdkFYZTl3d0ZoNGFWZXNhdlBIYjZjSUE5c0h3elhnSlJFUjNoL1BnMERhUWlIdk5YdHRCZ0R5ZkEwdWdmbEZRMmVydyttMHNET2lVSzhrUU1BTXQ2RzFJcWFnS3dycTVVUVJ6WThPaEJRUHQwZktSekdaeVp5c0NqcUk5YVB2cEFUZytIWEwxSXRoTnZSRXNSWW1ad3kzYjNEUUNzNy9tZVcxYncySkhIejNRZ01tWUhJZlBaWGo4OThNamNYbWZ2ZHcwOXpnV2FyK0QzVHR0dUlRRWVIQkZzVjloNVpkUXcxM2JIVEJMMHhtMlBHWmUxTmxEWFMxYVhvN2E1K0JIazJtNFBrTnB6bnZ4d3JNd003aFpGVXlzOGJ0L3FSeE83dXZlTm1VakM2a0JGc3hCVTFSdVNtcWFBcDUwL1BFL3FZYXZPRC9BVjh0WTdvYTFGL3FMWEhQYjhVRkdEeXVWME9nanIycjl4bjRnZnlYVkQxL3F5ZXdnaGYvdmJDaStRcjdBd2tvd29nRUQxa0orSkNLaGFBU2lJQlNnZjIrSm12Q3Z5VjRBKzZrWFFsRkFBQUFBRWxGVGtTdVFtQ0MiLAogICAgICAgICAgICBibGFuazogdHJ1ZSwKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3QubmV3c1sxXSA9IHsKICAgICAgICAgICAgbmFtZTogIueZvuW6puaWsOmXuyIsCiAgICAgICAgICAgIHVybDogImh0dHA6Ly9uZXdzLmJhaWR1LmNvbS9ucz93b3JkPSVzJnRuPW5ld3MmZnJvbT1uZXdzJmNsPTImcm49MjAmY3Q9MSIsCiAgICAgICAgICAgIGZhdmljb246aWNvbi5iYWlkdSwKICAgICAgICAgICAgYmxhbms6IHRydWUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0Lm5ld3NbMl0gPSB7CiAgICAgICAgICAgIG5hbWU6ICLnvZHmmJMt55m+5bqmIiwKICAgICAgICAgICAgdXJsOiAiaHR0cHM6Ly93d3cuYmFpZHUuY29tL3M/d2Q9JXMlMjBzaXRlJTNBbmV3cy4xNjMuY29tIiwKICAgICAgICAgICAgZmF2aWNvbjoiZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBQUFJQUN0QUFBQUZnQUFBSWxRVGtjTkNob0tBQUFBRFVsSVJGSUFBQUFRQUFBQUVBZ0dBQUFBSC9QL1lRQUFBSFJKUkVGVWVKeXRVVUVPd0RBSW9rdi8vMlYzY25GVWFKT05VeVdJYUlHUEdCMFpRQWp4b3I5Yzh3QkdiZXFNWHdiY0hFQUVFTTVrZGxGZFpJWTFVTGM0TXRoRlR5d1JkMU41cmVVWHFxQzdBUTlvSTJaamNsd3JjenVwMXZVOWxVaWxZRHdHbmRCeDIvZ3A1T2p5aUdvRngvK0NHOWoxUEFuN2prWW9BQUFBQUVsRlRrU3VRbUNDIiwKICAgICAgICAgICAgYmxhbms6IHRydWUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0Lm5ld3NbM10gPSB7CiAgICAgICAgICAgIG5hbWU6ICLnvZHmmJMt6LC35q2MIiwKICAgICAgICAgICAgdXJsOiAiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS5oay9zZWFyY2g/cT1zaXRlOm5ld3MuMTYzLmNvbSslcyIsCiAgICAgICAgICAgIGZhdmljb246ImRhdGE6aW1hZ2UveC1pY29uO2Jhc2U2NCxBQUFCQUFFQUVCQUFBQUFBSUFDdEFBQUFGZ0FBQUlsUVRrY05DaG9LQUFBQURVbElSRklBQUFBUUFBQUFFQWdHQUFBQUgvUC9ZUUFBQUhSSlJFRlVlSnl0VVVFT3dEQUlva3YvLzJWM2NuRlVhSk9OVXlXSWFJR1BHQjBaUUFqeG9yOWM4d0JHYmVxTVh3YmNIRUFFRU01a2RsRmRaSVkxVUxjNE10aEZUeXdSZDFONXJlVVhxcUM3QVE5b0kyWmpjbHdyY3p1cDF2VTlsVWlsWUR3R25kQngyL2dwNU9qeWlHb0Z4LytDRzlqMVBBbjdqa1lvQUFBQUFFbEZUa1N1UW1DQyIsCiAgICAgICAgICAgIGJsYW5rOiB0cnVlLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5uZXdzWzRdID0gewogICAgICAgICAgICBuYW1lOiAi6IW+6K6v5paw6Ze7IiwKICAgICAgICAgICAgdXJsOiAiaHR0cHM6Ly93d3cuc29nb3UuY29tL3NvZ291P3NpdGU9bmV3cy5xcS5jb20mcXVlcnk9JXMiLAogICAgICAgICAgICBmYXZpY29uOiJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFDNTBsRVFWUjRuRzJUUzJoY2RSVEdmLzg3YysvTkhUT1pSMnlidEVvejdTSUxXeVJxQ21LQ0tlSnJJMmdKRlJjMkc0c2lSRjBxZ2xwUmNhRkZBb3FnRmtXeHRrTGRGTkdXVG9TbUVHbzE5RUZOMmhLU2RHYWF0Q2IzWm1idXpIMGVGN0hvVkEvODRDdytQajRPMzFIY010RzBOcXUwOXA3b3RyMnNKSjdub1lubnNCQTJtSG5PdXFXZGM4T1Q0Ly9XYXpjWG1XWkVTc09pcFhmM09Pa2ZxS1ZlSjZubk1SR3VoeTZtUk96cmZiYjQ4SSs3Vi81aklOT00wUDM1QWNJWm5NUmVrdTA3TUF3RHk3TDRkR0EvWGRZNnBocUxuS3FjWW5UcnJ1eWU4VkZwaVMyTm95S0xMMHEwUENhdTY0cm4reEtHb1VSUkpGRVV5ZlRTWmZsaTVwQnMrMzVBWGkyK0lDZm5mNUhDZC8xRkFDMjZsSjBsZHNFN1RWMkcwSFVkUFpuazNMekRpVG1iN2U4YzQveWN3WjZ0dS9pZzcyMGFDWU9KMGs4Y0hQeDRDRUNKODVIZ1g0TmdEci96QUxxdU03V3d5ajFmbldsSnVmenlBMlJTT2xkdmxCbjc0MzE2T3dxOE8zUHdMUTJ6RjVxL1F1cEJFb2tFQUljdjJHQ21XdGgvZkJhbEZOMjVEZHpmL1JnVDF5YlpuT3A2UThQOUhmd3AwTGVnbEFMZ3k2VUd0TFcxTUhabEZRQ2xGSTl1MnNsZzRYRjBDZEZvbm9ISUJ1OHNBRWZPTFZIMkFOTnF3VTUzckIwY1FJUys3TDNNZXpZYXpVbEVBakQ3aUVWNGN2dDY5blZwWUpoZ3RQMk56dkl6aFRXRE9DWVc0V3AxQVQ4T3g3VzZlZ1JRdU1zbmlLSm9yWTJXU1cvZzhmUkdnMzR6WmxzY3NtQjdCRUZBdmU0U3h6RmVVQ1ZXdkVLRi9NamlwY3V5WXR0U3E5ZkY4enlKb2tqaU9HN2h6L0dUMHZ6NXVGU3M5VksrOHk1NTR1andQMldxM0w1eFpmSHJiOFIySEtuVmF0Sm9Oc1gzZlFtQ1FGWlhxMUw5NURNcGsxOGowU25sWktkc1BuSjNGa0RkTkNtVGwvUjdyOEdtTHJ3TFZ6QUcrdUgwSkkxamg1Q3dpY3FZcUl5Rk1reThieS8yM1lFejFXSUFVTkx6UmVPcExVTXEwNDdXa1ViTFpOR3lPYlJzSjFwMkhlNkhoNmtXZjhzVmNPeGJ2N2hsU3VUZXZIN2ZvRGlqTDhtTkhVTlNJbGVza09uNVArMWZ1M3R3RFNCM3Vrb0FBQUFBU1VWT1JLNUNZSUk9IiwKICAgICAgICAgICAgYmxhbms6IHRydWUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0Lm5ld3NbNV0gPSB7CiAgICAgICAgICAgIG5hbWU6ICLlh6Tlh7DmlrDpl7siLAogICAgICAgICAgICB1cmw6ICJodHRwOi8vc2VhcmNoLmlmZW5nLmNvbS9zb2Zlbmcvc2VhcmNoLmFjdGlvbj9xPSVzIiwKICAgICAgICAgICAgZmF2aWNvbjoiZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBQUFJQUNCQXdBQUZnQUFBSWxRVGtjTkNob0tBQUFBRFVsSVJGSUFBQUFRQUFBQUVBZ0dBQUFBSC9QL1lRQUFBMGhKUkVGVWVKeE5rMTFNVzNVQXhYLzM5dC9lbGxMQUFnVXlFQkZ3SUFzT0FrTmtha3hNTmpjSjBTMXUwWkdaR1QrUytXRDB3Y1FuNDlQMFpaSm8wTGtZSTVpNTZSd2pJem9TMklTRUlBekhweExzWUJJS0xSK0ZsbjdjbGx2K1BpRFZrNXpIODB0T2NvN1M1a0FDS093b3M2cUdyTnJIV1o4YVp5c1lJSDN2bzJoWjJjUldWMWk5OHh1aCs3UDhYMHI3dndDQTBqTnY0cXlxWWViQ1p4UTNuNkh3MkVtQzdobldSb1l3SWhHRXpVYllzOERzcFcrSnIvdFJBTEViemovYVJFSFRjUWJlYU9icHk1MVlYVG4wblRwT1pIR0I3UHFEMkhMejBGZVhNY0poWFBVSDhmN2FpeEVPUWJzRGVjbVZJcjNEZzdLcm9Vck9YYjhxZzU0RmVmbEJwK3g1cVZGdStyd3lGb3NsSFY1YmxkTmZmeWwvS01tVmJRNmtFQTRIZVllT0VsMVpRYkZhY1QxN21QNFhEMlBKektMdXEzWVVJVEFNNDcvU1Zoc0ZKMDRoVFlLaHQxOURaRHhXVFVaMUxSc3pmNUo3cEluQXJCdmZRRC9WbjM2QklTVlMxMG5vT3NKdVR6S2kzaVZ5RzE4Z3I2c0QxVjVhQmxZYjI0WkI2dDV5Vm9jR0FjZzRVSTkvZkpSYnp6L0R6U2VybUR6M0VZWmhZR3h0a1Vna21PLzRrWUtYVDZQYUNvdlkyZ3lpNVJjaUxScnhjQWh0VHdIYlVuTC95bmZrSEdyRW1yY0hYMTh2SzhPREJPZnVzYTJxQk9mdVljVGpxTmFDUXZUbFpWTDNWYUxhYktTV1YyREp6T0x1dTJjUmFlbHN6cnJaMzNJQlE5ZngzeDFoS3hKaDdjNFFsdXdjZ24vTm9NcUVnZjNoRXJaak1WS0tpa21ycUNTejRTbUNVeE1zZGw0bC85Z0pUQ2twYk01TVk5STBFbnFVMEt3YlliY1RudjhiNGZtK2pmMnQzNkI3bHhCbU13Qmw3MzFBOGV0bk1XbFdWRTNEMTlPOXM5S2FPZ0tUWXloSVpEeEdaSDRPZGFXM0c5K05EaHlGRHlHRVNOcm16TVJpdHlPRXdOM2FRbnA1QmM1OWxTeDJYU2VqdEl6QXhCakJpVEZVZ09sekg3SjA3UXFxWVdBMm01TldFd2FqNzc5RDRJOUpHaTYyRXhnZEllcFpJTDI0QkUvblQ4UTMxbmVtbkloRVdQcmxCdjdmaHhHT05JUWpqZWl5RDIvL2JVeG1DOC8xREdEU05HNi85U3ExbjdUZ3Z0aEtmR01kQlZCMjN5Z2VjRkowc2hsYlRpN3hVQWpGYkNhcnVwYnM2aG9XdW45bTZ2UHpsTHh5bXFqUHgrVDVqOWw5Y0JLd0RVakE4VWdacmdOUFlIWGxvUHZYV0JzZlJWRVVYTFYxK0tjbThQYmRTb1pSNEIraE1HdXZjaUZsdndBQUFBQkpSVTVFcmtKZ2dnPT0iLAogICAgICAgICAgICBibGFuazogdHJ1ZSwKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3QubmV3c1s2XSA9IHsKICAgICAgICAgICAgbmFtZTogIkNOTiIsCiAgICAgICAgICAgIHVybDogImh0dHBzOi8vZWRpdGlvbi5jbm4uY29tL3NlYXJjaC8/cT0lcyIsCiAgICAgICAgICAgIGZhdmljb246ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUYvRWxFUVZSNG5JMlhYV3hVUlJUSGYzUHYzVzJsb0MyZmxnZ0ZFVDhLU1JVUm8yaDhNRkZqK0Fva29BWWZmSUlISHd3RVNSUmZ4QWN4a1ZvU1RNUW5Rc0FZSmFBUG9wYlUycXFoQ0FKYVRXMXBhd1dqdE5xeTYxSjdkL2ZlNDhQZTJUMTdXZEJKSm1mdXpOd3o1L3pQbVpuL21QZEJET0FBYmlROTlXMGlTZFEycWkxSzZocEdNb2pKZkRSbXh4M0Fzd3IxQXJwYW8yeTE4K0xGTGt5MGtPNjNZL2IvVVBWN3R0T3BVRjNLa1hDVWpDK3VGVmZxTTZwUE8rSnA1WW1vbmFBOEZGYkdEZEJLb1J6eWtCTGtKdXF6QnFHK1BhdlFLdGRlNjNZY0NWdDBEdWppeER6WHh0cDFRb3VBVlc0OVR5cEVOREllNWFHd3hTcTJubHZsSm9hQU5zVDJlOWVMZXlVRUtpV2pLT1h4QmExUlVBNS9jUmZveGR6SXk0UkNSQ09qY3lGdUFCUmlicmRiUU9WOE1Xb3MwQWhVMm5MYU1HdkE5VUpndmRSb1dJOWRoWWFqL3Z2ZkNOZ3hiWEE4QkVITU93dXo5aHdsaFdnWDJLcTlEMXlYc1FjZTRKSUliazBOOVBkemYzOC9mODZhUlY5VEU5UE9uMmZ4d0VDWjE3MVBQTUd3TWR6ZDJvcWJ6eE1BZVdQb2Urd3h2RC8rWUx5K0h1ZXJyNWlaeVpRT3JqYVFUcEJ2UUU2RGZPdDU4cy9ZbUlpSURIMzl0Wng5OTEzcE9YQkFQbHV4UW41NjV4MFJFYm5ZMFNFaUlpY2VmVlFtUURJZzMyN2ZMbjRtSTBQdDdTSWk4c1g2OVhJQnBNZnpSRVRrKzVZV0VSRTVzSGl4ZElLMGc3U0NPUHBzRHgySDdQUFBVMTFiUzgvaHcvejI4Y2VrTGw0ay9kZGY1RVpHbUxsOE9VRTJ5Kzl2djgzZ2tTTXNiR25oOTlwYWZHT1l0SFFwUTRjT2NYSGZQZ0R1M2IyN1BHRk5LV3YwbW82TzZZeTJOaDVzYnFaejJ6Ym1QLzQ0VFMrOHdQVFpzMGtQRG1KOG42b2JidUR2NFdFYTMzd1Q0N3BNWGJTSW0vdjd1VW1rWU5pWk05eXplemVudG02bHVxNk8zanZ2cENvSTBDVWViazhQTkR6eUNKY3ZYR0R4NXMxVVRaNU01eTIzc0NDVm90NG1ZakpKWUF6NThYSG1yVnJGTDBlUE1tL05Ha2FNSVp0S1lZQmNPbzFUVTBQdndZTTB2UDQ2b3hzMk1CZXVNc0tXNHFtYVR5WUIrR0gvZnVvV0xPRDR1blVzVEtXS084QUE2WFM2a0wxQmdJZ3dQalRFOXp0M1lrNmVaTzVERHhVU01neFo4dXFyT0s3TC9OV3J1VzF3RUJFcEM0RXVwV1BkS1RUSFIwY0JxQjRadVdxeU1RYU1RWUlBSThLQ2pjOFNYcnJFOUtWTG1kSFlTR1FCaENHM3JsM0w0TEZQbUZ4ZlQ1akxGZnF2WjREait3QTBMRnNHUU4yV0xWZVRqTWh6ei9XNGZQNDhFMk9qTkxXMDBMdHZINGhBRU9DNkx1M3JOekRjM2MzWTJYT2NiVzZHaVFsUXVhQVBMcWQ0am90QWtHZjJzdnNZNitsaDBabzE5RTJieHBWRWdwempFQmlEbDB4aVJEQUk3cVJKOUx6MkdzWjF5WncrelZoM2Q4SExJRUMrYk9mSGwxNm04Ym5ueVBUMjRpWVNTR1NBU1BtOTZWbUtGQUlmTmk1aTNabXpuSG5yTFg3NmRZajd6NTJqYXVhc0Vtc1l2OEx3d0FBbURKbFVWOGM5Ky9mVDJkZkhnMGMvb252blRnZ0Y4WDN5TlRVczZleWdlc29VbHIreGkrNkRCMGxXVnhjTkNDbWRtcDVtTVBON2V6bjJ6Tk04ZWVnOWZ2N3dBNzdiOVFaVk4wN0I5eWN3R0J6WEpaOUtzZXlWVjVCY25oQlllT0lFN3ZScHpIM3FLYnIzN0tHNnRoWmNseEE0MTl4TTA3WVhHZTdvQk1maGRnUmN0NXc3dElLMGdYU0FkSUdjQXZtMHZsNk9iOW9ra3NtSVhMa2lrczBWYWk0djR2c3kyblZDMmhzYUpBMlNCbWw3K0dISkRRK0wrRm1SckMrRElCZEFCa0NPM25XWGlPK0wrRm5wM0xGRFdvMlJkcERqSUorQm1NOUJQQXBiTFVuaFlFZ1dBR2Rnemh5cTZtZVRxSzRxM3BaZUlrR2lxNHVGbVV6eGlnMkFuamx6eUs1Y2ladzZ4UjBuVHhJQXVXaHNjT05HbURvVnMzY3ZVNElBUCtyUEErWVlpTDBKcXlneEltdUlaa2JYNHdOeCtxME55RjVERm5OQTB5Y2lhUzIwWEVBelduMGRhejRZcUg5MU80eFZ2YjI5UUNuSVVUcjE0dlRwdnppaGRVUXZtbFBTT21Tcm5lUFpoVFJoMEJESG1mQi9rVkliQXMwSHRkU0dDckZ6NEZyS0FpclRjazIxdFdKYjgwb0dGU1RXQUUyVnRlSktzWTRiQU9VaGlMOEo0em1oNXduZzVXTktiY0k1bEFpa1JTRE9CVzFibzZlaHpsZVFvZm9Xb2wwUWh6ME9MY3FZYTcyTTdKeDRLQ3FGUnI4aGk0UWtmdk01c1luNjBSRi9uTVoxeEovbGNlaTE4ZjhDWHp3dGZuQUppVllBQUFBQVNVVk9SSzVDWUlJPSIsCiAgICAgICAgICAgIGJsYW5rOiB0cnVlLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5uZXdzWzddID0gewogICAgICAgICAgICBuYW1lOiAiQkJDIiwKICAgICAgICAgICAgdXJsOiAiaHR0cHM6Ly93d3cuYmJjLmNvLnVrL3NlYXJjaD9xPSVzIiwKICAgICAgICAgICAgZmF2aWNvbjoiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBQXEwbEVRVlI0bk8yVVN3ckRNQXdGbjB2dlpSMU52dG56eWRSTjA2aU5mNEZBb0dnMk5tSVV5NG9TSUFpQ0lMaVo1UGEyNkYvcVBYNGpKRUVTcWpyTVhQVUFRRlc3L3FFRFpvWlNDa1FFQUQ2cjgwOTVKT0ZYRWZGdWFoYVEzbUcvYnhVdzgveWhIZEt6RmQwU2E2Mjl4Q1V2NTR4U3l2QVpoeGtBOWpadDc2M0h6SnRkb0Z2QVZaQ0VpSHdOM21ob0RZQjVTTm9XeC81Wm5mSlUxVWoyM1B2L0F3dE9FQVJCOE9lOEFFWDhuV1dhUnZZN0FBQUFBRWxGVGtTdVFtQ0MiLAogICAgICAgICAgICBibGFuazogdHJ1ZSwKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3QubmV3c1s4XSA9IHsKICAgICAgICAgICAgbmFtZTogIkVjb25vbWlzIiwKICAgICAgICAgICAgdXJsOiAiaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zZWFyY2g/cT1zaXRlOnd3dy5lY29ub21pc3QuY29tJTIwJXMiLAogICAgICAgICAgICBmYXZpY29uOiJkYXRhOmltYWdlL3gtaWNvbjtiYXNlNjQsQUFBQkFBRUFFQkFBQUFBQUlBQm9CQUFBRmdBQUFDZ0FBQUFRQUFBQUlBQUFBQUVBSUFBQUFBQUFRQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9DeExqL3dzUzQvOExFdVAvQ3hMai93c1M0LzhMRXVQL0N4TGovd3NTNC84TEV1UC9BQUQvL3dBQS8vOEFBUC8vQUFELy93QUEvLzhBQVAvL0FBRC8vd0FBLy84QUFQLy9BQUQvL3dBQS8vOEFBUC8vQUFELy93QUEvLzhBQVAvL0FBRC8vdz09IiwKICAgICAgICAgICAgYmxhbms6IHRydWUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0Lm5ld3NbOV0gPSB7CiAgICAgICAgICAgIG5hbWU6ICLku4rml6XlpLTmnaEiLAogICAgICAgICAgICB1cmw6ICJodHRwczovL3d3dy50b3V0aWFvLmNvbS9zZWFyY2gvP2tleXdvcmQ9JXMiLAogICAgICAgICAgICBmYXZpY29uOiJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVlBQUFCemVucjBBQUFGTjBsRVFWUjRuTVdYVFloVFZ4VEhmKy9sSlRISnpDVFJERTYxamlMRmhXQkJoSmJTZGlFb1ZIQlRxRm9GWFZnb2lOQk51OUdOOW1OVExiU0YwbHBLQzFKY1ZLMGlMa1FvYlZFS2doV3NYNmpnZ0ZPMU15Vk96RXNtTXk4bTc5L0ZtWmpKSkZIN2ZlQnczLzJmYzg4NTc1NXp2MkNLSkExSytrelNUVWwxL2ZOVWwvU3JwTThsTFdJNlNWb2xxZmd2T08xR1JVbXJBQnhKZzhCRm9BL0E5MzNpOFRoaEdCS0dJWTdqNExvdWp1TUE0SGtlbFVxRnljbEpPbEZmWHgrVGs1TlVxOVUyV1NxVklwbE1Ocm8rc013RGRqU2NBN2l1U3hBRVJDSVJ3akRFZFYxcXRScXU2eUlKMTNXSnhXSzRydHN4Z0Vna1Fqd2V4L084TmxrMEdtMkpGZGpoQVd1bm82VlNpVnF0QnZEZ3I2ZlNoT000NUhJNUtwVUtsVXFsWXdDNVhJNXl1ZHh4aHRMcDlNd2dYdktBZWRPUmFyVktOcHVsVnF0UktCUWVCSkxOWmhrYkcwTVNxVlNLZUR6ZU1ZQm9ORXBQVHcrSlJLSk5Gb3ZGUUlKcUZZcEZ1SGZ2U1E5b204dFNxVVFZaHNSaU1ZSWdJSlBKa01sa0tJK1BReEJRR1IxbFltUUVmQjk4SDlmM2NVc2wzRktKbUVROW42ZGVLRHpBR2h3cGwyMU1jM1k4UjRjUGkyS1JCdnUzYjBPeGlGc3VrNnBXcWVielJNZkhjWDBmRllzUUJEZ3pJLzRiNUFqMEQ5cnJUSWtFREF6QThERFU2eTJpOWxMdFJwNEgvZjJRVE1LTkc2MnlsU3ZoaXkvZzJESEw4Uk5QR0E4TVdKdE9nK1BBbkRrd050WTZWamFrbFo5L1hscTNUbHE1c29tOTlaWnRJVC85MUtyYjN5L2R2bTJ5VWttNmVsWDY3anRwLzM3cG80K2t1M2ROTmpRa0pSSnR2am9Ic0gyN0RRb0M2WVVYRE51NTA3RHZ2Mi9WZmVNTjZhdXZwTjI3cFlVTHBXalU4R2Vla2E1ZHN6SDc5MHQ5ZmUxK3VnWUEwcjU5MHZYcjBwRWpVaXdtdmZ1dUdUdHhvbFhQY2FRTkc2VExsMDArT2lwOTg0MVVyZHJmcjEvZjJmNURBMGdrcEFVTHBIUzZpZTNaWXc2T0hldHNMQktSRGh4bzNmRi8vOTNTc0dKRjF3RGE5MVBQZzIrL3RZbzlmZG9LQ0dEV0xHdURvTDFBWDN3UnpweUJUWnZneWhYWXNnWGVmaHRHUm1EdFd2amtFOWl6QndZSDI5MjFJYlVhckY4UHAwN0IwMDliZFcvWUFJMmRiK1loczJ5WjhkNjlNRHBxcStTZGQyQm9DRFp2aGx5dXlVdVgybzg5Y2hXQUZWTlBqNlZpK1hMTHZTU2RPU1B0Mm1VcGNSenB2ZmRNZHZhc1ZmcjRlUGREZVBYcU5qK3RNOURUQXovKzJJdzRtYlQxTzUyZWZkYjR3QUV6OGRSVHR0RU1EOFA1OHpCL1BxeFpBeGN1d0pkZnduUFAyZmE3Y3lmY3ZkdWV2cGFJWnMrV0xsMlNmdmhCT25SSSt2UlQ2ZWpSNWg4RWdiVnZ2aW1sVXMxeDc3OHZGUXJTcTY5S3I3MW1PaWRQbXM3Tm05YmZ1dlZQTGtPUUJnYWs0V0V6OFBYWDByWnQ5djNiYjFJdVp6cno1a2tURTlLZE81YTJEejR3bmIxN1RmN3l5OWJQNTIzVGVtZ0E4K2RMNTg1WkxzZkdwRnJOQnA4OUs4MmFKYm11OVBQUGhoMCtiR00rL05ENnUzZExtWXgwNnBSMC9MZzBkMjdUN3NhTjBpdXZXRDNOQ0tEMU1GcThHQTRlaEh2M2pBc0Zhei8rR0c3ZE1wM0JRVmkweVBKNjhTSmtNakF4QVYwdUtJK2kvK1kwZkFnOS9tbjR1T1E0aElrRVlUS0pHdTNVZHpTZHh1dnJnMVRLVmxneUdYb3NXV0xBZEU0bTI3RnBlQW5NU1NLQmtrbHJwNXhsNXM2bE1qbEowT0ZPMk52Ymk1ZEtUWWRDajJ2WFdwUjgzKzk0cFg3a2p3TVJ3SEZkSXE3YjhWYmM2U2J0QVNIVDdvWFJhTFRybGZ0eHlIWGRyallpa2NoTUtQU0FPOENURGFSY0xqTXhNZkdYQStqdjcrOXFJNXZOMnMyNFNTT09wTStCMXh2SS9mdjNDY1B3THdjUWpVYXAxK3NkYlhpZU4zTVc5am15aCtJdlRMMk84dm44dnpZRG1VeUczdDdlUnRjSGxnSC83K1AwQVVsYUpIczYvNnIvOEhuK0Iwdzd6WFJDK1pmVEFBQUFBRWxGVGtTdVFtQ0MiLAogICAgICAgICAgICBibGFuazogdHJ1ZSwKICAgICAgICB9OwoKICAgICAgICAvLyDoh6rnlKgg6K+l5YiX6KGo6buY6K6k6ZqQ6JePLAogICAgICAgIGVuZ2luZUxpc3QubWluZSA9IFtdOwoKICAgICAgICBlbmdpbmVMaXN0Lm1pbmVbMF0gPSB7CiAgICAgICAgICAgIG5hbWU6ICdNRE4nLAogICAgICAgICAgICB1cmw6ICdodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy96aC1DTi9zZWFyY2g/cT0lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVFBQUFEWmM3Si9BQUFCaTBsRVFWUjRuSjJWc1U0Q1FSUkZ6eTY2R0N0THJXeXNqTWJFeWkrd05GSEJtR0RwSDFqWVdKdEFxNVd4cG9GRW9yWHhCNnhzMUNCQkk0V0pWaHBOb1BCYXlNQXV1ek93M0Zjd3ZNZTVlVE96eTBPWUlHQ0hNazNheUJKZjNGTW1UeENpZW90TjZsWndNT3BzUlF6SVVCd1pObEVrMHpkSWp3dFI3QnFRR3dzWElpY2c0SFZzZ3hZQkZHemxHUzFwZXBqRkhsU1NDaVVaL2VoUVM5clZlckpCMWVPWmVVS2FwSU5OWGp6MTRqTWJ6ZGh4V0ltbjVvaTJkQ2EzRnVPYkNIODVIb0pMMG8zbUlnWWVNdDBvM3FCVmJhWjY1OUxsZnBPT3lDSHphNS9ld3NQaktKWEp2MEw3T1JqaERJd1NEbkdpKy9reEF2NlFmQXNJdlkrQXQ1U3hHU3hia0VzaHRLcWFucFMxUHdjbUdnTjR4ZkU2aFo0RG93WHFsaXRMa2g5UGxWSmU0MmU4cll2SUJyNGRHNkFOajBtRi9aQkJ3Mlh3N0hPWDFOWTVIbGZkOWIyci8xdWZtcTIyZ2NjMThPWXlxQTM5VTUzU21yM2FJb3NnN3pKd1J0NE1sdEpZZUVuMFI5dEphdncwTk5xRVlEdlZjTTMxdUg2V2dBSlZtblNzWUljbVZRcmg4ZjRIdWZwY1BxaDNTRmNBQUFBQVNVVk9SSzVDWUlJPScsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0Lm1pbmVbMV0gPSB7CiAgICAgICAgICAgIG5hbWU6ICdDYW4gSSBVc2UnLAogICAgICAgICAgICB1cmw6ICdodHRwOi8vY2FuaXVzZS5jb20vI3NlYXJjaD0lcycsCiAgICAgICAgICAgIGJsYW5rOnRydWUsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQU1BQUFBb0xROVRBQUFEQUZCTVZFWFJhMWhJdlZVQnJpYUVyRzcvL3Z6UXg3ZTExNm5xNE0yRHk0Rm1Za3R3eDNUdDQ4L3k2TlFYc1RIKzd1SzJmR0Jod21ob3hXN1dnM0hFTXhlOEVBRDc4TnFuMHBsUnZsdVowWkxLUWl6TnM2cXVwWlowelgvOS8rMzY2OXZNNWNVeHQwUWxzenBRcVY2SGhvUFAzTDFZd1dLWW9vRVF1akI5eW54V1VUZ2x5MFRwMzh5aGxJaEFrRUFsZFNSZE9DNzA2dGJ3NWRMLzhlekluWEQxNjlpSzFKTzd1Nm4rOU9EQUpRU1kySitXcmMrejRiTGx1S3Bua2NXYnlZei8rK0NNelljQXFRejI1ZGQ5MFluOTAvbGwwMjBxd0VQazI4ajUvT2podWVFc3RrRGZvbzdrMk5QKzY4bi81K0NtU2ozaTJNWDg1ZEk2dWt6eCt1ZmhxcDcrOC9yMzllcjI5dVA3N05VMGtqZ3Z2RVE0TEJjOG5FRk96VnFRdlkwZXZ6dk4rZi9tK2RydDh1SHB4Ym5iNXM3czdkcHdvbWZiMGNBM3AwVGk3dGZCNDczbjNiemM3ZERlM3N6ci8vOVNaSDBBdmlqMzd0bmcxc3N0dFQ3ZGs0WGY0dDZVNFpPbTNLaDgxbnRhZWxydjZPcy9XQzZJM0lrK2lEdnV6ci96Mk02QWdJQ0JnWUdDZ29LRGc0T0VoSVNGaFlXR2hvYUhoNGVJaUlpSmlZbUtpb3FMaTR1TWpJeU5qWTJPam82UGo0K1FrSkNSa1pHU2twS1RrNU9VbEpTVmxaV1dscGFYbDVlWW1KaVptWm1hbXBxYm01dWNuSnlkbloyZW5wNmZuNStnb0tDaG9hR2lvcUtqbzZPa3BLU2xwYVdtcHFhbnA2ZW9xS2lwcWFtcXFxcXJxNnVzckt5dHJhMnVycTZ2cjYrd3NMQ3hzYkd5c3JLenM3TzB0TFMxdGJXMnRyYTN0N2U0dUxpNXVibTZ1cnE3dTd1OHZMeTl2YjIrdnI2L3Y3L0F3TURCd2NIQ3dzTER3OFBFeE1URnhjWEd4c2JIeDhmSXlNakp5Y25LeXNyTHk4dk16TXpOemMzT3pzN1B6OC9RME5EUjBkSFMwdExUMDlQVTFOVFYxZFhXMXRiWDE5ZlkyTmpaMmRuYTJ0cmIyOXZjM056ZDNkM2UzdDdmMzkvZzRPRGg0ZUhpNHVMajQrUGs1T1RsNWVYbTV1Ym41K2ZvNk9qcDZlbnE2dXJyNit2czdPenQ3ZTN1N3U3djcrL3c4UER4OGZIeTh2THo4L1AwOVBUMTlmWDI5dmIzOS9mNCtQajUrZm42K3ZyNysvdjgvUHo5L2YzKy92Ny8vLy9YbnpzTkFBQUFta2xFUVZSNG5GM0tRUXVDTUFERjhVMkVRVDFoa2xKQ1FTSWhiSWRDQ3RlcFJvZGdweEIyNmVLeGorQ2hMOTltaE9tNy9PSEhJOEFkRCtBRmVaelhSWEVoVExLS1N1WnlZRDQ5eEZNNFQrRTBocHR0cHJBZVEyeDVZQVpZSkVzYjZLZ0hId2VOM2Y2RFNuTC9pTFRhL0I1bFdPcTIxU3BNZFp1bTVDbjRuZ3VUaSt5ZENXTUVBVlpWUi9tT0FxQWQ4QVdnQno4SDEycUdZUjlYWGg4RTJXc3hnUUFBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0Lm1pbmVbMl0gPSB7CiAgICAgICAgICAgIG5hbWU6ICdHaXRIdWInLAogICAgICAgICAgICB1cmw6ICdodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP3V0Zjg94pyTJnE9JXMnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBRExFbEVRVlI0bk0xWHoyc1RRUlQrZHBOU2NxaEpXN1pKOW14NzA2UkowL1NIYlJIUi84Q3o5T1JCQkJFVUVmd2pCSlZlUEhoUUZQVWlJaTA5U05xa1NidEpVNzBwNmRIK0lPQ2hRbXBOc3M5RGRxZXp1N05KbWdUMExRUFpOL08rNzVzM2J6STd3RDgyNlF4alBVUlVhd3RVa3RyR2JXZmdnSzdyUjNibnhXamM4djUxcCtBSWxHVlpCa0FkQzlCMW5RWGJDWnVaWFl3c3k2NDhiaDF5dlY2dkE4RDlCdyt4dkxMU05ybEZTUEZVaU1makVYS0puSjVhclZZRGdNajRSRWZFZHZ0U3pBTUF2RjZ2ZzgvaHFGV3JCQUNSV0tJbjVFekV0dFlRMGRkbjRiUzhWRTN5SHMzY0lhS1lSNlZTT2ZENy9XSFRKM1A5WVNKeWtDdUtncDF0RFR2R0ROb3h0L0ZFQkovUEYrSjlMQU1uSnljRUFGRmI2czlDYkRjN0ZvL1gzOTh2QVlEWDhBK0FDSkg0cEJPRm1tN2pwaWFNdE9ISkFQRDcrUGlJaUJxZHRoYUpKVUJFSGJWbWVLcXFqakVCTE1oUXpiZGlmck5qQWNYOHBoQ1RpTEJiS24xalMwQkVHSjlJT3JKbGtuZGxnbmdlVXdiUTExQXN5bGhuTStmYnRwWnp4VFVGK0JycEZ6dzlFQ0RDWHJoeWpRbGdTeUFxMmE3VER5QzF0dTdBSHZUN0xRS08rWlQwV3NDZHUvY2N2dmR2WDF1V29FcTZMbHlDOGNRVVNOZTdhNkxINkRNRmdJaFF5R1VFKzZXN1FveE56alRGdEFod0s4UlljcVlqOHB1M2JvdG5ieFIzWUdqb1BCTXdPRHg4amhXaTBmTFpOUHNkVDg0aW5weHRpL2p4azJlSUoyZWhhUVhoN1BQWnREbjdYWUE3akg2V3l3UUE4YWxMckZnS3VUU201eTdqVDdWcUthSkNMaTBzT0Q3V3pjellJVVdSV0FZTWgwb0FWcGMvV2dBMzFqODdRSVIvcnkycGdYd3VEZUxJZ2RQVEVBRDJpUWdCYm84Q2pmclFzdXRXQVM3YnM5bTJmZmZtSllnSU54WVhyL04reHlkWitmQ1FBQ0F4UGNkOGRnRnV4c2ZZemNSUWdrSDNUekxEUE9XRGd4b0FUTXpNT3pwZnZYaU9zZEZSSVlsby9PcW5EeGdNQkJya29aQ0RUN1k3QU5TVlVNaERSTkF5S1dpWmxPVWsrYkczNzdvRDdLZU9sa214SlJXUnV3a0FBSDBrSEpiTTR0cmFXTVBXeGhvQVlHRitybVVSbXVNSndOT2xwVWNqNGZDWkx5YThEUnp1N1RtdVp1MVlVRlZiWHMzY01zRGJyNkNxU2tGVjlYNHZsYkp1c3pmYmhXajBxakZlYWtYK1g5aGZLd05wd0xMZHlMUUFBQUFBU1VWT1JLNUNZSUk9JywKICAgICAgICAgICAgYmxhbms6dHJ1ZSwKICAgICAgICB9OwogICAgICAgIGVuZ2luZUxpc3QubWluZVszXSA9IHsKICAgICAgICAgICAgbmFtZTogJ3czYycsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly93d3cucnVub29iLmNvbS8/cz0lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFDSGtsRVFWUjRuSVdUWDBqVFVSVEhQK2Z1NTl4VUNKTEdDZ3AwSUlQU0l2TFBnOUpUdlpxK1JCajVXSkd5U1dWUEtTSDBaQ1NXRC9aaUZBUVZxUVVWQnVsYmFRVDJJa1ZFVWhJU1ByVHB0RTIzZTNwWW0yNnQrc0xsSHJqbmZMLzNmTSs5UWg0R3A1dWJWT1NtcWxTTElBQ3FHa1VZOGJwODNhY1AzZHJZbWkrWllHU3EzUlAxUnVkRnhKOVBtZ09WVTZHRzBiczVCQ05UN1o3bGt1VVZ3UGxuY1phRWk2R0dzZjRzd2NEMHNVVzE0cDk1NFM2Y3J5QW9Lb0ovajZWeWJ4TEVIQXpWUFpwMUJsNjNIQkhCLy8yYlllNk4yZExVSmhxRDY4eEtnQU5mbHBqN0dDZXdMNG0xcVFuQUp3UFRMWjlFQ0pTN0syamEzZ0ZvZ1J1bmVSWDRtWW93c2RTSElLUmM3SEpFQ0FBWWNlRXUyclJBUkVDVjZPb2EyOHBLVVUwVHAweFJOc2VWcE5Ya3F4bGplRHo1aWcvekMwUmlxeXdzTG5HaGY1allXcnlRTzAwbXYvajQrVDZxcXlvSlZ1em0zdE5KYXFvcXVONTlsczZyTjNqLytXdHV1YkRncUpJUW9SakFXc3Y5YTVlWm1ubUhxaVd5SEFPZ2QrZ093NzFkdUlzYzFsS1JUVUV4RTBhRTUxdFpyYlVjcnExaDU0NXl6cDFvSm1VdFBXZmFjdnpKb0xOMjlLV3pYaHc3NlU2VXhSSjJCU091N0dHWnR5UW5PVE5kVmZ0NzU3WUltbjVJTXkxWEJIb0tqZkFQMjlKYlBGdy83Z1V3QU9INnNWNUZoOUk2LzF2RUV4dldsL1VoRTRUcnh6dlVjaFJsOWEvcXlvTWZkZnRMTHpVK1djbHZMUWVEYjF1RE5xbHRpQVpSRWdJUFBZN3ZXZjVYQnZnRk1TL0p3L3lVUHF3QUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5taW5lWzRdID0gewogICAgICAgICAgICBuYW1lOiAnR3JlYXN5Rm9yaycsCiAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cz9xPSVzJnV0Zjg94pyTJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFCbUpMUjBRQS93RC9BUCtndmFlVEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBQjNSSlRVVUgzZ2dFQkNRSE0zZlhzQUFBQVZkSlJFRlVPTXVka3oycXdrQVVoYy9nb0JhR0pCZ1V0QkNaeWowSUxrcHdBVzdCd3M0eU8zQUhMaUN0RUZEOEtWUkVrb2lGeFp6WDVBMktHZk40RjA0ek1OK2NlKzVjNExNVWdEbUFOWUJucm5WK3BsQlNpK0Z3eUhxOVRnQTJMUXB2Q2lFaUFCd01CdHp2OTVSU2ZvTkVIeThEWUJ6SHJOVnFWRXI5QldLY3FORm94RjZ2eDNhN3pjMW1ZeUM3M2E0TW9nQmc3dnMreitjek81ME9XNjBXdDlzdEs1VUtwOU1wajhjanE5V3FEVEJIbmpBZHh6R1FaclBKdytIQTMxb3VsemJBV2dMb0EwQ1daVkJLSVk1anpHWXpkTHRkRTlEbGNyRk5yWTk4em9icU9BNlRKS0hXMmpnNG5VNXNOQnBGRHA2bWhWZTVyc3ZWYXNVd0RIbTlYcW0xNXUxMm8rLzdIeTBnRDhLYXRPZDV2Ti92MUZvelRWTjZua2NoeEZ1STZoc0FBSU1nNE9QeE1KQ1hkdFRiUjdKSkNNRWdDSmhsR1VseVBCNFhmdW1veklucnVweE1KcFJTUnRabEtvTllsK20vNi93RHVXQWp0UGZzUXV3QUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgICAgICBibGFuazp0cnVlLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5taW5lWzVdID0gewogICAgICAgICAgICBuYW1lOiAn5Lq655SfMDXnlLXlvbEnLAogICAgICAgICAgICB1cmw6ICdodHRwOi8vd3d3LnJzMDUuY29tL3NlYXJjaC5waHA/cz0lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3gtaWNvbjtiYXNlNjQsQUFBQkFBRUFFQkFBQUFBQUlBQ0JBZ0FBRmdBQUFJbFFUa2NOQ2hvS0FBQUFEVWxJUkZJQUFBQVFBQUFBRUFnR0FBQUFIL1AvWVFBQUFraEpSRUZVZUp5dGsxOUlVMkVZeHA5ejVzNDBaelNSa1dPUUpJb2cwZHptSDJhRUNGRUloaVNDb04yb0VDSllZVUkzUWpxbFFkcWRGNmJZUmN3TFVRaFJ4QkJrWGdRcUthS1JqV0ZZTW1ubXlNTjJGTXp2NlNJOUZuWFJ2d2UrbTRmMysvRytMODhyQ1NHSWYxQUNBRWlTOU5jQStWZm1kamlNVDF0YnYwY1FRcEFraFJEOHNMN09PeFVWZEFCMEp5WHgzZG9hanhWYVdXRzF3OEVhbDRzMUxoZHIzVzdPVFU5VEI3eWNtbUtKMVVvbndGS3JsYmZMeStsdGJDUkp4bFdWRlRrNXpBUG9QSHFYTFJaR0l4RW1BTUJHTUlqMmhnYmc4QkNkZmo4dWVqelkwelQwZDNWaFg5Tnd0Nm9LcWVucHVOZlRBMG1XUVFEbnNyTnhKaTBOZUxPNHlDczJHd3RNSnI0S0JQU1dudzhPMHR2VXhJVkFnQmNNQm83MjlmRnhheXVmK255TXFhcGVoL2I2ZWpvbGlmMmRuYnFwUnFNc3NkazQ3dmR6Wm15TVRsbldXODhEMkZKWmVRSzRucG5Ka3RSVVJpTVIzZXozK1ZoZ052TjlLTVRQT3p0ODJOek1GOFBEL0xpNXlkRHFLbXVLaW5pOE8rUWJqWHpXM2ExL25oMGZaNTdSeUo2V0ZyM29XRUlJOXJhMXNiYXc4QVJ3S1NXRmI1ZVcrT1hnZ0tNREF5dzJtM25UNCtHZXBuRjJZb0pQT2pvWVUxVytucC9uL2VwcXVvMUc5bm05T2xTNlZWcktwT1JrYUxFWUZtWm1jRFlqQTcyVGsxQVNFM0VqTnhmbnM3S2d4ZVBZRElVZ0dRd29MaXZEbzVFUktJcnlMVWpCNVdWZXM5dnBrbVUrcUt2amRqaE1rdHdJQnBtdktQcnlydHJ0bkJ3YTRyNm0vVENXZERRTDlqVU5wOHptN3hPS2xiazV4SGQzY2RwaVFiYkRBY1ZrK2luSmtoQ0MvLzJZL2tSZkFTb1JydGIydjJrYkFBQUFBRWxGVGtTdVFtQ0MnLAogICAgICAgICAgICBibGFuazp0cnVlLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5taW5lWzZdID0gewogICAgICAgICAgICBuYW1lOiAn5bCE5omL572RKOS8qiknLAogICAgICAgICAgICB1cmw6ICdodHRwOi8vYXNzcnQubmV0L3N1Yi8/c2VhcmNod29yZD0lcycsCiAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFEZkVsRVFWUjRuRjJUUVV4VGR4ekh2Ny8vZTMxOXBIM1FFaTNNQVlNcHFXWmoxYzFsRVNJejBXd0xYbVpsN0NBWGpDWXp1eUNKSlBWZ1BBeTh6WmdsRXVSQTVzTEppSWxtNEV4bVF0RGlsbVZnUXJEQ3NxMld1UlJLb1gyMHRPKzkvL3Z0Z2xuaTkvejVmazdmTHpFelhzK1Q4K2YzclR4NlZJdFNTVjJmbjQvcVZWVmpYMjVzekFDUTN4THQ3Mk9lZThYUzY0TGZZckhlOWJtNURvL1A1MG1Panh2RUhKWkVTeDhNREt6djZPNW1aM2JXSHo5ejVzOHQwL3dPekRQcXErSlB4NDkvbkpxWStDSVlEa2NQajQ2K3dhNkw1TjI3WU51R1pENWdteVoyMWRjam5VeENXdFpIS0pVKzhlcjZWUUVBUDlUVXRJWjdlc2JiUjBhK2xxWlpMVXNsdTZhdHpZbGN2Q2dsNEJMZ0NFMnpYZGQxbG03ZWRNeGN6aUtnT2hDSmZLTUNRR0ZsSlpwZldxcCtMeFlybGRmWFBjOXUzSUMrY3lmOU96MHRCT0JLUUFVUkN5RWdWQlhCaGdiRlNxY2RhVmxDQUFBQis3TnpjeTY3cnZKV1p5ZnRPM2VPVnVOeHBCNCtaQW1RQkZpdHFDQUEzTkxmVDlHRkJUNHdPRWlPYmJ2cXRtQ2puTWtRaUxBMFBNeUtZVURWZGFIN2ZOVFUyY2wxSFIxVWUvUW91OHhrTkRaeWJuR1JWdU54OHZyOXFqcEZGQ0RBa1lVQzJadWJxTnE3bDZ4OG5rUHQ3ZmpzMENHRVdsc1pBSlZ6T1NLQW53ME4wZStYTHJubFRFYlVIank0SmpLVmxiVXVVT0V5TzdKVW9uSTJpMkFrUW02eGlGLzYrdkRqa1NOMGE4OGUvREU2Q2lKQ2VucWF6VXpHTlVJaHJqMTJiRWo4VlNqVTZJYXg2OTMrZmxmUk5LcHNicVpRYTZ2NDU4RUR5SElaZ1hDWXBHV0JwUVFBYUpXVkVJQWlORzNyL1N0WEJnUkwrWGJUaVJNK2YxT1QvV3R2TDNrTWc4dlpMRGQyZGVIVCsvZlJOanpNa1FzWGdPM0JxWWJCQkpBc0ZoMXpjZEZXNXhYbHhadVRreWt6a1pBZlhydjJUaUdWNHVXSkNUUjJkV0ZoYkl6VGp4OVRMcEZBSkJZRHRqVU1zRGNVeXEvT3pFQjg3emcvYjYydXJqV2ZQYnViaEhDbVRwOG1VaFRLSlJMczVQTWtQQjZzcGROZ0FNeE1pcWE1QkVBSkJtZG5MMStXS2dEWXdKMm5nNE9mRjFNcEtSMkhHNkpScGZqeUpmNitkODg5UERKQ3UwK2RvbUJMQzRpSU5iOWZBbEI5cWhvb0F4QUE4Qlh6TFc4Z2NNZW9xOU1WWGRkZTNMNnRGSkpKSlo5TWl1bWVIbEo5UGdRakVVakxFdVZzMXV2UmRldXBwbDNWQW9ILzM3ZzhPVmxsWmJQOWlldlhBOGw0M092WHRKRHJPSFY2TUxpRGRMMis4ZVJKMktZWjMxeGVUbm9EZ2FsQ2QvZHczZlBuNGorMllhK1lYWDFQQmdBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgICAgICBibGFuazp0cnVlLAogICAgICAgIH07CiAgICAgICAgZW5naW5lTGlzdC5taW5lWzddID0gewogICAgICAgICAgICBuYW1lOiAn5ri45oiPLTNkbScsCiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly9zby4zZG1nYW1lLmNvbS8/dHlwZT00JmtleXdvcmQ9JXMnLAogICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBQUFJQUFMQXdBQUZnQUFBSWxRVGtjTkNob0tBQUFBRFVsSVJGSUFBQUFRQUFBQUVBZ0dBQUFBSC9QL1lRQUFBdEpKUkVGVWVKeWRVMHRJVkdFVS92NTdyM2RtZEp6RzBhNlQ2VXlhTTZHWllrSmhCUlpFOUVKY0NFVnBWSXVJeUdoUmk2aE5CQzViQkJKUnF4Z2lvcG9XbFZab1Z2UWdVc3VhSVpQeU5hYnp1dWtkNXpyZTE5OUNNYU1rNklQRGdYUDR2dk54RGdkWUJLRVQvR0t0MzBEK1ZyeDhhbHU1SkNuNUpsNE1mZzl6d3BveXk3ajJKalY4cUxYcjN3TG5mVjRVQkIyYlN5cVh0N2dLTTB2dGRqTWtTVVUwbk96dTdRcWZiamozdEdOUmdSZ0ZIbDNZc25QTDdpSy9JSmg0RUlCUUFrb01FSU5DL0tGclQrOE43Tm1mNzd5ckh2YjlLWEM3cWR4YVZsZmU3L0V1Y1JKUVRNOW9ZQmlDa1lFRVhFV1ptSlkxUktPSytPUk9ZRlZaclREUjkxQXQ0bjd6bjJldmR6Z3R6Z2VkSTFCVVFKSTB5TEtLb3dlOGFPMklZR2hFUW9hVk9JckxseDFMRGJQaXB1Mk9Tdks1ZFM5dnp4NVhmSUVoVkd1bGZxK2sxNFZqTXpEVnVCQUt4VUFqRVJqVE1zQ3hZQ3pweUYyYUE5UHp5TGgxMzBwNzFNQjFMcWt6WFNTUmIxdWZsbjByTjgrMDFaeVlnZHVWaWNsMERZNmNKZEN5VjBGVE9CQWl3MktLdzExaVF6elA2c3p5Wm1Hc1c0eHdVSlJYeFpYT0k2bVVjc3E5Mmc0R0FBV0Z5VnlCWmVuckFNTE83NXRTQlVieUxYanBMUXdkQ0EySVBjekh6K0dXNGNHcGxLZGtsZ3dRVUw0WWJNWUdFTUtCQVFFRGdBRUZROUxBV2pkQ1QzT2p2MThLTWtaT0d4UHJTeHBpVkpia3BBNU5wMGlsVk1DeUJvUXVQQkVCUUVEbU1qV3ZmUlZJakZVTlZiZkpKRDRSNTN3bmR6bUZ3b3ltQW8vdElNOURxTnB4Qm9ReHpSRit3UUNnR3hTQlo4OGJLM2MyK1FDQXliSmxvZkhpdlhGTHc0NnpyOXZIYWdoTEJnMnF6azRDNXNNQW9Hb2FQcng4ZVRONHRmbkd2RGRLS1FjQXljUU03c2ZmNFgzekpWdDFoZTNLaWtKUHZVVndnYkFzZElOTy9mZ2FZRVk3L1diN2FzRzk5WGg3YUtFQUF3QzZybU0wSnFKdjhocDZINnMyOTdjWHRaTU9qeWhEbUtBWnJHeW1pcGxYaytralNmWkx6NmV2TWIvZkwvL3hXZitEbnhzMk0zeW8ycTZuQUFBQUFFbEZUa1N1UW1DQycsCiAgICAgICAgICAgIGJsYW5rOnRydWUsCiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0Lm1pbmVbOF0gPSB7CiAgICAgICAgICAgIG5hbWU6ICfmkJzni5fooajmg4UnLAogICAgICAgICAgICB1cmw6ICdodHRwczovL3BpYy5zb2dvdS5jb20vcGljL2Vtby9zZWFyY2hMaXN0LmpzcD9zdGF0cmVmPWhvbWVfZm9ybSZrZXl3b3JkPSVzJywKICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UveC1pY29uO2Jhc2U2NCxBQUFCQUFFQUVCQUFBQUFBSUFEaUFnQUFGZ0FBQUlsUVRrY05DaG9LQUFBQURVbElSRklBQUFBUUFBQUFFQWdHQUFBQUgvUC9ZUUFBQXFsSlJFRlVlSnh0azArSVZYVVV4ei9uL082Nzc3MnJqZEgxTlZwUm9lVm8xc1phdm5JMFMwdkZoYU9CcEM0Uy8wQXVDcUUwYU5HaTNJUzRrRWtFRitFaXlvVmh4SXlLTnN4WUd4RVJGRVZJNXcvV0tFL0dBZS9ZdkhmUGFkRWRrYUd6UEg4K2ZNL2hlNFJwa2RYVE92QVJ3aktndlVpUDRwd0RqaVlEamY3SCsrV3h3VmxBTjBvbjBBMmNCQWFMOGd2QVdtQVhSaCt3TXhsbzNIOEV5T3JwazhCWmxPc0lPNUsreHZoMFpRRFowclFONXpCR0I3QThHV2lNVFFGK1JHa2hiQ2JJQWxIWlJKQlhVVWtFSHJqN0VNWkZ6KzAwdWQvQk9JWVJrb0hHUnNucWFTZktNWVJYVUZrdFFiNm5wSkZFQ2tFZUFrYnVWVm9tM2pUejNML0MvQURPVll3UEZkZ0dmSmYwTmNaRlpRY2xqU1FPU0NYMFNGbWZrVmpuRU9zaUl0MU9wS2NreU14aXhXNWdteUowRmdlRFNQNlVTSkZZa1VwNFcyZkVCN1V0ZmtPZmlHOVdUdjUxcE5veitoNlJmbGFjNUJlRVRnVnFPTU1BQk4xRGtPTVMxS1NrSmFtR3pWSU9aeVhJcmNsTnozL3p6L3BuYTlXZVVTc0F3MEJOQVFjVW9QcnIzL2NxSjI1dmNQeDE0QkRPTUE2NHo4WDQzSE8vTnZGKysvSUNvSUFyTUlUUUFURHhUbTNyeEtyMjJlVWZoaStWanQ3ODJMTG1mSHZRWE9tVGR0MXpnOXlmb3VYN0M4QkNZRERDNlVYWUFKejMzRCtSd0tHSGErWWNKMml2alUvZUVKRXhZTVJiMXVGTmc5eW5WdWpDT1NWWlBWMk0wSSt3QkdXZEJOMU5TZWRMSktDRlVjM3hsa1BUUnQyOEMvTVJuSXNZYjA0WjZXdVVGUWp2Sm4yTnNXeEZiYkVFV1lMSWMwQWI3dU9ZWDhFNVhUMXpkeUpibXU3SHNLUy9zUzhxNUh5Sk1RL2x0K3l0ZEV0eTV1NWw0TXIvMlJsQTRqRGtMZnZqMFM4VUtoVDRGR0V2d3UvQXp6ZzMvcHZnWmVBbEtZZHZ3OU9WTDd4cEg5ajl5YlhWM2pzWFpEbzlxNmMxWUNPd0RPSEZJbjBMT0lmeW1zNktVeW1IUGVXZlJnWUIvZ1VHRndZbXN1TytXQUFBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgICAgIGJsYW5rOnRydWUsCiAgICAgICAgfTsKCgogICAgICAgIC8vIOWvvOWFpeWIl+ihqAogICAgICAgIHZhciBlbmdpbmVMaXN0X3BsdXMgPSBbXTsKICAgICAgICBlbmdpbmVMaXN0X3BsdXNbMF0gPSB7CiAgICAgICAgICAgICJzdGF0dXMiOjMsCiAgICAgICAgICAgICJ2ZXJzaW9uIjoxLAogICAgICAgICAgICAibWVzc2FnZSI6IuW6lOeUqGFwcOS4i+i9vSznlLHlpZTot5HkuK3nmoTlpbbpharmlbTnkIYiLAogICAgICAgICAgICAibmFtZSI6IuW6lOeUqCIsCiAgICAgICAgICAgICJlbmdpbmVEZXRhaWxzIjpbJ+W6lOeUqCcsImFwcF94aW4iLHRydWVdLAogICAgICAgICAgICAiZW5naW5lTGlzdCI6WwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdBcHBTdG9yZScsCiAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9mbmQuaW8vIy91cy9zZWFyY2g/bWVkaWFUeXBlPWFsbCZ0ZXJtPSVzJywKICAgICAgICAgICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBRHRFbEVRVlI0bkwyWFRZdGNSUlNHbjFPM2VucDZtSms0VEJER0lGSHBqUXRkR3BpZ0lBcHEvQUdLQ0NLQnJOMkpmMEF3Q0M2RWlPTEtuWUlLS2hKY1NCUU1naWFLWDZEbVF3bkdSTk9yZ1V6NjQ1N2pvcXB1Vi9kMFQvZlZpUmNhN3IxVjFVK2Rlczk3YnBVYy8rSUJNOEFVREFEQkNQZEt1Tks5NFRBYlBxdmxiV1J0Z2ltb3hHY0ZReWdsY0ZKL2tRWStESktJY2hnYVFBRFovU2dBMVBJMjJRRzNNYmpLY0h3YUE0UUprS0pEWTZObUhVZmhUaHBnUnQ5NmxOckhSQUJCeEkvQXRZS0hsVkFMLzZGcHdqRkV2eE9lLzF5UXdRVEhBdGU2WjlqZk9zVGRhNXZjdHRKbXBibWZnb0svdHkveHlhVzNLRXZGeEViZ3BjVFZHWU1ySUFiZU1zMG53UXVhWE8yZDVKSGJUL0R3WFcvVDhxdWs2K2ZPV2Q0Lzl5b1h0cjVucWRnSEluUEFnMHhxaGhQd2s1YzhScTZPNWRZR3oyOWVweUZOU2lzQitPYks1N3orNHhNc1NKdEZ2OEt5WDBPWk4zSkJMZVlLa2lhUVN4RGdnM0xBNW9Hbk9kSStocHFDQ0RjR1c3eDQra202dlpMVnhqMzB0YVJmOWlab3ZsdmttUXNBcHhNaU4zVWNQdkFNUjlySE1Bd253azkvZmNsenB3NmlXa0JoREdLMmpjTkxrWWtKbDJ5YmVPbmV3MDdOYjFrNnlHUHRveGlHSUh6NjJ6dDhjT0VWMWhZT01iQmVXTEVKMmI2NzVxUHdGTFRQdGNlRXE5MlR2SEQ0Qm1xS2lIRHE5M2Y1K09JSnZHdFZHczRQdDZudzRBSUpFcVRsQWMvamQ3eUpvNEVnL05JNXczdm5Yd0p4TWNPbitieGU1QXFZT1VyQTVlVzEwLzJhaCs1OENqT2xXMTduK05uN1dDeFdkNFhYMFR5SHAvY3VyM0FiU3creVVMUW9uT2ZscjQ1eTYrS2owVjUxbG4xMjVQbTN3K2UxL2Q3MSt6R01YenZmY20zN01yN3dhSzJFMjEzekhLNlcyVkJONlpjOU5wYmJDTUpyUHp4THM3RTRGVDZQNXVOZlM4M2hNWG9UOEtHVG8yL2I3R3V1YzNucklyM0JBdmdTZExMUDU0bmN4aUszZkVVTVRBUTF3UTF0S0RqeGZIaitEWllhNnpYZzgydGV2WStKcTFaSklEaHAwTm4rays4Nm42R3FOU0tmbnUwNkNSNzNEdW01Y29IZ09YM2xJNFNDa3ZJLysxenpaU2VOSFlXVFYwSVY0WSt0Yy9paXVTZlpQcTU1Q2lJdnc3RVFVZm04M3ZlOG51Ymo4TkJYY1BWciszd1ZicHJtVmQ5OFQvaHZmVDY2U1oyZytiVElxMTJZNEtzWjc3SFBaOFBEczVzTjMwUE5Nemd4Q0RjOE5Od2NuMCtERCt0QWZtaW9FZms4UHA4RkIvRGxSUGplK0R5SE13YXZrakNkQ2Y4UHpjZmJGWVpic3B2aDgybndjQWxncVJUbjhMZ0RtZ1d2WVRYRzJrbUhXUkc4U0dNNEp3TW53eXJsNGdsWExCeXRYVXcyaVhramhOSXRrdjQ0OUNWT0l2azh2b3J2TEV4QURNSHhEKzgzRVB6UzEwMEtBQUFBQUVsRlRrU3VRbUNDJywKICAgICAgICAgICAgICAgICAgICBibGFuazp0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICcgUFDliqnmiYsnLAogICAgICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vd3d3LjI1cHAuY29tL2lvcy9zZWFyY2hfYXBwXzAvJXMnLAogICAgICAgICAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3gtaWNvbjtiYXNlNjQsQUFBQkFBRUFFQkFBQUFBQUlBQlRBZ0FBRmdBQUFJbFFUa2NOQ2hvS0FBQUFEVWxJUkZJQUFBQVFBQUFBRUFnR0FBQUFIL1AvWVFBQUFocEpSRUZVZUp5ZGs4MUxWR0VVeG4vdnZhTXo0NVNqbFpwZldCcFVreWowNmFJV0ZWR0JDRzBFTjIyQ0ZpMkNOdEhTZlpzeXlGV0wvQU5DZ2tEQ3lsV0VHemNLTFNLbjhxT2FHVWJIZE82OTczM1AyeUs2T2VtaWZPQnNYaDUrN3ptYzgrQjVYa1pyL2NJWUU0cUkvWmN5eGdSYTYvRWdDQTRUaHVGTHV3T0ppSVJoT0s1RVJDdWxZbXpTUWxIeit2MGFjNHNlQU1kYUUxdzRzcHUyK3FyTk5rUWtVQ0ppbFZMUjQ4UnNpZUhueTh3dWV2aWhCU0FlVTNTM0poa2UyTStWN3RySWE2MmxBdkR1NHpyWG4zd2lXd2lJeHhTdGRkVUFMSzRFK0tIbHdONXF4bTUwME5lWmlnQlI2OXBZUnFmeVpBc0I2YVRMM2N0TlhEdWVSZ0hQWmxhNVAvR05iQ0ZnZENyUGlZNGFxdHhmbnpxL0FVc3JtdW41RFN6UTM1Tm02RXc5RHlkelBKak1NWFM2bnY2ZU5BRFQ4eHNzcmVob2pLaURVdG53d3pNNENucmJFOHpuZlo2K0xRQXdlS3FPb3kwSkZMRHVHOVk4MlFxd0ZpeWdBQWRGYjN1U081Y2FjWlNpcXlITzR6ZDVCS2hOdXRUVnVGc0IvRmtFWWkyMUNaZmJGeHRZS0dwR1h1V1ltQ3VoZ0xPSGR0R2NqbTBEMkNUWFVXVHpBVGZIUGpPMzdGRmNONFJpeVRRbnVIVitINjZqdGdIWVNzalhrbWJtUzVuVnNpRlY3WER1WUlyaGdXWjYycElWdmdoUUZWTTRTbUVFWXE3aVpFY05qNGJhV0NocU1pMEoranBUN0VtNS9LM29sTXRhR0puTThlRzd6NzJyVFhRMXhyZWJya0lpRWxTRXlZaTFvWkgvQ2hPKzcyZkNNTnh4bkg4Q1Z4K3Z3d3lPOW5VQUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgICAgICAgICAgICAgIGJsYW5rOnRydWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0dvb2dsZSBQbGF5JywKICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS9zZWFyY2g/cT0lcycsCiAgICAgICAgICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUVnMGxFUVZSNG5NV1hYVXdjVlJUSC8zZDJJVmJsSTJGTGlvbEZVa3pJRk5GSUg1byttR3BjK3FZOEdHSjg4c0ZFVTIyRHBJR3FpQlNJcWNab3FwWTJ4RlEraEFMYnNxZ29wRVF4aGtRaGphVVdKeGhhZEUyaHNpekx4eTc3d2R5NXg0ZmRnUXZkNVV0SVQzSXljMmQzN3Y5My92ZmMyVmxHUkF6M01LenlZTi9ZVExKMThleEpZVFVXYlFrcHJiOWtGby9zTkFDVEhYaGdBQlhDMmx1VW1IUkZ0Vmd0UENseFYrMmVGRnZWUU5McjNwMENVT1JCaUpBVEN0blZjTEJBQzFzTXF4dis0eU1MRXlPWm51cmlWMUZualRmSnRnRUlCVllvUU5odlYzVi9nVVlXaGlEVGJlUGsrN2gxNXZidldiNFBudHRSQUNnQVdPU296OXBWWTlhdWtRV0FoY0dIY000L1lxWXpkYjZ5SjJmaG83eWRBV0FBTE1zUTNHdFhEWTlkRXdwQUNpQkFtS05nd1pqaHZXcnpWOWNlWERpVHZyMEFsdWdWODZnQU5HMVhhZXBaVGY2YVRvWjEydkMvTnNUZEl4bSttdElpT0JLM0IwQ1Jra25uazNZVjdwVVFBQkFHVC8xWCtFNTN6OThZemd4KytNTC9CNUJGVFJmTVpYSEhoZ0FBUDRXemJ5OTYyMU45Ny8yWUUvamt3TllCbEJncExRY203U3Ftbm9rSklVQ1lFNkhEdC9qVXIybHpweTQ4R2ZqOG9jMER5QTdFZzVrOG9zSWRHd0lBT0JtS0Y0R1g5eS84M0FuWG5uTGc2ZnMyRGlEdGdMakpBTGlQeEhVQ0FBcERvOE5OTTQ0RDBDZXI0QnJVY09maGx6WUdnS2lBbWJMOXE1Y2tqaE9Gd2RGaDU3UXpGeFNkUXdRZWdUNytGZTZrOU1PZGZXaDlBSGtIbU9PMW5KQWdDZ09qdzA2UE0zZXBBREkvSVVETUh3SzUrdUZKcXdPS2xyYnR5dWU3QllDSTNteUtFK0tIaUVJd2FNL2ZYOGVkVTg0OFdKWTFBV2t1QUNBT2tQY1ZlTDZiZ0EyVmR6c2dWeThmMSttTDl4c200S3daV3lrVzd5MkRBTTREWEpaY2VWTXNpRFd5cHJ0ZUsvdmhvb29oV3g3T1BUNjhWTDNaQTVLREJFQTNjUDc2T0U3SEJsZ3RhbFloTjZiVWlOVmQ5VnBaYjZ0S3hFREVRTmQzNXk1QlNBNFFBZHhBdnkrSWd3a1pkRFEvbitJNElFUElqcXh1UGdaVWZWT3ZsZmEwcWtJUWlBQUNpK1JRZWk1cWw1MHdEUHdkNG5qUnVwZWVTczZpd1ZoeXl5RTMzeXBCMllGVHpnYnRSRmRicEhJd0NJcFVTY1JBQXFEZmR1ZnlzL3NIRnpuZS9ndkkyYldQMnU4cU5CcngzM0lVUkxyYzNBblIzVkhwYU5SS3ZtNVRpYkhJSlNJd1JRRWhRa0ZnZ2d0eFlYN2d3ZkwwTStUT2ppc1FEOEFVWG4zT2dJcjJScTJrczEwRll5Q2lxR01SQnlBSWhpSiswaGQ1U2VxMXZxRTFuNy9yT2lCM2J4VGkzYlltN2MwT2gwcFJjVVZoSUVGUUdJTkJ1QmtHU3RNR2VqczNxTHNCQUNuS201dTA0a3NPMVZ3SmhTa1FSQ0JnTmtSR2pldWE1OU44dXNwalRiVTVBSE85cFQzOFRsT3pkcno5a2txTUxjRVpKTGd1eEJkR0tGaVI4V2VmeDdZVjVaZ0FxK0t0eG1idFdLdERoY0lnaU1BQWNCSlhGamt2MmZ0SFQ5eGZ3NjBEU05hZnJHL1JqbDI4ckJJWWhDQVlJRTBuS3MyODBmWDlkZ2pIQmhDQ0F3ckt2bXpSM21pNXJKTENZQkI1ZFJLVnJoSGYrY1BVdDZWMTNneUFWdHJRcGgxdDdsQU54cmpPamRwQVdLOTh6TlUxbTdYZHl0Rlk4ZC93MGMrNmt6dk8xWjlJQ09zOEJMM2xpVnZmM3R3aDNkZ0E5eUwrQStER0liYTdHaGxUQUFBQUFFbEZUa1N1UW1DQycsCiAgICAgICAgICAgICAgICAgICAgYmxhbms6dHJ1ZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnTWljcm9zb2Z0IFN0b3JlJywKICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3poLWNuL3NlYXJjaC9yZXN1bHQuYXNweD9xPSVzJmZvcm09TVNIT01FJywKICAgICAgICAgICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBQVdFbEVRVlI0bk8zV01RMkFVQkFFMFRrRWtHQUJSUWo0WGpDREFGb1Fnd1VTREh3OGJFaG9adnE3dkhMcldlWk8yTGhmQmJDZXhEK0c5UENyQkFnUUlFQ0FnTjhCVm14M1BDWm9Vd0gwdzBFaVFJQUFBUUlFNUwyRGZRd3FhcEN2emdBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgICAgICAgICAgICAgIGJsYW5rOnRydWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FsdGVybmF0aXZldG8nLAogICAgICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vYWx0ZXJuYXRpdmV0by5uZXQvYnJvd3NlL3NlYXJjaD9xPSVzJywKICAgICAgICAgICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBRFZrbEVRVlI0bk1XWFhVaFRZUmpIZjFhTzNPSk10MmsxRkRGYkNTRlprZ2FWZUdFUWd3SXIrNENDNklNa293K0k2cXFMNmlLQ2dxQkFpRXE2S0szYmpDNjZpRzZLUGkwd3JUV0xOdFowN2h5ZCs4anZMdDR3YWVmc2JIUFZIdzY4ZTUvbmZaNy9lZDczK1o5M1daWmpkeWI1ajVpVHJHTnNjb0xZUUMrRStpR3N3RWpzdDlHUUEwWXptTXhneXNWaXlzMHNBVGtVQUc4M0RFZlZIVVppNGhud0MzOXpBZGlYWUpscm1qa0JPUlFBOXhzQTl0V3RZblBOS2xZdWM3REFtamZsNHc4cWZQN3FwYlBIUTJQYkkranZnMUFBMlZHbFc0MHN2VE1nOTd5RndUN3VudHpERG1ldDdodEZvakd1dGo3ZzlPMTJNYkdrT2lHSldib1J3eklBRzJ1cmRWMEJUTVljVHUxdG9MbHBtNWp3ZlVyb3IwOWdmR3dxY0NvNDJPQ2swbEVJWVVWc293YjBEK0c4UEFncnRENThRbTMxY3Q1MHV2RDA5dlB5NHhjQUhQWUN0cTVmUTJtUlBXN3BpZm82ZGw1c0VWMGo1YWRKWUg0SmhCVVJTQVAzbjczajFmWHpjZk5saTRyRUlES2d1VlozQ3l4U1BwU3VCSXRkOUx2Rkxxb3lEYTlkWGpxNjNYRnJLOHBLeFNDc2FNWlBTZ2NzVWo3eTdHelI2N0pQVE5va0xqalhVYjY0R0h1QjlYZXlGSkdjRUNuZjRldDdBQ29kaFp6ZHZRbG5UVlZhQ1ZNbU1EMTVjOU0yRGpZNE01STRLUUx5NkRCNHV3Qm9QM3NvWTI4OUhZa1BvZWNEakkxeXNyNDJZWEovVUNFU2pXbmEweUlnLzRqQVlCL1lKTTRjMks3cTQvYjQySC8rR2d1M0hNZjF6WmNXZ1RsWll4ck1oM29CdU9CY3A2cUNIZDF1VmpTZVN6cVJWaDd0TFlpR0FTaGZYS3hxM24vcGxoajhvUW1wUXB0QWJBaUFwU1dGY1NaL1VPRzF5d3VHdVROS3JrTkFWRUJONC8wQjhZWEVrTm9IU2cxSlg4bFVNVGt4WXdMYUZaZ3R1S20xVjBWWktkZ2tpQXlLeHlhbExjWGFCRXhtQU41MmZWWTF0eC9aSlVqWUpERk9FOXBiWUpRZ0ZLU3p4OFBheXZJNHM3T21pc2tNS0tOdUJScmJIcVd0Y2pNaVlEVktJRm1oUDhUUnl6Zi9QUUVBN0E0dzVIRGo4VXRPWFdsSldBbTN4eGQzS1huNDlJVVkvS3FtR3JLc2gyOGt2SllIaDZQZ2ZnZmpvMkNUYU42K2diclZGVlA2NFBiNGVQeThnOFpyOTdTREZKVmh6UzFJandCQWNIUUVmQzRJQlJNN21zeWlMYWYvdGl6VVRBNUpDcEUxMndERnl3aEdRekFZRUVsK0tTVTU4MFFpYzc0NE55a2lKU1cwR2lYUm5obUUvaCtUdjR5ZnpaY2J3WXQ2amxVQUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgICAgICAgICAgICAgIGJsYW5rOnRydWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0dpdGh1YicsCiAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly93d3cucnVubmluZ2NoZWVzZS5jb20vZ28vP3VybD1odHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP3E9JXMnLAogICAgICAgICAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVlBQUFCemVucjBBQUFFbWtsRVFWUjRuSzFYWDJoYlZSeit2bk52MDJ4ckl4dTlOMW1TbFRpdUlMMjZQZFN0aU1qY2l5anE5RWxrVHdNZnJNaEVkT2pEWUV1blUvQkJKdzcxUVh3VXBBK1dvUXpuWkd5Z09PZEVPNmFDUVdLYlA3ZTVycHRwTTlxa3ljK0hKdHRkY3RObWE3Nm5uTi92bk8vN3pya252M01PMFNGczJ3N011dTV1QWZaQVpBaEFWTWdvQUZBa0J5QUg4bmNDSnpZWnhwbkxseStYTytIbGFoMFNoaEZaSUErTHlGNEFvUTc5RmtsK0hoUVpTN3V1YzBjR0xNdnFuUzhXRHdKNFZVUTJkQ2g4S3psWkF2QmVYeWgwTkpWS0xYWnNvRDdyQ1JFWnVSTmhIeVBuZ3lMUCtLMUdpNEc0YVc1YkV2bGFnSGczeEQxQ0daMThJbE1vVExZMWtEQ015QUp3b2R2aVhoTkJZSWQzSlZUamgyVlp2UXZraEZlY3dCOEV2aUI1NVE3MHJoRVlKL0JMSXlCQWZJR2NzQ3lydDhYQWZMRjRzUG1iVTZsamp1cytkKy9RVUFSS1BROXkyVGs1RC9JU2dYTUV6b0tjQlBEZmNvcXpCUFlQbUdiWWNkMW5TUjcxY29ySVNIMXpOeVo1WTlPbG1uYzdOVzJuNHpnWEdtM2JNUHF1YU5yZzZPam9uOGxrc3RaRXpIZzhmbyttYWU3VTFOVFZSandjRHQrTld1M3ZXM2pKVWxERVNydXVRd0NJbU9iSElqTGF2SVpLMXgvSTUvTVgvZGEzVTBTajBjRnFwZkpQYzV6a0owNmg4S0t5YlR0UUx6S3RxRmFIMWlJT0FMVmF6ZmFMaThoZTI3WURhdFoxZDhPbndwRXNRZFBPcmRXQXBtay9rZnpYSnhXYWRkM2RTb0E5YmNZZXllZnpMVXQzdThobXMxY2c4cnBmVG9BOXFuNnd0RUFQQkw1Y3EzZ0R3UTBiL0xsRWhoU0FhSE9jWkdsNmVqclZMUVBwZFBvYXlTbWZWRlExanRRbUZFaEt0d3dBQUVSbVdrSmtWTkZUakc3MmxZR3VpZ01BMmNKSlFDa0FmanUwUHh3T205M1NUaVFTUWZoOGFnQ3VBdUI3WVZBaWozYkx3T0wxNjd0RXBOY241U2lLL09nM1NFUmVGcEZWYjB5ZFFJQlgvT0lVT2E5QW5tMHphTWZtY1BpMXRZcEhER09maUR6bW15VFBxdERHamQ4Q21QTTFJZkp1eERTUERBOFA5OXl1Y0RLWlZCSFRQQ0RBcDIyNnpHMFNPZFU0akk2THlFdDFWKzlyNU05VmtUY2dzZzBBQ0V5RC9Fd0IzNnRBNEdJbWs1bjFZOXk2ZGV0ZHBWSnBXQUVQMWtUMlFjUnFaNUJLSFhkbVp2WXJBTkJGanBFc0F3Q1hCN29ESWcrQi9CVUFCTmdpSW9lcklxY3E1ZktKWkRMWjh0Y0ZnT3R6Y3hPbzFiNnIxV3B2clNoT0x2YUlIS3RQYmhrUjB4d1RrVVAxWmxFUEJHeVM2NWJLNVIrOGRVRlQ2dW5jek13SlArSklKUEtJVkt0bjJnbDdESXc1aFVJUzhCU2h2bERvN2ZyTkJnQkMxWEo1TEpQSi9CVVV1Wi9rQVFBZktLVmVXTi9mLzAwN1lsM1hKOXZsUE9xVGZhSFFPemVhM2x3MEd0MVNyVlRPQTlnTW9FcE5lOHB4bkpPcmtub1FOb3dLQUwxTk9xLzE5SXprY3JscFh3TUFFRFBON1VzaUoyK1lJRThET0UxZ1RvRHd3N3QySFIwZkg2K3VZR0FKZ09ZbnJwT1Bad3VGMzd4QjMwSVRpOFhpUzVYS1Z4RFozcHdiTU0zZWxkNTlZY09vb3ZsOElTOXB1djVrTHBkck9SRjlkM00ybTgzMGgwSWpKTWRJM3ZLa0twVkt2bU84Y2pkMVdTYjU1cnIxNjNmNmliYzFBQUNwVkdyUktSU1NQWUJOcFQ0RVVBUTVuMGdrbGxaVUo2K0NuQ2Y1a1I0STNPY1VDb2ZTNmZUQ0txWlhoMjBZZllPRGd4dFg2eGVMeGVLV1pYWDZpc2IvbVF6VmRZaWRLZGdBQUFBQVNVVk9SSzVDWUlJPScsCiAgICAgICAgICAgICAgICAgICAgYmxhbms6dHJ1ZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnR3JlYXNlRm9yaycsCiAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzP3V0Zjg9JUUyJTlDJTkzJnE9JXMnLAogICAgICAgICAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQm1KTFIwUUEvd0QvQVArZ3ZhZVRBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQUIzUkpUVVVIM2dnRUJDUUhNM2ZYc0FBQUFWZEpSRUZVT011ZGt6MnF3a0FVaGMvZ29CYUdKQmdVdEJDWnlqMElMa3B3QVc3QndzNHlPM0FITGlDdEVGRDhLVlJFa29pRnhaelg1QTJLR2ZONEYwNHpNTitjZSs1YzRMTVVnRG1BTllCbnJuVitwbEJTaStGd3lIcTlUZ0EyTFFwdkNpRWlBQndNQnR6djk1UlNmb05FSHk4RFlCekhyTlZxVkVyOUJXS2NxTkZveEY2dngzYTd6YzFtWXlDNzNhNE1vZ0JnN3ZzK3orY3pPNTBPVzYwV3Q5c3RLNVVLcDlNcGo4Y2pxOVdxRFRCSG5qQWR4ekdRWnJQSncrSEEzMW91bHpiQVdnTG9BMENXWlZCS0lZNWp6R1l6ZEx0ZEU5RGxjckZOclk5OHpvYnFPQTZUSktIVzJqZzRuVTVzTkJwRkRwNm1oVmU1cnN2VmFzVXdESG05WHFtMTV1MTJvKy83SHkwZ0Q4S2F0T2Q1dk4vdjFGb3pUVk42bmtjaHhGdUk2aHNBQUlNZzRPUHhNSkNYZHRUYlI3SkpDTUVnQ0pobEdVbHlQQjRYZnVtb3pJbnJ1cHhNSnBSU1J0WmxLb05ZbCttLzYvd0R1V0FqdFBmc1F1d0FBQUFBU1VWT1JLNUNZSUk9JywKICAgICAgICAgICAgICAgICAgICBibGFuazp0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdDaHJvbWUgV2ViU3RvcmUnLAogICAgICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vY2hyb21lLmdvb2dsZS5jb20vd2Vic3RvcmUvc2VhcmNoLyVzJywKICAgICAgICAgICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBRFQwbEVRVlI0bk8yVlQyZ2NaUmpHZjk4M1U5ZHU0aWE3YVl5NHM4U0Vub29pZUJBVlBDc1dSRkNpSXNWTDdWbW9XS1hYOWlCVVQ4Vi9SVEEyS2tJQ0lpSjRhU0hvb1ZCdjFZYUc3S3JkRFpveHU0bmt6MDUzZGw4UE83TzdrNWxwZDVxb2x6Nnc3TXo3enZjOHovdCszenNEZC9BL1F3RXNMeS9Mem9SSUtIUkxKRjFqV1pZeUFaUlNJWkxlV0wvQ1NkYjRNS09JYmlYbXVtNWt6akNNeENiTWZvVTlYRkZLblJrZkg1K09TcGJMNVZlQk40QUhFeG5vRndNREErOE1EUTNOeE9VdHk1cXVWcXZON2UzdDgvMXk2aVFHNnZYNkNkdTJqOFRsYmRzKzRqak9tMGs0WTZlZ1g5ek90UGpJNS9NcVVRZitEZXpLd0c2cTN4TURlNEhiTnJBWDFVUENNUVJvcmRYWW12MGNxYTNoL2w1c2t4UWVRR1d6N0gvaEZmUndOaEdmQXFoVUtqY3R4N24wQS9WdjVtaFYvd0t2Y3NGYjRuZkNaeEJCNTBhNCs3a3BVbzg5R2NzcEloUUtoZmEzSUoxT3h6N1lXcldwbi8rRUZJQTJncUk3VEhUQzYydkk5TWZzZi9nUjlJRjdiN3BkQ3FCV3EwVStVVHY2RXVLNlBjeGgwZTV0dENsbG1HU241eUxGYzdsYy9IdkFYVnhBR28xZGlTT0N1QTNjYTFmalpLSTdVRHQ5RXJtMkVDVHRKWTRVanpiZ2g0ekpnd3lkZWk4Z0h0dUJMOHcvOTBhOEo5Y3NMa1pKaGNkd3BqVFBCNGN5RkFjMUp5L1p3YVRIbVQzelB1YjlWc0NFYmxRWXZQNzZEdkhnMGRyNit6dWN6RE9CV0tnRDM1WXZJd2pmRndhQ3dnSm9UZnI1bDFIM1dWeTRxamd4cTNoclRuTnhRZUdhZVp6c0ZONnVoc1JCdUd0elB0U0J3Qm40c3ZRanA2N01kcXA2Ky9JcWgwc2JuVXBIWjc2bXNtNXcvQ3ZkUTl2RnV5ODJzWWFiWklwVElYSC9meXYzR2s3bUtTRGlEUHhVWFFyczYwY1BEYk94VDdkalN0RlNCbWN2cWhCdDJ5Q2N2YUJwaXRIVGhhQTRnRm4vSldBdFlPRG50ZXVkYmd1d21qSTQvS3dGQ0tsSG4rRGN2S0swb2pwNVg5ajN2TFNpT0RldmFRdytIaW1PQ09hTllyeUJGV2M5a0JRUkdsNHgreVlPVXJMRFZmdjBmcnhvUXlzMVNmZ010S0hjYXRpQTR6akhBRVpUR1VTazgvUHBwNTdPcy8zckloT2ozWXI5RWUvSWVEY1RvNkNkcFdDd3AwMWk1dkEwajRJM2htTmpZNStXeTJWOXdMem53OTlhSzZGM2R5VnRNRnY3ZzRtUkcwaFRkNmk3cmVoZVRvNjBhRzRzSVc0cklpKzRSb2JOemMxamxtVjlGdG1pTy9pdjhROGJPN0FpRU1HYzh3QUFBQUJKUlU1RXJrSmdnZz09JywKICAgICAgICAgICAgICAgICAgICBibGFuazp0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdGaXJlZm94IEFkZC1vbnMnLAogICAgICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vYWRkb25zLm1vemlsbGEub3JnL3poLUNOL2ZpcmVmb3gvc2VhcmNoLz9wbGF0Zm9ybT13aW5kb3dzJnE9JXMnLAogICAgICAgICAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVlBQUFCemVucjBBQUFEM1VsRVFWUjRuTFdXM1UrYmRSVEhQK2RwRlNsbEk2aHpKbXVjRVdpVFppelRRdEc1dVJjZ1lSb1M0NTFlcUJjbVhIamhqZitCMTE2WjZKSWx2dDBZRXhPTkFzcWl3MHpOS0lXQ2tlVHBZR3JFRkVJY2xER0VsYmJIaTJlbGI4OURXK20rViszdnZIeS9PZTE1RVFveHRkQkdlcWNibFNYQy9uRkVGRHRFRXg0eTY1ZFFlUUVZbzRYWENRUTJiSDBCSXRkUG81a2p1SXhwUW42ejBDUUFxQXFUOFhmSjZsdDVpMHpTNmpwRmUvdWRvbVN6eTAxc0piOEJQVk9RNW1kYUdDZ1RvZXBtSW40RjlObUN2Qi9RN1g4VGtReUFBVkJHYmdWM2tVdy9YVWErdlRaY1RBNmdKMGt5aW1rMkZ6MVBYajlSUkc3bEhTSVNmeS8zMVNCMm83Mk1QQy8zd083SHVSVXYyOGxSbE9mc2ZlK0ttRnZ4NXNPelRmYXVPa1JrUG1nSlNLVzY3Qk1DR1N5YmFUYXpzVHFLNmlsSDM1eUlqZFZ2ZHl1aDB1bnNtZzBCQ05mTXM2QS8yRHFKS01vdkNINVVIOXFidkNod0JTR0c2bm5BYmV2aWN2WFQxWEZaVUJVaThRbFVuU3RSYjRoRTZmYUhFY2xhWFRBLzM4QWFQVWkyQ2FXVHJMNEQ2cW9qWVJia2JZenNOQmovSWgweFFySUR1VFlzeFlUNVBhcm42aWpnS3VIQWFUdVRVZlppL1lHTzFZM2N3akZpZjdSVUZqQzM0aVhKQ0tvUDE1VmV0WVhVblRHaU53Nldtdkkvd2V4eWs5WG5sVnB0WDVnQWR6ODk3YmR5RDFZRm9na1AyMnZEOTVnY0lJeWt2eXVjbUFiUmhJZjByV0huQ1ZkbktEMnNzenVzRERMcmw4cG4rNzBXb2Mrd3ppY0FibXVsMm14ZDRTWXE3Mk1RQjIxSGVRUGwwWXJKUlpLZ0h5TDhpbklVWlFoNHhFYkY4NmlLR3hnRFhpcEprc1hnSkYyQitPN2J0SG1SSFIxRENlNUIvamN1NlNNVXlPLzg2SjhYeVd3dG9IaUsrZVV5SW1yUTNQb2FJbGVMalN3WGtRTThHVWdnOXcwQWF3N3MyeGp1Z2RLRGc5RFJKUlN6eEhtS2hvWlhBQXlDaDI3elFNc0F3bzhGRGlsYmp1NjJSVVErdHhlZ0kzUzEvV2F2amZ4Ukl6S0R4OVBIaWNlVGxnQ0E0NGMzY1IyOGdNaVhRQnJSaisxSkFHVEo0WDNST1VRK0E5SWdQNEczbDg3SGRxdFl2Z3NXRnh2eCtiWWNrMTB6dndJZHRHRVpweWR3MWpGdWJzVkw4TkR0c2lqSGdGSlIvNlFiU0tVR1FUOUMxVDVPakZmcDd2alU4WmkxQzluVHFpcEV6Q3MxRFNtUkxPZzJLaEhjL3Y3YzJuVkMrVFlzeE5UdnZwb25wS3BodFp5ZUliM3dWQ1gzdlFXRW52Z0w1SXVhQk9RZ01rTzRiWEovQWdDYS9TK0RqTlpJUGd2ZTN0enR2ejhCUVVueG9PdEZoTEVxeVdmd05wMGpmT1JtVmU1VkpRV3JFeEtiWDkrOWRKMnl4ZkI2ZXduNlZxdE5XN2tDT2ZoOFc3Z09ESUtNTzNoTTArZzVYd3M1MUZLQkhPd3VKNUVvalkzOWhST3VXbFJmZ1J5T0g5N0UyMnFOYldFSFpJVDdHL3IrRC9uKzRUUVJhOEIva3ZwempCckJDRGtBQUFBQVNVVk9SSzVDWUlJPScsCiAgICAgICAgICAgICAgICAgICAgYmxhbms6dHJ1ZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnVXNlcnN0eWxlcycsCiAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly91c2Vyc3R5bGVzLm9yZy9zdHlsZXMvYnJvd3NlP3NlYXJjaF90ZXJtcz0lcycsCiAgICAgICAgICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUJxRWxFUVZSNG5PMlhzV3NUVVJ6SFA5OWZMb1BVU1dqcWFPbnVFQks2aUE2dWNRdVZkSEN3MUVrM2Q1OS9nYXNJcmhsQ0VDU3Vnb2hMSlZ6UjFTRmpiQXFDaUZONzkzUHhHbEZqOVd6dkxmMU9CL2Q3Ny9ONWo5OTczSWtmRWp6WXM5M1BHM0kyY1ZwQXc2SEdncnh2UFJMQXRIUEZGOVZJeW9BWitCaXB2OUs4UGxBSStkSDc0dUh5dS91ckhHUkRvTGxvc2pJQ3Z6RktoYm9YUjY4bkFGYkFkWmp0L0F1OGROeWI3cjd6OGNiVlZRQUxIb3lEYk9qTzhxbkQ1eGJMamc4OUJMUG51MTl1VXNYS2YzSHc1bDc2Y3NOeXozdVZ3K2NTbS9hOTJ5TkZMUU1hOFFSbzJKL08rV25IM1dzV0MxNGtPWWxKREVKVWdaVVhieDVHRldnL21WeUxLdUQ1NGF1eVk2TTM0Wm5BbVVDQ0ZHSUs2UGlTNDlONi9PSHZQOGwrU3ZMMTZZVUhaUWN2YlgwcWZRTWVDZVJlL2g0SC9sc2dlaE9hUkJZTExpa3pYTE5ZQWc0ekE4YXhCSVNQelZFL2xvQkxmVHUvZFhjZ0thMmNMcVdkN2JXQlNTR3YxWk11MG41MWNQYk5rbTZRY2dNNGQydHZrdFNUOVVwMlFrck42dXR2dHkvTmYwNExpYVhiOTlwZ1BhR1IwUFFranFpa0RHa3FNY0xVNjl4WmF4ZHdnRzgzTm9kR2FRTGc2UUFBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgICAgICAgICAgICAgYmxhbms6dHJ1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgfQogICAgICAgIGVuZ2luZUxpc3RfcGx1c1sxXSA9IHsKICAgICAgICAgICAgInN0YXR1cyI6MywKICAgICAgICAgICAgInZlcnNpb24iOjEsCiAgICAgICAgICAgICJlbmdpbmVEZXRhaWxzIjpbJ+eUteWtkOS5picsImVib29rX3hpbiIsdHJ1ZV0sCiAgICAgICAgICAgICJtZXNzYWdlIjoi55Sx5aWU6LeR5Lit55qE5aW26YWq5pW055CGIiwKICAgICAgICAgICAgImVuZ2luZUxpc3QiOlsKICAgICAgICAgICAgICAgIC8vIHsKICAgICAgICAgICAgICAgIC8vICAgICBuYW1lOiAnaml1bW9kaWFyeScsCiAgICAgICAgICAgICAgICAvLyAgICAgdXJsOiAnaHR0cHM6Ly93d3cuaml1bW9kaWFyeS5jb20vJHBvc3QkcScsCiAgICAgICAgICAgICAgICAvLyAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBUUFBQURaYzdKL0FBQUJpMGxFUVZSNG5KMlZzVTRDUVJSRnp5NjZHQ3RMcld5c2pNYkV5aSt3TkZIQm1HRHBIMWpZV0p0QXE1V3hwb0ZFb3JYeEI2eHMxQ0JCSTRXSlZocE5vUEJheU1BdXV6T3czRmN3dk1lNWVUT3p5ME9ZSUdDSE1rM2F5QkpmM0ZNbVR4Q2llb3RONmxad01PcHNSUXpJVUJ3Wk5sRWswemRJand0UjdCcVFHd3NYSWljZzRIVnNneFlCRkd6bEdTMXBlcGpGSGxTU0NpVVovZWhRUzlyVmVySkIxZU9aZVVLYXBJTk5YanoxNGpNYnpkaHhXSW1uNW9pMmRDYTNGdU9iQ0g4NUhvSkwwbzNtSWdZZU10MG8zcUJWYmFaNjU5TGxmcE9PeUNIemE1L2V3c1BqS0pYSnYwTDdPUmpoREl3U0RuR2krL2t4QXY2UWZBc0l2WStBdDVTeEdTeGJrRXNodEtxYW5wUzFQd2NtR2dONHhmRTZoWjREb3dYcWxpdExraDlQbFZKZTQyZThyWXZJQnI0ZEc2QU5qMG1GL1pCQncyWHc3SE9YMU5ZNUhsZmQ5YjJyLzF1Zm1xMjJnY2MxOE9ZeXFBMzlVNTNTbXIzYUlvc2c3ekp3UnQ0TWx0SlllRW4wUjl0SmF2dzBOTnFFWUR2VmNNMzF1SDZXZ0FKVm1uU3NZSWNtVlFyaDhmNEh1ZnBjUHFoM1NGY0FBQUFBU1VWT1JLNUNZSUk9JywKICAgICAgICAgICAgICAgIC8vICAgICBibGFuazp0cnVlCiAgICAgICAgICAgICAgICAvLyB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmb3JmcmlnZycsCiAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cDovL2ZvcmZyaWdnLmNvbS8jZ3NjLnRhYj0wJmdzYy5xPSVzJmdzYy5zb3J0PScsCiAgICAgICAgICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUZRVWxFUVZSNG5NV1hUNHRsU1JIRmZ4R1plZTk3VmRYYU9yb1JCdVliQ0xwd0lhTXRibDI2RXR5N0hFVFF4ZWdYOEE4dVhMa1ZQNEF3TUFnaXlLQ0NxTXdvQ3VLZ29qaldPSTEydDEzMTdzM01pSENScjlycG5xNTZVOTBMQXg2WFI3NlhjZkpFbkJNM0pTSUU0RE9mLzlJTDZZMmZmdXZlMlk2THlDbVJuN3ZGMDRhS25Jdnc0a3ZmKzhhM0gxMlRpQkFSMFUvZnV0VS85ZnpIK04xdlh1UERIL2tvYjU2ZTh0dlhmczFudi9KZFRETXliWmltbVFDU0NOMERpV0E3WndEV1p1U2t1RUUxWThxSnRYVWMrTnZyZitEVlYzN3NMMy8vbTFORStOc0I1SXRuUlBDbjEvL0k3ZHR2OGRlLy9KbmJ0OThDNFBmLytBK2hHYzJOTWpkVWhHckd1blNtT2RPcWtiUFN1N09aTTB2dHRPWk1SVW1xN0piT3N4OThqcEtUN3ZQVmg5aDU1RG0rcUNJaUFJUkRiOEU4SlpJSTVrYXZEaUlVVlVwTzQrUWV0T1pZRDI1c0MvT1VXS3NoQXJVYUl2cU9QSmNDZUtoR0N0T2N1SC9lY0lJSWNBSUJ6cFpLU29JSUVGQmJaeXBLOTJDM2pPUWkrL1ZMOGx5YStDTFdhclEyNkFWd0J4eEtVWEpTbHJYakJraXdtUXZ6bERrN2I4eVRna0JyUnNUbCsrZkxsL1lJZFg4OG9IZG43VVlRckl1QlFza0pjOE1kZGt1ajVvUXExT3BNS2RIRTJXd3VUM09RQVJWSVNWSEFBc0tDcE9OMFNaWFdqVzZCUjVCem9yY09Ja2dTbHRvNE9TN1VhazhPWUxkMHJBVWhNR2ZoNW8yWklQQVkvZUVldE9xRVExMDcyMDBaRWx3YWM4bmN2YmNPd0pmRXdSTGtsRWhGcWF0Uk5vVjc5MWRLU2VSa0pCR09ONFcxR2dnSXdtN3A1S3hzTjRYYWpIbktYSlR3aVJqbzN0a3RGU013QzNJUld1dTRENG51bHFHT3BFSnR4bmFUNk4xWTFnNGhJT0JQMDRSenpzeEhFMHVINlVnb2thbml0TzRqY1VyakpDSWNiVElFbkJ4UHVBVkxOVlJHb3o0eGdKSVRacENURUFGcmRjd2NrU0Jyd25ITVJqL1UxUWVuYXhDTS80Z0l1NlZldXYvQkVwd3RqYlBkaWtkUXU5UE1TVm1ZUzJLM2pucUhCT0ZqWFlEYUhMT2c5K0I4MTY3Yy83QU1GVFpUWmxrNldZV3N3aGdueWx3VUFxYVVFRkdtU1NoSk9kNFdGQ0VubUtlMGI4VEh4MkVWcUdJK1pvR0tvQ3IwNXF6UmNHTnZ3MExyUm0zQldWOUpJc3hUd2gyNk9mbzJMNzQyQUUxS1VxRUZuQzJkcEVMS3dwUVRaMnZISE13NnFzbzhDZHM1WVI3a0pLek5xZFd4aHlmdzlRQzRHVk9abUVvbU5PUHVSQVROZ3FKSzdjWmNFcTBIaExQMDRIaWJhVDBvU2NrbkJiOUNod2NCSUVLM1lMSEcwVkhCSThZN1FiTmhRT05IbENRRVNnbkhBNUtDdVVPTUdYSlpIR3hDc3hoendJS0lRQkRPeml0VFZ0NTdZMEpFaGtTQjNoeE55bTdYSHNoUWsxenBBd2NCakxuZnVIRlVFSVRlalpJVDFaeGxOYlp6UWxWUWdYbVRFQW0yMjR3QTk4OGJFWEJGRHg0dVFWTEJYSENINW4wMFpSTHFPdnpmSFRTQ3RUbGxFbkRvUGlqUE9kRnRlTUlUTTlCOGpObm1UazQ2cU82QnhUQWZHVlpBS2NLNkdyMDc1bU5rQndFQjdrL1JBMHJnNGVOa0ZuaDNXak95S3JJM0pYTkhSSmhLSWdBSndjekorOUxrZHpVTHZQRys5ei9EbTZkdmNPTTlON2x6NTkrb0toOTY1Z1RORTVwblFoS2lndmNnWllFUUxJYjlYa2hOOWkrSUlrSkU0QTdKbHNNQXZKM3pxMS8rQW9DZi8rd1ZBTXJKQjdDL3Y4cmpTbmkxd3o4YzUrczZXTHdLUU43ZXhPb09MVnNBbnYva0ozanhxMTlqWGRkcnBIcDgxTzU4NGN0ZnZ4S0FSMFFOYjVPdlE4TS8rZUZML09qbEgvRHN4ejgzWnEwb1NBTE5vQmxKR1VsbC81bVFWTkJja0lzMS9WL2Q2NTFUMXJXZUF1K2c0UUVBMC9rN21wWVh2QzBLbzdPbmFjdHk5ODVUTXhBUnQrLys2NTlmZkJ5QUIzZEQ0QVE0NHQzWTgvV2pBK2ZBL1VmdmhuSnhPOTZEeUF4cEhwVG5OV0ovbGFFL212d2hBUCt2K0M5c3orVmR3eVF1MGdBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgICAgICAgICAgICAgIGJsYW5rOnRydWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ+WogemUi+e9kScsCiAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9zLmZlbmcuY29tL2luZGV4LnBocD9zcmNodHh0PSVzJywKICAgICAgICAgICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBQUFJQUFBQXdBQUZnQUFBSWxRVGtjTkNob0tBQUFBRFVsSVJGSUFBQUFRQUFBQUVBZ0dBQUFBSC9QL1lRQUFBc2RKUkVGVWVKeU5rbDFJVXdFVXgzKzczbmJWVFYxM3phWmxzdzhWSXl2YlNraXllaW1qSHRLSElrU2l3Q0F3aElpSW9JY2VDcUpleXFJZzZxVW9pSWlnRHlPS0NzVWluUG14TXBabXB1Ykg1cHo3Y3J2ZTdmWlFTU3VJenR2aG5QLy8vTS8vSE4zekw5T2FNcU95VXRhUkt4djRuNWdLSzV6ckNlQXRraEVlMmxKNXNNVElvWDROWjYvbnZ3aHVkSTB4NVpoSFRvYUFZQUxNQWxoTGpaeCtyeENPUlA4SlZ0VTRMYU14eEorNThIdlJGNWZvZHZVQUVJNnBPSWNpUE9rTjBlU2E0T053QUFCUlRHSHUyRGRHeHNFUGlINUFCWHhlOExVNW1iK21tRmEzbDJ0QkEyT1JjUURNam55bXZiRDQ2U2dOamd6cU55OWszL2ttSmpaVm9OdlJsdERpTVJoNjlwWmRtUi9Zc0dVYmpRWXJFWGN6TDJyMkk1a3NyTDkwaHNSTUZHbGhHWWxPSDllM3p5VVVEUENzK1IyNnhwdFB0R0hQSktXTGpKU1hyNmVoU3lURG5zRFZlSTNSVmcrV2lsb0U1UTBkWjArdy9kVlRKT3NLQ2xxNk9iV241TWRLOVRWYlp6MW9jazJnNXFYellHc2xhZVpsRk5iVUlXV200cjdkVG43MWNiS0xscURNZ1JhL0FkOVVDRG5MbUd4aTUwaUFMSnRJNmVGNllnRVY5NjJydEI2dFpkSWRZdTJSR2t5WjZXZ3FxRklxeCs1K0lwWmc5aG9BNkFXSmlBOUs5dXdrejc0TzUrVjd5R3Vxa0IxMmdzRXAvQUdKUkR5ZGVHQ2FkcjJlNjY1Z3NnSjdqb0MvTDA1UUEzTmhMdkx5ZkxLS1YyR3dwdEY3NHkyUHFnOHc4bktRYWM4NFdUbVpkQXo2a2drY1MrZVI5dkVMazEvQjNlYW04L3dWb3FNZlNMUEVzRld0SWtVMDBuMzJKT0VCSjRwaVpuTjZJSm5BSUlrY1dSM0I4L2d6ZlhlNkFjZ3VMME0weXVpekM1SHRlOG1kYjZKRWpsSm5jck43MHdwMG1xWnBmNzdyb3hkT1RseTZqeWM0ZzZXaUZvREl3SHVxbGljNFhGdUp4V3lhN1UweU1SSlZ1TkE4VEkvT2lsaXdHa2U0bjRNYkZWTDFJcllGRzdBdHlQbHpWcktDaTY4SDZTbkxReElnRklWUGo3MmNXNmxoWDJiNUMvZ3J2Z1BqWnhpQzluK3Ivd0FBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgICAgICAgICAgICAgYmxhbms6dHJ1ZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAn5oiR55qE5bCP5Lmm5bGLJywKICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwOi8vbWVib29rLmNjLz9zPSVzJywKICAgICAgICAgICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS94LWljb247YmFzZTY0LEFBQUJBQUVBRUJBQUFBQUFJQUMyQVFBQUZnQUFBSWxRVGtjTkNob0tBQUFBRFVsSVJGSUFBQUFRQUFBQUVBZ0dBQUFBSC9QL1lRQUFBWDFKUkVGVWVKeWxrN0dxNm1BUWhMOE50eE1EQWR1L0RwaEtVdmdDUWRLcjhTRzA4REZTV3NwNWd4VDJGckdOSUFvMnRoWTJsa3FLYUtIdXJZNGFqeHprM29HRmhmMlpmMmJZRmRkMWxmK0E5ZDJJQ08vNmp3bFVIMEtlKzk4Z0l2eDVOekRHRUVVUm51Y0JNSi9QU1pLRVBNOUw3MVFWZWMzQUdNTmtNc0cyYmJJc3d4aURNWWJOWmtPNzNTNFJuRTZuc2dJUklReERiTnRtT0J3eW5VNEJHSTFHaEdHSTUza3NGZ3Z5UEtjb0NtNjMyNE5BUkZEVnU4d29pZ0RJc296QllNRHhlQ1RQY3k2WFM5bXY2N3I2V2w5ZlgvcU01WEtwVVJTcGlQeXNkM3R3dlY2cFZxczBtMDBhalFiZGJoZkhjV2kxV3FScGVsY01sRE5RVmZyOVB2VjZuVjZ2eDNxOUJtQTJtNUVrQ2I3dms2YnAzUzQ4N2NINWZHYTMyN0hmN3dtQ2dQRjRUQkFFQkVGQXA5TUJZTHZkM2o4cVpWQ3IxVlJFMUxJc3RTeEw0empXVjhSeC9NTy9aVmtxbFVwRmk2SjRqUUhIY2ZCOUg0RFZhc1hoY0NqTnZ6TVFFZm5uWXhLUlJ3WXZyQjhScUdyNUdsVzFsUEFuK0FzZitzb29RaS82U3dBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgICAgICAgICAgICAgIGJsYW5rOnRydWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0xpYnJhcnkgR2VuZXNpcycsCiAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cDovL2dlbi5saWIucnVzLmVjL3NlYXJjaC5waHA/cmVxPSVzJywKICAgICAgICAgICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBRGZFbEVRVlI0bk0yWFFXZ2JSeFNHdjVTRm5jTlNEWFFoZXhCNGFRVVZSaEFSREJGT3dTRXQyUFJTVTNwSTZDRkpMOG10TFRtRW5Fb094WVJTUW0vcExhRTE1RkNhOU5DU1F5K0ZZbVF3UlFGVFZtQ0NBcUpzUUlRUjdHRVdCdHJEYUZlcXNhVmRpZUkrR09idGFQYTlmMmIrOSsvbzFLdFh2Yjg1UVh2dEpKUC9Md0E0WlNidjdCc3UzM21FRUlKQUNnSmZVbCtTckRWRExqYTl1UUNjS3N1QlcvZjNlYkQ5RzNnQzlIZzhDQ3M4L3VvU2IvcW1GSURTUjNEM1JnTlpQVzBmUEVEWUZrY3YrV2E3WFRiY2ZCeTRzQktDQmlrckJJRnRTTUhUdlY3cFdLV1BZTkplbDlYY1Ywb1Q5UlhMMVhKSFVKaUV6Mk9IWHF5SWxVWWJqZGFBNlpNYVM0U0taMG1wbEdDMVVaemJoV2FldWZZRGNYOW9Id3hndE8yenQzTmZXRTQ0c1BYcE9wOXNWSStJOW04cmRBUTdrZUh5N1Vkb25ZSndiY0lNZnBiY3BJQnIvU1JGQmhXNjMzMDBFMEFoRXE3V0hlN2QyckJsWndCUyswUG1HOEJ4eDJNQ3ROWkhSSm9UQU1DSExaOW1hd2wwYXBPWjFMWUVTRklZREcydjdWZ1l5RUp4U3luaGxYZWJkSjUyODFWS3YwSVlTS1FuRUE1b0EvRkFFVVV2MlZ5ckY0cFp1Z3kvZUxDL2tQUXVEQ0N6UC9zTzhjQ1dwVW8wdzBRalJ2dnBDb0VVRVBoeUp0Q1pSL0JMTzJFMzZ0SHB4dlFHR3FVVU9oa1JUMnR3eEhoeVhoSGpjZW03UEw1MzlWaUJtcm9EMTcvZTQ4bjN1MWJ6SFdHRFo1QXoxaDllampuVUQ0YTAzbm1ibjdiZU96TEgxQjM0OXVZS3dSdUMrOXU3NExualdwODBNMWtWMlZnR3dnVlAwSXZWc1RsbWx1R2RxdzF1Zkh3T0JsbnlVZm5seVNkQU9JejZDYkhDVnNmY0FESVF1UWJBZU1XT2EwR0pFVEN5WFpvQVpDRDA1V0lBQUxhdVh4aDU3cGdMSnAwUUljWUE5Y2hQVWhob05zNkZ4OFl0TEVSbmF3NzF4aExSWGpjbnBBd3FOR3NCemJjQ2xxcVMwSmRJS1pDZVFDV2FxQmZ6b3EvNC9GSnRjUUFBVjliclBFdzBHMnQxMWxzaFoydEh2VzdZMlk5WmJYZ3NWMzNBbnhwem9RdkpZZnZ4OXdFUGYrN1EvclhMWnpmWHVUMWw1Wm1WMm9GSmV4NDc5QWFLWndjeDdXY3huU2hHeFVNYjBSTW9WZXhyV0JqQVg4cmoycGRQN0kxSWE1UWFFUzlUUFlIVkNnZFFLVUxNQ0ZnV2dFbzBuYjBYTmhIWU12TWdyNHI4bm1BMVlHMGxMQlMzY0JrdVZ3MUI3VFJrV3pzcFJucDhEeUFlc3JsNWhvdU5ZbC9MVWlUODQ4QndkN3ROZEJBVEp6cFhPK2tKQWw5UUR3TStPQi95Zm1zNjgrY0c4Ri9ZaWY4NS9RZGxNSEx1SlFRakhRQUFBQUJKUlU1RXJrSmdnZz09JywKICAgICAgICAgICAgICAgICAgICBibGFuazp0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdCLU9LJywKICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwOi8vYi1vay54eXovcy8/cT0lcycsCiAgICAgICAgICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUVOMGxFUVZSNG5PV1dUV3hVWlJTR24zTy8rVzNMajdWdGFHbHJpMVVVQkV5NklQRW5SQk1UaVlGVlc2TW1KbURVR0hEamxvM0VwUnNURFFtSlVTT1JoWUNZWW5EaFFrQ05oSjhGaE00Q2hLRlVCRU1KVWpyVHpzejl2dVBpT2tPbmM2ZnRsS0lMejJMeTVUdnZPZTk3enoyNTc4RC9QYVRXZ3A3RDUrUHhUS3hYUGRvRWJVYzlkV292UjlUODN0amNlZWJvYytJdnVJREg5NlUzZXNJV2xENUVacWxScHlxN1VmdEZhdURoRS9jbVFGV2UySCtsVjhYOUNOSXdGN0dsVXJnUmNhdy9POUNWbnBlQXRRZCthN0VhR1FGaXRSQlhDRkgrV3F4ZTIvR0J6b213dkJkMnVmTGI0VGJmbVYzM1NnNGd3dEl4c2Urdi9mSmFmV2grK2tXd1pOR0pzSGV0eFIrcExKd3BCNkNxMlZSL2Q0V0lpZ2trTXRIWGl1Uld3VmZGRTBnWW9TbHVhRWthNmlNU0VON2xwQ0hpMFpJME5DVU1FUy9JKzZvNExVNUM2bFo5UGZ6TWpCTll2VC85Q2NnMmdKZ24vTEs1ZzRTUkVtakNLcXBRRndsdVBqcy9SbXZTc0xHakhxZVE5UjFSVDRpYklPOFV4Z3FPcHcrTklNRVVmRlMzcHdaVzdDNXlSc3JISlAwaW9BcEw0eDVKSTF3Y0t6QjRaWncvc3BhckdSK255cHJHT004dVM3TDEwY1VBSEx3OHpySHJFNHhrZk9vand1b0g0clRXR1Y1c3I2YzVZWWg1UXNFcEloSlI0VTJnVXNDYUF5UHRUbTFMY2F3ZWdsWGx3N08zK1BuUDhnVStkeXZQbmd0anBQcTZ1Sm16N0RoMUUyL0tMRStQNWdESVcrV05sVXZLeGl4STcwT2ZweFBEVzdvblljb09PTFhycDcrZnFoc0ZpQWhPRmFzYURpaldoMFJ5c2VrcG5qMkEzc0dyZGFwc20zdUwyaERUd3pqN1ZwbUFmTUUxZ25iVzNHbVdxQzVOSHVrNWZENWVFbUN0NjBKWXR1QUNxaWtRN1RINStJTWxBUmlOQ1dKQ3NRdXRDa0FsYXZKK3BDUkE4TzRvNUVLeDkwT0FhQ2FHblNnSlVNc3QwUEg3d1ZVbGJyckpSZG1TZ05SUXh5VlJPZnJ2OGN1aHM2KzNaa29DMkNsT2hWOW5LMU9DcjJTMW5OUHErWEt3bml3ZVMxL0N6QjM5dEdHUmZEd1Y1d0V2TEs5alUyYzlqZjhZa1JHNGxyV2NISjBNR2dqc2VMS1J0WTB4bWhJRzM4SDFDWi9SU1V0ek1uU3ZHZXJ2UGxJOFR6T2p5emtncGtCenduRGtwZmF5d3B3TjNDMDUxUTBWUEFtZVBtY0Q1eXlhVVRIV2ZUT012VHVaNjBOOVhhMFZFd0J3Nk1zZTdCR2tZWFRTOHRUZ0NEbW5aSDFGVVlxK3FDaExvb2FmTnJXVDlaVU4zd1c0cVhsQldCUVZCQ21SSzVwMllqWlA1U3dUVUtncmZCL1B4cjRDM2dhNFhYQUlFRHhRdWFXTUZ4enZIYi9CN2J6RFY0aEllUjRnNHl1Z3BVcFA1YU5VWCtjNUtwRFRZdFcrOUVVUldSR1dtM2NveDRiNnV6Wk12dzc5VDZqQ3U2cU1MQ0Q5Q2V0NXRadmQ2bjNwSHhDZUJ3a1ZPbXNvT1lTOVEzMWRXNnRCWm13YzFjS3JLQi9NajF3VlpYc2lGdDArRTJ4T1h0TzcrMVEwMDlTMHhpaTdGQjRUV0JMS0NUZEU5WXlxZVNjMTFIR0puZUptNjEyVDJhMDdtRjZhOTNXbElLOGcwaUZLbXdxS2NrVWc3YW0zTjVZd0YwOXZYcDZ0cGU5L0duOERRclN0ZXpTNGVQVUFBQUFBU1VWT1JLNUNZSUk9JywKICAgICAgICAgICAgICAgICAgICBibGFuazp0cnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICB9CiAgICAgICAgZW5naW5lTGlzdF9wbHVzWzJdID0gewogICAgICAgICAgICAic3RhdHVzIjozLAogICAgICAgICAgICAidmVyc2lvbiI6MSwKICAgICAgICAgICAgImVuZ2luZURldGFpbHMiOlsn572R55uYJywibmV0ZGlzY194aW4iLHRydWVdLAogICAgICAgICAgICAibWVzc2FnZSI6IueUseWllOi3keS4reeahOWltumFquaVtOeQhixodHRwczovL3d3dy5ydW5uaW5nY2hlZXNlLmNvbS9yZXNvdXJjZXMiLAogICAgICAgICAgICAiZW5naW5lTGlzdCI6WwogICAgICAgICAgICAgICAgLy8gewogICAgICAgICAgICAgICAgLy8gICAgIG5hbWU6ICdqaXVtb2RpYXJ5JywKICAgICAgICAgICAgICAgIC8vICAgICB1cmw6ICdodHRwczovL3d3dy5qaXVtb2RpYXJ5LmNvbS8kcG9zdCRxJywKICAgICAgICAgICAgICAgIC8vICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FRQUFBRFpjN0ovQUFBQmkwbEVRVlI0bkoyVnNVNENRUlJGenk2NkdDdExyV3lzak1iRXlpK3dORkhCbUdEcEgxallXSnRBcTVXeHBvRkVvclh4QjZ4czFDQkJJNFdKVmhwTm9QQmF5TUF1dXpPdzNGY3d2TWU1ZVRPenkwT1lJR0NITWszYXlCSmYzRk1tVHhDaWVvdE42bFp3TU9wc1JReklVQndaTmxFazB6ZElqd3RSN0JxUUd3c1hJaWNnNEhWc2d4WUJGR3psR1MxcGVwakZIbFNTQ2lVWi9laFFTOXJWZXJKQjFlT1plVUthcElOTlhqejE0ak1iemRoeFdJbW41b2kyZENhM0Z1T2JDSDg1SG9KTDBvM21JZ1llTXQwbzNxQlZiYVo2NTlMbGZwT095Q0h6YTUvZXdzUGpLSlhKdjBMN09SamhESXdTRG5HaSsva3hBdjZRZkFzSXZZK0F0NVN4R1N4YmtFc2h0S3FhbnBTMVB3Y21HZ040eGZFNmhaNERvd1hxbGl0TGtoOVBsVkplNDJlOHJZdklCcjRkRzZBTmowbUYvWkJCdzJYdzdIT1gxTlk1SGxmZDliMnIvMXVmbXEyMmdjYzE4T1l5cUEzOVU1M1NtcjNhSW9zZzd6SndSdDRNbHRKWWVFbjBSOXRKYXZ3ME5OcUVZRHZWY00zMXVINldnQUpWbW5Tc1lJY21WUXJoOGY0SHVmcGNQcWgzU0ZjQUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgICAgICAgICAgLy8gICAgIGJsYW5rOnRydWUKICAgICAgICAgICAgICAgIC8vIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ+eZvuW6pue9keebmCcsCiAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9wYW4uYmFpZHUuY29tL2Rpc2svaG9tZT8jL3NlYXJjaD9rZXk9JXMmdm1vZGU9bGlzdCcsCiAgICAgICAgICAgICAgICAgICAgZmF2aWNvbjogJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBWUFBQUJ6ZW5yMEFBQUdRVWxFUVZSNG5NV1hYMndjVnhYR2YrZnVyR2ZYNjNqanhuVnNKNXQxbWo4MkxuWklJV21iQkpXaUprVVFVQ3VLa0lBSFNKRW9DaXA5S2lsSTVSRmVVT0VoUlVDREtvSkF2Q0FoRUhIK05FMnJ5ZzFwaUtGdDNOcTFpemZKMnZIVzJ6aUp4L2Jzek56RHc5aEpFenUxb1ZGN251YmhmdmY3N3ZuT3VmZU1BTHpaMThmVTFGUnlWUzUzdit1NnUxM1gzWUpJQmxYaFpvU0lvdXI1dnQvdCsvN2VNMmZQSGt5bjAwRmJheXRTS3BXWTl2M2FaY3VXUGVaV1ZlMU9KQklOTjRYMEJoRkZVY212VlBhV3krV2ZwMXozRW9lUEhIRTh6M3ZTV2x2UkR5bXN0UlhQODU0OGZPU0lRN2xjM2htRzRma1BpM3cyd2pBOFh5NlhkOHJFeE1TQlRDYnp1ZjgxbFZZaGpPSnZKd0htLzZnV3ovTzZKQWlDY2NkeHNvc0ZUZmh3cW1BNU9hUzhQYVlBM0ZZdmZMSkZ1R09WWVVscThRTENNTHdvUVJDRWp1TWtGZ000T1dUWjN4MXhjc2d5RllERy9JaEFLZ21iV2d6ZnVEdkJwdFZtc1FJaUNZSWdjaHhuUWNUeGdZaWYvQzJnVUZZU0J0RFlCcGhKdjBCa0liOU0yUE9GSkhldlcvaE1ZUmhhWnpGS2h5OG9UeDJvVUNoWkVnWTBoS1Vab2FYZW9FQmh6REx1S1FtQlFnbWVPcURrNjFNMDF5MWNHSXNTOE5kL0JydzFIR0lBc2NLOTdRN2Z2S2VLVmZXQ0twd3BXNTU5b2NLeDNoQ2pNREJpK2N2SkN0L2Q3aTY0OTRLcG4vU1Y0LzBCWVdDSkFrdGJrL0Q0bDF3K25qUFVwb1ZzdGRDUlMvRDRGMTArMW1pSUFrc1lXUDdSSCtMNStzRUZlTk5LK1dLRVdFVlV1V3R0Z29iYXVhbGRualhjdVRZUnI3TXh4cHUrQ1FJaUMwRWxJb3BBRkJxek4vWjFlUzBZdFdnWVp5R3lDL0xQWHdPaGhjR1Mwbk1XQ21OS01yakV0dkVUbkVtMjhKOWlLNHJMOVRJVUdCeUpDRlV3NlNTZUdINTNYTW5YS3h0enNLWkJtSy9YNWdnWUdZZDlMMWxlR2xCS2wrTldTMVkxc2RtYzU2dER2K1Nkby9jeXV1azdOTFpjKzJiMUZTMHZuMG1ReU5aZ0hJTUgvUEVFR0dOcFdBTGIxZ29QYnpNMExYMGZBV2ZmaFovKzNmTHlRT3lkU0p6MmdDVFRwcHFHY0pUNk4vN0UyWitWR1ByYUhoclhOQ0ZxNlQxbitjTXJodUxsWk55bU5oWXVnRmdvamNPZlR5b2o0NVk5bnpma2JwbEh3SFFBKzE2d2RQZkgvYXdLZFRXd2ZqbmtMcDFteSttRFdGVXdCdmZWNXprNlVzZHpheDhoU3FZWXMybkNSQUlqWUMxazA5RGFKQ1FNOUkwb0Y3ejRNTjM5eXI2TVpjOU9ReXA1bllBM2g1Vmp2WXJSK0FRYlc0VGQyNFgxalpBSzhuaWJ2OC93cjM5Qk1IZ2FZNFRORjU3anhYT2ZvZEM0aGFwMEVxTXhlV3NUZkcrN1lVTmVFS0QvdkxMM3NOSXpwQmlCWTczS0EzY29uOGpIVldSa3BwcjZobUZpRXJCd2F3MDh1a1BZbUJjeXJwQ29XVUx0blZ0WjhjaGpKR3JyUUMyQlUwMDZteUdaY3NHQ2phQmpoZkRqQncxYjF3czFMbVJjMkpnWEh0MGgzRm9UN3oweEdYUE5XbXdnVG5leHJHZ1VYN1B0elVKYjg5eDJ5OXplU1dwbGpuSnlPZnR2K3lIOTJVOWhJb3RHMExsUytORUQ4K1BhbW9YMlprRkQwR2lHUzYrendOcFlJUnFyTXZPMGpBQmo2UnkveisvaVg5bDdrRWl4Q3AxNTRZa0hoZlZOODk4UnhzeWMxTWFiMlBmY0QyWTJGWTFaUVN6eFhWNVVoa2JuM21MbmlwTTg2M3lkbnJyUHh1UVJkT2F1a2s5Vm9CTE9GVEEwcWd3VTQvb1NPOE0xbzlXWlRVWGJDc2hVd2FRUHhUSDR6VUhsMnpzZzN4QS9PSVBubFY4ZHlmSktjQXZHeEtmWTBDSTg4V1ZoWGJQUS9ZYXkvNWpTVkFjUGJSWFdOTVlraFpMeXpDR2xPQlpuc05xTnVTQzIvb29GN1RsaFM2dHc2RlQ4M2ovL2IrWDFndEtSRnlJTHJ3MHA1Y3NPQXRnUU92TEtub2NNNjVxRml4NDhjMGpwR1l5eDNiMUtSMHZjaHE4VmxIZkdZL0xJd3BaT29UMTMxYW9yQXFwZDJIV2ZVQnlEMDBPS01WQjZGdzdQakYyek5XRVZOcXlHSDN6RnNINm00TndrTkM2TjdST0Y4a1U0Mm5NZHpzTHRMY0t1KzRUcTk3elNjMGF5dDRyS3ZvUEs4VjVsWXZwYUwydXI0ZE1kd3JkMkNDM0xyeTI0UWdsKzIyVjU4WFhsOHVTMXVKb1UzTlV1UEh5L3NHN0ZWZHpzU0RabktKM3lvV2RBT2RHbkRBN0hJOWU2bGJDNVRlaGNMYVNxbURlbUsvRHEyekd1LzF6czhacG0yTndxYkZ3cnBLK2JUOEl3dlBpK1k3bFZDRU5BSUpuZ1N1VXVGS29RUklDQzQ5eDRaUGM4cjh2NHZyODNpcUxSK1JZWWdhb2tWRG1MSjRkNGJaVVRZMjlFSGtYUnFPLzdlODJwbnA0dTMvZWZWdFZnOFJRZkxGUTE4SDMvNlZNOVBWMGYrYytwd0VmN2UvNWZNNHpkVXY2azlxQUFBQUFBU1VWT1JLNUNZSUk9JywKICAgICAgICAgICAgICAgICAgICBibGFuazp0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICfnm5jlpJrlpJonLAogICAgICAgICAgICAgICAgICAgIHVybDogJ2h0dHA6Ly93d3cucGFuZHVvZHVvLm5ldC9zL25hbWUvJXMnLAogICAgICAgICAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3gtaWNvbjtiYXNlNjQsQUFBQkFBRUFFQkFBQUFBQUlBQVhBZ0FBRmdBQUFJbFFUa2NOQ2hvS0FBQUFEVWxJUkZJQUFBQVFBQUFBRUFnR0FBQUFIL1AvWVFBQUFkNUpSRUZVZUp5bGt6OW9FMUVjeHorWG5wS1VsUHhaRXE3RERWZW9nMXdVM09RS2RtZ25FUm9JVWxGbk5YUVFkQkhkNGlKMFVSUmNXaVdqTG5aS04xTzZCZlJDRjZFSFp2Q01DRWt2ZjN5Uk5IME93Y1B6a2tXL3kvdjkzdSs5NysvMy9iM2ZVNzYwQjNJdU9zTy9vRHNZb1NablZXWlBod25LbFJwSFBVRXhiMDBsbUlrb3FLTVRHZGowZW9MQ28yMjh2dURCalJYcWpodUltNGJtMjZNVGlmbzNhOVYyOFBvQ0syZHc3L203VU5iaW1oV29La1RRYUxZeGpYbWUzTDZDbmttenMzOUFaZk1XQUdldVBRNFJxbjllOVBxQ3V1T2laMVArcW1mVElSbDF4MFhQcElpb3AxQTZZaWpub2lxcmQxL1ErTllPWlppRzY2c1gyQ2dzUTBjTTVXOTgvdHFTaStzbGVkVDlJYVdVc3ZCd1M3Ny9lT2pIRjlkTDh1bWJxdTkzeEZBR2VyQm5PK1FNalVROEJvQ1ZNeWk5Mm9XYks1UXJ0WW1WQkFqTUJZMUVQT3I3eGJ6RjVZdG54ejA1ZEVuRW81Z0xXb0RBN3dIQXM3ZDcxQjJYUnJNMXRSOTZKdVcvU25kd0hINUdnSmYzcjFKNnZZdHBhQ3lkRzh1NGs3ZndlaUkwRzVHSldiSXBxcll6bG1WbzJJNUxNaDVEejZaRFo1V09HTW9QbnhxVUt6VWF6UlplWDJBYTgxUnRCejB6bm9PcTdiQ1VNd0I4VzgrbTJDZ3NvL1IvSHN2dnJRNDcrd2NUTlU5RE1oNWo3ZEo1bFAvOXpyOEE1aHZoQkd2T3VxNEFBQUFBU1VWT1JLNUNZSUk9JywKICAgICAgICAgICAgICAgICAgICBibGFuazp0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICc1Nue9keebmCcsCiAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cDovL3d3dy41NndhbmdwYW4uY29tL3NlYXJjaC9rdyVzJywKICAgICAgICAgICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FZQUFBQnplbnIwQUFBRWJVbEVRVlI0bk1XWGFVeGNWUlRIZjI4V21NNE1XMWtMZ3FWUWlxRVZCTnRLaGFneFZkQ29yYmEySmhaSWpOWm9vbzJwMUVUYmZyR05TK3VhdXJieGcxWk5JOW8wa3RiU3BJMVJBNFRTc0xWSUNVeUZzQTdMd0F3enpNeWI1eWNlODJBMlFPTC8wOXh6enIzbjkrNTZSdUI4aGNUL0tFMm9nWEZhSTQvRzUxSWFmeWZGTVZsRWEvWFl4R25xeDd1b0htNm1lcmlKZnh3akN3WVFnczFBU25nTWh6SWY1OW5rUXZUcWNMOXhMby9JdWFGckhPNzhoVFpyMzM4RHNEdHBNeWR5OXJCU2F3aDVRSWZvNHVETm4vbkE5QnNlZ3ErdXlwOWpmM29KMytXKzRETzVKRW00UFNLU05EK0JUcTNsL2V4ZGZKWlRoZ29oS0lEUFBWQ2VmQy92WmoyTlNwZ2RRSlE4bkI5dTVuUi9MUTJXYnNaZFV4alU0ZVJHcHJFejZXNTJKRzFFcDlMSzhYdFQ3MmZFYWVYTm0xVUJBZVl0d1RwREVnMkZoekZxZExLdDB6WklSY3RKL2h6djlEdFF0bUVWMzJ4NGpudWlNeFRRajF6OWtJdm1Wci85NWkzQnNYVzdGY2xiSjNzcHFqc2FNRGxBdTYyZkIrdmZVeVJUQ3lvK3luNEdyYUFPRGVDdXlOc3BqZDhndHlmY2RwNjZkb0pCNTBUQTVET2E4ampaM2ZRRjNWTm0yWGFITVpudGlmbWhBZXhKTGtRdHpKcU9kVitnWTJvZ3BPUXpHblBaT05CeFJyRkJ5MU9LZ2dNSXdFT3g2MlhIbE9qa3k1NHJDMG8rbzdPRGpZcExxVGdtQzcwcUxEQkFsRVpQcGlGQmRseTFtQmdLY2VybnlpV0oxSmpiNUhhRVJrZUdQc0ZuckF3UUcyWWszT3NZdGR0Q3Y4MTg2ZnFjL2ltNm1NQUFjM2VxVlp4ZUVvRFZyZXl2RVh6ZmViTFY3bkVxTnM1S3JYRkpBSEZoeXY0T2p5c3dnTmxweGViMTFYa1JxVXNDeUl0TVU3UnYyWDIvbERLQVRaeW1lYkpYZHVSRXBKQnRXTFdvNUpFYUhWdGpjK1Qyd0xRRms5M3NNMWF4TU5YRFRmSnZqYUJtZjNySm9nRDJwajVBak5jamR0SGNpa3NTZ3dOODIvY1hkdEVwdDh0VGluZzRidjI4VG9HVWJWakZXeG1QeVcxSmtqalorN3ZmZUFWQWoyT1VVMTdCR2tIRkQ3a3ZVdWoxd0FUU21oWHgvRnF3ajBqTkN0bDJjYVNOUDhZNlFnTUFPTlI1bGx0ZTZ4V2pOWEJwWXlXVjZhVitiek90b0tZc2VRdDFoUWNWRjQ3RmJlZVY2NmNEbGlVK0s2TE5VV3U0dExFU28wWlpndlU1eGprNzFFajllQmZEemttaXRYcnlJdFBZbHBEUFdrUGl2TUdiSjN2WVVudEVjYnBDQWdEWUdwdkRtYnlYaU5icUEvQUhWOVZBQTd1YVBrZVVQRDc5Zmt1eW1wRTJ0dFMrVGQxNGw4L1N5NStrT1JQK1pGSUI3MlR0OEJ2dkZ3RGdocTJmb3JvamxMVjhUYVBGaE1mUFYwaVNSSWR0Z0gwM3Z1ZGpVNDNDSnlEdzJ1b1Nuci90UHA5OWc1YmxzNEdRcVUra01EcVRUSDBDRVJvZGRvK1Q3aWt6ZFpZdTJpWjdFWkZRQ3lxcThsN21pVGxGeUxUSFRXbkRjUzZQdGk4T1lDR0tVT3U0dk9rQUJWR3JGWGF6MDBweDNWSGFiZjJ5TGVBU0xGYVRvb050MXo2aDF6R3FzTWVGR1RtWC95cHhYZy9kc2dBQTlEckcyTjc0S1ZhM1EyRmZhMGprOWZUUzVRY0FhSmd3VWRGeUN2ZWNkeURacXpoWlZnQ0Fxc0VHM3ZqN0ova29pNUtISC90clpYL0kvNDZYb3VPbUN3dzZMZXhNMnNSWFBWZW9IbTZXZmY4Q2NTYWk1NlR3UDJVQUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgICAgICAgICAgICAgIGJsYW5rOnRydWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1BhbjExNScsCiAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cDovL3d3dy5wYW4xMTUuY29tL3NlYXJjaD9rZXk9JXMnLAogICAgICAgICAgICAgICAgICAgIGZhdmljb246ICdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNBQUFBQWdDQVlBQUFCemVucjBBQUFCNDBsRVFWUjRuTzJXNFUwak1SQ0Z2emxSd0VJSGtBNmdCRzQ3U0VxQVNDNkFpQktnQUV0SEIzZVhEZ2dsa0E3aUVwTHR3UHhZN3pKcjdHUnZ0U0pJeDBpUmRzYWVtV2ZQZUY3Z2Z4Y1o0dVF0djhMbkJuQmlXQTRGY0RMUTcxWjlMOE52WEFEZWNwRlpta2I2N3oxN1d4R0RTOXIzQUhnR2ZoNEsvQTlTaW1FVkczK01tR0NROU8yQkpiQlFlZ0g4RGJiMUhyL05XQUMydW9iZXNnRXVBb2lsR0dZcEoyOFBCeDVhQWwzTHFiZnMralRpYUFERU1BZEtvQXFtZ29FTmV3TGdMUVZ3RnExcHZVcWMwQUhYMUdWWUE2c0R0MURvOWFha0VnRGNRanZkUGtOV1lpamhDejNEUDNRYnF3QmVsVDdqL2JrMTNlK0FHOTc3SUNYNkdlb1lyU1Fub2JmY0FROUJyY1J3cXRaMkFXQWpDekU4WnVKNHBTWW40WWM1RUJybFhwbGlwM1BnQmJnTStvTzNsR0lvb3lhY2E2ZFVjb2h1SUFSNHBYdkNTWXBJMUMxVndCV3dCWGFwSk1CYURGZXBoYllKdldWS1hUT2RmSjVsc2ZyYUo4Qk1ERTRNRlNUM09raFBTdWlXWUUxOW1nYkFreGllY280QmhJdVNsdEdXYlFDV2o2R1ZxQVI3SFFmSUtzVVpuU1lVZy9PV0JmVlFLa1lHa0l6WGh3MnJUSkErOW16aXZnRGFrUWtkR2lhYURmcmYwNng1Y24xRy9ORkg4ZEVCcE9oNG90YlBjaFFiMlRWMWE5ck54am8ySFRzeE5iaXZVUUkrMHZHM2ZKcThBYlFZbU9ob1FrK2FBQUFBQUVsRlRrU3VRbUNDJywKICAgICAgICAgICAgICAgICAgICBibGFuazp0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAn6IOW5qyh5YiG5LqrJywKICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL3d3dy5wYW5jLmNjL3MvJXMvdGRfMCcsCiAgICAgICAgICAgICAgICAgICAgZmF2aWNvbjogJycsCiAgICAgICAgICAgICAgICAgICAgYmxhbms6dHJ1ZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAn5bCP5LiN54K55pCc57SiJywKICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL3d3dy54aWFvc28ubmV0L21vZC9hcHBfc2VhcmNoP3dkPSVFOSU5MiVBMiVFNyU4MiVCQyZtb2Q9YXBwX3NlYXJjaCZva3N1Ym1pdD10cnVlJm9rYnRuPVhpYW9TbyVzJywKICAgICAgICAgICAgICAgICAgICBmYXZpY29uOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQmQwbEVRVlI0bktXVFR5dEVZUlRHZitlOWQ4emNtWkVGR3pGTFpXRTFrVzlnWTJmSHlpeVZmQUFVRzdLVUxMR3pJUi9BQXFXb1NVcVRqYUt3b0ZCa211YlBuZnUrRmxmalhpNHo1U3hQNXp6bmVaNXpqZ3psOWd6L0NCV1pWSUl4VUhVOVhFK2psUHdLWUg5UDFPcWF3YjR1NWllelpMclQxTFZoLytTZWhhMXpFbkVMVDRjSlMxQkNxZXlTM3hnam1iUVJBUEVuYTIyd2xEQzNudWZ3NGlFRTBwQlFxWG1jYlk2UmRHeVVDQ0tDQUFKWW54S1dwb2ZwN1V5aFJNSUFsaEpHaHpNa0hQdFB2UUM3S3lPVUttNFlvT3BxWm5OWi9KbE5RaUFWLzdMT0I2aDd0S2Zia0JiNkFaeUUzYWhWUUVoVEsyRUNpMUFBVHB2RitlVVRXcmQyVTg5djVRYUlBdC9wbWRYVHBnWnFiU2hjdlpCeVltRUdCdkF3ckcwWDBDYWFoZFlHcFlUeHhZTlFYZ1VMdG85dW1GbysvdEZzRE53OUZCbVkyQ0VkbUE3ZkxoSDhQM2d2MWVqcVNORGYwOEZyc2NyMVl4SGJWcEZiK3ZFTFdodlNUb3lxNjFHNGZjVUFzVmprejBVREJHa2JtbS9sQTZ2SGc0SzVlazIxQUFBQUFFbEZUa1N1UW1DQycsCiAgICAgICAgICAgICAgICAgICAgYmxhbms6dHJ1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdCiAgICAgICAgfQoKCgoKICAgICAgICB2YXIgc2V0dGluZ0RhdGEgPSB7CiAgICAgICAgICAgICJzdGF0dXMiOjEsCiAgICAgICAgICAgICJtZXNzYWdlIjoiJOebuOWFs+ivtOaYjiQoc3RhdHVzOiDov5nkuKrlnKjlsIbmnaXmiJborrjlvojph43opoEpLi4uIisKICAgICAgICAgICAgICAgICAgICAiKHZlcnNpb246IOiLpeacieaWsOWKn+iDveWKoOWFpSzpnaDov5nkuKrniYjmnKzlj7for4bliKspLi4uIiArCiAgICAgICAgICAgICAgICAgICAgIihhZGRTZWFyY2hJdGVtczog5YWB6K645pu05paw5pe2LOa3u+WKoOaWsOeahOaQnOe0oue9keermeWIsOS9oOeahOaQnOe0ouWIl+ihqCkuLi4iICsKICAgICAgICAgICAgICAgICAgICAiKG1vZGlmeVNlYXJjaEl0ZW1zOiDlhYHorrjmm7TmlrDml7Ys5L+u5pS55L2g55qE5pCc57Si5YiX6KGo5Lit55qE6aG555uuKS4uLiIgKwogICAgICAgICAgICAgICAgICAgICIoY2xvc2VCdG46IOiuvue9rumhtemdouWPs+S4iuinkueahOKAnOWFs+mXreKAneaMiemSruaYr+WQpuaYvuekuuOAgnRydWXmmL7npLosZmFsc2XpmpDol48pLi4uIiArCiAgICAgICAgICAgICAgICAgICAgIihuZXd0YWI6IOaWsOagh+etvumhteaJk+W8gOOAgjDkuLrpu5jorqTorr7nva4sMeS4uuaWsOagh+etvumhteaJk+W8gCkuLi4iICsKICAgICAgICAgICAgICAgICAgICAiKGZvbGRsaXN0OiDmipjlj6DlvZPliY3mkJzntKLliIbnsbvliJfooajjgIJ0cnVl5Li65oqY5Y+gLGZhbHNl5Li65bGV5byA44CCKS4uLiIgKwogICAgICAgICAgICAgICAgICAgICIoc2V0QnRuT3BhY2l0eTog6K6+572u5oyJ6ZKu55qE6YCP5piO5bqmLOWAvOS4ujAtMeS5i+mXtOeahOaVsCww5Li66YCP5piOLDHkuLrlrozlhajmmL7npLos5Lit6Ze05YC85Y2K6YCP5piO44CC5rOo77yaLTHkuLrnm7TmjqXlhbPpl63mjInpkq4s5YWz6Zet5LmL5YmN6K+356Gu5a6a6Ieq5bex55+l6YGT5aaC5L2V5YaN5qyh5omT5byA5a6DKS4uLiIgKwogICAgICAgICAgICAgICAgICAgICIoZGVidWc6IGRlYnVn5qih5byPLOW8gOWQr+WQjizmjqfliLblj7DkvJrovpPlh7rkuIDkupvkv6Hmga8s4oCc5YWz6Zet5bm25L+d5a2Y4oCd5oyJ6ZKu5bCG5LiN5Lya5Zyo5Yi35paw6aG16Z2iKS4uLiIgKwogICAgICAgICAgICAgICAgICAgICIoZml4ZWRUb3A6IOWwhuaQnOe0ouagj+WbuuWumuWIsOmhtuerr+OAgiB0cnVl5byA5ZCvLGZhbHNl5YWz6ZetKS4uLiIgKwogICAgICAgICAgICAgICAgICAgICIoZml4ZWRUb3BVcHdhcmQ6IOWbuuWumumhtuerr+WQju+8jOaQnOe0ouagj+S4i+aLieS4jeS8muWHuueOsO+8jOWPquacieS4iuaLieaXtuaJjeWHuueOsOOAgiB0cnVl5byA5ZCvLGZhbHNl5YWz6ZetKS4uLiIgKwogICAgICAgICAgICAgICAgICAgICIoYmFpZHVPZmZzZXQ6IOWcqOeZvuW6pumhtemdoum8oOagh+WIkui/h+eahOiPnOWNleS8muWHuueOsOS9jeenuyzoi6XmnInkvb/nlKjlhbbku5bnmoRzdHlsZeagt+W8jyzlj6/ku6Xkv67mlLnov5nkuKrmnaXkv67lpI3kuoznuqfoj5zljZXnmoTlgY/np7spLi4uIiArCiAgICAgICAgICAgICAgICAgICAgIihnZXRJY29uOiDoh6rlt7Hmt7vliqDmkJzntKLlkI7ojrflj5blm77moIfnmoTmlrnlvI/jgIIw5Li66Ieq5Yqo77yM6IO96L+e5o6l6LC35q2M55qE5oOF5Ya15LiL55So6LC35q2M6I635Y+W77yM5peg5rOV6L+e5o6l55qE5oOF5Ya15LiL77yM5Z+f5ZCN5YqgZmF2aWNvbi5pY2/ojrflj5bvvJsx5Li65Z+f5ZCN5YqgZmF2aWNvbuiOt+WPlu+8jDLkuLrkvb/nlKjosLfmrYzojrflj5bvvIwz5Li65L2/55SoZG5zcG9055qE5pyN5Yqh6I635Y+WKOS4jeW7uuiuruS9v+eUqCnjgILmiJbogIXmt7vliqDnvZHlnYDvvIzlhbPplK7lrZfkvb/nlKglc+S7o+abv++8jOacqua1i+ivlSkuLi4iICsKICAgICAgICAgICAgICAgICAgICAiKGFsbE9wZW465LiA6ZSu5pCc57Si77yM54K55Ye755u45YWz5YiG57G75ZCO77yM5omT5byA6K+l5YiG57G75LiL55qE5omA5pyJ5pCc57SiKS4uLiIgKwogICAgICAgICAgICAgICAgICAgICIoSGlkZVRoZVNhbWVMaW5rOumakOiXj+WQjOermemTvuaOpeOAgum7mOiupOW8gOWQryznmb7luqbpobXpnaLkvJrpmpDol4/nmb7luqbmkJzntKLjgILlpoLmnpzmg7PlnKjlkIzkuIDkuKrmkJzntKLnvZHnq5ks5L2G5piv5oOz6YCa6L+H5LiN5ZCM6K+t6KiA5p2l5pCc57SiLCDlj6/ku6XpgInmi6lmYWxzZeadpeWunueOsCkuLi4iICsKICAgICAgICAgICAgICAgICAgICAiKGNlbnRlcjrmmK/lkKblsYXkuK3mmL7npLrvvIzkuLvopoHmmK/kuLrkuoblhbzlrrnohJrmnKwgYWMg55m+5bqmICDvvJogMCDkuI3lsYXkuK3vvIzlvLrliLblnKjlt6bjgIIgMSwg5by65Yi25bGF5LitIOOAgiAyLOiHquWKqOWIpOaWrSkuLi4iICsKICAgICAgICAgICAgICAgICAgICAiKGljb246IOWbvuagh+eahOaYvuekuuaWueW8jywgMCDlhbPpl63mloflrZcsIOWPquS/neeVmeWbvuaghywgMSDmmL7npLrnvZHnq5nlm77moIcsMiDmmL7npLrmir3osaHlm77moIfjgILlvZPohJrmnKzkuK3kuI3lrZjlnKjmir3osaHlm77moIfml7Ys5pi+56S6572R56uZ5Zu+5qCHKS4uLiIgKwogICAgICAgICAgICAgICAgICAgICIodHJhbnN0aW9uOiDmmK/lkKbmnInliqjnlLvmlYjmnpwsIHRydWXkuLrlvIDlkK/miYDmnInliqjnlLvmlYjmnpwsZmFsc2XlhbPpl63miYDmnInliqjnlLso5YyF5ous5qih57OK5pWI5p6cKeOAgikiICsKICAgICAgICAgICAgICAgICAgICAiKHNlbGVjdFNlYXJjaDog5YiS6K+N5pCc57Si5Yqf6IO9LCB0cnVl5Li65byA5ZCv5YiS6K+N5pCc57SiLGZhbHNl5YWz6ZetKSIgKwogICAgICAgICAgICAgICAgICAgICIoZW5naW5lRGV0YWlsczog56ys5LiA5Liq5YC85Li65YiG57G75YiX6KGo5qCH6aKY5ZCN56ewLOesrOS6jOS4quWAvOS4jmVuZ2luZWxpc3Tnm7jlhbPogZQs5b+F6aG75Yy56YWNLOesrOS4ieS4quWAvHRydWXkuLrmmL7npLrliJfooagsZmFsc2XkuLrnpoHnlKjliJfooajjgILmjpLliJfpobrluo/kuI7ot7PovazmoI/kuIrnmoTmmL7npLrpobrluo/nm7jlkIzvvIzlj6/ku6XnlKjlroPlsIbliIbnsbvliJfooajmjInoh6rlt7HllpzmrKLmjpLluo8pLi4uIiArCiAgICAgICAgICAgICAgICAgICAgIihlbmdpbmVMaXN0OiDlkITkuKrmkJzntKLnmoTnm7jlhbPkv6Hmga8pIiArCiAgICAgICAgICAgICAgICAgICAgIihydWxlczog5bey5byD55SoLS3lsIbmkJzntKLmoLflvI/mj5LlhaXliLDnm67moIfnvZHpobUs5ZCM6ISa5pys5Lit55qEcnVsZXPorr7nva7nm7jlkIws5LyY5YWI57qn6auY5LqO6ISa5pys5Lit6Ieq5bim55qE6KeE5YiZ44CC6Ieq5bim5LqGMzYw5pCc57SiLOWPr+S7v+WGmSkuLi4iLAogICAgICAgICAgICAidmVyc2lvbiI6NSwKICAgICAgICAgICAgImFkZFNlYXJjaEl0ZW1zIjp0cnVlLAogICAgICAgICAgICAibW9kaWZ5U2VhcmNoSXRlbXMiOnRydWUsCiAgICAgICAgICAgICJjbG9zZUJ0biI6dHJ1ZSwKICAgICAgICAgICAgIm5ld3RhYiI6MCwKICAgICAgICAgICAgImZvbGRsaXN0Ijp0cnVlLAogICAgICAgICAgICAic2V0QnRuT3BhY2l0eSI6MC4yLAogICAgICAgICAgICAiZGVidWciOmZhbHNlLAogICAgICAgICAgICAiZml4ZWRUb3AiOnRydWUsCiAgICAgICAgICAgICJmaXhlZFRvcFVwd2FyZCI6ZmFsc2UsCiAgICAgICAgICAgICJiYWlkdU9mZnNldCI6LTEyMCwKICAgICAgICAgICAgImdldEljb24iOjAsCiAgICAgICAgICAgICJhbGxPcGVuIjpmYWxzZSwKICAgICAgICAgICAgIkhpZGVUaGVTYW1lTGluayI6dHJ1ZSwKICAgICAgICAgICAgImNlbnRlciI6MiwKICAgICAgICAgICAgImljb24iOjEsCiAgICAgICAgICAgICJ0cmFuc3Rpb24iOnRydWUsCiAgICAgICAgICAgICJzZWxlY3RTZWFyY2giOnRydWUsCiAgICAgICAgICAgICJlbmdpbmVEZXRhaWxzIjpbWyfnvZHpobUnLCAnd2ViJyx0cnVlXSxbJ+e/u+ivkScsICd0cmFuc2xhdGUnLHRydWVdLFsn55+l6K+GJywgJ2tub3dsZWRnZScsdHJ1ZV0sWyflm77niYcnLCAnaW1hZ2UnLHRydWVdLFsn6KeG6aKRJywgJ3ZpZGVvJyx0cnVlXSxbJ+mfs+S5kCcsICdtdXNpYycsdHJ1ZV0sWyflrabmnK8nLCAnc2Nob2xhcicsZmFsc2VdLCAgWyfnpL7kuqQnLCAnc29jaWFsaXR5Jyx0cnVlXSxbJ+i0reeJqScsICdzaG9wcGluZycsdHJ1ZV0sWyLkuIvovb0iLCJkb3dubG9hZCIsZmFsc2VdLFsi5paw6Ze7IiwibmV3cyIsZmFsc2VdLFsnbWluZScsICdtaW5lJyxmYWxzZV1dLAogICAgICAgICAgICAiZW5naW5lTGlzdCI6e30sCiAgICAgICAgICAgICJydWxlcyI6W3sibmFtZSI6ICIzNjAiLCAidXJsIjogIi9eaHR0cHM/OlxcL1xcL3d3d1xcLnNvXFwuY29tXFwvc1xcPy8iLCAiZW5hYmxlZCI6IHRydWUsICJlbmdpbmVMaXN0IjogIndlYiIsImZpeGVkVG9wIjo1MCwgInN0eWxlIjogIm1hcmdpbi1sZWZ0OiAxNDBweDttYXJnaW4tYm90dG9tOi0xMHB4O3otaW5kZXg6MzAwMTsiLCAiaW5zZXJ0SW50b0RvYyI6IHsia2V5d29yZCI6ICIvL2lucHV0W0BuYW1lPSdxJ10iLCAidGFyZ2V0IjogImNzczsjdGFicy13cmFwIiwgIndoZXJlIjogImFmdGVyRW5kIn19XQogICAgICAgIH0KICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLeWPr+iuvue9rumhuee7k+adny0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8vIEdNX2RlbGV0ZVZhbHVlKCJzZWFyY2hFbmdpbmVKdW1wRGF0YSIpOwogICAgICAgIHZhciBnZXRTZXR0aW5nRGF0YSA9IEdNX2dldFZhbHVlKCJzZWFyY2hFbmdpbmVKdW1wRGF0YSIpOwogICAgICAgIGlmKGdldFNldHRpbmdEYXRhKXsKICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIuacrOWcsOWtmOWcqOWIl+ihqO+8miIsZ2V0U2V0dGluZ0RhdGEpOwogICAgICAgICAgICBpZighZ2V0U2V0dGluZ0RhdGEuc3RhdHVzICYmIGNvbmZpcm0oIuiuvue9ruWPkeeUn+mUmeivryzohJrmnKzlsIbkvJrlpI3ljp/lh7rljoLorr7nva4iKSl7CiAgICAgICAgICAgICAgICBHTV9kZWxldGVWYWx1ZSgic2VhcmNoRW5naW5lSnVtcERhdGEiKTsKICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8g5p+l55yL5pys5Zyw6YWN572u5L+h5oGv5piv5ZCm5a6M5pW0CiAgICAgICAgICAgIGZvcihsZXQgdmFsdWUgaW4gc2V0dGluZ0RhdGEpewogICAgICAgICAgICAgICAgaWYoIWdldFNldHRpbmdEYXRhLmhhc093blByb3BlcnR5KHZhbHVlKSl7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuWxnuaAp+S4jeWtmOWcqO+8miAiLHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBnZXRTZXR0aW5nRGF0YVt2YWx1ZV0gPSBzZXR0aW5nRGF0YVt2YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoInNlYXJjaEVuZ2luZUp1bXBEYXRhIixnZXRTZXR0aW5nRGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIOiOt+WPlueJiOacrCznlKjkuo7mkJzntKLliJfooajmm7TmlrAKICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCLlvZPliY3niYjmnKzlj7flkoznm67moIfniYjmnKzlj7c6ICIsZ2V0U2V0dGluZ0RhdGEudmVyc2lvbixzZXR0aW5nRGF0YS52ZXJzaW9uKTsKICAgICAgICAgICAgaWYocGFyc2VGbG9hdChnZXRTZXR0aW5nRGF0YS52ZXJzaW9uKSA8IHNldHRpbmdEYXRhLnZlcnNpb24pewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coIueJiOacrOi/h+S9jizlvIDlp4vmm7TmlrAs5b2T5YmN54mI5pys5Y+35ZKM55uu5qCH54mI5pys5Y+3OiAiLGdldFNldHRpbmdEYXRhLnZlcnNpb24sc2V0dGluZ0RhdGEudmVyc2lvbik7CiAgICAgICAgICAgICAgICAvLyAxLjk2IOabtOaWsCDkv67mlLlh56uZ5pCc57Si6ZO+5o6lCiAgICAgICAgICAgICAgICAvLyBpZihnZXRTZXR0aW5nRGF0YS5tb2RpZnlTZWFyY2hJdGVtcyl7CiAgICAgICAgICAgICAgICAvLyAgICAgZ2V0U2V0dGluZ0RhdGEuZW5naW5lTGlzdCA9IG1vZGlmeVNlYXJjaEl0ZW1zRnVuKGdldFNldHRpbmdEYXRhLmVuZ2luZUxpc3QsImh0dHA6Ly93d3cuYWNmdW4udHYvc2VhcmNoLmFzcHgjcXVlcnk9JXMiLCJodHRwOi8vd3d3LmFjZnVuLmNuL3NlYXJjaC8/I3F1ZXJ5PSVzIikKICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgICAgIC8vIOeJiOacrDMuMDIg5re75YqgIOiHqueUqOe9keermS3mkJzni5fooajmg4UKICAgICAgICAgICAgICAgIC8vIGlmKGdldFNldHRpbmdEYXRhLmFkZFNlYXJjaEl0ZW1zICYmIGdldFNldHRpbmdEYXRhLmVuZ2luZUxpc3QuaGFzT3duUHJvcGVydHkoIm1pbmUiKSl7CiAgICAgICAgICAgICAgICAvLyAgICAgLy8gZW5naW5lTGlzdC5taW5lWzhdLmRpc2FibGUgPSB0cnVlOyAvLyDlr7nkuo7ogIHnlKjmiLcs6buY6K6k56aB55So55qE54q25oCB5re75YqgCiAgICAgICAgICAgICAgICAvLyAgICAgZ2V0U2V0dGluZ0RhdGEuZW5naW5lTGlzdFsibWluZSJdLnB1c2goZW5naW5lTGlzdC5taW5lWzhdKQogICAgICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAgICAgLy8gNC4wMQogICAgICAgICAgICAgICAgLy8gaWYoZ2V0U2V0dGluZ0RhdGEuYWRkU2VhcmNoSXRlbXMpewogICAgICAgICAgICAgICAgLy8gICAgIGlmKGdldFNldHRpbmdEYXRhLmVuZ2luZUxpc3QuaGFzT3duUHJvcGVydHkoIm11c2ljIikpewogICAgICAgICAgICAgICAgLy8gICAgICAgICBnZXRTZXR0aW5nRGF0YS5lbmdpbmVMaXN0WyJtdXNpYyJdLnB1c2goZW5naW5lTGlzdC5tdXNpY1s2XSkKICAgICAgICAgICAgICAgIC8vICAgICAgICAgZ2V0U2V0dGluZ0RhdGEuZW5naW5lTGlzdFsibXVzaWMiXS5wdXNoKGVuZ2luZUxpc3QubXVzaWNbN10pCiAgICAgICAgICAgICAgICAvLyAgICAgfQogICAgICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAgICAgLy8gNC4wMwogICAgICAgICAgICAgICAgLy8gaWYoZ2V0U2V0dGluZ0RhdGEuYWRkU2VhcmNoSXRlbXMpewogICAgICAgICAgICAgICAgLy8gICAgIC8vIGVuZ2luZUxpc3QubWluZVs4XS5kaXNhYmxlID0gdHJ1ZTsgLy8g5a+55LqO6ICB55So5oi3LOm7mOiupOemgeeUqOeahOeKtuaAgea3u+WKoAogICAgICAgICAgICAgICAgLy8gICAgIGlmKGdldFNldHRpbmdEYXRhLmVuZ2luZUxpc3QuaGFzT3duUHJvcGVydHkoInRyYW5zbGF0ZSIpKXsKICAgICAgICAgICAgICAgIC8vICAgICAgICAgZ2V0U2V0dGluZ0RhdGEuZW5naW5lTGlzdFsidHJhbnNsYXRlIl0ucHVzaChlbmdpbmVMaXN0LnRyYW5zbGF0ZVs4XSkKICAgICAgICAgICAgICAgIC8vICAgICB9CiAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICAvLyA0LjA0IOabtOaUuSBi56uZ5Zu+5qCHICAKICAgICAgICAgICAgICAgICAgICAvLyDlr7zoh7TkuoY1LjIzLjcg55qE5Lil6YeNYnVnLCDoh7Tkvb/ml6Dms5Xkvb/nlKjjgILljp/lm6DmmK/nlKjmiLflt7Lnu4/liKDpmaTkuobnm7jlhbPliJfooagsIOS9huaYr+iEmuacrOS+neaXp+WOu+ivu+WPlizlh7rnjrDkuobor7vlj5bplJnor6/jgIIKICAgICAgICAgICAgICAgIC8vIGlmKGdldFNldHRpbmdEYXRhLm1vZGlmeVNlYXJjaEl0ZW1zKXsKICAgICAgICAgICAgICAgIC8vICAgICBnZXRTZXR0aW5nRGF0YS5lbmdpbmVMaXN0LnZpZGVvID0gbW9kaWZ5U2VhcmNoSXRlbXNJY29uKGdldFNldHRpbmdEYXRhLmVuZ2luZUxpc3QudmlkZW8sImh0dHA6Ly9zZWFyY2guYmlsaWJpbGkuY29tL2FsbD9rZXl3b3JkPSVzIixlbmdpbmVMaXN0LnZpZGVvWzFdLmZhdmljb24pCiAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICAvLyB2NSDmm7TmlLnlm77moIfnmoTmmL7npLrmoLflvI8KICAgICAgICAgICAgICAgIGdldFNldHRpbmdEYXRhLmljb24gPSAxOwoKICAgICAgICAgICAgICAgIC8vIOabtOaWsOacrOWcsOeJiOacrCDlhbbku5bnm7jlhbPkv6Hmga8KICAgICAgICAgICAgICAgIGdldFNldHRpbmdEYXRhLnZlcnNpb24gPSBzZXR0aW5nRGF0YS52ZXJzaW9uOwogICAgICAgICAgICAgICAgZ2V0U2V0dGluZ0RhdGEubWVzc2FnZSA9IHNldHRpbmdEYXRhLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgic2VhcmNoRW5naW5lSnVtcERhdGEiLGdldFNldHRpbmdEYXRhKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZW5naW5lTGlzdCA9IGdldFNldHRpbmdEYXRhLmVuZ2luZUxpc3Q7CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCLmnKrlj5HnjrDmnKzlnLDliJfooagiKTsKICAgICAgICAgICAgc2V0dGluZ0RhdGEuZW5naW5lTGlzdCA9IGVuZ2luZUxpc3Q7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCLliJ3lp4vljJbvvJoiLHNldHRpbmdEYXRhKTsKCiAgICAgICAgICAgIEdNX3NldFZhbHVlKCJzZWFyY2hFbmdpbmVKdW1wRGF0YSIsc2V0dGluZ0RhdGEpOwogICAgICAgICAgICBnZXRTZXR0aW5nRGF0YSA9IEdNX2dldFZhbHVlKCJzZWFyY2hFbmdpbmVKdW1wRGF0YSIpOwogICAgICAgIH0KCiAgICAgICAgLy8g5aSE55CGZW5naW5saXN0LmRldGFpbOeahOebuOWFs+S/oeaBrwogICAgICAgIHZhciBlbmdpbmVEZXRhaWxzID0gZ2V0U2V0dGluZ0RhdGEuZW5naW5lRGV0YWlsczsKICAgICAgICAvL+WIl+ihqOWIhuexu+aYvuekuuaDheWGtQogICAgICAgIHZhciBnZXREZXRhaWxzID0gZW5naW5lRGV0YWlscy5tYXAoZnVuY3Rpb24odmFsdWUsaW5kZXgpewogICAgICAgICAgICByZXR1cm4gdmFsdWVbMl0/aW5kZXg6LWluZGV4OwogICAgICAgIH0pCgogICAgICAgIC8vIOWIl+ihqOWIhuexu+eahGtleSB2YWx1ZQogICAgICAgIHZhciBnZXREZXRhaWxzTCA9IGdldERldGFpbHMubGVuZ3RoOwogICAgICAgIHZhciBkZXRhaWxzID0gW107CiAgICAgICAgZm9yKGxldCBpPTA7aTxnZXREZXRhaWxzTDtpKyspewogICAgICAgICAgICBkZXRhaWxzW2dldERldGFpbHNbaV1dID0gIGVuZ2luZURldGFpbHNbaV07CiAgICAgICAgfTsKICAgICAgICBlbmdpbmVMaXN0LmRldGFpbHMgPSBkZXRhaWxzOwoKICAgICAgICByZWxvYWREZWJ1ZyhnZXRTZXR0aW5nRGF0YS5kZWJ1Zyk7CgogICAgICAgIC8vL3Rlc3QgLS0tLS0tLS0tLS0tLS0g5rWL6K+VIHN0YXJ0CiAgICAgICAgZGVidWcoInNlYXJjaEVuZ2luZUp1bXAgdGVzdCBsb2NhdGlvbi5ocmVmOiAiLHdpbmRvdy5sb2NhdGlvbi5ocmVmKQogICAgICAgIC8vL3Rlc3QgLS0tLS0tLS0tLS0tLS0g5rWL6K+VIGVuZAoKICAgICAgICAvLyDmm7TmlrDlt7Lov4fmnJ/nmoTmkJzntKLpk77mjqUKICAgICAgICBmdW5jdGlvbiBtb2RpZnlTZWFyY2hJdGVtc0Z1bihlbmdpbmVMaXN0LG9sZFVSTCxuZXdVUkwpewogICAgICAgICAgICBmb3IobGV0IHZhbHVlIGluIGVuZ2luZUxpc3QpewogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBlbmdpbmVMaXN0W3ZhbHVlXQogICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTxpdGVtLmxlbmd0aDtpKyspewogICAgICAgICAgICAgICAgICAgIGlmKGl0ZW1baV0udXJsID09PSBvbGRVUkwpewogICAgICAgICAgICAgICAgICAgICAgICBpdGVtW2ldLnVybCA9IG5ld1VSTDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuZ2luZUxpc3Q7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBlbmdpbmVMaXN0OwogICAgICAgIH0KICAgICAgICAvLyDmm7TmlrDlm77moIcKICAgICAgICBmdW5jdGlvbiBtb2RpZnlTZWFyY2hJdGVtc0ljb24oZW5naW5lTGlzdCx1cmwsbmV3SWNvbil7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDtpPGVuZ2luZUxpc3QubGVuZ3RoO2krKyl7CiAgICAgICAgICAgICAgICBpZihlbmdpbmVMaXN0W2ldLnVybCA9PXVybCl7ICAgLy/nlKjmiLflj6/og73oh6rlt7Hmm7TmlLnnvZHnq5nlkI3np7As5omA5Lul5q2k5aSE55SodXJs5p2l5Yy56YWNCiAgICAgICAgICAgICAgICAgICAgZW5naW5lTGlzdFtpXS5mYXZpY29uPW5ld0ljb247CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuWPkeeOsOaXp+eahOWbvuaghyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBlbmdpbmVMaXN0OwogICAgICAgIH0KICAgICAgICAvLyDmm7TmlrDmnKzlnLAgcnVsZQogICAgICAgIGZ1bmN0aW9uIG1vZGlmeVNlYXJjaEl0ZW1zUnVsZUZ1bihuYW1lLHZhbHVlKXsKICAgICAgICAgICAgdmFyIG9sZFJ1bGUgPSBnZXRTZXR0aW5nRGF0YS5ydWxlczsKICAgICAgICAgICAgZm9yKGxldCBpdGVtIGluIG9sZFJ1bGUpewogICAgICAgICAgICAgICAgaWYob2xkUnVsZVtpdGVtXS5uYW1lID09IG5hbWUpewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLljLnphY3miJDlip8sIOabtOaWsCBydWxlIDogIiwgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgb2xkUnVsZVtpdGVtXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJzZWFyY2hFbmdpbmVKdW1wRGF0YSIsZ2V0U2V0dGluZ0RhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBwYXJzZVVyaSAxLjIuMgogICAgICAgIC8vIChjKSBTdGV2ZW4gTGV2aXRoYW4gPHN0ZXZlbmxldml0aGFuLmNvbT4KICAgICAgICAvLyBNSVQgTGljZW5zZQogICAgICAgIHZhciBwYXJzZVVyaSA9IGZ1bmN0aW9uKHN0cikgewogICAgICAgICAgICB2YXIgbyA9IHBhcnNlVXJpLm9wdGlvbnMsCiAgICAgICAgICAgICAgICBtID0gby5wYXJzZXJbby5zdHJpY3RNb2RlID8gInN0cmljdCIgOiAibG9vc2UiXS5leGVjKHN0ciksCiAgICAgICAgICAgICAgICB1cmkgPSB7fSwKICAgICAgICAgICAgICAgIGkgPSAxNDsKCiAgICAgICAgICAgIHdoaWxlIChpLS0pIHVyaVtvLmtleVtpXV0gPSBtW2ldIHx8ICIiOwoKICAgICAgICAgICAgdXJpW28uZHMubmFtZV0gPSB7fTsKICAgICAgICAgICAgdXJpW28uZHMubmFtZV1bMF0gPSB7fTsKICAgICAgICAgICAgdXJpW28uZHMubmFtZV1bMF1bImtleSJdID0gKHVyaS5wcm90b2NvbCA/IHVyaS5wcm90b2NvbCA6ICJodHRwIikgKyAiOi8vIiArIHVyaS5ob3N0ICsgKHVyaS5wb3J0ID8gIjoiICsgdXJpLnBvcnQgOiAiIikgKyAiLyI7CiAgICAgICAgICAgIHVyaVtvLmRzLm5hbWVdWzBdWyJ2YWwiXSA9ICIvIjsKICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgIHZhciB0ZW1wc3ViID0gIi8iLAogICAgICAgICAgICAgICAgc3VicyA9IHVyaVtvLmtleVsxMF1dLnN1YnN0cigxKS5zcGxpdCgiLyIpOwogICAgICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IChzdWJzLmxlbmd0aCArIDEpOyBqKyssIGkrKykgewogICAgICAgICAgICAgICAgdGVtcHN1YiArPSB0ZW1wc3ViID09PSAiLyIgPyBzdWJzW2ldIDogIi8iICsgc3Vic1tpXTsKICAgICAgICAgICAgICAgIGlmIChzdWJzW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgdXJpW28uZHMubmFtZV1bal0gPSB7fTsKICAgICAgICAgICAgICAgICAgICB1cmlbby5kcy5uYW1lXVtqXVsia2V5Il0gPSBzdWJzW2ldOwogICAgICAgICAgICAgICAgICAgIHVyaVtvLmRzLm5hbWVdW2pdWyJ2YWwiXSA9IHRlbXBzdWI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHVyaVtvLnEubmFtZV0gPSB7fTsKICAgICAgICAgICAgdXJpW28ua2V5WzEyXV0ucmVwbGFjZShvLnEucGFyc2VyLCBmdW5jdGlvbigkMCwgJDEsICQyKSB7CiAgICAgICAgICAgICAgICBpZiAoJDEpIHVyaVtvLnEubmFtZV1bJDFdID0gJDI7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB1cmlbby5hcS5uYW1lXSA9IHt9OwogICAgICAgICAgICB1cmlbby5rZXlbMTNdXS5yZXBsYWNlKG8uYXEucGFyc2VyLCBmdW5jdGlvbigkMCwgJDEsICQyKSB7CiAgICAgICAgICAgICAgICBpZiAoJDEpIHVyaVtvLmFxLm5hbWVdWyQxXSA9ICQyOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiB1cmk7CiAgICAgICAgfTsKICAgICAgICBwYXJzZVVyaS5vcHRpb25zID0gewogICAgICAgICAgICBzdHJpY3RNb2RlOiBmYWxzZSwKICAgICAgICAgICAga2V5OiBbInNvdXJjZSIsICJwcm90b2NvbCIsICJhdXRob3JpdHkiLCAidXNlckluZm8iLCAidXNlciIsICJwYXNzd29yZCIsICJob3N0IiwgInBvcnQiLCAicmVsYXRpdmUiLCAicGF0aCIsICJkaXJlY3RvcnkiLCAiZmlsZSIsICJxdWVyeSIsICJhbmNob3IiXSwKICAgICAgICAgICAgcTogewogICAgICAgICAgICAgICAgbmFtZTogInF1ZXJ5S2V5IiwKICAgICAgICAgICAgICAgIHBhcnNlcjogLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGFxOiB7CiAgICAgICAgICAgICAgICBuYW1lOiAiYW5jaG9ycXVlcnlLZXkiLAogICAgICAgICAgICAgICAgcGFyc2VyOiAvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2cKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZHM6IHsKICAgICAgICAgICAgICAgIG5hbWU6ICJkaXJlY3RvcnlTdWIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBhcnNlcjogewogICAgICAgICAgICAgICAgc3RyaWN0OiAvXig/OihbXjpcLz8jXSspOik/KD86XC9cLygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykpPygoKCg/OltePyNcL10qXC8pKikoW14/I10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLywKICAgICAgICAgICAgICAgIGxvb3NlOiAvXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gZ2V0RWxlbWVudExlZnQoZWxlbWVudCl7CiAgICAgICAgICAgIHZhciBhY3R1YWxMZWZ0ID0gZWxlbWVudC5vZmZzZXRMZWZ0OwogICAgICAgICAgICB2YXIgY3VycmVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50OwogICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPT0gbnVsbCl7CiAgICAgICAgICAgICAgICBhY3R1YWxMZWZ0ICs9IGN1cnJlbnQub2Zmc2V0TGVmdDsKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm9mZnNldFBhcmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYWN0dWFsTGVmdDsKICAgICAgICB9OwogICAgICAgIC8vIGNvbnNvbGUubG9nKCJlbmdpbmVMaXN0OiAiLGVuZ2luZUxpc3QpOwogICAgICAgIC8veHBhdGgg6I635Y+W5Y2V5Liq5YWD57SgCiAgICAgICAgZnVuY3Rpb24gZ2V0RWxlbWVudEJ5WFBhdGgoeFBhdGgsIGNvbnRleHROb2RlLCBkb2MpIHsKICAgICAgICAgICAgZG9jID0gZG9jIHx8IGRvY3VtZW50OwogICAgICAgICAgICBjb250ZXh0Tm9kZSA9IGNvbnRleHROb2RlIHx8IGRvYzsKICAgICAgICAgICAgcmV0dXJuIGRvYy5ldmFsdWF0ZSh4UGF0aCwgY29udGV4dE5vZGUsIG51bGwsIDksIG51bGwpLnNpbmdsZU5vZGVWYWx1ZTsKICAgICAgICB9OwoKICAgICAgICAvLyDku47lh73mlbDkuK3ojrflj5blpJrooYzms6jph4rnmoTlrZfnrKbkuLIKICAgICAgICBmdW5jdGlvbiBnZXRNU3RyKGZuKSB7CiAgICAgICAgICAgIHZhciBmblNvdXJjZSA9IGZuLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHZhciByZXQgPSB7fTsKICAgICAgICAgICAgZm5Tb3VyY2UgPSBmblNvdXJjZS5yZXBsYWNlKC9eW157XSsvLCAnJyk7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGZuU291cmNlKTsKICAgICAgICAgICAgdmFyIG1hdGNoZWQ7CiAgICAgICAgICAgIHZhciByZWcgPSAvdmFyXHMrKFskXHddKylbXHNcU10qP1wvXCooW1xzXFNdKz8pXCpcLy9nOwogICAgICAgICAgICB3aGlsZSAobWF0Y2hlZCA9IHJlZy5leGVjKGZuU291cmNlKSkgewogICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cobWF0Y2hlZCk7CiAgICAgICAgICAgICAgICByZXRbbWF0Y2hlZFsxXV0gPSBtYXRjaGVkWzJdOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9OwoKICAgICAgICAvLyDkuovku7bmlK/mjIHmo4DmtYsuCiAgICAgICAgLy8g5q+U5aaCIGV2ZW50U3VwcG9ydGVkKCdmdWxsc2NyZWVuY2hhbmdlJywgZG9jdW1lbnQpOwogICAgICAgIGZ1bmN0aW9uIGV2ZW50U3VwcG9ydGVkKGV2ZW50TmFtZSwgZWxlbSkgewogICAgICAgICAgICBlbGVtID0gZWxlbSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgdmFyIHByZWZpeCA9IFsnbycsICdtcycsICdtb3onLCAnd2Via2l0JywgJyddOwoKICAgICAgICAgICAgdmFyIGwgPSBwcmVmaXgubGVuZ3RoOwogICAgICAgICAgICB2YXIgcEV2ZW50TmFtZTsKICAgICAgICAgICAgdmFyIGlzRnVuY3Rpb247CiAgICAgICAgICAgIHZhciBzZXRBdHRyOwoKICAgICAgICAgICAgd2hpbGUobCAtLSkgewogICAgICAgICAgICAgICAgcEV2ZW50TmFtZSA9ICdvbicgKyBwcmVmaXhbbF0gKyBldmVudE5hbWU7CgogICAgICAgICAgICAgICAgaWYgKHBFdmVudE5hbWUgaW4gZWxlbSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwRXZlbnROYW1lLnNsaWNlKDIpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbS5zZXRBdHRyaWJ1dGUgPT0gJ2Z1bmN0aW9uJykgeyAvLyBzZXRBdHRyaWJ1dGUg5piv5YWD57Sg6IqC54K555qE5pa55rOVCiAgICAgICAgICAgICAgICAgICAgc2V0QXR0ciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmICghZWxlbS5oYXNBdHRyaWJ1dGUocEV2ZW50TmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXR0ciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKHBFdmVudE5hbWUsICdyZXR1cm47Jyk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaXNGdW5jdGlvbiA9IHR5cGVvZiBlbGVtW3BFdmVudE5hbWVdID09ICdmdW5jdGlvbic7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZXRBdHRyKSBlbGVtLnJlbW92ZUF0dHJpYnV0ZShwRXZlbnROYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBFdmVudE5hbWUuc2xpY2UoMik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfTsKCiAgICAgICAgLy8g5L+d5a2Y5oyH5a6a5a+56LGh55u45YWz5pWw5o2uCiAgICAgICAgdmFyIGRhdGEgPSAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAndXNlIHN0cmljdCc7CgogICAgICAgICAgICB2YXIgY2FjaGUgPSB7CiAgICAgICAgICAgICAgICBvYmpzOiBbXSwKICAgICAgICAgICAgICAgIGRhdGE6IHt9LAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgZnVuY3Rpb24gZGF0YShvYmosIGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIHZhciBpZCA9IGNhY2hlLm9ianMuaW5kZXhPZihvYmopOwogICAgICAgICAgICAgICAgaWYgKGlkID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgaWQgPSBjYWNoZS5vYmpzLnB1c2gob2JqKSAtIDE7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKCFjYWNoZS5kYXRhW2lkXSkgey8v5Yid5aeL5YyWCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuZGF0YVtpZF0gPSB7fTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICd1bmRlZmluZWQnKSB7Ly8g5Y+W5YC8CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBrZXkgPT0gJ3VuZGVmaW5lZCcgPyBjYWNoZS5kYXRhW2lkXSA6IGNhY2hlLmRhdGFbaWRdW2tleV07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5kYXRhW2lkXVtrZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgfSkoKTsKCiAgICAgICAgLy8g5Li6bW91c2VsZWF2ZSBtb3VzZWVudGVy5LqL5Lu25YGa5Liq5YW85a65CiAgICAgICAgLy8g6ZyA6KaBIGV2ZW50U3VwcG9ydGVkLCBkYXRh5Ye95pWw5pSv5oyBCiAgICAgICAgdmFyIG1vdXNlRXZlbnRMaXN0ZW5lciA9IChmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICB2YXIgc3VwcG9ydCA9IHsKICAgICAgICAgICAgICAgIG1vdXNlbGVhdmUgOiBldmVudFN1cHBvcnRlZCgnbW91c2VsZWF2ZScpLAogICAgICAgICAgICAgICAgbW91c2VlbnRlciA6IGV2ZW50U3VwcG9ydGVkKCdtb3VzZWVudGVyJyksCiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgbWFwID0gewogICAgICAgICAgICAgICAgbW91c2VsZWF2ZSA6ICdtb3VzZW91dCcsCiAgICAgICAgICAgICAgICBtb3VzZWVudGVyIDogJ21vdXNlb3ZlcicsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgYWRkIDogZnVuY3Rpb24gKHR5cGUsIGVsZSwgY2FsbGJhY2spIHsgLy/kuovku7bnsbvlnoss5YWD57SgLOebkeWQrOWHveaVsAogICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0W3R5cGVdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNhbGxiYWNrLCBmYWxzZSk7IC8vbW91c2VsZWF2ZSxlbnRlcuS4jeWGkuazoSzmiYDku6XlnKjlhpLms6HpmLbmrrXnm5HlkKzkuovku7Ys5LiN6KaB5ouF5b+D5a2Q5a2Z5YWD57Sg6L+b5Ye65Y+R55Sf55qE5LqL5Lu25YaS5rOh5LiK5p2l44CCCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gZGF0YShjYWxsYmFjaywgJ21vdXNlRUxMaXN0ZW5lcicpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpc3RlbmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0ZWRUYXJnZXQgPSBlLnJlbGF0ZWRUYXJnZXQ7IC8vbW91c2VvdXQs5Y675b6A55qE5YWD57SgO21vdXNlb3ZlcizmnaXoh6rnmoTlhYPntKAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDlvZNtb3VzZW91dO+8iOemu+W8gGVsZe+8ieWOu+W+gOeahOWFg+e0oOS4jeaYr+iHquW3seeahOWtkOWtmeWFg+e0oAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOW9k21vdXNlb3Zlcu+8iOi/m+WFpWVsZe+8ieadpeiHqueahOWFg+e0oOS4jeaYr+iHquW3seeahOWtkOWtmeWFg+e0oAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxlLmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpKSB7IC8vIGNvbnRhaW5z5Ye95pWwLOiHquW3sS5jb250YWlucyjoh6rlt7EpIOi/lOWbnnRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbChlbGUsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YShjYWxsYmFjaywgJ21vdXNlRUxMaXN0ZW5lcicsIGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5hZGRFdmVudExpc3RlbmVyKG1hcFt0eXBlXSwgbGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVtb3ZlIDogZnVuY3Rpb24gKHR5cGUsIGVsZSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydFt0eXBlXSkgewogICAgICAgICAgICAgICAgICAgICAgICBlbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaywgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5yZW1vdmVFdmVudExpc3RlbmVyKG1hcFt0eXBlXSwgZGF0YShjYWxsYmFjaywgJ21vdXNlRUxMaXN0ZW5lcicpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICB9KSgpOwoKICAgICAgICAvL+iOt+WPluW3sua7muWKqOeahOi3neemuwogICAgICAgIGZ1bmN0aW9uIGdldFNjcm9sbGVkKGNvbnRhaW5lcikgewogICAgICAgICAgICBpZiAoY29udGFpbmVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHg6Y29udGFpbmVyLnNjcm9sbExlZnQsCiAgICAgICAgICAgICAgICAgICAgeTpjb250YWluZXIuc2Nyb2xsVG9wLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHg6ICdzY3JvbGxYJyBpbiB3aW5kb3cgPyB3aW5kb3cuc2Nyb2xsWCA6ICgncGFnZVhPZmZzZXQnIGluIHdpbmRvdyA/IHdpbmRvdy5wYWdlWE9mZnNldCA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCksCiAgICAgICAgICAgICAgICB5OiAnc2Nyb2xsWScgaW4gd2luZG93ID8gd2luZG93LnNjcm9sbFkgOiAoJ3BhZ2VZT2Zmc2V0JyBpbiB3aW5kb3cgPyB3aW5kb3cucGFnZVlPZmZzZXQgOiAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCksCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gZ2V0RWxlbWVudChzZWxlY3RvcikgewogICAgICAgICAgICBpZiAoc2VsZWN0b3IuaW5kZXhPZignY3NzOycpID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yLnNsaWNlKDQpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBnZXRFbGVtZW50QnlYUGF0aChzZWxlY3Rvcik7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gbW91c2Vkb3duaGFuZGxlcihlKSB7CiAgICAgICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDsKCiAgICAgICAgICAgIHRhcmdldCA9IGdldEVsZW1lbnRCeVhQYXRoKCdhbmNlc3Rvci1vci1zZWxmOjphW2NvbnRhaW5zKEBjbGFzcywgInNlai1lbmdpbmUiKV0nLCB0YXJnZXQpOwoKICAgICAgICAgICAgLy8gaWYgKCF0YXJnZXQgfHwgdGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCdzZWotZW5naW5lJykgPT0gLTEpIHJldHVybjsKICAgICAgICAgICAgLy8g5p+Q5Lqb572R56uZ6Ie05LiL5pa555qEdGhpc+aXoOazlei+vuWIsOWOn+acrOeahOaViOaenCwg5L6LIGh0dHBzOi8vb3JpZ2VuYXBlbGxpZG8uY29tL2FwZWxsaWRvLWdhdmlyYS8KICAgICAgICAgICAgLy8gaWYgKCF0YXJnZXQgfHwgIXRoaXMuY29udGFpbnModGFyZ2V0KSkgcmV0dXJuOwogICAgICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuOyAgCgogICAgICAgICAgICB2YXIgdmFsdWU7CiAgICAgICAgICAgIGlmICh0eXBlb2YgaUlucHV0ID09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gaUlucHV0KCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoaUlucHV0Lm5vZGVOYW1lID09ICdJTlBVVCcpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGlJbnB1dC52YWx1ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpSW5wdXQudGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8g5aaC5p6c5pCc57Si5YaF5a655piv6YCa6L+H5p+Q5LiA572R56uZ5pCc57SiLCDlsLHljrvmjonjgIIg5L6LOiAwIHNpdGU6emhpaHUuY29tICDlj6rkv53nlZkwLCDlkI7pnaLnmoTnvZHnq5nkvJrljrvmjokKICAgICAgICAgICAgaWYoIWdldFNldHRpbmdEYXRhLkhpZGVUaGVTYW1lTGluayl7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL3NpdGVbXlxzXSsvLCAiIik7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvLyDnvJbnoIEg6Kej56CBCiAgICAgICAgICAgICAgIC8vIOWvueaQnOe0ouivjee8lueggSAo5pyq5YGa6Kej56CB5aSE55CG77yM5rWP6KeI5Zmo6Ieq5Yqo5aSE55CGKSDnvZHnq5kxNjg46YeH55SoZ2Jr57yW56CBCiAgICAgICAgICAgIHZhciBvZ2JrID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZ2JrJyk7CiAgICAgICAgICAgIGlmIChvZ2JrKXsKICAgICAgICAgICAgICAgIHZhbHVlID0gdG9HQksodmFsdWUpCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gLy8gQG5hbWUgICAgIHNlYXJjaEVuZ2luZUp1bXAtTmV4dFN0YWdlCiAgICAgICAgICAgIC8vIGlmIChkb2N1bWVudC5jaGFyYWN0ZXJTZXQgIT0gIlVURi04IikgdmFsdWUgPSBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpOwoKICAgICAgICAgICAgdmFyIHRhcmdldFVSTCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ3VybCcpOwoKICAgICAgICAgICAgLy8g5LiA6ZSu5pCc57SiCiAgICAgICAgICAgIGlmKGdldFNldHRpbmdEYXRhLmFsbE9wZW4gJiYgdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygic2VqLWRyb3AtbGlzdC10cmlnZ2VyIikpewogICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBlbmdpbmVMaXN0W3RhcmdldC5kYXRhc2V0LmlxeGluY2F0ZWdvcnldCiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiYWxsT3BlbiIpCiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhsaXN0KQoKICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8bGlzdC5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgICAgICAgICBpZiAobGlzdFtpXS51cmwuaW5kZXhPZigic2l0ZToiKTwwICYmIG1hdGNoZWRSdWxlPy51cmwudGVzdChsaXN0W2ldLnVybCkpIGNvbnRpbnVlIDsKICAgICAgICAgICAgICAgICAgICBpZiAobGlzdFtpXS5kaXNhYmxlKSBjb250aW51ZSA7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhyZWYgPSBsaXN0W2ldLnVybC5yZXBsYWNlQWxsKCclcycsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBHTV9vcGVuSW5UYWIoaHJlZikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoIm9uY2xpY2siLCJyZXR1cm4gZmFsc2U7Iik7CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIC8vIOWmguaenOaciXBvc3Tor7fmsYIKICAgICAgICAgICAgdmFyIHBvc3RTaWduID0gdGFyZ2V0VVJMLmluZGV4T2YoJyRwb3N0JCcpOwogICAgICAgICAgICBpZih+cG9zdFNpZ24pewogICAgICAgICAgICAgICAgdmFyIGY9Z2V0UG9zdEZvcm1IVE1MKHRhcmdldFVSTC5zdWJzdHJpbmcoMCxwb3N0U2lnbiksW3RhcmdldFVSTC5zdWJzdHJpbmcocG9zdFNpZ24rNiksdmFsdWVdLHRhcmdldC5nZXRBdHRyaWJ1dGUoJ3RhcmdldCcpKQogICAgICAgICAgICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKGYpCiAgICAgICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCJvbmNsaWNrIiwidGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZm9ybScpWzBdLnN1Ym1pdCgpO3JldHVybiBmYWxzZTsiKTsKCiAgICAgICAgICAgICAgICAvLyB2YXIgcG9zdFVSTCA9IHBhcnNlVXJpKHRhcmdldC5nZXRBdHRyaWJ1dGUoJ3VybCcpKTsKICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHBvc3RVUkwpOwogICAgICAgICAgICAgICAgLy8gdGFyZ2V0LnNldEF0dHJpYnV0ZSgib25jbGljayIsInJldHVybiBmYWxzZTsiKTsKICAgICAgICAgICAgICAgIC8vIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgICAgIC8vICAgICBtZXRob2Q6ICJwb3N0IiwKICAgICAgICAgICAgICAgIC8vICAgICB1cmw6IHRhcmdldC51cmwsCiAgICAgICAgICAgICAgICAvLyAgICAgZGF0YTogdGFyZ2V0VVJMLnN1YnN0cmluZyhwb3N0U2lnbiArIDYpICsgJz0nICsgdmFsdWUgLAogICAgICAgICAgICAgICAgLy8gICAgIGdldCBkYXRhKCkgewogICAgICAgICAgICAgICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTsKICAgICAgICAgICAgICAgIC8vICAgICB9LAogICAgICAgICAgICAgICAgLy8gICAgIHNldCBkYXRhKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuX2RhdGEgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIC8vICAgICB9LAogICAgICAgICAgICAgICAgLy8gICAgIGhlYWRlcnM6ICB7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKICAgICAgICAgICAgICAgIC8vICAgICAgICAgIk9yaWdpbiI6cG9zdFVSTC5ob3N0LAogICAgICAgICAgICAgICAgLy8gICAgICAgICAiUmVmZXJlciI6cG9zdFVSTC5ob3N0CiAgICAgICAgICAgICAgICAvLyAgICAgfSwKICAgICAgICAgICAgICAgIC8vICAgICBvbmxvYWQ6IGZ1bmN0aW9uKHJlcyl7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGlmKHJlcy5zdGF0dXMgPT09IDIwMCl7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBjb25zb2xlLmxvZygn5oiQ5YqfJykKICAgICAgICAgICAgICAgIC8vICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBjb25zb2xlLmxvZygn5aSx6LSlJykKICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcykKICAgICAgICAgICAgICAgIC8vICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gICAgIH0sCiAgICAgICAgICAgICAgICAvLyAgICAgb25lcnJvciA6IGZ1bmN0aW9uKGVycil7CiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvcicpCiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGVycikKICAgICAgICAgICAgICAgIC8vICAgICB9CiAgICAgICAgICAgICAgICAvLyB9KTsKCiAgICAgICAgICAgIH0gZWxzZXsKICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codmFsdWUpOwogICAgICAgICAgICAgICAgdGFyZ2V0LmhyZWYgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCd1cmwnKS5yZXBsYWNlQWxsKCclcycsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZihzZWxlY3RTZWFyY2hNb2RlKXsKICAgICAgICAgICAgICAgIHRhcmdldC50YXJnZXQ9Il9ibGFuayI7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgICAvL+iOt+WPliAgUE9TVCDnmoTooajljZXnmoQgSFRNTAogICAgICAgIGZ1bmN0aW9uIGdldFBvc3RGb3JtSFRNTCh1cmwsIHZhbHVlLCBuZXdUYWIpIHsKICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh1cmwsdmFsdWUsbmV3VGFiKQogICAgICAgICAgICB2YXIgb3NwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgICAgIG9zcGFuLnN0eWxlLmNzc1RleHQgPSAnd2lkdGg6MHB4O2hlaWdodDowcHg7JzsKICAgICAgICAgICAgdmFyIGZvcm0gPSAiIiArCiAgICAgICAgICAgICAgICAiPGZvcm0gbWV0aG9kPSdwb3N0JyIgKwogICAgICAgICAgICAgICAgIiBhY3Rpb249JyIgKyB1cmwgKyAiJyIgKwogICAgICAgICAgICAgICAgKG5ld1RhYiA/ICIgdGFyZ2V0PSdfYmxhbmsnIiA6ICIiKSArCiAgICAgICAgICAgICAgICAiPiIgKwogICAgICAgICAgICAgICAgIjxpbnB1dCB0eXBlPSdoaWRkZW4nIiArCiAgICAgICAgICAgICAgICAgICAgIiBuYW1lPSciICsgdmFsdWVbMF0gKyAiJyIgKwogICAgICAgICAgICAgICAgICAgICIgdmFsdWU9JyIgKyB2YWx1ZVsxXSArICInIiArCiAgICAgICAgICAgICAgICAgICAgIiAvPiIgKwogICAgICAgICAgICAgICAgIjwvZm9ybT4iOwogICAgICAgICAgICBvc3Bhbi5pbm5lckhUTUwgPSBmb3JtOwogICAgICAgICAgICByZXR1cm4gb3NwYW47CiAgICAgICAgfTsKCiAgICAgICAgLy8g5ruR6K+N5pCc57SiCiAgICAgICAgZnVuY3Rpb24gc2VsZWN0U2VhcmNoKGUpewogICAgICAgICAgICAvLyBjb25zb2xlLmxvZygi5ruR6K+N5pCc57SiIik7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHdpbmRvdy5nZXRTZWxlY3Rpb24oKSk7CiAgICAgICAgICAgIGxldCBzZWxlY3RUZXh0ID0gd2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGxldCBzZWpDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc2VqLWNvbnRhaW5lciIpOwogICAgICAgICAgICBpZihtYXRjaGVkUnVsZSkgcmV0dXJuOyAvLyDor6XnlYzpnaLlt7Lnu4/ljLnphY3liLDnm7jlhbPop4TliJksIOivtOaYjuaYr+WcqOaQnOe0oue9keermeeahOaQnOe0oueVjOmdogogICAgICAgICAgICBpZihlLmJ1dHRvbiAhPTApIHJldHVybjsgICAgLy8g5o6S6Zmk6Z2e5bem6ZSu54K55Ye7CiAgICAgICAgICAgIGlmIChzZWxlY3RUZXh0Lmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgICAgIGlmKHNlakNvbnRhaW5lcil7CiAgICAgICAgICAgICAgICAgICAgc2VqQ29udGFpbmVyLnN0eWxlLnRvcCA9ICItNTBweCI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH07IAoKICAgICAgICAgICAgLy8gaWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT0gIklOUFVUIiAKICAgICAgICAgICAgLy8gfHwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT0gIlRFWFRBUkVBIikgcmV0dXJuOyAgIC8vIOaOkumZpGlucHXlkox0ZXh0YXJlYeWGheeahOaWh+acrAoKICAgICAgICAgICAgaVRhcmdldCA9IGRvY3VtZW50LmJvZHk7CiAgICAgICAgICAgIGlUYXJnZXRXaGVyZSA9ICJiZWZvcmVlbmQiOwogICAgICAgICAgICBpSW5wdXQgPSB7fTsKICAgICAgICAgICAgaUlucHV0LnRleHRDb250ZW50ID0gc2VsZWN0VGV4dDsKICAgICAgICAgICAgaWYoc2VqQ29udGFpbmVyKXsKICAgICAgICAgICAgICAgIHNlakNvbnRhaW5lci5zdHlsZS50b3AgPSAiMHB4IjsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgc2VsZWN0U2VhcmNoTW9kZSA9IHRydWU7CiAgICAgICAgICAgIAogICAgICAgICAgICBhZGRTRUooKQogICAgICAgIH0KCiAgICAgICAgbGV0IGlUYXJnZXRXaGVyZTsgICAvLyDlpoLkvZXmj5LlhaUKICAgICAgICBsZXQgaVRhcmdldDsgICAgLy8g5o+S5YWl5L2N572uCiAgICAgICAgbGV0IGlJbnB1dDsgLy8g5pCc57Si6K+NCiAgICAgICAgbGV0IHNlbGVjdFNlYXJjaE1vZGUgPSBmYWxzZTsKICAgICAgICAvLyDmu5Hor43mkJzntKIKICAgICAgICBpZihnZXRTZXR0aW5nRGF0YS5zZWxlY3RTZWFyY2gpewogICAgICAgICAgICBkb2N1bWVudC5vbm1vdXNldXAgPSBzZWxlY3RTZWFyY2g7CiAgICAgICAgfQoKICAgICAgICAvLyBpZnJhbWUg56aB5q2i5Yqg6L29CiAgICAgICAgaWYgKHdpbmRvdy5zZWxmICE9IHdpbmRvdy50b3ApIHJldHVybjsKCiAgICAgICAgLy8g5YeG5aSH5b6A6aG16Z2i5o+S5YWl5YiX6KGoIAogICAgICAgIHZhciB1cmwgPSBsb2NhdGlvbi5ocmVmOwogICAgICAgIHZhciBtYXRjaGVkUnVsZTsKICAgICAgICB2YXIgbWFyY2hlZFNpZ247CgogICAgICAgIC8v5YWI5Yik5pat55So5oi36KeE5YiZCiAgICAgICAgbWFyY2hlZFNpZ24gPSBnZXRTZXR0aW5nRGF0YS5ydWxlcy5zb21lKGZ1bmN0aW9uIChydWxlKSB7CiAgICAgICAgICAgIGlmKHR5cGVvZihydWxlLnVybCk9PSJzdHJpbmciKXsgICAgIC8vIDIwMjAtMTItMTkgdG9kbzogIOmHjeaWsOWvvOWFpeeUqOaIt+mFjee9ruaWh+S7tuWQjiwg5Lya6Kej5p6Q6ZSZ6K+v55qE6Zeu6aKY44CCIOaYr+eUseS6jueUqOaIt+S/neWtmOeahHJ1bGUudXJs55Sx5a2X56ym5Liy5Y+Y5oiQ5LqG56m65a+56LGhe30s5YW35L2T5Zyo5LuA5LmI5oOF5Ya15LiL5Lya5a+86Ie05Y+Y5oiQ56m65a+56LGhLOW5tuacquaOkuafpQogICAgICAgICAgICAgICAgcnVsZS51cmwgPSBuZXcgUmVnRXhwKHJ1bGUudXJsLnN1YnN0cmluZygxLHJ1bGUudXJsLmxlbmd0aC0xKSk7CiAgICAgICAgICAgICAgICBpZiAocnVsZS51cmwudGVzdCh1cmwpKSB7CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFJ1bGUgPSBydWxlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBjb25zb2xlLmxvZyhtYXJjaGVkU2lnbixtYXRjaGVkUnVsZSk7CiAgICAgICAgaWYoIW1hcmNoZWRTaWduKXsKICAgICAgICAgICAgcnVsZXMuc29tZShmdW5jdGlvbiAocnVsZSkgewogICAgICAgICAgICAgICAgaWYgKHJ1bGUudXJsLnRlc3QodXJsKSkgewogICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSdWxlID0gcnVsZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFtYXRjaGVkUnVsZSB8fCAhbWF0Y2hlZFJ1bGUuZW5hYmxlZCkgcmV0dXJuOwoKICAgICAgICAvLyB2YXIgaVRhcmdldCA9IGdldEVsZW1lbnQobWF0Y2hlZFJ1bGUuaW5zZXJ0SW50b0RvYy50YXJnZXQpOwogICAgICAgIGlUYXJnZXQgPSB0eXBlb2YgbWF0Y2hlZFJ1bGUuaW5zZXJ0SW50b0RvYy50YXJnZXQgPT0gImZ1bmN0aW9uIiA/IG1hdGNoZWRSdWxlLmluc2VydEludG9Eb2MudGFyZ2V0KCkgOiBnZXRFbGVtZW50KG1hdGNoZWRSdWxlLmluc2VydEludG9Eb2MudGFyZ2V0KTsKICAgICAgICBpSW5wdXQgPSB0eXBlb2YgbWF0Y2hlZFJ1bGUuaW5zZXJ0SW50b0RvYy5rZXl3b3JkID09ICdmdW5jdGlvbicgPyBtYXRjaGVkUnVsZS5pbnNlcnRJbnRvRG9jLmtleXdvcmQgOiBnZXRFbGVtZW50KG1hdGNoZWRSdWxlLmluc2VydEludG9Eb2Mua2V5d29yZCk7CgogICAgICAgIC8vL3Rlc3QgLS0tLS0tLS0tLS0tLS0g5rWL6K+VIHN0YXJ0CiAgICAgICAgLy8gY29uc29sZS5sb2coInNlYXJjaEVuZ2luZUp1bXAgdGVzdCBpVGFyZ2V0LCBpSW5wdXQ6ICIsaVRhcmdldCwgaUlucHV0KTsKICAgICAgICAvLy90ZXN0IC0tLS0tLS0tLS0tLS0tIOa1i+ivlSBlbmQKCiAgICAgICAgaWYgKCFpVGFyZ2V0IHx8ICFpSW5wdXQpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coIuiEmuacrCBzZWFyY2hFbmdpbmVKdW1wIOaQnOe0ouW8leaTjuW/q+aNt+i3s+i9rCDpgYfliLDkuobplJnor6/vvJogIik7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCLnm67moIfmnInor6/vvJpcbiBpVGFyZ2V077yaIiArIGlUYXJnZXQgKyAiXG5pSW5wdXQoa2V5d29yZCk6ICIgKyBpSW5wdXQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlUYXJnZXRXaGVyZSA9IG1hdGNoZWRSdWxlLmluc2VydEludG9Eb2Mud2hlcmUudG9Mb3dlckNhc2UoKTsKICAgICAgICBhZGRTRUooKQogICAgICAgIGZ1bmN0aW9uIGFkZFNFSigpewoKICAgICAgICAgICAgLy8g5pCc57Si5YiX6KGo55qE5qC35byPKOatpOWkhOayoeaciSDigJzorr7nva7igJ0g55qEY3Nz5qC35byPKQogICAgICAgICAgICBsZXQgc3R5bGVUZXh0ID0gIiI7CiAgICAgICAgICAgIC8vIOmFjeiJsgogICAgICAgICAgICBzdHlsZVRleHQgKz0gYAogICAgICAgICAgICAgICAgYm9keSB7CiAgICAgICAgICAgICAgICAgICAgLS1mb250LWNvbG9yLXF4aW46IzMzMzsKCiAgICAgICAgICAgICAgICAgICAgLS1iYWNrZ3JvdW5kLWF2dGl2ZS1jb2xvci1xeGluOiAjY2NjOwogICAgICAgICAgICAgICAgICAgIC0tYmFja2dyb3VuZC1hY3RpdmUtZW5hYmxlLXF4aW46I2NmZjlmZjsKICAgICAgICAgICAgICAgICAgICAtLWJhY2tncm91bmQtYWN0aXZlLWRpc2FibGUtcXhpbjojZmZhMmEyOwogICAgICAgICAgICAgICAgICAgIC0tYmFja2dyb3VuZC1ob3Zlci1jb2xvci1xeGluOiAjRUFFQUVBOwogICAgICAgICAgICAgICAgICAgIC0tdHJpZ2dlci1zaG93bi1xeGluOiAjREVFREZGICFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgLS1zZWotZHJvcC1saXN0LWJhY2tncm91bmQtcXhpbjpyZ2JhKDI1NSwyNTUsMjU1LDAuNyk7CiAgICAgICAgICAgICAgICAgICAgLS1iYWNrZ3JvdW5kLWJ0bi1xeGluOiNFRkY0Rjg7CiAgICAgICAgICAgICAgICAgICAgLS1iYWNrZ3JvdW5kLXNldHRpbmctcXhpbjojZmZmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYm9keVtxeGludGhlbWU9ImRhcmsiXSB7CiAgICAgICAgICAgICAgICAgICAgLS1mb250LWNvbG9yLXF4aW46I0JEQzFCQzsKICAgICAgICAgICAgICAgICAgICAtLWJhY2tncm91bmQtY29sb3ItcXhpbjogIzIwMjEyNDsKICAgICAgICAgICAgICAgICAgICAtLWJhY2tncm91bmQtYXZ0aXZlLWNvbG9yLXF4aW46ICM0MjQyNDI7CiAgICAgICAgICAgICAgICAgICAgLS1iYWNrZ3JvdW5kLWFjdGl2ZS1lbmFibGUtcXhpbjojMjc0MTQ0OwogICAgICAgICAgICAgICAgICAgIC0tYmFja2dyb3VuZC1hY3RpdmUtZGlzYWJsZS1xeGluOiM1ODM1MzU7CiAgICAgICAgICAgICAgICAgICAgLS1iYWNrZ3JvdW5kLWhvdmVyLWNvbG9yLXF4aW46ICM0MjQyNDI7CiAgICAgICAgICAgICAgICAgICAgLS10cmlnZ2VyLXNob3duLXF4aW46ICM0MjQyNDIgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICAtLXNlai1kcm9wLWxpc3QtYmFja2dyb3VuZC1xeGluOnJnYmEoMCwwLDAsMC43KTsKICAgICAgICAgICAgICAgICAgICAtLWJhY2tncm91bmQtYnRuLXF4aW46IzI5MmYzNjsKICAgICAgICAgICAgICAgICAgICAtLWJhY2tncm91bmQtc2V0dGluZy1xeGluOiMyMDIxMjQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBgCiAgICAgICAgICAgIC8vIOaQnOe0ouWIl+ihqOeahOagt+W8jwogICAgICAgICAgICBzdHlsZVRleHQgKz0gYAogICAgICAgICAgICAgICAgI3Nlai1jb250YWluZXIgewogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiAyOwogICAgICAgICAgICAgICAgICAgIC8vIHBhZGRpbmc6IDFweCA1cHggMXB4IDVweDsKICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogYXJpYWwsc2Fucy1zZXJpZjsKICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiB0b3AgY2VudGVyOwogICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogc2Vqb3BlbiAwLjJzOwogICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7CiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogNHB4OwogICAgICAgICAgICAgICAgICAgIGNvbG9yOnZhcigtLWZvbnQtY29sb3ItcXhpbik7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmFja2dyb3VuZC1jb2xvci1xeGluKTsKICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2l0aW9uOjAuM3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiDmu5Hor43mkJzntKLmoLflvI8gKi8KICAgICAgICAgICAgICAgICNzZWotY29udGFpbmVyLnNlbGVjdFNlYXJjaHsKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpmaXhlZDsKICAgICAgICAgICAgICAgICAgICB0b3A6MDsKICAgICAgICAgICAgICAgICAgICBsZWZ0OjA7CiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6MDsKICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiA5OTk5OTsKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogMC4zczsKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmYmE7CiAgICAgICAgICAgICAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDI1cHgpOwogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDVweCAwOwogICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IDJweCAycHggMTBweCAjZWVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNlbGVjdFNlYXJjaCAuc2VqLWVuZ2luZXsKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDo1cHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjc2VqLWNvbnRhaW5lciBhewogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6MnB4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgI3Nlai1leHBhbmRlZC1jYXRlZ29yeSB7CiAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnNlai1lbmdpbmUgewogICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyOwogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDAgMHB4IDAgMDsKICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMCA4cHg7CiAgICAgICAgICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OjUwMDsKICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2UtaW4tb3V0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLnNlai1kcm9wLWxpc3QgYTp2aXNpdGVkLAogICAgICAgICAgICAgICAgLnNlai1kcm9wLWxpc3QgYTpob3ZlciwKICAgICAgICAgICAgICAgIC5zZWotZW5naW5lIGE6dmlzaXRlZCwKICAgICAgICAgICAgICAgIC5zZWotZW5naW5lIGE6aG92ZXIsCiAgICAgICAgICAgICAgICAjc2VqLWNvbnRhaW5lciBhOmxpbmssCiAgICAgICAgICAgICAgICAjc2VqLWNvbnRhaW5lciBhOnZpc2l0ZWQsCiAgICAgICAgICAgICAgICAjc2VqLWNvbnRhaW5lciBhOmhvdmVyewogICAgICAgICAgICAgICAgICAgIGNvbG9yOnZhcigtLWZvbnQtY29sb3ItcXhpbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2VqLWVuZ2luZTpob3ZlciB7CiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZC1ob3Zlci1jb2xvci1xeGluKTsKICAgICAgICAgICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2VqLWRyb3AtbGlzdCA+IC5zZWotZW5naW5lOmhvdmVyIHsKICAgICAgICAgICAgICAgICAgICAvLyBiYWNrZ3JvdW5kLWNvbG9yOiAjREVFREZGOwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJhY2tncm91bmQtaG92ZXItY29sb3ItcXhpbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAuc2VqLWRyb3AtbGlzdCA+IC5zZWotZW5naW5lIHsKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXRvcDogNHB4OwogICAgICAgICAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiA0cHg7CiAgICAgICAgICAgICAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czo0cHg7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLnNlai1lbmdpbmUtaWNvbiB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMDsKICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDAgM3B4IDAgMDsKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC1ib3R0b207CiAgICAgICAgICAgICAgICAgICAgYm94LXNpemluZzp1bnNldDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAuc2VqLWRyb3AtbGlzdCB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICAgICAgICAgICAgICAgIHRvcDogLTEwMDAwcHg7CiAgICAgICAgICAgICAgICAgICAgbGVmdDogMDsKICAgICAgICAgICAgICAgICAgICBtaW4td2lkdGg6IDkwcHg7CiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogNXB4IDA7CiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgICAgICAgICAgICAgLW1vei1ib3gtc2hhZG93OiAxcHggMXB4IDVweCAjOTk5OwogICAgICAgICAgICAgICAgICAgIC13ZWJraXQtYm94LXNoYWRvdzogMnB4IDJweCA1cHggIzk5OTsKICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAycHggMnB4IDVweCAjOTk5OwogICAgICAgICAgICAgICAgICAgIC8vIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsLjcpOwogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNlai1kcm9wLWxpc3QtYmFja2dyb3VuZC1xeGluKTsKICAgICAgICAgICAgICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoN3B4KTsKICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4OwogICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDsKICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZS1pbi1vdXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvcCAwLjJzIGVhc2UtaW4tb3V0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQGtleWZyYW1lcyBzZWpvcGVuIHsKICAgICAgICAgICAgICAgICAgICAwJSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMC4xKTsKICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgMTAwJSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQGtleWZyYW1lcyBpcXhpbnNlam9wZW4gewogICAgICAgICAgICAgICAgICAgIDAlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjAxLCAwLjAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgMTAwJSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBgCgogICAgICAgICAgICAvLyDlt6XlhbfliJfooajliqjnlLsKICAgICAgICAgICAgaWYoIWdldFNldHRpbmdEYXRhLnRyYW5zdGlvbil7CiAgICAgICAgICAgICAgICBzdHlsZVRleHQgKz0gYAogICAgICAgICAgICAgICAgICAgIC5zZWotZW5naW5lLAogICAgICAgICAgICAgICAgICAgIC5zZWotZHJvcC1saXN0LXRyaWdnZXIsCiAgICAgICAgICAgICAgICAgICAgLnNlai1kcm9wLWxpc3R7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246bm9uZSFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICNzZWotY29udGFpbmVyewogICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246bm9uZSFpbXBvcnRhbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC5zZWotZHJvcC1saXN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgYmFja2Ryb3AtZmlsdGVyOm5vbmUhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYAogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIOmakOiXj+eureWktAogICAgICAgICAgICAvLyBpZihnZXRTZXR0aW5nRGF0YS5pY29uKXsKICAgICAgICAgICAgLy8gICAgIHN0eWxlVGV4dCArPSBgCiAgICAgICAgICAgIC8vICAgICAgICAgLnNlai1kcm9wLWxpc3QtdHJpZ2dlci1zaG93biB7CiAgICAgICAgICAgIC8vICAgICAgICAgICAgIC8qIGJhY2tncm91bmQtY29sb3I6ICNERUVERkYgIWltcG9ydGFudDsgKi8KICAgICAgICAgICAgLy8gICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdHJpZ2dlci1zaG93KQogICAgICAgICAgICAvLyAgICAgICAgIH0KICAgICAgICAgICAgLy8gICAgICAgICAuc2VqLWRyb3AtbGlzdC10cmlnZ2VyOjphZnRlciB7CiAgICAgICAgICAgIC8vICAgICAgICAgICAgIC8qIGNvbnRlbnQ6ICcnOyAqLwogICAgICAgICAgICAvLyAgICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICAgIC8vICAgICAgICAgICAgIG1hcmdpbjogMCAwIDAgM3B4OwogICAgICAgICAgICAvLyAgICAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgICAvLyAgICAgICAgICAgICB3aWR0aDogMDsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgaGVpZ2h0OiAwOwogICAgICAgICAgICAvLyAgICAgICAgICAgICBib3JkZXItdG9wOiA2cHggc29saWQgI0JDQkNCQzsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDBweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4zcyBlYXNlLWluLW91dDsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuM3MgZWFzZS1pbi1vdXQ7CiAgICAgICAgICAgIC8vICAgICAgICAgfQogICAgICAgICAgICAvLyAgICAgICAgIC5zZWotZHJvcC1saXN0LXRyaWdnZXItc2hvd246OmFmdGVyIHsKICAgICAgICAgICAgLy8gICAgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgICAgICAgICAvLyAgICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgICAgICAgICAvLyAgICAgICAgIH0KICAgICAgICAgICAgLy8gICAgIGAKICAgICAgICAgICAgLy8gfWVsc2V7CiAgICAgICAgICAgIC8vICAgICBzdHlsZVRleHQgKz0gYAogICAgICAgICAgICAvLyAgICAgICAgIC5zZWotZHJvcC1saXN0LXRyaWdnZXIgewogICAgICAgICAgICAvLyAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6OHB4OwogICAgICAgICAgICAvLyAgICAgICAgIH0KICAgICAgICAgICAgLy8gICAgIGAKICAgICAgICAgICAgLy8gfQogICAgICAgICAgICBHTV9hZGRTdHlsZShzdHlsZVRleHQpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIOWknOmXtOaooeW8jwogICAgICAgICAgICBsZXQgc2NoZW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ21ldGEnKVsnY29sb3Itc2NoZW1lJ10KICAgICAgICAgICAgaWYoc2NoZW1lKXsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLmkJzntKLliLDnm7jlhbPpgInpobksICIsIHNjaGVtZS5jb250ZW50KTsKICAgICAgICAgICAgICAgIGlmKHNjaGVtZS5jb250ZW50PT0iZGFyayIpewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLorr7nva7kuLrlpJzpl7TmqKHlvI8iKTsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnNldEF0dHJpYnV0ZSgicXhpbnRoZW1lIiwiZGFyayIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAvLyDliJfooajlr7nosaEKICAgICAgICAgICAgZnVuY3Rpb24gRHJvcERvd25MaXN0KGEsIGxpc3QpIHsKICAgICAgICAgICAgICAgIHRoaXMuYSA9IGE7CiAgICAgICAgICAgICAgICB0aGlzLmxpc3QgPSBsaXN0OwogICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIERyb3BEb3duTGlzdC56SW5kZXggPSAxMDAwMDAwMDA7CiAgICAKICAgICAgICAgICAgRHJvcERvd25MaXN0LnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgICAgIGhpZGRlbjogdHJ1ZSwKICAgICAgICAgICAgICAgIHNob3dEZWxheTogMjMzLAogICAgICAgICAgICAgICAgaGlkZURlbGF5OiAyMzMsCiAgICAgICAgICAgICAgICBhU2hvd25DbGFzczogJ3Nlai1kcm9wLWxpc3QtdHJpZ2dlci1zaG93bicsCiAgICAKICAgICAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMuYTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IHRoaXMubGlzdDsKICAgIAogICAgICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgIAogICAgICAgICAgICAgICAgICAgIC8vIOWFs+mXreWKqOeUuwogICAgICAgICAgICAgICAgICAgIGlmKCFnZXRTZXR0aW5nRGF0YS50cmFuc3Rpb24pewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dEZWxheSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZURlbGF5ID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgICAgICAgICAvLyDov5vlhaXmmL7npLoKICAgICAgICAgICAgICAgICAgICBtb3VzZUV2ZW50TGlzdGVuZXIuYWRkKCdtb3VzZWVudGVyJywgYSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5oaWRlVGltZXJJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5oaWRkZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd1RpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNlbGYuc2hvd0RlbGF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZSA9IGxpc3Quc3R5bGU7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUudG9wID0gcGFyc2VJbnQobGlzdC5zdHlsZS50b3ApIC02ICsicHgiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuekluZGV4ID0gRHJvcERvd25MaXN0LnpJbmRleCArKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLm9wYWNpdHkgPSAwLjk2OwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgCiAgICAgICAgICAgICAgICAgICAgLy8g56a75byA6ZqQ6JePCiAgICAgICAgICAgICAgICAgICAgbW91c2VFdmVudExpc3RlbmVyLmFkZCgnbW91c2VsZWF2ZScsIGEsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNlbGYuc2hvd1RpbWVySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmLmhpZGRlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5zdHlsZS50b3AgPSBwYXJzZUludChsaXN0LnN0eWxlLnRvcCkrNiArInB4IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Quc3R5bGUub3BhY2l0eSA9IDAuMDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhpZGVUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzZWxmLmhpZGVEZWxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgICAgICAgICBtb3VzZUV2ZW50TGlzdGVuZXIuYWRkKCdtb3VzZWVudGVyJywgbGlzdCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5oaWRlVGltZXJJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGUgPSBsaXN0LnN0eWxlOwogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS56SW5kZXggPSBEcm9wRG93bkxpc3QuekluZGV4ICsrOwogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5vcGFjaXR5ID0gMC45NjsKICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUudG9wID0gcGFyc2VJbnQobGlzdC5zdHlsZS50b3ApIC02ICsicHgiOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgCiAgICAgICAgICAgICAgICAgICAgbW91c2VFdmVudExpc3RlbmVyLmFkZCgnbW91c2VsZWF2ZScsIGxpc3QsIGZ1bmN0aW9uICgpIHsKICAgIAogICAgICAgICAgICAgICAgICAgICAgICBsaXN0LnN0eWxlLm9wYWNpdHkgPSAwLjA0OwogICAgICAgICAgICAgICAgICAgICAgICBsaXN0LnN0eWxlLnRvcCA9IHBhcnNlSW50KGxpc3Quc3R5bGUudG9wKSs2ICsicHgiOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhpZGVUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgc2VsZi5oaWRlRGVsYXkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHNob3c6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGlkZGVuKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRkZW4gPSBmYWxzZTsKICAgIAogICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxlZCA9IGdldFNjcm9sbGVkKCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFCQ1JlY3QgPSB0aGlzLmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRoaXNCQ1JlY3QgPSB0aGlzLmEucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKQogICAgCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5saXN0LnN0eWxlOwogICAgCiAgICAgICAgICAgICAgICAgICAgdmFyIHRvcCA9IHNjcm9sbGVkLnkgKyBhQkNSZWN0LmJvdHRvbTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IHNjcm9sbGVkLnggKyBhQkNSZWN0LmxlZnQ7CiAgICAKICAgICAgICAgICAgICAgICAgICAvLyDnmb7luqbnlYzpnaLkuoznuqfmkJzntKLkvJrlh7rnjrDlgY/np7vnmoTpl67popgKICAgICAgICAgICAgICAgICAgICAvLyBpZigvXmh0dHBzPzpcL1wvd3d3XC5iYWlkdVwuY29tXC8oPzpzfGJhaWR1KS8udGVzdCh1cmwpKXsKICAgICAgICAgICAgICAgICAgICAvLyAgICAgdG9wID0gMjY7CiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5BQy1zdHlsZS1sb2dvIikgJiYgZ2V0U2V0dGluZ0RhdGEuY2VudGVyICE9IDApewogICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgLy8gbGVmdCArPSAwOwogICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgbGVmdCA9IGFCQ1JlY3QueCAtdGhpc0JDUmVjdC54CiAgICAgICAgICAgICAgICAgICAgLy8gICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAvLyBsZWZ0ICs9IGdldFNldHRpbmdEYXRhLmJhaWR1T2Zmc2V0OyAgIOS4jemcgOimgeeUqOaIt+iHquW3seS/ruaUue+8jOebtOaOpeWGmeatuwogICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgbGVmdCArPSAtMTM0OwogICAgICAgICAgICAgICAgICAgIC8vICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gfQogICAgCiAgICAgICAgICAgICAgICAgICAgc3R5bGUudG9wID0gdG9wICsgNiArICdweCc7CiAgICAgICAgICAgICAgICAgICAgc3R5bGUubGVmdCA9IGxlZnQgKyAncHgnOwogICAgCiAgICAgICAgICAgICAgICAgICAgc3R5bGUuekluZGV4ID0gRHJvcERvd25MaXN0LnpJbmRleCAtLTsKICAgICAgICAgICAgICAgICAgICBzdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICAgICAgICAgICAgICAvLyDkuoznuqfmkJzntKLlsYXkuK3mmL7npLoKICAgICAgICAgICAgICAgICAgICBzdHlsZS5sZWZ0ID0gbGVmdC0gKHRoaXMubGlzdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIGFCQ1JlY3Qud2lkdGgpLzIgKyAicHgiOwogICAgCiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLm9wYWNpdHkgPSAwLjk2OwogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS50b3AgPSB0b3AgKyAncHgnOwogICAgICAgICAgICAgICAgICAgIH0sIDMwKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmEuY2xhc3NMaXN0LmFkZCh0aGlzLmFTaG93bkNsYXNzKTsKICAgIAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGhpZGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWRkZW4pIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGRlbiA9IHRydWU7CiAgICAKICAgICAgICAgICAgICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLmxpc3Quc3R5bGU7CiAgICAgICAgICAgICAgICAgICAgc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgICAgICBzdHlsZS5vcGFjaXR5ID0gMC4xOwogICAgCiAgICAgICAgICAgICAgICAgICAgdGhpcy5hLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5hU2hvd25DbGFzcyk7CiAgICAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgIAogICAgICAgICAgICAvLyB2YXIgcGFnZUVuY29kaW5nID0gKGRvY3VtZW50LmNoYXJhY3RlclNldCB8fCBkb2N1bWVudC5jaGFyc2V0KS50b0xvd2VyQ2FzZSgpOwogICAgCiAgICAgICAgICAgIC8vIOWIm+W7umRvbQogICAgICAgICAgICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2Vqc3BhbicpOwogICAgICAgICAgICBjb250YWluZXIuaWQgPSAnc2VqLWNvbnRhaW5lcic7CiAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSAicndsLWV4ZW1wdCI7CgogICAgICAgICAgICAvLyDmsqHmnInljLnphY3liLDmoLflvI8sIOivtOaYjuaYr+mAmui/h+a7keivjeaQnOe0oui/m+WFpQogICAgICAgICAgICBpZighbWF0Y2hlZFJ1bGUpewogICAgICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoInNlbGVjdFNlYXJjaCIpOwogICAgICAgICAgICB9CiAgICAKICAgICAgICAgICAgLy8g5re75YqgIGNsYXNzIOS7peiOt+WPluebruagh+e9keermeebuOWQjOeahOagt+W8j+OAggogICAgICAgICAgICBpZihtYXRjaGVkUnVsZT8uY2xhc3MpewogICAgICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTmFtZSA9IGNvbnRhaW5lci5jbGFzc05hbWUgKyAiICIgKyBtYXRjaGVkUnVsZS5jbGFzczsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG1vdXNlZG93bmhhbmRsZXIsIHRydWUpOwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIGFQYXR0ZXJuID0gJzxhIGhyZWY9IiIgY2xhc3M9InNlai1lbmdpbmUiIHRhcmdldD0iJGJsYW5rJCIgZGF0YS1pcXhpbmNhdGVnb3J5PSIkY2F0ZWdvcnkkIiBlbmNvZGluZz0iJGVuY29kaW5nJCIgZ2JrPSIkZ2JrJCIgdXJsPSIkdXJsJCI+PGltZyBzcmM9IiRmYXZpY29uJCIgY2xhc3M9InNlai1lbmdpbmUtaWNvbiIgLz4kbmFtZSQ8L2E+JzsKICAgICAgICAgICAgdmFyIGRyb3BMaXN0cyA9IFtdOwogICAgICAgICAgICBlbmdpbmVMaXN0LmRldGFpbHMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbSk7ICAvLyDmkJzntKLoj5zljZUgIMKgWyLnvZHpobUiLCAid2ViIiwgdHJ1ZV0KICAgICAgICAgICAgICAgIHZhciBjYXRlZ29yeSA9IGl0ZW1bMV07ICAgLy8gIndlYiIKICAgICAgICAgICAgICAgIHZhciBjTmFtZSA9IGl0ZW1bMF07ICAgIC8vICLnvZHpobUiCiAgICAgICAgICAgICAgICB2YXIgZW5naW5lcyA9IFtdOwogICAgCiAgICAgICAgICAgICAgICBlbmdpbmVMaXN0W2NhdGVnb3J5XS5mb3JFYWNoKGZ1bmN0aW9uIChlbmdpbmUpIHsKICAgICAgICAgICAgICAgICAgICBpZihlbmdpbmUuZGlzYWJsZSkgcmV0dXJuOwogICAgCiAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZVVybCA9IGVuZ2luZS51cmw7CiAgICAKICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2V0dGluZ0RhdGEuSGlkZVRoZVNhbWVMaW5rICYmIG1hdGNoZWRSdWxlPy51cmwudGVzdChlbmdpbmVVcmwpKSByZXR1cm47Ly8g5Y675o6J6Lez6L2s5Yiw5b2T5YmN5byV5pOO55qE5byV5pOOCiAgICAKICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGFQYXR0ZXJuLnJlcGxhY2UoJyRlbmNvZGluZyQnLCAoZW5naW5lLmVuY29kaW5nIHx8ICd1dGYtOCcpLnRvTG93ZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCckdXJsJCcsIGVuZ2luZVVybCkKICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJyRuYW1lJCcsIGVuZ2luZS5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiJGNhdGVnb3J5JCIsY2F0ZWdvcnkpOwogICAgCiAgICAgICAgICAgICAgICAgICAgLy8g5Zu+5qCHCiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZ2luZS5mYXZpY29uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBhLnJlcGxhY2UoJyRmYXZpY29uJCcsIGVuZ2luZS5mYXZpY29uKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhID0gYS5yZXBsYWNlKCdzcmM9IiRmYXZpY29uJCInLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAvLyBnYmvnvJbnoIEKICAgICAgICAgICAgICAgICAgICBpZiAoZW5naW5lLmdiaykgewogICAgICAgICAgICAgICAgICAgICAgICBhID0gYS5yZXBsYWNlKCckZ2JrJCcsIGVuZ2luZS5nYmspOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBhLnJlcGxhY2UoJ2diaz0iJGdiayQiJywgJycpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgLy8g5paw5qCH562+6aG1CiAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdEYXRhLm5ld3RhYiB8fCBlbmdpbmUuYmxhbmspIHsKICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGEucmVwbGFjZSgnJGJsYW5rJCcsICJfYmxhbmsiKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBhID0gYS5yZXBsYWNlKCd0YXJnZXQ9IiRibGFuayQiJywgJycpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAKICAgICAgICAgICAgICAgICAgICBlbmdpbmVzLnB1c2goYSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIOmdnuepuuWIl+ihqAogICAgICAgICAgICAgICAgaWYgKCFlbmdpbmVzLmxlbmd0aCkgcmV0dXJuOwogICAgCiAgICAgICAgICAgICAgICBlbmdpbmVzID0gZW5naW5lcy5qb2luKCcnKTsKICAgIAogICAgICAgICAgICAgICAgLy8g5bGV5byA5b2T5YmN5pCc57Si5YiG57G75YiX6KGoCiAgICAgICAgICAgICAgICBpZiAoIWdldFNldHRpbmdEYXRhLmZvbGRsaXN0ICYmIGNhdGVnb3J5ID09IG1hdGNoZWRSdWxlPy5lbmdpbmVMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGVuZ2luZXM7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBkcm9wTGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlanNwYW4nKTsKICAgICAgICAgICAgICAgICAgICBkcm9wTGlzdC5jbGFzc05hbWUgPSAnc2VqLWRyb3AtbGlzdCByd2wtZXhlbXB0JzsKICAgICAgICAgICAgICAgICAgICBkcm9wTGlzdC5pbm5lckhUTUwgPSBlbmdpbmVzOwogICAgCiAgICAgICAgICAgICAgICAgICAgLy8gIGE65Li75pCc57Si6I+c5Y2VCiAgICAgICAgICAgICAgICAgICAgLy8gZHJvcExpc3Q6IOaQnOe0ouWtkOiPnOWNlQogICAgICAgICAgICAgICAgICAgIHZhciBhID0gZHJvcExpc3QuZmlyc3RFbGVtZW50Q2hpbGQuY2xvbmVOb2RlKHRydWUpOwogICAgICAgICAgICAgICAgICAgIGEuY2xhc3NOYW1lID0gYS5jbGFzc05hbWUgKyAnIHNlai1kcm9wLWxpc3QtdHJpZ2dlcic7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8g6ZqQ6JeP5Li75pCc57Si6I+c5Y2V55qE5Zu+5qCHCiAgICAgICAgICAgICAgICAgICAgaWYoIWdldFNldHRpbmdEYXRhLmljb24pewogICAgICAgICAgICAgICAgICAgICAgICBjTmFtZSA9ICIiOwogICAgICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgICAgIGEubGFzdENoaWxkLm5vZGVWYWx1ZSA9IGNOYW1lOwogICAgICAgICAgICAgICAgICAgIGRyb3BMaXN0cy5wdXNoKFthLCBkcm9wTGlzdF0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgLy/lsIblkITkuKrmkJzntKLliJfooajmj5LlhaXmlofmoaPkuK0KICAgICAgICAgICAgZHJvcExpc3RzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgIAogICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbVswXSk7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtWzBdLmRhdGFzZXQuaXF4aW5jYXRlZ29yeSkgICAgLy8id2ViIgogICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbVswXS5xdWVyeVNlbGVjdG9yKCJpbWciKS5zcmMpOyAgIC8vIOWbvueJh+mTvuaOpQogICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaXRlbVswXS5pbm5lclRleHQpOyAgLy8g572R6aG1CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtWzFdKTsKICAgIAogICAgICAgICAgICAgICAgaWYoZ2V0U2V0dGluZ0RhdGEuaWNvbiA9PSAyKXsKICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpY29uW2l0ZW1bMF0uZGF0YXNldC5pcXhpbmNhdGVnb3J5XSkKICAgICAgICAgICAgICAgICAgICBpZihpY29uW2l0ZW1bMF0uZGF0YXNldC5pcXhpbmNhdGVnb3J5XSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bMF0ucXVlcnlTZWxlY3RvcigiaW1nIikuc3JjID0gaWNvbltpdGVtWzBdLmRhdGFzZXQuaXF4aW5jYXRlZ29yeV0KICAgIAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGl0ZW1bMF0pOyAgICAvL+WwhuaQnOe0ouWIl+ihqOaUvuWFpeS4u+aQnOe0ogogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpdGVtWzFdKTsgIC8vIOaPkuWFpeaQnOe0ouWtkOiPnOWNlQogICAgICAgICAgICAgICAgaXRlbVsxXS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBtb3VzZWRvd25oYW5kbGVyLCB0cnVlKTsKICAgIAogICAgICAgICAgICAgICAgbmV3IERyb3BEb3duTGlzdChpdGVtWzBdLCBpdGVtWzFdKTsKICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgLy8g5bCG5Li75pCc57Si5o+S5YWl572R6aG15LitCiAgICAgICAgICAgIHN3aXRjaCAoaVRhcmdldFdoZXJlKSB7CiAgICAgICAgICAgICAgICBjYXNlICdiZWZvcmViZWdpbicgOiAgICAvLyAnYmVmb3JlQmVnaW4nKOaPkuWFpeWIsOe7meWumuWFg+e0oOeahOWJjemdoikgOwogICAgICAgICAgICAgICAgICAgIGlUYXJnZXQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBpVGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nIDogICAgIC8vICdhZnRlckJlZ2luJyjkvZzkuLrnu5nlrprlhYPntKDnmoTnrKzkuIDkuKrlrZDlhYPntKApIDsKICAgICAgICAgICAgICAgICAgICBpZiAoaVRhcmdldC5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlUYXJnZXQuaW5zZXJ0QmVmb3JlKGNvbnRhaW5lciwgaVRhcmdldC5maXJzdENoaWxkKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpVGFyZ2V0LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2JlZm9yZWVuZCcgOiAgIC8vICdiZWZvcmVFbmQnICjkvZzkuLrnu5nlrprlhYPntKDnmoTmnIDlkI7kuIDkuKrlrZDlhYPntKApIDsKICAgICAgICAgICAgICAgICAgICBpVGFyZ2V0LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdhZnRlcmVuZCcgOiAgLy8gJ2FmdGVyRW5kJyjmj5LlhaXliLDnu5nlrprlhYPntKDnmoTlkI7pnaIpOy4KICAgICAgICAgICAgICAgICAgICBpZiAoaVRhcmdldC5uZXh0U2libGluZykgewogICAgICAgICAgICAgICAgICAgICAgICBpVGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNvbnRhaW5lciwgaVRhcmdldC5uZXh0U2libGluZyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaVRhcmdldC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgaVRhcmdldC5hcHBlbmRDaGlsZChjb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9OwogICAgCiAgICAgICAgICAgIC8vIOWFvOWuueWFtuS7luS/ruaUuee9kemhteeahOiEmuacrAogICAgICAgICAgICBpZiAobWF0Y2hlZFJ1bGU/LnN0eWxlKSB7CiAgICAgICAgICAgICAgICAvLyDliKTmlq3mmK/lkKblrZjlnKjohJrmnKwg4oCcQUMtYmFpZHU66YeN5a6a5ZCR5LyY5YyW55m+5bqm5pCc54uX6LC35q2M5pCc57SiX+WOu+W5v+WRil9mYXZpY29uX+WPjOWIl+KAnQogICAgICAgICAgICAgICAgaWYoZ2V0U2V0dGluZ0RhdGEuY2VudGVyPT0yKXsgICAgLy8g6Ieq5Yqo5Yik5pat5piv5ZCm5re75YqgCiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIuWIpOaWreaYr+WQpuiHquWKqOa3u+WKoCIpOwogICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNteXVzZXIiKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cobWF0Y2hlZFJ1bGUuc3R5bGVfQUNCYWlkdSk7CiAgICAgICAgICAgICAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLkFDLXN0eWxlLWxvZ28iKSAmJiBtYXRjaGVkUnVsZS5zdHlsZV9BQ0JhaWR1KXsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuajgOa1i+WIsOiEmuacrO+8muKAnEFDLWJhaWR1OumHjeWumuWQkeS8mOWMlueZvuW6puaQnOeLl+iwt+atjOaQnOe0ol/ljrvlub/lkYpfZmF2aWNvbl/lj4zliJfigJ0gICAtLS0tLS3oh6rliqjmt7vliqAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFJ1bGUuc3R5bGUgPSBtYXRjaGVkUnVsZS5zdHlsZV9BQ0JhaWR1OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0U2V0dGluZ0RhdGEuY2VudGVyPT0xKXsgICAvLyAg5by65Yi25re75YqgCiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuajgOa1i+WIsOiEmuacrO+8muKAnEFDLWJhaWR1OumHjeWumuWQkeS8mOWMlueZvuW6puaQnOeLl+iwt+atjOaQnOe0ol/ljrvlub/lkYpfZmF2aWNvbl/lj4zliJfigJ0gICAtLS0tLS3lvLrliLbmt7vliqAiKTsKICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUnVsZS5zdHlsZSA9IG1hdGNoZWRSdWxlLnN0eWxlX0FDQmFpZHU/bWF0Y2hlZFJ1bGUuc3R5bGVfQUNCYWlkdTptYXRjaGVkUnVsZS5zdHlsZTsKICAgICAgICAgICAgICAgIH0gICAgIC8vCiAgICAgICAgICAgICAgICAvLyDliKTmlq3mmK/lkKblrZjlnKjohJrmnKzigJznn6XkuY7mjpLniYjkvJjljJbigJ0KICAgICAgICAgICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdTZWFyY2hNYWluJykpewogICAgICAgICAgICAgICAgICAgIGlmKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdTZWFyY2hNYWluJykuc3R5bGUubWFyZ2luTGVmdD09JzE1MHB4Jyl7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSdWxlLnN0eWxlID0gbWF0Y2hlZFJ1bGUuc3R5bGVfWmhpaHVDaGVuZ2xpbno7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSdWxlLmZpeGVkVG9wID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuajgOa1i+WIsOKAmOefpeS5juaOkueJiOS8mOWMluKAmeiEmuacrCIpCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBtYXRjaGVkUnVsZS5zdHlsZTsKICAgICAgICAgICAgfTsKICAgIAogICAgICAgICAgICAvL+WFvOWuuWFj55m+5bqm5LitbGl0ZemAiemhuSwgZml4ZWR0b3DlkozmraPluLjnmoTkuI3kuIDmoLcKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLkFDLWJhaWR1TGl0ZVN0eWxlIikgJiYgbWF0Y2hlZFJ1bGUuZml4ZWRUb3AyKXsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5qOA5rWL5YiwIEFDLWJhaWR1TGl0ZVN0eWxlIikKICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUnVsZS5maXhlZFRvcCA9IG1hdGNoZWRSdWxlLmZpeGVkVG9wMgogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIuayoeaJvuWIsCBBQy1iYWlkdUxpdGVTdHlsZSIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sMjUwMCkKICAgIAogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAvLyDnlLHkuo7kuI7opoHmj5LlhaXnvZHpobXnmoTmoLflvI/ml6Dms5Xlvojlpb3nmoTlhbzlrrks5pu05pS55rqQ572R6aG155qE5qC35byPCiAgICAgICAgICAgIGlmKG1hdGNoZWRSdWxlPy5zdHlsaXNoKXtHTV9hZGRTdHlsZShtYXRjaGVkUnVsZS5zdHlsaXNoKTt9OwogICAgICAgICAgICAKICAgICAgICAgICAgLy/lm7rlrprmkJzntKLmoI8KICAgICAgICAgICAgaWYoZ2V0U2V0dGluZ0RhdGEuZml4ZWRUb3AgJiYgbWF0Y2hlZFJ1bGUpewogICAgICAgICAgICAgICAgLy8g5Yik5pat5piv5ZCm6ZyA6KaB5Y+q5Zyo5ZCR5LiK5rua5Yqo5pe25pi+56S6CiAgICAgICAgICAgICAgICBpZihnZXRTZXR0aW5nRGF0YS5maXhlZFRvcFVwd2FyZCl7CiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9ubW91c2V3aGVlbCA9IGRvY3VtZW50Lm9ubW91c2V3aGVlbCA9IGZ1bmN0aW9uKGVlZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVlZS53aGVlbERlbHRhPjApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRUb3BGdW4obWF0Y2hlZFJ1bGUuZml4ZWRUb3AsIG1hdGNoZWRSdWxlLmZpeGVkVG9wQ29sb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VqLWNvbnRhaW5lciIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnN0eWxlLmNzc1RleHQgPSBtYXRjaGVkUnVsZS5zdHlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9uc2Nyb2xsID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRUb3BGdW4obWF0Y2hlZFJ1bGUuZml4ZWRUb3AsIG1hdGNoZWRSdWxlLmZpeGVkVG9wQ29sb3IpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB3aW5kb3cub25zY3JvbGwgPSBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgIAogICAgICAgICAgICAvLyDlm7rlrprmkJzntKLmoI8KICAgICAgICAgICAgZnVuY3Rpb24gZml4ZWRUb3BGdW4oaGVpZ2h0LCBjb2xvcil7CiAgICAgICAgICAgICAgICB2YXIgb2JqID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlai1jb250YWluZXIiKTsKICAgICAgICAgICAgICAgIGlmKCFvYmope3JldHVybn07CiAgICAgICAgICAgICAgICB2YXIgb2JqVG9wID0gb2JqLm9mZnNldFRvcCA7CiAgICAgICAgICAgICAgICB2YXIgb2JqTGVmdCA9IG9iai5vZmZzZXRMZWZ0IDsKICAgIAogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnQgPSBvYmoub2Zmc2V0UGFyZW50OwogICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpewogICAgICAgICAgICAgICAgICAgIG9iakxlZnQgKz0gY3VycmVudC5vZmZzZXRMZWZ0OwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm9mZnNldFBhcmVudDsKICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgdmFyIHNjcm9sbFRvcCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CiAgICAKICAgICAgICAgICAgICAgIGlmKGhlaWdodCl7CiAgICAgICAgICAgICAgICAgICAgb2JqVG9wID0gaGVpZ2h0OwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gMDsKICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgaWYoc2Nyb2xsVG9wIDw9IG9ialRvcCl7CiAgICAgICAgICAgICAgICAgICAgb2JqLnN0eWxlLmNzc1RleHQgPSBtYXRjaGVkUnVsZS5zdHlsZTsKICAgICAgICAgICAgICAgIH1lbHNlIGlmKG9iai5zdHlsZS5wb3NpdGlvbiE9ImZpeGVkIil7CiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIuWbuuWumuWIsOmhtuerryIpOwogICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHNjcm9sbFRvcCxvYmpUb3Asc2Nyb2xsVG9wIC0gb2JqVG9wKTsKICAgICAgICAgICAgICAgICAgICB2YXIgb2Jqc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShvYmogLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbWFyZ2luVG9wID0gcGFyc2VJbnQob2Jqc3R5bGUubWFyZ2luVG9wKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbWFyZ2luTGVmdCA9IHBhcnNlSW50KG9ianN0eWxlLm1hcmdpbkxlZnQpOwogICAgICAgICAgICAgICAgICAgIHZhciBtYXJnaW5SaWdodCA9IHBhcnNlSW50KG9ianN0eWxlLm1hcmdpblJpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKG9iakxlZnQsbWFyZ2luTGVmdCk7CiAgICAKICAgICAgICAgICAgICAgICAgICBvYmouc3R5bGUudG9wID0gaGVpZ2h0IC0gbWFyZ2luVG9wICsgJ3B4JzsKICAgIAogICAgICAgICAgICAgICAgICAgIC8vIOWmguaenOS5i+WJjeacquiuvue9ruminOiJsizliJnpu5jorqTorr7nva7kuLrnmb3oibIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjAyMC0xMi0xOSDlop7liqDpgInpobks5Y+v5Lul6YCa6L+H5Luj56CB6Ieq5a6a5LmJ6aKc6ImyLOS9huaYr+aXoOazlemAmui/h+e9keermeiHquWKqOiOt+WPlgogICAgICAgICAgICAgICAgICAgIGlmKGNvbG9yKXsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnN0eWxlLmJhY2tncm91bmQgPSBjb2xvcjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYob2Jqc3R5bGUuYmFja2dyb3VuZENvbG9yID09PSAicmdiYSgwLCAwLCAwLCAwKSIgfHwgb2Jqc3R5bGUuYmFja2dyb3VuZENvbG9yID09PSAidHJhbnNwYXJlbnQiKXsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnN0eWxlLmJhY2tncm91bmQgPSAnI2ZmZic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9iai5zdHlsZS5sZWZ0ID0gZ2V0RWxlbWVudExlZnQob2JqKSAtIG1hcmdpbkxlZnQgKyAicHgiOwogICAgICAgICAgICAgICAgICAgIC8vIG9iai5zdHlsZS5sZWZ0ID0gZ2V0RWxlbWVudExlZnQob2JqKSArICJweCI7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgZGVidWcoIm9iakxlZnQ6ICIsb2JqTGVmdCwibWFyZ2luTGVmdDogIixtYXJnaW5MZWZ0LCJtYXJnaW5SaWdodDogIixtYXJnaW5SaWdodCwiZ2V0RWxlbWVudExlZnQ6ICIsZ2V0RWxlbWVudExlZnQob2JqKSk7CiAgICAgICAgICAgICAgICAgICAgLy8g55+l5LmO562J572R56uZ55qE5oOF5Ya1IOWIqeeUqCBtYXJnaW4g5bGF5LitCiAgICAgICAgICAgICAgICAgICAgaWYobWFyZ2luUmlnaHQgPT09IG1hcmdpbkxlZnQgJiYgbWFyZ2luUmlnaHQgIT0gMCl7CiAgICAgICAgICAgICAgICAgICAgICAgIG9iai5zdHlsZS5sZWZ0ID0gbWFyZ2luTGVmdCArICJweCI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIOa3mOWuneetiee9keermeeahOaDheWGtSDliKnnlKggdGV4dC1hbGlnbiDlsYXkuK0KICAgICAgICAgICAgICAgICAgICBpZihvYmouc3R5bGUudGV4dEFsaWduID09PSAiY2VudGVyIil7CiAgICAgICAgICAgICAgICAgICAgICAgIG9iai5zdHlsZS53aWR0aCA9IG9ianN0eWxlLndpZHRoOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvYmouc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnOwogICAgCiAgICAgICAgICAgICAgICAgICAgb2JqLnN0eWxlLnBhZGRpbmcgPSAiMHB4IDVweCAwcHggMHB4IjsgIC8vIOmHjee9rnBhZGRpbmcsIOWboOS4uueUqOS6hiBmaXhlZCDlrprkvY0sIOayoeW/heimgee7p+e7reeUqHBhZGRpbmcs5Y+N6ICM5Lya5bim5p2l6YGu5oyhCiAgICAKICAgICAgICAgICAgICAgICAgICAvLyBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSdzcC1hYy1hX2ZvcmNlX3N0eWxlX2JhaWR1J10iKS5sZW5ndGggIT0wKXsKICAgICAgICAgICAgICAgICAgICAvLyAgICAgY29uc29sZS5sb2coIuajgOa1i+WIsCBhY+iEmuacrOWNleWIl+WxheS4remAiemhuSIpCiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlmKChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSdzcC1hYy1hX2ZvcmNlX3N0eWxlX2JhaWR1J10iKVsyXS5jaGVja2VkKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYmouc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9iai5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlKC01MCUsIDApIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9iai5zdHlsZS50b3AgPSAibm9uZSIgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2JqLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpeGVkVG9wRnVuMihtYXRjaGVkUnVsZS5maXhlZFRvcFRhcmdldCxtYXRjaGVkUnVsZS5maXhlZFRvcFdoZXJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBmaXhlZFRvcEZ1bjIoVGFyZ2V0LHdoZXJlKXsKICAgICAgICAgICAgICAgIHZhciBvYmogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2VqLWNvbnRhaW5lciIpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgb1RhcmdldCA9IGdldEVsZW1lbnQoVGFyZ2V0KQogICAgCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiZml4ZWRUb3BGdW4yIik7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhUYXJnZXQpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2cod2hlcmUpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoZXJlLnRvTG93ZXJDYXNlKCkpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdiZWZvcmViZWdpbicgOiAgICAvLyAnYmVmb3JlQmVnaW4nKOaPkuWFpeWIsOe7meWumuWFg+e0oOeahOWJjemdoikgOwogICAgICAgICAgICAgICAgICAgIG9UYXJnZXQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUob2JqLCBvVGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdhZnRlcmJlZ2luJyA6ICAgICAvLyAnYWZ0ZXJCZWdpbico5L2c5Li657uZ5a6a5YWD57Sg55qE56ys5LiA5Liq5a2Q5YWD57SgKSA7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9UYXJnZXQuZmlyc3RDaGlsZCkgewogICAgICAgICAgICAgICAgICAgICAgICBvVGFyZ2V0Lmluc2VydEJlZm9yZShvYmosIG9UYXJnZXQuZmlyc3RDaGlsZCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9UYXJnZXQuYXBwZW5kQ2hpbGQob2JqKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYmVmb3JlZW5kJyA6ICAgLy8gJ2JlZm9yZUVuZCcgKOS9nOS4uue7meWumuWFg+e0oOeahOacgOWQjuS4gOS4quWtkOWFg+e0oCkgOwogICAgICAgICAgICAgICAgICAgIG9UYXJnZXQuYXBwZW5kQ2hpbGQob2JqKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdhZnRlcmVuZCcgOiAgLy8gJ2FmdGVyRW5kJyjmj5LlhaXliLDnu5nlrprlhYPntKDnmoTlkI7pnaIpOy4KICAgICAgICAgICAgICAgICAgICBpZiAob1RhcmdldC5uZXh0U2libGluZykgewogICAgICAgICAgICAgICAgICAgICAgICBvVGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG9iaiwgb1RhcmdldC5uZXh0U2libGluZyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgb1RhcmdldC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKG9iaik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKCgogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS3orr7nva7nm7jlhbMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8vIOiuvue9ruaMiemSruebuOWFswogICAgICAgIHZhciBkcmFnRWwgPSBudWxsOwogICAgICAgIHZhciBkcmFnRGF0YSA9IG51bGw7CgogICAgICAgIGZ1bmN0aW9uIFNFSnNldHRpbmcoKXsKICAgICAgICAgICAgdGhpcy5lbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgdGhpcy5tYXNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgogICAgICAgICAgICB0aGlzLnBhcmVudFRlbXAgPSBudWxsOwogICAgICAgICAgICB0aGlzLmVkaXRUZW1wID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5vbmxpbmUgPSBudWxsOwogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICB9OwoKICAgICAgICBTRUpzZXR0aW5nLnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgdGVzdGFiYyA6ICJoYWhhaCIsCiAgICAgICAgICAgIGFQYXR0ZXJuUGFyZW50IDogIjxkaXY+PC9kaXY+IiwKCiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJpbml0Li4uIik7CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CgogICAgICAgICAgICAgICAgdGhpcy5lbGUuaWQgPSAic2V0dGluZ0xheWVyIjsKICAgICAgICAgICAgICAgIHRoaXMubWFzay5pZCA9ICJzZXR0aW5nTGF5ZXJNYXNrIjsKCiAgICAgICAgICAgICAgICB0aGlzLmFkZEdsb2JhbFN0eWxlKCk7CgogICAgICAgICAgICAgICAgdGhpcy5hZGRDb250ZW50KCk7CgogICAgICAgICAgICAgICAgdGhpcy5tYXNrLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIHRoYXQuaGlkZSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGlzLmVsZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHRoaXMubWFzay5hcHBlbmRDaGlsZCh0aGlzLmVsZSk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMubWFzayk7CgogICAgICAgICAgICAgICAgLy8g57uR5a6a5LqL5Lu2CiAgICAgICAgICAgICAgICB0aGlzLmVsZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhhdC5kb21DbGljay5iaW5kKHRoaXMpLGZhbHNlKTsKICAgICAgICAgICAgICAgIHRoaXMuZHJhZ0V2ZW50KCk7CiAgICAgICAgICAgICAgICB0aGlzLnNldERyYWdOb2RlKHRoaXMuZWxlKTsgLy/orr7nva7mi5bliqgKICAgICAgICAgICAgICAgIC8vIGlucHV0W3JhbmdlXQogICAgICAgICAgICAgICAgdGhhdC5yYW5nZUNoYW5nZSh0cnVlKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzZXRCdG5PcGFjaXR5UmFuZ2UiKS5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsdGhhdC5yYW5nZUNoYW5nZSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRyYWdFdmVudDogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBvZGl2c2RyYWcgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuZHJhZyIpOwogICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKG9kaXZzZHJhZyxmdW5jdGlvbihvZGl2KXsKICAgICAgICAgICAgICAgICAgICBvZGl2LmFkZEV2ZW50TGlzdGVuZXIoImRyYWdzdGFydCIsdGhhdC5kb21kcmFnc3RhcnQsZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIG9kaXYuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhhdC5kb21kcmFnZW50ZXIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICBvZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhhdC5kb21kcmFnb3ZlciwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIG9kaXYuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhhdC5kb21kcmFnbGVhdmUsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICBvZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGF0LmRvbWRyb3AsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICBvZGl2LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdlbmQnLHRoYXQuZG9tZHJvcGVuZCwgZmFsc2UpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGFkZENvbnRlbnQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB2YXIgYVBhdHRlcm4gPSAnPHNwYW4gZHJhZ2dhYmxlPSJ0cnVlIiBjbGFzcz0iZHJhZyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJzZWotZW5naW5lIicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgZGF0YS14aW49IiR4aW4kIiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGRhdGEtaXF4aW5pbWc9IiRpbWckIiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGRhdGEtaXF4aW50aXRsZT0iJHRpdGxlJCIgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBkYXRhLWlxeGlubGluaz0iJGxpbmskIiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGRhdGEtaXF4aW50YXJnZXQ9IiRibGFuayQiICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgZGF0YS1pcXhpbmRpc2FibGVkPSIkZGlzYWJsZWQkIiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGRhdGEtaXF4aW5nYms9IiRnYmskIiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPjxpbWcgc3JjPSIkZmF2aWNvbiQiIGNsYXNzPSJzZWotZW5naW5lLWljb24iIHN0eWxlPSJwYWRkaW5nLWJvdHRvbTozcHg7Ii8+PHNwYW4+JG5hbWUkPC9zcGFuPjwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIDxzcGFuIGNsYXNzPSJpcXhpbi1zZXQtZWRpdCIgdGl0bGU9Iue8lui+kSBFZGl0Ij48aW1nIGNsYXNzPSJzZWotZW5naW5lLWljb24iIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDQUFBQUFnQ0FRQUFBRFpjN0ovQUFBQ0RrbEVRVlI0bkpYVnpVdFVVUmpIOFkvbVNOS2traTJpd2lBcHhIUTFxLzZDK2d1c29DQjZveGJSUnFGTkw0c1d0UktxaFZTTElEZTFDcXBOaXdqS0lpbEtMS0tGRXIyWjJxSTB4eEhOMCtMT20rUE1PUE9jMVQySDcvZjVuY085OTFCZE5lcjMwem14S3JsMHhWMnpLSmpSb3k2YXFra3ZiYmRWTFB1VXErOCs1dUdYblZJTGtpN3FzeGd0TkR0clROTGNpakh2cmRZc2Z0MC93UThEWmdTemVxTVVEVzRJSmNlWUhjdndDZDFpZXMwS1p2V0kxVG5oSUg2NTc0T2xnZzBFNzR6bWhaOTAyajMwNGJ5NEN4cDVMUGp0UU5tankzWFBWSzJyZ21DQkNjR2dkVlhoZEJnVUJDTUV3Vk1OVmVJdkJNRkxpZktDOHZncm5kRkJsUkpVaEpjV0ZNZDNaZkd1ekZSeHdXcmR1M0tUeFFRVmhpOGxxQXBmS1ZoZjBkNGJjMi9PY2tHOVBrdXI3cjNURXcrMUZSTzBHeGRNMlZjMi9ISEJncjFJZjkzNVVUZmlnYnQ1K0MyN01lU285K201R0pZaXRsQ3dXUjJHOG9RWi9GZ1dYMWFGZ25aTUc4NTJ2NW5GUjRyaE1uKzJkRFZKWUZwS3F5MFNEa3NVaEY5RnNFMGJXZ3lJYTliSWFuaWhvRVVjRFRyU3o0dWVPVk1PTHhRa3pWa3JaY2FvTno3NTVybXBjbmloWU5naG0zdzI2WXMvNWNHY0lLZ1JCSkR5cUNJcXVqOEMxUHFLWnZISytxVnJKNWJNUndtR3RlclU2NHBra1p1cFdPM1JqWGt6VVpqOStqVlpNR0s2SXNFYUhUYmdqcE9TVVlaTC9wYTVtNHFQSWJ0eXpucEh2SmFxR0I1M08zM2g0VC8zVnpMdXpEaEU2QUFBQUFCSlJVNUVya0pnZ2c9PSIvPjwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIDxzcGFuIGNsYXNzPSJpcXhpbi1zZXQtZGVsIiB0aXRsZT0i5Yig6ZmkIERlbGV0ZSI+PGltZyBjbGFzcz0ic2VqLWVuZ2luZS1pY29uIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ0FBQUFBZ0NBTUFBQUJFcElyR0FBQURBRkJNVkVVQUFBRHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZIc2JWSHNiVkhzYlZILy8vOVZWVlZXVmxaWFYxZFlXRmhaV1ZsYVdscGJXMXRjWEZ4ZFhWMWVYbDVmWDE5Z1lHQmhZV0ZpWW1KalkyTmtaR1JsWldWbVptWm5aMmRvYUdocGFXbHFhbXByYTJ0c2JHeHRiVzF1Ym01dmIyOXdjSEJ4Y1hGeWNuSnpjM04wZEhSMWRYVjJkblozZDNkNGVIaDVlWGw2ZW5wN2UzdDhmSHg5ZlgxK2ZuNS9mMytBZ0lDQmdZR0Nnb0tEZzRPRWhJU0ZoWVdHaG9hSGg0ZUlpSWlKaVltS2lvcUxpNHVNakl5TmpZMk9qbzZQajQrUWtKQ1JrWkdTa3BLVGs1T1VsSlNWbFpXV2xwYVhsNWVZbUppWm1abWFtcHFibTV1Y25KeWRuWjJlbnA2Zm41K2dvS0Nob2FHaW9xS2pvNk9rcEtTbHBhV21wcWFucDZlb3FLaXBxYW1xcXFxcnE2dXNyS3l0cmEydXJxNnZyNit3c0xDeHNiR3lzckt6czdPMHRMUzF0YlcydHJhM3Q3ZTR1TGk1dWJtNnVycTd1N3U4dkx5OXZiMit2cjYvdjcvQXdNREJ3Y0hDd3NMRHc4UEV4TVRGeGNYR3hzYkh4OGZJeU1qSnljbkt5c3JMeTh2TXpNek56YzNPenM3UHo4L1EwTkRSMGRIUzB0TFQwOVBVMU5UVjFkWFcxdGJYMTlmWTJOaloyZG5hMnRyYjI5dmMzTnpkM2QzZTN0N2YzOS9nNE9EaDRlSGk0dUxqNCtQazVPVGw1ZVhtNXVibjUrZm82T2pwNmVucTZ1cnI2K3ZzN096dDdlM3U3dTd2NysvdzhQRHg4Zkh5OHZMejgvUDA5UFQxOWZYMjl2YjM5L2Y0K1BqNStmbjYrdnI3Ky92OC9QejkvZjMrL3Y3Ly8vOGRlajlUQUFBQVUzUlNUbE1BQUFCbTdQL3NaZ0FBQUJQTy8vLy96aFFBQUIvaS8vLy8vLy8vLytJZkFBQWU0ZnZrNEFBQUFBQWQvK1EzR3h3QUZSODVGUUJqeitMUFkrdi8vLy9yNi8vLy8vL3JaTS9oNGM5akFCVWRIUlVBQVAwRWNQb0FBQUV1U1VSQlZIaWM3WlJuYzhJd0RJYmRFVVpIR0Iwa0RzTU9NY09NdHRCQkI5M1F2Y2ovL3k5VmpCMEN6aDEzL2R6M2l4VDVPVm1TWXlNa3RMSzZ0bTc0b1l4RU1wVkdVVzFzYm0yYk04RE1aSFA1T1dCbmQyKy9ZTm5ZQVdIYktoUkw1Y29jUUtqcldGV1B1U0RtVlMzSHBVUXUxZW9OUWtpVE05eHFkN29Ib0c2bjNjS01OeUhjcU5mUTRWR1BVc3I3bmgwRmJLL1BJZHc3UGtHblp3T1pOcnFGOUFmbkYranlhaWdMaXhZcC9lSDFEYnE5dTRlQUh5T0FIaDVIYVB6MERDbmpBTmptNWZVTnZYOThRb0dDeHlvNUZqbWgwSy92SDJoekFpMEtucW55bU1nSnJVNmd6ZW1RQk0rRFpwWDEvWEJZVXlBWVRUQXVaVFVnK0F3OFpmK0J2d0pMUjczMHNQVGpYZ0QwSDJZQjBCVUNsWEtwR0FlRTF5K2Z5MlpNZlgxMmdkT3BaTUxRQWZrRS9BTDdlNXZHWkYrZE9RQUFBQUJKUlU1RXJrSmdnZz09Ij48L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nOwogICAgICAgICAgICAgICAgdmFyIGRldGFpbHMgPSBlbmdpbmVMaXN0LmRldGFpbHM7CiAgICAgICAgICAgICAgICAvLyDoi6XmoLnmja7mlbDnu4Tplb/luqbojrflj5Ys6LSf5pWw5byV5a+855qE5Li65bGe5oCnLOS4jeWGjWxlbmd0aOmVv+W6puS5i+WGhSzmiYDku6XmnaXkuKrlpKfkvZPnmoTmlbDlrZcs5b2T6YO95Li656m65pe2LOe7k+adn+W+queOrwogICAgICAgICAgICAgICAgLy8gdmFyIGRldGFpbHNMZW5ndGggPSBkZXRhaWxzLmxlbmd0aDsKICAgICAgICAgICAgICAgIHZhciBkZXRhaWxzTGVuZ3RoID0gOTk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7aTxkZXRhaWxzTGVuZ3RoO2krKyl7CiAgICAgICAgICAgICAgICAgICAgdmFyIGogPSBpOwogICAgICAgICAgICAgICAgICAgIGogPSBkZXRhaWxzW2pdID8gaiA6IC1qOwogICAgICAgICAgICAgICAgICAgIGlmICghZGV0YWlsc1tqXSl7YnJlYWt9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgb2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICAgICAgICAgIG9kaXYuaWQgPSBkZXRhaWxzW2pdWzFdOyAvLyAid2ViIgogICAgICAgICAgICAgICAgICAgIG9kaXYuY2xhc3NMaXN0LmFkZCgiaXF4aW4taXRlbXMiKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG9EaXZUaXRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICAgICAgICAgIG9EaXZUaXRsZS5jbGFzc0xpc3QuYWRkKCJzZWp0aXRsZSIsImRyYWciKTsKICAgICAgICAgICAgICAgICAgICBvRGl2VGl0bGUuc2V0QXR0cmlidXRlKCJkcmFnZ2FibGUiLCJ0cnVlIik7CiAgICAgICAgICAgICAgICAgICAgb0RpdlRpdGxlLmRhdGFzZXQuaXF4aW50aXRsZSA9IGRldGFpbHNbal1bMV07CiAgICAgICAgICAgICAgICAgICAgb0RpdlRpdGxlLmRhdGFzZXQueGluID0gajsKICAgICAgICAgICAgICAgICAgICBvRGl2VGl0bGUuaW5uZXJIVE1MID0nPHNwYW4gY2xhc3M9ImlxeGluLXBvaW50ZXItZXZlbnRzIj4nICsgZGV0YWlsc1tqXVswXSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImlxeGluLXRpdGxlLWVkaXQiIHRpdGxlPSLnvJbovpEgRWRpdCI+PGltZyBjbGFzcz0ic2VqLWVuZ2luZS1pY29uIiBzcmM9IicgKyBpY29uLmVkaXQgKyAnIi8+PC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIDxzcGFuIGNsYXNzPSJpcXhpbi1zZXQtdGl0bGUtZGVsIiB0aXRsZT0i5Yig6ZmkIERlbGV0ZSI+PGltZyBjbGFzcz0ic2VqLWVuZ2luZS1pY29uIiBzcmM9IicgKyBpY29uLmRlbCArICciPjwvc3Bhbj4nOwogICAgICAgICAgICAgICAgICAgIG9kaXYuYXBwZW5kQ2hpbGQob0RpdlRpdGxlKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG9EaXZDb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICAgICAgICBvRGl2Q29uLmNsYXNzTGlzdC5hZGQoInNlamNvbiIpOwogICAgICAgICAgICAgICAgICAgIHZhciBvRGl2Q29uU3RyID0gIiI7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVuZ2luZUxpc3RJdG1lID0gZW5naW5lTGlzdFtkZXRhaWxzW2pdWzFdXTsKICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbUxlbmd0aCA9IGVuZ2luZUxpc3RJdG1lLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGlpPTA7aWk8aXRlbUxlbmd0aDtpaSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpqID0gaWk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW5naW5lTGlzdEl0bWVbampdKXticmVha307CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gYVBhdHRlcm4ucmVwbGFjZSgnJG5hbWUkJywgZW5naW5lTGlzdEl0bWVbampdLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJyRmYXZpY29uJCcsIGVuZ2luZUxpc3RJdG1lW2pqXS5mYXZpY29uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCIkeGluJCIsamopOwogICAgICAgICAgICAgICAgICAgICAgICAvLyDmt7vliqDlsZ7mgKcKICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGEucmVwbGFjZSgiJGltZyQiLCBlbmdpbmVMaXN0SXRtZVtqal0uZmF2aWNvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCIkdGl0bGUkIiwgZW5naW5lTGlzdEl0bWVbampdLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiJGxpbmskIiwgZW5naW5lTGlzdEl0bWVbampdLnVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmdpbmVMaXN0SXRtZVtqal0uYmxhbmspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBhLnJlcGxhY2UoJyRibGFuayQnLCAiX2JsYW5rIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gYS5yZXBsYWNlKCdkYXRhLWlxeGludGFyZ2V0PSIkYmxhbmskIicsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZ2luZUxpc3RJdG1lW2pqXS5kaXNhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gYS5yZXBsYWNlKCckZGlzYWJsZWQkJywgInRydWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBhLnJlcGxhY2UoJ2RhdGEtaXF4aW5kaXNhYmxlZD0iJGRpc2FibGVkJCInLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmdpbmVMaXN0SXRtZVtqal0uZ2JrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gYS5yZXBsYWNlKCckZ2JrJCcsICJ0cnVlIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gYS5yZXBsYWNlKCdkYXRhLWlxeGluZ2JrPSIkZ2JrJCInLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICBvRGl2Q29uU3RyICs9IGE7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgb0RpdkNvblN0ciArPSAiPHNwYW4gY2xhc3M9J2lxeGluLWFkZGl0ZW0nPis8L3NwYW4+IjsKCiAgICAgICAgICAgICAgICAgICAgb0RpdkNvbi5pbm5lckhUTUwgPSBvRGl2Q29uU3RyOwogICAgICAgICAgICAgICAgICAgIG9kaXYuYXBwZW5kQ2hpbGQob0RpdkNvbik7CgogICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlLmFwcGVuZENoaWxkKG9kaXYpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyDmm7TlpJrorr7nva4g6I+c5Y2VCiAgICAgICAgICAgICAgICB2YXIgYnRuRWxlMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICAgICAgYnRuRWxlMi5pZCA9ICJidG5FbGUyIgogICAgICAgICAgICAgICAgdmFyIGZpeGVkVG9wX2NoZWNrZWQgPSBnZXRTZXR0aW5nRGF0YS5maXhlZFRvcD8iY2hlY2tlZCI6IiI7CiAgICAgICAgICAgICAgICB2YXIgZml4ZWRUb3BVcHdhcmRfY2hlY2tlZCA9IGdldFNldHRpbmdEYXRhLmZpeGVkVG9wVXB3YXJkPyJjaGVja2VkIjoiIjsKICAgICAgICAgICAgICAgIC8vIHZhciBkZWJ1Z19jaGVja2VkID0gZ2V0U2V0dGluZ0RhdGEuZGVidWc/ImNoZWNrZWQiOiIiOwogICAgICAgICAgICAgICAgdmFyIHRyYW5zaXRpb25fY2hlY2tlZCA9IGdldFNldHRpbmdEYXRhLnRyYW5zdGlvbj8iY2hlY2tlZCI6IiI7CiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0U2VhcmNoX2NoZWNrZWQgPSBnZXRTZXR0aW5nRGF0YS5zZWxlY3RTZWFyY2g/ImNoZWNrZWQiOiIiOwogICAgICAgICAgICAgICAgdmFyIGZvbGRsaXN0X2NoZWNrZWQgPSBnZXRTZXR0aW5nRGF0YS5mb2xkbGlzdD8iY2hlY2tlZCI6IiI7CiAgICAgICAgICAgICAgICB2YXIgYWxsT3Blbl9jaGVja2VkID0gZ2V0U2V0dGluZ0RhdGEuYWxsT3Blbj8iY2hlY2tlZCI6IiI7CiAgICAgICAgICAgICAgICB2YXIgSGlkZVRoZVNhbWVMaW5rX2NoZWNrZWQgPSBnZXRTZXR0aW5nRGF0YS5IaWRlVGhlU2FtZUxpbms/ImNoZWNrZWQiOiIiOwoKICAgICAgICAgICAgICAgIC8vIHZhciBzZXRCdG5PcGFjaXR5X3ZhbHVlID0gZ2V0U2V0dGluZ0RhdGEuc2V0QnRuT3BhY2l0eTsKICAgICAgICAgICAgICAgIHZhciBidG5TdHIyID0gIjxkaXY+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiPHNwYW4gaWQ9J3hpbi1yZXNldCcgdGl0bGU9J+aFjueCuSzlh7rljoLph43nva4nPua4heepuuiuvue9rjwvc3Bhbj4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3BhbiBpZD0neGluLW1vZGlmaWNhdGlvbicgdGl0bGU9J2VkaXQg5YiG5Lqr6Ieq5bex55qE6YWN572u5oiW5riF56m66YWN572uJz7phY3nva7mlofku7Y8L3NwYW4+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiPHNwYW4gaWQ9J3hpbi1pbXBvcnRpbmcnIHRpdGxlPSdpbXBvcnRpbmcg5a+85YWl5pu05Li65LiT5Lia55qE5pCc57Si5byV5pOOJz7lr7zlhaU8L3NwYW4+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHNwYW4gaWQ9J3hpbi1zZWxlY3RTZWFyY2gnIHRpdGxlPSfliJLor43mkJzntKIsIOWPquaciemdnuaQnOe0oumhtemdouaJjeS8mueUn+aViCwg5byA5YWz5Yqf6IO96ZyA6KaB5Yi35paw6aG16Z2iJz4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGxhYmVsPuWIkuivjeaQnOe0ojxpbnB1dCBpZD0naXF4aW4tc2VsZWN0U2VhcmNoJyB0eXBlPSdjaGVja2JveCcgbmFtZT0nJyAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RTZWFyY2hfY2hlY2tlZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzdHlsZT0ndmVydGljYWwtYWxpZ246bWlkZGxlOyc+PC9sYWJlbD4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L3NwYW4+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiPHNwYW4gaWQ9J2lxeGluLWRlYnVnUycgdGl0bGU9J+Wvueiuvue9ruiPnOWNleacieS4gOWumueahOW9seWTjSc+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIjxsYWJlbD5kZWJ1ZzxpbnB1dCBpZD0naXF4aW4tZGVidWcnIHR5cGU9J2NoZWNrYm94JyBuYW1lPScnICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBkZWJ1Z19jaGVja2VkICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAiIHN0eWxlPSd2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Jz48L2xhYmVsPiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIjwvc3Bhbj4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3BhbiBpZD0neGluLXRyYW5zdGlvbicgdGl0bGU9J+WKqOeUuyzor6Xorr7nva7pnIDopoHliLfmlrDpobXpnaLnlJ/mlYgnPiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8bGFiZWw+5Yqo55S7PGlucHV0IGlkPSdpcXhpbi10cmFuc3Rpb24nIHR5cGU9J2NoZWNrYm94JyBuYW1lPScnICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25fY2hlY2tlZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzdHlsZT0ndmVydGljYWwtYWxpZ246bWlkZGxlOyc+PC9sYWJlbD4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L3NwYW4+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHNwYW4gaWQ9J3hpbi1mb2xkbGlzdHMnIHRpdGxlPSflsIblvZPliY3miYDlnKjmkJzntKLliIbnsbvmipjlj6AnPiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8bGFiZWw+5oqY5Y+g5b2T5YmN5pCc57Si5YiG57G7PGlucHV0IGlkPSdpcXhpbi1mb2xkbGlzdCcgdHlwZT0nY2hlY2tib3gnIG5hbWU9JycgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRsaXN0X2NoZWNrZWQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc3R5bGU9J3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsnPjwvbGFiZWw+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zcGFuPiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzcGFuIGlkPSdpcXhpbi1maXhlZFRvcFMnIHRpdGxlPSdmaXhlZFRvcCDlvZPmu5rliqjpobXpnaLml7Ys5Zu65a6a5Yiw6aG16Z2i6aG256uv44CC5p+Q5Lqb6aG16Z2i55qE5qC35byP5a2Y5Zyo6Zeu6aKYJz4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGxhYmVsPuWbuuWumuWIsOmhtuerrzxpbnB1dCBpZD0naXF4aW4tZml4ZWRUb3AnIHR5cGU9J2NoZWNrYm94JyBuYW1lPScnICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZFRvcF9jaGVja2VkICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHN0eWxlPSd2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Jz48L2xhYmVsPiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvc3Bhbj4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3BhbiBpZD0naXF4aW4tZml4ZWRUb3BVcHdhcmQnIHRpdGxlPSflm7rlrprliLDpobbnq6/lkI4s5LuF5ZCR5LiK5rua5Yqo5omN5pi+56S6LOmcgOimgeWIt+aWsOe9kemhteeUn+aViCc+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxsYWJlbD7ku4XkuIrmi4nmmL7npLo8aW5wdXQgaWQ9J2lxeGluLWZpeGVkVG9wVXB3YXJkLWl0ZW0nIHR5cGU9J2NoZWNrYm94JyBuYW1lPScnICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZFRvcFVwd2FyZF9jaGVja2VkICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHN0eWxlPSd2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Jz48L2xhYmVsPiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvc3Bhbj4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3BhbiBpZD0neGluLUhpZGVUaGVTYW1lTGluaycgdGl0bGU9J+makOiXj+WQjOermemTvuaOpSzlpoLmnpzmg7PlnKjlkIzkuIDkuKrmkJzntKLnvZHnq5ks5L2G5piv5oOz6YCa6L+H5LiN5ZCM6K+t6KiA5p2l5pCc57SiLCDlj6/ku6Xlj5bmtojor6XpgInpobknPiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8bGFiZWw+6ZqQ6JeP5ZCM56uZ6ZO+5o6lPGlucHV0IGlkPSdpcXhpbi1IaWRlVGhlU2FtZUxpbmsnIHR5cGU9J2NoZWNrYm94JyBuYW1lPScnICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWRlVGhlU2FtZUxpbmtfY2hlY2tlZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzdHlsZT0ndmVydGljYWwtYWxpZ246bWlkZGxlOyc+PC9sYWJlbD4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L3NwYW4+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHNwYW4gaWQ9J3hpbi1zZXRCdG5PcGFjaXR5JyB0aXRsZT0n6K6+572u5oyJ6ZKu6YCP5piO5bqmLOmcgOimgeWIt+aWsOmhtemdoic+6K6+572u5oyJ6ZKu6YCP5piO5bqmIDxpbnB1dCB0eXBlPSdyYW5nZScgc3RlcD0nMC4wNScgIG1pbj0nMCcgbWF4PScxJyB2YWx1ZT0nIisgKGdldFNldHRpbmdEYXRhLnNldEJ0bk9wYWNpdHk8MD8tZ2V0U2V0dGluZ0RhdGEuc2V0QnRuT3BhY2l0eTpnZXRTZXR0aW5nRGF0YS5zZXRCdG5PcGFjaXR5KSArIicgaWQ9J3NldEJ0bk9wYWNpdHlSYW5nZSc+PGkgc3R5bGU9J2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjNlbTt0ZXh0LWFsaWduOmNlbnRlcjsnIGNsYXNzPSdpcXhpbi1zZXRCdG5PcGFjaXR5UmFuZ2VWYWx1ZScgdGl0bGU9J+aMiemSriDmmL7npLov6ZqQ6JePKOmdnumAj+aYjikpLOivt+ehruWumuefpemBk+iHquW3seWmguS9leWGjeasoeaJk+W8gDsg54Gr54uQ6Z2e6auY57qn546p5a625bu66K6u5Yir56aB55SoJz48L2k+PC9zcGFuPiIgKwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L2Rpdj4iIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICI8ZGl2PjxzcGFuPnRlc3Q8L3NwYW4+PC9kaXY+IjsKICAgICAgICAgICAgICAgIGJ0bkVsZTIuaW5uZXJIVE1MID0gYnRuU3RyMjsKICAgICAgICAgICAgICAgIHRoaXMuZWxlLmFwcGVuZENoaWxkKGJ0bkVsZTIpOwoKCiAgICAgICAgICAgICAgICAvLyDmt7vliqDmjInpkq4KICAgICAgICAgICAgICAgIHZhciBidG5FbGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICAgIGJ0bkVsZS5pZCA9ICJidG5FbGUiCgogICAgICAgICAgICAgICAgdmFyIGJ0blN0ciA9ICI8ZGl2IGNsYXNzPSdidG5FbGVMYXllcic+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHNwYW4gY2xhc3M9J2ZlZWRiYWNrJyB0aXRsZT0n5ZyoIEdyZWFzeUZvcmsg6L+b6KGM5Y+N6aaIJz48YSB0YXJnZXQ9J19ibGFuaycgaHJlZj0naHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzI3NzUyLXNlYXJjaGVuZ2luZWp1bXAnPkdyZWFzeSBGb3JrPC9hPjwvc3Bhbj4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3BhbiBjbGFzcz0nZmVlZGJhY2snIHRpdGxlPSflnKggR2l0aHViIOi/m+ihjOWPjemmiCc+PGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9xeGluR2l0SHViL3NlYXJjaEVuZ2luZUp1bXAnPkdpdEh1YjwvYT48L3NwYW4+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHNwYW4gaWQ9J3hpbi1hbGxPcGVuJyB0aXRsZT0n5ZCO5Y+w5omT5byA6K+l5pCc57Si5YiG57G755qE5omA5pyJ572R56uZJz4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGxhYmVsPuS4gOmUruaQnOe0ojxpbnB1dCBpZD0naXF4aW4tYWxsT3Blbi1pdGVtJyB0eXBlPSdjaGVja2JveCcgbmFtZT0nJyAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsT3Blbl9jaGVja2VkICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHN0eWxlPSd2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Jz48L2xhYmVsPiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvc3Bhbj4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3BhbiBpZD0neGluLWNlbnRlckRpc3BsYXknIHRpdGxlPSdjZW50ZXIg5bGF5Lit5pi+56S644CC5Li76KaB5piv5YW85a65QUMtYmFpZHU66YeN5a6a5ZCR5LyY5YyW55m+5bqm5pCc54uX6LC35q2M5pCc57SiX+WOu+W5v+WRil9mYXZpY29uX+WPjOWIlyc+5bGF5Lit77yaIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzZWxlY3QgaWQ9J2lxeGluLWNlbnRlcic+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8b3B0aW9uIHZhbHVlPSdvcmlnaW5hbCciICsgKGdldFNldHRpbmdEYXRhLmNlbnRlciA9PSAwPyJzZWxlY3RlZCI6IiIpICArICI+6buY6K6kIOKWvTwvb3B0aW9uPiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPG9wdGlvbiB2YWx1ZT0nZm9yY2UnIiArIChnZXRTZXR0aW5nRGF0YS5jZW50ZXIgPT0gMT8ic2VsZWN0ZWQiOiIiKSAgKyAiPuW8uuWItiDilr08L29wdGlvbj4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxvcHRpb24gdmFsdWU9J2F1dG8nIiArIChnZXRTZXR0aW5nRGF0YS5jZW50ZXIgPT0gMj8ic2VsZWN0ZWQiOiIiKSAgKyAiPuiHquWKqCDilr08L29wdGlvbj4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zZWxlY3Q+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zcGFuPiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3BhbiBpZD0neGluLW5ld3RhYicgdGl0bGU9J29wZW4gbmV3dGFiIOaYr+WQpumHh+eUqOaWsOagh+etvumhteaJk+W8gOeahOaWueW8jyc+5omT5byA5pa55byP77yaIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzZWxlY3QgaWQ9J2lxeGluLWdsb2JhbE5ld3RhYic+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8b3B0aW9uIHZhbHVlPSdnbG9iYWxEZWYnPum7mOiupOmhtemdoiDilr08L29wdGlvbj4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxvcHRpb24gdmFsdWU9J2dsb2JhbE5ld3RhYiciICsgKGdldFNldHRpbmdEYXRhLm5ld3RhYj8ic2VsZWN0ZWQiOiIiKSAgKyAiPuaWsOagh+etvumhtSDilr08L29wdGlvbj4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zZWxlY3Q+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9zcGFuPiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3BhbiBpZD0neGluLWFkZERlbCcgdGl0bGU9J2FkZCAmIGRlbCDlop7liqDmlrDnmoTmiJbogIXliKDpmaTnjrDmnInnmoTmkJzntKInPuWinuWKoCAvIOWIoOmZpDwvc3Bhbj4gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHNwYW4gaWQ9J21vcmVTZXQnIHRpdGxlPSdtb3JlIHNldCc+5pu05aSa6K6+572uPC9zcGFuPiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzcGFuIGlkPSd4aW4tc2F2ZScgdGl0bGU9J3NhdmUgJiBjbG9zZSc+5L+d5a2Y5bm25YWz6ZetPC9zcGFuPiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvZGl2PiI7CiAgICAgICAgICAgICAgICBidG5FbGUuaW5uZXJIVE1MID0gYnRuU3RyOwogICAgICAgICAgICAgICAgdGhpcy5lbGUuYXBwZW5kQ2hpbGQoYnRuRWxlKTsKCiAgICAgICAgICAgICAgICAvLyDlj6/ku6Xmi5bliqjnmoTpobbmoI8KICAgICAgICAgICAgICAgIHZhciBkcmFnRG9tID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgICAgICBkcmFnRG9tLmlkID0gImRyYWdEb20iOwogICAgICAgICAgICAgICAgZHJhZ0RvbS5zdHlsZS5jc3NUZXh0ID0gImhlaWdodDoxNnB4O3dpZHRoOjk3JTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtjdXJzb3I6bW92ZTsiOwogICAgICAgICAgICAgICAgdGhpcy5lbGUuYXBwZW5kQ2hpbGQoZHJhZ0RvbSk7CgogICAgICAgICAgICAgICAgLy8g5aKe5Yqg5pCc57Si5YiX6KGoCiAgICAgICAgICAgICAgICB2YXIgblNlYXJjaExpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICAgIG5TZWFyY2hMaXN0LmlkID0gIm5TZWFyY2hMaXN0IjsKICAgICAgICAgICAgICAgIG5TZWFyY2hMaXN0LnN0eWxlLmNzc1RleHQgPSAidmlzaWJpbGl0eTpoaWRkZW47b3BhY2l0eTowO3RyYW5zaXRpb246MC4zcztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MTAlO3JpZ2h0OjUlO3BhZGRpbmc6NXB4IDEwcHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyOjFweCBzb2xpZCAjRUM2RDUxO2NvbG9yOiNlYzZkNTE7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDojZmZmOyI7CiAgICAgICAgICAgICAgICBuU2VhcmNoTGlzdC5pbm5lckhUTUwgPSAi5aKe5Yqg5paw55qE5pCc57Si5YiX6KGoIjsKICAgICAgICAgICAgICAgIHRoaXMuZWxlLmFwcGVuZENoaWxkKG5TZWFyY2hMaXN0KTsKCiAgICAgICAgICAgICAgICAvLyDlhbPpl63mjInpkq4KICAgICAgICAgICAgICAgIGlmKGdldFNldHRpbmdEYXRhLmNsb3NlQnRuKXsKICAgICAgICAgICAgICAgICAgICB2YXIgY2xvc2VidG5FTGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgICAgICAgICAgICAgY2xvc2VidG5FTGUuaWQgPSAieGluLWNsb3NlIjsKICAgICAgICAgICAgICAgICAgICBjbG9zZWJ0bkVMZS5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiY2xvc2Ug5YWz6ZetIik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGUuYXBwZW5kQ2hpbGQoY2xvc2VidG5FTGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBzaG93OiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5tYXNrLnN0eWxlOwogICAgICAgICAgICAgICAgdmFyIGVsZVN0eWxlID0gdGhpcy5lbGUuc3R5bGU7CiAgICAgICAgICAgICAgICBzdHlsZS5kaXNwbGF5ID0gImZsZXgiOwogICAgICAgICAgICAgICAgZWxlU3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZVkoLTIwJSkiOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOwoKICAgICAgICAgICAgICAgIHRoaXMud2luZG93UmVzaXplKCk7CgogICAgICAgICAgICAgICAgLy8gaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigieGluLW5ld3RhYiIpKXsKICAgICAgICAgICAgICAgIC8vICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjeGluLW5ld3RhYiIpLnF1ZXJ5U2VsZWN0b3JBbGwoIm9wdGlvbiIpW2dldFNldHRpbmdEYXRhLm5ld3RhYl0uc2V0QXR0cmlidXRlKCJzZWxlY3RlZCIsInNlbGVjdGVkIik7CiAgICAgICAgICAgICAgICAvLyB9CgogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGUub3BhY2l0eSA9IDE7CiAgICAgICAgICAgICAgICAgICAgZWxlU3R5bGUudHJhbnNmb3JtID0gIm5vbmUiOwogICAgICAgICAgICAgICAgfSwgMzApOwogICAgICAgICAgICB9LAogICAgICAgICAgICBoaWRlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdGhpcy5hbGxCb3hDbG9zZSgpOyAvLyDlhbPpl63miYDmnInmrKHnuqfnqpflj6PjgIHoj5zljZUKCiAgICAgICAgICAgICAgICB2YXIgc3R5bGUgPSB0aGlzLm1hc2suc3R5bGU7CiAgICAgICAgICAgICAgICB0aGlzLmVsZS5zdHlsZS50cmFuc2Zvcm0gPSAidHJhbnNsYXRlWSgyMCUpIjsKICAgICAgICAgICAgICAgIHN0eWxlLm9wYWNpdHkgPSAwOwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImF1dG8iOwogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBpZihjb25maXJtKCLlsIbkvJrliKDpmaTnlKjmiLforr7nva7vvIEiKSl7CiAgICAgICAgICAgICAgICAgICAgR01fZGVsZXRlVmFsdWUoInNlYXJjaEVuZ2luZUp1bXBEYXRhIik7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyDlop7liqAg4oCc5re75Yqg5Yig6Zmk5qGG4oCdCiAgICAgICAgICAgIGFkZERlbDogZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJpcXhpbi1idG4tYWN0aXZlIikpewogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkRGVscmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCLkuI3lrZjlnKgs5aKe5Yqg5aKe5YqgIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9idG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjeGluLWFkZERlbCIpOwogICAgICAgICAgICAgICAgICAgIG9idG4uY2xhc3NMaXN0LmFkZCgiaXF4aW4tYnRuLWFjdGl2ZSIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgb2RvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pcXhpbi1zZXQtZGVsIik7CiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKG9kb20sZnVuY3Rpb24oZGl2KXsKICAgICAgICAgICAgICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoImlxeGluLXNldC1hY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy8g5qCH6aKY5re75Yqg5Yig6Zmk5qGGCiAgICAgICAgICAgICAgICAgICAgdmFyIG9kb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuaXF4aW4tc2V0LXRpdGxlLWRlbCIpOwogICAgICAgICAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbChvZG9tLGZ1bmN0aW9uKGRpdil7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGRpdik7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJpcXhpbi1zZXQtYWN0aXZlIik7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIOWinuWKoOWNleS4quaQnOe0ogogICAgICAgICAgICAgICAgICAgIHZhciBvaXRlbUFkZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pcXhpbi1hZGRpdGVtIik7CiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKG9pdGVtQWRkLGZ1bmN0aW9uKGRpdil7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGRpdik7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCJpcXhpbi1zZXQtYWN0aXZlIik7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIOa3u+WKoOaQnOe0ouWIl+ihqAogICAgICAgICAgICAgICAgICAgIHZhciBvbGlzdEFkZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNuU2VhcmNoTGlzdCIpOwogICAgICAgICAgICAgICAgICAgIG9saXN0QWRkLmNsYXNzTGlzdC5hZGQoImlxeGluLXNldC1hY3RpdmUiKTsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIOWFs+mXrSDigJzmt7vliqDliKDpmaTmoYbigJ0KICAgICAgICAgICAgYWRkRGVscmVtb3ZlOiBmdW5jdGlvbihib29sKXsKICAgICAgICAgICAgICAgIHZhciBvYnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmlxeGluLWJ0bi1hY3RpdmUiKTsKICAgICAgICAgICAgICAgIGlmKG9idG4pewogICAgICAgICAgICAgICAgICAgIG9idG4uY2xhc3NMaXN0LnJlbW92ZSgiaXF4aW4tYnRuLWFjdGl2ZSIpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgb2RvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pcXhpbi1zZXQtYWN0aXZlIik7CiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKG9kb20sZnVuY3Rpb24oZGl2KXsKICAgICAgICAgICAgICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5yZW1vdmUoImlxeGluLXNldC1hY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG9pdGVtQWRkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmlxeGluLWFkZGl0ZW0iKTsKICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwob2l0ZW1BZGQsZnVuY3Rpb24oZGl2KXsKICAgICAgICAgICAgICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5yZW1vdmUoImlxeGluLXNldC1hY3RpdmUiKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbUJveFJlbW92ZSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8g55WM6Z2iLOahhu+8mua3u+WKoOaWsOeahOaQnOe0ogogICAgICAgICAgICBhZGRJdGVtQm94OiBmdW5jdGlvbihib29sKXsKICAgICAgICAgICAgICAgIHRoaXMuaXNPbmxpbmUoKTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbUJveFJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHZhciBuZXdEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICAgIG5ld0Rpdi5pZD0gIm5ld1NlYXJjaEJveCI7CiAgICAgICAgICAgICAgICBuZXdEaXYuc3R5bGUuY3NzVGV4dCA9ICJ0b3A6NDMlO29wYWNpdHk6MC4xOyI7CiAgICAgICAgICAgICAgICBuZXdEaXYuaW5uZXJIVE1MPSIiKwogICAgICAgICAgICAgICAgICAgICI8c3Bhbj7moIcmbmJzcDsmbmJzcDsmbmJzcCZuYnNwJm5ic3AmbmJzcCZuYnNw6aKYIDogPC9zcGFuPjxpbnB1dCBpZD0naXF4aW4tbmV3VGl0bGUnIHBsYWNlaG9sZGVyPSflv4XloasnIG9uZm9jdXM9J3RoaXMuc2VsZWN0KCknIC8+IDxici8+PGJyLz4iICsKICAgICAgICAgICAgICAgICAgICAiPHNwYW4+6ZO+Jm5ic3A7Jm5ic3A7Jm5ic3AmbmJzcCZuYnNwJm5ic3AmbmJzcOaOpSA6IDwvc3Bhbj48aW5wdXQgaWQ9J2lxeGluLW5ld0xpbmsnIHBsYWNlaG9sZGVyPSflv4XloasnIG9uZm9jdXM9J3RoaXMuc2VsZWN0KCknIC8+IDxici8+PGJyLz4iICsKICAgICAgICAgICAgICAgICAgICAiPHNwYW4+5Zu+Jm5ic3A7Jm5ic3A7Jm5ic3AmbmJzcCZuYnNwJm5ic3AmbmJzcOaghyA6IDwvc3Bhbj48aW5wdXQgaWQ9J2lxeGluLW5ld0ljb24nIHBsYWNlaG9sZGVyPSfpgInloass55WZ56m65YiZ6Ieq5Yqo6I635Y+WJyBvbmZvY3VzPSd0aGlzLnNlbGVjdCgpJyAvPiA8YnIvPjxici8+IiArCiAgICAgICAgICAgICAgICAgICAgIjxzcGFuPuaJk+W8gOaWueW8jyA6ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHNlbGVjdCBpZD0iaXF4aW4tbmV3VGFyZ2V0IiBzdHlsZT0iYm9yZGVyLXJhZGl1czogNHB4O2JvcmRlcjogbm9uZTtwYWRkaW5nOiAycHggMCAycHggMnB4Ij4gJyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8b3B0aW9uIHZhbHVlPSJkZWZhdWx0Ij7mlrDmoIfnrb7pobXmiZPlvIA8L29wdGlvbj4gJyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8b3B0aW9uIHZhbHVlPSJuZXd0YWIiPuW9k+WJjemhteaJk+W8gDwvb3B0aW9uPiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzZWxlY3Q+ICcgKwogICAgICAgICAgICAgICAgICAgICI8L3NwYW4+IiArCiAgICAgICAgICAgICAgICAgICAgIjxici8+PGJyLz4iICsKICAgICAgICAgICAgICAgICAgICAiPHNwYW4gc3R5bGU9Jyc+PGEgdGFyZ2V0PSdfYmxhbmsnIHN0eWxlPSdjb2xvcjojOTk5OycgaHJlZj0naHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzI3NzUyLXNlYXJjaGVuZ2luZWp1bXAnPuebuOWFs+S9v+eUqOivtOaYjjwvYT48L3NwYW4+IiArCiAgICAgICAgICAgICAgICAgICAgIiZuYnNwOyZuYnNwOyZuYnNwJm5ic3AmbmJzcCZuYnNwJm5ic3A7IiArCiAgICAgICAgICAgICAgICAgICAgIjxidXR0b24gaWQ9J2FkZEl0ZW1Cb3hFbnRlcicgY2xhc3M9J2FkZEl0ZW1Cb3hFbnRlciBhZGRJdGVtQm94QnRuIGlxeGluLWVudGVyQnRuJz7noa7lrpo8L2J1dHRvbj4mbmJzcDsmbmJzcDsmbmJzcCZuYnNwJm5ic3A7Jm5ic3AiICsKICAgICAgICAgICAgICAgICAgICAiPGJ1dHRvbiBpZD0nYWRkSXRlbUJveENhbmNlbCcgY2xhc3M9J2FkZEl0ZW1Cb3hDYW5jZWwgYWRkSXRlbUJveEJ0biBpcXhpbi1jbG9zZUJ0bic+5Y+W5raIPC9idXR0b24+IiArCiAgICAgICAgICAgICAgICAgICAgIiI7CgogICAgICAgICAgICAgICAgdGhpcy5lbGUuYXBwZW5kQ2hpbGQobmV3RGl2KTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtuZXdEaXYuc3R5bGUuY3NzVGV4dD0iIjt9LDEwKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpcXhpbi1uZXdUaXRsZSIpLmZvY3VzKCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIOWGhemDqOmAu+i+kSzvvJrmt7vliqDmlrDnmoTmkJzntKIKICAgICAgICAgICAgYWRkSXRlbUVuZ2VyOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIG90aXRsZSxvbGluayxvaW1nLG9ibGFuazsKICAgICAgICAgICAgICAgIG90aXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpcXhpbi1uZXdUaXRsZSIpLnZhbHVlOwogICAgICAgICAgICAgICAgb2xpbmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaXF4aW4tbmV3TGluayIpLnZhbHVlOwogICAgICAgICAgICAgICAgb2ltZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpcXhpbi1uZXdJY29uIikudmFsdWU7CiAgICAgICAgICAgICAgICBvYmxhbmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaXF4aW4tbmV3VGFyZ2V0Iikuc2VsZWN0ZWRJbmRleDsKCiAgICAgICAgICAgICAgICBpZiAoIW9pbWcpewogICAgICAgICAgICAgICAgICAgIG9pbWcgPSB0aGlzLmdldElDT04ob2xpbmspOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBhID0gJzxzcGFuIGNsYXNzPSJzZWotZW5naW5lIicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBkYXRhLWlxeGluaW1nPSIkaW1nJCIgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGRhdGEtaXF4aW50aXRsZT0iJHRpdGxlJCIgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGRhdGEtaXF4aW5saW5rPSIkbGluayQiICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBkYXRhLWlxeGludGFyZ2V0PSIkYmxhbmskIiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc+PGltZyBzcmM9IiRmYXZpY29uJCIgY2xhc3M9InNlai1lbmdpbmUtaWNvbiIgLz4kbmFtZSQ8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImlxeGluLXNldC1lZGl0IiB0aXRsZT0i57yW6L6RIEVkaXQiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8aW1nIGNsYXNzPSJzZWotZW5naW5lLWljb24iIHNyYz0iJyArIGljb24uZWRpdCArICciPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4gJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImlxeGluLXNldC1kZWwgaXF4aW4tc2V0LWFjdGl2ZSIgdGl0bGU9IuWIoOmZpCBEZWxldGUiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8aW1nIGNsYXNzPSJzZWotZW5naW5lLWljb24iIHNyYz0iJyArIGljb24uZGVsICsgJyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicgOwoKICAgICAgICAgICAgICAgIGEgPSBhLnJlcGxhY2UoIiRpbWckIiwgb2ltZykKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiJHRpdGxlJCIsIG90aXRsZSkKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgiJGxpbmskIiwgb2xpbmspOwoKICAgICAgICAgICAgICAgIGlmIChvYmxhbmspewogICAgICAgICAgICAgICAgICAgIGEgPSBhLnJlcGxhY2UoJ2RhdGEtaXF4aW50YXJnZXQ9IiRibGFuayQiJywgJycpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBhID0gYS5yZXBsYWNlKCckYmxhbmskJywgIl9ibGFuayIpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBhID0gYS5yZXBsYWNlKCckbmFtZSQnLCBvdGl0bGUpCiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJyRmYXZpY29uJCcsIG9pbWcpOwoKICAgICAgICAgICAgICAgIHZhciBvc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgICAgICAgICAgIG9zcGFuLmNsYXNzTmFtZSA9ICJkcmFnIjsKICAgICAgICAgICAgICAgIG9zcGFuLmlubmVySFRNTCA9IGE7CgogICAgICAgICAgICAgICAgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShvc3Bhbix0aGlzLnBhcmVudE5vZGUubGFzdENoaWxkKTsKCiAgICAgICAgICAgICAgICAvLyDmt7vliqDlrozmiJAs56e76Zmk5re75Yqg5qGGCiAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1Cb3hSZW1vdmUoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYWRkSXRlbUJveFJlbW92ZTogZnVuY3Rpb24oZWxlKXsKICAgICAgICAgICAgICAgIGVsZSA9IGVsZT9lbGU6IiNuZXdTZWFyY2hCb3giCiAgICAgICAgICAgICAgICB2YXIgbmV3Qm94ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGUpOwogICAgICAgICAgICAgICAgaWYobmV3Qm94KXsKICAgICAgICAgICAgICAgICAgICAvLyBuZXdCb3guc3R5bGUudHJhbnNmb3JtID0gInRyYW5zbGF0ZVkoMzAlKSI7CiAgICAgICAgICAgICAgICAgICAgbmV3Qm94LnN0eWxlLnRvcCA9ICI2MCUiOwogICAgICAgICAgICAgICAgICAgIG5ld0JveC5zdHlsZS5vcGFjaXR5ID0gIjAiOwogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm94LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobmV3Qm94KTsKICAgICAgICAgICAgICAgICAgICB9LDU1MCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIOiOt+WPluWbvuaghwogICAgICAgICAgICBnZXRJQ09OOiBmdW5jdGlvbihvbGluayl7CiAgICAgICAgICAgICAgICB2YXIgb3VybDsKICAgICAgICAgICAgICAgIHZhciBtYXJrOwogICAgICAgICAgICAgICAgdmFyIHVyaSA9IHBhcnNlVXJpKG9saW5rKTsKICAgICAgICAgICAgICAgIHZhciBvaHR0cCA9IHVyaS5wcm90b2NvbD91cmkucHJvdG9jb2w6Imh0dHAiOwogICAgICAgICAgICAgICAgdmFyIHNpdGVVUkwgPSBvaHR0cCArICI6Ly8iICsgdXJpLmhvc3Q7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhzaXRlVVJMKTsKCiAgICAgICAgICAgICAgICBpZihpc05hTihnZXRTZXR0aW5nRGF0YS5nZXRJY29uKSl7CiAgICAgICAgICAgICAgICAgICAgb3VybCA9IGdldFNldHRpbmdEYXRhLmdldEljb247CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG1hcmsgPSBwYXJzZUludChnZXRTZXR0aW5nRGF0YS5nZXRJY29uKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhtYXJrKTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hcmspewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IG91cmwgPSBzaXRlVVJMICsgIi9mYXZpY29uLmljbyI7YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogb3VybCA9ICdodHRwczovL3d3dy5nb29nbGUuY29tL3MyL2Zhdmljb25zP2RvbWFpbj0nK3NpdGVVUkw7YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogb3VybCA9ICdodHRwOi8vc3RhdGljcy5kbnNwb2QuY24vcHJveHlfZmF2aWNvbi9fL2Zhdmljb24/ZG9tYWluPScrdXJpLmhvc3Q7YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmKG91cmwpewogICAgICAgICAgICAgICAgICAgIG91cmwgPSBvdXJsLnJlcGxhY2UoIiVzIiwgc2l0ZVVSTCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3VybDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlYnVnKCLog73lkKbov57mjqXoh7Nnb29nbGXvvJoiLHRoaXMub25saW5lKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9ubGluZSl7CiAgICAgICAgICAgICAgICAgICAgb3VybCA9ICdodHRwczovL3d3dy5nb29nbGUuY29tL3MyL2Zhdmljb25zP2RvbWFpbj0nICsgdXJpLmhvc3Q7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91cmw7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIG91cmwgPSAgb2h0dHAgKyAiOi8vIiArIHVyaS5ob3N0ICsgIi9mYXZpY29uLmljbyI7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91cmw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyDnlYzpnaIsIOahhjog5re75Yqg5paw55qE5pCc57Si5YiX6KGoCiAgICAgICAgICAgIGFkZFNlYXJjaExpc3RCb3g6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB2YXIgb2RpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNuZXdTZWFyY2hMaXN0Qm94Iik7CiAgICAgICAgICAgICAgICBpZiAob2Rpdil7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5ib3hDbG9zZSgiI25ld1NlYXJjaExpc3RCb3giKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbmV3RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgICAgICBuZXdEaXYuaWQ9ICJuZXdTZWFyY2hMaXN0Qm94IjsKCiAgICAgICAgICAgICAgICB2YXIgbXlEYXRlID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgIC8vIHZhciBoYXNoID0gInVzZXIiICsgbXlEYXRlLmdldEZ1bGxZZWFyKCkgKyBteURhdGUuZ2V0TW9udGgoKSArIG15RGF0ZS5nZXREYXRlKCkgKyBteURhdGUuZ2V0SG91cnMoKSArbXlEYXRlLmdldE1pbnV0ZXMoKStteURhdGUuZ2V0U2Vjb25kcygpOwogICAgICAgICAgICAgICAgdmFyIGhhc2ggPSAidXNlciIgKyBteURhdGUuZ2V0VGltZSgpOwoKICAgICAgICAgICAgICAgIG5ld0Rpdi5pbm5lckhUTUw9IiIrCiAgICAgICAgICAgICAgICAgICAgIjxzcGFuPuWIl+ihqOWQjeensDogPC9zcGFuPjxpbnB1dCBpZD0naXF4aW4tbmV3U2VhcmNoTGlzdE5hbWUnIG9uZm9jdXM9J3RoaXMuc2VsZWN0KCknPiIgKwogICAgICAgICAgICAgICAgICAgICI8YnI+PGJyPiIgKwogICAgICAgICAgICAgICAgICAgICI8c3Bhbj7lhoXpg6jlkI3np7A6IDwvc3Bhbj48aW5wdXQgaWQ9J2lxeGluLW5ld1NlYXJjaExpc3RJbm5lck5hbWUnIG9uZm9jdXM9J3RoaXMuc2VsZWN0KCknIHZhbHVlPSciICsgaGFzaCArICInPiIgKwogICAgICAgICAgICAgICAgICAgICI8YnI+PGJyPiIgKwogICAgICAgICAgICAgICAgICAgICI8YnV0dG9uIGlkPSdhZGRTZWFyY2hMaXN0Qm94RW50ZXInIGNsYXNzPSdhZGRTZWFyY2hMaXN0Qm94RW50ZXIgYWRkSXRlbUJveEJ0bic+56Gu5a6aPC9idXR0b24+Jm5ic3A7Jm5ic3A7Jm5ic3AmbmJzcCZuYnNwOyZuYnNwIiArCiAgICAgICAgICAgICAgICAgICAgIjxidXR0b24gaWQ9J2FkZFNlYXJjaExpc3RCb3hDYW5jZWwnIGNsYXNzPSdhZGRTZWFyY2hMaXN0Qm94Q2FuY2VsIGFkZEl0ZW1Cb3hCdG4nPuWPlua2iDwvYnV0dG9uPiIgKwogICAgICAgICAgICAgICAgICAgICIiOwogICAgICAgICAgICAgICAgdGhpcy5lbGUuYXBwZW5kQ2hpbGQobmV3RGl2KTsKCiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaXF4aW4tbmV3U2VhcmNoTGlzdE5hbWUiKS5mb2N1cygpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBhZGRTZWFyY2hMaXN0RW5nZXI6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpcXhpbi1uZXdTZWFyY2hMaXN0TmFtZSIpLnZhbHVlOwogICAgICAgICAgICAgICAgdmFyIGlubmVyTmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpcXhpbi1uZXdTZWFyY2hMaXN0SW5uZXJOYW1lIikudmFsdWU7CgogICAgICAgICAgICAgICAgaWYoaW5uZXJOYW1lLmxlbmd0aD09PTApewogICAgICAgICAgICAgICAgICAgIGFsZXJ0KCLlhoXpg6jlkI3np7DkuI3og73kuLrnqboiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZihuYW1lLmxlbmd0aD09PTApewogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBpbm5lck5hbWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIG9kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICAgIG9kaXYuaWQgPSBpbm5lck5hbWU7CiAgICAgICAgICAgICAgICBvZGl2LmNsYXNzTmFtZSA9ICJpcXhpbi1pdGVtcyI7CiAgICAgICAgICAgICAgICBvZGl2LmlubmVySFRNTCA9ICIiICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0ic2VqdGl0bGUiIGRhdGEtaXF4aW50aXRsZT0iJyArIGlubmVyTmFtZSArICciIGRhdGEteGluPSI5OSI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iaXF4aW4tcG9pbnRlci1ldmVudHMiPicrIG5hbWUgKyc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iaXF4aW4tdGl0bGUtZWRpdCIgdGl0bGU9Iue8lui+kSBFZGl0Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8aW1nIGNsYXNzPSJzZWotZW5naW5lLWljb24iIHNyYz0iJyArIGljb24uZWRpdCArICciPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJpcXhpbi1zZXQtdGl0bGUtZGVsIGlxeGluLXNldC1hY3RpdmUiIHRpdGxlPSLliKDpmaQgRGVsZXRlIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8aW1nIGNsYXNzPSJzZWotZW5naW5lLWljb24iIHNyYz0iJyArIGljb24uZGVsICsgJyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJzZWpjb24iPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImlxeGluLWFkZGl0ZW0gaXF4aW4tc2V0LWFjdGl2ZSI+Kzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAiIjsKCiAgICAgICAgICAgICAgICAvLyB0aGlzLmJveENsb3NlKCIjbmV3U2VhcmNoTGlzdEJveCIpOwogICAgICAgICAgICAgICAgdGhpcy5hZGRJdGVtQm94UmVtb3ZlKCIjbmV3U2VhcmNoTGlzdEJveCIpOwoKICAgICAgICAgICAgICAgIHZhciBidG5FbGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYnRuRWxlIik7CiAgICAgICAgICAgICAgICBidG5FbGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUob2RpdixidG5FbGUpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgYm94Q2xvc2U6IGZ1bmN0aW9uKGVsZSl7CiAgICAgICAgICAgICAgICB2YXIgb2RpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlKTsKICAgICAgICAgICAgICAgIGlmKG9kaXYpewogICAgICAgICAgICAgICAgICAgIG9kaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvZGl2KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIOeVjOmdoiDmoYbvvJrkv67mlLnmoYYKICAgICAgICAgICAgYWRkRWRpdEJveDogZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbUJveFJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldC5wYXJlbnROb2RlLmZpcnN0Q2hpbGQ7CgogICAgICAgICAgICAgICAgdmFyIG90aXRsZSA9IHRhcmdldC5kYXRhc2V0LmlxeGludGl0bGU7CiAgICAgICAgICAgICAgICB2YXIgb2xpbmsgPSB0YXJnZXQuZGF0YXNldC5pcXhpbmxpbms7CiAgICAgICAgICAgICAgICB2YXIgb2ljb24gPSB0YXJnZXQuZGF0YXNldC5pcXhpbmltZzsKICAgICAgICAgICAgICAgIHZhciBvdGFyZ2V0ID0gdGFyZ2V0LmRhdGFzZXQuaXF4aW50YXJnZXQ7CiAgICAgICAgICAgICAgICB2YXIgb2Rpc2FibGVkID0gdGFyZ2V0LmRhdGFzZXQuaXF4aW5kaXNhYmxlZDsKICAgICAgICAgICAgICAgIGxldCBvR0JLID0gdGFyZ2V0LmRhdGFzZXQuaXF4aW5nYms7CgogICAgICAgICAgICAgICAgdGhpcy5lZGl0VGVtcCA9IHRhcmdldDsKCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvaWNvbik7CgogICAgICAgICAgICAgICAgdmFyIHN0cmJsYW5rOwogICAgICAgICAgICAgICAgaWYob3RhcmdldCl7CiAgICAgICAgICAgICAgICAgICAgc3RyYmxhbmsgPSAnPG9wdGlvbiB2YWx1ZT0iZGVmYXVsdCI+5paw5qCH562+6aG15omT5byAPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0ibmV3dGFiIj7lvZPliY3pobXmiZPlvIA8L29wdGlvbj4gJzsKICAgICAgICAgICAgICAgIH0gZWxzZXsKICAgICAgICAgICAgICAgICAgICBzdHJibGFuayA9ICc8b3B0aW9uIHZhbHVlPSJkZWZhdWx0Ij7mlrDmoIfnrb7pobXmiZPlvIA8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJuZXd0YWIiIHNlbGVjdGVkPSJzZWxlY3RlZCI+5b2T5YmN6aG15omT5byAPC9vcHRpb24+JzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgc3RyR0JLID0gIiI7CiAgICAgICAgICAgICAgICBpZihvR0JLKXsKICAgICAgICAgICAgICAgICAgICBzdHJHQksgPSAiY2hlY2tlZD0nY2hlY2tlZCciOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBuZXdEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICAgIG5ld0Rpdi5pZD0gIm5ld1NlYXJjaEJveCI7CiAgICAgICAgICAgICAgICAvLyDku47pvKDmoIfngrnlh7vmiYDlnKjnmoTpobnnm67lsZXlvIDoj5zljZUoMjAyMS0wMy0xNizku47kuIrnur/oh7Pku4os5Yqo55S75LiA55u05pyJ5Y2h6aG/546w6LGhKQogICAgICAgICAgICAgICAgLy8gbmV3RGl2LnN0eWxlLmNzc1RleHQgPSAidG9wOiIrKGUuc2NyZWVuWS0xMjApICsicHg7bGVmdDoiKyhlLnNjcmVlblgtMTQwKSArInB4OyI7CiAgICAgICAgICAgICAgICBuZXdEaXYuc3R5bGUuY3NzVGV4dCA9ICJ0b3A6NDMlO29wYWNpdHk6MC4xOyI7CiAgICAgICAgICAgICAgICB2YXIgaW5uZXJIVE1MPWAKICAgICAgICAgICAgICAgICAgICA8c3Bhbj7moIcmbmJzcDsmbmJzcDsmbmJzcCZuYnNwJm5ic3AmbmJzcCZuYnNw6aKYIDogPC9zcGFuPjxpbnB1dCBpZD0iaXF4aW4tbmV3VGl0bGUiIHBsYWNlaG9sZGVyPSLlv4XloasiIG9uZm9jdXM9InRoaXMuc2VsZWN0KCkiIHZhbHVlPSIke290aXRsZX0iIC8+IDxici8+PGJyLz4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj7pk74mbmJzcDsmbmJzcDsmbmJzcCZuYnNwJm5ic3AmbmJzcCZuYnNw5o6lIDogPC9zcGFuPjxpbnB1dCBpZD0iaXF4aW4tbmV3TGluayIgcGxhY2Vob2xkZXI9IuW/heWhqyIgb25mb2N1cz0idGhpcy5zZWxlY3QoKSIgdmFsdWU9IiR7b2xpbmsgfSIgLz4gPGJyLz48YnIvPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPuWbviZuYnNwOyZuYnNwOyZuYnNwJm5ic3AmbmJzcCZuYnNwJm5ic3DmoIcgOiA8L3NwYW4+PGlucHV0IGlkPSJpcXhpbi1uZXdJY29uIiBwbGFjZWhvbGRlcj0i6YCJ5aGrLOeVmeepuuWImeiHquWKqOiOt+WPliIgb25mb2N1cz0idGhpcy5zZWxlY3QoKSIgdmFsdWU9IiR7b2ljb24gfSIgLz4gPGJyLz48YnIvPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPuaJk+W8gOaWueW8jyA6IAogICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJpcXhpbi1uZXdUYXJnZXQiIHN0eWxlPSJib3JkZXItcmFkaXVzOiA0cHg7Ym9yZGVyOiBub25lO3BhZGRpbmc6IDJweCAwIDJweCAycHgiPiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7c3RyYmxhbmt9CiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3Q+IAogICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8YnIvPjxici8+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9IiI+PGxhYmVsPkdCS+e8luegge+8mjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iIiBpZD0iaXF4aW4tbmV3R0JLIiAke3N0ckdCS30gc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZTsiPjwvbGFiZWw+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwogICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImVkaXRJdGVtQm94RW50ZXIiIGNsYXNzPSJlZGl0SXRlbUJveEVudGVyIGFkZEl0ZW1Cb3hCdG4gaXF4aW4tZW50ZXJCdG4iPuehruWumjwvYnV0dG9uPiZuYnNwOyZuYnNwOyZuYnNwJm5ic3AmbmJzcDsmbmJzcAogICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImFkZEl0ZW1Cb3hDYW5jZWwiIGNsYXNzPSJhZGRJdGVtQm94Q2FuY2VsIGFkZEl0ZW1Cb3hCdG4gaXF4aW4tY2xvc2VCdG4iPuWPlua2iDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIGAKCiAgICAgICAgICAgICAgICBuZXdEaXYuaW5uZXJIVE1MID0gaW5uZXJIVE1MOwoKICAgICAgICAgICAgICAgIHRoaXMuZWxlLmFwcGVuZENoaWxkKG5ld0Rpdik7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bmV3RGl2LnN0eWxlLmNzc1RleHQ9IiI7fSwxMCk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaXF4aW4tbmV3VGl0bGUiKS5zZWxlY3QoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYWRkRWRpdEJveEVuZ2VyOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIG90aXRsZSxvbGluayxvaW1nLG9ibGFuayxvZ2JrOwogICAgICAgICAgICAgICAgb3RpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2lxeGluLW5ld1RpdGxlIikudmFsdWU7CiAgICAgICAgICAgICAgICBvbGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpcXhpbi1uZXdMaW5rIikudmFsdWU7CiAgICAgICAgICAgICAgICBvaW1nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2lxeGluLW5ld0ljb24iKS52YWx1ZTsKICAgICAgICAgICAgICAgIG9ibGFuayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpcXhpbi1uZXdUYXJnZXQiKS5zZWxlY3RlZEluZGV4OwogICAgICAgICAgICAgICAgb2diayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpcXhpbi1uZXdHQksiKS5jaGVja2VkOwoKICAgICAgICAgICAgICAgIHRoaXMuZWRpdFRlbXAuZGF0YXNldC5pcXhpbnRpdGxlID0gb3RpdGxlOwogICAgICAgICAgICAgICAgdGhpcy5lZGl0VGVtcC5sYXN0Q2hpbGQuaW5uZXJUZXh0ID0gb3RpdGxlOyAgLy/mlofmnKzoioLngrkKCiAgICAgICAgICAgICAgICB0aGlzLmVkaXRUZW1wLmRhdGFzZXQuaXF4aW5saW5rID0gb2xpbms7CiAgICAgICAgICAgICAgICB0aGlzLmVkaXRUZW1wLmRhdGFzZXQuaXF4aW5pbWcgPSBvaW1nOwogICAgICAgICAgICAgICAgdGhpcy5lZGl0VGVtcC5maXJzdENoaWxkLnNyYyA9IG9pbWc7CgogICAgICAgICAgICAgICAgLy8g5piv5ZCm5paw5qCH562+6aG15omT5byACiAgICAgICAgICAgICAgICBpZiAob2JsYW5rKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRUZW1wLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1pcXhpbnRhcmdldCIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRUZW1wLmRhdGFzZXQuaXF4aW50YXJnZXQgPSAiX2JsYW5rIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIOaYr+WQpuemgeeUqAogICAgICAgICAgICAgICAgaWYgKG9nYmspewogICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdFRlbXAuZGF0YXNldC5pcXhpbmdiayA9ICJ0cnVlIjsKICAgICAgICAgICAgICAgIH0gZWxzZXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRUZW1wLnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1pcXhpbmdiayIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIOS/ruaUueWujOaIkCznp7vpmaTmt7vliqDmoYYKICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbUJveFJlbW92ZSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8g5qCH6aKY57yW6L6RCiAgICAgICAgICAgIGFkZFRpdGxlRWRpdEJveDogZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1Cb3hSZW1vdmUoKTsKCiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGUudGFyZ2V0LnBhcmVudE5vZGUuZmlyc3RDaGlsZDsKICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgiaXF4aW4tcG9pbnRlci1ldmVudHMiKTsKCiAgICAgICAgICAgICAgICB2YXIgZmxhZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiN0aXRsZUVkaXQiKTsKICAgICAgICAgICAgICAgIC8vIOWtmOWcqOe8lui+keeahOagh+mimCAmJiDkuYvliY3nmoTnvJbovpHnmoToioLngrnkuI7ngrnlh7vnmoToioLngrnmmK/lkIzkuIDkuKroioLngrkKICAgICAgICAgICAgICAgIGlmKGZsYWcgJiYgZmxhZy5wYXJlbnROb2RlID09IGVsZW1lbnQpewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGVsZW1lbnQuZmlyc3RDaGlsZC52YWx1ZT9lbGVtZW50LmZpcnN0Q2hpbGQudmFsdWU6IuepuiI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgiaXF4aW4tcG9pbnRlci1ldmVudHMiKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gIOWtmOWcqOe8lui+keeahOagh+mimCzkvYbkuI7ngrnlh7vnmoTkuI3mmK/lkIzkuIDkuKroioLngrkKICAgICAgICAgICAgICAgICAgICBpZihmbGFnKXsKICAgICAgICAgICAgICAgICAgICAgICAgZmxhZy5wYXJlbnROb2RlLmlubmVySFRNTCA9IGZsYWcucGFyZW50Tm9kZS5maXJzdENoaWxkLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgb2xkaHRtbCA9IGVsZW1lbnQuaW5uZXJIVE1MOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdvYmogPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwogICAgICAgICAgICAgICAgICAgIG5ld29iai5pZCA9ICJ0aXRsZUVkaXQiOwogICAgICAgICAgICAgICAgICAgIG5ld29iai50eXBlID0gInRleHQiOwogICAgICAgICAgICAgICAgICAgIG5ld29iai52YWx1ZSA9IG9sZGh0bWw7CiAgICAgICAgICAgICAgICAgICAgLy8gbmV3b2JqLm9uYmx1ciA9IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy52YWx1ZT90aGlzLnZhbHVlOm9sZGh0bWw7CiAgICAgICAgICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAgICAgICAgIG5ld29iai5vbmtleWRvd24gPSBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGUua2V5Q29kZSB8fCBlLndoaWNoKSA9PSAxMyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IHRoaXMudmFsdWU/dGhpcy52YWx1ZTpvbGRodG1sOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoKGUua2V5Q29kZSB8fCBlLndoaWNoKSA9PSAyNyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IG9sZGh0bWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgiaXF4aW4tcG9pbnRlci1ldmVudHMiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSAiIjsKICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKG5ld29iaik7CiAgICAgICAgICAgICAgICAgICAgbmV3b2JqLnNlbGVjdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBhZGRUaXRsZUVkaXRCb3hSZW1vdmU6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHZhciBvZGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3RpdGxlRWRpdCIpOwogICAgICAgICAgICAgICAgaWYob2Rpdil7CiAgICAgICAgICAgICAgICAgICAgb2Rpdi5wYXJlbnROb2RlLmlubmVySFRNTCA9IG9kaXYudmFsdWU/b2Rpdi52YWx1ZToi56m6IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIOmrmOe6p+iPnOWNlSzphY3nva7mlofku7bnvJbovpHnlYzpnaIKICAgICAgICAgICAgZWRpdENvZGVCb3g6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygi5Y6f5aeL5pWw5o2u77yaICIsZ2V0U2V0dGluZ0RhdGEpOwogICAgICAgICAgICAgICAgdmFyIHVzZXJTZXR0aW5nID0gR01fZ2V0VmFsdWUoInNlYXJjaEVuZ2luZUp1bXBEYXRhIikKICAgICAgICAgICAgICAgIHZhciBlZGl0Ym94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgICAgICAvLyB2YXIgc0RhdGEgPQogICAgICAgICAgICAgICAgZWRpdGJveC5pZCA9ICJpcXhpbi1lZGl0Q29kZUJveCI7CiAgICAgICAgICAgICAgICBlZGl0Ym94LnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246Zml4ZWQ7IiArCiAgICAgICAgICAgICAgICAgICAgInRvcDo1MCU7bGVmdDo1MCU7IiArCiAgICAgICAgICAgICAgICAgICAgInRyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTsiICsKICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZDojY2NjOyIgKwogICAgICAgICAgICAgICAgICAgICJib3JkZXItcmFkaXVzOjRweDsiICsKICAgICAgICAgICAgICAgICAgICAicGFkZGluZzoxMHB4IDIwcHg7IiA7CiAgICAgICAgICAgICAgICB2YXIgaW5uZXJIID0gIiAiKwogICAgICAgICAgICAgICAgICAgICI8cD48c3BhbiBzdHlsZT0nY29sb3I6cmVkO2ZvbnQtc2l6ZToxLjJlbTsnPiEgISAhPC9zcGFuPjwvYnI+IisKICAgICAgICAgICAgICAgICAgICAi5q2k5aSE5pyJ5pu05aSa55qE6K6+572u6YCJ6aG5LOiHqueUseW6puabtOmrmCw8L2JyPiIrCiAgICAgICAgICAgICAgICAgICAgIuS9huiuvue9rumUmeivr+S8muWvvOiHtOiEmuacrOaXoOazlei/kOihjCIrCiAgICAgICAgICAgICAgICAgICAgIjwvcD4iICsKICAgICAgICAgICAgICAgICAgICAiPHRleHRhcmVhIHdyYXA9J29mZicgY29scz0nNDUnIHJvd3M9JzIwJyBzdHlsZT0nb3ZlcmZsb3c6YXV0bztib3JkZXItcmFkaXVzOjRweDsnPiIgKyBKU09OLnN0cmluZ2lmeSh1c2VyU2V0dGluZyxmYWxzZSw0KSArICI8L3RleHRhcmVhPiIgKwogICAgICAgICAgICAgICAgICAgICI8YnI+IiArCiAgICAgICAgICAgICAgICAgICAgIjxidXR0b24gaWQ9J3hpbi1yZXNldCc+5riF56m66K6+572uPC9idXR0b24+ICZuYnNwOyZuYnNwOyZuYnNwOyIgKwogICAgICAgICAgICAgICAgICAgICI8YnV0dG9uIGlkPSd4aW4tY29weUNvZGUnPuWkjeWItjwvYnV0dG9uPiAmbmJzcDsmbmJzcDsmbmJzcDsiICsKICAgICAgICAgICAgICAgICAgICAiPGJ1dHRvbiBpZD0nY29kZWJveGNsb3NlJyBjbGFzcz0naXF4aW4tY2xvc2VCdG4nPuWFs+mXrTwvYnV0dG9uPiAmbmJzcDsmbmJzcDsmbmJzcDsiICsKICAgICAgICAgICAgICAgICAgICAiPGJ1dHRvbiBpZD0neGluLWNvZGVib3hzYXZlJyBjbGFzcz0naXF4aW4tZW50ZXJCdG4nPuS/neWtmDwvYnV0dG9uPiIgKwogICAgICAgICAgICAgICAgIiI7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShnZXRTZXR0aW5nRGF0YSw0KSk7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShnZXRTZXR0aW5nRGF0YSxudWxsLDQpKTsKICAgICAgICAgICAgICAgIGVkaXRib3guaW5uZXJIVE1MID0gaW5uZXJIOwogICAgICAgICAgICAgICAgdGhpcy5lbGUuYXBwZW5kQ2hpbGQoZWRpdGJveCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVkaXRDb2RlQm94U2F2ZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHZhciBjb2RldmFsdWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaXF4aW4tZWRpdENvZGVCb3ggdGV4dGFyZWEiKS52YWx1ZTsKICAgICAgICAgICAgICAgIGlmKGNvZGV2YWx1ZSl7CiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coSlNPTi5wYXJzZShjb2RldmFsdWUpKTsKICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgic2VhcmNoRW5naW5lSnVtcERhdGEiLEpTT04ucGFyc2UoY29kZXZhbHVlKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coR01fZ2V0VmFsdWUoInNlYXJjaEVuZ2luZUp1bXBEYXRhIikpOwogICAgICAgICAgICAgICAgICAgIC8vIOWIt+aWsOmhtemdogogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICAgICAgICAgIH0sMzAwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gYWxlcnQoIui+k+WFpeS4uuepuiIpOwogICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZWRpdENvZGVCb3hDbG9zZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHZhciBib3ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaXF4aW4tZWRpdENvZGVCb3giKTsKICAgICAgICAgICAgICAgIGlmKGJveCl7CiAgICAgICAgICAgICAgICAgICAgYm94LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYm94KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIOWvvOWFpeeql+WPowogICAgICAgICAgICBhZGRJbXBvcnRpbmdCb3g6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB2YXIgb2RpdiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpbXBvcnRpbmdCb3giKTsKICAgICAgICAgICAgICAgIGlmIChvZGl2KXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJveENsb3NlKCIjaW1wb3J0aW5nQm94Iik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG5ld0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICAgICAgbmV3RGl2LmlkPSAiaW1wb3J0aW5nQm94IjsKCiAgICAgICAgICAgICAgICB2YXIgYSA9IjxwPuabtOWKoOe7huWIhueahOaQnOe0ouWIl+ihqCwg5YiX6KGo5LmL6Ze05Lya5pyJ5omA6YeN5ZCIPC9wPiIgKwogICAgICAgICAgICAgICAgICAgICAgICI8dWw+IjsKCiAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPGVuZ2luZUxpc3RfcGx1cy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgICAgICAgICAvLyBpZihlbmdpbmVMaXN0X3BsdXMuc3RhdHVzIT0zKXtjb250aW51ZX07CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZW5naW5lTGlzdF9wbHVzW2ldKTsKCiAgICAgICAgICAgICAgICAgICAgLy8g5YyF5ZCr572R56uZ5ZCN56ewCiAgICAgICAgICAgICAgICAgICAgdmFyIGluY2x1ZGVXZWIgPSAiIjsKICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGo9MDsgajxlbmdpbmVMaXN0X3BsdXNbaV0uZW5naW5lTGlzdC5sZW5ndGg7aisrKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaiE9MCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlV2ViICs9ICIgfCAiICsgZW5naW5lTGlzdF9wbHVzW2ldLmVuZ2luZUxpc3Rbal0ubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVdlYiArPSBlbmdpbmVMaXN0X3BsdXNbaV0uZW5naW5lTGlzdFtqXS5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBhICs9ICI8bGk+IisKICAgICAgICAgICAgICAgICAgICAgICAgIjxzcGFuIGNsYXNzPSd4aW4taW1wb3J0aW5nLWl0ZW0nIHhpbi1pbXBvcnRpbmctaWQ9JyIgKyBpICsiJyB0aXRsZT0nIisgKGVuZ2luZUxpc3RfcGx1c1tpXS5tZXNzYWdlP2VuZ2luZUxpc3RfcGx1c1tpXS5tZXNzYWdlOmVuZ2luZUxpc3RfcGx1c1tpXS5lbmdpbmVEZXRhaWxzWzBdKSArIic+IisgKGVuZ2luZUxpc3RfcGx1c1tpXS5uYW1lP2VuZ2luZUxpc3RfcGx1c1tpXS5uYW1lOmVuZ2luZUxpc3RfcGx1c1tpXS5lbmdpbmVEZXRhaWxzWzBdKSArICIgOiA8L3NwYW4+IiArCiAgICAgICAgICAgICAgICAgICAgICAgICI8cCB0aXRsZT0nIisgaW5jbHVkZVdlYiArIic+IisgaW5jbHVkZVdlYiArIjwvcD4iCiAgICAgICAgICAgICAgICAgICAgICAgICI8L2xpPiI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYSArPSAiPC91bD4iOwoKICAgICAgICAgICAgICAgIG5ld0Rpdi5pbm5lckhUTUw9YTsKCiAgICAgICAgICAgICAgICB0aGlzLmVsZS5hcHBlbmRDaGlsZChuZXdEaXYpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBhZGRJbXBvcnRpbmdFbmdlcjpmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGUpOwogICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIuesrOWHoOS4qu+8miAiLGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgieGluLWltcG9ydGluZy1pZCIpKTsKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVMaXN0SUQgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoInhpbi1pbXBvcnRpbmctaWQiKTsKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVMaXN0X3RlbXAgPSBlbmdpbmVMaXN0X3BsdXNbZW5naW5lTGlzdElEXTsKICAgICAgICAgICAgICAgIHZhciBlbGlzdCA9IGVuZ2luZUxpc3RfdGVtcC5lbmdpbmVMaXN0OwoKICAgICAgICAgICAgICAgIHZhciBuYW1lID0gZW5naW5lTGlzdF90ZW1wLmVuZ2luZURldGFpbHNbMF07CiAgICAgICAgICAgICAgICB2YXIgaW5uZXJOYW1lID0gZW5naW5lTGlzdF90ZW1wLmVuZ2luZURldGFpbHNbMV07CgogICAgICAgICAgICAgICAgdmFyIG9kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICAgIG9kaXYuaWQgPSBpbm5lck5hbWU7CiAgICAgICAgICAgICAgICBvZGl2LmNsYXNzTmFtZSA9ICJpcXhpbi1pdGVtcyI7CiAgICAgICAgICAgICAgICB2YXIgaW5uZXJIVE1MID0gIiIgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJzZWp0aXRsZSIgZGF0YS1pcXhpbnRpdGxlPSInICsgaW5uZXJOYW1lICsgJyIgZGF0YS14aW49Ijk5Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJpcXhpbi1wb2ludGVyLWV2ZW50cyI+JysgbmFtZSArJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJpcXhpbi10aXRsZS1lZGl0IiB0aXRsZT0i57yW6L6RIEVkaXQiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxpbWcgY2xhc3M9InNlai1lbmdpbmUtaWNvbiIgc3JjPSInICsgaWNvbi5lZGl0ICsgJyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8L3NwYW4+ICcgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImlxeGluLXNldC10aXRsZS1kZWwgaXF4aW4tc2V0LWFjdGl2ZSIgdGl0bGU9IuWIoOmZpCBEZWxldGUiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxpbWcgY2xhc3M9InNlai1lbmdpbmUtaWNvbiIgc3JjPSInICsgaWNvbi5kZWwgKyAnIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InNlamNvbiI+JyArCiAgICAgICAgICAgICAgICAgICAgIiI7CgogICAgICAgICAgICAgICAgLy8g5YW35L2T5YiX6KGoCiAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPGVsaXN0Lmxlbmd0aDtpKyspewogICAgICAgICAgICAgICAgICAgIHZhciBhID0gJzxzcGFuIGRyYWdnYWJsZT0idHJ1ZSIgY2xhc3M9ImRyYWciPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0ic2VqLWVuZ2luZSInICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGRhdGEtaXF4aW5pbWc9IiRpbWckIiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGRhdGEtaXF4aW50aXRsZT0iJHRpdGxlJCIgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBkYXRhLWlxeGlubGluaz0iJGxpbmskIiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGRhdGEtaXF4aW50YXJnZXQ9IiRibGFuayQiICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc+PGltZyBzcmM9IiRmYXZpY29uJCIgY2xhc3M9InNlai1lbmdpbmUtaWNvbiIgLz4kbmFtZSQ8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJpcXhpbi1zZXQtZWRpdCIgdGl0bGU9Iue8lui+kSBFZGl0Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxpbWcgY2xhc3M9InNlai1lbmdpbmUtaWNvbiIgc3JjPSInICsgaWNvbi5lZGl0ICsgJyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4gJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJpcXhpbi1zZXQtZGVsIGlxeGluLXNldC1hY3RpdmUiIHRpdGxlPSLliKDpmaQgRGVsZXRlIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxpbWcgY2xhc3M9InNlai1lbmdpbmUtaWNvbiIgc3JjPSInICsgaWNvbi5kZWwgKyAnIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nOwoKICAgICAgICAgICAgICAgICAgICBhID0gYS5yZXBsYWNlKCIkaW1nJCIsIGVsaXN0W2ldLmZhdmljb24pCiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCIkdGl0bGUkIiwgZWxpc3RbaV0ubmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIiRsaW5rJCIsIGVsaXN0W2ldLnVybCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChlbGlzdFtpXS5ibGFuayl7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBhLnJlcGxhY2UoJyRibGFuayQnLCAiX2JsYW5rIik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGEucmVwbGFjZSgnZGF0YS1pcXhpbnRhcmdldD0iJGJsYW5rJCInLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgYSA9IGEucmVwbGFjZSgnJG5hbWUkJywgZWxpc3RbaV0ubmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJyRmYXZpY29uJCcsIGVsaXN0W2ldLmZhdmljb24pOwoKICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUwgKz0gYTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgaW5uZXJIVE1MICs9ICIiICsKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImlxeGluLWFkZGl0ZW0gaXF4aW4tc2V0LWFjdGl2ZSI+Kzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAiIjsKCgogICAgICAgICAgICAgICAgb2Rpdi5pbm5lckhUTUwgPSBpbm5lckhUTUw7CgogICAgICAgICAgICAgICAgdGhpcy5hZGRJdGVtQm94UmVtb3ZlKCIjaW1wb3J0aW5nQm94Iik7CgogICAgICAgICAgICAgICAgdmFyIGJ0bkVsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNidG5FbGUiKTsKICAgICAgICAgICAgICAgIGJ0bkVsZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShvZGl2LGJ0bkVsZSk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyDigJzorr7nva7mjInpkq7igJ0g6YCP5piO5bqmCiAgICAgICAgICAgIHNldEJ0bk9wYWNpdHlGdW46IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBpZih+d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIikpewogICAgICAgICAgICAgICAgICAgIHZhciBvZG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3NldEJ0bk9wYWNpdHlSYW5nZSIpOwogICAgICAgICAgICAgICAgICAgIHZhciBvZG9tViA9IG9kb20udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgLy8gb2RvbS5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IG9kb20udmFsdWUqMTAwICsiJSAxMDAlIjsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhvZG9tVixnZXRTZXR0aW5nRGF0YS5zZXRCdG5PcGFjaXR5KTsKICAgICAgICAgICAgICAgICAgICBpZihnZXRTZXR0aW5nRGF0YS5zZXRCdG5PcGFjaXR5PDApewogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuaXF4aW4tc2V0QnRuT3BhY2l0eVJhbmdlVmFsdWUiKS5pbm5lckhUTUwgPSBvZG9tVi50b1N0cmluZygpLnBhZEVuZCg0LCIwIik7CiAgICAgICAgICAgICAgICAgICAgICAgIG9kb20uc3R5bGUuYmFja2dyb3VuZCA9ICItd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCMzQUJEQzEsIzgzZTdlYSkgbm8tcmVwZWF0LCAjZmZmIjsKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmlxeGluLXNldEJ0bk9wYWNpdHlSYW5nZVZhbHVlIikuaW5uZXJIVE1MID0gIuemgeeUqCI7CiAgICAgICAgICAgICAgICAgICAgICAgIG9kb20uc3R5bGUuYmFja2dyb3VuZCA9ICItd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCNiZGJkYmQsI2M2YzdjNykgbm8tcmVwZWF0LCAjZmZmIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb2RvbS5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IG9kb20udmFsdWUqMTAwICsiJSAxMDAlIjsKCiAgICAgICAgICAgICAgICAgICAgZ2V0U2V0dGluZ0RhdGEuc2V0QnRuT3BhY2l0eSA9IC1nZXRTZXR0aW5nRGF0YS5zZXRCdG5PcGFjaXR5OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygi6Z2eY2hyb21lIik7CiAgICAgICAgICAgICAgICAgICAgaXF4aW5TaG93VGlwKCLmirHmrYks55uu5YmN5Y+q5pSv5oyBY2hyb21l57G75rWP6KeI5ZmoIiwyNTAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIOagh+mimOeCueWHuyDvvIjlvIDlhbPmkJzntKLliJfooajvvInvvIjlj6/ku6XlubblhaXliLDkuIvpnaLnmoTngrnlh7vkuovku7bvvIkKICAgICAgICAgICAgdGl0bGVDbGljazogZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQ7CiAgICAgICAgICAgICAgICB0YXJnZXQuZGF0YXNldC54aW4gPSAtcGFyc2VJbnQodGFyZ2V0LmRhdGFzZXQueGluKTsKICAgICAgICAgICAgICAgIHRhcmdldC5kYXRhc2V0Lnhpbj4wID8gaXF4aW5TaG93VGlwKCLlkK/nlKgiKSA6IGlxeGluU2hvd1RpcCgi56aB55SoIik7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIOeCueWHu+S6i+S7tiAgIOatpOWkhOeahCBpZiDpnIDopoHmoLnmja7lrp7pmYXmg4XlhrXmm7/mjaLmiJAgZWxzZWlmIChzd2l0Y2gpCiAgICAgICAgICAgIGRvbUNsaWNrOiBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRDbGFzcyA9IGUudGFyZ2V0LmNsYXNzTmFtZTsKICAgICAgICAgICAgICAgIHZhciB0YXJnZXRpZCA9IGUudGFyZ2V0LmlkOwogICAgICAgICAgICAgICAgZGVidWcoIueCueWHu+S6i+S7tu+8miVvLCBJRDogJW8sIGNsYXNzOiAlbywgZTogJW8iLGUudGFyZ2V0LHRhcmdldGlkLHRhcmdldENsYXNzLGUpCgogICAgICAgICAgICAgICAgLy8g5Yig6Zmk5pCc57SiCiAgICAgICAgICAgICAgICBpZih+ZS50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoImlxeGluLXNldC1kZWwiKSl7CiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZS50YXJnZXQpOwogICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlLnRhcmdldC5wYXJlbnROb2RlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvLyDliKDpmaTmkJzntKLliJfooagKICAgICAgICAgICAgICAgIGlmKH5lLnRhcmdldC5jbGFzc05hbWUuaW5kZXhPZigiaXF4aW4tc2V0LXRpdGxlLWRlbCIpKXsKICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlLnRhcmdldCwgZS50YXJnZXQucGFyZW50Tm9kZS5wYXJlbnROb2RlKTsKICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlLnRhcmdldC5wYXJlbnROb2RlLnBhcmVudE5vZGUpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZih+ZS50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoImlxeGluLWFkZGl0ZW0iKSl7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnROb2RlID0gZS50YXJnZXQucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1Cb3goKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZihlLnRhcmdldC5jbGFzc05hbWU9PT0ic2VqLWVuZ2luZSIpewogICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LmRhdGFzZXQuaXF4aW5kaXNhYmxlZCA9IGUudGFyZ2V0LmRhdGFzZXQuaXF4aW5kaXNhYmxlZCA/ICIiOiAgInRydWUiOwogICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LmRhdGFzZXQuaXF4aW5kaXNhYmxlZCA/IGlxeGluU2hvd1RpcCgi56aB55SoIikgOiBpcXhpblNob3dUaXAoIuWQr+eUqCIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmKH50YXJnZXRDbGFzcy5pbmRleE9mKCJhZGRJdGVtQm94Q2FuY2VsIikpewogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbUJveFJlbW92ZSgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8vIOa3u+WKoOaWsOeahOaQnOe0oiDnoa7lrpoKICAgICAgICAgICAgICAgIGlmKH50YXJnZXRDbGFzcy5pbmRleE9mKCJhZGRJdGVtQm94RW50ZXIiKSl7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRJdGVtRW5nZXIoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvLyDmt7vliqDmlrDnmoTmkJzntKLliJfooagg56Gu5a6aCiAgICAgICAgICAgICAgICBpZih0YXJnZXRpZCA9PT0gIm5TZWFyY2hMaXN0Iil7CiAgICAgICAgICAgICAgICAgICAgZGVidWcoIua3u+WKoOaWsOeahOaQnOe0ouWIl+ihqCIpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkU2VhcmNoTGlzdEJveCgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmKHRhcmdldGlkID09PSAiYWRkU2VhcmNoTGlzdEJveEVudGVyIil7CiAgICAgICAgICAgICAgICAgICAgZGVidWcoIuWQkee9kemhtea3u+WKoOWFg+e0oCIpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkU2VhcmNoTGlzdEVuZ2VyKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYodGFyZ2V0aWQgPT09ICJhZGRTZWFyY2hMaXN0Qm94Q2FuY2VsIil7CiAgICAgICAgICAgICAgICAgICAgZGVidWcoIuenu+mZpOebkuWtkCIpOwogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuYm94Q2xvc2UoIiNuZXdTZWFyY2hMaXN0Qm94Iik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRJdGVtQm94UmVtb3ZlKCIjbmV3U2VhcmNoTGlzdEJveCIpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyDkv67mlLnmkJzntKIg56Gu5a6aCiAgICAgICAgICAgICAgICBpZih+dGFyZ2V0Q2xhc3MuaW5kZXhPZigiZWRpdEl0ZW1Cb3hFbnRlciIpKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEVkaXRCb3hFbmdlcigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyDnvJbovpHmoYYKICAgICAgICAgICAgICAgIGlmKH5lLnRhcmdldC5jbGFzc05hbWUuaW5kZXhPZigiaXF4aW4tc2V0LWVkaXQiKSl7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRFZGl0Qm94KGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8g5qCH6aKY57yW6L6R5qGGCiAgICAgICAgICAgICAgICBpZih+dGFyZ2V0Q2xhc3MuaW5kZXhPZigiaXF4aW4tdGl0bGUtZWRpdCIpKXsKICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkVGl0bGVFZGl0Qm94KGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYofnRhcmdldENsYXNzLmluZGV4T2YoInNlanRpdGxlIikpewogICAgICAgICAgICAgICAgICAgIHRoaXMudGl0bGVDbGljayhlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGNvZGVib3ggIOa6kOS7o+eggee8lui+keahhgogICAgICAgICAgICAgICAgaWYodGFyZ2V0aWQgPT09ImNvZGVib3hjbG9zZSIpewogICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdENvZGVCb3hDbG9zZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmKHRhcmdldGlkPT09Inhpbi1yZXNldCIpewogICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXQoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiggdGFyZ2V0aWQgPT09ICJ4aW4tY29kZWJveHNhdmUiKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRDb2RlQm94U2F2ZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmKCB0YXJnZXRpZCA9PT0gInhpbi1jb3B5Q29kZSIpewogICAgICAgICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZChKU09OLnN0cmluZ2lmeShnZXRTZXR0aW5nRGF0YSxmYWxzZSw0KSk7CiAgICAgICAgICAgICAgICAgICAgaXF4aW5TaG93VGlwKCLlpI3liLbmiJDlip8iKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyAg54K55Ye75pu05aSa6I+c5Y2VCiAgICAgICAgICAgICAgICBpZih0YXJnZXRpZCA9PT0ibW9yZVNldCIpewogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNidG5FbGUyIikuY2xhc3NMaXN0LnRvZ2dsZSgiYnRuRWxlMmFjdGl2ZSIpOwogICAgICAgICAgICAgICAgICAgIC8vIGlxeGluLWJ0bi1hY3RpdmUKICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC5jbGFzc0xpc3QudG9nZ2xlKCJpcXhpbi1idG4tYWN0aXZlIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8g54K55Ye75a+85YWl6I+c5Y2VCiAgICAgICAgICAgICAgICBpZih0YXJnZXRpZCA9PT0ieGluLWltcG9ydGluZyIpewogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSW1wb3J0aW5nQm94KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZih0YXJnZXRDbGFzcyA9PT0ieGluLWltcG9ydGluZy1pdGVtIil7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRJbXBvcnRpbmdFbmdlcihlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyDlhbPpl60i6K6+572u6I+c5Y2V5oyJ6ZKuIgogICAgICAgICAgICAgICAgaWYodGFyZ2V0Q2xhc3MgPT09ICJpcXhpbi1zZXRCdG5PcGFjaXR5UmFuZ2VWYWx1ZSIpewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QnRuT3BhY2l0eUZ1bigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIOWFs+mXreiuvue9ruiPnOWNlQogICAgICAgICAgICAgICAgaWYgKHRhcmdldGlkID09PSAieGluLWNsb3NlIil7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8g56m655m95Zyw5pa554K55Ye7CiAgICAgICAgICAgICAgICBpZih+dGFyZ2V0Q2xhc3MuaW5kZXhPZigiaXF4aW4taXRlbXMiKSB8fCB0YXJnZXRpZCA9PT0gInNldHRpbmdMYXllciIgfHwgdGFyZ2V0Q2xhc3M9PT0iYnRuRWxlTGF5ZXIiKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbEJveENsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyDlhbPpl63miYDmnInmrKHnuqfnqpflj6PjgIHoj5zljZUKICAgICAgICAgICAgYWxsQm94Q2xvc2U6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1Cb3hSZW1vdmUoKTsgLy8g5paw55qE5pCc57Si5re75Yqg5qGGCiAgICAgICAgICAgICAgICB0aGlzLmFkZERlbHJlbW92ZSgpOyAgLy8gIOWinuWKoC/liKDpmaTnlYzpnaIKICAgICAgICAgICAgICAgIHRoaXMuZWRpdENvZGVCb3hDbG9zZSgpOyAvLyBjb2Rl57yW6L6R5qGGCiAgICAgICAgICAgICAgICB0aGlzLmFkZFRpdGxlRWRpdEJveFJlbW92ZSgpOyAvL+agh+mimOe8lui+keahhgogICAgICAgICAgICAgICAgdGhpcy5hZGRJdGVtQm94UmVtb3ZlKCIjbmV3U2VhcmNoTGlzdEJveCIpOyAvLyDmt7vliqDmlrDnmoTmkJzntKLliJfooagKICAgICAgICAgICAgICAgIHRoaXMuYm94Q2xvc2UoIiNpcXhpbi1zb3J0Qm94Iik7IC8vIOaQnOe0ouWIl+ihqOaOkuW6jwogICAgICAgICAgICAgICAgdGhpcy5hZGRJdGVtQm94UmVtb3ZlKCIjaW1wb3J0aW5nQm94Iik7IC8v5a+85YWl5qGGCiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYnRuRWxlMiIpLmNsYXNzTGlzdC5yZW1vdmUoImJ0bkVsZTJhY3RpdmUiKTsgLy8g5pu05aSa6K6+572uCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyDnqpflj6PkvY3nva7mi5bliqgKICAgICAgICAgICAgc2V0RHJhZ05vZGU6IGZ1bmN0aW9uKGVsZSkgewogICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjZHJhZ0RvbSIpOwoKICAgICAgICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixmdW5jdGlvbihldmVudCl7CiAgICAgICAgICAgICAgICAgICAgZWxlLnN0eWxlLnRyYW5zaXRpb24gPSAibnVsbCI7CiAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0TGVmdCDot53nprsgYm9keSDnmoTkvY3nva4sIOW+l+WIsOeahCBkaXMg5Y2z6byg5qCH5Yiw56qX5Y+j5bem5LiK6KeS55qE5L2N572uCiAgICAgICAgICAgICAgICAgICAgdmFyIGRpc1ggPSBldmVudC5jbGllbnRYIC0gZWxlLm9mZnNldExlZnQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRpc1kgPSBldmVudC5jbGllbnRZIC0gZWxlLm9mZnNldFRvcDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1vdmUgPSBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL+m8oOagh+eahOS9jee9ruWHj+WOu+WIsOW3puS4iuinkueahOS9jee9riDljbPnqpflj6PnmoTkvY3nva4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZXZlbnQuY2xpZW50WCAtIGRpc1gsZXZlbnQuY2xpZW50WSAtIGRpc1kpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5zdHlsZS5sZWZ0ID0gZXZlbnQuY2xpZW50WCAtIGRpc1ggKyAicHgiOwogICAgICAgICAgICAgICAgICAgICAgICBlbGUuc3R5bGUudG9wID0gZXZlbnQuY2xpZW50WSAtIGRpc1kgICsgInB4IjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLG1vdmUpOwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZS5zdHlsZS50cmFuc2l0aW9uID0gIjAuNXMiOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLG1vdmUpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIOaLluWKqAogICAgICAgICAgICBkb21kcmFnc3RhcnQ6ZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmKH50aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJzZWp0aXRsZSIpKXsKICAgICAgICAgICAgICAgICAgICBkcmFnRWwgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICB9IGVsc2V7CiAgICAgICAgICAgICAgICAgICAgZHJhZ0VsID0gdGhpczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRyYWdEYXRhID0gZHJhZ0VsLmlubmVySFRNTDsKICAgICAgICAgICAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gIm1vdmUiOwogICAgICAgICAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLnNldERhdGEoInRleHQvaHRtbCIsZHJhZ0VsLmlubmVySFRNTCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRvbWRyYWdlbnRlcjpmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0OwogICAgICAgICAgICAgICAgdmFyIHRhcmdldENsYXNzID0gdGFyZ2V0LmNsYXNzTmFtZTsKICAgICAgICAgICAgICAgIGlmKH50YXJnZXRDbGFzcy5pbmRleE9mKCJzZWp0aXRsZSIpKXsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKCdkcm9wLW92ZXInKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZG9tZHJhZ292ZXI6ZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJzsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZG9tZHJhZ2xlYXZlOmZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQ7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0Q2xhc3MgPSB0YXJnZXQuY2xhc3NOYW1lOwogICAgICAgICAgICAgICAgaWYofnRhcmdldENsYXNzLmluZGV4T2YoInNlanRpdGxlIikpewogICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ2Ryb3Atb3ZlcicpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBkb21kcm9wOmZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBkZWJ1Zygi5ouW5ou957uT5p2fIikKICAgICAgICAgICAgICAgIC8vIGUudGFyZ2V0ID09PSB0aGlzCiAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSBlLnRhcmdldDsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gX3RoaXMucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIHZhciBwcGFyZW50Tm9kZSA9IHRoYXQucGFyZW50Tm9kZTsKCiAgICAgICAgICAgICAgICAvLyDpmLLmraLot6jljLrln5/np7vliqgKICAgICAgICAgICAgICAgIFNFSnNldHRpbmcucHJvdG90eXBlLmRvbWRyb3BlbmQoKTsKICAgICAgICAgICAgICAgIGlmKGRyYWdFbC5jbGFzc05hbWUgIT0gdGhhdC5jbGFzc05hbWUpewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLnp7vliqjlr7nosaEg5LmL5YmNLOeOsOWcqDogIiwgZHJhZ0VsLmNsYXNzTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhhdC5jbGFzc05hbWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBTb3J0YWJsZS5qcyBodHRwczovL2dpdGh1Yi5jb20vUnViYVhhL1NvcnRhYmxlCiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0UmVjdCA9IF90aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyAvLwogICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gdGFyZ2V0UmVjdC5yaWdodCAtIHRhcmdldFJlY3QubGVmdDsgLy/nm67moIfoioLngrnnmoTlrr0KICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSB0YXJnZXRSZWN0LmJvdHRvbSAtIHRhcmdldFJlY3QudG9wOyAvL+ebruagh+iKgueCueeahOmrmAogICAgICAgICAgICAgICAgdmFyIGRvbVBvc2l0aW9uID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmKH5fdGhpcy5jbGFzc05hbWUuaW5kZXhPZigic2VqdGl0bGUiKSl7CiAgICAgICAgICAgICAgICAgICAgZGVidWcoZS5jbGllbnRYLHRhcmdldFJlY3QubGVmdCxoZWlnaHQsZS5jbGllbnRYIC0gdGFyZ2V0UmVjdC5sZWZ0LChlLmNsaWVudFggLSB0YXJnZXRSZWN0LmxlZnQpIC8gaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgIGlmKChlLmNsaWVudFggLSB0YXJnZXRSZWN0LmxlZnQpIC8gd2lkdGggPiAwLjUpewogICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zygi5Y+zIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbVBvc2l0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoIuW3piIpOwogICAgICAgICAgICAgICAgICAgICAgICBkb21Qb3NpdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYoKGUuY2xpZW50WSAtIHRhcmdldFJlY3QudG9wKSAvIGhlaWdodCA+IDAuNSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKCLkuIsiKTsKICAgICAgICAgICAgICAgICAgICAgICAgZG9tUG9zaXRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zygi5LiKIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbVBvc2l0aW9uID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGRyYWdFbC5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSAidG9wIGNlbnRlciI7CiAgICAgICAgICAgICAgICBkcmFnRWwuc3R5bGUuYW5pbWF0aW9uID0gInNlam9wZW4gMC4zcyI7CgogICAgICAgICAgICAgICAgaWYoZG9tUG9zaXRpb24pewogICAgICAgICAgICAgICAgICAgIGlmKHBwYXJlbnROb2RlLmxhc3RDaGlsZCA9PSB0aGF0KXsKICAgICAgICAgICAgICAgICAgICAgICAgcHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRyYWdFbCx0aGF0KTsKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgcHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRyYWdFbCx0aGF0Lm5leHRFbGVtZW50U2libGluZykKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICB0aGF0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRyYWdFbCx0aGF0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyDph43mlrDnu5Hlrprmi5bmi73kuovku7YKICAgICAgICAgICAgICAgIFNFSnNldHRpbmcucHJvdG90eXBlLmRyYWdFdmVudCgpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBkb21kcm9wZW5kOmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB2YXIgZG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmRyb3Atb3ZlciIpOwogICAgICAgICAgICAgICAgaWYoZG9tKXsKICAgICAgICAgICAgICAgICAgICBkb20uY2xhc3NMaXN0LnJlbW92ZSgiZHJvcC1vdmVyIikKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIOWIpOaWreaYr+WQpuiDvei/nuaOpeiHs2dvb2dsZQogICAgICAgICAgICBpc09ubGluZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJ0aGlzLm9ubGluZSIsdGhpcy5vbmxpbmUpOwogICAgICAgICAgICAgICAgaWYodGhpcy5vbmxpbmUpcmV0dXJuOwoKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgICAgICAgICAgIHZhciBteUltYWdlID0gbmV3IEltYWdlOwogICAgICAgICAgICAgICAgbXlJbWFnZS5zcmMgPSAnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zMi9mYXZpY29ucz9kb21haW49d3d3LmJhaWR1LmNvbSYnICsgTWF0aC5yYW5kb20oKSA7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIuWPlua2iOWKoOi9vSIpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG15SW1hZ2Uud2lkdGgpOwogICAgICAgICAgICAgICAgICAgIGlmKG15SW1hZ2Uud2lkdGgpewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Lm9ubGluZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIG15SW1hZ2Uuc3JjID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LDIwMDApOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8g6YeN5paw5Yqg6L295bel5YW3CiAgICAgICAgICAgIHJlbG9hZFNldDogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHZhciBlbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNzZWotY29udGFpbmVyLCAjc2V0dGluZ0xheWVyTWFzaywgc2Vqc3Bhbi5zZWotZHJvcC1saXN0Jyk7CiAgICAgICAgICAgICAgICBpZiAoIWVsZW1zKSByZXR1cm47CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiZWxlbXM6ICIgKyBlbGVtcyk7CiAgICAgICAgICAgICAgICAvLyByZXR1cm47CgogICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKGVsZW1zLCBmdW5jdGlvbihlbGVtKSB7CiAgICAgICAgICAgICAgICAgICAgZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW0pOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgaXF4aW5zdGFydCgpOwogICAgICAgICAgICAgICAgaXF4aW5TaG93VGlwKCLkv53lrZjmiJDlip8iKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIOiuvue9ruaMiemSrumAj+aYjuW6puiuvue9rgogICAgICAgICAgICByYW5nZUNoYW5nZTogZnVuY3Rpb24oYm9vbCl7CiAgICAgICAgICAgICAgICB2YXIgb2RvbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNzZXRCdG5PcGFjaXR5UmFuZ2UiKTsKICAgICAgICAgICAgICAgIGlmKGdldFNldHRpbmdEYXRhLnNldEJ0bk9wYWNpdHk8MCl7CiAgICAgICAgICAgICAgICAgICAgb2RvbS5zdHlsZS5iYWNrZ3JvdW5kID0gIi13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsI2JkYmRiZCwjYzZjN2M3KSBuby1yZXBlYXQsICNmZmYiOwogICAgICAgICAgICAgICAgICAgIG9kb20uc3R5bGUuYmFja2dyb3VuZFNpemUgPSBvZG9tLnZhbHVlKjEwMCArIiUgMTAwJSI7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmlxeGluLXNldEJ0bk9wYWNpdHlSYW5nZVZhbHVlIikuaW5uZXJIVE1MID0gIuemgeeUqCI7CiAgICAgICAgICAgICAgICAgICAgZ2V0U2V0dGluZ0RhdGEuc2V0QnRuT3BhY2l0eSA9IC1vZG9tLnZhbHVlOwogICAgICAgICAgICAgICAgfSBlbHNlewogICAgICAgICAgICAgICAgICAgIG9kb20uc3R5bGUuYmFja2dyb3VuZCA9ICItd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCMzQUJEQzEsIzgzZTdlYSkgbm8tcmVwZWF0LCAjZmZmIjsKICAgICAgICAgICAgICAgICAgICBvZG9tLnN0eWxlLmJhY2tncm91bmRTaXplID0gb2RvbS52YWx1ZSoxMDAgKyIlIDEwMCUiOwogICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9kb20udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlU3RyID0gIiI7CiAgICAgICAgICAgICAgICAgICAgaWYodmFsdWU9PTApewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0ciA9ICIwLjAwIjsKICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih2YWx1ZT09MSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyID0gIjEuMDAiOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyID0gb2RvbS52YWx1ZS50b1N0cmluZygpLnBhZEVuZCg0LCIwIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5pcXhpbi1zZXRCdG5PcGFjaXR5UmFuZ2VWYWx1ZSIpLmlubmVySFRNTCA9IHZhbHVlU3RyOwogICAgICAgICAgICAgICAgICAgIGdldFNldHRpbmdEYXRhLnNldEJ0bk9wYWNpdHkgPSBvZG9tLnZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8g56qX5Y+j5aSn5bCP5pS55Y+YCiAgICAgICAgICAgIHdpbmRvd1Jlc2l6ZTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHZhciBlbGVTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxlICwgbnVsbCk7CiAgICAgICAgICAgICAgICB2YXIgdyA9IHBhcnNlSW50KGVsZVN0eWxlLndpZHRoKSA7CiAgICAgICAgICAgICAgICB2YXIgaCA9IHBhcnNlSW50KGVsZVN0eWxlLmhlaWdodCkgICsgNTQ7CiAgICAgICAgICAgICAgICB2YXIgd3cgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7CiAgICAgICAgICAgICAgICB2YXIgd2ggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OwogICAgICAgICAgICAgICAgdmFyIG1hc2tTdHlsZSA9IHRoaXMubWFzay5zdHlsZTsKCiAgICAgICAgICAgICAgICBpZih3Pj13dyl7CiAgICAgICAgICAgICAgICAgICAgbWFza1N0eWxlLmp1c3RpZnlDb250ZW50ID0gInN0cmV0Y2giOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgbWFza1N0eWxlLmp1c3RpZnlDb250ZW50ID0gImNlbnRlciI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZihoPj13aCl7CiAgICAgICAgICAgICAgICAgICAgbWFza1N0eWxlLmFsaWduSXRlbXMgPSAic3RyZXRjaCI7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBtYXNrU3R5bGUuYWxpZ25JdGVtcyA9ICJjZW50ZXIiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBzYXZlRGF0YTogZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICB0aGlzLmFkZFRpdGxlRWRpdEJveFJlbW92ZSgpOyAvL+agh+mimOagj+WkhOS6jue8lui+keeKtuaAgQoKICAgICAgICAgICAgICAgIHZhciBvYmogPSB7fTsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRkaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIjc2V0dGluZ0xheWVyIC5pcXhpbi1pdGVtcyIpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wO2k8cGFyZW50ZGl2Lmxlbmd0aDtpKyspewogICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gcGFyZW50ZGl2W2ldLnF1ZXJ5U2VsZWN0b3JBbGwoIi5zZWotZW5naW5lIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gcGFyZW50ZGl2W2ldLmlkOwogICAgICAgICAgICAgICAgICAgIG9ialtpZF09W107CiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpaT0wO2lpPGRhdGEubGVuZ3RoO2lpKyspewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVtpaV0uZGF0YXNldC54aW48MCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWogPSAtaWk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaiA9IGlpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtpZF1baWpdPXt9OwogICAgICAgICAgICAgICAgICAgICAgICBvYmpbaWRdW2lqXS5mYXZpY29uPWRhdGFbaWldLmRhdGFzZXQuaXF4aW5pbWc7CiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtpZF1baWpdLm5hbWU9ZGF0YVtpaV0uZGF0YXNldC5pcXhpbnRpdGxlOwogICAgICAgICAgICAgICAgICAgICAgICBvYmpbaWRdW2lqXS51cmw9ZGF0YVtpaV0uZGF0YXNldC5pcXhpbmxpbms7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGFbaWldLmRhdGFzZXQuaXF4aW50YXJnZXQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqW2lkXVtpal0uYmxhbms9ZGF0YVtpaV0uZGF0YXNldC5pcXhpbnRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YVtpaV0uZGF0YXNldC5pcXhpbmRpc2FibGVkKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialtpZF1baWpdLmRpc2FibGU9ZGF0YVtpaV0uZGF0YXNldC5pcXhpbmRpc2FibGVkOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhW2lpXS5kYXRhc2V0LmlxeGluZ2JrKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialtpZF1baWpdLmdiaz1kYXRhW2lpXS5kYXRhc2V0LmlxeGluZ2JrOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyDliIbnsbvlkI3np7AKICAgICAgICAgICAgICAgIHZhciBlbmdpbmVEZXRhaWxzPVtdOwoKICAgICAgICAgICAgICAgIC8vIOWIhuexu+aOkuW6jwogICAgICAgICAgICAgICAgdmFyIG9kZXRhaWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnNlanRpdGxlIik7CiAgICAgICAgICAgICAgICB2YXIgb2RldGFpbHNMZW5ndGggPSBvZGV0YWlscy5sZW5ndGg7CiAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPG9kZXRhaWxzTGVuZ3RoO2krKyl7CiAgICAgICAgICAgICAgICAgICAgZGVidWcob2RldGFpbHNbaV0pOwogICAgICAgICAgICAgICAgICAgIGVuZ2luZURldGFpbHNbaV0gPSBbXTsKICAgICAgICAgICAgICAgICAgICBlbmdpbmVEZXRhaWxzW2ldWzBdID0gb2RldGFpbHNbaV0uZmlyc3RDaGlsZC5pbm5lckhUTUw7CiAgICAgICAgICAgICAgICAgICAgZW5naW5lRGV0YWlsc1tpXVsxXSA9IG9kZXRhaWxzW2ldLmRhdGFzZXQuaXF4aW50aXRsZTsKICAgICAgICAgICAgICAgICAgICBlbmdpbmVEZXRhaWxzW2ldWzJdID0gb2RldGFpbHNbaV0uZGF0YXNldC54aW4+PTA/dHJ1ZTpmYWxzZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyDmlrDmoIfnrb7pobXlhajlsYDorr7nva4KICAgICAgICAgICAgICAgIHZhciBvbmV3dGFiID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2lxeGluLWdsb2JhbE5ld3RhYiIpLnNlbGVjdGVkSW5kZXg7CiAgICAgICAgICAgICAgICB2YXIgZm9sZGxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaXF4aW4tZm9sZGxpc3QiKS5jaGVja2VkOwoKICAgICAgICAgICAgICAgIC8vIOS7pemYsuS4jea1iyzph43mlrDojrflj5bmnKzlnLDphY3nva7mlofku7YKICAgICAgICAgICAgICAgIHZhciBnZXREYXRhID0gR01fZ2V0VmFsdWUoInNlYXJjaEVuZ2luZUp1bXBEYXRhIik7CiAgICAgICAgICAgICAgICBnZXREYXRhLm5ld3RhYiA9IG9uZXd0YWI7CiAgICAgICAgICAgICAgICBnZXREYXRhLmZvbGRsaXN0ID0gZm9sZGxpc3Q7CiAgICAgICAgICAgICAgICBnZXREYXRhLnNldEJ0bk9wYWNpdHkgPSBnZXRTZXR0aW5nRGF0YS5zZXRCdG5PcGFjaXR5OwogICAgICAgICAgICAgICAgLy8gZ2V0RGF0YS5kZWJ1ZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpcXhpbi1kZWJ1ZyIpLmNoZWNrZWQ7CiAgICAgICAgICAgICAgICBnZXREYXRhLmNlbnRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpcXhpbi1jZW50ZXIiKS5zZWxlY3RlZEluZGV4OwogICAgICAgICAgICAgICAgZ2V0RGF0YS5maXhlZFRvcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpcXhpbi1maXhlZFRvcCIpLmNoZWNrZWQ7CiAgICAgICAgICAgICAgICBnZXREYXRhLmFsbE9wZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaXF4aW4tYWxsT3Blbi1pdGVtIikuY2hlY2tlZDsKICAgICAgICAgICAgICAgIGdldERhdGEuZml4ZWRUb3BVcHdhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaXF4aW4tZml4ZWRUb3BVcHdhcmQtaXRlbSIpLmNoZWNrZWQ7CiAgICAgICAgICAgICAgICBnZXREYXRhLnRyYW5zdGlvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNpcXhpbi10cmFuc3Rpb24iKS5jaGVja2VkOwogICAgICAgICAgICAgICAgZ2V0RGF0YS5IaWRlVGhlU2FtZUxpbmsgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaXF4aW4tSGlkZVRoZVNhbWVMaW5rIikuY2hlY2tlZDsKICAgICAgICAgICAgICAgIGdldERhdGEuc2VsZWN0U2VhcmNoID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2lxeGluLXNlbGVjdFNlYXJjaCIpLmNoZWNrZWQ7CiAgICAgICAgICAgICAgICBnZXREYXRhLmVuZ2luZURldGFpbHMgPSBlbmdpbmVEZXRhaWxzOwogICAgICAgICAgICAgICAgZ2V0RGF0YS5lbmdpbmVMaXN0ID0gb2JqOwoKICAgICAgICAgICAgICAgIGRlYnVnKCflsIbopoHkv53lrZjnmoTmlbDmja7vvJonLGdldERhdGEpOwogICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoInNlYXJjaEVuZ2luZUp1bXBEYXRhIixnZXREYXRhKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8g5q2k5aSE55qE5qC35byP5Li76KaB5piv6K6+572u55WM6Z2iCiAgICAgICAgICAgIGFkZEdsb2JhbFN0eWxlOiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIGhlYWQsIHN0eWxlOwogICAgICAgICAgICAgICAgdmFyIGNzcyA9CiAgICAgICAgICAgICAgICAgICAgIiNzZXR0aW5nTGF5ZXJNYXNreyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiZGlzcGxheTogbm9uZTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImp1c3RpZnktY29udGVudDogY2VudGVyOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYWxpZ24taXRlbXM6IGNlbnRlcjsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uOiBmaXhlZDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInRvcDowOyByaWdodDowOyBib3R0b206MDsgbGVmdDowOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLDAsMCwuMyk7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJ6LWluZGV4OiAyMDAwMDAwMDA7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJvdmVyZmxvdzogYXV0bzsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImZvbnQtZmFtaWx5OiBhcmlhbCxzYW5zLXNlcmlmOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAibWluLWhlaWdodDogMTAwJTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImZvbnQtc2l6ZToxNnB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNpdGlvbjowLjNzOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAib3BhY2l0eTowOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidXNlci1zZWxlY3Q6IG5vbmU7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICItbW96LXVzZXItc2VsZWN0OiBub25lOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAicGFkZGluZy1ib3R0b206IDgwcHg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJib3gtc2l6aW5nOiBib3JkZXItYm94OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiY29sb3I6IHZhcigtLWZvbnQtY29sb3ItcXhpbik7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI3NldHRpbmdMYXllcnsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImRpc3BsYXk6IGZsZXg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJmbGV4LXdyYXA6IHdyYXA7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJwYWRkaW5nOiAyMHB4IDIwcHggNTBweCAyMHB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAibWFyZ2luOiAyJSAyNXB4IDUwcHggNXB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmFja2dyb3VuZC1zZXR0aW5nLXF4aW4pOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm9yZGVyLXJhZGl1czogNHB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpb246IGFic29sdXRlOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAibWluLXdpZHRoOiA3MDBweDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIm1heC13aWR0aDogOTQlOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNpdGlvbjowLjVzOyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAgICAgIi5pcXhpbi1pdGVtc3siICsKICAgICAgICAgICAgICAgICAgICAgICAgIm1pbi13aWR0aDo1ZW07IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJtYXJnaW46IDAgNXB4IDBweDsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIjc2V0dGluZ0xheWVyIC5kcmFneyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiZGlzcGxheTogYmxvY2s7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjogcmVsYXRpdmU7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI3NldHRpbmdMYXllciAuc2VqLWVuZ2luZXsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImRpc3BsYXk6IGlubGluZS1ibG9jazsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoOiAxMDAlOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm94LXNpemluZzogYm9yZGVyLWJveDsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIuaXF4aW4tcG9pbnRlci1ldmVudHMsIiArCiAgICAgICAgICAgICAgICAgICAgIi5zZWotZW5naW5lLWljb24sIiArCiAgICAgICAgICAgICAgICAgICAgIiNzZXR0aW5nTGF5ZXIgLnNlai1lbmdpbmUgKnsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInBvaW50ZXItZXZlbnRzOm5vbmU7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiLnNlanRpdGxleyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidGV4dC1hbGlnbjogY2VudGVyOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAicGFkZGluZzogMnB4IDA7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJjdXJzb3I6IHBvaW50ZXI7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjogcmVsYXRpdmU7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI3NldHRpbmdMYXllck1hc2sgW2RhdGEteGluXXsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIm1hcmdpbjo0cHggMDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUtaGVpZ2h0OjEuNzsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlci1yYWRpdXM6NHB4OyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAgICAgIiNzZXR0aW5nTGF5ZXJNYXNrIC5pcXhpbi1zZXQtZWRpdCwiICsKICAgICAgICAgICAgICAgICAgICAiI3NldHRpbmdMYXllck1hc2sgLmlxeGluLXNldC1kZWx7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJib3JkZXItcmFkaXVzOjRweDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUtaGVpZ2h0OiAxZW07IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiLnNlamNvbiBbZGF0YS14aW5deyIrCiAgICAgICAgICAgICAgICAgICAgICAgICJjdXJzb3I6IHBvaW50ZXI7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI3NldHRpbmdMYXllck1hc2sgW2RhdGEtaXF4aW5kaXNhYmxlZD0ndHJ1ZSddLCIgKwogICAgICAgICAgICAgICAgICAgICJbZGF0YS14aW5ePSctJ117IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kLWF2dGl2ZS1jb2xvci1xeGluKTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidGV4dC1kZWNvcmF0aW9uLWNvbG9yOnJlZDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlci1yYWRpdXM6MnB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNpdGlvbjouM3M7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiLnNlanRpdGxlOm5vdChbZGF0YS14aW5ePSctJ10pOmhvdmVyeyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZDp2YXIoLS1iYWNrZ3JvdW5kLWFjdGl2ZS1lbmFibGUtcXhpbik7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI3NldHRpbmdMYXllck1hc2sgLnNlai1lbmdpbmU6aG92ZXJ7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kLWFjdGl2ZS1lbmFibGUtcXhpbik7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI3NldHRpbmdMYXllck1hc2sgW2RhdGEtaXF4aW5kaXNhYmxlZD0ndHJ1ZSddOmhvdmVyLCIgKwogICAgICAgICAgICAgICAgICAgICJbZGF0YS14aW5ePSctJ106aG92ZXJ7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kLWFjdGl2ZS1kaXNhYmxlLXF4aW4pOyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAgICAgIiNzZXR0aW5nTGF5ZXJNYXNrIGxhYmVseyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiY3Vyc29yOnBvaW50ZXI7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI3NldHRpbmdMYXllck1hc2sgLnNlai1lbmdpbmUtaWNvbnsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInZlcnRpY2FsLWFsaWduOm1pZGRsZTsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIjYnRuRWxlMiwiICsKICAgICAgICAgICAgICAgICAgICAiI2J0bkVsZXsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uOmFic29sdXRlOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAid2lkdGg6MTAwJTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImJvdHRvbTogMHB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHQ6IDA7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kOiB2YXIoLS1iYWNrZ3JvdW5kLXNldHRpbmctcXhpbik7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJib3JkZXItcmFkaXVzOiA0cHg7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI2J0bkVsZTIgc3BhbiwiICsKICAgICAgICAgICAgICAgICAgICAiI2J0bkVsZSBzcGFueyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiZGlzcGxheTogaW5saW5lLWJsb2NrOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZDogdmFyKC0tYmFja2dyb3VuZC1idG4tcXhpbik7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJib3JkZXI6IDFweCBzb2xpZCAjM2FiZGMxOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAibWFyZ2luOiAxMnB4IGF1dG8gMTBweDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yOiAjM2FiZGMxOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAicGFkZGluZzogNXB4IDEwcHg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJib3JkZXItcmFkaXVzOiA0cHg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJjdXJzb3I6IHBvaW50ZXI7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJvdXRsaW5lOiBub25lOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNpdGlvbjogMC4zczsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIjYnRuRWxlIGF7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvcjogIzk5OTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQtZGVjb3JhdGlvbjogbm9uZTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImZvbnQtZmFtaWx5OiBhdXRvOyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAgICAgIiNidG5FbGUgYTpob3ZlcnsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiY29sb3I6ICNlZjg5NTc7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI2J0bkVsZTIgc3Bhbi5mZWVkYmFjazpob3ZlciwiICsKICAgICAgICAgICAgICAgICAgICAiI2J0bkVsZSBzcGFuLmZlZWRiYWNrOmhvdmVyeyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm9yZGVyLWNvbG9yOiNlZjg5NTc7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI2J0bkVsZTIgc3Bhbjpub3QoLmZlZWRiYWNrKTpob3ZlciwiICsKICAgICAgICAgICAgICAgICAgICAiI2J0bkVsZSBzcGFuOm5vdCguZmVlZGJhY2spOmhvdmVyeyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZDojM0FDQkREOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiY29sb3I6I2ZmZjsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIjYnRuRWxlIC5mZWVkYmFja3siICsKICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlci1jb2xvcjogI2FhYTsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIjYnRuRWxlMj5kaXYsIiArCiAgICAgICAgICAgICAgICAgICAgIiNidG5FbGU+ZGl2eyIgKwogICAgICAgICAgICAgICAgICAgICAgICAid2lkdGg6IDEwMCU7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJkaXNwbGF5OmZsZXg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImJhY2tncm91bmQ6IHZhcigtLWJhY2tncm91bmQtYnRuLXF4aW4pOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm9yZGVyLXJhZGl1czogNHB4OyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAgICAgIiNidG5FbGUyeyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidmlzaWJpbGl0eTpoaWRkZW47IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJvcGFjaXR5OjA7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2Zvcm06dHJhbnNsYXRlKDAsNDBweCk7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2l0aW9uIDogMC4zczsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIjYnRuRWxlMi5idG5FbGUyYWN0aXZleyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidmlzaWJpbGl0eTp2aXNpYmxlOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAib3BhY2l0eToxOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAvLyAidHJhbnNmb3JtOnRyYW5zbGF0ZSgwLDEwOHB4KTsiICAvLyDkuKTooYznmoTmg4XlhrXkuIsKICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zZm9ybTp0cmFuc2xhdGUoMCw1M3B4KTsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIjc2V0dGluZ0xheWVyTWFzayBpbnB1dFt0eXBlPWNoZWNrYm94XXsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoOiAxMnB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OiAxMnB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiZGlzcGxheTogaW5saW5lLWJsb2NrOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidGV4dC1hbGlnbjogY2VudGVyOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidmVydGljYWwtYWxpZ246IG1pZGRsZTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUtaGVpZ2h0OiAxMHB4IWltcG9ydGFudDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIm1hcmdpbjogMCA1cHggNXB4IDVweCFpbXBvcnRhbnQ7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjogcmVsYXRpdmU7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI3NldHRpbmdMYXllck1hc2sgaW5wdXRbdHlwZT1jaGVja2JveF06YmVmb3JleyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiY29udGVudDogJyc7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbjogYWJzb2x1dGU7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b3A6IDA7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJsZWZ0OiAwOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZDogI2ZmZjsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoOiAxMDAlOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OiAxMDAlOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm9yZGVyOiAxcHggc29saWQgI2Q5ZDlkOTsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIjc2V0dGluZ0xheWVyTWFzayBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkOmFmdGVyeyIgKwogICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudDogIuKclCI7JyArCiAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kLWNvbG9yOiAjNjNkNGQ4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpb246IGFic29sdXRlOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidG9wOiAwOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAibGVmdDogMDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoOiAxMnB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OiAxMnB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm9yZGVyOiAxcHggc29saWQgIzYzZDRkODsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yOiAjZmZmOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiZm9udC1zaXplOiAxMHB4OyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAgICAgIi5kcm9wLW92ZXJ7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJvcGFjaXR5OiAwLjY7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiLmlxeGluLXRpdGxlLWVkaXQsIiArCiAgICAgICAgICAgICAgICAgICAgIi5pcXhpbi1zZXQtZWRpdCwiICsKICAgICAgICAgICAgICAgICAgICAiLmlxeGluLXNldC10aXRsZS1kZWwsIiArCiAgICAgICAgICAgICAgICAgICAgIi5pcXhpbi1zZXQtZGVsIHsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInZpc2liaWxpdHk6IGhpZGRlbjsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIm9wYWNpdHk6MDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uOiBhYnNvbHV0ZTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImJhY2tncm91bmQ6IHJnYmEoMjA3LCAyNDksIDI1NSwgMC44Nik7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvcjogcmVkOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidG9wOiA1MCU7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLC01MCUpOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAicmlnaHQ6IDA7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJwYWRkaW5nOiAzcHggM3B4IDZweCA2cHg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJib3JkZXItcmFkaXVzOiAycHg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJjdXJzb3I6IHBvaW50ZXI7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2l0aW9uOiAuM3M7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiLmlxeGluLXNldC10aXRsZS1kZWwuaXF4aW4tc2V0LWFjdGl2ZSB7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kOiAjZmZmOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm9yZGVyLXJhZGl1czogNTAlIDAgMCA1MCU7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiLmlxeGluLXRpdGxlLWVkaXR7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJwYWRkaW5nOiAwcHggM3B4IDZweCA2cHg7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAic3Bhbi5pcXhpbi1hZGRpdGVtIHsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImRpc3BsYXk6IGlubGluZS1ibG9jazsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQtYWxpZ246IGNlbnRlcjsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoOiAxMDAlOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAibWFyZ2luOiAxMHB4IDA7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJib3JkZXI6IDFweCBkb3R0ZWQgcmVkOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiY29sb3I6IHJlZDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImN1cnNvcjogcG9pbnRlcjsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInZpc2liaWxpdHk6aGlkZGVuOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAib3BhY2l0eTowOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNpdGlvbjowLjNzOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNmb3JtOnNjYWxlKDApOyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAgICAgInNwYW4uaXF4aW4tYWRkaXRlbS5pcXhpbi1zZXQtYWN0aXZlIHsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInZpc2liaWxpdHk6dmlzaWJsZTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIm9wYWNpdHk6MTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIm1hcmdpbjoxMHB4IDA7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2Zvcm06c2NhbGUoMSk7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI3NldHRpbmdMYXllciAuc2VqdGl0bGU6aG92ZXIgLmlxeGluLXRpdGxlLWVkaXQsIiArCiAgICAgICAgICAgICAgICAgICAgIiNzZXR0aW5nTGF5ZXIgLnNlamNvbj5zcGFuOmhvdmVyIC5pcXhpbi1zZXQtZWRpdHsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInZpc2liaWxpdHk6dmlzaWJsZTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIm9wYWNpdHk6MC44OyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAgICAgIiNuU2VhcmNoTGlzdC5pcXhpbi1zZXQtYWN0aXZlLCIgKwogICAgICAgICAgICAgICAgICAgICIuaXF4aW4tc2V0LWVkaXQuaXF4aW4tc2V0LWFjdGl2ZSwiICsKICAgICAgICAgICAgICAgICAgICAiLmlxeGluLXNldC10aXRsZS1kZWwuaXF4aW4tc2V0LWFjdGl2ZSwiICsKICAgICAgICAgICAgICAgICAgICAiLmlxeGluLXNldC1kZWwuaXF4aW4tc2V0LWFjdGl2ZSB7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJ2aXNpYmlsaXR5OnZpc2libGUgIWltcG9ydGFudDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIm9wYWNpdHk6MSAhaW1wb3J0YW50OyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAgICAgIiNidG5FbGUgc3Bhbi5pcXhpbi1idG4tYWN0aXZleyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiY29sb3I6cmVkOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm9yZGVyLWNvbG9yOnJlZDsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIjbmV3U2VhcmNoTGlzdEJveCwiICsKICAgICAgICAgICAgICAgICAgICAiI25ld1NlYXJjaEJveHsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zaXRpb246MC4zczsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zZm9ybSA6IHRyYW5zbGF0ZVkoMCUpOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAib3BhY2l0eTogMTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uOmZpeGVkOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiei1pbmRleDoyMDAwMDAxMDA7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b3A6NTAlOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAibGVmdDo1MCU7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJwYWRkaW5nOjIycHg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kOnJnYigyOSwgMjksIDI5KTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlci1yYWRpdXM6NHB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiY29sb3I6ICNlOGU4ZTg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJtYXJnaW46IC0xNDlweCAtMTE3cHg7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI25ld1NlYXJjaExpc3RCb3ggaW5wdXQsIiArCiAgICAgICAgICAgICAgICAgICAgIiNuZXdTZWFyY2hCb3ggaW5wdXR7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJib3JkZXI6IG5vbmU7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJwYWRkaW5nOiA0cHggMCA0cHggNXB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm9yZGVyLXJhZGl1czogNHB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAib3V0bGluZTogbm9uZTsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIjbmV3U2VhcmNoTGlzdEJveCBpbnB1dDpmb2N1cywiICsKICAgICAgICAgICAgICAgICAgICAiI25ld1NlYXJjaEJveCBpbnB1dDpmb2N1cyB7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kOiAjZjFkMmQyOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNpdGlvbjogMC41czsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIuYWRkSXRlbUJveEJ0bnsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImN1cnNvcjogcG9pbnRlcjsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImJhY2tncm91bmQ6ICNmZmY7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJib3JkZXI6IG5vbmU7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJib3JkZXItcmFkaXVzOiA0cHg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJwYWRkaW5nOiA0cHggMTBweDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yOiAjMzMzOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNpdGlvbjowLjNzOyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAgICAgIiN4aW4tY2VudGVyRGlzcGxheSBzZWxlY3QsIiArCiAgICAgICAgICAgICAgICAgICAgIiN4aW4tbmV3dGFiIHNlbGVjdHsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImhlaWdodDphdXRvOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm9yZGVyOiBub25lOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAib3V0bGluZTogbm9uZTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yOiAjM0FCREMxOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiZm9udC1zaXplOiAxZW07IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJmb250LWZhbWlseTogYXJpYWwsc2Fucy1zZXJpZjsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImFwcGVhcmFuY2U6IG5vbmU7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICItbW96LWFwcGVhcmFuY2U6IG5vbmU7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICItd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJwYWRkaW5nOiAwcHggNXB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiY3Vyc29yOiBwb2ludGVyOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kOiB2YXIoLS1iYWNrZ3JvdW5kLWJ0bi1xeGluKTsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIjdGl0bGVFZGl0eyIgKwogICAgICAgICAgICAgICAgICAgICAgICAid2lkdGg6NmVtOyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAgICAgLy8g5oyJ6ZKu5pWI5p6cIO+8miDnoa7lrpog5Y+W5raI5oyJ6ZKuCiAgICAgICAgICAgICAgICAgICAgIi5pcXhpbi1jbG9zZUJ0biwiICsKICAgICAgICAgICAgICAgICAgICAiLmlxeGluLWVudGVyQnRueyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm94LXNpemluZzogYm9yZGVyLWJveDsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIuaXF4aW4tY2xvc2VCdG46aG92ZXJ7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kOiAjZmY2NTY1OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm9yZGVyLWNvbG9yOiAjZmY2NTY1OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiY29sb3I6ICNmZmY7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiLmlxeGluLWVudGVyQnRuOmhvdmVyeyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZDogIzg0YmI4NDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgICJib3JkZXItY29sb3I6ICM4NGJiODQ7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3I6ICNmZmY7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI2lxeGluLWVkaXRDb2RlQm94IGJ1dHRvbnsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImN1cnNvcjpwb2ludGVyOyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCgogICAgICAgICAgICAgICAgICAgIC8vIOWFs+mXreaMiemSrgogICAgICAgICAgICAgICAgICAgICIjeGluLWNsb3NleyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZDp3aGl0ZTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yOiMzQUJEQzE7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lLWhlaWdodDoyMHB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAidGV4dC1hbGlnbjpjZW50ZXI7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJoZWlnaHQ6MjBweDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoOjIwcHg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0LWFsaWduOmNlbnRlcjsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImZvbnQtc2l6ZToyMHB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAicGFkZGluZzoxMHB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm9yZGVyOiAzcHggc29saWQgIzNBQkRDMTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlci1yYWRpdXM6IDUwJTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zaXRpb246IC41czsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInRvcDogLTIwcHg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJyaWdodDotMjBweDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uOiBhYnNvbHV0ZTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImJveC1zaXppbmc6IHVuc2V0OyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAgICAgIiN4aW4tY2xvc2U6OmJlZm9yZXsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRlbnQ6J1xcMjcxNic7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJtYXJnaW46LTEwcHg7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiI3hpbi1jbG9zZTpob3ZlcnsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImJhY2tncm91bmQ6IGluZGlhbnJlZDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlci1jb2xvcjogaW5kaWFucmVkOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiY29sb3I6ICNmZmY7IiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAvLyB0eXBlW3JhbmdlXSDmlYjmnpwKICAgICAgICAgICAgICAgICAgICAiaW5wdXRbdHlwZT1yYW5nZV0geyIgKwogICAgICAgICAgICAgICAgICAgICAgICAib3V0bGluZTogbm9uZTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIi13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImJhY2tncm91bmQ6LXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwjM0FCREMxLCM4M2U3ZWEpIG5vLXJlcGVhdCwgI2ZmZjsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlci1yYWRpdXM6IDEwcHg7IC8q6L+Z5Liq5bGe5oCn6K6+572u5L2/5aGr5YWF6L+b5bqm5p2h5pe255qE5Zu+5b2i5Li65ZyG6KeSKi8iICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICJpbnB1dFt0eXBlPXJhbmdlXTo6LXdlYmtpdC1zbGlkZXItdGh1bWIgeyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOyIgKwogICAgICAgICAgICAgICAgICAgICJ9ICIgKwogICAgICAgICAgICAgICAgICAgICJpbnB1dFt0eXBlPXJhbmdlXTo6LXdlYmtpdC1zbGlkZXItcnVubmFibGUtdHJhY2sgeyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiaGVpZ2h0OiAxMHB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm9yZGVyLXJhZGl1czogMTBweDsgLyrlsIbovajpgZPorr7kuLrlnIbop5LnmoQqLyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm94LXNoYWRvdzogMCAxcHggMXB4ICNkZWYzZjgsIGluc2V0IDAgLjEyNWVtIC4xMjVlbSAjMGQxMTEyOyAvKui9qOmBk+WGhee9rumYtOW9seaViOaenCovIiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAiaW5wdXRbdHlwZT1yYW5nZV06Oi13ZWJraXQtc2xpZGVyLXRodW1iIHsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIi13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsiICsKICAgICAgICAgICAgICAgICAgICAgICAgImhlaWdodDogMThweDsiICsKICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoOiAxOHB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAibWFyZ2luLXRvcDogLTVweDsgLyrkvb/mu5HlnZfotoXlh7rovajpgZPpg6jliIbnmoTlgY/np7vph4/nm7jnrYkqLyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYmFja2dyb3VuZDogI2ZmZjsgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICJib3JkZXItcmFkaXVzOiA1MCU7IC8q5aSW6KeC6K6+572u5Li65ZyG5b2iKi8iICsKICAgICAgICAgICAgICAgICAgICAgICAgImJvcmRlcjogc29saWQgMC4xMjVlbSByZ2JhKDIwNSwgMjI0LCAyMzAsIDAuNSk7IC8q6K6+572u6L655qGGKi8iICsKICAgICAgICAgICAgICAgICAgICAgICAgImJveC1zaGFkb3c6IDAgLjEyNWVtIC4xMjVlbSAjM2I0NTQ3OyAvKua3u+WKoOW6lemDqOmYtOW9sSovIiArCiAgICAgICAgICAgICAgICAgICAgIn0iICsKICAgICAgICAgICAgICAgICAgICAvLyDlr7zlhaUKICAgICAgICAgICAgICAgICAgICAiI2ltcG9ydGluZ0JveHsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uOmZpeGVkOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAid2lkdGg6MzUwcHg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b3A6NTAlOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAibGVmdDo1MCU7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSk7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJwYWRkaW5nOiAxNXB4IDMwcHg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJib3JkZXItcmFkaXVzOiA0cHg7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kOiMxRDFEMUQ7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvcjojZmZmOyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAgICAgIiNpbXBvcnRpbmdCb3ggbGl7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJtYXJnaW46NXB4OyIgKwogICAgICAgICAgICAgICAgICAgICAgICAiYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzNBQ0JERDsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIjaW1wb3J0aW5nQm94IGxpIHB7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJ3aGl0ZS1zcGFjZTogbm93cmFwOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAib3ZlcmZsb3c6IGhpZGRlbjsiICsKICAgICAgICAgICAgICAgICAgICAgICAgInRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAibWFyZ2luLXRvcDowOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAibWFyZ2luLWJvdHRvbTowOyIgKwogICAgICAgICAgICAgICAgICAgICJ9IiArCiAgICAgICAgICAgICAgICAgICAgIi54aW4taW1wb3J0aW5nLWl0ZW17IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJjdXJzb3I6cG9pbnRlcjsiICsKICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICIiOwogICAgICAgICAgICAgICAgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CiAgICAgICAgICAgICAgICBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICAgICAgICAgICAgICBzdHlsZS50eXBlID0gJ3RleHQvY3NzJzsKICAgICAgICAgICAgICAgIHN0eWxlLmlubmVySFRNTCA9IGNzczsKICAgICAgICAgICAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyDlhbPpl63orr7nva7oj5zljZXkuK3nmoTmiYDmnInliqjnlLvmlYjmnpwgCiAgICAgICAgICAgICAgICBpZighZ2V0U2V0dGluZ0RhdGEudHJhbnN0aW9uKXsKICAgICAgICAgICAgICAgICAgICBHTV9hZGRTdHlsZSgiI3NldHRpbmdMYXllciwiICsKICAgICAgICAgICAgICAgICAgICAgICAgIiNidG5FbGUgc3BhbiwiICsKICAgICAgICAgICAgICAgICAgICAgICAgIiNidG5FbGUyLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAiLmlxeGluLXNldC1kZWwsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICJzcGFuLmlxeGluLWFkZGl0ZW0sIiArCiAgICAgICAgICAgICAgICAgICAgICAgICIjbmV3U2VhcmNoQm94LCIgKwogICAgICAgICAgICAgICAgICAgICAgICAiLmFkZEl0ZW1Cb3hCdG4sIiArCiAgICAgICAgICAgICAgICAgICAgICAgICIjeGluLWNsb3NlLCIgKwogICAgICAgICAgICAgICAgICAgICAgICAiI3NldHRpbmdMYXllck1hc2t7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNpdGlvbjpub25lOyIrCiAgICAgICAgICAgICAgICAgICAgICAgICJ9IisKICAgICAgICAgICAgICAgICAgICAgICAgIiNzZXR0aW5nTGF5ZXJNYXNreyIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2tkcm9wLWZpbHRlcjpub25lOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsLjcpOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAifSIrCiAgICAgICAgICAgICAgICAgICAgICAgICIiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIC8vIOWinuWKoOiuvue9ruaMiemSrgogICAgICAgIGlmIChnZXRTZXR0aW5nRGF0YS5zZXRCdG5PcGFjaXR5Pj0wKXsKICAgICAgICAgICAgdmFyIHNldEJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgICAgICAgc2V0QnRuLmlkID0gInNldEJ0biI7CiAgICAgICAgICAgIEdNX2FkZFN0eWxlKCIjc2V0QnRueyIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wYWNpdHk6IitnZXRTZXR0aW5nRGF0YS5zZXRCdG5PcGFjaXR5KyI7IisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2l0aW9uOjAuNXM7IisKICAgICAgICAgICAgICAgICAgICAgICAgIn0iKwogICAgICAgICAgICAgICAgICAgICAgICAic3BhbiNzZXRCdG46aG92ZXJ7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BhY2l0eToxOyIgKwogICAgICAgICAgICAgICAgICAgICAgICAifSIgKwogICAgICAgICAgICAgICAgICAgICAgICAiIik7CiAgICAgICAgICAgIHNldEJ0bi5pbm5lckhUTUwgPSBgPGltZyBzdHlsZT0nbWFyZ2luOjAgMCAtM3B4IDZweDt3aWR0aDoxNnB4O3ZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtkaXNwbGF5OmlubGluZS1ibG9jaztjdXJzb3I6cG9pbnRlcjsnIHNyYz0iZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB0PScxNjY2OTUwMTY1Mzc3JyBjbGFzcz0naWNvbicgdmlld0JveD0nMCAwIDEwMjQgMTAyNCcgdmVyc2lvbj0nMS4xJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHAtaWQ9JzExMDQ4JyB3aWR0aD0nMzInIGhlaWdodD0nMzInJTNFJTNDcGF0aCBkPSdNMzM3LjMzMyA1MTcuNjY3Yzc3LjQwNiAwIDE0MS45NzQgNTQuOTY3IDE1Ni44IDEyNy45OThsNDQwLjUzNCAwLjAwMmMxNy42NzMgMCAzMiAxNC4zMjcgMzIgMzIgMCAxNy40OTYtMTQuMDQyIDMxLjcxMy0zMS40NzEgMzEuOTk1bC0wLjUzIDAuMDA1LTQ0MC41MzQgMC4wMDFDNDc5LjMwNyA3ODIuNyA0MTQuNzQgODM3LjY2NyAzMzcuMzMzIDgzNy42NjdTMTk1LjM2IDc4Mi42OTkgMTgwLjUzNCA3MDkuNjY4bC05OS4yLTAuMDAxYy0xNy42NzQgMC0zMi0xNC4zMjctMzItMzIgMC0xNy40OTcgMTQuMDQxLTMxLjcxMyAzMS40Ny0zMS45OTZsMC41My0wLjAwNCA5OS4yLTAuMDAyYzE0LjgyNS03My4wMyA3OS4zOTMtMTI3Ljk5OCAxNTYuOC0xMjcuOTk4eiBtMCA2NGMtNTMuMDE5IDAtOTYgNDIuOTgtOTYgOTYgMCA1My4wMTkgNDIuOTgxIDk2IDk2IDk2IDUzLjAyIDAgOTYtNDIuOTgxIDk2LTk2IDAtNTMuMDItNDIuOTgtOTYtOTYtOTZ6IG0zNDEuMzM0LTQwNS4zMzRjNzcuNDA2IDAgMTQxLjk3NCA1NC45NjggMTU2Ljc5OSAxMjcuOTk5bDk5LjIgMC4wMDFjMTcuNjc0IDAgMzIgMTQuMzI3IDMyIDMyIDAgMTcuNDk3LTE0LjA0MSAzMS43MTMtMzEuNDcgMzEuOTk2bC0wLjUzIDAuMDA0LTk5LjIgMC4wMDNjLTE0LjgyNiA3My4wMy03OS4zOTQgMTI3Ljk5Ny0xNTYuOCAxMjcuOTk3LTc3LjQwNSAwLTE0MS45NzMtNTQuOTY3LTE1Ni43OTgtMTI3Ljk5N2wtNDQwLjUzNS0wLjAwM2MtMTcuNjczIDAtMzItMTQuMzI3LTMyLTMyIDAtMTcuNDk2IDE0LjA0Mi0zMS43MTMgMzEuNDcxLTMxLjk5NWwwLjUzLTAuMDA1IDQ0MC41MzQtMC4wMDFjMTQuODI1LTczLjAzMSA3OS4zOTMtMTI3Ljk5OSAxNTYuNzk5LTEyNy45OTl6IG0wIDY0Yy01My4wMiAwLTk2IDQyLjk4MS05NiA5NiAwIDUzLjAyIDQyLjk4IDk2IDk2IDk2IDUzLjAxOSAwIDk2LTQyLjk4IDk2LTk2IDAtNTMuMDE5LTQyLjk4MS05Ni05Ni05NnonIHAtaWQ9JzExMDQ5JyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSI+YAogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc2VqLWNvbnRhaW5lciIpLmFwcGVuZENoaWxkKHNldEJ0bik7CiAgICAgICAgICAgIHZhciBzZWpTZXQgPSBudWxsOwoKICAgICAgICAgICAgc2V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixzZXRCdG5TdGFydCk7CiAgICAgICAgfTsKCiAgICAgICAgLy8g5rOo5YaM6I+c5Y2VCiAgICAgICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgic2VhcmNoIGp1bXAg5pCc57Si6Lez6L2s6K6+572uIixzZXRCdG5TdGFydCk7CgogICAgICAgIGZ1bmN0aW9uIHNldEJ0blN0YXJ0KCl7CiAgICAgICAgICAgIGlmKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjc2V0dGluZ0xheWVyTWFzayIpKXsKICAgICAgICAgICAgICAgIHNlalNldCA9IG5ldyBTRUpzZXR0aW5nKCk7CgogICAgICAgICAgICAgICAgdmFyIHNlal9zYXZlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3hpbi1zYXZlIik7CiAgICAgICAgICAgICAgICAvLyB2YXIgc2VqX2Nsb3NlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3hpbi1jbG9zZSIpOwogICAgICAgICAgICAgICAgLy8gdmFyIHNlal9yZXNldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiN4aW4tcmVzZXQiKTsKICAgICAgICAgICAgICAgIHZhciBzZWpfYWRkRGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3hpbi1hZGREZWwiKTsKICAgICAgICAgICAgICAgIHZhciBzZWpfZWRpdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiN4aW4tbW9kaWZpY2F0aW9uIik7CgogICAgICAgICAgICAgICAgLy8gc2VqX3NhdmUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7c2VqU2V0LnNhdmVEYXRhKCk7c2VqU2V0LmhpZGUoKTtpZighZ2V0U2V0dGluZ0RhdGEuZGVidWcpd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO30pOwogICAgICAgICAgICAgICAgc2VqX3NhdmUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7c2VqU2V0LnNhdmVEYXRhKCk7c2VqU2V0LmhpZGUoKTtzZWpTZXQucmVsb2FkU2V0KCk7fSk7CiAgICAgICAgICAgICAgICAvLyBzZWpfY2xvc2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7c2VqU2V0LmhpZGUoKTt9KTsKICAgICAgICAgICAgICAgIC8vIHNlal9yZXNldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtzZWpTZXQucmVzZXQoKTtzZWpTZXQuaGlkZSgpO3dpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTt9KTsKICAgICAgICAgICAgICAgIHNlal9hZGREZWwuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGUpe3NlalNldC5hZGREZWwoZSk7fSk7CiAgICAgICAgICAgICAgICAvLyBzZWpfZWRpdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oZSl7c2VqU2V0LmFkZEVkaXQoZSk7fSk7CiAgICAgICAgICAgICAgICBzZWpfZWRpdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtzZWpTZXQuZWRpdENvZGVCb3goKTt9KTsKCiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixzZWpTZXQud2luZG93UmVzaXplLmJpbmQoc2VqU2V0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VqU2V0LnNob3coKTsKICAgICAgICB9CgogICAgICAgIC8vIOiOt+WPluWtmOWCqOeahOaVsOaNruS/oeaBrwogICAgICAgIGZ1bmN0aW9uIGdldF9kYXRhKCl7CiAgICAgICAgICAgIHNldERhdGEgPSBHTV9nZXRWYWx1ZSgic2VhcmNoRW5naW5lSnVtcERhdGEiKTsKICAgICAgICB9CiAgICAgICAgdmFyIHNldERhdGEgPSBudWxsOwogICAgICAgIC8vIGdldF9kYXRhKCk7CiAgICB9CgogICAgLy8g5raI5oGv5o+Q56S65qGGCiAgICAgICAgLy8g55uu5YmN5Y+q5piv5Li65LqG57uZ55So5oi35LiA5Liq5Y+N6aaI44CCIC0g5oiQ5Yqf5LqG5LmIIC0g5ZevLOaIkOWKn+S6hgogICAgdmFyIGlxeGluVGltZXJHbG9iYWxUaXAgPSBudWxsCiAgICBmdW5jdGlvbiBpcXhpblNob3dUaXAodGV4dCxkdXJhdGlvbil7CiAgICAgICAgY29uc29sZS5sb2coImlxeGluIC0tIOa2iOaBr+aPkOekuuahhjogIiwgdGV4dCk7CiAgICAgICAgdmFyIG9kb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaXFpeG4tZ2xvYmFsLXRpcCIpOwogICAgICAgIGlmKCFvZG9tKXsKICAgICAgICAgICAgb2RvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlxeGluRGl2Iik7CiAgICAgICAgICAgIG9kb20uaWQgPSAiaXFpeG4tZ2xvYmFsLXRpcCI7CiAgICAgICAgICAgIG9kb20uc3R5bGUuY3NzVGV4dCA9ICIiICsKICAgICAgICAgICAgICAgICJvcGFjaXR5OiAwOyIgKwogICAgICAgICAgICAgICAgImhlaWdodDogMjVweDsiICsKICAgICAgICAgICAgICAgICJsaW5lLWhlaWdodDogMjVweDsiICsKICAgICAgICAgICAgICAgICJsZXR0ZXItc3BhY2luZzogMXB4OyIgKwogICAgICAgICAgICAgICAgImZvbnQtc2l6ZTogMWVtOyIgKwogICAgICAgICAgICAgICAgImNvbG9yOiAjZmZmOyIgKwogICAgICAgICAgICAgICAgInBhZGRpbmc6IDVweCAyMHB4OyIgKwogICAgICAgICAgICAgICAgImJvcmRlci1yYWRpdXM6IDVweDsiICsKICAgICAgICAgICAgICAgICJiYWNrZ3JvdW5kLWNvbG9yOiAjNjY2OyIgKwogICAgICAgICAgICAgICAgInBvc2l0aW9uOiBmaXhlZDsiICsKICAgICAgICAgICAgICAgICJ6LWluZGV4OiAyMDAwMDAwMDE7IiArCiAgICAgICAgICAgICAgICAibGVmdDogNTAlOyIgKwogICAgICAgICAgICAgICAgImJvdHRvbTogNSU7IiArCiAgICAgICAgICAgICAgICAidHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSk7IiArCiAgICAgICAgICAgICAgICAidHJhbnNpdGlvbjogLjRzOyIgOwogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG9kb20pOwogICAgICAgIH0KCiAgICAgICAgb2RvbS5pbm5lckhUTUw9dGV4dDsKICAgICAgICBvZG9tLnN0eWxlLm9wYWNpdHk9MTsKCiAgICAgICAgZHVyYXRpb24gPSBkdXJhdGlvbj9kdXJhdGlvbjoxNTAwOwogICAgICAgIC8v6Ziy5q2i5oyB57ut5pe26Ze05YaF5aSa5qyh6Kem5Y+R5o+Q56S6CiAgICAgICAgaWYoIWlxeGluVGltZXJHbG9iYWxUaXApewogICAgICAgICAgICBpcXhpblRpbWVyR2xvYmFsVGlwID0gc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgb2RvbS5zdHlsZS5vcGFjaXR5PTA7CiAgICAgICAgICAgICAgICBpcXhpblRpbWVyR2xvYmFsVGlwID0gbnVsbDsKICAgICAgICAgICAgfSxkdXJhdGlvbik7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOS7juatpOWkhOW8gOWni+aJp+ihjAogICAgdmFyIGRlYnVnOwogICAgZnVuY3Rpb24gcmVsb2FkRGVidWcoYm9vbCkgewogICAgICAgIGRlYnVnID0gYm9vbCA/IGNvbnNvbGUuaW5mby5iaW5kKGNvbnNvbGUpIDogZnVuY3Rpb24oKSB7fTsKICAgIH0KCiAgICBpZiAod2luZG93LnNlbGYgIT0gd2luZG93LnRvcCkgcmV0dXJuOwoKICAgIHZhciB1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgIC8vIHZhciBoYXNoTGlzdCA9IFsKICAgIC8vICAgICAvXmh0dHBzPzpcL1wvd3d3XC5iYWlkdVwuY29tXC8kL2ksCiAgICAvLyAgICAgL15odHRwcz86XC9cL3d3d1wuZ29vZ2xlKD86XC5bQS16XXsyLDN9KXsxLDJ9XC8kL2ksCiAgICAvLyAgICAgL15odHRwcz86XC9cL3d3d1wuZ29vZ2xlKD86XC5bQS16XXsyLDN9KXsxLDJ9XC9bXiNdKiMoPzomP3E9fC4rPyZxPSkuKy8sCiAgICAvLyAgICAgLy8gL15odHRwcz86XC9cL3NlYXJ4XC5tZVwvL2ksCiAgICAvLyBdOwogICAgLy8g6YOo5YiG572R56uZ5oiW5YaF5Zug5oiW5aSW5Zug55qE5Y6f5Zug5Yqg6L2957yT5oWi77yM5omA5Lul5o6o6L+f5o+S5YWlCiAgICB2YXIgZGVsYXlMaXN0ID0gWwogICAgICAgIC9eaHR0cHM/OlwvXC9nb29nbGVcLmluZmluaXR5bmV3dGFiXC5jb21cL1w/cS8sCiAgICAgICAgL15odHRwcz86XC9cL3d3d1wuemhpaHVcLmNvbVwvc2VhcmNoXD8vLAogICAgICAgIC9eaHR0cHM/OlwvXC93d3dcLmljaWJhXC5jb21cL3dvcmRcPy8sCiAgICAgICAgL15odHRwcz86XC9cL25lZXZhXC5jb21cL3NlYXJjaFw/L2ksCiAgICAgICAgL15odHRwcz86XC9cL3NcLnRhb2Jhb1wuY29tXC9zZWFyY2gvLAogICAgXQoKICAgIC8vIHZhciBoYXNoTGlzdFRhZyA9IGhhc2hMaXN0LnNvbWUoZnVuY3Rpb24gaGFzaFVybChlbGVtZW50LCBpbmRleCwgYXJyYXkpewogICAgLy8gICAgICAgICByZXR1cm4gfnVybC5zZWFyY2goZWxlbWVudCk7CiAgICAvLyB9KTsKICAgIHZhciBkZWxheUxpc3RUYWcgPSBkZWxheUxpc3Quc29tZShmdW5jdGlvbiBoYXNoVXJsKGVsZW1lbnQsIGluZGV4LCBhcnJheSl7CiAgICAgICAgcmV0dXJuIH51cmwuc2VhcmNoKGVsZW1lbnQpOwogICAgfSk7CgogICAgCiAgICAvLyBpZiAoaGFzaExpc3RUYWcpewogICAgLy8gICAgIHZhciBvbGRUaXRsZSA9IGRvY3VtZW50LnRpdGxlOwogICAgLy8gICAgIHZhciBuZXdUaXRsZSA9ICIiOwogICAgLy8gICAgIHZhciB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CiAgICAvLyAgICAgICAgIC8vIGNvbnNvbGUubG9nKCLlvqrnjq/kuK0iLG5ld1RpdGxlLG9sZFRpdGxlKTsKICAgIC8vICAgICAgICAgbmV3VGl0bGUgPSBkb2N1bWVudC50aXRsZTsKICAgIC8vICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNhcHBiYXIiKSAmJiAhZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2Vqc3BhbiIpKXsKICAgIC8vICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJuZXciKTsKICAgIC8vICAgICAgICAgICAgIGlxeGluc3RhcnQoKTsKICAgIC8vICAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzZWpzcGFuIikpewogICAgLy8gICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIuW3suWtmOWcqCIpOwogICAgLy8gICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CiAgICAvLyAgICAgICAgIH1lbHNlIGlmIChvbGRUaXRsZSE9bmV3VGl0bGUpewogICAgLy8gICAgICAgICAgICAgLy8gY29uc29sZS5sb2coIuS4jeWtmOWcqOW8gOWni+aPkuWFpSIpOwogICAgLy8gICAgICAgICAgICAgaXF4aW5zdGFydCgpOwogICAgLy8gICAgICAgICB9CiAgICAvLyAgICAgfSwxMDAwKQogICAgLy8gfSBlbHNlIAogICAgaWYgKGRlbGF5TGlzdFRhZyl7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAvLyBjb25zb2xlLmxvZygi5bu25pe26L+Q6KGMIik7CiAgICAgICAgICAgIHZhciBzZWpTcGFuID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2Vqc3BhbicpOwogICAgICAgICAgICBpZihzZWpTcGFuKXsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfSBlbHNlewogICAgICAgICAgICAgICAgICAgaXF4aW5zdGFydCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0sMjAwMCk7CiAgICB9IGVsc2UgewogICAgICAgIC8vIGNvbnNvbGUubG9nKCLmma7pgJrmj5LlhaUiKTsKICAgICAgICBpcXhpbnN0YXJ0KCk7CiAgICB9CiAgICAgICAgCiAgICBpZiAodHJ1ZSkgewogICAgICAgIC8vIGNvbnNvbGUubG9nKCdpcXhpbua3u+WKoOagh+mimOiKgueCueebkeinhuWZqDogdGl0bGUnKTsKICAgICAgICAvLyDlu7bml7bmt7vliqDmoIfpopjnm5Hop4blmagsIOW6lOWvuSB5b3V0dWJlCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICB2YXIgd2F0Y2ggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpOwogICAgICAgICAgICAvLyBjb25zb2xlLmxvZygidGl0aWxlOiAiLHdhdGNoKTsKICAgICAgICAgICAgLy8gY29uc29sZS5sb2coInRpdGlsZTogIixkb2N1bWVudC50aXRsZSk7CiAgICAgICAgICAgIG5ldyAod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXIpKGZ1bmN0aW9uKG11dGF0aW9ucyl7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnaXF4aW7moIfpopjlj5HnlJ/kuoblj5jljJYnLCBkb2N1bWVudC50aXRsZSk7CiAgICAgICAgICAgICAgICB2YXIgc2VqU3BhbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NlanNwYW4nKQogICAgICAgICAgICAgICAgaWYoIXNlalNwYW4pewogICAgICAgICAgICAgICAgICAgIGlxeGluc3RhcnQoKTsKICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgIHNlalNwYW4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCAoc2VqU3Bhbik7CiAgICAgICAgICAgICAgICAgICAgaXF4aW5zdGFydCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KS5vYnNlcnZlKHdhdGNoLCB7Y2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7CiAgICAgICAgfSwxMDAwKQogICAgfQp9KSgpOwoK","requires":[{"meta":{"name":"toGBK.js","url":"https://greasyfork.org/scripts/408009-togbk/code/toGBK.js?version=832799","ts":1674973953615,"mimetype":"text/javascript"},"source":"Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS3lj6/orr7nva7pobnnu5PmnZ8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdW5pY29kZei9rOaIkGdia+e8lueggeWHveaVsApmdW5jdGlvbiB0b0dCSyhzdHIpIHsKCXZhciBtYXAgPSB7IC8v57yW56CB5a+554WnIHVuaWNvZGUoMTDov5vliLYpIDogZ2IyMzEyKDE26L+b5Yi2KQoJCTEyMjg4IDogIkExQTEiLAoJCTEyMjg5IDogIkExQTIiLAoJCTEyMjkwIDogIkExQTMiLAoJCTE4MyA6ICJBMUE0IiwKCQk3MTMgOiAiQTFBNSIsCgkJNzExIDogIkExQTYiLAoJCTE2OCA6ICJBMUE3IiwKCQkxMjI5MSA6ICJBMUE4IiwKCQkxMjI5MyA6ICJBMUE5IiwKCQk4MjEyIDogIkExQUEiLAoJCTY1Mzc0IDogIkExQUIiLAoJCTgyMTQgOiAiQTFBQyIsCgkJODIzMCA6ICJBMUFEIiwKCQk4MjE2IDogIkExQUUiLAoJCTgyMTcgOiAiQTFBRiIsCgkJODIyMCA6ICJBMUIwIiwKCQk4MjIxIDogIkExQjEiLAoJCTEyMzA4IDogIkExQjIiLAoJCTEyMzA5IDogIkExQjMiLAoJCTEyMjk2IDogIkExQjQiLAoJCTEyMjk3IDogIkExQjUiLAoJCTEyMjk4IDogIkExQjYiLAoJCTEyMjk5IDogIkExQjciLAoJCTEyMzAwIDogIkExQjgiLAoJCTEyMzAxIDogIkExQjkiLAoJCTEyMzAyIDogIkExQkEiLAoJCTEyMzAzIDogIkExQkIiLAoJCTEyMzEwIDogIkExQkMiLAoJCTEyMzExIDogIkExQkQiLAoJCTEyMzA0IDogIkExQkUiLAoJCTEyMzA1IDogIkExQkYiLAoJCTE3NyA6ICJBMUMwIiwKCQkyMTUgOiAiQTFDMSIsCgkJMjQ3IDogIkExQzIiLAoJCTg3NTggOiAiQTFDMyIsCgkJODc0MyA6ICJBMUM0IiwKCQk4NzQ0IDogIkExQzUiLAoJCTg3MjEgOiAiQTFDNiIsCgkJODcxOSA6ICJBMUM3IiwKCQk4NzQ2IDogIkExQzgiLAoJCTg3NDUgOiAiQTFDOSIsCgkJODcxMiA6ICJBMUNBIiwKCQk4NzU5IDogIkExQ0IiLAoJCTg3MzAgOiAiQTFDQyIsCgkJODg2OSA6ICJBMUNEIiwKCQk4NzQxIDogIkExQ0UiLAoJCTg3MzYgOiAiQTFDRiIsCgkJODk3OCA6ICJBMUQwIiwKCQk4ODU3IDogIkExRDEiLAoJCTg3NDcgOiAiQTFEMiIsCgkJODc1MCA6ICJBMUQzIiwKCQk4ODAxIDogIkExRDQiLAoJCTg3ODAgOiAiQTFENSIsCgkJODc3NiA6ICJBMUQ2IiwKCQk4NzY1IDogIkExRDciLAoJCTg3MzMgOiAiQTFEOCIsCgkJODgwMCA6ICJBMUQ5IiwKCQk4ODE0IDogIkExREEiLAoJCTg4MTUgOiAiQTFEQiIsCgkJODgwNCA6ICJBMURDIiwKCQk4ODA1IDogIkExREQiLAoJCTg3MzQgOiAiQTFERSIsCgkJODc1NyA6ICJBMURGIiwKCQk4NzU2IDogIkExRTAiLAoJCTk3OTQgOiAiQTFFMSIsCgkJOTc5MiA6ICJBMUUyIiwKCQkxNzYgOiAiQTFFMyIsCgkJODI0MiA6ICJBMUU0IiwKCQk4MjQzIDogIkExRTUiLAoJCTg0NTEgOiAiQTFFNiIsCgkJNjUyODQgOiAiQTFFNyIsCgkJMTY0IDogIkExRTgiLAoJCTY1NTA0IDogIkExRTkiLAoJCTY1NTA1IDogIkExRUEiLAoJCTgyNDAgOiAiQTFFQiIsCgkJMTY3IDogIkExRUMiLAoJCTg0NzAgOiAiQTFFRCIsCgkJOTczNCA6ICJBMUVFIiwKCQk5NzMzIDogIkExRUYiLAoJCTk2NzUgOiAiQTFGMCIsCgkJOTY3OSA6ICJBMUYxIiwKCQk5Njc4IDogIkExRjIiLAoJCTk2NzEgOiAiQTFGMyIsCgkJOTY3MCA6ICJBMUY0IiwKCQk5NjMzIDogIkExRjUiLAoJCTk2MzIgOiAiQTFGNiIsCgkJOTY1MSA6ICJBMUY3IiwKCQk5NjUwIDogIkExRjgiLAoJCTgyNTEgOiAiQTFGOSIsCgkJODU5NCA6ICJBMUZBIiwKCQk4NTkyIDogIkExRkIiLAoJCTg1OTMgOiAiQTFGQyIsCgkJODU5NSA6ICJBMUZEIiwKCQkxMjMwNyA6ICJBMUZFIiwKCQk4NTYwIDogIkEyQTEiLAoJCTg1NjEgOiAiQTJBMiIsCgkJODU2MiA6ICJBMkEzIiwKCQk4NTYzIDogIkEyQTQiLAoJCTg1NjQgOiAiQTJBNSIsCgkJODU2NSA6ICJBMkE2IiwKCQk4NTY2IDogIkEyQTciLAoJCTg1NjcgOiAiQTJBOCIsCgkJODU2OCA6ICJBMkE5IiwKCQk4NTY5IDogIkEyQUEiLAoJCTkzNTIgOiAiQTJCMSIsCgkJOTM1MyA6ICJBMkIyIiwKCQk5MzU0IDogIkEyQjMiLAoJCTkzNTUgOiAiQTJCNCIsCgkJOTM1NiA6ICJBMkI1IiwKCQk5MzU3IDogIkEyQjYiLAoJCTkzNTggOiAiQTJCNyIsCgkJOTM1OSA6ICJBMkI4IiwKCQk5MzYwIDogIkEyQjkiLAoJCTkzNjEgOiAiQTJCQSIsCgkJOTM2MiA6ICJBMkJCIiwKCQk5MzYzIDogIkEyQkMiLAoJCTkzNjQgOiAiQTJCRCIsCgkJOTM2NSA6ICJBMkJFIiwKCQk5MzY2IDogIkEyQkYiLAoJCTkzNjcgOiAiQTJDMCIsCgkJOTM2OCA6ICJBMkMxIiwKCQk5MzY5IDogIkEyQzIiLAoJCTkzNzAgOiAiQTJDMyIsCgkJOTM3MSA6ICJBMkM0IiwKCQk5MzMyIDogIkEyQzUiLAoJCTkzMzMgOiAiQTJDNiIsCgkJOTMzNCA6ICJBMkM3IiwKCQk5MzM1IDogIkEyQzgiLAoJCTkzMzYgOiAiQTJDOSIsCgkJOTMzNyA6ICJBMkNBIiwKCQk5MzM4IDogIkEyQ0IiLAoJCTkzMzkgOiAiQTJDQyIsCgkJOTM0MCA6ICJBMkNEIiwKCQk5MzQxIDogIkEyQ0UiLAoJCTkzNDIgOiAiQTJDRiIsCgkJOTM0MyA6ICJBMkQwIiwKCQk5MzQ0IDogIkEyRDEiLAoJCTkzNDUgOiAiQTJEMiIsCgkJOTM0NiA6ICJBMkQzIiwKCQk5MzQ3IDogIkEyRDQiLAoJCTkzNDggOiAiQTJENSIsCgkJOTM0OSA6ICJBMkQ2IiwKCQk5MzUwIDogIkEyRDciLAoJCTkzNTEgOiAiQTJEOCIsCgkJOTMxMiA6ICJBMkQ5IiwKCQk5MzEzIDogIkEyREEiLAoJCTkzMTQgOiAiQTJEQiIsCgkJOTMxNSA6ICJBMkRDIiwKCQk5MzE2IDogIkEyREQiLAoJCTkzMTcgOiAiQTJERSIsCgkJOTMxOCA6ICJBMkRGIiwKCQk5MzE5IDogIkEyRTAiLAoJCTkzMjAgOiAiQTJFMSIsCgkJOTMyMSA6ICJBMkUyIiwKCQkxMjgzMiA6ICJBMkU1IiwKCQkxMjgzMyA6ICJBMkU2IiwKCQkxMjgzNCA6ICJBMkU3IiwKCQkxMjgzNSA6ICJBMkU4IiwKCQkxMjgzNiA6ICJBMkU5IiwKCQkxMjgzNyA6ICJBMkVBIiwKCQkxMjgzOCA6ICJBMkVCIiwKCQkxMjgzOSA6ICJBMkVDIiwKCQkxMjg0MCA6ICJBMkVEIiwKCQkxMjg0MSA6ICJBMkVFIiwKCQk4NTQ0IDogIkEyRjEiLAoJCTg1NDUgOiAiQTJGMiIsCgkJODU0NiA6ICJBMkYzIiwKCQk4NTQ3IDogIkEyRjQiLAoJCTg1NDggOiAiQTJGNSIsCgkJODU0OSA6ICJBMkY2IiwKCQk4NTUwIDogIkEyRjciLAoJCTg1NTEgOiAiQTJGOCIsCgkJODU1MiA6ICJBMkY5IiwKCQk4NTUzIDogIkEyRkEiLAoJCTg1NTQgOiAiQTJGQiIsCgkJODU1NSA6ICJBMkZDIiwKCQk2NTI4MSA6ICJBM0ExIiwKCQk2NTI4MiA6ICJBM0EyIiwKCQk2NTI4MyA6ICJBM0EzIiwKCQk2NTUwOSA6ICJBM0E0IiwKCQk2NTI4NSA6ICJBM0E1IiwKCQk2NTI4NiA6ICJBM0E2IiwKCQk2NTI4NyA6ICJBM0E3IiwKCQk2NTI4OCA6ICJBM0E4IiwKCQk2NTI4OSA6ICJBM0E5IiwKCQk2NTI5MCA6ICJBM0FBIiwKCQk2NTI5MSA6ICJBM0FCIiwKCQk2NTI5MiA6ICJBM0FDIiwKCQk2NTI5MyA6ICJBM0FEIiwKCQk2NTI5NCA6ICJBM0FFIiwKCQk2NTI5NSA6ICJBM0FGIiwKCQk2NTI5NiA6ICJBM0IwIiwKCQk2NTI5NyA6ICJBM0IxIiwKCQk2NTI5OCA6ICJBM0IyIiwKCQk2NTI5OSA6ICJBM0IzIiwKCQk2NTMwMCA6ICJBM0I0IiwKCQk2NTMwMSA6ICJBM0I1IiwKCQk2NTMwMiA6ICJBM0I2IiwKCQk2NTMwMyA6ICJBM0I3IiwKCQk2NTMwNCA6ICJBM0I4IiwKCQk2NTMwNSA6ICJBM0I5IiwKCQk2NTMwNiA6ICJBM0JBIiwKCQk2NTMwNyA6ICJBM0JCIiwKCQk2NTMwOCA6ICJBM0JDIiwKCQk2NTMwOSA6ICJBM0JEIiwKCQk2NTMxMCA6ICJBM0JFIiwKCQk2NTMxMSA6ICJBM0JGIiwKCQk2NTMxMiA6ICJBM0MwIiwKCQk2NTMxMyA6ICJBM0MxIiwKCQk2NTMxNCA6ICJBM0MyIiwKCQk2NTMxNSA6ICJBM0MzIiwKCQk2NTMxNiA6ICJBM0M0IiwKCQk2NTMxNyA6ICJBM0M1IiwKCQk2NTMxOCA6ICJBM0M2IiwKCQk2NTMxOSA6ICJBM0M3IiwKCQk2NTMyMCA6ICJBM0M4IiwKCQk2NTMyMSA6ICJBM0M5IiwKCQk2NTMyMiA6ICJBM0NBIiwKCQk2NTMyMyA6ICJBM0NCIiwKCQk2NTMyNCA6ICJBM0NDIiwKCQk2NTMyNSA6ICJBM0NEIiwKCQk2NTMyNiA6ICJBM0NFIiwKCQk2NTMyNyA6ICJBM0NGIiwKCQk2NTMyOCA6ICJBM0QwIiwKCQk2NTMyOSA6ICJBM0QxIiwKCQk2NTMzMCA6ICJBM0QyIiwKCQk2NTMzMSA6ICJBM0QzIiwKCQk2NTMzMiA6ICJBM0Q0IiwKCQk2NTMzMyA6ICJBM0Q1IiwKCQk2NTMzNCA6ICJBM0Q2IiwKCQk2NTMzNSA6ICJBM0Q3IiwKCQk2NTMzNiA6ICJBM0Q4IiwKCQk2NTMzNyA6ICJBM0Q5IiwKCQk2NTMzOCA6ICJBM0RBIiwKCQk2NTMzOSA6ICJBM0RCIiwKCQk2NTM0MCA6ICJBM0RDIiwKCQk2NTM0MSA6ICJBM0REIiwKCQk2NTM0MiA6ICJBM0RFIiwKCQk2NTM0MyA6ICJBM0RGIiwKCQk2NTM0NCA6ICJBM0UwIiwKCQk2NTM0NSA6ICJBM0UxIiwKCQk2NTM0NiA6ICJBM0UyIiwKCQk2NTM0NyA6ICJBM0UzIiwKCQk2NTM0OCA6ICJBM0U0IiwKCQk2NTM0OSA6ICJBM0U1IiwKCQk2NTM1MCA6ICJBM0U2IiwKCQk2NTM1MSA6ICJBM0U3IiwKCQk2NTM1MiA6ICJBM0U4IiwKCQk2NTM1MyA6ICJBM0U5IiwKCQk2NTM1NCA6ICJBM0VBIiwKCQk2NTM1NSA6ICJBM0VCIiwKCQk2NTM1NiA6ICJBM0VDIiwKCQk2NTM1NyA6ICJBM0VEIiwKCQk2NTM1OCA6ICJBM0VFIiwKCQk2NTM1OSA6ICJBM0VGIiwKCQk2NTM2MCA6ICJBM0YwIiwKCQk2NTM2MSA6ICJBM0YxIiwKCQk2NTM2MiA6ICJBM0YyIiwKCQk2NTM2MyA6ICJBM0YzIiwKCQk2NTM2NCA6ICJBM0Y0IiwKCQk2NTM2NSA6ICJBM0Y1IiwKCQk2NTM2NiA6ICJBM0Y2IiwKCQk2NTM2NyA6ICJBM0Y3IiwKCQk2NTM2OCA6ICJBM0Y4IiwKCQk2NTM2OSA6ICJBM0Y5IiwKCQk2NTM3MCA6ICJBM0ZBIiwKCQk2NTM3MSA6ICJBM0ZCIiwKCQk2NTM3MiA6ICJBM0ZDIiwKCQk2NTM3MyA6ICJBM0ZEIiwKCQk2NTUwNyA6ICJBM0ZFIiwKCQkxMjM1MyA6ICJBNEExIiwKCQkxMjM1NCA6ICJBNEEyIiwKCQkxMjM1NSA6ICJBNEEzIiwKCQkxMjM1NiA6ICJBNEE0IiwKCQkxMjM1NyA6ICJBNEE1IiwKCQkxMjM1OCA6ICJBNEE2IiwKCQkxMjM1OSA6ICJBNEE3IiwKCQkxMjM2MCA6ICJBNEE4IiwKCQkxMjM2MSA6ICJBNEE5IiwKCQkxMjM2MiA6ICJBNEFBIiwKCQkxMjM2MyA6ICJBNEFCIiwKCQkxMjM2NCA6ICJBNEFDIiwKCQkxMjM2NSA6ICJBNEFEIiwKCQkxMjM2NiA6ICJBNEFFIiwKCQkxMjM2NyA6ICJBNEFGIiwKCQkxMjM2OCA6ICJBNEIwIiwKCQkxMjM2OSA6ICJBNEIxIiwKCQkxMjM3MCA6ICJBNEIyIiwKCQkxMjM3MSA6ICJBNEIzIiwKCQkxMjM3MiA6ICJBNEI0IiwKCQkxMjM3MyA6ICJBNEI1IiwKCQkxMjM3NCA6ICJBNEI2IiwKCQkxMjM3NSA6ICJBNEI3IiwKCQkxMjM3NiA6ICJBNEI4IiwKCQkxMjM3NyA6ICJBNEI5IiwKCQkxMjM3OCA6ICJBNEJBIiwKCQkxMjM3OSA6ICJBNEJCIiwKCQkxMjM4MCA6ICJBNEJDIiwKCQkxMjM4MSA6ICJBNEJEIiwKCQkxMjM4MiA6ICJBNEJFIiwKCQkxMjM4MyA6ICJBNEJGIiwKCQkxMjM4NCA6ICJBNEMwIiwKCQkxMjM4NSA6ICJBNEMxIiwKCQkxMjM4NiA6ICJBNEMyIiwKCQkxMjM4NyA6ICJBNEMzIiwKCQkxMjM4OCA6ICJBNEM0IiwKCQkxMjM4OSA6ICJBNEM1IiwKCQkxMjM5MCA6ICJBNEM2IiwKCQkxMjM5MSA6ICJBNEM3IiwKCQkxMjM5MiA6ICJBNEM4IiwKCQkxMjM5MyA6ICJBNEM5IiwKCQkxMjM5NCA6ICJBNENBIiwKCQkxMjM5NSA6ICJBNENCIiwKCQkxMjM5NiA6ICJBNENDIiwKCQkxMjM5NyA6ICJBNENEIiwKCQkxMjM5OCA6ICJBNENFIiwKCQkxMjM5OSA6ICJBNENGIiwKCQkxMjQwMCA6ICJBNEQwIiwKCQkxMjQwMSA6ICJBNEQxIiwKCQkxMjQwMiA6ICJBNEQyIiwKCQkxMjQwMyA6ICJBNEQzIiwKCQkxMjQwNCA6ICJBNEQ0IiwKCQkxMjQwNSA6ICJBNEQ1IiwKCQkxMjQwNiA6ICJBNEQ2IiwKCQkxMjQwNyA6ICJBNEQ3IiwKCQkxMjQwOCA6ICJBNEQ4IiwKCQkxMjQwOSA6ICJBNEQ5IiwKCQkxMjQxMCA6ICJBNERBIiwKCQkxMjQxMSA6ICJBNERCIiwKCQkxMjQxMiA6ICJBNERDIiwKCQkxMjQxMyA6ICJBNEREIiwKCQkxMjQxNCA6ICJBNERFIiwKCQkxMjQxNSA6ICJBNERGIiwKCQkxMjQxNiA6ICJBNEUwIiwKCQkxMjQxNyA6ICJBNEUxIiwKCQkxMjQxOCA6ICJBNEUyIiwKCQkxMjQxOSA6ICJBNEUzIiwKCQkxMjQyMCA6ICJBNEU0IiwKCQkxMjQyMSA6ICJBNEU1IiwKCQkxMjQyMiA6ICJBNEU2IiwKCQkxMjQyMyA6ICJBNEU3IiwKCQkxMjQyNCA6ICJBNEU4IiwKCQkxMjQyNSA6ICJBNEU5IiwKCQkxMjQyNiA6ICJBNEVBIiwKCQkxMjQyNyA6ICJBNEVCIiwKCQkxMjQyOCA6ICJBNEVDIiwKCQkxMjQyOSA6ICJBNEVEIiwKCQkxMjQzMCA6ICJBNEVFIiwKCQkxMjQzMSA6ICJBNEVGIiwKCQkxMjQzMiA6ICJBNEYwIiwKCQkxMjQzMyA6ICJBNEYxIiwKCQkxMjQzNCA6ICJBNEYyIiwKCQkxMjQzNSA6ICJBNEYzIiwKCQkxMjQ0OSA6ICJBNUExIiwKCQkxMjQ1MCA6ICJBNUEyIiwKCQkxMjQ1MSA6ICJBNUEzIiwKCQkxMjQ1MiA6ICJBNUE0IiwKCQkxMjQ1MyA6ICJBNUE1IiwKCQkxMjQ1NCA6ICJBNUE2IiwKCQkxMjQ1NSA6ICJBNUE3IiwKCQkxMjQ1NiA6ICJBNUE4IiwKCQkxMjQ1NyA6ICJBNUE5IiwKCQkxMjQ1OCA6ICJBNUFBIiwKCQkxMjQ1OSA6ICJBNUFCIiwKCQkxMjQ2MCA6ICJBNUFDIiwKCQkxMjQ2MSA6ICJBNUFEIiwKCQkxMjQ2MiA6ICJBNUFFIiwKCQkxMjQ2MyA6ICJBNUFGIiwKCQkxMjQ2NCA6ICJBNUIwIiwKCQkxMjQ2NSA6ICJBNUIxIiwKCQkxMjQ2NiA6ICJBNUIyIiwKCQkxMjQ2NyA6ICJBNUIzIiwKCQkxMjQ2OCA6ICJBNUI0IiwKCQkxMjQ2OSA6ICJBNUI1IiwKCQkxMjQ3MCA6ICJBNUI2IiwKCQkxMjQ3MSA6ICJBNUI3IiwKCQkxMjQ3MiA6ICJBNUI4IiwKCQkxMjQ3MyA6ICJBNUI5IiwKCQkxMjQ3NCA6ICJBNUJBIiwKCQkxMjQ3NSA6ICJBNUJCIiwKCQkxMjQ3NiA6ICJBNUJDIiwKCQkxMjQ3NyA6ICJBNUJEIiwKCQkxMjQ3OCA6ICJBNUJFIiwKCQkxMjQ3OSA6ICJBNUJGIiwKCQkxMjQ4MCA6ICJBNUMwIiwKCQkxMjQ4MSA6ICJBNUMxIiwKCQkxMjQ4MiA6ICJBNUMyIiwKCQkxMjQ4MyA6ICJBNUMzIiwKCQkxMjQ4NCA6ICJBNUM0IiwKCQkxMjQ4NSA6ICJBNUM1IiwKCQkxMjQ4NiA6ICJBNUM2IiwKCQkxMjQ4NyA6ICJBNUM3IiwKCQkxMjQ4OCA6ICJBNUM4IiwKCQkxMjQ4OSA6ICJBNUM5IiwKCQkxMjQ5MCA6ICJBNUNBIiwKCQkxMjQ5MSA6ICJBNUNCIiwKCQkxMjQ5MiA6ICJBNUNDIiwKCQkxMjQ5MyA6ICJBNUNEIiwKCQkxMjQ5NCA6ICJBNUNFIiwKCQkxMjQ5NSA6ICJBNUNGIiwKCQkxMjQ5NiA6ICJBNUQwIiwKCQkxMjQ5NyA6ICJBNUQxIiwKCQkxMjQ5OCA6ICJBNUQyIiwKCQkxMjQ5OSA6ICJBNUQzIiwKCQkxMjUwMCA6ICJBNUQ0IiwKCQkxMjUwMSA6ICJBNUQ1IiwKCQkxMjUwMiA6ICJBNUQ2IiwKCQkxMjUwMyA6ICJBNUQ3IiwKCQkxMjUwNCA6ICJBNUQ4IiwKCQkxMjUwNSA6ICJBNUQ5IiwKCQkxMjUwNiA6ICJBNURBIiwKCQkxMjUwNyA6ICJBNURCIiwKCQkxMjUwOCA6ICJBNURDIiwKCQkxMjUwOSA6ICJBNUREIiwKCQkxMjUxMCA6ICJBNURFIiwKCQkxMjUxMSA6ICJBNURGIiwKCQkxMjUxMiA6ICJBNUUwIiwKCQkxMjUxMyA6ICJBNUUxIiwKCQkxMjUxNCA6ICJBNUUyIiwKCQkxMjUxNSA6ICJBNUUzIiwKCQkxMjUxNiA6ICJBNUU0IiwKCQkxMjUxNyA6ICJBNUU1IiwKCQkxMjUxOCA6ICJBNUU2IiwKCQkxMjUxOSA6ICJBNUU3IiwKCQkxMjUyMCA6ICJBNUU4IiwKCQkxMjUyMSA6ICJBNUU5IiwKCQkxMjUyMiA6ICJBNUVBIiwKCQkxMjUyMyA6ICJBNUVCIiwKCQkxMjUyNCA6ICJBNUVDIiwKCQkxMjUyNSA6ICJBNUVEIiwKCQkxMjUyNiA6ICJBNUVFIiwKCQkxMjUyNyA6ICJBNUVGIiwKCQkxMjUyOCA6ICJBNUYwIiwKCQkxMjUyOSA6ICJBNUYxIiwKCQkxMjUzMCA6ICJBNUYyIiwKCQkxMjUzMSA6ICJBNUYzIiwKCQkxMjUzMiA6ICJBNUY0IiwKCQkxMjUzMyA6ICJBNUY1IiwKCQkxMjUzNCA6ICJBNUY2IiwKCQk5MTMgOiAiQTZBMSIsCgkJOTE0IDogIkE2QTIiLAoJCTkxNSA6ICJBNkEzIiwKCQk5MTYgOiAiQTZBNCIsCgkJOTE3IDogIkE2QTUiLAoJCTkxOCA6ICJBNkE2IiwKCQk5MTkgOiAiQTZBNyIsCgkJOTIwIDogIkE2QTgiLAoJCTkyMSA6ICJBNkE5IiwKCQk5MjIgOiAiQTZBQSIsCgkJOTIzIDogIkE2QUIiLAoJCTkyNCA6ICJBNkFDIiwKCQk5MjUgOiAiQTZBRCIsCgkJOTI2IDogIkE2QUUiLAoJCTkyNyA6ICJBNkFGIiwKCQk5MjggOiAiQTZCMCIsCgkJOTI5IDogIkE2QjEiLAoJCTkzMSA6ICJBNkIyIiwKCQk5MzIgOiAiQTZCMyIsCgkJOTMzIDogIkE2QjQiLAoJCTkzNCA6ICJBNkI1IiwKCQk5MzUgOiAiQTZCNiIsCgkJOTM2IDogIkE2QjciLAoJCTkzNyA6ICJBNkI4IiwKCQk5NDUgOiAiQTZDMSIsCgkJOTQ2IDogIkE2QzIiLAoJCTk0NyA6ICJBNkMzIiwKCQk5NDggOiAiQTZDNCIsCgkJOTQ5IDogIkE2QzUiLAoJCTk1MCA6ICJBNkM2IiwKCQk5NTEgOiAiQTZDNyIsCgkJOTUyIDogIkE2QzgiLAoJCTk1MyA6ICJBNkM5IiwKCQk5NTQgOiAiQTZDQSIsCgkJOTU1IDogIkE2Q0IiLAoJCTk1NiA6ICJBNkNDIiwKCQk5NTcgOiAiQTZDRCIsCgkJOTU4IDogIkE2Q0UiLAoJCTk1OSA6ICJBNkNGIiwKCQk5NjAgOiAiQTZEMCIsCgkJOTYxIDogIkE2RDEiLAoJCTk2MyA6ICJBNkQyIiwKCQk5NjQgOiAiQTZEMyIsCgkJOTY1IDogIkE2RDQiLAoJCTk2NiA6ICJBNkQ1IiwKCQk5NjcgOiAiQTZENiIsCgkJOTY4IDogIkE2RDciLAoJCTk2OSA6ICJBNkQ4IiwKCQk2NTA3NyA6ICJBNkUwIiwKCQk2NTA3OCA6ICJBNkUxIiwKCQk2NTA4MSA6ICJBNkUyIiwKCQk2NTA4MiA6ICJBNkUzIiwKCQk2NTA4NyA6ICJBNkU0IiwKCQk2NTA4OCA6ICJBNkU1IiwKCQk2NTA4NSA6ICJBNkU2IiwKCQk2NTA4NiA6ICJBNkU3IiwKCQk2NTA4OSA6ICJBNkU4IiwKCQk2NTA5MCA6ICJBNkU5IiwKCQk2NTA5MSA6ICJBNkVBIiwKCQk2NTA5MiA6ICJBNkVCIiwKCQk2NTA4MyA6ICJBNkVFIiwKCQk2NTA4NCA6ICJBNkVGIiwKCQk2NTA3OSA6ICJBNkYwIiwKCQk2NTA4MCA6ICJBNkYxIiwKCQk2NTA3MyA6ICJBNkYyIiwKCQk2NTA3NSA6ICJBNkY0IiwKCQk2NTA3NiA6ICJBNkY1IiwKCQkxMDQwIDogIkE3QTEiLAoJCTEwNDEgOiAiQTdBMiIsCgkJMTA0MiA6ICJBN0EzIiwKCQkxMDQzIDogIkE3QTQiLAoJCTEwNDQgOiAiQTdBNSIsCgkJMTA0NSA6ICJBN0E2IiwKCQkxMDI1IDogIkE3QTciLAoJCTEwNDYgOiAiQTdBOCIsCgkJMTA0NyA6ICJBN0E5IiwKCQkxMDQ4IDogIkE3QUEiLAoJCTEwNDkgOiAiQTdBQiIsCgkJMTA1MCA6ICJBN0FDIiwKCQkxMDUxIDogIkE3QUQiLAoJCTEwNTIgOiAiQTdBRSIsCgkJMTA1MyA6ICJBN0FGIiwKCQkxMDU0IDogIkE3QjAiLAoJCTEwNTUgOiAiQTdCMSIsCgkJMTA1NiA6ICJBN0IyIiwKCQkxMDU3IDogIkE3QjMiLAoJCTEwNTggOiAiQTdCNCIsCgkJMTA1OSA6ICJBN0I1IiwKCQkxMDYwIDogIkE3QjYiLAoJCTEwNjEgOiAiQTdCNyIsCgkJMTA2MiA6ICJBN0I4IiwKCQkxMDYzIDogIkE3QjkiLAoJCTEwNjQgOiAiQTdCQSIsCgkJMTA2NSA6ICJBN0JCIiwKCQkxMDY2IDogIkE3QkMiLAoJCTEwNjcgOiAiQTdCRCIsCgkJMTA2OCA6ICJBN0JFIiwKCQkxMDY5IDogIkE3QkYiLAoJCTEwNzAgOiAiQTdDMCIsCgkJMTA3MSA6ICJBN0MxIiwKCQkxMDcyIDogIkE3RDEiLAoJCTEwNzMgOiAiQTdEMiIsCgkJMTA3NCA6ICJBN0QzIiwKCQkxMDc1IDogIkE3RDQiLAoJCTEwNzYgOiAiQTdENSIsCgkJMTA3NyA6ICJBN0Q2IiwKCQkxMTA1IDogIkE3RDciLAoJCTEwNzggOiAiQTdEOCIsCgkJMTA3OSA6ICJBN0Q5IiwKCQkxMDgwIDogIkE3REEiLAoJCTEwODEgOiAiQTdEQiIsCgkJMTA4MiA6ICJBN0RDIiwKCQkxMDgzIDogIkE3REQiLAoJCTEwODQgOiAiQTdERSIsCgkJMTA4NSA6ICJBN0RGIiwKCQkxMDg2IDogIkE3RTAiLAoJCTEwODcgOiAiQTdFMSIsCgkJMTA4OCA6ICJBN0UyIiwKCQkxMDg5IDogIkE3RTMiLAoJCTEwOTAgOiAiQTdFNCIsCgkJMTA5MSA6ICJBN0U1IiwKCQkxMDkyIDogIkE3RTYiLAoJCTEwOTMgOiAiQTdFNyIsCgkJMTA5NCA6ICJBN0U4IiwKCQkxMDk1IDogIkE3RTkiLAoJCTEwOTYgOiAiQTdFQSIsCgkJMTA5NyA6ICJBN0VCIiwKCQkxMDk4IDogIkE3RUMiLAoJCTEwOTkgOiAiQTdFRCIsCgkJMTEwMCA6ICJBN0VFIiwKCQkxMTAxIDogIkE3RUYiLAoJCTExMDIgOiAiQTdGMCIsCgkJMTEwMyA6ICJBN0YxIiwKCQkyNTcgOiAiQThBMSIsCgkJMjI1IDogIkE4QTIiLAoJCTQ2MiA6ICJBOEEzIiwKCQkyMjQgOiAiQThBNCIsCgkJMjc1IDogIkE4QTUiLAoJCTIzMyA6ICJBOEE2IiwKCQkyODMgOiAiQThBNyIsCgkJMjMyIDogIkE4QTgiLAoJCTI5OSA6ICJBOEE5IiwKCQkyMzcgOiAiQThBQSIsCgkJNDY0IDogIkE4QUIiLAoJCTIzNiA6ICJBOEFDIiwKCQkzMzMgOiAiQThBRCIsCgkJMjQzIDogIkE4QUUiLAoJCTQ2NiA6ICJBOEFGIiwKCQkyNDIgOiAiQThCMCIsCgkJMzYzIDogIkE4QjEiLAoJCTI1MCA6ICJBOEIyIiwKCQk0NjggOiAiQThCMyIsCgkJMjQ5IDogIkE4QjQiLAoJCTQ3MCA6ICJBOEI1IiwKCQk0NzIgOiAiQThCNiIsCgkJNDc0IDogIkE4QjciLAoJCTQ3NiA6ICJBOEI4IiwKCQkyNTIgOiAiQThCOSIsCgkJMjM0IDogIkE4QkEiLAoJCTU5MyA6ICJBOEJCIiwKCQkzMjQgOiAiQThCRCIsCgkJMzI4IDogIkE4QkUiLAoJCTYwOSA6ICJBOEMwIiwKCQkxMjU0OSA6ICJBOEM1IiwKCQkxMjU1MCA6ICJBOEM2IiwKCQkxMjU1MSA6ICJBOEM3IiwKCQkxMjU1MiA6ICJBOEM4IiwKCQkxMjU1MyA6ICJBOEM5IiwKCQkxMjU1NCA6ICJBOENBIiwKCQkxMjU1NSA6ICJBOENCIiwKCQkxMjU1NiA6ICJBOENDIiwKCQkxMjU1NyA6ICJBOENEIiwKCQkxMjU1OCA6ICJBOENFIiwKCQkxMjU1OSA6ICJBOENGIiwKCQkxMjU2MCA6ICJBOEQwIiwKCQkxMjU2MSA6ICJBOEQxIiwKCQkxMjU2MiA6ICJBOEQyIiwKCQkxMjU2MyA6ICJBOEQzIiwKCQkxMjU2NCA6ICJBOEQ0IiwKCQkxMjU2NSA6ICJBOEQ1IiwKCQkxMjU2NiA6ICJBOEQ2IiwKCQkxMjU2NyA6ICJBOEQ3IiwKCQkxMjU2OCA6ICJBOEQ4IiwKCQkxMjU2OSA6ICJBOEQ5IiwKCQkxMjU3MCA6ICJBOERBIiwKCQkxMjU3MSA6ICJBOERCIiwKCQkxMjU3MiA6ICJBOERDIiwKCQkxMjU3MyA6ICJBOEREIiwKCQkxMjU3NCA6ICJBOERFIiwKCQkxMjU3NSA6ICJBOERGIiwKCQkxMjU3NiA6ICJBOEUwIiwKCQkxMjU3NyA6ICJBOEUxIiwKCQkxMjU3OCA6ICJBOEUyIiwKCQkxMjU3OSA6ICJBOEUzIiwKCQkxMjU4MCA6ICJBOEU0IiwKCQkxMjU4MSA6ICJBOEU1IiwKCQkxMjU4MiA6ICJBOEU2IiwKCQkxMjU4MyA6ICJBOEU3IiwKCQkxMjU4NCA6ICJBOEU4IiwKCQkxMjU4NSA6ICJBOEU5IiwKCQk5NDcyIDogIkE5QTQiLAoJCTk0NzMgOiAiQTlBNSIsCgkJOTQ3NCA6ICJBOUE2IiwKCQk5NDc1IDogIkE5QTciLAoJCTk0NzYgOiAiQTlBOCIsCgkJOTQ3NyA6ICJBOUE5IiwKCQk5NDc4IDogIkE5QUEiLAoJCTk0NzkgOiAiQTlBQiIsCgkJOTQ4MCA6ICJBOUFDIiwKCQk5NDgxIDogIkE5QUQiLAoJCTk0ODIgOiAiQTlBRSIsCgkJOTQ4MyA6ICJBOUFGIiwKCQk5NDg0IDogIkE5QjAiLAoJCTk0ODUgOiAiQTlCMSIsCgkJOTQ4NiA6ICJBOUIyIiwKCQk5NDg3IDogIkE5QjMiLAoJCTk0ODggOiAiQTlCNCIsCgkJOTQ4OSA6ICJBOUI1IiwKCQk5NDkwIDogIkE5QjYiLAoJCTk0OTEgOiAiQTlCNyIsCgkJOTQ5MiA6ICJBOUI4IiwKCQk5NDkzIDogIkE5QjkiLAoJCTk0OTQgOiAiQTlCQSIsCgkJOTQ5NSA6ICJBOUJCIiwKCQk5NDk2IDogIkE5QkMiLAoJCTk0OTcgOiAiQTlCRCIsCgkJOTQ5OCA6ICJBOUJFIiwKCQk5NDk5IDogIkE5QkYiLAoJCTk1MDAgOiAiQTlDMCIsCgkJOTUwMSA6ICJBOUMxIiwKCQk5NTAyIDogIkE5QzIiLAoJCTk1MDMgOiAiQTlDMyIsCgkJOTUwNCA6ICJBOUM0IiwKCQk5NTA1IDogIkE5QzUiLAoJCTk1MDYgOiAiQTlDNiIsCgkJOTUwNyA6ICJBOUM3IiwKCQk5NTA4IDogIkE5QzgiLAoJCTk1MDkgOiAiQTlDOSIsCgkJOTUxMCA6ICJBOUNBIiwKCQk5NTExIDogIkE5Q0IiLAoJCTk1MTIgOiAiQTlDQyIsCgkJOTUxMyA6ICJBOUNEIiwKCQk5NTE0IDogIkE5Q0UiLAoJCTk1MTUgOiAiQTlDRiIsCgkJOTUxNiA6ICJBOUQwIiwKCQk5NTE3IDogIkE5RDEiLAoJCTk1MTggOiAiQTlEMiIsCgkJOTUxOSA6ICJBOUQzIiwKCQk5NTIwIDogIkE5RDQiLAoJCTk1MjEgOiAiQTlENSIsCgkJOTUyMiA6ICJBOUQ2IiwKCQk5NTIzIDogIkE5RDciLAoJCTk1MjQgOiAiQTlEOCIsCgkJOTUyNSA6ICJBOUQ5IiwKCQk5NTI2IDogIkE5REEiLAoJCTk1MjcgOiAiQTlEQiIsCgkJOTUyOCA6ICJBOURDIiwKCQk5NTI5IDogIkE5REQiLAoJCTk1MzAgOiAiQTlERSIsCgkJOTUzMSA6ICJBOURGIiwKCQk5NTMyIDogIkE5RTAiLAoJCTk1MzMgOiAiQTlFMSIsCgkJOTUzNCA6ICJBOUUyIiwKCQk5NTM1IDogIkE5RTMiLAoJCTk1MzYgOiAiQTlFNCIsCgkJOTUzNyA6ICJBOUU1IiwKCQk5NTM4IDogIkE5RTYiLAoJCTk1MzkgOiAiQTlFNyIsCgkJOTU0MCA6ICJBOUU4IiwKCQk5NTQxIDogIkE5RTkiLAoJCTk1NDIgOiAiQTlFQSIsCgkJOTU0MyA6ICJBOUVCIiwKCQk5NTQ0IDogIkE5RUMiLAoJCTk1NDUgOiAiQTlFRCIsCgkJOTU0NiA6ICJBOUVFIiwKCQk5NTQ3IDogIkE5RUYiLAoJCTMwNDAzIDogIkIwQTAiLAoJCTIxODM0IDogIkIwQTEiLAoJCTM4NDYzIDogIkIwQTIiLAoJCTIyNDY3IDogIkIwQTMiLAoJCTI1Mzg0IDogIkIwQTQiLAoJCTIxNzEwIDogIkIwQTUiLAoJCTIxNzY5IDogIkIwQTYiLAoJCTIxNjk2IDogIkIwQTciLAoJCTMwMzUzIDogIkIwQTgiLAoJCTMwMjg0IDogIkIwQTkiLAoJCTM0MTA4IDogIkIwQUEiLAoJCTMwNzAyIDogIkIwQUIiLAoJCTMzNDA2IDogIkIwQUMiLAoJCTMwODYxIDogIkIwQUQiLAoJCTI5MjMzIDogIkIwQUUiLAoJCTM4NTUyIDogIkIwQUYiLAoJCTM4Nzk3IDogIkIwQjAiLAoJCTI3Njg4IDogIkIwQjEiLAoJCTIzNDMzIDogIkIwQjIiLAoJCTIwNDc0IDogIkIwQjMiLAoJCTI1MzUzIDogIkIwQjQiLAoJCTI2MjYzIDogIkIwQjUiLAoJCTIzNzM2IDogIkIwQjYiLAoJCTMzMDE4IDogIkIwQjciLAoJCTI2Njk2IDogIkIwQjgiLAoJCTMyOTQyIDogIkIwQjkiLAoJCTI2MTE0IDogIkIwQkEiLAoJCTMwNDE0IDogIkIwQkIiLAoJCTIwOTg1IDogIkIwQkMiLAoJCTI1OTQyIDogIkIwQkQiLAoJCTI5MTAwIDogIkIwQkUiLAoJCTMyNzUzIDogIkIwQkYiLAoJCTM0OTQ4IDogIkIwQzAiLAoJCTIwNjU4IDogIkIwQzEiLAoJCTIyODg1IDogIkIwQzIiLAoJCTI1MDM0IDogIkIwQzMiLAoJCTI4NTk1IDogIkIwQzQiLAoJCTMzNDUzIDogIkIwQzUiLAoJCTI1NDIwIDogIkIwQzYiLAoJCTI1MTcwIDogIkIwQzciLAoJCTIxNDg1IDogIkIwQzgiLAoJCTIxNTQzIDogIkIwQzkiLAoJCTMxNDk0IDogIkIwQ0EiLAoJCTIwODQzIDogIkIwQ0IiLAoJCTMwMTE2IDogIkIwQ0MiLAoJCTI0MDUyIDogIkIwQ0QiLAoJCTI1MzAwIDogIkIwQ0UiLAoJCTM2Mjk5IDogIkIwQ0YiLAoJCTM4Nzc0IDogIkIwRDAiLAoJCTI1MjI2IDogIkIwRDEiLAoJCTMyNzkzIDogIkIwRDIiLAoJCTIyMzY1IDogIkIwRDMiLAoJCTM4NzEyIDogIkIwRDQiLAoJCTMyNjEwIDogIkIwRDUiLAoJCTI5MjQwIDogIkIwRDYiLAoJCTMwMzMzIDogIkIwRDciLAoJCTI2NTc1IDogIkIwRDgiLAoJCTMwMzM0IDogIkIwRDkiLAoJCTI1NjcwIDogIkIwREEiLAoJCTIwMzM2IDogIkIwREIiLAoJCTM2MTMzIDogIkIwREMiLAoJCTI1MzA4IDogIkIwREQiLAoJCTMxMjU1IDogIkIwREUiLAoJCTI2MDAxIDogIkIwREYiLAoJCTI5Njc3IDogIkIwRTAiLAoJCTI1NjQ0IDogIkIwRTEiLAoJCTI1MjAzIDogIkIwRTIiLAoJCTMzMzI0IDogIkIwRTMiLAoJCTM5MDQxIDogIkIwRTQiLAoJCTI2NDk1IDogIkIwRTUiLAoJCTI5MjU2IDogIkIwRTYiLAoJCTI1MTk4IDogIkIwRTciLAoJCTI1MjkyIDogIkIwRTgiLAoJCTIwMjc2IDogIkIwRTkiLAoJCTI5OTIzIDogIkIwRUEiLAoJCTIxMzIyIDogIkIwRUIiLAoJCTIxMTUwIDogIkIwRUMiLAoJCTMyNDU4IDogIkIwRUQiLAoJCTM3MDMwIDogIkIwRUUiLAoJCTI0MTEwIDogIkIwRUYiLAoJCTI2NzU4IDogIkIwRjAiLAoJCTI3MDM2IDogIkIwRjEiLAoJCTMzMTUyIDogIkIwRjIiLAoJCTMyNDY1IDogIkIwRjMiLAoJCTI2ODM0IDogIkIwRjQiLAoJCTMwOTE3IDogIkIwRjUiLAoJCTM0NDQ0IDogIkIwRjYiLAoJCTM4MjI1IDogIkIwRjciLAoJCTIwNjIxIDogIkIwRjgiLAoJCTM1ODc2IDogIkIwRjkiLAoJCTMzNTAyIDogIkIwRkEiLAoJCTMyOTkwIDogIkIwRkIiLAoJCTIxMjUzIDogIkIwRkMiLAoJCTM1MDkwIDogIkIwRkQiLAoJCTIxMDkzIDogIkIwRkUiLAoJCTM0MTgwIDogIkIxQTEiLAoJCTM4NjQ5IDogIkIxQTIiLAoJCTIwNDQ1IDogIkIxQTMiLAoJCTIyNTYxIDogIkIxQTQiLAoJCTM5MjgxIDogIkIxQTUiLAoJCTIzNDUzIDogIkIxQTYiLAoJCTI1MjY1IDogIkIxQTciLAoJCTI1MjUzIDogIkIxQTgiLAoJCTI2MjkyIDogIkIxQTkiLAoJCTM1OTYxIDogIkIxQUEiLAoJCTQwMDc3IDogIkIxQUIiLAoJCTI5MTkwIDogIkIxQUMiLAoJCTI2NDc5IDogIkIxQUQiLAoJCTMwODY1IDogIkIxQUUiLAoJCTI0NzU0IDogIkIxQUYiLAoJCTIxMzI5IDogIkIxQjAiLAoJCTIxMjcxIDogIkIxQjEiLAoJCTM2NzQ0IDogIkIxQjIiLAoJCTMyOTcyIDogIkIxQjMiLAoJCTM2MTI1IDogIkIxQjQiLAoJCTM4MDQ5IDogIkIxQjUiLAoJCTIwNDkzIDogIkIxQjYiLAoJCTI5Mzg0IDogIkIxQjciLAoJCTIyNzkxIDogIkIxQjgiLAoJCTI0ODExIDogIkIxQjkiLAoJCTI4OTUzIDogIkIxQkEiLAoJCTM0OTg3IDogIkIxQkIiLAoJCTIyODY4IDogIkIxQkMiLAoJCTMzNTE5IDogIkIxQkQiLAoJCTI2NDEyIDogIkIxQkUiLAoJCTMxNTI4IDogIkIxQkYiLAoJCTIzODQ5IDogIkIxQzAiLAoJCTMyNTAzIDogIkIxQzEiLAoJCTI5OTk3IDogIkIxQzIiLAoJCTI3ODkzIDogIkIxQzMiLAoJCTM2NDU0IDogIkIxQzQiLAoJCTM2ODU2IDogIkIxQzUiLAoJCTM2OTI0IDogIkIxQzYiLAoJCTQwNzYzIDogIkIxQzciLAoJCTI3NjA0IDogIkIxQzgiLAoJCTM3MTQ1IDogIkIxQzkiLAoJCTMxNTA4IDogIkIxQ0EiLAoJCTI0NDQ0IDogIkIxQ0IiLAoJCTMwODg3IDogIkIxQ0MiLAoJCTM0MDA2IDogIkIxQ0QiLAoJCTM0MTA5IDogIkIxQ0UiLAoJCTI3NjA1IDogIkIxQ0YiLAoJCTI3NjA5IDogIkIxRDAiLAoJCTI3NjA2IDogIkIxRDEiLAoJCTI0MDY1IDogIkIxRDIiLAoJCTI0MTk5IDogIkIxRDMiLAoJCTMwMjAxIDogIkIxRDQiLAoJCTM4MzgxIDogIkIxRDUiLAoJCTI1OTQ5IDogIkIxRDYiLAoJCTI0MzMwIDogIkIxRDciLAoJCTI0NTE3IDogIkIxRDgiLAoJCTM2NzY3IDogIkIxRDkiLAoJCTIyNzIxIDogIkIxREEiLAoJCTMzMjE4IDogIkIxREIiLAoJCTM2OTkxIDogIkIxREMiLAoJCTM4NDkxIDogIkIxREQiLAoJCTM4ODI5IDogIkIxREUiLAoJCTM2NzkzIDogIkIxREYiLAoJCTMyNTM0IDogIkIxRTAiLAoJCTM2MTQwIDogIkIxRTEiLAoJCTI1MTUzIDogIkIxRTIiLAoJCTIwNDE1IDogIkIxRTMiLAoJCTIxNDY0IDogIkIxRTQiLAoJCTIxMzQyIDogIkIxRTUiLAoJCTM2Nzc2IDogIkIxRTYiLAoJCTM2Nzc3IDogIkIxRTciLAoJCTM2Nzc5IDogIkIxRTgiLAoJCTM2OTQxIDogIkIxRTkiLAoJCTI2NjMxIDogIkIxRUEiLAoJCTI0NDI2IDogIkIxRUIiLAoJCTMzMTc2IDogIkIxRUMiLAoJCTM0OTIwIDogIkIxRUQiLAoJCTQwMTUwIDogIkIxRUUiLAoJCTI0OTcxIDogIkIxRUYiLAoJCTIxMDM1IDogIkIxRjAiLAoJCTMwMjUwIDogIkIxRjEiLAoJCTI0NDI4IDogIkIxRjIiLAoJCTI1OTk2IDogIkIxRjMiLAoJCTI4NjI2IDogIkIxRjQiLAoJCTI4MzkyIDogIkIxRjUiLAoJCTIzNDg2IDogIkIxRjYiLAoJCTI1NjcyIDogIkIxRjciLAoJCTIwODUzIDogIkIxRjgiLAoJCTIwOTEyIDogIkIxRjkiLAoJCTI2NTY0IDogIkIxRkEiLAoJCTE5OTkzIDogIkIxRkIiLAoJCTMxMTc3IDogIkIxRkMiLAoJCTM5MjkyIDogIkIxRkQiLAoJCTI4ODUxIDogIkIxRkUiLAoJCTMwMTQ5IDogIkIyQTEiLAoJCTI0MTgyIDogIkIyQTIiLAoJCTI5NjI3IDogIkIyQTMiLAoJCTMzNzYwIDogIkIyQTQiLAoJCTI1NzczIDogIkIyQTUiLAoJCTI1MzIwIDogIkIyQTYiLAoJCTM4MDY5IDogIkIyQTciLAoJCTI3ODc0IDogIkIyQTgiLAoJCTIxMzM4IDogIkIyQTkiLAoJCTIxMTg3IDogIkIyQUEiLAoJCTI1NjE1IDogIkIyQUIiLAoJCTM4MDgyIDogIkIyQUMiLAoJCTMxNjM2IDogIkIyQUQiLAoJCTIwMjcxIDogIkIyQUUiLAoJCTI0MDkxIDogIkIyQUYiLAoJCTMzMzM0IDogIkIyQjAiLAoJCTMzMDQ2IDogIkIyQjEiLAoJCTMzMTYyIDogIkIyQjIiLAoJCTI4MTk2IDogIkIyQjMiLAoJCTI3ODUwIDogIkIyQjQiLAoJCTM5NTM5IDogIkIyQjUiLAoJCTI1NDI5IDogIkIyQjYiLAoJCTIxMzQwIDogIkIyQjciLAoJCTIxNzU0IDogIkIyQjgiLAoJCTM0OTE3IDogIkIyQjkiLAoJCTIyNDk2IDogIkIyQkEiLAoJCTE5OTgxIDogIkIyQkIiLAoJCTI0MDY3IDogIkIyQkMiLAoJCTI3NDkzIDogIkIyQkQiLAoJCTMxODA3IDogIkIyQkUiLAoJCTM3MDk2IDogIkIyQkYiLAoJCTI0NTk4IDogIkIyQzAiLAoJCTI1ODMwIDogIkIyQzEiLAoJCTI5NDY4IDogIkIyQzIiLAoJCTM1MDA5IDogIkIyQzMiLAoJCTI2NDQ4IDogIkIyQzQiLAoJCTI1MTY1IDogIkIyQzUiLAoJCTM2MTMwIDogIkIyQzYiLAoJCTMwNTcyIDogIkIyQzciLAoJCTM2MzkzIDogIkIyQzgiLAoJCTM3MzE5IDogIkIyQzkiLAoJCTI0NDI1IDogIkIyQ0EiLAoJCTMzNzU2IDogIkIyQ0IiLAoJCTM0MDgxIDogIkIyQ0MiLAoJCTM5MTg0IDogIkIyQ0QiLAoJCTIxNDQyIDogIkIyQ0UiLAoJCTM0NDUzIDogIkIyQ0YiLAoJCTI3NTMxIDogIkIyRDAiLAoJCTI0ODEzIDogIkIyRDEiLAoJCTI0ODA4IDogIkIyRDIiLAoJCTI4Nzk5IDogIkIyRDMiLAoJCTMzNDg1IDogIkIyRDQiLAoJCTMzMzI5IDogIkIyRDUiLAoJCTIwMTc5IDogIkIyRDYiLAoJCTI3ODE1IDogIkIyRDciLAoJCTM0MjU1IDogIkIyRDgiLAoJCTI1ODA1IDogIkIyRDkiLAoJCTMxOTYxIDogIkIyREEiLAoJCTI3MTMzIDogIkIyREIiLAoJCTI2MzYxIDogIkIyREMiLAoJCTMzNjA5IDogIkIyREQiLAoJCTIxMzk3IDogIkIyREUiLAoJCTMxNTc0IDogIkIyREYiLAoJCTIwMzkxIDogIkIyRTAiLAoJCTIwODc2IDogIkIyRTEiLAoJCTI3OTc5IDogIkIyRTIiLAoJCTIzNjE4IDogIkIyRTMiLAoJCTM2NDYxIDogIkIyRTQiLAoJCTI1NTU0IDogIkIyRTUiLAoJCTIxNDQ5IDogIkIyRTYiLAoJCTMzNTgwIDogIkIyRTciLAoJCTMzNTkwIDogIkIyRTgiLAoJCTI2NTk3IDogIkIyRTkiLAoJCTMwOTAwIDogIkIyRUEiLAoJCTI1NjYxIDogIkIyRUIiLAoJCTIzNTE5IDogIkIyRUMiLAoJCTIzNzAwIDogIkIyRUQiLAoJCTI0MDQ2IDogIkIyRUUiLAoJCTM1ODE1IDogIkIyRUYiLAoJCTI1Mjg2IDogIkIyRjAiLAoJCTI2NjEyIDogIkIyRjEiLAoJCTM1OTYyIDogIkIyRjIiLAoJCTI1NjAwIDogIkIyRjMiLAoJCTI1NTMwIDogIkIyRjQiLAoJCTM0NjMzIDogIkIyRjUiLAoJCTM5MzA3IDogIkIyRjYiLAoJCTM1ODYzIDogIkIyRjciLAoJCTMyNTQ0IDogIkIyRjgiLAoJCTM4MTMwIDogIkIyRjkiLAoJCTIwMTM1IDogIkIyRkEiLAoJCTM4NDE2IDogIkIyRkIiLAoJCTM5MDc2IDogIkIyRkMiLAoJCTI2MTI0IDogIkIyRkQiLAoJCTI5NDYyIDogIkIyRkUiLAoJCTIyMzMwIDogIkIzQTEiLAoJCTIzNTgxIDogIkIzQTIiLAoJCTI0MTIwIDogIkIzQTMiLAoJCTM4MjcxIDogIkIzQTQiLAoJCTIwNjA3IDogIkIzQTUiLAoJCTMyOTI4IDogIkIzQTYiLAoJCTIxMzc4IDogIkIzQTciLAoJCTI1OTUwIDogIkIzQTgiLAoJCTMwMDIxIDogIkIzQTkiLAoJCTIxODA5IDogIkIzQUEiLAoJCTIwNTEzIDogIkIzQUIiLAoJCTM2MjI5IDogIkIzQUMiLAoJCTI1MjIwIDogIkIzQUQiLAoJCTM4MDQ2IDogIkIzQUUiLAoJCTI2Mzk3IDogIkIzQUYiLAoJCTIyMDY2IDogIkIzQjAiLAoJCTI4NTI2IDogIkIzQjEiLAoJCTI0MDM0IDogIkIzQjIiLAoJCTIxNTU3IDogIkIzQjMiLAoJCTI4ODE4IDogIkIzQjQiLAoJCTM2NzEwIDogIkIzQjUiLAoJCTI1MTk5IDogIkIzQjYiLAoJCTI1NzY0IDogIkIzQjciLAoJCTI1NTA3IDogIkIzQjgiLAoJCTI0NDQzIDogIkIzQjkiLAoJCTI4NTUyIDogIkIzQkEiLAoJCTM3MTA4IDogIkIzQkIiLAoJCTMzMjUxIDogIkIzQkMiLAoJCTM2Nzg0IDogIkIzQkQiLAoJCTIzNTc2IDogIkIzQkUiLAoJCTI2MjE2IDogIkIzQkYiLAoJCTI0NTYxIDogIkIzQzAiLAoJCTI3Nzg1IDogIkIzQzEiLAoJCTM4NDcyIDogIkIzQzIiLAoJCTM2MjI1IDogIkIzQzMiLAoJCTM0OTI0IDogIkIzQzQiLAoJCTI1NzQ1IDogIkIzQzUiLAoJCTMxMjE2IDogIkIzQzYiLAoJCTIyNDc4IDogIkIzQzciLAoJCTI3MjI1IDogIkIzQzgiLAoJCTI1MTA0IDogIkIzQzkiLAoJCTIxNTc2IDogIkIzQ0EiLAoJCTIwMDU2IDogIkIzQ0IiLAoJCTMxMjQzIDogIkIzQ0MiLAoJCTI0ODA5IDogIkIzQ0QiLAoJCTI4NTQ4IDogIkIzQ0UiLAoJCTM1ODAyIDogIkIzQ0YiLAoJCTI1MjE1IDogIkIzRDAiLAoJCTM2ODk0IDogIkIzRDEiLAoJCTM5NTYzIDogIkIzRDIiLAoJCTMxMjA0IDogIkIzRDMiLAoJCTIxNTA3IDogIkIzRDQiLAoJCTMwMTk2IDogIkIzRDUiLAoJCTI1MzQ1IDogIkIzRDYiLAoJCTIxMjczIDogIkIzRDciLAoJCTI3NzQ0IDogIkIzRDgiLAoJCTM2ODMxIDogIkIzRDkiLAoJCTI0MzQ3IDogIkIzREEiLAoJCTM5NTM2IDogIkIzREIiLAoJCTMyODI3IDogIkIzREMiLAoJCTQwODMxIDogIkIzREQiLAoJCTIwMzYwIDogIkIzREUiLAoJCTIzNjEwIDogIkIzREYiLAoJCTM2MTk2IDogIkIzRTAiLAoJCTMyNzA5IDogIkIzRTEiLAoJCTI2MDIxIDogIkIzRTIiLAoJCTI4ODYxIDogIkIzRTMiLAoJCTIwODA1IDogIkIzRTQiLAoJCTIwOTE0IDogIkIzRTUiLAoJCTM0NDExIDogIkIzRTYiLAoJCTIzODE1IDogIkIzRTciLAoJCTIzNDU2IDogIkIzRTgiLAoJCTI1Mjc3IDogIkIzRTkiLAoJCTM3MjI4IDogIkIzRUEiLAoJCTMwMDY4IDogIkIzRUIiLAoJCTM2MzY0IDogIkIzRUMiLAoJCTMxMjY0IDogIkIzRUQiLAoJCTI0ODMzIDogIkIzRUUiLAoJCTMxNjA5IDogIkIzRUYiLAoJCTIwMTY3IDogIkIzRjAiLAoJCTMyNTA0IDogIkIzRjEiLAoJCTMwNTk3IDogIkIzRjIiLAoJCTE5OTg1IDogIkIzRjMiLAoJCTMzMjYxIDogIkIzRjQiLAoJCTIxMDIxIDogIkIzRjUiLAoJCTIwOTg2IDogIkIzRjYiLAoJCTI3MjQ5IDogIkIzRjciLAoJCTIxNDE2IDogIkIzRjgiLAoJCTM2NDg3IDogIkIzRjkiLAoJCTM4MTQ4IDogIkIzRkEiLAoJCTM4NjA3IDogIkIzRkIiLAoJCTI4MzUzIDogIkIzRkMiLAoJCTM4NTAwIDogIkIzRkQiLAoJCTI2OTcwIDogIkIzRkUiLAoJCTMwNzg0IDogIkI0QTEiLAoJCTIwNjQ4IDogIkI0QTIiLAoJCTMwNjc5IDogIkI0QTMiLAoJCTI1NjE2IDogIkI0QTQiLAoJCTM1MzAyIDogIkI0QTUiLAoJCTIyNzg4IDogIkI0QTYiLAoJCTI1NTcxIDogIkI0QTciLAoJCTI0MDI5IDogIkI0QTgiLAoJCTMxMzU5IDogIkI0QTkiLAoJCTI2OTQxIDogIkI0QUEiLAoJCTIwMjU2IDogIkI0QUIiLAoJCTMzMzM3IDogIkI0QUMiLAoJCTIxOTEyIDogIkI0QUQiLAoJCTIwMDE4IDogIkI0QUUiLAoJCTMwMTI2IDogIkI0QUYiLAoJCTMxMzgzIDogIkI0QjAiLAoJCTI0MTYyIDogIkI0QjEiLAoJCTI0MjAyIDogIkI0QjIiLAoJCTM4MzgzIDogIkI0QjMiLAoJCTIxMDE5IDogIkI0QjQiLAoJCTIxNTYxIDogIkI0QjUiLAoJCTI4ODEwIDogIkI0QjYiLAoJCTI1NDYyIDogIkI0QjciLAoJCTM4MTgwIDogIkI0QjgiLAoJCTIyNDAyIDogIkI0QjkiLAoJCTI2MTQ5IDogIkI0QkEiLAoJCTI2OTQzIDogIkI0QkIiLAoJCTM3MjU1IDogIkI0QkMiLAoJCTIxNzY3IDogIkI0QkQiLAoJCTI4MTQ3IDogIkI0QkUiLAoJCTMyNDMxIDogIkI0QkYiLAoJCTM0ODUwIDogIkI0QzAiLAoJCTI1MTM5IDogIkI0QzEiLAoJCTMyNDk2IDogIkI0QzIiLAoJCTMwMTMzIDogIkI0QzMiLAoJCTMzNTc2IDogIkI0QzQiLAoJCTMwOTEzIDogIkI0QzUiLAoJCTM4NjA0IDogIkI0QzYiLAoJCTM2NzY2IDogIkI0QzciLAoJCTI0OTA0IDogIkI0QzgiLAoJCTI5OTQzIDogIkI0QzkiLAoJCTM1Nzg5IDogIkI0Q0EiLAoJCTI3NDkyIDogIkI0Q0IiLAoJCTIxMDUwIDogIkI0Q0MiLAoJCTM2MTc2IDogIkI0Q0QiLAoJCTI3NDI1IDogIkI0Q0UiLAoJCTMyODc0IDogIkI0Q0YiLAoJCTMzOTA1IDogIkI0RDAiLAoJCTIyMjU3IDogIkI0RDEiLAoJCTIxMjU0IDogIkI0RDIiLAoJCTIwMTc0IDogIkI0RDMiLAoJCTE5OTk1IDogIkI0RDQiLAoJCTIwOTQ1IDogIkI0RDUiLAoJCTMxODk1IDogIkI0RDYiLAoJCTM3MjU5IDogIkI0RDciLAoJCTMxNzUxIDogIkI0RDgiLAoJCTIwNDE5IDogIkI0RDkiLAoJCTM2NDc5IDogIkI0REEiLAoJCTMxNzEzIDogIkI0REIiLAoJCTMxMzg4IDogIkI0REMiLAoJCTI1NzAzIDogIkI0REQiLAoJCTIzODI4IDogIkI0REUiLAoJCTIwNjUyIDogIkI0REYiLAoJCTMzMDMwIDogIkI0RTAiLAoJCTMwMjA5IDogIkI0RTEiLAoJCTMxOTI5IDogIkI0RTIiLAoJCTI4MTQwIDogIkI0RTMiLAoJCTMyNzM2IDogIkI0RTQiLAoJCTI2NDQ5IDogIkI0RTUiLAoJCTIzMzg0IDogIkI0RTYiLAoJCTIzNTQ0IDogIkI0RTciLAoJCTMwOTIzIDogIkI0RTgiLAoJCTI1Nzc0IDogIkI0RTkiLAoJCTI1NjE5IDogIkI0RUEiLAoJCTI1NTE0IDogIkI0RUIiLAoJCTI1Mzg3IDogIkI0RUMiLAoJCTM4MTY5IDogIkI0RUQiLAoJCTI1NjQ1IDogIkI0RUUiLAoJCTM2Nzk4IDogIkI0RUYiLAoJCTMxNTcyIDogIkI0RjAiLAoJCTMwMjQ5IDogIkI0RjEiLAoJCTI1MTcxIDogIkI0RjIiLAoJCTIyODIzIDogIkI0RjMiLAoJCTIxNTc0IDogIkI0RjQiLAoJCTI3NTEzIDogIkI0RjUiLAoJCTIwNjQzIDogIkI0RjYiLAoJCTI1MTQwIDogIkI0RjciLAoJCTI0MTAyIDogIkI0RjgiLAoJCTI3NTI2IDogIkI0RjkiLAoJCTIwMTk1IDogIkI0RkEiLAoJCTM2MTUxIDogIkI0RkIiLAoJCTM0OTU1IDogIkI0RkMiLAoJCTI0NDUzIDogIkI0RkQiLAoJCTM2OTEwIDogIkI0RkUiLAoJCTI0NjA4IDogIkI1QTEiLAoJCTMyODI5IDogIkI1QTIiLAoJCTI1Mjg1IDogIkI1QTMiLAoJCTIwMDI1IDogIkI1QTQiLAoJCTIxMzMzIDogIkI1QTUiLAoJCTM3MTEyIDogIkI1QTYiLAoJCTI1NTI4IDogIkI1QTciLAoJCTMyOTY2IDogIkI1QTgiLAoJCTI2MDg2IDogIkI1QTkiLAoJCTI3Njk0IDogIkI1QUEiLAoJCTIwMjk0IDogIkI1QUIiLAoJCTI0ODE0IDogIkI1QUMiLAoJCTI4MTI5IDogIkI1QUQiLAoJCTM1ODA2IDogIkI1QUUiLAoJCTI0Mzc3IDogIkI1QUYiLAoJCTM0NTA3IDogIkI1QjAiLAoJCTI0NDAzIDogIkI1QjEiLAoJCTI1Mzc3IDogIkI1QjIiLAoJCTIwODI2IDogIkI1QjMiLAoJCTMzNjMzIDogIkI1QjQiLAoJCTI2NzIzIDogIkI1QjUiLAoJCTIwOTkyIDogIkI1QjYiLAoJCTI1NDQzIDogIkI1QjciLAoJCTM2NDI0IDogIkI1QjgiLAoJCTIwNDk4IDogIkI1QjkiLAoJCTIzNzA3IDogIkI1QkEiLAoJCTMxMDk1IDogIkI1QkIiLAoJCTIzNTQ4IDogIkI1QkMiLAoJCTIxMDQwIDogIkI1QkQiLAoJCTMxMjkxIDogIkI1QkUiLAoJCTI0NzY0IDogIkI1QkYiLAoJCTM2OTQ3IDogIkI1QzAiLAoJCTMwNDIzIDogIkI1QzEiLAoJCTI0NTAzIDogIkI1QzIiLAoJCTI0NDcxIDogIkI1QzMiLAoJCTMwMzQwIDogIkI1QzQiLAoJCTM2NDYwIDogIkI1QzUiLAoJCTI4NzgzIDogIkI1QzYiLAoJCTMwMzMxIDogIkI1QzciLAoJCTMxNTYxIDogIkI1QzgiLAoJCTMwNjM0IDogIkI1QzkiLAoJCTIwOTc5IDogIkI1Q0EiLAoJCTM3MDExIDogIkI1Q0IiLAoJCTIyNTY0IDogIkI1Q0MiLAoJCTIwMzAyIDogIkI1Q0QiLAoJCTI4NDA0IDogIkI1Q0UiLAoJCTM2ODQyIDogIkI1Q0YiLAoJCTI1OTMyIDogIkI1RDAiLAoJCTMxNTE1IDogIkI1RDEiLAoJCTI5MzgwIDogIkI1RDIiLAoJCTI4MDY4IDogIkI1RDMiLAoJCTMyNzM1IDogIkI1RDQiLAoJCTIzMjY1IDogIkI1RDUiLAoJCTI1MjY5IDogIkI1RDYiLAoJCTI0MjEzIDogIkI1RDciLAoJCTIyMzIwIDogIkI1RDgiLAoJCTMzOTIyIDogIkI1RDkiLAoJCTMxNTMyIDogIkI1REEiLAoJCTI0MDkzIDogIkI1REIiLAoJCTI0MzUxIDogIkI1REMiLAoJCTM2ODgyIDogIkI1REQiLAoJCTMyNTMyIDogIkI1REUiLAoJCTM5MDcyIDogIkI1REYiLAoJCTI1NDc0IDogIkI1RTAiLAoJCTI4MzU5IDogIkI1RTEiLAoJCTMwODcyIDogIkI1RTIiLAoJCTI4ODU3IDogIkI1RTMiLAoJCTIwODU2IDogIkI1RTQiLAoJCTM4NzQ3IDogIkI1RTUiLAoJCTIyNDQzIDogIkI1RTYiLAoJCTMwMDA1IDogIkI1RTciLAoJCTIwMjkxIDogIkI1RTgiLAoJCTMwMDA4IDogIkI1RTkiLAoJCTI0MjE1IDogIkI1RUEiLAoJCTI0ODA2IDogIkI1RUIiLAoJCTIyODgwIDogIkI1RUMiLAoJCTI4MDk2IDogIkI1RUQiLAoJCTI3NTgzIDogIkI1RUUiLAoJCTMwODU3IDogIkI1RUYiLAoJCTIxNTAwIDogIkI1RjAiLAoJCTM4NjEzIDogIkI1RjEiLAoJCTIwOTM5IDogIkI1RjIiLAoJCTIwOTkzIDogIkI1RjMiLAoJCTI1NDgxIDogIkI1RjQiLAoJCTIxNTE0IDogIkI1RjUiLAoJCTM4MDM1IDogIkI1RjYiLAoJCTM1ODQzIDogIkI1RjciLAoJCTM2MzAwIDogIkI1RjgiLAoJCTI5MjQxIDogIkI1RjkiLAoJCTMwODc5IDogIkI1RkEiLAoJCTM0Njc4IDogIkI1RkIiLAoJCTM2ODQ1IDogIkI1RkMiLAoJCTM1ODUzIDogIkI1RkQiLAoJCTIxNDcyIDogIkI1RkUiLAoJCTE5OTY5IDogIkI2QTEiLAoJCTMwNDQ3IDogIkI2QTIiLAoJCTIxNDg2IDogIkI2QTMiLAoJCTM4MDI1IDogIkI2QTQiLAoJCTM5MDMwIDogIkI2QTUiLAoJCTQwNzE4IDogIkI2QTYiLAoJCTM4MTg5IDogIkI2QTciLAoJCTIzNDUwIDogIkI2QTgiLAoJCTM1NzQ2IDogIkI2QTkiLAoJCTIwMDAyIDogIkI2QUEiLAoJCTE5OTk2IDogIkI2QUIiLAoJCTIwOTA4IDogIkI2QUMiLAoJCTMzODkxIDogIkI2QUQiLAoJCTI1MDI2IDogIkI2QUUiLAoJCTIxMTYwIDogIkI2QUYiLAoJCTI2NjM1IDogIkI2QjAiLAoJCTIwMzc1IDogIkI2QjEiLAoJCTI0NjgzIDogIkI2QjIiLAoJCTIwOTIzIDogIkI2QjMiLAoJCTI3OTM0IDogIkI2QjQiLAoJCTIwODI4IDogIkI2QjUiLAoJCTI1MjM4IDogIkI2QjYiLAoJCTI2MDA3IDogIkI2QjciLAoJCTM4NDk3IDogIkI2QjgiLAoJCTM1OTEwIDogIkI2QjkiLAoJCTM2ODg3IDogIkI2QkEiLAoJCTMwMTY4IDogIkI2QkIiLAoJCTM3MTE3IDogIkI2QkMiLAoJCTMwNTYzIDogIkI2QkQiLAoJCTI3NjAyIDogIkI2QkUiLAoJCTI5MzIyIDogIkI2QkYiLAoJCTI5NDIwIDogIkI2QzAiLAoJCTM1ODM1IDogIkI2QzEiLAoJCTIyNTgxIDogIkI2QzIiLAoJCTMwNTg1IDogIkI2QzMiLAoJCTM2MTcyIDogIkI2QzQiLAoJCTI2NDYwIDogIkI2QzUiLAoJCTM4MjA4IDogIkI2QzYiLAoJCTMyOTIyIDogIkI2QzciLAoJCTI0MjMwIDogIkI2QzgiLAoJCTI4MTkzIDogIkI2QzkiLAoJCTIyOTMwIDogIkI2Q0EiLAoJCTMxNDcxIDogIkI2Q0IiLAoJCTMwNzAxIDogIkI2Q0MiLAoJCTM4MjAzIDogIkI2Q0QiLAoJCTI3NTczIDogIkI2Q0UiLAoJCTI2MDI5IDogIkI2Q0YiLAoJCTMyNTI2IDogIkI2RDAiLAoJCTIyNTM0IDogIkI2RDEiLAoJCTIwODE3IDogIkI2RDIiLAoJCTM4NDMxIDogIkI2RDMiLAoJCTIzNTQ1IDogIkI2RDQiLAoJCTIyNjk3IDogIkI2RDUiLAoJCTIxNTQ0IDogIkI2RDYiLAoJCTM2NDY2IDogIkI2RDciLAoJCTI1OTU4IDogIkI2RDgiLAoJCTM5MDM5IDogIkI2RDkiLAoJCTIyMjQ0IDogIkI2REEiLAoJCTM4MDQ1IDogIkI2REIiLAoJCTMwNDYyIDogIkI2REMiLAoJCTM2OTI5IDogIkI2REQiLAoJCTI1NDc5IDogIkI2REUiLAoJCTIxNzAyIDogIkI2REYiLAoJCTIyODEwIDogIkI2RTAiLAoJCTIyODQyIDogIkI2RTEiLAoJCTIyNDI3IDogIkI2RTIiLAoJCTM2NTMwIDogIkI2RTMiLAoJCTI2NDIxIDogIkI2RTQiLAoJCTM2MzQ2IDogIkI2RTUiLAoJCTMzMzMzIDogIkI2RTYiLAoJCTIxMDU3IDogIkI2RTciLAoJCTI0ODE2IDogIkI2RTgiLAoJCTIyNTQ5IDogIkI2RTkiLAoJCTM0NTU4IDogIkI2RUEiLAoJCTIzNzg0IDogIkI2RUIiLAoJCTQwNTE3IDogIkI2RUMiLAoJCTIwNDIwIDogIkI2RUQiLAoJCTM5MDY5IDogIkI2RUUiLAoJCTM1NzY5IDogIkI2RUYiLAoJCTIzMDc3IDogIkI2RjAiLAoJCTI0Njk0IDogIkI2RjEiLAoJCTIxMzgwIDogIkI2RjIiLAoJCTI1MjEyIDogIkI2RjMiLAoJCTM2OTQzIDogIkI2RjQiLAoJCTM3MTIyIDogIkI2RjUiLAoJCTM5Mjk1IDogIkI2RjYiLAoJCTI0NjgxIDogIkI2RjciLAoJCTMyNzgwIDogIkI2RjgiLAoJCTIwNzk5IDogIkI2RjkiLAoJCTMyODE5IDogIkI2RkEiLAoJCTIzNTcyIDogIkI2RkIiLAoJCTM5Mjg1IDogIkI2RkMiLAoJCTI3OTUzIDogIkI2RkQiLAoJCTIwMTA4IDogIkI2RkUiLAoJCTM2MTQ0IDogIkI3QTEiLAoJCTIxNDU3IDogIkI3QTIiLAoJCTMyNjAyIDogIkI3QTMiLAoJCTMxNTY3IDogIkI3QTQiLAoJCTIwMjQwIDogIkI3QTUiLAoJCTIwMDQ3IDogIkI3QTYiLAoJCTM4NDAwIDogIkI3QTciLAoJCTI3ODYxIDogIkI3QTgiLAoJCTI5NjQ4IDogIkI3QTkiLAoJCTM0MjgxIDogIkI3QUEiLAoJCTI0MDcwIDogIkI3QUIiLAoJCTMwMDU4IDogIkI3QUMiLAoJCTMyNzYzIDogIkI3QUQiLAoJCTI3MTQ2IDogIkI3QUUiLAoJCTMwNzE4IDogIkI3QUYiLAoJCTM4MDM0IDogIkI3QjAiLAoJCTMyMzIxIDogIkI3QjEiLAoJCTIwOTYxIDogIkI3QjIiLAoJCTI4OTAyIDogIkI3QjMiLAoJCTIxNDUzIDogIkI3QjQiLAoJCTM2ODIwIDogIkI3QjUiLAoJCTMzNTM5IDogIkI3QjYiLAoJCTM2MTM3IDogIkI3QjciLAoJCTI5MzU5IDogIkI3QjgiLAoJCTM5Mjc3IDogIkI3QjkiLAoJCTI3ODY3IDogIkI3QkEiLAoJCTIyMzQ2IDogIkI3QkIiLAoJCTMzNDU5IDogIkI3QkMiLAoJCTI2MDQxIDogIkI3QkQiLAoJCTMyOTM4IDogIkI3QkUiLAoJCTI1MTUxIDogIkI3QkYiLAoJCTM4NDUwIDogIkI3QzAiLAoJCTIyOTUyIDogIkI3QzEiLAoJCTIwMjIzIDogIkI3QzIiLAoJCTM1Nzc1IDogIkI3QzMiLAoJCTMyNDQyIDogIkI3QzQiLAoJCTI1OTE4IDogIkI3QzUiLAoJCTMzNzc4IDogIkI3QzYiLAoJCTM4NzUwIDogIkI3QzciLAoJCTIxODU3IDogIkI3QzgiLAoJCTM5MTM0IDogIkI3QzkiLAoJCTMyOTMzIDogIkI3Q0EiLAoJCTIxMjkwIDogIkI3Q0IiLAoJCTM1ODM3IDogIkI3Q0MiLAoJCTIxNTM2IDogIkI3Q0QiLAoJCTMyOTU0IDogIkI3Q0UiLAoJCTI0MjIzIDogIkI3Q0YiLAoJCTI3ODMyIDogIkI3RDAiLAoJCTM2MTUzIDogIkI3RDEiLAoJCTMzNDUyIDogIkI3RDIiLAoJCTM3MjEwIDogIkI3RDMiLAoJCTIxNTQ1IDogIkI3RDQiLAoJCTI3Njc1IDogIkI3RDUiLAoJCTIwOTk4IDogIkI3RDYiLAoJCTMyNDM5IDogIkI3RDciLAoJCTIyMzY3IDogIkI3RDgiLAoJCTI4OTU0IDogIkI3RDkiLAoJCTI3Nzc0IDogIkI3REEiLAoJCTMxODgxIDogIkI3REIiLAoJCTIyODU5IDogIkI3REMiLAoJCTIwMjIxIDogIkI3REQiLAoJCTI0NTc1IDogIkI3REUiLAoJCTI0ODY4IDogIkI3REYiLAoJCTMxOTE0IDogIkI3RTAiLAoJCTIwMDE2IDogIkI3RTEiLAoJCTIzNTUzIDogIkI3RTIiLAoJCTI2NTM5IDogIkI3RTMiLAoJCTM0NTYyIDogIkI3RTQiLAoJCTIzNzkyIDogIkI3RTUiLAoJCTM4MTU1IDogIkI3RTYiLAoJCTM5MTE4IDogIkI3RTciLAoJCTMwMTI3IDogIkI3RTgiLAoJCTI4OTI1IDogIkI3RTkiLAoJCTM2ODk4IDogIkI3RUEiLAoJCTIwOTExIDogIkI3RUIiLAoJCTMyNTQxIDogIkI3RUMiLAoJCTM1NzczIDogIkI3RUQiLAoJCTIyODU3IDogIkI3RUUiLAoJCTIwOTY0IDogIkI3RUYiLAoJCTIwMzE1IDogIkI3RjAiLAoJCTIxNTQyIDogIkI3RjEiLAoJCTIyODI3IDogIkI3RjIiLAoJCTI1OTc1IDogIkI3RjMiLAoJCTMyOTMyIDogIkI3RjQiLAoJCTIzNDEzIDogIkI3RjUiLAoJCTI1MjA2IDogIkI3RjYiLAoJCTI1MjgyIDogIkI3RjciLAoJCTM2NzUyIDogIkI3RjgiLAoJCTI0MTMzIDogIkI3RjkiLAoJCTI3Njc5IDogIkI3RkEiLAoJCTMxNTI2IDogIkI3RkIiLAoJCTIwMjM5IDogIkI3RkMiLAoJCTIwNDQwIDogIkI3RkQiLAoJCTI2MzgxIDogIkI3RkUiLAoJCTI4MDE0IDogIkI4QTEiLAoJCTI4MDc0IDogIkI4QTIiLAoJCTMxMTE5IDogIkI4QTMiLAoJCTM0OTkzIDogIkI4QTQiLAoJCTI0MzQzIDogIkI4QTUiLAoJCTI5OTk1IDogIkI4QTYiLAoJCTI1MjQyIDogIkI4QTciLAoJCTM2NzQxIDogIkI4QTgiLAoJCTIwNDYzIDogIkI4QTkiLAoJCTM3MzQwIDogIkI4QUEiLAoJCTI2MDIzIDogIkI4QUIiLAoJCTMzMDcxIDogIkI4QUMiLAoJCTMzMTA1IDogIkI4QUQiLAoJCTI0MjIwIDogIkI4QUUiLAoJCTMzMTA0IDogIkI4QUYiLAoJCTM2MjEyIDogIkI4QjAiLAoJCTIxMTAzIDogIkI4QjEiLAoJCTM1MjA2IDogIkI4QjIiLAoJCTM2MTcxIDogIkI4QjMiLAoJCTIyNzk3IDogIkI4QjQiLAoJCTIwNjEzIDogIkI4QjUiLAoJCTIwMTg0IDogIkI4QjYiLAoJCTM4NDI4IDogIkI4QjciLAoJCTI5MjM4IDogIkI4QjgiLAoJCTMzMTQ1IDogIkI4QjkiLAoJCTM2MTI3IDogIkI4QkEiLAoJCTIzNTAwIDogIkI4QkIiLAoJCTM1NzQ3IDogIkI4QkMiLAoJCTM4NDY4IDogIkI4QkQiLAoJCTIyOTE5IDogIkI4QkUiLAoJCTMyNTM4IDogIkI4QkYiLAoJCTIxNjQ4IDogIkI4QzAiLAoJCTIyMTM0IDogIkI4QzEiLAoJCTIyMDMwIDogIkI4QzIiLAoJCTM1ODEzIDogIkI4QzMiLAoJCTI1OTEzIDogIkI4QzQiLAoJCTI3MDEwIDogIkI4QzUiLAoJCTM4MDQxIDogIkI4QzYiLAoJCTMwNDIyIDogIkI4QzciLAoJCTI4Mjk3IDogIkI4QzgiLAoJCTI0MTc4IDogIkI4QzkiLAoJCTI5OTc2IDogIkI4Q0EiLAoJCTI2NDM4IDogIkI4Q0IiLAoJCTI2NTc3IDogIkI4Q0MiLAoJCTMxNDg3IDogIkI4Q0QiLAoJCTMyOTI1IDogIkI4Q0UiLAoJCTM2MjE0IDogIkI4Q0YiLAoJCTI0ODYzIDogIkI4RDAiLAoJCTMxMTc0IDogIkI4RDEiLAoJCTI1OTU0IDogIkI4RDIiLAoJCTM2MTk1IDogIkI4RDMiLAoJCTIwODcyIDogIkI4RDQiLAoJCTIxMDE4IDogIkI4RDUiLAoJCTM4MDUwIDogIkI4RDYiLAoJCTMyNTY4IDogIkI4RDciLAoJCTMyOTIzIDogIkI4RDgiLAoJCTMyNDM0IDogIkI4RDkiLAoJCTIzNzAzIDogIkI4REEiLAoJCTI4MjA3IDogIkI4REIiLAoJCTI2NDY0IDogIkI4REMiLAoJCTMxNzA1IDogIkI4REQiLAoJCTMwMzQ3IDogIkI4REUiLAoJCTM5NjQwIDogIkI4REYiLAoJCTMzMTY3IDogIkI4RTAiLAoJCTMyNjYwIDogIkI4RTEiLAoJCTMxOTU3IDogIkI4RTIiLAoJCTI1NjMwIDogIkI4RTMiLAoJCTM4MjI0IDogIkI4RTQiLAoJCTMxMjk1IDogIkI4RTUiLAoJCTIxNTc4IDogIkI4RTYiLAoJCTIxNzMzIDogIkI4RTciLAoJCTI3NDY4IDogIkI4RTgiLAoJCTI1NjAxIDogIkI4RTkiLAoJCTI1MDk2IDogIkI4RUEiLAoJCTQwNTA5IDogIkI4RUIiLAoJCTMzMDExIDogIkI4RUMiLAoJCTMwMTA1IDogIkI4RUQiLAoJCTIxMTA2IDogIkI4RUUiLAoJCTM4NzYxIDogIkI4RUYiLAoJCTMzODgzIDogIkI4RjAiLAoJCTI2Njg0IDogIkI4RjEiLAoJCTM0NTMyIDogIkI4RjIiLAoJCTM4NDAxIDogIkI4RjMiLAoJCTM4NTQ4IDogIkI4RjQiLAoJCTM4MTI0IDogIkI4RjUiLAoJCTIwMDEwIDogIkI4RjYiLAoJCTIxNTA4IDogIkI4RjciLAoJCTMyNDczIDogIkI4RjgiLAoJCTI2NjgxIDogIkI4RjkiLAoJCTM2MzE5IDogIkI4RkEiLAoJCTMyNzg5IDogIkI4RkIiLAoJCTI2MzU2IDogIkI4RkMiLAoJCTI0MjE4IDogIkI4RkQiLAoJCTMyNjk3IDogIkI4RkUiLAoJCTIyNDY2IDogIkI5QTEiLAoJCTMyODMxIDogIkI5QTIiLAoJCTI2Nzc1IDogIkI5QTMiLAoJCTI0MDM3IDogIkI5QTQiLAoJCTI1OTE1IDogIkI5QTUiLAoJCTIxMTUxIDogIkI5QTYiLAoJCTI0Njg1IDogIkI5QTciLAoJCTQwODU4IDogIkI5QTgiLAoJCTIwMzc5IDogIkI5QTkiLAoJCTM2NTI0IDogIkI5QUEiLAoJCTIwODQ0IDogIkI5QUIiLAoJCTIzNDY3IDogIkI5QUMiLAoJCTI0MzM5IDogIkI5QUQiLAoJCTI0MDQxIDogIkI5QUUiLAoJCTI3NzQyIDogIkI5QUYiLAoJCTI1MzI5IDogIkI5QjAiLAoJCTM2MTI5IDogIkI5QjEiLAoJCTIwODQ5IDogIkI5QjIiLAoJCTM4MDU3IDogIkI5QjMiLAoJCTIxMjQ2IDogIkI5QjQiLAoJCTI3ODA3IDogIkI5QjUiLAoJCTMzNTAzIDogIkI5QjYiLAoJCTI5Mzk5IDogIkI5QjciLAoJCTIyNDM0IDogIkI5QjgiLAoJCTI2NTAwIDogIkI5QjkiLAoJCTM2MTQxIDogIkI5QkEiLAoJCTIyODE1IDogIkI5QkIiLAoJCTM2NzY0IDogIkI5QkMiLAoJCTMzNzM1IDogIkI5QkQiLAoJCTIxNjUzIDogIkI5QkUiLAoJCTMxNjI5IDogIkI5QkYiLAoJCTIwMjcyIDogIkI5QzAiLAoJCTI3ODM3IDogIkI5QzEiLAoJCTIzMzk2IDogIkI5QzIiLAoJCTIyOTkzIDogIkI5QzMiLAoJCTQwNzIzIDogIkI5QzQiLAoJCTIxNDc2IDogIkI5QzUiLAoJCTM0NTA2IDogIkI5QzYiLAoJCTM5NTkyIDogIkI5QzciLAoJCTM1ODk1IDogIkI5QzgiLAoJCTMyOTI5IDogIkI5QzkiLAoJCTI1OTI1IDogIkI5Q0EiLAoJCTM5MDM4IDogIkI5Q0IiLAoJCTIyMjY2IDogIkI5Q0MiLAoJCTM4NTk5IDogIkI5Q0QiLAoJCTIxMDM4IDogIkI5Q0UiLAoJCTI5OTE2IDogIkI5Q0YiLAoJCTIxMDcyIDogIkI5RDAiLAoJCTIzNTIxIDogIkI5RDEiLAoJCTI1MzQ2IDogIkI5RDIiLAoJCTM1MDc0IDogIkI5RDMiLAoJCTIwMDU0IDogIkI5RDQiLAoJCTI1Mjk2IDogIkI5RDUiLAoJCTI0NjE4IDogIkI5RDYiLAoJCTI2ODc0IDogIkI5RDciLAoJCTIwODUxIDogIkI5RDgiLAoJCTIzNDQ4IDogIkI5RDkiLAoJCTIwODk2IDogIkI5REEiLAoJCTM1MjY2IDogIkI5REIiLAoJCTMxNjQ5IDogIkI5REMiLAoJCTM5MzAyIDogIkI5REQiLAoJCTMyNTkyIDogIkI5REUiLAoJCTI0ODE1IDogIkI5REYiLAoJCTI4NzQ4IDogIkI5RTAiLAoJCTM2MTQzIDogIkI5RTEiLAoJCTIwODA5IDogIkI5RTIiLAoJCTI0MTkxIDogIkI5RTMiLAoJCTM2ODkxIDogIkI5RTQiLAoJCTI5ODA4IDogIkI5RTUiLAoJCTM1MjY4IDogIkI5RTYiLAoJCTIyMzE3IDogIkI5RTciLAoJCTMwNzg5IDogIkI5RTgiLAoJCTI0NDAyIDogIkI5RTkiLAoJCTQwODYzIDogIkI5RUEiLAoJCTM4Mzk0IDogIkI5RUIiLAoJCTM2NzEyIDogIkI5RUMiLAoJCTM5NzQwIDogIkI5RUQiLAoJCTM1ODA5IDogIkI5RUUiLAoJCTMwMzI4IDogIkI5RUYiLAoJCTI2NjkwIDogIkI5RjAiLAoJCTI2NTg4IDogIkI5RjEiLAoJCTM2MzMwIDogIkI5RjIiLAoJCTM2MTQ5IDogIkI5RjMiLAoJCTIxMDUzIDogIkI5RjQiLAoJCTM2NzQ2IDogIkI5RjUiLAoJCTI4Mzc4IDogIkI5RjYiLAoJCTI2ODI5IDogIkI5RjciLAoJCTM4MTQ5IDogIkI5RjgiLAoJCTM3MTAxIDogIkI5RjkiLAoJCTIyMjY5IDogIkI5RkEiLAoJCTI2NTI0IDogIkI5RkIiLAoJCTM1MDY1IDogIkI5RkMiLAoJCTM2ODA3IDogIkI5RkQiLAoJCTIxNzA0IDogIkI5RkUiLAoJCTM5NjA4IDogIkJBQTEiLAoJCTIzNDAxIDogIkJBQTIiLAoJCTI4MDIzIDogIkJBQTMiLAoJCTI3Njg2IDogIkJBQTQiLAoJCTIwMTMzIDogIkJBQTUiLAoJCTIzNDc1IDogIkJBQTYiLAoJCTM5NTU5IDogIkJBQTciLAoJCTM3MjE5IDogIkJBQTgiLAoJCTI1MDAwIDogIkJBQTkiLAoJCTM3MDM5IDogIkJBQUEiLAoJCTM4ODg5IDogIkJBQUIiLAoJCTIxNTQ3IDogIkJBQUMiLAoJCTI4MDg1IDogIkJBQUQiLAoJCTIzNTA2IDogIkJBQUUiLAoJCTIwOTg5IDogIkJBQUYiLAoJCTIxODk4IDogIkJBQjAiLAoJCTMyNTk3IDogIkJBQjEiLAoJCTMyNzUyIDogIkJBQjIiLAoJCTI1Nzg4IDogIkJBQjMiLAoJCTI1NDIxIDogIkJBQjQiLAoJCTI2MDk3IDogIkJBQjUiLAoJCTI1MDIyIDogIkJBQjYiLAoJCTI0NzE3IDogIkJBQjciLAoJCTI4OTM4IDogIkJBQjgiLAoJCTI3NzM1IDogIkJBQjkiLAoJCTI3NzIxIDogIkJBQkEiLAoJCTIyODMxIDogIkJBQkIiLAoJCTI2NDc3IDogIkJBQkMiLAoJCTMzMzIyIDogIkJBQkQiLAoJCTIyNzQxIDogIkJBQkUiLAoJCTIyMTU4IDogIkJBQkYiLAoJCTM1OTQ2IDogIkJBQzAiLAoJCTI3NjI3IDogIkJBQzEiLAoJCTM3MDg1IDogIkJBQzIiLAoJCTIyOTA5IDogIkJBQzMiLAoJCTMyNzkxIDogIkJBQzQiLAoJCTIxNDk1IDogIkJBQzUiLAoJCTI4MDA5IDogIkJBQzYiLAoJCTIxNjIxIDogIkJBQzciLAoJCTIxOTE3IDogIkJBQzgiLAoJCTMzNjU1IDogIkJBQzkiLAoJCTMzNzQzIDogIkJBQ0EiLAoJCTI2NjgwIDogIkJBQ0IiLAoJCTMxMTY2IDogIkJBQ0MiLAoJCTIxNjQ0IDogIkJBQ0QiLAoJCTIwMzA5IDogIkJBQ0UiLAoJCTIxNTEyIDogIkJBQ0YiLAoJCTMwNDE4IDogIkJBRDAiLAoJCTM1OTc3IDogIkJBRDEiLAoJCTM4NDAyIDogIkJBRDIiLAoJCTI3ODI3IDogIkJBRDMiLAoJCTI4MDg4IDogIkJBRDQiLAoJCTM2MjAzIDogIkJBRDUiLAoJCTM1MDg4IDogIkJBRDYiLAoJCTQwNTQ4IDogIkJBRDciLAoJCTM2MTU0IDogIkJBRDgiLAoJCTIyMDc5IDogIkJBRDkiLAoJCTQwNjU3IDogIkJBREEiLAoJCTMwMTY1IDogIkJBREIiLAoJCTI0NDU2IDogIkJBREMiLAoJCTI5NDA4IDogIkJBREQiLAoJCTI0NjgwIDogIkJBREUiLAoJCTIxNzU2IDogIkJBREYiLAoJCTIwMTM2IDogIkJBRTAiLAoJCTI3MTc4IDogIkJBRTEiLAoJCTM0OTEzIDogIkJBRTIiLAoJCTI0NjU4IDogIkJBRTMiLAoJCTM2NzIwIDogIkJBRTQiLAoJCTIxNzAwIDogIkJBRTUiLAoJCTI4ODg4IDogIkJBRTYiLAoJCTM0NDI1IDogIkJBRTciLAoJCTQwNTExIDogIkJBRTgiLAoJCTI3OTQ2IDogIkJBRTkiLAoJCTIzNDM5IDogIkJBRUEiLAoJCTI0MzQ0IDogIkJBRUIiLAoJCTMyNDE4IDogIkJBRUMiLAoJCTIxODk3IDogIkJBRUQiLAoJCTIwMzk5IDogIkJBRUUiLAoJCTI5NDkyIDogIkJBRUYiLAoJCTIxNTY0IDogIkJBRjAiLAoJCTIxNDAyIDogIkJBRjEiLAoJCTIwNTA1IDogIkJBRjIiLAoJCTIxNTE4IDogIkJBRjMiLAoJCTIxNjI4IDogIkJBRjQiLAoJCTIwMDQ2IDogIkJBRjUiLAoJCTI0NTczIDogIkJBRjYiLAoJCTI5Nzg2IDogIkJBRjciLAoJCTIyNzc0IDogIkJBRjgiLAoJCTMzODk5IDogIkJBRjkiLAoJCTMyOTkzIDogIkJBRkEiLAoJCTM0Njc2IDogIkJBRkIiLAoJCTI5MzkyIDogIkJBRkMiLAoJCTMxOTQ2IDogIkJBRkQiLAoJCTI4MjQ2IDogIkJBRkUiLAoJCTI0MzU5IDogIkJCQTEiLAoJCTM0MzgyIDogIkJCQTIiLAoJCTIxODA0IDogIkJCQTMiLAoJCTI1MjUyIDogIkJCQTQiLAoJCTIwMTE0IDogIkJCQTUiLAoJCTI3ODE4IDogIkJCQTYiLAoJCTI1MTQzIDogIkJCQTciLAoJCTMzNDU3IDogIkJCQTgiLAoJCTIxNzE5IDogIkJCQTkiLAoJCTIxMzI2IDogIkJCQUEiLAoJCTI5NTAyIDogIkJCQUIiLAoJCTI4MzY5IDogIkJCQUMiLAoJCTMwMDExIDogIkJCQUQiLAoJCTIxMDEwIDogIkJCQUUiLAoJCTIxMjcwIDogIkJCQUYiLAoJCTM1ODA1IDogIkJCQjAiLAoJCTI3MDg4IDogIkJCQjEiLAoJCTI0NDU4IDogIkJCQjIiLAoJCTI0NTc2IDogIkJCQjMiLAoJCTI4MTQyIDogIkJCQjQiLAoJCTIyMzUxIDogIkJCQjUiLAoJCTI3NDI2IDogIkJCQjYiLAoJCTI5NjE1IDogIkJCQjciLAoJCTI2NzA3IDogIkJCQjgiLAoJCTM2ODI0IDogIkJCQjkiLAoJCTMyNTMxIDogIkJCQkEiLAoJCTI1NDQyIDogIkJCQkIiLAoJCTI0NzM5IDogIkJCQkMiLAoJCTIxNzk2IDogIkJCQkQiLAoJCTMwMTg2IDogIkJCQkUiLAoJCTM1OTM4IDogIkJCQkYiLAoJCTI4OTQ5IDogIkJCQzAiLAoJCTI4MDY3IDogIkJCQzEiLAoJCTIzNDYyIDogIkJCQzIiLAoJCTI0MTg3IDogIkJCQzMiLAoJCTMzNjE4IDogIkJCQzQiLAoJCTI0OTA4IDogIkJCQzUiLAoJCTQwNjQ0IDogIkJCQzYiLAoJCTMwOTcwIDogIkJCQzciLAoJCTM0NjQ3IDogIkJCQzgiLAoJCTMxNzgzIDogIkJCQzkiLAoJCTMwMzQzIDogIkJCQ0EiLAoJCTIwOTc2IDogIkJCQ0IiLAoJCTI0ODIyIDogIkJCQ0MiLAoJCTI5MDA0IDogIkJCQ0QiLAoJCTI2MTc5IDogIkJCQ0UiLAoJCTI0MTQwIDogIkJCQ0YiLAoJCTI0NjUzIDogIkJCRDAiLAoJCTM1ODU0IDogIkJCRDEiLAoJCTI4Nzg0IDogIkJCRDIiLAoJCTI1MzgxIDogIkJCRDMiLAoJCTM2NzQ1IDogIkJCRDQiLAoJCTI0NTA5IDogIkJCRDUiLAoJCTI0Njc0IDogIkJCRDYiLAoJCTM0NTE2IDogIkJCRDciLAoJCTIyMjM4IDogIkJCRDgiLAoJCTI3NTg1IDogIkJCRDkiLAoJCTI0NzI0IDogIkJCREEiLAoJCTI0OTM1IDogIkJCREIiLAoJCTIxMzIxIDogIkJCREMiLAoJCTI0ODAwIDogIkJCREQiLAoJCTI2MjE0IDogIkJCREUiLAoJCTM2MTU5IDogIkJCREYiLAoJCTMxMjI5IDogIkJCRTAiLAoJCTIwMjUwIDogIkJCRTEiLAoJCTI4OTA1IDogIkJCRTIiLAoJCTI3NzE5IDogIkJCRTMiLAoJCTM1NzYzIDogIkJCRTQiLAoJCTM1ODI2IDogIkJCRTUiLAoJCTMyNDcyIDogIkJCRTYiLAoJCTMzNjM2IDogIkJCRTciLAoJCTI2MTI3IDogIkJCRTgiLAoJCTIzMTMwIDogIkJCRTkiLAoJCTM5NzQ2IDogIkJCRUEiLAoJCTI3OTg1IDogIkJCRUIiLAoJCTI4MTUxIDogIkJCRUMiLAoJCTM1OTA1IDogIkJCRUQiLAoJCTI3OTYzIDogIkJCRUUiLAoJCTIwMjQ5IDogIkJCRUYiLAoJCTI4Nzc5IDogIkJCRjAiLAoJCTMzNzE5IDogIkJCRjEiLAoJCTI1MTEwIDogIkJCRjIiLAoJCTI0Nzg1IDogIkJCRjMiLAoJCTM4NjY5IDogIkJCRjQiLAoJCTM2MTM1IDogIkJCRjUiLAoJCTMxMDk2IDogIkJCRjYiLAoJCTIwOTg3IDogIkJCRjciLAoJCTIyMzM0IDogIkJCRjgiLAoJCTIyNTIyIDogIkJCRjkiLAoJCTI2NDI2IDogIkJCRkEiLAoJCTMwMDcyIDogIkJCRkIiLAoJCTMxMjkzIDogIkJCRkMiLAoJCTMxMjE1IDogIkJCRkQiLAoJCTMxNjM3IDogIkJCRkUiLAoJCTMyOTA4IDogIkJDQTEiLAoJCTM5MjY5IDogIkJDQTIiLAoJCTM2ODU3IDogIkJDQTMiLAoJCTI4NjA4IDogIkJDQTQiLAoJCTM1NzQ5IDogIkJDQTUiLAoJCTQwNDgxIDogIkJDQTYiLAoJCTIzMDIwIDogIkJDQTciLAoJCTMyNDg5IDogIkJDQTgiLAoJCTMyNTIxIDogIkJDQTkiLAoJCTIxNTEzIDogIkJDQUEiLAoJCTI2NDk3IDogIkJDQUIiLAoJCTI2ODQwIDogIkJDQUMiLAoJCTM2NzUzIDogIkJDQUQiLAoJCTMxODIxIDogIkJDQUUiLAoJCTM4NTk4IDogIkJDQUYiLAoJCTIxNDUwIDogIkJDQjAiLAoJCTI0NjEzIDogIkJDQjEiLAoJCTMwMTQyIDogIkJDQjIiLAoJCTI3NzYyIDogIkJDQjMiLAoJCTIxMzYzIDogIkJDQjQiLAoJCTIzMjQxIDogIkJDQjUiLAoJCTMyNDIzIDogIkJDQjYiLAoJCTI1MzgwIDogIkJDQjciLAoJCTIwOTYwIDogIkJDQjgiLAoJCTMzMDM0IDogIkJDQjkiLAoJCTI0MDQ5IDogIkJDQkEiLAoJCTM0MDE1IDogIkJDQkIiLAoJCTI1MjE2IDogIkJDQkMiLAoJCTIwODY0IDogIkJDQkQiLAoJCTIzMzk1IDogIkJDQkUiLAoJCTIwMjM4IDogIkJDQkYiLAoJCTMxMDg1IDogIkJDQzAiLAoJCTIxMDU4IDogIkJDQzEiLAoJCTI0NzYwIDogIkJDQzIiLAoJCTI3OTgyIDogIkJDQzMiLAoJCTIzNDkyIDogIkJDQzQiLAoJCTIzNDkwIDogIkJDQzUiLAoJCTM1NzQ1IDogIkJDQzYiLAoJCTM1NzYwIDogIkJDQzciLAoJCTI2MDgyIDogIkJDQzgiLAoJCTI0NTI0IDogIkJDQzkiLAoJCTM4NDY5IDogIkJDQ0EiLAoJCTIyOTMxIDogIkJDQ0IiLAoJCTMyNDg3IDogIkJDQ0MiLAoJCTMyNDI2IDogIkJDQ0QiLAoJCTIyMDI1IDogIkJDQ0UiLAoJCTI2NTUxIDogIkJDQ0YiLAoJCTIyODQxIDogIkJDRDAiLAoJCTIwMzM5IDogIkJDRDEiLAoJCTIzNDc4IDogIkJDRDIiLAoJCTIxMTUyIDogIkJDRDMiLAoJCTMzNjI2IDogIkJDRDQiLAoJCTM5MDUwIDogIkJDRDUiLAoJCTM2MTU4IDogIkJDRDYiLAoJCTMwMDAyIDogIkJDRDciLAoJCTM4MDc4IDogIkJDRDgiLAoJCTIwNTUxIDogIkJDRDkiLAoJCTMxMjkyIDogIkJDREEiLAoJCTIwMjE1IDogIkJDREIiLAoJCTI2NTUwIDogIkJDREMiLAoJCTM5NTUwIDogIkJDREQiLAoJCTIzMjMzIDogIkJDREUiLAoJCTI3NTE2IDogIkJDREYiLAoJCTMwNDE3IDogIkJDRTAiLAoJCTIyMzYyIDogIkJDRTEiLAoJCTIzNTc0IDogIkJDRTIiLAoJCTMxNTQ2IDogIkJDRTMiLAoJCTM4Mzg4IDogIkJDRTQiLAoJCTI5MDA2IDogIkJDRTUiLAoJCTIwODYwIDogIkJDRTYiLAoJCTMyOTM3IDogIkJDRTciLAoJCTMzMzkyIDogIkJDRTgiLAoJCTIyOTA0IDogIkJDRTkiLAoJCTMyNTE2IDogIkJDRUEiLAoJCTMzNTc1IDogIkJDRUIiLAoJCTI2ODE2IDogIkJDRUMiLAoJCTI2NjA0IDogIkJDRUQiLAoJCTMwODk3IDogIkJDRUUiLAoJCTMwODM5IDogIkJDRUYiLAoJCTI1MzE1IDogIkJDRjAiLAoJCTI1NDQxIDogIkJDRjEiLAoJCTMxNjE2IDogIkJDRjIiLAoJCTIwNDYxIDogIkJDRjMiLAoJCTIxMDk4IDogIkJDRjQiLAoJCTIwOTQzIDogIkJDRjUiLAoJCTMzNjE2IDogIkJDRjYiLAoJCTI3MDk5IDogIkJDRjciLAoJCTM3NDkyIDogIkJDRjgiLAoJCTM2MzQxIDogIkJDRjkiLAoJCTM2MTQ1IDogIkJDRkEiLAoJCTM1MjY1IDogIkJDRkIiLAoJCTM4MTkwIDogIkJDRkMiLAoJCTMxNjYxIDogIkJDRkQiLAoJCTIwMjE0IDogIkJDRkUiLAoJCTIwNTgxIDogIkJEQTEiLAoJCTMzMzI4IDogIkJEQTIiLAoJCTIxMDczIDogIkJEQTMiLAoJCTM5Mjc5IDogIkJEQTQiLAoJCTI4MTc2IDogIkJEQTUiLAoJCTI4MjkzIDogIkJEQTYiLAoJCTI4MDcxIDogIkJEQTciLAoJCTI0MzE0IDogIkJEQTgiLAoJCTIwNzI1IDogIkJEQTkiLAoJCTIzMDA0IDogIkJEQUEiLAoJCTIzNTU4IDogIkJEQUIiLAoJCTI3OTc0IDogIkJEQUMiLAoJCTI3NzQzIDogIkJEQUQiLAoJCTMwMDg2IDogIkJEQUUiLAoJCTMzOTMxIDogIkJEQUYiLAoJCTI2NzI4IDogIkJEQjAiLAoJCTIyODcwIDogIkJEQjEiLAoJCTM1NzYyIDogIkJEQjIiLAoJCTIxMjgwIDogIkJEQjMiLAoJCTM3MjMzIDogIkJEQjQiLAoJCTM4NDc3IDogIkJEQjUiLAoJCTM0MTIxIDogIkJEQjYiLAoJCTI2ODk4IDogIkJEQjciLAoJCTMwOTc3IDogIkJEQjgiLAoJCTI4OTY2IDogIkJEQjkiLAoJCTMzMDE0IDogIkJEQkEiLAoJCTIwMTMyIDogIkJEQkIiLAoJCTM3MDY2IDogIkJEQkMiLAoJCTI3OTc1IDogIkJEQkQiLAoJCTM5NTU2IDogIkJEQkUiLAoJCTIzMDQ3IDogIkJEQkYiLAoJCTIyMjA0IDogIkJEQzAiLAoJCTI1NjA1IDogIkJEQzEiLAoJCTM4MTI4IDogIkJEQzIiLAoJCTMwNjk5IDogIkJEQzMiLAoJCTIwMzg5IDogIkJEQzQiLAoJCTMzMDUwIDogIkJEQzUiLAoJCTI5NDA5IDogIkJEQzYiLAoJCTM1MjgyIDogIkJEQzciLAoJCTM5MjkwIDogIkJEQzgiLAoJCTMyNTY0IDogIkJEQzkiLAoJCTMyNDc4IDogIkJEQ0EiLAoJCTIxMTE5IDogIkJEQ0IiLAoJCTI1OTQ1IDogIkJEQ0MiLAoJCTM3MjM3IDogIkJEQ0QiLAoJCTM2NzM1IDogIkJEQ0UiLAoJCTM2NzM5IDogIkJEQ0YiLAoJCTIxNDgzIDogIkJERDAiLAoJCTMxMzgyIDogIkJERDEiLAoJCTI1NTgxIDogIkJERDIiLAoJCTI1NTA5IDogIkJERDMiLAoJCTMwMzQyIDogIkJERDQiLAoJCTMxMjI0IDogIkJERDUiLAoJCTM0OTAzIDogIkJERDYiLAoJCTM4NDU0IDogIkJERDciLAoJCTI1MTMwIDogIkJERDgiLAoJCTIxMTYzIDogIkJERDkiLAoJCTMzNDEwIDogIkJEREEiLAoJCTI2NzA4IDogIkJEREIiLAoJCTI2NDgwIDogIkJEREMiLAoJCTI1NDYzIDogIkJEREQiLAoJCTMwNTcxIDogIkJEREUiLAoJCTMxNDY5IDogIkJEREYiLAoJCTI3OTA1IDogIkJERTAiLAoJCTMyNDY3IDogIkJERTEiLAoJCTM1Mjk5IDogIkJERTIiLAoJCTIyOTkyIDogIkJERTMiLAoJCTI1MTA2IDogIkJERTQiLAoJCTM0MjQ5IDogIkJERTUiLAoJCTMzNDQ1IDogIkJERTYiLAoJCTMwMDI4IDogIkJERTciLAoJCTIwNTExIDogIkJERTgiLAoJCTIwMTcxIDogIkJERTkiLAoJCTMwMTE3IDogIkJERUEiLAoJCTM1ODE5IDogIkJERUIiLAoJCTIzNjI2IDogIkJERUMiLAoJCTI0MDYyIDogIkJERUQiLAoJCTMxNTYzIDogIkJERUUiLAoJCTI2MDIwIDogIkJERUYiLAoJCTM3MzI5IDogIkJERjAiLAoJCTIwMTcwIDogIkJERjEiLAoJCTI3OTQxIDogIkJERjIiLAoJCTM1MTY3IDogIkJERjMiLAoJCTMyMDM5IDogIkJERjQiLAoJCTM4MTgyIDogIkJERjUiLAoJCTIwMTY1IDogIkJERjYiLAoJCTM1ODgwIDogIkJERjciLAoJCTM2ODI3IDogIkJERjgiLAoJCTM4NzcxIDogIkJERjkiLAoJCTI2MTg3IDogIkJERkEiLAoJCTMxMTA1IDogIkJERkIiLAoJCTM2ODE3IDogIkJERkMiLAoJCTI4OTA4IDogIkJERkQiLAoJCTI4MDI0IDogIkJERkUiLAoJCTIzNjEzIDogIkJFQTEiLAoJCTIxMTcwIDogIkJFQTIiLAoJCTMzNjA2IDogIkJFQTMiLAoJCTIwODM0IDogIkJFQTQiLAoJCTMzNTUwIDogIkJFQTUiLAoJCTMwNTU1IDogIkJFQTYiLAoJCTI2MjMwIDogIkJFQTciLAoJCTQwMTIwIDogIkJFQTgiLAoJCTIwMTQwIDogIkJFQTkiLAoJCTI0Nzc4IDogIkJFQUEiLAoJCTMxOTM0IDogIkJFQUIiLAoJCTMxOTIzIDogIkJFQUMiLAoJCTMyNDYzIDogIkJFQUQiLAoJCTIwMTE3IDogIkJFQUUiLAoJCTM1Njg2IDogIkJFQUYiLAoJCTI2MjIzIDogIkJFQjAiLAoJCTM5MDQ4IDogIkJFQjEiLAoJCTM4NzQ1IDogIkJFQjIiLAoJCTIyNjU5IDogIkJFQjMiLAoJCTI1OTY0IDogIkJFQjQiLAoJCTM4MjM2IDogIkJFQjUiLAoJCTI0NDUyIDogIkJFQjYiLAoJCTMwMTUzIDogIkJFQjciLAoJCTM4NzQyIDogIkJFQjgiLAoJCTMxNDU1IDogIkJFQjkiLAoJCTMxNDU0IDogIkJFQkEiLAoJCTIwOTI4IDogIkJFQkIiLAoJCTI4ODQ3IDogIkJFQkMiLAoJCTMxMzg0IDogIkJFQkQiLAoJCTI1NTc4IDogIkJFQkUiLAoJCTMxMzUwIDogIkJFQkYiLAoJCTMyNDE2IDogIkJFQzAiLAoJCTI5NTkwIDogIkJFQzEiLAoJCTM4ODkzIDogIkJFQzIiLAoJCTIwMDM3IDogIkJFQzMiLAoJCTI4NzkyIDogIkJFQzQiLAoJCTIwMDYxIDogIkJFQzUiLAoJCTM3MjAyIDogIkJFQzYiLAoJCTIxNDE3IDogIkJFQzciLAoJCTI1OTM3IDogIkJFQzgiLAoJCTI2MDg3IDogIkJFQzkiLAoJCTMzMjc2IDogIkJFQ0EiLAoJCTMzMjg1IDogIkJFQ0IiLAoJCTIxNjQ2IDogIkJFQ0MiLAoJCTIzNjAxIDogIkJFQ0QiLAoJCTMwMTA2IDogIkJFQ0UiLAoJCTM4ODE2IDogIkJFQ0YiLAoJCTI1MzA0IDogIkJFRDAiLAoJCTI5NDAxIDogIkJFRDEiLAoJCTMwMTQxIDogIkJFRDIiLAoJCTIzNjIxIDogIkJFRDMiLAoJCTM5NTQ1IDogIkJFRDQiLAoJCTMzNzM4IDogIkJFRDUiLAoJCTIzNjE2IDogIkJFRDYiLAoJCTIxNjMyIDogIkJFRDciLAoJCTMwNjk3IDogIkJFRDgiLAoJCTIwMDMwIDogIkJFRDkiLAoJCTI3ODIyIDogIkJFREEiLAoJCTMyODU4IDogIkJFREIiLAoJCTI1Mjk4IDogIkJFREMiLAoJCTI1NDU0IDogIkJFREQiLAoJCTI0MDQwIDogIkJFREUiLAoJCTIwODU1IDogIkJFREYiLAoJCTM2MzE3IDogIkJFRTAiLAoJCTM2MzgyIDogIkJFRTEiLAoJCTM4MTkxIDogIkJFRTIiLAoJCTIwNDY1IDogIkJFRTMiLAoJCTIxNDc3IDogIkJFRTQiLAoJCTI0ODA3IDogIkJFRTUiLAoJCTI4ODQ0IDogIkJFRTYiLAoJCTIxMDk1IDogIkJFRTciLAoJCTI1NDI0IDogIkJFRTgiLAoJCTQwNTE1IDogIkJFRTkiLAoJCTIzMDcxIDogIkJFRUEiLAoJCTIwNTE4IDogIkJFRUIiLAoJCTMwNTE5IDogIkJFRUMiLAoJCTIxMzY3IDogIkJFRUQiLAoJCTMyNDgyIDogIkJFRUUiLAoJCTI1NzMzIDogIkJFRUYiLAoJCTI1ODk5IDogIkJFRjAiLAoJCTI1MjI1IDogIkJFRjEiLAoJCTI1NDk2IDogIkJFRjIiLAoJCTIwNTAwIDogIkJFRjMiLAoJCTI5MjM3IDogIkJFRjQiLAoJCTM1MjczIDogIkJFRjUiLAoJCTIwOTE1IDogIkJFRjYiLAoJCTM1Nzc2IDogIkJFRjciLAoJCTMyNDc3IDogIkJFRjgiLAoJCTIyMzQzIDogIkJFRjkiLAoJCTMzNzQwIDogIkJFRkEiLAoJCTM4MDU1IDogIkJFRkIiLAoJCTIwODkxIDogIkJFRkMiLAoJCTIxNTMxIDogIkJFRkQiLAoJCTIzODAzIDogIkJFRkUiLAoJCTIwNDI2IDogIkJGQTEiLAoJCTMxNDU5IDogIkJGQTIiLAoJCTI3OTk0IDogIkJGQTMiLAoJCTM3MDg5IDogIkJGQTQiLAoJCTM5NTY3IDogIkJGQTUiLAoJCTIxODg4IDogIkJGQTYiLAoJCTIxNjU0IDogIkJGQTciLAoJCTIxMzQ1IDogIkJGQTgiLAoJCTIxNjc5IDogIkJGQTkiLAoJCTI0MzIwIDogIkJGQUEiLAoJCTI1NTc3IDogIkJGQUIiLAoJCTI2OTk5IDogIkJGQUMiLAoJCTIwOTc1IDogIkJGQUQiLAoJCTI0OTM2IDogIkJGQUUiLAoJCTIxMDAyIDogIkJGQUYiLAoJCTIyNTcwIDogIkJGQjAiLAoJCTIxMjA4IDogIkJGQjEiLAoJCTIyMzUwIDogIkJGQjIiLAoJCTMwNzMzIDogIkJGQjMiLAoJCTMwNDc1IDogIkJGQjQiLAoJCTI0MjQ3IDogIkJGQjUiLAoJCTI0OTUxIDogIkJGQjYiLAoJCTMxOTY4IDogIkJGQjciLAoJCTI1MTc5IDogIkJGQjgiLAoJCTI1MjM5IDogIkJGQjkiLAoJCTIwMTMwIDogIkJGQkEiLAoJCTI4ODIxIDogIkJGQkIiLAoJCTMyNzcxIDogIkJGQkMiLAoJCTI1MzM1IDogIkJGQkQiLAoJCTI4OTAwIDogIkJGQkUiLAoJCTM4NzUyIDogIkJGQkYiLAoJCTIyMzkxIDogIkJGQzAiLAoJCTMzNDk5IDogIkJGQzEiLAoJCTI2NjA3IDogIkJGQzIiLAoJCTI2ODY5IDogIkJGQzMiLAoJCTMwOTMzIDogIkJGQzQiLAoJCTM5MDYzIDogIkJGQzUiLAoJCTMxMTg1IDogIkJGQzYiLAoJCTIyNzcxIDogIkJGQzciLAoJCTIxNjgzIDogIkJGQzgiLAoJCTIxNDg3IDogIkJGQzkiLAoJCTI4MjEyIDogIkJGQ0EiLAoJCTIwODExIDogIkJGQ0IiLAoJCTIxMDUxIDogIkJGQ0MiLAoJCTIzNDU4IDogIkJGQ0QiLAoJCTM1ODM4IDogIkJGQ0UiLAoJCTMyOTQzIDogIkJGQ0YiLAoJCTIxODI3IDogIkJGRDAiLAoJCTIyNDM4IDogIkJGRDEiLAoJCTI0NjkxIDogIkJGRDIiLAoJCTIyMzUzIDogIkJGRDMiLAoJCTIxNTQ5IDogIkJGRDQiLAoJCTMxMzU0IDogIkJGRDUiLAoJCTI0NjU2IDogIkJGRDYiLAoJCTIzMzgwIDogIkJGRDciLAoJCTI1NTExIDogIkJGRDgiLAoJCTI1MjQ4IDogIkJGRDkiLAoJCTIxNDc1IDogIkJGREEiLAoJCTI1MTg3IDogIkJGREIiLAoJCTIzNDk1IDogIkJGREMiLAoJCTI2NTQzIDogIkJGREQiLAoJCTIxNzQxIDogIkJGREUiLAoJCTMxMzkxIDogIkJGREYiLAoJCTMzNTEwIDogIkJGRTAiLAoJCTM3MjM5IDogIkJGRTEiLAoJCTI0MjExIDogIkJGRTIiLAoJCTM1MDQ0IDogIkJGRTMiLAoJCTIyODQwIDogIkJGRTQiLAoJCTIyNDQ2IDogIkJGRTUiLAoJCTI1MzU4IDogIkJGRTYiLAoJCTM2MzI4IDogIkJGRTciLAoJCTMzMDA3IDogIkJGRTgiLAoJCTIyMzU5IDogIkJGRTkiLAoJCTMxNjA3IDogIkJGRUEiLAoJCTIwMzkzIDogIkJGRUIiLAoJCTI0NTU1IDogIkJGRUMiLAoJCTIzNDg1IDogIkJGRUQiLAoJCTI3NDU0IDogIkJGRUUiLAoJCTIxMjgxIDogIkJGRUYiLAoJCTMxNTY4IDogIkJGRjAiLAoJCTI5Mzc4IDogIkJGRjEiLAoJCTI2Njk0IDogIkJGRjIiLAoJCTMwNzE5IDogIkJGRjMiLAoJCTMwNTE4IDogIkJGRjQiLAoJCTI2MTAzIDogIkJGRjUiLAoJCTIwOTE3IDogIkJGRjYiLAoJCTIwMTExIDogIkJGRjciLAoJCTMwNDIwIDogIkJGRjgiLAoJCTIzNzQzIDogIkJGRjkiLAoJCTMxMzk3IDogIkJGRkEiLAoJCTMzOTA5IDogIkJGRkIiLAoJCTIyODYyIDogIkJGRkMiLAoJCTM5NzQ1IDogIkJGRkQiLAoJCTIwNjA4IDogIkJGRkUiLAoJCTM5MzA0IDogIkMwQTEiLAoJCTI0ODcxIDogIkMwQTIiLAoJCTI4MjkxIDogIkMwQTMiLAoJCTIyMzcyIDogIkMwQTQiLAoJCTI2MTE4IDogIkMwQTUiLAoJCTI1NDE0IDogIkMwQTYiLAoJCTIyMjU2IDogIkMwQTciLAoJCTI1MzI0IDogIkMwQTgiLAoJCTI1MTkzIDogIkMwQTkiLAoJCTI0Mjc1IDogIkMwQUEiLAoJCTM4NDIwIDogIkMwQUIiLAoJCTIyNDAzIDogIkMwQUMiLAoJCTI1Mjg5IDogIkMwQUQiLAoJCTIxODk1IDogIkMwQUUiLAoJCTM0NTkzIDogIkMwQUYiLAoJCTMzMDk4IDogIkMwQjAiLAoJCTM2NzcxIDogIkMwQjEiLAoJCTIxODYyIDogIkMwQjIiLAoJCTMzNzEzIDogIkMwQjMiLAoJCTI2NDY5IDogIkMwQjQiLAoJCTM2MTgyIDogIkMwQjUiLAoJCTM0MDEzIDogIkMwQjYiLAoJCTIzMTQ2IDogIkMwQjciLAoJCTI2NjM5IDogIkMwQjgiLAoJCTI1MzE4IDogIkMwQjkiLAoJCTMxNzI2IDogIkMwQkEiLAoJCTM4NDE3IDogIkMwQkIiLAoJCTIwODQ4IDogIkMwQkMiLAoJCTI4NTcyIDogIkMwQkQiLAoJCTM1ODg4IDogIkMwQkUiLAoJCTI1NTk3IDogIkMwQkYiLAoJCTM1MjcyIDogIkMwQzAiLAoJCTI1MDQyIDogIkMwQzEiLAoJCTMyNTE4IDogIkMwQzIiLAoJCTI4ODY2IDogIkMwQzMiLAoJCTI4Mzg5IDogIkMwQzQiLAoJCTI5NzAxIDogIkMwQzUiLAoJCTI3MDI4IDogIkMwQzYiLAoJCTI5NDM2IDogIkMwQzciLAoJCTI0MjY2IDogIkMwQzgiLAoJCTM3MDcwIDogIkMwQzkiLAoJCTI2MzkxIDogIkMwQ0EiLAoJCTI4MDEwIDogIkMwQ0IiLAoJCTI1NDM4IDogIkMwQ0MiLAoJCTIxMTcxIDogIkMwQ0QiLAoJCTI5MjgyIDogIkMwQ0UiLAoJCTMyNzY5IDogIkMwQ0YiLAoJCTIwMzMyIDogIkMwRDAiLAoJCTIzMDEzIDogIkMwRDEiLAoJCTM3MjI2IDogIkMwRDIiLAoJCTI4ODg5IDogIkMwRDMiLAoJCTI4MDYxIDogIkMwRDQiLAoJCTIxMjAyIDogIkMwRDUiLAoJCTIwMDQ4IDogIkMwRDYiLAoJCTM4NjQ3IDogIkMwRDciLAoJCTM4MjUzIDogIkMwRDgiLAoJCTM0MTc0IDogIkMwRDkiLAoJCTMwOTIyIDogIkMwREEiLAoJCTMyMDQ3IDogIkMwREIiLAoJCTIwNzY5IDogIkMwREMiLAoJCTIyNDE4IDogIkMwREQiLAoJCTI1Nzk0IDogIkMwREUiLAoJCTMyOTA3IDogIkMwREYiLAoJCTMxODY3IDogIkMwRTAiLAoJCTI3ODgyIDogIkMwRTEiLAoJCTI2ODY1IDogIkMwRTIiLAoJCTI2OTc0IDogIkMwRTMiLAoJCTIwOTE5IDogIkMwRTQiLAoJCTIxNDAwIDogIkMwRTUiLAoJCTI2NzkyIDogIkMwRTYiLAoJCTI5MzEzIDogIkMwRTciLAoJCTQwNjU0IDogIkMwRTgiLAoJCTMxNzI5IDogIkMwRTkiLAoJCTI5NDMyIDogIkMwRUEiLAoJCTMxMTYzIDogIkMwRUIiLAoJCTI4NDM1IDogIkMwRUMiLAoJCTI5NzAyIDogIkMwRUQiLAoJCTI2NDQ2IDogIkMwRUUiLAoJCTM3MzI0IDogIkMwRUYiLAoJCTQwMTAwIDogIkMwRjAiLAoJCTMxMDM2IDogIkMwRjEiLAoJCTMzNjczIDogIkMwRjIiLAoJCTMzNjIwIDogIkMwRjMiLAoJCTIxNTE5IDogIkMwRjQiLAoJCTI2NjQ3IDogIkMwRjUiLAoJCTIwMDI5IDogIkMwRjYiLAoJCTIxMzg1IDogIkMwRjciLAoJCTIxMTY5IDogIkMwRjgiLAoJCTMwNzgyIDogIkMwRjkiLAoJCTIxMzgyIDogIkMwRkEiLAoJCTIxMDMzIDogIkMwRkIiLAoJCTIwNjE2IDogIkMwRkMiLAoJCTIwMzYzIDogIkMwRkQiLAoJCTIwNDMyIDogIkMwRkUiLAoJCTMwMTc4IDogIkMxQTEiLAoJCTMxNDM1IDogIkMxQTIiLAoJCTMxODkwIDogIkMxQTMiLAoJCTI3ODEzIDogIkMxQTQiLAoJCTM4NTgyIDogIkMxQTUiLAoJCTIxMTQ3IDogIkMxQTYiLAoJCTI5ODI3IDogIkMxQTciLAoJCTIxNzM3IDogIkMxQTgiLAoJCTIwNDU3IDogIkMxQTkiLAoJCTMyODUyIDogIkMxQUEiLAoJCTMzNzE0IDogIkMxQUIiLAoJCTM2ODMwIDogIkMxQUMiLAoJCTM4MjU2IDogIkMxQUQiLAoJCTI0MjY1IDogIkMxQUUiLAoJCTI0NjA0IDogIkMxQUYiLAoJCTI4MDYzIDogIkMxQjAiLAoJCTI0MDg4IDogIkMxQjEiLAoJCTI1OTQ3IDogIkMxQjIiLAoJCTMzMDgwIDogIkMxQjMiLAoJCTM4MTQyIDogIkMxQjQiLAoJCTI0NjUxIDogIkMxQjUiLAoJCTI4ODYwIDogIkMxQjYiLAoJCTMyNDUxIDogIkMxQjciLAoJCTMxOTE4IDogIkMxQjgiLAoJCTIwOTM3IDogIkMxQjkiLAoJCTI2NzUzIDogIkMxQkEiLAoJCTMxOTIxIDogIkMxQkIiLAoJCTMzMzkxIDogIkMxQkMiLAoJCTIwMDA0IDogIkMxQkQiLAoJCTM2NzQyIDogIkMxQkUiLAoJCTM3MzI3IDogIkMxQkYiLAoJCTI2MjM4IDogIkMxQzAiLAoJCTIwMTQyIDogIkMxQzEiLAoJCTM1ODQ1IDogIkMxQzIiLAoJCTI1NzY5IDogIkMxQzMiLAoJCTMyODQyIDogIkMxQzQiLAoJCTIwNjk4IDogIkMxQzUiLAoJCTMwMTAzIDogIkMxQzYiLAoJCTI5MTM0IDogIkMxQzciLAoJCTIzNTI1IDogIkMxQzgiLAoJCTM2Nzk3IDogIkMxQzkiLAoJCTI4NTE4IDogIkMxQ0EiLAoJCTIwMTAyIDogIkMxQ0IiLAoJCTI1NzMwIDogIkMxQ0MiLAoJCTM4MjQzIDogIkMxQ0QiLAoJCTI0Mjc4IDogIkMxQ0UiLAoJCTI2MDA5IDogIkMxQ0YiLAoJCTIxMDE1IDogIkMxRDAiLAoJCTM1MDEwIDogIkMxRDEiLAoJCTI4ODcyIDogIkMxRDIiLAoJCTIxMTU1IDogIkMxRDMiLAoJCTI5NDU0IDogIkMxRDQiLAoJCTI5NzQ3IDogIkMxRDUiLAoJCTI2NTE5IDogIkMxRDYiLAoJCTMwOTY3IDogIkMxRDciLAoJCTM4Njc4IDogIkMxRDgiLAoJCTIwMDIwIDogIkMxRDkiLAoJCTM3MDUxIDogIkMxREEiLAoJCTQwMTU4IDogIkMxREIiLAoJCTI4MTA3IDogIkMxREMiLAoJCTIwOTU1IDogIkMxREQiLAoJCTM2MTYxIDogIkMxREUiLAoJCTIxNTMzIDogIkMxREYiLAoJCTI1Mjk0IDogIkMxRTAiLAoJCTI5NjE4IDogIkMxRTEiLAoJCTMzNzc3IDogIkMxRTIiLAoJCTM4NjQ2IDogIkMxRTMiLAoJCTQwODM2IDogIkMxRTQiLAoJCTM4MDgzIDogIkMxRTUiLAoJCTIwMjc4IDogIkMxRTYiLAoJCTMyNjY2IDogIkMxRTciLAoJCTIwOTQwIDogIkMxRTgiLAoJCTI4Nzg5IDogIkMxRTkiLAoJCTM4NTE3IDogIkMxRUEiLAoJCTIzNzI1IDogIkMxRUIiLAoJCTM5MDQ2IDogIkMxRUMiLAoJCTIxNDc4IDogIkMxRUQiLAoJCTIwMTk2IDogIkMxRUUiLAoJCTI4MzE2IDogIkMxRUYiLAoJCTI5NzA1IDogIkMxRjAiLAoJCTI3MDYwIDogIkMxRjEiLAoJCTMwODI3IDogIkMxRjIiLAoJCTM5MzExIDogIkMxRjMiLAoJCTMwMDQxIDogIkMxRjQiLAoJCTIxMDE2IDogIkMxRjUiLAoJCTMwMjQ0IDogIkMxRjYiLAoJCTI3OTY5IDogIkMxRjciLAoJCTI2NjExIDogIkMxRjgiLAoJCTIwODQ1IDogIkMxRjkiLAoJCTQwODU3IDogIkMxRkEiLAoJCTMyODQzIDogIkMxRkIiLAoJCTIxNjU3IDogIkMxRkMiLAoJCTMxNTQ4IDogIkMxRkQiLAoJCTMxNDIzIDogIkMxRkUiLAoJCTM4NTM0IDogIkMyQTEiLAoJCTIyNDA0IDogIkMyQTIiLAoJCTI1MzE0IDogIkMyQTMiLAoJCTM4NDcxIDogIkMyQTQiLAoJCTI3MDA0IDogIkMyQTUiLAoJCTIzMDQ0IDogIkMyQTYiLAoJCTI1NjAyIDogIkMyQTciLAoJCTMxNjk5IDogIkMyQTgiLAoJCTI4NDMxIDogIkMyQTkiLAoJCTM4NDc1IDogIkMyQUEiLAoJCTMzNDQ2IDogIkMyQUIiLAoJCTIxMzQ2IDogIkMyQUMiLAoJCTM5MDQ1IDogIkMyQUQiLAoJCTI0MjA4IDogIkMyQUUiLAoJCTI4ODA5IDogIkMyQUYiLAoJCTI1NTIzIDogIkMyQjAiLAoJCTIxMzQ4IDogIkMyQjEiLAoJCTM0MzgzIDogIkMyQjIiLAoJCTQwMDY1IDogIkMyQjMiLAoJCTQwNTk1IDogIkMyQjQiLAoJCTMwODYwIDogIkMyQjUiLAoJCTM4NzA2IDogIkMyQjYiLAoJCTM2MzM1IDogIkMyQjciLAoJCTM2MTYyIDogIkMyQjgiLAoJCTQwNTc1IDogIkMyQjkiLAoJCTI4NTEwIDogIkMyQkEiLAoJCTMxMTA4IDogIkMyQkIiLAoJCTI0NDA1IDogIkMyQkMiLAoJCTM4NDcwIDogIkMyQkQiLAoJCTI1MTM0IDogIkMyQkUiLAoJCTM5NTQwIDogIkMyQkYiLAoJCTIxNTI1IDogIkMyQzAiLAoJCTM4MTA5IDogIkMyQzEiLAoJCTIwMzg3IDogIkMyQzIiLAoJCTI2MDUzIDogIkMyQzMiLAoJCTIzNjUzIDogIkMyQzQiLAoJCTIzNjQ5IDogIkMyQzUiLAoJCTMyNTMzIDogIkMyQzYiLAoJCTM0Mzg1IDogIkMyQzciLAoJCTI3Njk1IDogIkMyQzgiLAoJCTI0NDU5IDogIkMyQzkiLAoJCTI5NTc1IDogIkMyQ0EiLAoJCTI4Mzg4IDogIkMyQ0IiLAoJCTMyNTExIDogIkMyQ0MiLAoJCTIzNzgyIDogIkMyQ0QiLAoJCTI1MzcxIDogIkMyQ0UiLAoJCTIzNDAyIDogIkMyQ0YiLAoJCTI4MzkwIDogIkMyRDAiLAoJCTIxMzY1IDogIkMyRDEiLAoJCTIwMDgxIDogIkMyRDIiLAoJCTI1NTA0IDogIkMyRDMiLAoJCTMwMDUzIDogIkMyRDQiLAoJCTI1MjQ5IDogIkMyRDUiLAoJCTM2NzE4IDogIkMyRDYiLAoJCTIwMjYyIDogIkMyRDciLAoJCTIwMTc3IDogIkMyRDgiLAoJCTI3ODE0IDogIkMyRDkiLAoJCTMyNDM4IDogIkMyREEiLAoJCTM1NzcwIDogIkMyREIiLAoJCTMzODIxIDogIkMyREMiLAoJCTM0NzQ2IDogIkMyREQiLAoJCTMyNTk5IDogIkMyREUiLAoJCTM2OTIzIDogIkMyREYiLAoJCTM4MTc5IDogIkMyRTAiLAoJCTMxNjU3IDogIkMyRTEiLAoJCTM5NTg1IDogIkMyRTIiLAoJCTM1MDY0IDogIkMyRTMiLAoJCTMzODUzIDogIkMyRTQiLAoJCTI3OTMxIDogIkMyRTUiLAoJCTM5NTU4IDogIkMyRTYiLAoJCTMyNDc2IDogIkMyRTciLAoJCTIyOTIwIDogIkMyRTgiLAoJCTQwNjM1IDogIkMyRTkiLAoJCTI5NTk1IDogIkMyRUEiLAoJCTMwNzIxIDogIkMyRUIiLAoJCTM0NDM0IDogIkMyRUMiLAoJCTM5NTMyIDogIkMyRUQiLAoJCTM5NTU0IDogIkMyRUUiLAoJCTIyMDQzIDogIkMyRUYiLAoJCTIxNTI3IDogIkMyRjAiLAoJCTIyNDc1IDogIkMyRjEiLAoJCTIwMDgwIDogIkMyRjIiLAoJCTQwNjE0IDogIkMyRjMiLAoJCTIxMzM0IDogIkMyRjQiLAoJCTM2ODA4IDogIkMyRjUiLAoJCTMzMDMzIDogIkMyRjYiLAoJCTMwNjEwIDogIkMyRjciLAoJCTM5MzE0IDogIkMyRjgiLAoJCTM0NTQyIDogIkMyRjkiLAoJCTI4Mzg1IDogIkMyRkEiLAoJCTM0MDY3IDogIkMyRkIiLAoJCTI2MzY0IDogIkMyRkMiLAoJCTI0OTMwIDogIkMyRkQiLAoJCTI4NDU5IDogIkMyRkUiLAoJCTM1ODgxIDogIkMzQTEiLAoJCTMzNDI2IDogIkMzQTIiLAoJCTMzNTc5IDogIkMzQTMiLAoJCTMwNDUwIDogIkMzQTQiLAoJCTI3NjY3IDogIkMzQTUiLAoJCTI0NTM3IDogIkMzQTYiLAoJCTMzNzI1IDogIkMzQTciLAoJCTI5NDgzIDogIkMzQTgiLAoJCTMzNTQxIDogIkMzQTkiLAoJCTM4MTcwIDogIkMzQUEiLAoJCTI3NjExIDogIkMzQUIiLAoJCTMwNjgzIDogIkMzQUMiLAoJCTM4MDg2IDogIkMzQUQiLAoJCTIxMzU5IDogIkMzQUUiLAoJCTMzNTM4IDogIkMzQUYiLAoJCTIwODgyIDogIkMzQjAiLAoJCTI0MTI1IDogIkMzQjEiLAoJCTM1OTgwIDogIkMzQjIiLAoJCTM2MTUyIDogIkMzQjMiLAoJCTIwMDQwIDogIkMzQjQiLAoJCTI5NjExIDogIkMzQjUiLAoJCTI2NTIyIDogIkMzQjYiLAoJCTI2NzU3IDogIkMzQjciLAoJCTM3MjM4IDogIkMzQjgiLAoJCTM4NjY1IDogIkMzQjkiLAoJCTI5MDI4IDogIkMzQkEiLAoJCTI3ODA5IDogIkMzQkIiLAoJCTMwNDczIDogIkMzQkMiLAoJCTIzMTg2IDogIkMzQkQiLAoJCTM4MjA5IDogIkMzQkUiLAoJCTI3NTk5IDogIkMzQkYiLAoJCTMyNjU0IDogIkMzQzAiLAoJCTI2MTUxIDogIkMzQzEiLAoJCTIzNTA0IDogIkMzQzIiLAoJCTIyOTY5IDogIkMzQzMiLAoJCTIzMTk0IDogIkMzQzQiLAoJCTM4Mzc2IDogIkMzQzUiLAoJCTM4MzkxIDogIkMzQzYiLAoJCTIwMjA0IDogIkMzQzciLAoJCTMzODA0IDogIkMzQzgiLAoJCTMzOTQ1IDogIkMzQzkiLAoJCTI3MzA4IDogIkMzQ0EiLAoJCTMwNDMxIDogIkMzQ0IiLAoJCTM4MTkyIDogIkMzQ0MiLAoJCTI5NDY3IDogIkMzQ0QiLAoJCTI2NzkwIDogIkMzQ0UiLAoJCTIzMzkxIDogIkMzQ0YiLAoJCTMwNTExIDogIkMzRDAiLAoJCTM3Mjc0IDogIkMzRDEiLAoJCTM4NzUzIDogIkMzRDIiLAoJCTMxOTY0IDogIkMzRDMiLAoJCTM2ODU1IDogIkMzRDQiLAoJCTM1ODY4IDogIkMzRDUiLAoJCTI0MzU3IDogIkMzRDYiLAoJCTMxODU5IDogIkMzRDciLAoJCTMxMTkyIDogIkMzRDgiLAoJCTM1MjY5IDogIkMzRDkiLAoJCTI3ODUyIDogIkMzREEiLAoJCTM0NTg4IDogIkMzREIiLAoJCTIzNDk0IDogIkMzREMiLAoJCTI0MTMwIDogIkMzREQiLAoJCTI2ODI1IDogIkMzREUiLAoJCTMwNDk2IDogIkMzREYiLAoJCTMyNTAxIDogIkMzRTAiLAoJCTIwODg1IDogIkMzRTEiLAoJCTIwODEzIDogIkMzRTIiLAoJCTIxMTkzIDogIkMzRTMiLAoJCTIzMDgxIDogIkMzRTQiLAoJCTMyNTE3IDogIkMzRTUiLAoJCTM4NzU0IDogIkMzRTYiLAoJCTMzNDk1IDogIkMzRTciLAoJCTI1NTUxIDogIkMzRTgiLAoJCTMwNTk2IDogIkMzRTkiLAoJCTM0MjU2IDogIkMzRUEiLAoJCTMxMTg2IDogIkMzRUIiLAoJCTI4MjE4IDogIkMzRUMiLAoJCTI0MjE3IDogIkMzRUQiLAoJCTIyOTM3IDogIkMzRUUiLAoJCTM0MDY1IDogIkMzRUYiLAoJCTI4NzgxIDogIkMzRjAiLAoJCTI3NjY1IDogIkMzRjEiLAoJCTI1Mjc5IDogIkMzRjIiLAoJCTMwMzk5IDogIkMzRjMiLAoJCTI1OTM1IDogIkMzRjQiLAoJCTI0NzUxIDogIkMzRjUiLAoJCTM4Mzk3IDogIkMzRjYiLAoJCTI2MTI2IDogIkMzRjciLAoJCTM0NzE5IDogIkMzRjgiLAoJCTQwNDgzIDogIkMzRjkiLAoJCTM4MTI1IDogIkMzRkEiLAoJCTIxNTE3IDogIkMzRkIiLAoJCTIxNjI5IDogIkMzRkMiLAoJCTM1ODg0IDogIkMzRkQiLAoJCTI1NzIwIDogIkMzRkUiLAoJCTI1NzIxIDogIkM0QTEiLAoJCTM0MzIxIDogIkM0QTIiLAoJCTI3MTY5IDogIkM0QTMiLAoJCTMzMTgwIDogIkM0QTQiLAoJCTMwOTUyIDogIkM0QTUiLAoJCTI1NzA1IDogIkM0QTYiLAoJCTM5NzY0IDogIkM0QTciLAoJCTI1MjczIDogIkM0QTgiLAoJCTI2NDExIDogIkM0QTkiLAoJCTMzNzA3IDogIkM0QUEiLAoJCTIyNjk2IDogIkM0QUIiLAoJCTQwNjY0IDogIkM0QUMiLAoJCTI3ODE5IDogIkM0QUQiLAoJCTI4NDQ4IDogIkM0QUUiLAoJCTIzNTE4IDogIkM0QUYiLAoJCTM4NDc2IDogIkM0QjAiLAoJCTM1ODUxIDogIkM0QjEiLAoJCTI5Mjc5IDogIkM0QjIiLAoJCTI2NTc2IDogIkM0QjMiLAoJCTI1Mjg3IDogIkM0QjQiLAoJCTI5MjgxIDogIkM0QjUiLAoJCTIwMTM3IDogIkM0QjYiLAoJCTIyOTgyIDogIkM0QjciLAoJCTI3NTk3IDogIkM0QjgiLAoJCTIyNjc1IDogIkM0QjkiLAoJCTI2Mjg2IDogIkM0QkEiLAoJCTI0MTQ5IDogIkM0QkIiLAoJCTIxMjE1IDogIkM0QkMiLAoJCTI0OTE3IDogIkM0QkQiLAoJCTI2NDA4IDogIkM0QkUiLAoJCTMwNDQ2IDogIkM0QkYiLAoJCTMwNTY2IDogIkM0QzAiLAoJCTI5Mjg3IDogIkM0QzEiLAoJCTMxMzAyIDogIkM0QzIiLAoJCTI1MzQzIDogIkM0QzMiLAoJCTIxNzM4IDogIkM0QzQiLAoJCTIxNTg0IDogIkM0QzUiLAoJCTM4MDQ4IDogIkM0QzYiLAoJCTM3MDI3IDogIkM0QzciLAoJCTIzMDY4IDogIkM0QzgiLAoJCTMyNDM1IDogIkM0QzkiLAoJCTI3NjcwIDogIkM0Q0EiLAoJCTIwMDM1IDogIkM0Q0IiLAoJCTIyOTAyIDogIkM0Q0MiLAoJCTMyNzg0IDogIkM0Q0QiLAoJCTIyODU2IDogIkM0Q0UiLAoJCTIxMzM1IDogIkM0Q0YiLAoJCTMwMDA3IDogIkM0RDAiLAoJCTM4NTkwIDogIkM0RDEiLAoJCTIyMjE4IDogIkM0RDIiLAoJCTI1Mzc2IDogIkM0RDMiLAoJCTMzMDQxIDogIkM0RDQiLAoJCTI0NzAwIDogIkM0RDUiLAoJCTM4MzkzIDogIkM0RDYiLAoJCTI4MTE4IDogIkM0RDciLAoJCTIxNjAyIDogIkM0RDgiLAoJCTM5Mjk3IDogIkM0RDkiLAoJCTIwODY5IDogIkM0REEiLAoJCTIzMjczIDogIkM0REIiLAoJCTMzMDIxIDogIkM0REMiLAoJCTIyOTU4IDogIkM0REQiLAoJCTM4Njc1IDogIkM0REUiLAoJCTIwNTIyIDogIkM0REYiLAoJCTI3ODc3IDogIkM0RTAiLAoJCTIzNjEyIDogIkM0RTEiLAoJCTI1MzExIDogIkM0RTIiLAoJCTIwMzIwIDogIkM0RTMiLAoJCTIxMzExIDogIkM0RTQiLAoJCTMzMTQ3IDogIkM0RTUiLAoJCTM2ODcwIDogIkM0RTYiLAoJCTI4MzQ2IDogIkM0RTciLAoJCTM0MDkxIDogIkM0RTgiLAoJCTI1Mjg4IDogIkM0RTkiLAoJCTI0MTgwIDogIkM0RUEiLAoJCTMwOTEwIDogIkM0RUIiLAoJCTI1NzgxIDogIkM0RUMiLAoJCTI1NDY3IDogIkM0RUQiLAoJCTI0NTY1IDogIkM0RUUiLAoJCTIzMDY0IDogIkM0RUYiLAoJCTM3MjQ3IDogIkM0RjAiLAoJCTQwNDc5IDogIkM0RjEiLAoJCTIzNjE1IDogIkM0RjIiLAoJCTI1NDIzIDogIkM0RjMiLAoJCTMyODM0IDogIkM0RjQiLAoJCTIzNDIxIDogIkM0RjUiLAoJCTIxODcwIDogIkM0RjYiLAoJCTM4MjE4IDogIkM0RjciLAoJCTM4MjIxIDogIkM0RjgiLAoJCTI4MDM3IDogIkM0RjkiLAoJCTI0NzQ0IDogIkM0RkEiLAoJCTI2NTkyIDogIkM0RkIiLAoJCTI5NDA2IDogIkM0RkMiLAoJCTIwOTU3IDogIkM0RkQiLAoJCTIzNDI1IDogIkM0RkUiLAoJCTI1MzE5IDogIkM1QTEiLAoJCTI3ODcwIDogIkM1QTIiLAoJCTI5Mjc1IDogIkM1QTMiLAoJCTI1MTk3IDogIkM1QTQiLAoJCTM4MDYyIDogIkM1QTUiLAoJCTMyNDQ1IDogIkM1QTYiLAoJCTMzMDQzIDogIkM1QTciLAoJCTI3OTg3IDogIkM1QTgiLAoJCTIwODkyIDogIkM1QTkiLAoJCTI0MzI0IDogIkM1QUEiLAoJCTIyOTAwIDogIkM1QUIiLAoJCTIxMTYyIDogIkM1QUMiLAoJCTI0NTk0IDogIkM1QUQiLAoJCTIyODk5IDogIkM1QUUiLAoJCTI2MjYyIDogIkM1QUYiLAoJCTM0Mzg0IDogIkM1QjAiLAoJCTMwMTExIDogIkM1QjEiLAoJCTI1Mzg2IDogIkM1QjIiLAoJCTI1MDYyIDogIkM1QjMiLAoJCTMxOTgzIDogIkM1QjQiLAoJCTM1ODM0IDogIkM1QjUiLAoJCTIxNzM0IDogIkM1QjYiLAoJCTI3NDMxIDogIkM1QjciLAoJCTQwNDg1IDogIkM1QjgiLAoJCTI3NTcyIDogIkM1QjkiLAoJCTM0MjYxIDogIkM1QkEiLAoJCTIxNTg5IDogIkM1QkIiLAoJCTIwNTk4IDogIkM1QkMiLAoJCTI3ODEyIDogIkM1QkQiLAoJCTIxODY2IDogIkM1QkUiLAoJCTM2Mjc2IDogIkM1QkYiLAoJCTI5MjI4IDogIkM1QzAiLAoJCTI0MDg1IDogIkM1QzEiLAoJCTI0NTk3IDogIkM1QzIiLAoJCTI5NzUwIDogIkM1QzMiLAoJCTI1MjkzIDogIkM1QzQiLAoJCTI1NDkwIDogIkM1QzUiLAoJCTI5MjYwIDogIkM1QzYiLAoJCTI0NDcyIDogIkM1QzciLAoJCTI4MjI3IDogIkM1QzgiLAoJCTI3OTY2IDogIkM1QzkiLAoJCTI1ODU2IDogIkM1Q0EiLAoJCTI4NTA0IDogIkM1Q0IiLAoJCTMwNDI0IDogIkM1Q0MiLAoJCTMwOTI4IDogIkM1Q0QiLAoJCTMwNDYwIDogIkM1Q0UiLAoJCTMwMDM2IDogIkM1Q0YiLAoJCTIxMDI4IDogIkM1RDAiLAoJCTIxNDY3IDogIkM1RDEiLAoJCTIwMDUxIDogIkM1RDIiLAoJCTI0MjIyIDogIkM1RDMiLAoJCTI2MDQ5IDogIkM1RDQiLAoJCTMyODEwIDogIkM1RDUiLAoJCTMyOTgyIDogIkM1RDYiLAoJCTI1MjQzIDogIkM1RDciLAoJCTIxNjM4IDogIkM1RDgiLAoJCTIxMDMyIDogIkM1RDkiLAoJCTI4ODQ2IDogIkM1REEiLAoJCTM0OTU3IDogIkM1REIiLAoJCTM2MzA1IDogIkM1REMiLAoJCTI3ODczIDogIkM1REQiLAoJCTIxNjI0IDogIkM1REUiLAoJCTMyOTg2IDogIkM1REYiLAoJCTIyNTIxIDogIkM1RTAiLAoJCTM1MDYwIDogIkM1RTEiLAoJCTM2MTgwIDogIkM1RTIiLAoJCTM4NTA2IDogIkM1RTMiLAoJCTM3MTk3IDogIkM1RTQiLAoJCTIwMzI5IDogIkM1RTUiLAoJCTI3ODAzIDogIkM1RTYiLAoJCTIxOTQzIDogIkM1RTciLAoJCTMwNDA2IDogIkM1RTgiLAoJCTMwNzY4IDogIkM1RTkiLAoJCTI1MjU2IDogIkM1RUEiLAoJCTI4OTIxIDogIkM1RUIiLAoJCTI4NTU4IDogIkM1RUMiLAoJCTI0NDI5IDogIkM1RUQiLAoJCTM0MDI4IDogIkM1RUUiLAoJCTI2ODQyIDogIkM1RUYiLAoJCTMwODQ0IDogIkM1RjAiLAoJCTMxNzM1IDogIkM1RjEiLAoJCTMzMTkyIDogIkM1RjIiLAoJCTI2Mzc5IDogIkM1RjMiLAoJCTQwNTI3IDogIkM1RjQiLAoJCTI1NDQ3IDogIkM1RjUiLAoJCTMwODk2IDogIkM1RjYiLAoJCTIyMzgzIDogIkM1RjciLAoJCTMwNzM4IDogIkM1RjgiLAoJCTM4NzEzIDogIkM1RjkiLAoJCTI1MjA5IDogIkM1RkEiLAoJCTI1MjU5IDogIkM1RkIiLAoJCTIxMTI4IDogIkM1RkMiLAoJCTI5NzQ5IDogIkM1RkQiLAoJCTI3NjA3IDogIkM1RkUiLAoJCTIxODYwIDogIkM2QTEiLAoJCTMzMDg2IDogIkM2QTIiLAoJCTMwMTMwIDogIkM2QTMiLAoJCTMwMzgyIDogIkM2QTQiLAoJCTIxMzA1IDogIkM2QTUiLAoJCTMwMTc0IDogIkM2QTYiLAoJCTIwNzMxIDogIkM2QTciLAoJCTIzNjE3IDogIkM2QTgiLAoJCTM1NjkyIDogIkM2QTkiLAoJCTMxNjg3IDogIkM2QUEiLAoJCTIwNTU5IDogIkM2QUIiLAoJCTI5MjU1IDogIkM2QUMiLAoJCTM5NTc1IDogIkM2QUQiLAoJCTM5MTI4IDogIkM2QUUiLAoJCTI4NDE4IDogIkM2QUYiLAoJCTI5OTIyIDogIkM2QjAiLAoJCTMxMDgwIDogIkM2QjEiLAoJCTI1NzM1IDogIkM2QjIiLAoJCTMwNjI5IDogIkM2QjMiLAoJCTI1MzQwIDogIkM2QjQiLAoJCTM5MDU3IDogIkM2QjUiLAoJCTM2MTM5IDogIkM2QjYiLAoJCTIxNjk3IDogIkM2QjciLAoJCTMyODU2IDogIkM2QjgiLAoJCTIwMDUwIDogIkM2QjkiLAoJCTIyMzc4IDogIkM2QkEiLAoJCTMzNTI5IDogIkM2QkIiLAoJCTMzODA1IDogIkM2QkMiLAoJCTI0MTc5IDogIkM2QkQiLAoJCTIwOTczIDogIkM2QkUiLAoJCTI5OTQyIDogIkM2QkYiLAoJCTM1NzgwIDogIkM2QzAiLAoJCTIzNjMxIDogIkM2QzEiLAoJCTIyMzY5IDogIkM2QzIiLAoJCTI3OTAwIDogIkM2QzMiLAoJCTM5MDQ3IDogIkM2QzQiLAoJCTIzMTEwIDogIkM2QzUiLAoJCTMwNzcyIDogIkM2QzYiLAoJCTM5NzQ4IDogIkM2QzciLAoJCTM2ODQzIDogIkM2QzgiLAoJCTMxODkzIDogIkM2QzkiLAoJCTIxMDc4IDogIkM2Q0EiLAoJCTI1MTY5IDogIkM2Q0IiLAoJCTM4MTM4IDogIkM2Q0MiLAoJCTIwMTY2IDogIkM2Q0QiLAoJCTMzNjcwIDogIkM2Q0UiLAoJCTMzODg5IDogIkM2Q0YiLAoJCTMzNzY5IDogIkM2RDAiLAoJCTMzOTcwIDogIkM2RDEiLAoJCTIyNDg0IDogIkM2RDIiLAoJCTI2NDIwIDogIkM2RDMiLAoJCTIyMjc1IDogIkM2RDQiLAoJCTI2MjIyIDogIkM2RDUiLAoJCTI4MDA2IDogIkM2RDYiLAoJCTM1ODg5IDogIkM2RDciLAoJCTI2MzMzIDogIkM2RDgiLAoJCTI4Njg5IDogIkM2RDkiLAoJCTI2Mzk5IDogIkM2REEiLAoJCTI3NDUwIDogIkM2REIiLAoJCTI2NjQ2IDogIkM2REMiLAoJCTI1MTE0IDogIkM2REQiLAoJCTIyOTcxIDogIkM2REUiLAoJCTE5OTcxIDogIkM2REYiLAoJCTIwOTMyIDogIkM2RTAiLAoJCTI4NDIyIDogIkM2RTEiLAoJCTI2NTc4IDogIkM2RTIiLAoJCTI3NzkxIDogIkM2RTMiLAoJCTIwODU0IDogIkM2RTQiLAoJCTI2ODI3IDogIkM2RTUiLAoJCTIyODU1IDogIkM2RTYiLAoJCTI3NDk1IDogIkM2RTciLAoJCTMwMDU0IDogIkM2RTgiLAoJCTIzODIyIDogIkM2RTkiLAoJCTMzMDQwIDogIkM2RUEiLAoJCTQwNzg0IDogIkM2RUIiLAoJCTI2MDcxIDogIkM2RUMiLAoJCTMxMDQ4IDogIkM2RUQiLAoJCTMxMDQxIDogIkM2RUUiLAoJCTM5NTY5IDogIkM2RUYiLAoJCTM2MjE1IDogIkM2RjAiLAoJCTIzNjgyIDogIkM2RjEiLAoJCTIwMDYyIDogIkM2RjIiLAoJCTIwMjI1IDogIkM2RjMiLAoJCTIxNTUxIDogIkM2RjQiLAoJCTIyODY1IDogIkM2RjUiLAoJCTMwNzMyIDogIkM2RjYiLAoJCTIyMTIwIDogIkM2RjciLAoJCTI3NjY4IDogIkM2RjgiLAoJCTM2ODA0IDogIkM2RjkiLAoJCTI0MzIzIDogIkM2RkEiLAoJCTI3NzczIDogIkM2RkIiLAoJCTI3ODc1IDogIkM2RkMiLAoJCTM1NzU1IDogIkM2RkQiLAoJCTI1NDg4IDogIkM2RkUiLAoJCTI0Njg4IDogIkM3QTEiLAoJCTI3OTY1IDogIkM3QTIiLAoJCTI5MzAxIDogIkM3QTMiLAoJCTI1MTkwIDogIkM3QTQiLAoJCTM4MDMwIDogIkM3QTUiLAoJCTM4MDg1IDogIkM3QTYiLAoJCTIxMzE1IDogIkM3QTciLAoJCTM2ODAxIDogIkM3QTgiLAoJCTMxNjE0IDogIkM3QTkiLAoJCTIwMTkxIDogIkM3QUEiLAoJCTM1ODc4IDogIkM3QUIiLAoJCTIwMDk0IDogIkM3QUMiLAoJCTQwNjYwIDogIkM3QUQiLAoJCTM4MDY1IDogIkM3QUUiLAoJCTM4MDY3IDogIkM3QUYiLAoJCTIxMDY5IDogIkM3QjAiLAoJCTI4NTA4IDogIkM3QjEiLAoJCTM2OTYzIDogIkM3QjIiLAoJCTI3OTczIDogIkM3QjMiLAoJCTM1ODkyIDogIkM3QjQiLAoJCTIyNTQ1IDogIkM3QjUiLAoJCTIzODg0IDogIkM3QjYiLAoJCTI3NDI0IDogIkM3QjciLAoJCTI3NDY1IDogIkM3QjgiLAoJCTI2NTM4IDogIkM3QjkiLAoJCTIxNTk1IDogIkM3QkEiLAoJCTMzMTA4IDogIkM3QkIiLAoJCTMyNjUyIDogIkM3QkMiLAoJCTIyNjgxIDogIkM3QkQiLAoJCTM0MTAzIDogIkM3QkUiLAoJCTI0Mzc4IDogIkM3QkYiLAoJCTI1MjUwIDogIkM3QzAiLAoJCTI3MjA3IDogIkM3QzEiLAoJCTM4MjAxIDogIkM3QzIiLAoJCTI1OTcwIDogIkM3QzMiLAoJCTI0NzA4IDogIkM3QzQiLAoJCTI2NzI1IDogIkM3QzUiLAoJCTMwNjMxIDogIkM3QzYiLAoJCTIwMDUyIDogIkM3QzciLAoJCTIwMzkyIDogIkM3QzgiLAoJCTI0MDM5IDogIkM3QzkiLAoJCTM4ODA4IDogIkM3Q0EiLAoJCTI1NzcyIDogIkM3Q0IiLAoJCTMyNzI4IDogIkM3Q0MiLAoJCTIzNzg5IDogIkM3Q0QiLAoJCTIwNDMxIDogIkM3Q0UiLAoJCTMxMzczIDogIkM3Q0YiLAoJCTIwOTk5IDogIkM3RDAiLAoJCTMzNTQwIDogIkM3RDEiLAoJCTE5OTg4IDogIkM3RDIiLAoJCTI0NjIzIDogIkM3RDMiLAoJCTMxMzYzIDogIkM3RDQiLAoJCTM4MDU0IDogIkM3RDUiLAoJCTIwNDA1IDogIkM3RDYiLAoJCTIwMTQ2IDogIkM3RDciLAoJCTMxMjA2IDogIkM3RDgiLAoJCTI5NzQ4IDogIkM3RDkiLAoJCTIxMjIwIDogIkM3REEiLAoJCTMzNDY1IDogIkM3REIiLAoJCTI1ODEwIDogIkM3REMiLAoJCTMxMTY1IDogIkM3REQiLAoJCTIzNTE3IDogIkM3REUiLAoJCTI3Nzc3IDogIkM3REYiLAoJCTM4NzM4IDogIkM3RTAiLAoJCTM2NzMxIDogIkM3RTEiLAoJCTI3NjgyIDogIkM3RTIiLAoJCTIwNTQyIDogIkM3RTMiLAoJCTIxMzc1IDogIkM3RTQiLAoJCTI4MTY1IDogIkM3RTUiLAoJCTI1ODA2IDogIkM3RTYiLAoJCTI2MjI4IDogIkM3RTciLAoJCTI3Njk2IDogIkM3RTgiLAoJCTI0NzczIDogIkM3RTkiLAoJCTM5MDMxIDogIkM3RUEiLAoJCTM1ODMxIDogIkM3RUIiLAoJCTI0MTk4IDogIkM3RUMiLAoJCTI5NzU2IDogIkM3RUQiLAoJCTMxMzUxIDogIkM3RUUiLAoJCTMxMTc5IDogIkM3RUYiLAoJCTE5OTkyIDogIkM3RjAiLAoJCTM3MDQxIDogIkM3RjEiLAoJCTI5Njk5IDogIkM3RjIiLAoJCTI3NzE0IDogIkM3RjMiLAoJCTIyMjM0IDogIkM3RjQiLAoJCTM3MTk1IDogIkM3RjUiLAoJCTI3ODQ1IDogIkM3RjYiLAoJCTM2MjM1IDogIkM3RjciLAoJCTIxMzA2IDogIkM3RjgiLAoJCTM0NTAyIDogIkM3RjkiLAoJCTI2MzU0IDogIkM3RkEiLAoJCTM2NTI3IDogIkM3RkIiLAoJCTIzNjI0IDogIkM3RkMiLAoJCTM5NTM3IDogIkM3RkQiLAoJCTI4MTkyIDogIkM3RkUiLAoJCTIxNDYyIDogIkM4QTEiLAoJCTIzMDk0IDogIkM4QTIiLAoJCTQwODQzIDogIkM4QTMiLAoJCTM2MjU5IDogIkM4QTQiLAoJCTIxNDM1IDogIkM4QTUiLAoJCTIyMjgwIDogIkM4QTYiLAoJCTM5MDc5IDogIkM4QTciLAoJCTI2NDM1IDogIkM4QTgiLAoJCTM3Mjc1IDogIkM4QTkiLAoJCTI3ODQ5IDogIkM4QUEiLAoJCTIwODQwIDogIkM4QUIiLAoJCTMwMTU0IDogIkM4QUMiLAoJCTI1MzMxIDogIkM4QUQiLAoJCTI5MzU2IDogIkM4QUUiLAoJCTIxMDQ4IDogIkM4QUYiLAoJCTIxMTQ5IDogIkM4QjAiLAoJCTMyNTcwIDogIkM4QjEiLAoJCTI4ODIwIDogIkM4QjIiLAoJCTMwMjY0IDogIkM4QjMiLAoJCTIxMzY0IDogIkM4QjQiLAoJCTQwNTIyIDogIkM4QjUiLAoJCTI3MDYzIDogIkM4QjYiLAoJCTMwODMwIDogIkM4QjciLAoJCTM4NTkyIDogIkM4QjgiLAoJCTM1MDMzIDogIkM4QjkiLAoJCTMyNjc2IDogIkM4QkEiLAoJCTI4OTgyIDogIkM4QkIiLAoJCTI5MTIzIDogIkM4QkMiLAoJCTIwODczIDogIkM4QkQiLAoJCTI2NTc5IDogIkM4QkUiLAoJCTI5OTI0IDogIkM4QkYiLAoJCTIyNzU2IDogIkM4QzAiLAoJCTI1ODgwIDogIkM4QzEiLAoJCTIyMTk5IDogIkM4QzIiLAoJCTM1NzUzIDogIkM4QzMiLAoJCTM5Mjg2IDogIkM4QzQiLAoJCTI1MjAwIDogIkM4QzUiLAoJCTMyNDY5IDogIkM4QzYiLAoJCTI0ODI1IDogIkM4QzciLAoJCTI4OTA5IDogIkM4QzgiLAoJCTIyNzY0IDogIkM4QzkiLAoJCTIwMTYxIDogIkM4Q0EiLAoJCTIwMTU0IDogIkM4Q0IiLAoJCTI0NTI1IDogIkM4Q0MiLAoJCTM4ODg3IDogIkM4Q0QiLAoJCTIwMjE5IDogIkM4Q0UiLAoJCTM1NzQ4IDogIkM4Q0YiLAoJCTIwOTk1IDogIkM4RDAiLAoJCTIyOTIyIDogIkM4RDEiLAoJCTMyNDI3IDogIkM4RDIiLAoJCTI1MTcyIDogIkM4RDMiLAoJCTIwMTczIDogIkM4RDQiLAoJCTI2MDg1IDogIkM4RDUiLAoJCTI1MTAyIDogIkM4RDYiLAoJCTMzNTkyIDogIkM4RDciLAoJCTMzOTkzIDogIkM4RDgiLAoJCTMzNjM1IDogIkM4RDkiLAoJCTM0NzAxIDogIkM4REEiLAoJCTI5MDc2IDogIkM4REIiLAoJCTI4MzQyIDogIkM4REMiLAoJCTIzNDgxIDogIkM4REQiLAoJCTMyNDY2IDogIkM4REUiLAoJCTIwODg3IDogIkM4REYiLAoJCTI1NTQ1IDogIkM4RTAiLAoJCTI2NTgwIDogIkM4RTEiLAoJCTMyOTA1IDogIkM4RTIiLAoJCTMzNTkzIDogIkM4RTMiLAoJCTM0ODM3IDogIkM4RTQiLAoJCTIwNzU0IDogIkM4RTUiLAoJCTIzNDE4IDogIkM4RTYiLAoJCTIyOTE0IDogIkM4RTciLAoJCTM2Nzg1IDogIkM4RTgiLAoJCTIwMDgzIDogIkM4RTkiLAoJCTI3NzQxIDogIkM4RUEiLAoJCTIwODM3IDogIkM4RUIiLAoJCTM1MTA5IDogIkM4RUMiLAoJCTM2NzE5IDogIkM4RUQiLAoJCTM4NDQ2IDogIkM4RUUiLAoJCTM0MTIyIDogIkM4RUYiLAoJCTI5NzkwIDogIkM4RjAiLAoJCTM4MTYwIDogIkM4RjEiLAoJCTM4Mzg0IDogIkM4RjIiLAoJCTI4MDcwIDogIkM4RjMiLAoJCTMzNTA5IDogIkM4RjQiLAoJCTI0MzY5IDogIkM4RjUiLAoJCTI1NzQ2IDogIkM4RjYiLAoJCTI3OTIyIDogIkM4RjciLAoJCTMzODMyIDogIkM4RjgiLAoJCTMzMTM0IDogIkM4RjkiLAoJCTQwMTMxIDogIkM4RkEiLAoJCTIyNjIyIDogIkM4RkIiLAoJCTM2MTg3IDogIkM4RkMiLAoJCTE5OTc3IDogIkM4RkQiLAoJCTIxNDQxIDogIkM4RkUiLAoJCTIwMjU0IDogIkM5QTEiLAoJCTI1OTU1IDogIkM5QTIiLAoJCTI2NzA1IDogIkM5QTMiLAoJCTIxOTcxIDogIkM5QTQiLAoJCTIwMDA3IDogIkM5QTUiLAoJCTI1NjIwIDogIkM5QTYiLAoJCTM5NTc4IDogIkM5QTciLAoJCTI1MTk1IDogIkM5QTgiLAoJCTIzMjM0IDogIkM5QTkiLAoJCTI5NzkxIDogIkM5QUEiLAoJCTMzMzk0IDogIkM5QUIiLAoJCTI4MDczIDogIkM5QUMiLAoJCTI2ODYyIDogIkM5QUQiLAoJCTIwNzExIDogIkM5QUUiLAoJCTMzNjc4IDogIkM5QUYiLAoJCTMwNzIyIDogIkM5QjAiLAoJCTI2NDMyIDogIkM5QjEiLAoJCTIxMDQ5IDogIkM5QjIiLAoJCTI3ODAxIDogIkM5QjMiLAoJCTMyNDMzIDogIkM5QjQiLAoJCTIwNjY3IDogIkM5QjUiLAoJCTIxODYxIDogIkM5QjYiLAoJCTI5MDIyIDogIkM5QjciLAoJCTMxNTc5IDogIkM5QjgiLAoJCTI2MTk0IDogIkM5QjkiLAoJCTI5NjQyIDogIkM5QkEiLAoJCTMzNTE1IDogIkM5QkIiLAoJCTI2NDQxIDogIkM5QkMiLAoJCTIzNjY1IDogIkM5QkQiLAoJCTIxMDI0IDogIkM5QkUiLAoJCTI5MDUzIDogIkM5QkYiLAoJCTM0OTIzIDogIkM5QzAiLAoJCTM4Mzc4IDogIkM5QzEiLAoJCTM4NDg1IDogIkM5QzIiLAoJCTI1Nzk3IDogIkM5QzMiLAoJCTM2MTkzIDogIkM5QzQiLAoJCTMzMjAzIDogIkM5QzUiLAoJCTIxODkyIDogIkM5QzYiLAoJCTI3NzMzIDogIkM5QzciLAoJCTI1MTU5IDogIkM5QzgiLAoJCTMyNTU4IDogIkM5QzkiLAoJCTIyNjc0IDogIkM5Q0EiLAoJCTIwMjYwIDogIkM5Q0IiLAoJCTIxODMwIDogIkM5Q0MiLAoJCTM2MTc1IDogIkM5Q0QiLAoJCTI2MTg4IDogIkM5Q0UiLAoJCTE5OTc4IDogIkM5Q0YiLAoJCTIzNTc4IDogIkM5RDAiLAoJCTM1MDU5IDogIkM5RDEiLAoJCTI2Nzg2IDogIkM5RDIiLAoJCTI1NDIyIDogIkM5RDMiLAoJCTMxMjQ1IDogIkM5RDQiLAoJCTI4OTAzIDogIkM5RDUiLAoJCTMzNDIxIDogIkM5RDYiLAoJCTIxMjQyIDogIkM5RDciLAoJCTM4OTAyIDogIkM5RDgiLAoJCTIzNTY5IDogIkM5RDkiLAoJCTIxNzM2IDogIkM5REEiLAoJCTM3MDQ1IDogIkM5REIiLAoJCTMyNDYxIDogIkM5REMiLAoJCTIyODgyIDogIkM5REQiLAoJCTM2MTcwIDogIkM5REUiLAoJCTM0NTAzIDogIkM5REYiLAoJCTMzMjkyIDogIkM5RTAiLAoJCTMzMjkzIDogIkM5RTEiLAoJCTM2MTk4IDogIkM5RTIiLAoJCTI1NjY4IDogIkM5RTMiLAoJCTIzNTU2IDogIkM5RTQiLAoJCTI0OTEzIDogIkM5RTUiLAoJCTI4MDQxIDogIkM5RTYiLAoJCTMxMDM4IDogIkM5RTciLAoJCTM1Nzc0IDogIkM5RTgiLAoJCTMwNzc1IDogIkM5RTkiLAoJCTMwMDAzIDogIkM5RUEiLAoJCTIxNjI3IDogIkM5RUIiLAoJCTIwMjgwIDogIkM5RUMiLAoJCTM2NTIzIDogIkM5RUQiLAoJCTI4MTQ1IDogIkM5RUUiLAoJCTIzMDcyIDogIkM5RUYiLAoJCTMyNDUzIDogIkM5RjAiLAoJCTMxMDcwIDogIkM5RjEiLAoJCTI3Nzg0IDogIkM5RjIiLAoJCTIzNDU3IDogIkM5RjMiLAoJCTIzMTU4IDogIkM5RjQiLAoJCTI5OTc4IDogIkM5RjUiLAoJCTMyOTU4IDogIkM5RjYiLAoJCTI0OTEwIDogIkM5RjciLAoJCTI4MTgzIDogIkM5RjgiLAoJCTIyNzY4IDogIkM5RjkiLAoJCTI5OTgzIDogIkM5RkEiLAoJCTI5OTg5IDogIkM5RkIiLAoJCTI5Mjk4IDogIkM5RkMiLAoJCTIxMzE5IDogIkM5RkQiLAoJCTMyNDk5IDogIkM5RkUiLAoJCTMwNDY1IDogIkNBQTEiLAoJCTMwNDI3IDogIkNBQTIiLAoJCTIxMDk3IDogIkNBQTMiLAoJCTMyOTg4IDogIkNBQTQiLAoJCTIyMzA3IDogIkNBQTUiLAoJCTI0MDcyIDogIkNBQTYiLAoJCTIyODMzIDogIkNBQTciLAoJCTI5NDIyIDogIkNBQTgiLAoJCTI2MDQ1IDogIkNBQTkiLAoJCTI4Mjg3IDogIkNBQUEiLAoJCTM1Nzk5IDogIkNBQUIiLAoJCTIzNjA4IDogIkNBQUMiLAoJCTM0NDE3IDogIkNBQUQiLAoJCTIxMzEzIDogIkNBQUUiLAoJCTMwNzA3IDogIkNBQUYiLAoJCTI1MzQyIDogIkNBQjAiLAoJCTI2MTAyIDogIkNBQjEiLAoJCTIwMTYwIDogIkNBQjIiLAoJCTM5MTM1IDogIkNBQjMiLAoJCTM0NDMyIDogIkNBQjQiLAoJCTIzNDU0IDogIkNBQjUiLAoJCTM1NzgyIDogIkNBQjYiLAoJCTIxNDkwIDogIkNBQjciLAoJCTMwNjkwIDogIkNBQjgiLAoJCTIwMzUxIDogIkNBQjkiLAoJCTIzNjMwIDogIkNBQkEiLAoJCTM5NTQyIDogIkNBQkIiLAoJCTIyOTg3IDogIkNBQkMiLAoJCTI0MzM1IDogIkNBQkQiLAoJCTMxMDM0IDogIkNBQkUiLAoJCTIyNzYzIDogIkNBQkYiLAoJCTE5OTkwIDogIkNBQzAiLAoJCTI2NjIzIDogIkNBQzEiLAoJCTIwMTA3IDogIkNBQzIiLAoJCTI1MzI1IDogIkNBQzMiLAoJCTM1NDc1IDogIkNBQzQiLAoJCTM2ODkzIDogIkNBQzUiLAoJCTIxMTgzIDogIkNBQzYiLAoJCTI2MTU5IDogIkNBQzciLAoJCTIxOTgwIDogIkNBQzgiLAoJCTIyMTI0IDogIkNBQzkiLAoJCTM2ODY2IDogIkNBQ0EiLAoJCTIwMTgxIDogIkNBQ0IiLAoJCTIwMzY1IDogIkNBQ0MiLAoJCTM3MzIyIDogIkNBQ0QiLAoJCTM5MjgwIDogIkNBQ0UiLAoJCTI3NjYzIDogIkNBQ0YiLAoJCTI0MDY2IDogIkNBRDAiLAoJCTI0NjQzIDogIkNBRDEiLAoJCTIzNDYwIDogIkNBRDIiLAoJCTM1MjcwIDogIkNBRDMiLAoJCTM1Nzk3IDogIkNBRDQiLAoJCTI1OTEwIDogIkNBRDUiLAoJCTI1MTYzIDogIkNBRDYiLAoJCTM5MzE4IDogIkNBRDciLAoJCTIzNDMyIDogIkNBRDgiLAoJCTIzNTUxIDogIkNBRDkiLAoJCTI1NDgwIDogIkNBREEiLAoJCTIxODA2IDogIkNBREIiLAoJCTIxNDYzIDogIkNBREMiLAoJCTMwMjQ2IDogIkNBREQiLAoJCTIwODYxIDogIkNBREUiLAoJCTM0MDkyIDogIkNBREYiLAoJCTI2NTMwIDogIkNBRTAiLAoJCTI2ODAzIDogIkNBRTEiLAoJCTI3NTMwIDogIkNBRTIiLAoJCTI1MjM0IDogIkNBRTMiLAoJCTM2NzU1IDogIkNBRTQiLAoJCTIxNDYwIDogIkNBRTUiLAoJCTMzMjk4IDogIkNBRTYiLAoJCTI4MTEzIDogIkNBRTciLAoJCTMwMDk1IDogIkNBRTgiLAoJCTIwMDcwIDogIkNBRTkiLAoJCTM2MTc0IDogIkNBRUEiLAoJCTIzNDA4IDogIkNBRUIiLAoJCTI5MDg3IDogIkNBRUMiLAoJCTM0MjIzIDogIkNBRUQiLAoJCTI2MjU3IDogIkNBRUUiLAoJCTI2MzI5IDogIkNBRUYiLAoJCTMyNjI2IDogIkNBRjAiLAoJCTM0NTYwIDogIkNBRjEiLAoJCTQwNjUzIDogIkNBRjIiLAoJCTQwNzM2IDogIkNBRjMiLAoJCTIzNjQ2IDogIkNBRjQiLAoJCTI2NDE1IDogIkNBRjUiLAoJCTM2ODQ4IDogIkNBRjYiLAoJCTI2NjQxIDogIkNBRjciLAoJCTI2NDYzIDogIkNBRjgiLAoJCTI1MTAxIDogIkNBRjkiLAoJCTMxNDQ2IDogIkNBRkEiLAoJCTIyNjYxIDogIkNBRkIiLAoJCTI0MjQ2IDogIkNBRkMiLAoJCTI1OTY4IDogIkNBRkQiLAoJCTI4NDY1IDogIkNBRkUiLAoJCTI0NjYxIDogIkNCQTEiLAoJCTIxMDQ3IDogIkNCQTIiLAoJCTMyNzgxIDogIkNCQTMiLAoJCTI1Njg0IDogIkNCQTQiLAoJCTM0OTI4IDogIkNCQTUiLAoJCTI5OTkzIDogIkNCQTYiLAoJCTI0MDY5IDogIkNCQTciLAoJCTI2NjQzIDogIkNCQTgiLAoJCTI1MzMyIDogIkNCQTkiLAoJCTM4Njg0IDogIkNCQUEiLAoJCTIxNDUyIDogIkNCQUIiLAoJCTI5MjQ1IDogIkNCQUMiLAoJCTM1ODQxIDogIkNCQUQiLAoJCTI3NzAwIDogIkNCQUUiLAoJCTMwNTYxIDogIkNCQUYiLAoJCTMxMjQ2IDogIkNCQjAiLAoJCTIxNTUwIDogIkNCQjEiLAoJCTMwNjM2IDogIkNCQjIiLAoJCTM5MDM0IDogIkNCQjMiLAoJCTMzMzA4IDogIkNCQjQiLAoJCTM1ODI4IDogIkNCQjUiLAoJCTMwODA1IDogIkNCQjYiLAoJCTI2Mzg4IDogIkNCQjciLAoJCTI4ODY1IDogIkNCQjgiLAoJCTI2MDMxIDogIkNCQjkiLAoJCTI1NzQ5IDogIkNCQkEiLAoJCTIyMDcwIDogIkNCQkIiLAoJCTI0NjA1IDogIkNCQkMiLAoJCTMxMTY5IDogIkNCQkQiLAoJCTIxNDk2IDogIkNCQkUiLAoJCTE5OTk3IDogIkNCQkYiLAoJCTI3NTE1IDogIkNCQzAiLAoJCTMyOTAyIDogIkNCQzEiLAoJCTIzNTQ2IDogIkNCQzIiLAoJCTIxOTg3IDogIkNCQzMiLAoJCTIyMjM1IDogIkNCQzQiLAoJCTIwMjgyIDogIkNCQzUiLAoJCTIwMjg0IDogIkNCQzYiLAoJCTM5MjgyIDogIkNCQzciLAoJCTI0MDUxIDogIkNCQzgiLAoJCTI2NDk0IDogIkNCQzkiLAoJCTMyODI0IDogIkNCQ0EiLAoJCTI0NTc4IDogIkNCQ0IiLAoJCTM5MDQyIDogIkNCQ0MiLAoJCTM2ODY1IDogIkNCQ0QiLAoJCTIzNDM1IDogIkNCQ0UiLAoJCTM1NzcyIDogIkNCQ0YiLAoJCTM1ODI5IDogIkNCRDAiLAoJCTI1NjI4IDogIkNCRDEiLAoJCTMzMzY4IDogIkNCRDIiLAoJCTI1ODIyIDogIkNCRDMiLAoJCTIyMDEzIDogIkNCRDQiLAoJCTMzNDg3IDogIkNCRDUiLAoJCTM3MjIxIDogIkNCRDYiLAoJCTIwNDM5IDogIkNCRDciLAoJCTMyMDMyIDogIkNCRDgiLAoJCTM2ODk1IDogIkNCRDkiLAoJCTMxOTAzIDogIkNCREEiLAoJCTIwNzIzIDogIkNCREIiLAoJCTIyNjA5IDogIkNCREMiLAoJCTI4MzM1IDogIkNCREQiLAoJCTIzNDg3IDogIkNCREUiLAoJCTM1Nzg1IDogIkNCREYiLAoJCTMyODk5IDogIkNCRTAiLAoJCTM3MjQwIDogIkNCRTEiLAoJCTMzOTQ4IDogIkNCRTIiLAoJCTMxNjM5IDogIkNCRTMiLAoJCTM0NDI5IDogIkNCRTQiLAoJCTM4NTM5IDogIkNCRTUiLAoJCTM4NTQzIDogIkNCRTYiLAoJCTMyNDg1IDogIkNCRTciLAoJCTM5NjM1IDogIkNCRTgiLAoJCTMwODYyIDogIkNCRTkiLAoJCTIzNjgxIDogIkNCRUEiLAoJCTMxMzE5IDogIkNCRUIiLAoJCTM2OTMwIDogIkNCRUMiLAoJCTM4NTY3IDogIkNCRUQiLAoJCTMxMDcxIDogIkNCRUUiLAoJCTIzMzg1IDogIkNCRUYiLAoJCTI1NDM5IDogIkNCRjAiLAoJCTMxNDk5IDogIkNCRjEiLAoJCTM0MDAxIDogIkNCRjIiLAoJCTI2Nzk3IDogIkNCRjMiLAoJCTIxNzY2IDogIkNCRjQiLAoJCTMyNTUzIDogIkNCRjUiLAoJCTI5NzEyIDogIkNCRjYiLAoJCTMyMDM0IDogIkNCRjciLAoJCTM4MTQ1IDogIkNCRjgiLAoJCTI1MTUyIDogIkNCRjkiLAoJCTIyNjA0IDogIkNCRkEiLAoJCTIwMTgyIDogIkNCRkIiLAoJCTIzNDI3IDogIkNCRkMiLAoJCTIyOTA1IDogIkNCRkQiLAoJCTIyNjEyIDogIkNCRkUiLAoJCTI5NTQ5IDogIkNDQTEiLAoJCTI1Mzc0IDogIkNDQTIiLAoJCTM2NDI3IDogIkNDQTMiLAoJCTM2MzY3IDogIkNDQTQiLAoJCTMyOTc0IDogIkNDQTUiLAoJCTMzNDkyIDogIkNDQTYiLAoJCTI1MjYwIDogIkNDQTciLAoJCTIxNDg4IDogIkNDQTgiLAoJCTI3ODg4IDogIkNDQTkiLAoJCTM3MjE0IDogIkNDQUEiLAoJCTIyODI2IDogIkNDQUIiLAoJCTI0NTc3IDogIkNDQUMiLAoJCTI3NzYwIDogIkNDQUQiLAoJCTIyMzQ5IDogIkNDQUUiLAoJCTI1Njc0IDogIkNDQUYiLAoJCTM2MTM4IDogIkNDQjAiLAoJCTMwMjUxIDogIkNDQjEiLAoJCTI4MzkzIDogIkNDQjIiLAoJCTIyMzYzIDogIkNDQjMiLAoJCTI3MjY0IDogIkNDQjQiLAoJCTMwMTkyIDogIkNDQjUiLAoJCTI4NTI1IDogIkNDQjYiLAoJCTM1ODg1IDogIkNDQjciLAoJCTM1ODQ4IDogIkNDQjgiLAoJCTIyMzc0IDogIkNDQjkiLAoJCTI3NjMxIDogIkNDQkEiLAoJCTM0OTYyIDogIkNDQkIiLAoJCTMwODk5IDogIkNDQkMiLAoJCTI1NTA2IDogIkNDQkQiLAoJCTIxNDk3IDogIkNDQkUiLAoJCTI4ODQ1IDogIkNDQkYiLAoJCTI3NzQ4IDogIkNDQzAiLAoJCTIyNjE2IDogIkNDQzEiLAoJCTI1NjQyIDogIkNDQzIiLAoJCTIyNTMwIDogIkNDQzMiLAoJCTI2ODQ4IDogIkNDQzQiLAoJCTMzMTc5IDogIkNDQzUiLAoJCTIxNzc2IDogIkNDQzYiLAoJCTMxOTU4IDogIkNDQzciLAoJCTIwNTA0IDogIkNDQzgiLAoJCTM2NTM4IDogIkNDQzkiLAoJCTI4MTA4IDogIkNDQ0EiLAoJCTM2MjU1IDogIkNDQ0IiLAoJCTI4OTA3IDogIkNDQ0MiLAoJCTI1NDg3IDogIkNDQ0QiLAoJCTI4MDU5IDogIkNDQ0UiLAoJCTI4MzcyIDogIkNDQ0YiLAoJCTMyNDg2IDogIkNDRDAiLAoJCTMzNzk2IDogIkNDRDEiLAoJCTI2NjkxIDogIkNDRDIiLAoJCTM2ODY3IDogIkNDRDMiLAoJCTI4MTIwIDogIkNDRDQiLAoJCTM4NTE4IDogIkNDRDUiLAoJCTM1NzUyIDogIkNDRDYiLAoJCTIyODcxIDogIkNDRDciLAoJCTI5MzA1IDogIkNDRDgiLAoJCTM0Mjc2IDogIkNDRDkiLAoJCTMzMTUwIDogIkNDREEiLAoJCTMwMTQwIDogIkNDREIiLAoJCTM1NDY2IDogIkNDREMiLAoJCTI2Nzk5IDogIkNDREQiLAoJCTIxMDc2IDogIkNDREUiLAoJCTM2Mzg2IDogIkNDREYiLAoJCTM4MTYxIDogIkNDRTAiLAoJCTI1NTUyIDogIkNDRTEiLAoJCTM5MDY0IDogIkNDRTIiLAoJCTM2NDIwIDogIkNDRTMiLAoJCTIxODg0IDogIkNDRTQiLAoJCTIwMzA3IDogIkNDRTUiLAoJCTI2MzY3IDogIkNDRTYiLAoJCTIyMTU5IDogIkNDRTciLAoJCTI0Nzg5IDogIkNDRTgiLAoJCTI4MDUzIDogIkNDRTkiLAoJCTIxMDU5IDogIkNDRUEiLAoJCTIzNjI1IDogIkNDRUIiLAoJCTIyODI1IDogIkNDRUMiLAoJCTI4MTU1IDogIkNDRUQiLAoJCTIyNjM1IDogIkNDRUUiLAoJCTMwMDAwIDogIkNDRUYiLAoJCTI5OTgwIDogIkNDRjAiLAoJCTI0Njg0IDogIkNDRjEiLAoJCTMzMzAwIDogIkNDRjIiLAoJCTMzMDk0IDogIkNDRjMiLAoJCTI1MzYxIDogIkNDRjQiLAoJCTI2NDY1IDogIkNDRjUiLAoJCTM2ODM0IDogIkNDRjYiLAoJCTMwNTIyIDogIkNDRjciLAoJCTM2MzM5IDogIkNDRjgiLAoJCTM2MTQ4IDogIkNDRjkiLAoJCTM4MDgxIDogIkNDRkEiLAoJCTI0MDg2IDogIkNDRkIiLAoJCTIxMzgxIDogIkNDRkMiLAoJCTIxNTQ4IDogIkNDRkQiLAoJCTI4ODY3IDogIkNDRkUiLAoJCTI3NzEyIDogIkNEQTEiLAoJCTI0MzExIDogIkNEQTIiLAoJCTIwNTcyIDogIkNEQTMiLAoJCTIwMTQxIDogIkNEQTQiLAoJCTI0MjM3IDogIkNEQTUiLAoJCTI1NDAyIDogIkNEQTYiLAoJCTMzMzUxIDogIkNEQTciLAoJCTM2ODkwIDogIkNEQTgiLAoJCTI2NzA0IDogIkNEQTkiLAoJCTM3MjMwIDogIkNEQUEiLAoJCTMwNjQzIDogIkNEQUIiLAoJCTIxNTE2IDogIkNEQUMiLAoJCTM4MTA4IDogIkNEQUQiLAoJCTI0NDIwIDogIkNEQUUiLAoJCTMxNDYxIDogIkNEQUYiLAoJCTI2NzQyIDogIkNEQjAiLAoJCTI1NDEzIDogIkNEQjEiLAoJCTMxNTcwIDogIkNEQjIiLAoJCTMyNDc5IDogIkNEQjMiLAoJCTMwMTcxIDogIkNEQjQiLAoJCTIwNTk5IDogIkNEQjUiLAoJCTI1MjM3IDogIkNEQjYiLAoJCTIyODM2IDogIkNEQjciLAoJCTM2ODc5IDogIkNEQjgiLAoJCTIwOTg0IDogIkNEQjkiLAoJCTMxMTcxIDogIkNEQkEiLAoJCTMxMzYxIDogIkNEQkIiLAoJCTIyMjcwIDogIkNEQkMiLAoJCTI0NDY2IDogIkNEQkQiLAoJCTM2ODg0IDogIkNEQkUiLAoJCTI4MDM0IDogIkNEQkYiLAoJCTIzNjQ4IDogIkNEQzAiLAoJCTIyMzAzIDogIkNEQzEiLAoJCTIxNTIwIDogIkNEQzIiLAoJCTIwODIwIDogIkNEQzMiLAoJCTI4MjM3IDogIkNEQzQiLAoJCTIyMjQyIDogIkNEQzUiLAoJCTI1NTEyIDogIkNEQzYiLAoJCTM5MDU5IDogIkNEQzciLAoJCTMzMTUxIDogIkNEQzgiLAoJCTM0NTgxIDogIkNEQzkiLAoJCTM1MTE0IDogIkNEQ0EiLAoJCTM2ODY0IDogIkNEQ0IiLAoJCTIxNTM0IDogIkNEQ0MiLAoJCTIzNjYzIDogIkNEQ0QiLAoJCTMzMjE2IDogIkNEQ0UiLAoJCTI1MzAyIDogIkNEQ0YiLAoJCTI1MTc2IDogIkNERDAiLAoJCTMzMDczIDogIkNERDEiLAoJCTQwNTAxIDogIkNERDIiLAoJCTM4NDY0IDogIkNERDMiLAoJCTM5NTM0IDogIkNERDQiLAoJCTM5NTQ4IDogIkNERDUiLAoJCTI2OTI1IDogIkNERDYiLAoJCTIyOTQ5IDogIkNERDciLAoJCTI1Mjk5IDogIkNERDgiLAoJCTIxODIyIDogIkNERDkiLAoJCTI1MzY2IDogIkNEREEiLAoJCTIxNzAzIDogIkNEREIiLAoJCTM0NTIxIDogIkNEREMiLAoJCTI3OTY0IDogIkNEREQiLAoJCTIzMDQzIDogIkNEREUiLAoJCTI5OTI2IDogIkNEREYiLAoJCTM0OTcyIDogIkNERTAiLAoJCTI3NDk4IDogIkNERTEiLAoJCTIyODA2IDogIkNERTIiLAoJCTM1OTE2IDogIkNERTMiLAoJCTI0MzY3IDogIkNERTQiLAoJCTI4Mjg2IDogIkNERTUiLAoJCTI5NjA5IDogIkNERTYiLAoJCTM5MDM3IDogIkNERTciLAoJCTIwMDI0IDogIkNERTgiLAoJCTI4OTE5IDogIkNERTkiLAoJCTIzNDM2IDogIkNERUEiLAoJCTMwODcxIDogIkNERUIiLAoJCTI1NDA1IDogIkNERUMiLAoJCTI2MjAyIDogIkNERUQiLAoJCTMwMzU4IDogIkNERUUiLAoJCTI0Nzc5IDogIkNERUYiLAoJCTIzNDUxIDogIkNERjAiLAoJCTIzMTEzIDogIkNERjEiLAoJCTE5OTc1IDogIkNERjIiLAoJCTMzMTA5IDogIkNERjMiLAoJCTI3NzU0IDogIkNERjQiLAoJCTI5NTc5IDogIkNERjUiLAoJCTIwMTI5IDogIkNERjYiLAoJCTI2NTA1IDogIkNERjciLAoJCTMyNTkzIDogIkNERjgiLAoJCTI0NDQ4IDogIkNERjkiLAoJCTI2MTA2IDogIkNERkEiLAoJCTI2Mzk1IDogIkNERkIiLAoJCTI0NTM2IDogIkNERkMiLAoJCTIyOTE2IDogIkNERkQiLAoJCTIzMDQxIDogIkNERkUiLAoJCTI0MDEzIDogIkNFQTEiLAoJCTI0NDk0IDogIkNFQTIiLAoJCTIxMzYxIDogIkNFQTMiLAoJCTM4ODg2IDogIkNFQTQiLAoJCTM2ODI5IDogIkNFQTUiLAoJCTI2NjkzIDogIkNFQTYiLAoJCTIyMjYwIDogIkNFQTciLAoJCTIxODA3IDogIkNFQTgiLAoJCTI0Nzk5IDogIkNFQTkiLAoJCTIwMDI2IDogIkNFQUEiLAoJCTI4NDkzIDogIkNFQUIiLAoJCTMyNTAwIDogIkNFQUMiLAoJCTMzNDc5IDogIkNFQUQiLAoJCTMzODA2IDogIkNFQUUiLAoJCTIyOTk2IDogIkNFQUYiLAoJCTIwMjU1IDogIkNFQjAiLAoJCTIwMjY2IDogIkNFQjEiLAoJCTIzNjE0IDogIkNFQjIiLAoJCTMyNDI4IDogIkNFQjMiLAoJCTI2NDEwIDogIkNFQjQiLAoJCTM0MDc0IDogIkNFQjUiLAoJCTIxNjE5IDogIkNFQjYiLAoJCTMwMDMxIDogIkNFQjciLAoJCTMyOTYzIDogIkNFQjgiLAoJCTIxODkwIDogIkNFQjkiLAoJCTM5NzU5IDogIkNFQkEiLAoJCTIwMzAxIDogIkNFQkIiLAoJCTI4MjA1IDogIkNFQkMiLAoJCTM1ODU5IDogIkNFQkQiLAoJCTIzNTYxIDogIkNFQkUiLAoJCTI0OTQ0IDogIkNFQkYiLAoJCTIxMzU1IDogIkNFQzAiLAoJCTMwMjM5IDogIkNFQzEiLAoJCTI4MjAxIDogIkNFQzIiLAoJCTM0NDQyIDogIkNFQzMiLAoJCTI1OTkxIDogIkNFQzQiLAoJCTM4Mzk1IDogIkNFQzUiLAoJCTMyNDQxIDogIkNFQzYiLAoJCTIxNTYzIDogIkNFQzciLAoJCTMxMjgzIDogIkNFQzgiLAoJCTMyMDEwIDogIkNFQzkiLAoJCTM4MzgyIDogIkNFQ0EiLAoJCTIxOTg1IDogIkNFQ0IiLAoJCTMyNzA1IDogIkNFQ0MiLAoJCTI5OTM0IDogIkNFQ0QiLAoJCTI1MzczIDogIkNFQ0UiLAoJCTM0NTgzIDogIkNFQ0YiLAoJCTI4MDY1IDogIkNFRDAiLAoJCTMxMzg5IDogIkNFRDEiLAoJCTI1MTA1IDogIkNFRDIiLAoJCTI2MDE3IDogIkNFRDMiLAoJCTIxMzUxIDogIkNFRDQiLAoJCTI1NTY5IDogIkNFRDUiLAoJCTI3Nzc5IDogIkNFRDYiLAoJCTI0MDQzIDogIkNFRDciLAoJCTIxNTk2IDogIkNFRDgiLAoJCTM4MDU2IDogIkNFRDkiLAoJCTIwMDQ0IDogIkNFREEiLAoJCTI3NzQ1IDogIkNFREIiLAoJCTM1ODIwIDogIkNFREMiLAoJCTIzNjI3IDogIkNFREQiLAoJCTI2MDgwIDogIkNFREUiLAoJCTMzNDM2IDogIkNFREYiLAoJCTI2NzkxIDogIkNFRTAiLAoJCTIxNTY2IDogIkNFRTEiLAoJCTIxNTU2IDogIkNFRTIiLAoJCTI3NTk1IDogIkNFRTMiLAoJCTI3NDk0IDogIkNFRTQiLAoJCTIwMTE2IDogIkNFRTUiLAoJCTI1NDEwIDogIkNFRTYiLAoJCTIxMzIwIDogIkNFRTciLAoJCTMzMzEwIDogIkNFRTgiLAoJCTIwMjM3IDogIkNFRTkiLAoJCTIwMzk4IDogIkNFRUEiLAoJCTIyMzY2IDogIkNFRUIiLAoJCTI1MDk4IDogIkNFRUMiLAoJCTM4NjU0IDogIkNFRUQiLAoJCTI2MjEyIDogIkNFRUUiLAoJCTI5Mjg5IDogIkNFRUYiLAoJCTIxMjQ3IDogIkNFRjAiLAoJCTIxMTUzIDogIkNFRjEiLAoJCTI0NzM1IDogIkNFRjIiLAoJCTM1ODIzIDogIkNFRjMiLAoJCTI2MTMyIDogIkNFRjQiLAoJCTI5MDgxIDogIkNFRjUiLAoJCTI2NTEyIDogIkNFRjYiLAoJCTM1MTk5IDogIkNFRjciLAoJCTMwODAyIDogIkNFRjgiLAoJCTMwNzE3IDogIkNFRjkiLAoJCTI2MjI0IDogIkNFRkEiLAoJCTIyMDc1IDogIkNFRkIiLAoJCTIxNTYwIDogIkNFRkMiLAoJCTM4MTc3IDogIkNFRkQiLAoJCTI5MzA2IDogIkNFRkUiLAoJCTMxMjMyIDogIkNGQTEiLAoJCTI0Njg3IDogIkNGQTIiLAoJCTI0MDc2IDogIkNGQTMiLAoJCTI0NzEzIDogIkNGQTQiLAoJCTMzMTgxIDogIkNGQTUiLAoJCTIyODA1IDogIkNGQTYiLAoJCTI0Nzk2IDogIkNGQTciLAoJCTI5MDYwIDogIkNGQTgiLAoJCTI4OTExIDogIkNGQTkiLAoJCTI4MzMwIDogIkNGQUEiLAoJCTI3NzI4IDogIkNGQUIiLAoJCTI5MzEyIDogIkNGQUMiLAoJCTI3MjY4IDogIkNGQUQiLAoJCTM0OTg5IDogIkNGQUUiLAoJCTI0MTA5IDogIkNGQUYiLAoJCTIwMDY0IDogIkNGQjAiLAoJCTIzMjE5IDogIkNGQjEiLAoJCTIxOTE2IDogIkNGQjIiLAoJCTM4MTE1IDogIkNGQjMiLAoJCTI3OTI3IDogIkNGQjQiLAoJCTMxOTk1IDogIkNGQjUiLAoJCTM4NTUzIDogIkNGQjYiLAoJCTI1MTAzIDogIkNGQjciLAoJCTMyNDU0IDogIkNGQjgiLAoJCTMwNjA2IDogIkNGQjkiLAoJCTM0NDMwIDogIkNGQkEiLAoJCTIxMjgzIDogIkNGQkIiLAoJCTM4Njg2IDogIkNGQkMiLAoJCTM2NzU4IDogIkNGQkQiLAoJCTI2MjQ3IDogIkNGQkUiLAoJCTIzNzc3IDogIkNGQkYiLAoJCTIwMzg0IDogIkNGQzAiLAoJCTI5NDIxIDogIkNGQzEiLAoJCTE5OTc5IDogIkNGQzIiLAoJCTIxNDE0IDogIkNGQzMiLAoJCTIyNzk5IDogIkNGQzQiLAoJCTIxNTIzIDogIkNGQzUiLAoJCTI1NDcyIDogIkNGQzYiLAoJCTM4MTg0IDogIkNGQzciLAoJCTIwODA4IDogIkNGQzgiLAoJCTIwMTg1IDogIkNGQzkiLAoJCTQwMDkyIDogIkNGQ0EiLAoJCTMyNDIwIDogIkNGQ0IiLAoJCTIxNjg4IDogIkNGQ0MiLAoJCTM2MTMyIDogIkNGQ0QiLAoJCTM0OTAwIDogIkNGQ0UiLAoJCTMzMzM1IDogIkNGQ0YiLAoJCTM4Mzg2IDogIkNGRDAiLAoJCTI4MDQ2IDogIkNGRDEiLAoJCTI0MzU4IDogIkNGRDIiLAoJCTIzMjQ0IDogIkNGRDMiLAoJCTI2MTc0IDogIkNGRDQiLAoJCTM4NTA1IDogIkNGRDUiLAoJCTI5NjE2IDogIkNGRDYiLAoJCTI5NDg2IDogIkNGRDciLAoJCTIxNDM5IDogIkNGRDgiLAoJCTMzMTQ2IDogIkNGRDkiLAoJCTM5MzAxIDogIkNGREEiLAoJCTMyNjczIDogIkNGREIiLAoJCTIzNDY2IDogIkNGREMiLAoJCTM4NTE5IDogIkNGREQiLAoJCTM4NDgwIDogIkNGREUiLAoJCTMyNDQ3IDogIkNGREYiLAoJCTMwNDU2IDogIkNGRTAiLAoJCTIxNDEwIDogIkNGRTEiLAoJCTM4MjYyIDogIkNGRTIiLAoJCTM5MzIxIDogIkNGRTMiLAoJCTMxNjY1IDogIkNGRTQiLAoJCTM1MTQwIDogIkNGRTUiLAoJCTI4MjQ4IDogIkNGRTYiLAoJCTIwMDY1IDogIkNGRTciLAoJCTMyNzI0IDogIkNGRTgiLAoJCTMxMDc3IDogIkNGRTkiLAoJCTM1ODE0IDogIkNGRUEiLAoJCTI0ODE5IDogIkNGRUIiLAoJCTIxNzA5IDogIkNGRUMiLAoJCTIwMTM5IDogIkNGRUQiLAoJCTM5MDMzIDogIkNGRUUiLAoJCTI0MDU1IDogIkNGRUYiLAoJCTI3MjMzIDogIkNGRjAiLAoJCTIwNjg3IDogIkNGRjEiLAoJCTIxNTIxIDogIkNGRjIiLAoJCTM1OTM3IDogIkNGRjMiLAoJCTMzODMxIDogIkNGRjQiLAoJCTMwODEzIDogIkNGRjUiLAoJCTM4NjYwIDogIkNGRjYiLAoJCTIxMDY2IDogIkNGRjciLAoJCTIxNzQyIDogIkNGRjgiLAoJCTIyMTc5IDogIkNGRjkiLAoJCTM4MTQ0IDogIkNGRkEiLAoJCTI4MDQwIDogIkNGRkIiLAoJCTIzNDc3IDogIkNGRkMiLAoJCTI4MTAyIDogIkNGRkQiLAoJCTI2MTk1IDogIkNGRkUiLAoJCTIzNTY3IDogIkQwQTEiLAoJCTIzMzg5IDogIkQwQTIiLAoJCTI2NjU3IDogIkQwQTMiLAoJCTMyOTE4IDogIkQwQTQiLAoJCTIxODgwIDogIkQwQTUiLAoJCTMxNTA1IDogIkQwQTYiLAoJCTI1OTI4IDogIkQwQTciLAoJCTI2OTY0IDogIkQwQTgiLAoJCTIwMTIzIDogIkQwQTkiLAoJCTI3NDYzIDogIkQwQUEiLAoJCTM0NjM4IDogIkQwQUIiLAoJCTM4Nzk1IDogIkQwQUMiLAoJCTIxMzI3IDogIkQwQUQiLAoJCTI1Mzc1IDogIkQwQUUiLAoJCTI1NjU4IDogIkQwQUYiLAoJCTM3MDM0IDogIkQwQjAiLAoJCTI2MDEyIDogIkQwQjEiLAoJCTMyOTYxIDogIkQwQjIiLAoJCTM1ODU2IDogIkQwQjMiLAoJCTIwODg5IDogIkQwQjQiLAoJCTI2ODAwIDogIkQwQjUiLAoJCTIxMzY4IDogIkQwQjYiLAoJCTM0ODA5IDogIkQwQjciLAoJCTI1MDMyIDogIkQwQjgiLAoJCTI3ODQ0IDogIkQwQjkiLAoJCTI3ODk5IDogIkQwQkEiLAoJCTM1ODc0IDogIkQwQkIiLAoJCTIzNjMzIDogIkQwQkMiLAoJCTM0MjE4IDogIkQwQkQiLAoJCTMzNDU1IDogIkQwQkUiLAoJCTM4MTU2IDogIkQwQkYiLAoJCTI3NDI3IDogIkQwQzAiLAoJCTM2NzYzIDogIkQwQzEiLAoJCTI2MDMyIDogIkQwQzIiLAoJCTI0NTcxIDogIkQwQzMiLAoJCTI0NTE1IDogIkQwQzQiLAoJCTIwNDQ5IDogIkQwQzUiLAoJCTM0ODg1IDogIkQwQzYiLAoJCTI2MTQzIDogIkQwQzciLAoJCTMzMTI1IDogIkQwQzgiLAoJCTI5NDgxIDogIkQwQzkiLAoJCTI0ODI2IDogIkQwQ0EiLAoJCTIwODUyIDogIkQwQ0IiLAoJCTIxMDA5IDogIkQwQ0MiLAoJCTIyNDExIDogIkQwQ0QiLAoJCTI0NDE4IDogIkQwQ0UiLAoJCTM3MDI2IDogIkQwQ0YiLAoJCTM0ODkyIDogIkQwRDAiLAoJCTM3MjY2IDogIkQwRDEiLAoJCTI0MTg0IDogIkQwRDIiLAoJCTI2NDQ3IDogIkQwRDMiLAoJCTI0NjE1IDogIkQwRDQiLAoJCTIyOTk1IDogIkQwRDUiLAoJCTIwODA0IDogIkQwRDYiLAoJCTIwOTgyIDogIkQwRDciLAoJCTMzMDE2IDogIkQwRDgiLAoJCTIxMjU2IDogIkQwRDkiLAoJCTI3NzY5IDogIkQwREEiLAoJCTM4NTk2IDogIkQwREIiLAoJCTI5MDY2IDogIkQwREMiLAoJCTIwMjQxIDogIkQwREQiLAoJCTIwNDYyIDogIkQwREUiLAoJCTMyNjcwIDogIkQwREYiLAoJCTI2NDI5IDogIkQwRTAiLAoJCTIxOTU3IDogIkQwRTEiLAoJCTM4MTUyIDogIkQwRTIiLAoJCTMxMTY4IDogIkQwRTMiLAoJCTM0OTY2IDogIkQwRTQiLAoJCTMyNDgzIDogIkQwRTUiLAoJCTIyNjg3IDogIkQwRTYiLAoJCTI1MTAwIDogIkQwRTciLAoJCTM4NjU2IDogIkQwRTgiLAoJCTM0Mzk0IDogIkQwRTkiLAoJCTIyMDQwIDogIkQwRUEiLAoJCTM5MDM1IDogIkQwRUIiLAoJCTI0NDY0IDogIkQwRUMiLAoJCTM1NzY4IDogIkQwRUQiLAoJCTMzOTg4IDogIkQwRUUiLAoJCTM3MjA3IDogIkQwRUYiLAoJCTIxNDY1IDogIkQwRjAiLAoJCTI2MDkzIDogIkQwRjEiLAoJCTI0MjA3IDogIkQwRjIiLAoJCTMwMDQ0IDogIkQwRjMiLAoJCTI0Njc2IDogIkQwRjQiLAoJCTMyMTEwIDogIkQwRjUiLAoJCTIzMTY3IDogIkQwRjYiLAoJCTMyNDkwIDogIkQwRjciLAoJCTMyNDkzIDogIkQwRjgiLAoJCTM2NzEzIDogIkQwRjkiLAoJCTIxOTI3IDogIkQwRkEiLAoJCTIzNDU5IDogIkQwRkIiLAoJCTI0NzQ4IDogIkQwRkMiLAoJCTI2MDU5IDogIkQwRkQiLAoJCTI5NTcyIDogIkQwRkUiLAoJCTM2ODczIDogIkQxQTEiLAoJCTMwMzA3IDogIkQxQTIiLAoJCTMwNTA1IDogIkQxQTMiLAoJCTMyNDc0IDogIkQxQTQiLAoJCTM4NzcyIDogIkQxQTUiLAoJCTM0MjAzIDogIkQxQTYiLAoJCTIzMzk4IDogIkQxQTciLAoJCTMxMzQ4IDogIkQxQTgiLAoJCTM4NjM0IDogIkQxQTkiLAoJCTM0ODgwIDogIkQxQUEiLAoJCTIxMTk1IDogIkQxQUIiLAoJCTI5MDcxIDogIkQxQUMiLAoJCTI0NDkwIDogIkQxQUQiLAoJCTI2MDkyIDogIkQxQUUiLAoJCTM1ODEwIDogIkQxQUYiLAoJCTIzNTQ3IDogIkQxQjAiLAoJCTM5NTM1IDogIkQxQjEiLAoJCTI0MDMzIDogIkQxQjIiLAoJCTI3NTI5IDogIkQxQjMiLAoJCTI3NzM5IDogIkQxQjQiLAoJCTM1NzU3IDogIkQxQjUiLAoJCTM1NzU5IDogIkQxQjYiLAoJCTM2ODc0IDogIkQxQjciLAoJCTM2ODA1IDogIkQxQjgiLAoJCTIxMzg3IDogIkQxQjkiLAoJCTI1Mjc2IDogIkQxQkEiLAoJCTQwNDg2IDogIkQxQkIiLAoJCTQwNDkzIDogIkQxQkMiLAoJCTIxNTY4IDogIkQxQkQiLAoJCTIwMDExIDogIkQxQkUiLAoJCTMzNDY5IDogIkQxQkYiLAoJCTI5MjczIDogIkQxQzAiLAoJCTM0NDYwIDogIkQxQzEiLAoJCTIzODMwIDogIkQxQzIiLAoJCTM0OTA1IDogIkQxQzMiLAoJCTI4MDc5IDogIkQxQzQiLAoJCTM4NTk3IDogIkQxQzUiLAoJCTIxNzEzIDogIkQxQzYiLAoJCTIwMTIyIDogIkQxQzciLAoJCTM1NzY2IDogIkQxQzgiLAoJCTI4OTM3IDogIkQxQzkiLAoJCTIxNjkzIDogIkQxQ0EiLAoJCTM4NDA5IDogIkQxQ0IiLAoJCTI4ODk1IDogIkQxQ0MiLAoJCTI4MTUzIDogIkQxQ0QiLAoJCTMwNDE2IDogIkQxQ0UiLAoJCTIwMDA1IDogIkQxQ0YiLAoJCTMwNzQwIDogIkQxRDAiLAoJCTM0NTc4IDogIkQxRDEiLAoJCTIzNzIxIDogIkQxRDIiLAoJCTI0MzEwIDogIkQxRDMiLAoJCTM1MzI4IDogIkQxRDQiLAoJCTM5MDY4IDogIkQxRDUiLAoJCTM4NDE0IDogIkQxRDYiLAoJCTI4ODE0IDogIkQxRDciLAoJCTI3ODM5IDogIkQxRDgiLAoJCTIyODUyIDogIkQxRDkiLAoJCTI1NTEzIDogIkQxREEiLAoJCTMwNTI0IDogIkQxREIiLAoJCTM0ODkzIDogIkQxREMiLAoJCTI4NDM2IDogIkQxREQiLAoJCTMzMzk1IDogIkQxREUiLAoJCTIyNTc2IDogIkQxREYiLAoJCTI5MTQxIDogIkQxRTAiLAoJCTIxMzg4IDogIkQxRTEiLAoJCTMwNzQ2IDogIkQxRTIiLAoJCTM4NTkzIDogIkQxRTMiLAoJCTIxNzYxIDogIkQxRTQiLAoJCTI0NDIyIDogIkQxRTUiLAoJCTI4OTc2IDogIkQxRTYiLAoJCTIzNDc2IDogIkQxRTciLAoJCTM1ODY2IDogIkQxRTgiLAoJCTM5NTY0IDogIkQxRTkiLAoJCTI3NTIzIDogIkQxRUEiLAoJCTIyODMwIDogIkQxRUIiLAoJCTQwNDk1IDogIkQxRUMiLAoJCTMxMjA3IDogIkQxRUQiLAoJCTI2NDcyIDogIkQxRUUiLAoJCTI1MTk2IDogIkQxRUYiLAoJCTIwMzM1IDogIkQxRjAiLAoJCTMwMTEzIDogIkQxRjEiLAoJCTMyNjUwIDogIkQxRjIiLAoJCTI3OTE1IDogIkQxRjMiLAoJCTM4NDUxIDogIkQxRjQiLAoJCTI3Njg3IDogIkQxRjUiLAoJCTIwMjA4IDogIkQxRjYiLAoJCTMwMTYyIDogIkQxRjciLAoJCTIwODU5IDogIkQxRjgiLAoJCTI2Njc5IDogIkQxRjkiLAoJCTI4NDc4IDogIkQxRkEiLAoJCTM2OTkyIDogIkQxRkIiLAoJCTMzMTM2IDogIkQxRkMiLAoJCTIyOTM0IDogIkQxRkQiLAoJCTI5ODE0IDogIkQxRkUiLAoJCTI1NjcxIDogIkQyQTEiLAoJCTIzNTkxIDogIkQyQTIiLAoJCTM2OTY1IDogIkQyQTMiLAoJCTMxMzc3IDogIkQyQTQiLAoJCTM1ODc1IDogIkQyQTUiLAoJCTIzMDAyIDogIkQyQTYiLAoJCTIxNjc2IDogIkQyQTciLAoJCTMzMjgwIDogIkQyQTgiLAoJCTMzNjQ3IDogIkQyQTkiLAoJCTM1MjAxIDogIkQyQUEiLAoJCTMyNzY4IDogIkQyQUIiLAoJCTI2OTI4IDogIkQyQUMiLAoJCTIyMDk0IDogIkQyQUQiLAoJCTMyODIyIDogIkQyQUUiLAoJCTI5MjM5IDogIkQyQUYiLAoJCTM3MzI2IDogIkQyQjAiLAoJCTIwOTE4IDogIkQyQjEiLAoJCTIwMDYzIDogIkQyQjIiLAoJCTM5MDI5IDogIkQyQjMiLAoJCTI1NDk0IDogIkQyQjQiLAoJCTE5OTk0IDogIkQyQjUiLAoJCTIxNDk0IDogIkQyQjYiLAoJCTI2MzU1IDogIkQyQjciLAoJCTMzMDk5IDogIkQyQjgiLAoJCTIyODEyIDogIkQyQjkiLAoJCTI4MDgyIDogIkQyQkEiLAoJCTE5OTY4IDogIkQyQkIiLAoJCTIyNzc3IDogIkQyQkMiLAoJCTIxMzA3IDogIkQyQkQiLAoJCTI1NTU4IDogIkQyQkUiLAoJCTM4MTI5IDogIkQyQkYiLAoJCTIwMzgxIDogIkQyQzAiLAoJCTIwMjM0IDogIkQyQzEiLAoJCTM0OTE1IDogIkQyQzIiLAoJCTM5MDU2IDogIkQyQzMiLAoJCTIyODM5IDogIkQyQzQiLAoJCTM2OTUxIDogIkQyQzUiLAoJCTMxMjI3IDogIkQyQzYiLAoJCTIwMjAyIDogIkQyQzciLAoJCTMzMDA4IDogIkQyQzgiLAoJCTMwMDk3IDogIkQyQzkiLAoJCTI3Nzc4IDogIkQyQ0EiLAoJCTIzNDUyIDogIkQyQ0IiLAoJCTIzMDE2IDogIkQyQ0MiLAoJCTI0NDEzIDogIkQyQ0QiLAoJCTI2ODg1IDogIkQyQ0UiLAoJCTM0NDMzIDogIkQyQ0YiLAoJCTIwNTA2IDogIkQyRDAiLAoJCTI0MDUwIDogIkQyRDEiLAoJCTIwMDU3IDogIkQyRDIiLAoJCTMwNjkxIDogIkQyRDMiLAoJCTIwMTk3IDogIkQyRDQiLAoJCTMzNDAyIDogIkQyRDUiLAoJCTI1MjMzIDogIkQyRDYiLAoJCTI2MTMxIDogIkQyRDciLAoJCTM3MDA5IDogIkQyRDgiLAoJCTIzNjczIDogIkQyRDkiLAoJCTIwMTU5IDogIkQyREEiLAoJCTI0NDQxIDogIkQyREIiLAoJCTMzMjIyIDogIkQyREMiLAoJCTM2OTIwIDogIkQyREQiLAoJCTMyOTAwIDogIkQyREUiLAoJCTMwMTIzIDogIkQyREYiLAoJCTIwMTM0IDogIkQyRTAiLAoJCTM1MDI4IDogIkQyRTEiLAoJCTI0ODQ3IDogIkQyRTIiLAoJCTI3NTg5IDogIkQyRTMiLAoJCTI0NTE4IDogIkQyRTQiLAoJCTIwMDQxIDogIkQyRTUiLAoJCTMwNDEwIDogIkQyRTYiLAoJCTI4MzIyIDogIkQyRTciLAoJCTM1ODExIDogIkQyRTgiLAoJCTM1NzU4IDogIkQyRTkiLAoJCTM1ODUwIDogIkQyRUEiLAoJCTM1NzkzIDogIkQyRUIiLAoJCTI0MzIyIDogIkQyRUMiLAoJCTMyNzY0IDogIkQyRUQiLAoJCTMyNzE2IDogIkQyRUUiLAoJCTMyNDYyIDogIkQyRUYiLAoJCTMzNTg5IDogIkQyRjAiLAoJCTMzNjQzIDogIkQyRjEiLAoJCTIyMjQwIDogIkQyRjIiLAoJCTI3NTc1IDogIkQyRjMiLAoJCTM4ODk5IDogIkQyRjQiLAoJCTM4NDUyIDogIkQyRjUiLAoJCTIzMDM1IDogIkQyRjYiLAoJCTIxNTM1IDogIkQyRjciLAoJCTM4MTM0IDogIkQyRjgiLAoJCTI4MTM5IDogIkQyRjkiLAoJCTIzNDkzIDogIkQyRkEiLAoJCTM5Mjc4IDogIkQyRkIiLAoJCTIzNjA5IDogIkQyRkMiLAoJCTI0MzQxIDogIkQyRkQiLAoJCTM4NTQ0IDogIkQyRkUiLAoJCTIxMzYwIDogIkQzQTEiLAoJCTMzNTIxIDogIkQzQTIiLAoJCTI3MTg1IDogIkQzQTMiLAoJCTIzMTU2IDogIkQzQTQiLAoJCTQwNTYwIDogIkQzQTUiLAoJCTI0MjEyIDogIkQzQTYiLAoJCTMyNTUyIDogIkQzQTciLAoJCTMzNzIxIDogIkQzQTgiLAoJCTMzODI4IDogIkQzQTkiLAoJCTMzODI5IDogIkQzQUEiLAoJCTMzNjM5IDogIkQzQUIiLAoJCTM0NjMxIDogIkQzQUMiLAoJCTM2ODE0IDogIkQzQUQiLAoJCTM2MTk0IDogIkQzQUUiLAoJCTMwNDA4IDogIkQzQUYiLAoJCTI0NDMzIDogIkQzQjAiLAoJCTM5MDYyIDogIkQzQjEiLAoJCTMwODI4IDogIkQzQjIiLAoJCTI2MTQ0IDogIkQzQjMiLAoJCTIxNzI3IDogIkQzQjQiLAoJCTI1MzE3IDogIkQzQjUiLAoJCTIwMzIzIDogIkQzQjYiLAoJCTMzMjE5IDogIkQzQjciLAoJCTMwMTUyIDogIkQzQjgiLAoJCTI0MjQ4IDogIkQzQjkiLAoJCTM4NjA1IDogIkQzQkEiLAoJCTM2MzYyIDogIkQzQkIiLAoJCTM0NTUzIDogIkQzQkMiLAoJCTIxNjQ3IDogIkQzQkQiLAoJCTI3ODkxIDogIkQzQkUiLAoJCTI4MDQ0IDogIkQzQkYiLAoJCTI3NzA0IDogIkQzQzAiLAoJCTI0NzAzIDogIkQzQzEiLAoJCTIxMTkxIDogIkQzQzIiLAoJCTI5OTkyIDogIkQzQzMiLAoJCTI0MTg5IDogIkQzQzQiLAoJCTIwMjQ4IDogIkQzQzUiLAoJCTI0NzM2IDogIkQzQzYiLAoJCTI0NTUxIDogIkQzQzciLAoJCTIzNTg4IDogIkQzQzgiLAoJCTMwMDAxIDogIkQzQzkiLAoJCTM3MDM4IDogIkQzQ0EiLAoJCTM4MDgwIDogIkQzQ0IiLAoJCTI5MzY5IDogIkQzQ0MiLAoJCTI3ODMzIDogIkQzQ0QiLAoJCTI4MjE2IDogIkQzQ0UiLAoJCTM3MTkzIDogIkQzQ0YiLAoJCTI2Mzc3IDogIkQzRDAiLAoJCTIxNDUxIDogIkQzRDEiLAoJCTIxNDkxIDogIkQzRDIiLAoJCTIwMzA1IDogIkQzRDMiLAoJCTM3MzIxIDogIkQzRDQiLAoJCTM1ODI1IDogIkQzRDUiLAoJCTIxNDQ4IDogIkQzRDYiLAoJCTI0MTg4IDogIkQzRDciLAoJCTM2ODAyIDogIkQzRDgiLAoJCTI4MTMyIDogIkQzRDkiLAoJCTIwMTEwIDogIkQzREEiLAoJCTMwNDAyIDogIkQzREIiLAoJCTI3MDE0IDogIkQzREMiLAoJCTM0Mzk4IDogIkQzREQiLAoJCTI0ODU4IDogIkQzREUiLAoJCTMzMjg2IDogIkQzREYiLAoJCTIwMzEzIDogIkQzRTAiLAoJCTIwNDQ2IDogIkQzRTEiLAoJCTM2OTI2IDogIkQzRTIiLAoJCTQwMDYwIDogIkQzRTMiLAoJCTI0ODQxIDogIkQzRTQiLAoJCTI4MTg5IDogIkQzRTUiLAoJCTI4MTgwIDogIkQzRTYiLAoJCTM4NTMzIDogIkQzRTciLAoJCTIwMTA0IDogIkQzRTgiLAoJCTIzMDg5IDogIkQzRTkiLAoJCTM4NjMyIDogIkQzRUEiLAoJCTE5OTgyIDogIkQzRUIiLAoJCTIzNjc5IDogIkQzRUMiLAoJCTMxMTYxIDogIkQzRUQiLAoJCTIzNDMxIDogIkQzRUUiLAoJCTM1ODIxIDogIkQzRUYiLAoJCTMyNzAxIDogIkQzRjAiLAoJCTI5NTc3IDogIkQzRjEiLAoJCTIyNDk1IDogIkQzRjIiLAoJCTMzNDE5IDogIkQzRjMiLAoJCTM3MDU3IDogIkQzRjQiLAoJCTIxNTA1IDogIkQzRjUiLAoJCTM2OTM1IDogIkQzRjYiLAoJCTIxOTQ3IDogIkQzRjciLAoJCTIzNzg2IDogIkQzRjgiLAoJCTI0NDgxIDogIkQzRjkiLAoJCTI0ODQwIDogIkQzRkEiLAoJCTI3NDQyIDogIkQzRkIiLAoJCTI5NDI1IDogIkQzRkMiLAoJCTMyOTQ2IDogIkQzRkQiLAoJCTM1NDY1IDogIkQzRkUiLAoJCTI4MDIwIDogIkQ0QTEiLAoJCTIzNTA3IDogIkQ0QTIiLAoJCTM1MDI5IDogIkQ0QTMiLAoJCTM5MDQ0IDogIkQ0QTQiLAoJCTM1OTQ3IDogIkQ0QTUiLAoJCTM5NTMzIDogIkQ0QTYiLAoJCTQwNDk5IDogIkQ0QTciLAoJCTI4MTcwIDogIkQ0QTgiLAoJCTIwOTAwIDogIkQ0QTkiLAoJCTIwODAzIDogIkQ0QUEiLAoJCTIyNDM1IDogIkQ0QUIiLAoJCTM0OTQ1IDogIkQ0QUMiLAoJCTIxNDA3IDogIkQ0QUQiLAoJCTI1NTg4IDogIkQ0QUUiLAoJCTM2NzU3IDogIkQ0QUYiLAoJCTIyMjUzIDogIkQ0QjAiLAoJCTIxNTkyIDogIkQ0QjEiLAoJCTIyMjc4IDogIkQ0QjIiLAoJCTI5NTAzIDogIkQ0QjMiLAoJCTI4MzA0IDogIkQ0QjQiLAoJCTMyNTM2IDogIkQ0QjUiLAoJCTM2ODI4IDogIkQ0QjYiLAoJCTMzNDg5IDogIkQ0QjciLAoJCTI0ODk1IDogIkQ0QjgiLAoJCTI0NjE2IDogIkQ0QjkiLAoJCTM4NDk4IDogIkQ0QkEiLAoJCTI2MzUyIDogIkQ0QkIiLAoJCTMyNDIyIDogIkQ0QkMiLAoJCTM2MjM0IDogIkQ0QkQiLAoJCTM2MjkxIDogIkQ0QkUiLAoJCTM4MDUzIDogIkQ0QkYiLAoJCTIzNzMxIDogIkQ0QzAiLAoJCTMxOTA4IDogIkQ0QzEiLAoJCTI2Mzc2IDogIkQ0QzIiLAoJCTI0NzQyIDogIkQ0QzMiLAoJCTM4NDA1IDogIkQ0QzQiLAoJCTMyNzkyIDogIkQ0QzUiLAoJCTIwMTEzIDogIkQ0QzYiLAoJCTM3MDk1IDogIkQ0QzciLAoJCTIxMjQ4IDogIkQ0QzgiLAoJCTM4NTA0IDogIkQ0QzkiLAoJCTIwODAxIDogIkQ0Q0EiLAoJCTM2ODE2IDogIkQ0Q0IiLAoJCTM0MTY0IDogIkQ0Q0MiLAoJCTM3MjEzIDogIkQ0Q0QiLAoJCTI2MTk3IDogIkQ0Q0UiLAoJCTM4OTAxIDogIkQ0Q0YiLAoJCTIzMzgxIDogIkQ0RDAiLAoJCTIxMjc3IDogIkQ0RDEiLAoJCTMwNzc2IDogIkQ0RDIiLAoJCTI2NDM0IDogIkQ0RDMiLAoJCTI2Njg1IDogIkQ0RDQiLAoJCTIxNzA1IDogIkQ0RDUiLAoJCTI4Nzk4IDogIkQ0RDYiLAoJCTIzNDcyIDogIkQ0RDciLAoJCTM2NzMzIDogIkQ0RDgiLAoJCTIwODc3IDogIkQ0RDkiLAoJCTIyMzEyIDogIkQ0REEiLAoJCTIxNjgxIDogIkQ0REIiLAoJCTI1ODc0IDogIkQ0REMiLAoJCTI2MjQyIDogIkQ0REQiLAoJCTM2MTkwIDogIkQ0REUiLAoJCTM2MTYzIDogIkQ0REYiLAoJCTMzMDM5IDogIkQ0RTAiLAoJCTMzOTAwIDogIkQ0RTEiLAoJCTM2OTczIDogIkQ0RTIiLAoJCTMxOTY3IDogIkQ0RTMiLAoJCTIwOTkxIDogIkQ0RTQiLAoJCTM0Mjk5IDogIkQ0RTUiLAoJCTI2NTMxIDogIkQ0RTYiLAoJCTI2MDg5IDogIkQ0RTciLAoJCTI4NTc3IDogIkQ0RTgiLAoJCTM0NDY4IDogIkQ0RTkiLAoJCTM2NDgxIDogIkQ0RUEiLAoJCTIyMTIyIDogIkQ0RUIiLAoJCTM2ODk2IDogIkQ0RUMiLAoJCTMwMzM4IDogIkQ0RUQiLAoJCTI4NzkwIDogIkQ0RUUiLAoJCTI5MTU3IDogIkQ0RUYiLAoJCTM2MTMxIDogIkQ0RjAiLAoJCTI1MzIxIDogIkQ0RjEiLAoJCTIxMDE3IDogIkQ0RjIiLAoJCTI3OTAxIDogIkQ0RjMiLAoJCTM2MTU2IDogIkQ0RjQiLAoJCTI0NTkwIDogIkQ0RjUiLAoJCTIyNjg2IDogIkQ0RjYiLAoJCTI0OTc0IDogIkQ0RjciLAoJCTI2MzY2IDogIkQ0RjgiLAoJCTM2MTkyIDogIkQ0RjkiLAoJCTI1MTY2IDogIkQ0RkEiLAoJCTIxOTM5IDogIkQ0RkIiLAoJCTI4MTk1IDogIkQ0RkMiLAoJCTI2NDEzIDogIkQ0RkQiLAoJCTM2NzExIDogIkQ0RkUiLAoJCTM4MTEzIDogIkQ1QTEiLAoJCTM4MzkyIDogIkQ1QTIiLAoJCTMwNTA0IDogIkQ1QTMiLAoJCTI2NjI5IDogIkQ1QTQiLAoJCTI3MDQ4IDogIkQ1QTUiLAoJCTIxNjQzIDogIkQ1QTYiLAoJCTIwMDQ1IDogIkQ1QTciLAoJCTI4ODU2IDogIkQ1QTgiLAoJCTM1Nzg0IDogIkQ1QTkiLAoJCTI1Njg4IDogIkQ1QUEiLAoJCTI1OTk1IDogIkQ1QUIiLAoJCTIzNDI5IDogIkQ1QUMiLAoJCTMxMzY0IDogIkQ1QUQiLAoJCTIwNTM4IDogIkQ1QUUiLAoJCTIzNTI4IDogIkQ1QUYiLAoJCTMwNjUxIDogIkQ1QjAiLAoJCTI3NjE3IDogIkQ1QjEiLAoJCTM1NDQ5IDogIkQ1QjIiLAoJCTMxODk2IDogIkQ1QjMiLAoJCTI3ODM4IDogIkQ1QjQiLAoJCTMwNDE1IDogIkQ1QjUiLAoJCTI2MDI1IDogIkQ1QjYiLAoJCTM2NzU5IDogIkQ1QjciLAoJCTIzODUzIDogIkQ1QjgiLAoJCTIzNjM3IDogIkQ1QjkiLAoJCTM0MzYwIDogIkQ1QkEiLAoJCTI2NjMyIDogIkQ1QkIiLAoJCTIxMzQ0IDogIkQ1QkMiLAoJCTI1MTEyIDogIkQ1QkQiLAoJCTMxNDQ5IDogIkQ1QkUiLAoJCTI4MjUxIDogIkQ1QkYiLAoJCTMyNTA5IDogIkQ1QzAiLAoJCTI3MTY3IDogIkQ1QzEiLAoJCTMxNDU2IDogIkQ1QzIiLAoJCTI0NDMyIDogIkQ1QzMiLAoJCTI4NDY3IDogIkQ1QzQiLAoJCTI0MzUyIDogIkQ1QzUiLAoJCTI1NDg0IDogIkQ1QzYiLAoJCTI4MDcyIDogIkQ1QzciLAoJCTI2NDU0IDogIkQ1QzgiLAoJCTE5OTc2IDogIkQ1QzkiLAoJCTI0MDgwIDogIkQ1Q0EiLAoJCTM2MTM0IDogIkQ1Q0IiLAoJCTIwMTgzIDogIkQ1Q0MiLAoJCTMyOTYwIDogIkQ1Q0QiLAoJCTMwMjYwIDogIkQ1Q0UiLAoJCTM4NTU2IDogIkQ1Q0YiLAoJCTI1MzA3IDogIkQ1RDAiLAoJCTI2MTU3IDogIkQ1RDEiLAoJCTI1MjE0IDogIkQ1RDIiLAoJCTI3ODM2IDogIkQ1RDMiLAoJCTM2MjEzIDogIkQ1RDQiLAoJCTI5MDMxIDogIkQ1RDUiLAoJCTMyNjE3IDogIkQ1RDYiLAoJCTIwODA2IDogIkQ1RDciLAoJCTMyOTAzIDogIkQ1RDgiLAoJCTIxNDg0IDogIkQ1RDkiLAoJCTM2OTc0IDogIkQ1REEiLAoJCTI1MjQwIDogIkQ1REIiLAoJCTIxNzQ2IDogIkQ1REMiLAoJCTM0NTQ0IDogIkQ1REQiLAoJCTM2NzYxIDogIkQ1REUiLAoJCTMyNzczIDogIkQ1REYiLAoJCTM4MTY3IDogIkQ1RTAiLAoJCTM0MDcxIDogIkQ1RTEiLAoJCTM2ODI1IDogIkQ1RTIiLAoJCTI3OTkzIDogIkQ1RTMiLAoJCTI5NjQ1IDogIkQ1RTQiLAoJCTI2MDE1IDogIkQ1RTUiLAoJCTMwNDk1IDogIkQ1RTYiLAoJCTI5OTU2IDogIkQ1RTciLAoJCTMwNzU5IDogIkQ1RTgiLAoJCTMzMjc1IDogIkQ1RTkiLAoJCTM2MTI2IDogIkQ1RUEiLAoJCTM4MDI0IDogIkQ1RUIiLAoJCTIwMzkwIDogIkQ1RUMiLAoJCTI2NTE3IDogIkQ1RUQiLAoJCTMwMTM3IDogIkQ1RUUiLAoJCTM1Nzg2IDogIkQ1RUYiLAoJCTM4NjYzIDogIkQ1RjAiLAoJCTI1MzkxIDogIkQ1RjEiLAoJCTM4MjE1IDogIkQ1RjIiLAoJCTM4NDUzIDogIkQ1RjMiLAoJCTMzOTc2IDogIkQ1RjQiLAoJCTI1Mzc5IDogIkQ1RjUiLAoJCTMwNTI5IDogIkQ1RjYiLAoJCTI0NDQ5IDogIkQ1RjciLAoJCTI5NDI0IDogIkQ1RjgiLAoJCTIwMTA1IDogIkQ1RjkiLAoJCTI0NTk2IDogIkQ1RkEiLAoJCTI1OTcyIDogIkQ1RkIiLAoJCTI1MzI3IDogIkQ1RkMiLAoJCTI3NDkxIDogIkQ1RkQiLAoJCTI1OTE5IDogIkQ1RkUiLAoJCTI0MTAzIDogIkQ2QTEiLAoJCTMwMTUxIDogIkQ2QTIiLAoJCTM3MDczIDogIkQ2QTMiLAoJCTM1Nzc3IDogIkQ2QTQiLAoJCTMzNDM3IDogIkQ2QTUiLAoJCTI2NTI1IDogIkQ2QTYiLAoJCTI1OTAzIDogIkQ2QTciLAoJCTIxNTUzIDogIkQ2QTgiLAoJCTM0NTg0IDogIkQ2QTkiLAoJCTMwNjkzIDogIkQ2QUEiLAoJCTMyOTMwIDogIkQ2QUIiLAoJCTMzMDI2IDogIkQ2QUMiLAoJCTI3NzEzIDogIkQ2QUQiLAoJCTIwMDQzIDogIkQ2QUUiLAoJCTMyNDU1IDogIkQ2QUYiLAoJCTMyODQ0IDogIkQ2QjAiLAoJCTMwNDUyIDogIkQ2QjEiLAoJCTI2ODkzIDogIkQ2QjIiLAoJCTI3NTQyIDogIkQ2QjMiLAoJCTI1MTkxIDogIkQ2QjQiLAoJCTIwNTQwIDogIkQ2QjUiLAoJCTIwMzU2IDogIkQ2QjYiLAoJCTIyMzM2IDogIkQ2QjciLAoJCTI1MzUxIDogIkQ2QjgiLAoJCTI3NDkwIDogIkQ2QjkiLAoJCTM2Mjg2IDogIkQ2QkEiLAoJCTIxNDgyIDogIkQ2QkIiLAoJCTI2MDg4IDogIkQ2QkMiLAoJCTMyNDQwIDogIkQ2QkQiLAoJCTI0NTM1IDogIkQ2QkUiLAoJCTI1MzcwIDogIkQ2QkYiLAoJCTI1NTI3IDogIkQ2QzAiLAoJCTMzMjY3IDogIkQ2QzEiLAoJCTMzMjY4IDogIkQ2QzIiLAoJCTMyNjIyIDogIkQ2QzMiLAoJCTI0MDkyIDogIkQ2QzQiLAoJCTIzNzY5IDogIkQ2QzUiLAoJCTIxMDQ2IDogIkQ2QzYiLAoJCTI2MjM0IDogIkQ2QzciLAoJCTMxMjA5IDogIkQ2QzgiLAoJCTMxMjU4IDogIkQ2QzkiLAoJCTM2MTM2IDogIkQ2Q0EiLAoJCTI4ODI1IDogIkQ2Q0IiLAoJCTMwMTY0IDogIkQ2Q0MiLAoJCTI4MzgyIDogIkQ2Q0QiLAoJCTI3ODM1IDogIkQ2Q0UiLAoJCTMxMzc4IDogIkQ2Q0YiLAoJCTIwMDEzIDogIkQ2RDAiLAoJCTMwNDA1IDogIkQ2RDEiLAoJCTI0NTQ0IDogIkQ2RDIiLAoJCTM4MDQ3IDogIkQ2RDMiLAoJCTM0OTM1IDogIkQ2RDQiLAoJCTMyNDU2IDogIkQ2RDUiLAoJCTMxMTgxIDogIkQ2RDYiLAoJCTMyOTU5IDogIkQ2RDciLAoJCTM3MzI1IDogIkQ2RDgiLAoJCTIwMjEwIDogIkQ2RDkiLAoJCTIwMjQ3IDogIkQ2REEiLAoJCTMzMzExIDogIkQ2REIiLAoJCTIxNjA4IDogIkQ2REMiLAoJCTI0MDMwIDogIkQ2REQiLAoJCTI3OTU0IDogIkQ2REUiLAoJCTM1Nzg4IDogIkQ2REYiLAoJCTMxOTA5IDogIkQ2RTAiLAoJCTM2NzI0IDogIkQ2RTEiLAoJCTMyOTIwIDogIkQ2RTIiLAoJCTI0MDkwIDogIkQ2RTMiLAoJCTIxNjUwIDogIkQ2RTQiLAoJCTMwMzg1IDogIkQ2RTUiLAoJCTIzNDQ5IDogIkQ2RTYiLAoJCTI2MTcyIDogIkQ2RTciLAoJCTM5NTg4IDogIkQ2RTgiLAoJCTI5NjY0IDogIkQ2RTkiLAoJCTI2NjY2IDogIkQ2RUEiLAoJCTM0NTIzIDogIkQ2RUIiLAoJCTI2NDE3IDogIkQ2RUMiLAoJCTI5NDgyIDogIkQ2RUQiLAoJCTM1ODMyIDogIkQ2RUUiLAoJCTM1ODAzIDogIkQ2RUYiLAoJCTM2ODgwIDogIkQ2RjAiLAoJCTMxNDgxIDogIkQ2RjEiLAoJCTI4ODkxIDogIkQ2RjIiLAoJCTI5MDM4IDogIkQ2RjMiLAoJCTI1Mjg0IDogIkQ2RjQiLAoJCTMwNjMzIDogIkQ2RjUiLAoJCTIyMDY1IDogIkQ2RjYiLAoJCTIwMDI3IDogIkQ2RjciLAoJCTMzODc5IDogIkQ2RjgiLAoJCTI2NjA5IDogIkQ2RjkiLAoJCTIxMTYxIDogIkQ2RkEiLAoJCTM0NDk2IDogIkQ2RkIiLAoJCTM2MTQyIDogIkQ2RkMiLAoJCTM4MTM2IDogIkQ2RkQiLAoJCTMxNTY5IDogIkQ2RkUiLAoJCTIwMzAzIDogIkQ3QTEiLAoJCTI3ODgwIDogIkQ3QTIiLAoJCTMxMDY5IDogIkQ3QTMiLAoJCTM5NTQ3IDogIkQ3QTQiLAoJCTI1MjM1IDogIkQ3QTUiLAoJCTI5MjI2IDogIkQ3QTYiLAoJCTI1MzQxIDogIkQ3QTciLAoJCTE5OTg3IDogIkQ3QTgiLAoJCTMwNzQyIDogIkQ3QTkiLAoJCTM2NzE2IDogIkQ3QUEiLAoJCTI1Nzc2IDogIkQ3QUIiLAoJCTM2MTg2IDogIkQ3QUMiLAoJCTMxNjg2IDogIkQ3QUQiLAoJCTI2NzI5IDogIkQ3QUUiLAoJCTI0MTk2IDogIkQ3QUYiLAoJCTM1MDEzIDogIkQ3QjAiLAoJCTIyOTE4IDogIkQ3QjEiLAoJCTI1NzU4IDogIkQ3QjIiLAoJCTIyNzY2IDogIkQ3QjMiLAoJCTI5MzY2IDogIkQ3QjQiLAoJCTI2ODk0IDogIkQ3QjUiLAoJCTM4MTgxIDogIkQ3QjYiLAoJCTM2ODYxIDogIkQ3QjciLAoJCTM2MTg0IDogIkQ3QjgiLAoJCTIyMzY4IDogIkQ3QjkiLAoJCTMyNTEyIDogIkQ3QkEiLAoJCTM1ODQ2IDogIkQ3QkIiLAoJCTIwOTM0IDogIkQ3QkMiLAoJCTI1NDE3IDogIkQ3QkQiLAoJCTI1MzA1IDogIkQ3QkUiLAoJCTIxMzMxIDogIkQ3QkYiLAoJCTI2NzAwIDogIkQ3QzAiLAoJCTI5NzMwIDogIkQ3QzEiLAoJCTMzNTM3IDogIkQ3QzIiLAoJCTM3MTk2IDogIkQ3QzMiLAoJCTIxODI4IDogIkQ3QzQiLAoJCTMwNTI4IDogIkQ3QzUiLAoJCTI4Nzk2IDogIkQ3QzYiLAoJCTI3OTc4IDogIkQ3QzciLAoJCTIwODU3IDogIkQ3QzgiLAoJCTIxNjcyIDogIkQ3QzkiLAoJCTM2MTY0IDogIkQ3Q0EiLAoJCTIzMDM5IDogIkQ3Q0IiLAoJCTI4MzYzIDogIkQ3Q0MiLAoJCTI4MTAwIDogIkQ3Q0QiLAoJCTIzMzg4IDogIkQ3Q0UiLAoJCTMyMDQzIDogIkQ3Q0YiLAoJCTIwMTgwIDogIkQ3RDAiLAoJCTMxODY5IDogIkQ3RDEiLAoJCTI4MzcxIDogIkQ3RDIiLAoJCTIzMzc2IDogIkQ3RDMiLAoJCTMzMjU4IDogIkQ3RDQiLAoJCTI4MTczIDogIkQ3RDUiLAoJCTIzMzgzIDogIkQ3RDYiLAoJCTM5NjgzIDogIkQ3RDciLAoJCTI2ODM3IDogIkQ3RDgiLAoJCTM2Mzk0IDogIkQ3RDkiLAoJCTIzNDQ3IDogIkQ3REEiLAoJCTMyNTA4IDogIkQ3REIiLAoJCTI0NjM1IDogIkQ3REMiLAoJCTMyNDM3IDogIkQ3REQiLAoJCTM3MDQ5IDogIkQ3REUiLAoJCTM2MjA4IDogIkQ3REYiLAoJCTIyODYzIDogIkQ3RTAiLAoJCTI1NTQ5IDogIkQ3RTEiLAoJCTMxMTk5IDogIkQ3RTIiLAoJCTM2Mjc1IDogIkQ3RTMiLAoJCTIxMzMwIDogIkQ3RTQiLAoJCTI2MDYzIDogIkQ3RTUiLAoJCTMxMDYyIDogIkQ3RTYiLAoJCTM1NzgxIDogIkQ3RTciLAoJCTM4NDU5IDogIkQ3RTgiLAoJCTMyNDUyIDogIkQ3RTkiLAoJCTM4MDc1IDogIkQ3RUEiLAoJCTMyMzg2IDogIkQ3RUIiLAoJCTIyMDY4IDogIkQ3RUMiLAoJCTM3MjU3IDogIkQ3RUQiLAoJCTI2MzY4IDogIkQ3RUUiLAoJCTMyNjE4IDogIkQ3RUYiLAoJCTIzNTYyIDogIkQ3RjAiLAoJCTM2OTgxIDogIkQ3RjEiLAoJCTI2MTUyIDogIkQ3RjIiLAoJCTI0MDM4IDogIkQ3RjMiLAoJCTIwMzA0IDogIkQ3RjQiLAoJCTI2NTkwIDogIkQ3RjUiLAoJCTIwNTcwIDogIkQ3RjYiLAoJCTIwMzE2IDogIkQ3RjciLAoJCTIyMzUyIDogIkQ3RjgiLAoJCTI0MjMxIDogIkQ3RjkiLAoJCTIwMTA5IDogIkQ4QTEiLAoJCTE5OTgwIDogIkQ4QTIiLAoJCTIwODAwIDogIkQ4QTMiLAoJCTE5OTg0IDogIkQ4QTQiLAoJCTI0MzE5IDogIkQ4QTUiLAoJCTIxMzE3IDogIkQ4QTYiLAoJCTE5OTg5IDogIkQ4QTciLAoJCTIwMTIwIDogIkQ4QTgiLAoJCTE5OTk4IDogIkQ4QTkiLAoJCTM5NzMwIDogIkQ4QUEiLAoJCTIzNDA0IDogIkQ4QUIiLAoJCTIyMTIxIDogIkQ4QUMiLAoJCTIwMDA4IDogIkQ4QUQiLAoJCTMxMTYyIDogIkQ4QUUiLAoJCTIwMDMxIDogIkQ4QUYiLAoJCTIxMjY5IDogIkQ4QjAiLAoJCTIwMDM5IDogIkQ4QjEiLAoJCTIyODI5IDogIkQ4QjIiLAoJCTI5MjQzIDogIkQ4QjMiLAoJCTIxMzU4IDogIkQ4QjQiLAoJCTI3NjY0IDogIkQ4QjUiLAoJCTIyMjM5IDogIkQ4QjYiLAoJCTMyOTk2IDogIkQ4QjciLAoJCTM5MzE5IDogIkQ4QjgiLAoJCTI3NjAzIDogIkQ4QjkiLAoJCTMwNTkwIDogIkQ4QkEiLAoJCTQwNzI3IDogIkQ4QkIiLAoJCTIwMDIyIDogIkQ4QkMiLAoJCTIwMTI3IDogIkQ4QkQiLAoJCTQwNzIwIDogIkQ4QkUiLAoJCTIwMDYwIDogIkQ4QkYiLAoJCTIwMDczIDogIkQ4QzAiLAoJCTIwMTE1IDogIkQ4QzEiLAoJCTMzNDE2IDogIkQ4QzIiLAoJCTIzMzg3IDogIkQ4QzMiLAoJCTIxODY4IDogIkQ4QzQiLAoJCTIyMDMxIDogIkQ4QzUiLAoJCTIwMTY0IDogIkQ4QzYiLAoJCTIxMzg5IDogIkQ4QzciLAoJCTIxNDA1IDogIkQ4QzgiLAoJCTIxNDExIDogIkQ4QzkiLAoJCTIxNDEzIDogIkQ4Q0EiLAoJCTIxNDIyIDogIkQ4Q0IiLAoJCTM4NzU3IDogIkQ4Q0MiLAoJCTM2MTg5IDogIkQ4Q0QiLAoJCTIxMjc0IDogIkQ4Q0UiLAoJCTIxNDkzIDogIkQ4Q0YiLAoJCTIxMjg2IDogIkQ4RDAiLAoJCTIxMjk0IDogIkQ4RDEiLAoJCTIxMzEwIDogIkQ4RDIiLAoJCTM2MTg4IDogIkQ4RDMiLAoJCTIxMzUwIDogIkQ4RDQiLAoJCTIxMzQ3IDogIkQ4RDUiLAoJCTIwOTk0IDogIkQ4RDYiLAoJCTIxMDAwIDogIkQ4RDciLAoJCTIxMDA2IDogIkQ4RDgiLAoJCTIxMDM3IDogIkQ4RDkiLAoJCTIxMDQzIDogIkQ4REEiLAoJCTIxMDU1IDogIkQ4REIiLAoJCTIxMDU2IDogIkQ4REMiLAoJCTIxMDY4IDogIkQ4REQiLAoJCTIxMDg2IDogIkQ4REUiLAoJCTIxMDg5IDogIkQ4REYiLAoJCTIxMDg0IDogIkQ4RTAiLAoJCTMzOTY3IDogIkQ4RTEiLAoJCTIxMTE3IDogIkQ4RTIiLAoJCTIxMTIyIDogIkQ4RTMiLAoJCTIxMTIxIDogIkQ4RTQiLAoJCTIxMTM2IDogIkQ4RTUiLAoJCTIxMTM5IDogIkQ4RTYiLAoJCTIwODY2IDogIkQ4RTciLAoJCTMyNTk2IDogIkQ4RTgiLAoJCTIwMTU1IDogIkQ4RTkiLAoJCTIwMTYzIDogIkQ4RUEiLAoJCTIwMTY5IDogIkQ4RUIiLAoJCTIwMTYyIDogIkQ4RUMiLAoJCTIwMjAwIDogIkQ4RUQiLAoJCTIwMTkzIDogIkQ4RUUiLAoJCTIwMjAzIDogIkQ4RUYiLAoJCTIwMTkwIDogIkQ4RjAiLAoJCTIwMjUxIDogIkQ4RjEiLAoJCTIwMjExIDogIkQ4RjIiLAoJCTIwMjU4IDogIkQ4RjMiLAoJCTIwMzI0IDogIkQ4RjQiLAoJCTIwMjEzIDogIkQ4RjUiLAoJCTIwMjYxIDogIkQ4RjYiLAoJCTIwMjYzIDogIkQ4RjciLAoJCTIwMjMzIDogIkQ4RjgiLAoJCTIwMjY3IDogIkQ4RjkiLAoJCTIwMzE4IDogIkQ4RkEiLAoJCTIwMzI3IDogIkQ4RkIiLAoJCTI1OTEyIDogIkQ4RkMiLAoJCTIwMzE0IDogIkQ4RkQiLAoJCTIwMzE3IDogIkQ4RkUiLAoJCTIwMzE5IDogIkQ5QTEiLAoJCTIwMzExIDogIkQ5QTIiLAoJCTIwMjc0IDogIkQ5QTMiLAoJCTIwMjg1IDogIkQ5QTQiLAoJCTIwMzQyIDogIkQ5QTUiLAoJCTIwMzQwIDogIkQ5QTYiLAoJCTIwMzY5IDogIkQ5QTciLAoJCTIwMzYxIDogIkQ5QTgiLAoJCTIwMzU1IDogIkQ5QTkiLAoJCTIwMzY3IDogIkQ5QUEiLAoJCTIwMzUwIDogIkQ5QUIiLAoJCTIwMzQ3IDogIkQ5QUMiLAoJCTIwMzk0IDogIkQ5QUQiLAoJCTIwMzQ4IDogIkQ5QUUiLAoJCTIwMzk2IDogIkQ5QUYiLAoJCTIwMzcyIDogIkQ5QjAiLAoJCTIwNDU0IDogIkQ5QjEiLAoJCTIwNDU2IDogIkQ5QjIiLAoJCTIwNDU4IDogIkQ5QjMiLAoJCTIwNDIxIDogIkQ5QjQiLAoJCTIwNDQyIDogIkQ5QjUiLAoJCTIwNDUxIDogIkQ5QjYiLAoJCTIwNDQ0IDogIkQ5QjciLAoJCTIwNDMzIDogIkQ5QjgiLAoJCTIwNDQ3IDogIkQ5QjkiLAoJCTIwNDcyIDogIkQ5QkEiLAoJCTIwNTIxIDogIkQ5QkIiLAoJCTIwNTU2IDogIkQ5QkMiLAoJCTIwNDY3IDogIkQ5QkQiLAoJCTIwNTI0IDogIkQ5QkUiLAoJCTIwNDk1IDogIkQ5QkYiLAoJCTIwNTI2IDogIkQ5QzAiLAoJCTIwNTI1IDogIkQ5QzEiLAoJCTIwNDc4IDogIkQ5QzIiLAoJCTIwNTA4IDogIkQ5QzMiLAoJCTIwNDkyIDogIkQ5QzQiLAoJCTIwNTE3IDogIkQ5QzUiLAoJCTIwNTIwIDogIkQ5QzYiLAoJCTIwNjA2IDogIkQ5QzciLAoJCTIwNTQ3IDogIkQ5QzgiLAoJCTIwNTY1IDogIkQ5QzkiLAoJCTIwNTUyIDogIkQ5Q0EiLAoJCTIwNTU4IDogIkQ5Q0IiLAoJCTIwNTg4IDogIkQ5Q0MiLAoJCTIwNjAzIDogIkQ5Q0QiLAoJCTIwNjQ1IDogIkQ5Q0UiLAoJCTIwNjQ3IDogIkQ5Q0YiLAoJCTIwNjQ5IDogIkQ5RDAiLAoJCTIwNjY2IDogIkQ5RDEiLAoJCTIwNjk0IDogIkQ5RDIiLAoJCTIwNzQyIDogIkQ5RDMiLAoJCTIwNzE3IDogIkQ5RDQiLAoJCTIwNzE2IDogIkQ5RDUiLAoJCTIwNzEwIDogIkQ5RDYiLAoJCTIwNzE4IDogIkQ5RDciLAoJCTIwNzQzIDogIkQ5RDgiLAoJCTIwNzQ3IDogIkQ5RDkiLAoJCTIwMTg5IDogIkQ5REEiLAoJCTI3NzA5IDogIkQ5REIiLAoJCTIwMzEyIDogIkQ5REMiLAoJCTIwMzI1IDogIkQ5REQiLAoJCTIwNDMwIDogIkQ5REUiLAoJCTQwODY0IDogIkQ5REYiLAoJCTI3NzE4IDogIkQ5RTAiLAoJCTMxODYwIDogIkQ5RTEiLAoJCTIwODQ2IDogIkQ5RTIiLAoJCTI0MDYxIDogIkQ5RTMiLAoJCTQwNjQ5IDogIkQ5RTQiLAoJCTM5MzIwIDogIkQ5RTUiLAoJCTIwODY1IDogIkQ5RTYiLAoJCTIyODA0IDogIkQ5RTciLAoJCTIxMjQxIDogIkQ5RTgiLAoJCTIxMjYxIDogIkQ5RTkiLAoJCTM1MzM1IDogIkQ5RUEiLAoJCTIxMjY0IDogIkQ5RUIiLAoJCTIwOTcxIDogIkQ5RUMiLAoJCTIyODA5IDogIkQ5RUQiLAoJCTIwODIxIDogIkQ5RUUiLAoJCTIwMTI4IDogIkQ5RUYiLAoJCTIwODIyIDogIkQ5RjAiLAoJCTIwMTQ3IDogIkQ5RjEiLAoJCTM0OTI2IDogIkQ5RjIiLAoJCTM0OTgwIDogIkQ5RjMiLAoJCTIwMTQ5IDogIkQ5RjQiLAoJCTMzMDQ0IDogIkQ5RjUiLAoJCTM1MDI2IDogIkQ5RjYiLAoJCTMxMTA0IDogIkQ5RjciLAoJCTIzMzQ4IDogIkQ5RjgiLAoJCTM0ODE5IDogIkQ5RjkiLAoJCTMyNjk2IDogIkQ5RkEiLAoJCTIwOTA3IDogIkQ5RkIiLAoJCTIwOTEzIDogIkQ5RkMiLAoJCTIwOTI1IDogIkQ5RkQiLAoJCTIwOTI0IDogIkQ5RkUiLAoJCTIwOTM1IDogIkRBQTEiLAoJCTIwODg2IDogIkRBQTIiLAoJCTIwODk4IDogIkRBQTMiLAoJCTIwOTAxIDogIkRBQTQiLAoJCTM1NzQ0IDogIkRBQTUiLAoJCTM1NzUwIDogIkRBQTYiLAoJCTM1NzUxIDogIkRBQTciLAoJCTM1NzU0IDogIkRBQTgiLAoJCTM1NzY0IDogIkRBQTkiLAoJCTM1NzY1IDogIkRBQUEiLAoJCTM1NzY3IDogIkRBQUIiLAoJCTM1Nzc4IDogIkRBQUMiLAoJCTM1Nzc5IDogIkRBQUQiLAoJCTM1Nzg3IDogIkRBQUUiLAoJCTM1NzkxIDogIkRBQUYiLAoJCTM1NzkwIDogIkRBQjAiLAoJCTM1Nzk0IDogIkRBQjEiLAoJCTM1Nzk1IDogIkRBQjIiLAoJCTM1Nzk2IDogIkRBQjMiLAoJCTM1Nzk4IDogIkRBQjQiLAoJCTM1ODAwIDogIkRBQjUiLAoJCTM1ODAxIDogIkRBQjYiLAoJCTM1ODA0IDogIkRBQjciLAoJCTM1ODA3IDogIkRBQjgiLAoJCTM1ODA4IDogIkRBQjkiLAoJCTM1ODEyIDogIkRBQkEiLAoJCTM1ODE2IDogIkRBQkIiLAoJCTM1ODE3IDogIkRBQkMiLAoJCTM1ODIyIDogIkRBQkQiLAoJCTM1ODI0IDogIkRBQkUiLAoJCTM1ODI3IDogIkRBQkYiLAoJCTM1ODMwIDogIkRBQzAiLAoJCTM1ODMzIDogIkRBQzEiLAoJCTM1ODM2IDogIkRBQzIiLAoJCTM1ODM5IDogIkRBQzMiLAoJCTM1ODQwIDogIkRBQzQiLAoJCTM1ODQyIDogIkRBQzUiLAoJCTM1ODQ0IDogIkRBQzYiLAoJCTM1ODQ3IDogIkRBQzciLAoJCTM1ODUyIDogIkRBQzgiLAoJCTM1ODU1IDogIkRBQzkiLAoJCTM1ODU3IDogIkRBQ0EiLAoJCTM1ODU4IDogIkRBQ0IiLAoJCTM1ODYwIDogIkRBQ0MiLAoJCTM1ODYxIDogIkRBQ0QiLAoJCTM1ODYyIDogIkRBQ0UiLAoJCTM1ODY1IDogIkRBQ0YiLAoJCTM1ODY3IDogIkRBRDAiLAoJCTM1ODY0IDogIkRBRDEiLAoJCTM1ODY5IDogIkRBRDIiLAoJCTM1ODcxIDogIkRBRDMiLAoJCTM1ODcyIDogIkRBRDQiLAoJCTM1ODczIDogIkRBRDUiLAoJCTM1ODc3IDogIkRBRDYiLAoJCTM1ODc5IDogIkRBRDciLAoJCTM1ODgyIDogIkRBRDgiLAoJCTM1ODgzIDogIkRBRDkiLAoJCTM1ODg2IDogIkRBREEiLAoJCTM1ODg3IDogIkRBREIiLAoJCTM1ODkwIDogIkRBREMiLAoJCTM1ODkxIDogIkRBREQiLAoJCTM1ODkzIDogIkRBREUiLAoJCTM1ODk0IDogIkRBREYiLAoJCTIxMzUzIDogIkRBRTAiLAoJCTIxMzcwIDogIkRBRTEiLAoJCTM4NDI5IDogIkRBRTIiLAoJCTM4NDM0IDogIkRBRTMiLAoJCTM4NDMzIDogIkRBRTQiLAoJCTM4NDQ5IDogIkRBRTUiLAoJCTM4NDQyIDogIkRBRTYiLAoJCTM4NDYxIDogIkRBRTciLAoJCTM4NDYwIDogIkRBRTgiLAoJCTM4NDY2IDogIkRBRTkiLAoJCTM4NDczIDogIkRBRUEiLAoJCTM4NDg0IDogIkRBRUIiLAoJCTM4NDk1IDogIkRBRUMiLAoJCTM4NTAzIDogIkRBRUQiLAoJCTM4NTA4IDogIkRBRUUiLAoJCTM4NTE0IDogIkRBRUYiLAoJCTM4NTE2IDogIkRBRjAiLAoJCTM4NTM2IDogIkRBRjEiLAoJCTM4NTQxIDogIkRBRjIiLAoJCTM4NTUxIDogIkRBRjMiLAoJCTM4NTc2IDogIkRBRjQiLAoJCTM3MDE1IDogIkRBRjUiLAoJCTM3MDE5IDogIkRBRjYiLAoJCTM3MDIxIDogIkRBRjciLAoJCTM3MDE3IDogIkRBRjgiLAoJCTM3MDM2IDogIkRBRjkiLAoJCTM3MDI1IDogIkRBRkEiLAoJCTM3MDQ0IDogIkRBRkIiLAoJCTM3MDQzIDogIkRBRkMiLAoJCTM3MDQ2IDogIkRBRkQiLAoJCTM3MDUwIDogIkRBRkUiLAoJCTM3MDQ4IDogIkRCQTEiLAoJCTM3MDQwIDogIkRCQTIiLAoJCTM3MDcxIDogIkRCQTMiLAoJCTM3MDYxIDogIkRCQTQiLAoJCTM3MDU0IDogIkRCQTUiLAoJCTM3MDcyIDogIkRCQTYiLAoJCTM3MDYwIDogIkRCQTciLAoJCTM3MDYzIDogIkRCQTgiLAoJCTM3MDc1IDogIkRCQTkiLAoJCTM3MDk0IDogIkRCQUEiLAoJCTM3MDkwIDogIkRCQUIiLAoJCTM3MDg0IDogIkRCQUMiLAoJCTM3MDc5IDogIkRCQUQiLAoJCTM3MDgzIDogIkRCQUUiLAoJCTM3MDk5IDogIkRCQUYiLAoJCTM3MTAzIDogIkRCQjAiLAoJCTM3MTE4IDogIkRCQjEiLAoJCTM3MTI0IDogIkRCQjIiLAoJCTM3MTU0IDogIkRCQjMiLAoJCTM3MTUwIDogIkRCQjQiLAoJCTM3MTU1IDogIkRCQjUiLAoJCTM3MTY5IDogIkRCQjYiLAoJCTM3MTY3IDogIkRCQjciLAoJCTM3MTc3IDogIkRCQjgiLAoJCTM3MTg3IDogIkRCQjkiLAoJCTM3MTkwIDogIkRCQkEiLAoJCTIxMDA1IDogIkRCQkIiLAoJCTIyODUwIDogIkRCQkMiLAoJCTIxMTU0IDogIkRCQkQiLAoJCTIxMTY0IDogIkRCQkUiLAoJCTIxMTY1IDogIkRCQkYiLAoJCTIxMTgyIDogIkRCQzAiLAoJCTIxNzU5IDogIkRCQzEiLAoJCTIxMjAwIDogIkRCQzIiLAoJCTIxMjA2IDogIkRCQzMiLAoJCTIxMjMyIDogIkRCQzQiLAoJCTIxNDcxIDogIkRCQzUiLAoJCTI5MTY2IDogIkRCQzYiLAoJCTMwNjY5IDogIkRCQzciLAoJCTI0MzA4IDogIkRCQzgiLAoJCTIwOTgxIDogIkRCQzkiLAoJCTIwOTg4IDogIkRCQ0EiLAoJCTM5NzI3IDogIkRCQ0IiLAoJCTIxNDMwIDogIkRCQ0MiLAoJCTI0MzIxIDogIkRCQ0QiLAoJCTMwMDQyIDogIkRCQ0UiLAoJCTI0MDQ3IDogIkRCQ0YiLAoJCTIyMzQ4IDogIkRCRDAiLAoJCTIyNDQxIDogIkRCRDEiLAoJCTIyNDMzIDogIkRCRDIiLAoJCTIyNjU0IDogIkRCRDMiLAoJCTIyNzE2IDogIkRCRDQiLAoJCTIyNzI1IDogIkRCRDUiLAoJCTIyNzM3IDogIkRCRDYiLAoJCTIyMzEzIDogIkRCRDciLAoJCTIyMzE2IDogIkRCRDgiLAoJCTIyMzE0IDogIkRCRDkiLAoJCTIyMzIzIDogIkRCREEiLAoJCTIyMzI5IDogIkRCREIiLAoJCTIyMzE4IDogIkRCREMiLAoJCTIyMzE5IDogIkRCREQiLAoJCTIyMzY0IDogIkRCREUiLAoJCTIyMzMxIDogIkRCREYiLAoJCTIyMzM4IDogIkRCRTAiLAoJCTIyMzc3IDogIkRCRTEiLAoJCTIyNDA1IDogIkRCRTIiLAoJCTIyMzc5IDogIkRCRTMiLAoJCTIyNDA2IDogIkRCRTQiLAoJCTIyMzk2IDogIkRCRTUiLAoJCTIyMzk1IDogIkRCRTYiLAoJCTIyMzc2IDogIkRCRTciLAoJCTIyMzgxIDogIkRCRTgiLAoJCTIyMzkwIDogIkRCRTkiLAoJCTIyMzg3IDogIkRCRUEiLAoJCTIyNDQ1IDogIkRCRUIiLAoJCTIyNDM2IDogIkRCRUMiLAoJCTIyNDEyIDogIkRCRUQiLAoJCTIyNDUwIDogIkRCRUUiLAoJCTIyNDc5IDogIkRCRUYiLAoJCTIyNDM5IDogIkRCRjAiLAoJCTIyNDUyIDogIkRCRjEiLAoJCTIyNDE5IDogIkRCRjIiLAoJCTIyNDMyIDogIkRCRjMiLAoJCTIyNDg1IDogIkRCRjQiLAoJCTIyNDg4IDogIkRCRjUiLAoJCTIyNDkwIDogIkRCRjYiLAoJCTIyNDg5IDogIkRCRjciLAoJCTIyNDgyIDogIkRCRjgiLAoJCTIyNDU2IDogIkRCRjkiLAoJCTIyNTE2IDogIkRCRkEiLAoJCTIyNTExIDogIkRCRkIiLAoJCTIyNTIwIDogIkRCRkMiLAoJCTIyNTAwIDogIkRCRkQiLAoJCTIyNDkzIDogIkRCRkUiLAoJCTIyNTM5IDogIkRDQTEiLAoJCTIyNTQxIDogIkRDQTIiLAoJCTIyNTI1IDogIkRDQTMiLAoJCTIyNTA5IDogIkRDQTQiLAoJCTIyNTI4IDogIkRDQTUiLAoJCTIyNTU4IDogIkRDQTYiLAoJCTIyNTUzIDogIkRDQTciLAoJCTIyNTk2IDogIkRDQTgiLAoJCTIyNTYwIDogIkRDQTkiLAoJCTIyNjI5IDogIkRDQUEiLAoJCTIyNjM2IDogIkRDQUIiLAoJCTIyNjU3IDogIkRDQUMiLAoJCTIyNjY1IDogIkRDQUQiLAoJCTIyNjgyIDogIkRDQUUiLAoJCTIyNjU2IDogIkRDQUYiLAoJCTM5MzM2IDogIkRDQjAiLAoJCTQwNzI5IDogIkRDQjEiLAoJCTI1MDg3IDogIkRDQjIiLAoJCTMzNDAxIDogIkRDQjMiLAoJCTMzNDA1IDogIkRDQjQiLAoJCTMzNDA3IDogIkRDQjUiLAoJCTMzNDIzIDogIkRDQjYiLAoJCTMzNDE4IDogIkRDQjciLAoJCTMzNDQ4IDogIkRDQjgiLAoJCTMzNDEyIDogIkRDQjkiLAoJCTMzNDIyIDogIkRDQkEiLAoJCTMzNDI1IDogIkRDQkIiLAoJCTMzNDMxIDogIkRDQkMiLAoJCTMzNDMzIDogIkRDQkQiLAoJCTMzNDUxIDogIkRDQkUiLAoJCTMzNDY0IDogIkRDQkYiLAoJCTMzNDcwIDogIkRDQzAiLAoJCTMzNDU2IDogIkRDQzEiLAoJCTMzNDgwIDogIkRDQzIiLAoJCTMzNDgyIDogIkRDQzMiLAoJCTMzNTA3IDogIkRDQzQiLAoJCTMzNDMyIDogIkRDQzUiLAoJCTMzNDYzIDogIkRDQzYiLAoJCTMzNDU0IDogIkRDQzciLAoJCTMzNDgzIDogIkRDQzgiLAoJCTMzNDg0IDogIkRDQzkiLAoJCTMzNDczIDogIkRDQ0EiLAoJCTMzNDQ5IDogIkRDQ0IiLAoJCTMzNDYwIDogIkRDQ0MiLAoJCTMzNDQxIDogIkRDQ0QiLAoJCTMzNDUwIDogIkRDQ0UiLAoJCTMzNDM5IDogIkRDQ0YiLAoJCTMzNDc2IDogIkRDRDAiLAoJCTMzNDg2IDogIkRDRDEiLAoJCTMzNDQ0IDogIkRDRDIiLAoJCTMzNTA1IDogIkRDRDMiLAoJCTMzNTQ1IDogIkRDRDQiLAoJCTMzNTI3IDogIkRDRDUiLAoJCTMzNTA4IDogIkRDRDYiLAoJCTMzNTUxIDogIkRDRDciLAoJCTMzNTQzIDogIkRDRDgiLAoJCTMzNTAwIDogIkRDRDkiLAoJCTMzNTI0IDogIkRDREEiLAoJCTMzNDkwIDogIkRDREIiLAoJCTMzNDk2IDogIkRDREMiLAoJCTMzNTQ4IDogIkRDREQiLAoJCTMzNTMxIDogIkRDREUiLAoJCTMzNDkxIDogIkRDREYiLAoJCTMzNTUzIDogIkRDRTAiLAoJCTMzNTYyIDogIkRDRTEiLAoJCTMzNTQyIDogIkRDRTIiLAoJCTMzNTU2IDogIkRDRTMiLAoJCTMzNTU3IDogIkRDRTQiLAoJCTMzNTA0IDogIkRDRTUiLAoJCTMzNDkzIDogIkRDRTYiLAoJCTMzNTY0IDogIkRDRTciLAoJCTMzNjE3IDogIkRDRTgiLAoJCTMzNjI3IDogIkRDRTkiLAoJCTMzNjI4IDogIkRDRUEiLAoJCTMzNTQ0IDogIkRDRUIiLAoJCTMzNjgyIDogIkRDRUMiLAoJCTMzNTk2IDogIkRDRUQiLAoJCTMzNTg4IDogIkRDRUUiLAoJCTMzNTg1IDogIkRDRUYiLAoJCTMzNjkxIDogIkRDRjAiLAoJCTMzNjMwIDogIkRDRjEiLAoJCTMzNTgzIDogIkRDRjIiLAoJCTMzNjE1IDogIkRDRjMiLAoJCTMzNjA3IDogIkRDRjQiLAoJCTMzNjAzIDogIkRDRjUiLAoJCTMzNjMxIDogIkRDRjYiLAoJCTMzNjAwIDogIkRDRjciLAoJCTMzNTU5IDogIkRDRjgiLAoJCTMzNjMyIDogIkRDRjkiLAoJCTMzNTgxIDogIkRDRkEiLAoJCTMzNTk0IDogIkRDRkIiLAoJCTMzNTg3IDogIkRDRkMiLAoJCTMzNjM4IDogIkRDRkQiLAoJCTMzNjM3IDogIkRDRkUiLAoJCTMzNjQwIDogIkREQTEiLAoJCTMzNTYzIDogIkREQTIiLAoJCTMzNjQxIDogIkREQTMiLAoJCTMzNjQ0IDogIkREQTQiLAoJCTMzNjQyIDogIkREQTUiLAoJCTMzNjQ1IDogIkREQTYiLAoJCTMzNjQ2IDogIkREQTciLAoJCTMzNzEyIDogIkREQTgiLAoJCTMzNjU2IDogIkREQTkiLAoJCTMzNzE1IDogIkREQUEiLAoJCTMzNzE2IDogIkREQUIiLAoJCTMzNjk2IDogIkREQUMiLAoJCTMzNzA2IDogIkREQUQiLAoJCTMzNjgzIDogIkREQUUiLAoJCTMzNjkyIDogIkREQUYiLAoJCTMzNjY5IDogIkREQjAiLAoJCTMzNjYwIDogIkREQjEiLAoJCTMzNzE4IDogIkREQjIiLAoJCTMzNzA1IDogIkREQjMiLAoJCTMzNjYxIDogIkREQjQiLAoJCTMzNzIwIDogIkREQjUiLAoJCTMzNjU5IDogIkREQjYiLAoJCTMzNjg4IDogIkREQjciLAoJCTMzNjk0IDogIkREQjgiLAoJCTMzNzA0IDogIkREQjkiLAoJCTMzNzIyIDogIkREQkEiLAoJCTMzNzI0IDogIkREQkIiLAoJCTMzNzI5IDogIkREQkMiLAoJCTMzNzkzIDogIkREQkQiLAoJCTMzNzY1IDogIkREQkUiLAoJCTMzNzUyIDogIkREQkYiLAoJCTIyNTM1IDogIkREQzAiLAoJCTMzODE2IDogIkREQzEiLAoJCTMzODAzIDogIkREQzIiLAoJCTMzNzU3IDogIkREQzMiLAoJCTMzNzg5IDogIkREQzQiLAoJCTMzNzUwIDogIkREQzUiLAoJCTMzODIwIDogIkREQzYiLAoJCTMzODQ4IDogIkREQzciLAoJCTMzODA5IDogIkREQzgiLAoJCTMzNzk4IDogIkREQzkiLAoJCTMzNzQ4IDogIkREQ0EiLAoJCTMzNzU5IDogIkREQ0IiLAoJCTMzODA3IDogIkREQ0MiLAoJCTMzNzk1IDogIkREQ0QiLAoJCTMzNzg0IDogIkREQ0UiLAoJCTMzNzg1IDogIkREQ0YiLAoJCTMzNzcwIDogIkRERDAiLAoJCTMzNzMzIDogIkRERDEiLAoJCTMzNzI4IDogIkRERDIiLAoJCTMzODMwIDogIkRERDMiLAoJCTMzNzc2IDogIkRERDQiLAoJCTMzNzYxIDogIkRERDUiLAoJCTMzODg0IDogIkRERDYiLAoJCTMzODczIDogIkRERDciLAoJCTMzODgyIDogIkRERDgiLAoJCTMzODgxIDogIkRERDkiLAoJCTMzOTA3IDogIkREREEiLAoJCTMzOTI3IDogIkREREIiLAoJCTMzOTI4IDogIkREREMiLAoJCTMzOTE0IDogIkREREQiLAoJCTMzOTI5IDogIkREREUiLAoJCTMzOTEyIDogIkREREYiLAoJCTMzODUyIDogIkRERTAiLAoJCTMzODYyIDogIkRERTEiLAoJCTMzODk3IDogIkRERTIiLAoJCTMzOTEwIDogIkRERTMiLAoJCTMzOTMyIDogIkRERTQiLAoJCTMzOTM0IDogIkRERTUiLAoJCTMzODQxIDogIkRERTYiLAoJCTMzOTAxIDogIkRERTciLAoJCTMzOTg1IDogIkRERTgiLAoJCTMzOTk3IDogIkRERTkiLAoJCTM0MDAwIDogIkRERUEiLAoJCTM0MDIyIDogIkRERUIiLAoJCTMzOTgxIDogIkRERUMiLAoJCTM0MDAzIDogIkRERUQiLAoJCTMzOTk0IDogIkRERUUiLAoJCTMzOTgzIDogIkRERUYiLAoJCTMzOTc4IDogIkRERjAiLAoJCTM0MDE2IDogIkRERjEiLAoJCTMzOTUzIDogIkRERjIiLAoJCTMzOTc3IDogIkRERjMiLAoJCTMzOTcyIDogIkRERjQiLAoJCTMzOTQzIDogIkRERjUiLAoJCTM0MDIxIDogIkRERjYiLAoJCTM0MDE5IDogIkRERjciLAoJCTM0MDYwIDogIkRERjgiLAoJCTI5OTY1IDogIkRERjkiLAoJCTM0MTA0IDogIkRERkEiLAoJCTM0MDMyIDogIkRERkIiLAoJCTM0MTA1IDogIkRERkMiLAoJCTM0MDc5IDogIkRERkQiLAoJCTM0MTA2IDogIkRERkUiLAoJCTM0MTM0IDogIkRFQTEiLAoJCTM0MTA3IDogIkRFQTIiLAoJCTM0MDQ3IDogIkRFQTMiLAoJCTM0MDQ0IDogIkRFQTQiLAoJCTM0MTM3IDogIkRFQTUiLAoJCTM0MTIwIDogIkRFQTYiLAoJCTM0MTUyIDogIkRFQTciLAoJCTM0MTQ4IDogIkRFQTgiLAoJCTM0MTQyIDogIkRFQTkiLAoJCTM0MTcwIDogIkRFQUEiLAoJCTMwNjI2IDogIkRFQUIiLAoJCTM0MTE1IDogIkRFQUMiLAoJCTM0MTYyIDogIkRFQUQiLAoJCTM0MTcxIDogIkRFQUUiLAoJCTM0MjEyIDogIkRFQUYiLAoJCTM0MjE2IDogIkRFQjAiLAoJCTM0MTgzIDogIkRFQjEiLAoJCTM0MTkxIDogIkRFQjIiLAoJCTM0MTY5IDogIkRFQjMiLAoJCTM0MjIyIDogIkRFQjQiLAoJCTM0MjA0IDogIkRFQjUiLAoJCTM0MTgxIDogIkRFQjYiLAoJCTM0MjMzIDogIkRFQjciLAoJCTM0MjMxIDogIkRFQjgiLAoJCTM0MjI0IDogIkRFQjkiLAoJCTM0MjU5IDogIkRFQkEiLAoJCTM0MjQxIDogIkRFQkIiLAoJCTM0MjY4IDogIkRFQkMiLAoJCTM0MzAzIDogIkRFQkQiLAoJCTM0MzQzIDogIkRFQkUiLAoJCTM0MzA5IDogIkRFQkYiLAoJCTM0MzQ1IDogIkRFQzAiLAoJCTM0MzI2IDogIkRFQzEiLAoJCTM0MzY0IDogIkRFQzIiLAoJCTI0MzE4IDogIkRFQzMiLAoJCTI0MzI4IDogIkRFQzQiLAoJCTIyODQ0IDogIkRFQzUiLAoJCTIyODQ5IDogIkRFQzYiLAoJCTMyODIzIDogIkRFQzciLAoJCTIyODY5IDogIkRFQzgiLAoJCTIyODc0IDogIkRFQzkiLAoJCTIyODcyIDogIkRFQ0EiLAoJCTIxMjYzIDogIkRFQ0IiLAoJCTIzNTg2IDogIkRFQ0MiLAoJCTIzNTg5IDogIkRFQ0QiLAoJCTIzNTk2IDogIkRFQ0UiLAoJCTIzNjA0IDogIkRFQ0YiLAoJCTI1MTY0IDogIkRFRDAiLAoJCTI1MTk0IDogIkRFRDEiLAoJCTI1MjQ3IDogIkRFRDIiLAoJCTI1Mjc1IDogIkRFRDMiLAoJCTI1MjkwIDogIkRFRDQiLAoJCTI1MzA2IDogIkRFRDUiLAoJCTI1MzAzIDogIkRFRDYiLAoJCTI1MzI2IDogIkRFRDciLAoJCTI1Mzc4IDogIkRFRDgiLAoJCTI1MzM0IDogIkRFRDkiLAoJCTI1NDAxIDogIkRFREEiLAoJCTI1NDE5IDogIkRFREIiLAoJCTI1NDExIDogIkRFREMiLAoJCTI1NTE3IDogIkRFREQiLAoJCTI1NTkwIDogIkRFREUiLAoJCTI1NDU3IDogIkRFREYiLAoJCTI1NDY2IDogIkRFRTAiLAoJCTI1NDg2IDogIkRFRTEiLAoJCTI1NTI0IDogIkRFRTIiLAoJCTI1NDUzIDogIkRFRTMiLAoJCTI1NTE2IDogIkRFRTQiLAoJCTI1NDgyIDogIkRFRTUiLAoJCTI1NDQ5IDogIkRFRTYiLAoJCTI1NTE4IDogIkRFRTciLAoJCTI1NTMyIDogIkRFRTgiLAoJCTI1NTg2IDogIkRFRTkiLAoJCTI1NTkyIDogIkRFRUEiLAoJCTI1NTY4IDogIkRFRUIiLAoJCTI1NTk5IDogIkRFRUMiLAoJCTI1NTQwIDogIkRFRUQiLAoJCTI1NTY2IDogIkRFRUUiLAoJCTI1NTUwIDogIkRFRUYiLAoJCTI1NjgyIDogIkRFRjAiLAoJCTI1NTQyIDogIkRFRjEiLAoJCTI1NTM0IDogIkRFRjIiLAoJCTI1NjY5IDogIkRFRjMiLAoJCTI1NjY1IDogIkRFRjQiLAoJCTI1NjExIDogIkRFRjUiLAoJCTI1NjI3IDogIkRFRjYiLAoJCTI1NjMyIDogIkRFRjciLAoJCTI1NjEyIDogIkRFRjgiLAoJCTI1NjM4IDogIkRFRjkiLAoJCTI1NjMzIDogIkRFRkEiLAoJCTI1Njk0IDogIkRFRkIiLAoJCTI1NzMyIDogIkRFRkMiLAoJCTI1NzA5IDogIkRFRkQiLAoJCTI1NzUwIDogIkRFRkUiLAoJCTI1NzIyIDogIkRGQTEiLAoJCTI1NzgzIDogIkRGQTIiLAoJCTI1Nzg0IDogIkRGQTMiLAoJCTI1NzUzIDogIkRGQTQiLAoJCTI1Nzg2IDogIkRGQTUiLAoJCTI1NzkyIDogIkRGQTYiLAoJCTI1ODA4IDogIkRGQTciLAoJCTI1ODE1IDogIkRGQTgiLAoJCTI1ODI4IDogIkRGQTkiLAoJCTI1ODI2IDogIkRGQUEiLAoJCTI1ODY1IDogIkRGQUIiLAoJCTI1ODkzIDogIkRGQUMiLAoJCTI1OTAyIDogIkRGQUQiLAoJCTI0MzMxIDogIkRGQUUiLAoJCTI0NTMwIDogIkRGQUYiLAoJCTI5OTc3IDogIkRGQjAiLAoJCTI0MzM3IDogIkRGQjEiLAoJCTIxMzQzIDogIkRGQjIiLAoJCTIxNDg5IDogIkRGQjMiLAoJCTIxNTAxIDogIkRGQjQiLAoJCTIxNDgxIDogIkRGQjUiLAoJCTIxNDgwIDogIkRGQjYiLAoJCTIxNDk5IDogIkRGQjciLAoJCTIxNTIyIDogIkRGQjgiLAoJCTIxNTI2IDogIkRGQjkiLAoJCTIxNTEwIDogIkRGQkEiLAoJCTIxNTc5IDogIkRGQkIiLAoJCTIxNTg2IDogIkRGQkMiLAoJCTIxNTg3IDogIkRGQkQiLAoJCTIxNTg4IDogIkRGQkUiLAoJCTIxNTkwIDogIkRGQkYiLAoJCTIxNTcxIDogIkRGQzAiLAoJCTIxNTM3IDogIkRGQzEiLAoJCTIxNTkxIDogIkRGQzIiLAoJCTIxNTkzIDogIkRGQzMiLAoJCTIxNTM5IDogIkRGQzQiLAoJCTIxNTU0IDogIkRGQzUiLAoJCTIxNjM0IDogIkRGQzYiLAoJCTIxNjUyIDogIkRGQzciLAoJCTIxNjIzIDogIkRGQzgiLAoJCTIxNjE3IDogIkRGQzkiLAoJCTIxNjA0IDogIkRGQ0EiLAoJCTIxNjU4IDogIkRGQ0IiLAoJCTIxNjU5IDogIkRGQ0MiLAoJCTIxNjM2IDogIkRGQ0QiLAoJCTIxNjIyIDogIkRGQ0UiLAoJCTIxNjA2IDogIkRGQ0YiLAoJCTIxNjYxIDogIkRGRDAiLAoJCTIxNzEyIDogIkRGRDEiLAoJCTIxNjc3IDogIkRGRDIiLAoJCTIxNjk4IDogIkRGRDMiLAoJCTIxNjg0IDogIkRGRDQiLAoJCTIxNzE0IDogIkRGRDUiLAoJCTIxNjcxIDogIkRGRDYiLAoJCTIxNjcwIDogIkRGRDciLAoJCTIxNzE1IDogIkRGRDgiLAoJCTIxNzE2IDogIkRGRDkiLAoJCTIxNjE4IDogIkRGREEiLAoJCTIxNjY3IDogIkRGREIiLAoJCTIxNzE3IDogIkRGREMiLAoJCTIxNjkxIDogIkRGREQiLAoJCTIxNjk1IDogIkRGREUiLAoJCTIxNzA4IDogIkRGREYiLAoJCTIxNzIxIDogIkRGRTAiLAoJCTIxNzIyIDogIkRGRTEiLAoJCTIxNzI0IDogIkRGRTIiLAoJCTIxNjczIDogIkRGRTMiLAoJCTIxNjc0IDogIkRGRTQiLAoJCTIxNjY4IDogIkRGRTUiLAoJCTIxNzI1IDogIkRGRTYiLAoJCTIxNzExIDogIkRGRTciLAoJCTIxNzI2IDogIkRGRTgiLAoJCTIxNzg3IDogIkRGRTkiLAoJCTIxNzM1IDogIkRGRUEiLAoJCTIxNzkyIDogIkRGRUIiLAoJCTIxNzU3IDogIkRGRUMiLAoJCTIxNzgwIDogIkRGRUQiLAoJCTIxNzQ3IDogIkRGRUUiLAoJCTIxNzk0IDogIkRGRUYiLAoJCTIxNzk1IDogIkRGRjAiLAoJCTIxNzc1IDogIkRGRjEiLAoJCTIxNzc3IDogIkRGRjIiLAoJCTIxNzk5IDogIkRGRjMiLAoJCTIxODAyIDogIkRGRjQiLAoJCTIxODYzIDogIkRGRjUiLAoJCTIxOTAzIDogIkRGRjYiLAoJCTIxOTQxIDogIkRGRjciLAoJCTIxODMzIDogIkRGRjgiLAoJCTIxODY5IDogIkRGRjkiLAoJCTIxODI1IDogIkRGRkEiLAoJCTIxODQ1IDogIkRGRkIiLAoJCTIxODIzIDogIkRGRkMiLAoJCTIxODQwIDogIkRGRkQiLAoJCTIxODIwIDogIkRGRkUiLAoJCTIxODE1IDogIkUwQTEiLAoJCTIxODQ2IDogIkUwQTIiLAoJCTIxODc3IDogIkUwQTMiLAoJCTIxODc4IDogIkUwQTQiLAoJCTIxODc5IDogIkUwQTUiLAoJCTIxODExIDogIkUwQTYiLAoJCTIxODA4IDogIkUwQTciLAoJCTIxODUyIDogIkUwQTgiLAoJCTIxODk5IDogIkUwQTkiLAoJCTIxOTcwIDogIkUwQUEiLAoJCTIxODkxIDogIkUwQUIiLAoJCTIxOTM3IDogIkUwQUMiLAoJCTIxOTQ1IDogIkUwQUQiLAoJCTIxODk2IDogIkUwQUUiLAoJCTIxODg5IDogIkUwQUYiLAoJCTIxOTE5IDogIkUwQjAiLAoJCTIxODg2IDogIkUwQjEiLAoJCTIxOTc0IDogIkUwQjIiLAoJCTIxOTA1IDogIkUwQjMiLAoJCTIxODgzIDogIkUwQjQiLAoJCTIxOTgzIDogIkUwQjUiLAoJCTIxOTQ5IDogIkUwQjYiLAoJCTIxOTUwIDogIkUwQjciLAoJCTIxOTA4IDogIkUwQjgiLAoJCTIxOTEzIDogIkUwQjkiLAoJCTIxOTk0IDogIkUwQkEiLAoJCTIyMDA3IDogIkUwQkIiLAoJCTIxOTYxIDogIkUwQkMiLAoJCTIyMDQ3IDogIkUwQkQiLAoJCTIxOTY5IDogIkUwQkUiLAoJCTIxOTk1IDogIkUwQkYiLAoJCTIxOTk2IDogIkUwQzAiLAoJCTIxOTcyIDogIkUwQzEiLAoJCTIxOTkwIDogIkUwQzIiLAoJCTIxOTgxIDogIkUwQzMiLAoJCTIxOTU2IDogIkUwQzQiLAoJCTIxOTk5IDogIkUwQzUiLAoJCTIxOTg5IDogIkUwQzYiLAoJCTIyMDAyIDogIkUwQzciLAoJCTIyMDAzIDogIkUwQzgiLAoJCTIxOTY0IDogIkUwQzkiLAoJCTIxOTY1IDogIkUwQ0EiLAoJCTIxOTkyIDogIkUwQ0IiLAoJCTIyMDA1IDogIkUwQ0MiLAoJCTIxOTg4IDogIkUwQ0QiLAoJCTM2NzU2IDogIkUwQ0UiLAoJCTIyMDQ2IDogIkUwQ0YiLAoJCTIyMDI0IDogIkUwRDAiLAoJCTIyMDI4IDogIkUwRDEiLAoJCTIyMDE3IDogIkUwRDIiLAoJCTIyMDUyIDogIkUwRDMiLAoJCTIyMDUxIDogIkUwRDQiLAoJCTIyMDE0IDogIkUwRDUiLAoJCTIyMDE2IDogIkUwRDYiLAoJCTIyMDU1IDogIkUwRDciLAoJCTIyMDYxIDogIkUwRDgiLAoJCTIyMTA0IDogIkUwRDkiLAoJCTIyMDczIDogIkUwREEiLAoJCTIyMTAzIDogIkUwREIiLAoJCTIyMDYwIDogIkUwREMiLAoJCTIyMDkzIDogIkUwREQiLAoJCTIyMTE0IDogIkUwREUiLAoJCTIyMTA1IDogIkUwREYiLAoJCTIyMTA4IDogIkUwRTAiLAoJCTIyMDkyIDogIkUwRTEiLAoJCTIyMTAwIDogIkUwRTIiLAoJCTIyMTUwIDogIkUwRTMiLAoJCTIyMTE2IDogIkUwRTQiLAoJCTIyMTI5IDogIkUwRTUiLAoJCTIyMTIzIDogIkUwRTYiLAoJCTIyMTM5IDogIkUwRTciLAoJCTIyMTQwIDogIkUwRTgiLAoJCTIyMTQ5IDogIkUwRTkiLAoJCTIyMTYzIDogIkUwRUEiLAoJCTIyMTkxIDogIkUwRUIiLAoJCTIyMjI4IDogIkUwRUMiLAoJCTIyMjMxIDogIkUwRUQiLAoJCTIyMjM3IDogIkUwRUUiLAoJCTIyMjQxIDogIkUwRUYiLAoJCTIyMjYxIDogIkUwRjAiLAoJCTIyMjUxIDogIkUwRjEiLAoJCTIyMjY1IDogIkUwRjIiLAoJCTIyMjcxIDogIkUwRjMiLAoJCTIyMjc2IDogIkUwRjQiLAoJCTIyMjgyIDogIkUwRjUiLAoJCTIyMjgxIDogIkUwRjYiLAoJCTIyMzAwIDogIkUwRjciLAoJCTI0MDc5IDogIkUwRjgiLAoJCTI0MDg5IDogIkUwRjkiLAoJCTI0MDg0IDogIkUwRkEiLAoJCTI0MDgxIDogIkUwRkIiLAoJCTI0MTEzIDogIkUwRkMiLAoJCTI0MTIzIDogIkUwRkQiLAoJCTI0MTI0IDogIkUwRkUiLAoJCTI0MTE5IDogIkUxQTEiLAoJCTI0MTMyIDogIkUxQTIiLAoJCTI0MTQ4IDogIkUxQTMiLAoJCTI0MTU1IDogIkUxQTQiLAoJCTI0MTU4IDogIkUxQTUiLAoJCTI0MTYxIDogIkUxQTYiLAoJCTIzNjkyIDogIkUxQTciLAoJCTIzNjc0IDogIkUxQTgiLAoJCTIzNjkzIDogIkUxQTkiLAoJCTIzNjk2IDogIkUxQUEiLAoJCTIzNzAyIDogIkUxQUIiLAoJCTIzNjg4IDogIkUxQUMiLAoJCTIzNzA0IDogIkUxQUQiLAoJCTIzNzA1IDogIkUxQUUiLAoJCTIzNjk3IDogIkUxQUYiLAoJCTIzNzA2IDogIkUxQjAiLAoJCTIzNzA4IDogIkUxQjEiLAoJCTIzNzMzIDogIkUxQjIiLAoJCTIzNzE0IDogIkUxQjMiLAoJCTIzNzQxIDogIkUxQjQiLAoJCTIzNzI0IDogIkUxQjUiLAoJCTIzNzIzIDogIkUxQjYiLAoJCTIzNzI5IDogIkUxQjciLAoJCTIzNzE1IDogIkUxQjgiLAoJCTIzNzQ1IDogIkUxQjkiLAoJCTIzNzM1IDogIkUxQkEiLAoJCTIzNzQ4IDogIkUxQkIiLAoJCTIzNzYyIDogIkUxQkMiLAoJCTIzNzgwIDogIkUxQkQiLAoJCTIzNzU1IDogIkUxQkUiLAoJCTIzNzgxIDogIkUxQkYiLAoJCTIzODEwIDogIkUxQzAiLAoJCTIzODExIDogIkUxQzEiLAoJCTIzODQ3IDogIkUxQzIiLAoJCTIzODQ2IDogIkUxQzMiLAoJCTIzODU0IDogIkUxQzQiLAoJCTIzODQ0IDogIkUxQzUiLAoJCTIzODM4IDogIkUxQzYiLAoJCTIzODE0IDogIkUxQzciLAoJCTIzODM1IDogIkUxQzgiLAoJCTIzODk2IDogIkUxQzkiLAoJCTIzODcwIDogIkUxQ0EiLAoJCTIzODYwIDogIkUxQ0IiLAoJCTIzODY5IDogIkUxQ0MiLAoJCTIzOTE2IDogIkUxQ0QiLAoJCTIzODk5IDogIkUxQ0UiLAoJCTIzOTE5IDogIkUxQ0YiLAoJCTIzOTAxIDogIkUxRDAiLAoJCTIzOTE1IDogIkUxRDEiLAoJCTIzODgzIDogIkUxRDIiLAoJCTIzODgyIDogIkUxRDMiLAoJCTIzOTEzIDogIkUxRDQiLAoJCTIzOTI0IDogIkUxRDUiLAoJCTIzOTM4IDogIkUxRDYiLAoJCTIzOTYxIDogIkUxRDciLAoJCTIzOTY1IDogIkUxRDgiLAoJCTM1OTU1IDogIkUxRDkiLAoJCTIzOTkxIDogIkUxREEiLAoJCTI0MDA1IDogIkUxREIiLAoJCTI0NDM1IDogIkUxREMiLAoJCTI0NDM5IDogIkUxREQiLAoJCTI0NDUwIDogIkUxREUiLAoJCTI0NDU1IDogIkUxREYiLAoJCTI0NDU3IDogIkUxRTAiLAoJCTI0NDYwIDogIkUxRTEiLAoJCTI0NDY5IDogIkUxRTIiLAoJCTI0NDczIDogIkUxRTMiLAoJCTI0NDc2IDogIkUxRTQiLAoJCTI0NDg4IDogIkUxRTUiLAoJCTI0NDkzIDogIkUxRTYiLAoJCTI0NTAxIDogIkUxRTciLAoJCTI0NTA4IDogIkUxRTgiLAoJCTM0OTE0IDogIkUxRTkiLAoJCTI0NDE3IDogIkUxRUEiLAoJCTI5MzU3IDogIkUxRUIiLAoJCTI5MzYwIDogIkUxRUMiLAoJCTI5MzY0IDogIkUxRUQiLAoJCTI5MzY3IDogIkUxRUUiLAoJCTI5MzY4IDogIkUxRUYiLAoJCTI5Mzc5IDogIkUxRjAiLAoJCTI5Mzc3IDogIkUxRjEiLAoJCTI5MzkwIDogIkUxRjIiLAoJCTI5Mzg5IDogIkUxRjMiLAoJCTI5Mzk0IDogIkUxRjQiLAoJCTI5NDE2IDogIkUxRjUiLAoJCTI5NDIzIDogIkUxRjYiLAoJCTI5NDE3IDogIkUxRjciLAoJCTI5NDI2IDogIkUxRjgiLAoJCTI5NDI4IDogIkUxRjkiLAoJCTI5NDMxIDogIkUxRkEiLAoJCTI5NDQxIDogIkUxRkIiLAoJCTI5NDI3IDogIkUxRkMiLAoJCTI5NDQzIDogIkUxRkQiLAoJCTI5NDM0IDogIkUxRkUiLAoJCTI5NDM1IDogIkUyQTEiLAoJCTI5NDYzIDogIkUyQTIiLAoJCTI5NDU5IDogIkUyQTMiLAoJCTI5NDczIDogIkUyQTQiLAoJCTI5NDUwIDogIkUyQTUiLAoJCTI5NDcwIDogIkUyQTYiLAoJCTI5NDY5IDogIkUyQTciLAoJCTI5NDYxIDogIkUyQTgiLAoJCTI5NDc0IDogIkUyQTkiLAoJCTI5NDk3IDogIkUyQUEiLAoJCTI5NDc3IDogIkUyQUIiLAoJCTI5NDg0IDogIkUyQUMiLAoJCTI5NDk2IDogIkUyQUQiLAoJCTI5NDg5IDogIkUyQUUiLAoJCTI5NTIwIDogIkUyQUYiLAoJCTI5NTE3IDogIkUyQjAiLAoJCTI5NTI3IDogIkUyQjEiLAoJCTI5NTM2IDogIkUyQjIiLAoJCTI5NTQ4IDogIkUyQjMiLAoJCTI5NTUxIDogIkUyQjQiLAoJCTI5NTY2IDogIkUyQjUiLAoJCTMzMzA3IDogIkUyQjYiLAoJCTIyODIxIDogIkUyQjciLAoJCTM5MTQzIDogIkUyQjgiLAoJCTIyODIwIDogIkUyQjkiLAoJCTIyNzg2IDogIkUyQkEiLAoJCTM5MjY3IDogIkUyQkIiLAoJCTM5MjcxIDogIkUyQkMiLAoJCTM5MjcyIDogIkUyQkQiLAoJCTM5MjczIDogIkUyQkUiLAoJCTM5Mjc0IDogIkUyQkYiLAoJCTM5Mjc1IDogIkUyQzAiLAoJCTM5Mjc2IDogIkUyQzEiLAoJCTM5Mjg0IDogIkUyQzIiLAoJCTM5Mjg3IDogIkUyQzMiLAoJCTM5MjkzIDogIkUyQzQiLAoJCTM5Mjk2IDogIkUyQzUiLAoJCTM5MzAwIDogIkUyQzYiLAoJCTM5MzAzIDogIkUyQzciLAoJCTM5MzA2IDogIkUyQzgiLAoJCTM5MzA5IDogIkUyQzkiLAoJCTM5MzEyIDogIkUyQ0EiLAoJCTM5MzEzIDogIkUyQ0IiLAoJCTM5MzE1IDogIkUyQ0MiLAoJCTM5MzE2IDogIkUyQ0QiLAoJCTM5MzE3IDogIkUyQ0UiLAoJCTI0MTkyIDogIkUyQ0YiLAoJCTI0MjA5IDogIkUyRDAiLAoJCTI0MjAzIDogIkUyRDEiLAoJCTI0MjE0IDogIkUyRDIiLAoJCTI0MjI5IDogIkUyRDMiLAoJCTI0MjI0IDogIkUyRDQiLAoJCTI0MjQ5IDogIkUyRDUiLAoJCTI0MjQ1IDogIkUyRDYiLAoJCTI0MjU0IDogIkUyRDciLAoJCTI0MjQzIDogIkUyRDgiLAoJCTM2MTc5IDogIkUyRDkiLAoJCTI0Mjc0IDogIkUyREEiLAoJCTI0MjczIDogIkUyREIiLAoJCTI0MjgzIDogIkUyREMiLAoJCTI0Mjk2IDogIkUyREQiLAoJCTI0Mjk4IDogIkUyREUiLAoJCTMzMjEwIDogIkUyREYiLAoJCTI0NTE2IDogIkUyRTAiLAoJCTI0NTIxIDogIkUyRTEiLAoJCTI0NTM0IDogIkUyRTIiLAoJCTI0NTI3IDogIkUyRTMiLAoJCTI0NTc5IDogIkUyRTQiLAoJCTI0NTU4IDogIkUyRTUiLAoJCTI0NTgwIDogIkUyRTYiLAoJCTI0NTQ1IDogIkUyRTciLAoJCTI0NTQ4IDogIkUyRTgiLAoJCTI0NTc0IDogIkUyRTkiLAoJCTI0NTgxIDogIkUyRUEiLAoJCTI0NTgyIDogIkUyRUIiLAoJCTI0NTU0IDogIkUyRUMiLAoJCTI0NTU3IDogIkUyRUQiLAoJCTI0NTY4IDogIkUyRUUiLAoJCTI0NjAxIDogIkUyRUYiLAoJCTI0NjI5IDogIkUyRjAiLAoJCTI0NjE0IDogIkUyRjEiLAoJCTI0NjAzIDogIkUyRjIiLAoJCTI0NTkxIDogIkUyRjMiLAoJCTI0NTg5IDogIkUyRjQiLAoJCTI0NjE3IDogIkUyRjUiLAoJCTI0NjE5IDogIkUyRjYiLAoJCTI0NTg2IDogIkUyRjciLAoJCTI0NjM5IDogIkUyRjgiLAoJCTI0NjA5IDogIkUyRjkiLAoJCTI0Njk2IDogIkUyRkEiLAoJCTI0Njk3IDogIkUyRkIiLAoJCTI0Njk5IDogIkUyRkMiLAoJCTI0Njk4IDogIkUyRkQiLAoJCTI0NjQyIDogIkUyRkUiLAoJCTI0NjgyIDogIkUzQTEiLAoJCTI0NzAxIDogIkUzQTIiLAoJCTI0NzI2IDogIkUzQTMiLAoJCTI0NzMwIDogIkUzQTQiLAoJCTI0NzQ5IDogIkUzQTUiLAoJCTI0NzMzIDogIkUzQTYiLAoJCTI0NzA3IDogIkUzQTciLAoJCTI0NzIyIDogIkUzQTgiLAoJCTI0NzE2IDogIkUzQTkiLAoJCTI0NzMxIDogIkUzQUEiLAoJCTI0ODEyIDogIkUzQUIiLAoJCTI0NzYzIDogIkUzQUMiLAoJCTI0NzUzIDogIkUzQUQiLAoJCTI0Nzk3IDogIkUzQUUiLAoJCTI0NzkyIDogIkUzQUYiLAoJCTI0Nzc0IDogIkUzQjAiLAoJCTI0Nzk0IDogIkUzQjEiLAoJCTI0NzU2IDogIkUzQjIiLAoJCTI0ODY0IDogIkUzQjMiLAoJCTI0ODcwIDogIkUzQjQiLAoJCTI0ODUzIDogIkUzQjUiLAoJCTI0ODY3IDogIkUzQjYiLAoJCTI0ODIwIDogIkUzQjciLAoJCTI0ODMyIDogIkUzQjgiLAoJCTI0ODQ2IDogIkUzQjkiLAoJCTI0ODc1IDogIkUzQkEiLAoJCTI0OTA2IDogIkUzQkIiLAoJCTI0OTQ5IDogIkUzQkMiLAoJCTI1MDA0IDogIkUzQkQiLAoJCTI0OTgwIDogIkUzQkUiLAoJCTI0OTk5IDogIkUzQkYiLAoJCTI1MDE1IDogIkUzQzAiLAoJCTI1MDQ0IDogIkUzQzEiLAoJCTI1MDc3IDogIkUzQzIiLAoJCTI0NTQxIDogIkUzQzMiLAoJCTM4NTc5IDogIkUzQzQiLAoJCTM4Mzc3IDogIkUzQzUiLAoJCTM4Mzc5IDogIkUzQzYiLAoJCTM4Mzg1IDogIkUzQzciLAoJCTM4Mzg3IDogIkUzQzgiLAoJCTM4Mzg5IDogIkUzQzkiLAoJCTM4MzkwIDogIkUzQ0EiLAoJCTM4Mzk2IDogIkUzQ0IiLAoJCTM4Mzk4IDogIkUzQ0MiLAoJCTM4NDAzIDogIkUzQ0QiLAoJCTM4NDA0IDogIkUzQ0UiLAoJCTM4NDA2IDogIkUzQ0YiLAoJCTM4NDA4IDogIkUzRDAiLAoJCTM4NDEwIDogIkUzRDEiLAoJCTM4NDExIDogIkUzRDIiLAoJCTM4NDEyIDogIkUzRDMiLAoJCTM4NDEzIDogIkUzRDQiLAoJCTM4NDE1IDogIkUzRDUiLAoJCTM4NDE4IDogIkUzRDYiLAoJCTM4NDIxIDogIkUzRDciLAoJCTM4NDIyIDogIkUzRDgiLAoJCTM4NDIzIDogIkUzRDkiLAoJCTM4NDI1IDogIkUzREEiLAoJCTM4NDI2IDogIkUzREIiLAoJCTIwMDEyIDogIkUzREMiLAoJCTI5MjQ3IDogIkUzREQiLAoJCTI1MTA5IDogIkUzREUiLAoJCTI3NzAxIDogIkUzREYiLAoJCTI3NzMyIDogIkUzRTAiLAoJCTI3NzQwIDogIkUzRTEiLAoJCTI3NzIyIDogIkUzRTIiLAoJCTI3ODExIDogIkUzRTMiLAoJCTI3NzgxIDogIkUzRTQiLAoJCTI3NzkyIDogIkUzRTUiLAoJCTI3Nzk2IDogIkUzRTYiLAoJCTI3Nzg4IDogIkUzRTciLAoJCTI3NzUyIDogIkUzRTgiLAoJCTI3NzUzIDogIkUzRTkiLAoJCTI3NzY0IDogIkUzRUEiLAoJCTI3NzY2IDogIkUzRUIiLAoJCTI3NzgyIDogIkUzRUMiLAoJCTI3ODE3IDogIkUzRUQiLAoJCTI3ODU2IDogIkUzRUUiLAoJCTI3ODYwIDogIkUzRUYiLAoJCTI3ODIxIDogIkUzRjAiLAoJCTI3ODk1IDogIkUzRjEiLAoJCTI3ODk2IDogIkUzRjIiLAoJCTI3ODg5IDogIkUzRjMiLAoJCTI3ODYzIDogIkUzRjQiLAoJCTI3ODI2IDogIkUzRjUiLAoJCTI3ODcyIDogIkUzRjYiLAoJCTI3ODYyIDogIkUzRjciLAoJCTI3ODk4IDogIkUzRjgiLAoJCTI3ODgzIDogIkUzRjkiLAoJCTI3ODg2IDogIkUzRkEiLAoJCTI3ODI1IDogIkUzRkIiLAoJCTI3ODU5IDogIkUzRkMiLAoJCTI3ODg3IDogIkUzRkQiLAoJCTI3OTAyIDogIkUzRkUiLAoJCTI3OTYxIDogIkU0QTEiLAoJCTI3OTQzIDogIkU0QTIiLAoJCTI3OTE2IDogIkU0QTMiLAoJCTI3OTcxIDogIkU0QTQiLAoJCTI3OTc2IDogIkU0QTUiLAoJCTI3OTExIDogIkU0QTYiLAoJCTI3OTA4IDogIkU0QTciLAoJCTI3OTI5IDogIkU0QTgiLAoJCTI3OTE4IDogIkU0QTkiLAoJCTI3OTQ3IDogIkU0QUEiLAoJCTI3OTgxIDogIkU0QUIiLAoJCTI3OTUwIDogIkU0QUMiLAoJCTI3OTU3IDogIkU0QUQiLAoJCTI3OTMwIDogIkU0QUUiLAoJCTI3OTgzIDogIkU0QUYiLAoJCTI3OTg2IDogIkU0QjAiLAoJCTI3OTg4IDogIkU0QjEiLAoJCTI3OTU1IDogIkU0QjIiLAoJCTI4MDQ5IDogIkU0QjMiLAoJCTI4MDE1IDogIkU0QjQiLAoJCTI4MDYyIDogIkU0QjUiLAoJCTI4MDY0IDogIkU0QjYiLAoJCTI3OTk4IDogIkU0QjciLAoJCTI4MDUxIDogIkU0QjgiLAoJCTI4MDUyIDogIkU0QjkiLAoJCTI3OTk2IDogIkU0QkEiLAoJCTI4MDAwIDogIkU0QkIiLAoJCTI4MDI4IDogIkU0QkMiLAoJCTI4MDAzIDogIkU0QkQiLAoJCTI4MTg2IDogIkU0QkUiLAoJCTI4MTAzIDogIkU0QkYiLAoJCTI4MTAxIDogIkU0QzAiLAoJCTI4MTI2IDogIkU0QzEiLAoJCTI4MTc0IDogIkU0QzIiLAoJCTI4MDk1IDogIkU0QzMiLAoJCTI4MTI4IDogIkU0QzQiLAoJCTI4MTc3IDogIkU0QzUiLAoJCTI4MTM0IDogIkU0QzYiLAoJCTI4MTI1IDogIkU0QzciLAoJCTI4MTIxIDogIkU0QzgiLAoJCTI4MTgyIDogIkU0QzkiLAoJCTI4MDc1IDogIkU0Q0EiLAoJCTI4MTcyIDogIkU0Q0IiLAoJCTI4MDc4IDogIkU0Q0MiLAoJCTI4MjAzIDogIkU0Q0QiLAoJCTI4MjcwIDogIkU0Q0UiLAoJCTI4MjM4IDogIkU0Q0YiLAoJCTI4MjY3IDogIkU0RDAiLAoJCTI4MzM4IDogIkU0RDEiLAoJCTI4MjU1IDogIkU0RDIiLAoJCTI4Mjk0IDogIkU0RDMiLAoJCTI4MjQzIDogIkU0RDQiLAoJCTI4MjQ0IDogIkU0RDUiLAoJCTI4MjEwIDogIkU0RDYiLAoJCTI4MTk3IDogIkU0RDciLAoJCTI4MjI4IDogIkU0RDgiLAoJCTI4MzgzIDogIkU0RDkiLAoJCTI4MzM3IDogIkU0REEiLAoJCTI4MzEyIDogIkU0REIiLAoJCTI4Mzg0IDogIkU0REMiLAoJCTI4NDYxIDogIkU0REQiLAoJCTI4Mzg2IDogIkU0REUiLAoJCTI4MzI1IDogIkU0REYiLAoJCTI4MzI3IDogIkU0RTAiLAoJCTI4MzQ5IDogIkU0RTEiLAoJCTI4MzQ3IDogIkU0RTIiLAoJCTI4MzQzIDogIkU0RTMiLAoJCTI4Mzc1IDogIkU0RTQiLAoJCTI4MzQwIDogIkU0RTUiLAoJCTI4MzY3IDogIkU0RTYiLAoJCTI4MzAzIDogIkU0RTciLAoJCTI4MzU0IDogIkU0RTgiLAoJCTI4MzE5IDogIkU0RTkiLAoJCTI4NTE0IDogIkU0RUEiLAoJCTI4NDg2IDogIkU0RUIiLAoJCTI4NDg3IDogIkU0RUMiLAoJCTI4NDUyIDogIkU0RUQiLAoJCTI4NDM3IDogIkU0RUUiLAoJCTI4NDA5IDogIkU0RUYiLAoJCTI4NDYzIDogIkU0RjAiLAoJCTI4NDcwIDogIkU0RjEiLAoJCTI4NDkxIDogIkU0RjIiLAoJCTI4NTMyIDogIkU0RjMiLAoJCTI4NDU4IDogIkU0RjQiLAoJCTI4NDI1IDogIkU0RjUiLAoJCTI4NDU3IDogIkU0RjYiLAoJCTI4NTUzIDogIkU0RjciLAoJCTI4NTU3IDogIkU0RjgiLAoJCTI4NTU2IDogIkU0RjkiLAoJCTI4NTM2IDogIkU0RkEiLAoJCTI4NTMwIDogIkU0RkIiLAoJCTI4NTQwIDogIkU0RkMiLAoJCTI4NTM4IDogIkU0RkQiLAoJCTI4NjI1IDogIkU0RkUiLAoJCTI4NjE3IDogIkU1QTEiLAoJCTI4NTgzIDogIkU1QTIiLAoJCTI4NjAxIDogIkU1QTMiLAoJCTI4NTk4IDogIkU1QTQiLAoJCTI4NjEwIDogIkU1QTUiLAoJCTI4NjQxIDogIkU1QTYiLAoJCTI4NjU0IDogIkU1QTciLAoJCTI4NjM4IDogIkU1QTgiLAoJCTI4NjQwIDogIkU1QTkiLAoJCTI4NjU1IDogIkU1QUEiLAoJCTI4Njk4IDogIkU1QUIiLAoJCTI4NzA3IDogIkU1QUMiLAoJCTI4Njk5IDogIkU1QUQiLAoJCTI4NzI5IDogIkU1QUUiLAoJCTI4NzI1IDogIkU1QUYiLAoJCTI4NzUxIDogIkU1QjAiLAoJCTI4NzY2IDogIkU1QjEiLAoJCTIzNDI0IDogIkU1QjIiLAoJCTIzNDI4IDogIkU1QjMiLAoJCTIzNDQ1IDogIkU1QjQiLAoJCTIzNDQzIDogIkU1QjUiLAoJCTIzNDYxIDogIkU1QjYiLAoJCTIzNDgwIDogIkU1QjciLAoJCTI5OTk5IDogIkU1QjgiLAoJCTM5NTgyIDogIkU1QjkiLAoJCTI1NjUyIDogIkU1QkEiLAoJCTIzNTI0IDogIkU1QkIiLAoJCTIzNTM0IDogIkU1QkMiLAoJCTM1MTIwIDogIkU1QkQiLAoJCTIzNTM2IDogIkU1QkUiLAoJCTM2NDIzIDogIkU1QkYiLAoJCTM1NTkxIDogIkU1QzAiLAoJCTM2NzkwIDogIkU1QzEiLAoJCTM2ODE5IDogIkU1QzIiLAoJCTM2ODIxIDogIkU1QzMiLAoJCTM2ODM3IDogIkU1QzQiLAoJCTM2ODQ2IDogIkU1QzUiLAoJCTM2ODM2IDogIkU1QzYiLAoJCTM2ODQxIDogIkU1QzciLAoJCTM2ODM4IDogIkU1QzgiLAoJCTM2ODUxIDogIkU1QzkiLAoJCTM2ODQwIDogIkU1Q0EiLAoJCTM2ODY5IDogIkU1Q0IiLAoJCTM2ODY4IDogIkU1Q0MiLAoJCTM2ODc1IDogIkU1Q0QiLAoJCTM2OTAyIDogIkU1Q0UiLAoJCTM2ODgxIDogIkU1Q0YiLAoJCTM2ODc3IDogIkU1RDAiLAoJCTM2ODg2IDogIkU1RDEiLAoJCTM2ODk3IDogIkU1RDIiLAoJCTM2OTE3IDogIkU1RDMiLAoJCTM2OTE4IDogIkU1RDQiLAoJCTM2OTA5IDogIkU1RDUiLAoJCTM2OTExIDogIkU1RDYiLAoJCTM2OTMyIDogIkU1RDciLAoJCTM2OTQ1IDogIkU1RDgiLAoJCTM2OTQ2IDogIkU1RDkiLAoJCTM2OTQ0IDogIkU1REEiLAoJCTM2OTY4IDogIkU1REIiLAoJCTM2OTUyIDogIkU1REMiLAoJCTM2OTYyIDogIkU1REQiLAoJCTM2OTU1IDogIkU1REUiLAoJCTI2Mjk3IDogIkU1REYiLAoJCTM2OTgwIDogIkU1RTAiLAoJCTM2OTg5IDogIkU1RTEiLAoJCTM2OTk0IDogIkU1RTIiLAoJCTM3MDAwIDogIkU1RTMiLAoJCTM2OTk1IDogIkU1RTQiLAoJCTM3MDAzIDogIkU1RTUiLAoJCTI0NDAwIDogIkU1RTYiLAoJCTI0NDA3IDogIkU1RTciLAoJCTI0NDA2IDogIkU1RTgiLAoJCTI0NDA4IDogIkU1RTkiLAoJCTIzNjExIDogIkU1RUEiLAoJCTIxNjc1IDogIkU1RUIiLAoJCTIzNjMyIDogIkU1RUMiLAoJCTIzNjQxIDogIkU1RUQiLAoJCTIzNDA5IDogIkU1RUUiLAoJCTIzNjUxIDogIkU1RUYiLAoJCTIzNjU0IDogIkU1RjAiLAoJCTMyNzAwIDogIkU1RjEiLAoJCTI0MzYyIDogIkU1RjIiLAoJCTI0MzYxIDogIkU1RjMiLAoJCTI0MzY1IDogIkU1RjQiLAoJCTMzMzk2IDogIkU1RjUiLAoJCTI0MzgwIDogIkU1RjYiLAoJCTM5NzM5IDogIkU1RjciLAoJCTIzNjYyIDogIkU1RjgiLAoJCTIyOTEzIDogIkU1RjkiLAoJCTIyOTE1IDogIkU1RkEiLAoJCTIyOTI1IDogIkU1RkIiLAoJCTIyOTUzIDogIkU1RkMiLAoJCTIyOTU0IDogIkU1RkQiLAoJCTIyOTQ3IDogIkU1RkUiLAoJCTIyOTM1IDogIkU2QTEiLAoJCTIyOTg2IDogIkU2QTIiLAoJCTIyOTU1IDogIkU2QTMiLAoJCTIyOTQyIDogIkU2QTQiLAoJCTIyOTQ4IDogIkU2QTUiLAoJCTIyOTk0IDogIkU2QTYiLAoJCTIyOTYyIDogIkU2QTciLAoJCTIyOTU5IDogIkU2QTgiLAoJCTIyOTk5IDogIkU2QTkiLAoJCTIyOTc0IDogIkU2QUEiLAoJCTIzMDQ1IDogIkU2QUIiLAoJCTIzMDQ2IDogIkU2QUMiLAoJCTIzMDA1IDogIkU2QUQiLAoJCTIzMDQ4IDogIkU2QUUiLAoJCTIzMDExIDogIkU2QUYiLAoJCTIzMDAwIDogIkU2QjAiLAoJCTIzMDMzIDogIkU2QjEiLAoJCTIzMDUyIDogIkU2QjIiLAoJCTIzMDQ5IDogIkU2QjMiLAoJCTIzMDkwIDogIkU2QjQiLAoJCTIzMDkyIDogIkU2QjUiLAoJCTIzMDU3IDogIkU2QjYiLAoJCTIzMDc1IDogIkU2QjciLAoJCTIzMDU5IDogIkU2QjgiLAoJCTIzMTA0IDogIkU2QjkiLAoJCTIzMTQzIDogIkU2QkEiLAoJCTIzMTE0IDogIkU2QkIiLAoJCTIzMTI1IDogIkU2QkMiLAoJCTIzMTAwIDogIkU2QkQiLAoJCTIzMTM4IDogIkU2QkUiLAoJCTIzMTU3IDogIkU2QkYiLAoJCTMzMDA0IDogIkU2QzAiLAoJCTIzMjEwIDogIkU2QzEiLAoJCTIzMTk1IDogIkU2QzIiLAoJCTIzMTU5IDogIkU2QzMiLAoJCTIzMTYyIDogIkU2QzQiLAoJCTIzMjMwIDogIkU2QzUiLAoJCTIzMjc1IDogIkU2QzYiLAoJCTIzMjE4IDogIkU2QzciLAoJCTIzMjUwIDogIkU2QzgiLAoJCTIzMjUyIDogIkU2QzkiLAoJCTIzMjI0IDogIkU2Q0EiLAoJCTIzMjY0IDogIkU2Q0IiLAoJCTIzMjY3IDogIkU2Q0MiLAoJCTIzMjgxIDogIkU2Q0QiLAoJCTIzMjU0IDogIkU2Q0UiLAoJCTIzMjcwIDogIkU2Q0YiLAoJCTIzMjU2IDogIkU2RDAiLAoJCTIzMjYwIDogIkU2RDEiLAoJCTIzMzA1IDogIkU2RDIiLAoJCTIzMzE5IDogIkU2RDMiLAoJCTIzMzE4IDogIkU2RDQiLAoJCTIzMzQ2IDogIkU2RDUiLAoJCTIzMzUxIDogIkU2RDYiLAoJCTIzMzYwIDogIkU2RDciLAoJCTIzNTczIDogIkU2RDgiLAoJCTIzNTgwIDogIkU2RDkiLAoJCTIzMzg2IDogIkU2REEiLAoJCTIzMzk3IDogIkU2REIiLAoJCTIzNDExIDogIkU2REMiLAoJCTIzMzc3IDogIkU2REQiLAoJCTIzMzc5IDogIkU2REUiLAoJCTIzMzk0IDogIkU2REYiLAoJCTM5NTQxIDogIkU2RTAiLAoJCTM5NTQzIDogIkU2RTEiLAoJCTM5NTQ0IDogIkU2RTIiLAoJCTM5NTQ2IDogIkU2RTMiLAoJCTM5NTUxIDogIkU2RTQiLAoJCTM5NTQ5IDogIkU2RTUiLAoJCTM5NTUyIDogIkU2RTYiLAoJCTM5NTUzIDogIkU2RTciLAoJCTM5NTU3IDogIkU2RTgiLAoJCTM5NTYwIDogIkU2RTkiLAoJCTM5NTYyIDogIkU2RUEiLAoJCTM5NTY4IDogIkU2RUIiLAoJCTM5NTcwIDogIkU2RUMiLAoJCTM5NTcxIDogIkU2RUQiLAoJCTM5NTc0IDogIkU2RUUiLAoJCTM5NTc2IDogIkU2RUYiLAoJCTM5NTc5IDogIkU2RjAiLAoJCTM5NTgwIDogIkU2RjEiLAoJCTM5NTgxIDogIkU2RjIiLAoJCTM5NTgzIDogIkU2RjMiLAoJCTM5NTg0IDogIkU2RjQiLAoJCTM5NTg2IDogIkU2RjUiLAoJCTM5NTg3IDogIkU2RjYiLAoJCTM5NTg5IDogIkU2RjciLAoJCTM5NTkxIDogIkU2RjgiLAoJCTMyNDE1IDogIkU2RjkiLAoJCTMyNDE3IDogIkU2RkEiLAoJCTMyNDE5IDogIkU2RkIiLAoJCTMyNDIxIDogIkU2RkMiLAoJCTMyNDI0IDogIkU2RkQiLAoJCTMyNDI1IDogIkU2RkUiLAoJCTMyNDI5IDogIkU3QTEiLAoJCTMyNDMyIDogIkU3QTIiLAoJCTMyNDQ2IDogIkU3QTMiLAoJCTMyNDQ4IDogIkU3QTQiLAoJCTMyNDQ5IDogIkU3QTUiLAoJCTMyNDUwIDogIkU3QTYiLAoJCTMyNDU3IDogIkU3QTciLAoJCTMyNDU5IDogIkU3QTgiLAoJCTMyNDYwIDogIkU3QTkiLAoJCTMyNDY0IDogIkU3QUEiLAoJCTMyNDY4IDogIkU3QUIiLAoJCTMyNDcxIDogIkU3QUMiLAoJCTMyNDc1IDogIkU3QUQiLAoJCTMyNDgwIDogIkU3QUUiLAoJCTMyNDgxIDogIkU3QUYiLAoJCTMyNDg4IDogIkU3QjAiLAoJCTMyNDkxIDogIkU3QjEiLAoJCTMyNDk0IDogIkU3QjIiLAoJCTMyNDk1IDogIkU3QjMiLAoJCTMyNDk3IDogIkU3QjQiLAoJCTMyNDk4IDogIkU3QjUiLAoJCTMyNTI1IDogIkU3QjYiLAoJCTMyNTAyIDogIkU3QjciLAoJCTMyNTA2IDogIkU3QjgiLAoJCTMyNTA3IDogIkU3QjkiLAoJCTMyNTEwIDogIkU3QkEiLAoJCTMyNTEzIDogIkU3QkIiLAoJCTMyNTE0IDogIkU3QkMiLAoJCTMyNTE1IDogIkU3QkQiLAoJCTMyNTE5IDogIkU3QkUiLAoJCTMyNTIwIDogIkU3QkYiLAoJCTMyNTIzIDogIkU3QzAiLAoJCTMyNTI0IDogIkU3QzEiLAoJCTMyNTI3IDogIkU3QzIiLAoJCTMyNTI5IDogIkU3QzMiLAoJCTMyNTMwIDogIkU3QzQiLAoJCTMyNTM1IDogIkU3QzUiLAoJCTMyNTM3IDogIkU3QzYiLAoJCTMyNTQwIDogIkU3QzciLAoJCTMyNTM5IDogIkU3QzgiLAoJCTMyNTQzIDogIkU3QzkiLAoJCTMyNTQ1IDogIkU3Q0EiLAoJCTMyNTQ2IDogIkU3Q0IiLAoJCTMyNTQ3IDogIkU3Q0MiLAoJCTMyNTQ4IDogIkU3Q0QiLAoJCTMyNTQ5IDogIkU3Q0UiLAoJCTMyNTUwIDogIkU3Q0YiLAoJCTMyNTUxIDogIkU3RDAiLAoJCTMyNTU0IDogIkU3RDEiLAoJCTMyNTU1IDogIkU3RDIiLAoJCTMyNTU2IDogIkU3RDMiLAoJCTMyNTU3IDogIkU3RDQiLAoJCTMyNTU5IDogIkU3RDUiLAoJCTMyNTYwIDogIkU3RDYiLAoJCTMyNTYxIDogIkU3RDciLAoJCTMyNTYyIDogIkU3RDgiLAoJCTMyNTYzIDogIkU3RDkiLAoJCTMyNTY1IDogIkU3REEiLAoJCTI0MTg2IDogIkU3REIiLAoJCTMwMDc5IDogIkU3REMiLAoJCTI0MDI3IDogIkU3REQiLAoJCTMwMDE0IDogIkU3REUiLAoJCTM3MDEzIDogIkU3REYiLAoJCTI5NTgyIDogIkU3RTAiLAoJCTI5NTg1IDogIkU3RTEiLAoJCTI5NjE0IDogIkU3RTIiLAoJCTI5NjAyIDogIkU3RTMiLAoJCTI5NTk5IDogIkU3RTQiLAoJCTI5NjQ3IDogIkU3RTUiLAoJCTI5NjM0IDogIkU3RTYiLAoJCTI5NjQ5IDogIkU3RTciLAoJCTI5NjIzIDogIkU3RTgiLAoJCTI5NjE5IDogIkU3RTkiLAoJCTI5NjMyIDogIkU3RUEiLAoJCTI5NjQxIDogIkU3RUIiLAoJCTI5NjQwIDogIkU3RUMiLAoJCTI5NjY5IDogIkU3RUQiLAoJCTI5NjU3IDogIkU3RUUiLAoJCTM5MDM2IDogIkU3RUYiLAoJCTI5NzA2IDogIkU3RjAiLAoJCTI5NjczIDogIkU3RjEiLAoJCTI5NjcxIDogIkU3RjIiLAoJCTI5NjYyIDogIkU3RjMiLAoJCTI5NjI2IDogIkU3RjQiLAoJCTI5NjgyIDogIkU3RjUiLAoJCTI5NzExIDogIkU3RjYiLAoJCTI5NzM4IDogIkU3RjciLAoJCTI5Nzg3IDogIkU3RjgiLAoJCTI5NzM0IDogIkU3RjkiLAoJCTI5NzMzIDogIkU3RkEiLAoJCTI5NzM2IDogIkU3RkIiLAoJCTI5NzQ0IDogIkU3RkMiLAoJCTI5NzQyIDogIkU3RkQiLAoJCTI5NzQwIDogIkU3RkUiLAoJCTI5NzIzIDogIkU4QTEiLAoJCTI5NzIyIDogIkU4QTIiLAoJCTI5NzYxIDogIkU4QTMiLAoJCTI5Nzg4IDogIkU4QTQiLAoJCTI5NzgzIDogIkU4QTUiLAoJCTI5NzgxIDogIkU4QTYiLAoJCTI5Nzg1IDogIkU4QTciLAoJCTI5ODE1IDogIkU4QTgiLAoJCTI5ODA1IDogIkU4QTkiLAoJCTI5ODIyIDogIkU4QUEiLAoJCTI5ODUyIDogIkU4QUIiLAoJCTI5ODM4IDogIkU4QUMiLAoJCTI5ODI0IDogIkU4QUQiLAoJCTI5ODI1IDogIkU4QUUiLAoJCTI5ODMxIDogIkU4QUYiLAoJCTI5ODM1IDogIkU4QjAiLAoJCTI5ODU0IDogIkU4QjEiLAoJCTI5ODY0IDogIkU4QjIiLAoJCTI5ODY1IDogIkU4QjMiLAoJCTI5ODQwIDogIkU4QjQiLAoJCTI5ODYzIDogIkU4QjUiLAoJCTI5OTA2IDogIkU4QjYiLAoJCTI5ODgyIDogIkU4QjciLAoJCTM4ODkwIDogIkU4QjgiLAoJCTM4ODkxIDogIkU4QjkiLAoJCTM4ODkyIDogIkU4QkEiLAoJCTI2NDQ0IDogIkU4QkIiLAoJCTI2NDUxIDogIkU4QkMiLAoJCTI2NDYyIDogIkU4QkQiLAoJCTI2NDQwIDogIkU4QkUiLAoJCTI2NDczIDogIkU4QkYiLAoJCTI2NTMzIDogIkU4QzAiLAoJCTI2NTAzIDogIkU4QzEiLAoJCTI2NDc0IDogIkU4QzIiLAoJCTI2NDgzIDogIkU4QzMiLAoJCTI2NTIwIDogIkU4QzQiLAoJCTI2NTM1IDogIkU4QzUiLAoJCTI2NDg1IDogIkU4QzYiLAoJCTI2NTM2IDogIkU4QzciLAoJCTI2NTI2IDogIkU4QzgiLAoJCTI2NTQxIDogIkU4QzkiLAoJCTI2NTA3IDogIkU4Q0EiLAoJCTI2NDg3IDogIkU4Q0IiLAoJCTI2NDkyIDogIkU4Q0MiLAoJCTI2NjA4IDogIkU4Q0QiLAoJCTI2NjMzIDogIkU4Q0UiLAoJCTI2NTg0IDogIkU4Q0YiLAoJCTI2NjM0IDogIkU4RDAiLAoJCTI2NjAxIDogIkU4RDEiLAoJCTI2NTQ0IDogIkU4RDIiLAoJCTI2NjM2IDogIkU4RDMiLAoJCTI2NTg1IDogIkU4RDQiLAoJCTI2NTQ5IDogIkU4RDUiLAoJCTI2NTg2IDogIkU4RDYiLAoJCTI2NTQ3IDogIkU4RDciLAoJCTI2NTg5IDogIkU4RDgiLAoJCTI2NjI0IDogIkU4RDkiLAoJCTI2NTYzIDogIkU4REEiLAoJCTI2NTUyIDogIkU4REIiLAoJCTI2NTk0IDogIkU4REMiLAoJCTI2NjM4IDogIkU4REQiLAoJCTI2NTYxIDogIkU4REUiLAoJCTI2NjIxIDogIkU4REYiLAoJCTI2Njc0IDogIkU4RTAiLAoJCTI2Njc1IDogIkU4RTEiLAoJCTI2NzIwIDogIkU4RTIiLAoJCTI2NzIxIDogIkU4RTMiLAoJCTI2NzAyIDogIkU4RTQiLAoJCTI2NzIyIDogIkU4RTUiLAoJCTI2NjkyIDogIkU4RTYiLAoJCTI2NzI0IDogIkU4RTciLAoJCTI2NzU1IDogIkU4RTgiLAoJCTI2NjUzIDogIkU4RTkiLAoJCTI2NzA5IDogIkU4RUEiLAoJCTI2NzI2IDogIkU4RUIiLAoJCTI2Njg5IDogIkU4RUMiLAoJCTI2NzI3IDogIkU4RUQiLAoJCTI2Njg4IDogIkU4RUUiLAoJCTI2Njg2IDogIkU4RUYiLAoJCTI2Njk4IDogIkU4RjAiLAoJCTI2Njk3IDogIkU4RjEiLAoJCTI2NjY1IDogIkU4RjIiLAoJCTI2ODA1IDogIkU4RjMiLAoJCTI2NzY3IDogIkU4RjQiLAoJCTI2NzQwIDogIkU4RjUiLAoJCTI2NzQzIDogIkU4RjYiLAoJCTI2NzcxIDogIkU4RjciLAoJCTI2NzMxIDogIkU4RjgiLAoJCTI2ODE4IDogIkU4RjkiLAoJCTI2OTkwIDogIkU4RkEiLAoJCTI2ODc2IDogIkU4RkIiLAoJCTI2OTExIDogIkU4RkMiLAoJCTI2OTEyIDogIkU4RkQiLAoJCTI2ODczIDogIkU4RkUiLAoJCTI2OTE2IDogIkU5QTEiLAoJCTI2ODY0IDogIkU5QTIiLAoJCTI2ODkxIDogIkU5QTMiLAoJCTI2ODgxIDogIkU5QTQiLAoJCTI2OTY3IDogIkU5QTUiLAoJCTI2ODUxIDogIkU5QTYiLAoJCTI2ODk2IDogIkU5QTciLAoJCTI2OTkzIDogIkU5QTgiLAoJCTI2OTM3IDogIkU5QTkiLAoJCTI2OTc2IDogIkU5QUEiLAoJCTI2OTQ2IDogIkU5QUIiLAoJCTI2OTczIDogIkU5QUMiLAoJCTI3MDEyIDogIkU5QUQiLAoJCTI2OTg3IDogIkU5QUUiLAoJCTI3MDA4IDogIkU5QUYiLAoJCTI3MDMyIDogIkU5QjAiLAoJCTI3MDAwIDogIkU5QjEiLAoJCTI2OTMyIDogIkU5QjIiLAoJCTI3MDg0IDogIkU5QjMiLAoJCTI3MDE1IDogIkU5QjQiLAoJCTI3MDE2IDogIkU5QjUiLAoJCTI3MDg2IDogIkU5QjYiLAoJCTI3MDE3IDogIkU5QjciLAoJCTI2OTgyIDogIkU5QjgiLAoJCTI2OTc5IDogIkU5QjkiLAoJCTI3MDAxIDogIkU5QkEiLAoJCTI3MDM1IDogIkU5QkIiLAoJCTI3MDQ3IDogIkU5QkMiLAoJCTI3MDY3IDogIkU5QkQiLAoJCTI3MDUxIDogIkU5QkUiLAoJCTI3MDUzIDogIkU5QkYiLAoJCTI3MDkyIDogIkU5QzAiLAoJCTI3MDU3IDogIkU5QzEiLAoJCTI3MDczIDogIkU5QzIiLAoJCTI3MDgyIDogIkU5QzMiLAoJCTI3MTAzIDogIkU5QzQiLAoJCTI3MDI5IDogIkU5QzUiLAoJCTI3MTA0IDogIkU5QzYiLAoJCTI3MDIxIDogIkU5QzciLAoJCTI3MTM1IDogIkU5QzgiLAoJCTI3MTgzIDogIkU5QzkiLAoJCTI3MTE3IDogIkU5Q0EiLAoJCTI3MTU5IDogIkU5Q0IiLAoJCTI3MTYwIDogIkU5Q0MiLAoJCTI3MjM3IDogIkU5Q0QiLAoJCTI3MTIyIDogIkU5Q0UiLAoJCTI3MjA0IDogIkU5Q0YiLAoJCTI3MTk4IDogIkU5RDAiLAoJCTI3Mjk2IDogIkU5RDEiLAoJCTI3MjE2IDogIkU5RDIiLAoJCTI3MjI3IDogIkU5RDMiLAoJCTI3MTg5IDogIkU5RDQiLAoJCTI3Mjc4IDogIkU5RDUiLAoJCTI3MjU3IDogIkU5RDYiLAoJCTI3MTk3IDogIkU5RDciLAoJCTI3MTc2IDogIkU5RDgiLAoJCTI3MjI0IDogIkU5RDkiLAoJCTI3MjYwIDogIkU5REEiLAoJCTI3MjgxIDogIkU5REIiLAoJCTI3MjgwIDogIkU5REMiLAoJCTI3MzA1IDogIkU5REQiLAoJCTI3Mjg3IDogIkU5REUiLAoJCTI3MzA3IDogIkU5REYiLAoJCTI5NDk1IDogIkU5RTAiLAoJCTI5NTIyIDogIkU5RTEiLAoJCTI3NTIxIDogIkU5RTIiLAoJCTI3NTIyIDogIkU5RTMiLAoJCTI3NTI3IDogIkU5RTQiLAoJCTI3NTI0IDogIkU5RTUiLAoJCTI3NTM4IDogIkU5RTYiLAoJCTI3NTM5IDogIkU5RTciLAoJCTI3NTMzIDogIkU5RTgiLAoJCTI3NTQ2IDogIkU5RTkiLAoJCTI3NTQ3IDogIkU5RUEiLAoJCTI3NTUzIDogIkU5RUIiLAoJCTI3NTYyIDogIkU5RUMiLAoJCTM2NzE1IDogIkU5RUQiLAoJCTM2NzE3IDogIkU5RUUiLAoJCTM2NzIxIDogIkU5RUYiLAoJCTM2NzIyIDogIkU5RjAiLAoJCTM2NzIzIDogIkU5RjEiLAoJCTM2NzI1IDogIkU5RjIiLAoJCTM2NzI2IDogIkU5RjMiLAoJCTM2NzI4IDogIkU5RjQiLAoJCTM2NzI3IDogIkU5RjUiLAoJCTM2NzI5IDogIkU5RjYiLAoJCTM2NzMwIDogIkU5RjciLAoJCTM2NzMyIDogIkU5RjgiLAoJCTM2NzM0IDogIkU5RjkiLAoJCTM2NzM3IDogIkU5RkEiLAoJCTM2NzM4IDogIkU5RkIiLAoJCTM2NzQwIDogIkU5RkMiLAoJCTM2NzQzIDogIkU5RkQiLAoJCTM2NzQ3IDogIkU5RkUiLAoJCTM2NzQ5IDogIkVBQTEiLAoJCTM2NzUwIDogIkVBQTIiLAoJCTM2NzUxIDogIkVBQTMiLAoJCTM2NzYwIDogIkVBQTQiLAoJCTM2NzYyIDogIkVBQTUiLAoJCTM2NTU4IDogIkVBQTYiLAoJCTI1MDk5IDogIkVBQTciLAoJCTI1MTExIDogIkVBQTgiLAoJCTI1MTE1IDogIkVBQTkiLAoJCTI1MTE5IDogIkVBQUEiLAoJCTI1MTIyIDogIkVBQUIiLAoJCTI1MTIxIDogIkVBQUMiLAoJCTI1MTI1IDogIkVBQUQiLAoJCTI1MTI0IDogIkVBQUUiLAoJCTI1MTMyIDogIkVBQUYiLAoJCTMzMjU1IDogIkVBQjAiLAoJCTI5OTM1IDogIkVBQjEiLAoJCTI5OTQwIDogIkVBQjIiLAoJCTI5OTUxIDogIkVBQjMiLAoJCTI5OTY3IDogIkVBQjQiLAoJCTI5OTY5IDogIkVBQjUiLAoJCTI5OTcxIDogIkVBQjYiLAoJCTI1OTA4IDogIkVBQjciLAoJCTI2MDk0IDogIkVBQjgiLAoJCTI2MDk1IDogIkVBQjkiLAoJCTI2MDk2IDogIkVBQkEiLAoJCTI2MTIyIDogIkVBQkIiLAoJCTI2MTM3IDogIkVBQkMiLAoJCTI2NDgyIDogIkVBQkQiLAoJCTI2MTE1IDogIkVBQkUiLAoJCTI2MTMzIDogIkVBQkYiLAoJCTI2MTEyIDogIkVBQzAiLAoJCTI4ODA1IDogIkVBQzEiLAoJCTI2MzU5IDogIkVBQzIiLAoJCTI2MTQxIDogIkVBQzMiLAoJCTI2MTY0IDogIkVBQzQiLAoJCTI2MTYxIDogIkVBQzUiLAoJCTI2MTY2IDogIkVBQzYiLAoJCTI2MTY1IDogIkVBQzciLAoJCTMyNzc0IDogIkVBQzgiLAoJCTI2MjA3IDogIkVBQzkiLAoJCTI2MTk2IDogIkVBQ0EiLAoJCTI2MTc3IDogIkVBQ0IiLAoJCTI2MTkxIDogIkVBQ0MiLAoJCTI2MTk4IDogIkVBQ0QiLAoJCTI2MjA5IDogIkVBQ0UiLAoJCTI2MTk5IDogIkVBQ0YiLAoJCTI2MjMxIDogIkVBRDAiLAoJCTI2MjQ0IDogIkVBRDEiLAoJCTI2MjUyIDogIkVBRDIiLAoJCTI2Mjc5IDogIkVBRDMiLAoJCTI2MjY5IDogIkVBRDQiLAoJCTI2MzAyIDogIkVBRDUiLAoJCTI2MzMxIDogIkVBRDYiLAoJCTI2MzMyIDogIkVBRDciLAoJCTI2MzQyIDogIkVBRDgiLAoJCTI2MzQ1IDogIkVBRDkiLAoJCTM2MTQ2IDogIkVBREEiLAoJCTM2MTQ3IDogIkVBREIiLAoJCTM2MTUwIDogIkVBREMiLAoJCTM2MTU1IDogIkVBREQiLAoJCTM2MTU3IDogIkVBREUiLAoJCTM2MTYwIDogIkVBREYiLAoJCTM2MTY1IDogIkVBRTAiLAoJCTM2MTY2IDogIkVBRTEiLAoJCTM2MTY4IDogIkVBRTIiLAoJCTM2MTY5IDogIkVBRTMiLAoJCTM2MTY3IDogIkVBRTQiLAoJCTM2MTczIDogIkVBRTUiLAoJCTM2MTgxIDogIkVBRTYiLAoJCTM2MTg1IDogIkVBRTciLAoJCTM1MjcxIDogIkVBRTgiLAoJCTM1Mjc0IDogIkVBRTkiLAoJCTM1Mjc1IDogIkVBRUEiLAoJCTM1Mjc2IDogIkVBRUIiLAoJCTM1Mjc4IDogIkVBRUMiLAoJCTM1Mjc5IDogIkVBRUQiLAoJCTM1MjgwIDogIkVBRUUiLAoJCTM1MjgxIDogIkVBRUYiLAoJCTI5Mjk0IDogIkVBRjAiLAoJCTI5MzQzIDogIkVBRjEiLAoJCTI5Mjc3IDogIkVBRjIiLAoJCTI5Mjg2IDogIkVBRjMiLAoJCTI5Mjk1IDogIkVBRjQiLAoJCTI5MzEwIDogIkVBRjUiLAoJCTI5MzExIDogIkVBRjYiLAoJCTI5MzE2IDogIkVBRjciLAoJCTI5MzIzIDogIkVBRjgiLAoJCTI5MzI1IDogIkVBRjkiLAoJCTI5MzI3IDogIkVBRkEiLAoJCTI5MzMwIDogIkVBRkIiLAoJCTI1MzUyIDogIkVBRkMiLAoJCTI1Mzk0IDogIkVBRkQiLAoJCTI1NTIwIDogIkVBRkUiLAoJCTI1NjYzIDogIkVCQTEiLAoJCTI1ODE2IDogIkVCQTIiLAoJCTMyNzcyIDogIkVCQTMiLAoJCTI3NjI2IDogIkVCQTQiLAoJCTI3NjM1IDogIkVCQTUiLAoJCTI3NjQ1IDogIkVCQTYiLAoJCTI3NjM3IDogIkVCQTciLAoJCTI3NjQxIDogIkVCQTgiLAoJCTI3NjUzIDogIkVCQTkiLAoJCTI3NjU1IDogIkVCQUEiLAoJCTI3NjU0IDogIkVCQUIiLAoJCTI3NjYxIDogIkVCQUMiLAoJCTI3NjY5IDogIkVCQUQiLAoJCTI3NjcyIDogIkVCQUUiLAoJCTI3NjczIDogIkVCQUYiLAoJCTI3Njc0IDogIkVCQjAiLAoJCTI3NjgxIDogIkVCQjEiLAoJCTI3Njg5IDogIkVCQjIiLAoJCTI3Njg0IDogIkVCQjMiLAoJCTI3NjkwIDogIkVCQjQiLAoJCTI3Njk4IDogIkVCQjUiLAoJCTI1OTA5IDogIkVCQjYiLAoJCTI1OTQxIDogIkVCQjciLAoJCTI1OTYzIDogIkVCQjgiLAoJCTI5MjYxIDogIkVCQjkiLAoJCTI5MjY2IDogIkVCQkEiLAoJCTI5MjcwIDogIkVCQkIiLAoJCTI5MjMyIDogIkVCQkMiLAoJCTM0NDAyIDogIkVCQkQiLAoJCTIxMDE0IDogIkVCQkUiLAoJCTMyOTI3IDogIkVCQkYiLAoJCTMyOTI0IDogIkVCQzAiLAoJCTMyOTE1IDogIkVCQzEiLAoJCTMyOTU2IDogIkVCQzIiLAoJCTI2Mzc4IDogIkVCQzMiLAoJCTMyOTU3IDogIkVCQzQiLAoJCTMyOTQ1IDogIkVCQzUiLAoJCTMyOTM5IDogIkVCQzYiLAoJCTMyOTQxIDogIkVCQzciLAoJCTMyOTQ4IDogIkVCQzgiLAoJCTMyOTUxIDogIkVCQzkiLAoJCTMyOTk5IDogIkVCQ0EiLAoJCTMzMDAwIDogIkVCQ0IiLAoJCTMzMDAxIDogIkVCQ0MiLAoJCTMzMDAyIDogIkVCQ0QiLAoJCTMyOTg3IDogIkVCQ0UiLAoJCTMyOTYyIDogIkVCQ0YiLAoJCTMyOTY0IDogIkVCRDAiLAoJCTMyOTg1IDogIkVCRDEiLAoJCTMyOTczIDogIkVCRDIiLAoJCTMyOTgzIDogIkVCRDMiLAoJCTI2Mzg0IDogIkVCRDQiLAoJCTMyOTg5IDogIkVCRDUiLAoJCTMzMDAzIDogIkVCRDYiLAoJCTMzMDA5IDogIkVCRDciLAoJCTMzMDEyIDogIkVCRDgiLAoJCTMzMDA1IDogIkVCRDkiLAoJCTMzMDM3IDogIkVCREEiLAoJCTMzMDM4IDogIkVCREIiLAoJCTMzMDEwIDogIkVCREMiLAoJCTMzMDIwIDogIkVCREQiLAoJCTI2Mzg5IDogIkVCREUiLAoJCTMzMDQyIDogIkVCREYiLAoJCTM1OTMwIDogIkVCRTAiLAoJCTMzMDc4IDogIkVCRTEiLAoJCTMzMDU0IDogIkVCRTIiLAoJCTMzMDY4IDogIkVCRTMiLAoJCTMzMDQ4IDogIkVCRTQiLAoJCTMzMDc0IDogIkVCRTUiLAoJCTMzMDk2IDogIkVCRTYiLAoJCTMzMTAwIDogIkVCRTciLAoJCTMzMTA3IDogIkVCRTgiLAoJCTMzMTQwIDogIkVCRTkiLAoJCTMzMTEzIDogIkVCRUEiLAoJCTMzMTE0IDogIkVCRUIiLAoJCTMzMTM3IDogIkVCRUMiLAoJCTMzMTIwIDogIkVCRUQiLAoJCTMzMTI5IDogIkVCRUUiLAoJCTMzMTQ4IDogIkVCRUYiLAoJCTMzMTQ5IDogIkVCRjAiLAoJCTMzMTMzIDogIkVCRjEiLAoJCTMzMTI3IDogIkVCRjIiLAoJCTIyNjA1IDogIkVCRjMiLAoJCTIzMjIxIDogIkVCRjQiLAoJCTMzMTYwIDogIkVCRjUiLAoJCTMzMTU0IDogIkVCRjYiLAoJCTMzMTY5IDogIkVCRjciLAoJCTI4MzczIDogIkVCRjgiLAoJCTMzMTg3IDogIkVCRjkiLAoJCTMzMTk0IDogIkVCRkEiLAoJCTMzMjI4IDogIkVCRkIiLAoJCTI2NDA2IDogIkVCRkMiLAoJCTMzMjI2IDogIkVCRkQiLAoJCTMzMjExIDogIkVCRkUiLAoJCTMzMjE3IDogIkVDQTEiLAoJCTMzMTkwIDogIkVDQTIiLAoJCTI3NDI4IDogIkVDQTMiLAoJCTI3NDQ3IDogIkVDQTQiLAoJCTI3NDQ5IDogIkVDQTUiLAoJCTI3NDU5IDogIkVDQTYiLAoJCTI3NDYyIDogIkVDQTciLAoJCTI3NDgxIDogIkVDQTgiLAoJCTM5MTIxIDogIkVDQTkiLAoJCTM5MTIyIDogIkVDQUEiLAoJCTM5MTIzIDogIkVDQUIiLAoJCTM5MTI1IDogIkVDQUMiLAoJCTM5MTI5IDogIkVDQUQiLAoJCTM5MTMwIDogIkVDQUUiLAoJCTI3NTcxIDogIkVDQUYiLAoJCTI0Mzg0IDogIkVDQjAiLAoJCTI3NTg2IDogIkVDQjEiLAoJCTM1MzE1IDogIkVDQjIiLAoJCTI2MDAwIDogIkVDQjMiLAoJCTQwNzg1IDogIkVDQjQiLAoJCTI2MDAzIDogIkVDQjUiLAoJCTI2MDQ0IDogIkVDQjYiLAoJCTI2MDU0IDogIkVDQjciLAoJCTI2MDUyIDogIkVDQjgiLAoJCTI2MDUxIDogIkVDQjkiLAoJCTI2MDYwIDogIkVDQkEiLAoJCTI2MDYyIDogIkVDQkIiLAoJCTI2MDY2IDogIkVDQkMiLAoJCTI2MDcwIDogIkVDQkQiLAoJCTI4ODAwIDogIkVDQkUiLAoJCTI4ODI4IDogIkVDQkYiLAoJCTI4ODIyIDogIkVDQzAiLAoJCTI4ODI5IDogIkVDQzEiLAoJCTI4ODU5IDogIkVDQzIiLAoJCTI4ODY0IDogIkVDQzMiLAoJCTI4ODU1IDogIkVDQzQiLAoJCTI4ODQzIDogIkVDQzUiLAoJCTI4ODQ5IDogIkVDQzYiLAoJCTI4OTA0IDogIkVDQzciLAoJCTI4ODc0IDogIkVDQzgiLAoJCTI4OTQ0IDogIkVDQzkiLAoJCTI4OTQ3IDogIkVDQ0EiLAoJCTI4OTUwIDogIkVDQ0IiLAoJCTI4OTc1IDogIkVDQ0MiLAoJCTI4OTc3IDogIkVDQ0QiLAoJCTI5MDQzIDogIkVDQ0UiLAoJCTI5MDIwIDogIkVDQ0YiLAoJCTI5MDMyIDogIkVDRDAiLAoJCTI4OTk3IDogIkVDRDEiLAoJCTI5MDQyIDogIkVDRDIiLAoJCTI5MDAyIDogIkVDRDMiLAoJCTI5MDQ4IDogIkVDRDQiLAoJCTI5MDUwIDogIkVDRDUiLAoJCTI5MDgwIDogIkVDRDYiLAoJCTI5MTA3IDogIkVDRDciLAoJCTI5MTA5IDogIkVDRDgiLAoJCTI5MDk2IDogIkVDRDkiLAoJCTI5MDg4IDogIkVDREEiLAoJCTI5MTUyIDogIkVDREIiLAoJCTI5MTQwIDogIkVDREMiLAoJCTI5MTU5IDogIkVDREQiLAoJCTI5MTc3IDogIkVDREUiLAoJCTI5MjEzIDogIkVDREYiLAoJCTI5MjI0IDogIkVDRTAiLAoJCTI4NzgwIDogIkVDRTEiLAoJCTI4OTUyIDogIkVDRTIiLAoJCTI5MDMwIDogIkVDRTMiLAoJCTI5MTEzIDogIkVDRTQiLAoJCTI1MTUwIDogIkVDRTUiLAoJCTI1MTQ5IDogIkVDRTYiLAoJCTI1MTU1IDogIkVDRTciLAoJCTI1MTYwIDogIkVDRTgiLAoJCTI1MTYxIDogIkVDRTkiLAoJCTMxMDM1IDogIkVDRUEiLAoJCTMxMDQwIDogIkVDRUIiLAoJCTMxMDQ2IDogIkVDRUMiLAoJCTMxMDQ5IDogIkVDRUQiLAoJCTMxMDY3IDogIkVDRUUiLAoJCTMxMDY4IDogIkVDRUYiLAoJCTMxMDU5IDogIkVDRjAiLAoJCTMxMDY2IDogIkVDRjEiLAoJCTMxMDc0IDogIkVDRjIiLAoJCTMxMDYzIDogIkVDRjMiLAoJCTMxMDcyIDogIkVDRjQiLAoJCTMxMDg3IDogIkVDRjUiLAoJCTMxMDc5IDogIkVDRjYiLAoJCTMxMDk4IDogIkVDRjciLAoJCTMxMTA5IDogIkVDRjgiLAoJCTMxMTE0IDogIkVDRjkiLAoJCTMxMTMwIDogIkVDRkEiLAoJCTMxMTQzIDogIkVDRkIiLAoJCTMxMTU1IDogIkVDRkMiLAoJCTI0NTI5IDogIkVDRkQiLAoJCTI0NTI4IDogIkVDRkUiLAoJCTI0NjM2IDogIkVEQTEiLAoJCTI0NjY5IDogIkVEQTIiLAoJCTI0NjY2IDogIkVEQTMiLAoJCTI0Njc5IDogIkVEQTQiLAoJCTI0NjQxIDogIkVEQTUiLAoJCTI0NjY1IDogIkVEQTYiLAoJCTI0Njc1IDogIkVEQTciLAoJCTI0NzQ3IDogIkVEQTgiLAoJCTI0ODM4IDogIkVEQTkiLAoJCTI0ODQ1IDogIkVEQUEiLAoJCTI0OTI1IDogIkVEQUIiLAoJCTI1MDAxIDogIkVEQUMiLAoJCTI0OTg5IDogIkVEQUQiLAoJCTI1MDM1IDogIkVEQUUiLAoJCTI1MDQxIDogIkVEQUYiLAoJCTI1MDk0IDogIkVEQjAiLAoJCTMyODk2IDogIkVEQjEiLAoJCTMyODk1IDogIkVEQjIiLAoJCTI3Nzk1IDogIkVEQjMiLAoJCTI3ODk0IDogIkVEQjQiLAoJCTI4MTU2IDogIkVEQjUiLAoJCTMwNzEwIDogIkVEQjYiLAoJCTMwNzEyIDogIkVEQjciLAoJCTMwNzIwIDogIkVEQjgiLAoJCTMwNzI5IDogIkVEQjkiLAoJCTMwNzQzIDogIkVEQkEiLAoJCTMwNzQ0IDogIkVEQkIiLAoJCTMwNzM3IDogIkVEQkMiLAoJCTI2MDI3IDogIkVEQkQiLAoJCTMwNzY1IDogIkVEQkUiLAoJCTMwNzQ4IDogIkVEQkYiLAoJCTMwNzQ5IDogIkVEQzAiLAoJCTMwNzc3IDogIkVEQzEiLAoJCTMwNzc4IDogIkVEQzIiLAoJCTMwNzc5IDogIkVEQzMiLAoJCTMwNzUxIDogIkVEQzQiLAoJCTMwNzgwIDogIkVEQzUiLAoJCTMwNzU3IDogIkVEQzYiLAoJCTMwNzY0IDogIkVEQzciLAoJCTMwNzU1IDogIkVEQzgiLAoJCTMwNzYxIDogIkVEQzkiLAoJCTMwNzk4IDogIkVEQ0EiLAoJCTMwODI5IDogIkVEQ0IiLAoJCTMwODA2IDogIkVEQ0MiLAoJCTMwODA3IDogIkVEQ0QiLAoJCTMwNzU4IDogIkVEQ0UiLAoJCTMwODAwIDogIkVEQ0YiLAoJCTMwNzkxIDogIkVERDAiLAoJCTMwNzk2IDogIkVERDEiLAoJCTMwODI2IDogIkVERDIiLAoJCTMwODc1IDogIkVERDMiLAoJCTMwODY3IDogIkVERDQiLAoJCTMwODc0IDogIkVERDUiLAoJCTMwODU1IDogIkVERDYiLAoJCTMwODc2IDogIkVERDciLAoJCTMwODgxIDogIkVERDgiLAoJCTMwODgzIDogIkVERDkiLAoJCTMwODk4IDogIkVEREEiLAoJCTMwOTA1IDogIkVEREIiLAoJCTMwODg1IDogIkVEREMiLAoJCTMwOTMyIDogIkVEREQiLAoJCTMwOTM3IDogIkVEREUiLAoJCTMwOTIxIDogIkVEREYiLAoJCTMwOTU2IDogIkVERTAiLAoJCTMwOTYyIDogIkVERTEiLAoJCTMwOTgxIDogIkVERTIiLAoJCTMwOTY0IDogIkVERTMiLAoJCTMwOTk1IDogIkVERTQiLAoJCTMxMDEyIDogIkVERTUiLAoJCTMxMDA2IDogIkVERTYiLAoJCTMxMDI4IDogIkVERTciLAoJCTQwODU5IDogIkVERTgiLAoJCTQwNjk3IDogIkVERTkiLAoJCTQwNjk5IDogIkVERUEiLAoJCTQwNzAwIDogIkVERUIiLAoJCTMwNDQ5IDogIkVERUMiLAoJCTMwNDY4IDogIkVERUQiLAoJCTMwNDc3IDogIkVERUUiLAoJCTMwNDU3IDogIkVERUYiLAoJCTMwNDcxIDogIkVERjAiLAoJCTMwNDcyIDogIkVERjEiLAoJCTMwNDkwIDogIkVERjIiLAoJCTMwNDk4IDogIkVERjMiLAoJCTMwNDg5IDogIkVERjQiLAoJCTMwNTA5IDogIkVERjUiLAoJCTMwNTAyIDogIkVERjYiLAoJCTMwNTE3IDogIkVERjciLAoJCTMwNTIwIDogIkVERjgiLAoJCTMwNTQ0IDogIkVERjkiLAoJCTMwNTQ1IDogIkVERkEiLAoJCTMwNTM1IDogIkVERkIiLAoJCTMwNTMxIDogIkVERkMiLAoJCTMwNTU0IDogIkVERkQiLAoJCTMwNTY4IDogIkVERkUiLAoJCTMwNTYyIDogIkVFQTEiLAoJCTMwNTY1IDogIkVFQTIiLAoJCTMwNTkxIDogIkVFQTMiLAoJCTMwNjA1IDogIkVFQTQiLAoJCTMwNTg5IDogIkVFQTUiLAoJCTMwNTkyIDogIkVFQTYiLAoJCTMwNjA0IDogIkVFQTciLAoJCTMwNjA5IDogIkVFQTgiLAoJCTMwNjIzIDogIkVFQTkiLAoJCTMwNjI0IDogIkVFQUEiLAoJCTMwNjQwIDogIkVFQUIiLAoJCTMwNjQ1IDogIkVFQUMiLAoJCTMwNjUzIDogIkVFQUQiLAoJCTMwMDEwIDogIkVFQUUiLAoJCTMwMDE2IDogIkVFQUYiLAoJCTMwMDMwIDogIkVFQjAiLAoJCTMwMDI3IDogIkVFQjEiLAoJCTMwMDI0IDogIkVFQjIiLAoJCTMwMDQzIDogIkVFQjMiLAoJCTMwMDY2IDogIkVFQjQiLAoJCTMwMDczIDogIkVFQjUiLAoJCTMwMDgzIDogIkVFQjYiLAoJCTMyNjAwIDogIkVFQjciLAoJCTMyNjA5IDogIkVFQjgiLAoJCTMyNjA3IDogIkVFQjkiLAoJCTM1NDAwIDogIkVFQkEiLAoJCTMyNjE2IDogIkVFQkIiLAoJCTMyNjI4IDogIkVFQkMiLAoJCTMyNjI1IDogIkVFQkQiLAoJCTMyNjMzIDogIkVFQkUiLAoJCTMyNjQxIDogIkVFQkYiLAoJCTMyNjM4IDogIkVFQzAiLAoJCTMwNDEzIDogIkVFQzEiLAoJCTMwNDM3IDogIkVFQzIiLAoJCTM0ODY2IDogIkVFQzMiLAoJCTM4MDIxIDogIkVFQzQiLAoJCTM4MDIyIDogIkVFQzUiLAoJCTM4MDIzIDogIkVFQzYiLAoJCTM4MDI3IDogIkVFQzciLAoJCTM4MDI2IDogIkVFQzgiLAoJCTM4MDI4IDogIkVFQzkiLAoJCTM4MDI5IDogIkVFQ0EiLAoJCTM4MDMxIDogIkVFQ0IiLAoJCTM4MDMyIDogIkVFQ0MiLAoJCTM4MDM2IDogIkVFQ0QiLAoJCTM4MDM5IDogIkVFQ0UiLAoJCTM4MDM3IDogIkVFQ0YiLAoJCTM4MDQyIDogIkVFRDAiLAoJCTM4MDQzIDogIkVFRDEiLAoJCTM4MDQ0IDogIkVFRDIiLAoJCTM4MDUxIDogIkVFRDMiLAoJCTM4MDUyIDogIkVFRDQiLAoJCTM4MDU5IDogIkVFRDUiLAoJCTM4MDU4IDogIkVFRDYiLAoJCTM4MDYxIDogIkVFRDciLAoJCTM4MDYwIDogIkVFRDgiLAoJCTM4MDYzIDogIkVFRDkiLAoJCTM4MDY0IDogIkVFREEiLAoJCTM4MDY2IDogIkVFREIiLAoJCTM4MDY4IDogIkVFREMiLAoJCTM4MDcwIDogIkVFREQiLAoJCTM4MDcxIDogIkVFREUiLAoJCTM4MDcyIDogIkVFREYiLAoJCTM4MDczIDogIkVFRTAiLAoJCTM4MDc0IDogIkVFRTEiLAoJCTM4MDc2IDogIkVFRTIiLAoJCTM4MDc3IDogIkVFRTMiLAoJCTM4MDc5IDogIkVFRTQiLAoJCTM4MDg0IDogIkVFRTUiLAoJCTM4MDg4IDogIkVFRTYiLAoJCTM4MDg5IDogIkVFRTciLAoJCTM4MDkwIDogIkVFRTgiLAoJCTM4MDkxIDogIkVFRTkiLAoJCTM4MDkyIDogIkVFRUEiLAoJCTM4MDkzIDogIkVFRUIiLAoJCTM4MDk0IDogIkVFRUMiLAoJCTM4MDk2IDogIkVFRUQiLAoJCTM4MDk3IDogIkVFRUUiLAoJCTM4MDk4IDogIkVFRUYiLAoJCTM4MTAxIDogIkVFRjAiLAoJCTM4MTAyIDogIkVFRjEiLAoJCTM4MTAzIDogIkVFRjIiLAoJCTM4MTA1IDogIkVFRjMiLAoJCTM4MTA0IDogIkVFRjQiLAoJCTM4MTA3IDogIkVFRjUiLAoJCTM4MTEwIDogIkVFRjYiLAoJCTM4MTExIDogIkVFRjciLAoJCTM4MTEyIDogIkVFRjgiLAoJCTM4MTE0IDogIkVFRjkiLAoJCTM4MTE2IDogIkVFRkEiLAoJCTM4MTE3IDogIkVFRkIiLAoJCTM4MTE5IDogIkVFRkMiLAoJCTM4MTIwIDogIkVFRkQiLAoJCTM4MTIyIDogIkVFRkUiLAoJCTM4MTIxIDogIkVGQTEiLAoJCTM4MTIzIDogIkVGQTIiLAoJCTM4MTI2IDogIkVGQTMiLAoJCTM4MTI3IDogIkVGQTQiLAoJCTM4MTMxIDogIkVGQTUiLAoJCTM4MTMyIDogIkVGQTYiLAoJCTM4MTMzIDogIkVGQTciLAoJCTM4MTM1IDogIkVGQTgiLAoJCTM4MTM3IDogIkVGQTkiLAoJCTM4MTQwIDogIkVGQUEiLAoJCTM4MTQxIDogIkVGQUIiLAoJCTM4MTQzIDogIkVGQUMiLAoJCTM4MTQ3IDogIkVGQUQiLAoJCTM4MTQ2IDogIkVGQUUiLAoJCTM4MTUwIDogIkVGQUYiLAoJCTM4MTUxIDogIkVGQjAiLAoJCTM4MTUzIDogIkVGQjEiLAoJCTM4MTU0IDogIkVGQjIiLAoJCTM4MTU3IDogIkVGQjMiLAoJCTM4MTU4IDogIkVGQjQiLAoJCTM4MTU5IDogIkVGQjUiLAoJCTM4MTYyIDogIkVGQjYiLAoJCTM4MTYzIDogIkVGQjciLAoJCTM4MTY0IDogIkVGQjgiLAoJCTM4MTY1IDogIkVGQjkiLAoJCTM4MTY2IDogIkVGQkEiLAoJCTM4MTY4IDogIkVGQkIiLAoJCTM4MTcxIDogIkVGQkMiLAoJCTM4MTczIDogIkVGQkQiLAoJCTM4MTc0IDogIkVGQkUiLAoJCTM4MTc1IDogIkVGQkYiLAoJCTM4MTc4IDogIkVGQzAiLAoJCTM4MTg2IDogIkVGQzEiLAoJCTM4MTg3IDogIkVGQzIiLAoJCTM4MTg1IDogIkVGQzMiLAoJCTM4MTg4IDogIkVGQzQiLAoJCTM4MTkzIDogIkVGQzUiLAoJCTM4MTk0IDogIkVGQzYiLAoJCTM4MTk2IDogIkVGQzciLAoJCTM4MTk4IDogIkVGQzgiLAoJCTM4MTk5IDogIkVGQzkiLAoJCTM4MjAwIDogIkVGQ0EiLAoJCTM4MjA0IDogIkVGQ0IiLAoJCTM4MjA2IDogIkVGQ0MiLAoJCTM4MjA3IDogIkVGQ0QiLAoJCTM4MjEwIDogIkVGQ0UiLAoJCTM4MTk3IDogIkVGQ0YiLAoJCTM4MjEyIDogIkVGRDAiLAoJCTM4MjEzIDogIkVGRDEiLAoJCTM4MjE0IDogIkVGRDIiLAoJCTM4MjE3IDogIkVGRDMiLAoJCTM4MjIwIDogIkVGRDQiLAoJCTM4MjIyIDogIkVGRDUiLAoJCTM4MjIzIDogIkVGRDYiLAoJCTM4MjI2IDogIkVGRDciLAoJCTM4MjI3IDogIkVGRDgiLAoJCTM4MjI4IDogIkVGRDkiLAoJCTM4MjMwIDogIkVGREEiLAoJCTM4MjMxIDogIkVGREIiLAoJCTM4MjMyIDogIkVGREMiLAoJCTM4MjMzIDogIkVGREQiLAoJCTM4MjM1IDogIkVGREUiLAoJCTM4MjM4IDogIkVGREYiLAoJCTM4MjM5IDogIkVGRTAiLAoJCTM4MjM3IDogIkVGRTEiLAoJCTM4MjQxIDogIkVGRTIiLAoJCTM4MjQyIDogIkVGRTMiLAoJCTM4MjQ0IDogIkVGRTQiLAoJCTM4MjQ1IDogIkVGRTUiLAoJCTM4MjQ2IDogIkVGRTYiLAoJCTM4MjQ3IDogIkVGRTciLAoJCTM4MjQ4IDogIkVGRTgiLAoJCTM4MjQ5IDogIkVGRTkiLAoJCTM4MjUwIDogIkVGRUEiLAoJCTM4MjUxIDogIkVGRUIiLAoJCTM4MjUyIDogIkVGRUMiLAoJCTM4MjU1IDogIkVGRUQiLAoJCTM4MjU3IDogIkVGRUUiLAoJCTM4MjU4IDogIkVGRUYiLAoJCTM4MjU5IDogIkVGRjAiLAoJCTM4MjAyIDogIkVGRjEiLAoJCTMwNjk1IDogIkVGRjIiLAoJCTMwNzAwIDogIkVGRjMiLAoJCTM4NjAxIDogIkVGRjQiLAoJCTMxMTg5IDogIkVGRjUiLAoJCTMxMjEzIDogIkVGRjYiLAoJCTMxMjAzIDogIkVGRjciLAoJCTMxMjExIDogIkVGRjgiLAoJCTMxMjM4IDogIkVGRjkiLAoJCTIzODc5IDogIkVGRkEiLAoJCTMxMjM1IDogIkVGRkIiLAoJCTMxMjM0IDogIkVGRkMiLAoJCTMxMjYyIDogIkVGRkQiLAoJCTMxMjUyIDogIkVGRkUiLAoJCTMxMjg5IDogIkYwQTEiLAoJCTMxMjg3IDogIkYwQTIiLAoJCTMxMzEzIDogIkYwQTMiLAoJCTQwNjU1IDogIkYwQTQiLAoJCTM5MzMzIDogIkYwQTUiLAoJCTMxMzQ0IDogIkYwQTYiLAoJCTMwMzQ0IDogIkYwQTciLAoJCTMwMzUwIDogIkYwQTgiLAoJCTMwMzU1IDogIkYwQTkiLAoJCTMwMzYxIDogIkYwQUEiLAoJCTMwMzcyIDogIkYwQUIiLAoJCTI5OTE4IDogIkYwQUMiLAoJCTI5OTIwIDogIkYwQUQiLAoJCTI5OTk2IDogIkYwQUUiLAoJCTQwNDgwIDogIkYwQUYiLAoJCTQwNDgyIDogIkYwQjAiLAoJCTQwNDg4IDogIkYwQjEiLAoJCTQwNDg5IDogIkYwQjIiLAoJCTQwNDkwIDogIkYwQjMiLAoJCTQwNDkxIDogIkYwQjQiLAoJCTQwNDkyIDogIkYwQjUiLAoJCTQwNDk4IDogIkYwQjYiLAoJCTQwNDk3IDogIkYwQjciLAoJCTQwNTAyIDogIkYwQjgiLAoJCTQwNTA0IDogIkYwQjkiLAoJCTQwNTAzIDogIkYwQkEiLAoJCTQwNTA1IDogIkYwQkIiLAoJCTQwNTA2IDogIkYwQkMiLAoJCTQwNTEwIDogIkYwQkQiLAoJCTQwNTEzIDogIkYwQkUiLAoJCTQwNTE0IDogIkYwQkYiLAoJCTQwNTE2IDogIkYwQzAiLAoJCTQwNTE4IDogIkYwQzEiLAoJCTQwNTE5IDogIkYwQzIiLAoJCTQwNTIwIDogIkYwQzMiLAoJCTQwNTIxIDogIkYwQzQiLAoJCTQwNTIzIDogIkYwQzUiLAoJCTQwNTI0IDogIkYwQzYiLAoJCTQwNTI2IDogIkYwQzciLAoJCTQwNTI5IDogIkYwQzgiLAoJCTQwNTMzIDogIkYwQzkiLAoJCTQwNTM1IDogIkYwQ0EiLAoJCTQwNTM4IDogIkYwQ0IiLAoJCTQwNTM5IDogIkYwQ0MiLAoJCTQwNTQwIDogIkYwQ0QiLAoJCTQwNTQyIDogIkYwQ0UiLAoJCTQwNTQ3IDogIkYwQ0YiLAoJCTQwNTUwIDogIkYwRDAiLAoJCTQwNTUxIDogIkYwRDEiLAoJCTQwNTUyIDogIkYwRDIiLAoJCTQwNTUzIDogIkYwRDMiLAoJCTQwNTU0IDogIkYwRDQiLAoJCTQwNTU1IDogIkYwRDUiLAoJCTQwNTU2IDogIkYwRDYiLAoJCTQwNTYxIDogIkYwRDciLAoJCTQwNTU3IDogIkYwRDgiLAoJCTQwNTYzIDogIkYwRDkiLAoJCTMwMDk4IDogIkYwREEiLAoJCTMwMTAwIDogIkYwREIiLAoJCTMwMTAyIDogIkYwREMiLAoJCTMwMTEyIDogIkYwREQiLAoJCTMwMTA5IDogIkYwREUiLAoJCTMwMTI0IDogIkYwREYiLAoJCTMwMTE1IDogIkYwRTAiLAoJCTMwMTMxIDogIkYwRTEiLAoJCTMwMTMyIDogIkYwRTIiLAoJCTMwMTM2IDogIkYwRTMiLAoJCTMwMTQ4IDogIkYwRTQiLAoJCTMwMTI5IDogIkYwRTUiLAoJCTMwMTI4IDogIkYwRTYiLAoJCTMwMTQ3IDogIkYwRTciLAoJCTMwMTQ2IDogIkYwRTgiLAoJCTMwMTY2IDogIkYwRTkiLAoJCTMwMTU3IDogIkYwRUEiLAoJCTMwMTc5IDogIkYwRUIiLAoJCTMwMTg0IDogIkYwRUMiLAoJCTMwMTgyIDogIkYwRUQiLAoJCTMwMTgwIDogIkYwRUUiLAoJCTMwMTg3IDogIkYwRUYiLAoJCTMwMTgzIDogIkYwRjAiLAoJCTMwMjExIDogIkYwRjEiLAoJCTMwMTkzIDogIkYwRjIiLAoJCTMwMjA0IDogIkYwRjMiLAoJCTMwMjA3IDogIkYwRjQiLAoJCTMwMjI0IDogIkYwRjUiLAoJCTMwMjA4IDogIkYwRjYiLAoJCTMwMjEzIDogIkYwRjciLAoJCTMwMjIwIDogIkYwRjgiLAoJCTMwMjMxIDogIkYwRjkiLAoJCTMwMjE4IDogIkYwRkEiLAoJCTMwMjQ1IDogIkYwRkIiLAoJCTMwMjMyIDogIkYwRkMiLAoJCTMwMjI5IDogIkYwRkQiLAoJCTMwMjMzIDogIkYwRkUiLAoJCTMwMjM1IDogIkYxQTEiLAoJCTMwMjY4IDogIkYxQTIiLAoJCTMwMjQyIDogIkYxQTMiLAoJCTMwMjQwIDogIkYxQTQiLAoJCTMwMjcyIDogIkYxQTUiLAoJCTMwMjUzIDogIkYxQTYiLAoJCTMwMjU2IDogIkYxQTciLAoJCTMwMjcxIDogIkYxQTgiLAoJCTMwMjYxIDogIkYxQTkiLAoJCTMwMjc1IDogIkYxQUEiLAoJCTMwMjcwIDogIkYxQUIiLAoJCTMwMjU5IDogIkYxQUMiLAoJCTMwMjg1IDogIkYxQUQiLAoJCTMwMzAyIDogIkYxQUUiLAoJCTMwMjkyIDogIkYxQUYiLAoJCTMwMzAwIDogIkYxQjAiLAoJCTMwMjk0IDogIkYxQjEiLAoJCTMwMzE1IDogIkYxQjIiLAoJCTMwMzE5IDogIkYxQjMiLAoJCTMyNzE0IDogIkYxQjQiLAoJCTMxNDYyIDogIkYxQjUiLAoJCTMxMzUyIDogIkYxQjYiLAoJCTMxMzUzIDogIkYxQjciLAoJCTMxMzYwIDogIkYxQjgiLAoJCTMxMzY2IDogIkYxQjkiLAoJCTMxMzY4IDogIkYxQkEiLAoJCTMxMzgxIDogIkYxQkIiLAoJCTMxMzk4IDogIkYxQkMiLAoJCTMxMzkyIDogIkYxQkQiLAoJCTMxNDA0IDogIkYxQkUiLAoJCTMxNDAwIDogIkYxQkYiLAoJCTMxNDA1IDogIkYxQzAiLAoJCTMxNDExIDogIkYxQzEiLAoJCTM0OTE2IDogIkYxQzIiLAoJCTM0OTIxIDogIkYxQzMiLAoJCTM0OTMwIDogIkYxQzQiLAoJCTM0OTQxIDogIkYxQzUiLAoJCTM0OTQzIDogIkYxQzYiLAoJCTM0OTQ2IDogIkYxQzciLAoJCTM0OTc4IDogIkYxQzgiLAoJCTM1MDE0IDogIkYxQzkiLAoJCTM0OTk5IDogIkYxQ0EiLAoJCTM1MDA0IDogIkYxQ0IiLAoJCTM1MDE3IDogIkYxQ0MiLAoJCTM1MDQyIDogIkYxQ0QiLAoJCTM1MDIyIDogIkYxQ0UiLAoJCTM1MDQzIDogIkYxQ0YiLAoJCTM1MDQ1IDogIkYxRDAiLAoJCTM1MDU3IDogIkYxRDEiLAoJCTM1MDk4IDogIkYxRDIiLAoJCTM1MDY4IDogIkYxRDMiLAoJCTM1MDQ4IDogIkYxRDQiLAoJCTM1MDcwIDogIkYxRDUiLAoJCTM1MDU2IDogIkYxRDYiLAoJCTM1MTA1IDogIkYxRDciLAoJCTM1MDk3IDogIkYxRDgiLAoJCTM1MDkxIDogIkYxRDkiLAoJCTM1MDk5IDogIkYxREEiLAoJCTM1MDgyIDogIkYxREIiLAoJCTM1MTI0IDogIkYxREMiLAoJCTM1MTE1IDogIkYxREQiLAoJCTM1MTI2IDogIkYxREUiLAoJCTM1MTM3IDogIkYxREYiLAoJCTM1MTc0IDogIkYxRTAiLAoJCTM1MTk1IDogIkYxRTEiLAoJCTMwMDkxIDogIkYxRTIiLAoJCTMyOTk3IDogIkYxRTMiLAoJCTMwMzg2IDogIkYxRTQiLAoJCTMwMzg4IDogIkYxRTUiLAoJCTMwNjg0IDogIkYxRTYiLAoJCTMyNzg2IDogIkYxRTciLAoJCTMyNzg4IDogIkYxRTgiLAoJCTMyNzkwIDogIkYxRTkiLAoJCTMyNzk2IDogIkYxRUEiLAoJCTMyODAwIDogIkYxRUIiLAoJCTMyODAyIDogIkYxRUMiLAoJCTMyODA1IDogIkYxRUQiLAoJCTMyODA2IDogIkYxRUUiLAoJCTMyODA3IDogIkYxRUYiLAoJCTMyODA5IDogIkYxRjAiLAoJCTMyODA4IDogIkYxRjEiLAoJCTMyODE3IDogIkYxRjIiLAoJCTMyNzc5IDogIkYxRjMiLAoJCTMyODIxIDogIkYxRjQiLAoJCTMyODM1IDogIkYxRjUiLAoJCTMyODM4IDogIkYxRjYiLAoJCTMyODQ1IDogIkYxRjciLAoJCTMyODUwIDogIkYxRjgiLAoJCTMyODczIDogIkYxRjkiLAoJCTMyODgxIDogIkYxRkEiLAoJCTM1MjAzIDogIkYxRkIiLAoJCTM5MDMyIDogIkYxRkMiLAoJCTM5MDQwIDogIkYxRkQiLAoJCTM5MDQzIDogIkYxRkUiLAoJCTM5MDQ5IDogIkYyQTEiLAoJCTM5MDUyIDogIkYyQTIiLAoJCTM5MDUzIDogIkYyQTMiLAoJCTM5MDU1IDogIkYyQTQiLAoJCTM5MDYwIDogIkYyQTUiLAoJCTM5MDY2IDogIkYyQTYiLAoJCTM5MDY3IDogIkYyQTciLAoJCTM5MDcwIDogIkYyQTgiLAoJCTM5MDcxIDogIkYyQTkiLAoJCTM5MDczIDogIkYyQUEiLAoJCTM5MDc0IDogIkYyQUIiLAoJCTM5MDc3IDogIkYyQUMiLAoJCTM5MDc4IDogIkYyQUQiLAoJCTM0MzgxIDogIkYyQUUiLAoJCTM0Mzg4IDogIkYyQUYiLAoJCTM0NDEyIDogIkYyQjAiLAoJCTM0NDE0IDogIkYyQjEiLAoJCTM0NDMxIDogIkYyQjIiLAoJCTM0NDI2IDogIkYyQjMiLAoJCTM0NDI4IDogIkYyQjQiLAoJCTM0NDI3IDogIkYyQjUiLAoJCTM0NDcyIDogIkYyQjYiLAoJCTM0NDQ1IDogIkYyQjciLAoJCTM0NDQzIDogIkYyQjgiLAoJCTM0NDc2IDogIkYyQjkiLAoJCTM0NDYxIDogIkYyQkEiLAoJCTM0NDcxIDogIkYyQkIiLAoJCTM0NDY3IDogIkYyQkMiLAoJCTM0NDc0IDogIkYyQkQiLAoJCTM0NDUxIDogIkYyQkUiLAoJCTM0NDczIDogIkYyQkYiLAoJCTM0NDg2IDogIkYyQzAiLAoJCTM0NTAwIDogIkYyQzEiLAoJCTM0NDg1IDogIkYyQzIiLAoJCTM0NTEwIDogIkYyQzMiLAoJCTM0NDgwIDogIkYyQzQiLAoJCTM0NDkwIDogIkYyQzUiLAoJCTM0NDgxIDogIkYyQzYiLAoJCTM0NDc5IDogIkYyQzciLAoJCTM0NTA1IDogIkYyQzgiLAoJCTM0NTExIDogIkYyQzkiLAoJCTM0NDg0IDogIkYyQ0EiLAoJCTM0NTM3IDogIkYyQ0IiLAoJCTM0NTQ1IDogIkYyQ0MiLAoJCTM0NTQ2IDogIkYyQ0QiLAoJCTM0NTQxIDogIkYyQ0UiLAoJCTM0NTQ3IDogIkYyQ0YiLAoJCTM0NTEyIDogIkYyRDAiLAoJCTM0NTc5IDogIkYyRDEiLAoJCTM0NTI2IDogIkYyRDIiLAoJCTM0NTQ4IDogIkYyRDMiLAoJCTM0NTI3IDogIkYyRDQiLAoJCTM0NTIwIDogIkYyRDUiLAoJCTM0NTEzIDogIkYyRDYiLAoJCTM0NTYzIDogIkYyRDciLAoJCTM0NTY3IDogIkYyRDgiLAoJCTM0NTUyIDogIkYyRDkiLAoJCTM0NTY4IDogIkYyREEiLAoJCTM0NTcwIDogIkYyREIiLAoJCTM0NTczIDogIkYyREMiLAoJCTM0NTY5IDogIkYyREQiLAoJCTM0NTk1IDogIkYyREUiLAoJCTM0NjE5IDogIkYyREYiLAoJCTM0NTkwIDogIkYyRTAiLAoJCTM0NTk3IDogIkYyRTEiLAoJCTM0NjA2IDogIkYyRTIiLAoJCTM0NTg2IDogIkYyRTMiLAoJCTM0NjIyIDogIkYyRTQiLAoJCTM0NjMyIDogIkYyRTUiLAoJCTM0NjEyIDogIkYyRTYiLAoJCTM0NjA5IDogIkYyRTciLAoJCTM0NjAxIDogIkYyRTgiLAoJCTM0NjE1IDogIkYyRTkiLAoJCTM0NjIzIDogIkYyRUEiLAoJCTM0NjkwIDogIkYyRUIiLAoJCTM0NTk0IDogIkYyRUMiLAoJCTM0Njg1IDogIkYyRUQiLAoJCTM0Njg2IDogIkYyRUUiLAoJCTM0NjgzIDogIkYyRUYiLAoJCTM0NjU2IDogIkYyRjAiLAoJCTM0NjcyIDogIkYyRjEiLAoJCTM0NjM2IDogIkYyRjIiLAoJCTM0NjcwIDogIkYyRjMiLAoJCTM0Njk5IDogIkYyRjQiLAoJCTM0NjQzIDogIkYyRjUiLAoJCTM0NjU5IDogIkYyRjYiLAoJCTM0Njg0IDogIkYyRjciLAoJCTM0NjYwIDogIkYyRjgiLAoJCTM0NjQ5IDogIkYyRjkiLAoJCTM0NjYxIDogIkYyRkEiLAoJCTM0NzA3IDogIkYyRkIiLAoJCTM0NzM1IDogIkYyRkMiLAoJCTM0NzI4IDogIkYyRkQiLAoJCTM0NzcwIDogIkYyRkUiLAoJCTM0NzU4IDogIkYzQTEiLAoJCTM0Njk2IDogIkYzQTIiLAoJCTM0NjkzIDogIkYzQTMiLAoJCTM0NzMzIDogIkYzQTQiLAoJCTM0NzExIDogIkYzQTUiLAoJCTM0NjkxIDogIkYzQTYiLAoJCTM0NzMxIDogIkYzQTciLAoJCTM0Nzg5IDogIkYzQTgiLAoJCTM0NzMyIDogIkYzQTkiLAoJCTM0NzQxIDogIkYzQUEiLAoJCTM0NzM5IDogIkYzQUIiLAoJCTM0NzYzIDogIkYzQUMiLAoJCTM0NzcxIDogIkYzQUQiLAoJCTM0NzQ5IDogIkYzQUUiLAoJCTM0NzY5IDogIkYzQUYiLAoJCTM0NzUyIDogIkYzQjAiLAoJCTM0NzYyIDogIkYzQjEiLAoJCTM0Nzc5IDogIkYzQjIiLAoJCTM0Nzk0IDogIkYzQjMiLAoJCTM0Nzg0IDogIkYzQjQiLAoJCTM0Nzk4IDogIkYzQjUiLAoJCTM0ODM4IDogIkYzQjYiLAoJCTM0ODM1IDogIkYzQjciLAoJCTM0ODE0IDogIkYzQjgiLAoJCTM0ODI2IDogIkYzQjkiLAoJCTM0ODQzIDogIkYzQkEiLAoJCTM0ODQ5IDogIkYzQkIiLAoJCTM0ODczIDogIkYzQkMiLAoJCTM0ODc2IDogIkYzQkQiLAoJCTMyNTY2IDogIkYzQkUiLAoJCTMyNTc4IDogIkYzQkYiLAoJCTMyNTgwIDogIkYzQzAiLAoJCTMyNTgxIDogIkYzQzEiLAoJCTMzMjk2IDogIkYzQzIiLAoJCTMxNDgyIDogIkYzQzMiLAoJCTMxNDg1IDogIkYzQzQiLAoJCTMxNDk2IDogIkYzQzUiLAoJCTMxNDkxIDogIkYzQzYiLAoJCTMxNDkyIDogIkYzQzciLAoJCTMxNTA5IDogIkYzQzgiLAoJCTMxNDk4IDogIkYzQzkiLAoJCTMxNTMxIDogIkYzQ0EiLAoJCTMxNTAzIDogIkYzQ0IiLAoJCTMxNTU5IDogIkYzQ0MiLAoJCTMxNTQ0IDogIkYzQ0QiLAoJCTMxNTMwIDogIkYzQ0UiLAoJCTMxNTEzIDogIkYzQ0YiLAoJCTMxNTM0IDogIkYzRDAiLAoJCTMxNTM3IDogIkYzRDEiLAoJCTMxNTIwIDogIkYzRDIiLAoJCTMxNTI1IDogIkYzRDMiLAoJCTMxNTI0IDogIkYzRDQiLAoJCTMxNTM5IDogIkYzRDUiLAoJCTMxNTUwIDogIkYzRDYiLAoJCTMxNTE4IDogIkYzRDciLAoJCTMxNTc2IDogIkYzRDgiLAoJCTMxNTc4IDogIkYzRDkiLAoJCTMxNTU3IDogIkYzREEiLAoJCTMxNjA1IDogIkYzREIiLAoJCTMxNTY0IDogIkYzREMiLAoJCTMxNTgxIDogIkYzREQiLAoJCTMxNTg0IDogIkYzREUiLAoJCTMxNTk4IDogIkYzREYiLAoJCTMxNjExIDogIkYzRTAiLAoJCTMxNTg2IDogIkYzRTEiLAoJCTMxNjAyIDogIkYzRTIiLAoJCTMxNjAxIDogIkYzRTMiLAoJCTMxNjMyIDogIkYzRTQiLAoJCTMxNjU0IDogIkYzRTUiLAoJCTMxNjU1IDogIkYzRTYiLAoJCTMxNjcyIDogIkYzRTciLAoJCTMxNjYwIDogIkYzRTgiLAoJCTMxNjQ1IDogIkYzRTkiLAoJCTMxNjU2IDogIkYzRUEiLAoJCTMxNjIxIDogIkYzRUIiLAoJCTMxNjU4IDogIkYzRUMiLAoJCTMxNjQ0IDogIkYzRUQiLAoJCTMxNjUwIDogIkYzRUUiLAoJCTMxNjU5IDogIkYzRUYiLAoJCTMxNjY4IDogIkYzRjAiLAoJCTMxNjk3IDogIkYzRjEiLAoJCTMxNjgxIDogIkYzRjIiLAoJCTMxNjkyIDogIkYzRjMiLAoJCTMxNzA5IDogIkYzRjQiLAoJCTMxNzA2IDogIkYzRjUiLAoJCTMxNzE3IDogIkYzRjYiLAoJCTMxNzE4IDogIkYzRjciLAoJCTMxNzIyIDogIkYzRjgiLAoJCTMxNzU2IDogIkYzRjkiLAoJCTMxNzQyIDogIkYzRkEiLAoJCTMxNzQwIDogIkYzRkIiLAoJCTMxNzU5IDogIkYzRkMiLAoJCTMxNzY2IDogIkYzRkQiLAoJCTMxNzU1IDogIkYzRkUiLAoJCTMxNzc1IDogIkY0QTEiLAoJCTMxNzg2IDogIkY0QTIiLAoJCTMxNzgyIDogIkY0QTMiLAoJCTMxODAwIDogIkY0QTQiLAoJCTMxODA5IDogIkY0QTUiLAoJCTMxODA4IDogIkY0QTYiLAoJCTMzMjc4IDogIkY0QTciLAoJCTMzMjgxIDogIkY0QTgiLAoJCTMzMjgyIDogIkY0QTkiLAoJCTMzMjg0IDogIkY0QUEiLAoJCTMzMjYwIDogIkY0QUIiLAoJCTM0ODg0IDogIkY0QUMiLAoJCTMzMzEzIDogIkY0QUQiLAoJCTMzMzE0IDogIkY0QUUiLAoJCTMzMzE1IDogIkY0QUYiLAoJCTMzMzI1IDogIkY0QjAiLAoJCTMzMzI3IDogIkY0QjEiLAoJCTMzMzIwIDogIkY0QjIiLAoJCTMzMzIzIDogIkY0QjMiLAoJCTMzMzM2IDogIkY0QjQiLAoJCTMzMzM5IDogIkY0QjUiLAoJCTMzMzMxIDogIkY0QjYiLAoJCTMzMzMyIDogIkY0QjciLAoJCTMzMzQyIDogIkY0QjgiLAoJCTMzMzQ4IDogIkY0QjkiLAoJCTMzMzUzIDogIkY0QkEiLAoJCTMzMzU1IDogIkY0QkIiLAoJCTMzMzU5IDogIkY0QkMiLAoJCTMzMzcwIDogIkY0QkQiLAoJCTMzMzc1IDogIkY0QkUiLAoJCTMzMzg0IDogIkY0QkYiLAoJCTM0OTQyIDogIkY0QzAiLAoJCTM0OTQ5IDogIkY0QzEiLAoJCTM0OTUyIDogIkY0QzIiLAoJCTM1MDMyIDogIkY0QzMiLAoJCTM1MDM5IDogIkY0QzQiLAoJCTM1MTY2IDogIkY0QzUiLAoJCTMyNjY5IDogIkY0QzYiLAoJCTMyNjcxIDogIkY0QzciLAoJCTMyNjc5IDogIkY0QzgiLAoJCTMyNjg3IDogIkY0QzkiLAoJCTMyNjg4IDogIkY0Q0EiLAoJCTMyNjkwIDogIkY0Q0IiLAoJCTMxODY4IDogIkY0Q0MiLAoJCTI1OTI5IDogIkY0Q0QiLAoJCTMxODg5IDogIkY0Q0UiLAoJCTMxOTAxIDogIkY0Q0YiLAoJCTMxOTAwIDogIkY0RDAiLAoJCTMxOTAyIDogIkY0RDEiLAoJCTMxOTA2IDogIkY0RDIiLAoJCTMxOTIyIDogIkY0RDMiLAoJCTMxOTMyIDogIkY0RDQiLAoJCTMxOTMzIDogIkY0RDUiLAoJCTMxOTM3IDogIkY0RDYiLAoJCTMxOTQzIDogIkY0RDciLAoJCTMxOTQ4IDogIkY0RDgiLAoJCTMxOTQ5IDogIkY0RDkiLAoJCTMxOTQ0IDogIkY0REEiLAoJCTMxOTQxIDogIkY0REIiLAoJCTMxOTU5IDogIkY0REMiLAoJCTMxOTc2IDogIkY0REQiLAoJCTMzMzkwIDogIkY0REUiLAoJCTI2MjgwIDogIkY0REYiLAoJCTMyNzAzIDogIkY0RTAiLAoJCTMyNzE4IDogIkY0RTEiLAoJCTMyNzI1IDogIkY0RTIiLAoJCTMyNzQxIDogIkY0RTMiLAoJCTMyNzM3IDogIkY0RTQiLAoJCTMyNzQyIDogIkY0RTUiLAoJCTMyNzQ1IDogIkY0RTYiLAoJCTMyNzUwIDogIkY0RTciLAoJCTMyNzU1IDogIkY0RTgiLAoJCTMxOTkyIDogIkY0RTkiLAoJCTMyMTE5IDogIkY0RUEiLAoJCTMyMTY2IDogIkY0RUIiLAoJCTMyMTc0IDogIkY0RUMiLAoJCTMyMzI3IDogIkY0RUQiLAoJCTMyNDExIDogIkY0RUUiLAoJCTQwNjMyIDogIkY0RUYiLAoJCTQwNjI4IDogIkY0RjAiLAoJCTM2MjExIDogIkY0RjEiLAoJCTM2MjI4IDogIkY0RjIiLAoJCTM2MjQ0IDogIkY0RjMiLAoJCTM2MjQxIDogIkY0RjQiLAoJCTM2MjczIDogIkY0RjUiLAoJCTM2MTk5IDogIkY0RjYiLAoJCTM2MjA1IDogIkY0RjciLAoJCTM1OTExIDogIkY0RjgiLAoJCTM1OTEzIDogIkY0RjkiLAoJCTM3MTk0IDogIkY0RkEiLAoJCTM3MjAwIDogIkY0RkIiLAoJCTM3MTk4IDogIkY0RkMiLAoJCTM3MTk5IDogIkY0RkQiLAoJCTM3MjIwIDogIkY0RkUiLAoJCTM3MjE4IDogIkY1QTEiLAoJCTM3MjE3IDogIkY1QTIiLAoJCTM3MjMyIDogIkY1QTMiLAoJCTM3MjI1IDogIkY1QTQiLAoJCTM3MjMxIDogIkY1QTUiLAoJCTM3MjQ1IDogIkY1QTYiLAoJCTM3MjQ2IDogIkY1QTciLAoJCTM3MjM0IDogIkY1QTgiLAoJCTM3MjM2IDogIkY1QTkiLAoJCTM3MjQxIDogIkY1QUEiLAoJCTM3MjYwIDogIkY1QUIiLAoJCTM3MjUzIDogIkY1QUMiLAoJCTM3MjY0IDogIkY1QUQiLAoJCTM3MjYxIDogIkY1QUUiLAoJCTM3MjY1IDogIkY1QUYiLAoJCTM3MjgyIDogIkY1QjAiLAoJCTM3MjgzIDogIkY1QjEiLAoJCTM3MjkwIDogIkY1QjIiLAoJCTM3MjkzIDogIkY1QjMiLAoJCTM3Mjk0IDogIkY1QjQiLAoJCTM3Mjk1IDogIkY1QjUiLAoJCTM3MzAxIDogIkY1QjYiLAoJCTM3MzAwIDogIkY1QjciLAoJCTM3MzA2IDogIkY1QjgiLAoJCTM1OTI1IDogIkY1QjkiLAoJCTQwNTc0IDogIkY1QkEiLAoJCTM2MjgwIDogIkY1QkIiLAoJCTM2MzMxIDogIkY1QkMiLAoJCTM2MzU3IDogIkY1QkQiLAoJCTM2NDQxIDogIkY1QkUiLAoJCTM2NDU3IDogIkY1QkYiLAoJCTM2Mjc3IDogIkY1QzAiLAoJCTM2Mjg3IDogIkY1QzEiLAoJCTM2Mjg0IDogIkY1QzIiLAoJCTM2MjgyIDogIkY1QzMiLAoJCTM2MjkyIDogIkY1QzQiLAoJCTM2MzEwIDogIkY1QzUiLAoJCTM2MzExIDogIkY1QzYiLAoJCTM2MzE0IDogIkY1QzciLAoJCTM2MzE4IDogIkY1QzgiLAoJCTM2MzAyIDogIkY1QzkiLAoJCTM2MzAzIDogIkY1Q0EiLAoJCTM2MzE1IDogIkY1Q0IiLAoJCTM2Mjk0IDogIkY1Q0MiLAoJCTM2MzMyIDogIkY1Q0QiLAoJCTM2MzQzIDogIkY1Q0UiLAoJCTM2MzQ0IDogIkY1Q0YiLAoJCTM2MzIzIDogIkY1RDAiLAoJCTM2MzQ1IDogIkY1RDEiLAoJCTM2MzQ3IDogIkY1RDIiLAoJCTM2MzI0IDogIkY1RDMiLAoJCTM2MzYxIDogIkY1RDQiLAoJCTM2MzQ5IDogIkY1RDUiLAoJCTM2MzcyIDogIkY1RDYiLAoJCTM2MzgxIDogIkY1RDciLAoJCTM2MzgzIDogIkY1RDgiLAoJCTM2Mzk2IDogIkY1RDkiLAoJCTM2Mzk4IDogIkY1REEiLAoJCTM2Mzg3IDogIkY1REIiLAoJCTM2Mzk5IDogIkY1REMiLAoJCTM2NDEwIDogIkY1REQiLAoJCTM2NDE2IDogIkY1REUiLAoJCTM2NDA5IDogIkY1REYiLAoJCTM2NDA1IDogIkY1RTAiLAoJCTM2NDEzIDogIkY1RTEiLAoJCTM2NDAxIDogIkY1RTIiLAoJCTM2NDI1IDogIkY1RTMiLAoJCTM2NDE3IDogIkY1RTQiLAoJCTM2NDE4IDogIkY1RTUiLAoJCTM2NDMzIDogIkY1RTYiLAoJCTM2NDM0IDogIkY1RTciLAoJCTM2NDI2IDogIkY1RTgiLAoJCTM2NDY0IDogIkY1RTkiLAoJCTM2NDcwIDogIkY1RUEiLAoJCTM2NDc2IDogIkY1RUIiLAoJCTM2NDYzIDogIkY1RUMiLAoJCTM2NDY4IDogIkY1RUQiLAoJCTM2NDg1IDogIkY1RUUiLAoJCTM2NDk1IDogIkY1RUYiLAoJCTM2NTAwIDogIkY1RjAiLAoJCTM2NDk2IDogIkY1RjEiLAoJCTM2NTA4IDogIkY1RjIiLAoJCTM2NTEwIDogIkY1RjMiLAoJCTM1OTYwIDogIkY1RjQiLAoJCTM1OTcwIDogIkY1RjUiLAoJCTM1OTc4IDogIkY1RjYiLAoJCTM1OTczIDogIkY1RjciLAoJCTM1OTkyIDogIkY1RjgiLAoJCTM1OTg4IDogIkY1RjkiLAoJCTI2MDExIDogIkY1RkEiLAoJCTM1Mjg2IDogIkY1RkIiLAoJCTM1Mjk0IDogIkY1RkMiLAoJCTM1MjkwIDogIkY1RkQiLAoJCTM1MjkyIDogIkY1RkUiLAoJCTM1MzAxIDogIkY2QTEiLAoJCTM1MzA3IDogIkY2QTIiLAoJCTM1MzExIDogIkY2QTMiLAoJCTM1MzkwIDogIkY2QTQiLAoJCTM1NjIyIDogIkY2QTUiLAoJCTM4NzM5IDogIkY2QTYiLAoJCTM4NjMzIDogIkY2QTciLAoJCTM4NjQzIDogIkY2QTgiLAoJCTM4NjM5IDogIkY2QTkiLAoJCTM4NjYyIDogIkY2QUEiLAoJCTM4NjU3IDogIkY2QUIiLAoJCTM4NjY0IDogIkY2QUMiLAoJCTM4NjcxIDogIkY2QUQiLAoJCTM4NjcwIDogIkY2QUUiLAoJCTM4Njk4IDogIkY2QUYiLAoJCTM4NzAxIDogIkY2QjAiLAoJCTM4NzA0IDogIkY2QjEiLAoJCTM4NzE4IDogIkY2QjIiLAoJCTQwODMyIDogIkY2QjMiLAoJCTQwODM1IDogIkY2QjQiLAoJCTQwODM3IDogIkY2QjUiLAoJCTQwODM4IDogIkY2QjYiLAoJCTQwODM5IDogIkY2QjciLAoJCTQwODQwIDogIkY2QjgiLAoJCTQwODQxIDogIkY2QjkiLAoJCTQwODQyIDogIkY2QkEiLAoJCTQwODQ0IDogIkY2QkIiLAoJCTQwNzAyIDogIkY2QkMiLAoJCTQwNzE1IDogIkY2QkQiLAoJCTQwNzE3IDogIkY2QkUiLAoJCTM4NTg1IDogIkY2QkYiLAoJCTM4NTg4IDogIkY2QzAiLAoJCTM4NTg5IDogIkY2QzEiLAoJCTM4NjA2IDogIkY2QzIiLAoJCTM4NjEwIDogIkY2QzMiLAoJCTMwNjU1IDogIkY2QzQiLAoJCTM4NjI0IDogIkY2QzUiLAoJCTM3NTE4IDogIkY2QzYiLAoJCTM3NTUwIDogIkY2QzciLAoJCTM3NTc2IDogIkY2QzgiLAoJCTM3Njk0IDogIkY2QzkiLAoJCTM3NzM4IDogIkY2Q0EiLAoJCTM3ODM0IDogIkY2Q0IiLAoJCTM3Nzc1IDogIkY2Q0MiLAoJCTM3OTUwIDogIkY2Q0QiLAoJCTM3OTk1IDogIkY2Q0UiLAoJCTQwMDYzIDogIkY2Q0YiLAoJCTQwMDY2IDogIkY2RDAiLAoJCTQwMDY5IDogIkY2RDEiLAoJCTQwMDcwIDogIkY2RDIiLAoJCTQwMDcxIDogIkY2RDMiLAoJCTQwMDcyIDogIkY2RDQiLAoJCTMxMjY3IDogIkY2RDUiLAoJCTQwMDc1IDogIkY2RDYiLAoJCTQwMDc4IDogIkY2RDciLAoJCTQwMDgwIDogIkY2RDgiLAoJCTQwMDgxIDogIkY2RDkiLAoJCTQwMDgyIDogIkY2REEiLAoJCTQwMDg0IDogIkY2REIiLAoJCTQwMDg1IDogIkY2REMiLAoJCTQwMDkwIDogIkY2REQiLAoJCTQwMDkxIDogIkY2REUiLAoJCTQwMDk0IDogIkY2REYiLAoJCTQwMDk1IDogIkY2RTAiLAoJCTQwMDk2IDogIkY2RTEiLAoJCTQwMDk3IDogIkY2RTIiLAoJCTQwMDk4IDogIkY2RTMiLAoJCTQwMDk5IDogIkY2RTQiLAoJCTQwMTAxIDogIkY2RTUiLAoJCTQwMTAyIDogIkY2RTYiLAoJCTQwMTAzIDogIkY2RTciLAoJCTQwMTA0IDogIkY2RTgiLAoJCTQwMTA1IDogIkY2RTkiLAoJCTQwMTA3IDogIkY2RUEiLAoJCTQwMTA5IDogIkY2RUIiLAoJCTQwMTEwIDogIkY2RUMiLAoJCTQwMTEyIDogIkY2RUQiLAoJCTQwMTEzIDogIkY2RUUiLAoJCTQwMTE0IDogIkY2RUYiLAoJCTQwMTE1IDogIkY2RjAiLAoJCTQwMTE2IDogIkY2RjEiLAoJCTQwMTE3IDogIkY2RjIiLAoJCTQwMTE4IDogIkY2RjMiLAoJCTQwMTE5IDogIkY2RjQiLAoJCTQwMTIyIDogIkY2RjUiLAoJCTQwMTIzIDogIkY2RjYiLAoJCTQwMTI0IDogIkY2RjciLAoJCTQwMTI1IDogIkY2RjgiLAoJCTQwMTMyIDogIkY2RjkiLAoJCTQwMTMzIDogIkY2RkEiLAoJCTQwMTM0IDogIkY2RkIiLAoJCTQwMTM1IDogIkY2RkMiLAoJCTQwMTM4IDogIkY2RkQiLAoJCTQwMTM5IDogIkY2RkUiLAoJCTQwMTQwIDogIkY3QTEiLAoJCTQwMTQxIDogIkY3QTIiLAoJCTQwMTQyIDogIkY3QTMiLAoJCTQwMTQzIDogIkY3QTQiLAoJCTQwMTQ0IDogIkY3QTUiLAoJCTQwMTQ3IDogIkY3QTYiLAoJCTQwMTQ4IDogIkY3QTciLAoJCTQwMTQ5IDogIkY3QTgiLAoJCTQwMTUxIDogIkY3QTkiLAoJCTQwMTUyIDogIkY3QUEiLAoJCTQwMTUzIDogIkY3QUIiLAoJCTQwMTU2IDogIkY3QUMiLAoJCTQwMTU3IDogIkY3QUQiLAoJCTQwMTU5IDogIkY3QUUiLAoJCTQwMTYyIDogIkY3QUYiLAoJCTM4NzgwIDogIkY3QjAiLAoJCTM4Nzg5IDogIkY3QjEiLAoJCTM4ODAxIDogIkY3QjIiLAoJCTM4ODAyIDogIkY3QjMiLAoJCTM4ODA0IDogIkY3QjQiLAoJCTM4ODMxIDogIkY3QjUiLAoJCTM4ODI3IDogIkY3QjYiLAoJCTM4ODE5IDogIkY3QjciLAoJCTM4ODM0IDogIkY3QjgiLAoJCTM4ODM2IDogIkY3QjkiLAoJCTM5NjAxIDogIkY3QkEiLAoJCTM5NjAwIDogIkY3QkIiLAoJCTM5NjA3IDogIkY3QkMiLAoJCTQwNTM2IDogIkY3QkQiLAoJCTM5NjA2IDogIkY3QkUiLAoJCTM5NjEwIDogIkY3QkYiLAoJCTM5NjEyIDogIkY3QzAiLAoJCTM5NjE3IDogIkY3QzEiLAoJCTM5NjE2IDogIkY3QzIiLAoJCTM5NjIxIDogIkY3QzMiLAoJCTM5NjE4IDogIkY3QzQiLAoJCTM5NjI3IDogIkY3QzUiLAoJCTM5NjI4IDogIkY3QzYiLAoJCTM5NjMzIDogIkY3QzciLAoJCTM5NzQ5IDogIkY3QzgiLAoJCTM5NzQ3IDogIkY3QzkiLAoJCTM5NzUxIDogIkY3Q0EiLAoJCTM5NzUzIDogIkY3Q0IiLAoJCTM5NzUyIDogIkY3Q0MiLAoJCTM5NzU3IDogIkY3Q0QiLAoJCTM5NzYxIDogIkY3Q0UiLAoJCTM5MTQ0IDogIkY3Q0YiLAoJCTM5MTgxIDogIkY3RDAiLAoJCTM5MjE0IDogIkY3RDEiLAoJCTM5MjUzIDogIkY3RDIiLAoJCTM5MjUyIDogIkY3RDMiLAoJCTM5NjQ3IDogIkY3RDQiLAoJCTM5NjQ5IDogIkY3RDUiLAoJCTM5NjU0IDogIkY3RDYiLAoJCTM5NjYzIDogIkY3RDciLAoJCTM5NjU5IDogIkY3RDgiLAoJCTM5Njc1IDogIkY3RDkiLAoJCTM5NjYxIDogIkY3REEiLAoJCTM5NjczIDogIkY3REIiLAoJCTM5Njg4IDogIkY3REMiLAoJCTM5Njk1IDogIkY3REQiLAoJCTM5Njk5IDogIkY3REUiLAoJCTM5NzExIDogIkY3REYiLAoJCTM5NzE1IDogIkY3RTAiLAoJCTQwNjM3IDogIkY3RTEiLAoJCTQwNjM4IDogIkY3RTIiLAoJCTMyMzE1IDogIkY3RTMiLAoJCTQwNTc4IDogIkY3RTQiLAoJCTQwNTgzIDogIkY3RTUiLAoJCTQwNTg0IDogIkY3RTYiLAoJCTQwNTg3IDogIkY3RTciLAoJCTQwNTk0IDogIkY3RTgiLAoJCTM3ODQ2IDogIkY3RTkiLAoJCTQwNjA1IDogIkY3RUEiLAoJCTQwNjA3IDogIkY3RUIiLAoJCTQwNjY3IDogIkY3RUMiLAoJCTQwNjY4IDogIkY3RUQiLAoJCTQwNjY5IDogIkY3RUUiLAoJCTQwNjcyIDogIkY3RUYiLAoJCTQwNjcxIDogIkY3RjAiLAoJCTQwNjc0IDogIkY3RjEiLAoJCTQwNjgxIDogIkY3RjIiLAoJCTQwNjc5IDogIkY3RjMiLAoJCTQwNjc3IDogIkY3RjQiLAoJCTQwNjgyIDogIkY3RjUiLAoJCTQwNjg3IDogIkY3RjYiLAoJCTQwNzM4IDogIkY3RjciLAoJCTQwNzQ4IDogIkY3RjgiLAoJCTQwNzUxIDogIkY3RjkiLAoJCTQwNzYxIDogIkY3RkEiLAoJCTQwNzU5IDogIkY3RkIiLAoJCTQwNzY1IDogIkY3RkMiLAoJCTQwNzY2IDogIkY3RkQiLAoJCTQwNzcyIDogIkY3RkUiCgl9OwoKCXZhciBpID0gMDsKCXZhciBsID0gc3RyLmxlbmd0aDsKCQoJdmFyIHJldCA9IFtdOwoJdmFyIGNoYXJDb2RlOwoJdmFyIGdDb2RlOwoJCglmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CgkJY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTsKCQlpZiAoY2hhckNvZGUgPD0gMTI3KSB7CgkJCXJldC5wdXNoKCclJyArIGNoYXJDb2RlLnRvU3RyaW5nKDE2KSk7CgkJfSBlbHNlIHsKCQkJZ0NvZGUgPSBtYXAuaGFzT3duUHJvcGVydHkoY2hhckNvZGUpICYmIG1hcFtjaGFyQ29kZV07CgkJCWlmIChnQ29kZSkgewoJCQkJd2hpbGUgKGdDb2RlLmxlbmd0aCA8IDQpIHsKCQkJCQlnQ29kZSA9ICcwJyArIGdDb2RlOwoJCQkJfTsKCQkJCXJldC5wdXNoKCclJyArIGdDb2RlLnNsaWNlKDAsIDIpICsgJyUnICsgZ0NvZGUuc2xpY2UoMiwgNCkpOwoJCQl9IGVsc2UgewoJCQkJLy/lrZflupPph4zpnaLmsqHmnIkuCgkJCX07CgkJfTsKCX07CgkKCXJldHVybiByZXQuam9pbignJyk7Cn07"}]},{"name":"页面自动拼接","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_prototypes":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_excludes":[],"orig_includes":["*://*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":["/(^[^:\\/#\\?]*:\\/\\/([^#\\?\\/]*\\.)?wenku\\.baidu\\.com(:[0-9]{1,5})?\\/.*$)/","/(^[^:\\/#\\?]*:\\/\\/([^#\\?\\/]*\\.)?pos\\.baidu\\.com(:[0-9]{1,5})?\\/.*$)/","/(^[^:\\/#\\?]*:\\/\\/([^#\\?\\/]*\\.)?www\\.zhihu\\.com(:[0-9]{1,5})?\\/.*$)/","/(^[^:\\/#\\?]*:\\/\\/([^#\\?\\/]*\\.)?www\\.bilibili\\.com(:[0-9]{1,5})?\\/.*$)/","/(^[^:\\/#\\?]*:\\/\\/([^#\\?\\/]*\\.)?message\\.bilibili\\.com(:[0-9]{1,5})?\\/.*$)/","/(^[^:\\/#\\?]*:\\/\\/([^#\\?\\/]*\\.)?docs\\.qq\\.com(:[0-9]{1,5})?\\/.*$)/"],"use_includes":[],"use_matches":[]},"run_at":null,"tab_types":null},"storage":{"ts":1624620458199,"data":{}},"enabled":false,"position":6,"file_url":"https://greasyfork.org/scripts/389621-%E9%A1%B5%E9%9D%A2%E8%87%AA%E5%8A%A8%E6%8B%BC%E6%8E%A5/code/%E9%A1%B5%E9%9D%A2%E8%87%AA%E5%8A%A8%E6%8B%BC%E6%8E%A5.user.js","uuid":"31a1c890-ca29-412d-bcfa-3223e7ca9f9e","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDpobXpnaLoh6rliqjmi7zmjqUKLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vdGFtcGVybW9ua2V5Lm5ldC8KLy8gQHZlcnNpb24gICAgICAwLjEuNAovLyBAZGVzY3JpcHRpb24gIOa7muWKqOmhtemdouaOpei/keW6lemDqOaXtuiHquWKqOaLvOaOpeS4i+S4gOmhtTsg6YCC55So5LqOIOiwt+atjC/nmb7luqYsIOWFtuS7luWQhOexu+mcgOimgeaJi+WKqOeCueWHuyLkuIvkuIDpobUv5LiL5LiA56ugL+S4i+S4gOevhyLmjInpkq7nmoTnvZHnq5kKLy8gQGF1dGhvciAgICAgICBZb3UKLy8gQGluY2x1ZGUgICAgICAqOi8vKgovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGlmICggd2luZG93ICE9PSB3aW5kb3cudG9wICkgcmV0dXJuOwoKICAvLyDliqDovb3orr7nva4KICB2YXIgX19wYWdlSm9pbmluZ09wdGlvbiA9IHsKICAgIGxvYWRpbmc6ZmFsc2UsCiAgICB0ZXh0Oi9eXHMqKG5leHRccypwYWdlfOS4i+S4gFvpobXnq6DoioLnr4ddKVxzKihcPnswLDJ9fFzihpI/fFzjgIs/KVxzKiQvaSwKICAgIGVsZW06J2EnLAogICAgLy8gc2VsZWN0b3I6JycsCiAgfQogIHZhciB3aGVlbCA9IHsKICAgIHRpbWVyOm51bGwsCiAgICBkZWxheTozMDAsCiAgICB0aHJlc29sZDo1MDAKICB9CgogIHZhciB0b3AgPSB3aW5kb3cuZnJhbWVzWzBdIHx8IHdpbmRvdzsKICB2YXIgaHRtbCA9IHRvcC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CiAgdmFyIGxhc3RGcmFtZVdyYXBwZXIgPSB0b3AuZG9jdW1lbnQ7CiAgdmFyIGxvYWRpbmdXcmFwcGVyID0gKGZ1bmN0aW9uKGUpIHsKICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3Bvc2l0aW9uOmZpeGVkOyByaWdodDo0MnB4OyBib3R0b206MTFweDsgcGFkZGluZzo1cHggMTJweDsgZm9udC1zaXplOjEwcHg7IGxpbmUtaGVpZ2h0OjE7IGNvbG9yOiNmZmY7IGJhY2tncm91bmQ6IzRjYWRlNzsgYm9yZGVyLXJhZGl1czo0cHg7IG9wYWNpdHk6MDsgdHJhbnNpdGlvbi1kdXJhdGlvbjozMDBtczsnKTsKICAgIGRpdi50ZXh0Q29udGVudCA9ICfliqDovb3kuK1+JzsKICAgIHJldHVybiBkaXY7CiAgfSkoKTsKICB0b3AuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsb2FkaW5nV3JhcHBlcik7CgogIC8vIOS8mOWFiOiOt+WPlumhtemdoumFjee9riwg5YW25qyh6buY6K6k6YWN572uCiAgc2V0VGltZW91dCgoKT0+ewogICAgX19wYWdlSm9pbmluZ09wdGlvbiA9IHdpbmRvdy5fX3BhZ2VKb2luaW5nT3B0aW9uIHx8IF9fcGFnZUpvaW5pbmdPcHRpb247CiAgICB0b3AuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgd2luZG93U2Nyb2xsKTsKICB9LCAyMDApOwoKICAvLyDmu5rliqjkuovku7YKICB2YXIgc2Nyb2xsWSA9IDA7CiAgZnVuY3Rpb24gd2luZG93U2Nyb2xsKGUpIHsKICAgIGNsZWFyVGltZW91dCh3aGVlbC50aW1lcik7CiAgICBpZiAoIGUuZGVsdGEgPCAwICkgcmV0dXJuOwogICAgc2Nyb2xsWSA9IGh0bWwuc2Nyb2xsVG9wOwogICAgd2hlZWwudGltZXIgPSBzZXRUaW1lb3V0KCgpPT57CiAgICAgIGlmICggaHRtbC5jbGllbnRIZWlnaHQgKyBzY3JvbGxZICsgd2hlZWwudGhyZXNvbGQ+PWh0bWwuc2Nyb2xsSGVpZ2h0ICkgam9pblBhZ2UoKTsKICAgIH0sIHdoZWVsLmRlbGF5KQogIH07CgoKICBmdW5jdGlvbiBqb2luUGFnZSgpIHsKICAgIGlmICggX19wYWdlSm9pbmluZ09wdGlvbi5sb2FkaW5nICkgcmV0dXJuOwogICAgX19wYWdlSm9pbmluZ09wdGlvbi5sb2FkaW5nID0gdHJ1ZTsKICAgIGxvYWRpbmdXcmFwcGVyLnN0eWxlLm9wYWNpdHkgPSAxOwoKICAgIHZhciBsaW5rQWRkcmVzcyA9ICcnOwogICAgaWYgKCBfX3BhZ2VKb2luaW5nT3B0aW9uLnNlbGVjdG9yICkgewogICAgICBsaW5rQWRkcmVzcyA9IGxhc3RGcmFtZVdyYXBwZXIucXVlcnlTZWxlY3RvcihfX3BhZ2VKb2luaW5nT3B0aW9uLnNlbGVjdG9yKS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKQogICAgfQogICAgZWxzZSBpZiAoIF9fcGFnZUpvaW5pbmdPcHRpb24udGV4dCApIHsKICAgICAgdmFyIGxpbmtzID0gbGFzdEZyYW1lV3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKGAke19fcGFnZUpvaW5pbmdPcHRpb24uZWxlbXx8J2EnfWApLCBsaW5rOwogICAgICBmb3IgKHZhciBpPWxpbmtzLmxlbmd0aC0xOyBpIT09MDsgaS0tKSB7CiAgICAgICAgbGluayA9IGxpbmtzW2ldOwogICAgICAgIGlmICggIWxpbmsuZ2V0QXR0cmlidXRlKCdocmVmJykgKSBjb250aW51ZTsKICAgICAgICBpZiAoICFfX3BhZ2VKb2luaW5nT3B0aW9uLnRleHQudGVzdChsaW5rLnRleHRDb250ZW50KSApIGNvbnRpbnVlOwogICAgICAgIGxpbmtBZGRyZXNzID0gbGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKICAgICAgICBicmVhazsKICAgICAgfTsKICAgIH0KCiAgICBpZiAoICFsaW5rQWRkcmVzcyApIHsKICAgICAgX19wYWdlSm9pbmluZ09wdGlvbi5sb2FkaW5nID0gZmFsc2U7CiAgICAgIGxvYWRpbmdXcmFwcGVyLnN0eWxlLm9wYWNpdHkgPSAwOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOwogICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgcG9zaXRpb246Zml4ZWQ7IHdpZHRoOjA7IGhlaWdodDowOyBvdmVyZmxvdzpoaWRkZW47IG9wYWNpdHk6MDtgKTsKICAgIGlmcmFtZS5zcmMgPSBsaW5rQWRkcmVzczsKICAgIHRvcC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlmcmFtZSk7CgogICAgaWZyYW1lLm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdyA9IGdldExhc3RXaW5kb3coKTsKICAgICAgdmFyIHdkID0gdy5kb2N1bWVudDsKICAgICAgdmFyIHRkID0gdG9wLmRvY3VtZW50OwogICAgICB2YXIgd3JhcHBlciA9IHRkLmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICB3cmFwcGVyLmlkID0gdG9wLmRvY3VtZW50LmJvZHkuaWQgKyAnIGlmcmFtZS13cmFwcGVyJwogICAgICB3cmFwcGVyLmNsYXNzTmFtZSA9IHRkLmJvZHkuY2xhc3NOYW1lOwogICAgICB3cmFwcGVyLmlubmVySFRNTCA9IHdkLmJvZHkuaW5uZXJIVE1MOwogICAgICBsYXN0RnJhbWVXcmFwcGVyID0gd3JhcHBlcjsKICAgICAgaWZyYW1lLm9ubG9hZCA9IG51bGw7CiAgICAgIHRkLmJvZHkucmVtb3ZlQ2hpbGQoaWZyYW1lKTsKICAgICAgdGQuYm9keS5hcHBlbmRDaGlsZCh3cmFwcGVyKTsKICAgICAgaHRtbC5zY3JvbGxUbyhodG1sLnNjcm9sbExlZnQsIHNjcm9sbFkpOwoKICAgICAgc2V0VGltZW91dCgoKT0+ewogICAgICAgIGxvYWRpbmdXcmFwcGVyLnN0eWxlLm9wYWNpdHkgPSAwOwogICAgICAgIF9fcGFnZUpvaW5pbmdPcHRpb24ubG9hZGluZyA9IGZhbHNlOwogICAgICB9LDEwKTsKCiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXRMYXN0V2luZG93KCkgewogICAgdmFyIGZyYW1lcyA9IHRvcC5mcmFtZXM7CiAgICByZXR1cm4gZnJhbWVzW2ZyYW1lcy5sZW5ndGgtMV0gfHwgdG9wCiAgfQoKICB3aW5kb3cuZ2V0TGFzdFdpbmRvdyA9IGdldExhc3RXaW5kb3c7Cn0pKCk7"},{"name":"Picviewer CE+","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_prototypes":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_excludes":["http://www.toodledo.com/tasks/*","http*://maps.google.com*/*","*://www.google.*/_/chrome/newtab*"],"orig_includes":["http://*","https://*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-end","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"tab_types":null},"storage":{"ts":1646560249073,"data":{"pv-prefs":"s{\"floatBar.position\":\"top left\",\"floatBar.showDelay\":366,\"floatBar.hideDelay\":566,\"floatBar.forceShow.size.w\":166,\"floatBar.forceShow.size.h\":166,\"floatBar.minSizeLimit.w\":100,\"floatBar.minSizeLimit.h\":100,\"floatBar.butonOrder\":\"actual, current, gallery, magnifier\",\"floatBar.listenBg\":true,\"floatBar.keys.enable\":true,\"floatBar.keys.actual\":\"a\",\"floatBar.keys.current\":\"c\",\"floatBar.keys.magnifier\":\"m\",\"floatBar.keys.gallery\":\"g\",\"magnifier.radius\":77,\"magnifier.wheelZoom.enabled\":true,\"magnifier.wheelZoom.range\":\"0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.7, 1.9, 2, 2.5, 3, 4\",\"gallery.fitToScreen\":true,\"gallery.fitToScreenSmall\":true,\"gallery.scrollEndToChange\":true,\"gallery.exportType\":\"grid\",\"gallery.loadMore\":true,\"gallery.loadAll\":true,\"gallery.scaleSmallSize\":250,\"gallery.showSmallSize\":true,\"gallery.transition\":true,\"gallery.sidebarPosition\":\"bottom\",\"gallery.sidebarSize\":120,\"gallery.max\":5,\"gallery.autoZoom\":true,\"gallery.descriptionLength\":32,\"gallery.autoOpenSites\":\"\",\"gallery.editSite\":\"Pixlr\",\"imgWindow.fitToScreen\":true,\"imgWindow.close.defaultTool\":\"hand\",\"imgWindow.close.escKey\":true,\"imgWindow.close.dblClickImgWindow\":true,\"imgWindow.close.clickOutside\":\"click\",\"imgWindow.overlayer.shown\":false,\"imgWindow.overlayer.color\":\"rgba(0,0,0,0.8)\",\"imgWindow.shiftRotateStep\":15,\"imgWindow.zoom.mouseWheelZoom\":true,\"imgWindow.zoom.range\":\"0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.7, 1.9, 2, 2.5, 3, 4\",\"waitImgLoad\":false,\"debug\":false}"}},"enabled":true,"position":7,"uuid":"5aebe0de-2e1a-452c-b967-a7f2c812e9cb","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgIFBpY3ZpZXdlciBDRSsKLy8gQG5hbWU6emgtQ04gICAgICAgICBQaWN2aWV3ZXIgQ0UrCi8vIEBuYW1lOnpoLVRXICAgICAgICAgUGljdmlld2VyIENFKwovLyBAYXV0aG9yICAgICAgICAgTkxGICYmIHl3emhhaXFpICYmIGhvb3RoaW4KLy8gQGRlc2NyaXB0aW9uICAgIFBvd2VyZnVsIHBpY3R1cmUgdmlld2luZyB0b29sIG9ubGluZSwgd2hpY2ggY2FuIHBvcHVwL3NjYWxlL3JvdGF0ZS9iYXRjaCBzYXZlIHBpY3R1cmVzIGF1dG9tYXRpY2FsbHkKLy8gQGRlc2NyaXB0aW9uOnpoLUNOICAgIOWcqOe6v+eci+WbvuW3peWFt++8jOaUr+aMgeWbvueJh+e/u+i9rOOAgeaXi+i9rOOAgee8qeaUvuOAgeW8ueWHuuWkp+WbvuOAgeaJuemHj+S/neWtmAovLyBAZGVzY3JpcHRpb246emgtVFcgICAg57ea5LiK55yL5ZyW5bel5YW377yM5pSv5o+05ZyW54mH57+76L2J44CB5peL6L2J44CB57iu5pS+44CB5b2I5Ye65aSn5ZyW44CB5om56YeP5YSy5a2YCi8vIEB2ZXJzaW9uICAgICAgICAyMDE5LjkuMjIuMQovLyBAY3JlYXRlZCAgICAgICAgMjAxMS02LTE1Ci8vIEBuYW1lc3BhY2UgICAgICBodHRwOi8vdXNlcnNjcmlwdHMub3JnL3VzZXJzL05MRgovLyBAaG9tZXBhZ2UgICAgICAgaHR0cDovL2hvb3RoaW4uY29tCi8vIEBjb25uZWN0ICAgICAgIHd3dy5nb29nbGUuY29tCi8vIEBjb25uZWN0ICAgICAgIHd3dy5nb29nbGUuY29tLmhrCi8vIEBjb25uZWN0ICAgICAgIHd3dy5nb29nbGUuY28uanAKLy8gQGNvbm5lY3QgICAgICAgaXB2NC5nb29nbGUuY29tCi8vIEBjb25uZWN0ICAgICAgIGltYWdlLmJhaWR1LmNvbQovLyBAY29ubmVjdCAgICAgICB3d3cudGluZXllLmNvbQovLyBAZ3JhbnQgICAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICAgICAgICBHTV9hZGRTdHlsZQovLyBAZ3JhbnQgICAgICAgICAgR01fb3BlbkluVGFiCi8vIEBncmFudCAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQKLy8gQGdyYW50ICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0Ci8vIEBncmFudCAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kCi8vIEBncmFudCAgICAgICAgICB1bnNhZmVXaW5kb3cKLy8gQHJlcXVpcmUgICAgICAgIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy82MTU4LWdtLWNvbmZpZy1jbi9jb2RlL0dNX2NvbmZpZyUyMENOLmpzP3ZlcnNpb249MjM3MTAKLy8gQGNvbnRyaWJ1dGlvblVSTCBodHRwczovL3d3dy5wYXlwYWwuY29tL2NnaS1iaW4vd2Vic2NyP2NtZD1fZG9uYXRpb25zJmJ1c2luZXNzPXJpeGl4aUBzaW5hLmNvbSZpdGVtX25hbWU9R3JlYXN5K0ZvcmsrZG9uYXRpb24KLy8gQGNvbnRyaWJ1dGlvbkFtb3VudCAxCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9maWxlLXNhdmVyQDIuMC4yL2Rpc3QvRmlsZVNhdmVyLm1pbi5qcwovLyBAcnVuLWF0ICAgICAgICAgZG9jdW1lbnQtZW5kCi8vIEBpbmNsdWRlICAgICAgIGh0dHA6Ly8qCi8vIEBpbmNsdWRlICAgICAgIGh0dHBzOi8vKgovLyBAZXhjbHVkZSAgICAgICBodHRwOi8vd3d3LnRvb2RsZWRvLmNvbS90YXNrcy8qCi8vIEBleGNsdWRlICAgICAgIGh0dHAqOi8vbWFwcy5nb29nbGUuY29tKi8qCi8vIEBleGNsdWRlICAgICAgICo6Ly93d3cuZ29vZ2xlLiovXy9jaHJvbWUvbmV3dGFiKgovLyA9PS9Vc2VyU2NyaXB0PT0KCjsoZnVuY3Rpb24odG9wT2JqZWN0LHdpbmRvdyxkb2N1bWVudCx1bnNhZmVXaW5kb3cpewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBsYW5nID0gbmF2aWdhdG9yLmFwcE5hbWU9PSJOZXRzY2FwZSI/bmF2aWdhdG9yLmxhbmd1YWdlOm5hdmlnYXRvci51c2VyTGFuZ3VhZ2U7CiAgICB2YXIgaTE4bkRhdGE9e307CiAgICBzd2l0Y2ggKGxhbmcpewogICAgICAgIGNhc2UgInpoLUNOIjoKICAgICAgICAgICAgaTE4bkRhdGE9ewogICAgICAgICAgICAgICAgc2hhcmU6IuWIhuS6qyIsCiAgICAgICAgICAgICAgICBsb2FkQWxsOiLliqDovb3mm7TlpJoiLAogICAgICAgICAgICAgICAgbG9hZGVkQWxsOiLliqDovb3lrozmr5UiLAogICAgICAgICAgICAgICAgbG9hZGluZzoi5q2j5Zyo5Yqg6L29IiwKICAgICAgICAgICAgICAgIGxvYWRBbGxUaXA6IuWKoOi9veS4i+S4gOmhteeahOWbvueJhyIsCiAgICAgICAgICAgICAgICBmaWRkbGU6IuaKmOiFviIsCiAgICAgICAgICAgICAgICBmaWRkbGVUaXA6IuW8ueWHuuWbvueJh+i/m+ihjOWkjeadguaTjeS9nCIsCiAgICAgICAgICAgICAgICBjb2xsZWN0OiLmlLbol48iLAogICAgICAgICAgICAgICAgY29sbGVjdGVkOiLlt7LmlLbol48iLAogICAgICAgICAgICAgICAgZXhpdENvbGxlY3Rpb246IumAgOWHuuaUtuiXjyIsCiAgICAgICAgICAgICAgICBleGl0Q29sbGVjdGlvblRpcDoi54K55Ye76YCA5Ye65pS26JeP5qih5byPIiwKICAgICAgICAgICAgICAgIG5vQ29sbGVjdGlvbllldDoi5L2g6L+Y5pyo5pyJ5pS26JeP5Lu75L2V5Zu+54mHIiwKICAgICAgICAgICAgICAgIGNvbGxlY3REZXRhaWw6IuaPj+i/sCIsCiAgICAgICAgICAgICAgICBjb2xsZWN0RGV0YWlsVGlwOiLnu5nmlLbol4/nmoTlm77niYfmt7vliqDkuIDkupvmj4/ov7DlkKciLAogICAgICAgICAgICAgICAgcGxheVNsaWRlOiLmkq3mlL7lubvnga/niYciLAogICAgICAgICAgICAgICAgc2xpZGVHYXA6IumXtOmalChzKSIsCiAgICAgICAgICAgICAgICBzbGlkZUdhcFRpcDoi6Ze06ZqU5pe26Ze077yM5Y2V5L2NKOenkikiLAogICAgICAgICAgICAgICAgc2xpZGVCYWNrOiLlkI7pgIAiLAogICAgICAgICAgICAgICAgc2xpZGVCYWNrVGlwOiLku47lkI7lvoDliY3mkq3mlL4iLAogICAgICAgICAgICAgICAgc2xpZGVXYWl0OiLnrYnlvoXlm77niYfor7vlj5YiLAogICAgICAgICAgICAgICAgc2xpZGVXYWl0VGlwOiLku47mr4/lvKDlm77niYflrozlhajor7vlj5blrozmiJDlkI7miY3lvIDlp4vlgJLorqHml7YiLAogICAgICAgICAgICAgICAgc2xpZGVTa2lwRXJyb3I6Iui3s+i/h+mUmeivr+WbvueJhyIsCiAgICAgICAgICAgICAgICBzbGlkZVNraXBFcnJvclRpcDoi5b+r6YCf6Lez6L+H6K+75Y+W6ZSZ6K+v55qE5Zu+54mHIiwKICAgICAgICAgICAgICAgIHR5cGU6Iuexu+WIqyIsCiAgICAgICAgICAgICAgICB0eXBlVGlwOiLpgInmi6nlm77niYfnsbvliKsiLAogICAgICAgICAgICAgICAgYWR2YW5jZWRSdWxlczoi6auY57qn6KeE5YiZIiwKICAgICAgICAgICAgICAgIGFkdmFuY2VkUnVsZXNUaXA6IueUsemrmOe6p+inhOWImeWMuemFjeWHuuadpeeahCIsCiAgICAgICAgICAgICAgICB0cFJ1bGVzOiLpgJrphY3op4TliJkiLAogICAgICAgICAgICAgICAgdHBSdWxlc1RpcDoi55Sx6YCa6YWN6KeE5YiZ5Yy56YWN5Ye65p2l55qEIiwKICAgICAgICAgICAgICAgIHNjYWxlUnVsZXM6Iue8qeaUvui/h+eahCIsCiAgICAgICAgICAgICAgICBzY2FsZVJ1bGVzVGlwOiJqc+iHquWKqOafpeaJvu+8jOebuOWvuemhtemdouaYvuekuueahOWbvueJh+aciee8qeaUvui/h+eahCIsCiAgICAgICAgICAgICAgICBub1NjYWxlUnVsZXM6IuaXoOe8qeaUvui/hyIsCiAgICAgICAgICAgICAgICBub1NjYWxlUnVsZXNUaXA6Impz6Ieq5Yqo5p+l5om+77yM5peg57yp5pS+6L+H55qE77yM5L2G5piv5ruh6Laz5LiA5a6a55qE5aSn5bCPIiwKICAgICAgICAgICAgICAgIHNtYWxsUnVsZXM6IuWwj+WwuuWvuOeahCIsCiAgICAgICAgICAgICAgICBzbWFsbFJ1bGVzVGlwOiLlsI/lsLrlr7jlm77niYfvvIzlrp7pmYXlsLrlr7jnmoTpq5jlkozlrr3pg73lsI/kuo4jdCPlg4/ntKAiLAogICAgICAgICAgICAgICAgY29tbWFuZDoi5ZG95LukIiwKICAgICAgICAgICAgICAgIGNvbW1hbmRUaXA6IuWRveS7pOiPnOWNlSIsCiAgICAgICAgICAgICAgICBvbmxpbmVFZGl0OiLlnKjnur/nvJbovpEiLAogICAgICAgICAgICAgICAgb25saW5lRWRpdFRpcDoi5L2/55SoI3Qj5Zyo57q/57yW6L6R6K+l5Zu+54mHIiwKICAgICAgICAgICAgICAgIG9wZW5Jbk5ld1dpbmRvdzoi5paw56qX5Y+j5omT5byAIiwKICAgICAgICAgICAgICAgIG9wZW5Jbk5ld1dpbmRvd1RpcDoi5paw56qX5Y+j5omT5byA5Zu+54mHIiwKICAgICAgICAgICAgICAgIGZpbmRJblBhZ2U6IuWumuS9jeWIsOWbviIsCiAgICAgICAgICAgICAgICBmaW5kSW5QYWdlVGlwOiLmu5rliqjliLDlvZPliY3lm77niYfmiYDlnKjnmoTkvY3nva4iLAogICAgICAgICAgICAgICAgdmlld0NvbGxlY3Rpb246Iuafpeeci+aUtuiXjyIsCiAgICAgICAgICAgICAgICB2aWV3Q29sbGVjdGlvblRpcDoi5p+l55yL5omA5pyJ5pS26JeP55qE5Zu+54mHIiwKICAgICAgICAgICAgICAgIGluQ29sbGVjdGlvbjoi5pS26JeP5qih5byP5Lit77yM5peg5rOV5L2/55SoIiwKICAgICAgICAgICAgICAgIGNhbnRGaW5kOiLlm77niYfkuI3lnKjmlofmoaPkuK3vvIzmiJbogIXooqvpmpDol4/kuobvvIzml6Dms5XlrprkvY3vvIEiLAogICAgICAgICAgICAgICAgZXhwb3J0SW1hZ2VzOiLlr7zlh7rlpKflm74iLAogICAgICAgICAgICAgICAgZXhwb3J0SW1hZ2VzVGlwOiLlr7zlh7rmiYDmnInlm77niYfliLDmlrDnqpflj6MiLAogICAgICAgICAgICAgICAgZG93bmxvYWRJbWFnZToi5LiL6L295omA5pyJIiwKICAgICAgICAgICAgICAgIGRvd25sb2FkSW1hZ2VUaXA6IuS4i+i9veW9k+WJjeW6k+S4reaJgOacieaYvuekuuWbvueJhyIsCiAgICAgICAgICAgICAgICBjb3B5SW1hZ2VzVXJsOiLlpI3liLbmiYDmnIkiLAogICAgICAgICAgICAgICAgY29weUltYWdlc1VybFRpcDoi5aSN5Yi25omA5pyJ5aSn5Zu+5Zyw5Z2AIiwKICAgICAgICAgICAgICAgIGNvcHlTdWNjZXNzOiLlt7LmiJDlip/lpI3liLYgI3QjIOW8oOWkp+WbvuWcsOWdgCIsCiAgICAgICAgICAgICAgICBhdXRvUmVmcmVzaDoi6Ieq5Yqo6YeN6L29IiwKICAgICAgICAgICAgICAgIGF1dG9SZWZyZXNoVGlwOiLmnIDlkI7lh6DlvKDlm77niYfml7bvvIzmu5rliqjkuLvnqpflj6PliLDmnIDlupXpg6jvvIznhLblkI7oh6rliqjliqDovb3mlrDnmoTlm77niYciLAogICAgICAgICAgICAgICAgZW50ZXJGdWxsc2M6Iui/m+WFpeWFqOWxjyIsCiAgICAgICAgICAgICAgICBleGl0RnVsbHNjOiLpgIDlh7rlhajlsY8iLAogICAgICAgICAgICAgICAgY29uZmlnOiLorr7nva4iLAogICAgICAgICAgICAgICAgY2xvc2VHYWxsZXJ5OiLlhbPpl63lupMiLAogICAgICAgICAgICAgICAgcmV0dXJuVG9HYWxsZXJ5OiLlm57liLDlupMiLAogICAgICAgICAgICAgICAgcGljSW5mbzoi5Zu+54mH5L+h5oGvIiwKICAgICAgICAgICAgICAgIHBpY05vdGU6IuWbvueJh+azqOmHiiIsCiAgICAgICAgICAgICAgICByZXNvbHV0aW9uOiLliIbovqjnjociLAogICAgICAgICAgICAgICAgc2NhbGVSYXRpbzoi57yp5pS+5q+UIiwKICAgICAgICAgICAgICAgIHNpbWlsYXJJbWFnZToi5Lul5Zu+5pCc5Zu+IiwKICAgICAgICAgICAgICAgIHNjYWxlOiLnvKnmlL4iLAogICAgICAgICAgICAgICAgaG9yaXpvbnRhbEZsaXA6IuawtOW5s+e/u+i9rCIsCiAgICAgICAgICAgICAgICB2ZXJ0aWNhbEZsaXA6IuWeguebtOe/u+i9rCIsCiAgICAgICAgICAgICAgICBhY3R1YWxCdG46J+afpeeci+WOn+WniyhBKScsCiAgICAgICAgICAgICAgICBzZWFyY2hCdG46J+afpeaJvuWOn+WbvihTKScsCiAgICAgICAgICAgICAgICBnYWxsZXJ5QnRuOifmn6XnnIvlupMoRyknLAogICAgICAgICAgICAgICAgY3VycmVudEJ0bjon5p+l55yL5b2T5YmNKEMpJywKICAgICAgICAgICAgICAgIG1hZ25pZmllckJ0bjon5pS+5aSn6ZWcKE0pJywKICAgICAgICAgICAgICAgIHBpY1RpdGxlOiLlm77niYfmoIfpopgiLAogICAgICAgICAgICAgICAgcGljTnVtOiLlm77niYfmlbDph48iLAogICAgICAgICAgICAgICAgZXhwb3J0SW1hZ2VzVXJsOiLlr7zlh7rlm77niYfpk77mjqUiLAogICAgICAgICAgICAgICAgZXhwb3J0SW1hZ2VzVXJsUG9wOiJDdHJsK0PlpI3liLblm77niYfpk77mjqUiLAogICAgICAgICAgICAgICAgYmVnaW5TZWFyY2hJbWc6IiN0I+ivhuWbvuW8gOWni+KApuKApiIsCiAgICAgICAgICAgICAgICBmaW5kTm9QaWM6IuacquaJvuWIsOWOn+WbviIsCiAgICAgICAgICAgICAgICBmaW5kT3ZlckJlZ2luTG9hZDoiI3Qj6K+G5Zu+57uT5p2f77yM5YWx5om+5YiwI3Qj5byg5Yy56YWN5Zu+54mH77yM5byA5aeL5Yqg6L2956ys5LiA5bygIiwKICAgICAgICAgICAgICAgIGxvYWROZXh0U2ltaWxhcjoi5Y6f5Zu+5Yqg6L295aSx6LSl77yM5bCd6K+V5Yqg6L295LiL5LiA57uT5p6c4oCm4oCmIiwKICAgICAgICAgICAgICAgIGxvYWRFcnJvcjoi5Yqg6L295aSx6LSlIiwKICAgICAgICAgICAgICAgIG9wZW5Ib21lUGFnZToi54K55Ye75q2k5aSE5omT5byA5Li76aG1IiwKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiLmmL7npLrkvY3nva4iLAogICAgICAgICAgICAgICAgdG9wTGVmdDogJ+WbvueJh+W3puS4iuinkicsCiAgICAgICAgICAgICAgICB0b3BSaWdodDogJ+WbvueJh+WPs+S4iuinkicsCiAgICAgICAgICAgICAgICBib3R0b21SaWdodDogJ+WbvueJh+WPs+S4i+inkicsCiAgICAgICAgICAgICAgICBib3R0b21MZWZ0OiAn5Zu+54mH5bem5LiL6KeSJywKICAgICAgICAgICAgICAgIHRvcENlbnRlcjogJ+WbvueJh+ato+S4iuaWuScsCiAgICAgICAgICAgICAgICBib3R0b21DZW50ZXI6ICflm77niYfmraPkuIvmlrknLAogICAgICAgICAgICAgICAgZmxvYXRCYXI6Iua1ruWKqOW3peWFt+agjyIsCiAgICAgICAgICAgICAgICBzaG93RGVsYXk6IuaYvuekuuW7tuaXtiIsCiAgICAgICAgICAgICAgICBtczoi5q+r56eSIiwKICAgICAgICAgICAgICAgIGhpZGU6IumakOiXjyIsCiAgICAgICAgICAgICAgICBoaWRlRGVsYXk6IumakOiXj+W7tuaXtiIsCiAgICAgICAgICAgICAgICBmb3JjZVNob3c6Iumdnue8qeaUvuWbvueJh++8jOi2hei/h+ivpeWwuuWvuO+8jOaYvuekuua1ruahhiIsCiAgICAgICAgICAgICAgICBmb3JjZVNob3dUaXA6Iumdnue8qeaUvueahOWbvueJh+Wkp+Wwj+i2hei/h+S4i+mdouiuvuWumueahOWwuuWvuOaXtuaYvuekuua1ruWKqOW3peWFt+agjyIsCiAgICAgICAgICAgICAgICBweDoi5YOP57SgIiwKICAgICAgICAgICAgICAgIG1pblNpemVMaW1pdDoi57yp5pS+5Zu+54mH77yM6LaF6L+H6K+l5bC65a+477yM5pi+56S65rWu5qGGIiwKICAgICAgICAgICAgICAgIG1pblNpemVMaW1pdFRpcDoi5Zu+54mH6KKr57yp5pS+KOWbvueJh+WOn+Wni+Wkp+Wwj+S4juWunumZheWkp+Wwj+S4jeS4gOiHtCnlkI4s5Y6f5Zu+6ZW/5a695aSn5LqO6K6+5a6a5YC85pe25pi+56S65rWu5Yqo5bel5YW35qCPIiwKICAgICAgICAgICAgICAgIGxpc3RlbkJnOiLnm5HlkKzog4zmma/lm74iLAogICAgICAgICAgICAgICAgbGlzdGVuQmdUaXA6IuWcqOacieiDjOaZr+WbvueahOWFg+e0oOS4iuaYvuekuuaCrOa1ruahhiIsCiAgICAgICAgICAgICAgICBidXRvbk9yZGVyOiLlt6XlhbfmoI/lm77moIfmjpLluo8iLAogICAgICAgICAgICAgICAga2V5c0VuYWJsZToi5ZCv55So5Lul5LiL5b+r5o236ZSuIiwKICAgICAgICAgICAgICAgIGtleXNBY3R1YWw6IuaJk+W8gOWkp+WbviIsCiAgICAgICAgICAgICAgICBrZXlzQWN0dWFsVGlwOiLlvZPlh7rnjrDmgqzmta7mnaHml7bmjInkuIvmraTmjInplK7miZPlvIDlpKflm74iLAogICAgICAgICAgICAgICAga2V5c1NlYXJjaDoi5p+l5om+5Y6f5Zu+IiwKICAgICAgICAgICAgICAgIGtleXNTZWFyY2hUaXA6IuW9k+WHuueOsOaCrOa1ruadoeaXtuaMieS4i+atpOaMiemUruafpeaJvuWOn+WbviIsCiAgICAgICAgICAgICAgICBrZXlzQ3VycmVudDoi5omT5byA5b2T5YmN5Zu+54mHIiwKICAgICAgICAgICAgICAgIGtleXNDdXJyZW50VGlwOiLlvZPlh7rnjrDmgqzmta7mnaHml7bmjInkuIvmraTmjInplK7miZPlvIDlvZPliY3mmL7npLrnmoTlm77niYciLAogICAgICAgICAgICAgICAga2V5c01hZ25pZmllcjoi5omT5byA5pS+5aSn6ZWc6KeC5a+fIiwKICAgICAgICAgICAgICAgIGtleXNNYWduaWZpZXJUaXA6IuW9k+WHuueOsOaCrOa1ruadoeaXtuaMieS4i+atpOaMiemUruaJk+W8gOaUvuWkp+mVnOinguWvnyIsCiAgICAgICAgICAgICAgICBrZXlzR2FsbGVyeToi5omT5byA5Zu+5bqTIiwKICAgICAgICAgICAgICAgIGtleXNHYWxsZXJ5VGlwOiLlvZPlh7rnjrDmgqzmta7mnaHml7bmjInkuIvmraTmjInplK7miZPlvIDlm77lupMiLAogICAgICAgICAgICAgICAgbWFnbmlmaWVyOiLmlL7lpKfplZwiLAogICAgICAgICAgICAgICAgbWFnbmlmaWVyUmFkaXVzOiLpu5jorqTljYrlvoQiLAogICAgICAgICAgICAgICAgbWFnbmlmaWVyV2hlZWxab29tRW5hYmxlZDoi5ZCv55So5rua6L2u57yp5pS+IiwKICAgICAgICAgICAgICAgIG1hZ25pZmllcldoZWVsWm9vbVJhbmdlOiLmu5rova7nvKnmlL7nmoTlgI3njociLAogICAgICAgICAgICAgICAgZ2FsbGVyeToi5Zu+5bqTIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlGaXRUb1NjcmVlbjoi5a+55Zu+54mH6L+b6KGM57yp5pS+5Lul6YCC5bqU5bGP5bmVIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlGaXRUb1NjcmVlblNtYWxsOiLlsI/lm77kuZ/nvKnmlL7ku6XpgILlupTlsY/luZUiLAogICAgICAgICAgICAgICAgZ2FsbGVyeUZpdFRvU2NyZWVuVGlwOiLpgILlupTmlrnlvI/kuLpjb250YWlu77yM6Z2eY292ZXIiLAogICAgICAgICAgICAgICAgZ2FsbGVyeVNjcm9sbEVuZFRvQ2hhbmdlOiLlpKflm77mu5rliqjliLDlupXlkI7liIfmjaLlm77niYciLAogICAgICAgICAgICAgICAgZ2FsbGVyeVNjcm9sbEVuZFRvQ2hhbmdlVGlwOiLlj5bmtojkuIrkuIDpgInpobnlkI7miY3mnInmlYgiLAogICAgICAgICAgICAgICAgZ2FsbGVyeUV4cG9ydFR5cGU6IuWbvueJh+WvvOWHuum7mOiupOaOkuW6jyIsCiAgICAgICAgICAgICAgICBncmlkOiflubPpk7rmjpLluo8nLAogICAgICAgICAgICAgICAgZ3JpZEJpZzon5Y6f5Zu+5bmz6ZO6JywKICAgICAgICAgICAgICAgIGxpc3Q6J+WIl+ihqOaOkuW6jycsCiAgICAgICAgICAgICAgICBnYWxsZXJ5QXV0b0xvYWQ6IuiHquWKqOWKoOi9veabtOWkmuWbvueJhyIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5TG9hZEFsbDoi5Yqg6L295pu05aSa5Zu+54mH5pe26Ieq5Yqo5aSE55CG5YWo6YOo6aG1IiwKICAgICAgICAgICAgICAgIGdhbGxlcnlMb2FkQWxsVGlwOiLoi6XpobXmlbDov4flpJrlj6/og73lvbHlk43kvZPpqowiLAogICAgICAgICAgICAgICAgZ2FsbGVyeVNjYWxlU21hbGxTaXplMToi5a6e6ZmF5bC65a+455qE6auY5ZKM5a696YO95bCP5LqOICIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5U2NhbGVTbWFsbFNpemUyOiIg5YOP57Sg5YiZ5b2S5YWl5bCP5bC65a+45Zu+54mHIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlTaG93U21hbGxTaXplOiLpu5jorqTmmL7npLrlsI/lsLrlr7jlm77niYciLAogICAgICAgICAgICAgICAgZ2FsbGVyeVRyYW5zaXRpb246IuaYvuekuuWbvuW6k+WIh+aNouWbvueJh+eahOeJueaViCIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5U2lkZWJhclBvc2l0aW9uOiLnvKnnlaXlm77moI/kvY3nva4iLAogICAgICAgICAgICAgICAgYm90dG9tOiflupXpg6gnLAogICAgICAgICAgICAgICAgcmlnaHQ6J+WPs+S+pycsCiAgICAgICAgICAgICAgICBsZWZ0Oiflt6bkvqcnLAogICAgICAgICAgICAgICAgdG9wOifpobbpg6gnLAogICAgICAgICAgICAgICAgZ2FsbGVyeVNpZGViYXJTaXplOiLpq5jluqYiLAogICAgICAgICAgICAgICAgZ2FsbGVyeVNpZGViYXJTaXplVGlwOiLnvKnnlaXlm77moI/nmoTpq5jvvIjlpoLmnpzmmK/msLTlubPmlL7nva7vvInmiJbogIXlrr3vvIjlpoLmnpzmmK/lnoLnm7TmlL7nva7vvIkiLAogICAgICAgICAgICAgICAgZ2FsbGVyeU1heDE6IuacgOWkmumihOivuyAiLAogICAgICAgICAgICAgICAgZ2FsbGVyeU1heDI6IiDlvKDlm77niYfvvIjliY3lkI7lkITlpJrlsJHlvKDvvIkiLAogICAgICAgICAgICAgICAgZ2FsbGVyeUF1dG9ab29tOiLnvKnmlL7mlLnlm54gMTAwJe+8iGNocm9tZe+8iSIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5QXV0b1pvb21UaXA6IuWmguaenOacieaUvuWkp++8jOWImeaKiuWbvueJh+WPiiBzaWRlYmFyIOmDqOWIhueahOe8qeaUvuaUueWbniAxMDAl77yM5aKe5aSn5Y+v6KeG6Z2i56ev77yI5LuF5ZyoIGNocm9tZSDkuIvmnInmlYjvvIkiLAogICAgICAgICAgICAgICAgZ2FsbGVyeURlc2NyaXB0aW9uTGVuZ3RoMToi5rOo6YeK55qE5pyA5aSn5a695bqmIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlEZXNjcmlwdGlvbkxlbmd0aDI6IiDkuKrlrZfnrKYiLAogICAgICAgICAgICAgICAgZ2FsbGVyeUF1dG9PcGVuU2l0ZXM6IuiHquWKqOaJk+W8gOWbvuW6k+eahOe9keermeato+WImSIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5RWRpdFNpdGU6IuWcqOe6v+e8lui+keermeeCuSIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3c6IuWbvueJh+eql+WPoyIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dGaXRUb1NjcmVlbjoi6YCC5bqU5bGP5bmV77yM5bm25LiU5rC05bmz5Z6C55u05bGF5LitIiwKICAgICAgICAgICAgICAgIGltZ1dpbmRvd0ZpdFRvU2NyZWVuVGlwOiLpgILlupTmlrnlvI/kuLpjb250YWlu77yM6Z2eY292ZXIiLAogICAgICAgICAgICAgICAgaW1nV2luZG93RGVmYXVsdFRvb2w6IuaJk+W8gOeql+WPo+aXtum7mOiupOmAieaLqeeahOW3peWFtyIsCiAgICAgICAgICAgICAgICBoYW5kOifmipPmiYsnLAogICAgICAgICAgICAgICAgcm90YXRlOifml4vovawnLAogICAgICAgICAgICAgICAgem9vbTon5pS+5aSn6ZWcJywKICAgICAgICAgICAgICAgIGltZ1dpbmRvd0VzY0tleToiRXNj6ZSu5YWz6ZetIiwKICAgICAgICAgICAgICAgIGltZ1dpbmRvd0RibENsaWNrSW1nV2luZG93OiLlj4zlh7vlm77niYfnqpflj6PlhbPpl60iLAogICAgICAgICAgICAgICAgaW1nV2luZG93Q2xpY2tPdXRzaWRlOiLngrnlh7vlm77niYflpJbpg6jlhbPpl60iLAogICAgICAgICAgICAgICAgaW1nV2luZG93Q2xpY2tPdXRzaWRlVGlwOiLku4XlvZPopobnm5blsYLmmL7npLrml7bnlJ/mlYgiLAogICAgICAgICAgICAgICAgbm9uZTon5pegJywKICAgICAgICAgICAgICAgIGNsaWNrOifljZXlh7snLAogICAgICAgICAgICAgICAgZGJsY2xpY2s6J+WPjOWHuycsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dPdmVybGF5ZXJTaG93bjoi6KaG55uW5bGCIiwKICAgICAgICAgICAgICAgIGltZ1dpbmRvd092ZXJsYXllckNvbG9yOiLpopzoibLlkozkuI3pgI/mmI7luqYiLAogICAgICAgICAgICAgICAgaW1nV2luZG93U2hpZnRSb3RhdGVTdGVwMToi5peL6L2s5pe277yM5oyJ5L2Pc2hpZnTplK7vvIzml4vovaznmoTmraXov5siLAogICAgICAgICAgICAgICAgaW1nV2luZG93U2hpZnRSb3RhdGVTdGVwMjoiIOW6piIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dNb3VzZVdoZWVsWm9vbToi5rua6L2u57yp5pS+IiwKICAgICAgICAgICAgICAgIGltZ1dpbmRvd1pvb21SYW5nZToi5rua6L2u57yp5pS+5q+U5L6LIiwKICAgICAgICAgICAgICAgIGltZ1dpbmRvd1pvb21SYW5nZVRpcDoi57yp5pS+5q+U5L6LKOW/hemhu+S4uuato+aVsCkiLAogICAgICAgICAgICAgICAgb3RoZXJzOiLlhbblroMiLAogICAgICAgICAgICAgICAgd2FpdEltZ0xvYWQ6IuetieWbvueJh+WujOWFqOi9veWFpeWQju+8jOaJjeW8gOWni+aJp+ihjOW8ueWHuuaUvuWkp+etieaTjeS9nCIsCiAgICAgICAgICAgICAgICB3YWl0SW1nTG9hZFRpcDoi5oyJ5L2PY3RybOmUrueahOaXtuWAmSzlj6/ku6XkuLTml7bmiafooYzlkozov5nkuKrorr7lrprnm7jlj43nmoTorr7lrpoiLAogICAgICAgICAgICAgICAgZGVidWc6Iuiwg+ivleaooeW8jyIsCiAgICAgICAgICAgICAgICBmaXJzdEVuZ2luZToi6aaW6YCJ5pCc5Zu+5byV5pOOIiwKICAgICAgICAgICAgICAgIHJlZnJlc2hXaGVuRXJyb3I6Iuivu+WPlumUmeivr++8jOeCueWHu+mHjei9vSIsCiAgICAgICAgICAgICAgICBzd2l0Y2hTbGlkZToi5byA5YWz5L6n6L655qCPIiwKICAgICAgICAgICAgICAgIGNvdW50RG93bjoi5YCS6K6h5pe2IgogICAgICAgICAgICB9OwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJ6aC1UVyI6CiAgICAgICAgICAgIGkxOG5EYXRhPXsKICAgICAgICAgICAgICAgIHNoYXJlOiLliIbkuqsiLAogICAgICAgICAgICAgICAgbG9hZEFsbDoi6LyJ5YWl5pu05aSaIiwKICAgICAgICAgICAgICAgIGxvYWRlZEFsbDoi6LyJ5YWl5a6M55WiIiwKICAgICAgICAgICAgICAgIGxvYWRpbmc6Iuato+WcqOi8ieWFpSIsCiAgICAgICAgICAgICAgICBsb2FkQWxsVGlwOiLovInlhaXkuIvkuIDpoIHnmoTlnJbniYciLAogICAgICAgICAgICAgICAgZmlkZGxlOiLmipjpqLAiLAogICAgICAgICAgICAgICAgZmlkZGxlVGlwOiLlvYjlh7rlnJbniYfpgLLooYzopIfpm5zmk43kvZwiLAogICAgICAgICAgICAgICAgY29sbGVjdDoi5pS26JePIiwKICAgICAgICAgICAgICAgIGNvbGxlY3RlZDoi5bey5pS26JePIiwKICAgICAgICAgICAgICAgIGV4aXRDb2xsZWN0aW9uOiLpgIDlh7rmlLbol48iLAogICAgICAgICAgICAgICAgZXhpdENvbGxlY3Rpb25UaXA6Ium7nuaTiumAgOWHuuaUtuiXj+aooeW8jyIsCiAgICAgICAgICAgICAgICBub0NvbGxlY3Rpb25ZZXQ6IuS9oOmChOacqOacieaUtuiXj+S7u+S9leWclueJhyIsCiAgICAgICAgICAgICAgICBjb2xsZWN0RGV0YWlsOiLmj4/ov7AiLAogICAgICAgICAgICAgICAgY29sbGVjdERldGFpbFRpcDoi57Wm5pS26JeP55qE5ZyW54mH5re75Yqg5LiA5Lqb5o+P6L+w5ZCnIiwKICAgICAgICAgICAgICAgIHBsYXlTbGlkZToi5pKt5pS+5bm754eI54mHIiwKICAgICAgICAgICAgICAgIHNsaWRlR2FwOiLplpPpmpQocykiLAogICAgICAgICAgICAgICAgc2xpZGVHYXBUaXA6IumWk+malOaZgumWk++8jOWWruS9jSjnp5IpIiwKICAgICAgICAgICAgICAgIHNsaWRlQmFjazoi5b6M6YCAIiwKICAgICAgICAgICAgICAgIHNsaWRlQmFja1RpcDoi5b6e5b6M5b6A5YmN5pKt5pS+IiwKICAgICAgICAgICAgICAgIHNsaWRlV2FpdDoi562J5b6F5ZyW54mH6K6A5Y+WIiwKICAgICAgICAgICAgICAgIHNsaWRlV2FpdFRpcDoi5b6e5q+P5by15ZyW54mH5a6M5YWo6K6A5Y+W5a6M5oiQ5b6M5omN6ZaL5aeL5YCS6KiI5pmCIiwKICAgICAgICAgICAgICAgIHNsaWRlU2tpcEVycm9yOiLot7PpgY7pjK/oqqTlnJbniYciLAogICAgICAgICAgICAgICAgc2xpZGVTa2lwRXJyb3JUaXA6IuW/q+mAn+i3s+mBjuiugOWPlumMr+iqpOeahOWclueJhyIsCiAgICAgICAgICAgICAgICB0eXBlOiLpoZ7liKUiLAogICAgICAgICAgICAgICAgdHlwZVRpcDoi6YG45pOH5ZyW54mH6aGe5YilIiwKICAgICAgICAgICAgICAgIGFkdmFuY2VkUnVsZXM6IumrmOe0muimj+WJhyIsCiAgICAgICAgICAgICAgICBhZHZhbmNlZFJ1bGVzVGlwOiLnlLHpq5jntJropo/liYfljLnphY3lh7rkvobnmoQiLAogICAgICAgICAgICAgICAgdHBSdWxlczoi6YCa6YWN6KaP5YmHIiwKICAgICAgICAgICAgICAgIHRwUnVsZXNUaXA6IueUsemAmumFjeimj+WJh+WMuemFjeWHuuS+hueahCIsCiAgICAgICAgICAgICAgICBzY2FsZVJ1bGVzOiLnuK7mlL7pgY7nmoQiLAogICAgICAgICAgICAgICAgc2NhbGVSdWxlc1RpcDoianPoh6rli5Xmn6Xmib7vvIznm7jlsI3poIHpnaLpoa/npLrnmoTlnJbniYfmnInnuK7mlL7pgY7nmoQiLAogICAgICAgICAgICAgICAgbm9TY2FsZVJ1bGVzOiLnhKHnuK7mlL7pgY4iLAogICAgICAgICAgICAgICAgbm9TY2FsZVJ1bGVzVGlwOiJqc+iHquWLleafpeaJvu+8jOeEoee4ruaUvumBjueahO+8jOS9huaYr+a7v+i2s+S4gOWumueahOWkp+WwjyIsCiAgICAgICAgICAgICAgICBzbWFsbFJ1bGVzOiLlsI/lsLrlr7jnmoQiLAogICAgICAgICAgICAgICAgc21hbGxSdWxlc1RpcDoi5bCP5bC65a+45ZyW54mH77yM5a+m6Zqb5bC65a+455qE6auY5ZKM5a+s6YO95bCP5pa8I3Qj5YOP57SgIiwKICAgICAgICAgICAgICAgIGNvbW1hbmQ6IuWRveS7pCIsCiAgICAgICAgICAgICAgICBjb21tYW5kVGlwOiLlkb3ku6Toj5zllq4iLAogICAgICAgICAgICAgICAgb25saW5lRWRpdDoi5Zyo57ea57eo6LyvIiwKICAgICAgICAgICAgICAgIG9ubGluZUVkaXRUaXA6IuS9v+eUqCN0I+WcqOe3mue3qOi8r+ipsuWclueJhyIsCiAgICAgICAgICAgICAgICBvcGVuSW5OZXdXaW5kb3c6IuaWsOeql+WPo+aJk+mWiyIsCiAgICAgICAgICAgICAgICBvcGVuSW5OZXdXaW5kb3dUaXA6IuaWsOeql+WPo+aJk+mWi+WclueJhyIsCiAgICAgICAgICAgICAgICBmaW5kSW5QYWdlOiLlrprkvY3liLDlnJYiLAogICAgICAgICAgICAgICAgZmluZEluUGFnZVRpcDoi5ru+5YuV5Yiw55W25YmN5ZyW54mH5omA5Zyo55qE5L2N572uIiwKICAgICAgICAgICAgICAgIHZpZXdDb2xsZWN0aW9uOiLmn6XnnIvmlLbol48iLAogICAgICAgICAgICAgICAgdmlld0NvbGxlY3Rpb25UaXA6Iuafpeeci+aJgOacieaUtuiXj+eahOWclueJhyIsCiAgICAgICAgICAgICAgICBpbkNvbGxlY3Rpb246IuaUtuiXj+aooeW8j+S4re+8jOeEoeazleS9v+eUqCIsCiAgICAgICAgICAgICAgICBjYW50RmluZDoi5ZyW54mH5LiN5Zyo5paH5qqU5Lit77yM5oiW6ICF6KKr6Zqx6JeP5LqG77yM54Sh5rOV5a6a5L2N77yBIiwKICAgICAgICAgICAgICAgIGV4cG9ydEltYWdlczoi5bCO5Ye65aSn5ZyWIiwKICAgICAgICAgICAgICAgIGV4cG9ydEltYWdlc1RpcDoi5bCO5Ye65omA5pyJ5ZyW54mH5Yiw5paw56qX5Y+jIiwKICAgICAgICAgICAgICAgIGRvd25sb2FkSW1hZ2U6IuS4i+i8ieaJgOaciSIsCiAgICAgICAgICAgICAgICBkb3dubG9hZEltYWdlVGlwOiLkuIvovInnlbbliY3luqvkuK3miYDmnInpoa/npLrlnJbniYciLAogICAgICAgICAgICAgICAgY29weUltYWdlc1VybDoi6KSH6KO95omA5pyJIiwKICAgICAgICAgICAgICAgIGNvcHlJbWFnZXNVcmxUaXA6Iuikh+ijveaJgOacieWkp+WcluWcsOWdgCIsCiAgICAgICAgICAgICAgICBjb3B5U3VjY2Vzczoi5bey5oiQ5Yqf6KSH6KO9ICN0IyDlvLXlpKflnJblnLDlnYAiLAogICAgICAgICAgICAgICAgYXV0b1JlZnJlc2g6IuiHquWLlemHjei8iSIsCiAgICAgICAgICAgICAgICBhdXRvUmVmcmVzaFRpcDoi5pyA5b6M5bm+5by15ZyW54mH5pmC77yM5ru+5YuV5Li756qX5Y+j5Yiw5pyA5bqV6YOo77yM54S25b6M6Ieq5YuV6LyJ5YWl5paw55qE5ZyW54mHIiwKICAgICAgICAgICAgICAgIGVudGVyRnVsbHNjOiLpgLLlhaXlhajlsY8iLAogICAgICAgICAgICAgICAgZXhpdEZ1bGxzYzoi6YCA5Ye65YWo5bGPIiwKICAgICAgICAgICAgICAgIGNvbmZpZzoi6Kit572uIiwKICAgICAgICAgICAgICAgIGNsb3NlR2FsbGVyeToi6Zec6ZaJ5bqrIiwKICAgICAgICAgICAgICAgIHJldHVyblRvR2FsbGVyeToi5Zue5Yiw5bqrIiwKICAgICAgICAgICAgICAgIHBpY0luZm86IuWclueJh+S/oeaBryIsCiAgICAgICAgICAgICAgICBwaWNOb3RlOiLlnJbniYfms6jph4siLAogICAgICAgICAgICAgICAgcmVzb2x1dGlvbjoi6Kej5p6Q5bqmIiwKICAgICAgICAgICAgICAgIHNjYWxlUmF0aW86Iue4ruaUvuavlCIsCiAgICAgICAgICAgICAgICBzaW1pbGFySW1hZ2U6IuS7peWcluaQnOWcliIsCiAgICAgICAgICAgICAgICBzY2FsZToi57iu5pS+IiwKICAgICAgICAgICAgICAgIGhvcml6b250YWxGbGlwOiLmsLTlubPnv7vovYkiLAogICAgICAgICAgICAgICAgdmVydGljYWxGbGlwOiLlnoLnm7Tnv7vovYkiLAogICAgICAgICAgICAgICAgYWN0dWFsQnRuOifmn6XnnIvljp/lp4soQSknLAogICAgICAgICAgICAgICAgc2VhcmNoQnRuOifmn6Xmib7ljp/lnJYoUyknLAogICAgICAgICAgICAgICAgZ2FsbGVyeUJ0bjon5p+l55yL5bqrKEcpJywKICAgICAgICAgICAgICAgIGN1cnJlbnRCdG46J+afpeeci+eVtuWJjShDKScsCiAgICAgICAgICAgICAgICBtYWduaWZpZXJCdG46J+aUvuWkp+mPoShNKScsCiAgICAgICAgICAgICAgICBwaWNUaXRsZToi5ZyW54mH5qiZ6aGMIiwKICAgICAgICAgICAgICAgIHBpY051bToi5ZyW54mH5pW46YePIiwKICAgICAgICAgICAgICAgIGV4cG9ydEltYWdlc1VybDoi5bCO5Ye65ZyW54mH6Y+I5o6lIiwKICAgICAgICAgICAgICAgIGV4cG9ydEltYWdlc1VybFBvcDoiQ3RybCtD6KSH6KO95ZyW54mH6Y+I5o6lIiwKICAgICAgICAgICAgICAgIGJlZ2luU2VhcmNoSW1nOiIjdCPorZjlnJbplovlp4vigKbigKYiLAogICAgICAgICAgICAgICAgZmluZE5vUGljOiLmnKrmib7liLDljp/lnJYiLAogICAgICAgICAgICAgICAgZmluZE92ZXJCZWdpbkxvYWQ6IiN0I+itmOWclue1kOadn++8jOWFseaJvuWIsCN0I+W8teWMuemFjeWclueJh++8jOmWi+Wni+i8ieWFpeesrOS4gOW8tSIsCiAgICAgICAgICAgICAgICBsb2FkTmV4dFNpbWlsYXI6IuWOn+Wclui8ieWFpeWkseaVl++8jOWYl+ippui8ieWFpeS4i+S4gOe1kOaenOKApuKApiIsCiAgICAgICAgICAgICAgICBsb2FkRXJyb3I6Iui8ieWFpeWkseaVlyIsCiAgICAgICAgICAgICAgICBvcGVuSG9tZVBhZ2U6Ium7nuaTiuatpOiZleaJk+mWi+S4u+mggSIsCiAgICAgICAgICAgICAgICBwb3NpdGlvbjoi6aGv56S65L2N572uIiwKICAgICAgICAgICAgICAgIHRvcExlZnQ6ICflnJbniYflt6bkuIrop5InLAogICAgICAgICAgICAgICAgdG9wUmlnaHQ6ICflnJbniYflj7PkuIrop5InLAogICAgICAgICAgICAgICAgYm90dG9tUmlnaHQ6ICflnJbniYflj7PkuIvop5InLAogICAgICAgICAgICAgICAgYm90dG9tTGVmdDogJ+WclueJh+W3puS4i+inkicsCiAgICAgICAgICAgICAgICB0b3BDZW50ZXI6ICflnJbniYfmraPkuIrmlrknLAogICAgICAgICAgICAgICAgYm90dG9tQ2VudGVyOiAn5ZyW54mH5q2j5LiL5pa5JywKICAgICAgICAgICAgICAgIGZsb2F0QmFyOiLmta7li5Xlt6XlhbfmrIQiLAogICAgICAgICAgICAgICAgc2hvd0RlbGF5OiLpoa/npLrlu7bmmYIiLAogICAgICAgICAgICAgICAgbXM6Iuavq+enkiIsCiAgICAgICAgICAgICAgICBoaWRlOiLpmrHol48iLAogICAgICAgICAgICAgICAgaGlkZURlbGF5OiLpmrHol4/lu7bmmYIiLAogICAgICAgICAgICAgICAgZm9yY2VTaG93OiLpnZ7nuK7mlL7lnJbniYfvvIzotoXpgY7oqbLlsLrlr7jvvIzpoa/npLrmta7moYYiLAogICAgICAgICAgICAgICAgZm9yY2VTaG93VGlwOiLpnZ7nuK7mlL7nmoTlnJbniYflpKflsI/otoXpgY7kuIvpnaLoqK3lrprnmoTlsLrlr7jmmYLpoa/npLrmta7li5Xlt6XlhbfmrIQiLAogICAgICAgICAgICAgICAgcHg6IuWDj+e0oCIsCiAgICAgICAgICAgICAgICBtaW5TaXplTGltaXQ6Iue4ruaUvuWclueJh++8jOi2hemBjuipsuWwuuWvuO+8jOmhr+ekuua1ruahhiIsCiAgICAgICAgICAgICAgICBtaW5TaXplTGltaXRUaXA6IuWclueJh+iiq+e4ruaUvijlnJbniYfljp/lp4vlpKflsI/oiIflr6bpmpvlpKflsI/kuI3kuIDoh7Qp5b6MLOWOn+WclumVt+WvrOWkp+aWvOioreWumuWAvOaZgumhr+ekuua1ruWLleW3peWFt+ashCIsCiAgICAgICAgICAgICAgICBsaXN0ZW5CZzoi55uj6IG96IOM5pmv5ZyWIiwKICAgICAgICAgICAgICAgIGxpc3RlbkJnVGlwOiLlnKjmnInog4zmma/lnJbnmoTlhYPntKDkuIrpoa/npLrmh7jmta7moYYiLAogICAgICAgICAgICAgICAgYnV0b25PcmRlcjoi5bel5YW35qyE5ZyW5qiZ5o6S5bqPIiwKICAgICAgICAgICAgICAgIGtleXNFbmFibGU6IuWVn+eUqOS7peS4i+W/q+aNt+mNtSIsCiAgICAgICAgICAgICAgICBrZXlzQWN0dWFsOiLmiZPplovlpKflnJYiLAogICAgICAgICAgICAgICAga2V5c0FjdHVhbFRpcDoi55W25Ye654++5oe45rWu5qKd5pmC5oyJ5LiL5q2k5oyJ6Y215omT6ZaL5aSn5ZyWIiwKICAgICAgICAgICAgICAgIGtleXNTZWFyY2g6IuafpeaJvuWOn+WcliIsCiAgICAgICAgICAgICAgICBrZXlzU2VhcmNoVGlwOiLnlbblh7rnj77mh7jmta7mop3mmYLmjInkuIvmraTmjInpjbXmn6Xmib7ljp/lnJYiLAogICAgICAgICAgICAgICAga2V5c0N1cnJlbnQ6IuaJk+mWi+eVtuWJjeWclueJhyIsCiAgICAgICAgICAgICAgICBrZXlzQ3VycmVudFRpcDoi55W25Ye654++5oe45rWu5qKd5pmC5oyJ5LiL5q2k5oyJ6Y215omT6ZaL55W25YmN6aGv56S655qE5ZyW54mHIiwKICAgICAgICAgICAgICAgIGtleXNNYWduaWZpZXI6IuaJk+mWi+aUvuWkp+mPoeingOWvnyIsCiAgICAgICAgICAgICAgICBrZXlzTWFnbmlmaWVyVGlwOiLnlbblh7rnj77mh7jmta7mop3mmYLmjInkuIvmraTmjInpjbXmiZPplovmlL7lpKfpj6Hop4Dlr58iLAogICAgICAgICAgICAgICAga2V5c0dhbGxlcnk6IuaJk+mWi+WcluW6qyIsCiAgICAgICAgICAgICAgICBrZXlzR2FsbGVyeVRpcDoi55W25Ye654++5oe45rWu5qKd5pmC5oyJ5LiL5q2k5oyJ6Y215omT6ZaL5ZyW5bqrIiwKICAgICAgICAgICAgICAgIG1hZ25pZmllcjoi5pS+5aSn6Y+hIiwKICAgICAgICAgICAgICAgIG1hZ25pZmllclJhZGl1czoi6buY6KqN5Y2K5b6RIiwKICAgICAgICAgICAgICAgIG1hZ25pZmllcldoZWVsWm9vbUVuYWJsZWQ6IuWVn+eUqOa7vui8que4ruaUviIsCiAgICAgICAgICAgICAgICBtYWduaWZpZXJXaGVlbFpvb21SYW5nZToi5ru+6Lyq57iu5pS+55qE5YCN546HIiwKICAgICAgICAgICAgICAgIGdhbGxlcnk6IuWcluW6qyIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5Rml0VG9TY3JlZW46IuWwjeWclueJh+mAsuihjOe4ruaUvuS7pemBqeaHieWxj+W5lSIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5Rml0VG9TY3JlZW5TbWFsbDoi5bCP5ZyW5Lmf57iu5pS+5Lul6YGp5oeJ5bGP5bmVIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlGaXRUb1NjcmVlblRpcDoi6YGp5oeJ5pa55byP54K6Y29udGFpbu+8jOmdnmNvdmVyIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlTY3JvbGxFbmRUb0NoYW5nZToi5aSn5ZyW5ru+5YuV5Yiw5bqV5b6M5YiH5o+b5ZyW54mHIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlTY3JvbGxFbmRUb0NoYW5nZVRpcDoi5Y+W5raI5LiK5LiA6YG46aCF5b6M5omN5pyJ5pWIIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlFeHBvcnRUeXBlOiLlnJbniYflsI7lh7rpu5joqo3mjpLluo8iLAogICAgICAgICAgICAgICAgZ3JpZDon5bmz6Yuq5o6S5bqPJywKICAgICAgICAgICAgICAgIGdyaWRCaWc6J+WOn+WcluW5s+mLqicsCiAgICAgICAgICAgICAgICBsaXN0OifliJfooajmjpLluo8nLAogICAgICAgICAgICAgICAgZ2FsbGVyeUF1dG9Mb2FkOiLoh6rli5XovInlhaXmm7TlpJrlnJbniYciLAogICAgICAgICAgICAgICAgZ2FsbGVyeUxvYWRBbGw6Iui8ieWFpeabtOWkmuWclueJh+aZguiHquWLleiZleeQhuWFqOmDqOmggSIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5TG9hZEFsbFRpcDoi6Iul6aCB5pW46YGO5aSa5Y+v6IO95b2x6Z+/6auU6amXIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlTY2FsZVNtYWxsU2l6ZTE6IuWvpumam+WwuuWvuOeahOmrmOWSjOWvrOmDveWwj+aWvCAiLAogICAgICAgICAgICAgICAgZ2FsbGVyeVNjYWxlU21hbGxTaXplMjoiIOWDj+e0oOWJh+atuOWFpeWwj+WwuuWvuOWclueJhyIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5U2hvd1NtYWxsU2l6ZToi6buY6KqN6aGv56S65bCP5bC65a+45ZyW54mHIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlUcmFuc2l0aW9uOiLpoa/npLrlnJbluqvliIfmj5vlnJbniYfnmoTnibnmlYgiLAogICAgICAgICAgICAgICAgZ2FsbGVyeVNpZGViYXJQb3NpdGlvbjoi57iu55Wl5ZyW5qyE5L2N572uIiwKICAgICAgICAgICAgICAgIGJvdHRvbTon5bqV6YOoJywKICAgICAgICAgICAgICAgIHJpZ2h0Oiflj7PlgbQnLAogICAgICAgICAgICAgICAgbGVmdDon5bem5YG0JywKICAgICAgICAgICAgICAgIHRvcDon6aCC6YOoJywKICAgICAgICAgICAgICAgIGdhbGxlcnlTaWRlYmFyU2l6ZToi6auY5bqmIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlTaWRlYmFyU2l6ZVRpcDoi57iu55Wl5ZyW5qyE55qE6auY77yI5aaC5p6c5piv5rC05bmz5pS+572u77yJ5oiW6ICF5a+s77yI5aaC5p6c5piv5Z6C55u05pS+572u77yJIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlNYXgxOiLmnIDlpJrpoJDoroAgIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlNYXgyOiIg5by15ZyW54mH77yI5YmN5b6M5ZCE5aSa5bCR5by177yJIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlBdXRvWm9vbToi57iu5pS+5pS55ZueIDEwMCXvvIhjaHJvbWXvvIkiLAogICAgICAgICAgICAgICAgZ2FsbGVyeUF1dG9ab29tVGlwOiLlpoLmnpzmnInmlL7lpKfvvIzliYfmiorlnJbniYflj4ogc2lkZWJhciDpg6jliIbnmoTnuK7mlL7mlLnlm54gMTAwJe+8jOWinuWkp+WPr+imlumdouepje+8iOWDheWcqCBjaHJvbWUg5LiL5pyJ5pWI77yJIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlEZXNjcmlwdGlvbkxlbmd0aDE6IuazqOmHi+eahOacgOWkp+WvrOW6piIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5RGVzY3JpcHRpb25MZW5ndGgyOiIg5YCL5a2X5YWDIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlBdXRvT3BlblNpdGVzOiLoh6rli5XmiZPplovlnJbluqvnmoTntrLnq5nmraPliYciLAogICAgICAgICAgICAgICAgZ2FsbGVyeUVkaXRTaXRlOiLlnKjnt5rnt6jovK/nq5npu54iLAogICAgICAgICAgICAgICAgaW1nV2luZG93OiLlnJbniYfnqpflj6MiLAogICAgICAgICAgICAgICAgaW1nV2luZG93Rml0VG9TY3JlZW46IumBqeaHieWxj+W5le+8jOS4puS4lOawtOW5s+WeguebtOWxheS4rSIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dGaXRUb1NjcmVlblRpcDoi6YGp5oeJ5pa55byP54K6Y29udGFpbu+8jOmdnmNvdmVyIiwKICAgICAgICAgICAgICAgIGltZ1dpbmRvd0RlZmF1bHRUb29sOiLmiZPplovnqpflj6PmmYLpu5joqo3pgbjmk4fnmoTlt6XlhbciLAogICAgICAgICAgICAgICAgaGFuZDon5oqT5omLJywKICAgICAgICAgICAgICAgIHJvdGF0ZTon5peL6L2JJywKICAgICAgICAgICAgICAgIHpvb206J+aUvuWkp+mPoScsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dFc2NLZXk6IkVzY+mNtemXnOmWiSIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dEYmxDbGlja0ltZ1dpbmRvdzoi6ZuZ5pOK5ZyW54mH56qX5Y+j6Zec6ZaJIiwKICAgICAgICAgICAgICAgIGltZ1dpbmRvd0NsaWNrT3V0c2lkZToi6bue5pOK5ZyW54mH5aSW6YOo6Zec6ZaJIiwKICAgICAgICAgICAgICAgIGltZ1dpbmRvd0NsaWNrT3V0c2lkZVRpcDoi5YOF55W26KaG6JOL5bGk6aGv56S65pmC55Sf5pWIIiwKICAgICAgICAgICAgICAgIG5vbmU6J+eEoScsCiAgICAgICAgICAgICAgICBjbGljazon5Zau5pOKJywKICAgICAgICAgICAgICAgIGRibGNsaWNrOifpm5nmk4onLAogICAgICAgICAgICAgICAgaW1nV2luZG93T3ZlcmxheWVyU2hvd246IuimhuiTi+WxpCIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dPdmVybGF5ZXJDb2xvcjoi6aGP6Imy5ZKM5LiN6YCP5piO5bqmIiwKICAgICAgICAgICAgICAgIGltZ1dpbmRvd1NoaWZ0Um90YXRlU3RlcDE6IuaXi+i9ieaZgu+8jOaMieS9j3NoaWZ06Y2177yM5peL6L2J55qE5q2l6YCyIiwKICAgICAgICAgICAgICAgIGltZ1dpbmRvd1NoaWZ0Um90YXRlU3RlcDI6IiDluqYiLAogICAgICAgICAgICAgICAgaW1nV2luZG93TW91c2VXaGVlbFpvb206Iua7vui8que4ruaUviIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dab29tUmFuZ2U6Iua7vui8que4ruaUvuavlOS+iyIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dab29tUmFuZ2VUaXA6Iue4ruaUvuavlOS+iyjlv4XpoIjngrrmraPmlbgpIiwKICAgICAgICAgICAgICAgIG90aGVyczoi5YW25a6DIiwKICAgICAgICAgICAgICAgIHdhaXRJbWdMb2FkOiLnrYnlnJbniYflrozlhajovInlhaXlvozvvIzmiY3plovlp4vln7fooYzlvYjlh7rmlL7lpKfnrYnmk43kvZwiLAogICAgICAgICAgICAgICAgd2FpdEltZ0xvYWRUaXA6IuaMieS9j2N0cmzpjbXnmoTmmYLlgJks5Y+v5Lul6Ieo5pmC5Z+36KGM5ZKM6YCZ5YCL6Kit5a6a55u45Y+N55qE6Kit5a6aIiwKICAgICAgICAgICAgICAgIGRlYnVnOiLoqr/oqabmqKHlvI8iLAogICAgICAgICAgICAgICAgZmlyc3RFbmdpbmU6IummlumBuOaQnOWcluW8leaTjiIsCiAgICAgICAgICAgICAgICByZWZyZXNoV2hlbkVycm9yOiLoroDlj5bpjK/oqqTvvIzpu57mk4rph43ovIkiLAogICAgICAgICAgICAgICAgc3dpdGNoU2xpZGU6IumWi+mXnOWBtOmCiuashCIsCiAgICAgICAgICAgICAgICBjb3VudERvd246IuWAkuioiOaZgiIKICAgICAgICAgICAgfTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgaTE4bkRhdGE9ewogICAgICAgICAgICAgICAgc2hhcmU6IlNoYXJlIiwKICAgICAgICAgICAgICAgIGxvYWRBbGw6IkxvYWQgbW9yZSIsCiAgICAgICAgICAgICAgICBsb2FkZWRBbGw6IkxvYWQgY29tcGxldGVkIiwKICAgICAgICAgICAgICAgIGxvYWRpbmc6IkxvYWRpbmcgLi4uIiwKICAgICAgICAgICAgICAgIGxvYWRBbGxUaXA6IkxvYWQgdGhlIHBpY3R1cmUgb24gdGhlIG5leHQgcGFnZSIsCiAgICAgICAgICAgICAgICBmaWRkbGU6IlRvc3MiLAogICAgICAgICAgICAgICAgZmlkZGxlVGlwOiJQb3AtdXAgcGljdHVyZXMgZm9yIGNvbXBsZXggb3BlcmF0aW9ucyIsCiAgICAgICAgICAgICAgICBjb2xsZWN0OiJDb2xsZWN0aW9uIiwKICAgICAgICAgICAgICAgIGNvbGxlY3RlZDoiSGFzIGJlZW4gY29sbGVjdGVkIiwKICAgICAgICAgICAgICAgIGV4aXRDb2xsZWN0aW9uOiJFeGl0IGNvbGxlY3Rpb24iLAogICAgICAgICAgICAgICAgZXhpdENvbGxlY3Rpb25UaXA6IkNsaWNrIHRvIGV4aXQgdGhlIGNvbGxlY3Rpb24gbW9kZSIsCiAgICAgICAgICAgICAgICBub0NvbGxlY3Rpb25ZZXQ6IllvdSBzdGlsbCBoYXZlIGFueSBwaWN0dXJlcyBpbiB0aGUgd29vZCIsCiAgICAgICAgICAgICAgICBjb2xsZWN0RGV0YWlsOiJEZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICBjb2xsZWN0RGV0YWlsVGlwOiJBZGQgc29tZSBkZXNjcmlwdGlvbnMgdG8geW91ciBmYXZvcml0ZSBwaWN0dXJlcyIsCiAgICAgICAgICAgICAgICBwbGF5U2xpZGU6IlBsYXkgc2xpZGVzaG93IiwKICAgICAgICAgICAgICAgIHNsaWRlR2FwOiJJbnRlcnZhbCAocykiLAogICAgICAgICAgICAgICAgc2xpZGVHYXBUaXA6IkludGVydmFsLCB1bml0IChzZWNvbmRzKSIsCiAgICAgICAgICAgICAgICBzbGlkZUJhY2s6IkJhY2siLAogICAgICAgICAgICAgICAgc2xpZGVCYWNrVGlwOiJQbGF5IGZyb20gYmFjayB0byBmcm9udCIsCiAgICAgICAgICAgICAgICBzbGlkZVdhaXQ6IldhaXQgZm9yIGltYWdlIHJlYWRpbmciLAogICAgICAgICAgICAgICAgc2xpZGVXYWl0VGlwOiJUaGUgY291bnRkb3duIHN0YXJ0cyBhZnRlciBlYWNoIGltYWdlIGlzIGNvbXBsZXRlbHkgcmVhZC4iLAogICAgICAgICAgICAgICAgc2xpZGVTa2lwRXJyb3I6IlNraXAgZXJyb3IgcGljdHVyZSIsCiAgICAgICAgICAgICAgICBzbGlkZVNraXBFcnJvclRpcDoiUXVpY2tseSBza2lwIHJlYWRpbmcgdGhlIHdyb25nIHBpY3R1cmUiLAogICAgICAgICAgICAgICAgdHlwZToiQ2F0ZWdvcnkiLAogICAgICAgICAgICAgICAgdHlwZVRpcDoiU2VsZWN0IGltYWdlIGNhdGVnb3J5IiwKICAgICAgICAgICAgICAgIGFkdmFuY2VkUnVsZXM6IkFkdmFuY2VkIFJ1bGVzIiwKICAgICAgICAgICAgICAgIGFkdmFuY2VkUnVsZXNUaXA6Ik1hdGNoZWQgYnkgYWR2YW5jZWQgcnVsZXMiLAogICAgICAgICAgICAgICAgdHBSdWxlczoiV2lsZGNhcmQgcnVsZXMiLAogICAgICAgICAgICAgICAgdHBSdWxlc1RpcDoiTWF0Y2hlZCBieSB3aWxkY2FyZCBydWxlcyIsCiAgICAgICAgICAgICAgICBzY2FsZVJ1bGVzOiJab29tZWQiLAogICAgICAgICAgICAgICAgc2NhbGVSdWxlc1RpcDoiSlMgYXV0b21hdGljYWxseSBmaW5kcywgdGhlIGltYWdlIGRpc3BsYXllZCByZWxhdGl2ZSB0byB0aGUgcGFnZSBoYXMgYmVlbiBzY2FsZWQiLAogICAgICAgICAgICAgICAgbm9TY2FsZVJ1bGVzOiJObyBzY2FsaW5nIiwKICAgICAgICAgICAgICAgIG5vU2NhbGVSdWxlc1RpcDoiSlMgYXV0byBmaW5kLCBubyBzY2FsaW5nLCBidXQgbWVldHMgYSBjZXJ0YWluIHNpemUiLAogICAgICAgICAgICAgICAgc21hbGxSdWxlczoiU21hbGwgc2l6ZSIsCiAgICAgICAgICAgICAgICBzbWFsbFJ1bGVzVGlwOiJTbWFsbCBzaXplIGltYWdlLCB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGhlaWdodCBhbmQgd2lkdGggYXJlIGxlc3MgdGhhbiAjdCMgcGl4ZWxzIiwKICAgICAgICAgICAgICAgIGNvbW1hbmQ6IkNvbW1hbmQiLAogICAgICAgICAgICAgICAgY29tbWFuZFRpcDoiQ29tbWFuZCBNZW51IiwKICAgICAgICAgICAgICAgIG9ubGluZUVkaXQ6Ik9ubGluZSBlZGl0aW5nIiwKICAgICAgICAgICAgICAgIG9ubGluZUVkaXRUaXA6IkVkaXQgdGhpcyBpbWFnZSBvbmxpbmUgdXNpbmcgI3QjIiwKICAgICAgICAgICAgICAgIG9wZW5Jbk5ld1dpbmRvdzoiT3BlbiBpbiBuZXcgd2luZG93IiwKICAgICAgICAgICAgICAgIG9wZW5Jbk5ld1dpbmRvd1RpcDoiT3BlbiBpbWFnZSBpbiBuZXcgd2luZG93IiwKICAgICAgICAgICAgICAgIGZpbmRJblBhZ2U6IkZpbmQgSW4gUGFnZSIsCiAgICAgICAgICAgICAgICBmaW5kSW5QYWdlVGlwOiJTY3JvbGwgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IGltYWdlIiwKICAgICAgICAgICAgICAgIHZpZXdDb2xsZWN0aW9uOiJWaWV3IENvbGxlY3Rpb24iLAogICAgICAgICAgICAgICAgdmlld0NvbGxlY3Rpb25UaXA6IlZpZXcgYWxsIGNvbGxlY3RlZCBpbWFnZXMiLAogICAgICAgICAgICAgICAgaW5Db2xsZWN0aW9uOiJVbmFibGUgdG8gdXNlIGluIENvbGxlY3Rpb24gbW9kZSIsCiAgICAgICAgICAgICAgICBjYW50RmluZDoiVGhlIGltYWdlIGlzIG5vdCBpbiB0aGUgZG9jdW1lbnQsIG9yIGl0IGlzIGhpZGRlbiBhbmQgY2Fubm90IGJlIGxvY2F0ZWQhIiwKICAgICAgICAgICAgICAgIGV4cG9ydEltYWdlczoiRXhwb3J0IGJpZyBJbWFnZXMiLAogICAgICAgICAgICAgICAgZXhwb3J0SW1hZ2VzVGlwOiJFeHBvcnQgYWxsIGltYWdlcyB0byBuZXcgd2luZG93IiwKICAgICAgICAgICAgICAgIGRvd25sb2FkSW1hZ2U6IkRvd25sb2FkIGFsbCBzaG93biBJbWFnZXMiLAogICAgICAgICAgICAgICAgZG93bmxvYWRJbWFnZVRpcDoiRG93bmxvYWQgdGhlIGN1cnJlbnQgc2hvd24gcGljdHVyZXMiLAogICAgICAgICAgICAgICAgY29weUltYWdlc1VybDoiQ29weSBhbGwgaW1hZ2VzIFVybHMiLAogICAgICAgICAgICAgICAgY29weUltYWdlc1VybFRpcDoiQ29weSBhbGwgbGFyZ2UgaW1hZ2UgVXJscyIsCiAgICAgICAgICAgICAgICBjb3B5U3VjY2VzczoiU3VjY2Vzc2Z1bGx5IGNvcGllZCAjdCMgVXJsIiwKICAgICAgICAgICAgICAgIGF1dG9SZWZyZXNoOiJBdXRvIG92ZXJsb2FkIiwKICAgICAgICAgICAgICAgIGF1dG9SZWZyZXNoVGlwOiJXaGVuIHRoZSBsYXN0IGZldyBpbWFnZXMsIHNjcm9sbCB0aGUgbWFpbiB3aW5kb3cgdG8gdGhlIGJvdHRvbSwgdGhlbiBhdXRvbWF0aWNhbGx5IGxvYWQgdGhlIG5ldyBpbWFnZSIsCiAgICAgICAgICAgICAgICBlbnRlckZ1bGxzYzoiRW50ZXIgZnVsbCBzY3JlZW4iLAogICAgICAgICAgICAgICAgZXhpdEZ1bGxzYzoiRXhpdCBmdWxsIHNjcmVlbiIsCiAgICAgICAgICAgICAgICBjb25maWc6IlNldHRpbmdzIiwKICAgICAgICAgICAgICAgIGNsb3NlR2FsbGVyeToiQ2xvc2UgR2FsbGVyeSIsCiAgICAgICAgICAgICAgICByZXR1cm5Ub0dhbGxlcnk6IkJhY2sgdG8gdGhlIEdhbGxlcnkiLAogICAgICAgICAgICAgICAgcGljSW5mbzoiSW1nIGluZm9ybWF0aW9uIiwKICAgICAgICAgICAgICAgIHBpY05vdGU6IkltZyBhbm5vdGF0aW9uIiwKICAgICAgICAgICAgICAgIHJlc29sdXRpb246IkltZyBSZXNvbHV0aW9uIiwKICAgICAgICAgICAgICAgIHBpY051bToiTnVtYmVyIG9mIHBpY3R1cmVzIiwKICAgICAgICAgICAgICAgIHNjYWxlUmF0aW86IlNjYWxpbmcgcmF0aW8iLAogICAgICAgICAgICAgICAgc2ltaWxhckltYWdlOiJTZWFyY2hpbmcgYnkgaW1hZ2UiLAogICAgICAgICAgICAgICAgc2NhbGU6Ilpvb20iLAogICAgICAgICAgICAgICAgaG9yaXpvbnRhbEZsaXA6Ikhvcml6b250YWwgZmxpcCIsCiAgICAgICAgICAgICAgICB2ZXJ0aWNhbEZsaXA6IlZlcnRpY2FsIGZsaXAiLAogICAgICAgICAgICAgICAgYWN0dWFsQnRuOiJWaWV3IG9yaWdpbmFsIChBKSIsCiAgICAgICAgICAgICAgICBzZWFyY2hCdG46IkZpbmQgdGhlIG9yaWdpbmFsIGltYWdlIChTKSIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5QnRuOiJWaWV3IEdhbGxlcnkgKEcpIiwKICAgICAgICAgICAgICAgIGN1cnJlbnRCdG46IlZpZXcgY3VycmVudCAoQykiLAogICAgICAgICAgICAgICAgbWFnbmlmaWVyQnRuOiJNYWduaWZpZXIgLyBab29NIChNKSIsCiAgICAgICAgICAgICAgICBwaWNUaXRsZToiUGljdHVyZSBUaXRsZSIsCiAgICAgICAgICAgICAgICBleHBvcnRJbWFnZXNVcmw6IkV4cG9ydCBpbWFnZSBVcmwiLAogICAgICAgICAgICAgICAgZXhwb3J0SW1hZ2VzVXJsUG9wOiJDdHJsK0MgY29weSBpbWFnZSBVcmwiLAogICAgICAgICAgICAgICAgYmVnaW5TZWFyY2hJbWc6IiN0IyBiZWdpbiBTZWFyY2ggSW1nIC4uLiIsCiAgICAgICAgICAgICAgICBmaW5kTm9QaWM6IlRoZSBvcmlnaW5hbCBpbWFnZSB3YXMgbm90IGZvdW5kIiwKICAgICAgICAgICAgICAgIGZpbmRPdmVyQmVnaW5Mb2FkOiIjdCMgZW5kIG9mIHRoZSBtYXAsIGZpbmQgI3QjIG1hdGNoaW5nIHBpY3R1cmVzLCBzdGFydCBsb2FkaW5nIHRoZSBmaXJzdCBvbmUiLAogICAgICAgICAgICAgICAgbG9hZE5leHRTaW1pbGFyOiJUaGUgb3JpZ2luYWwgaW1hZ2UgZmFpbGVkIHRvIGxvYWQsIHRyeSB0byBsb2FkIHRoZSBuZXh0IHJlc3VsdC4uLiIsCiAgICAgICAgICAgICAgICBsb2FkRXJyb3I6IkxvYWQgZmFpbGVkIiwKICAgICAgICAgICAgICAgIG9wZW5Ib21lUGFnZToiT3BlbiBIb21lIHBhZ2UiLAogICAgICAgICAgICAgICAgcG9zaXRpb246IkRpc3BsYXkgcG9zaXRpb24iLAogICAgICAgICAgICAgICAgdG9wTGVmdDoiVGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcGljdHVyZSIsCiAgICAgICAgICAgICAgICB0b3BSaWdodDoiVGhlIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlIHBpY3R1cmUiLAogICAgICAgICAgICAgICAgYm90dG9tUmlnaHQ6IlRoZSBib3R0b20gcmlnaHQgY29ybmVyIG9mIHRoZSBwaWN0dXJlIiwKICAgICAgICAgICAgICAgIGJvdHRvbUxlZnQ6IlRoZSBib3R0b20gbGVmdCBjb3JuZXIgb2YgdGhlIHBpY3R1cmUiLAogICAgICAgICAgICAgICAgdG9wQ2VudGVyOiJCZXNpZGUgdGhlIHBpY3R1cmUiLAogICAgICAgICAgICAgICAgYm90dG9tQ2VudGVyOiJCZWxvdyB0aGUgcGljdHVyZSIsCiAgICAgICAgICAgICAgICBmbG9hdEJhcjoiVG9vbGJhciIsCiAgICAgICAgICAgICAgICBzaG93RGVsYXk6IlNob3cgZGVsYXkiLAogICAgICAgICAgICAgICAgbXM6Im1zIiwKICAgICAgICAgICAgICAgIGhpZGU6IkhpZGUiLAogICAgICAgICAgICAgICAgaGlkZURlbGF5OiJIaWRlIERlbGF5IiwKICAgICAgICAgICAgICAgIGZvcmNlU2hvdzoiTm9uLXpvb21lZCBpbWFnZSwgYmV5b25kIHRoYXQgc2l6ZSwgc2hvd3MgdGhlIGZsb2F0IGZyYW1lIiwKICAgICAgICAgICAgICAgIGZvcmNlU2hvd1RpcDoiRmxvYXRpbmcgdG9vbGJhciB3aGVuIG5vbi1zY2FsZWQgaW1hZ2Ugc2l6ZSBleGNlZWRzIHRoZSBzaXplIHNldCBiZWxvdyIsCiAgICAgICAgICAgICAgICBweDoicHgiLAogICAgICAgICAgICAgICAgbWluU2l6ZUxpbWl0OiJab29tIHRoZSBpbWFnZSwgYmV5b25kIHRoYXQgc2l6ZSwgZGlzcGxheSB0aGUgZmxvYXQgZnJhbWUiLAogICAgICAgICAgICAgICAgbWluU2l6ZUxpbWl0VGlwOiJBZnRlciB0aGUgaW1hZ2UgaXMgc2NhbGVkICh0aGUgb3JpZ2luYWwgc2l6ZSBvZiB0aGUgaW1hZ2UgZG9lcyBub3QgbWF0Y2ggdGhlIGFjdHVhbCBzaXplKSwgdGhlIGZsb2F0aW5nIHRvb2xiYXIgaXMgZGlzcGxheWVkIHdoZW4gdGhlIG9yaWdpbmFsIGltYWdlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhlIHNldCB2YWx1ZS4iLAogICAgICAgICAgICAgICAgbGlzdGVuQmc6Ikxpc3RlbmluZyBiYWNrZ3JvdW5kIGltYWdlIiwKICAgICAgICAgICAgICAgIGxpc3RlbkJnVGlwOiJTaG93IHRoZSBob3ZlciBib3ggb24gdGhlIGVsZW1lbnQgd2l0aCB0aGUgYmFja2dyb3VuZCBpbWFnZSIsCiAgICAgICAgICAgICAgICBidXRvbk9yZGVyOiJTb3J0IG9mIHRvb2xiYXIgaWNvbnMiLAogICAgICAgICAgICAgICAga2V5c0VuYWJsZToiRW5hYmxlIHRoZSBmb2xsb3dpbmcgc2hvcnRjdXRzIiwKICAgICAgICAgICAgICAgIGtleXNBY3R1YWw6Ik9wZW4gdGhlIGJpZyBwaWN0dXJlIiwKICAgICAgICAgICAgICAgIGtleXNBY3R1YWxUaXA6IlByZXNzIHRoaXMgYnV0dG9uIHRvIG9wZW4gYSBsYXJnZSBpbWFnZSB3aGVuIGEgZmxvYXRpbmcgYmFyIGFwcGVhcnMiLAogICAgICAgICAgICAgICAga2V5c1NlYXJjaDoiRmluZCB0aGUgb3JpZ2luYWwgaW1hZ2UiLAogICAgICAgICAgICAgICAga2V5c1NlYXJjaFRpcDoiUHJlc3MgdGhpcyBidXR0b24gdG8gZmluZCB0aGUgb3JpZ2luYWwgaW1hZ2Ugd2hlbiB0aGUgZmxvYXRpbmcgYmFyIGFwcGVhcnMiLAogICAgICAgICAgICAgICAga2V5c0N1cnJlbnQ6Ik9wZW4gdGhlIGN1cnJlbnQgcGljdHVyZSIsCiAgICAgICAgICAgICAgICBrZXlzQ3VycmVudFRpcDoiUHJlc3MgdGhpcyBidXR0b24gdG8gb3BlbiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBpbWFnZSB3aGVuIHRoZSBmbG9hdGluZyBiYXIgYXBwZWFycyIsCiAgICAgICAgICAgICAgICBrZXlzTWFnbmlmaWVyOiJPcGVuIHRoZSBtYWduaWZ5aW5nIGdsYXNzIHRvIG9ic2VydmUiLAogICAgICAgICAgICAgICAga2V5c01hZ25pZmllclRpcDoiUHJlc3MgdGhpcyBidXR0b24gdG8gb3BlbiB0aGUgbWFnbmlmeWluZyBnbGFzcyB3aGVuIHRoZSBmbG9hdGluZyBiYXIgYXBwZWFycyIsCiAgICAgICAgICAgICAgICBrZXlzR2FsbGVyeToiT3BlbiBHYWxsZXJ5IiwKICAgICAgICAgICAgICAgIGtleXNHYWxsZXJ5VGlwOiJQcmVzcyB0aGlzIGJ1dHRvbiB0byBvcGVuIHRoZSBHYWxsZXJ5IHdoZW4gYSBmbG9hdGluZyBiYXIgYXBwZWFycyIsCiAgICAgICAgICAgICAgICBtYWduaWZpZXI6Ilpvb20iLAogICAgICAgICAgICAgICAgbWFnbmlmaWVyUmFkaXVzOiJEZWZhdWx0IHJhZGl1cyIsCiAgICAgICAgICAgICAgICBtYWduaWZpZXJXaGVlbFpvb21FbmFibGVkOiJFbmFibGUgd2hlZWwgem9vbSIsCiAgICAgICAgICAgICAgICBtYWduaWZpZXJXaGVlbFpvb21SYW5nZToiV2hlZWwgem9vbSBtYWduaWZpY2F0aW9uIiwKICAgICAgICAgICAgICAgIGdhbGxlcnk6IkdhbGxlcnkiLAogICAgICAgICAgICAgICAgZ2FsbGVyeUZpdFRvU2NyZWVuOiJTY2FsZSB0aGUgaW1hZ2UgdG8gZml0IHRoZSBzY3JlZW4iLAogICAgICAgICAgICAgICAgZ2FsbGVyeUZpdFRvU2NyZWVuU21hbGw6IlRoZSBzbWFsbCBpbWFnZSBpcyBhbHNvIHNjYWxlZCB0byBmaXQgdGhlIHNjcmVlbiIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5Rml0VG9TY3JlZW5UaXA6IkFkYXB0IHRvIGJlIGNvbnRhaW4sIG5vdCBjb3ZlciIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5U2Nyb2xsRW5kVG9DaGFuZ2U6IlN3aXRjaCB0aGUgaW1hZ2UgYWZ0ZXIgdGhlIGJpZyBwaWN0dXJlIHNjcm9sbHMgdG8gdGhlIGVuZCIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5U2Nyb2xsRW5kVG9DaGFuZ2VUaXA6IlZhbGlkIGFmdGVyIGNhbmNlbGluZyB0aGUgcHJldmlvdXMgb3B0aW9uIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlFeHBvcnRUeXBlOiJJbWFnZSBleHBvcnQgZGVmYXVsdCBzb3J0IiwKICAgICAgICAgICAgICAgIGdyaWQ6IlRpbGUgc29ydGluZyIsCiAgICAgICAgICAgICAgICBncmlkQmlnOiJUaGUgb3JpZ2luYWwgcGljdHVyZSBpcyB0aWxlZCIsCiAgICAgICAgICAgICAgICBsaXN0OiJMaXN0IHNvcnRpbmciLAogICAgICAgICAgICAgICAgZ2FsbGVyeUF1dG9Mb2FkOiJBdXRvbWF0aWNhbGx5IGxvYWQgbW9yZSBpbWFnZXMiLAogICAgICAgICAgICAgICAgZ2FsbGVyeUxvYWRBbGw6IkF1dG9tYXRpY2FsbHkgcHJvY2VzcyBhbGwgcGFnZXMgd2hlbiBsb2FkaW5nIG1vcmUgaW1hZ2VzIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlMb2FkQWxsVGlwOiJJZiB0b28gbWFueSBwYWdlcyBtYXkgYWZmZWN0IHRoZSBleHBlcmllbmNlIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlTY2FsZVNtYWxsU2l6ZTE6IlRoZSBhY3R1YWwgc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGhlaWdodCBhbmQgd2lkdGgiLAogICAgICAgICAgICAgICAgZ2FsbGVyeVNjYWxlU21hbGxTaXplMjoiUGl4ZWxzIGFyZSBncm91cGVkIGludG8gc21hbGwgc2l6ZSBpbWFnZXMiLAogICAgICAgICAgICAgICAgZ2FsbGVyeVNob3dTbWFsbFNpemU6IlNob3cgc21hbGwgc2l6ZSBwaWN0dXJlcyBieSBkZWZhdWx0IiwKICAgICAgICAgICAgICAgIGdhbGxlcnlUcmFuc2l0aW9uOiJTaG93IHNwZWNpYWwgZWZmZWN0cyBvZiBnYWxsZXJ5IHN3aXRjaGluZyBpbWFnZXMiLAogICAgICAgICAgICAgICAgZ2FsbGVyeVNpZGViYXJQb3NpdGlvbjoiVGh1bWJuYWlsIGJhciBwb3NpdGlvbiIsCiAgICAgICAgICAgICAgICBib3R0b206IkJvdHRvbSIsCiAgICAgICAgICAgICAgICByaWdodDoiUmlnaHQiLAogICAgICAgICAgICAgICAgbGVmdDoiTGVmdCIsCiAgICAgICAgICAgICAgICB0b3A6IlRvcCIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5U2lkZWJhclNpemU6IkhlaWdodCIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5U2lkZWJhclNpemVUaXA6IlRoZSBoZWlnaHQgb2YgdGhlIHRodW1ibmFpbCBiYXIgKGlmIGl0IGlzIGhvcml6b250YWwpIG9yIHRoZSB3aWR0aCAoaWYgaXQgaXMgdmVydGljYWwpIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlNYXgxOiJNYXhpbXVtIHJlYWQtYWhlYWQiLAogICAgICAgICAgICAgICAgZ2FsbGVyeU1heDI6IlBpY3R1cmVzIChob3cgbWFueSBiZWZvcmUgYW5kIGFmdGVyKSIsCiAgICAgICAgICAgICAgICBnYWxsZXJ5QXV0b1pvb206Ilpvb20gY2hhbmdlcyBiYWNrIHRvIDEwMCUgKGNocm9tZSkiLAogICAgICAgICAgICAgICAgZ2FsbGVyeUF1dG9ab29tVGlwOiJJZiB5b3Ugem9vbSBpbiwgY2hhbmdlIHRoZSB6b29tIG9mIHRoZSBpbWFnZSBhbmQgc2lkZWJhciBzZWN0aW9ucyBiYWNrIHRvIDEwMCUgYW5kIGluY3JlYXNlIHRoZSB2aWV3YWJsZSBhcmVhIChvbmx5IHZhbGlkIHVuZGVyIGNocm9tZSkiLAogICAgICAgICAgICAgICAgZ2FsbGVyeURlc2NyaXB0aW9uTGVuZ3RoMToiTWF4aW11bSB3aWR0aCBvZiBhbm5vdGF0aW9uIiwKICAgICAgICAgICAgICAgIGdhbGxlcnlEZXNjcmlwdGlvbkxlbmd0aDI6IkNoYXJhY3RlcnMiLAogICAgICAgICAgICAgICAgZ2FsbGVyeUF1dG9PcGVuU2l0ZXM6IkF1dG9tYXRpY2FsbHkgb3BlbiB0aGUgd2Vic2l0ZSdzIHdlYnNpdGUgcmVndWxhcnMiLAogICAgICAgICAgICAgICAgZ2FsbGVyeUVkaXRTaXRlOiJPbmxpbmUgZWRpdGluZyBzaXRlIiwKICAgICAgICAgICAgICAgIGltZ1dpbmRvdzoiSW1nV2luZG93IiwKICAgICAgICAgICAgICAgIGltZ1dpbmRvd0ZpdFRvU2NyZWVuOiJBZGFwdCB0byB0aGUgc2NyZWVuIGFuZCBjZW50ZXIgaG9yaXpvbnRhbGx5IHZlcnRpY2FsbHkiLAogICAgICAgICAgICAgICAgaW1nV2luZG93Rml0VG9TY3JlZW5UaXA6IkFkYXB0IHRvIGJlIGNvbnRhaW4sIG5vdCBjb3ZlciIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dEZWZhdWx0VG9vbDoiVGhlIHRvb2wgc2VsZWN0ZWQgYnkgZGVmYXVsdCB3aGVuIG9wZW5pbmcgdGhlIHdpbmRvdyIsCiAgICAgICAgICAgICAgICBoYW5kOiJIYW5kIiwKICAgICAgICAgICAgICAgIHJvdGF0ZToiUm90YXRlIiwKICAgICAgICAgICAgICAgIHpvb206Ik1hZ25pZmllciIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dFc2NLZXk6IkVzYyBrZXkgaXMgb2ZmIiwKICAgICAgICAgICAgICAgIGltZ1dpbmRvd0RibENsaWNrSW1nV2luZG93OiJEb3VibGUgY2xpY2sgb24gdGhlIGltYWdlIHdpbmRvdyB0byBjbG9zZSIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dDbGlja091dHNpZGU6IkNsaWNrIG9uIHRoZSBpbWFnZSB0byBjbG9zZSBleHRlcm5hbGx5IiwKICAgICAgICAgICAgICAgIGltZ1dpbmRvd0NsaWNrT3V0c2lkZVRpcDoiT25seSBlbmFibGUgd2hlbiBPdmVybGF5ZXIgaXMgc2hvd24iLAogICAgICAgICAgICAgICAgbm9uZToiTm9uZSIsCiAgICAgICAgICAgICAgICBjbGljazoiQ2xpY2siLAogICAgICAgICAgICAgICAgZGJsY2xpY2s6IkRvdWJsZSBjbGljayIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dPdmVybGF5ZXJTaG93bjoiT3ZlcmxheSIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dPdmVybGF5ZXJDb2xvcjoiQ29sb3IgYW5kIE9wYWNpdHkiLAogICAgICAgICAgICAgICAgaW1nV2luZG93U2hpZnRSb3RhdGVTdGVwMToiV2hlbiByb3RhdGluZywgaG9sZCBkb3duIHRoZSBTaGlmdCBrZXksIHJvdGF0ZSB0aGUgc3RlcCIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dTaGlmdFJvdGF0ZVN0ZXAyOiJEZWdyZWUiLAogICAgICAgICAgICAgICAgaW1nV2luZG93TW91c2VXaGVlbFpvb206Ik1vdXNlV2hlZWwgWm9vbSIsCiAgICAgICAgICAgICAgICBpbWdXaW5kb3dab29tUmFuZ2U6Ilpvb20gUmFuZ2UiLAogICAgICAgICAgICAgICAgaW1nV2luZG93Wm9vbVJhbmdlVGlwOiJab29tIChtdXN0IGJlIHBvc2l0aXZlKSIsCiAgICAgICAgICAgICAgICBvdGhlcnM6Ik90aGVyIiwKICAgICAgICAgICAgICAgIHdhaXRJbWdMb2FkOiJXaGVuIHRoZSBpbWFnZSBpcyBjb21wbGV0ZWx5IGxvYWRlZCwgaXQgd2lsbCBzdGFydCB0byBwZXJmb3JtIG9wZXJhdGlvbnMgc3VjaCBhcyBwb3AtdXAgem9vbWluZyIsCiAgICAgICAgICAgICAgICB3YWl0SW1nTG9hZFRpcDoiV2hlbiBob2xkaW5nIGRvd24gdGhlIEN0cmwga2V5LCB5b3UgY2FuIHRlbXBvcmFyaWx5IGV4ZWN1dGUgdGhlIHNldHRpbmcgb3Bwb3NpdGUgdG8gdGhpcyBzZXR0aW5nIiwKICAgICAgICAgICAgICAgIGRlYnVnOiJEZWJ1ZyBtb2RlIiwKICAgICAgICAgICAgICAgIGZpcnN0RW5naW5lOiJQcmVmZXJyZWQgKGZpcnN0KSBzZWFyY2ggZW5naW5lIiwKICAgICAgICAgICAgICAgIHJlZnJlc2hXaGVuRXJyb3I6IlJlYWQgZXJyb3IsIGNsaWNrIG92ZXJsb2FkIiwKICAgICAgICAgICAgICAgIHN3aXRjaFNsaWRlOiJTd2l0Y2ggc2lkZWJhciIsCiAgICAgICAgICAgICAgICBjb3VudERvd246IkNvdW50RG93biIKICAgICAgICAgICAgfTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBmdW5jdGlvbiBpMThuKGtleSxpbnNlcnRzKXsKICAgICAgICB2YXIgcmVzdWx0PWkxOG5EYXRhW2tleV0saTsKICAgICAgICBpZihpbnNlcnRzKXsKICAgICAgICAgICAgaWYodHlwZW9mIGluc2VydHMhPSJvYmplY3QiKWluc2VydHM9W2luc2VydHNdOwogICAgICAgICAgICBmb3IoaT0wO2k8aW5zZXJ0cy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgICAgIHJlc3VsdD1yZXN1bHQucmVwbGFjZSgiI3QjIixpbnNlcnRzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgdmFyIHByZWZzOwogICAgZnVuY3Rpb24gaW5pdCh0b3BPYmplY3Qsd2luZG93LGRvY3VtZW50LGFycmF5Rm4sZW52aXIsc3RvcmFnZSx1bnNhZmVXaW5kb3cpewogICAgICAgIC8vIOm7mOiupOiuvue9ru+8jOivt+WIsOiuvue9rueVjOmdouS/ruaUuQogICAgICAgIHByZWZzPXsKICAgICAgICAgICAgZmxvYXRCYXI6ey8v5rWu5Yqo5bel5YW35qCP55u45YWz6K6+572uLgogICAgICAgICAgICAgICAgYnV0b25PcmRlcjpbJ2FjdHVhbCcsJ2N1cnJlbnQnLCdnYWxsZXJ5JywnbWFnbmlmaWVyJ10sLy/mjInpkq7mjpLliJfpobrluo8nYWN0dWFsJyjlrp7pmYXnmoTlm77niYcpLCdjdXJyZW50JyjlvZPliY3mmL7npLrnmoTlm77niYcpLCdtYWduaWZpZXInKOaUvuWkp+mVnOinguWvnyksJ2dhbGxlcnknKOWbvumbhiksJ3NlYXJjaCco5pCc57Si5Y6f5Zu+KQogICAgICAgICAgICAgICAgbGlzdGVuQmc6dHJ1ZSwvL+ebkeWQrOiDjOaZr+WbvgogICAgICAgICAgICAgICAgc2hvd0RlbGF5OjM2NiwvL+a1ruWKqOW3peWFt+agj+aYvuekuuW7tuaXti7ljZXkvY0o5q+r56eSKQogICAgICAgICAgICAgICAgaGlkZURlbGF5OjU2NiwvL+a1ruWKqOW3peWFt+agj+makOiXj+W7tuaXti7ljZXkvY0o5q+r56eSKQogICAgICAgICAgICAgICAgcG9zaXRpb246J3RvcCBsZWZ0JywvLyDlj5blgLzkuLo6ICd0b3AgbGVmdCco5Zu+54mH5bem5LiK6KeSKSDmiJbogIUgJ3RvcCByaWdodCco5Zu+54mH5Y+z5LiK6KeSKSAnYm90dG9tIHJpZ2h0Jyjlm77niYflj7PkuIvop5IpICdib3R0b20gbGVmdCco5Zu+54mH5bem5LiL6KeSKTsKICAgICAgICAgICAgICAgIG9mZnNldDp7Ly/mta7liqjlt6XlhbfmoI/lgY/np7su5Y2V5L2NKOWDj+e0oCkKICAgICAgICAgICAgICAgICAgICB4Oi0xNSwvL3jovbTlgY/np7so5q2j5YC8LOWQkeWPs+WBj+enuyzotJ/lgLzlkJHlt6YpCiAgICAgICAgICAgICAgICAgICAgeTotMTUsLy956L205YGP56e7KOato+WAvCzlkJHkuIss6LSf5YC85ZCR5LiKKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZvcmNlU2hvdzp7Ly/lnKjmsqHmnInooqvnvKnmlL7nmoTlm77niYfkuIos5L2G5piv5aSn5bCP6LaF6L+H5LiL6Z2i6K6+5a6a55qE5bC65a+45pe2LOW8uuWItuaYvuekuua1ruWKqOahhi4KICAgICAgICAgICAgICAgICAgICBlbmFibGVkOnRydWUsLy/lkK/nlKjlvLrliLbmmL7npLouCiAgICAgICAgICAgICAgICAgICAgc2l6ZTp7Ly/lm77niYflsLrlr7gu5Y2V5L2NKOWDj+e0oCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHc6MTY2LAogICAgICAgICAgICAgICAgICAgICAgICBoOjE2NiwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG1pblNpemVMaW1pdDp7Ly/lsLHnrpfmmK/lm77niYfooqvnvKnmlL7kuoYo55yL5Yiw55qE5Zu+54mH6KKr6K6+5a6a5LqGd2lkdGjmiJbogIVoZWlnaHTpmZDlrprkuoblpKflsI8s6L+Z56eN5oOF5Ya15LiLKSzlpoLmnpzmsqHmnInooqvnvKnmlL7nmoTljp/lm77niYflsI/kuo7orr7lrprlgLws6YKj5LmI5Lmf5LiN5pi+56S65rWu5Yqo5bel5YW35qCPLgogICAgICAgICAgICAgICAgICAgIHc6MTAwLAogICAgICAgICAgICAgICAgICAgIGg6MTAwLAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAvLyDmjInplK7vvIzmhJ/op4nnlKjkuI3lpKrliLDvvIzpu5jorqTnpoHnlKgKICAgICAgICAgICAgICAgIGtleXM6IHsKICAgICAgICAgICAgICAgICAgICBlbmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGFjdHVhbDogJ2EnLCAgLy8gIOW9k+WHuueOsOaCrOa1ruadoeaXtuaMieS4iyBgYWAg5omT5byA5Y6f5Zu+CiAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiAncycsCiAgICAgICAgICAgICAgICAgICAgY3VycmVudDogJ2MnLAogICAgICAgICAgICAgICAgICAgIG1hZ25pZmllcjogJ20nLAogICAgICAgICAgICAgICAgICAgIGdhbGxlcnk6ICdnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBtYWduaWZpZXI6ey8v5pS+5aSn6ZWc55qE6K6+572uLgogICAgICAgICAgICAgICAgcmFkaXVzOiA3NywvL+m7mOiupOWNiuW+hC7ljZXkvY0o5YOP57SgKS4KICAgICAgICAgICAgICAgIHdoZWVsWm9vbTp7Ly/mu5rova7nvKnmlL4uCiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgICAgICAgIHBhdXNlRmlyc3Q6dHJ1ZSwvL+mcgOimgeaaguWBnCjljZXlh7vmmoLlgZwp5ZCOLOaJjeiDvee8qeaUvi4o5o6o6I2QLOWQpuWImeWboOS4uuaUvuWkp+mVnOS8mui3n+edgOm8oOaghyzlpoLmnpzmlL7lpKfplZzov4flpKcs6YKj5LmI5Lya5b2x5ZON5rua5YqoLikuLgogICAgICAgICAgICAgICAgICAgIHJhbmdlOlswLjQsMC41LDAuNiwwLjcsMC44LDAuOSwxLDEuMSwxLjIsMS4zLDEuNCwxLjUsMS43LDEuOSwyLDIuNSwzLjAsNC4wXSwvL+e8qeaUvueahOiMg+WbtAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGdhbGxlcnk6ey8v5Zu+5bqT55u45YWz6K6+5a6aCiAgICAgICAgICAgICAgICBsb2FkTW9yZTpmYWxzZSwKICAgICAgICAgICAgICAgIGxvYWRBbGw6dHJ1ZSwvL+WKoOi9veabtOWkmuaXtuaYr+WQpuWKoOi9veWFqOmDqOmhtemdogogICAgICAgICAgICAgICAgZml0VG9TY3JlZW46dHJ1ZSwvL+WbvueJh+mAguW6lOWxj+W5lSjpgILlupTmlrnlvI/kuLpjb250YWlu77yM6Z2eY292ZXIpLgogICAgICAgICAgICAgICAgZml0VG9TY3JlZW5TbWFsbDpmYWxzZSwKICAgICAgICAgICAgICAgIHNjcm9sbEVuZFRvQ2hhbmdlOnRydWUsCiAgICAgICAgICAgICAgICBleHBvcnRUeXBlOidncmlkJywKICAgICAgICAgICAgICAgIHNpZGViYXJQb3NpdGlvbjogJ2JvdHRvbScsLy8ndG9wJyAncmlnaHQnICdib3R0b20nICdsZWZ0JyAg5Zub5Liq5Y+v6IO95YC8CiAgICAgICAgICAgICAgICBzaWRlYmFyU2l6ZTogMTIwLC8v5L6n5qCP55qE6auY77yI5aaC5p6c5piv5rC05bmz5pS+572u77yJ5oiW6ICF5a6977yI5aaC5p6c5piv5Z6C55u05pS+572u77yJCiAgICAgICAgICAgICAgICBzaWRlYmFyVG9nZ2xlOiB0cnVlLCAgLy8g5piv5ZCm5pi+56S66ZqQ6JeP5oyJ6ZKuCiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOnRydWUsLy/lpKflm77niYfljLrnmoTliqjnlLvjgIIKICAgICAgICAgICAgICAgIHByZWxvYWQ6dHJ1ZSwvL+WvuemZhOi/keeahOWbvueJh+i/m+ihjOmihOivu+OAggogICAgICAgICAgICAgICAgbWF4OjUsLy/mnIDlpJrpooTor7vlpJrlsJHlvKDvvIjliY3lkI7lkITlpJrlsJHlvKDvvIkKCiAgICAgICAgICAgICAgICB6b29tcmVzaXplZDogMjUsICAvLyDlm77niYflsLrlr7jmnIDlsJHnm7jlt67mr5TkvovvvIzljZXkvY3vvJolCiAgICAgICAgICAgICAgICBzY2FsZVNtYWxsU2l6ZTogMjUwLCAgLy8g5Zu+5bqT55qE5paw57G75Yir77yM57yp5pS+55qE5Zu+54mH77yM5bC65a+455qE6auY5oiW5a696YO95bCP5LqO6K+l5YC8CiAgICAgICAgICAgICAgICBzaG93U21hbGxTaXplOnRydWUsLy/mmK/lkKbpu5jorqTmmL7npLrlsI/lsLrlr7jlm77niYcKCiAgICAgICAgICAgICAgICBzY3JvbGxFbmRBbmRMb2FkOiBmYWxzZSwgLy8g5rua5Yqo5Li756qX5Y+j5Yiw5pyA5bqV6YOo77yM54S25ZCO6Ieq5Yqo6YeN6L295bqT55qE5Zu+54mH44CC6L+Y5pyJYnVn77yM5pyJ5b6F6L+b5LiA5q2l5rWL6K+VCiAgICAgICAgICAgICAgICBzY3JvbGxFbmRBbmRMb2FkX251bTogMywgIC8vIOacgOWQjuWHoOW8oOWbvueJh+aJp+ihjAoKICAgICAgICAgICAgICAgIGF1dG9ab29tOiB0cnVlLCAgLy8g5aaC5p6c5pyJ5pS+5aSn77yM5YiZ5oqK5Zu+54mH5Y+KIHNpZGViYXIg6YOo5YiG55qE57yp5pS+5pS55ZueIDEwMCXvvIzlop7lpKflj6/op4bpnaLnp6/vvIjku4XlnKggY2hyb21lIOS4i+acieaViO+8iQogICAgICAgICAgICAgICAgZGVzY3JpcHRpb25MZW5ndGg6IDMyLCAgLy8g5rOo6YeK55qE5pyA5aSn5a695bqmCiAgICAgICAgICAgICAgICBlZGl0U2l0ZTogIlBpeGxyIgogICAgICAgICAgICB9LAoKICAgICAgICAgICAgaW1nV2luZG93OnsvLyDlm77niYfnqpfnm7jlhbPorr7nva4KICAgICAgICAgICAgICAgIGZpdFRvU2NyZWVuOiBmYWxzZSwvL+mAguW6lOWxj+W5lSzlubbkuJTmsLTlubPlnoLnm7TlsYXkuK0o6YCC5bqU5pa55byP5Li6Y29udGFpbu+8jOmdnmNvdmVyKS4KICAgICAgICAgICAgICAgIHN5bmNTZWxlY3RlZFRvb2w6dHJ1ZSwvL+WQjOatpeW9k+WJjemAieaLqeeahOW3peWFt++8jOWmguaenOW8gOS6huWkmuS4quWbvueJh+eql+WPo++8jOWFtuS4reS/ruaUueS4gOS4quS8muWPjeaYoOWIsOWFtuS7lueahOS4iumdouOAggogICAgICAgICAgICAgICAgZGVmYXVsdFRvb2w6J2hhbmQnLC8vImhhbmQiLCJyb3RhdGUiLCJ6b29tIjvmiZPlvIDnqpflj6PnmoTml7blgJnpu5jorqTpgInmi6nnmoTlt6XlhbcKICAgICAgICAgICAgICAgIGNsb3NlOnsvL+WFs+mXreeahOaWueW8jwogICAgICAgICAgICAgICAgICAgIGVzY0tleTp0cnVlLC8v5oyJZXNj6ZSuCiAgICAgICAgICAgICAgICAgICAgZGJsQ2xpY2tJbWdXaW5kb3c6IHRydWUsLy/lj4zlh7vlm77niYfnqpflj6MKICAgICAgICAgICAgICAgICAgICBjbGlja091dHNpZGU6JycsIC8vIOeCueWHu+WbvueJh+WklumDqOWFs+mXreOAguWAvOS4uicnfCdjbGljayd8J2RibGNsaWNrJ++8m+aXoOaIlueCueWHu+aIluWPjOWHuwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG92ZXJsYXllcjp7Ly8g6KaG55uW5bGCLgogICAgICAgICAgICAgICAgICAgIHNob3duOmZhbHNlLC8v5pi+56S6CiAgICAgICAgICAgICAgICAgICAgY29sb3I6J3JnYmEoMCwwLDAsMC44KScsLy/popzoibLlkozkuI3pgI/mmI7luqborr7nva4uCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2hpZnRSb3RhdGVTdGVwOjE1LC8vIOaXi+i9rOeahOaXtuWAme+8jOaMieS9j3NoaWZ06ZSu5pe2LOaXi+i9rOeahOatpei/my7ljZXkvY065bqmLgogICAgICAgICAgICAgICAgem9vbTp7Ly/mu5rova7nvKnmlL4KICAgICAgICAgICAgICAgICAgICByYW5nZTpbMC4xLDAuMiwwLjMsMC40LDAuNSwwLjYsMC43LDAuOCwwLjksMSwxLjEsMS4yLDEuMywxLjQsMS41LDEuNywxLjksMiwyLjUsMy4wLDQuMF0sLy/nvKnmlL7mr5TkvosuKOS4jeimgeWHuueOsOi0n+aVsCzosKLosKItXy0hfikKICAgICAgICAgICAgICAgICAgICBtb3VzZVdoZWVsWm9vbTp0cnVlLC8v5piv5ZCm5YWB6K645L2/55So5rua6L2u57yp5pS+44CCCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy/nrYnlm77niYflrozlhajovb3lhaXlkI4s5omN5byA5aeL5omn6KGM5by55Ye6LOaUvuWkp+etieetieaTjeS9nCwKICAgICAgICAgICAgLy/mjInkvY9jdHJs6ZSu55qE5pe25YCZLOWPr+S7peS4tOaXtuaJp+ihjOWSjOi/meS4quiuvuWumuebuOWPjeeahOiuvuWumi4KICAgICAgICAgICAgd2FpdEltZ0xvYWQ6IGZhbHNlLAoKICAgICAgICAgICAgLy/moYbmnrbph4zpnaLnmoTlm77niYflnKjpobblsYLnqpflj6PlsZXnpLrlh7rmnaXvvIzkvYbmmK/lvZNmcmFtZeS4jumhtuWxgueql+WPo2RvbWFpbuS4jeS4gOagt+eahOaXtuWAme+8jOWPr+iDveWvvOiHtOWbvueJh+iiq+WPjeebl+mTvuaLpuaIqu+8jAogICAgICAgICAgICAvL+aMieS9j3NoaWZ06ZSu77yM5Y+v5Lul5Li05pe25omn6KGM5ZKM6L+Z5Liq6K6+5a6a55u45Y+N55qE6K6+5a6aCiAgICAgICAgICAgIGZyYW1lc1BpY09wZW5JblRvcFdpbmRvdzogdHJ1ZSwKCiAgICAgICAgICAgIC8vIGxvd0xldmVsOiB0cnVlLCAgLy8g5aaC5p6c5pyJ5aSa5Liq5Zu+54mH77yM5LyY5YWI6YCJ5oup5L2O5LiA57qn55qECgogICAgICAgICAgICBkZWJ1ZzogZmFsc2UsCiAgICAgICAgICAgIGZpcnN0RW5naW5lOiJUaW5leWUiCiAgICAgICAgfTsKCiAgICAgICAgLy/lkITnvZHnq5npq5jnuqfop4TliJk7CiAgICAgICAgdmFyIHNpdGVJbmZvPVsKICAgICAgICAgICAge25hbWU6ICJnb29nbGUg5Zu+54mH5pCc57SiIiwKICAgICAgICAgICAgIC8v572R5Z2A5L6L5a2QLijmlrnkvr/mtYvor5Uu5p+l55yLLuS5i+exu+eahCkKICAgICAgICAgICAgIHNpdGVFeGFtcGxlOiJodHRwOi8vd3d3Lmdvb2dsZS5jb20uaGsvc2VhcmNoP3E9ZmlyZWZveCZ0Ym09aXNjaCIsCiAgICAgICAgICAgICAvL+aYr+WQpuWQr+eUqAogICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgLy/nq5nngrnmraPliJkKICAgICAgICAgICAgIHVybDovaHR0cHM/OlwvXC93d3cuZ29vZ2xlKFwuXHd7MSwzfSl7MSwzfVwvc2VhcmNoXD8uKiZ0Ym09aXNjaC8sCiAgICAgICAgICAgICAvL+m8oOagh+W3pumUrueCueWHu+ebtOaOpeaJk+W8gC4u77yI6L+Z5Liq5Y+q5piv5b2T6auY57qn6KeE5YiZ55qEZ2V0SW1hZ2UoKei/lOWbnuWbvueJh+eahOaXtuWAmeeUn+aViO+8iQogICAgICAgICAgICAgLy8g5peg5pWI77yf5Y+q5pyJ5bCR5pWw5oOF5Ya15LiL5pyJ5L2c55So77yfCiAgICAgICAgICAgICBjbGlrVG9PcGVuOnsKICAgICAgICAgICAgICAgICBlbmFibGVkOmZhbHNlLAogICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OnRydWUsLy/mmK/lkKblsJ3or5XpmLvmraLngrnlh7vnmoTpu5jorqTooYzkuLrvvIjmr5TlpoLlpoLmnpzmmK/kvaDngrnnmoTmmK/kuIDkuKrpk77mjqXvvIzpu5jorqTooYzkuLrmmK/miZPlvIDov5nkuKrpk77mjqXvvIzlpoLmnpzmmK90cnVl77yManPkvJrlsJ3or5XpmLvmraLpk77mjqXnmoTmiZPlvIAo5aaC5p6c5oOz5Li05pe25omT5byA6L+Z5Liq6ZO+5o6l77yM6K+35L2/55So5Y+z6ZSu55qE5omT5byA5ZG95LukKe+8iQogICAgICAgICAgICAgICAgIHR5cGU6J2FjdHVhbCcsLy/pu5jorqTnmoTmiZPlvIDmlrnlvI86ICdhY3R1YWwnKOW8ueWHuizljp/lp4vlm77niYcpICdtYWduaWZpZXInKOaUvuWkp+mVnCkgJ2N1cnJlbnQnKOW8ueWHuizlvZPliY3lm77niYcpCiAgICAgICAgICAgICB9LAogICAgICAgICAgICAgLy/ojrflj5blm77niYflrp7pmYXlnLDlnYDnmoTlpITnkIblh73mlbAsCiAgICAgICAgICAgICAvL3RoaXMg5Li65b2T5YmN6byg5qCH5oKs5rWu5Zu+54mH55qE5byV55SoLAogICAgICAgICAgICAgLy/nrKzkuIDkuKrlj4LmlbDlkox0aGlz55u45ZCM77yM5Lmf5piv5b2T5YmN6byg5qCH5oKs5rWu5Zu+54mH55qE5byV55SoLAogICAgICAgICAgICAgLy/nrKzkuozkuKrlj4LmlbDkuLrljIXoo7nlvZPliY3lm77niYfnmoTnrKzkuIDkuKph5YWD57SgKOWPr+iDveS4jeWtmOWcqCkuCiAgICAgICAgICAgICBnZXRJbWFnZTpmdW5jdGlvbihpbWcsYSl7CiAgICAgICAgICAgICAgICAgaWYoIWEpcmV0dXJuOwogICAgICAgICAgICAgICAgIGlmIChhLmhyZWYubWF0Y2goL2ltZ3VybD0oLio/XC5cd3sxLDV9KSYvaSkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChSZWdFeHAuJDEpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgLy8gPT09PT09IOaIkeaWsOWinueahCA9PT09PT0KICAgICAgICAgICAgIC8vIOiHquWumuS5ieagt+W8jwogICAgICAgICAgICAgY3NzOiAnJywKICAgICAgICAgICAgIC8vIOaOkumZpOeahOWbvueJh+ato+WImQogICAgICAgICAgICAgLy8gZXhjbHVkZTogL3dlaXhpbl9jb2RlXC5wbmckL2ksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAiQmluZyDlm77niYfmkJzntKIiLAogICAgICAgICAgICAgc2l0ZUV4YW1wbGU6Imh0dHA6Ly9jbi5iaW5nLmNvbS9pbWFnZXMvc2VhcmNoP3E9JUU3JUJFJThFJUU1JUE1JUIzIiwKICAgICAgICAgICAgIGVuYWJsZWQ6dHJ1ZSwKICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL1teLl0qXC5iaW5nXC5jb21cL2ltYWdlc1wvL2ksCiAgICAgICAgICAgICBnZXRJbWFnZTpmdW5jdGlvbihpbWcsIGEpewogICAgICAgICAgICAgICAgIGlmICghYSkgcmV0dXJuOwogICAgICAgICAgICAgICAgIHZhciBvbGRzcmM9dGhpcy5zcmM7CiAgICAgICAgICAgICAgICAgdmFyICQgPSAvLGltZ3VybDoiKFteIl0rKS8uZXhlYyhhLmdldEF0dHJpYnV0ZSgnbScpKTsKICAgICAgICAgICAgICAgICB2YXIgbmV3c3JjPSAkID8gJFsxXSA6ICcnOwogICAgICAgICAgICAgICAgIGlmKG5ld3NyYyE9b2xkc3JjKXJldHVybiBuZXdzcmM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiLnmb7luqbotLTlkKciLAogICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgdXJsOi9eaHR0cHM/OlwvXC90aWViYVwuYmFpZHVcLlteXC9dK1wvL2ksCiAgICAgICAgICAgICBnZXRJbWFnZTpmdW5jdGlvbihpbWcpewogICAgICAgICAgICAgICAgIHZhciBzcmM9aW1nLnNyYzsKICAgICAgICAgICAgICAgICB2YXIgcmVnPS9eKGh0dHA6XC9cL2ltZ3NyY1wuYmFpZHVcLmNvbVwvZm9ydW1cLylhYihwaWNcL2l0ZW1cL1tcdy5dKykvaSA7CiAgICAgICAgICAgICAgICAgdmFyIHBvcnRyYWl0PS9cL3N5c1wvcG9ydHJhaXQvOwogICAgICAgICAgICAgICAgIHZhciByZXN1bHQ9c3JjLm1hdGNoKHJlZyk7CiAgICAgICAgICAgICAgICAgLy/luJblrZDliJfooajpobXpnaIKICAgICAgICAgICAgICAgICBpZihwb3J0cmFpdC50ZXN0KHNyYykpewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3JjLnJlcGxhY2UoL1wvc3lzXC9wb3J0cmFpdC8sIi9zeXMvcG9ydHJhaXRsIik7CiAgICAgICAgICAgICAgICAgfWVsc2UgaWYocmVzdWx0KXsvL+Wwj+WbvueahOaXtuWAmQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0WzFdK3Jlc3VsdFsyXTsKICAgICAgICAgICAgICAgICB9ZWxzZXsvL+Wwj+WbvueCueWHu+S5i+WQjueahOi+g+Wkp+Wbvu+8jOaIluiAheW4luWtkOWGheWuuemhtemdoueahOWbvueJh+OAggogICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZml4ID0gJ2h0dHA6Ly9pbWdzcmMuYmFpZHUuY29tL2ZvcnVtL3BpYy9pdGVtLyc7CiAgICAgICAgICAgICAgICAgICAgIHZhciByZWcyID0gL1wvc2lnbj1cdytcLyhbXHcuXSspJC87CiAgICAgICAgICAgICAgICAgICAgIHZhciBzaWduID0gc3JjLm1hdGNoKHJlZzIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIHNpZ24gPyBwcmVmaXggKyBzaWduWzFdIDogbnVsbDsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8g55m+5bqm6Ieq6Lqr55qE5YWo5bGP5p+l55yL5pa55byP5pu05Yqg5aW977yM6Lef6L+Z5Liq6ISa5pys55qE5bqT5p+l55yL57G75Ly844CCCiAgICAgICAgICAgIHtuYW1lOiAi55m+5bqm5Zu+54mH5pCc57SiIiwKICAgICAgICAgICAgIHNpdGVFeGFtcGxlOiAiaHR0cDovL2ltYWdlLmJhaWR1LmNvbS9pP2llPXV0Zi04JndvcmQ9JUU5JUEzJThFJUU2JTk5JUFGJm9xPSVFOSVBMyU4RSVFNiU5OSIsCiAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgdXJsOiAvXmh0dHBzPzpcL1wvaW1hZ2VcLmJhaWR1XC5jb21cLy4qJndvcmQ9L2ksCiAgICAgICAgICAgICBnZXRJbWFnZTogZnVuY3Rpb24oaW1nLCBhKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFhKSByZXR1cm47CiAgICAgICAgICAgICAgICAgdmFyIHJlZyA9IC8mb2JqdXJsPShodHRwLio/XC4oPzpqcGd8anBlZ3xwbmd8Z2lmfGJtcCkpL2k7CiAgICAgICAgICAgICAgICAgaWYgKGEuaHJlZi5tYXRjaChyZWcpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoUmVnRXhwLiQxKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiLosYbnk6MiLAogICAgICAgICAgICAgICAgc2l0ZUV4YW1wbGU6Imh0dHA6Ly9tb3ZpZS5kb3ViYW4uY29tL3Bob3Rvcy9waG90by8xMDAwNjU2MTU1LyIsCiAgICAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICAgICAgICAgIHVybDovXmh0dHBzPzpcL1wvW14uXSpcLmRvdWJhblwuY29tL2ksCiAgICAgICAgICAgICAgICBnZXRJbWFnZTpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIHZhciBvbGRzcmMgPSB0aGlzLnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgbmV3c3JjID0gb2xkc3JjOwogICAgICAgICAgICAgICAgICAgIHZhciBwaWMgPSAvXC92aWV3XC9waG90b1wvKD86cGhvdG98YWxidW1jb3ZlcnxhbGJ1bWljb258dGh1bWJ8c3F4cylcL3B1YmxpY1wvL2k7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vdmllQ292ZXIgPSAvXC92aWV3XC9tb3ZpZV9wb3N0ZXJfY292ZXJcL1tzaV1wc3RcL3B1YmxpY1wvL2k7CiAgICAgICAgICAgICAgICAgICAgdmFyIGJvb2tDb3ZlciA9IC9cL3ZpZXdcL2Fya19hcnRpY2xlX2NvdmVyXC9jdXRcL3B1YmxpY1wvL2k7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNwaWMgPSAvKGltZ1xkKy5kb3ViYW4uY29tKVwvW3NtXXBpY1wvL2kKCiAgICAgICAgICAgICAgICAgICAgLy8g6L+Z5Liq572R5Z2A5aSn5Zu+5Lya5Ye66ZSZCiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cDovL21vdmllLmRvdWJhbi5jb20vc3ViamVjdC8yNTcwODU3OS9kaXNjdXNzaW9uLzU4OTUwMjA2LwogICAgICAgICAgICAgICAgICAgIGlmKC9tb3ZpZVwuZG91YmFuXC5jb21cL3N1YmplY3RcL1xkK1wvZGlzY3Vzc2lvbi8udGVzdChsb2NhdGlvbi5ocmVmKSl7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwaWMudGVzdChvbGRzcmMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld3NyYyA9IG9sZHNyYy5yZXBsYWNlKHBpYywgJy92aWV3L3Bob3RvL3Jhdy9wdWJsaWMvJyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb3ZpZUNvdmVyLnRlc3Qob2xkc3JjKSkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXdzcmMgPSBvbGRzcmMucmVwbGFjZShtb3ZpZUNvdmVyLCAnL3ZpZXcvcGhvdG8vcmF3L3B1YmxpYy8nKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJvb2tDb3Zlci50ZXN0KG9sZHNyYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3c3JjID0gb2xkc3JjLnJlcGxhY2UoYm9va0NvdmVyLCAnL3ZpZXcvYXJrX2FydGljbGVfY292ZXIvcmV0aW5hL3B1YmxpYy8nKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNwaWMudGVzdChvbGRzcmMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld3NyYyA9IG9sZHNyYy5yZXBsYWNlKHNwaWMsICckMS9scGljLycpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld3NyYyA9PSBvbGRzcmMgPyBudWxsIDogW25ld3NyYyxuZXdzcmMucmVwbGFjZSgvcGhvdG9cL3Jhdy8sInBob3RvL3Bob3RvIildOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZToi5paw5rWq5b6u5Y2aIiwKICAgICAgICAgICAgIHNpdGVFeGFtcGxlOiJodHRwOi8vd2VpYm8uY29tL3B1Yi8/c291cmNlPXRvcHRyYXkiLAogICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgdXJsOi9eaHR0cHM/OlwvXC8oPzpbXi5dK1wuKSp3ZWlib1wuKGNvbXxjbikvaSwKICAgICAgICAgICAgIGdldEltYWdlOmZ1bmN0aW9uKGltZyl7CiAgICAgICAgICAgICAgICAgdmFyIG9sZHNyYz10aGlzLnNyYzsKICAgICAgICAgICAgICAgICB2YXIgcGljPS8oXC5zaW5haW1nXC4oY258Y29tKVwvKSg/OmJtaWRkbGV8b3JqMzYwKS9pOy8v5b6u5Y2a5YaF5a655Zu+54mHLgogICAgICAgICAgICAgICAgIHZhciBwaWMyPS8oXC5zaW5haW1nXC4oY258Y29tKVwvKSg/OnNxdWFyZXx0aHVtYm5haWwpL2k7Ly8g5b6u5Y2a5YaF5a655Zu+54mHMi4KICAgICAgICAgICAgICAgICB2YXIgaGVhZD0vKFwuc2luYWltZ1wuKGNufGNvbSlcL1xkKylcLzUwXC8vaTsvL+WktOWDjy4KICAgICAgICAgICAgICAgICB2YXIgcGhvdG9MaXN0PS9cLnNpbmFpbWdcLihjbnxjb20pXC90aHVtYlxkK1wvXHcrL2kvL+ebuOWGjAogICAgICAgICAgICAgICAgIHZhciBuZXdzcmM7CiAgICAgICAgICAgICAgICAgaWYocGljLnRlc3Qob2xkc3JjKSl7CiAgICAgICAgICAgICAgICAgICAgIG5ld3NyYz1vbGRzcmMucmVwbGFjZShwaWMsJyQxbGFyZ2UnKTsgIC8vIGxhcmdlIOS4jeaYr+avj+S4gOW8oOWbvueJh+mDveacieeahAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3c3JjPT1vbGRzcmM/ICcnIDogbmV3c3JjOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGljMi50ZXN0KG9sZHNyYykpIHsKICAgICAgICAgICAgICAgICAgICAgbmV3c3JjPW9sZHNyYy5yZXBsYWNlKHBpYzIsJyQxbXcxMDI0Jyk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdzcmM9PW9sZHNyYz8gJycgOiBuZXdzcmM7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGhlYWQudGVzdChvbGRzcmMpKXsKICAgICAgICAgICAgICAgICAgICAgbmV3c3JjPW9sZHNyYy5yZXBsYWNlKGhlYWQsJyQxLzE4MC8nKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld3NyYz09b2xkc3JjPyAnJyA6IG5ld3NyYzsKICAgICAgICAgICAgICAgICB9ZWxzZSBpZihwaG90b0xpc3QudGVzdChvbGRzcmMpKXsKICAgICAgICAgICAgICAgICAgICAgbmV3c3JjPW9sZHNyYy5yZXBsYWNlKC90aHVtYlxkKy8sJ213NjkwJyk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdzcmM9PW9sZHNyYz8gJycgOiBuZXdzcmM7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiJiaWxpYmlsaSIsCiAgICAgICAgICAgICBlbmFibGVkOnRydWUsCiAgICAgICAgICAgICB1cmw6L15odHRwcz86XC9cL1teLl0rXC5iaWxpYmlsaS5jb20vaSwKICAgICAgICAgICAgIGdldEltYWdlOmZ1bmN0aW9uKGltZyl7CiAgICAgICAgICAgICAgICAgdmFyIG9sZHNyYz10aGlzLnNyYzsKICAgICAgICAgICAgICAgICB2YXIgcGljPS9cZCtfXGQrXC98XGQrX3hcZCtcLmpwZyR8QFxkK3dfXGQraFwud2VicCR8X1xkK3hcZCtcLmpwZyQvaTsKICAgICAgICAgICAgICAgICB2YXIgbmV3c3JjOwogICAgICAgICAgICAgICAgIGlmKHBpYy50ZXN0KG9sZHNyYykpewogICAgICAgICAgICAgICAgICAgICBuZXdzcmM9b2xkc3JjLnJlcGxhY2UocGljLCcnKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld3NyYz09b2xkc3JjPyAnJyA6IG5ld3NyYzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiLohb7orq/lvq7ljZoiLAogICAgICAgICAgICAgc2l0ZUV4YW1wbGU6Imh0dHA6Ly90LnFxLmNvbS9wL25ld3MiLAogICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgdXJsOi9eaHR0cDpcL1wvW15cL10qdFwucXFcLmNvbVwvL2ksCiAgICAgICAgICAgICBnZXRJbWFnZTpmdW5jdGlvbihpbWcpewogICAgICAgICAgICAgICAgIHZhciBwaWM9LyhcLnFwaWNcLmNuXC9tYmxvZ3BpY1wvXHcrKVwvXGQrL2k7Ly/lm77niYcKICAgICAgICAgICAgICAgICB2YXIgaGVhZD0vKFwucWxvZ29cLmNuXC9tYmxvZ2hlYWRcL1x3KylcL1xkKy9pOy8v5aS05YOPLgogICAgICAgICAgICAgICAgIHZhciBvbGRzcmM9dGhpcy5zcmM7CiAgICAgICAgICAgICAgICAgdmFyIG5ld3NyYzsKICAgICAgICAgICAgICAgICBpZihwaWMudGVzdChvbGRzcmMpKXsKICAgICAgICAgICAgICAgICAgICAgbmV3c3JjPW9sZHNyYy5yZXBsYWNlKHBpYywnJDEvMjAwMCcpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3c3JjPT1vbGRzcmM/ICcnIDogbmV3c3JjOzsKICAgICAgICAgICAgICAgICB9ZWxzZSBpZihoZWFkLnRlc3Qob2xkc3JjKSl7CiAgICAgICAgICAgICAgICAgICAgIG5ld3NyYz1vbGRzcmMucmVwbGFjZShoZWFkLCckMS8wJyk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdzcmM9PW9sZHNyYz8gJycgOiBuZXdzcmM7OwogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogImRldmlhbnRhcnQiLAogICAgICAgICAgICAgc2l0ZUV4YW1wbGU6ICJodHRwOi8vd3d3LmRldmlhbnRhcnQuY29tIiwKICAgICAgICAgICAgIGVuYWJsZWQ6dHJ1ZSwKICAgICAgICAgICAgIHVybDovXmh0dHBzPzpcL1wvW14uXSpcLmRldmlhbnRhcnRcLmNvbS9pLAogICAgICAgICAgICAgZ2V0SW1hZ2U6ZnVuY3Rpb24oaW1nLCBhKXsKICAgICAgICAgICAgICAgICB2YXIgb2xkc3JjPXRoaXMuc3JjOwogICAgICAgICAgICAgICAgIHZhciBuZXdzcmM7CiAgICAgICAgICAgICAgICAgaWYodGhpcy5wYXJlbnROb2RlICYmIHRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlICYmIHRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUgJiYgdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5kYXRhc2V0ICYmIHRoaXMucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuZGF0YXNldC5zdXBlckZ1bGxJbWcpewogICAgICAgICAgICAgICAgICAgICBuZXdzcmM9dGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5kYXRhc2V0LnN1cGVyRnVsbEltZzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYoIW5ld3NyYykKICAgICAgICAgICAgICAgICAgICAgbmV3c3JjID0gYS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3VwZXItaW1nJykgfHwgYS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3VwZXItZnVsbC1pbWcnKSB8fCBhLnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXN1cGVyLWltZycpIHx8IGEucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3VwZXItZnVsbC1pbWcnKQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgb2xkc3JjLnJlcGxhY2UoLyhodHRwOlwvXC9bXlwvXStcL2ZzXGQrXC8pMjAwSFwvKC4qKS9pLCckMSQyJyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld3NyYz09b2xkc3JjPyAnJyA6IG5ld3NyYzsKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAn6Iqx55Oj572RJywKICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9odWFiYW5cLmNvbVwvL2ksCiAgICAgICAgICAgICBleHQ6ICdwcmV2aW91cy0yJywKICAgICAgICAgICAgIC8vIGV4dDogZnVuY3Rpb24odGFyZ2V0KSB7CiAgICAgICAgICAgICAvLyAgICAgaWYgKHRhcmdldC5jbGFzc05hbWUgPT0gJ2NvdmVyJykgewogICAgICAgICAgICAgLy8gICAgICAgICByZXR1cm4gdGFyZ2V0LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcignaW1nJyk7CiAgICAgICAgICAgICAvLyAgICAgfQogICAgICAgICAgICAgLy8gfSwKICAgICAgICAgICAgIGdldEltYWdlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICB2YXIgcGljID0gLyguKmltZy5oYi5haWNkbi5jb21cLy4qKV9mdyg/OjIzNnwzMjApJC9pCiAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3JjLm1hdGNoKHBpYykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZ0V4cC4kMSArICdfZnc2NTgnOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJy4vLi4vZm9sbG93aW5nLXNpYmxpbmc6OnBbQGNsYXNzPSJkZXNjcmlwdGlvbiJdJywKICAgICAgICAgICAgIC8vIGNzczogJy5waW4gYS5pbWcgLmNvdmVyIHsgZGlzcGxheTogbm9uZTsgfScsCiAgICAgICAgICAgICBleGNsdWRlOiAvd2VpeGluX2NvZGVcLnBuZyQvaSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8g5YW25a6DCiAgICAgICAgICAgIHtuYW1lOiAid2lraXBlZGlhIiwKICAgICAgICAgICAgIGVuYWJsZWQ6dHJ1ZSwKICAgICAgICAgICAgIHVybDovXmh0dHBzPzpcL1wvW14uXSsud2lraXBlZGlhLm9yZ1wvL2ksCiAgICAgICAgICAgICBnZXRJbWFnZTpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgIHZhciBzcmM9dGhpcy5zcmM7CiAgICAgICAgICAgICAgICAgdmFyIHJldD1zcmMucmVwbGFjZSgnL3RodW1iLycsJy8nKTsKICAgICAgICAgICAgICAgICBpZihzcmM9PXJldClyZXR1cm47Ly/pnZ7nvKnnlaXlm74KICAgICAgICAgICAgICAgICByZXR1cm4gKHJldC5tYXRjaCgvKGh0dHBzPzpcL1wvLiopXC9cZCtweC0uKi8pIHx8IFtdKVsxXTsKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiLmsqrmsZ/noo7noo4iLAogICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgdXJsOi9eaHR0cHM/OlwvXC8oW14uXStcLikqKD86eWVzaGpcLmNvbXxoamVuZ2xpc2hcLmNvbXxodWppYW5nXC5jb20pL2ksCiAgICAgICAgICAgICBnZXRJbWFnZTpmdW5jdGlvbihpbWcpewogICAgICAgICAgICAgICAgIHZhciBvbGRzcmM9dGhpcy5zcmM7CiAgICAgICAgICAgICAgICAgdmFyIHJlZz0vXihodHRwcz86XC9cLyg/OlteLl0rXC4pKmhqZmlsZS5jblwvLispKF8oPzpzfG0pKShcLlx3KykkL2k7CiAgICAgICAgICAgICAgICAgaWYocmVnLnRlc3Qob2xkc3JjKSl7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbGRzcmMucmVwbGFjZShyZWcsJyQxJDMnKTsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICflpKfkvJfngrnor4QnLAogICAgICAgICAgICAgc2l0ZUV4YW1wbGU6ICdodHRwOi8vd3d3LmRpYW5waW5nLmNvbS9zaG9wLzE3ODczMjk2L3Bob3RvcycsCiAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC93d3cuZGlhbnBpbmcuY29tXC9zaG9wL2ksCiAgICAgICAgICAgICBnZXRJbWFnZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgdmFyIG9sZHNyYyA9IHRoaXMuc3JjLAogICAgICAgICAgICAgICAgICAgICBuZXdzcmM7CiAgICAgICAgICAgICAgICAgdmFyIHBpYyA9IC8oLis/ZHBmaWxlXC5jb21cLy4rKVwoMjQwYzE4MFwpXC8odGh1bWJcLi4rKS87CiAgICAgICAgICAgICAgICAgaWYgKHBpYy50ZXN0KG9sZHNyYykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9sZHNyYy5yZXBsYWNlKHBpYywgJyQxKDcwMHg3MDApLyQyJyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyDop4bpopHnvZHnq5kKICAgICAgICAgICAge25hbWU6ICd0cmFrdC50dicsCiAgICAgICAgICAgICB1cmw6IC9eaHR0cDpcL1wvdHJha3RcLnR2XC8vaSwKICAgICAgICAgICAgIHNpdGVFeGFtcGxlOiAnaHR0cDovL3RyYWt0LnR2L3Nob3dzJywKICAgICAgICAgICAgIGdldEltYWdlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICB2YXIgb2xkc3JjID0gdGhpcy5zcmM7CiAgICAgICAgICAgICAgICAgaWYgKG9sZHNyYy5tYXRjaCgvKC4qXC9pbWFnZXNcL3Bvc3RlcnNcL1xkKyktKD86MzAwfDEzOClcLmpwZ1w/KFxkKykkLykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZ0V4cC4kMSArICcuanBnPycgKyBSZWdFeHAuJDI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBNdXNpYwogICAgICAgICAgICB7bmFtZTogJ+e9keaYk+S6kemfs+S5kCcsCiAgICAgICAgICAgICB1cmw6ICdodHRwOi8vbXVzaWMuMTYzLmNvbS8qJywKICAgICAgICAgICAgIGV4dDogJ3ByZXZpb3VzJywgIC8vIOaJqeWxleaooeW8j++8jOajgOafpeWJjemdouS4gOS4quaYr+WQpuS4uiBpbWcKICAgICAgICAgICAgIGdldEltYWdlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICB2YXIgb2xkc3JjID0gdGhpcy5zcmM7CiAgICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhKXsKICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld3NyYyA9IHRoaXMuZGF0YSgnc3JjJyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRzcmMgIT0gbmV3c3JjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3c3JjOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChvbGRzcmMubWF0Y2goLyguKilcP3BhcmFtPVxkK3lcZCskLykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlZ0V4cC4kMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIOe+juWlswogICAgICAgICAgICB7bmFtZTogIue+juWls+iWhOaDhemmhiIsICAvLyDov5nkuKrnvZHnq5nmnInpmZDliLbvvIzmr4/lpKnlj6rog73nnIvlpJrlsJHlvKAKICAgICAgICAgICAgIHVybDogL15odHRwOlwvXC9ib3FpbmdndWFuXC5jb21cLy9pLAogICAgICAgICAgICAgc2l0ZUV4YW1wbGU6ICdodHRwOi8vYm9xaW5nZ3Vhbi5jb20vUGljdHVyZS8zMTYzNycsCiAgICAgICAgICAgICBsYXp5QXR0cjogJ2RhdGEtb3JpZ2luYWwnLCAgLy8g55Sx5LqO6YeH55So5LqG5bu26L+f5Yqg6L295oqA5pyv77yM5omA5Lul5Zu+54mH5Y+v6IO95Li6IGxvYWRpbmcuZ2lmCiAgICAgICAgICAgICBnZXRJbWFnZTogZnVuY3Rpb24oaW1nLCBhKSB7CiAgICAgICAgICAgICAgICAgdmFyIG9sZHNyYyA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbmFsJykgfHwgdGhpcy5zcmM7CiAgICAgICAgICAgICAgICAgaWYgKG9sZHNyYykgewogICAgICAgICAgICAgICAgICAgICB2YXIgbmV3c3JjID0gb2xkc3JjLnJlcGxhY2UoLyFbYS16XGRdKyQvLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdzcmMgPT0gb2xkc3JjID8gJycgOiBuZXdzcmM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyDmuLjmiI8KICAgICAgICAgICAge25hbWU6IjE3OC5jb20iLAogICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgdXJsOi9eaHR0cHM/OlwvXC8oPzpcdytcLikrMTc4XC5jb21cLy9pLAogICAgICAgICAgICAgY2xpa1RvT3Blbjp7CiAgICAgICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OnRydWUsCiAgICAgICAgICAgICAgICAgdHlwZTonYWN0dWFsJywKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICBnZXRJbWFnZTpmdW5jdGlvbihpbWcsYSl7CiAgICAgICAgICAgICAgICAgaWYoIWEpcmV0dXJuOwogICAgICAgICAgICAgICAgIHZhciByZWc9L15odHRwcz86XC9cLyg/Olx3K1wuKSsxNzhcLmNvbVwvLis/KGh0dHBzPzpcL1wvaW1nXGQqLjE3OC5jb21cL1teLl0rXC4oPzpqcGd8anBlZ3xwbmd8Z2lmfGJtcCkpL2k7CiAgICAgICAgICAgICAgICAgcmV0dXJuIChhLmhyZWYubWF0Y2gocmVnKSB8fCBbXSlbMV07CiAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8g6K665Z2bCiAgICAgICAgICAgIHtuYW1lOiLmnoHpmZDkuLvpopjnpL7ljLoiLAogICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgdXJsOi9eaHR0cHM/OlwvXC9iYnNcLnRoZW1leFwubmV0XC8uKy9pLAogICAgICAgICAgICAgY2xpa1RvT3Blbjp7CiAgICAgICAgICAgICAgICAgZW5hYmxlZDp0cnVlLAogICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OnRydWUsCiAgICAgICAgICAgICAgICAgdHlwZTonYWN0dWFsJywKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICBnZXRJbWFnZTpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgIHZhciByZWc9L14oaHR0cHM/OlwvXC9iYnNcLnRoZW1leFwubmV0XC9hdHRhY2htZW50XC5waHBcPy4rKSZ0aHVtYj0xKC4rKS9pOwogICAgICAgICAgICAgICAgIHZhciBzcmM9dGhpcy5zcmM7CiAgICAgICAgICAgICAgICAgdmFyIHJldD1zcmMucmVwbGFjZShyZWcsJyQxJDInKTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0IT1zcmM/IHJldCA6ICcnOwogICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6Im9wZXJh5a6Y5pa56K665Z2bIiwKICAgICAgICAgICAgIHNpdGVFeGFtcGxlOiJodHRwOi8vYmJzLm9wZXJhY2hpbmEuY29tIiwKICAgICAgICAgICAgIGVuYWJsZWQ6dHJ1ZSwKICAgICAgICAgICAgIHVybDovXmh0dHA6XC9cL2Jic1wub3BlcmFjaGluYVwuY29tL2ksCiAgICAgICAgICAgICBnZXRJbWFnZTpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgIHZhciBzcmM9dGhpcy5zcmM7CiAgICAgICAgICAgICAgICAgaWYoL2ZpbGUucGhwXD9pZD1cZCskL2kudGVzdChzcmMpKXsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNyYysnJm1vZGU9dmlldyc7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyDnibnmrornmoTpnIDopoHkv67mraMKICAgICAgICAgICAge25hbWU6ICdnaXRodWIg5L+u5q2jJywKICAgICAgICAgICAgIHVybDogL15odHRwcz86XC9cL2dpdGh1YlwuY29tXC8vaSwKICAgICAgICAgICAgIGNsaWtUb09wZW46IHsKICAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiB0cnVlLAogICAgICAgICAgICAgICAgIHR5cGU6ICdhY3R1YWwnLAogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIGdldEltYWdlOiBmdW5jdGlvbihpbWcsIGEpIHsKICAgICAgICAgICAgICAgICBpZiAoYSAmJiBhLmhyZWYuaW5kZXhPZignL2Jsb2IvbWFzdGVyLycpID4gMCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zcmM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8g6ZyA6KaBIHhociDojrflj5bnmoQKICAgICAgICAgICAge25hbWU6ICfkvJjnvo7lm74nLAogICAgICAgICAgICAgdXJsOiAvaHR0cDpcL1wvKD86d3d3XC4pP3RvcGl0XC5tZVwvLywKICAgICAgICAgICAgIGdldEltYWdlOiBmdW5jdGlvbihpbWcsIGEpIHsgIC8vIOWmguaenOaciSB4aHLvvIzliJnlupTor6Xov5Tlm54geGhyIOeahCB1cmwKICAgICAgICAgICAgICAgICBpZiAoYSAmJiBhLmhyZWYubWF0Y2goL3RvcGl0XC5tZVwvaXRlbVwvXGQrLykpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaHJlZjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9LAogICAgICAgICAgICAgbGF6eUF0dHI6ICdkYXRhLW9yaWdpbmFsJywgIC8vIOW7tui/n+WKoOi9veaKgOacr+iuqeWQjumdoueahOWbvueJh+aYryBibGFuay5naWYKICAgICAgICAgICAgIHhocjogewogICAgICAgICAgICAgICAgIHE6IFsnYVtkb3dubG9hZF0nLCAnYSNpdGVtLXRpcCddLAogICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogJ+WNiuasoeWFgycsCiAgICAgICAgICAgICB1cmw6IC9eaHR0cHM/OlwvXC9iY3lcLm5ldFwvLywKICAgICAgICAgICAgIGdldEltYWdlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zcmMucmVwbGFjZSgvXC9cZFhcZCR8XC93XGQrJC8sIiIpLnJlcGxhY2UoL1wvY292ZXJcLy8sIi9wb3N0LyIpLnJlcGxhY2UoL1wvKG1pZGRsZXxzbWFsbClcLmpwZy8sIi9iaWcuanBnIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAnU3RlYW1wb3dlcmVkJywKICAgICAgICAgICAgIHVybDogL1wuc3RlYW1wb3dlcmVkXC5jb20vLAogICAgICAgICAgICAgZ2V0SW1hZ2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNyYy5yZXBsYWNlKC9cLlxkK3hcZCtcLmpwZy8sIi5qcGciKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICdTdGVhbWNvbW11bml0eScsCiAgICAgICAgICAgICB1cmw6IC9zdGVhbWNvbW11bml0eVwuY29tLywKICAgICAgICAgICAgIGdldEltYWdlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zcmMucmVwbGFjZSgvb3V0cHV0XC1xdWFsaXR5PVxkKyZmaXQ9aW5zaWRlXHxcZCtcOlxkKy8sIm91dHB1dC1xdWFsaXR5PTEwMCZmaXQ9aW5zaWRlfDA6MCIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogJ+efpeS5jicsCiAgICAgICAgICAgICB1cmw6IC96aGlodVwuY29tLywKICAgICAgICAgICAgIGdldEltYWdlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zcmMucmVwbGFjZSgvXyhifHhzfHN8bHxcZCt4XGQrKVwuLywiLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogJzUwMHB4JywKICAgICAgICAgICAgIHVybDogLzUwMHB4XC4vLAogICAgICAgICAgICAgZ2V0SW1hZ2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNyYy5yZXBsYWNlKC9oJTNEXGQrXC92Mi4qLywibSUzRDIwMDAvdjIiKS5yZXBsYWNlKC9eKCg/Oig/OnBwP2NkbnxzXFxkXFwuYW1hem9uYXdzXFwuY29tXC9waG90b3N8Z3BcXGQrXFwud2FjXFwuZWRnZWNhc3RjZG5cXC5uZXRcLzgwNjYxNFwvcGhvdG9zXC9waG90b3MpXFwuNTAwcHh8ZGpsaGdnaXBjeWxsb1xcLmNsb3VkZnJvbnQpXFwuKD86bmV0fG9yZylcL1xcZCtcL1tcXGRhLWZdezQwfVwvKVxcZCtcXC4vLCIkMTIwNDguanBnIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAnTnlhYScsCiAgICAgICAgICAgICB1cmw6IC9ueWFhXC5zZS8sCiAgICAgICAgICAgICBnZXRJbWFnZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC91cGxvYWRcL3NtYWxsXC8vLnRlc3QodGhpcy5zcmMpP3RoaXMuc3JjLnJlcGxhY2UoL3VwbG9hZFwvc21hbGxcLy8sInVwbG9hZC9iaWcvIik6bnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJpdHVuZXMiLAogICAgICAgICAgICAgdXJsOiAvaXR1bmVzXC5hcHBsZVwuY29tLywKICAgICAgICAgICAgIGdldEltYWdlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zcmMucmVwbGFjZSgvXGQreFxkK2JiXC4vLCIxNDAweDE0MDBiYi4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLmsb3ovabkuYvlrrYiLAogICAgICAgICAgICAgdXJsOiAvXC5hdXRvaG9tZVwuY29tXC5jbi8sCiAgICAgICAgICAgICBnZXRJbWFnZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3JjLnJlcGxhY2UoLyhcP2ltYWdlVmlldy4qfFxkK3hcZCtfXGQrX3xmX21ffHRffHNfKS8sIiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuaYk+i9piIsCiAgICAgICAgICAgICB1cmw6IC9cLmJpdGF1dG9cLmNvbS8sCiAgICAgICAgICAgICBnZXRJbWFnZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3JjLnJlcGxhY2UoL19cZCtcLmpwZyQvaSwiXzEyLmpwZyIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIueIseWNoSIsCiAgICAgICAgICAgICB1cmw6IC9cLnhjYXJcLmNvbVwuY24vLAogICAgICAgICAgICAgZ2V0SW1hZ2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNyYy5yZXBsYWNlKC9cLVxkK3hcZCtcLmpwZy9pLCIiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLlpKrlubPmtIvmsb3ovaYiLAogICAgICAgICAgICAgdXJsOiAvXC5wY2F1dG9cLmNvbVwuY24vLAogICAgICAgICAgICAgZ2V0SW1hZ2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNyYy5yZXBsYWNlKC9fXGQreFxkK1wuanBnJC9pLCIuanBnIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi5paw5rWq5rG96L2mIiwKICAgICAgICAgICAgIHVybDogL1wuYXV0b1wuc2luYVwuY29tXC5jbi8sCiAgICAgICAgICAgICBnZXRJbWFnZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3JjLnJlcGxhY2UoL19cZCtcLmpwZyQvaSwiX3NyYy5qcGciKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJncmVhc3lmb3JrIiwKICAgICAgICAgICAgIHVybDogLyhncmVhc3lmb3JrfHNsZWF6eWZvcmspXC5vcmcvLAogICAgICAgICAgICAgZ2V0SW1hZ2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNyYy5yZXBsYWNlKC9cL3RodW1iXC8vaSwiL29yaWdpbmFsLyIpLnJlcGxhY2UoL1wvdGh1bWJuYWlsc1wvL2ksIi8iKS5yZXBsYWNlKC8oXC9mb3J1bVwvdXBsb2Fkc1wvdXNlcnBpY3NcLy4qXC8pbihbXlwvXSspJC8sIiQxcCQyIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAiZHJpYmJibGUiLAogICAgICAgICAgICAgdXJsOiAvZHJpYmJibGVcLmNvbS8sCiAgICAgICAgICAgICBnZXRJbWFnZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3JjLnJlcGxhY2UoL190ZWFzZXIoLlteXC5dKykkL2ksIiQxIikucmVwbGFjZSgvXzF4XC4vLCIuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi55m+5bqm55m+56eRIiwKICAgICAgICAgICAgIHVybDogL2JhaWtlXC5iYWlkdVwuY29tLywKICAgICAgICAgICAgIGdldEltYWdlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zcmMucmVwbGFjZSgvLipiZHN0YXRpY1wuY29tLipcLyhbXlwvXSspXC5qcGcvaSwiaHR0cDovL2ltZ3NyYy5iYWlkdS5jb20vYmFpa2UvcGljL2l0ZW0vJDEuanBnIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAibnZzaGVucyIsCiAgICAgICAgICAgICB1cmw6IC9udnNoZW5zXC5jb218b252c2hlblwuY29tLywKICAgICAgICAgICAgIGdldEltYWdlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zcmMucmVwbGFjZSgvKFxpbWdcLm9udnNoZW5cLmNvbS4qKSg/OnRodW1iXC98X3MpKC4qKS9pLCIkMSQyIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAiMjRtZWl0dSIsCiAgICAgICAgICAgICB1cmw6IC8yNG1laXR1XC5jb218MjVtZWludlwuY29tfGFpc2ltZWludlwuY29tfDI0dHVwaWFuXC5jb218MjRtZWludlwuLywKICAgICAgICAgICAgIGdldEltYWdlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zcmMucmVwbGFjZSgvXC9tKFteXC9dKykkL2ksIi8kMSIpLnJlcGxhY2UoL2ltZ3NcLi9pLCJiaW1nLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIlR1bWJsciIsCiAgICAgICAgICAgICB1cmw6IC90dW1ibHJcLmNvbS8sCiAgICAgICAgICAgICBnZXRJbWFnZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgaWYoL1wvYXZhdGFyXy8udGVzdCh0aGlzLnNyYykpcmV0dXJuIHRoaXMuc3JjLnJlcGxhY2UoLyhtZWRpYVwudHVtYmxyXC5jb20uKl8pW15fXSsoXC5bXlwuXSspJC9pLCIkMTUxMiQyIik7CiAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gdGhpcy5zcmMucmVwbGFjZSgvW15cL10qKG1lZGlhXC50dW1ibHJcLmNvbS4qXylcZCsoXC5bXlwuXSspJC9pLCIkMXJhdyQyIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAiQWNnZ2V0IiwKICAgICAgICAgICAgIHVybDogL2FjZzE4XC51c3xhY2dnZXRcLi8sCiAgICAgICAgICAgICBnZXRJbWFnZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbmFsJykgfHwgdGhpcy5zcmMucmVwbGFjZSgvKHBpY1wuYWNnZ2V0XC5jb21cL3RodW1iXC8pd1xkK19oXGQrXC8vaSwiJDF3OTk5OV9oOTk5OS8iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJQaXhpdiIsCiAgICAgICAgICAgICB1cmw6IC9waXhpdlwubmV0fHB4aW1nXC5uZXQvLAogICAgICAgICAgICAgZ2V0SW1hZ2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHZhciBwcmVTdHI9dGhpcy5zcmMucmVwbGFjZSgvcHhpbWdcLm5ldFwvY1wvXGQreFxkK1wvaW1nLW1hc3RlclwvaW1nXC8oLiopX1teX10rKFwuW2Etel0rKSQvaSwicHhpbWcubmV0L2ltZy1vcmlnaW5hbC9pbWcvJDEiKTsKICAgICAgICAgICAgICAgICBpZihwcmVTdHIhPXRoaXMuc3JjKQogICAgICAgICAgICAgICAgIHJldHVybiBbcHJlU3RyKyIuanBnIixwcmVTdHIrIi5wbmciXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJXYWxsaGF2ZW4iLAogICAgICAgICAgICAgdXJsOiAvd2FsbGhhdmVuXC4vLAogICAgICAgICAgICAgZ2V0SW1hZ2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNyYy5yZXBsYWNlKC93YWxscGFwZXJzXC90aHVtYlwvc21hbGxcL3RoL2ksIndhbGxwYXBlcnMvZnVsbC93YWxsaGF2ZW4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJsb2Z0ZXIiLAogICAgICAgICAgICAgdXJsOiAvbG9mdGVyXC4vLAogICAgICAgICAgICAgZ2V0SW1hZ2U6IGZ1bmN0aW9uKGltZywgYSkgewogICAgICAgICAgICAgICAgIGlmKGEgJiYgYS5ocmVmICYmIGEuaGFzQXR0cmlidXRlKCJiaWdpbWdzcmMiKSl7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmdldEF0dHJpYnV0ZSgiYmlnaW1nc3JjIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNyYy5yZXBsYWNlKC9cPy4qL2ksIiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogInNvaHUiLAogICAgICAgICAgICAgdXJsOiAvKHNvaHV8c29odWNzKVwuY29tLywKICAgICAgICAgICAgIGdldEltYWdlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zcmMucmVwbGFjZSgvKHNvaHVjc1wuY29tXC8pLipcLyhpbWFnZXNcL3xvc1wvKS9pLCIkMSQyIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAibW9lZ2lybCIsCiAgICAgICAgICAgICB1cmw6IC8obW9lZ2lybHxtZW5nbmlhbmcpXC5vcmcvLAogICAgICAgICAgICAgZ2V0SW1hZ2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNyYy5yZXBsYWNlKC8oY29tbW9uKVwvdGh1bWIoLiopXC9bXlwvXSsvaSwiJDEkMiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogImZhbmZvdSIsCiAgICAgICAgICAgICB1cmw6IC9mYW5mb3VcLmNvbS8sCiAgICAgICAgICAgICBnZXRJbWFnZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3JjLnJlcGxhY2UoL0AuKy9pLCIiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJtZWl0dWRhdGEiLAogICAgICAgICAgICAgdXJsOiAvbWVpcGFpXC5jb20vLAogICAgICAgICAgICAgZ2V0SW1hZ2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNyYy5yZXBsYWNlKC8hdGh1bWIuKy9pLCIiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJtYWZlbmd3byIsCiAgICAgICAgICAgICB1cmw6IC9tYWZlbmd3b1wuY24vLAogICAgICAgICAgICAgZ2V0SW1hZ2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNyYy5yZXBsYWNlKC9cP2ltYWdlTW9nci4qL2ksIiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogImRpc2NvcmRhcHAiLAogICAgICAgICAgICAgdXJsOiAvZGlzY29yZGFwcFwuY29tLywKICAgICAgICAgICAgIGdldEltYWdlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zcmMucmVwbGFjZSgvXD93aWR0aD1cZCsmaGVpZ2h0PVxkKyQvaSwiIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICBdOwoKICAgICAgICAvLyDpgJrphY3lnovop4TliJks5peg6KeG56uZ54K5LgogICAgICAgIHZhciB0cHJ1bGVzPVsKICAgICAgICAgICAgZnVuY3Rpb24oaW1nLCBhKSB7IC8vIOino+WGs+aWsOeahGR66K665Z2b55qE5Y6f5Zu+6I635Y+W5pa55byPLgogICAgICAgICAgICAgICAgdmFyIHJlZ3MgPSBbLyguK1wvYXR0YWNobWVudHM/XC8uKylcLnRodW1iXC5cd3syLDV9JC9pLC8oKHdwLWNvbnRlbnR8bW9lY2RuXC5vcmcpXC91cGxvYWRzXC8uKilcLVxkK3hcZCsvaSwvLiooPzp1cmx8c3JjKT0oaHR0cHM/OlwvXC8uKlwuKD86anBnfGpwZWd8cG5nfGdpZnxibXApKS4qL2ksLy4qdGh1bWJcLnBocFw/c3JjPShbXiZdKikuKi9pXTsKICAgICAgICAgICAgICAgIHZhciBvbGRzcmMgPSB0aGlzLnNyYyxuZXdzcmMgPSB0aGlzLnNyYzsKICAgICAgICAgICAgICAgIGlmIChvbGRzcmMpewogICAgICAgICAgICAgICAgICAgIGZvcihsZXQgcmVnIG9mIHJlZ3MpewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVnLnRlc3Qob2xkc3JjKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3c3JjID0gb2xkc3JjLnJlcGxhY2UocmVnLCAnJDEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbD10aGlzLmdldEF0dHJpYnV0ZT90aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW5hbCcpOiIiOwogICAgICAgICAgICAgICAgaWYob3JpZ2luYWwgJiYgb3JpZ2luYWwhPW9sZHNyYylyZXR1cm4gb3JpZ2luYWw7CiAgICAgICAgICAgICAgICBlbHNlIGlmKC9hdHRhY2htZW50XC5waHBcP2F0dGFjaG1lbnRpZD1cZCsvLnRlc3Qob2xkc3JjKSl7CiAgICAgICAgICAgICAgICAgICAgIG5ld3NyYz1vbGRzcmMucmVwbGFjZSgvKGF0dGFjaG1lbnRcLnBocFw/YXR0YWNobWVudGlkPVxkKykuKi8sIiQxIik7CiAgICAgICAgICAgICAgICB9ZWxzZSBpZigvXC5zaW5haW1nXC4oY258Y29tKVwvbXdcZCtcLy8udGVzdChvbGRzcmMpKXsKICAgICAgICAgICAgICAgICAgICBuZXdzcmM9b2xkc3JjLnJlcGxhY2UoLy4qKGh0dHBzPzpcL1wvW15cLl0rXC5zaW5haW1nXC4oY258Y29tKSlcL213XGQrXC8vLCIkMS9sYXJnZS8iKTsKICAgICAgICAgICAgICAgIH1lbHNlIGlmKC9ncmF2YXRhclwuY29tXC9hdmF0YXJcLy4qW1w/Jl1zPS8udGVzdChvbGRzcmMpKXsKICAgICAgICAgICAgICAgICAgICBuZXdzcmM9b2xkc3JjLnJlcGxhY2UoLyhncmF2YXRhclwuY29tXC9hdmF0YXJcLy4qW1w/Jl1zPSkuKi8sIiQxNTAwIik7CiAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdWNfc2VydmVyXC9hdmF0YXJcLnBocFw/dWlkPVxkKyZzaXplPS4qLy50ZXN0KG9sZHNyYykpewogICAgICAgICAgICAgICAgICAgIG5ld3NyYz1vbGRzcmMucmVwbGFjZSgvKHVjX3NlcnZlclwvYXZhdGFyXC5waHBcP3VpZD1cZCsmc2l6ZT0pLiovLCIkMWJpZyIpOwogICAgICAgICAgICAgICAgfWVsc2UgaWYoL1wubWRcLlteXC5dKyQvLnRlc3Qob2xkc3JjKSl7CiAgICAgICAgICAgICAgICAgICAgbmV3c3JjPW9sZHNyYy5yZXBsYWNlKC9cLm1kKFwuW15cLl0rKSQvaSwiJDEiKTsKICAgICAgICAgICAgICAgIH1lbHNlIGlmKC9cLjEyNlwubmV0LipcL1xkK1wuXGQreFxkK1wuXGQrXC5bXlwuXSskLy50ZXN0KG9sZHNyYykpewogICAgICAgICAgICAgICAgICAgIG5ld3NyYz1vbGRzcmMucmVwbGFjZSgvXC9cZCtcLlxkK3hcZCtcLlxkK1wuKFteXC5dKykkL2ksIi81LjUwMDB4NTAwMC4xMDAuJDEiKTsKICAgICAgICAgICAgICAgIH1lbHNlIGlmKC9cLnl0aW1nXC5jb20vLnRlc3Qob2xkc3JjKSAmJiAhL21xZGVmYXVsdF82cy8udGVzdChvbGRzcmMpKXsKICAgICAgICAgICAgICAgICAgICBuZXdzcmM9b2xkc3JjLnJlcGxhY2UoL1w/LiokL2ksIiIpOwogICAgICAgICAgICAgICAgfWVsc2UgaWYoL21laXR1YW5cLm5ldFwvLipcL2F2YXRhclwvLy50ZXN0KG9sZHNyYykpewogICAgICAgICAgICAgICAgICAgIG5ld3NyYz1vbGRzcmMucmVwbGFjZSgvXC9hdmF0YXJcL1x3ezJ9L2ksIi9hdmF0YXIvbzAiKTsKICAgICAgICAgICAgICAgIH1lbHNlIGlmKC9oZHNsYlwuY29tXC8vLnRlc3Qob2xkc3JjKSl7CiAgICAgICAgICAgICAgICAgICAgbmV3c3JjPW9sZHNyYy5yZXBsYWNlKC9ALiovaSwiIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb2xkc3JjICE9IG5ld3NyYyA/IG5ld3NyYyA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICBdOwoKICAgICAgICB2YXIgUnVsZSA9IHt9OwoKICAgICAgICAvLyDlhbzlrrkgSW1hZ3VzIOaJqeWxleeahOinhOWIme+8jOiHquWumuS5iemDqOWIhgogICAgICAgIFJ1bGUuSW1hZ3VzID0ge307CgogICAgICAgIC8qKgogICAgICAgICAqIOWFvOWuuSBNb3VzZW92ZXIgUG9wdXAgSW1hZ2UgVmlld2VyIOiEmuacrOeahOinhOWIme+8iOmdnuWujOWFqO+8iQogICAgICAgICAqIDHjgIHmlrDlop7kuobnibnmrornmoTmm7/mjaLmqKHlvI/vvJrku6Ugcjsg5byA5aS044CCCiAgICAgICAgICogMuOAgeW3suWOu+mZpCBodHRwOi8vIOWktO+8jOWQjumdouS8muWKoOS4iuOAggogICAgICAgICAqLwogICAgICAgIFJ1bGUuTVBJViA9IFsKICAgICAgICAgICAgLy8g5Zu+54mHCiAgICAgICAgICAgIHtuYW1lOiAi55m+5bqm5Zu+54mH44CB6LS05ZCn562JIiwKICAgICAgICAgICAgIHI6ICIoaGlwaG90b3N8aW1nc3JjKVxcLmJhaWR1XFwuY29tLyguKz8pLy4rPyhbMC05YS1mXXs0MH0pIiwKICAgICAgICAgICAgIHM6ICJyOyQxLmJhaWR1LmNvbS8kMi9waWMvaXRlbS8kMyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8ge25hbWU6ICLnmb7luqblm77niYcyIiwKICAgICAgICAgICAgLy8gIGQ6ICJpbWFnZS5iYWlkdS5jb20iLCAgLy8gaW1ndDguYmRzdGF0aWMuY29tIOexu+Wei+eahOWbvueJh+mTvuaOpQogICAgICAgICAgICAvLyAgcjogImltYWdlXFwuYmFpZHVcXC5jb20vZGV0YWlsL25ld2luZGV4XFw/IiwKICAgICAgICAgICAgLy8gIHE6ICdpbWdbYWx0PSJwcmVsb2FkaW5nIl1bc3JjKj0iL3BpYy9pdGVtLyJdJywKICAgICAgICAgICAgLy8gIC8vIGRlc2NyaXB0aW9uOiAnLi8uLi8uLi9mb2xsb3dpbmctc2libGluZzo6ZGl2W0BjbGFzcz0iZXh0LWluZm8iXS9hJywKICAgICAgICAgICAgLy8gfSwKICAgICAgICAgICAge25hbWU6ICJHb29nbGVDb250ZW50IiwgIC8vIOadpeiHqiBJbWFndXMg5omp5bGVCiAgICAgICAgICAgICByOiAiXigoPzooPzpsaHxncHx5dClcXGQrXFwuZyg/Om9vZ2xldXNlcmNvbnRlbnxncGgpfFxcZFxcLmJwXFwuYmxvZ3Nwbyl0XFwuY29tLykoPzooW18tXSg/OltcXHdcXC1dezExfS8pezR9KVteL10rKC9bXj8jXSspP3woW149XSspKS4qIiwKICAgICAgICAgICAgIHM6IGZ1bmN0aW9uKCQsIG5vZGUpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAvLyAnaHR0cDovLycgKyAkWzFdICsgKCRbNF0gPyAkWzRdICsgJz0nIDogJFsyXSkgKyAnczAnICsgKCRbM10gfHwgJycpLCAgICAvLyDljp/lm74KICAgICAgICAgICAgICAgICAgICAgJ2h0dHA6Ly8nICsgJFsxXSArICgkWzRdID8gJFs0XSArICc9JyA6ICRbMl0pICsgJ3MxMDI0JyArICgkWzNdIHx8ICcnKSAgLy8gMTAyNCDlpKflsI8KICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJwaXhpdu+8iOmDqOWIhu+8iSIsCiAgICAgICAgICAgICBkOiAncGl4aXYubmV0JywKICAgICAgICAgICAgIHI6IC8ocGl4aXYubmV0XC9pbWdcZCtcL2ltZ1wvLitcL1xkKylfW21zXVwuKFx3ezIsNX0pJC9pLAogICAgICAgICAgICAgczogJ3I7JDEuJDInCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyDluLjnlKjnq5nngrkKICAgICAgICAgICAge25hbWU6ICfosYbnk6MnLAogICAgICAgICAgICAgcjogIihpbWdcXGQrXFwuZG91YmFuXFwuY29tLykoPzoodmlldy8pKD86cGhvdG98bW92aWVfcG9zdGVyX2NvdmVyKS8oPyFsYXJnZSlbXi9dK3woaWNvbi91KD89XFxkKSl8W3NtXSg/PXBpYy8pKSguKikiLAogICAgICAgICAgICAgczogZnVuY3Rpb24obSwgbm9kZSkgewogICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgIC8vICdodHRwOi8vJyArIG1bMV0gKyAobVsyXSA/IG1bMl0gKyAncGhvdG8vcmF3JyA6ICgobVszXXx8JycpICsgJ2wnKSkgKyBtWzRdLAogICAgICAgICAgICAgICAgICAgICAnaHR0cDovLycgKyBtWzFdICsgKG1bMl0gPyBtWzJdICsgJ3Bob3RvL3Bob3RvJyA6ICgobVszXXx8JycpICsgJ2wnKSkgKyBtWzRdCiAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICBub3RlOiAi5Lq65Lq65b2x6KeG55qE6LGG55Oj6ISa5pys6ZyA6KaB55So5YiwIgogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyDotK3niakKICAgICAgICAgICAge25hbWU6ICLmt5jlrp0iLAogICAgICAgICAgICAgcjogLygoPzppbWdcZFxkXC50YW9iYW9jZG58aW1nKD86W14uXSpcLj8pezEsMn0/XC5hbGljZG4pXC5jb21cLykoPzppbWdcL3x0cHNcL2h0dHA6XC9cL2ltZ1xkXGQrXC50YW9iYW9jZG5cLmNvbVwvKT8oKD86aW1nZXh0cmF8YmFvXC91cGxvYWRlZClcLy4rXC4oPzpqcGU/Z3xwbmd8Z2lmfGJtcCkpXy4rXC5qcGckLywKICAgICAgICAgICAgIHM6ICJodHRwOi8vJDEkMiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICJhbGkxIiwKICAgICAgICAgICAgIHI6IC8oLipcLmFsaWNkblwuY29tXC8uKj8pKCguanBnfC5wbmcpKFwufF8pXGQreFxkKy4qKVwuanBnKF9cLndlYnApPyQvLAogICAgICAgICAgICAgczogIiQxJDMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAiYWxpMiIsCiAgICAgICAgICAgICByOiAvKC4qXC5hbGljZG5cLmNvbVwvLio/KSgoXC58XylcZCt4XGQrLip8XC5zZWFyY2h8XC5zdW1tKVwuanBnKF9cLndlYnApPyQvLAogICAgICAgICAgICAgczogIiQxLmpwZyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICIx5Y+35bqXIiwKICAgICAgICAgICAgIHI6IC8oLipcLnlpaGFvZGlhbmltZ1wuY29tXC8uKilfXGQreFxkK1wuanBnJC8sCiAgICAgICAgICAgICBzOiAiJDEuanBnIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuS6rOS4nCIsCiAgICAgICAgICAgICByOiAvKC4qMzYwYnV5aW1nXC5jb21cLyluXGRcLy4rP1xfKC4qKS8sCiAgICAgICAgICAgICBzOiAiJDFpbWd6b25lLyQyIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuS6rOS4nDEiLAogICAgICAgICAgICAgcjogLyguKjM2MGJ1eWltZ1wuY29tXC8pblxkXC8oLiopLywKICAgICAgICAgICAgIHM6ICIkMW4wLyQyIgogICAgICAgICAgICB9LAogICAgICAgICAgICB7bmFtZTogIuS6rOS4nDIiLAogICAgICAgICAgICAgcjogLyguKjM2MGJ1eWltZ1wuY29tXC8uKilzXGQreFxkK18oLiopLywKICAgICAgICAgICAgIHM6ICIkMSQyIgogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyDnlLXlrZDkuaYKICAgICAgICAgICAge25hbWU6ICLlvZPlvZMiLAogICAgICAgICAgICAgZDogImRhbmdkYW5nLmNvbSIsCiAgICAgICAgICAgICByOiAvKC4qZGRpbWcuY25cLy4qPylfW2J3XV8oXGQrXC5qcGckKS8sCiAgICAgICAgICAgICBzOiAiJDFfZV8kMiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAge25hbWU6ICLlpJrnnIvpmIXor7siLAogICAgICAgICAgICAgZDogImR1b2thbi5jb20iLAogICAgICAgICAgICAgcjogLyhjb3Zlci5yZWFkLmR1b2thbi5jb20uKj9cLmpwZykhXHcrJC8sCiAgICAgICAgICAgICBzOiAiJDEiCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyDop4bpopHjgIHmlrDpl7sKICAgICAgICAgICAgLy8ge25hbWU6ICLkvJjphbfnlLXop4bliaciLAogICAgICAgICAgICAvLyAgZDogInlvdWt1LmNvbSIsCiAgICAgICAgICAgIC8vICByOiAid3d3XFwueW91a3VcXC5jb21cXC9zaG93X3BhZ2VcXC9pZF8uKlxcLmh0bWwiLAogICAgICAgICAgICAvLyAgcTogIi5iYXNlaW5mbyA+IC50aHVtYiA+IGltZyIsCiAgICAgICAgICAgIC8vICBleGFtcGxlOiAnaHR0cDovL3d3dy55b3VrdS5jb20vdl9vbGlzdC9jXzk3Lmh0bWwnLAogICAgICAgICAgICAvLyB9LAogICAgICAgICAgICB7bmFtZTogIuS6uuS6uuW9seinhiIsCiAgICAgICAgICAgICBkOiAieXlldHMuY29tIiwKICAgICAgICAgICAgIHI6ICJeKHJlc1xcLnl5ZXRzXFwuY29tLio/L2Z0cC8oPzphdHRhY2htZW50Lyk/XFxkKy9cXGQrKS9bbXNdXyguKikiLAogICAgICAgICAgICAgczogImh0dHA6Ly8kMS8kMiIKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIOiuuuWdmyBCQlMKICAgICAgICAgICAge25hbWU6ICJmaXJlZm94IOaJqeWxleS4reW/gyIsCiAgICAgICAgICAgICBkOiAiYWRkb25zLm1vemlsbGEub3JnIiwKICAgICAgICAgICAgIHI6ICJhZGRvbnMuY2RuLm1vemlsbGEubmV0L3VzZXItbWVkaWEvcHJldmlld3MvdGh1bWJzLyIsCiAgICAgICAgICAgICBzOiAiL3RodW1icy9mdWxsLyIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAiZmlyZWZveCDkuK3mlofnpL7ljLoiLAogICAgICAgICAgICAgZDogImZpcmVmb3gubmV0LmNuIiwKICAgICAgICAgICAgIHI6ICJ3d3cuZmlyZWZveC5uZXQuY24vYXR0YWNobWVudC90aHVtYi8iLAogICAgICAgICAgICAgczogInI7d3d3LmZpcmVmb3gubmV0LmNuL2F0dGFjaG1lbnQvIgogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8g6L2v5Lu2IFNvZnRXYXJlCiAgICAgICAgICAgIHtuYW1lOiAi6Z2e5Yeh6L2v5Lu256uZIiwKICAgICAgICAgICAgIGQ6ICJ3d3cuY3Jza3kuY29tIiwKICAgICAgICAgICAgIHI6IC9waWNcLmNyc2t5XC5jb20uKl9zXC5naWYkL2ksCiAgICAgICAgICAgICBzOiAnL19zLi8uLycsCiAgICAgICAgICAgICBleGFtcGxlOiAiaHR0cDovL3d3dy5jcnNreS5jb20vc29mdC81MzU3Lmh0bWwiLAogICAgICAgICAgICB9LAoKICAgICAgICAgICAge25hbWU6ICJ6b2wiLAogICAgICAgICAgICAgZDogImRldGFpbC56b2wuY29tLmNuIiwKICAgICAgICAgICAgIHI6IC8oXHcrXC56b2wtaW1nXC5jb21cLmNuXC9wcm9kdWN0XC9cZCspX1xkK3hcZCtcLyguKlwuanBnKS9pLAogICAgICAgICAgICAgczogIiQxLyQyIiwKICAgICAgICAgICAgIC8vIHM6ICIkMV84MDB4NjAwLyQyIiwKICAgICAgICAgICAgIGV4YW1wbGU6ICJodHRwOi8vZGV0YWlsLnpvbC5jb20uY24vMjQwLzIzOTg1Ny9waWMuc2h0bWwiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIOa4uOaIjyBHYW1lCiAgICAgICAgICAgIHtuYW1lOiAi5aSp5p6B572RIiwKICAgICAgICAgICAgIGQ6ICJnYW1lLnllc2t5LmNvbSIsCiAgICAgICAgICAgICByOiAvX1xkK3hcZCtcLihbYS16XSspJC9pLAogICAgICAgICAgICAgczogJ3I7LiQxJywKICAgICAgICAgICAgIGV4YW1wbGU6ICJodHRwOi8vZ2FtZS55ZXNreS5jb20vdHVwaWFuLzE2NS8zNzk2ODY2NS5zaHRtbCIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHtuYW1lOiAi6LaF57qn546p5a62IiwKICAgICAgICAgICAgIGQ6ICJkb3RhMi5zZ2FtZXIuY29tIiwKICAgICAgICAgICAgIHI6IC9cL3MoW15cLlwvXStcLlthLXpdKyQpL2ksCiAgICAgICAgICAgICBzOiAicjsvJDEiLAogICAgICAgICAgICAgZXhhbXBsZTogImh0dHA6Ly9kb3RhMi5zZ2FtZXIuY29tL2FsYnVtcy8yMDE0MDcvODI2M18zMzA4NjYuaHRtbCIsCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyDmvKvnlLsKICAgICAgICAgICAge25hbWU6ICJuaGVudGFpIiwKICAgICAgICAgICAgIGQ6ICJuaGVudGFpLm5ldCIsCiAgICAgICAgICAgICByOiAvXC8oXGQrKXQoXC5bYS16XSspJC9pLAogICAgICAgICAgICAgczogInI7LyQxJDIiLAogICAgICAgICAgICAgZXhhbXBsZTogImh0dHA6Ly9uaGVudGFpLm5ldC9nLzExMzQ3NS8iLAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gR2l0aHViQXZhdGFycwogICAgICAgICAgICB7bmFtZTogIkdpdGh1YkF2YXRhcnMiLAogICAgICAgICAgICAgZDogImdpdGh1Yi5jb20iLAogICAgICAgICAgICAgcjogLyhhdmF0YXJzXGQrXC5naXRodWJ1c2VyY29udGVudFwuY29tLiopXD8uKiQvaSwKICAgICAgICAgICAgIHM6ICIkMSIsCiAgICAgICAgICAgICBleGFtcGxlOiAiaHR0cHM6Ly9hdmF0YXJzMi5naXRodWJ1c2VyY29udGVudC5jb20vdS8zMjMzMjc1LyIsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKCiAgICAgICAgLy/lm77moIcKICAgICAgICBwcmVmcy5pY29ucz17CiAgICAgICAgICAgIGFjdHVhbDonZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCZ0FBQUFZQ0FJQUFBQnZGYXF2QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEyWnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU15MWpNREV4SURZMkxqRTBOVFkyTVN3Z01qQXhNaTh3TWk4d05pMHhORG8xTmpveU55QWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZRa0U1UmpBMFJEazJNemhGTWpFeFFUVTBSRUpHTkRSQ1FURkNPVU5FUlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvek9FRTBOMEZETVRORU5qZ3hNVVV5T1VRNFJFVTFNRGxGUkRZd05Ua3pPU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG96T0VFME4wRkRNRE5FTmpneE1VVXlPVVE0UkVVMU1EbEZSRFl3TlRrek9TSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1ExTTJJQ2hYYVc1a2IzZHpLU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2tWQ1FUbEdNRFJFT1RZek9FVXlNVEZCTlRSRVFrWTBORUpCTVVJNVEwUkZJaUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPa1ZDUVRsR01EUkVPVFl6T0VVeU1URkJOVFJFUWtZME5FSkJNVUk1UTBSRklpOCtJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQaUE4TDNKa1pqcFNSRVkrSUR3dmVEcDRiWEJ0WlhSaFBpQThQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCtudWhVVUFBQUFWRkpSRUZVZU5xMDFiR3FnbEFZQi9CdWlRMGhEVTI2YVRnWXRFUzc0QXM0aUcvZ1F6aUlieUFTdGd1Mk5oUXR2VUdrNkF1NE9UZzRxQ2prNXVsYzRsNnNhL2VDeC9zZkRwemp4dy85T0I5K0FBQUd2YVFYQ0NMRFFVLzVOMmkxV2wwdUYxRVVrWHEwV0N5S29naUNvQXZTaEU2bkU5d2Fob0hhYkVFUTRKcm5PV3FQcXFxQ0s4ZHhxUGRvdDl2QmJWbVdzOWtNcVVjTXcyUlpCazhjeDBHQ0h0OTFQQjdUTk5WMUhRbjZNOVBwRkJVYWo4ZjcvUjdXZTU1SFVWUjN5TElzOEpYcjlUb2FqYnBBNi9XNnJtdlFpS0lvWGFEeitReWVFMFVSaG1IdDBIdys5MzAvRE1QbGN0bFU0QXkrdk00anNpeTNRQVJCUU9KUmtTUUpUZFBmMEdhekFXMDVIQTR0a0dtYXpTTFhkWEVjL3h5aTRUQ080MWJvZHJ0TkpwTW5pQ1JKZVBwU3Aya2FmTVR6UEhnZlNaS2VJRlZWZnhiQkdXWlpkcnZkL2dMWnR0M3hacjhiRWF5dkg4bGRnQUVBanlTa1BmZnBUT3dBQUFBQVNVVk9SSzVDWUlJPScsCiAgICAgICAgICAgIGN1cnJlbnQ6J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQmdBQUFBWUNBSUFBQUJ2RmFxdkFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeUpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1YybHVaRzkzY3lraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk1rRkdNall4UWtRek9FRXdNVEZGTWtKQk16ZEVOekkwUWtWRU1qTTNOamdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TWtGR01qWXhRa1V6T0VFd01URkZNa0pCTXpkRU56STBRa1ZFTWpNM05qZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG95UVVZeU5qRkNRak00UVRBeE1VVXlRa0V6TjBRM01qUkNSVVF5TXpjMk9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEb3lRVVl5TmpGQ1F6TTRRVEF4TVVVeVFrRXpOMFEzTWpSQ1JVUXlNemMyT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BrWGZ3eTBBQUFEb1NVUkJWSGphWXZwUEpjREN3TURBeU1qSVFCa0FHc1RFUUNWQU5ZTlkwRnhJa21ia01HSEJJMGN3WEdqaU5ld0dmZnIwNmR5NWMxUXdpSmVYZC8vKy9kU0pOVWxKU1pMVEVpWWJ5UGo4K1ROSkdyRzdTRXRMYTkrK2ZYVjFkWlM2aUF5TnhFYi81TW1USVpuejVNbVRGTG5vMzc5LzhJeE9nb3ZPbmoxNysvWnQ1Q0JEVHZHaG9hRkV1UWlZaUNBMkt5b3FRc1FuVHB5SVhQUnMyTEFCaTBZMFBqRDVmUHYyRGE2bnBxYkczdDRlc3hnTERnNG1ZRkJGUlFXeWh1L2Z2MCtaTWdYVG9Qbno1Nk5wWkFSaG1QL0pMa2FnUlMwWlpRZ05TMGlxRnJXa0JnMVdBQkJnQU1WaU1GY1lxUldiQUFBQUFFbEZUa1N1UW1DQycsCiAgICAgICAgICAgIG1hZ25pZmllcjonZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCZ0FBQUFZQ0FJQUFBQnZGYXF2QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEyWnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU15MWpNREV4SURZMkxqRTBOVFkyTVN3Z01qQXhNaTh3TWk4d05pMHhORG8xTmpveU55QWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVUU1UmpBMFJEazJNemhGTWpFeFFUVTBSRUpHTkRSQ1FURkNPVU5FUlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvMk9UVkJNVUZET1RNNFFUTXhNVVV5UWpVM09FWTVNRFZGUXpBNU5EZzNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG8yT1RWQk1VRkRPRE00UVRNeE1VVXlRalUzT0VZNU1EVkZRekE1TkRnM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1ExTTJJQ2hYYVc1a2IzZHpLU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2tVNFJFRXlNVFZCUVRNek9FVXlNVEZCTlRSRVFrWTBORUpCTVVJNVEwUkZJaUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPa1U1UVRsR01EUkVPVFl6T0VVeU1URkJOVFJFUWtZME5FSkJNVUk1UTBSRklpOCtJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQaUE4TDNKa1pqcFNSRVkrSUR3dmVEcDRiWEJ0WlhSaFBpQThQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCtjOWR0UmdBQUFkcEpSRUZVZU5xc1ZTM0x3bEFVZGpJRmd4OWhDeUpEUlBFZktJcU1CZTJHTWJDWXpETWIvQk4rTkFXalJvdHRSc01RMWdXTHdXYXdxRUZoNzhNNzJhNTNINExzaG5GMzduT2VuZk9jYys0WTB6UWpvYXhRaUVBU3BVdzh6L2Q2dmVWeWVUd2VuODhubnRqREFuc3dGd015aG1Hc2wyYXpxYXJxNVhMUk5HMi8zNTlPcDN3K1g2bFVXcTBXeDNHVHlXUzczZnFtWmFjR0Z2aTMyMjFQS093NEJjYVA2QjBSSXAvTlpvdkZBdUg0QlMrS1lyZmJ6ZVZ5NlhUYXllZy9HeWNpcURDZno3RnBOQm9CUWdBRHBMdFFqdGhRQVpGVGJxdlZpcklBQTZUbk45NUVVQlRxa2dlMVdpMlR5VkJvWUlBTXFob3FuVWdrWHE4WFV0dnRkb2dGWlhvOEhyZmJEYUJPcDJPaFdaYUZNUmFMT1JwVEdxRmZpc1VpcVJFMm04MkcraXd3UUFacDVCbHpQQjZuTEc0RmFJM2NLaHFHMGUvM0JVRWdqWjQxK1FnUGZiUmVyOUYxQWVYSEtURGtySkNwMFowOUdBejhXSkRVNFhBQVh0ZDFOeEZyUTYwNUdvL0hwVkxKYzlaU3FWUzVYQWFtV3ExK3YwYXUxNnMxL2VmekdkMWdUMys5WGplSnBTaUtiMm9rYnpLWnRCd0toWUpsSDQxR0pCSEUrazZVeldidjk3dnRNeHdPSlVreVhVdVc1UzlFMEp0MFFDdFBwMU0zRWE0S2t1ampZdnZoNXJWSGhQVTgrR0ZGSXlFdE5xd2Z5WjhBQXdEc3VKZ3RHSUxCc1FBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgICAgICBnYWxsZXJ5OidkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQUlBQUFCdkZhcXZBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlKcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1TXkxak1ERXhJRFkyTGpFME5UWTJNU3dnTWpBeE1pOHdNaTh3TmkweE5EbzFOam95TnlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVOVE5pQW9WMmx1Wkc5M2N5a2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZNVEV3TURBd1JVSXpPRUV3TVRGRk1qaEVPRU01TmtWR09ETXdRa1V5UmpnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk1URXdNREF3UlVNek9FRXdNVEZGTWpoRU9FTTVOa1ZHT0RNd1FrVXlSamdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRveE1UQXdNREJGT1RNNFFUQXhNVVV5T0VRNFF6azJSVVk0TXpCQ1JUSkdPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG94TVRBd01EQkZRVE00UVRBeE1VVXlPRVE0UXprMlJVWTRNekJDUlRKR09DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdmJTYnY4QUFBRDhTVVJCVkhqYXJKVkJEa1F3RklaMTBxMERXTnE2aEVPSXUxaUlPd2g3VjNBQzFoWmN3QzFJMkhuVG1XYmVkTXFVVnYrRWxQWjkvdmVpcndRQUhDdXlBbUlRYW9ZamhFaHZxR0pPS3dscWxpWmZLWDZibm5xKzZJdmVLYi9vaTE2czVhbXZoMk5KS3RBMFRjTXdXQUM1cnR1MnJRVVFrK2Q1ZWx0a2YrZURlWjR2aHFzY0JVSFFORTJXWlhjZGFZVS90TXBSRkFXODFYWGRYMlNTSktlT3RtMkRqK1NFY01URmZPR2l2dS9IY1JSTEJvTGlPRDRBSVI1OXNaK0lCL2krejJmelBCZEJkVjJyUU9ocldSWjhUTk0wREVQWUtZcWlZNURrQzdXdWExbVdlMUJWVlFnaXIrdDNyeHUwM1cvUE51c2hjbU96Y3BBOEJSZ0FadlUvdVBhNlpma0FBQUFBU1VWT1JLNUNZSUk9JywKICAgICAgICAgICAgc2VhcmNoOidkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQU1BQUFEWHFjM0tBQUFBcUZCTVZFVUFBQUQvLy84S0NncS92Ny9Nek13RkJRWGo0K09UazVQOS9mMm1wcWFrcEtTVmxaV01qSXlKaVlrdUxpNHFLaW9rSkNRWkdSbjUrZm55OHZMZDNkM2MzTnpTMHRMT3pzN0R3OE83dTd1M3Q3ZDFkWFZ1Ym00T0RnNzE5ZlhuNStmYTJ0clcxdGJRME5ESnljbkd4c2F5c3JLYm01dVBqNDk2ZW5wNWVYazlQVDAzTnpjakl5TVdGaFlSRVJIMjl2YnE2dXFzckt5ZW5wNk9qbzVrWkdSQ1FrSXpNek1tSmliK3dZVXhBQUFBL1VsRVFWUW96NTNSNTI3Q1VBeUdZYjlKeUNJa2JNaGk3OVhkM3YrZDFaeW1BcUVpVlh4L2p1M25qM1VzM0lrZ2YrWWYwTXpUWHRmZUpEZGdOVHFZUEhtbmEyZ3RnSDRRRE01UDh3S3RHUXcvYWxydGJPZ2RmcUdtblhjZWk5WVJPRllGRzZqcnFFalRYRWR2MFBpQnd3aTdKdFlTd0ZiSmFNY0dJa2F4eUR0MEoxRG80aDFXQnJxRUl2SkNyN1JtMkZxdWNBMjR2R3EzWkNveVo2aWx4OWhBblk2dVhvQXpoNjB1LzB4b0lHbVRpVmhEVUN0RkF2eFBBeEtaQlU4Tlo3QStpdVJtZVFPV0E1RlUyVUsvckVDK1hNajJvb2tER0NlWFQweW00Qy9xbnQyR1NYejk3Y2ZReDhRUFd6ZUgycThkMXgxNHU2cDk2T1ozOGcyeXlRMWdJd2tYbGdBQUFBQkpSVTVFcmtKZ2dnPT0nLAoKICAgICAgICAgICAgcmV0cnk6J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeUpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1YybHVaRzkzY3lraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk16SXlNamhCUVRVek5qZERNVEZGTWtJM1FUaEJOVEF3UVVNeFJESkdSRU1pSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TXpJeU1qaEJRVFl6TmpkRE1URkZNa0kzUVRoQk5UQXdRVU14UkRKR1JFTWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG96TWpJeU9FRkJNek0yTjBNeE1VVXlRamRCT0VFMU1EQkJRekZFTWtaRVF5SWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEb3pNakl5T0VGQk5ETTJOME14TVVVeVFqZEJPRUUxTURCQlF6RkVNa1pFUXlJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BqOW1UTXNBQUFMQ1NVUkJWSGphZEZKTFNGUmhGRDczdjQrNWQrNGRtZ2trRWN4Rk9PbzRPUTkwRmdWSjJsaGloRms1b3pXS0d4ZUJCRVdGbUEvR3pGVkZ1MXhGUnJWckhiaUphR1ZxQ0RVWkVkS0FpMW1rUWpXdisrcjgxN2tYVy9oZnp2MWY1M3pmT2Y5M21OcmFXamhvTUlRQlFzaWlhWmpYRGNQNHMvOHVtODFhTXpIaDRJL25lSkJsT1NVcjhtZVdZOXRwZ0gxbkQyS3RiY1BCRWpZbUNNSWJTWlIrdTkxdTArUHhBRnFkb2lqdmVJRi95RENNc0M4ZU9OTTA3WFFGWkp5UzNOSzR5K1VpQ0FJY3h3SFA4M3ZBTEV2M04vTi84MTNGWWpHQlJ4a0hBT3NFVVJTZlNwSTBJcnRsUUNZckFOa2NKZ3BJOTZGd3FPNUsvMldQazRIMTQ3Z09USGxFa1JYZ2VBN0NrVEFrQnhMZ2IvQkQzNFZMUUZpc0ZJbVNBMGxJRGliZVk4aUdBMEJSYTJwcVpzdHEyWEpzYW1xRXFabkp0M2czZmVwRSs3TGlVVXpmWVIvY3VuMExvdEhJZEZza2xpNlh5N0MxdFZVQlFLbFVYVzJsWmFpcUNyMTl2YXR0MFZoM3FWU3kwZzRFQXpDVG50bXRyajdTSDJtSkxtbXFCdmE3MlJtd3hVSlJ3UG90QUovUGQ2ZFVMSUd1NjZBUkRSNC9lZlFKNzNwYm1rTlplclpmQVV2R3RmVlZRSWtBR3dVMFRZTUhjL001NmtoWktDQUdud3cySHMvcW1pNGgyU2htT29wendnRUlCY042dmI5ZXBjRVVaSE56YzlacUZRUXdkQU9hNmdNRmVvNE5kVmQwaVF1aUpDNmcvNWdEUU5uT2RaOWRvek45MEVLK2NCRlZXUUFHRGxWcUZWRFNDV1MraHoxQzVZYXhHMlA1L3dEaVhmSEpNL0ZPUjIrVWRCU2JhUmZYUHdXWFVFTFcrOWdiTE8yTm52TTkwTkY1T3UwOElrMnp1U0c0dExxK3NsaFZWVFgwNnVWcndDREEzcWRsSEtWWjBVQnFWNjhOUW1vNDlRejlQK1J5dWIwTzl2cThRQmdDMzM1c0NMaWZ5bnpKakM4K2YwRldQcTRBMVp0bTFOcldDa1BES1NQUUhKaEhuN1QvV0VONSs5ZDJCY0RyM1Z0VW1MNSt6OFJ3TzRFV1I1UFFDbWhMYUhQNG9NdTJRanM3TzFiY1B3RUdBRXJLRWNrcEI1S2lBQUFBQUVsRlRrU3VRbUNDJywKICAgICAgICAgICAgbG9hZGluZzonZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoR0FBWUFMTVBBQ2dvS09ucDZjbkp5YWFtcHBtWm1WaFlXR2RuWjNkM2Q0YUdoZ0VCQWRuWjJVTkRRL2IyOXIyOXZiR3hzZi8vL3lIL0MwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaC93dFlUVkFnUkdGMFlWaE5VRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1YybHVaRzkzY3lraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlFVVTVNVFpHTkRNeFEwRTRNVEZGTWtFMVEwTkVNVEZHT0RVME1rVXpOelVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UVVVNU1UWkdORFF4UTBFNE1URkZNa0UxUTBORU1URkdPRFUwTWtVek56VWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBCUlRreE5rWTBNVEZEUVRneE1VVXlRVFZEUTBReE1VWTROVFF5UlRNM05TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEJSVGt4TmtZME1qRkRRVGd4TVVVeVFUVkRRMFF4TVVZNE5UUXlSVE0zTlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSC8vdjM4Ky9yNStQZjI5ZlR6OHZIdzcrN3Q3T3ZxNmVqbjV1WGs0K0xoNE4vZTNkemIydG5ZMTliVjFOUFMwZERQenMzTXk4ckp5TWZHeGNURHdzSEF2NzY5dkx1NnViaTN0clcwczdLeHNLK3VyYXlycXFtb3A2YWxwS09pb2FDZm5wMmNtNXFabUplV2xaU1RrcEdRajQ2TmpJdUtpWWlIaG9XRWc0S0JnSDkrZlh4N2VubDRkM1oxZEhOeWNYQnZibTFzYTJwcGFHZG1aV1JqWW1GZ1gxNWRYRnRhV1ZoWFZsVlVVMUpSVUU5T1RVeExTa2xJUjBaRlJFTkNRVUEvUGowOE96bzVPRGMyTlRRek1qRXdMeTR0TENzcUtTZ25KaVVrSXlJaElCOGVIUndiR2hrWUZ4WVZGQk1TRVJBUERnME1Dd29KQ0FjR0JRUURBZ0VBQUNINUJBVUZBQThBTEFBQUFBQVlBQmdBQUFUTU1NbEpxNzEwR1FRQU1nQm1MWU1TS011aXJNUWlTb2Nabk9scUg2OGgwNnF0RkpoUG9tQVNFRG9Fd1FwWU1GUVdNMmZoRUpvQURreUJ3RFZ4TUJnQnA2aWdWQkFtMEM4RDhZcXRCRldEV2xIRkFCbzJNUUxNR0x3a0NGb0NiQWtBS1F0MUlvYUxFaDJPZjRXT1ZRVURCQU5pTDRFTkFqZ0pKQU9WaVJZQURvSkFoWmFncHhnR2dnMTFCcUF0THdXYmd4UUFCTE1haVFBR0xyVU5YR2d1SkE0RVZCNEREUTdBbUU4RER0SURIUTROMTgyMDBkSU8xZGZNcTNZSTBkU2tEUU1ja0kxTkhiK2k2dkFSQUNINUJBVUZBQThBTEFBQUFBQUJBQUVBQUFRQzhFVUFJZmtFQlFVQUR3QXNBUUFCQUJZQUZnQUFCSmJ3eVNrUG9ZdHE2Z0lMRXpoc21zZDhZUUNTNFlsSzZyb1ZtZUVwWTBnZEUwQVFOUVJMb2xCTURvTUJjRWlVakh6SlFZRkpVU3dXMFF0VlFDa29Cd2JxZzFBMFBnQm84U1NqM21ScWpqaFBMVkFJNDQ0Y3MxRU9EL0JoUXdkbFhBOEhjWHBEZFFwYUQwbE1jdzhDaFJKVEVnNE5pUTRDRFpZc21BME5EaElOazV5ZUc2QU5FNldUcTBNWm1LTVBwYTl0Y3dlb0ZCRUFJZmtFQlFVQUR3QXNBQUFBQUFFQUFRQUFCQUx3UlFBaCtRUUZCUUFQQUN3QkFBRUFGUUFWQUFBRWd2REorY0F5a2h6S0p6akVRQUJQd0FST054WGhJSkltYzZyUDByNmxmR0txTGZJRHhlN0JrN2draTBJSGdTbEtISTRCalJNSUdLR3BxYVJxZldDMUZLNEJ1d0dieitnT3FmRmdtd2tLaGFSQlB3czRkUGRaM201a3RYd1VXVW9xaEhFZEJRMENEZ2daRFlHRmlnSUNiZ0p4Q25jcUJwS1VFcFp4QWs0ZGlwV1lIUkVBSWZrRUJRVUFEd0FzQUFBQUFBRUFBUUFBQkFMd1JRQWgrUVFGQlFBUEFDd0JBQUVBRmdBV0FBQUVuL0RKS2NzMEM5QTlGeHJPOEFERVFCemNCanJoV0E2bWxUNXJTOExtd2hreStLQVBRNG1nZXlBNkxGbXFVQXdFWkloR3c2Rk1HUUlNQmtYYU1Nd2tpS3oyVWVDS3ZoS0ZHTlVBb3lVREJwYndya3VLOW9YdUlHZ0lqbllUQlFLRURuWk9BUkoraEVBekNJZ1BPZ2lFRFZVelRtY1BVaktORTRBek1nSUtiUk1DRHdvU0JwMmxDcTJtQzZocGFLS3VrYkYyQktJQ2VyRkVkUXNHZ0o4Y0VRQWgrUVFGQlFBUEFDd0FBQUFBQVFBQkFBQUVBdkJGQUNINUJBVUZBQThBTEFFQUFRQVdBQllBQUFTVThNazV6eXcwYTllY0hNNkFBQnJGTmQzbnJFTXBGV2Y2Z0t6N2VxMTBnUG1DVGFpSndiWWdFRWdTZ2FCaGt4UUhBOHVqb1JRMEh3VW9sRlQxWEFuYWdvVjZsUmdHNEdFNUEyaFRrR3VLUXZFZ2xBZU1BTU0rVnpDdkNneUNVbjFsZ25rVGMxWk5Cbm9NWGc5S1YwT05BUlJxRHdvQkFuWVNtZytZSlhRQkFYUVNwSmFoR1orbEU2aW1UWFFLU0sxcmNHWXVFUUFoK1FRRkJRQVBBQ3dBQUFBQUFRQUJBQUFFQXZCRkFDSDVCQVVGQUE4QUxBRUFBUUFXQUJZQUFBU1Y4TWxKNWFtWWtpYWFkSTN6TEpsa2NFTDNOYXhZUHFqNmdPMHJjUTVDaFVXV1NqMk1ZVElZa0I0RWhVSmdrd3djT1lsQXFiallvSzRIMWRPY1FhVk1RdmZnZUVwSXgyNWx3VlkvQVBDSFRxczJEQWlENFlUWnhCZEpmSEkyQlVWM0FFZ1NDazBMZmxZa2loSnpHWXdFaHhWNkZBTVBEQUZuUVJSRG5XY1BBUXltb2hsV29pU2xwZzlXSlpxZHJBd1BtbDFwVFJFQUlma0VCUVVBRHdBc0FBQUFBQUVBQVFBQUJBTHdSUUFoK1FRRkJRQVBBQ3dCQUFFQUZnQVdBQUFFaS9ESktRMmlPRk9oaEd4Q28yR2MwbjFDMmhqalU1NFBxQmJaTVhHaWhEamh4RTZtbG9UMmNEZ0FHSVZRNG1qa0hzcGx4ZGx3UEg1U3lZQXFNVVd6VnBzRW1TMmJ5d2ZId0dvSXVMOUNvNE9tY0FlazhzSEVuVjFiZ1ZlQkdRVUxXbm9VUHdFTUNvY0dCQU1FaFMyS0RBeDNBSThEa0pJYWxKWVBtSnFiY1lxWGp3UUdaRXNIQkVPY0dCRUFJZmtFQlFVQUR3QXNBQUFBQUFFQUFRQUFCQUx3UlFBaCtRUUZCUUFQQUN3QkFBRUFGZ0FXQUFBRWsvREpTU1V5TmMraG5scVBvQWlFTmgyZGxJckthS3JURjdhdWhubGhLVFYxWVV1SFRQQlJhRFJBajBFZzhKb1VCUUxLa3RrTVFSdVNhYlRxZ0VZUjFLcEYwTmhLa09LMG1oRmdETlNPUjVCQlR3K01XQW1kVVRYZ04zUUJOeThPUmdoU1p6NFZndzV4SjJjRUF3UTNCd01PYnk4TGtRT1NBRW1ObHk4Rm01eWVsbzBEaWhvQUI1RUVwcGREVlFBTE40TVpFUUFoK1FRRkJRQVBBQ3dBQUFBQUFRQUJBQUFFQXZCRkFEcz0nLAogICAgICAgICAgICBsb2FkaW5nQ2FuY2xlOidkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQVlBQUFEZ2R6MzRBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlKcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1TXkxak1ERXhJRFkyTGpFME5UWTJNU3dnTWpBeE1pOHdNaTh3TmkweE5EbzFOam95TnlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVOVE5pQW9WMmx1Wkc5M2N5a2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZNekJGTWpZelJUVXhRMEl3TVRGRk1rRTVSa1JETURGR05VWTNOVEEyT1RZaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk16QkZNall6UlRZeFEwSXdNVEZGTWtFNVJrUkRNREZHTlVZM05UQTJPVFlpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvek1FVXlOak5GTXpGRFFqQXhNVVV5UVRsR1JFTXdNVVkxUmpjMU1EWTVOaUlnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG96TUVVeU5qTkZOREZEUWpBeE1VVXlRVGxHUkVNd01VWTFSamMxTURZNU5pSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbUkyWGZzQUFBRHFTVVJCVkhqYTdGVExEWU13REkxcHV3UXI1TUNKS1pDeUIzY2tsc2c5R3pBQUVqQUVlekJGaFJ0SElTci9UOVZEMVZneUpQNjhaenNCUUVUMlRRRlA4TWNFYVpvR0o3RjZwZFRNZU45S2FOdjJuUjNpT0RZTGJhZVg4Mms3bk82ZzY3b1JpQkNDNlZnREJBQllsdVVJaHg1aEdNNXc5c2JnS3JPQVJMZ0lmcldEUVhDdmdMVU9WZ21pS0dKMkhFYXJxaG9GSmtsaWNvZDh6amtyaXVMMGlMWTZPSFMvanhDZ3JuNW10RGI4bEFEcnVuYWJQTThmcE1QZSt2QVNBYzIwYVpycGdUNnR1c09sR0lwZGs2MFBMY2l5N0VZTEtXVy9kSU8wUDVnVTJ2dS9xU2Y0UVlLWEFBTUFKNXFCRSs1UFBhVUFBQUFBU1VWT1JLNUNZSUk9JywKCiAgICAgICAgICAgIGhhbmQ6J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQmdBQUFBWUNBSUFBQUJ2RmFxdkFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeUpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1YybHVaRzkzY3lraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlFqSTNPRUpFUWtZeFEwVTNNVEZGTWpnNU5EWkZOekpCTVRjNVJUQkJNek1pSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UWpJM09FSkVRekF4UTBVM01URkZNamc1TkRaRk56SkJNVGM1UlRCQk16TWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBDTWpjNFFrUkNSREZEUlRjeE1VVXlPRGswTmtVM01rRXhOemxGTUVFek15SWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcENNamM0UWtSQ1JURkRSVGN4TVVVeU9EazBOa1UzTWtFeE56bEZNRUV6TXlJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BqRUw1S1FBQUFIQlNVUkJWSGphNUZSTnl3RmhGR1Zta005RUVhV1FFaWsxRnF3cy9BV0puMkRsLzhoYUtUc1cvQU5samFRc2xMTHdrYTk4TmpOT3B2VGtmZWFkVVhvMzcxazgzYm5kT1hQdXVmY1pmVDZmMTMwRGpPNUwrRU9pMFdnMEdBeFV5emhxZGo2Zlg2L1hZRERJc215dFZsc3NGbzFHNDN3K3oyWXpoOFBoOS91MUtzcGtNc1ZpVVJSRitkSG44K0cwV0N6VmFyVlFLSHlncUZRcUNZSXdIbytQeCtNckdZMUdjVHFkemc4ODJtdzJPTVBoTU9oZVNidmRUdlkrblU3VmlXQ0tKRW14V094ME9rbFByTmRydENiSHQ5c3RuVTZYeTJWMW90MXVCNE84WHEvYjdSYWZRRWZKWkJMQi9YNC9IQTVZWTdQWlRMN0N4dU54T2RwdXQ1ZzBKTmhzTnFQUkdJbEU4UEZVS2lXcmdBUTVRTmNlanljUUNHQ3NxS2NROFR4ZnFWU3NWbXUvMzBkMU5wdVZhSEM1WEdBeG1VeXRWZ3RmcFV4dHVWeHlISWZCSnhLSmVyMiszKzloaXRMNllhRlFUMjhOOUF6RGhFSWhHQUYxbDh2RllEQlFSV0ZMdTkwdUtlZDlqM3E5SGt3RkY0cmdKVGw3RWhDN1dxMVU5cWpUNlVBekxCQ1ZJVytaK2tJMm0wMU1FSUdnQUsxRVFMdmRGcFR4WnZOdlJQQm9PQnhTKzhJUWNEKzBYbHBnTXBua2NybWZlZklhazlELzUzKzJSandFR0FBbGtIaFdIZXY5L1FBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgICAgICByb3RhdGU6J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQmdBQUFBWUNBSUFBQUJ2RmFxdkFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeUpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1YybHVaRzkzY3lraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlJqTTJNMFV5UlRjeFEwVTNNVEZGTWpneFJETkVRa000TjBRM05UZzJRa01pSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UmpNMk0wVXlSVGd4UTBVM01URkZNamd4UkRORVFrTTROMFEzTlRnMlFrTWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBHTXpZelJUSkZOVEZEUlRjeE1VVXlPREZFTTBSQ1F6ZzNSRGMxT0RaQ1F5SWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEdNell6UlRKRk5qRkRSVGN4TVVVeU9ERkVNMFJDUXpnM1JEYzFPRFpDUXlJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BsWDc3OWdBQUFKWFNVUkJWSGphM0pRNWE2cFJFSWJ6cWJpZ29xQmVOeUkycGdoRUFuWmlKWloyL2dNTFFaQmdvWVVFWElKZ1l5RCtnWWhZeGNKR3RES1FINkNJSW1LaHVJQUdGSEhmbDl5WHlQVjZEWm9VS1M2WllqaEh6enhuNXAwNUgyRXdHTTYrdzBobjMyVC9INGh5N0kvUmFOVHBkQ2FUQ1lWQ1dhMVc2L1g2MTd2VmFqVjRCb1B4T1FneDFXcFZvVkNZeldhNVhENmZ6MmswR241OGZIeE1KcE1taytuNStSbGJNcG04SDBVY2RBMG42dlg2N2UydFFDQ0l4K09sVXFsUUtGeGVYbDVmWCt0ME91UW9rVWlBdHR2dGZENS9uM1dvMFhBNDlIcTlyNit2Z1VBQUZLU0dMWHc2blFhZHkrV2lXRngyYzNPRCswNWxwTmZyWjdNWlNzQWE4UjZQaDBxbExoWUx2OTkvZDNmSDRYQjJKL3Y5UGk0N0N0cFpMcGZUYXJWaXNWaWxVa0Vqc0Z3dUZ5VDdhdnN6bVV5cjFjTENhclV1bDh0c05udC9mNDh0OGtKMnlQR3JJSWZEZ1Jnc05Cb04ydXgydTVWS1pUNmZoM2FRMXVsMEhtTWRnbGdzbHNWaTJTYTFOUWo4OVBRVWlVUXdUU1FTQ1pKWEtwWFBRZWdGaENBSVlyUFpOSnROZU9UaTgvbDRQTjc2M2NCQzFoOVpwSDExR28wR1dvNmJVUUs4MFdpRVB6OC9aN1BaMEd2OXg4QjZlSGc0Q3JMWmJFd204K1hsQlk4QUJTS0FUcWZEcTlWcWVJemZEaVFVQ2tPaDBORW5nbXZSbDBRaTBXNjNSU0xSd2JsdXR3c0VGbEtwTkJnTTlucTlnd05ralA5MmhYYklaTEtycXlzOGpzMi9WaXdXMzk3ZW9Eb295QVdqZUVwc0RIUTBHc1VMV0gwdzVJaFJPRUU1N0JwWXNWanNJd2p0dTdpNENJZkRnOEhnMkVEK0xXMXI0L0VZZzRkbTcrcEtwVkxsY2hralBwMU9UM3pZaUovNzhmOHR3QUJGVDVHNVlmK2E1UUFBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgICAgIHpvb206J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQmdBQUFBWUNBSUFBQUJ2RmFxdkFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeUpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1YybHVaRzkzY3lraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk16STJOREZFTnpFeFEwTkJNVEZGTWpoRE9VTkdRME5ET1RZek9ESTRSRVVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TXpJMk5ERkVOekl4UTBOQk1URkZNamhET1VOR1EwTkRPVFl6T0RJNFJFVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG96TWpZME1VUTJSakZEUTBFeE1VVXlPRU01UTBaRFEwTTVOak00TWpoRVJTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEb3pNalkwTVVRM01ERkRRMEV4TVVVeU9FTTVRMFpEUTBNNU5qTTRNamhFUlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BqVVh0c1VBQUFIVFNVUkJWSGphekpUSGFrSlJFSVp6YzYzWVMyeFlzS3gwNWNZWEVId0JmUWIzUHBnYndSZHc2MG9YdG9Xb1dCQUw5aTdtUXlHRVJNTk5XZVJmWEE0em5PL00vR2Z1RVpMSjVOTmY2UG5wai9UL1FMSzcwY1BoTUJnTWxzc2xDNFZDb2RQcG5FNG5pKytCVnFzVmlGUXFGUWdFakViamJEWnJOcHU1WEE2Y1ZxdDlCQkxENGZDSFd1UnllU2FUNGZ4T3AxT3YxN2ZicmR2dFRpUVNwVkxwZERxSm9pakpvLzErbjA2blFUUWFqY3ZsUWtYbjg3bGFyYlphTGVKa3Bab2RqOGZwcGQvdjA0VWdDRkQ0NnZYNlhxODNuVTdKU2dYNS9YNG9hcldhd3lGT0pwUDVmTDdiN1RRYURYR3lVczJtRjd5Z0tUYWZyeUtJVFNxVml0S2kwYWpVaXFqQ1pESmg2b2Y0OFhna1RsWXFhRFFhY1VjYy9ueVZlTlZ0N2ZWNnkrVXlsVW9DRll0RnM5bk1CTUVTM3lrWUROcHNOcGZMMWUxMjc3THV6TkZ3T0l6RllsYXJGWVBva1VVa0VnbUZRdXYxK3VXcVFxSEFuY3Brc3E5QWFMRllNRVJzOEhnOFpObkQzZEdhd1dEZ0dJZkRZYmZiUDdNRTZlOFJQdzMweldiREdyT3kyYXpQNTNzYjlEc1ZQVktsVXVFZStPUHdpSDZ4a2dqejlXMFFxdFZxc0dqcXhyck42Zy9mSTU2QjhYaHNzVmdZM2JkeUhyNUhYeXVmeitPT1VxbmtCL3dWQ0xYYjdYLy9acjhLTUFEU0J1NnNBWml6T3dBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgICAgICBmbGlwVmVydGljYWw6J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQmdBQUFBWUNBSUFBQUJ2RmFxdkFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeUpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1YybHVaRzkzY3lraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk16YzVSa00zTnpZeFEwWTBNVEZGTWtGR1F6azROekZETXpjNE1UVkJNVElpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TXpjNVJrTTNOemN4UTBZME1URkZNa0ZHUXprNE56RkRNemM0TVRWQk1USWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG96TnpsR1F6YzNOREZEUmpReE1VVXlRVVpET1RnM01VTXpOemd4TlVFeE1pSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEb3pOemxHUXpjM05URkRSalF4TVVVeVFVWkRPVGczTVVNek56Z3hOVUV4TWlJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BvV0dnL01BQUFGQ1NVUkJWSGphM0pUTmJvTXdETWZ0YVZ5S1ZscllDVTY4QWUvQ2kvTVFFMUpSQ3VvazFnTkNudU1FeGdRRUpuR2FVYUlBOFM5L2Z3RG1lUTVIMkFzY1pJZUJYcWMzWGRlMWJjdnpwcHZuZWI3djg3d01TcElranVPZEVzcXlyS3BxR2NTVW9pZ1FrUFFnUXVRWmtOOGdrS3owSlV1QUxNdFdRV3hCRU95UlErNGNzWVhYVUNUb3ZZUjZJR28zbEhzWUZSSnRnS0wzU1Bib29TTUQ4VFBCb0R4R09ZZW83M3NuS0FyRkdhMno0QXhKcE9FbzdYYXJYS0FyaHphYzdUS0VEZERiK1F3LzlUR3gyQUZEZXNBRzdNeVJmenF0VkFuLzBObHNYODhuNkJ6SWhOTmlHeUdtcytaRm00RStINDk1T3JZU3RnU3E2OFkwcjlRS3g4c0NMZEgwbGhOMHI1WGVSeFlDUTNicGw3Z0ZrVE9RdW9OdE9yUWxJM0hUZVpsOGJRQ1g0T0lDTlUyejgrdDNnWlJTYVpydUJQSG1WZENIMkgvNVp4OEcraFpnQUpjYW1xQjNHME43QUFBQUFFbEZUa1N1UW1DQycsCiAgICAgICAgICAgIGZsaXBIb3Jpem9udGFsOidkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJnQUFBQVlDQUlBQUFCdkZhcXZBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlKcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1TXkxak1ERXhJRFkyTGpFME5UWTJNU3dnTWpBeE1pOHdNaTh3TmkweE5EbzFOam95TnlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVOVE5pQW9WMmx1Wkc5M2N5a2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZOVVZCUkRSRE9Ua3hRMFkwTVRGRk1rSTBPVVU1TlRoRVF6STROVEZHTkRNaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk5VVkJSRFJET1VFeFEwWTBNVEZGTWtJME9VVTVOVGhFUXpJNE5URkdORE1pUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvMVJVRkVORU01TnpGRFJqUXhNVVV5UWpRNVJUazFPRVJETWpnMU1VWTBNeUlnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG8xUlVGRU5FTTVPREZEUmpReE1VVXlRalE1UlRrMU9FUkRNamcxTVVZME15SXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9Qbmw5MnN3QUFBRktTVVJCVkhqYTNKVEpqb013RElieHFCdzZTS1ZBVDNEaURYZ1gzbDljUmtoRkxLSWpla0hJazlnSm9YUWhCMDdqSUxQRlgzN2JBY2p6M05uRHZweWRiRGZRWVhremp1TXdETUp2aHJtdTYzbWU4SzlCU1pMRWNXd3BvU3pMcXFwZWd3U2xLSW9nQ0tKTEZJV1hNQXhPdnY5OVBBNzMrKy90MW5WdDA3Uk4zYlJkMi9kOWxtVkwwTHNhZ1Joa1NBNzVTcDdoNGZVbkVJaFpLa2hQcHpoeXFQQmcxVFZBTWNCRU1KblJqQUpFQ3hCS2tsb1VsbytGV0xrRzhTMVNVOHNEUGpEbU0ydTBVd1NjbkpGRFVDRUhxSUlycFI5cWhISUFlWjJUZmo0cnNVcHRsWlc2UldTazJSQWJJRncySG8ybnhGU04wRTRSelVlOXFVeGlZUFRaMUFnY2s1cnFEaGRib29DMWdHTlpiTjdKV3BGT0VGYnBiOVZJQlpuTnJMQ3lqNktaVDR6bnI3K3U2elJOeGNVMFRkZXF1aTQrN3RuODgxa2NQUGt0Nklmc3YveXpkd1A5Q1RBQXpEZWRXenNzNFNnQUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgICAgICBjbG9zZTonZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDNEFBQUFSQ0FJQUFBQXQ5d2tZQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5SnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU15MWpNREV4SURZMkxqRTBOVFkyTVN3Z01qQXhNaTh3TWk4d05pMHhORG8xTmpveU55QWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTlROaUFvVjJsdVpHOTNjeWtpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBJM056QTFSREF4UTBZM01URkZNa0pHTVRVNE1UYzRPRVEyTjBNelFqa2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMEkzTnpBMVJERXhRMFkzTVRGRk1rSkdNVFU0TVRjNE9FUTJOME16UWpraVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERRamMzTURWRFJURkRSamN4TVVVeVFrWXhOVGd4TnpnNFJEWTNRek5DT1NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFFqYzNNRFZEUmpGRFJqY3hNVVV5UWtZeE5UZ3hOemc0UkRZM1F6TkNPU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG1VVzFvd0FBQURxU1VSQlZIamE1Rld4Q29Rd0RMMlcreDRYL1FtSHVqdlh6VjBYYWRITjMxSFVuMmdSL0tEMkFnV1JBeXRFVHBUTEVGNWVTZnFhYUV2eVBIL2R3OTdXMnJ0SU1jWTh1eXRLS1FlaUtQS1RQNWZTZFowRFNaS0VZUWhBYTcyU2RWMGphcElzeTNEOVhQZGpqSUh2Kzk2RlVrcFBGcVYwVndybkhEM2RwbW0rR0NIRXdkRUoyVlZwVGxoVlZkdGFFQjZtMkgyajlvVE44N3lWQXVGaGlrY2x2aXV3OFRBTVd5a1FBb251Q3ZKZVdaWmxtaWFIeTdJRTM3WXQrSEVjNHpnT2dnQlJFem1nVlVkUkZJNEI0QmhZd2cySXBHbDY1WlhxK1ptdmZvTTgzOE1mUDRmUEdOQkhnQUVBaTdneXV2SHVoWmNBQUFBQVNVVk9SSzVDWUlJPScsCiAgICAgICAgICAgIHNlYXJjaEJ0bjonZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDNEFBQUFSQkFNQUFBQlF1NE44QUFBQUdGQk1WRVZuWjJkWVdGaGZYMTlxYW1wVVZGVGw1ZVZqWTJOYlcxdWEwRDl3QUFBQWFVbEVRVlFZMDNXS3dRMkFJQkFFL1ZpQUR4c2dzUUpic0FBMEdhZ0FPeUMyN3owTzF3Zk1KWnZzN0UxN242RVhNMUhscitrT1JKdFViNmRnUVdwVlBoVlNrUThPWWVPeWRPVDluT0gvNDlSY3lUVzNLbzhGOGt1RGMxbjVtdndLTnNsck1DMS85Qm41RnhxcFVUaFlRTEV1QUFBQUFFbEZUa1N1UW1DQycsCiAgICAgICAgICAgIHJvdGF0ZUluZGljYXRvckJHOidkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUxvQUFBQzVDQVlBQUFDZm1pVmZBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTJacFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1TXkxak1ERXhJRFkyTGpFME5UWTJNU3dnTWpBeE1pOHdNaTh3TmkweE5EbzFOam95TnlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvd05EUXpSRGxDTmpFNE1qUkZNakV4UVRsRE5qaENRVGxCT1RZeU5VVkdNeUlnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBHUkRFek9FRXpRVEkwTWpBeE1VVXlPVFJHUkVFMk5qa3lRamRCUkVRNU9DSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEdSREV6T0VFek9USTBNakF4TVVVeU9UUkdSRUUyTmpreVFqZEJSRVE1T0NJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTFNMklDaFhhVzVrYjNkektTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPak13T1RJMU9UTkJNVVV5TkVVeU1URkJPVU0yT0VKQk9VRTVOakkxUlVZeklpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09qQTBORE5FT1VJMk1UZ3lORVV5TVRGQk9VTTJPRUpCT1VFNU5qSTFSVVl6SWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K1Ezbmk3Z0FBR2FoSlJFRlVlTnJzWFF0WVZPVzZYak1EQXdnSUNxZ3dYQXhKYUt1Wmw5Qk04MUgzVTlwUmkrNWFaRm01TzZmYzVUbTZQV1VYZDFtN2pwVzFzNTVxRzJyYjdiYWRtblk1YVJlUGw4b2JpYUtpS0l4eUZ3UVJHQmhnaHVGOEgvT3ZXb3pETVBkWmwrOTludStCTmN6QVlxMTNmZXY5M3YvNy94VzBhdFVxanVBWFJFS29JQm9YTFZvVWhDL0FzVGZUWWZFTWNDeWRlcCthRHBYZmtBQ1J6TDRQaGVoRGg4Ui9JS0w3bCtoSjdQc1FSbmFDbnhCRWg4QnYwQW15ZUJnbEdTSzZuRE42cEVDNjBMRW5vc3VXNk5FQzZSSk1oNFNJTGxlaXh3b3llZ2dkRWlwRzVhclIrN0xva2k2OHpVZ2dvc3NGTVh3R054Z01xZkJGdzE0bmk1R0lMcnRzM2dXVHlaUXFlSjBzUmlLNjdQUzV0U2dLQ2tvUnZCNUdoNGFJTGt1aXE5WHFKQ0k2RVYzMjBnVXllZ0pKRnlLNjdETjZjSEJ3dk9CMUtrYUo2UExNNkNCZHdwT1NrbmlDazhWSVJKY04wRW9jS0h3aFBUMDlsckk2RVYxdUdNajk1cHQzSVQ0K1BvNTBPaEZkdHZxY1I3OSsvWVFablp3WElycTg5RG1QeU1oSUlqb1JYZjRaUFN3c2pLUUxFVjMrR1QwME5KU0tVU0s2L0RPNlJxUHBReFlqRVYxdWlMZjNJbG1NUkhRNUFWdHo0K3l5bnl4R0lycWNaUXNQc2hpSjZMS1hMUWl5R0lub2NrSmlUejhnaTVHSXJvaU1UaFlqRVYxTzBQWDBBN0lZaWVpS0lEcUNMRVlpdXV5bFM5Y1B5V0lrb3NzQXVQeGNYMGR2SUl1UmlDNEhKUFI2SlpERlNFUlhBdEZ0TEVZaU9oRmRra2pzN1EwMkZpTVJuWWd1djBJVVFSWWpFVjBSMGdWQkZpTVJYZXJRT1pYMnlXSWtvaXNobzVQRlNFU1hNcEM4VGkzMFR4WWpFVjMyMmJ5TDJXUXhFdEdWUUhTeUdJbm9paUE2V1l4RWRDbEQ1OHFieVdJa29zcytveVBJWWlTaTk0UXBIT3NNaEZ0OWpBaHY5eTVsZEFsWWpGRVFON0hqSFF6Um40anVIK1JCdkE4eEFhSVI0bG9SSGZ3cmxvbnVEU0szR0pIZ2Y4Vmpqa2tGdmc1bng1eUk3Z2RjaHZnYnhEdXJWcTFhUEhMa3lHbzhBWEFpcm9ZSTlQOTB4VExSdlVHa0ZtTUV4SEtJTjFwYlcxZkRjY1hlbmQ5QjZPR1ltNG5vL3NNZWlLOGg3bnpvb1lmZXUvZmVlM0dpQTU2TU1YQlMra3BGbjNlSmN2RlpqT01nUG9XWTJkTFNzdW1aWjU1UndmZURJTXFBNUEyazBmMlB0eUJxSUJMSGp4Ly80dUxGaTZlSGg0ZGpKaG9KWkw4cVFObGQ1K29IUkdReDRqNDhDN0VhNzB4dGJXMzZGU3RXSEdFRmNoTkVLUldqZ1FGcXhaY2hPdkYvMGVsME55OWJ0bXpScEVtVE1LdmlZdzZ2QTlLRWl6MmpJekl5TXVKc0NPZHZqSWJZQkhFSGhNcGlzYlJ0M3J6NVU2UFJhSUZ0bENxbkladGJpT2lCdzM2SXp3VjZOeUVySzJ2UkUwODhNVldyMWFLY0dRVmtUNEpRaVRXakl3WU5HaVNVTC82MEdMRW41ejhoUGhCZXBDZE9uTmlXbTV0N2tXMmlMamRLbVNSeThkSGZocWprTjFRcVZWQmFXdHJNNTU5Ly9zbFJvMFpocHJ5S09UUCswTDl1WmZRQVdZd2pJUDRCTVZmSWhmcjYrdnkxYTljZVpKdTFRUElMVWllSVhJamVBdkZuSm1GK3N3MGlJcTU2NElFSGxqenl5Q1BqMVdvMWVzR2ptWHZnUzdqMSsvMXNNV29oRmtKOERERlkrQU9UeWRTd2J0MjZmN0hOTm9pemNpQ0luRVpHZjJFYXMvcy9xRlpyaHc4ZmZzOExMN3l3WU9qUW9kSHdFbHFRYUVWcWZTUUQ0dHo1b0I4dHhuU0l2MFBNczNQK08vZnQyN2V4dExTMGhXMFhRalkzRWRIRmg5VTlPUU5SVVZFWkN4WXNXRHAzN3R6cllCTUhsOFlDMmVPOC9QY1QzUDJnSHl4RzlQWWZnMWdQTWNUZUc4ckx5L2Q4K2VXWGZBWXZCNUpmbGdzeDVFWjB2TlV1aDdEckRxQ05kLzMxMXorNGJObXk3S1NrSlBUYXJ3R3laM2pSem5PYjZENjJHSWN3Z3Y4QmY3ZTlOeGlOeG9vUFAvendmOW1tQWVLOG5JZ2h4NmF1ZkhacjdoR3hzYkdqRmk1YytLZXNyS3dNMkJ6QVdRZVp2TkZDb1BQa3d6NndHTlZNb3VEeHlPanBUUmFMeFFTWmZJUEJZRUFic1lPVHVKV29GS0lqUG9Rb2R2U0c0T0RndmpmZGROTmpTNWN1dlNzbUpnWnRTRyswRUhoVTZIclpZa3lHV01PS1RvZjFTR0ZoNFpmNzkrK3ZacHZuZ09RdGNpT0VYSW5lRHZFaVp4M29jQVFWa0d2Q0VzQXR0OXd5bVBPOGhjQ2pqTzRsaXhIUDZYMFFHeUd1N2UzTmx5OWZMbGl6WnMyUGJMTU9TRjRwUjBMSXVSLzlORVNPVTFaSlNFZ01FUDFKSVBoTUQxc0lQQ0s2Rnl4R3JCRnc0R2V4TTNjRXM5bmN0R0hEaGswZ1hmamtjRmF1WkpEN3hJc2NSdmhlb1ZLcDFNbkp5Vk5aQ3dFUzFwMFdBbytraXdjV0k0NzY0dEE5MnF1am5meE01OEdEQno4dExpNDJzTzB6a00zYmllalNoSmxKbUhZWHlJWXRCRSs3MkVLQUJlMUtycGRsb251RG14WWovdTEzT0dzemx0TUZiRlZWMWMrYk4yOHVZSnVWUVBKTGNpYUNDdjVCVGdHWXg0b3lsMkF3R001dDNicDFZMTVlWGgxc05yQ3NaOXZ6Y1NmRUh5RzgwanpXMXRaV1UxdGJld29LeEpNN2QrNDgwZDdlWGdzdkl3a2I0RzkzMnJ4OUpzUi9jZGExMkoxR2EydHI5ZXV2di80bTZITk1CTTBRZVZKMVdTQUJFZEZ0N2x3NDNEM0MxUStDZm0wdktDall2bmJ0MnYzd1BWcHYyT0JVeFZsSFFaZEIzT3FyblRhWlRJMlFlWFAzN2R0M01EYzN0NXl6dGlSZmdMK1AyZjQ1amsxdmN3V2RuWjBkMjdadGUzdnYzcjBWbkhXOEFVbmVMTlVUNnl6Uk5kT25UMWNDMFRFVDR2UzcyN2tlQmt3Y2FIZk5nQUVEaG8wZlB6Nmxzckt5cUs2dUxnS3k3Y0RNek15WDRHYzMrbktuTlJwTlNGUlUxRlVqUm95WU9HN2N1Q1NRTnAzd2R5ZkV4OGN2aDc4OTFKM2ZlZmJzMmErMmJObHluRzJpbFZnbjVSTUxkejBpdWcxUWVxRHNtT0N1Zmg0OWV2UzR1TGk0UzVNblQvNjM4UER3YS8yMTQwQnFGZFFPQTlQUzBzYnBkTHJyWURQRW5kL1QyTmg0NXMwMzM5d01XUjAzTHdQSkplK3lPRXQwcFMyV2c2N0VGQmVjQ2RzTTIyZnMyTEVQOWlJTkxNM056U1dRK1l0QWExZlYxOWVmQnkxY1pqUWE2NDhjT1ZJN1o4NmM0TlRVVkcxc2JHd1VTSlBCUU5xcklVYXExZXJoOEZYcnEzKzhvNk9qNVo4QVppV2FuWFdqNUFLbEVSMVQyWEpHZUsvTjRnRnlkMEsyUEZ0Y1hId1lNc3p4bXBvYUhHWEV3QUdZRHY1OTJkblp3bzlWQndjSG40R3YzL0kzRFhZUm91WWZ4M25aRVFPTi82L1RwMC96OHoxbGJTVVMwYTNBa1QrY3FQR3NGd2h1Z2F4OVpOZXVYVDhjT0hEZ0Fpc1d5OXdjUW0rRitJWkZDc1RERURNNEYxY1VzSWZxNnVxRG16WnR5bWViV016V0t1MmtLM1dkdjg5WjlyekIzVjlnTUJqME8zYnMyUHpUVHo5ZFlQcS95SXZ1UlFtNzgzd0NzUlJpakx1L3FLMnRyWGJObWpYOFZFT3NVWXFWZU1LVlNuU1VNRGlwR3BkMGNNbURoaXh1S2lnbytDSW5KK2NuaTFYdzZuM1lINktIZUJ3aWk3TU82MnRkM0ZmTDk5OS92d0h1T2loVGNGOExoVktLaUs0TW9NeDRrMlZPcDlEZTNuN3A2NisvWHNzOGFKUWFKLzNnUWVORnVSVUNMY0UzT0JmNmFmUjYvUTRnT2o4UnBSVDJ0VkdwSjF2cGk0eCt4VmtYUXVvVlJxT3g4dU9QUDM2SGtSejdRNDc2ZWFBRnJjRDVXRWc2SzYwKyt1aWpIOWdtU3FzeUpaOW9XazJYNDE1bFJPZ1JMUzB0RmFzQlo4NmNhV0lrencrUWE0R0RPd3V3SG5EMHBvNk9qdGJQUHZ2c0gzQUh3cnVCbVVtV1RpSzZzb0hrZWMxQk1WY0h4ZHlIbFpXVnJheVlPeDdndFFmeFFudkNVWVkrZXZUbzV2ejgvSHEyaVVWeXE5SlBNaEdkOGJtSFlzNjhZOGVPOWVmT25UT3dZdTZVU0diRjQ4VzV0S2Y5Ym01dUZ0cWJaanE5UkhRRSt0UjJPeHNMQ2dxMjdkNjl1NXl2N1lEa0JoSHQ5eGxXVEYrQnpNek0yU0VoSWZ5NXZjcVBxNVFSMFVXTXFaeDFKYTl1YUdwcU9wdVRrL016Mjd3czBpbG02SS9uMnI0WUdobzZhTzdjdWRlelRXd2ZIa2hFSjh5MUkxa3MzM3p6elZiV0Y5TFpXL0VYUU9DK3ZXNVBuZ3dkT2xUWXdxc2pvaXNicVp5ZEh2WGEydG84d2F6NEdwSFBpajhIOFlXZHJCNC9ZOGFNVkQ2ckIzak5lQ0o2Z1BGN085bThjOWV1WGQ4TE1xWVUvT2UvYzNZV2JSbytmTGl3bFRpT2lFNUU3NmJORHh3NHdHZnpCb21zY1lJWDQwSGJGMk5pWW9ZSk52c3IrVVFyb1FVQWl6SHNCa3dFelozUzBkR1JxbEtwa3RScXRRN2lpajZYNHVKaVlYRW5wZVdTY1RtNWJrMXF1SXpIRzIrOHNhSzF0YlcycGFYbDR2bno1MmMxTnpkWDFOZlhsK24xK3ZONWVYbll4WWhqQTBZcFBwZElpVVRIM3ZKRWlHUWtNd1o4UDVpUk9lclgyNWRhM1JVOVZuWlFoSDczM1hjbkJMSkZTalBqc1pVQlBmNWc0WXM0V1NROFBEd1pJeTd1Ti9VeWNlSkU3djc3NzI4UlhBVFZjcjRJcEVSMExjdk1TVURJSk16TStEMFFOeEdpdjdOa2RnUTQ0YVZWVlZYOEtHS1R4RTR3U3F5VEVOYzUrd0VsWFFSQklpUXpXbUhKUUdhVUdZUHhlMFptZk1abDE4QUhTQTh1S01qN3UxNVhWNmNYYkVyeDZXdS91RUowSlYwRWdTQTYzbG9UV0daT1pwazVHY2lyZzRNYnh4Zkl2aUt6SStBY1Q4R21GSmVBMFB2amowanhJdkFWa3pBekp3bklQSmpKREIwUU9CYVhmd3NVbVIyaHNyS3lSckFweFlkVG5RLzBEb2oxSXZDRVpYMll6RWlDNGkvWmJEWmo4Y2U3R1Q2WEdiNUFTVW1KOEFrUGJSSWt1cWpuZ2dieUl1aU5nZUY4WmtZeVkyWVdXSFA5aEFXZ1ZxdmxwQTZRTHNJc0xrV25RYkxybXJ0N0ViQ0wyOGpDN0lqb2ZYa3lBNUc3N0RrQm1aMjI1dVFBdGhaaEZ5UzZGcUZSanVmRjJZc0FMb0FlN3dScVFmWnFBejF0aERBQTJac2dHdUQ3Tms1QmlJNk8vdlVPRjZESHEzdUtNQ1dkTDV5b0RwTFpZREtaRFBEVkNKdzFNczdpZUlLRlJTZWYwUnRaRlBhZ3BWR2k0THJmQ1pEeEV6SHJROFpQZ093K0NHS0FMMWVYOGpkaVkyUERJS3MzQ2U1MlVsdmtwNC9NaUd3QkVsOXVhMnU3WkRRYTZ5Q3FJWE5mYUdwcXFxeW9xQ2pkdTNjdmpseTNzbWozdEJpdFoxRUF0eEM4alZ6QkQ4NXFGOGJEVllXamtvbEEvbmgySWNUaFU1eWxjbUJUVWxMNkZSVVY4VVFQa1NEUkpkZTRoU3NHNCtvS1FHS01HaUJ5TlJDNUF1cWxpa09IRHBXRERHbG1SRzZ6bmZlYWxaWGw5R3E2M2lCaExZdDhPM2NFTlg4aDRBVUFrV1J6SWZ4cU5Zb0JDUWtKU0pSU2dReG9raGh2VXNTMlE2QUFqSmlSY2U0dEVCbTFOT3JvcWt1WExwVWZPM2FzcktTa3BJSFB5cloxa1RjWHdQVjF0c1VkUjIrNkJraDkxRTR4aTdjSG5QMmlnd3NBcFJINjdqbzJlRFNRT1R0K3V4QkF1c1RiT0U1U3c1QkE2R1FrTWhTRWRTd3JvN3lvQWdsWUFRVmhHU3NJZVNKM2MwV21USm5pdC8wTXRLekFWYU53aWxwbEQ2NU9NRjhmd0FGTkFHbkVYd2dKZ2d2QmE0aUppVWtWYkVaSmtPaWpmVUJrcDNXeTdSSWc2SW84K09DRG9qZ3dZdGZQSmlZbFNuSGdLVGc0MlBibnFLTngwQ29lN2dZNnZDUGdOa29qdUJBRzJXdkRkVmpKOWVtVEhCOGZIOG9hdXlMeDZjMFNhdXpDUW5SNElIU3lGQ0QxTmwyMGtyQy9ROTlEb2R5SEZjcThZNFN0dkRnK3dOY0kzVndLckJkdXZ2bm00ZXZYcjhlZWRCelp4UkhlYW9rY2k4azluVSt4NkdRaXV1K0FJNFU0c2Jtb2h3c0JuMnMwc3B2SUhUSWtrL3R0WnYxQUNSSGQ3ck9VZ05DbHp6MzMzTnRzRTF1UDh3S2xrd01KcFUrbCs4RDJoWWlJaUNFMzNIRERJRjZuZzN5UmdqZU5rbTJjdlIrY09YUG1SOEZtaFZKUHROS0pmaGppZ0kxOFVVMmRPblVhdndtUkxJSC9JOXZldVFUZFhiOWx5eFkrZzZNMHFTV2lLeGV2TVJJSTNaZFJFeVpNNExONm5NaXpPanBGcyszOTRPVEprOStBZE9IWFF6OHYxV2VKRXRHOUExeHliclZ0VVFwRjJCM003c1NzbmliU2ZjZDkrMjk3dFJacTg0MGJOL0sxQmc1OFhWVHlTU2FpVzRFUDc5b2dmQ0V5TWpKdC92ejUvSE5Fb3lHcko0aHd2OUhidThJN3g0Y0FiOXUyYllQWjNPV01kajJCanBhTkp2QW9zSDNobW11dW1UVnAwaVNlNExoWXA1aEdTL0dCdW92dC9lRFlzV09iYzNOemVUMWVaT2V4N2tSMGhXSUFrd0RkRDQ1YXJaMDFhOWFqUVBob3p0cXVNQnpJcmhYSi91S2FpM2IzeGN4U09VTW5uVjRpT3E5emwzUFdDU2hYSURnNE9EbzdPL3N4blU2SFRWNGhqT3lCSEgvQTBkNi9jbFpMMFM1R2p4NTlWM3A2T3YvL1hDMlNpNU9JSG1EY0I1SHA2QTFoWVdIeFR3SXlNakt3L3lVQ1ltU0F5SU9kb0IvMVZoempqSnc1YytiY3g0cnBJQ1p6aU9nS0JscHpDNTE1STY1TysvREREeStjUEhreTl0YWdWcjhPeUI3aFowMmVneG5hbVRkSFJVVmxRREU5Z1czMkYya3hUVVQzQTdCRDdHWE9oV2QzYXJYYS9yZmRkdHRUQ3hZc21BalpNcFNSM2RjRVFtbDFCOFE2enRxMzR6U2d0cGdOTWlaV1VFeUhLZlZrYStUU3RPTUcvcDJ6czVwdXI2eFRxZFJ4Y1hIWDNIampqVmUzdDdlWEFiUTdkKzZNaGpEQXNmVDI4NDFTV2RGNUQrZkdvOUpoWHpWcGFXbkpQLzc0NDZHT2pnNjhZQ0poUDZ2bGRNN2gveUdpT3dBdTIvWTh5NVp1QWJKN1A4aVlONHdaTXliT1pESTFsSmVYSTRuQ0lJeGVJUHhnaUtjNXF4UGswZE1xWUQralUxTlRPdzRkT3FSbnhYUW43RitEMG9pdVdyVnFsZEpJanNQNW0xeVZBWTZBRHc5b2JHdzhxOWZyYzNmczJKRmZVMU9ESFk4WWRTNDhraHozQzF0dFowSmM3MDFaQ2J2WHNYMzc5cmYzN05tRFRWM1lCbkJVWkE4ZWN4dk96aGxWSXRGZjRIcm9EZkVTcVN5NEttOWRYVjB4cnVWNDZkS2xFcmdJU3JFWEhMSnFYWFoyZG5CS1NrcElURXhNUDdQWmpBOEpHd0lTWXlSby9tRytuRWplMnRwYTljb3JyNnd5R0F6b3NlTkVpanc1OUw3NGMzSzBsRERGbHlUbk5YeDRlUGhnak9UazdvMlBjK2JNNlg3dy9iaFVIN3BHVUVUZit0WmJiK0h6anNLWlBOSXI1Y1FyeVhYQjJVTFBldklMb0tBekhENTgrSk9pb3FLdi9iM3pKU1VsUCtUbTVuNEMrK0Qyc25PSmlZbVRiNzMxVm41ZXJBNnlZWlJTVHI1U2lsRXNPbCtGU0hmM0Y0QVVPWmFUazdObTc5NjlwVUQydzlPbVRTdldhRFRqUFNsb25aVkNoWVdGMjk5Nzc3M3ZqeDgvWGdXRjcrZnA2ZW00TEVlU0czY2JWVkpTVWxwK2Z2NUIxcjZMYnRFRjRJQmsyd1NjTFVhVklsMnd5MitpdTFuOHlKRWpXemR1M0hpVXMwN1d4aVlwYkhuRkpqQXM3bDdoZkxSQ0Z1ajZtbSsvL1hiRHJsMjdzSlVZTTNuaDdObXpzZVgyS2M3cXJhTXo0NUkzam1NQjgrZlB6M3J0dGRld0lNZXhBRndpNHd4bGRPa0RoZkpLenViWlBxNW1jYzQ2Tytja2tGeTRxQkcrdm9lNUpOSGVkRW5LeTh0M3YvdnV1NStjT25YcUVydWdUc0hmRnE2RmVRcmlPNGpmY1M0K0dUb2lJa0xYdDIvZjhvS0NBcnhnSTlnWWdDUTdIQ21qc3dzWjRpVlhzNTZETEc0UFdORGg0aVYvNHF6V29FZG9hR2c0L2NVWFgyeUZ2NDhYRnBLODJFR2JMV2I2UnpuclZMckhYYm1ZTXpNejd3SE52L0xjdVhOb00yTGpWeVA4SFpOY2lTQjNvai9DdWJqV0NXWnhJUGdXdlY1dllGbTh5SFpoSGp0QVdiR2NzL3Jna2U3dUxCYWF5NWN2LzRodG11SHZubkRpWTJnUnJvZllEL0ZuenNsZW1LQ2dvTWpzN095N1hucnBwWFdjdFEzaWFzNU9UejY1THVMSE1FWjBseHlWRlN0V3JBZVMxek9wVU9BRXlZV285R1NIY1oxdndhYXJVZ0oxOWp4R2VxZjg4WDc5K2wwN2I5NjhzV3d6RnJMNlFDSzZ0SUJTNVdYT3lmNFF6T0x2di8vKy96Q3BnbVQ3eFlGVThSblJqVWJqUlErSWpzQ0w4bDJJeDVpczZSVWpSb3k0WTlpd1lYeDlNUVRJSGtMU1JUcDRpbk5pbVFvWHRialBpZDdVMUZUbklkRjVISVBBMGFsRnpISHEwUUxWYURTaGQ5OTk5MzFROUg1Z3NWajQzdlhqbE5IRkQrekJ2dE9QV2R4clJLK3ZyNy9vSmFMem4zK1ZYZlFPMTNPSmlvb2ErdWlqai9MMmF6ODU5cTdMamVnNDB2ZWlvd3ptSlMzZUU2bzgrZkNGQ3hlRWhHejEwakg1bWJPMitYN3I2RTNwNmVreng0NGR5ejlJUUhhOTYzSWorbk9jZGFqZm4xbmNheG45OU9uVEYyMmNIRzhCSDkzekxJdEd1MFJRcTdXMzMzNzcvVnF0VnNWcW0zUWd1MG91eEpDVFJwL0ZXWnUyL0tIRnZVNTB0QmJMeXNwNGNwdDl0RncxWm5WY291NTVKdkc2QVovNnRtREJndCt2WHIwYUI2TDRweFdXVWtZWEQxQlRMZ2xRRnVkc3NyQmJreG84dEJaZHdVV20yLzlpNysra3BxYmV6T2JGSXBMOVBDK1dpTjdMLzRBREpYMzhxTVVkb2R5ZEQzbkJXblFGMk1TMWhUa3orY0lmNFBTNzZkT256NDJJaUFoaXh6WmRvbytpbEIzUmNmaDdWQUN6dUZma2l4ZXRSVmN2U213aGVKZEp1aTZ3M3ZVWnZLTGhyTDNyUlBRQUFqM2Z4MFdReFQxMlhyeHNMYm9Ddm9VQVIxVi83V0xFM3ZVWk0yWUllOWY3RXRFREErelB3TkhQcmthbXk1Y3ZId2xnRnZjNG8vdklXblFGU1BLSEdPa3RPRk5xMnJScGQ4Zkd4dUx4UmZjbEE4aXVrU3BacE95NlBNbFplNm5yaTR1TDE2MWV2YnJNeDQ2S1Q0bnVRMnZSRmZBdEJIdXg3dEZvTklsTGxpeTVhZW5TcFY5eDFyWUt5ZmF1U3pXalo3SkM2b2ZkdTNjL3hrZ2V5Q3p1a1hUeGs3WG9DdmdXZ3ExYXJYYkd5cFVyUTluL05SQ3llbjhpdW4rQVd2R1BFTS9DUVYrMmZmdjIvZ0hTNGw3TDZINjBGbDBCMzBMd2RGQlEwQi9nMk9MeUhTZXhNQTN3SXF1S0lmcFlSblFjMU1DdXV4TWl5T0pDNEN5Z09wY1k1VjlyMFZWZ0M4Ri9RSXlCNDR3VFFkQ09sTnlrYWlscTlGMzhOM0RneGZyd0taejZGdVBzbTV1YW1tcEZUSFFFdGczOEh6dm1abGN2Wk1ybzhvVkw4cVcrdmw3c1JKYzhpT2dpSUxvSXJFVWlPc0V0dU9TOGlNUmFKS0lUZkpmUlJXZ3RFdEVKM2llNlNLMUZJanJCT2RuTk9Ua1RYK1RXSWhHZDRCRFlpdUNVOVNrQmE1R0lUdkJjdnBDMVNFUlhCTkhKV2lTaVN4MFZ6cnlKckVVaXV1d3pPbG1MUkhSRkVKMnNSU0s2SE5EcjZDaFppMFIwT1FEN3R4MCtlcEdzUlNLNkhOREJ5TjRqeUZva29pdEN2cEMxU0VSWFJFRksxaUlSWFM3b2NkVXVzaGFKNklxUUxtUXRFdEVWSVYzSVdpU2lLNExvWkMwUzBlVUVKTFBkWjNlU3RVaEVseE53OHNVRnUrSzlxa29vWGNoYUpLTExVNzRVRmhZS016cFppMFIwK1JHZHJFVWl1aHh4aGNWSTFpSVJYWTY0WXRDSXJFVWl1aUl5T2xtTFJIUkZhSFN5Rm9ub2NnU3VQTnZXTGNXVHRVaEVWMEpXSjJ1UmlDNTduVzZ4V0pySldpU2l5ejZqbTB5bUM2VFBpZWl5SjdyWmJLNGdvaFBSbFNCZHlvam9SSFM1NHRkQm84N096dk5FZENLNjdLV0xXcTArSjNpZHJFVWl1cXpRd0RFYk1TSWlRbzlTbmIxTzFpSVJYWlpadlpFRlpuS3lGdjJJSURvRWZpVTZMMVZ3cE5SQ2g0U0lMa2VnODlJczBPWWRkRWlJNkhMTjZBMENvcE5zSWFMTGx1aWhBcUpyNkpBUTBlVUlIQkhWRXRHSjZFckk2R3BCTVVyd0kvNWZnQUVBOUJuYXNOa2NTb01BQUFBQVNVVk9SSzVDWUlJPScsCiAgICAgICAgICAgIHJvdGF0ZUluZGljYXRvclBvaW50ZXI6J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRFFBQUFEeENBWUFBQUNFWFpUc0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeUpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1YybHVaRzkzY3lraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9UUTBSak0yTjBZeU5ESkZNVEZGTWprMVFrRkJSREl3UlRVNE9UZEJSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T1RRMFJqTTJPREF5TkRKRk1URkZNamsxUWtGQlJESXdSVFU0T1RkQlJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG81TkRSR016WTNSREkwTWtVeE1VVXlPVFZDUVVGRU1qQkZOVGc1TjBGRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzVORFJHTXpZM1JUSTBNa1V4TVVVeU9UVkNRVUZFTWpCRk5UZzVOMEZFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BzZnlyNllBQUFyWlNVUkJWSGphM0oxYmJ5TkpGY2ZMN2NUMjVENkpjMkVtemlZWlZxQmhHRlpDQ0JBRGduMGNIdVlGYVNVZWtHYmVRYnZ3bHNrSDJCZXlDQWtlZUVEN0FVQm9RUHVPaEJCQ2dvV1paWVV5dVY4bWsvaVN4SFo4eWNWdVRzVnR1VGZFZGxYWE9kWFZYVkpQT25INzh2UC8xTDlPbmE3dWlkaTJ6Y0xVTEJheUZqcWdIcEdEZmhPSnFMN1AwREw4czhSWW1mL3lVOFl1Wko2OGRPWDNUdDJrUjlNWDl3WnMvRnZaZEg0ditLb1FRcHQyZ1BiREFqVGovUHpVaUQ2RUNIUWpiRUI5WVFOS2hHRWNHb1d0bjI4cHhtN3lMeEZzT0Jaa29KVEw2c2FvbGJJMGhodW5HYWMyQjYxQWc0eE5oQW9JTEM1SjdYWmFnUkt0a0F0MEg3cmQzSW0xRkFwc3lFMjR3d3VTdWRnc1k4T3dHNld5Ym1xZzZXdmtJbFdKR21qMjZoK1NyWDdVRndxRkJnS3UwQnRYL3dDeVRGSTZuWGFGWXEzMEozQUtXZTQ4emcwVWRZQ1dHclBZd0FCTnNtdXNHUWg2NXhwWnQ4VUlySnNTYUtiRFNFdm1kTDRBM1NUTXVpMmRodUN5YnJLY3poZUZiaENPUmI0QXhRTUlGSFZuMlZkYkx3REZHdStkd0xadUtxQmJyRU5GQ1FpcytVYnh4TUx1UjFSQXFXNEhmSTdJNmFpQXByc2RNTkxxUjRGUWFMYmJBUU5oVTRqS3VuMVRLTjRxYWZXWkRnU3V6S1lFRGhwSk5Pdzl2b1Q0T1NpQWJndStydlZtSSt3aW1NWkFBWlFTUFhDQ3dPa29nR1pFRHh3aGNEcGZnUVlJU3NPK0FpWENwbENjWUY2RURjUnJCT09pQjBQMk9qellzUGtFbG5WakE2VWtYek15aDN4V3ovSXIzSnB0RXJrZitRNDBnbHdCOGgybzMzQ0ZVckpQU0JnT05DMzdoQmh5K29NSjFNZGFVd0xoQnRZOU5OS3dlNTUxUjAwQ212YjZ4RG5FQVJZVGFOYnJFeWNSbmM0SWhZWVFwK09ZUUROZW45aVB1TUlFRXlqbDlZa0p4UFRIQ0lWaUJ2WWhTSm92ejhwNWF1RFZBK01OZFhxWEZCY2xXbjZyNDdKdWxINWtERkFTS1FYQ0FwcFdmUUVzNnpaR29iNndBU1VNQ3psbG9KaEJRRGNkMjFZZFAyN2N1aXpWWFM2RDd2VVRLSVdrTWwvcHBOeVBNSUNtc1lCR0VTWjdHRUN6V0VCRENDbVFVUXIxR1JKeWFBb2xFTklmb3hUcVJaaUtxd0lsR2U2cGtPWXlhTTlYc0tnQ29WbDJzOTFTbk95cEFzMWdBNDBwT3AxeFFJT0tLWkJ4UUtyV2JWd2ZpdnVvVUFUVHNsMVpkekxpRTlBRUkxZ3o2aXlESHVHZmJlbFNNSDFBNlAybjJWU3VZREVTYUZRaEJUSVNhTkFuaFZKVVFEZDhVbWlhQ2lpdWNBV0xWeUNMVWlHK0RMckhXWFltdXd6YUs5QVVVeWhrQ0ZoM2RMNTFCVXRjQjlBc0kyNjNQUzdodEV6clA4M21kUm0wVjZBVU5kQ0FSNmZ6Q2pSRERaUm9YRW9RS2lCdEN2VTBac3EwRFN4ME5ONjYyTU9pQk9MTG1LT012bG1mYnd5d1VzdWdMUk1Od1RYWVNaZTFqQWJ5c2d6YU10RVFtcTNmUTladE5GQWliQW9sTkNqRXk3T1R1b0JnZkxqWjN4Z200cUtmVlJab211bTlhMkRranVRVkxGNkF0TFlKeWJDVEJaclZEU1JyM2NZcjFCODJoV1FMSnNZckZDTlVpTHZNdUc0Z2ZnWExzTE1NV3VUenlnQ2xHTUU5UkVUYW5FUlpTd1pvaHZuVUppWDZVU0NBaGlXdTFldWhBTElacTJVWmU3SE8yQ2RyakgwTVA5ZWg4eFcvQ1o4Tk9zTlg0UEh2d1RmNWJkR0pZci9FdktoSHNnOTFiUUR5L0hlTS9mRmZqTDJFWHpkczI2NjZIaTdDdGd2YlJ6K0xSUGdYOUI1cmdLRmwzUllXRUh6cjlVOForOE5UeGo0RW1IOEF5SCt2d0h5bS9keTJ0OW5sZlpEWnJ4dFB4N0Z1VVNCK1c4K3hUZ2U4WU96M3YyVHNMN0M3Q2lDdlJGNFVvR3pZZmd1N3YrcDBITVRsNEdnajNHTGR3dFRDNkQ5cHh2NEpYL1BmK0M1OHh0ZXluUjZnUG9RZmYrMWkzVUlxS1FOQnJKeERuL2tJZHV1OHp5aVkyUzlncTNYSXVvVVdaQ2dEZ1RyUG56TjJETHNaVU9mVUt3Mm90TkZKcFNGQnA3TlVEV0dWc2Y4NHV6bUVJZWZQQXRhTm9sRGJwUFR2clRERHVDbjRpM1lQeEFVWE5Za0N0WnMyMk11TnNZWGZSLzRNQVNqYkFVam9mSkhRd0ZyKzRJUDJmcjY0R0MyVlNyVklKR0lCVkYycHlyT3cwSGFOWEwwT0wvMysrMmpUaDYxMlJZejUrZmtoWngvakZHV3kzUU9ucDZkTjlTb1lRTHZ0SHJoNzkyNnpmdzBpQUgyeDNRUFZhaldEQ2JUZDdvRTdkKzdjYzNiSEVJQysyKzZCazVPVEpsQ1pGQ2laVEw1MTc5NDl2dGhvSFBwUjNDdkowNmRQSVJsZzMycjNlS0ZRYUE0TFZkS1FBNGplUjQ4ZWZkOTVyVGtGZFg3U0tVOUxwOU42UXM1UjZhdFBuano1QnM5UUFIREtnem8vNmphTldGdGJTMk1DOGJIbXFOTUJFSFkvZVB6NDhkZGg5MDBaS0lENUlmejRjYWRqYXJWYUdSVGlvWGJPdXZ5L0t6SVR2QjNXNFVwSVBnN2R2My8vbmNYRnhTODhlL2JzVC9BN24rQ3R0OHZ2QUlUbmgrL0M5cDF1Ynd5V0xhU09MQkR2Ui9lN0hUUTJOdllXS1BYbFRDYno4ZnI2K2ljUEhqejQ5L0x5OHVyVTFGVHA0Y09IdzlGbzlFc0ErYlpsV1crTFRzSEJzck1VUUp1aUI0STYwWW1KaWEveHJmazNBSFEvTHRYSFhKYmRGY2lTVk1pWEJwYWRGYkZzV2FBZHY0QU9EZzZFQmxWWm9HMi9nTUN5c3hRaFY0THRVRGNNV1BaSk5wdmxvWGJXYVlydUJjaVhzQVBMRmpZRUwwRGF3NjVTcVlRTENDYVB3ZzduQmVpVmJxQjhQcCtsVkdoVE45RCsvcjZ3WlhzQjBqNjRycTZ1WmloRHJ0eXBNa05nMllXam82TXpVY3YyQXFUVnVtV1NVaFVnYlU0bmE5bkdLMVF1bDZVczIzaWc0K1Bqckl6REdSOXlZTm5wVUlVY1dIWk9CeENQNXpRMXpNWEZSUjVDanRzMXIwblVLWUcwRExDaXRXd3NJUElVQ0N3N0xldHdLa0RrU1NwazJUbWRDcEU3SGFROFVrbXA4VUN1TEZ1TFF0d1VLUC9MZDl0bDJWcjYwQ21sZForZm4rY0xoUUt2WTFjWEZoYnFPb0JJdys3czdDempSUjFqZ1Z4SmFVVW5FSmwxdXdvaldvSElCbGV3N0xRZlFHVHBEMWgyemkrZ09nR1B2Ykt5a25XR0JhMm13RFBoQXdMTFBqbzVPZUduSFU5bExWc1ZpTVRwdkdiWldFRG9rejNJc3FYckNFWURRYmhKMXhHTURybkR3OE4wcUVMdTRPQWc1MmZJdlVLMjd2cnk4ckpueThZQTRobnhQcUpsSDRNcDFMeGFOZ1lRYWdva2UvcVJDZ2d0U1ZYSnNqR0IwSndPTERzZEtpRElzbzFRQ00yNlg3OStyWlFsWUFIdE1jR3phOTBzKytYTGx6a1Z5OFlDdW5DZ1ZPc0lSOVZxdGU2bE1JSU5oQkoyR0phTkNhUThlM1ZsMlVZQUtRK3V4V0l4SFNxRklNdFdkamlqK3REZTNwNVJJYmZIdWl3LzdsZ1ZzZTM2eXNyS29aTzVHNkZRVFNXbmd5dzdDN1pkZDdKczJ3UWdwWDZrV2hpaEF2S2MwN215N0hJb2dNQ3lQWjl0TURMa0lNdk9tUWkwNWRuemQzYlNKb2JjdmxOamtMWHMydHJhMnBGajJhY21BZFc5aEIxWWRnNDIyOG15YlpPQVBQVWpMNHY4ZEFKSk94MVlkanBVUUs1YWR0VkVJT21ReStWeTRRbzVzR3hQUzJCMEFmRXplc0lYdVlObFg3Z3MrOHhFSUNucmhndzdWNnRkRm93cUdKWk5BU1RWanpDemJFb2c0ZnBDcVZRNndIUTQzeFVDeXo0TWdrTEM5UVd3N0hRUWdJU3RlM3Q3T3hCOUtDM1NKOEN5ejhHeStlMXo2dUJ3cHlZRDJTSUZFN0RzTEVDaHFrTUZKQlIyb3Jma0NBd1F4dWxIblVCZHJidFlMS0ptMmRSQVhlc0wyV3dXTlNuMVhTRUt5NllFU25mNm9QeTJVeHNiRzNuWXJZRmxud1VCcUtOS1BDbWxzR3hxb0cwQnk2NkdBcWhTcWVRbytvOXZJVmNvRkRKQkJHcXJVS1oxeDVWeUtJQjJkbmF5UWV4RHVlc1VxTmZyM0xMNTdROHZzQzJiR3VqYWZxUnk1WWtKUUp1NnNtemZGSUlzT3hka29QK3JMK1R6K1hTUWdiWTdaTm5oVUFpeTdGeVFUWUhYM1VvdXk2NXViVzBWcVN4YkI5Qm53bzdhc3JVRHVkYkVsWU1NOU9xYXdraWdGZHAwV1hZbURBcnR1ckxzYktqNkVEZ2NTV0hFM1hvMEFQSDY5ZVU5dVhkM2QvaytBOHMrRHpLUVc2VUs5UnZwQXVJWlF5UnNRS0ZTS0xRaFZ3MmJRbVhxTjRvNEpkblFOSXVGcklVTzZIOENEQUR0S081U29aQUFTZ0FBQUFCSlJVNUVya0pnZ2c9PScsCgogICAgICAgICAgICBhcnJvd1RvcDonZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUFkQ0FZQUFBRHNNTzl2QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5SnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU15MWpNREV4SURZMkxqRTBOVFkyTVN3Z01qQXhNaTh3TWk4d05pMHhORG8xTmpveU55QWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTlROaUFvVjJsdVpHOTNjeWtpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UWpORk1rVkdNREV5UXpJME1URkZNamczUXpSRk16QTRSVU16TlVVMU0wVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRak5GTWtWR01ESXlRekkwTVRGRk1qZzNRelJGTXpBNFJVTXpOVVUxTTBVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcENNMFV5UlVWR1JqSkRNalF4TVVVeU9EZERORVV6TURoRlF6TTFSVFV6UlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwQ00wVXlSVVl3TURKRE1qUXhNVVV5T0RkRE5FVXpNRGhGUXpNMVJUVXpSU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGx2Q2pWQUFBQUQvU1VSQlZIamExSmpSRFlRZ0RJYlpnQkVZd1JFY2dSRVl4UkVjb1NNeHdvM2dDSGMrME1RUVBDZ1VLQ1QvRzhyM0dXMFJwZm9OZmNlSGFMWFlRUGh2eUZJU0pvSi9TaGpwOE51ZEt3R1B1Y0tjSmVGRlM5aEMrS2VFbFFMdkNPQngzTXJ3MHlWT0Juak1PUm9lR09FeElCRWVLdVlQNjY0VUdJcEVsNjdkQWo5ZHdqREExMG8wYnoxS3V5dWxtbENxVjFQWHBzSzdUdjJqU3NKMmhLK1ZzRDF1M05wSjJkY2FDYysrSnZYajJobkw5TjVhTEdCVVpXQXNHaUFKdmtuQ0M0R3ZrZkM0VGNoZDhCbjhHN2lGTlhNUFZKZFl6em9TK2JmL1NyNE5UaEI4VHVLMWxCNENENk5paWFQa2gwWGFTUnBLUU9sa2ljZUFTYTZmQUFNQURnSFJkdkhqU1owQUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgICAgICBhcnJvd0JvdHRvbTonZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUFkQ0FZQUFBRHNNTzl2QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5SnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU15MWpNREV4SURZMkxqRTBOVFkyTVN3Z01qQXhNaTh3TWk4d05pMHhORG8xTmpveU55QWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTlROaUFvVjJsdVpHOTNjeWtpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpnNFJVRkVSRVF5UXpJME1URkZNa0pHUlRWRU5UTTFSVUZFUlVFeU5qTWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRemc0UlVGRVJFVXlRekkwTVRGRk1rSkdSVFZFTlRNMVJVRkVSVUV5TmpNaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERPRGhGUVVSRVFqSkRNalF4TVVVeVFrWkZOVVExTXpWRlFVUkZRVEkyTXlJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE9EaEZRVVJFUXpKRE1qUXhNVVV5UWtaRk5VUTFNelZGUVVSRlFUSTJNeUl2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGw3dEt6a0FBQUVWU1VSQlZIamExSmpSRVlRZ0RFUzVDaXpoU3FBRVM3Z1NVb29sVUFJbFVjS1ZRQW1SRDVoaFBCWERrUmd6azc5VjN1SzRSb3o1TFo4NnBKNk1ucG95azI4Smw5U1lXNHVKQWwrNGxpTWhWQ0l0SnJid3BXRXJ0S25qanZCT0UwZndtRmx0TFR5Q0wvMnRMeEFvbTljOFk0cGxZME5EdU91YUdUNWVaQW9sZFZDSkNRbzgxcW1rd1VRM2ZDbEhOREVQaEorSjhJNFNwV2NOQStDSHJ5bHBnbTJ0RC9HUkFqTjh6RXlzTHhVd3dsdXBaSEFYN3Vta0UrOU4rTmhoWTJLa3hIWElhN1BQSlZkTlVPR0h6MS8vbUxnZHZuY25mWWRlcER3eHYxWEI5NlRKaVBSaUtSZ0FEK2JtZ2lmRDk0NGVYYU9CbGo4cHFUODdGaE9xNFZ1ang5RFJRUHBJUk50Skg4a0VLL3dMRWMyVGF4VmdBQmhYMURpZWY4d0ZBQUFBQUVsRlRrU3VRbUNDJywKICAgICAgICAgICAgYXJyb3dMZWZ0OidkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUIwQUFBQXdDQVlBQUFEdG9YSG5BQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlKcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1TXkxak1ERXhJRFkyTGpFME5UWTJNU3dnTWpBeE1pOHdNaTh3TmkweE5EbzFOam95TnlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVOVE5pQW9WMmx1Wkc5M2N5a2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZOVGt3TmpKRE5Ua3lRekkwTVRGRk1rSTBOelpGTTBORU1UUkNRVVU0TnpBaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk5Ua3dOakpETlVFeVF6STBNVEZGTWtJME56WkZNME5FTVRSQ1FVVTROekFpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvMU9UQTJNa00xTnpKRE1qUXhNVVV5UWpRM05rVXpRMFF4TkVKQlJUZzNNQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG8xT1RBMk1rTTFPREpETWpReE1VVXlRalEzTmtVelEwUXhORUpCUlRnM01DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QczNtbTBzQUFBRUhTVVJCVkhqYXhOaGhEY01nRUlaaE1nT1ZNQW1WTUFtVmdKUkpRQUtTSm1FU0pvSFJoU1ZrTklNN29DL0ovV3JTSjJuaEE4NkVFTXlrNFdNOVlpM0ZrMG5vRG9aVXIxanJiTlJsWUE3YldhZzlBUE82ajBacjRMZjhLSFJyQk1ObmNnMUExL1RQMnNCOU5uZWljckR6bjE1VllBZTZwQmUxZ004aUlCU29CQ3lEUVluMmdRclVkNE5DZEF3b1FKMWc4ZCtxYjJ0QXJRQzBUZCtzZ280SEsrZzJCZnlEU3VMTmlxUGxBSldBVGhXZ1A2Z2tUNzE2bThoUVNienB3UXc5RDh6UTg4QTRMb1lZNU9kRkpoSzJaTEJ3d0dJUUMzeHNhOE0yY2V5NGdoM01zQ01vZHRqR3JoWElCUXE3S21LWFl1ejZqelU2c0pZTzFyekMyblJZUTdMYWVuMExNQUNiRWxOWlZYNGVwUUFBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgICAgIGFycm93UmlnaHQ6J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQjBBQUFBd0NBWUFBQUR0b1hIbkFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeUpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1YybHVaRzkzY3lraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk4wTTVNa1V5TUVJeVF6STBNVEZGTWtKRVJFRTRNekZETkRFMk9ERTBPVEFpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TjBNNU1rVXlNRU15UXpJME1URkZNa0pFUkVFNE16RkROREUyT0RFME9UQWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG8zUXpreVJUSXdPVEpETWpReE1VVXlRa1JFUVRnek1VTTBNVFk0TVRRNU1DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzNRemt5UlRJd1FUSkRNalF4TVVVeVFrUkVRVGd6TVVNME1UWTRNVFE1TUNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BycXRUem9BQUFEVlNVUkJWSGphNU5qaENZTXdFQVhnb3dzNGdpTjBCRWR3aEJ2RkVUcENSc29JanVBSU5zSUpwZmdqb1pmM1loTjQvNFFQZ2o2VEU3bGVRMHBNQ1FKYXo1UXRaYmRVaC9VTFBQT3FCUzRYMkdmVUV4dHNDL2VNcUNjYU05RWpNd1BlN0dYckN4NDk0VFVUanZaOGxZSm9GaFlHSFA0Q25nckt3N1dudFFEVzd1Q1pBYnZXcGRnTFE0RURvNmRMWU5lNnZBZjhrQnN2K1BZMkM3cDlNdkJ5MEZaQnQ4S0gvOXJnSVB5NEFqK1lOUTFHQnZoenZjRXZVUENySXZ4U1RMbUZ3d2NkbEpFT1pYaEZIZFBSQnBLUTBldGJnQUVBNVRYSEJLYnYxSWtBQUFBQVNVVk9SSzVDWUlJPScsCgogICAgICAgICAgICBmaXZlUG9pbnRlZFN0YXI6J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBVUNBWUFBQURSQTE0cEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeUpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1YybHVaRzkzY3lraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlFVWTRSVVEzTURRelJUQTFNVEZGTWprME5FWTRSa1pEUWpoRU9ETTRRVFVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UVVZNFJVUTNNRFV6UlRBMU1URkZNamswTkVZNFJrWkRRamhFT0RNNFFUVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBCUmpoRlJEY3dNak5GTURVeE1VVXlPVFEwUmpoR1JrTkNPRVE0TXpoQk5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEJSamhGUkRjd016TkZNRFV4TVVVeU9UUTBSamhHUmtOQ09FUTRNemhCTlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BrcFJyRjRBQUFHT1NVUkJWSGphWXZ6Ly96L0RTQUlzSUtLc3JJeVFPbTBvZlJXZm9xNnVMakI5OXV4WnFwaG5iR3dNcHFkTVlhU0tlVGs1L3lFZUpnS0VFbU1nQ1dEQXpHTWkwc0J3S0tZV0dERHppUEd3SGhCclFMRWVGUnczb09ZeGtaQmMwTm1VSnI4Qk1ZK0p5T1FDQTJGVVNuNERaaDZzMEZJQVlnNGc1b2J5K1lDWUdZaGxnVmdWU2IwYUVDY0M4V01nL2d2RW42RGlYNEg0QnhBL0dPem13VHlzQzhSTG9BWVJBdk93aUlFTWprRnk0S0ExRDVha053T3hPUkRmSkNOSmdmU1lRYzFnR096bUllZmhHMUJEdDVCZ0dENkhERXJ6MEF1dGowRHNEOFF0UUl5dnpma2ZxaVlBcWdjWEdIVG1ZU3VsL3dGeExSQWZ4V1BnWWFpYWYwU0U4cUF5RDFlMXhBUEVwbmdNTkllcUlSWU1Hdk53ZWRnQmlObnhHQWlTc3lmQmdZUEdQRndlOWtMTE41RkFISUdXSDd4SmNPQ2dNUTlYYjhrTlNoOEQ0bWlrK3ZBa0VDOEZZaXNrTmNTQVFXTWV0aGhXaDdac21xSEo0Z0dTM0FPb1dETlVqUm9Samh0VTVtR0xZVTBnZGdMaVF6Z3MvQVBFZFVDOEI0aTFnUGdXQVFjT0t2TVlSOW9RRDBDQUFRQUt2S0hsRVJxZGd3QUFBQUJKUlU1RXJrSmdnZz09JywKCiAgICAgICAgICAgIGJyb2tlbkltZzonZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUF3Q0FZQUFBQlhBdm1IQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5SnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU15MWpNREV4SURZMkxqRTBOVFkyTVN3Z01qQXhNaTh3TWk4d05pMHhORG8xTmpveU55QWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTlROaUFvVjJsdVpHOTNjeWtpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2TWtaQ00wTTBNa00wT1RnMk1URkZNamt5UlVKRE16azNPRGN5TTBNd09FVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZNa1pDTTBNME1rUTBPVGcyTVRGRk1qa3lSVUpETXprM09EY3lNME13T0VVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEb3lSa0l6UXpReVFUUTVPRFl4TVVVeU9USkZRa016T1RjNE56SXpRekE0UlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRveVJrSXpRelF5UWpRNU9EWXhNVVV5T1RKRlFrTXpPVGM0TnpJelF6QTRSU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG5lKy90OEFBQS80U1VSQlZIamF6RnA1WEZYVjJuN096QXd5Q0NJWUtHZ09PSUpTYW1sZjF4Uk1zekprVUxOUUJqV0huSDYzN3BpZkRYYlRNQkUxemE1RHBqbmttSE5hVjBVeHhRRUVSUUVSRVVGUU9PZHdPTU8rNzFyc2N6eEhPWENzUDc1ditYdC9lN0gyM21zL3ozcmY5UTdyS01HVDdUbVNhUHpmdE5za08wajBqandzQ0FLaytQL1YycE9NSVZFNCtvTGMzZzB2THkvWG1wcWFVUTBORFMydWdNbGtZbGNKNnh1TlJ2TzRoUFhGTVg3UFNpeC9ReUpCZzFxak1CZ2E1UFgxMnRvQnp6MjNSU1R4dXFpSnh0OU5RS2xVcXVnUzVlVGs5TlRMYURBWU9ERnJZWVNzcjV3QVE5allnQWYzNjlFaE9CZ0ZCWVcrWGJwMHpxVGhRRkVUclpLd1MwQ3IxZHBjN1RVSnJhSjU5YzNBbWlQUW5MQjNUUVlUdERvTjVBbzU1SHBEV0Y1ZTN0UnUzYm90ZDVTRTNKRVZWY3Fsa0NsVXY4T2tqYUtZYks4Q0NSRUFNem1aREs2U2gyanI1UXFKZndDdVhTL3FkT1hLbGFuZHUzZDNpSVJEQkdTME9oZUxLakZ1MFZFRStibzFvNFpIZTRLdHFsa3JFbmFEOTAyUHhzVDdKaFByQTFLcERLWGxGZmpoZzBCMERmTkUrL2J0VVZaVzFpay9QMzlxMTY1ZHpTVFludGplSEFtNUk2NktQb1BTeW5ya1h5NUJRNGczSDJjQTlLUituZDZJaGtZakdnMUdNaDNSdGdYK29pZ1dXMnNpYXFTQlJnTkREcWprY0hOelFuMTVMYW9lcVBsakxpNHVDQW9LNGlSSUU5TklFMS9SY0R0N0pPUXRBT2ZyMnJTSkpaRExKSkE2SytIdDRRS05Ubzg2alE1KzNxNElDZkJBcDBBdmhMWDNRaHNQWnppclpGRElwRkFwWkNSeXFKUXlib0lOQkZxdDFhUGl2aG9EdXJWREozcitnNi8vZzNwMUkwN2wzNFdMYzVQbjFPbDAxaVE2a2lhbWt5YVcyU01oYVNHUStSS0pQOXRZU3NSQ3RBLzNnNU5LZ1FYeFVlZ1I1a09nREtRRkE5ZUV3V2ppbWpFSm9vdmw3aEpjQzNxNlYxdW5RMlQzSUx6UXc5OHk1OHBkdVdqUUM1ajBwMDd3OEhBbHA2RWo1ZEFDcUZUUWFEU01CTnZ3TjBVU3JGV1FiR01rV2dwa3pGZkhzczdnd1lPUjhlWFNwbzh0SG9lcWVqMCtHTjhmVXFVVTJWZnY0c0tOZThpL1ZZTWJGUTlSZXE4ZVpkVnFsTk1xMzZuUjRHNnRGcFVQdENpanY2K1UzRWRvQjE4Ty92VEpYK0RmMW8vUG1US3FGMDVjS2tkNVRZTzR5Y0U5bExVbWlGQm9RVUhCZEJGYkFNa2JKQ3A3R2hoSTRKZXdHSkNlbm80VksxYnd3VDA3ZjBEczZEZXc2WGdKVHVXV3dKMVV6c3lrdGRaSSsrSXVrZm1meUk2SUh4cUM0cUpDaElaMTRmZjZSMFVpKzh4WjFPaUE2emZMRWZWc29OMTU3dHdwcHoxbUxPN1FvVU9HV1JPRTh6dkpZM1l2SlIrK1d5Nlh4NlNtcFdGbFZwYk5KRHUzYmNIbzE4Zmk2T1ZxWkd3OWcvWStydHptN1RXZDNvUTc5elVZSHQwSnljUENjUE42QVRxR1AydnpUR1JrUDV3OW04UDcydy9td0VVcDRZdGpZbXRMdG1nZ0cybm5xWUpTSmtCbkVGQlJVWkg5MGtzdmZTL2lYU0szQmsrWGRRejh1OG5KV0x0bURSOC9OMm9VTHBXVzR1MExGL0RhRzI5aDI1YnY4UHJZY2JRcG83QjRjemFDL2R5YUpjSEEzNjVTNDdYQjRSeDhjZEVqOFBOQ1FqRDMrZWZodDJrVGNuTE9vVy9mUHZqdHQvTjRjV2drK3I3ekhkb29HNkV3UGtCamd4WlZ0ZlVZR3FiQWdJNHFOQmlsQ0E0TzluckNDNG5ndnlWSm1qQmhBdGF2WDg5djdobzZGR0dob2VqU3FSUHVxdFdZZiswYTNuZ3JIdHUzU2pEbXpUZ3lqMzc0NS9yVENQYTExUVFEWDE2dHdkaWhYVEExaHEzOFZRTGZsZDlMOXZmSDM4ZU1nWTdzUE9mVlZ4RzVlemZPbjcrQWZuMTc0OXh2RjFDeVBoNVJNL2Vnblc4bzNGM2txS2g4aUlGOTVPanRiMEJWblI0S2hjSm9UVUJLNE5tWC84M0FKNDBmYndPK2Y5ZXV1RnBWeFdYeWlCSDRORHljMzJNYVlKcDRyWDhBL2pkNU1HbzBSa2hsY3JnNnF5Q1hLL0N3d1lpSnd5TXdaM1FYM0NqTXN3SC9SVndjQ3FxclVYRHZIdndwYURFU3JQMTJQaGQ5K3ZUaS9iTkxSK0orblpyeUpBT2MzZDFwSXorRG5qMTcwdjArTE5BWmJBaUlLNThZSHgrUGpSczIySUF2ZVVCcXBMeEcyOWlJR3pVMU5pVGVqRXZBMXMwYk1hS1hEejVNR29CS1doME5aZkhWYWdQaWhqeUw5T0doSEh5bkx0MXR3QmZWMXFLZVBJeWUwb2l5aHc5dFNGeTRjQkc5ZTBYdy9xK2Zqc0I5aWhGcUhlRTFOVUpIV1RHdFBzdVNqWThUU0l5T2pzYm16WnViSmhrOUdrTjc5YktBdHlSM3paQjRLejRKMzI5YWoyRVJiVEIzYkI5Y0xxM0ZxOUdobVBLblozRDk2bVVMK0hmOC9HekFXN0pXa1VRSTdZa0tXa0RXY2k5ZWhyT1RrdmVQZlBReWpHUnFTdkoySmpGN05XZXgxZ1NFR1RObVdBYTI1T1hSanBkeGVTSkR0U2JSdVRNZkc1YzRnWk40SmNJYnV6NktSZm9ySVNqTXU0andyaEVXOEVzSjNPUGd6VTBoZm10L1lhRmxiTjZjMmZ6NlM5NDl5a0JZVkpmU1ZXYkpveDRua0V6bUkvejg4ODk4WUJGdDFQZSsveDVoYmRyQVRhV3lUMkw0Y0h3YUZ2YUl4T1pOQ1BVRWlzaFZkdW5lWk10disvcTJDTjVacVVSSEx5K3NPblFJazg2ZDQyTXJsbWZnSHdzL3daSDhPbnl5UFI5dUxrcWVta2lrRWg2aG55QkFBMnNaaVJkZmZGRTRjZUpFVThTbDhEMW4yN2JXU2NURVBDSVJuNGo1OCtjalRIU1ZESHhHUWdKdXRBSis3ZEdqbUhQbENoL0x5bHlHMVBUcE9GNVlqMVg3TGlFODBCMitIaXBLWFpSY0V6SVoxNEx3dUFaZ0prRnB3eDhpOGRsbm56V0I5L1pHUm1JaUIxL1hFdmpEaHkzZ1Y2MVlqcFMwYVRoVnBNRzNCL01RRnVBR2J6Y2xYRmx5S0tYVW0xYS9XUTFZVlZZV0V1ZEVkVElTczdkdWRZakV3bzRkK1ZpQ3B5Y3l5QjA3QkQ0L3YrazdLNzdDNU5SMDVKUTJZT094cXdqMWQ0T25xeEpPbE1rNlU4ck5VallyRFRSUHdFeGk1ODZkSC9mdDIxZTRkT2tTSDF0ZFhvNzNmL2loVlJKVGlNUzM1TDIrVEVwcUF0L01ZVUJ6NEZkbFpXSks2bFJjdkszRGxwOEw4UXdGUlU4WEJaekk4ekJ4SlJJc3hraGIwNEM1alJrelpzOFdhajE2OUVCdWJtN1RSMjdmZGtnVFhlaWRvcWNBdjNwVkZpYW5wQ0d2d29EdHYxeERCeDluQWk4bjRGS0x1RkRXSzVEWm13bVFGb1FXQ2JBV0Z4ZVhmZXpZc1QwcytwMCtmZHFpaWRrdGFFSlBNY01zOXNCL2ZmQ2dCZnlhMVN1UlBEa0ZoZmNNMkhYNk90cjd1c0RkVmNFTElHdHhVc2s1VEhzYXNGdVJVY1oza1lMR3lBRURCdURNbVRQbzM3OC9WcE1tSktTSkw1bU5VN0doTVpsYVRhZFY5TUZuS0s5ZlRUblB2SUlDUHJaaDNRWWtUa3preDIrWENxV0lDQXJoaDNFR2s0NXFBU092a3hVeUo2bzRuZUh1WkVBYlZ6bFZkVnArQU9Bd0FWZFhWMHMvS2lxS20xTXZzdkZWcEltSEsxZGlBWUVxcDZqWTBoa2dDNFZCOU1GUDlIcDhUTGtQYTVzM2JrWmNRaHlXSHYwY0grOWNpUW5STXhIZU5nSytidTNoNzlFUi91NFMxQkRXNjVYNUtLbk14YTlGaCtFa200cGd5bGdGcWVBNEFYT3JyNitud3R1TkoxUExsaTNEOU9uVHNabnMzSjlrUUN1blRvekFmMGcrRnY5T0pOZkt3Tjl1dkkxWnMrY0NGREtXSFo0R2x1N1luTUNZbWtvdHVROTEzWUdPTjRNUkU5V0huM0k4dmdkYUpjREFzM2J4NGtVT25qV1dlckhNcGRSU0JOb25FRW55SGdrcm96WnUzSWpZNGJHSVQ0ckh6bDA3a2JBcUFmNFNmL0kwTGpRUGJWU1RGQWI2NStIdEFhODJuaFNGUGFFUUpGQVpaVFlIYVE0UlVLdlZsdjZwVTZmd1BCVWdFSThGUGlBcGNlRGcwaWhXNEFuaWFlMi9XSDk4QXZRNlBTYThPd0UvVGZzSjA3Wk9Rd2psL3E1azd5YjJqMWJFUStHR05yVDh6TVBjMDFaQ2EycXdTOER1NlRUbFJyM1o5ZVRKazgyQzF6aDROc2MrWFVZeWx1UjljV3hpOGtTc1dia0dnd01HNC9PUmkzR3o3Q1kwZFRySUcxVlFHSlJRYTdRb3FTMGhsM3dUUlRYRkNQQlFQWjBHZHV6WUVVMjVVY3o1OCtjeGNPQkFoOEJibjRmcld5QUJVUlBKcWNrUXFPWk5Ua3ZHWDBZK1FQSy9reEh1RzBZdTJ0MjJtSzhyaHlaUWEwMmc1VDJ3YjkrKzBTTkdqQmpMMG9uSXlNaW00RWJDRG9pSzdZQjNFYy8vOXBDTUlpbG5tLy94WUVkeWl4VkNWaVFtcDAvbWg4SXAwMUlnakJlUXRDWUo0WDdoY0xjaW9XblV3S2gvVk1Pd1dHQ1hBUG45S1N3ZEo1dVhtTTNHREw2VVhtd2sxeW8zRnhRc3NGQ0ZwTkpxRVVneGdaMkpyeU01UnNJT05NdWNuYUdoNXdXSzBvSVlMNWl6dVVQNTBldmtWdGtzWDVDa1RrL2xSUXEvVGhLUXVDb1JuZjA3VzBnSUJuTFZncjUxRTZKSlVsZzZmdWpRSWNtd1ljTXM0QmV3amVqaEFYbTdkcEJSbE9XbllSUlFaQVFRbFpYd3BmcDJwUWllN3htU1dRd2NFU3QzY29Ja05CUkc2cHZvWFY2UTBMdlZsSGFNRWVNQ0k1SDJYaHJYeE5TWlUwa3RsSnBuam1zaTRlVE9WOTlnTXRqZFkxSVJmQ29EZitEQUFRdjQxNWdxU081VHphcWlZbHBKS1lUU3h3Zk9BUUZ3cGN4VFRsN0t1NklDcTFoYUlFNjJjT0hDSmdjZ2ttaEhRR1ZWVlhDajU1MXBBZGo3U2txMW5hamVWbE5GTjFwOGpyVnBzNlpoMlJkZklTNGlEcHRTTjZHd3JCQzE5Yld0RWlDTEVOS1kxdmZ2M3krSm9ZeVNOVGJ4WEdiSDlDRTNpcjRHQWl2UUNqR1RVVkpPMDBBeHdhMm9DS3ZwbWJYaVJEL3QrUW12eEw2Q0tlOU1RZHZBdGpoT1k2d3cvSnpTajFyU2hQc0xMNkNSQ0puSXBGaHVMNk9GTU5CY295aE5ZZWJFRGkvZmUzODZhY0tBbVhObndqalZpUEZMeDBPaWtyU3FnY3pWcTFkYndMOUw4amRtYXkrL0RPL1lXTWdwWldDcjd4d1lDQThpWkNndWhvSzgweG9yOEFmMkhPRGc5MTNiQjc5MmZxaTZYY1hIajR1dTA0UEk2bkp5NE5tdEcxeUNncmdXNUxRL1BHaWZ1WTRkaTdlWTlzUzVaczJiaFRrejVpQ3BUeEorblBramhCcWhkUk15bjBoQVBKWm1XODZUa2pkblpqNVVHcnJRMVl0UzVjYkxseUVjUDg2Qm04SHYzYlVYdzJLSElXVjlDbUpIeGFML3d2N3dDZlRCclp1MytQMFRvamFkcUw1UUh6c0dyNGdJdUFRSDgzblovRjc5K3ZIbmVsbUJXcmVoYVVmMURPcEp1NTRjU0hWcGl3VFdIamx5QkZPbVRPRUR0SWV3bS8xZ3UyZ1JwSlR2dENGWDZrMml6czZHZHM4ZXZsbS9FVi9lUmlWbnpLc3grQ2I3Ry82UlNmTW1JY0F6QUlzT0xFSlFTQkN1WGJ0bUljSDJrNFFpZXUydVhYdytid0t1bE10eGM4RUM1SXJwQ1Qvd3BleTNxcm9LWmRveXBHeE1RZHpiY2NnY2w5bmlMekRzS0gyTndIWnlhcXA0bWcvaHJ5UUhTU3EyYmhVS1B2eFFPRUw5dDhWN1RMWnYzeTQ0MG9xS2lpenZEQ2I1aFNSM3dnU2grdGd4WVQvMU02M21IQkFkYlhjZVNqLzRWYXZWbmhIMy9pekxHWkZJNG12MlFGcDZ1bVhDdjVDY0lxR1NScGhvOWFHOWUvY0tUOU51M2JwbGVYY1F5Vm1TazQrQkh6aG9rS1BUMlJDUW04TXpOV1k5UXVieTVjbEtxcUMrWExvVUg3RjhudVM2ZVA3SVQ4dkkzS2pZWWQycjVMbEsyQzhwVnNGRnNQNXRUVThCYTlDZ1FmNUJRVUc5cTZ1ckpUN2tSbitsZS84a1NSZUZ0U0ZEaG9BcVFOYTllL2p3NGZNS2hjTDBSTkltbFFvc002YXMrRTR6dnk4KzBrUmRYZDBPZDNmMzBmUG16OGRpOFpqRTNDakk0V1h5VGlkT25OaEp1ZElKUjM5c1hieDRjYTg1YythTXI2cXFrdnI1K2RuY0cwcUxjWlFXaGRvVkFyMU9UR0lkYXV6M2dlWitvZW1UazVQelJiOSsvWWJNbmowYlM1WXM0WU83cVNRY09YSWtNakl5dnBzeFk4YkJwLzNGT0NFaElaTHFnYlRpNG1KcEtFVm4xbDZnMkhDY3ZGcE5UYzE1YjIvdlRESGJ3Rk1RV05mU3hsN0I3SXJpZzVDVmxXVzJ2NWwvNUg5eTBQdHZzdjJZblowdGhJU0VtT2Y4a1VUNU8rZHIxVHRsV1cyZVB3VGVhdDZ4SklZL0N0NU00TDhDREFEZDVuOVNMMGxOTXdBQUFBQkpSVTVFcmtKZ2dnPT0nLAogICAgICAgICAgICBicm9rZW5JbWdfc21hbGw6J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQllBQUFBV0NBWUFBQURFdEd3N0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeUpwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVNeTFqTURFeElEWTJMakUwTlRZMk1Td2dNakF4TWk4d01pOHdOaTB4TkRvMU5qb3lOeUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5UTmlBb1YybHVaRzkzY3lraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk5VWkZNalUyT1VNMFFqSTRNVEZGTWtKRE1rVTRSVVJFTWpnM09FVkNNaklpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TlVaRk1qVTJPVVEwUWpJNE1URkZNa0pETWtVNFJVUkVNamczT0VWQ01qSWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG8xUmtVeU5UWTVRVFJDTWpneE1VVXlRa015UlRoRlJFUXlPRGM0UlVJeU1pSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzFSa1V5TlRZNVFqUkNNamd4TVVVeVFrTXlSVGhGUkVReU9EYzRSVUl5TWlJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B1cVZCbklBQUFUcFNVUkJWSGphckZWOVROUmxIUC84N3YwNHp1TUVoRHNRRUFUaXRoTkVqUmNuSXFTSHByeG8wOVZVRUMzemo1ek5MRzIxMWxwdURWdHpPV3ZXck9aY202dHBCa3ZJMEhhS3BGbHdKY0loZDhEeEtsMkh4OHU5Y2ZmMC9SMVlIcU5XVzgvMitUM1A4LzA5eitmN2ZiN1A1L3Y3Y2ZpcjdTY0k4ZCthbjFCSDZIclV5QmdMV2JTZkRFNkM3OS9BNTVxWUd1enJmcUJVaHI5SmUxTm5FNHRtUlNCMmU5eWlXeDIvUXlFWGczZnM5bmpoOS92aDhVNzNYcDhQekIvQXVNdUxMWVhwODZ3V3k1RzQrSVZDajhkemh2WjNQQ1NhVGN6OWVNK0JndWMvUjRSYUJsVzRGUFBrRWlnVjB1QllMQkRBNFpyQ0tuMGNQcXE3ZzNDRkVtV3IwOFZXcS9VVm5VNG5HaDBkL1l3NDdvWVFhN1RhV0xmYkpWbWk0YkMrU0kveVhDM1VDakVDRkhZZ3dDalNBUHdDQ2FvTXFhaS9jQll2bmF1R1o5d3p2VmVqRWZYMjJnNW1MODBVM091eThPUjN1Sm1jNkZ2TjV1YXM5UFF3Zm00YkdjWVh6WlBvdFBSQkt1SXdSVWYzUVlJanUzT3cvWW5IWWJ4eEMzazV5MUhiZEF0ZlgyekNBOGR2MEVZcGtMUkFQcllpZCtVYnhQZWVnQjVaemEydDEzalM3dzBHMUJjV1ltRjBETXF5T01qblI4RTBNSTRPdXg4SEszT3dyU2dic3ZaT0RGWlZRV20raHczNXk1RzFLaDluMitTNDBqRUJqM3RTK21kU2pVYWprdys2eVdCZzdidDJzVjhxSzluRndrSmVMNnpUYW1ZMURYWTJPTVhZMHN3TVpsQ3IyTjBkTzVocDUwNW1xNjVtNjZSaXRucVpqcGxIR0R0K3dVUXhNamZ0ZTVGWGhTQWpJK01tNytDaTJjem5CSzZwS1NRbEpLQ3VhQTFTRjZWaDdhSVJGT25URU44M2hPT2J5akFlQ0FUejNuLy9QaG84UHJ6MjlsRmNhaG1FVEJLcUFrRmtaT1NUNUtIK25mNStuTGg4R1VxUkNHNlNWWHo4UWx3cUxrWlc2bU5JZDR5aFptTXB4c2dlVkFhUjV0Ylc0cXF4RVk2WXRiQU9PS0JSaFlVU2N4ekhYMjJwcmErdjdSeEZVMU5mSHlUM0Vva21MZzdHaWdvY0xTbkJHSjFFUXFUMjRXR3NvVFhHcG12d0xsaUovdjRoeEtuRmtNckVJY1JCdVJHNWw3cVBLZkthaU1oSW9iK3hFYSt1WHc4bngwRWlrMkdNWHNva0V0Z0hCbERjMElDMnRpNUlZcEpoNndleUU1TGg5akpFaHJ1REFwdXJRUGk2OTQzYTdVSnlCTTJwVThpWU1mSk5RZGhHZU92OUQzQmQvQjJlUFpnQ21XRDY2eUpWQ2xHY3ZoMWZwbjJLdVlqNXMwaEVLaFhLYVZCQTRPVVNlR1RoSjRSZEwrekRqUnNtbkR6OElhNmFHaUVYaGtFdWtGT3grRU56UEZNZ1lZTU94NzZ3cUNoQnVkT0ozV1FiSjhnSmZCcm16VGhRRVU0VDh2S1dZSEczRG9zMWFiaHAvUUhYdTR5d1R3NkZFaE1wZjhwdk5XcDF5aWE3SGMrRmg0T0xqMGVFVmh2OG91emxoY21UeXVXUWtReGpZMk9Ea2E4cktVQ3VmVFVxc3JmQTRYeUFDYzlFS0hGUFQ4OFZ5bWwrTlUwTzVlZERSUXFJemN6RVQzUlJML01SazJaMVpWdXgxK1dDZ2xRUlhWQUEvZWJOK0Vvb1JHbjVXaXpyWG9xdDJWc3g0aHdKSlI0YUdrcmtCM3BDQWtsTHE5ZmptN282SEtiNXJ6WUxWcnlydzdaalR5RzVaQU0yZDNlRDJXeEkycmdSS1RrNVVQT3BPVU9YSEplQnRPaTAwQXFoVkNTMzkvUU04c1BqaEdQVGttRnp0YWVwbEtQb1hiTkd3K1pULzB4VjFld2xyb2NsTGFJMFdHaVFaK3JzL0hsSmFtb0U3NHpLMXBHUW1IakMxdHZyZURRSXM4VmlrSWhFaHR6VHAxRzlady8ySHpoUVMvc2IvL0huWlRLWlVscGFXbnFvdDl5K2ZUdUpUTks1NEhLNVhqOS8vanlibkp3ODlIZHIrSWk1MlQrKy82djlJY0FBQ0h4akdyQ1pKcXNBQUFBQVNVVk9SSzVDWUlJPScsCiAgICAgICAgfTsKCiAgICAgICAgLy/liIbkuqthcGnvvJvmnInpnIDmsYLnmoTnhafnnYDmt7vliqAKICAgICAgICAvL2Fwaemhue+8jOivt+i/lOWbnue7meS4gOS4qnt1cmw6dXJsLHdTaXplOnt3OixoOn1977yM6ISa5pys5Lya6Ieq5Yqo6LCD55Sod2luZG93Lm9wZW7miZPlvIDvvIzlpoLmnpzkuI3ov5Tlm57ku7vkvZXnmoTor53vvIzohJrmnKzlsIbkuI3lgZrku7vkvZXlhbbku5bkuovmg4XjgIIKICAgICAgICAvL2FwaeeahOWPguaVsAogICAgICAgIC8qewogICAgdGl0bGUKICAgIHBpYwogICAgdXJsCn0gKi8KICAgICAgICBwcmVmcy5zaGFyZT17CiAgICAgICAgICAgIHdlaWJvOnsKICAgICAgICAgICAgICAgIGRpc2FibGVkOmZhbHNlLAogICAgICAgICAgICAgICAgbmFtZTon5paw5rWq5b6u5Y2aJywKICAgICAgICAgICAgICAgIGljb246J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFDZmtsRVFWUTRqYTJTVDJpVEJ4akdmKytYcjB2YTJxcXQwMm50RWt4bzAyNURxVXBqZGVBT2RqMFl4SVBneFlPS2VQSG13YWc3N2JETDBJbE1LZ29lZXFnSVFyYXBTT3RGcEZPYzRHV2IxbitrTnFMV0tOcW1TWnMwMy9mczRDcGxYamJjYzNvUDcvdmpmWi8zZ1ErVS9kdkdaMGY1UE9qU0JlU0duM09sNnpzbS94Tmc0Z1EvU0d3eVk1bUVCK3ljdjQrTDd3RitXaDRPcmc1VmJ3ZldBcGVhSHc1ZkJyaHhDT2V6SnJxQXg4QXVJRld1ME9uT0hSNkp0bjRWTURzaktXeG1KcWtIaUFGVW5sUTNhY24wY1FKYUFXdzJZMDFWZ1Azdk5zakc0cnVCazhCYzZKL0FNZUJySEMxMEdrcW5hcmRtSTg0OGJ5WHdLN0RYQlJpTnRtNERUa2t5TTBOL0Y1TGF6ZXkwSkpsdjV1V0NpN3lYd1pUVkZrdG1MSkNZdE51UldQaGoxLzBkcUxONXRkUWtOeFBzN0NUd3lSSTBOVVg1emgySzU5TlVNaG1BYTA3amRMTHA1c2pFaTJPcytjaWwzckt4K0dsSnUwUHJ1NnpoeVBmS3V3SHI3KzlYTHBlelpES3BqbzRPMDh5TVhoLzZ4Z3JwbjJWbXIzeHBTL2pSdmV1enQ3OTh1bUdqdkVKQlkyTmppa1FpQXVRNGpselgxZERRa0NUSnkwOHEyL2FGc3JHNHNySDQxVm1USEtBdXVINmRuSm9hK3ZyNjFOemNURzl2cjNwNmVxaFVLaG9ZR0hqclNTaUlWVlVKUUZKNUxtQmc1dTZ3eWZkcGJHeTBSQ0pCUEI2M3djRkJITWV4N3U1dXpNd0taOCtoWXRFQVgzRGszWjkraTBTYlJxT3Q5MTRkUEt6eW0zRS9sVXFwcGFYRlR5UVNTcWZUdmxjb2F2ejRqMzYycFYyajBkWlNOaGJmTXpjN0JuQmhlYmh1VmFqNmdOWFg3d2w5dVdHeEcvNFVmSjlLWm9UcDZ6ZFFQbDhDZnNsNzNyZnRtUWQvdkFlWTFkSEZTd01yZzZGVkRZRkFHMUFMVk1wUzVuNjVkR3ZIc3lmNWY4YitmOUZma3NBVEVGNUxEWmdBQUFBQVNVVk9SSzVDWUlJPScsCiAgICAgICAgICAgICAgICBhcGk6ZnVuY3Rpb24oYXJncyl7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVybD0naHR0cDovL3NlcnZpY2Uud2VpYm8uY29tL3NoYXJlL3NoYXJlLnBocD8nKwogICAgICAgICAgICAgICAgICAgICAgICAndGl0bGU9JythcmdzLnRpdGxlKwogICAgICAgICAgICAgICAgICAgICAgICAnJnVybD0nK2FyZ3MudXJsKwogICAgICAgICAgICAgICAgICAgICAgICAnJnBpYz0nK2FyZ3MucGljOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybDp1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHdTaXplOnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6NTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdzo2MjAsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHQ6ewogICAgICAgICAgICAgICAgbmFtZTon6IW+6K6v5b6u5Y2aJywKICAgICAgICAgICAgICAgIGljb246J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFETDBsRVFWUTRqWFdUUzJoY1ZRQ0d2M1B1dWZmT1RKSnhFc2xrTkVsUm01aG9SWk9LanlLS1NFV3dxTldGV0xzUXFSYmMxVWZWTExvUlhiZ3FpQ2gwSVlvUGFDbldXcWxRTjZtcElQWFJhcWtrOVpHT0pTK1NtUXpqWk83ajNIT09pNGpGaFIvOG0zLzUvM3hDK0g0WVBMaHpYLy85ait6cTZTMVhmQ2xCQUk3LzhrK25yV1YxYVhGdWJ2TExUNUpqSCt4VHdVTlB2Ykh4OFdkZWZQYVc2K2owUFN3T2JSeVpzV2hyME5hUk9rZHFJVGFPeUJoV0szMzlZYmwvNys4Z3hZYTNQbHQ5WWV1VzBvbTVPbEZtY2M0eVdBallOZExIN2IxZDVEMUp0WlZ3dEZyalNMV09FQUlwQlQ2Q1h5NzhXbGVGcnU2U2ROQm9wVGdjMndhN2VXbHNnS21GSm0vK2VJbWxkc3FOUFFWMkRKVzV1Ni9JeExlenRCSkxJaUFmNVBMS0dFc3IxY1J4d21oM2dZbk5nN3gyZXBiUFoydi9UbkY2b2NIQjZVWDIzelBNeFBnQXowLzloaENDekRvaEUyMW9ScHAyb25uNmhncGZWZXNjbkY0a1N6UTdoOHU4T2o3QXBsS2UybHJDM3NrWjdxaGN3V0JlMFk1U2treElxYldoRVNWRVVjTG0zaUtIcCtlSjRwUW5SL3JZTXo3SVkwTmwzcmx2bE5CWkxqYlcrRzZod2RpVm5VUnhTcFpsUXFiYTBtZ2x4TEdtSy9CWWFFVEU3WlRoWW9peDZ3OTIrQjdsVUJISG1ubzd4WE9PT05ib0RDbnJheW56elRZcnJZaVpXb3RyaWptYVVjSndUeGVwTVhoU012Vm5uWk4vTExQU2pOaFlLakM5L0JlMVZrUTkxa0k1NjFodEp4amorUGpuU3hocmVQM2VVVTVXVjNqZ3d4bjZpM2wrbUcrQUVEeDhmWVdydTNJY24xbkFHQWZPQ2lVOHdabzJlTDdpN2U4djB0Y1I4TXBkSTR3ZG1LU1ZHWmFYVzNpK3g0NU5BN3k3N1daMmYvRVRMZXZ3bE1RNG5CSUNJdU5ReWtNN3g1NDdoemh3dG9xMmpvKzIzNG9uNGJhclNoUkRuK2VPbitQVEMwc29Yd0hnMHRRcHFRU3BCQlVvc0phdDEvYnl4TEd6ZEhhR25LaXVVQXdWNzUrZjQ4eFNrMlpxVURsL1hRMEhSaWRXU2F2YlRub0ZQL0RJZWRDVDk2bXVwZUFwanN6V0xvc2xQUHljZDFreTU1QnRrMGgzN3RRaGJUTnlvV0pEcVlPbHRxYXpFRkRJKytUeUFVSG9FK1o4d2xBUkJvb3dWSGkreERpRE8vL05ZWUVmNVB4SGQrK1hOMjNaTHJwS0Zad0RJZGJ6UDdobWJjNmMrZnBRZHZTOWwvOEdFZk9GWFZ2N0FFUUFBQUFBU1VWT1JLNUNZSUk9JywKICAgICAgICAgICAgICAgIGFwaTpmdW5jdGlvbihhcmdzKXsKICAgICAgICAgICAgICAgICAgICB2YXIgdXJsPSdodHRwOi8vdi50LnFxLmNvbS9zaGFyZS9zaGFyZS5waHA/JysKICAgICAgICAgICAgICAgICAgICAgICAgJ3RpdGxlPScrYXJncy50aXRsZSsKICAgICAgICAgICAgICAgICAgICAgICAgJyZ1cmw9JythcmdzLnVybCsKICAgICAgICAgICAgICAgICAgICAgICAgJyZwaWM9JythcmdzLnBpYzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB1cmw6dXJsLAogICAgICAgICAgICAgICAgICAgICAgICB3U2l6ZTp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOjUwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6NjIwLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBxWm9uZTp7CiAgICAgICAgICAgICAgICBuYW1lOidRUeepuumXtCcsCiAgICAgICAgICAgICAgICBpY29uOidkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFBQ1hCSVdYTUFBQXNTQUFBTEVnSFMzWDc4QUFBQ0QwbEVRVlE0amJXUXZXc1RjUnlIbjd2ZjViVkoya2FTcGxYUUtMNVFVVVB6QnpoVVhCUWNGUnc2Q0FGQnB6b29GS1JRa0NJQnhhM1NvU0NvT0hYSUluUVNGQkVMUlNoQzFiN1ExcVRCTkpkTFRPNXlkejhIMjlCZ0RUajQyYjd3ZlI0K2ZPQi94c2pGczBZdW51MzBvM1NBbzhEcXpuazRmR21ydE4rZjJrRitTMFRDSVJFSmg0Q2IvOVRBeU1VRHdLcm5ZQ0lHa3VaR29ialRvdDVSb00vR3pnQXg0S3JXSGNwNCtrOGpyWFhzSHpxMlhwMENYZ0xGN2l2RlR5MUI0ZFdBcXlBZFFFUDk3Vk5VbGVqNXh6amxITEkyRDBCMXBZUzBiYVFFWEJlZ0Fhd3B4ZWNIa3NCYzhPU0ZwTGZ2TEdyZ0ZMVm5UN0VXUGxDdE9WaVd4R3BJams4ZWJUVTF0M1RNcmNveU1Ld0E1R2VpQ1dET240Z01CZ1o2QUJEeDY2Q3FmQjRaYjRQcm0yVWErY29pTUp3WUtlVmJHNnhQOVVTQjE4R0I3dlN1NU92WU1zY21rbTN3ejAzOUkzRHhVS1pjK21QRWxTZVJoT29SMy9zdVQ3S1V1WVBYcitEektYUUZCU0lWd3ZCVWNKdE8vNUhibGZ3dW8rMFYyS2FiMUlRSE0vK0dFek96QUxobUVkbmNwcjcwQ1BkTEZkdHNKb0cvQ1dSS0JBWDF0ZmZVdnIzRjNLNEI0T3Z0UXRVRUVvRnR5aFR3Ym4rQjVhYTlyc0JZSzlQWU5xckFROENwYnVwMy9iM2hrS29KYk10TjcyWGFCSTdscG95TmtnTk1BL2ZQUFREekFBdjNmTk8xZ2o0TzNBQlNlNW5XaVBPalhpL3dBaGdieWxxTDdKUDVVZThnTUFGY0c4cGFGc0F2ZXRuVEdDbDJZbjBBQUFBQVNVVk9SSzVDWUlJPScsCiAgICAgICAgICAgICAgICBhcGk6ZnVuY3Rpb24oYXJncyl7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVybD0naHR0cDovL3Nucy5xem9uZS5xcS5jb20vY2dpLWJpbi9xenNoYXJlL2NnaV9xenNoYXJlX29uZWtleT8nKwogICAgICAgICAgICAgICAgICAgICAgICAndGl0bGU9JythcmdzLnRpdGxlKwogICAgICAgICAgICAgICAgICAgICAgICAnJnBpY3M9JythcmdzLnBpYysKICAgICAgICAgICAgICAgICAgICAgICAgJyZ1cmw9JythcmdzLnVybDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB1cmw6dXJsLAogICAgICAgICAgICAgICAgICAgICAgICB3U2l6ZTp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOjY1MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6NjIwLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBmYW5mb3U6ewogICAgICAgICAgICAgICAgbmFtZTon6aWt5ZCmJywKICAgICAgICAgICAgICAgIGljb246J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFCYjBsRVFWUTRqYVdUWHk0RFVSVEdmOU9PQ2tsalRCTkNpRWtzZ0Izb0VsaUJMbUYyb0hZd1ZtQzZBdXlnM3BzWVBKR0lJcW0wYVhWa3BJM1NIQS9IbURLdEI3N2s1cHg3Yys1My9odnJseUxkSVgvQ2ZCYk0xanRFbndTK0EzNEhxbEhhMk1wQ01hOEh3SDJBTndGenlrZ01kZ3ZKNTgxWjhGYkFNbUZqNWp0WnBhTnl5Z0RERGtTZTNxRlVnRU1uN2JueUdWRjlBRUVQd3BGMGJSUE0rT0l1cWp5TllDc1B6ME9ZeTA1T0tXRUpSSXBYSWlJaVhsT2tkS3U2MzVhSktEZEVxSW5ZZ1VnbXpyL1NnYzBaVGVVMFVzOHg3Z2F3LzZqbkp6SUF4eUdVNmhwNjlRV0sxNG5CZVY5bHVRRmVVL1dnOTRQZ04vaHRXTXVCazROdDZ3OEVYa3NMV2w3V1FwLzN0U014ekhHZlNvWEVXMHl5dDZUNnpzMTMyeFNCdTZEdEF6Z0pWZFpmSjBjNE5vV0Rsc3BxQk42cUR0aEpxT0VmcmV2YkYreEFlMHBOWjhDNVNNOUEzSGZyVE9TNHEyL3V2YzZCa1Q4VGljWnNvNU1EWjFyREh5MGFhSDJxRVF3QjQ3L3IvQUV1cTkvbFJaVXlzQUFBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgICAgICAgICBhcGk6ZnVuY3Rpb24oYXJncyl7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVybD0naHR0cDovL2ZhbmZvdS5jb20vc2hhcmVyL2ltYWdlPycrCiAgICAgICAgICAgICAgICAgICAgICAgICd1PScrYXJncy51cmwrCiAgICAgICAgICAgICAgICAgICAgICAgICcmdD0nK2FyZ3MudGl0bGUrCiAgICAgICAgICAgICAgICAgICAgICAgICcmaW1nX3NyYz0nK2FyZ3MucGljOwogICAgICAgICAgICAgICAgICAgIHJldHVybnsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgd1NpemU6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaDo1NTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OjY1MCwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdGllYmE6ewogICAgICAgICAgICAgICAgbmFtZTon55m+5bqm6LS05ZCnJywKICAgICAgICAgICAgICAgIGljb246J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFCNkVsRVFWUTRqYVdUeTJzVFVSVEdmek9kU2JGTnBRUmJYMURqWXlQRmxZeXVvZ3RGRWNGdEJTbGRGaGMxSU1GRlFZcGQrQ2pZaFc0VVhBa2lSUFNQVUVFcWlOS21QaEtTU1VJYnpZTTBiUmFaVjNKY2hNUkU0NmI5TnZkd3p6MC9QdTUzcnhJeVRHRUgwZ0RlZmd4dWEvak1xVFJxcjBZaWJuTnZ2a2hzeFFMQVREbVlLYWNucENmZzJaTk5YajZ2OHZCK0dUUGxNSFUxUi9oNnZpZWtDMURacUxmcjRVQ3pWU28yOXh4WDJuV250RmFSemJqTXpSYngrMVVlUDkzSDRrS0ppNWVHR0QvUlR6Z1NvUFBjMkNIOUR5RmttQ0lpRW4xUmtXTUhFaEl5VElrdFd5SWlVcXZWcGFWVTBwYkppVFdabkZpVFROb1JFWkdRWVVyYlFmQ29qLzBITmZhT2FtVFNMZ09EQ29zUHl2VHBFTDRaNEhXMHlyZVlRMldqVHY2WDEzYlJCaGluZHhHT0JDamtQWTZQKzVpWnpwT00yK2k2U3JsVTU4N2RFWmJlMXlDb3MyZWs3OTg3QUxoOHhjL1BuTWV0R3dWK2ZMVUJzS3dHSDk3Vm1JMFVXSGcwU2pidGN2aUlyM2NLeVlUTHpIU2VMNStiK1hzZWFGcHpYVjF4bUw5ZFlpeW9kNDUwQTk1RXQxaGR0dkc4djZMU29MclY0Tk9TUlRidDlvNFJRTlBCdGhvb3FvTGpnRFFFRzFCVUJZQmFyVUZ1M2ZzLzROclVNTG4xT3ZIdkRydUhWTTZlSDJnNmUxV2x1dG5ncE5IUHVRdUQzZlphNzJBN0NobW1LRHY5enI4QnJIc2NOZkdSM2JRQUFBQUFTVVZPUks1Q1lJST0nLAogICAgICAgICAgICAgICAgYXBpOmZ1bmN0aW9uKGFyZ3MpewogICAgICAgICAgICAgICAgICAgIHZhciB1cmwgPSAnaHR0cDovL3RpZWJhLmJhaWR1LmNvbS9mL2NvbW1pdC9zaGFyZS9vcGVuU2hhcmVBcGk/JysKICAgICAgICAgICAgICAgICAgICAgICAgJ3RpdGxlPScrYXJncy50aXRsZSsKICAgICAgICAgICAgICAgICAgICAgICAgJyZ1cmw9JythcmdzLnVybCsKICAgICAgICAgICAgICAgICAgICAgICAgJyZwaWM9JythcmdzLnBpYzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB1cmw6dXJsLAogICAgICAgICAgICAgICAgICAgICAgICB3U2l6ZTp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOjYwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6NjMwLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICByZW5yZW46ewogICAgICAgICAgICAgICAgbmFtZTon5Lq65Lq6572RJywKICAgICAgICAgICAgICAgIGljb246J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFDMTBsRVFWUTRqWFdUVFdoVVZ4VEhmL00rblNUalRDYXgrZEFreGs1bEdvMnR0TVVHQkp0MEZFRlVzSmEwaTBKWFFwRnU3S0xGZ0lzS1VncGRsUllNRkFwWkt0Uk5yWWtMS1lVS0ZpV1F0Z3ExblVBbWtHZ01pWk41TSsrOWUrL3BJdlVSSXYzRFdkeHo3djkzdVBkd1VteVNuZGs1Nk8wNGVzYkpGWWVjM0V1dmlZNGpYWjJkVVUrbWJ6Ym1maHFYK21KNXMyZGRLY3YyZDQyTzVZNWNDLzNQWjJUOFZrVkVSTUpZeS9pdGlteTVNQzNadzFlcTNvNmpaemJhSElDVTdhVmJYcjg0cFlmZlB2aTAySVpaMVpobUd3RFBzVEROTm8zMkRQSHAvUzMrM3hjdk96ZGZQUnhNZi9rZVlyUUZrQjQ0KzYxNmErUmdVR2pEUEFwaHZrWmxOVTY2VkZaam1GOURWelZCY1J1VTNqbnQ3eG9kQTdEc1hISEkzbi95dzNwM0h1WUNXSW9nVURTVVNRQU5aYUNtNEhFSWN3R05yaXpwRjBmSHJQUzJYc2Z2T2ZaUjJMMFZsZ0tvS3hEQUdDSWpDU0F5QXNhQTBsQTFHR01JWCs3eTNJY2pIMWhPMjc0UlpibFEwNkFBRFNpaFZNZ21nRkloQzBxU0dsVkY3UHU0TDd4eHpMTDgxazRUR1ZBR2pJQVJPdHNkanU5dVRRREhkN2ZTMmU0a2RaUkJhN0NidXdwV3luWnNRZ1hhckVlb0tSM0lQemZsMG9FOGhIckRQUVdBcFlQSDgxYW8vaU1MZmR0ZEprNzBQUWVZT05GSDMzWjMvUWxHc0JzeE9sZ3NXM3A1NW1lbkZvSVNlcm85N3B3YlNFem5yODl5L3Zwc2NyNXpib0NlYmcrVTRLNDFpQi85OWlOMnJqaVVPVGtwZzEvZmw0VmFKTSswVUkwa2YycFM4cWNtWmFHNklWK0xaTTlYdjB2dXlMVXdsZTdvdC9US2c5djZuNm1KZldGRVI1T2JkQnUrZEkvbE1NVnltR0w0MHIwazM5SGtzamVPYVpTdmZDSDF4YklOb0o3Y3ZWRmU2VDMwNi95VzNqMzlHZDc4OURZUEg2eEJ0Z2w4aDZYeVU3Ny9wY0lyT3pPYy9lWVBwbjY0ZXJYKzUrV1BRU1NWb0ZPVzdmZS8rMW02OFA2RnV1VjVxaVdOVG5zQTJFR0VXNnZqNjlwYS9mNTNuMFNWRytPSmJmTnZQMXRuTjcvM2tMMjFmeEJBcmZ4MTkvL1crVjlvUm15N3lpK1o3Z0FBQUFCSlJVNUVya0pnZ2c9PScsCiAgICAgICAgICAgICAgICBhcGk6ZnVuY3Rpb24oYXJncyl7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVybD0naHR0cDovL3dpZGdldC5yZW5yZW4uY29tL2RpYWxvZy9zaGFyZT8nKwogICAgICAgICAgICAgICAgICAgICAgICAnbGluaz0nK2FyZ3MudXJsKwogICAgICAgICAgICAgICAgICAgICAgICAnJnRpdGxlPScrYXJncy50aXRsZSsKICAgICAgICAgICAgICAgICAgICAgICAgJyZwaWM9JythcmdzLnBpYzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB1cmw6dXJsLAogICAgICAgICAgICAgICAgICAgICAgICB3U2l6ZTp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOjYwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6NjUwLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBkb3ViYW46ewogICAgICAgICAgICAgICAgbmFtZTon6LGG55OjJywKICAgICAgICAgICAgICAgIGljb246J2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUFDWEJJV1hNQUFBc1NBQUFMRWdIUzNYNzhBQUFCajBsRVFWUTRqWjJUelN1RVVSVEdmL2VkVVQ0MlhpSkZNWTJvMlJBMWlvWFVLRHRzc2FFcy9BSE16bFpaVGxsTUZuWTJGc3hPekFJeG9SVEoxL2lZS1BtZW5XeThjeXp1ZU0xRndsbWRUczk1ZXM1em42dWFJeDJ5YzczTGY2cTVzaEZGMkpaL2Jic1Z0aVUwM1NOL3JkQjBqeEMyeFF0d2RKOWtmR2tDQkVBUStWNlVVc3J0ajI2VElPU2NJQkFvcndjQkVUSEFZTTRPNzA1QUFRcTg3NERXbWlBYkk0dS91cnB0cW92RTFiWko0R1FjQU02ZlVuVFA5SDI3R0J1Y3hWL3F3M0VjZlc0dWdXZ0RlSHgrNHVEbUdDeWxaZWJVNDNNYWY2blA4TWdsVUZtMFhWQk1vS0llUEorMkFidXcyTUFhQkY1THQzVmx0UnlNYnY3b2dkZmpjWHNqU0NGL084dkQ4d0FFSmx2SXo4dEhvWGg1ZmVGd2RBdUF6bWd2OGRNVmZhS1Zvd0FnZnJaS0tuMkpyNlNhMDRjTFhuRzBVVmwxcWZRbDhlU0s0WTlsYUZNd3R4OERZQ2c0b0VFV0RBWDdBWmpiVzNCbkh6YUViWWxzUlA4YzVjaDZWQmpMUm5rdGxhQzhxQXhFeUlqOG1FUXJPMTg3VCtnb3U5ODVndzZIQ0tpdlQvaUpEWlNpcWFxQk55U0s4cnJ3NmFkMUFBQUFBRWxGVGtTdVFtQ0MnLAogICAgICAgICAgICAgICAgYXBpOmZ1bmN0aW9uKGFyZ3MpewogICAgICAgICAgICAgICAgICAgIHZhciB1cmw9J2h0dHA6Ly9zaHVvLmRvdWJhbi5jb20vJTIxc2VydmljZS9zaGFyZT8nKwogICAgICAgICAgICAgICAgICAgICAgICAnaHJlZj0nK2FyZ3MudXJsKwogICAgICAgICAgICAgICAgICAgICAgICAnJm5hbWU9JythcmdzLnRpdGxlKwogICAgICAgICAgICAgICAgICAgICAgICAnJmltYWdlPScrYXJncy5waWM7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgd1NpemU6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaDozNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OjYwMCwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9OwoKICAgICAgICBpZiAodHlwZW9mIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCAhPSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aCA9IGZ1bmN0aW9uKHN0cikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2xpY2UoMCwgc3RyLmxlbmd0aCkgPT0gc3RyOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0TVN0cihmdW5jKSB7CiAgICAgICAgICAgIHZhciBsaW5lcyA9IGZ1bmMudG9TdHJpbmcoKTsKICAgICAgICAgICAgbGluZXMgPSBsaW5lcy5zdWJzdHJpbmcobGluZXMuaW5kZXhPZigiLyoiKSArIDMsIGxpbmVzLmxhc3RJbmRleE9mKCIqLyIpKTsKICAgICAgICAgICAgcmV0dXJuIGxpbmVzOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdG9SRShvYmosIGZsYWcpIHsKICAgICAgICAgICAgaWYgKCFvYmopIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUmVnRXhwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWcpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKG9iaiwgZmxhZyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKG9ialswXSwgb2JqWzFdKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKG9iai5pbmRleE9mKCcqJykgIT0gLTEgJiYgb2JqLmluZGV4T2YoJy4qJykgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBvYmogPSB3aWxkY2FyZFRvUmVnRXhwU3RyKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChvYmopOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB3aWxkY2FyZFRvUmVnRXhwU3RyKHVybHN0cikgewogICAgICAgICAgICBpZiAodXJsc3RyLnNvdXJjZSkgcmV0dXJuIHVybHN0ci5zb3VyY2U7CiAgICAgICAgICAgIHZhciByZWcgPSB1cmxzdHIucmVwbGFjZSgvWygpXFtcXXt9fCsuLF4kP1xcXS9nLCAiXFwkJiIpLnJlcGxhY2UoL1wqKy9nLCBmdW5jdGlvbihzdHIpewogICAgICAgICAgICAgICAgcmV0dXJuIHN0ciA9PT0gIioiID8gIi4qIiA6ICJbXi9dKiI7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gIl4iICsgcmVnICsgIiQiOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaXNYUGF0aCh4cGF0aCkgewogICAgICAgICAgICByZXR1cm4geHBhdGguc3RhcnRzV2l0aCgnLi8nKSB8fCB4cGF0aC5zdGFydHNXaXRoKCcvLycpIHx8IHhwYXRoLnN0YXJ0c1dpdGgoJ2lkKCcpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0RWxlbWVudE1peChzZWxlY3RvciwgY29udGV4dE5vZGUsIGRvYykgewogICAgICAgICAgICB2YXIgcmV0OwogICAgICAgICAgICBpZiAoIXNlbGVjdG9yIHx8ICFjb250ZXh0Tm9kZSkgcmV0dXJuIHJldDsKICAgICAgICAgICAgZG9jID0gZG9jIHx8IGRvY3VtZW50OwoKICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlb2Ygc2VsZWN0b3I7CiAgICAgICAgICAgIGlmICh0eXBlID09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNYUGF0aChzZWxlY3RvcikpIHsKICAgICAgICAgICAgICAgICAgICByZXQgPSBnZXRFbGVtZW50QnlYcGF0aChzZWxlY3RvciwgY29udGV4dE5vZGUsIGRvYyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldCA9IGNvbnRleHROb2RlLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXQgPSBzZWxlY3Rvcihjb250ZXh0Tm9kZSwgZG9jKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbGF1bmNoRnVsbFNjcmVlbihlbGVtZW50KSB7CiAgICAgICAgICAgIGlmIChlbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5tc1JlcXVlc3RGdWxsc2NyZWVuKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50Lm1zUmVxdWVzdEZ1bGxzY3JlZW4oKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50Lm1velJlcXVlc3RGdWxsU2NyZWVuKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50Lm1velJlcXVlc3RGdWxsU2NyZWVuKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikgewogICAgICAgICAgICAgICAgZWxlbWVudC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbihFbGVtZW50LkFMTE9XX0tFWUJPQVJEX0lOUFVUKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gY2FuY2VsRnVsbFNjcmVlbigpIHsKICAgICAgICAgICAgaWYgKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIOajgOa1i+e8qeaUvgogICAgICAgIGZ1bmN0aW9uIGRldGVjdFpvb20gKCl7CiAgICAgICAgICAgIHZhciByYXRpbyA9IDAsCiAgICAgICAgICAgICAgICBzY3JlZW4gPSB3aW5kb3cuc2NyZWVuLAogICAgICAgICAgICAgICAgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7CgogICAgICAgICAgICBpZiAod2luZG93LmRldmljZVBpeGVsUmF0aW8gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh+dWEuaW5kZXhPZignbXNpZScpKSB7CiAgICAgICAgICAgICAgICBpZiAoc2NyZWVuLmRldmljZVhEUEkgJiYgc2NyZWVuLmxvZ2ljYWxYRFBJKSB7CiAgICAgICAgICAgICAgICAgICAgcmF0aW8gPSBzY3JlZW4uZGV2aWNlWERQSSAvIHNjcmVlbi5sb2dpY2FsWERQSTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh3aW5kb3cub3V0ZXJXaWR0aCAhPT0gdW5kZWZpbmVkICYmIHdpbmRvdy5pbm5lcldpZHRoICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJhdGlvID0gd2luZG93Lm91dGVyV2lkdGggLyB3aW5kb3cuaW5uZXJXaWR0aDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHJhdGlvKXsKICAgICAgICAgICAgICAgIHJhdGlvID0gTWF0aC5yb3VuZChyYXRpbyAqIDEwMCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiByYXRpbzsKICAgICAgICB9CgogICAgICAgIC8v6I635Y+W5L2N572uCiAgICAgICAgZnVuY3Rpb24gZ2V0Q29udGVudENsaWVudFJlY3QodGFyZ2V0KXsKICAgICAgICAgICAgdmFyIHJlY3Q9dGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICB2YXIgY29tcFN0eWxlPXVuc2FmZVdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCk7CiAgICAgICAgICAgIHZhciBwRmxvYXQ9cGFyc2VGbG9hdDsKICAgICAgICAgICAgdmFyIHRvcD1yZWN0LnRvcCArIHBGbG9hdChjb21wU3R5bGUucGFkZGluZ1RvcCkgKyBwRmxvYXQoY29tcFN0eWxlLmJvcmRlclRvcFdpZHRoKTsKICAgICAgICAgICAgdmFyIHJpZ2h0PXJlY3QucmlnaHQgLSBwRmxvYXQoY29tcFN0eWxlLnBhZGRpbmdSaWdodCkgLSBwRmxvYXQoY29tcFN0eWxlLmJvcmRlclJpZ2h0V2lkdGgpOwogICAgICAgICAgICB2YXIgYm90dG9tPXJlY3QuYm90dG9tIC0gcEZsb2F0KGNvbXBTdHlsZS5wYWRkaW5nQm90dG9tKSAtIHBGbG9hdChjb21wU3R5bGUuYm9yZGVyQm90dG9tV2lkdGgpOwogICAgICAgICAgICB2YXIgbGVmdD1yZWN0LmxlZnQgKyBwRmxvYXQoY29tcFN0eWxlLnBhZGRpbmdMZWZ0KSArIHBGbG9hdChjb21wU3R5bGUuYm9yZGVyTGVmdFdpZHRoKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHRvcDp0b3AsCiAgICAgICAgICAgICAgICByaWdodDpyaWdodCwKICAgICAgICAgICAgICAgIGJvdHRvbTpib3R0b20sCiAgICAgICAgICAgICAgICBsZWZ0OmxlZnQsCiAgICAgICAgICAgICAgICB3aWR0aDpyaWdodC1sZWZ0LAogICAgICAgICAgICAgICAgaGVpZ2h0OmJvdHRvbS10b3AsCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgLy/ojrflj5bnqpflj6PlpKflsI8uCiAgICAgICAgZnVuY3Rpb24gZ2V0V2luZG93U2l6ZSgpewogICAgICAgICAgICAvKgogICAgICAgIC8v5YyF5ZCr5rua5Yqo5p2hCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgaDp3aW5kb3cuaW5uZXJIZWlnaHQsCiAgICAgICAgICAgIHc6d2luZG93LmlubmVyV2lkdGgsCiAgICAgICAgfTsKICAgICovCgogICAgICAgICAgICAvL+WOu+mZpOa7muWKqOadoeeahOeql+WPo+Wkp+WwjwogICAgICAgICAgICB2YXIgZGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgICAgICAgICB2YXIgYm9keT1kb2N1bWVudC5ib2R5OwogICAgICAgICAgICB2YXIgYmFja0NvbXBhdD1kb2N1bWVudC5jb21wYXRNb2RlPT0nQmFja0NvbXBhdCc7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBoOmJhY2tDb21wYXQ/IGJvZHkuY2xpZW50SGVpZ2h0IDogZGUuY2xpZW50SGVpZ2h0LAogICAgICAgICAgICAgICAgdzpiYWNrQ29tcGF0PyBib2R5LmNsaWVudFdpZHRoIDogZGUuY2xpZW50V2lkdGgsCiAgICAgICAgICAgIH07CgogICAgICAgIH07CgogICAgICAgIC8v6I635Y+W5bey5rua5Yqo55qE6Led56a7CiAgICAgICAgZnVuY3Rpb24gZ2V0U2Nyb2xsZWQoY29udGFpbmVyKXsKICAgICAgICAgICAgaWYoY29udGFpbmVyKXsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgeDpjb250YWluZXIuc2Nyb2xsTGVmdCwKICAgICAgICAgICAgICAgICAgICB5OmNvbnRhaW5lci5zY3JvbGxUb3AsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgeDonc2Nyb2xsWCcgaW4gd2luZG93ID8gd2luZG93LnNjcm9sbFggOiAoJ3BhZ2VYT2Zmc2V0JyBpbiB3aW5kb3cgPyB3aW5kb3cucGFnZVhPZmZzZXQgOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpLAogICAgICAgICAgICAgICAgeTonc2Nyb2xsWScgaW4gd2luZG93ID8gd2luZG93LnNjcm9sbFkgOiAoJ3BhZ2VZT2Zmc2V0JyBpbiB3aW5kb3cgPyB3aW5kb3cucGFnZVlPZmZzZXQgOiAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCksCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCiAgICAgICAgLy94cGF0aCDojrflj5bljZXkuKrlhYPntKAKICAgICAgICBmdW5jdGlvbiBnZXRFbGVtZW50QnlYcGF0aCh4cGF0aCxjb250ZXh0Tm9kZSxkb2MpewogICAgICAgICAgICBkb2M9ZG9jIHx8IGRvY3VtZW50OwogICAgICAgICAgICBjb250ZXh0Tm9kZT1jb250ZXh0Tm9kZSB8fCBkb2M7CiAgICAgICAgICAgIHJldHVybiBkb2MuZXZhbHVhdGUoeHBhdGgsY29udGV4dE5vZGUsbnVsbCw5LG51bGwpLnNpbmdsZU5vZGVWYWx1ZTsKICAgICAgICB9OwoKCiAgICAgICAgLy/kuovku7bmlK/mjIHmo4DmtYsuCiAgICAgICAgZnVuY3Rpb24gZXZlbnRTdXBwb3J0ZWQoIGV2ZW50TmFtZSxlbGVtICl7CiAgICAgICAgICAgIGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICBldmVudE5hbWUgPSAib24iICsgZXZlbnROYW1lOwogICAgICAgICAgICB2YXIgaXNTdXBwb3J0ZWQgPSAoZXZlbnROYW1lIGluIGVsZW0pOwogICAgICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKXsKICAgICAgICAgICAgICAgIGlmKCFlbGVtLnNldEF0dHJpYnV0ZSl7Ly9zZXRBdHRyaWJ1dGXmmK/lhYPntKDoioLngrnnmoTmlrnms5UKICAgICAgICAgICAgICAgICAgICBlbGVtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBzZXRBdHRyOwogICAgICAgICAgICAgICAgaWYoIWVsZW0uaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpewogICAgICAgICAgICAgICAgICAgIHNldEF0dHI9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICBlbGVtLnNldEF0dHJpYnV0ZShldmVudE5hbWUsICJyZXR1cm47Iik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaXNTdXBwb3J0ZWQgPSB0eXBlb2YgZWxlbVtldmVudE5hbWVdID09ICJmdW5jdGlvbiI7CiAgICAgICAgICAgICAgICBpZihzZXRBdHRyKWVsZW0ucmVtb3ZlQXR0cmlidXRlKGV2ZW50TmFtZSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiBpc1N1cHBvcnRlZDsKICAgICAgICB9OwoKCiAgICAgICAgLy/mo4DmtYvlsZ7mgKfmlK/mjIEuZG9t5bGe5oCnCiAgICAgICAgLy/ov5Tlm57luKbliY3nvIDnmoTlj6/ku6Xnm7TmjqXmiafooYzmmK/lsZ7mgKcKICAgICAgICBmdW5jdGlvbiBwcm9TdXBwb3J0ZWQocHJvTmFtZSxlbGVtKXsKICAgICAgICAgICAgLy/liKTmlq3nrKzkuIDkuKrlrZfmr43mmK/lkKblpKflhpnvvIzlpoLmnpzmmK/nmoTor53vvIzkuLrmnoTpgKDlh73mlbDvvIzliY3nvIDkuZ/opoHlpKflhpkKICAgICAgICAgICAgdmFyIHByZWZpeD0vXltBLVpdLy50ZXN0KHByb05hbWUpPyBbJycsJ1dlYktpdC0nLCdPLScsJ01vei0nLCdNUy0nXSA6IFsnJywnd2Via2l0LScsJ28tJywnbW96LScsJ21zLSddOwogICAgICAgICAgICB2YXIgaT0wOwogICAgICAgICAgICB2YXIgcF9pOwogICAgICAgICAgICB2YXIgc1Byb05hbWU7CiAgICAgICAgICAgIGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICB3aGlsZSh0eXBlb2YgKHBfaT1wcmVmaXhbaSsrXSkhPSd1bmRlZmluZWQnKXsKICAgICAgICAgICAgICAgIHNQcm9OYW1lPShwX2krcHJvTmFtZSkucmVwbGFjZSgvLShbQS16XSkvZyxmdW5jdGlvbihhLGIpewogICAgICAgICAgICAgICAgICAgIHJldHVybiBiLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coc1Byb05hbWUpOwogICAgICAgICAgICAgICAgaWYoc1Byb05hbWUgaW4gZWxlbSlyZXR1cm4gc1Byb05hbWU7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCgogICAgICAgIC8vY3Nz5bGe5oCn5pSv5oyBCiAgICAgICAgLy/luKbliY3nvIDnmoTpu5jorqTkuLrlpKflhpnvvIjmiYDmnInmtY/op4jlmajmlK/mjIHvvIkKICAgICAgICAvL+avlOWmgldlYmtpdFRyYW5zZm9ybSxNb3pUcmFuc2Zvcm0sT1RyYW5zZm9tcgogICAgICAgIC8vY2hyb21l5rWP6KeI5Zmo5aSn5bCP5YaZ5YmN57yA6YO96KGM44CCCiAgICAgICAgLy9maXJlZm94LG9wZXJh5Y+q6IO95aSn5YaZCiAgICAgICAgLy9pZSA5K+WPquiDveWwj+WGmQogICAgICAgIGZ1bmN0aW9uIGNzc1Byb1N1cHBvcnRlZChwcm9OYW1lLGVsZW0sY2FwaXRhbGl6ZSl7CiAgICAgICAgICAgIGlmKGNhcGl0YWxpemUhPT1mYWxzZSljYXBpdGFsaXplPXRydWU7CiAgICAgICAgICAgIHByb05hbWU9cHJvTmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAgICAgdmFyIHByZWZpeD1bJycsJy13ZWJraXQtJywnLW8tJywnLW1vei0nLCctbXMtJ107CiAgICAgICAgICAgIGVsZW09ZWxlbSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgdmFyIHN0eWxlPWVsZW0uc3R5bGU7CiAgICAgICAgICAgIHZhciBjYW1lbFBybzsKCiAgICAgICAgICAgIC8vIOS8muacieS4qumUmeivryBpbnZhbGlkICdpbicgb3BlcmFuZCBzdHlsZQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZm9yKHZhciBpPTAsaWk9cHJlZml4Lmxlbmd0aDtpPGlpO2krKyl7CiAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0PXRydWU7CiAgICAgICAgICAgICAgICAgICAgY2FtZWxQcm89KHByZWZpeFtpXStwcm9OYW1lKS5yZXBsYWNlKC8tKFthLXpdKS9nLGZ1bmN0aW9uKGEsYil7CiAgICAgICAgICAgICAgICAgICAgICAgIGI9Yi50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZihmaXJzdCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdD1mYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFjYXBpdGFsaXplKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiPWIudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coY2FtZWxQcm8pOwogICAgICAgICAgICAgICAgICAgIGlmKGNhbWVsUHJvIGluIHN0eWxlKXsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbWVsUHJvOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaChleCkge30KCiAgICAgICAgICAgIGlmKCFjYXBpdGFsaXplKXJldHVybjsKICAgICAgICAgICAgcmV0dXJuIGNzc1Byb1N1cHBvcnRlZChwcm9OYW1lLGVsZW0sZmFsc2UpOwoKICAgICAgICB9OwoKICAgICAgICAvL2Nzc+WxnuaAp+WAvOaUr+aMgQogICAgICAgIGZ1bmN0aW9uIGNzc1ZhbHVlU3VwcG9ydGVkKHByb05hbWUsdmFsdWUsZWxlbSl7CiAgICAgICAgICAgIHZhciBwcmVmaXg9WycnLCctd2Via2l0LScsJy1vLScsJy1tb3otJywnLW1zLSddOwogICAgICAgICAgICBlbGVtPWVsZW0gfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIHZhciBzdHlsZT1lbGVtLnN0eWxlOwogICAgICAgICAgICB2YXIgcHJlZml4ZWRWYWx1ZTsKICAgICAgICAgICAgZm9yKHZhciBpPTAsaWk9cHJlZml4Lmxlbmd0aDtpPGlpO2krKyl7CiAgICAgICAgICAgICAgICBwcmVmaXhlZFZhbHVlPXByZWZpeFtpXSArIHZhbHVlOwogICAgICAgICAgICAgICAgc3R5bGVbcHJvTmFtZV09cHJlZml4ZWRWYWx1ZTsKICAgICAgICAgICAgICAgIGlmKHN0eWxlW3Byb05hbWVdPT1wcmVmaXhlZFZhbHVlKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ZWRWYWx1ZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKCgogICAgICAgIC8vZWxlbS5kYXRhc2V055qE5YW85a655a6e546wCiAgICAgICAgLy9pZeS4jeaUr+aMge+8m2ZpcmVmb3hHTeWCqOWtmOS4jeiDveWPjeaYoOWIsOWFg+e0oOWxnuaAp+S4iuOAggogICAgICAgIGZ1bmN0aW9uIGRhdGFzZXQoZWxlbSxwcm8sdmFsdWUpewoKICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RGF0YVByZWZpeCgpewogICAgICAgICAgICAgICAgcmV0dXJuICdkYXRhLScgKyBwcm8ucmVwbGFjZSgvW0EtWl0vZyxmdW5jdGlvbihtKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy0nICsgbS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZih0eXBlb2YgdmFsdWU9PSd1bmRlZmluZWQnKXsvL+WPluWAvAogICAgICAgICAgICAgICAgaWYoZWxlbS5kYXRhc2V0KXsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVsZW0uZGF0YXNldFtwcm9dOwogICAgICAgICAgICAgICAgfWVsc2V7Ly/msqHmnInlj5bliLDlgLzvvIzov5Tlm551bmRlZmluZWTvvIxnZXRBdHRyaWJ1dGXpu5jorqTmmK/ov5Tlm55udWxs77yM5omA5Lul5Yik5pat5LiA5LiL44CCCiAgICAgICAgICAgICAgICAgICAgdmFyIHByZWZpeGVkUHJvPWdldERhdGFQcmVmaXgoKTsKICAgICAgICAgICAgICAgICAgICBpZihlbGVtLmhhc0F0dHJpYnV0ZShwcmVmaXhlZFBybykpewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1lbGVtLmdldEF0dHJpYnV0ZShwcmVmaXhlZFBybyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoZ2V0RGF0YVByZWZpeCgpLHZhbHVlKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwoKCiAgICAgICAgLy/ph43mlrDmo4Dmn6Xmgqzmta7lm77niYcKICAgICAgICBmdW5jdGlvbiBpbWdSZUhvdmVyKGltZyl7CiAgICAgICAgICAgIC8v6KaB5qOA5p+l55qE5Zu+54mH77yM5piv5b2T5YmN5oKs5rWu55qE44CCCiAgICAgICAgICAgIGlmKCFmbG9hdEJhci5zaG93biB8fCBmbG9hdEJhci5kYXRhLmltZyAhPSBpbWcpcmV0dXJuOwogICAgICAgICAgICAvL2NvbnNvbGUubG9nKGltZyk7CgogICAgICAgICAgICB2YXIgbUhvdmVyPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50Jyk7CiAgICAgICAgICAgIHZhciBjcj1pbWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgIG1Ib3Zlci5pbml0TW91c2VFdmVudCgnbW91c2VvdmVyJyx0cnVlLHRydWUsd2luZG93LDAsIGNyLmxlZnQgKyAxMCwgY3IudG9wICsgMTAsIGNyLmxlZnQgKyAxMCwgY3IudG9wICsgMTAsIGZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlLCAwLG51bGwpOwogICAgICAgICAgICBpbWcuZGlzcGF0Y2hFdmVudChtSG92ZXIpOwogICAgICAgIH07CgogICAgICAgIC8vIOiOt+WPluecn+ato+eahHVuc2FmZVdpbmRvdyxjaHJvbWXph4zpnaLkuZ/og73orr/pl67liLDnnJ/lrp7njq/looPnmoTlj5jph48KICAgICAgICAvLyDlnKggY2hyb21lIDM3IOa1i+ivleaXoOaViAogICAgICAgIGlmKCFlbnZpci5maXJlZm94ICYmICFlbnZpci5vcGVyYSAmJiAhZW52aXIuaWUgJiYgIXN0b3JhZ2Uuc3VwcG9ydEdNKXsKICAgICAgICAgICAgOyhmdW5jdGlvbigpewogICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGljVmlld2VyLXJldHVybi11bnNhZmVXaW5kb3cnLGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgIHVuc2FmZVdpbmRvdyA9IGUuZGV0YWlsOwogICAgICAgICAgICAgICAgICAgIC8vIGFsZXJ0KHVuc2FmZVdpbmRvdy4kKTsKICAgICAgICAgICAgICAgIH0sdHJ1ZSk7CgogICAgICAgICAgICAgICAgLy/pobXpnaLohJrmnKwKICAgICAgICAgICAgICAgIHZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgICAgICAgICAgcy50ZXh0Q29udGVudD0nKCcgKyAoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICB2YXIgY3VzRXZlbnQ9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgY3VzRXZlbnQuaW5pdEN1c3RvbUV2ZW50KCdwaWNWaWV3ZXItcmV0dXJuLXVuc2FmZVdpbmRvdycsZmFsc2UsZmFsc2Usd2luZG93KTsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGN1c0V2ZW50KTsKICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCkgKycpKCknOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgICAgICAgICAgfSkoKTsKICAgICAgICB9OwoKCiAgICAgICAgLy/mipvlh7rplJnor6/liLDplJnor6/mjqfliLblj7AKICAgICAgICBmdW5jdGlvbiB0aHJvd0Vycm9ySW5mbyhlcnIpewogICAgICAgICAgICBpZihjb25zb2xlICYmIGNvbnNvbGUuZXJyb3IpewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIubWVzc2FnZSArICdcblxuJyArIChlcnIuc3RhY2t0cmFjZT8gZXJyLnN0YWNrdHJhY2UgOiAnJykgKyAnXG5cbicgLCBlcnIpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIC8v5a+56LGh5YWL6ZqGCiAgICAgICAgZnVuY3Rpb24gY2xvbmVPYmplY3Qob2JqLGRlZXApewogICAgICAgICAgICB2YXIgb2JqX2k7CiAgICAgICAgICAgIHZhciByZXQ9QXJyYXkuaXNBcnJheShvYmopPyBbXSA6IHt9OwogICAgICAgICAgICBmb3IodmFyIGkgaW4gb2JqKXsKICAgICAgICAgICAgICAgIGlmKCFvYmouaGFzT3duUHJvcGVydHkoaSkpY29udGludWU7CiAgICAgICAgICAgICAgICBvYmpfaT1vYmpbaV07CiAgICAgICAgICAgICAgICBpZighZGVlcCB8fCB0eXBlb2Ygb2JqX2khPSdvYmplY3QnIHx8IG9ial9pPT09bnVsbCB8fCBvYmpfaS5ub2RlVHlwZSl7CiAgICAgICAgICAgICAgICAgICAgcmV0W2ldPW9ial9pOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgcmV0W2ldPWNsb25lT2JqZWN0KG9ial9pLGRlZXApOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9OwoKICAgICAgICAvL+mXqueDgeWFg+e0oOOAggogICAgICAgIGZ1bmN0aW9uIGZsYXNoRWxlKGVsZSxkdXJhdGlvbil7CiAgICAgICAgICAgIGlmKGRhdGFzZXQoZWxlLCdwdkZsYXNoaW5nJykpcmV0dXJuOwogICAgICAgICAgICBpZihlbGUub2Zmc2V0SGVpZ2h0PT0wKXJldHVybjsKICAgICAgICAgICAgZGF0YXNldChlbGUsJ3B2Rmxhc2hpbmcnLCcxJyk7CgogICAgICAgICAgICB2YXIgb091dGxpbmU9ZWxlLnN0eWxlLm91dGxpbmU7CiAgICAgICAgICAgIHZhciBvT3V0bGluZU9mZnNldD1lbGUuc3R5bGUub3V0bGluZU9mZnNldDsKICAgICAgICAgICAgdmFyIG9PcGFjaXR5PWVsZS5zdHlsZS5vcGFjaXR5OwogICAgICAgICAgICB2YXIgb1RyYW5zZm9ybT1lbGUuc3R5bGVbc3VwcG9ydC5jc3NUcmFuc2Zvcm1dOwoKICAgICAgICAgICAgdmFyIGNvdW50PTA7CiAgICAgICAgICAgIHZhciBzdGFydFRpbWU9RGF0ZS5ub3coKTsKICAgICAgICAgICAgZHVyYXRpb249ZHVyYXRpb24/IGR1cmF0aW9uIDogMTIwMDsKCiAgICAgICAgICAgIHZhciBmbGFzaEludGVydmFsPXNldEludGVydmFsKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB2YXIgb3V0bGluZT0nbm9uZScsCiAgICAgICAgICAgICAgICAgICAgb3V0bGluZU9mZnNldD0wLAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk9MC4zLAogICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT0nJzsKCiAgICAgICAgICAgICAgICBpZihjb3VudCAlIDIgPT0gMCl7CiAgICAgICAgICAgICAgICAgICAgb3V0bGluZT0nNXB4IGRhc2hlZCByZ2JhKDI1NSwwLDAsMC45NSknOwogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk9MC45NTsKICAgICAgICAgICAgICAgICAgICBvdXRsaW5lT2Zmc2V0PScxcHgnOwogICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT0nc2NhbGUoMS4xKSc7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBpZigoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSkgPiBkdXJhdGlvbil7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoZmxhc2hJbnRlcnZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU9b091dGxpbmU7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk9b09wYWNpdHk7CiAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmVPZmZzZXQ9b091dGxpbmVPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT1vVHJhbnNmb3JtOwogICAgICAgICAgICAgICAgICAgICAgICBlbGUucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXB2LWZsYXNoaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgZWxlLnN0eWxlLm91dGxpbmU9b3V0bGluZTsKICAgICAgICAgICAgICAgIGVsZS5zdHlsZS5vdXRsaW5lT2Zmc2V0PW91dGxpbmVPZmZzZXQ7CiAgICAgICAgICAgICAgICBlbGUuc3R5bGUub3BhY2l0eT1vcGFjaXR5OwogICAgICAgICAgICAgICAgZWxlLnN0eWxlW3N1cHBvcnQuY3NzVHJhbnNmb3JtXT10cmFuc2Zvcm07CgogICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgfSw4MCk7CiAgICAgICAgfTsKCiAgICAgICAgLy/mlK/mjIHmg4XlhrUuCiAgICAgICAgdmFyIHN1cHBvcnQ9ewogICAgICAgICAgICBjc3NUcmFuc2Zvcm06Y3NzUHJvU3VwcG9ydGVkKCd0cmFuc2Zvcm0nKSwKICAgICAgICAgICAgY3NzQ3Vyc29yVmFsdWU6ewogICAgICAgICAgICAgICAgem9vbUluOmNzc1ZhbHVlU3VwcG9ydGVkKCdjdXJzb3InLCd6b29tLWluJyksCiAgICAgICAgICAgICAgICB6b29tT3V0OmNzc1ZhbHVlU3VwcG9ydGVkKCdjdXJzb3InLCd6b29tLW91dCcpLAogICAgICAgICAgICAgICAgZ3JhYjpjc3NWYWx1ZVN1cHBvcnRlZCgnY3Vyc29yJywnZ3JhYicpLAogICAgICAgICAgICAgICAgZ3JhYmJpbmc6Y3NzVmFsdWVTdXBwb3J0ZWQoJ2N1cnNvcicsJ2dyYWJiaW5nJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKCgogICAgICAgIC8vY29uc29sZS5sb2coJ+a1j+iniOWZqOeahOS4gOS6m+WvueixoeaUr+aMgeaDheWGtTonLHN1cHBvcnQpOwoKICAgICAgICAvL+WKqOeUu+eul+azlQogICAgICAgIC8qCiAgICAgICAgIHQ6IGN1cnJlbnQgdGltZe+8iOW9k+WJjeaXtumXtO+8ie+8mwogICAgICAgICBiOiBiZWdpbm5pbmcgdmFsdWXvvIjliJ3lp4vlgLzvvInvvJsKICAgICAgICAgYzogY2hhbmdlIGluIHZhbHVl77yI5Y+Y5YyW6YeP77yJ77ybCiAgICAgICAgIGQ6IGR1cmF0aW9u77yI5oyB57ut5pe26Ze077yJ44CCCiAgICAgICAgKi8KCiAgICAgICAgdmFyIFR3ZWVuID0gewogICAgICAgICAgICBDdWJpYzogewogICAgICAgICAgICAgICAgZWFzZUluT3V0OmZ1bmN0aW9uKHQsYixjLGQpewogICAgICAgICAgICAgICAgICAgIHJldHVybiAtYy8yKihNYXRoLmNvcyhNYXRoLlBJKnQvZCktMSkrYgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgIH07CgogICAgICAgIC8vaW1nUmVhZHkKICAgICAgICB2YXIgaW1nUmVhZHk9KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHZhciBpUkludGVydmFsLAogICAgICAgICAgICAgICAgaVJSZWFkeUZuPVtdLAogICAgICAgICAgICAgICAgaXNyY3M9W10KICAgICAgICAgICAgOwoKICAgICAgICAgICAgdmFyIHRpbWVMaW1pdD0zICogNjAgKiAxMDAwOy8vM+WIhumSnwoKICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tSZWFkeSgpewogICAgICAgICAgICAgICAgdmFyIG5vdz0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wLGlpPWlSUmVhZHlGbi5sZW5ndGgsaVJSZWFkeUZuX2k7aTxpaTtpKyspewogICAgICAgICAgICAgICAgICAgIGlSUmVhZHlGbl9pPWlSUmVhZHlGbltpXTsKICAgICAgICAgICAgICAgICAgICAvL25vdyAtIGlSUmVhZHlGbl9pLnN0YXJ0VGltZSA+PSB0aW1lTGltaXQgfHwKICAgICAgICAgICAgICAgICAgICBpZihpUlJlYWR5Rm5faSgpKXsKICAgICAgICAgICAgICAgICAgICAgICAgaVJSZWFkeUZuLnNwbGljZShpLDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpc3Jjcy5zcGxpY2UoaSwxKTsKICAgICAgICAgICAgICAgICAgICAgICAgaS0tOwogICAgICAgICAgICAgICAgICAgICAgICBpaS0tOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY2hlY2tSZWFkeScsaVJSZWFkeUZuLmxlbmd0aCkKICAgICAgICAgICAgICAgIGlmKGlSUmVhZHlGbi5sZW5ndGg9PTApewogICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaVJJbnRlcnZhbCk7CiAgICAgICAgICAgICAgICAgICAgaVJJbnRlcnZhbD1udWxsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKCgoKICAgICAgICAgICAgdmFyIGltZ1JlYWR5PWZ1bmN0aW9uKGltZyxvcHRzKXsKCiAgICAgICAgICAgICAgICBpZigvTm9kZUxpc3R8SFRNTENvbGxlY3Rpb24vLnRlc3QoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGltZykpICB8fCBBcnJheS5pc0FycmF5KGltZykpewogICAgICAgICAgICAgICAgICAgIGFycmF5Rm4uZm9yRWFjaC5jYWxsKGltZyxmdW5jdGlvbihpbWcsaW5kZXgsYXJyYXkpewogICAgICAgICAgICAgICAgICAgICAgICBpZihpbWcgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1JlYWR5KGltZyxvcHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmKCEoaW1nIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkpewogICAgICAgICAgICAgICAgICAgIHZhciB0X2ltZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKICAgICAgICAgICAgICAgICAgICB0X2ltZy5zcmM9aW1nOwogICAgICAgICAgICAgICAgICAgIGltZz10X2ltZzsKICAgICAgICAgICAgICAgICAgICB0X2ltZz1udWxsOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB2YXIgcmVhZHksbG9hZCxlcnJvcixsb2FkRW5kLGFib3J0LHRpbWVvdXQsdGltZTsKICAgICAgICAgICAgICAgIHJlYWR5PW9wdHMucmVhZHk7CiAgICAgICAgICAgICAgICBsb2FkPW9wdHMubG9hZDsKICAgICAgICAgICAgICAgIGVycm9yPW9wdHMuZXJyb3I7CiAgICAgICAgICAgICAgICBsb2FkRW5kPW9wdHMubG9hZEVuZDsKICAgICAgICAgICAgICAgIGFib3J0PW9wdHMuYWJvcnQ7CiAgICAgICAgICAgICAgICB0aW1lb3V0PW9wdHMudGltZW91dDsKICAgICAgICAgICAgICAgIHRpbWU9dHlwZW9mIG9wdHMudGltZT09J251bWJlcic/IG9wdHMudGltZSA6IDA7CgogICAgICAgICAgICAgICAgaWYodGltZSl7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICBpZighbG9hZEVuZERvbmUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRlZD10cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy5zcmM9IHByZWZzLmljb25zLmJyb2tlbkltZ19zbWFsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRpbWVvdXQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQuY2FsbChpbWcsewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6aW1nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOid0aW1lb3V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkRW5kRG9uZT10cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9hZEVuZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEVuZC5jYWxsKGltZyx7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDppbWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6J3RpbWVvdXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSx0aW1lKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdmFyIHNyYz1pbWcuc3JjOwogICAgICAgICAgICAgICAgdmFyIGxvYWRFbmREb25lOwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdvKHR5cGUsZSl7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHR5cGUpewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsb2FkJzp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28oJ3JlYWR5Jyk7Ly/lpoLmnpznm7TmjqXop6blj5Fsb2Fk77yM6YKj5LmI5YWI6Kem5Y+RcmVhZHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvYWQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQuY2FsbChpbWcsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFsb2FkRW5kRG9uZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEVuZERvbmU9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsb2FkRW5kKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEVuZC5jYWxsKGltZyxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyZWFkeSc6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXJlYWR5IHx8IHJlYWR5SGFuZGxlci5kb25lKXJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5SGFuZGxlci5kb25lPXRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkeS5jYWxsKGltZyx7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OmltZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOidyZWFkeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlcnJvcic6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVycm9yKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5jYWxsKGltZyxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighbG9hZEVuZERvbmUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRFbmREb25lPXRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobG9hZEVuZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRFbmQuY2FsbChpbWcsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB2YXIgYWJvcnRlZDsKICAgICAgICAgICAgICAgIHZhciByZXQ9ewogICAgICAgICAgICAgICAgICAgIGltZzppbWcsCiAgICAgICAgICAgICAgICAgICAgYWJvcnQ6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWxvYWRFbmREb25lKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQ9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWcuc3JjPSBwcmVmcy5pY29ucy5icm9rZW5JbWdfc21hbGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhYm9ydCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQuY2FsbChpbWcsewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6aW1nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOidhYm9ydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEVuZERvbmU9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvYWRFbmQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRFbmQuY2FsbChpbWcsewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6aW1nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOidhYm9ydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlYWR5SGFuZGxlcigpey8v5bC95b+r55qE5qOA5rWL5Zu+54mH5aSn5bCPLgogICAgICAgICAgICAgICAgICAgIGlmKGxvYWRFbmREb25lIHx8IGFib3J0ZWQpcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgaWYoaW1nLm5hdHVyYWxXaWR0aD09MCB8fCBpbWcubmF0dXJhbEhlaWdodD09MClyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgZ28oJ3JlYWR5Jyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsb2FkSGFuZGxlcihlKXsKICAgICAgICAgICAgICAgICAgICBnbygnbG9hZCcsZSk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVycm9ySGFuZGxlcihlKXsKICAgICAgICAgICAgICAgICAgICBnbygnZXJyb3InLGUpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcigpewogICAgICAgICAgICAgICAgICAgIGltZy5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJyxsb2FkSGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpbWcucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLGVycm9ySGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy9yZWFkeeW/hemhu+WcqGxvYWTkuYvliY3op6blj5HjgIIKCiAgICAgICAgICAgICAgICBpZihpbWcuY29tcGxldGUpey8v5Zu+54mH5bey57uP5Yqg6L295a6M5oiQLgogICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBpbWcud2lkdGg9PSdudW1iZXInICYmIGltZy53aWR0aCAmJiBpbWcuaGVpZ2h0KXsvL+WbvueJhwogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhYm9ydGVkKXJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvKCdsb2FkJyx7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTonbG9hZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OmltZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LDApOwogICAgICAgICAgICAgICAgICAgIH1lbHNley8v6L+Z5LiN5piv5Zu+54mHLm9wZXJh5Lya6K+G5Yir6ZSZ6K+vLgogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhYm9ydGVkKXJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvKCdlcnJvcicsewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6J2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6aW1nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sMCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfTsKCgogICAgICAgICAgICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLGxvYWRIYW5kbGVyLHRydWUpOwogICAgICAgICAgICAgICAgaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJyxlcnJvckhhbmRsZXIsdHJ1ZSk7CgoKICAgICAgICAgICAgICAgIGlmKHJlYWR5KXsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXg9aXNyY3MuaW5kZXhPZihzcmMpOwogICAgICAgICAgICAgICAgICAgIGlmKGluZGV4PT0tMSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzcmNzLnB1c2goc3JjKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHlIYW5kbGVyLnN0YXJ0VGltZT0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgaVJSZWFkeUZuLnB1c2gocmVhZHlIYW5kbGVyKTsKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgaVJSZWFkeUZuW2luZGV4XS5zdGFydFRpbWU9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYoIWlSSW50ZXJ2YWwpewogICAgICAgICAgICAgICAgICAgICAgICBpUkludGVydmFsPXNldEludGVydmFsKGNoZWNrUmVhZHksNjYpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gaW1nUmVhZHk7CiAgICAgICAgfSkoKTsKCgogICAgICAgIHZhciBhZGRXaGVlbEV2ZW50PShmdW5jdGlvbigpewoKICAgICAgICAgICAgZnVuY3Rpb24gZ2V0U3VwcG9ydEV2ZW50TmFtZSgpewogICAgICAgICAgICAgICAgdmFyIHJldD0nRE9NTW91c2VTY3JvbGwnOwogICAgICAgICAgICAgICAgaWYoZXZlbnRTdXBwb3J0ZWQoJ3doZWVsJykpey8vdzNjIEZGPj0xNyBpZT49OQogICAgICAgICAgICAgICAgICAgIHJldD0nd2hlZWwnOwogICAgICAgICAgICAgICAgfWVsc2UgaWYoZXZlbnRTdXBwb3J0ZWQoJ21vdXNld2hlZWwnKSl7Ly9vcGVyYSxjaHJvbWUKICAgICAgICAgICAgICAgICAgICByZXQ9J21vdXNld2hlZWwnOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgZXZlbnROYW1lOwoKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVsZSxjYWxsYmFjayx1c2VDYXB0dXJlKXsKICAgICAgICAgICAgICAgIGlmKCFldmVudE5hbWUpewogICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZT1nZXRTdXBwb3J0RXZlbnROYW1lKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGVsZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSxmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZT1lLnR5cGU7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5lOwogICAgICAgICAgICAgICAgICAgIGlmKHR5cGUhPSd3aGVlbCcpewogICAgICAgICAgICAgICAgICAgICAgICBuZT17fTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBpIGluIGUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVbaV09ZVtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5lLnR5cGU9J3doZWVsJzsKICAgICAgICAgICAgICAgICAgICAgICAgbmUuZGVsdGFYPTA7CiAgICAgICAgICAgICAgICAgICAgICAgIG5lLmRlbHRhWT0wOwogICAgICAgICAgICAgICAgICAgICAgICBuZS5kZWx0YVo9MDsKICAgICAgICAgICAgICAgICAgICAgICAgbmUuZGVsdGFNb2RlPTE7Ly9saW5lCiAgICAgICAgICAgICAgICAgICAgICAgIG5lLnByZXZlbnREZWZhdWx0PWUucHJldmVudERlZmF1bHQuYmluZChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmUuc3RvcFByb3BhZ2F0aW9uPWUuc3RvcFByb3BhZ2F0aW9uLmJpbmQoZSk7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeD0wLHk9MDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIGUuYXhpcz09J251bWJlcicpey8vRE9NTW91c2VTY3JvbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUuYXhpcz09Mil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1lLmRldGFpbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg9ZS5kZXRhaWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb3BlcmHml6notbfniYjmnKznmoRtb3VzZXdoZWVs5Y+q5pSv5oyBeei9tOeahOa7muWKqCxlLndoZWVsRGVsdGFZIHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIGUud2hlZWxEZWx0YVk9PSd1bmRlZmluZWQnIHx8ICBlLndoZWVsRGVsdGFZIT0wKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5PS1lLndoZWVsRGVsdGEvNDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4PS1lLndoZWVsRGVsdGEvNDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBuZS5kZWx0YVkgPXk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5lLmRlbHRhWCA9eDsKCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzLG5lPyBuZSA6IGUpOwogICAgICAgICAgICAgICAgfSx1c2VDYXB0dXJlIHx8IGZhbHNlKTsKICAgICAgICAgICAgfTsKICAgICAgICB9KSgpOwoKCiAgICAgICAgdmFyIGFkZEN1c01vdXNlRXZlbnQ9KGZ1bmN0aW9uKCl7CgogICAgICAgICAgICBmdW5jdGlvbiBnZXRTdXBwb3J0ZWQoKXsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgbW91c2VsZWF2ZTpldmVudFN1cHBvcnRlZCgnbW91c2VsZWF2ZScpLAogICAgICAgICAgICAgICAgICAgIG1vdXNlZW50ZXI6ZXZlbnRTdXBwb3J0ZWQoJ21vdXNlZW50ZXInKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CgogICAgICAgICAgICB2YXIgc3VwcG9ydDsKICAgICAgICAgICAgdmFyIG1hcD17CiAgICAgICAgICAgICAgICBtb3VzZWxlYXZlOidtb3VzZW91dCcsCiAgICAgICAgICAgICAgICBtb3VzZWVudGVyOidtb3VzZW92ZXInLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHR5cGUsIGVsZSwgZm4pey8v5LqL5Lu257G75Z6L77yM5YWD57Sg77yM55uR5ZCs5Ye95pWwCiAgICAgICAgICAgICAgICBpZighc3VwcG9ydCl7CiAgICAgICAgICAgICAgICAgICAgc3VwcG9ydD1nZXRTdXBwb3J0ZWQoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gY2hyb21lIDMwKyDomb3nhLbmlK/mjIEgbW91c2VlbnRlcu+8jOS9huaYr+WtmOWcqOmXrumimAogICAgICAgICAgICAgICAgaWYoc3VwcG9ydFt0eXBlXSAmJiAhKHR5cGUgPT0gJ21vdXNlZW50ZXInICYmIHdpbmRvdy5jaHJvbWUpKXsKICAgICAgICAgICAgICAgICAgICBlbGUuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLGZuLGZhbHNlKTsvL21vdXNlbGVhdmUsZW50ZXLkuI3lhpLms6EKICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgIGVsZS5hZGRFdmVudExpc3RlbmVyKG1hcFt0eXBlXSxmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0ZWRUYXJnZXQ9ZS5yZWxhdGVkVGFyZ2V0Oy8vbW91c2VvdXTvvIzljrvlvoDnmoTlhYPntKDvvJttb3VzZW92ZXLvvIzmnaXoh6rnmoTlhYPntKAKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXRoaXMuY29udGFpbnMocmVsYXRlZFRhcmdldCkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4uY2FsbCh0aGlzLGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sdHJ1ZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwoKICAgICAgICB9KSgpOwoKCiAgICAgICAgLy/lupMKICAgICAgICBmdW5jdGlvbiBHYWxsZXJ5QygpewogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICB9OwoKICAgICAgICB2YXIgZ2FsbGVyeTsKICAgICAgICB2YXIgZ2FsbGVyeU1vZGU7CgogICAgICAgIEdhbGxlcnlDLnByb3RvdHlwZT17CiAgICAgICAgICAgIGluaXQ6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHRoaXMuYWRkU3R5bGUoKTsKICAgICAgICAgICAgICAgIHZhciBjb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwoKICAgICAgICAgICAgICAgIHRoaXMuZ2FsbGVyeT1jb250YWluZXI7CiAgICAgICAgICAgICAgICBjb250YWluZXIuY2xhc3NOYW1lPSdwdi1nYWxsZXJ5LWNvbnRhaW5lcic7CiAgICAgICAgICAgICAgICBjb250YWluZXIudGFiSW5kZXg9MTsvL+S4uuS6huiOt+WPlueEpueCue+8jOadpeaIquiOt+mUruebmOS6i+S7tgogICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTD0KICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaGVhZCI+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaGVhZC1mbG9hdC1sZWZ0Ij4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiB0aXRsZT0iJytpMThuKCJwaWNJbmZvIikrJyIgY2xhc3M9InB2LWdhbGxlcnktaGVhZC1sZWZ0LWltZy1pbmZvIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1oZWFkLWxlZnQtaW1nLWluZm8tcmVzb2x1dGlvbiIgdGl0bGU9IicraTE4bigicmVzb2x1dGlvbiIpKyciPjAgeCAwPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtbGVmdC1pbWctaW5mby1jb3VudCIgdGl0bGU9IicraTE4bigicGljTnVtIikrJyI+77yIMSAvIDHvvIk8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaGVhZC1sZWZ0LWltZy1pbmZvLXNjYWxpbmciIHRpdGxlPSInK2kxOG4oInNjYWxlUmF0aW8iKSsnIj7vvIgxMDAl77yJPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LXZlcnRpY2FsLWFsaWduLWhlbHBlciI+PC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtbGVmdC1pbWctaW5mby1kZXNjcmlwdGlvbiIgdGl0bGU9IicraTE4bigicGljTm90ZSIpKyciPjwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT0icmFuZ2UiIGlkPSJtaW5zaXplVyIgbWluPSIwIiBtYXg9IjEwMCIgdmFsdWU9IjAiIHRpdGxlPSJXaWR0aCI+IDxzcGFuIGlkPSJtaW5zaXplV1NwYW4iPjBweDwvc3Bhbj4gJysKICAgICAgICAgICAgICAgICAgICAnPGlucHV0IHR5cGU9InJhbmdlIiBpZD0ibWluc2l6ZUgiIG1pbj0iMCIgbWF4PSIxMDAiIHZhbHVlPSIwIiB0aXRsZT0iSGVpZ2h0Ij4gPHNwYW4gaWQ9Im1pbnNpemVIU3BhbiI+MHB4PC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIHRpdGxlPSInK2kxOG4oImV4aXRDb2xsZWN0aW9uVGlwIikrJyIgY2xhc3M9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kIHB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWV4aXQtY29sbGVjdGlvbiI+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4+JytpMThuKCJleGl0Q29sbGVjdGlvbiIpKyc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktdmVydGljYWwtYWxpZ24taGVscGVyIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCgogICAgICAgICAgICAgICAgICAgICAnPHNwYW4gdGl0bGU9IicraTE4bigibG9hZEFsbFRpcCIpKyciIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZCBwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1uZXh0UGFnZSI+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4+JytpMThuKCJsb2FkQWxsIikrJzwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS12ZXJ0aWNhbC1hbGlnbi1oZWxwZXIiPjwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIHRpdGxlPSInK2kxOG4oImZpZGRsZVRpcCIpKyciIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZCBwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1vcGVyYXRlIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3Bhbj4nK2kxOG4oImZpZGRsZSIpKyc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktdmVydGljYWwtYWxpZ24taGVscGVyIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCgogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtY29udGFpbmVyIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQgcHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtY29sbGVjdCI+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWNvbGxlY3QtaWNvbiI+PC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1jb2xsZWN0LXRleHQiPjwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS12ZXJ0aWNhbC1hbGlnbi1oZWxwZXIiPjwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdCBwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtY29sbGVjdCI+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gdGl0bGU9IicraTE4bigiY29sbGVjdERldGFpbFRpcCIpKyciIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbSBwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbS1jb2xsZWN0LWRlc2NyaXB0aW9uIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3Bhbj4nK2kxOG4oImNvbGxlY3REZXRhaWwiKSsn77yaPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzx0ZXh0YXJlYSBkYXRhLXByZWZzPSJkZXNjcmlwdGlvbiIgY29scz0iMjUiIHJvd3M9IjUiPjwvdGV4dGFyZWE+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1jb250YWluZXIiPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIHRpdGxlPSInK2kxOG4oInBsYXlTbGlkZSIpKyciIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZCBwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1zbGlkZS1zaG93Ij4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmRfb3ZlcmxheWVyIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLXNsaWRlLXNob3ctYnV0dG9uIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtc2xpZGUtc2hvdy1idXR0b24taW5uZXIiPjwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS12ZXJ0aWNhbC1hbGlnbi1oZWxwZXIiPjwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLXNsaWRlLXNob3ctY291bnRkb3duIiB0aXRsZT0iJytpMThuKCJjb3VudERvd24iKSsnIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktdmVydGljYWwtYWxpZ24taGVscGVyIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QgcHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtZHJvcC1saXN0LXNsaWRlLXNob3ciPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbSIgdGl0bGU9IicraTE4bigic2xpZGVHYXBUaXAiKSsnIj4nKwogICAgICAgICAgICAgICAgICAgICc8aW5wdXQgZGF0YS1wcmVmcz0iaW50ZXJ2YWwiIHN0ZXA9IjEiIG1pbj0iMSIgdHlwZT0ibnVtYmVyIiB2YWx1ZT0iNSIgLz4nKwogICAgICAgICAgICAgICAgICAgICc8c3Bhbj4nK2kxOG4oInNsaWRlR2FwIikrJzwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1pdGVtIiAgdGl0bGU9IicraTE4bigic2xpZGVCYWNrVGlwIikrJyI+JysKICAgICAgICAgICAgICAgICAgICAnPGlucHV0IGlkPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbS1zbGlkZS1zaG93LWJhY2t3YXJkIiBkYXRhLXByZWZzPSJiYWNrd2FyZCIgdHlwZT0iY2hlY2tib3giIC8+JysKICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIGZvcj0icHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtZHJvcC1saXN0LWl0ZW0tc2xpZGUtc2hvdy1iYWNrd2FyZCI+JytpMThuKCJzbGlkZUJhY2siKSsn44CA44CA44CAPC9sYWJlbD4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1pdGVtIiAgdGl0bGU9IicraTE4bigic2xpZGVXYWl0VGlwIikrJyI+JysKICAgICAgICAgICAgICAgICAgICAnPGlucHV0IGlkPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbS1zbGlkZS1zaG93LXdhaXQiIGRhdGEtcHJlZnM9IndhaXQiIHR5cGU9ImNoZWNrYm94IiBjaGVja2VkPSJjaGVja2VkIiAvPicrCiAgICAgICAgICAgICAgICAgICAgJzxsYWJlbCBmb3I9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1pdGVtLXNsaWRlLXNob3ctd2FpdCI+JytpMThuKCJzbGlkZVdhaXQiKSsnPC9sYWJlbD4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1pdGVtIiAgdGl0bGU9IicraTE4bigic2xpZGVTa2lwRXJyb3JUaXAiKSsnIj4nKwogICAgICAgICAgICAgICAgICAgICc8aW5wdXQgaWQ9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1pdGVtLXNsaWRlLXNob3ctc2tpcEVycm9ySW1nIiBkYXRhLXByZWZzPSJza2lwRXJyb3JJbWciIHR5cGU9ImNoZWNrYm94IiBjaGVja2VkPSJjaGVja2VkIiAvPicrCiAgICAgICAgICAgICAgICAgICAgJzxsYWJlbCBmb3I9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1pdGVtLXNsaWRlLXNob3ctc2tpcEVycm9ySW1nIj4nK2kxOG4oInNsaWRlU2tpcEVycm9yIikrJzwvbGFiZWw+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1jb250YWluZXIiPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIHRpdGxlPSInK2kxOG4oInR5cGVUaXAiKSsnIiBjbGFzcz0icHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQgcHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtY2F0ZWdvcnkiPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuPicraTE4bigidHlwZSIpKyc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktdmVydGljYWwtYWxpZ24taGVscGVyIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QgcHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtZHJvcC1saXN0LWNhdGVnb3J5Ij4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCgogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtY29udGFpbmVyIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiB0aXRsZT0iJytpMThuKCJjb21tYW5kVGlwIikrJyIgY2xhc3M9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kIHB2LWdhbGxlcnktaGVhZC1jb21tYW5kLW90aGVycyI+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4+JytpMThuKCJjb21tYW5kIikrJzwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS12ZXJ0aWNhbC1hbGlnbi1oZWxwZXIiPjwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdCBwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3Qtb3RoZXJzIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtZHJvcC1saXN0LWl0ZW0iIGRhdGEtY29tbWFuZD0icHNJbWFnZSIgdGl0bGU9IicraTE4bigib25saW5lRWRpdFRpcCIscHJlZnMuZ2FsbGVyeS5lZGl0U2l0ZSkrJyI+JytpMThuKCJvbmxpbmVFZGl0IikrJzwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtZHJvcC1saXN0LWl0ZW0iIGRhdGEtY29tbWFuZD0iZXhwb3J0SW1hZ2VzIiB0aXRsZT0iJytpMThuKCJleHBvcnRJbWFnZXNUaXAiKSsnIj4nK2kxOG4oImV4cG9ydEltYWdlcyIpKyc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1pdGVtIiBkYXRhLWNvbW1hbmQ9ImNvcHlJbWFnZXMiIHRpdGxlPSInK2kxOG4oImNvcHlJbWFnZXNVcmxUaXAiKSsnIj4nK2kxOG4oImNvcHlJbWFnZXNVcmwiKSsnPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbSIgZGF0YS1jb21tYW5kPSJkb3dubG9hZEltYWdlIiB0aXRsZT0iJytpMThuKCJkb3dubG9hZEltYWdlVGlwIikrJyI+JytpMThuKCJkb3dubG9hZEltYWdlIikrJzwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtZHJvcC1saXN0LWl0ZW0iIGRhdGEtY29tbWFuZD0ic2Nyb2xsSW50b1ZpZXciIHRpdGxlPSInK2kxOG4oImZpbmRJblBhZ2VUaXAiKSsnIj4nK2kxOG4oImZpbmRJblBhZ2UiKSsnPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbSIgZGF0YS1jb21tYW5kPSJlbnRlckNvbGxlY3Rpb24iIHRpdGxlPSInK2kxOG4oInZpZXdDb2xsZWN0aW9uVGlwIikrJyI+JytpMThuKCJ2aWV3Q29sbGVjdGlvbiIpKyc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1pdGVtIiBkYXRhLWNvbW1hbmQ9Im9wZW5Jbk5ld1dpbmRvdyIgdGl0bGU9IicraTE4bigib3BlbkluTmV3V2luZG93VGlwIikrJyI+JytpMThuKCJvcGVuSW5OZXdXaW5kb3ciKSsnPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbSIgdGl0bGU9IicraTE4bigiYXV0b1JlZnJlc2hUaXAiKSsnIj4nKwogICAgICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT0iY2hlY2tib3giICBkYXRhLWNvbW1hbmQ9InNjcm9sbFRvRW5kQW5kUmVsb2FkIi8+JysKICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIGRhdGEtY29tbWFuZD0ic2Nyb2xsVG9FbmRBbmRSZWxvYWQiPicraTE4bigiYXV0b1JlZnJlc2giKSsnPC9sYWJlbD4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gaWQ9InB2LWdhbGxlcnktZnVsbHNjcmVlbmJ0biIgY2xhc3M9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1pdGVtIiBkYXRhLWNvbW1hbmQ9ImZ1bGxTY3JlZW4iPicraTE4bigiZW50ZXJGdWxsc2MiKSsnPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbSIgZGF0YS1jb21tYW5kPSJvcGVuUHJlZnMiPicraTE4bigiY29uZmlnIikrJzwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCgogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtY29udGFpbmVyIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiB0aXRsZT0iJytpMThuKCJzaGFyZSIpKyciIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZCBwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1zaGFyZSI+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4+JytpMThuKCJzaGFyZSIpKyc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktdmVydGljYWwtYWxpZ24taGVscGVyIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QgcHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtZHJvcC1saXN0LXNoYXJlIj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCgogICAgICAgICAgICAgICAgICAgICc8c3BhbiB0aXRsZT0iJytpMThuKCJjbG9zZUdhbGxlcnkiKSsnIiBjbGFzcz0icHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQgcHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtY2xvc2UiPicrCiAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nKwoKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCgogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1ib2R5Ij4nKwoKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaW1nLWNvbnRhaW5lciI+JysKCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWltZy1jb250ZW50Ij4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1pbWctcGFyZW50Ij4nKwogICAgICAgICAgICAgICAgICAgICc8aW1nIHRpdGxlPSInK2kxOG4oInJlZnJlc2hXaGVuRXJyb3IiKSsnIiBjbGFzcz0icHYtZ2FsbGVyeS1pbWdfYnJva2VuIiBzcmM9IicrcHJlZnMuaWNvbnMuYnJva2VuSW1nKyciIC8+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LXZlcnRpY2FsLWFsaWduLWhlbHBlciI+PC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nKwoKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaW1nLWNvbnRyb2xlciBwdi1nYWxsZXJ5LWltZy1jb250cm9sZXItcHJlIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktaW1nLWNvbnRyb2xlciBwdi1nYWxsZXJ5LWltZy1jb250cm9sZXItbmV4dCI+PC9zcGFuPicrCgogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1zY3JvbGxiYXItaCBwdi1nYWxsZXJ5LWltZy1zY3JvbGxiYXItaCI+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktc2Nyb2xsYmFyLWgtdHJhY2sgcHYtZ2FsbGVyeS1pbWctc2Nyb2xsYmFyLWgtdHJhY2siPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LXNjcm9sbGJhci1oLWhhbmRsZSBwdi1nYWxsZXJ5LWltZy1zY3JvbGxiYXItaC1oYW5kbGUiPjwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCgogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1zY3JvbGxiYXItdiBwdi1nYWxsZXJ5LWltZy1zY3JvbGxiYXItdiI+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktc2Nyb2xsYmFyLXYtdHJhY2sgcHYtZ2FsbGVyeS1pbWctc2Nyb2xsYmFyLXYtdHJhY2siPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LXNjcm9sbGJhci12LWhhbmRsZSBwdi1nYWxsZXJ5LWltZy1zY3JvbGxiYXItdi1oYW5kbGUiPjwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCgogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1zaWRlYmFyLXRvZ2dsZSIgdGl0bGU9IicraTE4bigic3dpdGNoU2xpZGUiKSsnIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1zaWRlYmFyLXRvZ2dsZS1jb250ZW50Ij48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktdmVydGljYWwtYWxpZ24taGVscGVyIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCgogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LXNpZGViYXItY29udGFpbmVyIiB1bnNlbGVjdGFibGU9Im9uIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS12ZXJ0aWNhbC1hbGlnbi1oZWxwZXIiPjwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1zaWRlYmFyLWNvbnRlbnQiID4nKwoKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktc2lkZWJhci1jb250cm9sZXIgcHYtZ2FsbGVyeS1zaWRlYmFyLWNvbnRyb2xlci1wcmUiPjwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1zaWRlYmFyLWNvbnRyb2xlciBwdi1nYWxsZXJ5LXNpZGViYXItY29udHJvbGVyLW5leHQiPjwvc3Bhbj4nKwoKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktc2lkZWJhci10aHVtYm5haWxzLWNvbnRhaW5lciI+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCgogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1zY3JvbGxiYXItaCBwdi1nYWxsZXJ5LXRodW1iLXNjcm9sbGJhci1oIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1zY3JvbGxiYXItaC10cmFjayBwdi1nYWxsZXJ5LXRodW1iLXNjcm9sbGJhci1oLXRyYWNrIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1zY3JvbGxiYXItaC1oYW5kbGUgcHYtZ2FsbGVyeS10aHVtYi1zY3JvbGxiYXItaC1oYW5kbGUiPjwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LXNjcm9sbGJhci12IHB2LWdhbGxlcnktdGh1bWItc2Nyb2xsYmFyLXYiPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LXNjcm9sbGJhci12LXRyYWNrIHB2LWdhbGxlcnktdGh1bWItc2Nyb2xsYmFyLXYtdHJhY2siPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LXNjcm9sbGJhci12LWhhbmRsZSBwdi1nYWxsZXJ5LXRodW1iLXNjcm9sbGJhci12LWhhbmRsZSI+PC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKCiAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKCiAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpOwoKICAgICAgICAgICAgICAgIHZhciBzZWxmPXRoaXM7CiAgICAgICAgICAgICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI21pbnNpemVXIikub25pbnB1dD1mdW5jdGlvbigpe3NlbGYuY2hhbmdlTWluVmlldygpO307CiAgICAgICAgICAgICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI21pbnNpemVIIikub25pbnB1dD1mdW5jdGlvbigpe3NlbGYuY2hhbmdlTWluVmlldygpO307CiAgICAgICAgICAgICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvcigiI21pbnNpemVXU3BhbiIpLm9uY2xpY2s9ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAvL3NlbGYuY2hhbmdlU2l6ZUlucHV0VygpOwogICAgICAgICAgICAgICAgICAgIHZhciBtaW5zaXplVz13aW5kb3cucHJvbXB0KCJXaWR0aDoiLHRoaXMudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGlmKCFtaW5zaXplVylyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNtaW5zaXplVyIpLnZhbHVlPW1pbnNpemVXOwogICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhbmdlTWluVmlldygpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIjbWluc2l6ZUhTcGFuIikub25jbGljaz1mdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIC8vc2VsZi5jaGFuZ2VTaXplSW5wdXRIKCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1pbnNpemVIPXdpbmRvdy5wcm9tcHQoIkhlaWdodDoiLHRoaXMudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGlmKCFtaW5zaXplSClyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoIiNtaW5zaXplSCIpLnZhbHVlPW1pbnNpemVIOwogICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhbmdlTWluVmlldygpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBtYXhpbWl6ZVRyaWdnZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgICAgICAgICAgdGhpcy5tYXhpbWl6ZVRyaWdnZXI9bWF4aW1pemVUcmlnZ2VyOwogICAgICAgICAgICAgICAgbWF4aW1pemVUcmlnZ2VyLmlubmVySFRNTD0nLScraTE4bigicmV0dXJuVG9HYWxsZXJ5IikrJy08c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1tYXhpbWl6ZS10cmlnZ2VyLWNsb3NlIiB0aXRsZT0iJytpMThuKCJjbG9zZUdhbGxlcnkiKSsnIj48L3NwYW4+JzsKICAgICAgICAgICAgICAgIG1heGltaXplVHJpZ2dlci5jbGFzc05hbWU9J3B2LWdhbGxlcnktbWF4aW1pemUtdHJpZ2dlcic7CgogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtYXhpbWl6ZVRyaWdnZXIpOwoKCiAgICAgICAgICAgICAgICB2YXIgdmFsaWRQb3M9Wyd0b3AnLCdyaWdodCcsJ2JvdHRvbScsJ2xlZnQnXTsKICAgICAgICAgICAgICAgIHZhciBzQmFyUG9zaXRpb249cHJlZnMuZ2FsbGVyeS5zaWRlYmFyUG9zaXRpb247CiAgICAgICAgICAgICAgICBpZih2YWxpZFBvcy5pbmRleE9mKHNCYXJQb3NpdGlvbik9PS0xKXsKICAgICAgICAgICAgICAgICAgICBzQmFyUG9zaXRpb249J2JvdHRvbSc7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHRoaXMuc0JhclBvc2l0aW9uPXNCYXJQb3NpdGlvbjsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDbGFzc05hbWU9J3B2LWdhbGxlcnktc2lkZWJhci10aHVtYl9zZWxlY3RlZC0nICsgc0JhclBvc2l0aW9uOwoKCiAgICAgICAgICAgICAgICB2YXIgc0JhckRpcmVjdGlvbj0ndic7Ly/lnoLnm7TmlL7nva4KICAgICAgICAgICAgICAgIHZhciBpc0hvcml6b250YWw9ZmFsc2U7CiAgICAgICAgICAgICAgICBpZihzQmFyUG9zaXRpb249PSd0b3AnIHx8IHNCYXJQb3NpdGlvbj09J2JvdHRvbScpewogICAgICAgICAgICAgICAgICAgIHNCYXJEaXJlY3Rpb249J2gnOy8v5rC05bmz5pS+572uCiAgICAgICAgICAgICAgICAgICAgaXNIb3Jpem9udGFsPXRydWU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpcy5zQmFyRGlyZWN0aW9uPXNCYXJEaXJlY3Rpb247CiAgICAgICAgICAgICAgICB0aGlzLmlzSG9yaXpvbnRhbD1pc0hvcml6b250YWw7CgogICAgICAgICAgICAgICAgdmFyIGNsYXNzUHJlZml4PSdwdi1nYWxsZXJ5LSc7CiAgICAgICAgICAgICAgICB2YXIgdmFsaWRDbGFzcz1bCiAgICAgICAgICAgICAgICAgICAgJ2hlYWQnLAoKICAgICAgICAgICAgICAgICAgICAnaGVhZC1sZWZ0LWltZy1pbmZvJywKICAgICAgICAgICAgICAgICAgICAnaGVhZC1sZWZ0LWltZy1pbmZvLWRlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgICAgICAnaGVhZC1sZWZ0LWltZy1pbmZvLXJlc29sdXRpb24nLAogICAgICAgICAgICAgICAgICAgICdoZWFkLWxlZnQtaW1nLWluZm8tY291bnQnLAogICAgICAgICAgICAgICAgICAgICdoZWFkLWxlZnQtaW1nLWluZm8tc2NhbGluZycsCgogICAgICAgICAgICAgICAgICAgICdoZWFkLWNvbW1hbmQtY2xvc2UnLAogICAgICAgICAgICAgICAgICAgICdoZWFkLWNvbW1hbmQtbmV4dFBhZ2UnLAogICAgICAgICAgICAgICAgICAgICdoZWFkLWNvbW1hbmQtb3BlcmF0ZScsCiAgICAgICAgICAgICAgICAgICAgJ2hlYWQtY29tbWFuZC1zbGlkZS1zaG93JywKICAgICAgICAgICAgICAgICAgICAnaGVhZC1jb21tYW5kLXNsaWRlLXNob3ctYnV0dG9uLWlubmVyJywKICAgICAgICAgICAgICAgICAgICAnaGVhZC1jb21tYW5kLXNsaWRlLXNob3ctY291bnRkb3duJywKICAgICAgICAgICAgICAgICAgICAnaGVhZC1jb21tYW5kLWNvbGxlY3QnLAogICAgICAgICAgICAgICAgICAgICdoZWFkLWNvbW1hbmQtZXhpdC1jb2xsZWN0aW9uJywKCiAgICAgICAgICAgICAgICAgICAgJ2hlYWQtY29tbWFuZC1kcm9wLWxpc3QtY2F0ZWdvcnknLAogICAgICAgICAgICAgICAgICAgICdoZWFkLWNvbW1hbmQtZHJvcC1saXN0LW90aGVycycsCiAgICAgICAgICAgICAgICAgICAgJ2hlYWQtY29tbWFuZC1kcm9wLWxpc3Qtc2hhcmUnLAogICAgICAgICAgICAgICAgICAgICdoZWFkLWNvbW1hbmQtZHJvcC1saXN0LXNsaWRlLXNob3cnLAogICAgICAgICAgICAgICAgICAgICdoZWFkLWNvbW1hbmQtZHJvcC1saXN0LWNvbGxlY3QnLAoKICAgICAgICAgICAgICAgICAgICAnYm9keScsCgogICAgICAgICAgICAgICAgICAgICdpbWctY29udGFpbmVyJywKCiAgICAgICAgICAgICAgICAgICAgJ2ltZy1zY3JvbGxiYXItaCcsCiAgICAgICAgICAgICAgICAgICAgJ2ltZy1zY3JvbGxiYXItaC1oYW5kbGUnLAogICAgICAgICAgICAgICAgICAgICdpbWctc2Nyb2xsYmFyLWgtdHJhY2snLAoKICAgICAgICAgICAgICAgICAgICAnaW1nLXNjcm9sbGJhci12JywKICAgICAgICAgICAgICAgICAgICAnaW1nLXNjcm9sbGJhci12LWhhbmRsZScsCiAgICAgICAgICAgICAgICAgICAgJ2ltZy1zY3JvbGxiYXItdi10cmFjaycsCgogICAgICAgICAgICAgICAgICAgICd0aHVtYi1zY3JvbGxiYXItaCcsCiAgICAgICAgICAgICAgICAgICAgJ3RodW1iLXNjcm9sbGJhci1oLWhhbmRsZScsCiAgICAgICAgICAgICAgICAgICAgJ3RodW1iLXNjcm9sbGJhci1oLXRyYWNrJywKCiAgICAgICAgICAgICAgICAgICAgJ3RodW1iLXNjcm9sbGJhci12JywKICAgICAgICAgICAgICAgICAgICAndGh1bWItc2Nyb2xsYmFyLXYtaGFuZGxlJywKICAgICAgICAgICAgICAgICAgICAndGh1bWItc2Nyb2xsYmFyLXYtdHJhY2snLAoKICAgICAgICAgICAgICAgICAgICAnaW1nLWNvbnRlbnQnLAogICAgICAgICAgICAgICAgICAgICdpbWctcGFyZW50JywKICAgICAgICAgICAgICAgICAgICAnaW1nX2Jyb2tlbicsCgogICAgICAgICAgICAgICAgICAgICdpbWctY29udHJvbGVyLXByZScsCiAgICAgICAgICAgICAgICAgICAgJ2ltZy1jb250cm9sZXItbmV4dCcsCgogICAgICAgICAgICAgICAgICAgICdzaWRlYmFyLXRvZ2dsZScsCiAgICAgICAgICAgICAgICAgICAgJ3NpZGViYXItdG9nZ2xlLWNvbnRlbnQnLAoKICAgICAgICAgICAgICAgICAgICAnc2lkZWJhci1jb250YWluZXInLAogICAgICAgICAgICAgICAgICAgICdzaWRlYmFyLWNvbnRlbnQnLAoKICAgICAgICAgICAgICAgICAgICAnc2lkZWJhci1jb250cm9sZXItcHJlJywKICAgICAgICAgICAgICAgICAgICAnc2lkZWJhci1jb250cm9sZXItbmV4dCcsCgogICAgICAgICAgICAgICAgICAgICdzaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyJywKICAgICAgICAgICAgICAgIF07CgogICAgICAgICAgICAgICAgdmFyIGVsZU1hcHM9e307CiAgICAgICAgICAgICAgICB0aGlzLmVsZU1hcHM9ZWxlTWFwczsKCiAgICAgICAgICAgICAgICB2YWxpZENsYXNzLmZvckVhY2goZnVuY3Rpb24oYyl7CiAgICAgICAgICAgICAgICAgICAgZWxlTWFwc1tjXT1jb250YWluZXIucXVlcnlTZWxlY3RvcignLicrIGNsYXNzUHJlZml4ICsgYyk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB2YXIgcG9zQ2xhc3M9Wy8v6ZyA6KaB5re75YqgJ3RvcCBib3R0b20gbGVmdCByaWdodCdjbGFzc+eahOWFg+e0oAogICAgICAgICAgICAgICAgICAgICdpbWctY29udGFpbmVyJywKICAgICAgICAgICAgICAgICAgICAnc2lkZWJhci10b2dnbGUnLAogICAgICAgICAgICAgICAgICAgICdzaWRlYmFyLWNvbnRhaW5lcicsCiAgICAgICAgICAgICAgICAgICAgJ3NpZGViYXItdGh1bWJuYWlscy1jb250YWluZXInLAogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIHBvc0NsYXNzLmZvckVhY2goZnVuY3Rpb24oYyl7CiAgICAgICAgICAgICAgICAgICAgZWxlTWFwc1tjXS5jbGFzc0xpc3QuYWRkKGNsYXNzUHJlZml4ICsgYyArICctJyArc0JhclBvc2l0aW9uKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHZhciBodkNsYXNzPVsvL+mcgOimgea3u+WKoCd2IGgnY2xhc3PnmoTlhYPntKAKICAgICAgICAgICAgICAgICAgICAnc2lkZWJhci10b2dnbGUnLAogICAgICAgICAgICAgICAgICAgICdzaWRlYmFyLXRvZ2dsZS1jb250ZW50JywKICAgICAgICAgICAgICAgICAgICAnc2lkZWJhci1jb250YWluZXInLAogICAgICAgICAgICAgICAgICAgICdzaWRlYmFyLWNvbnRlbnQnLAogICAgICAgICAgICAgICAgICAgICdzaWRlYmFyLWNvbnRyb2xlci1wcmUnLAogICAgICAgICAgICAgICAgICAgICdzaWRlYmFyLWNvbnRyb2xlci1uZXh0JywKICAgICAgICAgICAgICAgICAgICAnc2lkZWJhci10aHVtYm5haWxzLWNvbnRhaW5lcicsCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgaHZDbGFzcy5mb3JFYWNoKGZ1bmN0aW9uKGMpewogICAgICAgICAgICAgICAgICAgIGVsZU1hcHNbY10uY2xhc3NMaXN0LmFkZChjbGFzc1ByZWZpeCArIGMgKyAnLScgKyBzQmFyRGlyZWN0aW9uKTsKICAgICAgICAgICAgICAgIH0pOwoKCgogICAgICAgICAgICAgICAgLy/lm77niYfljLrln5/msLTlubPmlrnlkJHnmoTmu5rliqjmnaEKICAgICAgICAgICAgICAgIHZhciBpbWdTY3JvbGxiYXJIPW5ldyB0aGlzLlNjcm9sbGJhcih7CiAgICAgICAgICAgICAgICAgICAgYmFyOmVsZU1hcHNbJ2ltZy1zY3JvbGxiYXItaCddLAogICAgICAgICAgICAgICAgICAgIGhhbmRsZTplbGVNYXBzWydpbWctc2Nyb2xsYmFyLWgtaGFuZGxlJ10sCiAgICAgICAgICAgICAgICAgICAgdHJhY2s6ZWxlTWFwc1snaW1nLXNjcm9sbGJhci1oLXRyYWNrJ10sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZU1hcHNbJ2ltZy1jb250ZW50J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgICAgICAgICAgICB0aGlzLmltZ1Njcm9sbGJhckg9aW1nU2Nyb2xsYmFySDsKCiAgICAgICAgICAgICAgICAvL+WbvueJh+WMuuWfn+WeguebtOaWueWQkeeahOa7muWKqOadoQogICAgICAgICAgICAgICAgdmFyIGltZ1Njcm9sbGJhclY9bmV3IHRoaXMuU2Nyb2xsYmFyKHsKICAgICAgICAgICAgICAgICAgICBiYXI6ZWxlTWFwc1snaW1nLXNjcm9sbGJhci12J10sCiAgICAgICAgICAgICAgICAgICAgaGFuZGxlOmVsZU1hcHNbJ2ltZy1zY3JvbGxiYXItdi1oYW5kbGUnXSwKICAgICAgICAgICAgICAgICAgICB0cmFjazplbGVNYXBzWydpbWctc2Nyb2xsYmFyLXYtdHJhY2snXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlTWFwc1snaW1nLWNvbnRlbnQnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLmltZ1Njcm9sbGJhclY9aW1nU2Nyb2xsYmFyVjsKCiAgICAgICAgICAgICAgICAvL+e8qeeVpeWbvuWMuuWfn+eahOa7muWKqOadoQogICAgICAgICAgICAgICAgdmFyIHRodW1iU2Nyb2xsYmFyOwogICAgICAgICAgICAgICAgaWYoaXNIb3Jpem9udGFsKXsKICAgICAgICAgICAgICAgICAgICB0aHVtYlNjcm9sbGJhcj1uZXcgdGhpcy5TY3JvbGxiYXIoewogICAgICAgICAgICAgICAgICAgICAgICBiYXI6ZWxlTWFwc1sndGh1bWItc2Nyb2xsYmFyLWgnXSwKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlOmVsZU1hcHNbJ3RodW1iLXNjcm9sbGJhci1oLWhhbmRsZSddLAogICAgICAgICAgICAgICAgICAgICAgICB0cmFjazplbGVNYXBzWyd0aHVtYi1zY3JvbGxiYXItaC10cmFjayddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZU1hcHNbJ3NpZGViYXItdGh1bWJuYWlscy1jb250YWluZXInXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICB0aHVtYlNjcm9sbGJhcj1uZXcgdGhpcy5TY3JvbGxiYXIoewogICAgICAgICAgICAgICAgICAgICAgICBiYXI6ZWxlTWFwc1sndGh1bWItc2Nyb2xsYmFyLXYnXSwKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlOmVsZU1hcHNbJ3RodW1iLXNjcm9sbGJhci12LWhhbmRsZSddLAogICAgICAgICAgICAgICAgICAgICAgICB0cmFjazplbGVNYXBzWyd0aHVtYi1zY3JvbGxiYXItdi10cmFjayddLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZU1hcHNbJ3NpZGViYXItdGh1bWJuYWlscy1jb250YWluZXInXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHRoaXMudGh1bWJTY3JvbGxiYXI9dGh1bWJTY3JvbGxiYXI7CgogICAgICAgICAgICAgICAgdmFyIHNlbGY9dGhpczsKCiAgICAgICAgICAgICAgICB2YXIgaW1nU3RhdGlzdGljcz17Ly/lm77niYfnmoTmgLvnsbvvvIznu5/orqEs5Yid5aeL5YyW5YC8CiAgICAgICAgICAgICAgICAgICAgcnVsZTp7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3duOnRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjAsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOmkxOG4oImFkdmFuY2VkUnVsZXNUaXAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTppMThuKCJhZHZhbmNlZFJ1bGVzIiksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0cFJ1bGU6ewogICAgICAgICAgICAgICAgICAgICAgICBzaG93bjp0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBjb3VudDowLAogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjppMThuKCJ0cFJ1bGVzVGlwIiksCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6aTE4bigidHBSdWxlcyIpLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc2NhbGU6ewogICAgICAgICAgICAgICAgICAgICAgICBzaG93bjp0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBjb3VudDowLAogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjppMThuKCJzY2FsZVJ1bGVzVGlwIiksCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6aTE4bigic2NhbGVSdWxlcyIpLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZm9yY2U6ewogICAgICAgICAgICAgICAgICAgICAgICBzaG93bjp0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBjb3VudDowLAogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjppMThuKCJub1NjYWxlUnVsZXNUaXAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTppMThuKCJub1NjYWxlUnVsZXMiKSwKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAvLyBuZXcKICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZVpvb21SZXNpemVkOiB7CiAgICAgICAgICAgICAgICAgICAgLy8gIHNob3duOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAvLyAgY291bnQ6IDAsCiAgICAgICAgICAgICAgICAgICAgLy8gIGRlc2NyaXB0aW9uOiAn57yp5pS+55qE5Zu+54mH77yM5Zu+54mH5bC65a+45pyA5bCR55u45beu5q+U5L6LICcgKyBwcmVmcy5nYWxsZXJ5Lnpvb21yZXNpemVkICsgJyUnLAogICAgICAgICAgICAgICAgICAgIC8vICBuYW1lOiAn5bCP57yp5pS+JwogICAgICAgICAgICAgICAgICAgIC8vIH0sCiAgICAgICAgICAgICAgICAgICAgc2NhbGVTbWFsbDogewogICAgICAgICAgICAgICAgICAgICAgICBzaG93bjogcHJlZnMuZ2FsbGVyeS5zaG93U21hbGxTaXplLAogICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGkxOG4oInNtYWxsUnVsZXNUaXAiLHByZWZzLmdhbGxlcnkuc2NhbGVTbWFsbFNpemUpLAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpMThuKCJzbWFsbFJ1bGVzIikKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHRoaXMuaW1nU3RhdGlzdGljcz1pbWdTdGF0aXN0aWNzOwoKICAgICAgICAgICAgICAgIC8v55Sf5oiQ5YiG57G75LiL5ouJ5YiX6KGoCiAgICAgICAgICAgICAgICB2YXIgdHlwZU1hcms9Jyc7CiAgICAgICAgICAgICAgICB2YXIgaW1nU3RhdGlzdGljc19pOwogICAgICAgICAgICAgICAgZm9yKHZhciBpIGluIGltZ1N0YXRpc3RpY3MpewogICAgICAgICAgICAgICAgICAgIGlmKCFpbWdTdGF0aXN0aWNzLmhhc093blByb3BlcnR5KGkpKWNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIGltZ1N0YXRpc3RpY3NfaT1pbWdTdGF0aXN0aWNzW2ldOwogICAgICAgICAgICAgICAgICAgIHR5cGVNYXJrKz0KICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbSIgdGl0bGU9IicraW1nU3RhdGlzdGljc19pLmRlc2NyaXB0aW9uKyciPicrCiAgICAgICAgICAgICAgICAgICAgICAgICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGRhdGEtdHlwZT0iJytpKyciIGlkPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbS1jYXRlZ29yeS0nK2krJyIgLz4nKwogICAgICAgICAgICAgICAgICAgICAgICAnPGxhYmVsIGZvcj0icHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtZHJvcC1saXN0LWl0ZW0tY2F0ZWdvcnktJytpKyciPicraW1nU3RhdGlzdGljc19pLm5hbWUrJzwvbGFiZWw+JysKICAgICAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGVsZU1hcHNbJ2hlYWQtY29tbWFuZC1kcm9wLWxpc3QtY2F0ZWdvcnknXS5pbm5lckhUTUw9dHlwZU1hcms7CgoKICAgICAgICAgICAgICAgIC8v5pS26JeP55u45YWzCiAgICAgICAgICAgICAgICB2YXIgY29sbGVjdGlvbj17CiAgICAgICAgICAgICAgICAgICAgZ2V0TWF0Y2hlZDpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuYWxsIHx8IHRoaXMuZ2V0KCkpLl9maW5kKGZ1bmN0aW9uKHZhbHVlLGluZGV4KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlLnNyYz09c2VsZi5zcmMpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjaGVjazpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAvL+S7jue8k+WtmOaVsOaNruS4reajgOafpeOAggogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlZD10aGlzLmdldE1hdGNoZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYXZvcml0ZT1tYXRjaGVkPyBtYXRjaGVkWzBdIDogbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudEFyZWFWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hMaWdodCgpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdEFyZWFWYWx1ZTpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRBcmVhLnZhbHVlPXRoaXMuZmF2b3JpdGU/IHRoaXMuZmF2b3JpdGUuZGVzY3JpcHRpb24gOiBzZWxmLmVsZU1hcHNbJ2hlYWQtbGVmdC1pbWctaW5mby1kZXNjcmlwdGlvbiddLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaGlnaExpZ2h0OmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZU1hcHNbJ2hlYWQtY29tbWFuZC1jb2xsZWN0J10uY2xhc3NMaXN0W3RoaXMuZmF2b3JpdGU/ICdhZGQnIDogJ3JlbW92ZSddKCdwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1jb2xsZWN0LWZhdm9yaXRlJyk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBhZGQ6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYXZvcml0ZT17CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM6c2VsZi5zcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVtYlNyYzpkYXRhc2V0KHNlbGYucmVsYXRlZFRodW1iLCd0aHVtYlNyYycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0dXJhbFNpemU6c2VsZi5pbWdOYXR1cmFsU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOnRoaXMudGV4dEFyZWEudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICAvL+S4uuS6humYsuatouWkmuS4qumhtemdouWQjOaXtueahOWCqOWtmO+8jOa3u+WKoOWJje+8jOWFiOi9veWFpeacgOaWsOeahOaVsOaNruOAggogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAvL+ajgOafpeaYr+WQpuW3sue7j+WcqOmHjOmdouS6hgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlZD10aGlzLmdldE1hdGNoZWQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG1hdGNoZWQpey8v5aaC5p6c5bey57uP5a2Y5Zyo77yM5Yig6Zmk5pen55qE44CCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbC5zcGxpY2UobWF0Y2hlZFsxXSwxKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGwudW5zaGlmdCh0aGlzLmZhdm9yaXRlKTsvL+a3u+WKoOWIsOacgOWJjemdouOAggogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hMaWdodCgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmUoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHJlbW92ZTpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAvL+iOt+W+l+acgOaWsOaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAvL+ajgOafpeaYr+WQpuW3sue7j+WcqOmHjOmdouS6hgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlZD10aGlzLmdldE1hdGNoZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYobWF0Y2hlZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbC5zcGxpY2UobWF0Y2hlZFsxXSwxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZhdm9yaXRlPW51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaExpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzYXZlOmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0SXRlbSgncHZfY29sbGVjdGlvbicsZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHRoaXMuYWxsKSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZ2V0OmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXQ9c3RvcmFnZS5nZXRJdGVtKCdwdl9jb2xsZWN0aW9uJykgfHwgJ1tdJzsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0PUpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHJldCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQ9W107CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxsPXJldDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVudGVyOmZ1bmN0aW9uKCl7CgogICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmFsbC5sZW5ndGg9PTApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoaTE4bigibm9Db2xsZWN0aW9uWWV0IikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tTW9kZT10cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uPXRoaXMuZHJvcExpc3RCdXR0b247CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudD1pMThuKCJleGl0Q29sbGVjdGlvbiIpOwogICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0KGJ1dHRvbiwnY29tbWFuZCcsJ2V4aXRDb2xsZWN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZEJ1dHRvbi5zdHlsZS5kaXNwbGF5PSdpbmxpbmUtYmxvY2snOwogICAgICAgICAgICAgICAgICAgICAgICBlbGVNYXBzWydzaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyJ10uY2xhc3NMaXN0LmFkZCgncHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1ibmFpbHNfaGlkZS1zcGFuJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL+eUn+aIkGRvbQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyPWNvbnRhaW5lcjsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhX2k7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcGFuTWFyaz0nJzsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk9MDsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoZGF0YV9pPXRoaXMuYWxsW2krK10pewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbk1hcmsgKz0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktc2lkZWJhci10aHVtYi1jb250YWluZXIiICcrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBkYXRhLW5hdHVyYWwtc2l6ZT0iJyArIEpTT04uc3RyaW5naWZ5KGRhdGFfaS5uYXR1cmFsU2l6ZSkucmVwbGFjZSgvIi9nLCcmcXVvdDsnKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyIgZGF0YS1zcmM9IicgKyBkYXRhX2kuc3JjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIiBkYXRhLXRodW1iLXNyYz0iJyArIGRhdGFfaS50aHVtYlNyYyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyI+JysKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktdmVydGljYWwtYWxpZ24taGVscGVyIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWdhbGxlcnktc2lkZWJhci10aHVtYi1sb2FkaW5nIiB0aXRsZT0iJytpMThuKCJsb2FkaW5nIikrJy4uLi4uLiI+PC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MPXNwYW5NYXJrOwogICAgICAgICAgICAgICAgICAgICAgICBlbGVNYXBzWydzaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyJ10uYXBwZW5kQ2hpbGQoY29udGFpbmVyKTsKCgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkPXNlbGYuc2VsZWN0ZWQ7Ly/lpIfku70KCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0KGNvbnRhaW5lci5jaGlsZHJlblswXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGh1bWJTY3JvbGxiYXIucmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkVGh1bWIoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGV4aXQ6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXRoaXMubU1vZGUpcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tTW9kZT1mYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1dHRvbj10aGlzLmRyb3BMaXN0QnV0dG9uOwogICAgICAgICAgICAgICAgICAgICAgICBidXR0b24udGV4dENvbnRlbnQ9aTE4bigidmlld0NvbGxlY3Rpb24iKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldChidXR0b24sJ2NvbW1hbmQnLCdlbnRlckNvbGxlY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkQnV0dG9uLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICBlbGVNYXBzWydzaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyJ10ucmVtb3ZlQ2hpbGQodGhpcy5jb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgICAgICBlbGVNYXBzWydzaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyJ10uY2xhc3NMaXN0LnJlbW92ZSgncHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1ibmFpbHNfaGlkZS1zcGFuJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdCh0aGlzLnNlbGVjdGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50aHVtYlNjcm9sbGJhci5yZXNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRUaHVtYigpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdGV4dEFyZWE6ZWxlTWFwc1snaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1jb2xsZWN0J10ucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKSwKICAgICAgICAgICAgICAgICAgICBkcm9wTGlzdEJ1dHRvbjplbGVNYXBzWydoZWFkLWNvbW1hbmQtZHJvcC1saXN0LW90aGVycyddLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWNvbW1hbmQkPSJDb2xsZWN0aW9uIl0nKSwKICAgICAgICAgICAgICAgICAgICBoZWFkQnV0dG9uOmVsZU1hcHNbJ2hlYWQtY29tbWFuZC1leGl0LWNvbGxlY3Rpb24nXSwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdGhpcy5jb2xsZWN0aW9uPWNvbGxlY3Rpb247CgogICAgICAgICAgICAgICAgZWxlTWFwc1snaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1jb2xsZWN0J10uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQ9ZS50YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgaWYoIWNvbGxlY3Rpb24uZmF2b3JpdGUpcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uZmF2b3JpdGVbZGF0YXNldCh0YXJnZXQsJ3ByZWZzJyldPXRhcmdldC52YWx1ZTsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoY29sbGVjdGlvbi5zYXZlVGltZXIpOwogICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uc2F2ZVRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5zYXZlKCk7CiAgICAgICAgICAgICAgICAgICAgfSw1MDApOwogICAgICAgICAgICAgICAgfSx0cnVlKTsKCgogICAgICAgICAgICAgICAgdmFyIHNsaWRlU2hvdz17CiAgICAgICAgICAgICAgICAgICAgb3B0czp7CiAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsOjUwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQ6dHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgYmFja3dhcmQ6ZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBFcnJvckltZzp0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBydW46ZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAvL3RpbWluZzoKICAgICAgICAgICAgICAgICAgICAvL3NlbGVjdCjpgInkuK3kuIvkuIDkuKrlm77niYflkI7vvIjnvKnnlaXlm77moI/pgInkuK3kuobvvInvvIzov5jmsqHlvIDlp4vor7vlj5blpKflm77vvIjkuIDoiKzpgInkuK3lkI7vvIzlu7bml7YyMDBtc+W8gOWni+ivu+WPluWkp+Wbvu+8iSksCiAgICAgICAgICAgICAgICAgICAgLy9sb2FkRW5kKOW9k+WJjeaYvuekuuWbvueJh+W3sue7j+ivu+WPluWujOaIkOWQjiksCiAgICAgICAgICAgICAgICAgICAgLy9jbGljayjngrnlh7vmjInpkq4pLAogICAgICAgICAgICAgICAgICAgIC8vY2hhbmdlKOaUueWPmOiuvue9rikKICAgICAgICAgICAgICAgICAgICBydW46ZnVuY3Rpb24odGltaW5nKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXRoaXMub3B0cy5ydW4pcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYodGltaW5nIT0nbG9hZEVuZCcpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICBpZih0aW1pbmc9PSdjbGljaycgfHwgdGltaW5nPT0nc2VsZWN0Jyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5nZXRFbGUoKSl7Ly/msqHmnInopoHliIfmjaLliLDnmoTlm77niYfkuobvvIzlgZzmraIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4aXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5vcHRzLnNraXBFcnJvckltZyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZWxmLmltZ0Vycm9yICYmICFzZWxmLmlzTG9hZGluZyl7Ly/noa7kv53mmK/lvZPliY3lm77niYflkozpgInkuK3nvKnnlaXlm77kuIDoh7TnmoTml7blgJkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdCh0aGlzLmdldEVsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMub3B0cy53YWl0KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRpbWluZyE9J3NlbGVjdCcgJiYgKHRpbWluZz09J2xvYWRFbmQnICB8fCAoIXNlbGYuaXNMb2FkaW5nICYmIChzZWxmLmltZy5jb21wbGV0ZSB8fCBzZWxmLmltZ0Vycm9yKSkpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdvKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRpbWluZyE9J2xvYWRFbmQnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdvKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGdldEVsZTpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRUaHVtU3Bhbih0aGlzLm9wdHMuYmFja3dhcmQpCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBnbzpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3AoKTsvL+WBnOatouS4iuasoeeahOOAggogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW50ZXJ2YWw9dGhpcy5vcHRzLmludGVydmFsOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3NlbGY9dGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi5zZXRDb3VudGRvd24oMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKF9zZWxmLmNvdW50ZG93blRpbWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0KF9zZWxmLmdldEVsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSxpbnRlcnZhbCk7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnRUaW1lPURhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnRkb3duVGltZXI9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLnNldENvdW50ZG93bihpbnRlcnZhbCAtIChEYXRlLm5vdygpLXN0YXJ0VGltZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LDEwMCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzdG9wOmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q291bnRkb3duKHRoaXMub3B0cy5pbnRlcnZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmNvdW50ZG93blRpbWVyKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGV4aXQ6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLnJ1bj10cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaFN0YXR1cygpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNldENvdW50ZG93bjpmdW5jdGlvbih2YWx1ZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZU1hcHNbJ2hlYWQtY29tbWFuZC1zbGlkZS1zaG93LWNvdW50ZG93biddLnRleHRDb250ZW50PSh2YWx1ZS8xMDAwKS50b0ZpeGVkKDIpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoU3RhdHVzOmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0cy5ydW49IXRoaXMub3B0cy5ydW47CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZU1hcHNbJ2hlYWQtY29tbWFuZC1zbGlkZS1zaG93LWJ1dHRvbi1pbm5lciddLmNsYXNzTGlzdFt0aGlzLm9wdHMucnVuPyAnYWRkJyA6ICdyZW1vdmUnXSgncHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtc2xpZGUtc2hvdy1idXR0b24taW5uZXJfc3RvcCcpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgY2hlY2s6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRzLnJ1bj8gIHRoaXMucnVuKCdjbGljaycpIDogdGhpcy5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgc2xpZGVTaG93LnNldENvdW50ZG93bihzbGlkZVNob3cub3B0cy5pbnRlcnZhbCk7OwogICAgICAgICAgICAgICAgdGhpcy5zbGlkZVNob3c9c2xpZGVTaG93OwoKICAgICAgICAgICAgICAgIC8v5bm754Gv54mH5pKt5pS+5LiL5ouJ5YiX6KGoY2hhbmdl5LqL5Lu255qE5aSE55CGCiAgICAgICAgICAgICAgICBlbGVNYXBzWydoZWFkLWNvbW1hbmQtZHJvcC1saXN0LXNsaWRlLXNob3cnXS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQ9ZS50YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmVmcz1kYXRhc2V0KHRhcmdldCwncHJlZnMnKTsKICAgICAgICAgICAgICAgICAgICBpZih0YXJnZXQudHlwZT09J2NoZWNrYm94Jyl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXRhcmdldC5jaGVja2VkOwogICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1wYXJzZUZsb2F0KHRhcmdldC52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGlzTmFOKHZhbHVlKSl7Ly/ml6DmlYgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXNsaWRlU2hvdy5vcHRzW3ByZWZzXSAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXZhbHVlPjAgPyB2YWx1ZSA6IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC52YWx1ZT12YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKj0gMTAwMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHNsaWRlU2hvdy5vcHRzW3ByZWZzXT12YWx1ZTsKICAgICAgICAgICAgICAgICAgICBzbGlkZVNob3cucnVuKCdjaGFuZ2UnKTsKICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHNsaWRlU2hvdy5vcHRzKTsKICAgICAgICAgICAgICAgIH0sdHJ1ZSk7CgoKICAgICAgICAgICAgICAgIC8v5YiG57G75LiL5ouJ5YiX6KGo55qE54K55Ye75Y+R55SfY2hhbmdl5LqL5Lu255qE5aSE55CGCiAgICAgICAgICAgICAgICBlbGVNYXBzWydoZWFkLWNvbW1hbmQtZHJvcC1saXN0LWNhdGVnb3J5J10uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJyxmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0PWUudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgIHZhciB0eXBlPWRhdGFzZXQodGFyZ2V0LCd0eXBlJyk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5pU3RhdGlzQ29weVt0eXBlXS5zaG93bj10YXJnZXQuY2hlY2tlZDsKICAgICAgICAgICAgICAgICAgICBzZWxmLnN3aXRjaFRodW1iVmlzaWJsZSgpOy8v5YiH5o2i5Zu+54mH57G75Yir5pi+6ZqQOwogICAgICAgICAgICAgICAgfSx0cnVlKTsKCgogICAgICAgICAgICAgICAgdmFyIHNyY1NwbGl0OwogICAgICAgICAgICAgICAgLy/lkb3ku6TkuIvmi4nliJfooajnmoTngrnlh7vlpITnkIYKICAgICAgICAgICAgICAgIGVsZU1hcHNbJ2hlYWQtY29tbWFuZC1kcm9wLWxpc3Qtb3RoZXJzJ10uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgIGlmKGUuYnV0dG9uIT0wKXJldHVybjsvL+W3pumUrgogICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQ9ZS50YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1hbmQ9ZGF0YXNldCh0YXJnZXQsJ2NvbW1hbmQnKTsKICAgICAgICAgICAgICAgICAgICBpZighY29tbWFuZClyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGNvbW1hbmQpewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdvcGVuSW5OZXdXaW5kb3cnOnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHNlbGYuc3JjLCdfYmxhbmsnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwc0ltYWdlJzp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3BlbigocHJlZnMuZ2FsbGVyeS5lZGl0U2l0ZT09J1BpeGxyJz8naHR0cHM6Ly9waXhsci5jb20vZWRpdG9yLz9pbWFnZT0nOidodHRwczovL3d3dy50b29scGljLmNvbS9hcGllZGl0b3IuaHRtbD9pbWFnZT0nKStzZWxmLnNyYywnX2JsYW5rJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2Nyb2xsSW50b1ZpZXcnOnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbGxlY3Rpb24ubU1vZGUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGkxOG4oImluQ29sbGVjdGlvbiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbGF0ZWRUaHVtYj1zZWxmLnJlbGF0ZWRUaHVtYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleD1hcnJheUZuLmluZGV4T2YuY2FsbChzZWxmLmltZ1NwYW5zLHJlbGF0ZWRUaHVtYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SW1nPXNlbGYuZGF0YVtpbmRleF0uaW1nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRhcmdldEltZyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jb250YWlucyh0YXJnZXRJbWcpIHx8IHVuc2FmZVdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldEltZykuZGlzcGxheT09J25vbmUnKXsvL+WbvueJh+S4jeWtmOWcqOaWh+aho+S4re+8jOaIluiAhemakOiXj+S6huOAggogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydChpMThuKCJjYW50RmluZCIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5taW5pbWl6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uYXZpZ2F0ZVRvSW1nKHRhcmdldEltZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXNoRWxlKHRhcmdldEltZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsvL2ZyYW1l5Y+R6YCB6L+H5p2l55qE5pe25YCZ5Yig6Zmk5LqG5LiN6IO95Lyg6YCB55qE5Zu+54mHCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3B2LW5hdmlnYXRlVG9JbWcnLGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdwdi1uYXZpZ2F0ZVRvSW1nJyxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWUuZGV0YWlsKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGkxOG4oImNhbnRGaW5kIikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1pbmltaXplKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsvL+WwhmZyYW1l5rua5Yqo5Yiw5Lit6Ze05L2N572uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZWxmLmlmcmFtZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uYXZpZ2F0ZVRvSW1nKHNlbGYuaWZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSx0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2Uoey8v6Zeu6ZeuZnJhbWXjgILjgIIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlEOm1lc3NhZ2VJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDonbmF2aWdhdGVUb0ltZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bzpzZWxmLmZyb20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwnKicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZXhwb3J0SW1hZ2VzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwb3J0SW1hZ2VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZG93bmxvYWRJbWFnZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1iLWNvbnRhaW5lcltkYXRhLXNyY10nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmxzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwobm9kZXMsIGZ1bmN0aW9uKG5vZGUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGdldENvbXB1dGVkU3R5bGUobm9kZSkuZGlzcGxheSE9Im5vbmUiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3BsaXQ9bm9kZS5kYXRhc2V0LnNyYy5zcGxpdCgiLyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlQXMobm9kZS5kYXRhc2V0LnNyYywgc3JjU3BsaXRbc3JjU3BsaXQubGVuZ3RoLTFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb3B5SW1hZ2VzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29weUltYWdlcyh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzY3JvbGxUb0VuZEFuZFJlbG9hZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2tib3ggPSB0YXJnZXQucGFyZW50Tm9kZS5maXJzdENoaWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9ICFjaGVja2JveC5jaGVja2VkOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZzLmdhbGxlcnkuc2Nyb2xsRW5kQW5kTG9hZCA9IGNoZWNrYm94LmNoZWNrZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZnVsbFNjcmVlbic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnZnVsbHNjcmVlbmJ0bicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbmNlbEZ1bGxTY3JlZW4oKSkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9IGkxOG4oImVudGVyRnVsbHNjIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ2Z1bGxzY3JlZW5idG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhdW5jaEZ1bGxTY3JlZW4oZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSkgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmNsYXNzTGlzdC50b2dnbGUoJ2Z1bGxzY3JlZW5idG4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9IGkxOG4oImV4aXRGdWxsc2MiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKCdmdWxsc2NyZWVuYnRuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnb3BlblByZWZzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5QcmVmcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VudGVyQ29sbGVjdGlvbic6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/ov5vlhaXnrqHnkIbmqKHlvI8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uZW50ZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdleGl0Q29sbGVjdGlvbic6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/pgIDlh7rnrqHnkIbmqKHlvI8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uZXhpdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sdHJ1ZSk7CgogICAgICAgICAgICAgICAgLy8g55uR6KeG5YWo5bGP55qE5Y+Y5YyWCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmdWxsU2NyZWVuQ2hhbmdlZCgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50ICYmIC8vIGFsdGVybmF0aXZlIHN0YW5kYXJkIG1ldGhvZAogICAgICAgICAgICAgICAgICAgICAgICAhZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIWRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50ICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFkb2N1bWVudC5tc0Z1bGxzY3JlZW5FbGVtZW50KSB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInB2LWdhbGxlcnktZnVsbHNjcmVlbmJ0biIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnRuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSBpMThuKCJlbnRlckZ1bGxzYyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRuLnJlbW92ZUNsYXNzKCdmdWxsc2NyZWVuYnRuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJywgZnVsbFNjcmVlbkNoYW5nZWQsIGZhbHNlKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vemZ1bGxzY3JlZW5jaGFuZ2UnLCBmdWxsU2NyZWVuQ2hhbmdlZCwgZmFsc2UpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIGZ1bGxTY3JlZW5DaGFuZ2VkLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgLy/nlJ/miJDliIbkuqvnmoTkuIvmi4nliJfooagKICAgICAgICAgICAgICAgIHZhciBzaGFyZU1hcms9Jyc7CiAgICAgICAgICAgICAgICB2YXIgc2hhcmVJdGVtOwogICAgICAgICAgICAgICAgZm9yKHZhciBpIGluIHByZWZzLnNoYXJlKXsKICAgICAgICAgICAgICAgICAgICBpZighcHJlZnMuc2hhcmUuaGFzT3duUHJvcGVydHkoaSkpY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgc2hhcmVJdGVtPXByZWZzLnNoYXJlW2ldOwogICAgICAgICAgICAgICAgICAgIGlmKHNoYXJlSXRlbS5kaXNhYmxlZCljb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBzaGFyZU1hcmsrPSgKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbSIgZGF0YS1zaXRlPSInK2krJyIgc3R5bGU9IlwKICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1pbWFnZTp1cmwoXCcnKyBzaGFyZUl0ZW0uaWNvbiArJ1wnKTtcCiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246NHB4IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtcCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDoyNHB4OyI+JytzaGFyZUl0ZW0ubmFtZSsnPC9zcGFuPicpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBlbGVNYXBzWydoZWFkLWNvbW1hbmQtZHJvcC1saXN0LXNoYXJlJ10uaW5uZXJIVE1MPXNoYXJlTWFyazsKCiAgICAgICAgICAgICAgICAvL+WIhuS6q+S4i+aLieWIl+ihqOeahOeCueWHu+WkhOeQhgogICAgICAgICAgICAgICAgZWxlTWFwc1snaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1zaGFyZSddLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICBpZihlLmJ1dHRvbiE9MClyZXR1cm47Ly/lt6bplK4KICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0PWUudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgIHZhciBzaXRlPWRhdGFzZXQodGFyZ2V0LCdzaXRlJyk7CiAgICAgICAgICAgICAgICAgICAgaWYoIXNpdGUpcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIHZhciBzaXRlX2luZm89cHJlZnMuc2hhcmVbc2l0ZV07CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtPXNpdGVfaW5mby5hcGkuY2FsbChzZWxmLmltZyx7CiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOmVuY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC50aXRsZSksCiAgICAgICAgICAgICAgICAgICAgICAgIHBpYzplbmNvZGVVUklDb21wb25lbnQoc2VsZi5zcmMpLAogICAgICAgICAgICAgICAgICAgICAgICB1cmw6ZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGlmKCFwYXJhbSlyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4ocGFyYW0udXJsLCdfYmxhbmsnLCdoZWlnaHQ9JytwYXJhbS53U2l6ZS5oKycsd2lkdGg9JytwYXJhbS53U2l6ZS53KycsbGVmdD0zMCx0b3A9MzAsbG9jYXRpb249bm8sc3RhdHVzPW5vLHRvb2xiYXI9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcycpOwogICAgICAgICAgICAgICAgfSx0cnVlKTsKCgoKICAgICAgICAgICAgICAgIHZhciBsb2FkVGh1bWJzVGltZXI7CiAgICAgICAgICAgICAgICBlbGVNYXBzWydzaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyJ10uYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyxmdW5jdGlvbihlKXsvL+WPkeeUn3Njcm9sbOS6i+S7tuaXtuWKoOi9vee8qeeVpeWbvgogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChsb2FkVGh1bWJzVGltZXIpOy8v5Yqg5Liq5bu25pe277yM5Zyo6L+e57ut6Kem5Y+R55qE5pe25YCZ57yT5LiA57yT44CCCiAgICAgICAgICAgICAgICAgICAgbG9hZFRodW1ic1RpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkVGh1bWIoKTsKICAgICAgICAgICAgICAgICAgICB9LDIwMCk7CiAgICAgICAgICAgICAgICB9LGZhbHNlKTsKCiAgICAgICAgICAgICAgICB2YXIgY2FuU2Nyb2xsPXRydWU7CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9DaGFuZ2U9ZnVuY3Rpb24obmV4dCl7CiAgICAgICAgICAgICAgICAgICAgaWYoY2FuU2Nyb2xsKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlZnMuZ2FsbGVyeS50cmFuc2l0aW9uKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhblNjcm9sbD1mYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5TY3JvbGw9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sNTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID8gc2VsZi5zZWxlY3ROZXh0KCkgOiBzZWxmLnNlbGVjdFByZXZpb3VzKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYWRkV2hlZWxFdmVudChlbGVNYXBzWydib2R5J10sZnVuY3Rpb24oZSl7Ly93aGVlbOS6i+S7tgogICAgICAgICAgICAgICAgICAgIGlmKGUuZGVsdGFaIT0wKXJldHVybjsvL3rovbQKICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0PWUudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBpZihlbGVNYXBzWydzaWRlYmFyLWNvbnRhaW5lciddLmNvbnRhaW5zKHRhcmdldCkpey8v57yp55Wl5Zu+5Yy65rua5Yqo5rua6L2u57+75Zu+54mHCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZT1zZWxmLnRodW1iU3Bhbk91dGVyU2l6ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUuZGVsdGFZPDAgfHwgZS5kZWx0YVg8MCl7Ly/lkJHkuIrmu5oKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlPS1kaXN0YW5jZTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJTY3JvbGxiYXIuc2Nyb2xsQnkoZGlzdGFuY2UpCiAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ly/lm77niYfljLrln5/mu5rliqgKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpc3RhbmNlPTEwMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZS5kZWx0YVkhPTApey8veei9tAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VsZi5pbWcuY2xhc3NMaXN0LmNvbnRhaW5zKCdwdi1nYWxsZXJ5LWltZ196b29tLW91dCcpKXsvL+WbvueJh+WPr+S7pee8qeWwj+aXtu+8jOa7muWKqOWbvueJh++8jOWQpuWImeWIh+aNouWbvueJh+OAggogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUuZGVsdGFZIDwgMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlPS1kaXN0YW5jZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVsZU1hcHNbJ2ltZy1zY3JvbGxiYXItaCddLmNvbnRhaW5zKHRhcmdldCkpey8v5aaC5p6c5Zyo5qiq5ZCR5rua5Yqo5p2h5LiK44CCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1Njcm9sbGJhckguc2Nyb2xsQnkoZGlzdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpbWdTY3JvbGxiYXJWLnNjcm9sbEJ5KGRpc3RhbmNlKSAmJiBwcmVmcy5nYWxsZXJ5LnNjcm9sbEVuZFRvQ2hhbmdlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvQ2hhbmdlKGUuZGVsdGFZID4gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9DaGFuZ2UoZS5kZWx0YVkgPiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNley8veOi9tAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZS5kZWx0YVggPCAwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZT0tZGlzdGFuY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nU2Nyb2xsYmFySC5zY3JvbGxCeShkaXN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sdHJ1ZSk7CgoKICAgICAgICAgICAgICAgIC8vZm9jdXMsYmx1cjsKICAgICAgICAgICAgICAgIGFkZEN1c01vdXNlRXZlbnQoJ21vdXNlZW50ZXInLGNvbnRhaW5lcixmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgYWRkQ3VzTW91c2VFdmVudCgnbW91c2VsZWF2ZScsY29udGFpbmVyLGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5ibHVyKCk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL+S4iuS4i+W3puWPs+WIh+aNouWbvueJhyznqbrmoLzplK7mqKHmi5/mu5rliqjkuIDpobUKCiAgICAgICAgICAgICAgICB2YXIgdmFsaWRLZXlDb2RlPVszOCwzOSw0MCwzNywzMiw5XS8v5LiK5Y+z5LiL5bemLDMy56m65qC8LHRhYuemgeatoueEpueCueWIh+aNouOAggogICAgICAgICAgICAgICAgdmFyIGtleURvd247CgogICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgdmFyIGtleUNvZGU9ZS5rZXlDb2RlOwogICAgICAgICAgICAgICAgICAgIHZhciBpbmRleD12YWxpZEtleUNvZGUuaW5kZXhPZihrZXlDb2RlKTsKICAgICAgICAgICAgICAgICAgICBpZihpbmRleD09LTEpcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0PWUudGFyZ2V0OwoKICAgICAgICAgICAgICAgICAgICBpZighY29udGFpbmVyLmNvbnRhaW5zKHRhcmdldCkpcmV0dXJuOy8v6Kem5Y+R54Sm54K55LiN5YaNZ2FsbGVyeemHjOmdouOAggogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoa2V5Q29kZT09OSlyZXR1cm47Ly90YWLplK4KICAgICAgICAgICAgICAgICAgICBpZihrZXlDb2RlPT0zMil7Ly8zMuepuuagvO+8jOaooeaLn+a7muWKqOS4gOmhtQogICAgICAgICAgICAgICAgICAgICAgICBpbWdTY3JvbGxiYXJWLnNjcm9sbEJ5UGFnZXMoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZihrZXlEb3duKXJldHVybjsvL+W3suaMieS4i+OAggogICAgICAgICAgICAgICAgICAgIGtleURvd249dHJ1ZTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3A7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGluZGV4KXsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOjsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0UHJldmlvdXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3A9c2VsZi5zaW1wbGVTbGlkZVNob3codHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOjsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0TmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcD1zZWxmLnNpbXBsZVNsaWRlU2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ga2V5VXBIYW5kbGVyKGUpewogICAgICAgICAgICAgICAgICAgICAgICBpZihlLmtleUNvZGUhPXZhbGlkS2V5Q29kZVtpbmRleF0pcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsa2V5VXBIYW5kbGVyLGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAga2V5RG93bj1mYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCgpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLGtleVVwSGFuZGxlcixmYWxzZSk7CgogICAgICAgICAgICAgICAgfSx0cnVlKTsKCgogICAgICAgICAgICAgICAgdmFyIGltZ0RyYWdlZDsKICAgICAgICAgICAgICAgIGVsZU1hcHNbJ2ltZy1wYXJlbnQnXS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLGZ1bmN0aW9uKGUpey8v5aaC5p6c5Zu+54mH5bC65a+45aSn5LqO5bGP5bmV55qE5pe25YCZ5oyJ5L2P5Zu+54mH6L+b6KGM5ouW56e7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldD1lLnRhcmdldDsKICAgICAgICAgICAgICAgICAgICBpZihlLmJ1dHRvbiE9MCB8fCB0YXJnZXQubm9kZU5hbWUhPSdJTUcnKXJldHVybjsKICAgICAgICAgICAgICAgICAgICB2YXIgYmlnZ2VyPXRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3B2LWdhbGxlcnktaW1nX3pvb20tb3V0Jyk7Ly/lpoLmnpzmmK/lpKfkuo7lsY/luZUKCiAgICAgICAgICAgICAgICAgICAgdmFyIG9DbGllbnQ9ewogICAgICAgICAgICAgICAgICAgICAgICB4OmUuY2xpZW50WCwKICAgICAgICAgICAgICAgICAgICAgICAgeTplLmNsaWVudFksCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG9TY3JvbGw9ewogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OnNlbGYuaW1nU2Nyb2xsYmFySC5nZXRTY3JvbGxlZCgpLAogICAgICAgICAgICAgICAgICAgICAgICB0b3A6c2VsZi5pbWdTY3JvbGxiYXJWLmdldFNjcm9sbGVkKCksCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1vdmVGaXJlZENvdW50PTA7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vdmVIYW5kbGVyPWZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgICAgICBtb3ZlRmlyZWRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICBpZihtb3ZlRmlyZWRDb3VudDwyKXsvL+e7meS4que8k+WGsuOAguOAggogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBpbWdEcmFnZWQ9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoYmlnZ2VyKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zdHlsZS5jdXJzb3I9IHN1cHBvcnQuY3NzQ3Vyc29yVmFsdWUuZ3JhYmJpbmcgfHwgJ3BvaW50ZXInOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbWdTY3JvbGxiYXJWLnNjcm9sbChvU2Nyb2xsLnRvcC0oZS5jbGllbnRZLW9DbGllbnQueSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbWdTY3JvbGxiYXJILnNjcm9sbChvU2Nyb2xsLmxlZnQtKGUuY2xpZW50WC1vQ2xpZW50LngpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB2YXIgdXBIYW5kbGVyPWZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zdHlsZS5jdXJzb3I9Jyc7CgogICAgICAgICAgICAgICAgICAgICAgICAvL+aLluabs+S5i+WQjumYu+atoumaj+WQjuWPr+iDveS6p+eUn2NsaWNr5LqL5Lu25Lqn55Sf55qE5aSn5bCP5YiH5o2i44CCCiAgICAgICAgICAgICAgICAgICAgICAgIC8v56Gu5L+d5Zyo6ZqP5ZCO55qEY2xpY2vkuovku7blj5HnlJ/lkI7miafooYwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nRHJhZ2VkPWZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9LDApOwoKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxtb3ZlSGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsdXBIYW5kbGVyLHRydWUpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsbW92ZUhhbmRsZXIsdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsdXBIYW5kbGVyLHRydWUpOwogICAgICAgICAgICAgICAgfSx0cnVlKTsKCiAgICAgICAgICAgICAgICBlbGVNYXBzWydpbWctcGFyZW50J10uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpey8v54K55Ye75Zu+54mH5pys6Lqr5bCx6KGM5Zu+54mH57yp5pS+5aSE55CGCiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldD1lLnRhcmdldDsKICAgICAgICAgICAgICAgICAgICBpZihlLmJ1dHRvbiE9MCB8fCB0YXJnZXQubm9kZU5hbWUhPSdJTUcnKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgaWYoaW1nRHJhZ2VkKXsvL+WcqOaLluWKqOWQjuinpuWPkeeahGNsaWNr5LqL5Lu277yM5Y+W5raI5o6J44CC5YWN5b6X5LiA5ouW5Yqo5a6M5bCx56uL5Y2z6L+b6KGM55qE57yp5pS+44CC44CC44CCCiAgICAgICAgICAgICAgICAgICAgICAgIGltZ0RyYWdlZD1mYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3B2LWdhbGxlcnktaW1nX3pvb20taW4nKSl7Ly/mlL7lpKcKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXRDb250YWlucz1mYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHpvb21YID0gdHlwZW9mIGUub2Zmc2V0WD09J3VuZGVmaW5lZCcgPyBlLmxheWVyWCA6IGUub2Zmc2V0WDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHpvb21ZID0gdHlwZW9mIGUub2Zmc2V0WT09J3VuZGVmaW5lZCcgPyBlLmxheWVyWSA6IGUub2Zmc2V0WTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxlWD16b29tWC90YXJnZXQub2Zmc2V0V2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY2FsZVk9em9vbVkvdGFyZ2V0Lm9mZnNldEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXRUb1NjcmVlbih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OnNjYWxlWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6c2NhbGVZLAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwdi1nYWxsZXJ5LWltZ196b29tLW91dCcpKXsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXRDb250YWlucz10cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpdFRvU2NyZWVuKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sdHJ1ZSk7CgoKICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLGZ1bmN0aW9uKGUpey8v6byg5qCH5oyJ5Zyo5a+86Iiq5LiK77yM5YiH5o2i5Zu+54mHCiAgICAgICAgICAgICAgICAgICAgaWYoZS5idXR0b24hPTApcmV0dXJuOy8v5bem6ZSuCiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldD1lLnRhcmdldDsKICAgICAgICAgICAgICAgICAgICBpZih0YXJnZXQubm9kZU5hbWU9PSdJTUcnKWUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoZWQ9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcDsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2godGFyZ2V0KXsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlbGVNYXBzWydpbWctY29udHJvbGVyLXByZSddOjsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlbGVNYXBzWydzaWRlYmFyLWNvbnRyb2xlci1wcmUnXTp7Ly/kuIrkuIDkuKoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0UHJldmlvdXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3A9c2VsZi5zaW1wbGVTbGlkZVNob3codHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlbGVNYXBzWydpbWctY29udHJvbGVyLW5leHQnXTo7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZWxlTWFwc1snc2lkZWJhci1jb250cm9sZXItbmV4dCddOnsvL+S4i+S4gOS4qgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3ROZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wPXNlbGYuc2ltcGxlU2xpZGVTaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkPWZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbW91c2VVcEhhbmRsZXIoZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLG1vdXNlVXBIYW5kbGVyLHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBzdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYobWF0Y2hlZCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsbW91c2VVcEhhbmRsZXIsdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sZmFsc2UpOwoKICAgICAgICAgICAgICAgIGVsZU1hcHNbJ3NpZGViYXItdGh1bWJuYWlscy1jb250YWluZXInXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7Ly/ngrnlh7vnvKnnlaXlm77liIfmjaIKICAgICAgICAgICAgICAgICAgICBpZihlLmJ1dHRvbiE9MClyZXR1cm47Ly/lt6bplK4KICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0PWUudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRQOwogICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhc2V0KHRhcmdldCwnc3JjJykgJiYgKHRhcmdldFA9dGFyZ2V0LnBhcmVudE5vZGUpICYmICFkYXRhc2V0KHRhcmdldFAsJ3NyYycpKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWxlY3QodGFyZ2V0UD8gdGFyZ2V0UCA6IHRhcmdldCk7CiAgICAgICAgICAgICAgICB9LGZhbHNlKTsKCiAgICAgICAgICAgICAgICAvL+eCueWHu+ivu+WPlumUmeivr+eahOWbvueJh+WNoOS9jeespumHjeaWsOivu+WPlgogICAgICAgICAgICAgICAgZWxlTWFwc1snaW1nX2Jyb2tlbiddLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICBpZihzZWxmLmlzTG9hZGluZyl7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0KHNlbGYuZXJyb3JTcGFuKTsKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRJbWcoc2VsZi5lcnJvclNwYW4pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LGZhbHNlKTsKCgogICAgICAgICAgICAgICAgZWxlTWFwc1snaGVhZCddLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsvL+mhtuagj+S4iumdoueahOWRveS7pAogICAgICAgICAgICAgICAgICAgIGlmKGUuYnV0dG9uIT0wKXJldHVybjsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0PWUudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgIGlmKGVsZU1hcHNbJ2hlYWQtY29tbWFuZC1jbG9zZSddPT10YXJnZXQpewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoZWxlTWFwc1snaGVhZC1jb21tYW5kLW9wZXJhdGUnXS5jb250YWlucyh0YXJnZXQpKXsKICAgICAgICAgICAgICAgICAgICAgICAgaW1nUmVhZHkoc2VsZi5zcmMsewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHk6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW1nV2luZG93Qyh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGVsZU1hcHNbJ2hlYWQtY29tbWFuZC1uZXh0UGFnZSddLmNvbnRhaW5zKHRhcmdldCkpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dFNwYW49ZWxlTWFwc1snaGVhZC1jb21tYW5kLW5leHRQYWdlJ10ucXVlcnlTZWxlY3Rvcigic3BhbiIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZih0ZXh0U3Bhbi5pbm5lckhUTUw9PWkxOG4oImxvYWRpbmciKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U3Bhbi5pbm5lckhUTUw9aTE4bigibG9hZEFsbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTcGFuLmlubmVySFRNTD1pMThuKCJsb2FkaW5nIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tcGxldGVQYWdlcz1bXTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXh0UGFnZSgpOwogICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGVsZU1hcHNbJ2hlYWQtY29tbWFuZC1jb2xsZWN0J10uY29udGFpbnModGFyZ2V0KSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbGxlY3Rpb24uZmF2b3JpdGUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmFkZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGVsZU1hcHNbJ2hlYWQtY29tbWFuZC1leGl0LWNvbGxlY3Rpb24nXS5jb250YWlucyh0YXJnZXQpKXsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5leGl0KCk7CiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoZWxlTWFwc1snaGVhZC1jb21tYW5kLXNsaWRlLXNob3cnXS5jb250YWlucyh0YXJnZXQpKXsKICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGVTaG93LnN3aXRjaFN0YXR1cygpOwogICAgICAgICAgICAgICAgICAgICAgICBzbGlkZVNob3cuY2hlY2soKTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0sZmFsc2UpOwoKCiAgICAgICAgICAgICAgICAvL+eCueWHu+i/mOWOn+OAggogICAgICAgICAgICAgICAgbWF4aW1pemVUcmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0PWUudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgaWYodGFyZ2V0PT10aGlzKXsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzaXplSGFuZGxlcigpOwogICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1pbmltaXplZD1mYWxzZTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSx0cnVlKTsKCgogICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplSGFuZGxlcj10aGlzLnJlc2l6ZUhhbmRsZXIuYmluZCh0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMuX2tleURvd25MaXN0ZW5lcj10aGlzLmtleURvd25MaXN0ZW5lci5iaW5kKHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy5fa2V5VXBMaXN0ZW5lcj10aGlzLmtleVVwTGlzdGVuZXIuYmluZCh0aGlzKTsKCiAgICAgICAgICAgICAgICAvL+aPkuWFpeWKqOaAgeeUn+aIkOeahGNzc+aVsOaNruOAggogICAgICAgICAgICAgICAgdGhpcy5nbG9iYWxTU2hlZXQuaW5zZXJ0UnVsZSgnLnB2LWdhbGxlcnktc2lkZWJhci10aHVtYi1jb250YWluZXJ7JysKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpc0hvcml6b250YWwgPyAnd2lkdGgnIDogJ2hlaWdodCcpICsgJzonICArIChpc0hvcml6b250YWwgPyAgdW5zYWZlV2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlTWFwc1snc2lkZWJhci10aHVtYm5haWxzLWNvbnRhaW5lciddKS5oZWlnaHQgOiB1bnNhZmVXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVNYXBzWydzaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyJ10pLndpZHRoKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfScsdGhpcy5nbG9iYWxTU2hlZXQuY3NzUnVsZXMubGVuZ3RoKTsKCiAgICAgICAgICAgICAgICB0aGlzLmZvcmNlUmVwYWludFRpbWVzPTA7CgogICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogICAgICAgICAgICAgICAgdGhpcy5zaG93bj1mYWxzZTsKCiAgICAgICAgICAgICAgICAvLyDmiJHmt7vliqDnmoTpg6jliIYKICAgICAgICAgICAgICAgIHRoaXMuaW5pdFRvZ2dsZUJhcigpOwogICAgICAgICAgICAgICAgdGhpcy5pbml0Wm9vbSgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgY2hhbmdlTWluVmlldzpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIHNpemVJbnB1dEg9dGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoIiNtaW5zaXplSCIpOwogICAgICAgICAgICAgICAgdmFyIHNpemVJbnB1dFc9dGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoIiNtaW5zaXplVyIpOwogICAgICAgICAgICAgICAgdmFyIHNpemVJbnB1dEhTcGFuPXRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCIjbWluc2l6ZUhTcGFuIik7CiAgICAgICAgICAgICAgICB2YXIgc2l6ZUlucHV0V1NwYW49dGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoIiNtaW5zaXplV1NwYW4iKTsKICAgICAgICAgICAgICAgIHNpemVJbnB1dEgudGl0bGU9c2l6ZUlucHV0SC52YWx1ZSsicHgiOwogICAgICAgICAgICAgICAgc2l6ZUlucHV0SFNwYW4uaW5uZXJIVE1MPXNpemVJbnB1dEgudmFsdWUrInB4IjsKICAgICAgICAgICAgICAgIHNpemVJbnB1dFcudGl0bGU9c2l6ZUlucHV0Vy52YWx1ZSsicHgiOwogICAgICAgICAgICAgICAgc2l6ZUlucHV0V1NwYW4uaW5uZXJIVE1MPXNpemVJbnB1dFcudmFsdWUrInB4IjsKCiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoIWl0ZW0pcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIHZhciBzcGFuTWFyaz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzcGFuLnB2LWdhbGxlcnktc2lkZWJhci10aHVtYi1jb250YWluZXJbZGF0YS1zcmM9JyIraXRlbS5zcmMrIiddIik7CiAgICAgICAgICAgICAgICAgICAgaWYoc3Bhbk1hcmspewogICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLnNpemVXPHNpemVJbnB1dFcudmFsdWUgfHwgaXRlbS5zaXplSDxzaXplSW5wdXRILnZhbHVlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5NYXJrLnN0eWxlLmRpc3BsYXk9Im5vbmUiOwogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbk1hcmsuc3R5bGUuZGlzcGxheT0iIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGNoYW5nZVNpemVJbnB1dFc6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHZhciBtYXhTaXplSD0wLG1pblNpemVIPTAsbWF4U2l6ZVc9MCxtaW5TaXplVz0wOwogICAgICAgICAgICAgICAgdmFyIHNpemVJbnB1dEg9dGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoIiNtaW5zaXplSCIpOwogICAgICAgICAgICAgICAgdmFyIHNpemVJbnB1dFc9dGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoIiNtaW5zaXplVyIpOwogICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZvckVhY2goZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgICAgICAgIGlmKCFpdGVtKXJldHVybjsKICAgICAgICAgICAgICAgICAgICBpZihpdGVtLnNpemVXPj1zaXplSW5wdXRXLnZhbHVlKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5zaXplSD5tYXhTaXplSCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemVIPWl0ZW0uc2l6ZUg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uc2l6ZUg8bWluU2l6ZUggfHwgbWluU2l6ZUg9PTApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5TaXplSD1pdGVtLnNpemVIOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgc2l6ZUlucHV0SC5tYXg9bWF4U2l6ZUg7CiAgICAgICAgICAgICAgICBzaXplSW5wdXRILm1pbj1taW5TaXplSDsKICAgICAgICAgICAgICAgIHNpemVJbnB1dEgudGl0bGU9c2l6ZUlucHV0SC52YWx1ZSsicHgiOwogICAgICAgICAgICAgICAgdmFyIHNpemVJbnB1dEhTcGFuPXRoaXMuZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCIjbWluc2l6ZUhTcGFuIik7CiAgICAgICAgICAgICAgICBzaXplSW5wdXRIU3Bhbi5pbm5lckhUTUw9c2l6ZUlucHV0SC52YWx1ZSsicHgiOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgY2hhbmdlU2l6ZUlucHV0SDpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIG1heFNpemVIPTAsbWluU2l6ZUg9MCxtYXhTaXplVz0wLG1pblNpemVXPTA7CiAgICAgICAgICAgICAgICB2YXIgc2l6ZUlucHV0SD10aGlzLmdhbGxlcnkucXVlcnlTZWxlY3RvcigiI21pbnNpemVIIik7CiAgICAgICAgICAgICAgICB2YXIgc2l6ZUlucHV0Vz10aGlzLmdhbGxlcnkucXVlcnlTZWxlY3RvcigiI21pbnNpemVXIik7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoIWl0ZW0pcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uc2l6ZUg+PXNpemVJbnB1dEgudmFsdWUpewogICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLnNpemVXPm1heFNpemVXKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZVc9aXRlbS5zaXplVzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5zaXplVzxtaW5TaXplVyB8fCBtaW5TaXplVz09MCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblNpemVXPWl0ZW0uc2l6ZVc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBzaXplSW5wdXRXLm1heD1tYXhTaXplVzsKICAgICAgICAgICAgICAgIHNpemVJbnB1dFcubWluPW1pblNpemVXOwogICAgICAgICAgICAgICAgc2l6ZUlucHV0Vy50aXRsZT1zaXplSW5wdXRXLnZhbHVlKyJweCI7CiAgICAgICAgICAgICAgICB2YXIgc2l6ZUlucHV0V1NwYW49dGhpcy5nYWxsZXJ5LnF1ZXJ5U2VsZWN0b3IoIiNtaW5zaXplV1NwYW4iKTsKICAgICAgICAgICAgICAgIHNpemVJbnB1dFdTcGFuLmlubmVySFRNTD1zaXplSW5wdXRXLnZhbHVlKyJweCI7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGluaXRUb2dnbGVCYXI6IGZ1bmN0aW9uKCkgeyAgLy8g5piv5ZCm5pi+56S65YiH5o2iIHNpZGViYXIg5oyJ6ZKuCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgKiBUT0RP77ya5Lu/6YCg5LiL6Z2i55qE6ZO+5o6l6YeN5paw5pS56YCg6L+H77yfCiAgICAgICAgICogaHR0cDovL2ltYWdlLmJhaWR1LmNvbS9kZXRhaWwvbmV3aW5kZXg/Y29sPSVFOCVCNSU4NCVFOCVBRSVBRiZ0YWc9JUU0JUJEJTkzJUU4JTgyJUIyJnBuPTAmcGlkPTUxMjM2NjI4MjE2ODgxNDI0NzgmYWlkPSZ1c2VyX2lkPTEwMDg2JnNldGlkPS0xJnNvcnQ9MCZuZXdzUG49NCZzdGFyPSZmcj1ob3R3b3JkJmZyb209MQogICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKHByZWZzLmdhbGxlcnkuc2lkZWJhclRvZ2dsZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGVCYXIgPSB0aGlzLmVsZU1hcHNbJ3NpZGViYXItdG9nZ2xlJ107CiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQmFyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgICAgICAgICAgIHRvZ2dsZUJhci5zdHlsZS5oZWlnaHQgPSAnMTJweCc7CiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQmFyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zaG93SGlkZUJvdHRvbS5iaW5kKHRoaXMpLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgICAgIC8vIOmhtumDqOWchuinkgogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocHJlZnMuZ2FsbGVyeS5zaWRlYmFyUG9zaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm90dG9tJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUJhci5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnOHB4IDhweCAwIDAnOyAgLy8g5bem5LiK44CB5Y+z5LiK44CB5Y+z5LiL44CB5bem5LiLCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndG9wJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUJhci5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnMCAwIDhweCA4cHgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQmFyLnN0eWxlLmhlaWdodCA9ICc2MHB4JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUJhci5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnMCA4cHggOHB4IDAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZUJhci5zdHlsZS5oZWlnaHQgPSAnNjBweCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVCYXIuc3R5bGUuYm9yZGVyUmFkaXVzID0gJzhweCAwIDAgOHB4JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2hvd0hpZGVCb3R0b206IGZ1bmN0aW9uKCkgeyAgLy8g5pi+56S66ZqQ6JePIHNpZGViYXItY29udGFpbmVyCiAgICAgICAgICAgICAgICB2YXIgc2lkZWJhckNvbnRhaW5lciA9IHRoaXMuZWxlTWFwc1snc2lkZWJhci1jb250YWluZXInXSwKICAgICAgICAgICAgICAgICAgICBpc0hpZGRlbiA9IHNpZGViYXJDb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSA9PSAnaGlkZGVuJzsKCiAgICAgICAgICAgICAgICBzaWRlYmFyQ29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSBpc0hpZGRlbiA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nOwoKICAgICAgICAgICAgICAgIHZhciBzaWRlYmFyUG9zaXRpb24gPSBwcmVmcy5nYWxsZXJ5LnNpZGViYXJQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplID0gZnVuY3Rpb24oc3RyaW5nKSB7IC8vIOWwhuWtl+espuS4suS4reavj+S4quWNleivjemmluWtl+avjeWkp+WGmQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgd29yZHMgPSBzdHJpbmcuc3BsaXQoIiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZHNbaV0gPSB3b3Jkc1tpXS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHdvcmRzW2ldLnNsaWNlKDEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3Jkcy5qb2luKCIgIik7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyDkv67mraPkuIvlm77niYflupXpg6jnmoTpq5jluqYKICAgICAgICAgICAgICAgIHRoaXMuZWxlTWFwc1snaW1nLWNvbnRhaW5lciddLnN0eWxlWydib3JkZXInICsgY2FwaXRhbGl6ZShzaWRlYmFyUG9zaXRpb24pXSA9IGlzSGlkZGVuID8KICAgICAgICAgICAgICAgICAgICBwcmVmcy5nYWxsZXJ5LnNpZGViYXJTaXplICsgJ3B4IHNvbGlkIHRyYW5zcGFyZW50JyA6CiAgICAgICAgICAgICAgICAnMCc7CiAgICAgICAgICAgICAgICAvLyDkv67mraPlupXpg6jot53nprsKICAgICAgICAgICAgICAgIHRoaXMuZWxlTWFwc1snc2lkZWJhci10b2dnbGUnXS5zdHlsZVtzaWRlYmFyUG9zaXRpb25dID0gaXNIaWRkZW4gPyAnLTVweCcgOiAnMCc7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGluaXRab29tOiBmdW5jdGlvbigpIHsgIC8vIOWmguaenOacieaUvuWkp++8jOWImeaKiuWbvueJh+WPiiBzaWRlYmFyIOmDqOWIhue8qeaUvuavlOeOh+aUueS4uiAxCiAgICAgICAgICAgICAgICBpZiAocHJlZnMuZ2FsbGVyeS5hdXRvWm9vbSAmJiBkb2N1bWVudC5ib2R5LnN0eWxlLnpvb20gIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9ab29tID0gZGV0ZWN0Wm9vbSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChvWm9vbSA+IDEwMCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZU1hcHNbJ2JvZHknXS5zdHlsZS56b29tID0gMTAwIC8gb1pvb207CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZ2V0VGh1bVNwYW46ZnVuY3Rpb24ocHJldmlvdXMscmVsYXRlZFRhcmdldCl7CiAgICAgICAgICAgICAgICB2YXIgcmV0OwogICAgICAgICAgICAgICAgdmFyIHJ0ID0gcmVsYXRlZFRhcmdldCB8fCB0aGlzLnNlbGVjdGVkOwogICAgICAgICAgICAgICAgaWYoIXJ0KXJldHVybjsKICAgICAgICAgICAgICAgIHdoaWxlKChydD1wcmV2aW91cyA/IHJ0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgOiBydC5uZXh0RWxlbWVudFNpYmxpbmcpKXsKICAgICAgICAgICAgICAgICAgICBpZihydC5jbGllbnRXaWR0aCE9MCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldD1ydDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICB9LAogICAgICAgICAgICBwcmV2aW91czpmYWxzZSwKICAgICAgICAgICAgc2VsZWN0UHJldmlvdXM6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXM9dHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0KHRoaXMuZ2V0VGh1bVNwYW4odHJ1ZSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzZWxlY3ROZXh0OmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLmdldFRodW1TcGFuKCkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzZWxlY3Q6ZnVuY3Rpb24oZWxlLG5vVHJhbnNpdGlvbil7CiAgICAgICAgICAgICAgICBpZighZWxlIHx8IHRoaXMuc2VsZWN0ZWQ9PWVsZSlyZXR1cm47CiAgICAgICAgICAgICAgICBpZih0aGlzLnNlbGVjdGVkKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5zZWxlY3RlZENsYXNzTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5jbGFzc0xpc3QucmVtb3ZlKCdwdi1nYWxsZXJ5LXNpZGViYXItdGh1bWJfc2VsZWN0ZWQnKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBlbGUuY2xhc3NMaXN0LmFkZCh0aGlzLnNlbGVjdGVkQ2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIGVsZS5jbGFzc0xpc3QuYWRkKCdwdi1nYWxsZXJ5LXNpZGViYXItdGh1bWJfc2VsZWN0ZWQnKTsKCiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkPWVsZTsKICAgICAgICAgICAgICAgIHRoaXMuYXJyb3dWaXNpYigpOwoKICAgICAgICAgICAgICAgIHZhciBzZWxmPXRoaXM7CiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5sb2FkSW1nVGltZXIpOwogICAgICAgICAgICAgICAgaWYocHJlZnMuZ2FsbGVyeS50cmFuc2l0aW9uKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRJbWdUaW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Ly/lv6vpgJ/ot7PovaznmoTml7blgJnkuI3opoHlsJ3or5Xor7vlj5blm77niYfjgIIKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkSW1nKGVsZSk7CiAgICAgICAgICAgICAgICAgICAgfSwyMDApOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkSW1nKGVsZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEludG9WaWV3KG5vVHJhbnNpdGlvbik7CiAgICAgICAgICAgICAgICB0aGlzLmZvcmNlUmVwYWludCgpOwogICAgICAgICAgICAgICAgdGhpcy5zbGlkZVNob3cucnVuKCdzZWxlY3QnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbG9hZFRodW1iOmZ1bmN0aW9uKCl7Ly/or7vlj5blj6/op4bojIPlm7Tph4zpnaLnmoTnvKnnlaXlm74KICAgICAgICAgICAgICAgIHZhciBzZWxmPXRoaXM7CiAgICAgICAgICAgICAgICB2YXIgcHJvPXNlbGYuaXNIb3Jpem9udGFsID8gWydzY3JvbGxMZWZ0JywnY2xpZW50V2lkdGgnLCdvZmZzZXRMZWZ0Jywnb2Zmc2V0V2lkdGgnXSA6IFsnc2Nyb2xsVG9wJywnY2xpZW50SGVpZ2h0Jywnb2Zmc2V0VG9wJywnb2Zmc2V0SGVpZ2h0J107CiAgICAgICAgICAgICAgICB2YXIgdGh1bWJDPXNlbGYuZWxlTWFwc1snc2lkZWJhci10aHVtYm5haWxzLWNvbnRhaW5lciddOwoKICAgICAgICAgICAgICAgIHZhciBzY3JvbGxlZD10aHVtYkNbcHJvWzBdXTsKCiAgICAgICAgICAgICAgICB2YXIgbG9hZFN0b3BEaXM9c2Nyb2xsZWQgKyB0aHVtYkNbcHJvWzFdXTsKCiAgICAgICAgICAgICAgICB2YXIgaW1nU3BhbnM9c2VsZi5zZWxlY3RlZC5wYXJlbnROb2RlLmNoaWxkcmVuOwogICAgICAgICAgICAgICAgdmFyIHNwYW5faTsKICAgICAgICAgICAgICAgIHZhciBzcGFuT2Zmc2V0OwogICAgICAgICAgICAgICAgdmFyIHRodW1iOwoKICAgICAgICAgICAgICAgIHZhciBpPTAKICAgICAgICAgICAgICAgIHdoaWxlKHNwYW5faT1pbWdTcGFuc1tpKytdKXsKICAgICAgICAgICAgICAgICAgICBpZihzcGFuX2kuY2xpZW50V2lkdGg9PTApY29udGludWU7Ly/pmpDol4/nmoQKCiAgICAgICAgICAgICAgICAgICAgc3Bhbk9mZnNldD1zcGFuX2lbcHJvWzJdXTsKICAgICAgICAgICAgICAgICAgICBpZihzcGFuT2Zmc2V0ICsgc3Bhbl9pW3Byb1szXV0gPD0gc2Nyb2xsZWQpY29udGludWU7Ly/lnKjmu5rliqjmnaHkuIrpnaLkuoYKICAgICAgICAgICAgICAgICAgICBpZihzcGFuT2Zmc2V0ID49IGxvYWRTdG9wRGlzKWJyZWFrOy8v5Zyo5rua5Yqo5p2h5LiL6Z2i5LqGCgogICAgICAgICAgICAgICAgICAgIGlmKGRhdGFzZXQoc3Bhbl9pLCd0aHVtYkxvYWRlZCcpKWNvbnRpbnVlOy8v5bey57uP5Yqg6L295LqG57yp55Wl5Zu+CgogICAgICAgICAgICAgICAgICAgIHRodW1iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwogICAgICAgICAgICAgICAgICAgIHRodW1iLnNyYz1kYXRhc2V0KHNwYW5faSwndGh1bWJTcmMnKSB8fCBkYXRhc2V0KHNwYW5faSwnc3JjJykgfHwgcHJlZnMuaWNvbnMuYnJva2VuSW1nX3NtYWxsOwogICAgICAgICAgICAgICAgICAgIHRodW1iLmNsYXNzTmFtZT0ncHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1iJzsKCiAgICAgICAgICAgICAgICAgICAgZGF0YXNldChzcGFuX2ksJ3RodW1iTG9hZGVkJywndHJ1ZScpOwogICAgICAgICAgICAgICAgICAgIHNwYW5faS5hcHBlbmRDaGlsZCh0aHVtYik7CgogICAgICAgICAgICAgICAgICAgIGltZ1JlYWR5KHRodW1iLHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNyYz1wcmVmcy5pY29ucy5icm9rZW5JbWdfc21hbGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBzZWxlY3RlZEludG9WaWV3OmZ1bmN0aW9uKG5vVHJhbnNpdGlvbil7CiAgICAgICAgICAgICAgICB2YXIgdGh1bUJDPXRoaXMuZWxlTWFwc1snc2lkZWJhci10aHVtYm5haWxzLWNvbnRhaW5lciddOwogICAgICAgICAgICAgICAgdmFyIHBybz10aGlzLmlzSG9yaXpvbnRhbCA/IFsnb2Zmc2V0TGVmdCcsJ2NsaWVudFdpZHRoJywnb2Zmc2V0V2lkdGgnXSA6IFsnb2Zmc2V0VG9wJywnY2xpZW50SGVpZ2h0Jywnb2Zmc2V0SGVpZ2h0J10gOwogICAgICAgICAgICAgICAgLy/pnIDopoHmu5rliqjnmoTot53nprvjgIIKICAgICAgICAgICAgICAgIHZhciBuZWVkU2Nyb2xsRGlzPSB0aGlzLnNlbGVjdGVkW3Byb1swXV07CiAgICAgICAgICAgICAgICAvL+WwveWPr+iDveeahOWxheS4reaYvuekugogICAgICAgICAgICAgICAgdmFyIHRodW1CQ0NsaWVudD10aHVtQkNbcHJvWzFdXTsKICAgICAgICAgICAgICAgIHZhciBzY3JvbGxDZW50ZXI9TWF0aC5tYXgoKHRodW1CQ0NsaWVudCAtIHRoaXMuc2VsZWN0ZWRbcHJvWzJdXSkvMiwwKTsKCiAgICAgICAgICAgICAgICB0aGlzLnRodW1iU2Nyb2xsYmFyLnNjcm9sbChuZWVkU2Nyb2xsRGlzIC0gc2Nyb2xsQ2VudGVyLGZhbHNlLCFub1RyYW5zaXRpb24pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBnZXRJbWc6ZnVuY3Rpb24oZWxlKXsKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKCiAgICAgICAgICAgICAgICB2YXIgc3JjID0gZGF0YXNldChlbGUsJ3NyYycpOwoKICAgICAgICAgICAgICAgIHRoaXMubGFzdExvYWRpbmc9c3JjOy8v6K6w5L2P5pyA5ZCO6K+75Y+W55qE5Zu+54mHCiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZz10cnVlOy8v6KGo56S66YCJ5oup55qE5Zu+54mH5q2j5Zyo6K+75Y+WCgogICAgICAgICAgICAgICAgLy8g54m55q6K55qEIHhociDmlrnlvI/ojrflj5YKICAgICAgICAgICAgICAgIHZhciB4aHIgPSBkYXRhc2V0KGVsZSwgJ3hocicpOwogICAgICAgICAgICAgICAgaWYgKHhocikgewogICAgICAgICAgICAgICAgICAgIHZhciB4aHJFcnJvciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0KGVsZSwgJ3hocicsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldChlbGUsICdzcmMnLCBkYXRhc2V0KGVsZSwgJ3RodW1iLXNyYycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRJbWcoZWxlKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHhockxvYWQubG9hZCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogc3JjLAogICAgICAgICAgICAgICAgICAgICAgICB4aHI6IEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHhocikpLAogICAgICAgICAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24oaW1nU3JjLCBpbWdTcmNzLCBjYXB0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1nU3JjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldChlbGUsICdzcmMnLCBpbWdTcmMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXQoZWxlLCAneGhyJywgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0SW1nKGVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhockVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3I6IHhockVycm9yCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBhbGxMb2FkaW5nPXRoaXMuYWxsTG9hZGluZzsKICAgICAgICAgICAgICAgIGlmKGFsbExvYWRpbmcuaW5kZXhPZihzcmMpIT0tMSl7Ly/lnKjor7vlj5bpmJ/liJfkuK3jgIIKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgYWxsTG9hZGluZy5wdXNoKHNyYyk7CgogICAgICAgICAgICAgICAgLy/kuIrkuIDkuKror7vlj5bkuK3nmoTlm77niYfvvIzkuI3mmK/lvZPliY3mmL7npLrnmoTjgILpgqPkuYjnm7TmjqXnu4jmraIKICAgICAgICAgICAgICAgIHZhciBwcmVJbWdSPXRoaXMuaW1nUmVhZHk7CiAgICAgICAgICAgICAgICBpZihwcmVJbWdSICYmIHRoaXMuaW1nKXsKICAgICAgICAgICAgICAgICAgICBpZihwcmVJbWdSLmltZy5zcmMhPXRoaXMuc3JjKXsKICAgICAgICAgICAgICAgICAgICAgICAgcHJlSW1nUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICBwcmVJbWdSLnJlbW92ZUxJKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgICAgIC8v5pi+56S66K+75Y+W5oyH56S65Zmo44CCCiAgICAgICAgICAgICAgICB2YXIgbG9hZGluZ0luZGljYXRvcj1lbGUucXVlcnlTZWxlY3RvcignLnB2LWdhbGxlcnktc2lkZWJhci10aHVtYi1sb2FkaW5nJyk7CiAgICAgICAgICAgICAgICBsb2FkaW5nSW5kaWNhdG9yLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKCgogICAgICAgICAgICAgICAgdGhpcy5pbWdSZWFkeT1pbWdSZWFkeShzcmMsewogICAgICAgICAgICAgICAgICAgIHJlYWR5OmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5LuO6K+75Y+W6Zif5YiX5Lit5Yig6Zmk6Ieq5bexCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleD1hbGxMb2FkaW5nLmluZGV4T2Yoc3JjKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXghPS0xKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbExvYWRpbmcuc3BsaWNlKGluZGV4LDEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3JjIT1zZWxmLmxhc3RMb2FkaW5nKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmdJbmRpY2F0b3Iuc3R5bGUuZGlzcGxheT0nJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlSW1nUilwcmVJbWdSLmFib3J0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZEltZyh0aGlzLGVsZSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBsb2FkRW5kOmZ1bmN0aW9uKGUpey8v5ZyobG9hZGVuZOWQjuW8gOWni+mihOivu+OAggogICAgICAgICAgICAgICAgICAgICAgICAvL+S7juivu+WPlumYn+WIl+S4reWIoOmZpOiHquW3sQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXg9YWxsTG9hZGluZy5pbmRleE9mKHNyYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZGV4IT0tMSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxMb2FkaW5nLnNwbGljZShpbmRleCwxKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNyYyE9c2VsZi5sYXN0TG9hZGluZylyZXR1cm47CgogICAgICAgICAgICAgICAgICAgICAgICBpZihlLnR5cGU9PSdlcnJvcicpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZ0luZGljYXRvci5zdHlsZS5kaXNwbGF5PScnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvclNwYW49ZWxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlSW1nUilwcmVJbWdSLmFib3J0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRJbWcodGhpcyxlbGUsdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNsaWRlU2hvdy5ydW4oJ2xvYWRFbmQnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGhpcywn6aKE6K+75byA5aeLJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZWZzLmdhbGxlcnkucHJlbG9hZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihzZWxmLnByZWxvYWRpbmcpey8v57uT5p2f5LiK5qyh55qE6aKE6K+744CCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmVsb2FkaW5nLmFib3J0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmVsb2FkaW5nPW5ldyBzZWxmLlByZWxvYWQoZWxlLHNlbGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmVsb2FkaW5nLnByZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgdGhpcy5pbWdSZWFkeS5yZW1vdmVMST1mdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIGxvYWRpbmdJbmRpY2F0b3Iuc3R5bGUuZGlzcGxheT0nJzsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB9LAogICAgICAgICAgICBsb2FkSW1nOmZ1bmN0aW9uKGltZyxyZWxhdGVkVGh1bWIsZXJyb3IpewogICAgICAgICAgICAgICAgaWYoaW1nLm5vZGVOYW1lIT0nSU1HJyl7Ly/lhYjor7vlj5bjgIIKICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEltZyhpbWcpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgaWYodGhpcy5pbWcpewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW1nLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5pbWcpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB2YXIgaW1nTmF0dXJhbFNpemU9ewogICAgICAgICAgICAgICAgICAgIGg6aW1nLm5hdHVyYWxIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgdzppbWcubmF0dXJhbFdpZHRoLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHRoaXMuaW1nTmF0dXJhbFNpemU9aW1nTmF0dXJhbFNpemU7CgogICAgICAgICAgICAgICAgdGhpcy5lbGVNYXBzWydoZWFkLWxlZnQtaW1nLWluZm8tcmVzb2x1dGlvbiddLnRleHRDb250ZW50PWltZ05hdHVyYWxTaXplLncgKyAnIHggJyArIGltZ05hdHVyYWxTaXplLmg7CiAgICAgICAgICAgICAgICB2YXIgdGh1bWJuYWlscz10aGlzLmVsZU1hcHNbJ3NpZGViYXItdGh1bWJuYWlscy1jb250YWluZXInXS5jaGlsZE5vZGVzLGk9MDsKICAgICAgICAgICAgICAgIHdoaWxlKHRodW1ibmFpbHNbaV0hPXJlbGF0ZWRUaHVtYiAmJiBpPHRodW1ibmFpbHMubGVuZ3RoKWkrKzsKICAgICAgICAgICAgICAgIGlmKGk8dGh1bWJuYWlscy5sZW5ndGgpdGhpcy5lbGVNYXBzWydoZWFkLWxlZnQtaW1nLWluZm8tY291bnQnXS50ZXh0Q29udGVudD0i77yIIisoaSsxKSsiIC8gIit0aHVtYm5haWxzLmxlbmd0aCsi77yJIjsKICAgICAgICAgICAgICAgIC8vIOWKoOS4iuWbvueJh+eahOazqOmHigogICAgICAgICAgICAgICAgdmFyIGRlc2NyaXB0aW9uID0gZGVjb2RlVVJJQ29tcG9uZW50KGRhdGFzZXQocmVsYXRlZFRodW1iLCAnZGVzY3JpcHRpb24nKSksCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdExlbmd0aCA9IHByZWZzLmdhbGxlcnkuZGVzY3JpcHRpb25MZW5ndGg7CiAgICAgICAgICAgICAgICB0aGlzLmVsZU1hcHNbJ2hlYWQtbGVmdC1pbWctaW5mby1kZXNjcmlwdGlvbiddLnRpdGxlID0gZGVzY3JpcHRpb247CiAgICAgICAgICAgICAgICB0aGlzLmVsZU1hcHNbJ2hlYWQtbGVmdC1pbWctaW5mby1kZXNjcmlwdGlvbiddLnRleHRDb250ZW50PSBkZXNjcmlwdGlvbi5sZW5ndGggPiBkZWZhdWx0TGVuZ3RoID8KICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5zbGljZSgwLCBkZWZhdWx0TGVuZ3RoKSArICcuLi4nIDoKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOwoKICAgICAgICAgICAgICAgIHRoaXMuaW1nPWltZzsKICAgICAgICAgICAgICAgIHRoaXMuc3JjPWltZy5zcmM7CiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZz1mYWxzZTsKCiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0ZWRUaHVtYj1yZWxhdGVkVGh1bWI7CiAgICAgICAgICAgICAgICBpbWcuY2xhc3NOYW1lPSdwdi1nYWxsZXJ5LWltZyc7CgogICAgICAgICAgICAgICAgaWYoZXJyb3IpewogICAgICAgICAgICAgICAgICAgIGlmKHJlbGF0ZWRUaHVtYi5xdWVyeVNlbGVjdG9yKCJpbWciKS5zcmM9PXRoaXMuaW1nLnNyYyl7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW1nRXJyb3I9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWcuc3R5bGUuZGlzcGxheT0nbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlTWFwc1snaW1nX2Jyb2tlbiddLnN0eWxlLmRpc3BsYXk9J2lubGluZS1ibG9jayc7CiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcmNzPWRhdGFzZXQocmVsYXRlZFRodW1iLCAnc3JjcycpLnNwbGl0KCIsIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxmPXRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW1nLm9ubG9hZD1mdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGltZ05hdHVyYWxTaXplPXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOnRoaXMubmF0dXJhbEhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OnRoaXMubmF0dXJhbFdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmltZ05hdHVyYWxTaXplPWltZ05hdHVyYWxTaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXRUb1NjcmVlbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNyY3MpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNyYz1zcmNzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0KHJlbGF0ZWRUaHVtYiwgJ3NyY3MnLHNyY3Muam9pbigiLCIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNyYyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldChyZWxhdGVkVGh1bWIsICdzcmMnLHNyYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWcub25lcnJvcj1mdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcmM9cmVsYXRlZFRodW1iLnF1ZXJ5U2VsZWN0b3IoImltZyIpLnNyYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldChyZWxhdGVkVGh1bWIsICdzcmMnLHRoaXMuc3JjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWcuc3JjPXNyYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRoaXMuaW1nLnNyYz1yZWxhdGVkVGh1bWIucXVlcnlTZWxlY3RvcigiaW1nIikuc3JjOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgIHRoaXMuaW1nRXJyb3I9ZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVNYXBzWydpbWdfYnJva2VuJ10uc3R5bGUuZGlzcGxheT0nJzsKICAgICAgICAgICAgICAgICAgICBpZighZGF0YXNldChyZWxhdGVkVGh1bWIsJ25hdHVyYWxTaXplJykpewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0KHJlbGF0ZWRUaHVtYiwnbmF0dXJhbFNpemUnLEpTT04uc3RyaW5naWZ5KGltZ05hdHVyYWxTaXplKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgZnVuY3Rpb24gc3R5bGVkKCl7CiAgICAgICAgICAgICAgICAgICAgaW1nLnN0eWxlLm9wYWNpdHk9MTsKICAgICAgICAgICAgICAgICAgICBpbWcuc3R5bGVbc3VwcG9ydC5jc3NUcmFuc2Zvcm1dPSdzY2FsZSgxKSc7CiAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgICAgICBpZihwcmVmcy5nYWxsZXJ5LnRyYW5zaXRpb24pewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoc3R5bGVkLDApOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVkKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHRoaXMuZWxlTWFwc1snaW1nLXBhcmVudCddLmFwcGVuZENoaWxkKGltZyk7CgogICAgICAgICAgICAgICAgdGhpcy5maXRDb250YWlucz1wcmVmcy5nYWxsZXJ5LmZpdFRvU2NyZWVuOy8v6YCC5bqU5bGP5bmVCgogICAgICAgICAgICAgICAgdGhpcy5maXRUb1NjcmVlbih7CiAgICAgICAgICAgICAgICAgICAgeDowLAogICAgICAgICAgICAgICAgICAgIHk6MCwKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGlmKHRoaXMucHJldmlvdXMpewogICAgICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXM9ZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWdTY3JvbGxiYXJWLnNjcm9sbEJ5KDk5OTk5OSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb24uY2hlY2soKTsvL+ajgOafpeaYr+WQpuWcqOaUtuiXj+mHjOmdouOAggoKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZml0VG9TY3JlZW46ZnVuY3Rpb24oc2NhbGUpewoKICAgICAgICAgICAgICAgIHZhciBjb250YWluZXI9dGhpcy5lbGVNYXBzWydpbWctY29udGVudCddOwogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lclNpemU9ewogICAgICAgICAgICAgICAgICAgIGg6Y29udGFpbmVyLmNsaWVudEhlaWdodCwKICAgICAgICAgICAgICAgICAgICB3OmNvbnRhaW5lci5jbGllbnRXaWR0aCwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdmFyIGltZz10aGlzLmltZzsKCiAgICAgICAgICAgICAgICBpbWcuY2xhc3NMaXN0LnJlbW92ZSgncHYtZ2FsbGVyeS1pbWdfem9vbS1pbicpOwogICAgICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5yZW1vdmUoJ3B2LWdhbGxlcnktaW1nX3pvb20tb3V0Jyk7CgogICAgICAgICAgICAgICAgdmFyIGltZ1N0eT1pbWcuc3R5bGU7CiAgICAgICAgICAgICAgICBpbWdTdHkud2lkdGg9Jyc7CiAgICAgICAgICAgICAgICBpbWdTdHkuaGVpZ2h0PScnOwoKICAgICAgICAgICAgICAgIHZhciBjb250ZW50U1NpemU9ewogICAgICAgICAgICAgICAgICAgIGg6Y29udGFpbmVyLnNjcm9sbEhlaWdodCwKICAgICAgICAgICAgICAgICAgICB3OmNvbnRhaW5lci5zY3JvbGxXaWR0aCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgbGFyZ2VyPWNvbnRlbnRTU2l6ZS5oPmNvbnRhaW5lclNpemUuaCB8fCBjb250ZW50U1NpemUudz5jb250YWluZXJTaXplLnc7CgogICAgICAgICAgICAgICAgdmFyIHNjYWxlZD0nMTAwJSc7CgogICAgICAgICAgICAgICAgaWYodGhpcy5maXRDb250YWlucyAmJiAhKHNjYWxlICYmIHNjYWxlLng9PTAgJiYgc2NhbGUueT09MCAmJiB0aGlzLmltZ05hdHVyYWxTaXplLmgvdGhpcy5pbWdOYXR1cmFsU2l6ZS53ID4gMi41KSl7Ly/pgILlupTlsY/luZUKICAgICAgICAgICAgICAgICAgICB0aGlzLmltZ1Njcm9sbGJhclYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuaW1nU2Nyb2xsYmFySC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgaWYobGFyZ2VyKXsKICAgICAgICAgICAgICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoJ3B2LWdhbGxlcnktaW1nX3pvb20taW4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29udGVudFNTaXplLmgvY29udGVudFNTaXplLncgPj1jb250YWluZXJTaXplLmgvY29udGFpbmVyU2l6ZS53KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHQ9dGhpcy5pbWdOYXR1cmFsU2l6ZS5oLShjb250ZW50U1NpemUuaCAtIGNvbnRhaW5lclNpemUuaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdTdHkuaGVpZ2h0PWhlaWdodCArICdweCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWQ9aGVpZ2h0L3RoaXMuaW1nTmF0dXJhbFNpemUuaDsKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGg9dGhpcy5pbWdOYXR1cmFsU2l6ZS53LShjb250ZW50U1NpemUudyAtIGNvbnRhaW5lclNpemUudyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdTdHkud2lkdGg9d2lkdGggKyAncHgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkPXdpZHRoL3RoaXMuaW1nTmF0dXJhbFNpemUudzsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkPShzY2FsZWQqMTAwKS50b0ZpeGVkKDIpICsgJyUnOwogICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHByZWZzLmdhbGxlcnkuZml0VG9TY3JlZW5TbWFsbCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuaW1nTmF0dXJhbFNpemUuaC90aGlzLmltZ05hdHVyYWxTaXplLncgPj1jb250YWluZXJTaXplLmgvY29udGFpbmVyU2l6ZS53KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHQ9Y29udGVudFNTaXplLmgtNTA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9aGVpZ2h0PDA/Y29udGVudFNTaXplLmg6aGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nU3R5LmhlaWdodD1oZWlnaHQgKyAncHgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkPWhlaWdodC90aGlzLmltZ05hdHVyYWxTaXplLmg7CiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdpZHRoPWNvbnRlbnRTU2l6ZS53LTUwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9d2lkdGg8MD9jb250ZW50U1NpemUudzp3aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1N0eS53aWR0aD13aWR0aCArICdweCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWQ9d2lkdGgvdGhpcy5pbWdOYXR1cmFsU2l6ZS53OwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWQ9KHNjYWxlZCoxMDApLnRvRml4ZWQoMikgKyAnJSc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfWVsc2V7Ly/kuI3lgZrlsLrlr7josIPmlbQKICAgICAgICAgICAgICAgICAgICB0aGlzLmltZ1Njcm9sbGJhclYucmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmltZ1Njcm9sbGJhckgucmVzZXQoKTsKCiAgICAgICAgICAgICAgICAgICAgaWYobGFyZ2VyKXsKICAgICAgICAgICAgICAgICAgICAgICAgaW1nLmNsYXNzTGlzdC5hZGQoJ3B2LWdhbGxlcnktaW1nX3pvb20tb3V0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNjYWxlKXsvL+mAmui/h+m8oOagh+eCueWHu+i/m+ihjOeahOWIh+aNouOAggogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWdTY3JvbGxiYXJILnNjcm9sbChjb250YWluZXIuc2Nyb2xsV2lkdGggKiBzY2FsZS54IC0gY29udGFpbmVyU2l6ZS53LzIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbWdTY3JvbGxiYXJWLnNjcm9sbChjb250YWluZXIuc2Nyb2xsSGVpZ2h0ICogc2NhbGUueSAtIGNvbnRhaW5lclNpemUuaC8yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKCgogICAgICAgICAgICAgICAgdmFyIGltZ1NjYWxlZEluZm89dGhpcy5lbGVNYXBzWydoZWFkLWxlZnQtaW1nLWluZm8tc2NhbGluZyddOwogICAgICAgICAgICAgICAgaW1nU2NhbGVkSW5mby50ZXh0Q29udGVudD0n77yIJytzY2FsZWQrJ++8iSc7CiAgICAgICAgICAgICAgICBpZihzY2FsZWQhPScxMDAlJyl7CiAgICAgICAgICAgICAgICAgICAgaW1nU2NhbGVkSW5mby5zdHlsZS5jb2xvcj0nI0U5Q0NDQyc7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBpbWdTY2FsZWRJbmZvLnN0eWxlLmNvbG9yPScnOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBfZGF0YUNhY2hlOiB7fSwKICAgICAgICAgICAgX2FwcGVuZFRodW1iU3BhbnM6IGZ1bmN0aW9uKGRhdGEsIGluZGV4KSB7ICAvLyDmt7vliqDnvKnnlaXlm77moI/nmoQgc3BhbnMKICAgICAgICAgICAgICAgIHZhciBpU3RhdGlzQ29weSA9IHRoaXMuaVN0YXRpc0NvcHk7CgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbmRleCA9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnNlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmltZ1NwYW5zKS5pbmRleE9mKHRoaXMuc2VsZWN0ZWQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0aHVtYm5haWxzID0gdGhpcy5lbGVNYXBzWydzaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyJ107CiAgICAgICAgICAgICAgICAvLyDlpoLmnpzmmK/mlrDnmoTvvIzliJnmt7vliqDvvIzlkKbliJnph43nva7lubbmt7vliqDjgIIKICAgICAgICAgICAgICAgIGlmICghZGF0YSl7CiAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlscy5pbm5lckhUTUwgPSAiIjsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhQ2FjaGUgPSB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIChkYXRhIHx8IHRoaXMuZGF0YSkuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoIWl0ZW0pcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGlTdGF0aXNDb3B5W2l0ZW0udHlwZV0uY291bnQrKzsKICAgICAgICAgICAgICAgICAgICB2YXIgc3Bhbk1hcms9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbHMuYXBwZW5kQ2hpbGQoc3Bhbk1hcmspOwogICAgICAgICAgICAgICAgICAgIHRyeXsKICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbk1hcmsuY2xhc3NOYW1lPSJwdi1nYWxsZXJ5LXNpZGViYXItdGh1bWItY29udGFpbmVyIjsKICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbk1hcmsuZGF0YXNldC50eXBlPWl0ZW0udHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbk1hcmsuZGF0YXNldC5zcmM9aXRlbS5zcmM7CiAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5NYXJrLmRhdGFzZXQuc3Jjcz1pdGVtLnNyY3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0ueGhyKXNwYW5NYXJrLmRhdGFzZXQueGhyPWVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShpdGVtLnhocikpOwogICAgICAgICAgICAgICAgICAgICAgICBzcGFuTWFyay5kYXRhc2V0LmRlc2NyaXB0aW9uPWVuY29kZVVSSUNvbXBvbmVudChpdGVtLmRlc2NyaXB0aW9uIHx8ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbk1hcmsuZGF0YXNldC50aHVtYlNyYz1pdGVtLmltZ1NyYzsKICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbk1hcmsudGl0bGU9KGl0ZW0uaW1nP2l0ZW0uaW1nLnRpdGxlOiIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbk1hcmsuaW5uZXJIVE1MPSc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS12ZXJ0aWNhbC1hbGlnbi1oZWxwZXIiPjwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1iLWxvYWRpbmciIHRpdGxlPSInK2kxOG4oImxvYWRpbmciKSsnLi4uLi4uIj48L3NwYW4+JzsKICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7fTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIChkYXRhIHx8IHRoaXMuZGF0YSkuZm9yRWFjaChmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoIWQpcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFDYWNoZVtkLmltZ1NyY10gPSB0cnVlOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy/lhpnlhaXnsbvliKvmlbDmja7jgIIKICAgICAgICAgICAgICAgIHZhciBnYWxsZXJ5ID0gdGhpcy5nYWxsZXJ5OwogICAgICAgICAgICAgICAgdmFyIGlucHV0LCBsYWJlbCwgaVN0YXRpc0NvcHlfaTsKCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGlTdGF0aXNDb3B5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpU3RhdGlzQ29weS5oYXNPd25Qcm9wZXJ0eShpKSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgaVN0YXRpc0NvcHlfaSA9IGlTdGF0aXNDb3B5W2ldOwogICAgICAgICAgICAgICAgICAgIGlucHV0ID0gZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCcjcHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtZHJvcC1saXN0LWl0ZW0tY2F0ZWdvcnktJyArIGkpOwogICAgICAgICAgICAgICAgICAgIGlucHV0LmNoZWNrZWQgPSBpU3RhdGlzQ29weV9pLnNob3duOwogICAgICAgICAgICAgICAgICAgIGlmIChpU3RhdGlzQ29weV9pLmNvdW50ID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGlzYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoJ3B2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1pdGVtX2Rpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKCdwdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbV9kaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZ2FsbGVyeS5xdWVyeVNlbGVjdG9yKCdsYWJlbFtmb3I9InB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1pdGVtLWNhdGVnb3J5LScgKyBpICsgJyJdJyk7CiAgICAgICAgICAgICAgICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSBsYWJlbC50ZXh0Q29udGVudC5yZXBsYWNlKC/vvIguKu+8iS9pLCAnJykgKyAn77yIJyArIGlTdGF0aXNDb3B5X2kuY291bnQgKyAn77yJJzsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdGhpcy5pbWdTcGFucyA9IHRodW1ibmFpbHMuY2hpbGRyZW47CgogICAgICAgICAgICAgICAgdGhpcy50aHVtYlNjcm9sbGJhci5yZXNldCgpOwoKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0KHRoaXMuaW1nU3BhbnNbaW5kZXhdLCB0cnVlKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbG9hZDpmdW5jdGlvbihkYXRhLCBmcm9tLCByZWxvYWQpewogICAgICAgICAgICAgICAgaWYodGhpcy5zaG93biB8fCB0aGlzLm1pbmltaXplZCl7Ly/lj6rlhYHorrjmiZPlvIDkuIDkuKos6K+35YWI5YWz5o6J5b2T5YmN5bey57uP5omT5byA55qE5bqTCgogICAgICAgICAgICAgICAgICAgIGlmKGZyb20pey8vZnJhbWXlj5HpgIHov4fmnaXnmoTmlbDmja7jgIIKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJRDptZXNzYWdlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOidzZW5kRmFpbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bzpmcm9tLAogICAgICAgICAgICAgICAgICAgICAgICB9LCcqJyk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5taW5pbWl6ZWQpewogICAgICAgICAgICAgICAgICAgICAgICBhbGVydCgn6K+35YWI5YWz5o6J5b2T5YmN5bey57uP5omT5byA55qE5bqTJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZsYXNoRWxlKHRoaXMubWF4aW1pemVUcmlnZ2VyKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdmFyIHNlbGY9dGhpczsKICAgICAgICAgICAgICAgIGlmKGZyb20pey8v5p2l6IeqZnJhbWXvvIzojrflj5bov5nkuKpmcmFtZeaJgOWcqOeahGlmcmFtZeagh+etvuOAguWumuS9jeWIsOWbvueJh+eahOaXtuWAmeimgeeUqOWIsOOAggogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJRDptZXNzYWdlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6J2dldElmcmFtZU9iamVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd0lkOmZyb20sCiAgICAgICAgICAgICAgICAgICAgfSwnKicpOwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3B2LWdldElmcmFtZU9iamVjdCcsZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaWZyYW1lPWUuZGV0YWlsOwogICAgICAgICAgICAgICAgICAgIH0sdHJ1ZSk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciB1bmlxdWU9dGhpcy51bmlxdWUoZGF0YSk7CiAgICAgICAgICAgICAgICBkYXRhPXVuaXF1ZS5kYXRhOwogICAgICAgICAgICAgICAgdmFyIGluZGV4PXVuaXF1ZS5pbmRleDsKCiAgICAgICAgICAgICAgICBpZiAocmVsb2FkICYmIHRoaXMuZGF0YS5sZW5ndGggPj0gZGF0YS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAvLyBhbGVydCgn5rKh5pyJ5paw5aKe55qE5Zu+54mHJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuY2xlYXIoKTsvL+i/mOWOn+WvueixoeeahOS4gOS6m+S/ruaUue+8jOS7peS+v+WkjeeUqOOAggogICAgICAgICAgICAgICAgdGhpcy5kYXRhPWRhdGE7CiAgICAgICAgICAgICAgICB0aGlzLnNob3cocmVsb2FkKTsKCiAgICAgICAgICAgICAgICB0aGlzLmZyb209ZnJvbTsvL+WmguaenOadpeiHqmZyYW1l77yM6YKj5LmI6L+Z5LiqZnJvbeW6lOivpeS/neWtmOS6humCo+S4qmZyYW1l55qE56qX5Y+jaWTvvIzkvr/kuo7ku6XlkI7pgJrkv6HjgIIKCiAgICAgICAgICAgICAgICB0aGlzLl9hcHBlbmRUaHVtYlNwYW5zKG51bGwsIGluZGV4KTsKCiAgICAgICAgICAgICAgICB0aGlzLnJ1bk9uY2UoKTsKCiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaFRodW1iVmlzaWJsZSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjbGVhcjpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdGhpcy5fZGF0YUNhY2hlID0ge307CgogICAgICAgICAgICAgICAgdGhpcy5hbGxMb2FkaW5nPVtdOy8v6K+75Y+W5Lit55qE5Zu+54mH5pWw57uECiAgICAgICAgICAgICAgICB0aGlzLmlTdGF0aXNDb3B5PWNsb25lT2JqZWN0KHRoaXMuaW1nU3RhdGlzdGljcyx0cnVlKTsvL+WbvueJh+e7n+iuoeWJr+acrAogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZD09bnVsbDsKICAgICAgICAgICAgICAgIGlmKHRoaXMuaW1nKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmltZy5zdHlsZS5kaXNwbGF5PSdub25lJzsKICAgICAgICAgICAgICAgICAgICB0aGlzLmltZz1udWxsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8v6K+75Y+W6ZSZ6K+v55qE5Zu+54mH5Y2g5L2N56ymCiAgICAgICAgICAgICAgICB0aGlzLmVsZU1hcHNbJ2ltZ19icm9rZW4nXS5zdHlsZS5kaXNwbGF5PScnOwogICAgICAgICAgICAgICAgLy/muIXnqbpkb20KICAgICAgICAgICAgICAgIHRoaXMuZWxlTWFwc1snc2lkZWJhci10aHVtYm5haWxzLWNvbnRhaW5lciddLmlubmVySFRNTD0nJzsKICAgICAgICAgICAgICAgIHRoaXMuZWxlTWFwc1snaGVhZC1sZWZ0LWltZy1pbmZvLXJlc29sdXRpb24nXS50ZXh0Q29udGVudD0nMCB4IDAnOwogICAgICAgICAgICAgICAgdGhpcy5lbGVNYXBzWydoZWFkLWxlZnQtaW1nLWluZm8tY291bnQnXS50ZXh0Q29udGVudD0n77yIMSAvIDHvvIknOwogICAgICAgICAgICAgICAgdGhpcy5lbGVNYXBzWydoZWFkLWxlZnQtaW1nLWluZm8tc2NhbGluZyddLnRleHRDb250ZW50PSfvvIgxMDAl77yJJzsKICAgICAgICAgICAgICAgIC8v6ZqQ6JeP5rua5Yqo5p2hCiAgICAgICAgICAgICAgICB0aGlzLmltZ1Njcm9sbGJhclYuaGlkZSgpOwogICAgICAgICAgICAgICAgdGhpcy5pbWdTY3JvbGxiYXJILmhpZGUoKTsKICAgICAgICAgICAgICAgIHRoaXMudGh1bWJTY3JvbGxiYXIuaGlkZSgpOwogICAgICAgICAgICAgICAgLy/ph43nva5zdHlsZTsKICAgICAgICAgICAgICAgIHRoaXMudGh1bWJWaXNpYmxlU3R5bGUudGV4dENvbnRlbnQ9Jyc7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICB1bmlxdWU6ZnVuY3Rpb24oZGF0YSl7CiAgICAgICAgICAgICAgICB2YXIgaW1nU3JjOwogICAgICAgICAgICAgICAgaWYoZGF0YS50YXJnZXQpCiAgICAgICAgICAgICAgICBpbWdTcmM9ZGF0YS50YXJnZXQuc3JjOwoKICAgICAgICAgICAgICAgIHZhciBkYXRhX2ksCiAgICAgICAgICAgICAgICAgICAgZGF0YV9pX3NyYywKICAgICAgICAgICAgICAgICAgICBkYXRhU3Jjcz1bXTsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZXg7CgogICAgICAgICAgICAgICAgZm9yKHZhciBpPTAsaWk9ZGF0YS5sZW5ndGg7aTxpaTtpKyspewogICAgICAgICAgICAgICAgICAgIGRhdGFfaT1kYXRhW2ldOwogICAgICAgICAgICAgICAgICAgIGRhdGFfaV9zcmM9ZGF0YV9pLnNyYzsKICAgICAgICAgICAgICAgICAgICBpZihkYXRhU3Jjcy5pbmRleE9mKGRhdGFfaV9zcmMpIT0tMSl7Ly/lt7Lnu4/lrZjlnKgKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zcGxpY2UoaSwxKTsvL+enu+mZpAogICAgICAgICAgICAgICAgICAgICAgICBpLS07CiAgICAgICAgICAgICAgICAgICAgICAgIGlpLS07CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZGF0YVNyY3MucHVzaChkYXRhX2lfc3JjKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoaW1nU3JjPT1kYXRhX2lfc3JjKXsKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg9aTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZih0eXBlb2YgaW5kZXggPT0ndW5kZWZpbmVkJyl7CiAgICAgICAgICAgICAgICAgICAgaW5kZXg9MDsKICAgICAgICAgICAgICAgICAgICBkYXRhLnVuc2hpZnQoZGF0YS50YXJnZXQpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YS50YXJnZXQ7CgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBkYXRhOmRhdGEsCiAgICAgICAgICAgICAgICAgICAgaW5kZXg6aW5kZXgsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBrZXlEb3duTGlzdGVuZXI6ZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICBzd2l0Y2goZS5rZXlDb2RlKXsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgogICAgICAgICAgICAgICAgICAgICAgICBpZihwcmVmcy5pbWdXaW5kb3cuY2xvc2UuZXNjS2V5KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAga2V5VXBMaXN0ZW5lcjpmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIHN3aXRjaChlLmtleUNvZGUpewogICAgICAgICAgICAgICAgICAgIGNhc2UgODI6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbWc9dGhpcy5pbWc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjc3NUcmFuc2Zvcm09aW1nLnN0eWxlW3N1cHBvcnQuY3NzVHJhbnNmb3JtXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlUcmFuc2Zvcm09Y3NzVHJhbnNmb3JtLnJlcGxhY2UoL3JvdGF0ZVwoW14pXSpcKS9pLCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvdGF0ZWRSYWRpYW5zPWNzc1RyYW5zZm9ybS5pbmRleE9mKCJyb3RhdGUiKSE9LTE/Y3NzVHJhbnNmb3JtLnJlcGxhY2UoLy4qcm90YXRlXCgoWy1cZFwuXSspLiovaSwnJDEnKTowOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgUEk9TWF0aC5QSTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9yaWdpbj1wYXJzZUZsb2F0KHJvdGF0ZWRSYWRpYW5zKSArKGUuc2hpZnRLZXk/LTkwOjkwKSAqIFBJLzE4MDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYob3JpZ2luPj0yKlBJIHx8IG9yaWdpbjw9LTIqUEkgfHwoLTAuMTxvcmlnaW4gJiYgb3JpZ2luPDAuMSkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luPTA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaW1nLnN0eWxlW3N1cHBvcnQuY3NzVHJhbnNmb3JtXSA9ICcgcm90YXRlKCcrIG9yaWdpbiArJ3JhZCkgJyArIGlUcmFuc2Zvcm07CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBzaG93OmZ1bmN0aW9uKHJlbG9hZCl7CiAgICAgICAgICAgICAgICB0aGlzLnNob3duPXRydWU7CiAgICAgICAgICAgICAgICBnYWxsZXJ5TW9kZT10cnVlOwoKICAgICAgICAgICAgICAgIGlmICghcmVsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRlcz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZU92ZXJmbG93PXsKICAgICAgICAgICAgICAgICAgICAgICAgeDpkZXMub3ZlcmZsb3dYLAogICAgICAgICAgICAgICAgICAgICAgICB5OmRlcy5vdmVyZmxvd1ksCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBkZXMub3ZlcmZsb3c9J2hpZGRlbic7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5nYWxsZXJ5LnN0eWxlLmRpc3BsYXk9Jyc7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5nYWxsZXJ5LmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsdGhpcy5fcmVzaXplSGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX2tleURvd25MaXN0ZW5lcix0cnVlKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJyx0aGlzLl9rZXlVcExpc3RlbmVyLHRydWUpOwoKICAgICAgICAgICAgICAgIGlmKHByZWZzLmdhbGxlcnkubG9hZE1vcmUpewogICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlTWFwc1snaGVhZC1jb21tYW5kLW5leHRQYWdlJ10uY2xpY2soKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVNpemVJbnB1dEgoKTsKICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlU2l6ZUlucHV0VygpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjbG9zZTpmdW5jdGlvbihyZWxvYWQpewogICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fa2V5RG93bkxpc3RlbmVyLHRydWUpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLHRoaXMuX2tleVVwTGlzdGVuZXIsdHJ1ZSk7CiAgICAgICAgICAgICAgICB0aGlzLnNob3duPWZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5taW5pbWl6ZWQ9ZmFsc2U7CgogICAgICAgICAgICAgICAgaWYgKCFyZWxvYWQpIHsKICAgICAgICAgICAgICAgICAgICBnYWxsZXJ5TW9kZT1mYWxzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmdhbGxlcnkuYmx1cigpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZ2FsbGVyeS5zdHlsZS5kaXNwbGF5PSdub25lJzsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVzPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZTsKICAgICAgICAgICAgICAgICAgICBkZXMub3ZlcmZsb3dYPXRoaXMuZGVPdmVyZmxvdy54OwogICAgICAgICAgICAgICAgICAgIGRlcy5vdmVyZmxvd1k9dGhpcy5kZU92ZXJmbG93Lnk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZVNob3cuZXhpdCgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbi5leGl0KCk7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsdGhpcy5fcmVzaXplSGFuZGxlcix0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8g6YCA5Ye65YWo5bGPCiAgICAgICAgICAgICAgICAgICAgdmFyIGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwdi1nYWxsZXJ5LWZ1bGxzY3JlZW5idG4nKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYnRuLmNsYXNzTGlzdC5jb250YWlucygnZnVsbHNjcmVlbmJ0bicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbEZ1bGxTY3JlZW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gaTE4bigiZW50ZXJGdWxsc2MiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2Z1bGxzY3JlZW5idG4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGN1clBhZ2U6ZG9jdW1lbnQsCiAgICAgICAgICAgIGdldFBhZ2U6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHZhciBwYWdlTnVtPTA7CiAgICAgICAgICAgICAgICBpZigvW19cLV1cZCsoXC5odG1sKT8kLy50ZXN0KHRoaXMuaHJlZikpewogICAgICAgICAgICAgICAgICAgIHBhZ2VOdW09dGhpcy5ocmVmLnJlcGxhY2UoLy4qW1wtX10oXGQrKShcLmh0bWwpPyQvLCIkMSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGN1clBhZ2U9dGhpcy5jdXJQYWdlOwogICAgICAgICAgICAgICAgbGV0IHByZT1jdXJQYWdlLnF1ZXJ5U2VsZWN0b3IoImEucHJldiIpOwogICAgICAgICAgICAgICAgbGV0IG5leHQ9Y3VyUGFnZS5xdWVyeVNlbGVjdG9yKCJhLm5leHQiKTsKICAgICAgICAgICAgICAgIGlmKCFwcmUpcHJlPWN1clBhZ2UucXVlcnlTZWxlY3RvcigiYSNwcmV2Iik7CiAgICAgICAgICAgICAgICBpZighbmV4dCluZXh0PWN1clBhZ2UucXVlcnlTZWxlY3RvcigiYSNuZXh0Iik7CiAgICAgICAgICAgICAgICBpZighcHJlKXByZT1jdXJQYWdlLnF1ZXJ5U2VsZWN0b3IoImEjbGVmdEZpeCIpOwogICAgICAgICAgICAgICAgaWYoIW5leHQpbmV4dD1jdXJQYWdlLnF1ZXJ5U2VsZWN0b3IoImEjcmlnaHRGaXgiKTsKICAgICAgICAgICAgICAgIGlmKCFwcmUgfHwgIW5leHQpewogICAgICAgICAgICAgICAgICAgIGxldCBhVGFncz1jdXJQYWdlLnF1ZXJ5U2VsZWN0b3JBbGwoImEiKTsKICAgICAgICAgICAgICAgICAgICBpZighcHJlKXsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZWYscHJlcyxwcmV0OwogICAgICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGk9MDtpPGFUYWdzLmxlbmd0aDtpKyspewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFUYWc9YVRhZ3NbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwcmVmICYmIHByZXMgJiYgcHJldClicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcmVmKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigv5LiK5LiA6aG1Ly50ZXN0KGFUYWcuaW5uZXJIVE1MKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWY9YVRhZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcHJlcyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYVRhZy5pbm5lckhUTUw9PSImbHQ7Iil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXM9YVRhZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighcHJldCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYVRhZy5pbm5lckhUTUw9PSLCqyIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV0PWFUYWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYocGFnZU51bT09MSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFUYWcuZ2V0QXR0cmlidXRlKCJocmVmIikgJiYgYVRhZy5nZXRBdHRyaWJ1dGUoImhyZWYiKS5pbmRleE9mKHRoaXMuaHJlZi5yZXBsYWNlKC8uKlwvKFteXC9dKykkLywiJDEiKS5yZXBsYWNlKC9bXy1dXGQrLywiIikpIT0tMSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXQ9YVRhZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGFUYWcuZ2V0QXR0cmlidXRlKCJocmVmIikgJiYgYVRhZy5nZXRBdHRyaWJ1dGUoImhyZWYiKS5yZXBsYWNlKC8uKltcLV9dKFxkKykoXC5odG1sKT8kLywiJDEiKT09cGFnZU51bS0xKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldD1hVGFnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwcmU9cHJlZnx8cHJlc3x8cHJldDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYoIW5leHQpewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dGYsbmV4dHMsbmV4dHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8YVRhZ3MubGVuZ3RoO2krKyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYVRhZz1hVGFnc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5leHRmICYmIG5leHRzICYmIG5leHR0KWJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW5leHRmKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigv5LiL5LiA6aG1Ly50ZXN0KGFUYWcuaW5uZXJIVE1MKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRmPWFUYWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW5leHRzKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhVGFnLmlubmVySFRNTD09IiZndDsiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHM9YVRhZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighbmV4dHQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFUYWcuaW5uZXJIVE1MPT0iwrsiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHQ9YVRhZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihhVGFnLmhhc0F0dHJpYnV0ZSgiaHJlZiIpICYmIGFUYWcuZ2V0QXR0cmlidXRlKCJocmVmIikucmVwbGFjZSgvLipbXC1fXShcZCspKFwuaHRtbCk/JC8sIiQxIik9PXBhcnNlSW50KHBhZ2VOdW0pKzEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0dD1hVGFnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0PW5leHRmfHxuZXh0c3x8bmV4dHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYoIXByZSlwcmU9Y3VyUGFnZS5xdWVyeVNlbGVjdG9yKCIucHJldj5hIik7CiAgICAgICAgICAgICAgICBpZighbmV4dCluZXh0PWN1clBhZ2UucXVlcnlTZWxlY3RvcigiLm5leHQ+YSIpOwogICAgICAgICAgICAgICAgaWYoIXByZSAmJiAhbmV4dCl7CiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2VEaXY9Y3VyUGFnZS5xdWVyeVNlbGVjdG9yKCJkaXYud3AtcGFnZW5hdmkiKTsKICAgICAgICAgICAgICAgICAgICBpZihwYWdlRGl2KXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cj1wYWdlRGl2LnF1ZXJ5U2VsZWN0b3IoInNwYW4uY3VycmVudCIpOwogICAgICAgICAgICAgICAgICAgICAgICBwcmU9Y3VyLnByZXZpb3VzU2libGluZzsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dD1jdXIubmV4dFNpYmxpbmc7CiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXI9Y3VyUGFnZS5xdWVyeVNlbGVjdG9yKCJkaXYuYXJ0aWNsZS1wYWdpbmc+c3BhbiIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZihjdXIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlPWN1ci5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dD1jdXIubmV4dEVsZW1lbnRTaWJsaW5nOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHtwcmU6cHJlLG5leHQ6bmV4dH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNhbm9uaWNhbFVyaTpmdW5jdGlvbihzcmMsIGJhc2VfcGF0aCl7CiAgICAgICAgICAgICAgICBpZihzcmMuY2hhckF0KDApPT0iIyIpcmV0dXJuIGxvY2F0aW9uLmhyZWYrc3JjOwogICAgICAgICAgICAgICAgdmFyIHJvb3RfcGFnZSA9IC9eW14/I10qXC8vLmV4ZWMobG9jYXRpb24uaHJlZilbMF0sCiAgICAgICAgICAgICAgICAgICAgcm9vdF9kb21haW4gPSAvXlx3K1w6XC9cL1wvP1teXC9dKy8uZXhlYyhyb290X3BhZ2UpWzBdLAogICAgICAgICAgICAgICAgICAgIGFic29sdXRlX3JlZ2V4ID0gL15cdytcOlwvXC8vOwogICAgICAgICAgICAgICAgc3JjPXNyYy5yZXBsYWNlKC9cLlwvLywiIik7CiAgICAgICAgICAgICAgICBpZiAoL15cL1wvXC8/Ly50ZXN0KHNyYykpewogICAgICAgICAgICAgICAgICAgIHNyYyA9IGxvY2F0aW9uLnByb3RvY29sICsgc3JjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIWFic29sdXRlX3JlZ2V4LnRlc3Qoc3JjKSAmJiBzcmMuY2hhckF0KDApICE9ICIvIil7CiAgICAgICAgICAgICAgICAgICAgc3JjID0gKGJhc2VfcGF0aCB8fCAiIikgKyBzcmM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gKGFic29sdXRlX3JlZ2V4LnRlc3Qoc3JjKSA/IHNyYyA6ICgoc3JjLmNoYXJBdCgwKSA9PSAiLyIgPyByb290X2RvbWFpbiA6IHJvb3RfcGFnZSkgKyBzcmMpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY29tcGxldGVQYWdlczpbbG9jYXRpb24uaHJlZl0sCiAgICAgICAgICAgIGhyZWY6bG9jYXRpb24uaHJlZiwKICAgICAgICAgICAgcHJlUGFnZTpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIHBhZ2VPYmo9dGhpcy5nZXRQYWdlKCksc2VsZj10aGlzLHRleHRTcGFuPXRoaXMuZWxlTWFwc1snaGVhZC1jb21tYW5kLW5leHRQYWdlJ10ucXVlcnlTZWxlY3Rvcigic3BhbiIpOwogICAgICAgICAgICAgICAgaWYodGV4dFNwYW4uaW5uZXJIVE1MIT1pMThuKCJsb2FkaW5nIikpewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBsb2FkT3Zlcj1mdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIHRleHRTcGFuLmlubmVySFRNTD0iPGZvbnQgY29sb3I9J3JlZCc+IitpMThuKCJsb2FkZWRBbGwiKSsiPC9mb250PiI7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe3RleHRTcGFuLmlubmVySFRNTD1pMThuKCJsb2FkQWxsIik7fSwxNTAwKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZighcGFnZU9iai5wcmUpewogICAgICAgICAgICAgICAgICAgIGxvYWRPdmVyKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHByZVVybD1wYWdlT2JqLnByZTsKICAgICAgICAgICAgICAgIGlmKHByZVVybC50YWdOYW1lIT0iQSIpewogICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZEE9cHJlVXJsLnF1ZXJ5U2VsZWN0b3IoImEiKTsKICAgICAgICAgICAgICAgICAgICBpZihjaGlsZEEpewogICAgICAgICAgICAgICAgICAgICAgICBwcmVVcmw9Y2hpbGRBOwogICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShwcmVVcmw9cHJlVXJsLnBhcmVudEVsZW1lbnQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlVXJsLm5vZGVOYW1lPT0nQScpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcmVVcmwpcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBocmVmPXByZVVybC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICAgICAgICAgICAgICAgIGlmKHNlbGYuY29tcGxldGVQYWdlcy5pbmRleE9mKGhyZWYpIT0tMSl7CiAgICAgICAgICAgICAgICAgICAgbG9hZE92ZXIoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbXBsZXRlUGFnZXMucHVzaChocmVmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYuaHJlZj1zZWxmLmNhbm9uaWNhbFVyaShocmVmKTsKICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6eyJSZWZlcmVyIjogKyB3aW5kb3cubG9jYXRpb24uaHJlZn0sCiAgICAgICAgICAgICAgICAgICAgdXJsOiBzZWxmLmhyZWYsCiAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVNaW1lVHlwZToidGV4dC9odG1sO2NoYXJzZXQ9Iitkb2N1bWVudC5jaGFyc2V0LAogICAgICAgICAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbD1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJycpOwogICAgICAgICAgICAgICAgICAgICAgICBodG1sLmRvY3VtZW50RWxlbWVudC5pbm5lckhUTUwgPSBkLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJQYWdlPWh0bWw7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbWdzPWh0bWwucXVlcnlTZWxlY3RvckFsbCgnaW1nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHYtZ2FsbGVyeS1jb250YWluZXInKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHYtZ2FsbGVyeS1wcmVsb2FkZWQtaW1nLWNvbnRhaW5lcicpOwogICAgICAgICAgICAgICAgICAgICAgICBpbWdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaW1ncykuZmlsdGVyKGZ1bmN0aW9uKGltZyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShjb250YWluZXIuY29udGFpbnMoaW1nKSB8fCAocHJlbG9hZENvbnRhaW5lciYmcHJlbG9hZENvbnRhaW5lci5jb250YWlucyhpbWcpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpbWdzLmZvckVhY2goZnVuY3Rpb24oaW1nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNyYz1pbWcuZ2V0QXR0cmlidXRlKCJzcmMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc3JjKXJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzcmM9c2VsZi5jYW5vbmljYWxVcmkoaXNyYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZGF0YUNhY2hlW2lzcmNdKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmltZyA9IG5ldyBJbWFnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmltZy5zcmMgPSBpc3JjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmltZy5vbmxvYWQ9ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZmluZFBpYyh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICYmICFzZWxmLl9kYXRhQ2FjaGVbdGhpcy5zcmNdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5wdXNoKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2FwcGVuZFRodW1iU3BhbnMoW3Jlc3VsdF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRUaHVtYigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhQ2FjaGVbdGhpcy5zcmNdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZihwcmVmcy5nYWxsZXJ5LmxvYWRBbGwpc2VsZi5wcmVQYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgbG9hZE92ZXIoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG9uZXJyb3I6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbmV4dFBhZ2U6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHZhciBwYWdlT2JqPXRoaXMuZ2V0UGFnZSgpLHNlbGY9dGhpcyx0ZXh0U3Bhbj10aGlzLmVsZU1hcHNbJ2hlYWQtY29tbWFuZC1uZXh0UGFnZSddLnF1ZXJ5U2VsZWN0b3IoInNwYW4iKTsKICAgICAgICAgICAgICAgIGlmKHRleHRTcGFuLmlubmVySFRNTCE9aTE4bigibG9hZGluZyIpKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbG9hZE92ZXI9ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICBpZihwcmVmcy5nYWxsZXJ5LmxvYWRBbGwpewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1clBhZ2U9ZG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaHJlZj1sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByZVBhZ2UoKTsKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFNwYW4uaW5uZXJIVE1MPSI8Zm9udCBjb2xvcj0ncmVkJz4iK2kxOG4oImxvYWRlZEFsbCIpKyI8L2ZvbnQ+IjsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe3RleHRTcGFuLmlubmVySFRNTD1pMThuKCJsb2FkQWxsIik7fSwxNTAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYoIXBhZ2VPYmoubmV4dCl7CiAgICAgICAgICAgICAgICAgICAgbG9hZE92ZXIoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbmV4dFVybD1wYWdlT2JqLm5leHQ7CiAgICAgICAgICAgICAgICBpZihuZXh0VXJsLnRhZ05hbWUhPSJBIil7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkQT1uZXh0VXJsLnF1ZXJ5U2VsZWN0b3IoImEiKTsKICAgICAgICAgICAgICAgICAgICBpZihjaGlsZEEpewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0VXJsPWNoaWxkQTsKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUobmV4dFVybD1uZXh0VXJsLnBhcmVudEVsZW1lbnQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobmV4dFVybC5ub2RlTmFtZT09J0EnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZighbmV4dFVybClyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGhyZWY9bmV4dFVybC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICAgICAgICAgICAgICAgIGlmKHNlbGYuY29tcGxldGVQYWdlcy5pbmRleE9mKGhyZWYpIT0tMSl7CiAgICAgICAgICAgICAgICAgICAgbG9hZE92ZXIoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbXBsZXRlUGFnZXMucHVzaChocmVmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYuaHJlZj1zZWxmLmNhbm9uaWNhbFVyaShocmVmKTsKICAgICAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgICAgIHVybDogc2VsZi5ocmVmLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6eyJSZWZlcmVyIjogKyB3aW5kb3cubG9jYXRpb24uaHJlZn0sCiAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVNaW1lVHlwZToidGV4dC9odG1sO2NoYXJzZXQ9Iitkb2N1bWVudC5jaGFyc2V0LAogICAgICAgICAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbD1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJycpOwogICAgICAgICAgICAgICAgICAgICAgICBodG1sLmRvY3VtZW50RWxlbWVudC5pbm5lckhUTUwgPSBkLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJQYWdlPWh0bWw7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbWdzPWh0bWwucXVlcnlTZWxlY3RvckFsbCgnaW1nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHYtZ2FsbGVyeS1jb250YWluZXInKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucHYtZ2FsbGVyeS1wcmVsb2FkZWQtaW1nLWNvbnRhaW5lcicpOwogICAgICAgICAgICAgICAgICAgICAgICBpbWdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaW1ncykuZmlsdGVyKGZ1bmN0aW9uKGltZyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShjb250YWluZXIuY29udGFpbnMoaW1nKSB8fCAocHJlbG9hZENvbnRhaW5lciYmcHJlbG9hZENvbnRhaW5lci5jb250YWlucyhpbWcpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpbWdzLmZvckVhY2goZnVuY3Rpb24oaW1nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNyYz1pbWcuZ2V0QXR0cmlidXRlKCJzcmMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpc3JjKXJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzcmM9c2VsZi5jYW5vbmljYWxVcmkoaXNyYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fZGF0YUNhY2hlW2lzcmNdKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmltZyA9IG5ldyBJbWFnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmltZy5zcmMgPSBpc3JjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmltZy5vbmxvYWQ9ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gZmluZFBpYyh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICYmICFzZWxmLl9kYXRhQ2FjaGVbdGhpcy5zcmNdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5wdXNoKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2FwcGVuZFRodW1iU3BhbnMoW3Jlc3VsdF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRUaHVtYigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhQ2FjaGVbdGhpcy5zcmNdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZihwcmVmcy5nYWxsZXJ5LmxvYWRBbGwpc2VsZi5uZXh0UGFnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGxvYWRPdmVyKCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJ1bk9uY2U6ZnVuY3Rpb24oKXsvL+i/kOihjOS4gOasoeadpeiOt+WPluafkOS6m+aVsOaNruOAggogICAgICAgICAgICAgICAgdmFyIHRodW1iU3BhbkNTPXVuc2FmZVdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuc2VsZWN0ZWQpOwogICAgICAgICAgICAgICAgdGhpcy50aHVtYlNwYW5PdXRlclNpemU9dGhpcy5pc0hvcml6b250YWw/CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5vZmZzZXRXaWR0aCArIHBhcnNlRmxvYXQodGh1bWJTcGFuQ1MubWFyZ2luTGVmdCkgKyBwYXJzZUZsb2F0KHRodW1iU3BhbkNTLm1hcmdpblJpZ2h0KSA6CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkLm9mZnNldEhlaWdodCArIHBhcnNlRmxvYXQodGh1bWJTcGFuQ1MubWFyZ2luVG9wKSArIHBhcnNlRmxvYXQodGh1bWJTcGFuQ1MubWFyZ2luQm90dG9tKTsKCgogICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnRodW1iU3Bhbk91dGVyU2l6ZSk7CgogICAgICAgICAgICAgICAgdGhpcy5ydW5PbmNlPWZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgbWluaW1pemU6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTsKICAgICAgICAgICAgICAgIHRoaXMubWF4aW1pemVUcmlnZ2VyLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKICAgICAgICAgICAgICAgIHRoaXMubWluaW1pemVkPXRydWU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG5hdmlnYXRlVG9JbWc6ZnVuY3Rpb24odGFyZ2V0SW1nKXsKICAgICAgICAgICAgICAgIHRhcmdldEltZy5zY3JvbGxJbnRvVmlldygpOy8v5YWI6LCD55So5Y6f5pa55rOV77yM5Y+v5Lul6K6pb3ZlcmZsb3cgaGlkZGVu55qE5rua5Yqo5Ye65p2l44CCCgogICAgICAgICAgICAgICAgLy/orqnlm77niYfov5Hlj6/og73nmoTlsYXkuK0KICAgICAgICAgICAgICAgIHZhciBpbWdCQ1JlY3Q9Z2V0Q29udGVudENsaWVudFJlY3QodGFyZ2V0SW1nKTsKICAgICAgICAgICAgICAgIHZhciB3U2l6ZT1nZXRXaW5kb3dTaXplKCk7CgogICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbEJ5KGltZ0JDUmVjdC5sZWZ0IC0gKHdTaXplLncgLSBpbWdCQ1JlY3Qud2lkdGgpLzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nQkNSZWN0LnRvcCAtICh3U2l6ZS5oIC0gaW1nQkNSZWN0LmhlaWdodCkvMik7CgogICAgICAgICAgICB9LAogICAgICAgICAgICBzd2l0Y2hUaHVtYlZpc2libGU6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHZhciBzdHlsZT10aGlzLnRodW1iVmlzaWJsZVN0eWxlOwogICAgICAgICAgICAgICAgdmFyIGNvdW50PTA7CiAgICAgICAgICAgICAgICB2YXIgc3R5bGVUZXh0PVtdOwogICAgICAgICAgICAgICAgdmFyIGlTdGF0aXNDb3B5PXRoaXMuaVN0YXRpc0NvcHk7CiAgICAgICAgICAgICAgICB2YXIgaVN0YXRpc0NvcHlfaTsKCiAgICAgICAgICAgICAgICBmb3IodmFyIGkgaW4gaVN0YXRpc0NvcHkpewogICAgICAgICAgICAgICAgICAgIGlmKCFpU3RhdGlzQ29weS5oYXNPd25Qcm9wZXJ0eShpKSljb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBpU3RhdGlzQ29weV9pPWlTdGF0aXNDb3B5W2ldOwogICAgICAgICAgICAgICAgICAgIGlmKGlTdGF0aXNDb3B5X2kuc2hvd24pewogICAgICAgICAgICAgICAgICAgICAgICBjb3VudCs9aVN0YXRpc0NvcHlfaS5jb3VudDsKICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVUZXh0LnB1c2goJy5wdi1nYWxsZXJ5LXNpZGViYXItdGh1bWItY29udGFpbmVyW2RhdGEtdHlwZT0iJytpKyciXScpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8v5YaZ5YWlc3R5bGU7CiAgICAgICAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudD1zdHlsZVRleHQuam9pbignLCcpICsgJ3tcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpub25lICFpbXBvcnRhbnQ7XAogICAgICAgICAgICAgICAgICAgIH0nOwoKICAgICAgICAgICAgICAgIC8v5Yid5aeL5YyW57yp55Wl5Zu+5Yy655qE5rua5Yqo5p2hCiAgICAgICAgICAgICAgICB0aGlzLnRodW1iU2Nyb2xsYmFyLnJlc2V0KCk7CiAgICAgICAgICAgICAgICB0aGlzLmFycm93VmlzaWIoKTsKCiAgICAgICAgICAgICAgICAvL+i9veWFpee8qeeVpeWbvgogICAgICAgICAgICAgICAgdGhpcy5sb2FkVGh1bWIoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZm9yY2VSZXBhaW50OmZ1bmN0aW9uKCl7Ly/op6PlhrNvcGVyYeeahGZpeGVk5YWD57Sg77yM5b2T5rua5Yqo5p2h5LiN5YaN5pyA6auY5aSE55qE5pe25YCZ77yM5LiN6YeN57uYZml4ZWTlhYPntKDnmoTpl67popjjgIIKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZvcmNlUmVwYWludFRpbWVyKTsKICAgICAgICAgICAgICAgIHZhciBzZWxmPXRoaXM7CiAgICAgICAgICAgICAgICB0aGlzLmZvcmNlUmVwYWludFRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICBpZihlbnZpci5vcGVyYSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9yY2VSZXBhaW50VGltZXMgJSAyID09MCA/IHdpbmRvdy5zY3JvbGxCeSgwLDEpIDogd2luZG93LnNjcm9sbEJ5KDAsLTEpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcmNlUmVwYWludFRpbWVzKys7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sMzMzKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVzaXplSGFuZGxlcjpmdW5jdGlvbigpey8v56qX5Y+j5Y+Y5YyW5pe277yM6LCD5pW05LiA5Lqb5Lic6KW/44CCCiAgICAgICAgICAgICAgICB0aGlzLnRodW1iU2Nyb2xsYmFyLnJlc2V0KCk7CiAgICAgICAgICAgICAgICAvL3RoaXMuc2VsZWN0ZWRJbnRvVmlldygpOwogICAgICAgICAgICAgICAgdGhpcy5maXRUb1NjcmVlbigpOwogICAgICAgICAgICAgICAgdGhpcy5sb2FkVGh1bWIoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgX2lzTGFzdFNwYW46IGZ1bmN0aW9uKHNwYW4pIHsgIC8vIOeUqOS6juWIpOaWreaYr+WQpuiHquWKqOmHjei9ve+8jOaYr+WQpuaYr+acgOWQjuWHoOS4quWbvueJhwogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQuY2xpZW50V2lkdGggPT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKCFzcGFuKSByZXR1cm4gdHJ1ZTsKCiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmltZ1NwYW5zKS5pbmRleE9mKHNwYW4pOwogICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRvdGFsID0gdGhpcy5pbWdTcGFucy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsIC0gaW5kZXggPCBwcmVmcy5nYWxsZXJ5LnNjcm9sbEVuZEFuZExvYWRfbnVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgYXJyb3dWaXNpYjpmdW5jdGlvbigpey8v5b2T5b2T5YmN6YCJ5oup5YWD57Sg55qE5YmN6Z2i5oiW6ICF5ZCO6Z2i5rKh5pyJ5YWD57Sg55qE5pe25YCZ6ZqQ6JeP5o6n5Yi2566t5aS0CgogICAgICAgICAgICAgICAgdmFyIGljcHM9dGhpcy5lbGVNYXBzWydpbWctY29udHJvbGVyLXByZSddLnN0eWxlOwogICAgICAgICAgICAgICAgdmFyIGljbnM9dGhpcy5lbGVNYXBzWydpbWctY29udHJvbGVyLW5leHQnXS5zdHlsZTsKICAgICAgICAgICAgICAgIHZhciBzY3BzPXRoaXMuZWxlTWFwc1snc2lkZWJhci1jb250cm9sZXItcHJlJ10uc3R5bGU7CiAgICAgICAgICAgICAgICB2YXIgc2Nucz10aGlzLmVsZU1hcHNbJ3NpZGViYXItY29udHJvbGVyLW5leHQnXS5zdHlsZTsKCiAgICAgICAgICAgICAgICAvL+S4i+S4gOW8oOeahOeureWktAogICAgICAgICAgICAgICAgdmFyIG5leHRTcGFuID0gdGhpcy5nZXRUaHVtU3BhbigpOwogICAgICAgICAgICAgICAgaWYgKG5leHRTcGFuKSB7CiAgICAgICAgICAgICAgICAgICAgaWNucy5kaXNwbGF5PScnOwogICAgICAgICAgICAgICAgICAgIHNjbnMuZGlzcGxheT0nJzsKICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgIGljbnMuZGlzcGxheT0nbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgc2Nucy5kaXNwbGF5PSdub25lJzsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8g5pyA5ZCO5Yeg5byg5Zu+54mH77yM5rua5Yiw5bqV6YOo5re75Yqg5paw55qE5Zu+54mHCiAgICAgICAgICAgICAgICBpZiAocHJlZnMuZ2FsbGVyeS5zY3JvbGxFbmRBbmRMb2FkICYmIHRoaXMuX2lzTGFzdFNwYW4obmV4dFNwYW4pKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VuZEFuZFJlbG9hZCgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8v5LiK5LiA5byg55qE566t5aS0CiAgICAgICAgICAgICAgICBpZih0aGlzLmdldFRodW1TcGFuKHRydWUpKXsKICAgICAgICAgICAgICAgICAgICBpY3BzLmRpc3BsYXk9Jyc7CiAgICAgICAgICAgICAgICAgICAgc2Nwcy5kaXNwbGF5PScnOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgaWNwcy5kaXNwbGF5PSdub25lJzsKICAgICAgICAgICAgICAgICAgICBzY3BzLmRpc3BsYXk9J25vbmUnOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2ltcGxlU2xpZGVTaG93OmZ1bmN0aW9uKGJhY2t3YXJkLGludGVydmFsKXsKICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zbGlkZVNob3dJbnRlcnZhbCk7Ly/lubvnga/mkq3mlL7vvIzlj6rlhYHorrjlrZjlnKjkuIDkuKrvvIzlkKbliJnlvpfkubHlpZcKCiAgICAgICAgICAgICAgICB2YXIgc2VsZj10aGlzOwogICAgICAgICAgICAgICAgdmFyIHNsaWRlU2hvd0ludGVydmFsPXNldEludGVydmFsKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgdmFyIGJlZm9yZT1zZWxmLnNlbGVjdGVkOwogICAgICAgICAgICAgICAgICAgIGJhY2t3YXJkID8gc2VsZi5zZWxlY3RQcmV2aW91cygpIDogc2VsZi5zZWxlY3ROZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYoYmVmb3JlID09IHNlbGYuc2VsZWN0ZWQpey8v5rKh5pyJ5LiL5LiA5Liq5YWD57Sg5LqG44CC44CCCiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AoKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwoaW50ZXJ2YWw/IGludGVydmFsIDogODAwKSk7CgogICAgICAgICAgICAgICAgdGhpcy5zbGlkZVNob3dJbnRlcnZhbD1zbGlkZVNob3dJbnRlcnZhbDsKCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzdG9wKCl7CiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChzbGlkZVNob3dJbnRlcnZhbCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHJldHVybiBzdG9wOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgcmVsb2FkOiBmdW5jdGlvbigpIHsgIC8vIOmHjeaWsOWKoOi9veaJgOacieWbvueJh+WIsOW6k+mHjOmdogogICAgICAgICAgICAgICAgLy8g5Ye95pWw5ZyoIExvYWRpbmdBbmltQyDkuK0KICAgICAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5nZXRBbGxWYWxpZEltZ3MoKTsKICAgICAgICAgICAgICAgIC8vIOiuvue9ruW9k+WJjemAieS4reeahOWbvueJhwogICAgICAgICAgICAgICAgZGF0YS50YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgc3JjOiB0aGlzLnNlbGVjdGVkLmRhdGFzZXQuc3JjCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UodHJ1ZSk7CgogICAgICAgICAgICAgICAgdGhpcy5sb2FkKGRhdGEsIG51bGwsIHRydWUpOwogICAgICAgICAgICB9LAogICAgICAgICAgICByZWxvYWROZXc6IGZ1bmN0aW9uKCkgeyAgLy8g5Yqg6L295paw55qE5Zu+54mH5Yiw5bqT6YeM6Z2iCiAgICAgICAgICAgICAgICB2YXIgbmV3ZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmdldEFsbFZhbGlkSW1ncyhuZXdlcik7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcHBlbmRUaHVtYlNwYW5zKGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBnZXRBbGxWYWxpZEltZ3M6ZnVuY3Rpb24obmV3ZXIpewogICAgICAgICAgICAgICAgdmFyIHZhbGlkSW1ncyA9IFtdOwogICAgICAgICAgICAgICAgdmFyIGltZ3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyksCiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnB2LWdhbGxlcnktY29udGFpbmVyJyksCiAgICAgICAgICAgICAgICAgICAgcHJlbG9hZENvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wdi1nYWxsZXJ5LXByZWxvYWRlZC1pbWctY29udGFpbmVyJyk7CgogICAgICAgICAgICAgICAgaW1ncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGltZ3MpOwogICAgICAgICAgICAgICAgYXJyYXlGbi5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiaWZyYW1lIiksZnVuY3Rpb24oaWZyYW1lKXsKICAgICAgICAgICAgICAgICAgICBpZihpZnJhbWUuc3JjLnJlcGxhY2UoL1wvW15cL10qJC8sIiIpLmluZGV4T2YobG9jYXRpb24uaG9zdG5hbWUpIT0tMSkKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlGbi5mb3JFYWNoLmNhbGwoaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpLGZ1bmN0aW9uKGltZyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1ncy5wdXNoKGltZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyDmjpLpmaTlupPph4zpnaLnmoTlm77niYcKICAgICAgICAgICAgICAgIGltZ3MgPSBpbWdzLmZpbHRlcihmdW5jdGlvbihpbWcpewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhKGNvbnRhaW5lci5jb250YWlucyhpbWcpIHx8IChwcmVsb2FkQ29udGFpbmVyJiZwcmVsb2FkQ29udGFpbmVyLmNvbnRhaW5zKGltZykpKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIOW3sue7j+WcqOWbvuW6k+mHjOmdoueahAogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICAgICAgaW1ncy5mb3JFYWNoKGZ1bmN0aW9uKGltZykgewogICAgICAgICAgICAgICAgICAgIGlmIChuZXdlciAmJiBzZWxmLl9kYXRhQ2FjaGVbaW1nLnNyY10pIHJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZpbmRQaWMoaW1nKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkSW1ncy5wdXNoKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5wdXNoKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhQ2FjaGVbaW1nLnNyY10gPSB0cnVlOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkSW1nczsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2Nyb2xsVG9FbmRBbmRSZWxvYWQ6IGZ1bmN0aW9uKCkgeyAgLy8g5rua5Yqo5Li756qX5Y+j5Yiw5pyA5bqV6YOo77yM54S25ZCO6Ieq5Yqo6YeN6L295bqT55qE5Zu+54mHCgogICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIDk5OTk5OTkpOwoKICAgICAgICAgICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChzZWxmLnJlbG9hZFRpbWVvdXQpOwogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIC8vIHNlbGYucmVsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWROZXcoKTsKICAgICAgICAgICAgICAgIH0sIDEwMDApOwogICAgICAgICAgICB9LAogICAgICAgICAgICBleHBvcnRJbWFnZXM6IGZ1bmN0aW9uICgpIHsgIC8vIOWvvOWHuuaJgOacieWbvueJh+WIsOaWsOeql+WPowogICAgICAgICAgICAgICAgdmFyIG5vZGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnB2LWdhbGxlcnktc2lkZWJhci10aHVtYi1jb250YWluZXJbZGF0YS1zcmNdJyk7CiAgICAgICAgICAgICAgICB2YXIgYXJyID0gW10ubWFwLmNhbGwobm9kZXMsIGZ1bmN0aW9uKG5vZGUpewogICAgICAgICAgICAgICAgICAgIGlmKHVuc2FmZVdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpLmRpc3BsYXk9PSJub25lIilyZXR1cm4gIiI7CiAgICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gJzxkaXY+PGltZyBzcmM9JyArIG5vZGUuZGF0YXNldC5zcmMgKyAnPjwvZGl2PicKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IGRvY3VtZW50LnRpdGxlOwoKICAgICAgICAgICAgICAgIHZhciBodG1sID0gJ1wKICAgICAgICAgICAgICAgICA8aGVhZD5cCiAgICAgICAgICAgICAgICAgPHRpdGxlPicgKyB0aXRsZSArICcgJytpMThuKCJleHBvcnRJbWFnZXMiKSsnPC90aXRsZT5cCiAgICAgICAgICAgICAgICAgPHN0eWxlPlwKICAgICAgICAgICAgICAgICAudG9Ub3B7d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtib3JkZXItcmFkaXVzOjE0cHg7cG9zaXRpb246IGZpeGVkO3JpZ2h0OjJweDtib3R0b206IDJweDtjdXJzb3I6IHBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjojMDAwO29wYWNpdHk6LjM7cGFkZGluZzowZW0haW1wb3J0YW50O2JvcmRlcjowcHghaW1wb3J0YW50O31cCiAgICAgICAgICAgICAgICAgLnRvVG9wOmhvdmVye29wYWNpdHk6MX1cCiAgICAgICAgICAgICAgICAgLnRvVG9wPnNwYW57aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweDtkaXNwbGF5OmJsb2NrO2NvbG9yOiNGRkY7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjIwcHg7fVwKICAgICAgICAgICAgICAgICAuZ3JpZHstbW96LWNvbHVtbi1jb3VudDo0Oy13ZWJraXQtY29sdW1uLWNvdW50OjQ7Y29sdW1uLWNvdW50OjQ7LW1vei1jb2x1bW4tZ2FwOiAxZW07LXdlYmtpdC1jb2x1bW4tZ2FwOiAxZW07Y29sdW1uLWdhcDogMWVtO31cCiAgICAgICAgICAgICAgICAgLmdyaWQ+ZGl2e3BhZGRpbmc6IDFlbTttYXJnaW46IDAgMCAxZW0gMDstbW96LXBhZ2UtYnJlYWstaW5zaWRlOiBhdm9pZDstd2Via2l0LWNvbHVtbi1icmVhay1pbnNpZGU6IGF2b2lkO2JyZWFrLWluc2lkZTogYXZvaWQ7Ym9yZGVyOiAxcHggc29saWQgIzAwMDt9XAogICAgICAgICAgICAgICAgIC5ncmlkPmRpdj5pbWd7d2lkdGg6IDEwMCU7bWFyZ2luLWJvdHRvbToxMHB4O31cCiAgICAgICAgICAgICAgICAgLmxpc3Q+ZGl2IHt0ZXh0LWFsaWduOmNlbnRlcjt9XAogICAgICAgICAgICAgICAgIC5saXN0PmRpdj5pbWcgeyBtYXgtd2lkdGg6IDEwMCU7IH1cCiAgICAgICAgICAgICAgICAgLmdyaWRCaWd7bWFyZ2luOiAwcHg7fVwKICAgICAgICAgICAgICAgICAuZ3JpZEJpZz5kaXYgeyBmbG9hdDogbGVmdDttYXJnaW46IDBweCAwcHggMXB4IDFweDt9XAogICAgICAgICAgICAgICAgIC5ncmlkQmlnPmRpdj5pbWcgeyBtYXgtd2lkdGg6IDEwMCU7IH1cCiAgICAgICAgICAgICAgICAgLnNlbGVjdHtvcGFjaXR5OiAwLjMzO31cCiAgICAgICAgICAgICAgICAgPC9zdHlsZT5cCiAgICAgICAgICAgICAgICAgPC9oZWFkPlwKICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b1RvcCI+XAogICAgICAgICAgICAgICAgICAgIDxzcGFuPu+/qjwvc3Bhbj5cCiAgICAgICAgICAgICAgICAgPC9kaXY+XAogICAgICAgICAgICAgICAgIDxib2R5IGNsYXNzPSInK3ByZWZzLmdhbGxlcnkuZXhwb3J0VHlwZSsnIj5cCiAgICAgICAgICAgICAgICAgPHAgc3R5bGU9IndpZHRoOjEwMHZ3O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Ij5cCiAgICAgICAgICAgICAgICAgPGltZyBpZD0iYmlnSW1nIiBzdHlsZT0icG9pbnRlci1ldmVudHM6bm9uZTtwb3NpdGlvbjpmaXhlZDt6LWluZGV4Ojk5OTttYXgtaGVpZ2h0OjEwMHZoO3RvcDowcHg7YWxpZ24tc2VsZjpjZW50ZXI7Ij48L3A+XAogICAgICAgICAgICAgICAgIDxwPuOAkCcraTE4bigicGljVGl0bGUiKSsn44CR77yaJyArIHRpdGxlICsgJzwvcD5cCiAgICAgICAgICAgICAgICAgPHA+44CQJytpMThuKCJwaWNOdW0iKSsn44CR77yaJyArIG5vZGVzLmxlbmd0aCArICcgPHNlbGVjdCBvbmNoYW5nZT0iZG9jdW1lbnQuYm9keS5jbGFzc05hbWU9dGhpcy5vcHRpb25zW3RoaXMub3B0aW9ucy5zZWxlY3RlZEluZGV4XS52YWx1ZSI+PG9wdGlvbiB2YWx1ZT0iZ3JpZCIgJysocHJlZnMuZ2FsbGVyeS5leHBvcnRUeXBlPT0iZ3JpZCI/InNlbGVjdGVkPSdzZWxlY3RlZCciOiIiKSsnPicraTE4bigiZ3JpZCIpKyc8L29wdGlvbj48b3B0aW9uIHZhbHVlPSJncmlkQmlnIiAnKyhwcmVmcy5nYWxsZXJ5LmV4cG9ydFR5cGU9PSJncmlkQmlnIj8ic2VsZWN0ZWQ9J3NlbGVjdGVkJyI6IiIpKyc+JytpMThuKCJncmlkQmlnIikrJzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9Imxpc3QiICcrKHByZWZzLmdhbGxlcnkuZXhwb3J0VHlwZT09Imxpc3QiPyJzZWxlY3RlZD0nc2VsZWN0ZWQnIjoiIikrJz4nK2kxOG4oImxpc3QiKSsnPC9vcHRpb24+IDwvc2VsZWN0PiBcCiAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IicraTE4bigiZXhwb3J0SW1hZ2VzVXJsIikrJyIgb25jbGljaz0idmFyIGltZ1N0cj1cJ1wnLHNlbExpc3Q9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcJy5zZWxlY3Q+aW1nXCcpO2lmKHNlbExpc3QubGVuZ3RoPT0wKVtdLmZvckVhY2guY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwnaW1nXCcpLGZ1bmN0aW9uKGkpe2ltZ1N0cis9aS5zcmMrXCcgXFxuXCd9KTtlbHNle1tdLmZvckVhY2guY2FsbChzZWxMaXN0LGZ1bmN0aW9uKGkpe2ltZ1N0cis9aS5zcmMrXCcgXFxuXCd9KTt9d2luZG93LnByb21wdChcJycraTE4bigiZXhwb3J0SW1hZ2VzVXJsUG9wIikrJ1wnLGltZ1N0cik7Ij5cCiAgICAgICAgICAgICAgICAgPC9wPic7CgogICAgICAgICAgICAgICAgaHRtbCArPSBhcnIuam9pbignXG4nKSArCiAgICAgICAgICAgICAgICAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPlwKICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIudG9Ub3AiKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKCl7XAogICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc2Nyb2xsSW50b1ZpZXcoKTtcCiAgICAgICAgICAgICAgICAgfSk7XAogICAgICAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJkaXY+aW1nIiksZnVuY3Rpb24oaSl7XAogICAgICAgICAgICAgICAgIGkub25tb3VzZW92ZXI9aS5vbm1vdXNlbW92ZT1mdW5jdGlvbihlKXtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYmlnSW1nIikuc3JjPWUuY3RybEtleT90aGlzLnNyYzoiIjt9O1wKICAgICAgICAgICAgICAgICBpLm9ubW91c2VvdXQ9ZnVuY3Rpb24oZSl7ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2JpZ0ltZyIpLnNyYz0iIjt9XAogICAgICAgICAgICAgICAgIH0pO1wKICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiYm9keT5kaXYiKSxmdW5jdGlvbihpKXtcCiAgICAgICAgICAgICAgICAgaS5vbmNsaWNrPWZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3QiKX1cCiAgICAgICAgICAgICAgICAgfSk7XAogICAgICAgICAgICAgICAgIDwvc2NyaXB0PjwvYm9keT4nOwogICAgICAgICAgICAgICAgR01fb3BlbkluVGFiKCdkYXRhOnRleHQvaHRtbDtjaGFyc2V0PXV0Zi04LCcgKyBlbmNvZGVVUklDb21wb25lbnQoaHRtbCkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBjb3B5SW1hZ2VzOiBmdW5jdGlvbihpc0FsZXJ0KSB7CiAgICAgICAgICAgICAgICB2YXIgbm9kZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1iLWNvbnRhaW5lcltkYXRhLXNyY10nKTsKICAgICAgICAgICAgICAgIHZhciB1cmxzID0gW107CiAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwobm9kZXMsIGZ1bmN0aW9uKG5vZGUpewogICAgICAgICAgICAgICAgICAgIGlmKGdldENvbXB1dGVkU3R5bGUobm9kZSkuZGlzcGxheSE9Im5vbmUiKQogICAgICAgICAgICAgICAgICAgICAgICB1cmxzLnB1c2gobm9kZS5kYXRhc2V0LnNyYyk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQodXJscy5qb2luKCJcbiIpKTsKCiAgICAgICAgICAgICAgICBpZiAoaXNBbGVydCkgewogICAgICAgICAgICAgICAgICAgIGFsZXJ0KGkxOG4oImNvcHlTdWNjZXNzIix1cmxzLmxlbmd0aCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgUHJlbG9hZDpmdW5jdGlvbihlbGUsb3JpVGhpcyl7CiAgICAgICAgICAgICAgICB0aGlzLmVsZT1lbGU7CiAgICAgICAgICAgICAgICB0aGlzLm9yaVRoaXM9b3JpVGhpczsvL+S4u3RoaXMKICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBTY3JvbGxiYXI6ZnVuY3Rpb24oc2Nyb2xsYmFyLGNvbnRhaW5lcixpc0hvcml6b250YWwpewogICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxiYXI9c2Nyb2xsYmFyOwogICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXI9Y29udGFpbmVyOwogICAgICAgICAgICAgICAgdGhpcy5pc0hvcml6b250YWw9aXNIb3Jpem9udGFsCiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGFkZFN0eWxlOmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB2YXIgc3R5bGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICAgICAgICAgIHN0eWxlLnR5cGU9J3RleHQvY3NzJzsKICAgICAgICAgICAgICAgIHN0eWxlLnRleHRDb250ZW50PSdcCiAgICAgICAgICAgICAgICAgLyrmnIDlpJblsYLlrrnlmagqL1wKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1jb250YWluZXIge1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XAogICAgICAgICAgICAgICAgICAgIHRvcDogMDtcCiAgICAgICAgICAgICAgICAgICAgbGVmdDogMDtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcCiAgICAgICAgICAgICAgICAgICAgbWluLXdpZHRoOm5vbmU7XAogICAgICAgICAgICAgICAgICAgIG1pbi1oZWlnaHQ6bm9uZTtcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MjE0NzQ4MzY0NztcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLyrlhajlsYBib3JkZXItYm94Ki9cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktY29udGFpbmVyIHNwYW57XAogICAgICAgICAgICAgICAgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcCiAgICAgICAgICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcCiAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1jb250YWluZXIgKiB7XAogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAvKueCueWHu+i/mOWOn+eahOW3peWFt+adoSovXAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LW1heGltaXplLXRyaWdnZXJ7XAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmZpeGVkO1wKICAgICAgICAgICAgICAgICAgICBib3R0b206MTVweDtcCiAgICAgICAgICAgICAgICAgICAgbGVmdDoxNXB4O1wKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Om5vbmU7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IzAwMDtcCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTowLjY7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDoxMHB4O1wKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTZweDtcCiAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6MDtcCiAgICAgICAgICAgICAgICAgICAgY29sb3I6d2hpdGU7XAogICAgICAgICAgICAgICAgICAgIGN1cnNvcjpwb2ludGVyO1wKICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OjNweCAzcHggMCAwICMzMzM7XAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6ODk5OTk5OTk4O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LW1heGltaXplLXRyaWdnZXI6aG92ZXJ7XAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6MC45O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LW1heGltaXplLXRyaWdnZXItY2xvc2V7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6MTBweDtcCiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246bWlkZGxlO1wKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MzBweDtcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzoxMHB4IDA7XAogICAgICAgICAgICAgICAgICAgIHdpZHRoOjI0cHg7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6dXJsKCInK3ByZWZzLmljb25zLmxvYWRpbmdDYW5jbGUrJyIpIGNlbnRlciBuby1yZXBlYXQ7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktbWF4aW1pemUtdHJpZ2dlci1jbG9zZTpob3ZlcntcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojMzMzO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC8q6aG25qCPKi9cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaGVhZCB7XAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcCiAgICAgICAgICAgICAgICAgICAgdG9wOiAwO1wKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwO1wKICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjMwcHg7XAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTtcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjpyZ2IoMCwwLDApO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXI6bm9uZTtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbToxcHggc29saWQgIzMzMzMzMztcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpyaWdodDtcCiAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6MDtcCiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4O1wKICAgICAgICAgICAgICAgICAgICBjb2xvcjojNzU3NTc1O1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OjQycHg7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaGVhZCA+IHNwYW57XAogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOm1pZGRsZTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAvKumhtuagj+W3pui+uSovXAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWhlYWQtZmxvYXQtbGVmdHtcCiAgICAgICAgICAgICAgICAgICAgZmxvYXQ6bGVmdDtcCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246bGVmdDtcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OjVweDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWZsb2F0LWxlZnQgPiBzcGFue1wKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7XAogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOm1pZGRsZTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWZsb2F0LWxlZnQgPiBzcGFuID4gKntcCiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246bWlkZGxlO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWhlYWQtbGVmdC1pbWctaW5mb3tcCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOmhlbHA7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaGVhZC1sZWZ0LWltZy1pbmZvLWRlc2NyaXB0aW9uIHtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLyrpobbmoI/ph4zpnaLnmoTmjInpkq7moLflvI8t5byA5aeLKi9cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaGVhZC1jb21tYW5ke1wKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDoxMDAlO1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjAgOHB4O1wKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246cmVsYXRpdmU7XAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTtcCiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246bWlkZGxlO1wKICAgICAgICAgICAgICAgICAgICAtby11c2VyLXNlbGVjdDogbm9uZTtcCiAgICAgICAgICAgICAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lO1wKICAgICAgICAgICAgICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1wKICAgICAgICAgICAgICAgICAgICAtbW96LXVzZXItc2VsZWN0OiAtbW96LW5vbmU7XAogICAgICAgICAgICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC8q6L6F5Yqp54K55Ye75LqL5Lu255qE55Sf5oiQ77yMY291bnRkb3duKi9cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kX292ZXJsYXllcntcCiAgICAgICAgICAgICAgICAgICAgdG9wOjA7XAogICAgICAgICAgICAgICAgICAgIGxlZnQ6MDtcCiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6MDtcCiAgICAgICAgICAgICAgICAgICAgYm90dG9tOjA7XAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1wKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OjA7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kID4gKntcCiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246bWlkZGxlO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1jbG9zZXtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7XAogICAgICAgICAgICAgICAgICAgIHRvcDowO1wKICAgICAgICAgICAgICAgICAgICByaWdodDowO1wKICAgICAgICAgICAgICAgICAgICB3aWR0aDo0MHB4O1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICMzMzMzMzM7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6dHJhbnNwYXJlbnQgbm8tcmVwZWF0IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1pbWFnZTp1cmwoIicrcHJlZnMuaWNvbnMubG9hZGluZ0NhbmNsZSsnIik7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kLXNsaWRlLXNob3ctY291bnRkb3due1wKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MC44ZW07XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kLXNsaWRlLXNob3ctYnV0dG9ue1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOjM2cHg7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1wKICAgICAgICAgICAgICAgICAgICB3aWR0aDoxOHB4O1wKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MThweDtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOjJweCBzb2xpZCAjNzU3NTc1O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6M3B4O1wKICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDowO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1zbGlkZS1zaG93LWJ1dHRvbi1pbm5lcntcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTppbmxpbmUtYmxvY2s7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlcjpub25lO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItdG9wOjRweCBzb2xpZCB0cmFuc3BhcmVudDtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTo0cHggc29saWQgdHJhbnNwYXJlbnQ7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1sZWZ0OjhweCBzb2xpZCAjNzU3NTc1O1wKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kLXNsaWRlLXNob3ctYnV0dG9uLWlubmVyX3N0b3B7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjojNzU3NTc1O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1jb2xsZWN0LWljb257XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1wKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MjBweDtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6MjBweDtcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDp0cmFuc3BhcmVudCB1cmwoIicgKyBwcmVmcy5pY29ucy5maXZlUG9pbnRlZFN0YXIgKyAnIikgMCAwIG5vLXJlcGVhdDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtY29sbGVjdC1pY29uIH4gLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWNvbGxlY3QtdGV4dDo6YWZ0ZXJ7XAogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IicraTE4bigiY29sbGVjdCIpKyciO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1jb2xsZWN0LWZhdm9yaXRlID4gLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWNvbGxlY3QtaWNvbntcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjotNDBweCAwICFpbXBvcnRhbnQ7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWNvbGxlY3QtZmF2b3JpdGUgPiAucHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtY29sbGVjdC10ZXh0OjphZnRlcntcCiAgICAgICAgICAgICAgICAgICAgY29udGVudDoiJytpMThuKCJjb2xsZWN0ZWQiKSsnIjtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtZXhpdC1jb2xsZWN0aW9ue1wKICAgICAgICAgICAgICAgICAgICBjb2xvcjojOTM5MzAwICFpbXBvcnRhbnQ7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6bm9uZTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQ6aG92ZXJ7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IzI3MjcyNztcCiAgICAgICAgICAgICAgICAgICAgY29sb3I6I2NjYztcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAvKmRyb3BsaXN0Ki9cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdHtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7XAogICAgICAgICAgICAgICAgICAgIHJpZ2h0OjA7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6bm9uZTtcCiAgICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdzowIDAgM3B4ICM4MDgwODA7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IzI3MjcyNztcCiAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNjtcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpsZWZ0O1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjEwcHg7XAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiNjY2M7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6LTFweDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtZHJvcC1saXN0LWl0ZW17XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6YmxvY2s7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MnB4IDVweDtcCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7XAogICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtZHJvcC1saXN0LWl0ZW0tY29sbGVjdC1kZXNjcmlwdGlvbntcCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOmRlZmF1bHQ7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1pdGVtLWNvbGxlY3QtZGVzY3JpcHRpb24gPiB0ZXh0YXJlYXtcCiAgICAgICAgICAgICAgICAgICAgcmVzaXplOmJvdGg7XAogICAgICAgICAgICAgICAgICAgIHdpZHRoOmF1dG87XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDphdXRvO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbV9kaXNhYmxlZHtcCiAgICAgICAgICAgICAgICAgICAgY29sb3I6Izc1NzU3NTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtZHJvcC1saXN0LWl0ZW0gaW5wdXQgKyAqe1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6M3B4O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbSBpbnB1dFt0eXBlPW51bWJlcl17XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246bGVmdDtcCiAgICAgICAgICAgICAgICAgICAgbWF4LXdpZHRoOjUwcHg7XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDoyMHB4O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1kcm9wLWxpc3QtaXRlbSA+ICoge1wKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdC1pdGVtIGxhYmVsIHtcCiAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtZHJvcC1saXN0LWl0ZW06aG92ZXJ7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IzQwNDA0MDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAvKmNvbnRhaW5lciovXAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1jb250YWluZXJ7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1wKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MTAwJTtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246cmVsYXRpdmU7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLyogYWZ0ZXLkvKrnsbvnlJ/miJDmoIfor4bkuIvmi4noj5zljZXnmoTkuInop5Llm77moIcqL1wKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtY29udGFpbmVyID4gLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kOjphZnRlcntcCiAgICAgICAgICAgICAgICAgICAgY29udGVudDoiIjtcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTppbmxpbmUtYmxvY2s7XAogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOm1pZGRsZTtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOm5vbmU7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6N3B4IHNvbGlkICM3NTc1NzU7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1sZWZ0OjVweCBzb2xpZCB0cmFuc3BhcmVudDtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OjVweCBzb2xpZCB0cmFuc3BhcmVudDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6NXB4O1wKICAgICAgICAgICAgICAgICAgICAtbW96LXRyYW5zaXRpb246YWxsIDAuM3MgZWFzZS1pbi1vdXQgMHM7XAogICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjphbGwgMC4zcyBlYXNlLWluLW91dCAwcztcCiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjphbGwgMC4zcyBlYXNlLWluLW91dCAwcztcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtY29udGFpbmVyOmhvdmVye1wKICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OjAgMCAzcHggIzgwODA4MDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtY29udGFpbmVyOmhvdmVyID4gLnB2LWdhbGxlcnktaGVhZC1jb21tYW5ke1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiMyNzI3Mjc7XAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiNjY2M7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWNvbnRhaW5lcjpob3ZlciA+IC5wdi1nYWxsZXJ5LWhlYWQtY29tbWFuZDo6YWZ0ZXJ7XAogICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpO1wKICAgICAgICAgICAgICAgICAgICAtbW96LXRyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKTtcCiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItdG9wOjdweCBzb2xpZCAjY2NjO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1jb250YWluZXI6aG92ZXIgLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWNvbGxlY3QtaWNvbntcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjotMjBweCAwO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1jb250YWluZXI6aG92ZXIgLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kLXNsaWRlLXNob3ctYnV0dG9ue1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6I2NjYztcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtY29udGFpbmVyOmhvdmVyIC5wdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1zbGlkZS1zaG93LWJ1dHRvbi1pbm5lcntcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6I2NjYztcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtY29udGFpbmVyOmhvdmVyIC5wdi1nYWxsZXJ5LWhlYWQtY29tbWFuZC1zbGlkZS1zaG93LWJ1dHRvbi1pbm5lcl9zdG9we1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6I2NjYztcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1oZWFkLWNvbW1hbmQtY29udGFpbmVyOmhvdmVyID4gLnB2LWdhbGxlcnktaGVhZC1jb21tYW5kLWRyb3AtbGlzdHtcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpibG9jaztcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAvKumhtuagj+mHjOmdoueahOaMiemSruagt+W8jy3nu5PmnZ8qL1wKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1ib2R5IHtcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMDtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItdG9wOiAzMHB4IHNvbGlkIHRyYW5zcGFyZW50O1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1pbWctY29udGFpbmVyIHtcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1wKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XAogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94O1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIwLDIwLDIwLDAuOTYpO1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1pbWctY29udGFpbmVyLXRvcCB7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6ICcrIHByZWZzLmdhbGxlcnkuc2lkZWJhclNpemUgKydweCBzb2xpZCB0cmFuc3BhcmVudDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1pbWctY29udGFpbmVyLXJpZ2h0IHtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAnKyBwcmVmcy5nYWxsZXJ5LnNpZGViYXJTaXplICsncHggc29saWQgdHJhbnNwYXJlbnQ7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaW1nLWNvbnRhaW5lci1ib3R0b20ge1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItYm90dG9tOiAnKyBwcmVmcy5nYWxsZXJ5LnNpZGViYXJTaXplICsncHggc29saWQgdHJhbnNwYXJlbnQ7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaW1nLWNvbnRhaW5lci1sZWZ0IHtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWxlZnQ6ICcrIHByZWZzLmdhbGxlcnkuc2lkZWJhclNpemUgKydweCBzb2xpZCB0cmFuc3BhcmVudDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAvKuWkp+WbvuWMuuWfn+eahOWIh+aNouaOp+WItuaMiemSriovXAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWltZy1jb250cm9sZXJ7XAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1wKICAgICAgICAgICAgICAgICAgICB0b3A6NTAlO1wKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6NjBweDtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6NTBweDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDotMzBweDtcCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7XAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6MC4zO1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4OjE7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaW1nLWNvbnRyb2xlci1wcmV7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6cmdiYSg3MCw3MCw3MCwwLjUpIHVybCgiJytwcmVmcy5pY29ucy5hcnJvd0xlZnQrJyIpIG5vLXJlcGVhdCBjZW50ZXI7XAogICAgICAgICAgICAgICAgICAgIGxlZnQ6MTBweDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1pbWctY29udHJvbGVyLW5leHR7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6cmdiYSg3MCw3MCw3MCwwLjUpIHVybCgiJytwcmVmcy5pY29ucy5hcnJvd1JpZ2h0KyciKSBuby1yZXBlYXQgY2VudGVyO1wKICAgICAgICAgICAgICAgICAgICByaWdodDoxMHB4O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWltZy1jb250cm9sZXI6aG92ZXJ7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6cmdiYSgxNDAsMTQwLDE0MCwwLjUpO1wKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OjAuOTtcCiAgICAgICAgICAgICAgICAgICAgei1pbmRleDoyO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h5qC35byPLS3lvIDlp4sqL1wKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zY3JvbGxiYXItaCxcCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2Nyb2xsYmFyLXZ7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6bm9uZTtcCiAgICAgICAgICAgICAgICAgICAgei1pbmRleDoxO1wKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OjAuMztcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjowO1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjA7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlcjpub25lO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNjcm9sbGJhci1oe1wKICAgICAgICAgICAgICAgICAgICBib3R0b206MTBweDtcCiAgICAgICAgICAgICAgICAgICAgbGVmdDowO1wKICAgICAgICAgICAgICAgICAgICByaWdodDowO1wKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MTBweDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjAgMnB4O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNjcm9sbGJhci12e1wKICAgICAgICAgICAgICAgICAgICB0b3A6MDtcCiAgICAgICAgICAgICAgICAgICAgYm90dG9tOjA7XAogICAgICAgICAgICAgICAgICAgIHJpZ2h0OjEwcHg7XAogICAgICAgICAgICAgICAgICAgIHdpZHRoOjEwcHg7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjoycHggMDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zY3JvbGxiYXItaDpob3ZlcntcCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjE1cHg7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2Nyb2xsYmFyLXY6aG92ZXJ7XAogICAgICAgICAgICAgICAgICAgIHdpZHRoOjE1cHg7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2Nyb2xsYmFyLWg6aG92ZXIsXAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNjcm9sbGJhci12OmhvdmVye1wKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OjAuOTtcCiAgICAgICAgICAgICAgICAgICAgei1pbmRleDoyO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNjcm9sbGJhci1oLXRyYWNrLFwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zY3JvbGxiYXItdi10cmFja3tcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7XAogICAgICAgICAgICAgICAgICAgIHRvcDowO1wKICAgICAgICAgICAgICAgICAgICBsZWZ0OjA7XAogICAgICAgICAgICAgICAgICAgIHJpZ2h0OjA7XAogICAgICAgICAgICAgICAgICAgIGJvdHRvbTowO1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTAwLDEwMCwxMDAsMSk7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlcjoycHggc29saWQgdHJhbnNwYXJlbnQ7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2Nyb2xsYmFyLWgtaGFuZGxlLFwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zY3JvbGxiYXItdi1oYW5kbGV7XAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNjcm9sbGJhci1oLWhhbmRsZXtcCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2Nyb2xsYmFyLXYtaGFuZGxle1wKICAgICAgICAgICAgICAgICAgICB3aWR0aDoxMDAlO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNjcm9sbGJhci1oLWhhbmRsZTpob3ZlcixcCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2Nyb2xsYmFyLXYtaGFuZGxlOmhvdmVye1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiM1MDIxMjE7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2Nyb2xsYmFyLWgtaGFuZGxlOmFjdGl2ZSxcCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2Nyb2xsYmFyLXYtaGFuZGxlOmFjdGl2ZXtcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojMzkxQTFBO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC8q5rua5Yqo5p2h5qC35byPLS3nu5PmnZ8qL1wKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1pbWctY29udGVudHtcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpibG9jaztcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6MTAwJTtcCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7XAogICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OmhpZGRlbjtcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MDtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOm5vbmU7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjowO1wKICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDowO1wKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MDtcCiAgICAgICAgICAgICAgICAgICAgd2hpdGUtc3BhY2U6bm93cmFwO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LWltZy1wYXJlbnR7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1wKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XAogICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OjA7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaW1nX2Jyb2tlbntcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpub25lO1wKICAgICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1pbWd7XAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlO1wvKui+heWKqWUubGF5ZXJYLGxheWVyWSovXAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1wKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XAogICAgICAgICAgICAgICAgICAgIHdpZHRoOmF1dG87XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDphdXRvO1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjA7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlcjo1cHggc29saWQgIzMxMzEzMTtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjEwcHg7XAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6MC42O1wKICAgICAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgwLjkpO1wKICAgICAgICAgICAgICAgICAgICAtbW96LXRyYW5zZm9ybTpzY2FsZSgwLjkpO1wKICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06c2NhbGUoMC45KTtcCiAgICAgICAgICAgICAgICAgICAgJysKICAgICAgICAgICAgICAgICAgICAgICAgKHByZWZzLmdhbGxlcnkudHJhbnNpdGlvbiA/ICgnXAogICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cyBlYXNlLWluLW91dCxcCiAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0gMC4xcyBlYXNlLWluLW91dDtcCiAgICAgICAgICAgICAgICAgICAgLW1vei10cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2UtaW4tb3V0LFwKICAgICAgICAgICAgICAgICAgICAtbW96LXRyYW5zZm9ybSAwLjFzIGVhc2UtaW4tb3V0O1wKICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2UtaW4tb3V0LFwKICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gMC4xcyBlYXNlLWluLW91dDtcCiAgICAgICAgICAgICAgICAgICAgJykgOiAnJykgKyAnXAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktaW1nX3pvb20tb3V0e1wKICAgICAgICAgICAgICAgICAgICBjdXJzb3I6JytzdXBwb3J0LmNzc0N1cnNvclZhbHVlLnpvb21PdXQrJztcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1pbWdfem9vbS1pbntcCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOicrc3VwcG9ydC5jc3NDdXJzb3JWYWx1ZS56b29tSW4rJztcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLXRvZ2dsZXtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7XAogICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OjA7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyO1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOnJnYigwLDAsMCk7XAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiM3NTc1NzU7XAogICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDtcCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7XAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6MTtcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpub25lO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItdG9nZ2xlOmhvdmVye1wKICAgICAgICAgICAgICAgICAgICBjb2xvcjojY2NjO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItdG9nZ2xlLWh7XAogICAgICAgICAgICAgICAgICAgIHdpZHRoOjgwcHg7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0Oi00MHB4O1wKICAgICAgICAgICAgICAgICAgICBsZWZ0OjUwJTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLXRvZ2dsZS12e1wKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ODBweDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDotNDBweDtcCiAgICAgICAgICAgICAgICAgICAgdG9wOjUwJTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLXRvZ2dsZS10b3B7XAogICAgICAgICAgICAgICAgICAgIHRvcDotNXB4O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItdG9nZ2xlLXJpZ2h0e1wKICAgICAgICAgICAgICAgICAgICByaWdodDotNXB4O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItdG9nZ2xlLWJvdHRvbXtcCiAgICAgICAgICAgICAgICAgICAgYm90dG9tOi01cHg7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2lkZWJhci10b2dnbGUtbGVmdHtcCiAgICAgICAgICAgICAgICAgICAgbGVmdDotNXB4O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItdG9nZ2xlLWNvbnRlbnR7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1wKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XAogICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOm5vcm1hbDtcCiAgICAgICAgICAgICAgICAgICAgd29yZC13cmFwOmJyZWFrLXdvcmQ7XAogICAgICAgICAgICAgICAgICAgIG92ZXJmbG93LXdyYXA6YnJlYWstd29yZDtcCiAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6MS4xO1wKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6MTJweDtcCiAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjpjZW50ZXI7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjoycHg7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2lkZWJhci10b2dnbGUtY29udGVudC12e1wKICAgICAgICAgICAgICAgICAgICB3aWR0aDoxLjFlbTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAvKuS+p+i+ueagj+W8gOWniyovXAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItY29udGFpbmVyIHtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOnJnYigwLDAsMCk7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6NXB4O1wKICAgICAgICAgICAgICAgICAgICBib3JkZXI6bm9uZTtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOm5vbmU7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyO1wKICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDowO1wKICAgICAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTpub3dyYXA7XAogICAgICAgICAgICAgICAgICAgIC1vLXVzZXItc2VsZWN0OiBub25lO1wKICAgICAgICAgICAgICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1wKICAgICAgICAgICAgICAgICAgICAtbW96LXVzZXItc2VsZWN0OiAtbW96LW5vbmU7XAogICAgICAgICAgICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItY29udGFpbmVyLWgge1wKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcrIHByZWZzLmdhbGxlcnkuc2lkZWJhclNpemUgKydweDtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2lkZWJhci1jb250YWluZXItdiB7XAogICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnKyBwcmVmcy5nYWxsZXJ5LnNpZGViYXJTaXplICsncHg7XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLWNvbnRhaW5lci10b3Age1wKICAgICAgICAgICAgICAgICAgICB0b3A6IDA7XAogICAgICAgICAgICAgICAgICAgIGxlZnQ6IDA7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICMzMzMzMzM7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2lkZWJhci1jb250YWluZXItcmlnaHQge1wKICAgICAgICAgICAgICAgICAgICB0b3A6IDA7XAogICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAwO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItbGVmdDoxcHggc29saWQgIzMzMzMzMztcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLWNvbnRhaW5lci1ib3R0b20ge1wKICAgICAgICAgICAgICAgICAgICBib3R0b206IDA7XAogICAgICAgICAgICAgICAgICAgIGxlZnQ6IDA7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6MXB4IHNvbGlkICMzMzMzMzM7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2lkZWJhci1jb250YWluZXItbGVmdCB7XAogICAgICAgICAgICAgICAgICAgIHRvcDogMDtcCiAgICAgICAgICAgICAgICAgICAgbGVmdDogMDtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjMzMzMzMzO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItY29udGVudCB7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwO1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XAogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOm1pZGRsZTtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246cmVsYXRpdmU7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246bGVmdDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLWNvbnRlbnQtaCB7XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDkwJTtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDQwcHggc29saWQgdHJhbnNwYXJlbnQ7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1yaWdodDogNDBweCBzb2xpZCB0cmFuc3BhcmVudDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLWNvbnRlbnQtdiB7XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogOTAlO1wKICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXRvcDogNDBweCBzb2xpZCB0cmFuc3BhcmVudDtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogNDBweCBzb2xpZCB0cmFuc3BhcmVudDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLWNvbnRyb2xlcntcCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7XAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC4xKSBuby1yZXBlYXQgY2VudGVyO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItY29udHJvbGVyOmhvdmVye1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMC4zKTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLWNvbnRyb2xlci1wcmUtaCxcCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2lkZWJhci1jb250cm9sZXItbmV4dC1oe1wKICAgICAgICAgICAgICAgICAgICB0b3A6MDtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6MzZweDtcCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2lkZWJhci1jb250cm9sZXItcHJlLXYsXAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItY29udHJvbGVyLW5leHQtdntcCiAgICAgICAgICAgICAgICAgICAgbGVmdDowO1wKICAgICAgICAgICAgICAgICAgICB3aWR0aDoxMDAlO1wKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MzZweDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLWNvbnRyb2xlci1wcmUtaCB7XAogICAgICAgICAgICAgICAgICAgIGxlZnQ6IC00MHB4O1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIicrcHJlZnMuaWNvbnMuYXJyb3dMZWZ0KyciKTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLWNvbnRyb2xlci1uZXh0LWgge1wKICAgICAgICAgICAgICAgICAgICByaWdodDogLTQwcHg7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiJytwcmVmcy5pY29ucy5hcnJvd1JpZ2h0KyciKTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLWNvbnRyb2xlci1wcmUtdiB7XAogICAgICAgICAgICAgICAgICAgIHRvcDogLTQwcHg7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiJytwcmVmcy5pY29ucy5hcnJvd1RvcCsnIik7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2lkZWJhci1jb250cm9sZXItbmV4dC12IHtcCiAgICAgICAgICAgICAgICAgICAgYm90dG9tOiAtNDBweDtcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCInK3ByZWZzLmljb25zLmFycm93Qm90dG9tKyciKTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyIHtcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XAogICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjowO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXI6bm9uZTtcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzowO1wKICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDowO1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyIHNwYW57XAogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOm1pZGRsZTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyLWh7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1sZWZ0OjFweCBzb2xpZCAjNDY0NjQ2O1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItcmlnaHQ6MXB4IHNvbGlkICM0NjQ2NDY7XAogICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyLXZ7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3A6MXB4IHNvbGlkICM0NjQ2NDY7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206MXB4IHNvbGlkICM0NjQ2NDY7XAogICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOm5vcm1hbDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyLXRvcCB7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOjVweDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyLXJpZ2h0IHtcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1sZWZ0OjVweDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyLWJvdHRvbSB7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmctdG9wOjVweDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1ibmFpbHMtY29udGFpbmVyLWxlZnQge1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OjVweDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1iLWNvbnRhaW5lciB7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrO1wKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlcjoycHggc29saWQgcmdiKDUyLDUyLDUyKTtcCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOnBvaW50ZXI7XAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlO1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjJweDtcCiAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjA7XAogICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OjA7XAogICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDtcCiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcCiAgICAgICAgICAgICAgICAgICAgdG9wOjA7XAogICAgICAgICAgICAgICAgICAgIGxlZnQ6MDtcCiAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOmFsbCAwLjJzIGVhc2UtaW4tb3V0O1wKICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOmFsbCAwLjJzIGVhc2UtaW4tb3V0O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItdGh1bWJuYWlscy1jb250YWluZXItaCAgLnB2LWdhbGxlcnktc2lkZWJhci10aHVtYi1jb250YWluZXIge1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW46MCAycHg7XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDoxMDAlO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItdGh1bWJuYWlscy1jb250YWluZXItdiAgLnB2LWdhbGxlcnktc2lkZWJhci10aHVtYi1jb250YWluZXIge1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW46MnB4IDA7XAogICAgICAgICAgICAgICAgICAgIHdpZHRoOjEwMCU7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2lkZWJhci10aHVtYm5haWxzX2hpZGUtc3BhbiA+IC5wdi1nYWxsZXJ5LXNpZGViYXItdGh1bWItY29udGFpbmVyIHtcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpub25lO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItdGh1bWItY29udGFpbmVyOmhvdmVyIHtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOjJweCBzb2xpZCByZ2IoNTcsMTQ5LDIxMSk7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2lkZWJhci10aHVtYl9zZWxlY3RlZCB7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlcjoycHggc29saWQgcmdiKDIyOSw1OSw2Mik7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2lkZWJhci10aHVtYl9zZWxlY3RlZC10b3Age1wKICAgICAgICAgICAgICAgICAgICB0b3A6NXB4O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItdGh1bWJfc2VsZWN0ZWQtcmlnaHQge1wKICAgICAgICAgICAgICAgICAgICBsZWZ0Oi01cHg7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2lkZWJhci10aHVtYl9zZWxlY3RlZC1ib3R0b20ge1wKICAgICAgICAgICAgICAgICAgICB0b3A6LTVweDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1iX3NlbGVjdGVkLWxlZnQge1wKICAgICAgICAgICAgICAgICAgICBsZWZ0OjVweDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtZ2FsbGVyeS1zaWRlYmFyLXRodW1iLWxvYWRpbmd7XAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1wKICAgICAgICAgICAgICAgICAgICB0b3A6MDtcCiAgICAgICAgICAgICAgICAgICAgbGVmdDowO1wKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6MTAwJTtcCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMCU7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6bm9uZTtcCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTowLjY7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6YmxhY2sgdXJsKCInKyBwcmVmcy5pY29ucy5sb2FkaW5nICsgJyIpIG5vLXJlcGVhdCBjZW50ZXIgO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1nYWxsZXJ5LXNpZGViYXItdGh1bWItbG9hZGluZzpob3ZlcntcCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTowLjg7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktc2lkZWJhci10aHVtYiB7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcCiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcCiAgICAgICAgICAgICAgICAgICAgbWF4LXdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XAogICAgICAgICAgICAgICAgICAgIG1heC1oZWlnaHQ6IDEwMCUgIWltcG9ydGFudDtcCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XAogICAgICAgICAgICAgICAgICAgIHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LWdhbGxlcnktdmVydGljYWwtYWxpZ24taGVscGVye1wKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcCiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246bWlkZGxlO1wKICAgICAgICAgICAgICAgICAgICB3aWR0aDowO1wKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MTAwJTtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjA7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlcjowO1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjA7XAogICAgICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6aGlkZGVuO1wKICAgICAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTpub3dyYXA7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6cmVkO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgICc7CiAgICAgICAgICAgICAgICB2YXIgaGVhZD1kb2N1bWVudC5oZWFkOwogICAgICAgICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7CiAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbFNTaGVldD1zdHlsZS5zaGVldDsKCiAgICAgICAgICAgICAgICB2YXIgc3R5bGUyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICAgICAgICAgICAgICB0aGlzLnRodW1iVmlzaWJsZVN0eWxlPXN0eWxlMjsKICAgICAgICAgICAgICAgIHN0eWxlMi50eXBlPSd0ZXh0L2Nzcyc7CiAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZENoaWxkKHN0eWxlMik7CgogICAgICAgICAgICAgICAgLy8g6K6pIGRlc2NyaXB0aW9uIOeahOaWh+Wtl+WGheWuuea6ouWHuueUqOeCueeCueeCuSguLi4p55yB55Wl5Y+36KGo56S6CiAgICAgICAgICAgICAgICAvLyAucHYtZ2FsbGVyeS1oZWFkLWxlZnQtaW1nLWluZm8tZGVzY3JpcHRpb24gewogICAgICAgICAgICAgICAgLy8gICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgICAgICAgLy8gICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgICAgICAgICAgLy8gICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgICAgICAgICAvLyAgICAgd2lkdGg6IDI3ZW07CiAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgIH0sCgogICAgICAgIH07CgoKICAgICAgICBHYWxsZXJ5Qy5wcm90b3R5cGUuUHJlbG9hZC5wcm90b3R5cGU9ey8v6aKE6K+75a+56LGhCiAgICAgICAgICAgIGluaXQ6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGlmKCF0aGlzLmNvbnRhaW5lcil7Ly/pooTor7vnmoTlm77niYfpg73ku43ph4zpnaIKICAgICAgICAgICAgICAgICAgICB2YXIgZGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgIGRpdi5jbGFzc05hbWU9J3B2LWdhbGxlcnktcHJlbG9hZGVkLWltZy1jb250YWluZXInOwogICAgICAgICAgICAgICAgICAgIGRpdi5zdHlsZS5kaXNwbGF5PSdub25lJzsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7CiAgICAgICAgICAgICAgICAgICAgR2FsbGVyeUMucHJvdG90eXBlLlByZWxvYWQucHJvdG90eXBlLmNvbnRhaW5lcj1kaXY7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpcy5tYXg9cHJlZnMuZ2FsbGVyeS5tYXg7CiAgICAgICAgICAgICAgICB0aGlzLm5leHROdW1iZXI9MDsKICAgICAgICAgICAgICAgIHRoaXMubmV4dEVsZT10aGlzLmVsZTsKICAgICAgICAgICAgICAgIHRoaXMucHJlTnVtYmVyPTA7CiAgICAgICAgICAgICAgICB0aGlzLnByZUVsZT10aGlzLmVsZTsKICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aW9uPSdwcmUnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBwcmVsb2FkOmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB2YXIgZWxlPXRoaXMuZ2V0UHJlbG9hZEVsZSgpOwogICAgICAgICAgICAgICAgaWYoIWVsZSl7CiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygn6aKE6K+75q2j5bi457uT5p2fJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCfmraPlnKjpooTor7vvvJonLGVsZSk7CiAgICAgICAgICAgICAgICB2YXIgc2VsZj10aGlzOwogICAgICAgICAgICAgICAgdGhpcy5pbWdSZWFkeT1pbWdSZWFkeShkYXRhc2V0KGVsZSwnc3JjJyksewogICAgICAgICAgICAgICAgICAgIGxvYWRFbmQ6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2VsZi5hYm9ydGVkKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ+W8uuWItue7iOatouS6hicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0KGVsZSwncHJlbG9hZGVkJywndHJ1ZScpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHRpbWU6NjAgKiAxMDAwLC8v6ZmQ5pe25LiA5YiG6ZKf77yM5ZCm5YiZ5by65Yi257uT5p2f5bm25byA5aeL6aKE6K+75LiL5LiA5byg44CCCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZ2V0UHJlbG9hZEVsZTpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgaWYoKHRoaXMubWF4PD10aGlzLm5leHROdW1iZXIgJiYgdGhpcy5tYXg8PXRoaXMucHJlTnVtYmVyKSB8fCAoIXRoaXMubmV4dEVsZSAmJiAhdGhpcy5wcmVFbGUpKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIGVsZT10aGlzLmRpcmVjdGlvbj09J3ByZSc/ICB0aGlzLmdldE5leHQoKSA6IHRoaXMuZ2V0UHJldmlvdXMoKTsKICAgICAgICAgICAgICAgIGlmKGVsZSAmJiAhZGF0YXNldChlbGUsJ3ByZWxvYWRlZCcpKXsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJlbG9hZEVsZSgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZ2V0TmV4dDpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdGhpcy5uZXh0TnVtYmVyKys7CiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGlvbj0nbmV4dCc7CiAgICAgICAgICAgICAgICBpZighdGhpcy5uZXh0RWxlKXJldHVybjsKICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5uZXh0RWxlID0gdGhpcy5vcmlUaGlzLmdldFRodW1TcGFuKGZhbHNlLHRoaXMubmV4dEVsZSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBnZXRQcmV2aW91czpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdGhpcy5wcmVOdW1iZXIrKzsKICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aW9uPSdwcmUnOwogICAgICAgICAgICAgICAgaWYoIXRoaXMucHJlRWxlKXJldHVybjsKICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5wcmVFbGUgPSB0aGlzLm9yaVRoaXMuZ2V0VGh1bVNwYW4odHJ1ZSx0aGlzLnByZUVsZSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBhYm9ydDpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdGhpcy5hYm9ydGVkPXRydWU7CiAgICAgICAgICAgICAgICBpZih0aGlzLmltZ1JlYWR5KXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmltZ1JlYWR5LmFib3J0KCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgIH07CgoKICAgICAgICBHYWxsZXJ5Qy5wcm90b3R5cGUuU2Nyb2xsYmFyLnByb3RvdHlwZT17Ly/mu5rliqjmnaHlr7nosaEKICAgICAgICAgICAgaW5pdDpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIGJhcj10aGlzLnNjcm9sbGJhci5iYXI7CiAgICAgICAgICAgICAgICB0aGlzLnNob3duPWJhci5vZmZzZXRXaWR0aCE9MDsKICAgICAgICAgICAgICAgIHZhciBzZWxmPXRoaXM7CiAgICAgICAgICAgICAgICBiYXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyxmdW5jdGlvbihlKXsvL+eCueWHu+a7muWKqOadoeWMuuWfn++8jOivpeW5sueCueS7gOS5iO+8gQogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0PWUudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGU9c2VsZi5zY3JvbGxiYXIuaGFuZGxlOwogICAgICAgICAgICAgICAgICAgIHZhciB0cmFjaz1zZWxmLnNjcm9sbGJhci50cmFjazsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2godGFyZ2V0KXsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoYW5kbGU6ey8v5omL5p+E77yb5Yqf6IO977yM5ouW5Yqo5omL5p+E5p2l5rua5Yqo56qX5Y+jCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvPXNlbGYuaXNIb3Jpem9udGFsID8gWydsZWZ0JywnY2xpZW50WCddIDogWyd0b3AnLCdjbGllbnRZJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb0hPZmZzZXQ9cGFyc2VGbG9hdChoYW5kbGUuc3R5bGVbcHJvWzBdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb0NsaWVudD1lW3Byb1sxXV07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vdmVIYW5kbGVyPWZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2Nyb2xsKG9IT2Zmc2V0ICsgZVtwcm9bMV1dIC0gb0NsaWVudCx0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXBIYW5kbGVyPWZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxtb3ZlSGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJyx1cEhhbmRsZXIsdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxtb3ZlSGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLHVwSGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRyYWNrOnsvL+i9qOmBk++8m+WKn+iDve+8jOaMieS9j+S4jeaUvuadpei/nue7rea7muWKqOS4gOS4qumhtemdoueahOi3neemuwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBybz1zZWxmLmlzSG9yaXpvbnRhbCA/IFsnbGVmdCcsJ29mZnNldFgnLCdsYXllclgnLCdjbGllbnRXaWR0aCcsJ29mZnNldFdpZHRoJ10gOiBbJ3RvcCcgLCAnb2Zmc2V0WScgLCdsYXllclknLCdjbGllbnRIZWlnaHQnLCdvZmZzZXRIZWlnaHQnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGlja09mZnNldD10eXBlb2YgZVtwcm9bMV1dPT0ndW5kZWZpbmVkJyA/ICBlW3Byb1syXV0gOiBlW3Byb1sxXV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlT2Zmc2V0PXBhcnNlRmxvYXQoaGFuZGxlLnN0eWxlW3Byb1swXV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZVNpemU9aGFuZGxlW3Byb1s0XV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5kZXI9IGNsaWNrT2Zmc2V0ID4gaGFuZGxlT2Zmc2V0IDsvL+eCueWHu+WcqOa7muWKqOaJi+afhOeahOS4i+aWuQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lclNpemU9c2VsZi5jb250YWluZXJbcHJvWzNdXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsPWZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zY3JvbGxCeSh1bmRlcj8gIChjb250YWluZXJTaXplIC0gMTApIDogKC1jb250YWluZXJTaXplICsgMTApKTsvL+a7muWKqOS4gOS4qumhtemdoui3neemu+WwkeS4gOeCuQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGVja1N0b3A9ZnVuY3Rpb24oKXsvL+W9k+aJi+afhOWIsOi+vueCueWHu+S9jee9ruaXtuWBnOatogogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVPZmZzZXQ9cGFyc2VGbG9hdChoYW5kbGUuc3R5bGVbcHJvWzBdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2xpY2tPZmZzZXQgPj0gaGFuZGxlT2Zmc2V0ICYmIGNsaWNrT2Zmc2V0IDw9IChoYW5kbGVPZmZzZXQgKyBoYW5kbGVTaXplKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChzY3JvbGxUaW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChzY3JvbGxJbnRlcnZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxJbnRlcnZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxJbnRlcnZhbD1zZXRJbnRlcnZhbChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMjApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwzMDApOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1N0b3AoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXBIYW5kbGVyPWZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNjcm9sbFRpbWVvdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoc2Nyb2xsSW50ZXJ2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLHVwSGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJyx1cEhhbmRsZXIsdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIH0sdHJ1ZSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlc2V0OmZ1bmN0aW9uKCl7Ly/liKTmlq3mu5rliqjmnaHor6XmmL7npLrov5jmmK/pmpDol48KCiAgICAgICAgICAgICAgICB2YXIgcHJvPXRoaXMuaXNIb3Jpem9udGFsID8gWydzY3JvbGxXaWR0aCcsJ2NsaWVudFdpZHRoJywnd2lkdGgnXSA6IFsnc2Nyb2xsSGVpZ2h0JywnY2xpZW50SGVpZ2h0JywnaGVpZ2h0J107CgogICAgICAgICAgICAgICAgLy/lpoLmnpzlhoXlrrnlpKfkuo7lrrnlmajnmoRjb250ZW505Yy65Z+fCgogICAgICAgICAgICAgICAgdmFyIHNjcm9sbFNpemU9dGhpcy5jb250YWluZXJbcHJvWzBdXTsKICAgICAgICAgICAgICAgIHZhciBjbGllbnRTaXplPXRoaXMuY29udGFpbmVyW3Byb1sxXV07CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsTWF4PXNjcm9sbFNpemUgLSBjbGllbnRTaXplOwogICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxNYXg9c2Nyb2xsTWF4OwogICAgICAgICAgICAgICAgaWYoc2Nyb2xsTWF4PjApewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdygpOwogICAgICAgICAgICAgICAgICAgIHZhciB0cmFja1NpemU9dGhpcy5zY3JvbGxiYXIudHJhY2tbcHJvWzFdXTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYWNrU2l6ZT10cmFja1NpemU7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZVNpemU9TWF0aC5mbG9vcigoY2xpZW50U2l6ZS9zY3JvbGxTaXplKSAqIHRyYWNrU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2l6ZT1NYXRoLm1heCgyMCxoYW5kbGVTaXplKTsvL+mZkOWItuaJi+afhOeahOacgOWwj+Wkp+WwjzsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNpemU9aGFuZGxlU2l6ZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9uZT0odHJhY2tTaXplLWhhbmRsZVNpemUpIC8gc2Nyb2xsTWF4Oy8v5LiA5Liq5YOP57Sg5a+55bqU55qE5rua5Yqo5p2h6ZW/5bqmCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxiYXIuaGFuZGxlLnN0eWxlW3Byb1syXV09IGhhbmRsZVNpemUgKyAncHgnOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsKHRoaXMuZ2V0U2Nyb2xsZWQoKSk7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGUoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNob3c6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGlmKHRoaXMuc2hvd24pcmV0dXJuOwogICAgICAgICAgICAgICAgdGhpcy5zaG93bj10cnVlOwogICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxiYXIuYmFyLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaGlkZTpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgaWYoIXRoaXMuc2hvd24pcmV0dXJuOwogICAgICAgICAgICAgICAgdGhpcy5zaG93bj1mYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsYmFyLmJhci5zdHlsZS5kaXNwbGF5PSdub25lJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2Nyb2xsQnk6ZnVuY3Rpb24oZGlzdGFuY2UsaGFuZGxlRGlzdGFuY2UpewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsKHRoaXMuZ2V0U2Nyb2xsZWQoKSArIChoYW5kbGVEaXN0YW5jZT8gIGRpc3RhbmNlIC8gdGhpcy5vbmUgOiAgZGlzdGFuY2UpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2Nyb2xsQnlQYWdlczpmdW5jdGlvbihudW0pewogICAgICAgICAgICAgICAgdGhpcy5zY3JvbGwodGhpcy5nZXRTY3JvbGxlZCgpICsgKHRoaXMuY29udGFpbmVyWyh0aGlzLmlzSG9yaXpvbnRhbCA/ICdjbGllbnRXaWR0aCcgOiAnY2xpZW50SGVpZ2h0JyldIC0gMTApICogbnVtKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2Nyb2xsOmZ1bmN0aW9uKGRpc3RhbmNlLGhhbmRsZURpc3RhbmNlLHRyYW5zaXRpb24pewogICAgICAgICAgICAgICAgaWYoIXRoaXMuc2hvd24pcmV0dXJuOwoKICAgICAgICAgICAgICAgIC8v5rua5Yqo5a6e6ZmF5rua5Yqo5p2hCiAgICAgICAgICAgICAgICB2YXIgX2Rpc3RhbmNlPWRpc3RhbmNlOwogICAgICAgICAgICAgICAgX2Rpc3RhbmNlPWhhbmRsZURpc3RhbmNlPyAgZGlzdGFuY2UgLyB0aGlzLm9uZSA6ICBkaXN0YW5jZTsKICAgICAgICAgICAgICAgIF9kaXN0YW5jZT1NYXRoLm1heCgwLF9kaXN0YW5jZSk7CiAgICAgICAgICAgICAgICBfZGlzdGFuY2U9TWF0aC5taW4oX2Rpc3RhbmNlLHRoaXMuc2Nyb2xsTWF4KTsKCgogICAgICAgICAgICAgICAgdmFyIHBybz10aGlzLmlzSG9yaXpvbnRhbD8gWydsZWZ0Jywnc2Nyb2xsTGVmdCddIDogWyd0b3AnLCdzY3JvbGxUb3AnXTsKCgogICAgICAgICAgICAgICAgLy/mu5rliqjomZrmi5/mu5rliqjmnaEKICAgICAgICAgICAgICAgIC8v5qC55o2u5q+U5L6L6L2s5o2i5Li65rua5Yqo5p2h5LiK5bqU6K+l5rua5Yqo55qE6Led56a744CCCiAgICAgICAgICAgICAgICBkaXN0YW5jZT1oYW5kbGVEaXN0YW5jZT8gZGlzdGFuY2UgOiB0aGlzLm9uZSAqIGRpc3RhbmNlOwogICAgICAgICAgICAgICAgLy/lpITnkIbpnZ7ms5XlgLwKICAgICAgICAgICAgICAgIGRpc3RhbmNlPU1hdGgubWF4KDAsZGlzdGFuY2UpOy8v5aaC5p6c5YC85bCP5LqOMOmCo+S5iOWPljAKICAgICAgICAgICAgICAgIGRpc3RhbmNlPU1hdGgubWluKGRpc3RhbmNlLHRoaXMudHJhY2tTaXplIC0gdGhpcy5oYW5kbGVTaXplKTsvL+Wkp+S6juaegemZkOWAvO+8jOWPluaegemZkOWAvAoKICAgICAgICAgICAgICAgIHZhciBzaHM9dGhpcy5zY3JvbGxiYXIuaGFuZGxlLnN0eWxlOwogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lcj10aGlzLmNvbnRhaW5lcjsKICAgICAgICAgICAgICAgIGlmKHRyYW5zaXRpb24pewogICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50cmFuc2l0aW9uSW50ZXJ2YWwpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnQ9MDsKICAgICAgICAgICAgICAgICAgICB2YXIgZHVyYXRpb249MTA7CgogICAgICAgICAgICAgICAgICAgIHZhciBjU3RhcnQ9dGhpcy5nZXRTY3JvbGxlZCgpOwogICAgICAgICAgICAgICAgICAgIHZhciBjQ2hhbmdlPV9kaXN0YW5jZS1jU3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNTdGFydD1wYXJzZUZsb2F0KHNoc1twcm9bMF1dKTsKICAgICAgICAgICAgICAgICAgICB2YXIgc0NoYW5nZT1kaXN0YW5jZS1zU3RhcnQ7CgogICAgICAgICAgICAgICAgICAgIHZhciB0cmFuc2l0aW9uSW50ZXJ2YWw9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNFbmQ9VHdlZW4uQ3ViaWMuZWFzZUluT3V0KHN0YXJ0LGNTdGFydCxjQ2hhbmdlLGR1cmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNFbmQ9VHdlZW4uQ3ViaWMuZWFzZUluT3V0KHN0YXJ0LHNTdGFydCxzQ2hhbmdlLGR1cmF0aW9uKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcltwcm9bMV1dPWNFbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHNoc1twcm9bMF1dPXNFbmQgKyAncHgnOwoKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RhcnQ+PWR1cmF0aW9uKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodHJhbnNpdGlvbkludGVydmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LDM1KTsKCiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uSW50ZXJ2YWw9dHJhbnNpdGlvbkludGVydmFsOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBub1Njcm9sbD1zaHNbcHJvWzBdXT09ZGlzdGFuY2UgKyAncHgnOwogICAgICAgICAgICAgICAgc2hzW3Byb1swXV09ZGlzdGFuY2UgKyAncHgnOwogICAgICAgICAgICAgICAgY29udGFpbmVyW3Byb1sxXV09X2Rpc3RhbmNlOwogICAgICAgICAgICAgICAgcmV0dXJuIG5vU2Nyb2xsOwogICAgICAgICAgICB9LAogICAgICAgICAgICBnZXRTY3JvbGxlZDpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgcmV0dXJuICB0aGlzLmNvbnRhaW5lclsodGhpcy5pc0hvcml6b250YWwgPyAnc2Nyb2xsTGVmdCcgOiAnc2Nyb2xsVG9wJyldOwogICAgICAgICAgICB9LAogICAgICAgIH07CgoKICAgICAgICAvL+aUvuWkp+mVnAogICAgICAgIGZ1bmN0aW9uIE1hZ25pZmllckMoaW1nLGRhdGEpewogICAgICAgICAgICB0aGlzLmltZz1pbWc7CiAgICAgICAgICAgIHRoaXMuZGF0YT1kYXRhOwogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICB9OwoKICAgICAgICBNYWduaWZpZXJDLmFsbD1bXTsKICAgICAgICBNYWduaWZpZXJDLnN0eWxlWkluZGV4PTkwMDAwMDAwMDsvL+WFqOWxgHotaW5kZXg7CiAgICAgICAgTWFnbmlmaWVyQy56b29tUmFuZ2U9cHJlZnMubWFnbmlmaWVyLndoZWVsWm9vbS5yYW5nZS5zbGljZSgwKS5zb3J0KCk7Ly/ljYfluo8KICAgICAgICBNYWduaWZpZXJDLnpvb21SYW5nZVI9TWFnbmlmaWVyQy56b29tUmFuZ2Uuc2xpY2UoMCkucmV2ZXJzZSgpOy8v6ZmN5bqPCgogICAgICAgIE1hZ25pZmllckMucHJvdG90eXBlPXsKICAgICAgICAgICAgaW5pdDpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdGhpcy5hZGRTdHlsZSgpOwogICAgICAgICAgICAgICAgTWFnbmlmaWVyQy5hbGwucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHZhciBjb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwoKICAgICAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWU9J3B2LW1hZ25pZmllci1jb250YWluZXInOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpOwoKICAgICAgICAgICAgICAgIHRoaXMubWFnbmlmaWVyPWNvbnRhaW5lcjsKCiAgICAgICAgICAgICAgICB2YXIgaW1nTmF0dXJhbFNpemU9ewogICAgICAgICAgICAgICAgICAgIGg6dGhpcy5pbWcubmF0dXJhbEhlaWdodCwKICAgICAgICAgICAgICAgICAgICB3OnRoaXMuaW1nLm5hdHVyYWxXaWR0aCwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdGhpcy5pbWdOYXR1cmFsU2l6ZT1pbWdOYXR1cmFsU2l6ZTsKCiAgICAgICAgICAgICAgICB2YXIgY3M9Y29udGFpbmVyLnN0eWxlOwogICAgICAgICAgICAgICAgY3MuekluZGV4PU1hZ25pZmllckMuc3R5bGVaSW5kZXgrKzsKCgoKICAgICAgICAgICAgICAgIHZhciBtYXhEaWE9TWF0aC5jZWlsKE1hdGguc3FydChNYXRoLnBvdygxLzIqaW1nTmF0dXJhbFNpemUudywyKSArIE1hdGgucG93KDEvMippbWdOYXR1cmFsU2l6ZS5oLDIpKSAqIDIpOwogICAgICAgICAgICAgICAgdGhpcy5tYXhEaWE9bWF4RGlhOwoKICAgICAgICAgICAgICAgIHZhciByYWRpdXM9cHJlZnMubWFnbmlmaWVyLnJhZGl1czsKICAgICAgICAgICAgICAgIHJhZGl1cz1NYXRoLm1pbihtYXhEaWEvMixyYWRpdXMpOwogICAgICAgICAgICAgICAgdGhpcy5yYWRpdXM9cmFkaXVzOwogICAgICAgICAgICAgICAgdmFyIGRpYW1ldGVyPXJhZGl1cyAqIDI7CiAgICAgICAgICAgICAgICB0aGlzLmRpYW1ldGVyPWRpYW1ldGVyOwoKICAgICAgICAgICAgICAgIGNzLndpZHRoPWRpYW1ldGVyICsgJ3B4JzsKICAgICAgICAgICAgICAgIGNzLmhlaWdodD1kaWFtZXRlciArICdweCc7CiAgICAgICAgICAgICAgICBjcy5ib3JkZXJSYWRpdXM9cmFkaXVzKzEgKyAncHgnOwogICAgICAgICAgICAgICAgY3MuYmFja2dyb3VuZEltYWdlPSd1cmwoIicrIHRoaXMuaW1nLnNyYyArJyIpJzsKICAgICAgICAgICAgICAgIGNzLm1hcmdpbkxlZnQ9IC1yYWRpdXMgKydweCc7CiAgICAgICAgICAgICAgICBjcy5tYXJnaW5Ub3A9IC1yYWRpdXMgKydweCc7CgogICAgICAgICAgICAgICAgdmFyIGltZ1Bvcz1nZXRDb250ZW50Q2xpZW50UmVjdCh0aGlzLmRhdGEuaW1nKTsKICAgICAgICAgICAgICAgIHZhciB3U2Nyb2xsZWQ9Z2V0U2Nyb2xsZWQoKTsKICAgICAgICAgICAgICAgIHZhciBpbWdSYW5nZT17Ly/lm77niYfmiYDlnKjojIPlm7QKICAgICAgICAgICAgICAgICAgICB4OltpbWdQb3MubGVmdCArIHdTY3JvbGxlZC54ICwgaW1nUG9zLnJpZ2h0ICsgd1Njcm9sbGVkLnhdLAogICAgICAgICAgICAgICAgICAgIHk6W2ltZ1Bvcy50b3AgKyB3U2Nyb2xsZWQueSwgaW1nUG9zLmJvdHRvbSArIHdTY3JvbGxlZC55XSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgaW1nVz1pbWdSYW5nZS54WzFdIC0gaW1nUmFuZ2UueFswXTsKICAgICAgICAgICAgICAgIHZhciBpbWdIPWltZ1JhbmdlLnlbMV0gLSBpbWdSYW5nZS55WzBdOwogICAgICAgICAgICAgICAgLy/lpoLmnpzlm77niYflpKrlsI/nmoTor53vvIzov5vooYzojIPlm7TmianlpKfjgIIKICAgICAgICAgICAgICAgIHZhciBtaW5TaXplPTYwOwogICAgICAgICAgICAgICAgaWYoaW1nVyA8IG1pblNpemUpewogICAgICAgICAgICAgICAgICAgIGltZ1JhbmdlLnhbMV0gKz0obWluU2l6ZSAtIGltZ1cpLzI7CiAgICAgICAgICAgICAgICAgICAgaW1nUmFuZ2UueFswXSAtPShtaW5TaXplIC0gaW1nVykvMjsKICAgICAgICAgICAgICAgICAgICBpbWdXPW1pblNpemU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYoaW1nSCA8IG1pblNpemUpewogICAgICAgICAgICAgICAgICAgIGltZ1JhbmdlLnlbMV0gKz0obWluU2l6ZSAtIGltZ0gpLzI7CiAgICAgICAgICAgICAgICAgICAgaW1nUmFuZ2UueVswXSAtPShtaW5TaXplIC0gaW1nSCkvMjsKICAgICAgICAgICAgICAgICAgICBpbWdIPW1pblNpemU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpcy5pbWdTaXplPXsKICAgICAgICAgICAgICAgICAgICB3OmltZ1csCiAgICAgICAgICAgICAgICAgICAgaDppbWdILAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHRoaXMuaW1nUmFuZ2U9aW1nUmFuZ2U7CiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuaW1nUmFuZ2UsdGhpcy5pbWdTaXplKTsKCiAgICAgICAgICAgICAgICB0aGlzLnNldE1vdXNlUmFuZ2UoKTsKCgogICAgICAgICAgICAgICAgdGhpcy5tb3ZlKHsKICAgICAgICAgICAgICAgICAgICBwYWdlWDppbWdSYW5nZS54WzBdLAogICAgICAgICAgICAgICAgICAgIHBhZ2VZOmltZ1JhbmdlLnlbMF0sCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1cz10aGlzLmZvY3VzLmJpbmQodGhpcyk7CiAgICAgICAgICAgICAgICB0aGlzLl9ibHVyPXRoaXMuYmx1ci5iaW5kKHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy5fbW92ZT10aGlzLm1vdmUuYmluZCh0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZT10aGlzLnJlbW92ZS5iaW5kKHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy5fcGF1c2U9dGhpcy5wYXVzZS5iaW5kKHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy5fem9vbT10aGlzLnpvb20uYmluZCh0aGlzKTsKCiAgICAgICAgICAgICAgICBpZihwcmVmcy5tYWduaWZpZXIud2hlZWxab29tLmVuYWJsZWQpewogICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbUxldmVsPTE7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0RGlhPWRpYW1ldGVyOwogICAgICAgICAgICAgICAgICAgIGFkZFdoZWVsRXZlbnQoY29udGFpbmVyLHRoaXMuX3pvb20sZmFsc2UpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJyx0aGlzLl9mb2N1cyxmYWxzZSk7CiAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLHRoaXMuX2JsdXIsZmFsc2UpOwogICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJyx0aGlzLl9yZW1vdmUsZmFsc2UpOwogICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLl9wYXVzZSxmYWxzZSk7CgoKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsdGhpcy5fbW92ZSx0cnVlKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYWRkU3R5bGU6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGlmKE1hZ25pZmllckMuc3R5bGUpcmV0dXJuOwogICAgICAgICAgICAgICAgdmFyIHN0eWxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICAgICAgICAgICAgICBzdHlsZS50eXBlPSd0ZXh0L2Nzcyc7CiAgICAgICAgICAgICAgICBNYWduaWZpZXJDLnN0eWxlPXN0eWxlOwogICAgICAgICAgICAgICAgc3R5bGUudGV4dENvbnRlbnQ9J1wKICAgICAgICAgICAgICAgICAgICAucHYtbWFnbmlmaWVyLWNvbnRhaW5lcntcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjA7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtb3JpZ2luOmJvcmRlci1ib3g7XAogICAgICAgICAgICAgICAgICAgIC1tb3otYm94LXNpemluZzpib3JkZXItYm94O1wKICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOmJvcmRlci1ib3g7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlcjozcHggc29saWQgI0NDQ0NDQztcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDpyZ2JhKDQwLCA0MCwgNDAsIDAuOSkgbm8tcmVwZWF0O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1tYWduaWZpZXItY29udGFpbmVyX2ZvY3Vze1wKICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwcHggMHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuNyk7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LW1hZ25pZmllci1jb250YWluZXJfcGF1c2V7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjpyZWQ7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgJzsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmb2N1czpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdGhpcy5tYWduaWZpZXIuY2xhc3NMaXN0LmFkZCgncHYtbWFnbmlmaWVyLWNvbnRhaW5lcl9mb2N1cycpOwogICAgICAgICAgICAgICAgdGhpcy5tYWduaWZpZXIuc3R5bGUuekluZGV4PU1hZ25pZmllckMuc3R5bGVaSW5kZXgrKzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYmx1cjpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdGhpcy5tYWduaWZpZXIuY2xhc3NMaXN0LnJlbW92ZSgncHYtbWFnbmlmaWVyLWNvbnRhaW5lcl9mb2N1cycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBtb3ZlOmZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgdmFyIG1vdXNlQ29vcj17CiAgICAgICAgICAgICAgICAgICAgeDplLnBhZ2VYLAogICAgICAgICAgICAgICAgICAgIHk6ZS5wYWdlWSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgbW91c2VSYW5nZT10aGlzLm1vdXNlUmFuZ2U7CiAgICAgICAgICAgICAgICB2YXIgaW1nUmFuZ2U9dGhpcy5pbWdSYW5nZTsKCiAgICAgICAgICAgICAgICBpZiggIShtb3VzZUNvb3IueCA+PSBtb3VzZVJhbmdlLnhbMF0gJiYgbW91c2VDb29yLnggPD0gbW91c2VSYW5nZS54WzFdICYmIG1vdXNlQ29vci55ID49IG1vdXNlUmFuZ2UueVswXSAmJiBtb3VzZUNvb3IueSA8PSBtb3VzZVJhbmdlLnlbMV0pKXJldHVybjsvL+WmguaenOS4jeWGjem8oOagh+iMg+WbtAogICAgICAgICAgICAgICAgaWYobW91c2VDb29yLnggPiBpbWdSYW5nZS54WzFdKXsKICAgICAgICAgICAgICAgICAgICBtb3VzZUNvb3IueCA9IGltZ1JhbmdlLnhbMV07CiAgICAgICAgICAgICAgICB9ZWxzZSBpZihtb3VzZUNvb3IueCA8IGltZ1JhbmdlLnhbMF0pewogICAgICAgICAgICAgICAgICAgIG1vdXNlQ29vci54ID0gaW1nUmFuZ2UueFswXTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZihtb3VzZUNvb3IueSA+IGltZ1JhbmdlLnlbMV0pewogICAgICAgICAgICAgICAgICAgIG1vdXNlQ29vci55ID0gaW1nUmFuZ2UueVsxXTsKICAgICAgICAgICAgICAgIH1lbHNlIGlmKG1vdXNlQ29vci55IDwgaW1nUmFuZ2UueVswXSl7CiAgICAgICAgICAgICAgICAgICAgbW91c2VDb29yLnkgPSBpbWdSYW5nZS55WzBdOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB2YXIgbXM9dGhpcy5tYWduaWZpZXIuc3R5bGU7CiAgICAgICAgICAgICAgICBtcy50b3A9IG1vdXNlQ29vci55ICsgJ3B4JzsKICAgICAgICAgICAgICAgIG1zLmxlZnQ9IG1vdXNlQ29vci54ICsgJ3B4JzsKCiAgICAgICAgICAgICAgICB2YXIgcmFkaXVzPXRoaXMucmFkaXVzOwogICAgICAgICAgICAgICAgdmFyIGltZ1NpemU9dGhpcy5pbWdTaXplOwogICAgICAgICAgICAgICAgdmFyIGltZ05hdHVyYWxTaXplPXRoaXMuaW1nTmF0dXJhbFNpemU7CiAgICAgICAgICAgICAgICB2YXIgcHg9LSgobW91c2VDb29yLngtaW1nUmFuZ2UueFswXSkvaW1nU2l6ZS53ICogaW1nTmF0dXJhbFNpemUudykgKyByYWRpdXMgKydweCc7CiAgICAgICAgICAgICAgICB2YXIgcHk9LSgobW91c2VDb29yLnktaW1nUmFuZ2UueVswXSkvaW1nU2l6ZS5oICogaW1nTmF0dXJhbFNpemUuaCkgKyByYWRpdXMgKydweCc7CiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHB4LHB5KTsKICAgICAgICAgICAgICAgIG1zLmJhY2tncm91bmRQb3NpdGlvbj1weCArICcgJyArIHB5OwogICAgICAgICAgICB9LAogICAgICAgICAgICBnZXROZXh0Wm9vbUxldmVsOmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICB2YXIgbGV2ZWw7CiAgICAgICAgICAgICAgICB2YXIgc2VsZj10aGlzOwogICAgICAgICAgICAgICAgaWYodGhpcy56b29tT3V0KXsvL+e8qeWwjwogICAgICAgICAgICAgICAgICAgIE1hZ25pZmllckMuem9vbVJhbmdlUi5fZmluZChmdW5jdGlvbih2YWx1ZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlIDwgc2VsZi56b29tTGV2ZWwpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9dmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBNYWduaWZpZXJDLnpvb21SYW5nZS5fZmluZChmdW5jdGlvbih2YWx1ZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlID4gc2VsZi56b29tTGV2ZWwpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9dmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgem9vbTpmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIGlmKGUuZGVsdGFZPT09MClyZXR1cm47Ly/pnZ5Z6L2055qE5rua5YqoCiAgICAgICAgICAgICAgICBpZihwcmVmcy5tYWduaWZpZXIud2hlZWxab29tLnBhdXNlRmlyc3QgJiYgIXRoaXMucGF1c2VkKXJldHVybjsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGlmKGUuZGVsdGFZIDwgMCl7Ly/lkJHkuIrmu5rvvIzmlL7lpKfvvJsKICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmRpYW1ldGVyID49IHRoaXMubWF4RGlhKXJldHVybjsKICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb21PdXQ9ZmFsc2U7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb21PdXQ9dHJ1ZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgbGV2ZWw9dGhpcy5nZXROZXh0Wm9vbUxldmVsKCk7CiAgICAgICAgICAgICAgICBpZighbGV2ZWwpcmV0dXJuOwoKICAgICAgICAgICAgICAgIHRoaXMuem9vbUxldmVsPWxldmVsOwogICAgICAgICAgICAgICAgdmFyIGRpYW1ldGVyPXRoaXMuZGVmYXVsdERpYSAqIGxldmVsOwogICAgICAgICAgICAgICAgaWYoZGlhbWV0ZXIgPiB0aGlzLm1heERpYSl7CiAgICAgICAgICAgICAgICAgICAgZGlhbWV0ZXIgPSB0aGlzLm1heERpYTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdmFyIHJhZGl1cz1kaWFtZXRlci8yCiAgICAgICAgICAgICAgICB0aGlzLmRpYW1ldGVyPWRpYW1ldGVyOwogICAgICAgICAgICAgICAgdmFyIGJSYWRpdXM9dGhpcy5yYWRpdXM7CiAgICAgICAgICAgICAgICB0aGlzLnJhZGl1cz1yYWRpdXM7CiAgICAgICAgICAgICAgICB0aGlzLnNldE1vdXNlUmFuZ2UoKTsKICAgICAgICAgICAgICAgIHZhciBtcz10aGlzLm1hZ25pZmllci5zdHlsZTsKICAgICAgICAgICAgICAgIG1zLndpZHRoPWRpYW1ldGVyKydweCc7CiAgICAgICAgICAgICAgICBtcy5oZWlnaHQ9ZGlhbWV0ZXIrJ3B4JzsKICAgICAgICAgICAgICAgIG1zLmJvcmRlclJhZGl1cz1yYWRpdXMrMSArICdweCc7CiAgICAgICAgICAgICAgICBtcy5tYXJnaW5MZWZ0PS1yYWRpdXMrJ3B4JzsKICAgICAgICAgICAgICAgIG1zLm1hcmdpblRvcD0tcmFkaXVzKydweCc7CiAgICAgICAgICAgICAgICB2YXIgYkJQPW1zLmJhY2tncm91bmRQb3NpdGlvbi5zcGxpdCgnICcpOwogICAgICAgICAgICAgICAgbXMuYmFja2dyb3VuZFBvc2l0aW9uPXBhcnNlRmxvYXQoYkJQWzBdKSArIChyYWRpdXMgLSBiUmFkaXVzKSArICdweCcgKyAnICcgKyAocGFyc2VGbG9hdChiQlBbMV0pICsgKCByYWRpdXMgLSBiUmFkaXVzKSArICdweCcpOwoKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcGF1c2U6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGlmKHRoaXMucGF1c2VkKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLm1hZ25pZmllci5jbGFzc0xpc3QucmVtb3ZlKCdwdi1tYWduaWZpZXItY29udGFpbmVyX3BhdXNlJyk7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyx0aGlzLl9tb3ZlLHRydWUpOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWduaWZpZXIuY2xhc3NMaXN0LmFkZCgncHYtbWFnbmlmaWVyLWNvbnRhaW5lcl9wYXVzZScpOwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsdGhpcy5fbW92ZSx0cnVlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB0aGlzLnBhdXNlZD0hdGhpcy5wYXVzZWQ7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldE1vdXNlUmFuZ2U6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHZhciBpbWdSYW5nZT10aGlzLmltZ1JhbmdlOwogICAgICAgICAgICAgICAgdmFyIHJhZGl1cz10aGlzLnJhZGl1czsKICAgICAgICAgICAgICAgIHRoaXMubW91c2VSYW5nZT17Ly/pvKDmoIfmtLvliqjojIPlm7QKICAgICAgICAgICAgICAgICAgICB4OltpbWdSYW5nZS54WzBdLXJhZGl1cyAsIGltZ1JhbmdlLnhbMV0gKyByYWRpdXNdLAogICAgICAgICAgICAgICAgICAgIHk6W2ltZ1JhbmdlLnlbMF0tcmFkaXVzICwgaW1nUmFuZ2UueVsxXSArIHJhZGl1c10sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICByZW1vdmU6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHRoaXMubWFnbmlmaWVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5tYWduaWZpZXIpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyx0aGlzLl9tb3ZlLHRydWUpOwogICAgICAgICAgICAgICAgTWFnbmlmaWVyQy5hbGwuc3BsaWNlKE1hZ25pZmllckMuYWxsLmluZGV4T2YodGhpcyksMSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKCiAgICAgICAgLy/lm77niYfnqpflj6MKICAgICAgICBmdW5jdGlvbiBJbWdXaW5kb3dDKGltZywgZGF0YSl7CiAgICAgICAgICAgIHRoaXMuaW1nPWltZzsKICAgICAgICAgICAgdGhpcy5zcmM9aW1nLnNyYzsKICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKCiAgICAgICAgICAgIHRoaXMuaW5pdCgpOwogICAgICAgIH07CgogICAgICAgIEltZ1dpbmRvd0MuYWxsPVtdOy8v5omA5pyJ55qE56qX5Y+j5a+56LGhCiAgICAgICAgSW1nV2luZG93Qy5zdHlsZVpJbmRleD0yMTQ3NDgzNjQ3Oy8v5YWo5bGAei1pbmRleDsKICAgICAgICBJbWdXaW5kb3dDLnpvb21SYW5nZT1wcmVmcy5pbWdXaW5kb3cuem9vbS5yYW5nZS5zbGljZSgwKS5zb3J0KCk7Ly/ljYfluo8KICAgICAgICBJbWdXaW5kb3dDLnpvb21SYW5nZVI9SW1nV2luZG93Qy56b29tUmFuZ2Uuc2xpY2UoMCkucmV2ZXJzZSgpOy8v6ZmN5bqPCiAgICAgICAgSW1nV2luZG93Qy5vdmVybGF5ZXI9bnVsbDsKCgogICAgICAgIEltZ1dpbmRvd0MucHJvdG90eXBlPXsKICAgICAgICAgICAgaW5pdDpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIHNlbGY9dGhpczsKICAgICAgICAgICAgICAgIC8v5Zu+54mH5piv5ZCm5bey57uP6KKr5omT5byACiAgICAgICAgICAgICAgICBpZihJbWdXaW5kb3dDLmFsbC5fZmluZChmdW5jdGlvbihpd2luKXsKICAgICAgICAgICAgICAgICAgICBpZihpd2luLnNyYz09c2VsZi5zcmMpewogICAgICAgICAgICAgICAgICAgICAgICBpd2luLmZpcnN0T3BlbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSkpcmV0dXJuOwoKICAgICAgICAgICAgICAgIHRoaXMuYWRkU3R5bGUoKTsKCiAgICAgICAgICAgICAgICB2YXIgaW1nPXRoaXMuaW1nOwogICAgICAgICAgICAgICAgaW1nLmNsYXNzTmFtZT0ncHYtcGljLXdpbmRvdy1waWMgcHYtcGljLWlnbm9yZWQnOwogICAgICAgICAgICAgICAgaW1nLnN0eWxlLmNzc1RleHQ9J1wKICAgICAgICAgICAgICAgICB0b3A6MHB4O1wKICAgICAgICAgICAgICAgICBsZWZ0OjBweDtcCiAgICAgICAgICAgICAgICAgJzsKCiAgICAgICAgICAgICAgICB2YXIgaW1nTmF0dXJhbFNpemU9ewogICAgICAgICAgICAgICAgICAgIGg6aW1nLm5hdHVyYWxIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgdzppbWcubmF0dXJhbFdpZHRoLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHRoaXMuaW1nTmF0dXJhbFNpemU9aW1nTmF0dXJhbFNpemU7CgogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUuY3NzVGV4dD0nXAogICAgICAgICAgICAgICAgIGN1cnNvcjpwb2ludGVyO1wKICAgICAgICAgICAgICAgICB0b3A6MHB4O1wKICAgICAgICAgICAgICAgICBsZWZ0OjBweDtcCiAgICAgICAgICAgICAgICAgJzsKICAgICAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWU9J3B2LXBpYy13aW5kb3ctY29udGFpbmVyJzsKICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUw9CiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1waWMtd2luZG93LXJvdGF0ZS1pbmRpY2F0b3IiPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1waWMtd2luZG93LXJvdGF0ZS1pbmRpY2F0b3ItcG9pbnRlciI+PC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtcGljLXdpbmRvdy1yb3RhdGUtb3ZlcmxheWVyIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LXBpYy13aW5kb3ctdG9vbGJhciIgdW5zZWxlY3RhYmxlPSJvbiI+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LXBpYy13aW5kb3ctdGItaGFuZCBwdi1waWMtd2luZG93LXRiLXRvb2wiIHRpdGxlPSInK2kxOG4oImhhbmQiKSsnIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LXBpYy13aW5kb3ctdGItdG9vbC1iYWRnZS1jb250YWluZXIgcHYtcGljLXdpbmRvdy10Yi10b29sLWV4dGVuZC1tZW51LWNvbnRhaW5lciI+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LXBpYy13aW5kb3ctdGItcm90YXRlIHB2LXBpYy13aW5kb3ctdGItdG9vbCIgdGl0bGU9IicraTE4bigicm90YXRlIikrJyI+PC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1waWMtd2luZG93LXRiLXRvb2wtYmFkZ2UiPjA8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LXBpYy13aW5kb3ctdGItdG9vbC1leHRlbmQtbWVudSBwdi1waWMtd2luZG93LXRiLXRvb2wtZXh0ZW5kLW1lbnUtcm90YXRlIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtcGljLXdpbmRvdy10Yi10b29sLWV4dGVuZC1tZW51LWl0ZW0iPjA8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LXBpYy13aW5kb3ctdGItdG9vbC1leHRlbmQtbWVudS1pdGVtIj4rOTA8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LXBpYy13aW5kb3ctdGItdG9vbC1leHRlbmQtbWVudS1pdGVtIj4tOTA8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtcGljLXdpbmRvdy10Yi10b29sLWJhZGdlLWNvbnRhaW5lciBwdi1waWMtd2luZG93LXRiLXRvb2wtZXh0ZW5kLW1lbnUtY29udGFpbmVyIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtcGljLXdpbmRvdy10Yi16b29tIHB2LXBpYy13aW5kb3ctdGItdG9vbCIgdGl0bGU9IicraTE4bigic2NhbGUiKSsnIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LXBpYy13aW5kb3ctdGItdG9vbC1iYWRnZSI+MDwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtcGljLXdpbmRvdy10Yi10b29sLWV4dGVuZC1tZW51IHB2LXBpYy13aW5kb3ctdGItdG9vbC1leHRlbmQtbWVudS16b29tIj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtcGljLXdpbmRvdy10Yi10b29sLWV4dGVuZC1tZW51LWl0ZW0iPjE8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LXBpYy13aW5kb3ctdGItdG9vbC1leHRlbmQtbWVudS1pdGVtIj4rMC4xPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1waWMtd2luZG93LXRiLXRvb2wtZXh0ZW5kLW1lbnUtaXRlbSI+LTAuMTwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1waWMtd2luZG93LXRiLWZsaXAtaG9yaXpvbnRhbCBwdi1waWMtd2luZG93LXRiLWNvbW1hbmQiIHRpdGxlPSInK2kxOG4oImhvcml6b250YWxGbGlwIikrJyI+PC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1waWMtd2luZG93LXRiLWZsaXAtdmVydGljYWwgcHYtcGljLXdpbmRvdy10Yi1jb21tYW5kIiB0aXRsZT0iJytpMThuKCJ2ZXJ0aWNhbEZsaXAiKSsnIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1waWMtd2luZG93LWNsb3NlIj48L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgLy8nPHNwYW4gY2xhc3M9InB2LXBpYy13aW5kb3ctc2VhcmNoIiB0aXRsZT0iJytpMThuKCJzaW1pbGFySW1hZ2UiKSsnIj48L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1waWMtd2luZG93LXJhbmdlIj48L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1waWMtd2luZG93LWRlc2NyaXB0aW9uIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LXBpYy1zZWFyY2gtc3RhdGUiPjwvc3Bhbj4nOwoKICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoaW1nLGNvbnRhaW5lci5maXJzdENoaWxkKTsKCiAgICAgICAgICAgICAgICB0aGlzLmltZ1dpbmRvdz1jb250YWluZXI7CgogICAgICAgICAgICAgICAgdmFyIHRvb2xNYXA9ewogICAgICAgICAgICAgICAgICAgICdoYW5kJzpjb250YWluZXIucXVlcnlTZWxlY3RvcignLnB2LXBpYy13aW5kb3ctdGItaGFuZCcpLAogICAgICAgICAgICAgICAgICAgICdyb3RhdGUnOmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucHYtcGljLXdpbmRvdy10Yi1yb3RhdGUnKSwKICAgICAgICAgICAgICAgICAgICAnem9vbSc6Y29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5wdi1waWMtd2luZG93LXRiLXpvb20nKSwKICAgICAgICAgICAgICAgICAgICAnZmgnOmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucHYtcGljLXdpbmRvdy10Yi1mbGlwLWhvcml6b250YWwnKSwKICAgICAgICAgICAgICAgICAgICAnZnYnOmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucHYtcGljLXdpbmRvdy10Yi1mbGlwLXZlcnRpY2FsJyksCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpcy50b29sTWFwPXRvb2xNYXA7CgoKICAgICAgICAgICAgICAgIC8v5YWz6ZetCiAgICAgICAgICAgICAgICB2YXIgY2xvc2VCdXR0b249Y29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5wdi1waWMtd2luZG93LWNsb3NlJyk7CiAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbi5zdHlsZS5jc3NUZXh0PSd0b3A6IC0yNHB4O3JpZ2h0OiAwcHg7JzsKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VCdXR0b249Y2xvc2VCdXR0b247CiAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0sZmFsc2UpOwoKICAgICAgICAgICAgICAgIC8vdmFyIHNlYXJjaEJ1dHRvbj1jb250YWluZXIucXVlcnlTZWxlY3RvcignLnB2LXBpYy13aW5kb3ctc2VhcmNoJyk7CiAgICAgICAgICAgICAgICAvL3NlYXJjaEJ1dHRvbi5zdHlsZS5jc3NUZXh0PSd0b3A6IC0yNHB4O3JpZ2h0OiA1MHB4Oyc7CiAgICAgICAgICAgICAgICAvL3RoaXMuc2VhcmNoQnV0dG9uPXNlYXJjaEJ1dHRvbjsKICAgICAgICAgICAgICAgIHZhciBzcmNzLCBmcm9tOwogICAgICAgICAgICAgICAgaW1nLm9uZXJyb3I9ZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgc2V0U2VhcmNoU3RhdGUoaTE4bigibG9hZE5leHRTaW1pbGFyIiksaW1nLnBhcmVudE5vZGUpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhpbWcuc3JjK2kxOG4oImxvYWRFcnJvciIpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3JjPXNlbGYuc3Jjcy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgIGlmKHNyYylpbWcuc3JjPXNyYzsKICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICBpZihmcm9tPHNlYXJjaFNvcnQubGVuZ3RoKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEltZ0J5SW1nKHNlbGYuaW1nLnNyYywgc2VsZi5pbWcucGFyZW50Tm9kZSwgZnVuY3Rpb24oc3JjcywgaW5kZXgpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb209aW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zcmNzPXNyY3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbWcuc3JjPXNyY3Muc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sbnVsbCxudWxsLGZyb20pOwogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlYXJjaFN0YXRlKGkxOG4oImZpbmROb1BpYyIpLGltZy5wYXJlbnROb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWFyY2hTdGF0ZSgiIixpbWcucGFyZW50Tm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LDIwMDApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGltZy5vbmxvYWQ9ZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgc2V0U2VhcmNoU3RhdGUoIiIsaW1nLnBhcmVudE5vZGUpOwogICAgICAgICAgICAgICAgICAgIHNlbGYuaW1nTmF0dXJhbFNpemU9ewogICAgICAgICAgICAgICAgICAgICAgICBoOmltZy5uYXR1cmFsSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICB3OmltZy5uYXR1cmFsV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnpvb20oMSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5maXRUb1NjcmVlbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLypzZWFyY2hCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgIHNvcnRTZWFyY2goKTsKICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbWdCeUltZyhzZWxmLmltZy5zcmMsIHNlbGYuaW1nLnBhcmVudE5vZGUsIGZ1bmN0aW9uKHNyY3MsIGluZGV4KXsKICAgICAgICAgICAgICAgICAgICAgICAgZnJvbT1pbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zcmNzPXNyY3M7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW1nLnNyYz1zcmNzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LGZhbHNlKTsqLwoKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAqIOivtOaYjgogICAgICAgICAqIDHjgIHlr7nljp/mnaXnmoTpgILlupTlsY/luZXnrYnlip/og73kvJrmnInlvbHlk43vvIzmmoLml7bnpoHnlKjjgIIKICAgICAgICAgKiAy44CB5YiG5Li6IGFic29sdXRlIOWSjOm7mOiupOeahDLnp43mg4XlhrUKICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVzY3JpcHRpb25TcGFuID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5wdi1waWMtd2luZG93LWRlc2NyaXB0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRpb25TcGFuLnN0eWxlLmNzc1RleHQgPSAnXAogICAgICAgICAgICAgICAgICAgIC8vICBib3R0b206IC00MHB4O1wKICAgICAgICAgICAgICAgICAgICAvLyAgbGVmdDogMTBweDtcCiAgICAgICAgICAgICAgICAgICAgLy8gJzsKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvblNwYW4udGV4dENvbnRlbnQgPSB0aGlzLmRhdGEuZGVzY3JpcHRpb24gfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRpb25TcGFuLnN0eWxlLmRpc3BsYXkgPSB0aGlzLmRhdGEuZGVzY3JpcHRpb24gPyAnYmxvY2snIDogJ25vbmUnOwogICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uU3Bhbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb25TcGFuID0gZGVzY3JpcHRpb25TcGFuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciB0b29sYmFyPWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucHYtcGljLXdpbmRvdy10b29sYmFyJyk7CiAgICAgICAgICAgICAgICB0b29sYmFyLnN0eWxlLmNzc1RleHQ9J1wKdG9wOiAwcHg7XApsZWZ0OiAtNDVweDtcCic7CiAgICAgICAgICAgICAgICB0aGlzLnRvb2xiYXI9dG9vbGJhcjsKCiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVG9vbENsYXNzPSdwdi1waWMtd2luZG93LXRiLXRvb2wtc2VsZWN0ZWQnOwoKICAgICAgICAgICAgICAgIHRoaXMudmlld1JhbmdlPWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucHYtcGljLXdpbmRvdy1yYW5nZScpOwoKICAgICAgICAgICAgICAgIHRoaXMucm90YXRlSW5kaWNhdG9yPWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucHYtcGljLXdpbmRvdy1yb3RhdGUtaW5kaWNhdG9yJyk7CiAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZUlQb2ludGVyPWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucHYtcGljLXdpbmRvdy1yb3RhdGUtaW5kaWNhdG9yLXBvaW50ZXInKTsKICAgICAgICAgICAgICAgIHRoaXMucm90YXRlT3ZlcmxheWVyPWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucHYtcGljLXdpbmRvdy1yb3RhdGUtb3ZlcmxheWVyJyk7CgoKICAgICAgICAgICAgICAgIHRoaXMuaEtleVVwPXRydWU7CiAgICAgICAgICAgICAgICB0aGlzLnJLZXlVcD10cnVlOwogICAgICAgICAgICAgICAgdGhpcy56S2V5VXA9dHJ1ZTsKCiAgICAgICAgICAgICAgICB0aGlzLnNwYWNlS2V5VXA9dHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuY3RybEtleVVwPXRydWU7CiAgICAgICAgICAgICAgICB0aGlzLmFsdEtleVVwPXRydWU7CiAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0S2V5VXA9dHJ1ZTsKCiAgICAgICAgICAgICAgICAvL+e8qeaUvuW3peWFt+eahOaJqeWxleiPnOWNlQogICAgICAgICAgICAgICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5wdi1waWMtd2luZG93LXRiLXRvb2wtZXh0ZW5kLW1lbnUtem9vbScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0PWUudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0PXRhcmdldC50ZXh0Q29udGVudDsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHRleHQpewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcxJzp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0xOwogICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyswLjEnOnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXNlbGYuem9vbUxldmVsICsgMC4xOwogICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy0wLjEnOnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXNlbGYuem9vbUxldmVsIC0gMC4xOwogICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgdmFsdWUhPSd1bmRlZmluZWQnKXsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi56b29tKHZhbHVlLHt4OjAseTowfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sdHJ1ZSk7CgogICAgICAgICAgICAgICAgLy/ml4vovazlt6XlhbfnmoTmianlsZXoj5zljZUKICAgICAgICAgICAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcucHYtcGljLXdpbmRvdy10Yi10b29sLWV4dGVuZC1tZW51LXJvdGF0ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0PWUudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0PXRhcmdldC50ZXh0Q29udGVudDsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY29udmVydChkZWcpewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVnICogTWF0aC5QSS8xODA7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHRleHQpewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwJzp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0wOwogICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJys5MCc6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9c2VsZi5yb3RhdGVkUmFkaWFucyArIGNvbnZlcnQoOTApOwogICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy05MCc6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9c2VsZi5yb3RhdGVkUmFkaWFucyAtIGNvbnZlcnQoOTApOwogICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIFBJPU1hdGguUEk7CiAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHZhbHVlIT0ndW5kZWZpbmVkJyl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlPj0yKlBJKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT0yKlBJOwogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih2YWx1ZTwwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKz0yKlBJOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZSh2YWx1ZSx0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSx0cnVlKTsKCiAgICAgICAgICAgICAgICB0b29sYmFyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsZnVuY3Rpb24oZSl7Ly/pvKDmoIfmjInkuIvpgInmi6nlt6XlhbcKICAgICAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXJFdmVudEhhbmRsZXIoZSk7CiAgICAgICAgICAgICAgICB9LGZhbHNlKTsKCgogICAgICAgICAgICAgICAgdG9vbGJhci5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsZnVuY3Rpb24oZSl7Ly/pvKDmoIflj4zlh7vlt6XlhbcKICAgICAgICAgICAgICAgICAgICBzZWxmLnRvb2xiYXJFdmVudEhhbmRsZXIoZSk7CiAgICAgICAgICAgICAgICB9LGZhbHNlKTsKCgogICAgICAgICAgICAgICAgLy/pmLvmraLmtY/op4jlmajlr7nlm77niYfnmoTpu5jorqTmjqfliLbooYzkuLoKICAgICAgICAgICAgICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIH0sZmFsc2UpOwoKCiAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyxmdW5jdGlvbihlKXsvL+W9k+aMieS4i+eahOaXtu+8jOaJp+ihjOW5s+enu++8jOe8qeaUvu+8jOaXi+i9rOaTjeS9nAogICAgICAgICAgICAgICAgICAgIHNlbGYuaW1nV2luZG93RXZlbnRIYW5kbGVyKGUpOwogICAgICAgICAgICAgICAgfSxmYWxzZSk7CgogICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsvL+mYu+atom9wZXJhIGN0cmwr54K55Ye75L+d5a2Y5Zu+54mHCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbWdXaW5kb3dFdmVudEhhbmRsZXIoZSk7CiAgICAgICAgICAgICAgICB9LGZhbHNlKTsKCiAgICAgICAgICAgICAgICBpZihwcmVmcy5pbWdXaW5kb3cuem9vbS5tb3VzZVdoZWVsWm9vbSl7Ly/mmK/lkKbkvb/nlKjpvKDmoIfnvKnmlL4KICAgICAgICAgICAgICAgICAgICBhZGRXaGVlbEV2ZW50KGNvbnRhaW5lcixmdW5jdGlvbihlKXsvL+a7mui9rue8qeaUvgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmltZ1dpbmRvd0V2ZW50SGFuZGxlcihlKTsKICAgICAgICAgICAgICAgICAgICB9LGZhbHNlKTsKICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgICAgIGlmKHByZWZzLmltZ1dpbmRvdy5vdmVybGF5ZXIuc2hvd24pey8v5piv5ZCm5pi+56S66KaG55uW5bGCCiAgICAgICAgICAgICAgICAgICAgdmFyIG92ZXJsYXllcj1JbWdXaW5kb3dDLm92ZXJsYXllcjsKICAgICAgICAgICAgICAgICAgICBpZighb3ZlcmxheWVyKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG92ZXJsYXllcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIEltZ1dpbmRvd0Mub3ZlcmxheWVyPW92ZXJsYXllcjsKICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheWVyLmNsYXNzTmFtZT0ncHYtcGljLXdpbmRvdy1vdmVybGF5ZXInOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXllcik7CiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXllci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9cHJlZnMuaW1nV2luZG93Lm92ZXJsYXllci5jb2xvcjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG92ZXJsYXllci5zdHlsZS5kaXNwbGF5PSdibG9jayc7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8v5piv5ZCm54K55Ye75Zu+54mH5aSW6YOo5YWz6ZetCiAgICAgICAgICAgICAgICBpZihwcmVmcy5pbWdXaW5kb3cub3ZlcmxheWVyLnNob3duICYmIHByZWZzLmltZ1dpbmRvdy5jbG9zZS5jbGlja091dHNpZGUpewogICAgICAgICAgICAgICAgICAgIHZhciBjbGlja091dHNpZGU9ZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQ9ZS50YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFjb250YWluZXIuY29udGFpbnModGFyZ2V0KSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlja091dHNpZGU9Y2xpY2tPdXRzaWRlOwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIocHJlZnMuaW1nV2luZG93LmNsb3NlLmNsaWNrT3V0c2lkZSxjbGlja091dHNpZGUsdHJ1ZSk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8v5piv5ZCm5Y+M5Ye75Zu+54mH5pys6Lqr5YWz6ZetCiAgICAgICAgICAgICAgICBpZihwcmVmcy5pbWdXaW5kb3cuY2xvc2UuZGJsQ2xpY2tJbWdXaW5kb3cpewogICAgICAgICAgICAgICAgICAgIHZhciBkYmxDbGlja0ltZ1dpbmRvdz1mdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldD1lLnRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYodGFyZ2V0PT1jb250YWluZXIgfHwgdGFyZ2V0PT1pbWcgfHwgdGFyZ2V0PT1zZWxmLnJvdGF0ZU92ZXJsYXllcil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJyxkYmxDbGlja0ltZ1dpbmRvdyx0cnVlKTsKICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTsKICAgICAgICAgICAgICAgIEltZ1dpbmRvd0MuYWxsLnB1c2godGhpcyk7CgogICAgICAgICAgICAgICAgdGhpcy5fYmx1cj10aGlzLmJsdXIuYmluZCh0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRLZXlkb3duPXRoaXMuZm9jdXNlZEtleWRvd24uYmluZCh0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRLZXl1cD10aGlzLmZvY3VzZWRLZXl1cC5iaW5kKHRoaXMpOwoKICAgICAgICAgICAgICAgIHRoaXMucm90YXRlZFJhZGlhbnM9MDsvL+W3sue7j+aXi+i9rOeahOinkuW6pgogICAgICAgICAgICAgICAgdGhpcy56b29tTGV2ZWw9MTsvL+e8qeaUvue6p+WIqwogICAgICAgICAgICAgICAgdGhpcy5zZXRUb29sQmFkZ2UoJ3pvb20nLDEpOwoKICAgICAgICAgICAgICAgIC8v6YCJ5Lit6buY6K6k5bel5YW3CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFRvb2wocHJlZnMuaW1nV2luZG93LmRlZmF1bHRUb29sKTsKCiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0T3BlbigpOwogICAgICAgICAgICB9LAoKCiAgICAgICAgICAgIGFkZFN0eWxlOmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBpZihJbWdXaW5kb3dDLnN0eWxlKXJldHVybjsKICAgICAgICAgICAgICAgIHZhciBzdHlsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICAgICAgSW1nV2luZG93Qy5zdHlsZT1zdHlsZTsKICAgICAgICAgICAgICAgIHN0eWxlLnRleHRDb250ZW50PSdcCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctY29udGFpbmVyIHtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDQwLDQwLDQwLDAuOSk7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDhweDtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiA1cHggc29saWQgI2NjYztcCiAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDA7XAogICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XAogICAgICAgICAgICAgICAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1waWMtd2luZG93LWNvbnRhaW5lcl9mb2N1cyB7XAogICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwwLDAsMC42KTtcCiAgICAgICAgICAgICAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctY2xvc2UsXAogICAgICAgICAgICAgICAgICAgIC5wdi1waWMtd2luZG93LXNlYXJjaCxcCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctdG9vbGJhcixcCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctdGItdG9vbC1leHRlbmQtbWVudXtcCiAgICAgICAgICAgICAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZS1pbi1vdXQ7XAogICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycyBlYXNlLWluLW91dDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtcGljLXdpbmRvdy10b29sYmFyIHtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTM1MzUzO1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1wKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjk7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XAogICAgICAgICAgICAgICAgICAgIGN1cnNvcjogZGVmYXVsdDtcCiAgICAgICAgICAgICAgICAgICAgLW8tdXNlci1zZWxlY3Q6IG5vbmU7XAogICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XAogICAgICAgICAgICAgICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IC1tb3otbm9uZTtcCiAgICAgICAgICAgICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctdG9vbGJhcjpob3ZlciB7XAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDE7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctdG9vbGJhcl9mb2N1cyB7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1waWMtd2luZG93LWNsb3NlIHtcCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XAogICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAwcHg7XAogICAgICAgICAgICAgICAgICAgIHRvcDogLTI0cHg7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHVybCgiJytwcmVmcy5pY29ucy5jbG9zZSsnIikgbm8tcmVwZWF0IGNlbnRlciBib3R0b207XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTdweDtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDQ2cHg7XAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuOTtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOm5vbmU7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MDtcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy10b3A6MnB4O1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiMxNzcxRkY7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctY2xvc2U6aG92ZXIge1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOnJlZDtcCiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtcGljLXdpbmRvdy1jbG9zZV9mb2N1cyB7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1waWMtd2luZG93LXNlYXJjaCB7XAogICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1wKICAgICAgICAgICAgICAgICAgICByaWdodDogNTBweDtcCiAgICAgICAgICAgICAgICAgICAgdG9wOiAtMjRweDtcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdXJsKCInK3ByZWZzLmljb25zLnNlYXJjaEJ0bisnIikgbm8tcmVwZWF0IGNlbnRlciBib3R0b207XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTdweDtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDQ2cHg7XAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuOTtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOm5vbmU7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6MDtcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy10b3A6MnB4O1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiMxNzcxRkY7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctc2VhcmNoOmhvdmVyIHtcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjpyZWQ7XAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDE7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctc2VhcmNoX2ZvY3VzIHtcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctZGVzY3JpcHRpb24ge1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOiAyMHB4O1wKICAgICAgICAgICAgICAgICAgICBtaW4taGVpZ2h0OiAyMHB4O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1waWMtc2VhcmNoLXN0YXRlIHtcCiAgICAgICAgICAgICAgICAgICAgdG9wOiAxMHB4O1wKICAgICAgICAgICAgICAgICAgICBsZWZ0OiAxMHB4O1wKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiAxO1wKICAgICAgICAgICAgICAgICAgICBjb2xvcjogI2ZmZmYwMDtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDUwMHB4O1wKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IGxhcmdlO1wKICAgICAgICAgICAgICAgICAgICB0ZXh0LXNoYWRvdzogMXB4IDAgMCAjMDAwLC0xcHggMCAwICMwMDAsMCAxcHggMCAjMDAwLDAgLTFweCAwICMwMDA7XAogICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdGV4dC1zaGFkb3c6IzAwMCAxcHggMCAwLCMwMDAgMCAxcHggMCwjMDAwIC0xcHggMCAwLCMwMDAgMCAtMXB4IDA7XAogICAgICAgICAgICAgICAgICAgIC1tb3otdGV4dC1zaGFkb3c6IzAwMCAxcHggMCAwLCMwMDAgMCAxcHggMCwjMDAwIC0xcHggMCAwLCMwMDAgMCAtMXB4IDA7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctcGljIHtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1wKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OmlubGluZS1ibG9jaztcLypvcGVyYeaKiuWbvueJh+iuvue9rmRpc3BsYXk6YmxvY2vkvJrlh7rnjrDmuLLmn5Ppl67popjvvIzkvJrmnInmrovlvbHvvIzov5jkvJrlvJXlj5Hlhbbku5blkITnp43pl67popjvvIzlkJPlsL8qL1wKICAgICAgICAgICAgICAgICAgICBtYXgtd2lkdGg6bm9uZTtcCiAgICAgICAgICAgICAgICAgICAgbWluLXdpZHRoOm5vbmU7XAogICAgICAgICAgICAgICAgICAgIG1heC1oZWlnaHQ6bm9uZTtcCiAgICAgICAgICAgICAgICAgICAgbWluLWhlaWdodDpub25lO1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjA7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjowO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXI6bm9uZTtcCiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246bWlkZGxlO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1waWMtd2luZG93LXBpY19mb2N1cyB7XAogICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA2cHggYmxhY2s7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctdGItdG9vbCxcCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctdGItY29tbWFuZHtcCiAgICAgICAgICAgICAgICAgICAgYm94LXNpemluZzpjb250ZW50LWJveDtcCiAgICAgICAgICAgICAgICAgICAgLW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O1wKICAgICAgICAgICAgICAgICAgICAtd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMjRweDtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDI0cHg7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDEycHggOHB4IDZweCA2cHg7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjowO1wKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgbm8tcmVwZWF0IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM4Njg2ODY7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtb3JpZ2luOiBjb250ZW50LWJveDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtcGljLXdpbmRvdy10b29sYmFyID4gc3BhbjpsYXN0LWNoaWxkIHtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtcGljLXdpbmRvdy10Yi10b29sOmhvdmVyLFwKICAgICAgICAgICAgICAgICAgICAucHYtcGljLXdpbmRvdy10Yi1jb21tYW5kOmhvdmVye1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItbGVmdDogMnB4IHNvbGlkIHJlZDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtcGljLXdpbmRvdy10Yi10b29sLXNlbGVjdGVke1wKICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDIxcHggMCByZ2JhKDI1NSwyNTUsMjU1LDAuMykgLGluc2V0IDAgLTIxcHggMCByZ2JhKDAsMCwwLDAuMyk7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1sZWZ0OjJweCBzb2xpZCAjMTc3MUZGO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1waWMtd2luZG93LXRiLWhhbmQge1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIicrcHJlZnMuaWNvbnMuaGFuZCsnIik7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctdGItcm90YXRlIHtcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCInK3ByZWZzLmljb25zLnJvdGF0ZSsnIik7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctdGItem9vbSB7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiJytwcmVmcy5pY29ucy56b29tKyciKTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtcGljLXdpbmRvdy10Yi1mbGlwLWhvcml6b250YWwge1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIicrcHJlZnMuaWNvbnMuZmxpcEhvcml6b250YWwrJyIpO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1waWMtd2luZG93LXRiLWZsaXAtdmVydGljYWwge1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIicrcHJlZnMuaWNvbnMuZmxpcFZlcnRpY2FsKyciKTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtcGljLXdpbmRvdy10Yi10b29sLWJhZGdlLWNvbnRhaW5lciB7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctdGItdG9vbC1iYWRnZSB7XAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcCiAgICAgICAgICAgICAgICAgICAgdG9wOiAtM3B4O1wKICAgICAgICAgICAgICAgICAgICByaWdodDogMXB4O1wKICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDEwcHg7XAogICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDAgM3B4O1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjkzO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MHB4O1wKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjU7XAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiBibGFjaztcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtcGljLXdpbmRvdy10Yi10b29sLWV4dGVuZC1tZW51e1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTtcCiAgICAgICAgICAgICAgICAgICAgdG9wOjA7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0Oi0xcHg7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IzUzNTM1MztcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpub25lO1wKICAgICAgICAgICAgICAgICAgICBsZWZ0OjQwcHg7XAogICAgICAgICAgICAgICAgICAgIGNvbG9yOiNDM0MzQzM7XAogICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZToxMnB4O1wKICAgICAgICAgICAgICAgICAgICB0ZXh0LXNoYWRvdzowcHggLTFweCAwcHggYmxhY2s7XAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6MC43O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1waWMtd2luZG93LXRiLXRvb2wtZXh0ZW5kLW1lbnU6aG92ZXJ7XAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6MC45O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1waWMtd2luZG93LXRiLXRvb2wtZXh0ZW5kLW1lbnUtaXRlbXtcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpibG9jaztcCiAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6MS41O1wKICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzoxMHB4O1wKICAgICAgICAgICAgICAgICAgICBjdXJzb3I6cG9pbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCB0cmFuc3BhcmVudDtcCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM4Njg2ODY7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctdGItdG9vbC1leHRlbmQtbWVudS1pdGVtOmxhc3QtY2hpbGR7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctdGItdG9vbC1leHRlbmQtbWVudS1pdGVtOmhvdmVye1wKICAgICAgICAgICAgICAgICAgICBib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJlZDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtcGljLXdpbmRvdy10Yi10b29sLWV4dGVuZC1tZW51LWl0ZW06YWN0aXZle1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjExcHggOXB4IDlweCAxMXB4O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1waWMtd2luZG93LXRiLXRvb2wtZXh0ZW5kLW1lbnUtY29udGFpbmVyOmhvdmVyIC5wdi1waWMtd2luZG93LXRiLXRvb2x7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1sZWZ0OjJweCBzb2xpZCByZWQ7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctdGItdG9vbC1leHRlbmQtbWVudS1jb250YWluZXI6aG92ZXIgLnB2LXBpYy13aW5kb3ctdGItdG9vbC1leHRlbmQtbWVudXtcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpibG9jaztcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtcGljLXdpbmRvdy10Yi10b29sLWV4dGVuZC1tZW51LWNvbnRhaW5lcjo6YWZ0ZXJ7XAogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IiI7XAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOmFic29sdXRlO1wKICAgICAgICAgICAgICAgICAgICByaWdodDoxcHg7XAogICAgICAgICAgICAgICAgICAgIGJvdHRvbToycHg7XAogICAgICAgICAgICAgICAgICAgIHdpZHRoOjA7XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDowO1wKICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOjA7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbjowO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXI6M3B4IHNvbGlkICNDM0MzQzM7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnQ7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOnRyYW5zcGFyZW50O1wKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OjAuNTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtcGljLXdpbmRvdy1vdmVybGF5ZXJ7XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDoxMDAlO1wKICAgICAgICAgICAgICAgICAgICB3aWR0aDoxMDAlO1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpmaXhlZDtcCiAgICAgICAgICAgICAgICAgICAgei1pbmRleDo5OTk5OTk5OTk7XAogICAgICAgICAgICAgICAgICAgIHRvcDowO1wKICAgICAgICAgICAgICAgICAgICBsZWZ0OjA7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgLnB2LXBpYy13aW5kb3ctcm90YXRlLWluZGljYXRvcntcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpub25lO1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpmaXhlZDtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6MjUwcHg7XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDoyNTBweDtcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzoxMHB4O1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOi0xMzVweDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6LTEzNXB4O1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOnRyYW5zcGFyZW50IHVybCgiJysgcHJlZnMuaWNvbnMucm90YXRlSW5kaWNhdG9yQkcgKyciKSBuby1yZXBlYXQgY2VudGVyO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1waWMtd2luZG93LXJvdGF0ZS1pbmRpY2F0b3ItcG9pbnRlcntcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTpibG9jaztcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6YXV0bztcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OmF1dG87XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6dHJhbnNwYXJlbnQgdXJsKCInKyBwcmVmcy5pY29ucy5yb3RhdGVJbmRpY2F0b3JQb2ludGVyICsnIikgbm8tcmVwZWF0IGNlbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6NjBweDtcCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjI0MHB4O1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTtcCiAgICAgICAgICAgICAgICAgICAgdG9wOjVweDtcCiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOnJvdGF0ZSgwLjFkZWcpO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgIC5wdi1waWMtd2luZG93LXJvdGF0ZS1vdmVybGF5ZXJ7LyrlvZPliIfmjaLliLDml4vovazlt6XlhbfnmoTml7blgJnmmL7npLrov5nkuKropobnm5blsYLvvIznhLblkI7ml4vovazmjIfnpLrlmajmmL7npLrlnKjov5nkuKropobnm5blsYLnmoTkuIvpnaIqL1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjphYnNvbHV0ZTtcCiAgICAgICAgICAgICAgICAgICAgdG9wOjA7XAogICAgICAgICAgICAgICAgICAgIGJvdHRvbTowO1wKICAgICAgICAgICAgICAgICAgICBsZWZ0OjA7XAogICAgICAgICAgICAgICAgICAgIHJpZ2h0OjA7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6bm9uZTtcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAucHYtcGljLXdpbmRvdy1yYW5nZXtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlcjpub25lO1wKICAgICAgICAgICAgICAgICAgICB3aWR0aDoxMDBweDtcCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OjEwMHB4O1wKICAgICAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwcHggMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuOCk7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6bm9uZTtcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzowO1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LCAwLCAwLCAwLjE1MCk7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgJzsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZmlyc3RPcGVuOmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBJbWdXaW5kb3dDLnNlbGVjdGVkVG9vbD0naGFuZCc7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgICAgICB2YXIgaW1nV2luZG93PXRoaXMuaW1nV2luZG93OwogICAgICAgICAgICAgICAgdmFyIHNjcm9sbGVkPWdldFNjcm9sbGVkKCk7CiAgICAgICAgICAgICAgICBpbWdXaW5kb3cuc3R5bGUubGVmdD0tNSArIHNjcm9sbGVkLnggKyAncHgnOwogICAgICAgICAgICAgICAgaW1nV2luZG93LnN0eWxlLnRvcD0tNSArIHNjcm9sbGVkLnkgKyAncHgnOwoKICAgICAgICAgICAgICAgIGlmKHByZWZzLmltZ1dpbmRvdy5maXRUb1NjcmVlbil7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXRUb1NjcmVlbigpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuY2VudGVyKHRydWUsdHJ1ZSk7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAvL3dpbmRvd+eahOWwuuWvuAogICAgICAgICAgICAgICAgICAgIHZhciB3U2l6ZT1nZXRXaW5kb3dTaXplKCk7CiAgICAgICAgICAgICAgICAgICAgLy/nqbrpmpkKICAgICAgICAgICAgICAgICAgICB3U2l6ZS5oIC09IDE2OwogICAgICAgICAgICAgICAgICAgIHdTaXplLncgLT0gMTY7CgogICAgICAgICAgICAgICAgICAgIHZhciBpbWdXaW5kb3dDUz11bnNhZmVXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpbWdXaW5kb3cpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmVjdFNpemU9ewogICAgICAgICAgICAgICAgICAgICAgICBoOnBhcnNlRmxvYXQoaW1nV2luZG93Q1MuaGVpZ2h0KSwKICAgICAgICAgICAgICAgICAgICAgICAgdzpwYXJzZUZsb2F0KGltZ1dpbmRvd0NTLndpZHRoKSwKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbnRlcihyZWN0U2l6ZS53IDw9IHdTaXplLncgLCByZWN0U2l6ZS5oIDw9IHdTaXplLmgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB0aGlzLmtlZXBTY3JlZW5JbnNpZGUoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAga2VlcFNjcmVlbkluc2lkZTpmdW5jdGlvbigpey8v5L+d5oyB5oyJ6ZKu5Zyo5bGP5bmV6YeM6Z2iLgogICAgICAgICAgICAgICAgdmFyIGltZ1dpbmRvdz10aGlzLmltZ1dpbmRvdzsKICAgICAgICAgICAgICAgIHZhciBpbWdXaW5kb3dGdWxsU2l6ZT17CiAgICAgICAgICAgICAgICAgICAgaDppbWdXaW5kb3cub2Zmc2V0SGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIHc6aW1nV2luZG93Lm9mZnNldFdpZHRoLAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB2YXIgd2luZG93U2l6ZT1nZXRXaW5kb3dTaXplKCk7CgogICAgICAgICAgICAgICAgZnVuY3Rpb24ga2VlcFNJKG9iaixvZmZzZXREaXJlY3Rpb24sZGVmYXVsdFZhbHVlLCBvdXQpewogICAgICAgICAgICAgICAgICAgIHZhciBvYmpSZWN0PW9iai5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgICAgICAgICB2YXIgb2JqU3R5bGU9b2JqLnN0eWxlOwoKICAgICAgICAgICAgICAgICAgICB3aGlsZShvZmZzZXREaXJlY3Rpb24ubGVuZ3RoKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9EPW9mZnNldERpcmVjdGlvblswXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9EVj1kZWZhdWx0VmFsdWVbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldERpcmVjdGlvbi5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9WYWx1ZT1wYXJzZUZsb2F0KG9ialN0eWxlW29EXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9EKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvcCc6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlPW9WYWx1ZSAtIG9ialJlY3QudG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9ialJlY3QudG9wPDApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZT1NYXRoLm1pbihuZXdWYWx1ZSxpbWdXaW5kb3dGdWxsU2l6ZS5oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU9TWF0aC5tYXgobmV3VmFsdWUsb0RWKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncmlnaHQnOnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZT1vVmFsdWUgKyAob2JqUmVjdC5yaWdodCAtIHdpbmRvd1NpemUudyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYob2JqUmVjdC5yaWdodCA+IHdpbmRvd1NpemUudyl7Ly/lsY/luZXlpJYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU9TWF0aC5taW4obmV3VmFsdWUsaW1nV2luZG93RnVsbFNpemUudyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlPU1hdGgubWF4KG5ld1ZhbHVlLG9EVik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlPW9WYWx1ZSArIChvYmpSZWN0LmJvdHRvbSAtIHdpbmRvd1NpemUuaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYob2JqUmVjdC5ib3R0b20gPiB3aW5kb3dTaXplLmgpey8v5bGP5bmV5aSWCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlPU1hdGgubWluKG5ld1ZhbHVlLGltZ1dpbmRvd0Z1bGxTaXplLmgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZT1NYXRoLm1heChuZXdWYWx1ZSxvRFYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsZWZ0Jzp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU9b1ZhbHVlIC0gb2JqUmVjdC5sZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9ialJlY3QubGVmdDwwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWU9TWF0aC5taW4obmV3VmFsdWUsaW1nV2luZG93RnVsbFNpemUudyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlPU1hdGgubWF4KG5ld1ZhbHVlLG9EVik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKG5ld1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqU3R5bGVbb0RdPW5ld1ZhbHVlICsgJ3B4JzsKCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAga2VlcFNJKHRoaXMuY2xvc2VCdXR0b24sWyd0b3AnLCdyaWdodCddLFstMjQsMF0pOwogICAgICAgICAgICAgICAgLy9rZWVwU0kodGhpcy5zZWFyY2hCdXR0b24sWyd0b3AnLCdyaWdodCddLFstMjQsNTBdKTsKICAgICAgICAgICAgICAgIGtlZXBTSSh0aGlzLnRvb2xiYXIsWyd0b3AnLCdsZWZ0J10sWzAsLTQ1XSk7CgogICAgICAgICAgICAgICAgLy8g5L+d5oyB5rOo6YeK5Zyo5Zu+54mH6YeM6Z2iCiAgICAgICAgICAgICAgICAvLyBrZWVwU0kodGhpcy5kZXNjcmlwdGlvblNwYW4sWydib3R0b20nLCAnbGVmdCddLFstNDAsIDEwXSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZpdFRvU2NyZWVuOmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBpZighcHJlZnMuaW1nV2luZG93LmZpdFRvU2NyZWVuKXJldHVybjsKICAgICAgICAgICAgICAgIHZhciB3U2l6ZT1nZXRXaW5kb3dTaXplKCk7CiAgICAgICAgICAgICAgICAvL+epuumamQogICAgICAgICAgICAgICAgd1NpemUuaCAtPSAxNjsKICAgICAgICAgICAgICAgIHdTaXplLncgLT0gMTY7CgogICAgICAgICAgICAgICAgdmFyIGltZ1dpbmRvdz10aGlzLmltZ1dpbmRvdzsKICAgICAgICAgICAgICAgIHZhciBpbWdXaW5kb3dDUz11bnNhZmVXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpbWdXaW5kb3cpOwogICAgICAgICAgICAgICAgdmFyIHJlY3RTaXplPXsKICAgICAgICAgICAgICAgICAgICBoOnBhcnNlRmxvYXQoaW1nV2luZG93Q1MuaGVpZ2h0KSwKICAgICAgICAgICAgICAgICAgICB3OnBhcnNlRmxvYXQoaW1nV2luZG93Q1Mud2lkdGgpLAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB2YXIgc2l6ZTsKICAgICAgICAgICAgICAgIGlmKHJlY3RTaXplLncgLSB3U2l6ZS53PjAgfHwgcmVjdFNpemUuaCAtIHdTaXplLmg+MCl7Ly/otoXlh7rlsY/luZXvvIzpgqPkuYjnvKnlsI/jgIIKICAgICAgICAgICAgICAgICAgICBpZihyZWN0U2l6ZS53L3JlY3RTaXplLmggPiB3U2l6ZS53L3dTaXplLmgpewogICAgICAgICAgICAgICAgICAgICAgICBzaXplPXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6d1NpemUudywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6d1NpemUudyAvIChyZWN0U2l6ZS53L3JlY3RTaXplLmgpLAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICBzaXplPXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6d1NpemUuaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6d1NpemUuaCAqIChyZWN0U2l6ZS53L3JlY3RTaXplLmgpLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tKHRoaXMuZ2V0Um90YXRlZEltZ0NsaVNpemUoc2l6ZSkudy90aGlzLmltZ05hdHVyYWxTaXplLncpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2VudGVyOmZ1bmN0aW9uKGhvcml6b250YWwsdmVydGljYWwpewogICAgICAgICAgICAgICAgaWYoIWhvcml6b250YWwgJiYgIXZlcnRpY2FsKXJldHVybjsKICAgICAgICAgICAgICAgIHZhciB3U2l6ZT1nZXRXaW5kb3dTaXplKCk7CiAgICAgICAgICAgICAgICB2YXIgaW1nV2luZG93PXRoaXMuaW1nV2luZG93OwogICAgICAgICAgICAgICAgdmFyIHNjcm9sbGVkPWdldFNjcm9sbGVkKCk7CiAgICAgICAgICAgICAgICBpZihob3Jpem9udGFsKWltZ1dpbmRvdy5zdHlsZS5sZWZ0PSAod1NpemUudyAtIGltZ1dpbmRvdy5vZmZzZXRXaWR0aCkvMiArIHNjcm9sbGVkLnggKydweCc7CiAgICAgICAgICAgICAgICBpZih2ZXJ0aWNhbClpbWdXaW5kb3cuc3R5bGUudG9wPSAod1NpemUuaCAtIGltZ1dpbmRvdy5vZmZzZXRIZWlnaHQpLzIgKyBzY3JvbGxlZC55ICsncHgnOwogICAgICAgICAgICB9LAoKCiAgICAgICAgICAgIG1vdmU6ZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICB0aGlzLndvcmtpbmc9dHJ1ZTsKICAgICAgICAgICAgICAgIHZhciBjdXJzb3I9dGhpcy5jdXJzb3I7CiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUN1cnNvcignaGFuZGluZycpOwoKICAgICAgICAgICAgICAgIHZhciBtb3VzZUNvb3I9ewogICAgICAgICAgICAgICAgICAgIHg6ZS5wYWdlWCwKICAgICAgICAgICAgICAgICAgICB5OmUucGFnZVksCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIGltZ1dpbmRvdz10aGlzLmltZ1dpbmRvdzsKICAgICAgICAgICAgICAgIHZhciBpbWdXU3R5bGU9aW1nV2luZG93LnN0eWxlOwogICAgICAgICAgICAgICAgdmFyIG9yaU9mZnNldD17CiAgICAgICAgICAgICAgICAgICAgbGVmdDpwYXJzZUZsb2F0KGltZ1dTdHlsZS5sZWZ0KSwKICAgICAgICAgICAgICAgICAgICB0b3A6cGFyc2VGbG9hdChpbWdXU3R5bGUudG9wKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgc2VsZj10aGlzOwogICAgICAgICAgICAgICAgdmFyIG1vdmVIYW5kbGVyPWZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgIGltZ1dTdHlsZS5sZWZ0PW9yaU9mZnNldC5sZWZ0KyBlLnBhZ2VYLW1vdXNlQ29vci54ICsncHgnOwogICAgICAgICAgICAgICAgICAgIGltZ1dTdHlsZS50b3A9b3JpT2Zmc2V0LnRvcCArIGUucGFnZVktbW91c2VDb29yLnkgKydweCc7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5rZWVwU2NyZWVuSW5zaWRlKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIG1vdXNldXBIYW5kbGVyPWZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhbmdlQ3Vyc29yKGN1cnNvcik7CiAgICAgICAgICAgICAgICAgICAgc2VsZi53b3JraW5nPWZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmKHNlbGYudGVtcEhhbmQgJiYgc2VsZi5zcGFjZUtleVVwKXsvL+WmguaenOaYr+S4tOaXtuWIh+aNouWIsOaKk+aJi+W3peWFt++8jOW5s+enu+WujOaIkOWQjui/lOWbnuS4iuS4quW3peWFtwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlbXBIYW5kPWZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoYW5nZUN1cnNvcihzZWxmLnNlbGVjdGVkVG9vbCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLG1vdmVIYW5kbGVyLHRydWUpOwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLG1vdXNldXBIYW5kbGVyLHRydWUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsbW92ZUhhbmRsZXIsdHJ1ZSk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJyxtb3VzZXVwSGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcm90YXRlOmZ1bmN0aW9uKG9yaWdpbix0b3BMZWZ0KXsKCiAgICAgICAgICAgICAgICB2YXIgaW1nPXRoaXMuaW1nOwogICAgICAgICAgICAgICAgdmFyIGltZ1dpbmRvdz10aGlzLmltZ1dpbmRvdzsKCiAgICAgICAgICAgICAgICB2YXIgaVRyYW5zZm9ybT1pbWcuc3R5bGVbc3VwcG9ydC5jc3NUcmFuc2Zvcm1dLnJlcGxhY2UoL3JvdGF0ZVwoW14pXSpcKS9pLCcnKTsKCiAgICAgICAgICAgICAgICB2YXIgaW1nV2luZG93Q1M9dW5zYWZlV2luZG93LmdldENvbXB1dGVkU3R5bGUoaW1nV2luZG93KTsKICAgICAgICAgICAgICAgIHZhciBpbWdSZWN0U2l6ZT17CiAgICAgICAgICAgICAgICAgICAgaDpwYXJzZUZsb2F0KGltZ1dpbmRvd0NTLmhlaWdodCksCiAgICAgICAgICAgICAgICAgICAgdzpwYXJzZUZsb2F0KGltZ1dpbmRvd0NTLndpZHRoKSwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdmFyIHJlY3RPZmZzZXQ9ewogICAgICAgICAgICAgICAgICAgIHRvcDpwYXJzZUZsb2F0KGltZ1dpbmRvdy5zdHlsZS50b3ApLAogICAgICAgICAgICAgICAgICAgIGxlZnQ6cGFyc2VGbG9hdChpbWdXaW5kb3cuc3R5bGUubGVmdCksCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBpbWdTaXplPXsKICAgICAgICAgICAgICAgICAgICBoOmltZy5jbGllbnRIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgdzppbWcuY2xpZW50V2lkdGgsCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBpbWdPZmZzZXQ9ewogICAgICAgICAgICAgICAgICAgIHRvcDpwYXJzZUZsb2F0KGltZy5zdHlsZS50b3ApLAogICAgICAgICAgICAgICAgICAgIGxlZnQ6cGFyc2VGbG9hdChpbWcuc3R5bGUubGVmdCksCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBzZWxmPXRoaXM7CiAgICAgICAgICAgICAgICB2YXIgUEk9TWF0aC5QSTsKCiAgICAgICAgICAgICAgICB2YXIgcm90YXRlPWZ1bmN0aW9uIChyYWRpYW5zKXsKICAgICAgICAgICAgICAgICAgICBpZihzZWxmLnJvdGF0ZWRSYWRpYW5zPT1yYWRpYW5zKXJldHVybjsKICAgICAgICAgICAgICAgICAgICBpbWcuc3R5bGVbc3VwcG9ydC5jc3NUcmFuc2Zvcm1dID0gJyByb3RhdGUoJysgcmFkaWFucyArJ3JhZCkgJyArIGlUcmFuc2Zvcm07Ly/ml4vovazlm77niYcKICAgICAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZUlQb2ludGVyLnN0eWxlW3N1cHBvcnQuY3NzVHJhbnNmb3JtXT0ncm90YXRlKCcrIHJhZGlhbnMgKydyYWQpJzsvL+aXi+i9rOaMh+ekuuWZqAoKICAgICAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZWRSYWRpYW5zPXJhZGlhbnM7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRUb29sQmFkZ2UoJ3JvdGF0ZScscmFkaWFucy8oUEkvMTgwKSk7CgogICAgICAgICAgICAgICAgICAgIHZhciBhZnRlcmltZ1JlY3RTaXplPXNlbGYuZ2V0Um90YXRlZEltZ1JlY3RTaXplKCByYWRpYW5zLCBpbWdTaXplICk7CiAgICAgICAgICAgICAgICAgICAgaW1nV2luZG93LnN0eWxlLndpZHRoPWFmdGVyaW1nUmVjdFNpemUudyArJ3B4JzsKICAgICAgICAgICAgICAgICAgICBpbWdXaW5kb3cuc3R5bGUuaGVpZ2h0PWFmdGVyaW1nUmVjdFNpemUuaCArICdweCc7CgogICAgICAgICAgICAgICAgICAgIGlmKCF0b3BMZWZ0KXsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRJbWdXaW5kb3dPZmZzZXQocmVjdE9mZnNldCxpbWdSZWN0U2l6ZSxhZnRlcmltZ1JlY3RTaXplKTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldEltZ09mZnNldChpbWdPZmZzZXQsaW1nUmVjdFNpemUsYWZ0ZXJpbWdSZWN0U2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5rZWVwU2NyZWVuSW5zaWRlKCk7CiAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgICAgICBpZih0eXBlb2Ygb3JpZ2luPT0nbnVtYmVyJyl7CiAgICAgICAgICAgICAgICAgICAgcm90YXRlKG9yaWdpbik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfTsKCgogICAgICAgICAgICAgICAgdGhpcy53b3JraW5nPXRydWU7CgogICAgICAgICAgICAgICAgdmFyIGxhc3RSb3RhdGVkUmFkaWFucz10aGlzLnJvdGF0ZWRSYWRpYW5zOwogICAgICAgICAgICAgICAgdGhpcy5zaGlmdEtleVVwPXRydWU7CiAgICAgICAgICAgICAgICB2YXIgc2hpZnRSb3RhdGVTdGVwPXByZWZzLmltZ1dpbmRvdy5zaGlmdFJvdGF0ZVN0ZXAgLyAoMTgwL01hdGguUEkpOy8v6L2s5oiQ5byn5bqmCgogICAgICAgICAgICAgICAgdmFyIG1vdmVIYW5kbGVyPWZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgIHNlbGYucm90YXRlSW5kaWNhdG9yLnN0eWxlLmRpc3BsYXk9J2Jsb2NrJzsKICAgICAgICAgICAgICAgICAgICB2YXIgcmFkaWFucz1sYXN0Um90YXRlZFJhZGlhbnMgKyBNYXRoLmF0YW4yKCBlLmNsaWVudFkgLSBvcmlnaW4ueSwgZS5jbGllbnRYIC0gb3JpZ2luLnggKTsKICAgICAgICAgICAgICAgICAgICBpZihyYWRpYW5zPj0yKlBJKXsKICAgICAgICAgICAgICAgICAgICAgICAgcmFkaWFucy09MipQSTsKICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihyYWRpYW5zPDApewogICAgICAgICAgICAgICAgICAgICAgICByYWRpYW5zKz0yKlBJOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmKCFzZWxmLnNoaWZ0S2V5VXApey8v5aaC5p6c5oyJ5LiL5LqGc2hpZnTplK7vvIzpgqPkuYjmraXov5vnvKnmlL4KICAgICAgICAgICAgICAgICAgICAgICAgcmFkaWFucyAtPSByYWRpYW5zICUgc2hpZnRSb3RhdGVTdGVwOwogICAgICAgICAgICAgICAgICAgICAgICByYWRpYW5zICs9IHNoaWZ0Um90YXRlU3RlcDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJvdGF0ZShyYWRpYW5zKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdmFyIG1vdXNldXBIYW5kbGVyPWZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgc2VsZi53b3JraW5nPWZhbHNlOwogICAgICAgICAgICAgICAgICAgIHNlbGYucm90YXRlSW5kaWNhdG9yLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsbW92ZUhhbmRsZXIsdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsbW91c2V1cEhhbmRsZXIsdHJ1ZSk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsbW92ZUhhbmRsZXIsdHJ1ZSk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJyxtb3VzZXVwSGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY29udmVydFRvVmFsaWRSYWRpYW5zOmZ1bmN0aW9uKHJhZGlhbnMpewogICAgICAgICAgICAgICAgLy/ovazmiJAwLTkw55qE562J5Lu36KeS5bqm44CCCiAgICAgICAgICAgICAgICB2YXIgUEk9TWF0aC5QSTsKICAgICAgICAgICAgICAgIGlmKHJhZGlhbnMgPiBQSSl7CiAgICAgICAgICAgICAgICAgICAgcmFkaWFucyA9IDIqUEkgLSByYWRpYW5zOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmKHJhZGlhbnMgPiAxLzIqUEkpewogICAgICAgICAgICAgICAgICAgIHJhZGlhbnMgPSBQSSAtIHJhZGlhbnM7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIHJhZGlhbnM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldFJvdGF0ZWRJbWdSZWN0U2l6ZTpmdW5jdGlvbiggcmFkaWFucywgaW1nU2l6ZSApey8v6YCa6L+H5peL6L2s5ZCO55qE6KeS5bqm5ZKM5Zu+54mH55qE5aSn5bCP77yM5rGC6Jma5ouf55+p5b2i55qE5aSn5bCPCiAgICAgICAgICAgICAgICBpbWdTaXplPSBpbWdTaXplID8gaW1nU2l6ZSA6ewogICAgICAgICAgICAgICAgICAgIGg6dGhpcy5pbWcuY2xpZW50SGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIHc6dGhpcy5pbWcuY2xlbnRXaWR0aCwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgaWYodHlwZW9mIHJhZGlhbnM9PT0ndW5kZWZpbmVkJyl7CiAgICAgICAgICAgICAgICAgICAgcmFkaWFucyA9IHRoaXMucm90YXRlZFJhZGlhbnM7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHJhZGlhbnM9dGhpcy5jb252ZXJ0VG9WYWxpZFJhZGlhbnMocmFkaWFucyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBoOnRoaXMubm90RXhwb25lbnRpYWwoaW1nU2l6ZS5oKiBNYXRoLmNvcyhyYWRpYW5zKSArIGltZ1NpemUudyAqIE1hdGguc2luKHJhZGlhbnMpKSwKICAgICAgICAgICAgICAgICAgICB3OnRoaXMubm90RXhwb25lbnRpYWwoaW1nU2l6ZS5oKiBNYXRoLnNpbihyYWRpYW5zKSArIGltZ1NpemUudyAqIE1hdGguY29zKHJhZGlhbnMpKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldFJvdGF0ZWRJbWdDbGlTaXplOmZ1bmN0aW9uKHJlY3RTaXplLHJhZGlhbnMpey8v6YCa6L+H6Jma5ouf55+p5b2i55qE5aSn5bCP5ZKM5Zu+54mH55qE5peL6L2s6KeS5bqm77yM5rGC5Zu+54mH55qE5aSn5bCPCgogICAgICAgICAgICAgICAgaWYodHlwZW9mIHJhZGlhbnM9PT0ndW5kZWZpbmVkJyl7CiAgICAgICAgICAgICAgICAgICAgcmFkaWFucyA9IHRoaXMucm90YXRlZFJhZGlhbnM7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHJhZGlhbnM9dGhpcy5jb252ZXJ0VG9WYWxpZFJhZGlhbnMocmFkaWFucyk7CgogICAgICAgICAgICAgICAgaWYocmFkaWFucz09MCl7CiAgICAgICAgICAgICAgICAgICAgLy9yYWRpYW5zPU1hdGguUEkvMTgwICogMS8xMDA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlY3RTaXplOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB2YXIgaD0ocmVjdFNpemUuaC1yZWN0U2l6ZS53ICogTWF0aC50YW4ocmFkaWFucykpLyhNYXRoLmNvcyhyYWRpYW5zKS1NYXRoLnNpbihyYWRpYW5zKSpNYXRoLnRhbihyYWRpYW5zKSk7CiAgICAgICAgICAgICAgICB2YXIgdz0ocmVjdFNpemUuaCAtIGgqTWF0aC5jb3MocmFkaWFucykpL01hdGguc2luKHJhZGlhbnMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBoOmgsCiAgICAgICAgICAgICAgICAgICAgdzp3LAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldEltZ09mZnNldDpmdW5jdGlvbihvcmlPZmZzZXQsYkltZ1NpemUsYUltZ1NpemUpewogICAgICAgICAgICAgICAgdmFyIGltZ1N0eWxlPXRoaXMuaW1nLnN0eWxlOwoKICAgICAgICAgICAgICAgIC8v6YG/5YWN5Ye6546w5oyH5pWw5b2i5byP55qE5pWw5a2X5ZKM5Y2V5L2N55u45Yqg77yM5a+86Ie05Y+Y5oiQ5peg5pWI5YC8CiAgICAgICAgICAgICAgICB2YXIgdG9wPXRoaXMubm90RXhwb25lbnRpYWwob3JpT2Zmc2V0LnRvcCArIChhSW1nU2l6ZS5oLWJJbWdTaXplLmgpKjEvMikgKyAncHgnOwogICAgICAgICAgICAgICAgdmFyIGxlZnQ9dGhpcy5ub3RFeHBvbmVudGlhbChvcmlPZmZzZXQubGVmdCArIChhSW1nU2l6ZS53LWJJbWdTaXplLncpKjEvMikgICsgJ3B4JzsKICAgICAgICAgICAgICAgIGltZ1N0eWxlLnRvcD0gdG9wOwogICAgICAgICAgICAgICAgaW1nU3R5bGUubGVmdD0gbGVmdDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2V0SW1nV2luZG93T2Zmc2V0OmZ1bmN0aW9uKG9yaU9mZnNldCxiSW1nV2luZG93U2l6ZSxhSW1nV2lkbm93U2l6ZSxyYXRpbyl7CiAgICAgICAgICAgICAgICByYXRpbz0gcmF0aW8/IHJhdGlvIDoge3g6MS8yLHk6MS8yfTsKICAgICAgICAgICAgICAgIHZhciBpbWdXaW5kb3dTdHlsZT10aGlzLmltZ1dpbmRvdy5zdHlsZTsKICAgICAgICAgICAgICAgIHZhciB0b3A9b3JpT2Zmc2V0LnRvcCAtIChhSW1nV2lkbm93U2l6ZS5oLWJJbWdXaW5kb3dTaXplLmgpKnJhdGlvLnkgKyAncHgnOwogICAgICAgICAgICAgICAgdmFyIGxlZnQ9b3JpT2Zmc2V0LmxlZnQgLSAoYUltZ1dpZG5vd1NpemUudy1iSW1nV2luZG93U2l6ZS53KSpyYXRpby54ICsgJ3B4JzsKICAgICAgICAgICAgICAgIGltZ1dpbmRvd1N0eWxlLnRvcD0gdG9wOwogICAgICAgICAgICAgICAgaW1nV2luZG93U3R5bGUubGVmdD0gbGVmdDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgem9vbTpmdW5jdGlvbihlLHJhdGlvKXsvL2Xlj6/og73mmK91bmRlZmluZWQs5Y+v6IO95piv5LqL5Lu25a+56LGh77yM5Y+v6IO95piv55u05o6l55qE57yp5pS+57qn5Yir5pWw5a2XCiAgICAgICAgICAgICAgICB2YXIgaW1nV2luZG93PXRoaXMuaW1nV2luZG93OwogICAgICAgICAgICAgICAgdmFyIGltZ1dpbmRvd0NTPXVuc2FmZVdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGltZ1dpbmRvdyk7CiAgICAgICAgICAgICAgICB2YXIgaW1nUmVjdFNpemU9ewogICAgICAgICAgICAgICAgICAgIGg6cGFyc2VGbG9hdChpbWdXaW5kb3dDUy5oZWlnaHQpLAogICAgICAgICAgICAgICAgICAgIHc6cGFyc2VGbG9hdChpbWdXaW5kb3dDUy53aWR0aCksCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciByZWN0T2Zmc2V0PXsKICAgICAgICAgICAgICAgICAgICB0b3A6cGFyc2VGbG9hdChpbWdXaW5kb3cuc3R5bGUudG9wKSwKICAgICAgICAgICAgICAgICAgICBsZWZ0OnBhcnNlRmxvYXQoaW1nV2luZG93LnN0eWxlLmxlZnQpLAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB2YXIgaW1nPXRoaXMuaW1nOwogICAgICAgICAgICAgICAgdmFyIHNlbGY9dGhpczsKCiAgICAgICAgICAgICAgICB2YXIgem9vbT1mdW5jdGlvbihsZXZlbCl7Ly/nvKnmlL7liLDmjIflrprnuqfliKsKICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgbGV2ZWw9PSd1bmRlZmluZWQnIHx8IGxldmVsPDAgfHwgbGV2ZWw9PXNlbGYuem9vbUxldmVsKXJldHVybjsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFmdGVySW1nU2l6ZT17CiAgICAgICAgICAgICAgICAgICAgICAgIGg6c2VsZi5pbWdOYXR1cmFsU2l6ZS5oICogbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgIHc6c2VsZi5pbWdOYXR1cmFsU2l6ZS53ICogbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpbWcud2lkdGg9YWZ0ZXJJbWdTaXplLnc7CiAgICAgICAgICAgICAgICAgICAgaW1nLmhlaWdodD1hZnRlckltZ1NpemUuaDsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFmdGVyaW1nUmVjdFNpemU9c2VsZi5nZXRSb3RhdGVkSW1nUmVjdFNpemUoIHNlbGYucm90YXRlZFJhZGlhbnMsIGFmdGVySW1nU2l6ZSApOwogICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coYWZ0ZXJpbWdSZWN0U2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgaW1nV2luZG93LnN0eWxlLndpZHRoPWFmdGVyaW1nUmVjdFNpemUudyArJ3B4JzsKICAgICAgICAgICAgICAgICAgICBpbWdXaW5kb3cuc3R5bGUuaGVpZ2h0PWFmdGVyaW1nUmVjdFNpemUuaCArICdweCc7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRJbWdXaW5kb3dPZmZzZXQocmVjdE9mZnNldCxpbWdSZWN0U2l6ZSxhZnRlcmltZ1JlY3RTaXplLHJhdGlvKTsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldEltZ09mZnNldCh7dG9wOjAsbGVmdDowfSxhZnRlckltZ1NpemUsYWZ0ZXJpbWdSZWN0U2l6ZSk7Ly/lpoLmnpzml4vovazkuobvvIzosIPmlbTlgY/np7sKICAgICAgICAgICAgICAgICAgICBzZWxmLnpvb21MZXZlbD1sZXZlbDsKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFRvb2xCYWRnZSgnem9vbScsbGV2ZWwpOwogICAgICAgICAgICAgICAgICAgIHNlbGYua2VlcFNjcmVlbkluc2lkZSgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZih0eXBlb2YgZSE9J29iamVjdCcpewogICAgICAgICAgICAgICAgICAgIHJhdGlvPXJhdGlvPyByYXRpbyA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgeDoxLzIsCiAgICAgICAgICAgICAgICAgICAgICAgIHk6MS8yLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgem9vbShlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHRoaXMud29ya2luZz10cnVlOwoKICAgICAgICAgICAgICAgIHJhdGlvPXRoaXMuZ2V0Wm9vbVJhdGlvKHsKICAgICAgICAgICAgICAgICAgICB4OmUuY2xpZW50WCwKICAgICAgICAgICAgICAgICAgICB5OmUuY2xpZW50WSwKICAgICAgICAgICAgICAgIH0pOwoKCiAgICAgICAgICAgICAgICB2YXIgbW92ZWQ7CiAgICAgICAgICAgICAgICB2YXIgbGFzdFBhZ2VYPWUucGFnZVg7CiAgICAgICAgICAgICAgICB2YXIgY3VycmVudExldmVsPXRoaXMuem9vbUxldmVsOwogICAgICAgICAgICAgICAgdmFyIG1vdmVGaXJlZD0wOwogICAgICAgICAgICAgICAgdmFyIG1vdmVIYW5kbGVyPWZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgIG1vdmVGaXJlZCsrCiAgICAgICAgICAgICAgICAgICAgaWYobW92ZUZpcmVkIDwgMil7Ly/mnInml7blgJnngrnlh7vnmoTml7blgJnkuI3lsI/lv4PkvJrop6blj5HkuIDlj5Ftb3ZlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG1vdmVkPXRydWU7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2VYPWUucGFnZVg7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxldmVsOwogICAgICAgICAgICAgICAgICAgIGlmKHBhZ2VYID4gbGFzdFBhZ2VYKXsvL+WQkeWPs+enu++8jHpvb21pbuaJqeWkpwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoYW5nZUN1cnNvcignem9vbScsZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbD0wLjA1OwogICAgICAgICAgICAgICAgICAgIH1lbHNley8v5ZCR5bem56e777yMem9vbW91dOe8qeWwjwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoYW5nZUN1cnNvcignem9vbScsdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsPS0wLjA1OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgbGFzdFBhZ2VYPXBhZ2VYOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMZXZlbCArPSBsZXZlbDsKICAgICAgICAgICAgICAgICAgICB6b29tKGN1cnJlbnRMZXZlbCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHZhciBtb3VzZXVwSGFuZGxlcj1mdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICBzZWxmLndvcmtpbmc9ZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxtb3ZlSGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJyxtb3VzZXVwSGFuZGxlcix0cnVlKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGxldmVsPXNlbGYuZ2V0TmV4dFpvb21MZXZlbCgpOwoKICAgICAgICAgICAgICAgICAgICBpZihzZWxmLnpvb21PdXQgJiYgc2VsZi5hbHRLZXlVcCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuem9vbU91dD1mYWxzZTsKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICBpZighbW92ZWQpey8v5aaC5p6c5rKh5pyJ5bmz56e757yp5pS+44CCCiAgICAgICAgICAgICAgICAgICAgICAgIHpvb20obGV2ZWwpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhbmdlQ3Vyc29yKCd6b29tJyxzZWxmLnpvb21PdXQpOwoKICAgICAgICAgICAgICAgICAgICBpZihzZWxmLnRlbXBab29tICYmIHNlbGYuY3RybEtleVVwICYmIHNlbGYuYWx0S2V5VXApewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlbXBab29tPWZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoYW5nZUN1cnNvcihzZWxmLnNlbGVjdGVkVG9vbCk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsbW92ZUhhbmRsZXIsdHJ1ZSk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJyxtb3VzZXVwSGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZ2V0TmV4dFpvb21MZXZlbDpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIGxldmVsOwogICAgICAgICAgICAgICAgdmFyIHNlbGY9dGhpczsKICAgICAgICAgICAgICAgIGlmKHRoaXMuem9vbU91dCl7Ly/nvKnlsI8KICAgICAgICAgICAgICAgICAgICBJbWdXaW5kb3dDLnpvb21SYW5nZVIuX2ZpbmQoZnVuY3Rpb24odmFsdWUpewogICAgICAgICAgICAgICAgICAgICAgICBpZih2YWx1ZSA8IHNlbGYuem9vbUxldmVsKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsPXZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgSW1nV2luZG93Qy56b29tUmFuZ2UuX2ZpbmQoZnVuY3Rpb24odmFsdWUpewogICAgICAgICAgICAgICAgICAgICAgICBpZih2YWx1ZSA+IHNlbGYuem9vbUxldmVsKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsPXZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWw7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldFpvb21SYXRpbzpmdW5jdGlvbihtb3VzZUNvb3IpewogICAgICAgICAgICAgICAgdmFyIGliY1JlY3Q9dGhpcy5pbWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgICAgICB2YXIgcmF0aW89ewogICAgICAgICAgICAgICAgICAgIHg6KG1vdXNlQ29vci54LWliY1JlY3QubGVmdCkvaWJjUmVjdC53aWR0aCwKICAgICAgICAgICAgICAgICAgICB5Oihtb3VzZUNvb3IueS1pYmNSZWN0LnRvcCkvaWJjUmVjdC5oZWlnaHQsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYocmF0aW8ueDwwKXsKICAgICAgICAgICAgICAgICAgICByYXRpby54PTAKICAgICAgICAgICAgICAgIH1lbHNlIGlmKHJhdGlvLng+MSl7CiAgICAgICAgICAgICAgICAgICAgcmF0aW8ueD0xCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYocmF0aW8ueTwwKXsKICAgICAgICAgICAgICAgICAgICByYXRpby55PTAKICAgICAgICAgICAgICAgIH1lbHNlIGlmKHJhdGlvLnk+MSl7CiAgICAgICAgICAgICAgICAgICAgcmF0aW8ueT0xCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIHJhdGlvOwogICAgICAgICAgICB9LAogICAgICAgICAgICBhZXJpYWxWaWV3OmZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgdGhpcy53b3JraW5nPXRydWU7CiAgICAgICAgICAgICAgICAvL+iusOS9j+eOsOWcqOeahOe8qeaUvuavlOS+iwogICAgICAgICAgICAgICAgdmFyIGNMZXZlbD10aGlzLnpvb21MZXZlbDsKCiAgICAgICAgICAgICAgICB2YXIgd1NpemU9Z2V0V2luZG93U2l6ZSgpOwogICAgICAgICAgICAgICAgd1NpemUuaCAtPSAxNjsKICAgICAgICAgICAgICAgIHdTaXplLncgLT0gMTY7CgogICAgICAgICAgICAgICAgdmFyIGltZ1dpbmRvdz10aGlzLmltZ1dpbmRvdzsKICAgICAgICAgICAgICAgIHZhciBpbWdXaW5kb3dDUz11bnNhZmVXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpbWdXaW5kb3cpOwogICAgICAgICAgICAgICAgdmFyIHJlY3RTaXplPXsKICAgICAgICAgICAgICAgICAgICBoOnBhcnNlRmxvYXQoaW1nV2luZG93Q1MuaGVpZ2h0KSwKICAgICAgICAgICAgICAgICAgICB3OnBhcnNlRmxvYXQoaW1nV2luZG93Q1Mud2lkdGgpLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByZWN0UmF0aW89cmVjdFNpemUuaC9yZWN0U2l6ZS53OwogICAgICAgICAgICAgICAgdmFyIHdpbmRvd1JhdGlvPXdTaXplLmgvd1NpemUudzsKCiAgICAgICAgICAgICAgICB2YXIgc2l6ZTsKICAgICAgICAgICAgICAgIHZhciByYW5nZVNpemU9e307CiAgICAgICAgICAgICAgICBpZihyZWN0UmF0aW8gPiB3aW5kb3dSYXRpbyl7CiAgICAgICAgICAgICAgICAgICAgc2l6ZT17CiAgICAgICAgICAgICAgICAgICAgICAgIGg6d1NpemUuaCwKICAgICAgICAgICAgICAgICAgICAgICAgdzp3U2l6ZS5oIC8gcmVjdFJhdGlvLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmFuZ2VTaXplLmg9TWF0aC5taW4od1NpemUuaCAqICAoc2l6ZS5oIC8gcmVjdFNpemUuaCksIHNpemUuaCk7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2VTaXplLnc9TWF0aC5taW4ocmFuZ2VTaXplLmggLyB3aW5kb3dSYXRpbyAsIHNpemUudyk7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBzaXplPXsKICAgICAgICAgICAgICAgICAgICAgICAgdzp3U2l6ZS53LAogICAgICAgICAgICAgICAgICAgICAgICBoOndTaXplLncgKiByZWN0UmF0aW8sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByYW5nZVNpemUudz1NYXRoLm1pbih3U2l6ZS53ICogIChzaXplLncgLyByZWN0U2l6ZS53KSwgc2l6ZS53KTsKICAgICAgICAgICAgICAgICAgICByYW5nZVNpemUuaD1NYXRoLm1pbihyYW5nZVNpemUudyAqIHdpbmRvd1JhdGlvICwgc2l6ZS5oKTsKICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgICAgIHRoaXMuem9vbSh0aGlzLmdldFJvdGF0ZWRJbWdDbGlTaXplKHNpemUpLncvdGhpcy5pbWdOYXR1cmFsU2l6ZS53KTsKCiAgICAgICAgICAgICAgICB0aGlzLmNlbnRlcih0cnVlLHRydWUpOwoKICAgICAgICAgICAgICAgIHRoaXMua2VlcFNjcmVlbkluc2lkZSgpOwoKICAgICAgICAgICAgICAgIHZhciB2aWV3UmFuZ2U9dGhpcy52aWV3UmFuZ2U7CiAgICAgICAgICAgICAgICB2YXIgdlJTPXZpZXdSYW5nZS5zdHlsZTsKICAgICAgICAgICAgICAgIHZSUy5kaXNwbGF5PSdibG9jayc7CiAgICAgICAgICAgICAgICB2UlMuaGVpZ2h0PXJhbmdlU2l6ZS5oICsgJ3B4JzsKICAgICAgICAgICAgICAgIHZSUy53aWR0aD1yYW5nZVNpemUudyArICdweCc7CiAgICAgICAgICAgICAgICB2UlMudG9wPTAgKyAncHgnOwogICAgICAgICAgICAgICAgdlJTLmxlZnQ9MCArICdweCc7CgoKCiAgICAgICAgICAgICAgICB2YXIgdmlld1JhbmdlUmVjdD12aWV3UmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsZWQ9Z2V0U2Nyb2xsZWQoKTsKICAgICAgICAgICAgICAgIHZhciB2aWV3UmFuZ2VDZW50ZXJDb29yPXsKICAgICAgICAgICAgICAgICAgICB4OnZpZXdSYW5nZVJlY3QubGVmdCArIHNjcm9sbGVkLnggKyAxLzIgKiByYW5nZVNpemUudywKICAgICAgICAgICAgICAgICAgICB5OnZpZXdSYW5nZVJlY3QudG9wICsgc2Nyb2xsZWQueSArIDEvMiAqIHJhbmdlU2l6ZS5oLAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB2YXIgc2VsZj10aGlzOwoKICAgICAgICAgICAgICAgIHZhciBtb3ZlUmFuZ2U9ewogICAgICAgICAgICAgICAgICAgIHg6WzgsOCtzaXplLnctcmFuZ2VTaXplLnddLAogICAgICAgICAgICAgICAgICAgIHk6WzgsOCtzaXplLmgtcmFuZ2VTaXplLmhdCiAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzZXRWaWV3UmFuZ2VQb3NpdGlvbihwYWdlWFkpewogICAgICAgICAgICAgICAgICAgIHZhciB0b3A9cGFnZVhZLnkgLSB2aWV3UmFuZ2VDZW50ZXJDb29yLnk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxlZnQ9cGFnZVhZLnggLSB2aWV3UmFuZ2VDZW50ZXJDb29yLng7CiAgICAgICAgICAgICAgICAgICAgaWYodG9wPD1tb3ZlUmFuZ2UueVswXSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHRvcD1tb3ZlUmFuZ2UueVswXTsKICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0b3A+PW1vdmVSYW5nZS55WzFdKXsKICAgICAgICAgICAgICAgICAgICAgICAgdG9wPW1vdmVSYW5nZS55WzFdOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdlJTLnRvcD0gdG9wICsgJ3B4JzsKICAgICAgICAgICAgICAgICAgICBpZihsZWZ0PD1tb3ZlUmFuZ2UueFswXSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ9bW92ZVJhbmdlLnhbMF07CiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobGVmdD49bW92ZVJhbmdlLnhbMV0pewogICAgICAgICAgICAgICAgICAgICAgICBsZWZ0PW1vdmVSYW5nZS54WzFdOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdlJTLmxlZnQ9IGxlZnQgKyAncHgnOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBzZXRWaWV3UmFuZ2VQb3NpdGlvbih7CiAgICAgICAgICAgICAgICAgICAgeDplLnBhZ2VYLAogICAgICAgICAgICAgICAgICAgIHk6ZS5wYWdlWSwKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIHZhciBtb3ZlSGFuZGxlcj1mdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICBzZXRWaWV3UmFuZ2VQb3NpdGlvbih7CiAgICAgICAgICAgICAgICAgICAgICAgIHg6ZS5wYWdlWCwKICAgICAgICAgICAgICAgICAgICAgICAgeTplLnBhZ2VZLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB2YXIgbW91c2V1cEhhbmRsZXI9ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICBzZWxmLndvcmtpbmc9ZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdmlld1JhbmdlLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogICAgICAgICAgICAgICAgICAgIHNlbGYuem9vbShjTGV2ZWwpOwogICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxlZD1nZXRTY3JvbGxlZCgpOwogICAgICAgICAgICAgICAgICAgIGltZ1dpbmRvdy5zdHlsZS50b3A9IC0xMyAtICByZWN0U2l6ZS5oICogKChwYXJzZUZsb2F0KHZSUy50b3ApIC0gbW92ZVJhbmdlLnlbMF0pL3NpemUuaCkgKyBzY3JvbGxlZC55ICsncHgnOwogICAgICAgICAgICAgICAgICAgIGltZ1dpbmRvdy5zdHlsZS5sZWZ0PSAtMTMgLSByZWN0U2l6ZS53ICogKChwYXJzZUZsb2F0KHZSUy5sZWZ0KSAtIG1vdmVSYW5nZS54WzBdKS9zaXplLncpICsgc2Nyb2xsZWQueCArJ3B4JzsKCiAgICAgICAgICAgICAgICAgICAgLy/or7TmmI7lm77niYfnmoTpq5jluqbmsqHmnInlsY/luZXpq5jvvIzlsYXkuK0KICAgICAgICAgICAgICAgICAgICAvL+ivtOaYjuWbvueJh+eahOWuveW6puayoeacieWxj+W5leWuve+8jOWxheS4rQogICAgICAgICAgICAgICAgICAgIHNlbGYuY2VudGVyKHJhbmdlU2l6ZS53ID09IHNpemUudyAsIHJhbmdlU2l6ZS5oID09IHNpemUuaCk7CgogICAgICAgICAgICAgICAgICAgIHNlbGYua2VlcFNjcmVlbkluc2lkZSgpOwoKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLG1vdmVIYW5kbGVyLHRydWUpOwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLG1vdXNldXBIYW5kbGVyLHRydWUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsbW92ZUhhbmRsZXIsdHJ1ZSk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJyxtb3VzZXVwSGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2V0VG9vbEJhZGdlOmZ1bmN0aW9uKHRvb2wsY29udGVudCl7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGU9MDsKICAgICAgICAgICAgICAgIHN3aXRjaCh0b29sKXsKICAgICAgICAgICAgICAgICAgICBjYXNlICd6b29tJzp7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlPTI7CiAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JvdGF0ZSc6ewogICAgICAgICAgICAgICAgICAgICAgICBzY2FsZT0xOwogICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OmJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGVudD10eXBlb2YgY29udGVudD09J3N0cmluZyc/IGNvbnRlbnQgOiBjb250ZW50LnRvRml4ZWQoc2NhbGUpOwogICAgICAgICAgICAgICAgdGhpcy50b29sTWFwW3Rvb2xdLm5leHRFbGVtZW50U2libGluZy50ZXh0Q29udGVudD1jb250ZW50OwogICAgICAgICAgICB9LAogICAgICAgICAgICBub3RFeHBvbmVudGlhbDpmdW5jdGlvbihudW0pey8v5LiN6KaB6L2s5Li65oyH5pWw5b2i5Yq/CiAgICAgICAgICAgICAgICBpZihudW0+MCl7CiAgICAgICAgICAgICAgICAgICAgaWYobnVtID49IDk5OTk5OTk5OTk5OTk5OTkzNDQ2Myl7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAgOTk5OTk5OTk5OTk5OTk5OTM0NDYzOwogICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKG51bSA8PSAwLjAwMDAwMSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwLjAwMDAwMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfWVsc2UgaWYobnVtIDwgMCl7CiAgICAgICAgICAgICAgICAgICAgaWYobnVtID49IC0wLjAwMDAwMSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMC4wMDAwMDE7CiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYobnVtIDw9IC05OTk5OTk5OTk5OTk5OTk5MzQ0NjMpewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTk5OTk5OTk5OTk5OTk5OTkzNDQ2MwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHJldHVybiBudW07CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBibHVyOmZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgaWYoIXRoaXMuZm9jdXNlZClyZXR1cm47CiAgICAgICAgICAgICAgICB2YXIgaW1nV2luZG93ID10aGlzLmltZ1dpbmRvdzsKICAgICAgICAgICAgICAgIC8v54K55Ye7aW1nV2lub2R355qE5aSW6YOo55qE5pe25YCZ5aSx5Y6754Sm54K5CiAgICAgICAgICAgICAgICBpZihlIT09dHJ1ZSAmJiBpbWdXaW5kb3cuY29udGFpbnMoZS50YXJnZXQpKXJldHVybjsKICAgICAgICAgICAgICAgIGltZ1dpbmRvdy5jbGFzc0xpc3QucmVtb3ZlKCdwdi1waWMtd2luZG93LWNvbnRhaW5lcl9mb2N1cycpOwogICAgICAgICAgICAgICAgdGhpcy50b29sYmFyLmNsYXNzTGlzdC5yZW1vdmUoJ3B2LXBpYy13aW5kb3ctdG9vbGJhcl9mb2N1cycpOwogICAgICAgICAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCdwdi1waWMtd2luZG93LWNsb3NlX2ZvY3VzJyk7CiAgICAgICAgICAgICAgICAvL3RoaXMuc2VhcmNoQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoJ3B2LXBpYy13aW5kb3ctc2VhcmNoX2ZvY3VzJyk7CiAgICAgICAgICAgICAgICB0aGlzLmltZy5jbGFzc0xpc3QucmVtb3ZlKCdwdi1waWMtd2luZG93LXBpY19mb2N1cycpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJyx0aGlzLl9ibHVyLHRydWUpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsdGhpcy5fZm9jdXNlZEtleWRvd24sdHJ1ZSk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsdGhpcy5fZm9jdXNlZEtleXVwLHRydWUpOwogICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDdXJzb3IoJ2RlZmF1bHQnKTsKICAgICAgICAgICAgICAgIEltZ1dpbmRvd0Muc2VsZWN0ZWRUb29sPXRoaXMuc2VsZWN0ZWRUb29sOwogICAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkPWZhbHNlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmb2N1czpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgaWYodGhpcy5mb2N1c2VkKXJldHVybjsKICAgICAgICAgICAgICAgIHRoaXMuaW1nV2luZG93LmNsYXNzTGlzdC5hZGQoJ3B2LXBpYy13aW5kb3ctY29udGFpbmVyX2ZvY3VzJyk7CiAgICAgICAgICAgICAgICB0aGlzLnRvb2xiYXIuY2xhc3NMaXN0LmFkZCgncHYtcGljLXdpbmRvdy10b29sYmFyX2ZvY3VzJyk7CiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ3B2LXBpYy13aW5kb3ctY2xvc2VfZm9jdXMnKTsKICAgICAgICAgICAgICAgIC8vdGhpcy5zZWFyY2hCdXR0b24uY2xhc3NMaXN0LmFkZCgncHYtcGljLXdpbmRvdy1zZWFyY2hfZm9jdXMnKTsKICAgICAgICAgICAgICAgIHRoaXMuaW1nLmNsYXNzTGlzdC5hZGQoJ3B2LXBpYy13aW5kb3ctcGljX2ZvY3VzJyk7CiAgICAgICAgICAgICAgICB0aGlzLmltZ1dpbmRvdy5zdHlsZS56SW5kZXg9IEltZ1dpbmRvd0Muc3R5bGVaSW5kZXg7CiAgICAgICAgICAgICAgICB0aGlzLnpJbmRleD1JbWdXaW5kb3dDLnN0eWxlWkluZGV4OwogICAgICAgICAgICAgICAgSW1nV2luZG93Qy5zdHlsZVpJbmRleCArKzsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLHRoaXMuX2ZvY3VzZWRLZXlkb3duLHRydWUpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLHRoaXMuX2ZvY3VzZWRLZXl1cCx0cnVlKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsdGhpcy5fYmx1cix0cnVlKTsKCiAgICAgICAgICAgICAgICAvL+i/mOWOn+m8oOagh+agt+W8j+OAggogICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDdXJzb3IodGhpcy5zZWxlY3RlZFRvb2wpOwoKICAgICAgICAgICAgICAgIGlmKHByZWZzLmltZ1dpbmRvdy5zeW5jU2VsZWN0ZWRUb29sICYmIEltZ1dpbmRvd0Muc2VsZWN0ZWRUb29sKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFRvb2woSW1nV2luZG93Qy5zZWxlY3RlZFRvb2wpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzZWQ9dHJ1ZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZm9jdXNlZEtleXVwOmZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgdmFyIGtleUNvZGU9ZS5rZXlDb2RlOwogICAgICAgICAgICAgICAgdmFyIHZhbGlkPVszMiwxOCwxNiw3MiwxNyw3Miw4Miw5MCw2N107CiAgICAgICAgICAgICAgICBpZih2YWxpZC5pbmRleE9mKGtleUNvZGUpPT0tMSlyZXR1cm47CgogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICAgIHN3aXRjaChrZXlDb2RlKXsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOnsvL+epuuagvOmUru+8jOS4tOaXtuWIh+aNouWIsOenu+WKqAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYWNlS2V5VXA9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXRoaXMudGVtcEhhbmQpcmV0dXJuOy8v5aaC5p6c5LmL5YmN5rKh5pyJ5Li05pe25YiH5o2i5Yiw5oqT5omL5bel5YW377yI5b2T5bey57uP5Zyo5bel5L2c55qE5pe25YCZ77yM5oyJ5LiL56m65qC85LiN5Lya5Li05pe25YiH5o2i5Yiw5oqT5omL5bel5YW377yJCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLndvcmtpbmcpey8v5p2+5byA5oyJ6ZSu55qE5pe25YCZ77yM5rKh5pyJ5Zyo57un57ut5bmz56e75LqG44CCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBIYW5kPWZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDdXJzb3IodGhpcy5zZWxlY3RlZFRvb2wpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OnsvL2FsdOmUruebmOWIh+aNoue8qeWwj+aUvuWkp+OAggogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsdEtleVVwPXRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLnpvb21PdXQpcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBpZighdGhpcy53b3JraW5nKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbU91dD1mYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQ3Vyc29yKCd6b29tJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnRlbXBab29tICYmIHRoaXMuY3RybEtleVVwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBab29tPWZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlQ3Vyc29yKHRoaXMuc2VsZWN0ZWRUb29sKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6ey8vc2hpZnTplK7vvIzml4vovaznmoTml7blgJnmjInkvY9zaGlmdOmUru+8jOatpei/m+e8qeaUvuOAggogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0S2V5VXA9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzp7Ly9jdHJs6ZSuCiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmN0cmxrZXlEb3duVGltZXIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5qdXN0Q0tleVVwKXsvL+WmguaenOWImuaJjeayoeacieadvuW8gGPvvIzop4Tpgb/liJLor43ova/ku7bnmoRjdHJsK2Pmnb7lvIAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybEtleVVwPXRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdGhpcy50ZW1wWm9vbSlyZXR1cm47Ly/lpoLmnpzmsqHmnInliIfmjaLliLDkuobnvKnmlL4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLndvcmtpbmcgJiYgdGhpcy5hbHRLZXlVcCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wWm9vbT1mYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUN1cnNvcih0aGlzLnNlbGVjdGVkVG9vbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDY3OnsvL2PplK4KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdXN0Q0tleVVwPXRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxmPXRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmp1c3RDS2V5VXBUaW1lcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanVzdENLZXlVcFRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuanVzdENLZXlVcD1mYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwxMDApCiAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzI6ey8vaOmUrgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhLZXlVcD10cnVlOwogICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDgyOnsvL3LplK4KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yS2V5VXA9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MDp7Ly966ZSuCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuektleVVwPXRydWU7CiAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6YnJlYWs7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmKFs3Miw4Miw5MF0uaW5kZXhPZihrZXlDb2RlKSE9LTEpewogICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLndvcmtpbmcgJiYgdGhpcy5yZXN0b3JlQmVmb3JlVG9vbCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZUJlZm9yZVRvb2w9ZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VG9vbCh0aGlzLmJlZm9yZVRvb2wpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmb2N1c2VkS2V5ZG93bjpmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIHZhciBrZXlDb2RlPWUua2V5Q29kZTsKICAgICAgICAgICAgICAgIHZhciB2YWxpZD1bMzIsODIsNzIsOTAsMTgsMTYsMTcsMjcsNjddOy8v5pyJ5pWI55qE5oyJ6ZSuCiAgICAgICAgICAgICAgICBpZih2YWxpZC5pbmRleE9mKGtleUNvZGUpPT0tMSkgcmV0dXJuOwoKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICBpZih0aGlzLndvcmtpbmcpey8vd29ya2luZ+eahOaXtuWAmeS5n+WPr+S7peaOpeWPl+aMieS4i3NoaWZ06ZSu77yM5Lul5L6/5peL6L2s55qE5pe25YCZ5Y+v5Lul5Lu75L2V5pe25YCZ5oyJ5LiLCiAgICAgICAgICAgICAgICAgICAgaWYoa2V5Q29kZT09MTYpey8vc2hpZnTplK4KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGlmdEtleVVwPWZhbHNlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBzd2l0Y2goa2V5Q29kZSl7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4Mjp7Ly9y6ZSuLOWIh+aNouWIsOaXi+i9rOW3peWFtwogICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnJLZXlVcCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJLZXlVcD1mYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVmb3JlVG9vbD10aGlzLnNlbGVjdGVkVG9vbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VG9vbCgncm90YXRlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNzI6ey8vaOmUrizliIfmjaLliLDmipPmiYvlt6XlhbcKICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5oS2V5VXApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oS2V5VXA9ZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZm9yZVRvb2w9dGhpcy5zZWxlY3RlZFRvb2w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFRvb2woJ2hhbmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MDp7Ly966ZSuLOWIh+aNouWIsOe8qeaUvuW3peWFtwogICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnpLZXlVcCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpLZXlVcD1mYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmVmb3JlVG9vbD10aGlzLnNlbGVjdGVkVG9vbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VG9vbCgnem9vbScpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOnsvL+epuuagvOmUrumYu+atoizkuLTml7bliIfmjaLliLDmipPmiYvlip/og70KICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5zcGFjZUtleVVwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BhY2VLZXlVcD1mYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuc2VsZWN0ZWRUb29sIT0naGFuZCcpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGVtcEhhbmQ9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUN1cnNvcignaGFuZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxODp7Ly9hbHTplK4s5Zyo5b2T5YmN6YCJ5oup5piv57yp5pS+5bel5YW355qE5pe25YCZ77yM5oyJ5LiL55qE5pe25YCZ5YiH5o2i5Yiw57yp5bCP5Yqf6IO9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuYWx0S2V5VXApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHRoaXMuc2VsZWN0ZWRUb29sIT0nem9vbScgJiYgIXRoaXMudGVtcFpvb20pIHx8IHRoaXMuem9vbU91dClyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpvb21PdXQ9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWx0S2V5VXA9ZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZUN1cnNvcignem9vbScsdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6ey8vY3RybOmUruS4tOaXtuWIh+aNouWIsOe8qeaUvuW3peWFtwogICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmN0cmxLZXlVcCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZj10aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJsa2V5RG93blRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXsvL+inhOmBv+ivjeWFuOi9r+S7tueahGN0cmwrY++8jOS4gOeerOmXtOWIh+aNouWIsOe8qeaUvueahOmXrumimAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3RybEtleVVwPWZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNlbGYuc2VsZWN0ZWRUb29sIT0nem9vbScpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlbXBab29tPXRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhbmdlQ3Vyc29yKCd6b29tJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2Nzp7Ly9j6ZSuCiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmN0cmxrZXlEb3duVGltZXIpOwogICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OnsvL2VzZeWFs+mXreeql+WPowogICAgICAgICAgICAgICAgICAgICAgICBpZihwcmVmcy5pbWdXaW5kb3cuY2xvc2UuZXNjS2V5KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6YnJlYWs7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgdG9vbGJhckV2ZW50SGFuZGxlcjpmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0PWUudGFyZ2V0OwogICAgICAgICAgICAgICAgdmFyIHRvb2xNYXA9dGhpcy50b29sTWFwOwogICAgICAgICAgICAgICAgZm9yKHZhciBpIGluIHRvb2xNYXApewogICAgICAgICAgICAgICAgICAgIGlmKHRvb2xNYXAuaGFzT3duUHJvcGVydHkoaSkgJiYgdG9vbE1hcFtpXT09dGFyZ2V0KXsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGUudHlwZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtb3VzZWRvd24nOnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFRvb2woaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkYmxjbGljayc6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGJsY2xpY2tDb21tYW5kKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGltZ1dpbmRvd0V2ZW50SGFuZGxlcjpmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICBzd2l0Y2goZS50eXBlKXsKICAgICAgICAgICAgICAgICAgICBjYXNlICdjbGljayc6ey8v6Zi75q2ib3BlcmHnmoTlm77niYfkv53lrZgKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZS5jdHJsS2V5ICYmIGUudGFyZ2V0Lm5vZGVOYW1lPT0nSU1HJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ21vdXNlZG93bic6ewogICAgICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5mb2N1c2VkKXsvL+WmguaenOayoeaciWZvY3Vz77yM5YWIZm9jdXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua2VlcFNjcmVlbkluc2lkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldD1lLnRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZS5idXR0b249PTIpey8v55Sx5LqOcm90YXRl5pe25YCZ55qE6KaG55uW5bGC6Zeu6aKY77yM5L+u5aSN5Y+z6ZSu55qE5Zu+54mH6I+c5Y2V5by55Ye6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0YXJnZXQhPXRoaXMucm90YXRlT3ZlcmxheWVyKXJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxmPXRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZU92ZXJsYXllci5zdHlsZS5kaXNwbGF5PSdub25lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cEhhbmRsZXI9ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJyx1cEhhbmRsZXIsdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJvdGF0ZU92ZXJsYXllci5zdHlsZS5kaXNwbGF5PSdibG9jayc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsdXBIYW5kbGVyLHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZS5idXR0b24hPTAgfHwgKHRhcmdldCE9dGhpcy5pbWdXaW5kb3cgJiYgdGFyZ2V0IT10aGlzLmltZyAmJiB0YXJnZXQhPXRoaXMucm90YXRlT3ZlcmxheWVyKSlyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkVG9vbD10aGlzLnNlbGVjdGVkVG9vbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy50ZW1wSGFuZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMudGVtcFpvb20pewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihzZWxlY3RlZFRvb2w9PSdoYW5kJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVCZWZvcmVUb29sPSF0aGlzLmhLZXlVcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuaEtleVVwKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsvL+m4n+eesOinhuWbvgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWVyaWFsVmlldyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHNlbGVjdGVkVG9vbD09J3JvdGF0ZScpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9yaWdpbj17Ly/ml4vovazljp/ngrkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OmUuY2xpZW50WCAtIDMwLC8v56iN5b6u5YGP5bem5LiA54K544CCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTplLmNsaWVudFkgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcklTPXRoaXMucm90YXRlSW5kaWNhdG9yLnN0eWxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ySVMuZGlzcGxheT0nYmxvY2snOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcklTLnRvcD1vcmlnaW4ueSArICdweCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBySVMubGVmdD1vcmlnaW4ueCArICdweCc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN0b3JlQmVmb3JlVG9vbD0hdGhpcy5yS2V5VXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZShvcmlnaW4pOwogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihzZWxlY3RlZFRvb2w9PSd6b29tJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3RvcmVCZWZvcmVUb29sPSF0aGlzLnpLZXlVcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnd2hlZWwnOnsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXRoaXMuZm9jdXNlZClyZXR1cm47Ly/lpoLmnpzmsqHmnIlmb2N1cwogICAgICAgICAgICAgICAgICAgICAgICBpZihlLmRlbHRhWT09PTApcmV0dXJuOy8v6Z2eWei9tOeahOa7muWKqAogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMud29ya2luZylyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmlab29tT3V0PXRoaXMuem9vbU91dDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tT3V0ID0gISEoZS5kZWx0YVkgPiAwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByYXRpbz10aGlzLmdldFpvb21SYXRpbyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OmUuY2xpZW50WCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6ZS5jbGllbnRZLAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZXZlbD10aGlzLmdldE5leHRab29tTGV2ZWwoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbShsZXZlbCxyYXRpbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbU91dD1vcmlab29tT3V0OwogICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OmJyZWFrOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGRibGNsaWNrQ29tbWFuZDpmdW5jdGlvbih0b29sKXsKICAgICAgICAgICAgICAgIHZhciBkb25lOwogICAgICAgICAgICAgICAgc3dpdGNoKHRvb2wpewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2hhbmQnOnsvL+WPjOWHu+WxheS4rSzlubbkuJTpgILlupTlsY/luZUKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tKDEpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpdFRvU2NyZWVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2VudGVyKHRydWUsdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua2VlcFNjcmVlbkluc2lkZSgpOwogICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdyb3RhdGUnOnsvL+WPjOWHu+i/mOWOn+aXi+i9rAogICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnJvdGF0ZWRSYWRpYW5zPT0wKXJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZT10cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdGF0ZSgwLHRydWUpOwogICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICd6b29tJzp7Ly/lj4zlh7vov5jljp/nvKnmlL4KICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy56b29tTGV2ZWw9PTEpcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBkb25lPXRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbSgxLHt4OjAseTowfSk7CiAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6YnJlYWs7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmKCh0b29sPT0ncm90YXRlJyB8fCB0b29sPT0nem9vbScpICYmIGRvbmUpewogICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxlZD1nZXRTY3JvbGxlZCgpOwogICAgICAgICAgICAgICAgICAgIHZhciBpbWdXaW5kb3c9dGhpcy5pbWdXaW5kb3c7CiAgICAgICAgICAgICAgICAgICAgdmFyIGltZ1dpbm9kb3dSZWN0PWltZ1dpbmRvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgICAgICAgICB2YXIgaW1nV2luZG93U3R5bGU9aW1nV2luZG93LnN0eWxlOwogICAgICAgICAgICAgICAgICAgIGlmKGltZ1dpbm9kb3dSZWN0LmxlZnQ8NDApewogICAgICAgICAgICAgICAgICAgICAgICBpbWdXaW5kb3dTdHlsZS5sZWZ0PTQwICsgc2Nyb2xsZWQueCArICdweCc7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpZihpbWdXaW5vZG93UmVjdC50b3A8LTUpewogICAgICAgICAgICAgICAgICAgICAgICBpbWdXaW5kb3dTdHlsZS50b3A9LTUgKyBzY3JvbGxlZC55ICsncHgnOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5rZWVwU2NyZWVuSW5zaWRlKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZG9GbGlwQ29tbWFuZDpmdW5jdGlvbihjb21tYW5kKXsKICAgICAgICAgICAgICAgIHZhciBtYXA9ewogICAgICAgICAgICAgICAgICAgIGZ2Olsvc2NhbGVZXChbXildKlwpL2ksJyBzY2FsZVkoLTEpICddLAogICAgICAgICAgICAgICAgICAgIGZoOlsvc2NhbGVYXChbXildKlwpL2ksJyBzY2FsZVgoLTEpICddLAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB2YXIgaVRyYW5zZm9ybT10aGlzLmltZy5zdHlsZVtzdXBwb3J0LmNzc1RyYW5zZm9ybV07CgogICAgICAgICAgICAgICAgdmFyIHRvb2xDbGFzc0xpc3Q9dGhpcy50b29sTWFwW2NvbW1hbmRdLmNsYXNzTGlzdDsKCiAgICAgICAgICAgICAgICBpZihtYXBbY29tbWFuZF1bMF0udGVzdChpVHJhbnNmb3JtKSl7CiAgICAgICAgICAgICAgICAgICAgaVRyYW5zZm9ybT1pVHJhbnNmb3JtLnJlcGxhY2UobWFwW2NvbW1hbmRdWzBdLCcnKTsKICAgICAgICAgICAgICAgICAgICB0b29sQ2xhc3NMaXN0LnJlbW92ZSh0aGlzLnNlbGVjdGVkVG9vbENsYXNzKTsKICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgIGlUcmFuc2Zvcm0gKz0gbWFwW2NvbW1hbmRdWzFdOwogICAgICAgICAgICAgICAgICAgIHRvb2xDbGFzc0xpc3QuYWRkKHRoaXMuc2VsZWN0ZWRUb29sQ2xhc3MpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHRoaXMuaW1nLnN0eWxlW3N1cHBvcnQuY3NzVHJhbnNmb3JtXT1pVHJhbnNmb3JtOwoKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2VsZWN0VG9vbDpmdW5jdGlvbih0b29sKXsKICAgICAgICAgICAgICAgIHZhciBjb21tYW5kPVsnZnYnLCdmaCddOwogICAgICAgICAgICAgICAgaWYoY29tbWFuZC5pbmRleE9mKHRvb2wpPT0tMSl7Ly/lt6XlhbfpgInmi6kKICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnNlbGVjdGVkVG9vbD09dG9vbCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRvb2w9PSJyb3RhdGUiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBQST1NYXRoLlBJOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlPXRoaXMucm90YXRlZFJhZGlhbnMgKyA5MCAqIFBJLzE4MDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlPj0yKlBJKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS09MipQSTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRlKHZhbHVlLHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkVG9vbD10aGlzLnNlbGVjdGVkVG9vbDsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVG9vbD10b29sOwogICAgICAgICAgICAgICAgICAgIGlmKHRoaXMudGVtcEhhbmQgfHwgdGhpcy50ZW1wWm9vbSl7Ly/kuLTml7blt6XlhbfkuK3jgILkuI3lj5jpvKDmoIcKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRlT3ZlcmxheWVyLnN0eWxlLmRpc3BsYXk9KHRvb2w9PSdyb3RhdGUnPyAnYmxvY2snIDogJ25vbmUnKTsvL+i/meS4quimhuebluWxguaYr+S4uuS6huaNleaNieWPjOWHu+aIluiAheWNleWHu+S6i+S7tuOAggoKICAgICAgICAgICAgICAgICAgICBpZihzZWxlY3RlZFRvb2wpewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2xNYXBbc2VsZWN0ZWRUb29sXS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuc2VsZWN0ZWRUb29sQ2xhc3MpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sTWFwW3Rvb2xdLmNsYXNzTGlzdC5hZGQodGhpcy5zZWxlY3RlZFRvb2xDbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VDdXJzb3IodG9vbCk7CiAgICAgICAgICAgICAgICB9ZWxzZXsvL+WRveS7pAogICAgICAgICAgICAgICAgICAgIHRoaXMuZG9GbGlwQ29tbWFuZCh0b29sKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNoYW5nZUN1cnNvcjpmdW5jdGlvbih0b29sLHpvb21PdXQpewogICAgICAgICAgICAgICAgaWYodG9vbD09J3pvb20nKXsKICAgICAgICAgICAgICAgICAgICB0b29sKz16b29tT3V0PyAnLW91dCcgOiAnLWluJzsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZih0aGlzLmN1cnNvcj09dG9vbClyZXR1cm47CiAgICAgICAgICAgICAgICB0aGlzLmN1cnNvcj10b29sOwoKICAgICAgICAgICAgICAgIHZhciBjdXJzb3I7CgogICAgICAgICAgICAgICAgc3dpdGNoKHRvb2wpewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2hhbmQnOnsKICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yPXN1cHBvcnQuY3NzQ3Vyc29yVmFsdWUuZ3JhYiB8fCAncG9pbnRlcic7CiAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2hhbmRpbmcnOnsKICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yPXN1cHBvcnQuY3NzQ3Vyc29yVmFsdWUuZ3JhYmJpbmcgfHwgJ3BvaW50ZXInOwogICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICd6b29tLWluJzp7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcj1zdXBwb3J0LmNzc0N1cnNvclZhbHVlLnpvb21JbjsKICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnem9vbS1vdXQnOnsKICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yPXN1cHBvcnQuY3NzQ3Vyc29yVmFsdWUuem9vbU91dDsKICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAncm90YXRlJzp7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcj0ncHJvZ3Jlc3MnOwogICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdkZWZhdWx0Jzp7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcj0nJzsKICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBjdXJzb3IhPSd1bmRlZmluZWQnKXsKICAgICAgICAgICAgICAgICAgICB0aGlzLmltZ1dpbmRvdy5zdHlsZS5jdXJzb3I9Y3Vyc29yOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICByZW1vdmU6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGlmKHRoaXMucmVtb3ZlZClyZXR1cm47CiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZWQ9dHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuYmx1cih0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuaW1nLnNyYz0gcHJlZnMuaWNvbnMuYnJva2VuSW1nX3NtYWxsOy8v5aaC5p6c5Zyo5Yqg6L295Lit5Y+W5raI77yM5Zu+54mH5Lmf5Y+W5raI6K+75Y+W44CCCgogICAgICAgICAgICAgICAgdGhpcy5pbWdXaW5kb3cucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmltZ1dpbmRvdyk7CgogICAgICAgICAgICAgICAgdmFyIGluZGV4PUltZ1dpbmRvd0MuYWxsLmluZGV4T2YodGhpcyk7CiAgICAgICAgICAgICAgICBJbWdXaW5kb3dDLmFsbC5zcGxpY2UoaW5kZXgsMSk7CgogICAgICAgICAgICAgICAgLy9mb2N1cyBuZXh0CiAgICAgICAgICAgICAgICBpZihJbWdXaW5kb3dDLmFsbC5sZW5ndGg9PTApewogICAgICAgICAgICAgICAgICAgIGlmKEltZ1dpbmRvd0Mub3ZlcmxheWVyKXsKICAgICAgICAgICAgICAgICAgICAgICAgSW1nV2luZG93Qy5vdmVybGF5ZXIuc3R5bGUuZGlzcGxheT0nbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgIHZhciB0b3Btb3N0PTA7CiAgICAgICAgICAgICAgICAgICAgSW1nV2luZG93Qy5hbGwuZm9yRWFjaChmdW5jdGlvbihpd2luKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXdpbi56SW5kZXggPiB0b3Btb3N0KXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG1vc3Q9aXdpbjsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBpZih0b3Btb3N0KXsKICAgICAgICAgICAgICAgICAgICAgICAgdG9wbW9zdC5mb2N1cygpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgfSwKCiAgICAgICAgfTsKCiAgICAgICAgLy8g6L295YWl5Yqo55S7CiAgICAgICAgZnVuY3Rpb24gTG9hZGluZ0FuaW1DKGRhdGEsYnV0dG9uVHlwZSx3YWl0SW1nTG9hZCxvcGVuSW5Ub3BXaW5kb3cpewogICAgICAgICAgICB0aGlzLmFyZ3M9YXJyYXlGbi5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTsKICAgICAgICAgICAgdGhpcy5kYXRhPWRhdGE7Ly9kYXRhCiAgICAgICAgICAgIHRoaXMuYnV0dG9uVHlwZT1idXR0b25UeXBlOy8v54K55Ye755qE5oyJ6ZKu57G75Z6LCiAgICAgICAgICAgIHRoaXMub3BlbkluVG9wV2luZG93PW9wZW5JblRvcFdpbmRvdzsvL+aYr+WQpuWcqOmhtuWxgueql+WPo+aJk+W8gO+8jOWmguaenOWcqGZyYW1l6YeM6Z2i55qE6K+dCiAgICAgICAgICAgIHRoaXMud2FpdEltZ0xvYWQ9d2FpdEltZ0xvYWQ7Ly/mmK/lkKbnrYnlvoXlrozlhajor7vlj5blkI7miZPlvIAKICAgICAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgfTsKCiAgICAgICAgTG9hZGluZ0FuaW1DLmFsbD1bXTsKCiAgICAgICAgTG9hZGluZ0FuaW1DLnByb3RvdHlwZT17CiAgICAgICAgICAgIGluaXQ6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIExvYWRpbmdBbmltQy5hbGwucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkU3R5bGUoKTsKICAgICAgICAgICAgICAgIHZhciBjb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwoKICAgICAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWU9J3B2LWxvYWRpbmctY29udGFpbmVyJzsKICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0FuaW09Y29udGFpbmVyOwoKICAgICAgICAgICAgICAgIGNvbnRhaW5lci50aXRsZT1pMThuKCJsb2FkaW5nIikrJzonICsgdGhpcy5kYXRhLnNyYzsKICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUw9CiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1sb2FkaW5nLWJ1dHRvbiBwdi1sb2FkaW5nLXJldHJ5IiB0aXRsZT0i6YeN6K+VIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWxvYWRpbmctYnV0dG9uIHB2LWxvYWRpbmctY2FuY2xlIiB0aXRsZT0i5Y+W5raIIj48L3NwYW4+JzsKCiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7CgogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICB2YXIgdGNsPWUudGFyZ2V0LmNsYXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICBpZih0Y2wuY29udGFpbnMoJ3B2LWxvYWRpbmctY2FuY2xlJykpewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmltZ1JlYWR5LmFib3J0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYodGNsLmNvbnRhaW5zKCdwdi1sb2FkaW5nLXJldHJ5JykpewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9hZGluZ0FuaW1DKHNlbGYuYXJnc1swXSxzZWxmLmFyZ3NbMV0sc2VsZi5hcmdzWzJdLHNlbGYuYXJnc1szXSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sdHJ1ZSk7CgogICAgICAgICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbigpOwoKICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ1dHRvblR5cGUgPT0gJ2N1cnJlbnQnKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkSW1nKHRoaXMuZGF0YS5pbWdTcmMpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGF0YS54aHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5idXR0b25UeXBlID09ICdzZWFyY2gnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRTZWFyY2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmcm9tPTA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VhcmNoRnVuPWZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW1nQnlJbWcoc2VsZi5kYXRhLmltZ1NyYywgbnVsbCwgZnVuY3Rpb24oc3JjcywgaW5kZXgpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3JjPXNyY3Muc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXg9PTMpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkSW1nKHNyYywgc3Jjcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbT1pbmRleCsxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkSW1nKHNyYywgc3Jjcywgc2VhcmNoRnVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKCLnvZHnu5zplJnor68iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcigi5rKh5pyJ5om+5Yiw5Y6f5Zu+Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnJvbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoRnVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkSW1nKHRoaXMuZGF0YS5zcmN8fHRoaXMuZGF0YS5pbWdTcmMsIHRoaXMuZGF0YS5zcmNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHhockxvYWQubG9hZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHRoaXMuZGF0YS5zcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHI6IHRoaXMuZGF0YS54aHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYjogZnVuY3Rpb24oaW1nU3JjLCBpbWdTcmNzLCBjYXB0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltZ1NyYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRJbWcoaW1nU3JjLCBpbWdTcmNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3I6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBhZGRTdHlsZTpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgaWYoTG9hZGluZ0FuaW1DLnN0eWxlQWRkZWQpcmV0dXJuOwogICAgICAgICAgICAgICAgTG9hZGluZ0FuaW1DLnN0eWxlQWRkZWQ9dHJ1ZTsKICAgICAgICAgICAgICAgIHZhciBzdHlsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICAgICAgc3R5bGUudHlwZT0ndGV4dC9jc3MnOwogICAgICAgICAgICAgICAgc3R5bGUudGV4dENvbnRlbnQ9J1wKICAgICAgICAgICAgICAgIC5wdi1sb2FkaW5nLWNvbnRhaW5lciB7XAogICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1wKICAgICAgICAgICAgICAgIHotaW5kZXg6OTk5OTk5OTk3O1wKICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IGJsYWNrIHVybCgiJytwcmVmcy5pY29ucy5sb2FkaW5nKyciKSBjZW50ZXIgbm8tcmVwZWF0O1wKICAgICAgICAgICAgICAgIGJhY2tncm91bmQtb3JpZ2luOiBjb250ZW50LWJveDtcCiAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XAogICAgICAgICAgICAgICAgcGFkZGluZzogMXB4IDMwcHggMXB4IDJweDtcCiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XAogICAgICAgICAgICAgICAgb3BhY2l0eTogMC43O1wKICAgICAgICAgICAgICAgIGhlaWdodDogMjRweDtcCiAgICAgICAgICAgICAgICBtaW4td2lkdGg6IDI0cHg7XAogICAgICAgICAgICAgICAgYm94LXNoYWRvdzogMnB4IDJweCAwcHggIzY2NjtcCiAgICAgICAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgZWFzZS1pbi1vdXQ7XAogICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cyBlYXNlLWluLW91dDtcCiAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgLnB2LWxvYWRpbmctY29udGFpbmVyOmhvdmVyIHtcCiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjk7XAogICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgIC5wdi1sb2FkaW5nLWJ1dHRvbiB7XAogICAgICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1wKICAgICAgICAgICAgICAgIGhlaWdodDogMjRweDtcCiAgICAgICAgICAgICAgICB3aWR0aDogMjRweDtcCiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XAogICAgICAgICAgICAgICAgcmlnaHQ6IDA7XAogICAgICAgICAgICAgICAgdG9wOiAwO1wKICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNDtcCiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOnRyYW5zcGFyZW50IGNlbnRlciBuby1yZXBlYXQ7XAogICAgICAgICAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzIGVhc2UtaW4tb3V0O1wKICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xNXMgZWFzZS1pbi1vdXQ7XAogICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgIC5wdi1sb2FkaW5nLWJ1dHRvbjpob3ZlciB7XAogICAgICAgICAgICAgICAgb3BhY2l0eTogMTtcCiAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgLnB2LWxvYWRpbmctY2FuY2xle1wKICAgICAgICAgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiJytwcmVmcy5pY29ucy5sb2FkaW5nQ2FuY2xlKyciKTtcCiAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgLnB2LWxvYWRpbmctcmV0cnl7XAogICAgICAgICAgICAgICAgZGlzcGxheTpub25lO1wKICAgICAgICAgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiJytwcmVmcy5pY29ucy5yZXRyeSsnIik7XAogICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgIC5wdi1sb2FkaW5nLWNvbnRhaW5lcl9lcnJvcntcCiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7XAogICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgIC5wdi1sb2FkaW5nLWNvbnRhaW5lcl9lcnJvcjo6YWZ0ZXJ7XAogICAgICAgICAgICAgICAgY29udGVudDoiJytpMThuKCJsb2FkRXJyb3IiKSsnIjtcCiAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDogMjRweDtcCiAgICAgICAgICAgICAgICBjb2xvcjogcmVkO1wKICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcCiAgICAgICAgICAgICAgICBkaXNwbGF5OmlubGluZTtcCiAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgLnB2LWxvYWRpbmctY29udGFpbmVyX2Vycm9yIC5wdi1sb2FkaW5nLWNhbmNsZXtcCiAgICAgICAgICAgICAgICBkaXNwbGF5Om5vbmU7XAogICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgIC5wdi1sb2FkaW5nLWNvbnRhaW5lcl9lcnJvciAucHYtbG9hZGluZy1yZXRyeXtcCiAgICAgICAgICAgICAgICBkaXNwbGF5OmJsb2NrO1wKICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAnOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJlbW92ZTpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgaWYoIXRoaXMucmVtb3ZlZCl7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVkPXRydWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nQW5pbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubG9hZGluZ0FuaW0pOwogICAgICAgICAgICAgICAgICAgIExvYWRpbmdBbmltQy5hbGwuc3BsaWNlKExvYWRpbmdBbmltQy5hbGwuaW5kZXhPZih0aGlzKSwxKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVycm9yOmZ1bmN0aW9uKG1zZyxpbWcsZSl7CiAgICAgICAgICAgICAgICBpZihtc2cpY29uc29sZS5kZWJ1Zyhtc2cpOwogICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nQW5pbS5jbGFzc0xpc3QuYWRkKCdwdi1sb2FkaW5nLWNvbnRhaW5lcl9lcnJvcicpOwogICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygncGljdmlld2VyIENFIOi9veWFpeWkp+WbvumUmeivr++8miVvJywgdGhpcy5kYXRhKTsKCiAgICAgICAgICAgICAgICB2YXIgc2VsZj10aGlzOwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9LDMwMDApOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzZXRQb3NpdGlvbjpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9uPWdldENvbnRlbnRDbGllbnRSZWN0KHRoaXMuZGF0YS5pbWcpOwogICAgICAgICAgICAgICAgdmFyIGNzPXRoaXMubG9hZGluZ0FuaW0uc3R5bGU7CiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsZWQ9Z2V0U2Nyb2xsZWQoKTsKICAgICAgICAgICAgICAgIGNzLnRvcD1wb3NpdGlvbi50b3AgKyBzY3JvbGxlZC55ICsxICsgJ3B4JzsKICAgICAgICAgICAgICAgIGNzLmxlZnQ9cG9zaXRpb24ubGVmdCArIHNjcm9sbGVkLnggKzEgKyAncHgnOwogICAgICAgICAgICAgICAgY3MucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIOagueaNriBpbWdTcmMg6L295YWl5Zu+54mH77yMaW1nU3JjcyDkuLrlpIfnlKjlm77niYflnLDlnYDvvIxpbWdTcmMg5Yqg6L295aSx6LSl5aSH55SoCiAgICAgICAgICAgIGxvYWRJbWc6IGZ1bmN0aW9uKGltZ1NyYywgaW1nU3JjcywgbmV4dEZ1bikgewogICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwoKICAgICAgICAgICAgICAgIHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKICAgICAgICAgICAgICAgIGltZy5zcmMgPSBpbWdTcmM7CgogICAgICAgICAgICAgICAgdmFyIG9wdHMgPSB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW1nU3JjcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcmMgPSBpbWdTcmNzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkSW1nKHNyYywgaW1nU3JjcywgbmV4dEZ1bik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZihuZXh0RnVuKSBuZXh0RnVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugc2VsZi5lcnJvcignJywgdGhpcywgZSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgb3B0c1tzZWxmLndhaXRJbWdMb2FkID8gJ2xvYWQnIDogJ3JlYWR5J10gPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkKHRoaXMsIGUpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBzZWxmLmltZ1JlYWR5ID0gaW1nUmVhZHkoaW1nLCBvcHRzKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGxvYWQ6ZnVuY3Rpb24oaW1nLGUpewogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHRoaXMuaW1nPWltZzsKICAgICAgICAgICAgICAgIHZhciBidXR0b25UeXBlPXRoaXMuYnV0dG9uVHlwZTsKCiAgICAgICAgICAgICAgICBpZihidXR0b25UeXBlPT0nZ2FsbGVyeScpewogICAgICAgICAgICAgICAgICAgIHZhciBhbGxEYXRhPXRoaXMuZ2V0QWxsVmFsaWRJbWdzKCk7CiAgICAgICAgICAgICAgICAgICAgYWxsRGF0YS50YXJnZXQ9dGhpcy5kYXRhOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YT1hbGxEYXRhOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB2YXIgc2VsZj10aGlzOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gb3BlbkluVG9wKCl7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGE9c2VsZi5kYXRhOwoKICAgICAgICAgICAgICAgICAgICAvL+WIoOmZpOS4jeiDveWPkemAgeeahOmhueOAggogICAgICAgICAgICAgICAgICAgIHZhciBkZWxDYW50Q2xvbmU9ZnVuY3Rpb24ob2JqKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW9iailyZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmouaW1nOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgb2JqLmltZ1BBOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkoZGF0YSkpewogICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNlbnRTdWNjZXNzRGF0YT1mcmFtZVNlbnREYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNlbnREYXRhPWNsb25lT2JqZWN0KGRhdGEsdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbENhbnRDbG9uZShkYXRhLnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbihvYmopewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsQ2FudENsb25lKG9iaik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICBkZWxDYW50Q2xvbmUoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlEOm1lc3NhZ2VJRCwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjOmltZy5zcmMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6ZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDonb3BlbicsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblR5cGU6YnV0dG9uVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgdG86J3RvcCcsCiAgICAgICAgICAgICAgICAgICAgfSwnKicpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBpZih0aGlzLm9wZW5JblRvcFdpbmRvdyAmJiBpc0ZyYW1lICYmIHRvcFdpbmRvd1ZhbGlkIT09ZmFsc2UgJiYgYnV0dG9uVHlwZSE9J21hZ25pZmllcicpewogICAgICAgICAgICAgICAgICAgIGlmKHRvcFdpbmRvd1ZhbGlkKXsKICAgICAgICAgICAgICAgICAgICAgICAgb3BlbkluVG9wKCk7CiAgICAgICAgICAgICAgICAgICAgfWVsc2V7Ly/lhYjlj5Hmtojmga/pl67pl67pobblsYLnqpflj6PmmK/kuI3mmK/pnZ5mcmFtZXNldOeql+WPowogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUlEOm1lc3NhZ2VJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6J3RvcFdpbmRvd1ZhbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvOid0b3AnLAogICAgICAgICAgICAgICAgICAgICAgICB9LCcqJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwdi10b3BXaW5kb3dWYWxpZCcsZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BXaW5kb3dWYWxpZD1lLmRldGFpbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRvcFdpbmRvd1ZhbGlkKXsvL+WmguaenOmhtuWxgueql+WPo+acieaViAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5JblRvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcGVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LHRydWUpOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKCk7CiAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGdldEFsbFZhbGlkSW1nczpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIGRvYz13aW5kb3cucGFyZW50PT13aW5kb3c/ZG9jdW1lbnQ6d2luZG93LnBhcmVudC5kb2N1bWVudDsKICAgICAgICAgICAgICAgIHZhciB2YWxpZEltZ3M9W10saW1nc0hhbmRsZT1mdW5jdGlvbihpbWdzKXsKICAgICAgICAgICAgICAgICAgICBhcnJheUZuLmZvckVhY2guY2FsbChpbWdzLGZ1bmN0aW9uKGltZyxpbmRleCxpbWdzKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdD1maW5kUGljKGltZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlc3VsdCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEltZ3MucHVzaChyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGltZ3NIYW5kbGUoZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKSk7CiAgICAgICAgICAgICAgICBhcnJheUZuLmZvckVhY2guY2FsbChkb2MucXVlcnlTZWxlY3RvckFsbCgiaWZyYW1lIiksZnVuY3Rpb24oaWZyYW1lKXsKICAgICAgICAgICAgICAgICAgICBpZihpZnJhbWUuc3JjLnJlcGxhY2UoL1wvW15cL10qJC8sIiIpLmluZGV4T2YobG9jYXRpb24uaG9zdG5hbWUpIT0tMSkKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nc0hhbmRsZShpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZEltZ3M7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9wZW46ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIHN3aXRjaCh0aGlzLmJ1dHRvblR5cGUpewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2dhbGxlcnknOnsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWdhbGxlcnkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FsbGVyeT1uZXcgR2FsbGVyeUMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgZ2FsbGVyeS5sb2FkKHRoaXMuZGF0YSx0aGlzLmZyb20pOwogICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdtYWduaWZpZXInOnsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1hZ25pZmllckModGhpcy5pbWcsdGhpcy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWN0dWFsJzo7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2VhcmNoJzo7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY3VycmVudCc6OwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ29yaWdpbmFsJzp7Ly9vcmlnaW5hbCDmmK/kuLrkuoblhbzlrrnku6XliY3nmoTop4TliJkKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEltZ1dpbmRvd0ModGhpcy5pbWcsIHRoaXMuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICB9OwoKICAgICAgICAvL+W3peWFt+agjwogICAgICAgIGZ1bmN0aW9uIEZsb2F0QmFyQygpewogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICB9OwoKICAgICAgICBGbG9hdEJhckMucHJvdG90eXBlPXsKICAgICAgICAgICAgaW5pdDpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdGhpcy5hZGRTdHlsZSgpOwogICAgICAgICAgICAgICAgdmFyIGNvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgICAgICAgICBjb250YWluZXIuaWQ9J3B2LWZsb2F0LWJhci1jb250YWluZXInOwogICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTD0KICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InB2LWZsb2F0LWJhci1idXR0b24iPjwvc3Bhbj4nKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0icHYtZmxvYXQtYmFyLWJ1dHRvbiI+PC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1mbG9hdC1iYXItYnV0dG9uIj48L3NwYW4+JysKICAgICAgICAgICAgICAgICAgICAvLyc8c3BhbiBjbGFzcz0icHYtZmxvYXQtYmFyLWJ1dHRvbiI+PC9zcGFuPicrCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJwdi1mbG9hdC1iYXItYnV0dG9uIj48L3NwYW4+JzsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTsKCiAgICAgICAgICAgICAgICB2YXIgYnV0dG9ucz17CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpcy5idXR0b25zPWJ1dHRvbnM7CiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuPWNvbnRhaW5lci5jaGlsZHJlbjsKCiAgICAgICAgICAgICAgICBhcnJheUZuLmZvckVhY2guY2FsbCh0aGlzLmNoaWxkcmVuLGZ1bmN0aW9uKGNoaWxkLGluZGV4KXsKICAgICAgICAgICAgICAgICAgICB2YXIgdGl0bGVNYXA9ewogICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw6aTE4bigiYWN0dWFsQnRuIiksCiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaDppMThuKCJzZWFyY2hCdG4iKSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2FsbGVyeTppMThuKCJnYWxsZXJ5QnRuIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQ6aTE4bigiY3VycmVudEJ0biIpLAogICAgICAgICAgICAgICAgICAgICAgICBtYWduaWZpZXI6aTE4bigibWFnbmlmaWVyQnRuIiksCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uTmFtZT1wcmVmcy5mbG9hdEJhci5idXRvbk9yZGVyW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICBidXR0b25zW2J1dHRvbk5hbWVdPWNoaWxkOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLnRpdGxlPXRpdGxlTWFwW2J1dHRvbk5hbWVdOwogICAgICAgICAgICAgICAgICAgIGNoaWxkLmNsYXNzTGlzdC5hZGQoJ3B2LWZsb2F0LWJhci1idXR0b24tJyArIGJ1dHRvbk5hbWUpOwogICAgICAgICAgICAgICAgfSk7CgoKICAgICAgICAgICAgICAgIHRoaXMuZmxvYXRCYXI9Y29udGFpbmVyOwoKCiAgICAgICAgICAgICAgICB2YXIgc2VsZj10aGlzOwogICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICB2YXIgYnV0dG9uVHlwZTsKICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0PWUudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgIGZvcih2YXIgdHlwZSBpbiBidXR0b25zKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWJ1dHRvbnMuaGFzT3duUHJvcGVydHkodHlwZSkpcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBpZih0YXJnZXQ9PWJ1dHRvbnNbdHlwZV0pewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uVHlwZT10eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpZighYnV0dG9uVHlwZSlyZXR1cm47CgogICAgICAgICAgICAgICAgICAgIHNlbGYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIHNlbGYub3BlbihlLGJ1dHRvblR5cGUpOwoKICAgICAgICAgICAgICAgIH0sdHJ1ZSk7CgoKICAgICAgICAgICAgICAgIGFkZEN1c01vdXNlRXZlbnQoJ21vdXNlbGVhdmUnLGNvbnRhaW5lcixmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5oaWRlVGltZXIpOwogICAgICAgICAgICAgICAgICAgIHNlbGYuaGlkZVRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfSxwcmVmcy5mbG9hdEJhci5oaWRlRGVsYXkpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgYWRkQ3VzTW91c2VFdmVudCgnbW91c2VlbnRlcicsY29udGFpbmVyLGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChzZWxmLmhpZGVUaW1lcik7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxIYW5kbGVyPXRoaXMuc2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBhZGRTdHlsZTpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgdmFyIHN0eWxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICAgICAgICAgICAgICBzdHlsZS50eXBlPSd0ZXh0L2Nzcyc7CiAgICAgICAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudD0nXAogICAgICAgICAgICAgICAgICAgICNwdi1mbG9hdC1iYXItY29udGFpbmVyIHtcCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4Ojk5OTk5OTk5OTg7XAogICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDVweDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwO1wKICAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAuNjtcCiAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDA7XAogICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UtaW4tb3V0O1wKICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZS1pbi1vdXQ7XAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6bm9uZTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAjcHYtZmxvYXQtYmFyLWNvbnRhaW5lcjpob3ZlciB7XAogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDE7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgI3B2LWZsb2F0LWJhci1jb250YWluZXIgLnB2LWZsb2F0LWJhci1idXR0b24ge1wKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7XAogICAgICAgICAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDE4cHg7XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMThweDtcCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMDtcCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOjA7XAogICAgICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1wKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XAogICAgICAgICAgICAgICAgICAgIGJveC1zaGFkb3c6IDFweCAwIDNweCAwcHggcmdiYSgwLDAsMCwwLjkpO1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCBjZW50ZXIgbm8tcmVwZWF0O1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLXNpemU6MTAwJSAxMDAlO1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLW9yaWdpbjogY29udGVudC1ib3g7XAogICAgICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogbWFyZ2luLXJpZ2h0IDAuMTVzIGVhc2UtaW4tb3V0ICwgIHdpZHRoIDAuMTVzIGVhc2UtaW4tb3V0ICwgIGhlaWdodCAwLjE1cyBlYXNlLWluLW91dCA7XAogICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IG1hcmdpbi1yaWdodCAwLjE1cyBlYXNlLWluLW91dCAsICB3aWR0aCAwLjE1cyBlYXNlLWluLW91dCAsICBoZWlnaHQgMC4xNXMgZWFzZS1pbi1vdXQgO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgICNwdi1mbG9hdC1iYXItY29udGFpbmVyIC5wdi1mbG9hdC1iYXItYnV0dG9uOm5vdCg6bGFzdC1jaGlsZCl7XAogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogLTE0cHg7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgI3B2LWZsb2F0LWJhci1jb250YWluZXIgLnB2LWZsb2F0LWJhci1idXR0b246Zmlyc3QtY2hpbGQge1wKICAgICAgICAgICAgICAgICAgICB6LWluZGV4OiA0O1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgICNwdi1mbG9hdC1iYXItY29udGFpbmVyIC5wdi1mbG9hdC1iYXItYnV0dG9uOm50aC1jaGlsZCgyKSB7XAogICAgICAgICAgICAgICAgICAgIHotaW5kZXg6IDM7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgI3B2LWZsb2F0LWJhci1jb250YWluZXIgLnB2LWZsb2F0LWJhci1idXR0b246bnRoLWNoaWxkKDMpIHtcCiAgICAgICAgICAgICAgICAgICAgei1pbmRleDogMjtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAjcHYtZmxvYXQtYmFyLWNvbnRhaW5lciAucHYtZmxvYXQtYmFyLWJ1dHRvbjpsYXN0LWNoaWxkIHtcCiAgICAgICAgICAgICAgICAgICAgei1pbmRleDogMTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAjcHYtZmxvYXQtYmFyLWNvbnRhaW5lcjpob3ZlciA+IC5wdi1mbG9hdC1iYXItYnV0dG9uIHtcCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDI0cHg7XAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMjRweDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAjcHYtZmxvYXQtYmFyLWNvbnRhaW5lcjpob3ZlciA+IC5wdi1mbG9hdC1iYXItYnV0dG9uOm5vdCg6bGFzdC1jaGlsZCkge1wKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAjcHYtZmxvYXQtYmFyLWNvbnRhaW5lciAucHYtZmxvYXQtYmFyLWJ1dHRvbi1hY3R1YWwge1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOnVybCgiJysgcHJlZnMuaWNvbnMuYWN0dWFsICsnIik7XAogICAgICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICAgICAgICAgI3B2LWZsb2F0LWJhci1jb250YWluZXIgLnB2LWZsb2F0LWJhci1idXR0b24tc2VhcmNoIHtcCiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1pbWFnZTp1cmwoIicrIHByZWZzLmljb25zLnNlYXJjaCArJyIpO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgICNwdi1mbG9hdC1iYXItY29udGFpbmVyIC5wdi1mbG9hdC1iYXItYnV0dG9uLWdhbGxlcnkge1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOnVybCgiJysgcHJlZnMuaWNvbnMuZ2FsbGVyeSArJyIpO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgICNwdi1mbG9hdC1iYXItY29udGFpbmVyIC5wdi1mbG9hdC1iYXItYnV0dG9uLWN1cnJlbnQge1wKICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOnVybCgiJysgcHJlZnMuaWNvbnMuY3VycmVudCArJyIpO1wKICAgICAgICAgICAgICAgICAgICB9XAogICAgICAgICAgICAgICAgICAgICNwdi1mbG9hdC1iYXItY29udGFpbmVyIC5wdi1mbG9hdC1iYXItYnV0dG9uLW1hZ25pZmllciB7XAogICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtaW1hZ2U6dXJsKCInKyBwcmVmcy5pY29ucy5tYWduaWZpZXIgKyciKTtcCiAgICAgICAgICAgICAgICAgICAgfVwKICAgICAgICAgICAgICAgICAgICAnOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHN0YXJ0OmZ1bmN0aW9uKGRhdGEpewoKICAgICAgICAgICAgICAgIC8v6K+75Y+W5Lit55qE5Zu+54mHLOS4jeaYvuekuua1ruWKqOagjyzosIPmlbTor7vlj5blm77moIfnmoTkvY3nva4uCiAgICAgICAgICAgICAgICBpZihMb2FkaW5nQW5pbUMuYWxsLl9maW5kKGZ1bmN0aW9uKGl0ZW0saW5kZXgsYXJyYXkpewogICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuaW1nPT1pdGVtLmRhdGEuaW1nKXsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0pKXJldHVybjsKCgogICAgICAgICAgICAgICAgLy/ooqvmlL7lpKfplZznm6/kuIrnmoTlm77niYcs5LiN6KaB5pi+56S65rWu5Yqo5qCPLgogICAgICAgICAgICAgICAgaWYoTWFnbmlmaWVyQy5hbGwuX2ZpbmQoZnVuY3Rpb24oaXRlbSxpbmRleCxhcnJheSl7CiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5pbWc9PWl0ZW0uZGF0YS5pbWcpewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSkpcmV0dXJuOwoKICAgICAgICAgICAgICAgIHRoaXMuZGF0YT1kYXRhOwogICAgICAgICAgICAgICAgdmFyIHNlbGY9dGhpczsKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmhpZGVUaW1lcik7CgogICAgICAgICAgICAgICAgdmFyIGltZ091dEhhbmRsZXI9ZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLGltZ091dEhhbmRsZXIsdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNlbGYuc2hvd1RpbWVyKTsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5oaWRlVGltZXIpOwogICAgICAgICAgICAgICAgICAgIHNlbGYuaGlkZVRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfSxwcmVmcy5mbG9hdEJhci5oaWRlRGVsYXkpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5nbG9iYXJPdXRUaW1lcik7CiAgICAgICAgICAgICAgICB0aGlzLmdsb2Jhck91dFRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXsvL+eojeW+ruW7tuaXtuOAgumUmeW8gOeUseS6jmNzcyBob3Zlcuagt+W8j+WPkeeUn+eahG91dDsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsaW1nT3V0SGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgICAgIH0sMTUwKTsKCiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zaG93VGltZXIpOwogICAgICAgICAgICAgICAgdGhpcy5zaG93VGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvdygpOwogICAgICAgICAgICAgICAgfSxwcmVmcy5mbG9hdEJhci5zaG93RGVsYXkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBzZXRCdXR0b246ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5ub0FjdHVhbCl7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5idXR0b25zWydhY3R1YWwnXS5zdHlsZS5kaXNwbGF5PSdub25lJzsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbnNbJ21hZ25pZmllciddLnN0eWxlLmRpc3BsYXk9J25vbmUnOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5idXR0b25zWydhY3R1YWwnXS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnZGlzcGxheScpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuYnV0dG9uc1snbWFnbmlmaWVyJ10uc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5pbWcubm9kZU5hbWUgIT0gJ0lNRycpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvbnNbJ2dhbGxlcnknXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgIC8vdGhpcy5idXR0b25zWydjdXJyZW50J10uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5idXR0b25zWydnYWxsZXJ5J10uc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKTsKICAgICAgICAgICAgICAgICAgICAvL3RoaXMuYnV0dG9uc1snY3VycmVudCddLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdkaXNwbGF5Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNldFBvc2l0aW9uOmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAvL+WmguaenOWbvueJh+iiq+WIoOmZpOS6hu+8jOaIluiAhemakOiXj+S6huOAggogICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhLmltZy5vZmZzZXRXaWR0aD09MCl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIHRhcmdldFBvc2k9Z2V0Q29udGVudENsaWVudFJlY3QodGhpcy5kYXRhLmltZyk7CiAgICAgICAgICAgICAgICB2YXIgd2luZG93U2l6ZT1nZXRXaW5kb3dTaXplKCk7CiAgICAgICAgICAgICAgICB2YXIgaW1nPXRoaXMuZGF0YS5pbWc7CgogICAgICAgICAgICAgICAgdmFyIGZsb2F0QmFyUG9zaT1wcmVmcy5mbG9hdEJhci5wb3NpdGlvbi50b0xvd2VyQ2FzZSgpLnNwbGl0KC9ccysvKTsKCiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0WD1wcmVmcy5mbG9hdEJhci5vZmZzZXQueDsKICAgICAgICAgICAgICAgIHZhciBvZmZzZXRZPXByZWZzLmZsb2F0QmFyLm9mZnNldC55OwoKCiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsZWQ9Z2V0U2Nyb2xsZWQoKTsKCiAgICAgICAgICAgICAgICB2YXIgZmJzPXRoaXMuZmxvYXRCYXIuc3R5bGU7CiAgICAgICAgICAgICAgICB2YXIgc2V0UG9zaXRpb249ewogICAgICAgICAgICAgICAgICAgIHRvcDpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICBmYnMub3BhY2l0eT0xOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9wPXRhcmdldFBvc2kudG9wICsgc2Nyb2xsZWQueTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYodGFyZ2V0UG9zaS50b3AgKyBvZmZzZXRZIDwgMCl7Ly/mu6HotrPlm77moIfooqvpga7kvY/nmoTmnaHku7YuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A9c2Nyb2xsZWQueTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFk9MDsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgZmJzLnRvcD10b3AgKyBvZmZzZXRZICsgJ3B4JzsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHJpZ2h0OmZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGZicy5vcGFjaXR5PTE7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByaWdodD13aW5kb3dTaXplLncgLSB0YXJnZXRQb3NpLnJpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICBpZihyaWdodCA8IG9mZnNldFgpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ9IC1zY3JvbGxlZC54OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WD0wOwogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC09c2Nyb2xsZWQueDsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgZmJzLnJpZ2h0PXJpZ2h0IC0gb2Zmc2V0WCArICdweCc7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBib3R0b206ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgZmJzLm9wYWNpdHk9MTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJvdHRvbT13aW5kb3dTaXplLmggLSB0YXJnZXRQb3NpLmJvdHRvbTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoYm90dG9tIDw9IG9mZnNldFkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tPS1zY3JvbGxlZC55OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WT0wOwogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSAtPSBzY3JvbGxlZC55OwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBmYnMuYm90dG9tPWJvdHRvbSAtIG9mZnNldFkgKyAncHgnOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbGVmdDpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICBmYnMub3BhY2l0eT0xOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdD10YXJnZXRQb3NpLmxlZnQgKyBzY3JvbGxlZC54OwogICAgICAgICAgICAgICAgICAgICAgICBpZih0YXJnZXRQb3NpLmxlZnQgKyBvZmZzZXRYIDwgMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0PXNjcm9sbGVkLng7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRYPTA7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGZicy5sZWZ0PWxlZnQgKyBvZmZzZXRYICsgJ3B4JzsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNlbnRlcjpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICBmYnMub3BhY2l0eT0xOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdD10YXJnZXRQb3NpLmxlZnQgKyBzY3JvbGxlZC54ICsgb2Zmc2V0WDsKICAgICAgICAgICAgICAgICAgICAgICAgZmJzLmxlZnQ9bGVmdCArIGltZy53aWR0aC8yICsgJ3B4JzsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGhpZGU6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgZmJzLm9wYWNpdHk9MDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBzZXRQb3NpdGlvbltmbG9hdEJhclBvc2lbMF1dKCk7CiAgICAgICAgICAgICAgICBpZihmbG9hdEJhclBvc2kubGVuZ3RoPjEpCiAgICAgICAgICAgICAgICBzZXRQb3NpdGlvbltmbG9hdEJhclBvc2lbMV1dKCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNob3c6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGlmKHRoaXMuc2V0UG9zaXRpb24oKSlyZXR1cm47CiAgICAgICAgICAgICAgICB0aGlzLnNob3duPXRydWU7CiAgICAgICAgICAgICAgICB0aGlzLnNldEJ1dHRvbigpOwogICAgICAgICAgICAgICAgdGhpcy5mbG9hdEJhci5zdHlsZS5kaXNwbGF5PSdibG9jayc7CiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5oaWRlVGltZXIpOwogICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdGhpcy5fc2Nyb2xsSGFuZGxlcix0cnVlKTsKICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLHRoaXMuX3Njcm9sbEhhbmRsZXIsdHJ1ZSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGhpZGU6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNob3dUaW1lcik7CiAgICAgICAgICAgICAgICB0aGlzLnNob3duPWZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5mbG9hdEJhci5zdHlsZS5kaXNwbGF5PSdub25lJzsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLHRoaXMuX3Njcm9sbEhhbmRsZXIsdHJ1ZSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNjcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXsvL+abtOaWsOWdkOaghwogICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsVXBkYXRlVGltZXIpOwogICAgICAgICAgICAgICAgdmFyIHNlbGY9dGhpczsKICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVXBkYXRlVGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0UG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIH0sMTAwKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb3BlbjpmdW5jdGlvbihlLGJ1dHRvblR5cGUpewogICAgICAgICAgICAgICAgdmFyIHdhaXRJbWdMb2FkID0gZSAmJiBlLmN0cmxLZXkgPyAhcHJlZnMud2FpdEltZ0xvYWQgOiBwcmVmcy53YWl0SW1nTG9hZDsgLy/mjInkvY9jdHJs5Y+W5Y+N5ZCR5YC8CiAgICAgICAgICAgICAgICB2YXIgb3BlbkluVG9wV2luZG93ID0gZSAmJiBlLnNoaWZ0S2V5ID8gIXByZWZzLmZyYW1lc1BpY09wZW5JblRvcFdpbmRvdyA6IHByZWZzLmZyYW1lc1BpY09wZW5JblRvcFdpbmRvdzsgLy/mjInkvY9zaGlmdOWPluWPjeWQkeWAvAogICAgICAgICAgICAgICAgaWYgKCF3YWl0SW1nTG9hZCAmJiBidXR0b25UeXBlID09ICdtYWduaWZpZXInICYmICFlbnZpci5jaHJvbWUpIHsgLy/pnZ5jaHJvbWXnmoRiYWNrZ3JvdW5kLWltYWdl6ZyA6KaB5YWo6YOo6L295YWl5ZCO5omN6IO95pi+56S65Ye65p2lCiAgICAgICAgICAgICAgICAgICAgd2FpdEltZ0xvYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIG5ldyBMb2FkaW5nQW5pbUModGhpcy5kYXRhLCBidXR0b25UeXBlLCB3YWl0SW1nTG9hZCwgb3BlbkluVG9wV2luZG93KTsKICAgICAgICAgICAgfSwKICAgICAgICB9OwoKICAgICAgICAvKioKICAgICAgICAqIOaPkOWPluiHqiBNb3VzZW92ZXIgUG9wdXAgSW1hZ2UgVmlld2VyIOiEmuacrO+8jOeUqOS6jiB4aHIg5pa55byP55qE6I635Y+WCiAgICAgICAgKi8KICAgICAgICAgICAgdmFyIHhockxvYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIF8gPSB7fTsKCiAgICAgICAgICAgIHZhciBjYWNoZXMgPSB7fTsKICAgICAgICAgICAgdmFyIGhhbmRsZUVycm9yOwoKICAgICAgICAgICAgLyoqCiAgICAgKiBAcGFyYW0gIHEgIOWbvueJh+eahOmAieaLqeWZqOaIluWHveaVsAogICAgICogQHBhcmFtICBjICDlm77niYfor7TmmI7nmoTpgInmi6nlmajmiJblh73mlbAKICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiBwYXJzZVBhZ2UodXJsLCBxLCBjLCBwb3N0LCBjYikgewogICAgICAgICAgICAgICAgZG93bmxvYWRQYWdlKHVybCwgcG9zdCwgZnVuY3Rpb24oaHRtbCkgewogICAgICAgICAgICAgICAgICAgIHZhciBpdXJsLCBpdXJscyA9IFtdLCBjYXAsIGRvYyA9IGNyZWF0ZURvYyhodG1sKTsKCiAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHEgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICBpdXJsID0gcShodG1sLCBkb2MpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbm9kZXMgPSBmaW5kTm9kZXMocSwgZG9jKTsKICAgICAgICAgICAgICAgICAgICAgICAgaW5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXVybHMucHVzaChmaW5kRmlsZShub2RlLCB1cmwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGl1cmwgPSBpdXJscy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIGMgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICBjYXAgPSBjKGh0bWwsIGRvYyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNub2RlcyA9IGZpbmROb2RlcyhjLCBkb2MpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXAgPSBjbm9kZXMubGVuZ3RoID8gZmluZENhcHRpb24oY25vZGVbMF0pIDogZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyDnvJPlrZgKICAgICAgICAgICAgICAgICAgICBpZiAoaXVybCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZXNbdXJsXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl1cmw6IGl1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdXJsczogaXVybHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXA6IGNhcAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY2IoaXVybCwgaXVybHMsIGNhcCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gZG93bmxvYWRQYWdlKHVybCwgcG9zdCwgY2IpIHsKICAgICAgICAgICAgICAgIHZhciBvcHRzID0gewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbihyZXEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcS5zdGF0dXMgPiAzOTkpIHRocm93ICdTZXJ2ZXIgZXJyb3I6ICcgKyByZXEuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IocmVxLnJlc3BvbnNlVGV4dCwgcmVxLmZpbmFsVXJsIHx8IHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgb25lcnJvcjogaGFuZGxlRXJyb3IKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZihwb3N0KSB7CiAgICAgICAgICAgICAgICAgICAgb3B0cy5tZXRob2QgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgb3B0cy5kYXRhID0gcG9zdDsKICAgICAgICAgICAgICAgICAgICBvcHRzLmhlYWRlcnMgPSB7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsJ1JlZmVyZXInOnVybH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3Qob3B0cyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZURvYyh0ZXh0KSB7CiAgICAgICAgICAgICAgICB2YXIgZG9jID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCdwaWNWaWV3ZXJDRScpOwogICAgICAgICAgICAgICAgZG9jLmRvY3VtZW50RWxlbWVudC5pbm5lckhUTUwgPSB0ZXh0OwogICAgICAgICAgICAgICAgcmV0dXJuIGRvYzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gZmluZE5vZGVzKHEsIGRvYykgewogICAgICAgICAgICAgICAgdmFyIG5vZGVzID0gW10sCiAgICAgICAgICAgICAgICAgICAgbm9kZTsKICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShxKSkgcSA9IFtxXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBxLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHFzKHFbaV0sIGRvYyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmRGaWxlKG4sIHVybCkgewogICAgICAgICAgICAgICAgdmFyIHBhdGggPSBuLnNyYyB8fCBuLmhyZWY7CiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aCA/IHBhdGgudHJpbSgpIDogZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmRDYXB0aW9uKG4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBuLmdldEF0dHJpYnV0ZSgnY29udGVudCcpIHx8IG4uZ2V0QXR0cmlidXRlKCd0aXRsZScpIHx8IG4udGV4dENvbnRlbnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIHFzKHMsIG4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBuLnF1ZXJ5U2VsZWN0b3Iocyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIF8ubG9hZCA9IGZ1bmN0aW9uKG9wdCkgewogICAgICAgICAgICAgICAgdmFyIGluZm8gPSBjYWNoZXNbb3B0LnVybF07CiAgICAgICAgICAgICAgICBpZiAoaW5mbykgewogICAgICAgICAgICAgICAgICAgIG9wdC5jYihpbmZvLml1cmwsIGluZm8uaXJ1bHMsIGluZm8uY2FwKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IgPSBvcHQub25lcnJvciB8fCBmdW5jdGlvbigpIHt9OwoKICAgICAgICAgICAgICAgIHBhcnNlUGFnZShvcHQudXJsLCBvcHQueGhyLnEsIG9wdC54aHIuYywgb3B0LnBvc3QsIG9wdC5jYik7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICByZXR1cm4gXzsKICAgICAgICB9KCk7CgoKICAgICAgICAvKioKICAgICAgICAgKiDlhbzlrrkgTW91c2V2ZXIgUG9wdXAgSW1hZ2UgVmlld2VyIOiEmuacrOinhOWImQogICAgICAgICAqIOinhOWImeivtOaYjuWcsOWdgO+8mmh0dHA6Ly93OXAuY28vdXNlcnNjcmlwdHMvbXBpdi9ob3N0X3J1bGVzLmh0bWwKICAgICAgICAgKi8KICAgICAgICB2YXIgTVBJViA9IChmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIHZhciBob3N0cyA9IFJ1bGUuTVBJVjsKCiAgICAgICAgICAgIHZhciBkID0gZG9jdW1lbnQsIHduID0gd2luZG93OwogICAgICAgICAgICB2YXIgY2ZnID0gewogICAgICAgICAgICAgICAgdGh1bWJzb25seTogdHJ1ZSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgLy8g5oiR5paw5Yqg55qECiAgICAgICAgICAgIHZhciByZ3hIVFRQcyA9IC9eaHR0cHM/OlwvXC8oPzp3d3dcLik/LzsKCiAgICAgICAgICAgIGZ1bmN0aW9uIGxvYWRSdWxlKCkgewogICAgICAgICAgICAgICAgdmFyIHJ1bGVzID0gUnVsZS5NUElWOwoKICAgICAgICAgICAgICAgIHZhciBpc1N0cmluZ0ZuID0gZnVuY3Rpb24oYSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYSA9PSAnc3RyaW5nJyAmJiBhLmluZGV4T2YoJ3JldHVybiAnKSA+IC0xOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBydWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGgpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZihoLnIpIGguciA9IHRvUkUoaC5yLCAnaScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZihpc1N0cmluZ0ZuKGgucykpIGgucyA9IG5ldyBGdW5jdGlvbignbScsICdub2RlJywgaC5zKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNTdHJpbmdGbihoLnEpKSBoLnEgPSBuZXcgRnVuY3Rpb24oJ3RleHQnLCAnZG9jJywgaC5xKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNTdHJpbmdGbihoLmMpKSBoLmMgPSBuZXcgRnVuY3Rpb24oJ3RleHQnLCAnZG9jJywgaC5jKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ01QSVYg6KeE5YiZ5peg5pWIOiAlbycsIGgsIGV4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICB2YXIgZmlsdGVyID0gZnVuY3Rpb24oaG4sIGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWguZCB8fCBobi5pbmRleE9mKGguZCkgPiAtMTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgaG9zdHMgPSBydWxlcy5maWx0ZXIoZmlsdGVyLmJpbmQobnVsbCwgbG9jYXRpb24uaG9zdG5hbWUpKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gaG9zdHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIGhhc0JnKG5vZGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBub2RlID8gd24uZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS5iYWNrZ3JvdW5kSW1hZ2UgIT0gJ25vbmUnICYmIG5vZGUuY2xhc3NOYW1lLmluZGV4T2YoJ1lUTFQtJykgPCAwIDogZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbDJhYnMocmVsLCBhYnMpIHsKICAgICAgICAgICAgICAgIGlmKHJlbC5pbmRleE9mKCcvLycpID09PSAwKSByZWwgPSAnaHR0cDonICsgcmVsOwogICAgICAgICAgICAgICAgdmFyIHJlID0gL14oW2Etel0rOik/XC9cLy87CiAgICAgICAgICAgICAgICBpZihyZS50ZXN0KHJlbCkpICByZXR1cm4gcmVsOwogICAgICAgICAgICAgICAgaWYoIXJlLmV4ZWMoYWJzKSkgcmV0dXJuOwogICAgICAgICAgICAgICAgaWYocmVsWzBdID09ICcvJykgcmV0dXJuIGFicy5zdWJzdHIoMCwgYWJzLmluZGV4T2YoJy8nLCBSZWdFeHAubGFzdE1hdGNoLmxlbmd0aCkpICsgcmVsOwogICAgICAgICAgICAgICAgcmV0dXJuIGFicy5zdWJzdHIoMCwgYWJzLmxhc3RJbmRleE9mKCcvJykpICsgJy8nICsgcmVsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICog5oiR5paw5aKe5LqG54m55q6K55qE5pu/5o2i5qih5byPCiAgICAgICAgICAgICAqIOinhOWIme+8mgogICAgICAgICAgICAgKiAgIHsiciI6ImhvdGltZ1xcLmNvbS9pbWFnZSIsICJzIjoiL2ltYWdlL2RpcmVjdC8ifQogICAgICAgICAgICAgKiAgIOaKiiBpbWFnZSDmm7/mjaLkuLogZGlyZWN0IO+8jOWwseaYryAucmVwbGFjZSgvaW1hZ2UvLCAiZGlyZWN0IikKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlcGxhY2UocywgbSwgciwgaHR0cCkgewogICAgICAgICAgICAgICAgaWYoIW0pIHJldHVybiBzOwoKICAgICAgICAgICAgICAgIGlmIChyICYmIHMuc3RhcnRzV2l0aCgncjsnKSkgeyAgLy8g54m55q6K55qE5pu/5o2i5qih5byPCiAgICAgICAgICAgICAgICAgICAgcyA9IG0uaW5wdXQucmVwbGFjZShyLCBzLnNsaWNlKDIpKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZihzLmluZGV4T2YoJy8nKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHZhciBtaWQgPSAvW15cXF1cLy8uZXhlYyhzKS5pbmRleCsxOwogICAgICAgICAgICAgICAgICAgIHZhciBlbmQgPSBzLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cChzLnN1YnN0cmluZygxLCBtaWQpLCBzLnN1YnN0cihlbmQrMSkpOwogICAgICAgICAgICAgICAgICAgIHMgPSBtLmlucHV0LnJlcGxhY2UocmUsIHMuc3Vic3RyaW5nKG1pZCsxLCBlbmQpKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBpID0gbS5sZW5ndGg7IGktLTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgnJCcraSwgbVtpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghcy5zdGFydHNXaXRoKCdodHRwJykgJiYgaHR0cCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBodHRwICsgczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gcmVjdChub2RlLCBxKSB7CiAgICAgICAgICAgICAgICBpZihxKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBub2RlOwogICAgICAgICAgICAgICAgICAgIHdoaWxlKHRhZyhuID0gbi5wYXJlbnROb2RlKSAhPSAnQk9EWScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYobWF0Y2hlcyhuLCBxKSkgcmV0dXJuIG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG5vZGVzID0gbm9kZS5xdWVyeVNlbGVjdG9yQWxsKCcqJyk7CiAgICAgICAgICAgICAgICBmb3IodmFyIGkgPSBub2Rlcy5sZW5ndGg7IGktLSAmJiAobiA9IG5vZGVzW2ldKTspIHsKICAgICAgICAgICAgICAgICAgICBpZihuLm9mZnNldEhlaWdodCA+IG5vZGUub2Zmc2V0SGVpZ2h0KSBub2RlID0gbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBtYXRjaGVzKG4sIHEpIHsKICAgICAgICAgICAgICAgIHZhciBwID0gRWxlbWVudC5wcm90b3R5cGUsIG0gPSBwLm1vek1hdGNoZXNTZWxlY3RvciB8fCBwLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBwLm9NYXRjaGVzU2VsZWN0b3IgfHwgcC5tYXRjaGVzU2VsZWN0b3IgfHwgcC5tYXRjaGVzOwogICAgICAgICAgICAgICAgaWYobSkgcmV0dXJuIG0uY2FsbChuLCBxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gdGFnKG4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBuICYmIG4udGFnTmFtZSAmJiBuLnRhZ05hbWUudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gcXMocywgbikgewogICAgICAgICAgICAgICAgcmV0dXJuIG4ucXVlcnlTZWxlY3RvcihzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZnVuY3Rpb24gcGFyc2VOb2RlKG5vZGUpIHsKICAgICAgICAgICAgICAgIHZhciBhLCBpbWcsIHVybCwgaW5mbzsKICAgICAgICAgICAgICAgIGlmKHRhZyhub2RlKSA9PSAnQScpIHsKICAgICAgICAgICAgICAgICAgICBhID0gbm9kZTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZihub2RlLnBhcmVudE5vZGUpewogICAgICAgICAgICAgICAgICAgIGlmKHRhZyhub2RlKSA9PSAnSU1HJykgewogICAgICAgICAgICAgICAgICAgICAgICBpbWcgPSBub2RlOwogICAgICAgICAgICAgICAgICAgICAgICBpZihpbWcuc3JjLnN1YnN0cigwLCA1KSAhPSAnZGF0YTonKSB1cmwgPSByZWwyYWJzKGltZy5zcmMsIGxvY2F0aW9uLmhyZWYpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbmZvID0gZmluZEluZm8odXJsLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICBpZihpbmZvKSByZXR1cm4gaW5mbzsKICAgICAgICAgICAgICAgICAgICBhID0gdGFnKG5vZGUucGFyZW50Tm9kZSkgPT0gJ0EnID8gbm9kZS5wYXJlbnROb2RlIDogKHRhZyhub2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZSkgPT0gJ0EnID8gbm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUgOiBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoY2ZnLnRodW1ic29ubHkgJiYgIShpbWcgfHwgcXMoJ2knLCBhKSB8fCBhLnJlbCA9PSAndGhlYXRlcicpICYmICFoYXNCZyhhKSAmJiAhaGFzQmcoYS5wYXJlbnROb2RlKSAmJiAhaGFzQmcoYS5maXJzdEVsZW1lbnRDaGlsZCkpIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB1cmwgPSBhLmdldEF0dHJpYnV0ZSgnZGF0YS1leHBhbmRlZC11cmwnKSB8fCBhLmdldEF0dHJpYnV0ZSgnZGF0YS1mdWxsLXVybCcpIHx8IGEuZ2V0QXR0cmlidXRlKCdkYXRhLXVybCcpIHx8IGEuaHJlZjsKICAgICAgICAgICAgICAgICAgICBpZih1cmwuc3Vic3RyKDAsIDUpID09ICdkYXRhOicpIHVybCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYodXJsLmluZGV4T2YoJy8vdC5jby8nKSA+IC0xKSB1cmwgPSAnaHR0cDovLycgKyBhLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgICAgIGluZm8gPSBmaW5kSW5mbyh1cmwsIGEpOwogICAgICAgICAgICAgICAgICAgIGlmKGluZm8pIHJldHVybiBpbmZvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYoaW1nKSByZXR1cm4ge3VybDppbWcuc3JjLCBub2RlOmltZywgcmVjdDpyZWN0KGltZyksIGRpc3RpbmN0OnRydWV9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBmdW5jdGlvbiBkZWNvZGVVUklDb21wb25lbnRFeCh1cmlDb21wb25lbnQpewogICAgICAgICAgICAgICAgaWYoIXVyaUNvbXBvbmVudCl7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICB1cmlDb21wb25lbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcmV0OwogICAgICAgICAgICAgICAgdHJ5ewogICAgICAgICAgICAgICAgICAgIHJldCA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmlDb21wb25lbnQpOwogICAgICAgICAgICAgICAgfWNhdGNoKGV4KXsKICAgICAgICAgICAgICAgICAgICByZXQgPSB1bmVzY2FwZSh1cmlDb21wb25lbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmRJbmZvKHVybCwgbm9kZSwgbm9IdG1sLCBza2lwSG9zdCkgewogICAgICAgICAgICAgICAgZm9yKHZhciBpID0gMCwgbGVuID0gaG9zdHMubGVuZ3RoLCB0biA9IHRhZyhub2RlKSwgaCwgbSwgaHRtbCwgdXJscywgVVJMLCBodHRwOyBpIDwgbGVuICYmIChoID0gaG9zdHNbaV0pOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZihoLmUgJiYgIW1hdGNoZXMobm9kZSwgaC5lKSB8fCBoID09IHNraXBIb3N0KSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBpZihoLnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoaC5odG1sICYmICFub0h0bWwgJiYgKHRuID09ICdBJyB8fCB0biA9PSAnSU1HJyB8fCBoLmUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighaHRtbCkgaHRtbCA9IG5vZGUub3V0ZXJIVE1MOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IGguci5leGVjKGh0bWwpCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZih1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWOu+aOieWJjemdoueahCBodHRwczovLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMID0gdXJsLnJlcGxhY2Uocmd4SFRUUHMsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHAgPSB1cmwuc2xpY2UoMCwgdXJsLmxlbmd0aCAtIFVSTC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IGguci5leGVjKFVSTCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSB1cmwgPyAvLiovLmV4ZWModXJsKSA6IFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZighbSB8fCB0biA9PSAnSU1HJyAmJiAhKCdzJyBpbiBoKSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgaWYoJ3MnIGluIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJscyA9IChBcnJheS5pc0FycmF5KGgucykgPyBoLnMgOiBbaC5zXSkubWFwKGZ1bmN0aW9uKHMpIHsgaWYodHlwZW9mIHMgPT0gJ3N0cmluZycpIHJldHVybiBkZWNvZGVVUklDb21wb25lbnRFeChyZXBsYWNlKHMsIG0sIGguciwgaHR0cCkpOyBpZih0eXBlb2YgcyA9PSAnZnVuY3Rpb24nKSByZXR1cm4gcyhtLCBub2RlKTsgcmV0dXJuIHM7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZihBcnJheS5pc0FycmF5KHVybHNbMF0pKSB1cmxzID0gdXJsc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYodXJsc1swXSA9PT0gZmFsc2UpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB1cmxzID0gdXJscy5tYXAoZnVuY3Rpb24odSkgeyByZXR1cm4gdSA/IGRlY29kZVVSSUNvbXBvbmVudEV4KHUpIDogdTsgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJscyA9IFttLmlucHV0XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYoKGguZm9sbG93ID09PSB0cnVlIHx8IHR5cGVvZiBoLmZvbGxvdyA9PSAnZnVuY3Rpb24nICYmIGguZm9sbG93KHVybHNbMF0pKSAmJiAhaC5xKSByZXR1cm4gZmluZEluZm8odXJsc1swXSwgbm9kZSwgZmFsc2UsIGgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZygnTVBJViDmib7liLDnmoTop4TliJnmmK8gJW8nLCBoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBub2RlOiBub2RlLAogICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHVybHMuc2hpZnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgdXJsczogdXJscywKICAgICAgICAgICAgICAgICAgICAgICAgcjogaC5yLAogICAgICAgICAgICAgICAgICAgICAgICBzOiBoLnMsCiAgICAgICAgICAgICAgICAgICAgICAgIHE6IGgucSwKICAgICAgICAgICAgICAgICAgICAgICAgYzogaC5jLAogICAgICAgICAgICAgICAgICAgICAgICAvLyBnOiBoLmcgPyBsb2FkR2FsbGVyeVBhcnNlcihoLmcpIDogaC5nLAogICAgICAgICAgICAgICAgICAgICAgICB4aHI6IGgueGhyLAogICAgICAgICAgICAgICAgICAgICAgICBwb3N0OiB0eXBlb2YgaC5wb3N0ID09ICdmdW5jdGlvbicgPyBoLnBvc3QobSkgOiBoLnBvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvdzogaC5mb2xsb3csCiAgICAgICAgICAgICAgICAgICAgICAgIGNzczogaC5jc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hbnVhbDogaC5tYW51YWwsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0OiBoLmRpc3RpbmN0LAogICAgICAgICAgICAgICAgICAgICAgICAvLyByZWN0OiByZWN0KG5vZGUsIGgucmVjdCkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVE9ETwogICAgICAgICAgICBmdW5jdGlvbiBydWxlc1RvU3RyaW5nKHJ1bGVzKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3UnVsZXMgPSBbXTsKCiAgICAgICAgICAgICAgICBydWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3SW5mbyA9IHt9CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PSAncicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0luZm8uciA9IGguciBpbnN0YW5jZW9mIFJlZ0V4cCA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5yLnRvU3RyaW5nKCkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBwYXJzZU5vZGU6IHBhcnNlTm9kZSwKICAgICAgICAgICAgICAgIGZpbmRJbmZvOiBmaW5kSW5mbywKICAgICAgICAgICAgICAgIGxvYWRSdWxlOiBsb2FkUnVsZSwKICAgICAgICAgICAgfQoKICAgICAgICB9KSgpOwoKICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tIHJ1biAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgIHZhciBtYXRjaGVkUnVsZSwKICAgICAgICAgICAgVVJMPWxvY2F0aW9uLmhyZWYsCiAgICAgICAgICAgIGZsb2F0QmFyOwoKICAgICAgICBmdW5jdGlvbiBmaW5kUGljKGltZyl7CiAgICAgICAgICAgIC8v6I635Y+W5YyF6KO5aW1n55qE56ys5LiA5LiqYeWFg+e0oOOAggogICAgICAgICAgICB2YXIgaW1nUE49aW1nOwogICAgICAgICAgICB2YXIgaW1nUEE7CiAgICAgICAgICAgIHdoaWxlKGltZ1BOPWltZ1BOLnBhcmVudEVsZW1lbnQpewogICAgICAgICAgICAgICAgaWYoaW1nUE4ubm9kZU5hbWU9PSdBJyl7CiAgICAgICAgICAgICAgICAgICAgaW1nUEE9aW1nUE47CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgdmFyIGlQQVNyYz1pbWdQQT8gaW1nUEEuaHJlZiA6ICcnOwogICAgICAgICAgICAvL2Jhc2U2NOWtl+espuS4sui/h+mVv+WvvOiHtOato+WImeWMuemFjeWNoeatu+a1j+iniOWZqAogICAgICAgICAgICB2YXIgYmFzZTY0SW1nPS9eZGF0YTpbXjtdKztiYXNlNjQsL2kudGVzdChpbWcuc3JjKTsKICAgICAgICAgICAgdmFyIHNyYywgIC8vIOWkp+WbvuWcsOWdgAogICAgICAgICAgICAgICAgc3JjcywgIC8vIOWkh+eUqOeahOWkp+WbvuWcsOWdgAogICAgICAgICAgICAgICAgdHlwZSwgIC8vIOexu+WIqwogICAgICAgICAgICAgICAgbm9BY3R1YWwgPSBmYWxzZSwgLy/msqHmnInljp/lm74KICAgICAgICAgICAgICAgIGltZ1NyYyA9IGltZy5zcmN8fGltZy5zcmNzZXQsICAvLyBpbWcg6IqC54K555qEIHNyYwogICAgICAgICAgICAgICAgeGhyLAogICAgICAgICAgICAgICAgZGVzY3JpcHRpb247ICAvLyDlm77niYfnmoTms6jph4oKCiAgICAgICAgICAgIGlmKCFzcmMgJiYgbWF0Y2hlZFJ1bGUgJiYgIWJhc2U2NEltZyl7Ly8g6YCa6L+H6auY57qn6KeE5YiZ6I635Y+WLgogICAgICAgICAgICAgICAgLy8g5o6S6ZmkCiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZFJ1bGUuZXhjbHVkZSAmJiBtYXRjaGVkUnVsZS5leGNsdWRlLnRlc3QoaW1nU3JjKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5ewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3U3JjPW1hdGNoZWRSdWxlLmdldEltYWdlLmNhbGwoaW1nLGltZyxpbWdQQSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGltZ1NyYyE9bmV3U3JjKSBzcmM9bmV3U3JjOwogICAgICAgICAgICAgICAgICAgIH1jYXRjaChlcnIpewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9ySW5mbyhlcnIpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYoc3JjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNyYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3MgPSBzcmM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSBzcmNzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAncnVsZSc7CiAgICAgICAgICAgICAgICAgICAgICAgIHhociA9IG1hdGNoZWRSdWxlLnhocjsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkUnVsZS5sYXp5QXR0cikgeyAgLy8g55Sx5LqO6YeH55So5LqG5bu26L+f5Yqg6L295oqA5pyv77yM5omA5Lul5Zu+54mH5Y+v6IO95Li6IGxvYWRpbmcuZ2lmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdTcmMgPSBpbWcuZ2V0QXR0cmlidXRlKG1hdGNoZWRSdWxlLmxhenlBdHRyKSB8fCBpbWcuc3JjOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZFJ1bGUuZGVzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gZ2V0RWxlbWVudE1peChtYXRjaGVkUnVsZS5kZXNjcmlwdGlvbiwgaW1nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBub2RlLmdldEF0dHJpYnV0ZSgndGl0bGUnKSB8fCBub2RlLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKCFzcmMgJiYgIWJhc2U2NEltZykgeyAvLyDlhbzlrrkgTVBJViDohJrmnKzop4TliJkKICAgICAgICAgICAgICAgIHZhciBpbmZvID0gTVBJVi5wYXJzZU5vZGUoaW1nKTsKICAgICAgICAgICAgICAgIGlmIChpbmZvICYmIGluZm8udXJsICYmIChpbmZvLnVybCAhPSBpbWdTcmMpKSB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdydWxlJzsKICAgICAgICAgICAgICAgICAgICBzcmMgPSBpbmZvLnVybDsKICAgICAgICAgICAgICAgICAgICBzcmNzID0gaW5mby51cmxzOwogICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLnEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgeGhyID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcTogaW5mby5xCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZighc3JjICYmICFiYXNlNjRJbWcpey8v6YGN5Y6G6YCa6YWN6KeE5YiZCiAgICAgICAgICAgICAgICB0cHJ1bGVzLl9maW5kKGZ1bmN0aW9uKHJ1bGUsaW5kZXgsYXJyYXkpewogICAgICAgICAgICAgICAgICAgIHRyeXsKICAgICAgICAgICAgICAgICAgICAgICAgc3JjPXJ1bGUuY2FsbChpbWcsaW1nLGltZ1BBKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3JjKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ+WMuemFjeeahOmAmumFjeinhOWImScscnVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZXJyKXsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dFcnJvckluZm8oZXJyKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZihzcmMpdHlwZT0ndHBSdWxlJzsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmKCFzcmMgJiYgaW1nUEEpey8v6ZO+5o6l5Y+v6IO95piv5LiA5byg5Zu+54mHLi4uCiAgICAgICAgICAgICAgICBpZigvXC4oPzpqcGd8anBlZ3xwbmd8Z2lmfGJtcCkoXD9bXlw/XSopPyQvaS50ZXN0KGlQQVNyYykgJiYgaVBBU3JjIT1pbWcuc3JjKXsKICAgICAgICAgICAgICAgICAgICBzcmM9aVBBU3JjOwogICAgICAgICAgICAgICAgICAgIHNyY3M9W2ltZ1NyY107CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYoc3JjKXR5cGU9J3NjYWxlJzsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBpbWdBUz17Ly/lrp7pmYXlsLrlr7jjgIIKICAgICAgICAgICAgICAgIGg6aW1nLm5hdHVyYWxIZWlnaHQsCiAgICAgICAgICAgICAgICB3OmltZy5uYXR1cmFsV2lkdGgsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmKCFzcmMgfHwgc3JjPT1pbWdTcmMpey8v5pys5Zu+54mH5piv5ZCm6KKr57yp5pS+LgogICAgICAgICAgICAgICAgbm9BY3R1YWw9dHJ1ZTsKCiAgICAgICAgICAgICAgICB2YXIgaW1nQ1N0eWxlPXVuc2FmZVdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGltZyk7CiAgICAgICAgICAgICAgICB2YXIgaW1nQ1M9ewogICAgICAgICAgICAgICAgICAgIGg6IHBhcnNlRmxvYXQoaW1nQ1N0eWxlLmhlaWdodCksCiAgICAgICAgICAgICAgICAgICAgdzogcGFyc2VGbG9hdChpbWdDU3R5bGUud2lkdGgpLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmKCEoaW1nQVMudz09aW1nQ1MudyAmJiBpbWdBUy5oPT1pbWdDUy5oKSl7Ly/lpoLmnpzkuI3mmK/kuKTogIXlrozlhajnm7jnrYks6YKj5LmI6KKr57yp5pS+5LqGLgogICAgICAgICAgICAgICAgICAgIGlmKGltZ0FTLmggPiBwcmVmcy5mbG9hdEJhci5taW5TaXplTGltaXQuaCAmJiBpbWdBUy53ID4gcHJlZnMuZmxvYXRCYXIubWluU2l6ZUxpbWl0Lncpey8v5pyA5bCP6ZmQ5a6a5Yik5patLgogICAgICAgICAgICAgICAgICAgICAgICBzcmM9aW1nU3JjOwogICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdzY2FsZSc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgaWYocHJlZnMuZmxvYXRCYXIuZm9yY2VTaG93LmVuYWJsZWQgJiYgKGltZ0NTLnc+cHJlZnMuZmxvYXRCYXIuZm9yY2VTaG93LnNpemUudyAmJiBpbWdDUy5oPnByZWZzLmZsb2F0QmFyLmZvcmNlU2hvdy5zaXplLmgpKXsKICAgICAgICAgICAgICAgICAgICAgICAgc3JjPWltZ1NyYzsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0nZm9yY2UnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmKCFzcmMpcmV0dXJuOwogICAgICAgICAgICBpZiAoaW1nQVMuaCA8IHByZWZzLmdhbGxlcnkuc2NhbGVTbWFsbFNpemUgJiYgaW1nQVMudyA8IHByZWZzLmdhbGxlcnkuc2NhbGVTbWFsbFNpemUpIHsKICAgICAgICAgICAgICAgIHR5cGUgPSAnc2NhbGVTbWFsbCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRyeXsKICAgICAgICAgICAgICAgIC8vc3JjPWRlY29kZVVSSUNvbXBvbmVudChzcmMpOwogICAgICAgICAgICB9Y2F0Y2goZSl7fQogICAgICAgICAgICBpZighc3JjcyAmJiBpbWdTcmMhPXNyYyl7CiAgICAgICAgICAgICAgICBzcmNzPVtpbWdTcmNdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZXQgPSB7CiAgICAgICAgICAgICAgICBzcmM6IHNyYywgICAgICAgICAgICAgICAgICAvLyDlvpfliLDnmoRzcmMKICAgICAgICAgICAgICAgIHNyY3M6IHNyY3MsICAgICAgICAgICAgICAgIC8vIOWkmuS4qiBzcmPvvIzlpLHotKXkuobkvJrlsJ3or5XkuIvkuIDkuKoKICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsICAgICAgICAgICAgICAgIC8vIOmAmui/h+WTquenjeaWueW8j+W+l+WIsOeahAogICAgICAgICAgICAgICAgaW1nU3JjOiBpbWdTcmMsICAgICAgICAgICAgLy8g5aSE55CG55qE5Zu+54mH55qEc3JjCiAgICAgICAgICAgICAgICBpUEFTcmM6IGlQQVNyYywgICAgICAgICAgICAvLyDlm77niYfnmoTnrKzkuIDkuKrniLZh5YWD57Sg55qE6ZO+5o6l5Zyw5Z2ACiAgICAgICAgICAgICAgICBzaXplSDppbWdBUy5oLAogICAgICAgICAgICAgICAgc2l6ZVc6aW1nQVMudywKCiAgICAgICAgICAgICAgICBub0FjdHVhbDpub0FjdHVhbCwKICAgICAgICAgICAgICAgIHhocjogeGhyLAogICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIHx8ICcnLAoKICAgICAgICAgICAgICAgIGltZzogaW1nLCAgICAgICAgICAgICAgICAgIC8vIOWkhOeQhueahOWbvueJhwogICAgICAgICAgICAgICAgaW1nUEE6IGltZ1BBLCAgICAgICAgICAgICAgLy8g5Zu+54mH55qE56ys5LiA5Liq54i2YeWFg+e0oAogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0TWF0Y2hlZFJ1bGUoKSB7CiAgICAgICAgICAgIHZhciBydWxlID0gc2l0ZUluZm8uX2ZpbmQoZnVuY3Rpb24oc2l0ZSwgaW5kZXgsIGFycmF5KSB7CiAgICAgICAgICAgICAgICBpZiAoc2l0ZS51cmwgJiYgdG9SRShzaXRlLnVybCkudGVzdChVUkwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcnVsZSA9IHJ1bGUgPyBydWxlWzBdIDogZmFsc2U7CgogICAgICAgICAgICByZXR1cm4gcnVsZTsKICAgICAgICB9CgogICAgICAgIHZhciBpc0ZyYW1lPXdpbmRvdyE9d2luZG93LnBhcmVudDsKICAgICAgICB2YXIgdG9wV2luZG93VmFsaWQ7Ly9mcmFtZXNldOeahOeql+WPo+i/meS4quagh+iusOS4umZhbHNlCiAgICAgICAgdmFyIGZyYW1lU2VudERhdGE7CiAgICAgICAgdmFyIGZyYW1lU2VudFN1Y2Nlc3NEYXRhOwogICAgICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UoZSl7IC8vIGNvbnRlbnRzY3JpcHTph4zpnaLnmoRtZXNzYWdl55uR5ZCs77yM55uR5ZCs5p2l6Ieq5Yir55qE56qX5Y+j55qE5pWw5o2u44CCCiAgICAgICAgICAgIHZhciBkYXRhPWUuZGF0YTsKICAgICAgICAgICAgaWYoICFkYXRhIHx8ICFkYXRhLm1lc3NhZ2VJRCB8fCBkYXRhLm1lc3NhZ2VJRCAhPSBtZXNzYWdlSUQgKXJldHVybjsvL+mAmuS/oUlE6K6k6K+BCiAgICAgICAgICAgIHZhciBzb3VyY2U9ZS5zb3VyY2U7CiAgICAgICAgICAgIC8vY2hyb21l5Lit5omA5pyJd2luZG9356qX5Y+j55qE5byV55So6YO95pivdW5kZWZpbmVkCiAgICAgICAgICAgIGlmKHR5cGVvZiBzb3VyY2U9PSd1bmRlZmluZWQnIHx8IHNvdXJjZSE9PXdpbmRvdyl7Ly/mnaXoh6rliKvnmoTnqpflj6MKICAgICAgICAgICAgICAgIGlmKCFpc0ZyYW1lKXsvL+mhtuWxgueql+WPowogICAgICAgICAgICAgICAgICAgIHZhciBjb21tYW5kPWRhdGEuY29tbWFuZDsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2goY29tbWFuZCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ29wZW4nOnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbWc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWcuc3JjPWRhdGEuc3JjOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1JlYWR5KGltZyx7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHk6ZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZGluZ0FuaW1DLnByb3RvdHlwZS5vcGVuLmNhbGwoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nOmltZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6ZGF0YS5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uVHlwZTpkYXRhLmJ1dHRvblR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tOmRhdGEuZnJvbSwvL+adpeiHquWTquS4queql+WPowogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbmF2aWdhdGVUb0ltZyc6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1c0V2ZW50PWRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzRXZlbnQuaW5pdEN1c3RvbUV2ZW50KCdwdi1uYXZpZ2F0ZVRvSW1nJyxmYWxzZSxmYWxzZSxkYXRhLmV4aXN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvcFdpbmRvd1ZhbGlkJzp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihkYXRhLmZyb20pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJRDptZXNzYWdlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDondG9wV2luZG93VmFsaWRfZnJhbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkOmRvY3VtZW50LmJvZHkubm9kZU5hbWUhPSdGUkFNRVNFVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG86ZGF0YS5mcm9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwnKicpOwogICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB9ZWxzZXsvL2ZyYW1l56qX5Y+jCiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1hbmQ9ZGF0YS5jb21tYW5kOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaChjb21tYW5kKXsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbmF2aWdhdGVUb0ltZyc6ewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFmcmFtZVNlbnREYXRhLnVuaXF1ZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVuaXF1ZT1HYWxsZXJ5Qy5wcm90b3R5cGUudW5pcXVlKGZyYW1lU2VudERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2VudERhdGE9dW5pcXVlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTZW50RGF0YS51bmlxdWU9dHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SW1nPWZyYW1lU2VudERhdGFbZGF0YS5pbmRleF0uaW1nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0PShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnModGFyZ2V0SW1nKSAmJiB1bnNhZmVXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXRJbWcpLmRpc3BsYXkhPSdub25lJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXhpc3QpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGdhbGxlcnkgJiYgZ2FsbGVyeS5zaG93bil7Ly9mcmFtZemHjOmdouS5n+aJk+W8gOS6huS4gOS4quWRouOAggogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYWxsZXJ5Lm1pbmltaXplKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhbGxlcnlDLnByb3RvdHlwZS5uYXZpZ2F0ZVRvSW1nKHRhcmdldEltZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXNoRWxlKHRhcmdldEltZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJRDptZXNzYWdlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDonbmF2aWdhdGVUb0ltZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3Q6ZXhpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG86ZGF0YS5mcm9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwnKicpOwogICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NlbmRGYWlsJzp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNlbnREYXRhPWZyYW1lU2VudFN1Y2Nlc3NEYXRhOy8vZnJhbWVTZW50RGF0YemHjee9ruS4uuWPkemAgeaIkOWKn+eahOaVsOaNruOAggogICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RvcFdpbmRvd1ZhbGlkX2ZyYW1lJzp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VzRXZlbnQ9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXNFdmVudC5pbml0Q3VzdG9tRXZlbnQoJ3B2LXRvcFdpbmRvd1ZhbGlkJyxmYWxzZSxmYWxzZSxkYXRhLnZhbGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLy/pobXpnaLohJrmnKznlKjmnaXovazlj5Hmtojmga8KICAgICAgICAvL+WOn+WboGNocm9tZeeahGNvbnRlbnRzY3JpcHTml6Dms5Xorr/pl67pnZ7oh6rlt7HlpJbnmoTliKvnmoTnqpflj6PjgILpg73kvJrov5Tlm551bmRlZmluZWTvvIzoh6rnhLbkuZ/ml6Dms5XlkJHlhbbku5bnmoTnqpflj6Plj5HpgIHkv6Hmga8s6L+Z6YeM55SocGFnZXNjcmlwdOWBmuS4quS4remXtOS7o+eQhgogICAgICAgIC8v6YCa6K6v6YC76L6RLi5B6aG16Z2i55qEY29udGVudHNjcmlwdOWPkemAgeWIsEHpobXpnaLnmoRwYWdlc2NyaXB077yMcGFnZXNjcmlwdOi9rOS6pOe7mULpobXpnaLnmoRjb250ZW50c2NyaXB0CiAgICAgICAgdmFyIG1lc3NhZ2VJRD0ncHYtMC41MTA2Nzk1NjcwMzEyNTk4JzsKCiAgICAgICAgZnVuY3Rpb24gYWRkUGFnZVNjcmlwdCgpIHsKCiAgICAgICAgICAgIHZhciBwYWdlU2NyaXB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgICAgICBwYWdlU2NyaXB0LmlkID0gJ3BpY3ZpZXdlci1wYWdlLXNjcmlwdCc7CgogICAgICAgICAgICB2YXIgcGFnZVNjcmlwdFRleHQ9ZnVuY3Rpb24obWVzc2FnZUlEKXsKICAgICAgICAgICAgICAgIHZhciBmcmFtZUlEPU1hdGgucmFuZG9tKCk7CiAgICAgICAgICAgICAgICB2YXIgZnJhbWVzPXsKICAgICAgICAgICAgICAgICAgICB0b3A6d2luZG93LnRvcCwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgIHZhciBkYXRhPWUuZGF0YTsKICAgICAgICAgICAgICAgICAgICBpZiggIWRhdGEgfHwgIWRhdGEubWVzc2FnZUlEIHx8IGRhdGEubWVzc2FnZUlEICE9IG1lc3NhZ2VJRCApcmV0dXJuOy8v6YCa5L+hSUTorqTor4EKICAgICAgICAgICAgICAgICAgICB2YXIgc291cmNlPWUuc291cmNlOwogICAgICAgICAgICAgICAgICAgIGlmKHNvdXJjZT09PXdpbmRvdyl7Ly/mnaXoh6pjb250ZW50c2NyaXB0LOWPkemAgeWHuuWOuyzmiJbogIXlubLlmJvjgIIKICAgICAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS50byl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZyb209ZnJhbWVJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1tkYXRhLnRvXS5wb3N0TWVzc2FnZShkYXRhLCcqJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGRhdGEuY29tbWFuZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZ2V0SWZyYW1lT2JqZWN0Jzp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmcmFtZVdpbmRvdz1mcmFtZXNbZGF0YS53aW5kb3dJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZnJhbWVzPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpZnJhbWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlmcmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldElmcmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBpPWlmcmFtZXMubGVuZ3RoLTEgOyBpPj0wIDsgaS0tKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZT1pZnJhbWVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWZyYW1lLmNvbnRlbnRXaW5kb3c9PT1mcmFtZVdpbmRvdyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SWZyYW1lPWlmcmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXNFdmVudD1kb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzRXZlbnQuaW5pdEN1c3RvbUV2ZW50KCdwdi1nZXRJZnJhbWVPYmplY3QnLGZhbHNlLGZhbHNlLHRhcmdldElmcmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoY3VzRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIH1lbHNley8v5p2l6Ieq5Yir55qE56qX5Y+j55qE77yMY29udGVudHNjcmlwdOWPr+S7peebtOaOpeaOpeaUtu+8jOi/memHjOS/neWtmOS4i+adpeiHqueahOeql+WPo+eahOW8leeUqAogICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNbZGF0YS5mcm9tXT1zb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sdHJ1ZSkKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHBhZ2VTY3JpcHQudGV4dENvbnRlbnQ9JygnICsgcGFnZVNjcmlwdFRleHQudG9TdHJpbmcoKSArICcpKCcrIEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VJRCkgKycpJzsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChwYWdlU2NyaXB0KTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNsaWtUb09wZW4oZGF0YSl7CiAgICAgICAgICAgIHZhciBwcmV2ZW50RGVmYXVsdCA9IG1hdGNoZWRSdWxlLmNsaWtUb09wZW4ucHJldmVudERlZmF1bHQ7CgogICAgICAgICAgICBmdW5jdGlvbiBtb3VzZW91dCgpewogICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLG1vdXNlb3V0LHRydWUpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLGNsaWNrLHRydWUpOwogICAgICAgICAgICAgICAgaWYoZGF0YS5pbWdQQSAmJiBwcmV2ZW50RGVmYXVsdCl7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5pbWdQQS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsY2xpY2tBLGZhbHNlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBmdW5jdGlvbiBjbGljayhlKXsKICAgICAgICAgICAgICAgIGlmKGUuYnV0dG9uIT0wKXJldHVybjsKICAgICAgICAgICAgICAgIEZsb2F0QmFyQy5wcm90b3R5cGUub3Blbi5jYWxsKHsKICAgICAgICAgICAgICAgICAgICBkYXRhOmRhdGEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSdWxlLmNsaWtUb09wZW4udHlwZSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBmdW5jdGlvbiBjbGlja0EoZSl7Ly/pmLvmraJh55qE6buY6K6k6KGM5Li6CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsY2xpY2ssdHJ1ZSk7CgogICAgICAgICAgICBpZihkYXRhLmltZ1BBICYmIHByZXZlbnREZWZhdWx0KXsKICAgICAgICAgICAgICAgIGRhdGEuaW1nUEEuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGNsaWNrQSxmYWxzZSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Ly/nqI3lvq7lu7bml7bjgILplJnlvIDnlLHkuo5jc3MgaG92ZXLmoLflvI/lj5HnlJ/nmoRvdXQ7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsbW91c2VvdXQsdHJ1ZSk7CiAgICAgICAgICAgIH0sMTAwKTsKCiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpewogICAgICAgICAgICAgICAgbW91c2VvdXQoKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIC8v55uR5ZCsIG1vdXNlb3ZlcgogICAgICAgIHZhciBjYW5jbGVQcmVDVE87CiAgICAgICAgZnVuY3Rpb24gZ2xvYmFsTW91c2VvdmVySGFuZGxlcihlKXsKCiAgICAgICAgICAgIGlmKGUuYWx0S2V5KXJldHVybjsKICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhlKTsKICAgICAgICAgICAgaWYoZ2FsbGVyeU1vZGUpcmV0dXJuOy8v5bqT5qih5byP5YWo5bGP5LitLi4uLi4uCgogICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQ7CgogICAgICAgICAgICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmNsYXNzTGlzdCB8fCB0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwdi1waWMtaWdub3JlZCcpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIOaJqeWxleaooeW8j++8jOajgOafpeWJjemdouS4gOS4quaYr+WQpuS4uiBpbWcKICAgICAgICAgICAgaWYgKHRhcmdldC5ub2RlTmFtZSAhPSAnSU1HJyAmJiBtYXRjaGVkUnVsZSAmJiBtYXRjaGVkUnVsZS5leHQpIHsKICAgICAgICAgICAgICAgIHZhciBfdHlwZSA9IHR5cGVvZiBtYXRjaGVkUnVsZS5leHQ7CiAgICAgICAgICAgICAgICBpZiAoX3R5cGUgPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1hdGNoZWRSdWxlLmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwcmV2aW91cyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucHJldmlvdXNFbGVtZW50U2libGluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwcmV2aW91cy0yJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcucHJldmlvdXNFbGVtZW50U2libGluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX3R5cGUgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG1hdGNoZWRSdWxlLmV4dCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2goZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dFcnJvckluZm8oZXgpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHJlc3VsdDsKICAgICAgICAgICAgaWYgKHRhcmdldC5ub2RlTmFtZSAhPSAnSU1HJyAmJiB0eXBlb2YgdGFyZ2V0LmNsYXNzTmFtZSA9PT0gJ3N0cmluZycgJiYgdGFyZ2V0LmNsYXNzTmFtZS5pbmRleE9mKCJwdi1mbG9hdC1iYXIiKT09LTEpewogICAgICAgICAgICAgICAgdmFyIHRhcmdldFN0eWxlPWdldENvbXB1dGVkU3R5bGUodGFyZ2V0KTsKICAgICAgICAgICAgICAgIGlmKHByZWZzLmZsb2F0QmFyLmxpc3RlbkJnICYmIHRhcmdldFN0eWxlLmJhY2tncm91bmRJbWFnZSAmJiAvXnVybC8udGVzdCh0YXJnZXRTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UpICYmIHRhcmdldFN0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mKCJhYm91dDpibGFuayIpPT0tMSAmJiB0YXJnZXRTdHlsZS53aWR0aC5yZXBsYWNlKCJweCIsIiIpPnByZWZzLmZsb2F0QmFyLm1pblNpemVMaW1pdC53ICYmIHRhcmdldFN0eWxlLmhlaWdodC5yZXBsYWNlKCJweCIsIiIpPnByZWZzLmZsb2F0QmFyLm1pblNpemVMaW1pdC5oKXsKICAgICAgICAgICAgICAgICAgICB2YXIgc3JjPXRhcmdldFN0eWxlLmJhY2tncm91bmRJbWFnZS5yZXBsYWNlKC91cmxcKFsiJ10oLiopWyInXVwpLywiJDEiKSxuc3JjPXNyYyxub0FjdHVhbD10cnVlLHR5cGU9InNjYWxlIjsKICAgICAgICAgICAgICAgICAgICB2YXIgaW1nPXtzcmM6c3JjfTsKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogbnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgaW1nU3JjOiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgIG5vQWN0dWFsOm5vQWN0dWFsLAogICAgICAgICAgICAgICAgICAgICAgICBpbWc6IHRhcmdldAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9ZWxzZSBpZih0YXJnZXQuY2hpbGRyZW4ubGVuZ3RoPD0yICYmIHRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCJpbWciKS5sZW5ndGg9PTEpewogICAgICAgICAgICAgICAgICAgIHRhcmdldD10YXJnZXQuY2hpbGRyZW5bMF07CiAgICAgICAgICAgICAgICB9ZWxzZSBpZih0YXJnZXQucGFyZW50Tm9kZSl7CiAgICAgICAgICAgICAgICAgICAgaWYodGFyZ2V0LnBhcmVudE5vZGUubm9kZU5hbWU9PSdJTUcnKXsKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PXRhcmdldC5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICBpZih1bnNhZmVXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLnBvc2l0aW9uPT0iYWJzb2x1dGUiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbWdDaGlsZD10YXJnZXQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdpbWcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGltZ0NoaWxkLmxlbmd0aD09MSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PWltZ0NoaWxkWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIXRhcmdldCB8fCAhcmVzdWx0ICYmIHRhcmdldC5ub2RlTmFtZSAhPSAnSU1HJykgcmV0dXJuOwoKICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRQaWModGFyZ2V0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYocmVzdWx0KXsKICAgICAgICAgICAgICAgIGlmKCFmbG9hdEJhcil7CiAgICAgICAgICAgICAgICAgICAgZmxvYXRCYXI9bmV3IEZsb2F0QmFyQygpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmKHJlc3VsdC50eXBlPT0ncnVsZScgJiYgbWF0Y2hlZFJ1bGUuY2xpa1RvT3BlbiAmJiBtYXRjaGVkUnVsZS5jbGlrVG9PcGVuLmVuYWJsZWQpewogICAgICAgICAgICAgICAgICAgIGlmKGNhbmNsZVByZUNUTyl7Ly/lj5bmtojkuIrmrKHnmoTvvIzpmLLmraLkuIDmrKHngrnlh7vmiZPlvIDlpJrlvKDlm77niYcKICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2xlUHJlQ1RPKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBjYW5jbGVQcmVDVE89Y2xpa1RvT3BlbihyZXN1bHQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZsb2F0QmFyLnN0YXJ0KHJlc3VsdCk7Ly/lh7rnjrDmgqzmta7lt6XlhbfmoI8KICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGlzS2V5RG93bkVmZmVjdGl2ZVRhcmdldCh0YXJnZXQpIHsKICAgICAgICAgICAgdmFyIGxvY2FsTmFtZSA9IHRhcmdldC5sb2NhbE5hbWU7CgogICAgICAgICAgICAvLyDnoa7kv53lhYnmoIfkuI3mmK/lrprkvY3lnKjmloflrZfovpPlhaXmoYbmiJbpgInmi6nmoYYKICAgICAgICAgICAgaWYgKGxvY2FsTmFtZSA9PSAndGV4dGFyZWEnIHx8IGxvY2FsTmFtZSA9PSAnaW5wdXQnIHx8IGxvY2FsTmFtZSA9PSAnc2VsZWN0JykKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgICAgIC8vIOinhumikeaSreaUvuWZqAogICAgICAgICAgICBpZiAobG9jYWxOYW1lID09ICdvYmplY3QnIHx8IGxvY2FsTmFtZSA9PSAnZW1iZWQnKQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgICAgICAgICAgLy8g55m+5bqm6LS05ZCn5Zue5aSN6L6T5YWl55qE6Zeu6aKYCiAgICAgICAgICAgIGlmICh0YXJnZXQuZ2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKSA9PSAndHJ1ZScpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG9wZW5HYWxsZXJ5KCl7CiAgICAgICAgICAgIGlmKCFnYWxsZXJ5KXsKICAgICAgICAgICAgICAgIGdhbGxlcnk9bmV3IEdhbGxlcnlDKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2FsbGVyeS5kYXRhPVtdOwogICAgICAgICAgICB2YXIgYWxsRGF0YT1nYWxsZXJ5LmdldEFsbFZhbGlkSW1ncygpOwogICAgICAgICAgICBpZihhbGxEYXRhLmxlbmd0aDwxKXJldHVybiB0cnVlOwogICAgICAgICAgICBnYWxsZXJ5LmRhdGE9YWxsRGF0YTsKICAgICAgICAgICAgZ2FsbGVyeS5sb2FkKGdhbGxlcnkuZGF0YSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBrZXlkb3duKGV2ZW50KSB7CiAgICAgICAgICAgIHZhciBrZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmtleUNvZGUpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGlmKGV2ZW50LmN0cmxLZXkgJiYga2V5PT1wcmVmcy5mbG9hdEJhci5rZXlzWydnYWxsZXJ5J10pewogICAgICAgICAgICAgICAgb3BlbkdhbGxlcnkoKTsKICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5tZXRhS2V5KQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKCiAgICAgICAgICAgICAgICBpZiAoZmxvYXRCYXIgJiYgZmxvYXRCYXIuc2hvd24gJiYgaXNLZXlEb3duRWZmZWN0aXZlVGFyZ2V0KGV2ZW50LnRhcmdldCkpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcmVmcy5mbG9hdEJhci5rZXlzKS5zb21lKGZ1bmN0aW9uKGFjdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09ICdlbmFibGUnKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gcHJlZnMuZmxvYXRCYXIua2V5c1thY3Rpb25dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdEJhci5vcGVuKG51bGwsIGFjdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG1hdGNoZWRSdWxlID0gZ2V0TWF0Y2hlZFJ1bGUoKTsKCiAgICAgICAgLy8g5re75Yqg6Ieq5a6a5LmJ5qC35byPCiAgICAgICAgaWYgKG1hdGNoZWRSdWxlICYmIG1hdGNoZWRSdWxlLmNzcykgewogICAgICAgICAgICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICBzdHlsZS50eXBlID0gJ3RleHQvY3NzJzsKICAgICAgICAgICAgc3R5bGUuaWQgPSAnZ20tcGljdmlld2VyLXNpdGUtc3R5bGUnOwogICAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9IG1hdGNoZWRSdWxlLmNzczsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7CiAgICAgICAgfQoKICAgICAgICBNUElWLmxvYWRSdWxlKCk7CgogICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlTWVzc2FnZSwgdHJ1ZSk7CgogICAgICAgIGFkZFBhZ2VTY3JpcHQoKTsKCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgZ2xvYmFsTW91c2VvdmVySGFuZGxlciwgdHJ1ZSk7CgogICAgICAgIHZhciBkZWJ1ZzsgIC8vIOiwg+ivleWHveaVsAoKICAgICAgICBHTV9jb25maWcuaW5pdCh7CiAgICAgICAgICAgIGlkOiAncHYtcHJlZnMnLAogICAgICAgICAgICB0aXRsZTogR01fY29uZmlnLmNyZWF0ZSgnYScsIHsKICAgICAgICAgICAgICAgIGhyZWY6ICdodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvMjQyMDQtcGljdmlld2VyLWNlJywKICAgICAgICAgICAgICAgIHRhcmdldDogJ19ibGFuaycsCiAgICAgICAgICAgICAgICB0ZXh0Q29udGVudDogJ1BpY3ZpZXdlciBDRSsgJytpMThuKCJjb25maWciKSwKICAgICAgICAgICAgICAgIHRpdGxlOiBpMThuKCJvcGVuSG9tZVBhZ2UiKQogICAgICAgICAgICB9KSwKICAgICAgICAgICAgaXNUYWJzOiB0cnVlLAogICAgICAgICAgICBza2luOiAndGFiJywKICAgICAgICAgICAgZnJhbWVTdHlsZTogewogICAgICAgICAgICAgICAgd2lkdGg6ICc0ODBweCcsCiAgICAgICAgICAgICAgICB6SW5kZXg6JzIxNDc0ODM2NDgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBjc3M6IFsKICAgICAgICAgICAgICAgICIjcHYtcHJlZnMgaW5wdXRbdHlwZT0ndGV4dCddIHsgd2lkdGg6IDUwcHg7IH0gIiwKICAgICAgICAgICAgICAgICIjcHYtcHJlZnMgaW5wdXRbdHlwZT0nbnVtYmVyJ10geyB3aWR0aDogNTBweDsgfSAiLAogICAgICAgICAgICAgICAgIiNwdi1wcmVmcyAuaW5saW5lIC5jb25maWdfdmFyIHsgbWFyZ2luLWxlZnQ6IDZweDsgfSIsCiAgICAgICAgICAgICAgICAiI3B2LXByZWZzIGxhYmVsLnNpemUgeyB3aWR0aDogMjA1cHg7IH0iLAogICAgICAgICAgICAgICAgIiNwdi1wcmVmcyBzcGFuLnNlcC14IHsgbWFyZ2luLWxlZnQ6IDBweCAhaW1wb3J0YW50OyB9IiwKICAgICAgICAgICAgICAgICIjcHYtcHJlZnMgbGFiZWwuc2VwLXggeyBtYXJnaW4tcmlnaHQ6IDVweDsgfSIsCiAgICAgICAgICAgICAgICAiI3B2LXByZWZzIGxhYmVsLmZsb2F0QmFyLWtleSB7IG1hcmdpbi1sZWZ0OiAyMHB4OyB3aWR0aDogMTAwcHg7IH0iLAogICAgICAgICAgICAgICAgIiNwdi1wcmVmcyBpbnB1dC5jb2xvciB7IHdpZHRoOiAxMjBweDsgfSIsCiAgICAgICAgICAgICAgICAiI3B2LXByZWZzIGlucHV0Lm9yZGVyIHsgd2lkdGg6IDI1MHB4OyB9IiwKICAgICAgICAgICAgXS5qb2luKCdcbicpLAogICAgICAgICAgICBmaWVsZHM6IHsKICAgICAgICAgICAgICAgIC8vIOa1ruWKqOW3peWFt+agjwogICAgICAgICAgICAgICAgJ2Zsb2F0QmFyLnBvc2l0aW9uJzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJwb3NpdGlvbiIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ3RvcCBsZWZ0JzogaTE4bigidG9wTGVmdCIpLAogICAgICAgICAgICAgICAgICAgICAgICAndG9wIHJpZ2h0JzogaTE4bigidG9wUmlnaHQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2JvdHRvbSByaWdodCc6IGkxOG4oImJvdHRvbVJpZ2h0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICdib3R0b20gbGVmdCc6IGkxOG4oImJvdHRvbUxlZnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3RvcCBjZW50ZXInOiBpMThuKCJ0b3BDZW50ZXIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2JvdHRvbSBjZW50ZXInOiBpMThuKCJib3R0b21DZW50ZXIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2hpZGUnOiBpMThuKCJoaWRlIikKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMuZmxvYXRCYXIucG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogW2kxOG4oImZsb2F0QmFyIildLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdmbG9hdEJhci5zaG93RGVsYXknOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oInNob3dEZWxheSIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnQnLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMuZmxvYXRCYXIuc2hvd0RlbGF5LAogICAgICAgICAgICAgICAgICAgIGFmdGVyOiAnICcraTE4bigibXMiKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZmxvYXRCYXIuaGlkZURlbGF5JzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJoaWRlRGVsYXkiKSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50JywKICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdoaWRlRGVsYXknLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMuZmxvYXRCYXIuaGlkZURlbGF5LAogICAgICAgICAgICAgICAgICAgIGFmdGVyOiAnICcraTE4bigibXMiKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdmbG9hdEJhci5mb3JjZVNob3cuc2l6ZS53JzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJmb3JjZVNob3ciKSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50JywKICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdzaXplJywKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHByZWZzLmZsb2F0QmFyLmZvcmNlU2hvdy5zaXplLncsCiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGkxOG4oImZvcmNlU2hvd1RpcCIpLAogICAgICAgICAgICAgICAgICAgIGxpbmU6ICdzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2Zsb2F0QmFyLmZvcmNlU2hvdy5zaXplLmgnOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICcgeCAnLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnQnLAogICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3NlcC14JywKICAgICAgICAgICAgICAgICAgICBhZnRlcjogJyAnK2kxOG4oInB4IiksCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5mbG9hdEJhci5mb3JjZVNob3cuc2l6ZS5oLAogICAgICAgICAgICAgICAgICAgIGxpbmU6ICdlbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdmbG9hdEJhci5taW5TaXplTGltaXQudyc6IHsKICAgICAgICAgICAgICAgICAgICBsYWJlbDogaTE4bigibWluU2l6ZUxpbWl0IiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2ludCcsCiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnc2l6ZScsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5mbG9hdEJhci5taW5TaXplTGltaXQudywKICAgICAgICAgICAgICAgICAgICB0aXRsZTogaTE4bigibWluU2l6ZUxpbWl0VGlwIiksCiAgICAgICAgICAgICAgICAgICAgbGluZTogJ3N0YXJ0JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZmxvYXRCYXIubWluU2l6ZUxpbWl0LmgnOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICcgeCAnLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnQnLAogICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3NlcC14JywKICAgICAgICAgICAgICAgICAgICBhZnRlcjogJyAnK2kxOG4oInB4IiksCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5mbG9hdEJhci5taW5TaXplTGltaXQuaCwKICAgICAgICAgICAgICAgICAgICBsaW5lOiAnZW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZmxvYXRCYXIuYnV0b25PcmRlcic6IHsKICAgICAgICAgICAgICAgICAgICBsYWJlbDogaTE4bigiYnV0b25PcmRlciIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JywKICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdvcmRlcicsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5mbG9hdEJhci5idXRvbk9yZGVyLmpvaW4oJywgJyksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2Zsb2F0QmFyLmxpc3RlbkJnJzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJsaXN0ZW5CZyIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5mbG9hdEJhci5saXN0ZW5CZywKICAgICAgICAgICAgICAgICAgICB0aXRsZTogaTE4bigibGlzdGVuQmdUaXAiKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIC8vIOaMiemUrgogICAgICAgICAgICAgICAgJ2Zsb2F0QmFyLmtleXMuZW5hYmxlJzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJrZXlzRW5hYmxlIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JywKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHByZWZzLmZsb2F0QmFyLmtleXMuZW5hYmxlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2Zsb2F0QmFyLmtleXMuYWN0dWFsJzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJrZXlzQWN0dWFsIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLAogICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2Zsb2F0QmFyLWtleScsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5mbG9hdEJhci5rZXlzLmFjdHVhbCwKICAgICAgICAgICAgICAgICAgICB0aXRsZTogaTE4bigia2V5c0FjdHVhbFRpcCIpCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgLyonZmxvYXRCYXIua2V5cy5zZWFyY2gnOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oImtleXNTZWFyY2giKSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsCiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnZmxvYXRCYXIta2V5JywKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHByZWZzLmZsb2F0QmFyLmtleXMuc2VhcmNoLAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpMThuKCJrZXlzU2VhcmNoVGlwIikKICAgICAgICAgICAgICAgIH0sKi8KICAgICAgICAgICAgICAgICdmbG9hdEJhci5rZXlzLmN1cnJlbnQnOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oImtleXNDdXJyZW50IiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLAogICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2Zsb2F0QmFyLWtleScsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5mbG9hdEJhci5rZXlzLmN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGkxOG4oImtleXNDdXJyZW50VGlwIikKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZmxvYXRCYXIua2V5cy5tYWduaWZpZXInOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oImtleXNNYWduaWZpZXIiKSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsCiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnZmxvYXRCYXIta2V5JywKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHByZWZzLmZsb2F0QmFyLmtleXMubWFnbmlmaWVyLAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpMThuKCJrZXlzTWFnbmlmaWVyVGlwIikKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZmxvYXRCYXIua2V5cy5nYWxsZXJ5JzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJrZXlzR2FsbGVyeSIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JywKICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdmbG9hdEJhci1rZXknLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMuZmxvYXRCYXIua2V5cy5nYWxsZXJ5LAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpMThuKCJrZXlzR2FsbGVyeVRpcCIpCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgIC8vIOaUvuWkp+mVnAogICAgICAgICAgICAgICAgJ21hZ25pZmllci5yYWRpdXMnOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oIm1hZ25pZmllclJhZGl1cyIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnQnLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMubWFnbmlmaWVyLnJhZGl1cywKICAgICAgICAgICAgICAgICAgICBzZWN0aW9uOiBbaTE4bigibWFnbmlmaWVyIildLAogICAgICAgICAgICAgICAgICAgIGFmdGVyOiAnICcraTE4bigicHgiKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdtYWduaWZpZXIud2hlZWxab29tLmVuYWJsZWQnOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oIm1hZ25pZmllcldoZWVsWm9vbUVuYWJsZWQiKSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMubWFnbmlmaWVyLndoZWVsWm9vbS5lbmFibGVkLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdtYWduaWZpZXIud2hlZWxab29tLnJhbmdlJzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJtYWduaWZpZXJXaGVlbFpvb21SYW5nZSIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0YXJlYScsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5tYWduaWZpZXIud2hlZWxab29tLnJhbmdlLmpvaW4oJywgJyksCiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgIC8vIOWbvuW6kwogICAgICAgICAgICAgICAgJ2dhbGxlcnkuZml0VG9TY3JlZW4nOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oImdhbGxlcnlGaXRUb1NjcmVlbiIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5nYWxsZXJ5LmZpdFRvU2NyZWVuLAogICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IFtpMThuKCJnYWxsZXJ5IildLAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpMThuKCJnYWxsZXJ5Rml0VG9TY3JlZW5UaXAiKSwKICAgICAgICAgICAgICAgICAgICBsaW5lOiAnc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdnYWxsZXJ5LmZpdFRvU2NyZWVuU21hbGwnOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oImdhbGxlcnlGaXRUb1NjcmVlblNtYWxsIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JywKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHByZWZzLmdhbGxlcnkuZml0VG9TY3JlZW5TbWFsbCwKICAgICAgICAgICAgICAgICAgICBsaW5lOiAnZW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZ2FsbGVyeS5zY3JvbGxFbmRUb0NoYW5nZSc6IHsKICAgICAgICAgICAgICAgICAgICBsYWJlbDogaTE4bigiZ2FsbGVyeVNjcm9sbEVuZFRvQ2hhbmdlIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JywKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHByZWZzLmdhbGxlcnkuc2Nyb2xsRW5kVG9DaGFuZ2UsCiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGkxOG4oImdhbGxlcnlTY3JvbGxFbmRUb0NoYW5nZVRpcCIpCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2dhbGxlcnkuZXhwb3J0VHlwZSc6IHsKICAgICAgICAgICAgICAgICAgICBsYWJlbDogaTE4bigiZ2FsbGVyeUV4cG9ydFR5cGUiKSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc2VsZWN0JywKICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdncmlkJzogaTE4bigiZ3JpZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAnZ3JpZEJpZyc6IGkxOG4oImdyaWRCaWciKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2xpc3QnOiBpMThuKCJsaXN0IikKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMuZ2FsbGVyeS5leHBvcnRUeXBlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdnYWxsZXJ5LmxvYWRNb3JlJzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJnYWxsZXJ5QXV0b0xvYWQiKSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMuZ2FsbGVyeS5sb2FkTW9yZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdnYWxsZXJ5LmxvYWRBbGwnOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oImdhbGxlcnlMb2FkQWxsIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JywKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHByZWZzLmdhbGxlcnkubG9hZEFsbCwKICAgICAgICAgICAgICAgICAgICB0aXRsZTogaTE4bigiZ2FsbGVyeUxvYWRBbGxUaXAiKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdnYWxsZXJ5LnNjYWxlU21hbGxTaXplJzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJnYWxsZXJ5U2NhbGVTbWFsbFNpemUxIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2ludCcsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5nYWxsZXJ5LnNjYWxlU21hbGxTaXplLAogICAgICAgICAgICAgICAgICAgIGFmdGVyOiBpMThuKCJnYWxsZXJ5U2NhbGVTbWFsbFNpemUyIikKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZ2FsbGVyeS5zaG93U21hbGxTaXplJzp7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oImdhbGxlcnlTaG93U21hbGxTaXplIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JywKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHByZWZzLmdhbGxlcnkuc2hvd1NtYWxsU2l6ZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdnYWxsZXJ5LnRyYW5zaXRpb24nOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oImdhbGxlcnlUcmFuc2l0aW9uIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JywKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHByZWZzLmdhbGxlcnkudHJhbnNpdGlvbgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdnYWxsZXJ5LnNpZGViYXJQb3NpdGlvbic6IHsKICAgICAgICAgICAgICAgICAgICBsYWJlbDogaTE4bigiZ2FsbGVyeVNpZGViYXJQb3NpdGlvbiIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2JvdHRvbSc6IGkxOG4oImJvdHRvbSIpLAogICAgICAgICAgICAgICAgICAgICAgICAncmlnaHQnOiBpMThuKCJyaWdodCIpLAogICAgICAgICAgICAgICAgICAgICAgICAnbGVmdCc6IGkxOG4oImxlZnQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3RvcCc6IGkxOG4oInRvcCIpCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHByZWZzLmdhbGxlcnkuc2lkZWJhclBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgIGxpbmU6ICdzdGFydCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2dhbGxlcnkuc2lkZWJhclNpemUnOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oImdhbGxlcnlTaWRlYmFyU2l6ZSIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnQnLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMuZ2FsbGVyeS5zaWRlYmFyU2l6ZSwKICAgICAgICAgICAgICAgICAgICB0aXRsZTogaTE4bigiZ2FsbGVyeVNpZGViYXJTaXplVGlwIiksCiAgICAgICAgICAgICAgICAgICAgYWZ0ZXI6ICcgJytpMThuKCJweCIpLAogICAgICAgICAgICAgICAgICAgIGxpbmU6ICdlbmQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdnYWxsZXJ5Lm1heCc6IHsKICAgICAgICAgICAgICAgICAgICBsYWJlbDogaTE4bigiZ2FsbGVyeU1heDEiKSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJywKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHByZWZzLmdhbGxlcnkubWF4LAogICAgICAgICAgICAgICAgICAgIGFmdGVyOiBpMThuKCJnYWxsZXJ5TWF4MiIpCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2dhbGxlcnkuYXV0b1pvb20nOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oImdhbGxlcnlBdXRvWm9vbSIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5nYWxsZXJ5LmF1dG9ab29tLAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpMThuKCJnYWxsZXJ5QXV0b1pvb21UaXAiKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdnYWxsZXJ5LmRlc2NyaXB0aW9uTGVuZ3RoJzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJnYWxsZXJ5RGVzY3JpcHRpb25MZW5ndGgxIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2ludCcsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5nYWxsZXJ5LmRlc2NyaXB0aW9uTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIGFmdGVyOiBpMThuKCJnYWxsZXJ5RGVzY3JpcHRpb25MZW5ndGgyIikKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZ2FsbGVyeS5hdXRvT3BlblNpdGVzJzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJnYWxsZXJ5QXV0b09wZW5TaXRlcyIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0YXJlYScsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5nYWxsZXJ5LmF1dG9PcGVuU2l0ZXMKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZ2FsbGVyeS5lZGl0U2l0ZSc6IHsKICAgICAgICAgICAgICAgICAgICBsYWJlbDogaTE4bigiZ2FsbGVyeUVkaXRTaXRlIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NlbGVjdCcsCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAgICAgICAgICAgICAnUGl4bHInOiAnUGl4bHInLAogICAgICAgICAgICAgICAgICAgICAgICAnVG9vbHBpYyc6ICdUb29scGljJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5nYWxsZXJ5LmVkaXRTaXRlLAogICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAvLyDlm77niYfnqpflj6MKICAgICAgICAgICAgICAgICdpbWdXaW5kb3cuZml0VG9TY3JlZW4nOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oImltZ1dpbmRvd0ZpdFRvU2NyZWVuIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JywKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHByZWZzLmltZ1dpbmRvdy5maXRUb1NjcmVlbiwKICAgICAgICAgICAgICAgICAgICBzZWN0aW9uOiBbaTE4bigiaW1nV2luZG93IildLAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpMThuKCJpbWdXaW5kb3dGaXRUb1NjcmVlblRpcCIpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdpbWdXaW5kb3cuY2xvc2UuZGVmYXVsdFRvb2wnOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oImltZ1dpbmRvd0RlZmF1bHRUb29sIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NlbGVjdCcsCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAgICAgICAgICAgICAnaGFuZCc6IGkxOG4oImhhbmQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3JvdGF0ZSc6IGkxOG4oInJvdGF0ZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAnem9vbSc6IGkxOG4oInpvb20iKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMuaW1nV2luZG93LmNsb3NlLmRlZmF1bHRUb29sLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdpbWdXaW5kb3cuY2xvc2UuZXNjS2V5JzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJpbWdXaW5kb3dFc2NLZXkiKSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMuaW1nV2luZG93LmNsb3NlLmVzY0tleSwKICAgICAgICAgICAgICAgICAgICBsaW5lOiAnc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdpbWdXaW5kb3cuY2xvc2UuZGJsQ2xpY2tJbWdXaW5kb3cnOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oImltZ1dpbmRvd0RibENsaWNrSW1nV2luZG93IiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JywKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHByZWZzLmltZ1dpbmRvdy5jbG9zZS5kYmxDbGlja0ltZ1dpbmRvdywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnaW1nV2luZG93LmNsb3NlLmNsaWNrT3V0c2lkZSc6IHsKICAgICAgICAgICAgICAgICAgICBsYWJlbDogaTE4bigiaW1nV2luZG93Q2xpY2tPdXRzaWRlIiksCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NlbGVjdCcsCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAgICAgICAgICAgICAnJzogaTE4bigibm9uZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAnY2xpY2snOiBpMThuKCJjbGljayIpLAogICAgICAgICAgICAgICAgICAgICAgICAnZGJsY2xpY2snOiBpMThuKCJkYmxjbGljayIpLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5pbWdXaW5kb3cuY2xvc2UuY2xpY2tPdXRzaWRlLAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpMThuKCJpbWdXaW5kb3dDbGlja091dHNpZGVUaXAiKSwKICAgICAgICAgICAgICAgICAgICBsaW5lOiAnZW5kJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnaW1nV2luZG93Lm92ZXJsYXllci5zaG93bic6IHsKICAgICAgICAgICAgICAgICAgICBsYWJlbDogaTE4bigiaW1nV2luZG93T3ZlcmxheWVyU2hvd24iKSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMuaW1nV2luZG93Lm92ZXJsYXllci5zaG93biwKICAgICAgICAgICAgICAgICAgICBsaW5lOiAnc3RhcnQnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdpbWdXaW5kb3cub3ZlcmxheWVyLmNvbG9yJzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJpbWdXaW5kb3dPdmVybGF5ZXJDb2xvciIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JywKICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdjb2xvcicsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5pbWdXaW5kb3cub3ZlcmxheWVyLmNvbG9yLAogICAgICAgICAgICAgICAgICAgIGxpbmU6ICdlbmQnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2ltZ1dpbmRvdy5zaGlmdFJvdGF0ZVN0ZXAnOiB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGkxOG4oImltZ1dpbmRvd1NoaWZ0Um90YXRlU3RlcDEiKSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50JywKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHByZWZzLmltZ1dpbmRvdy5zaGlmdFJvdGF0ZVN0ZXAsCiAgICAgICAgICAgICAgICAgICAgYWZ0ZXI6IGkxOG4oImltZ1dpbmRvd1NoaWZ0Um90YXRlU3RlcDIiKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdpbWdXaW5kb3cuem9vbS5tb3VzZVdoZWVsWm9vbSc6IHsKICAgICAgICAgICAgICAgICAgICBsYWJlbDogaTE4bigiaW1nV2luZG93TW91c2VXaGVlbFpvb20iKSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMuaW1nV2luZG93Lnpvb20ubW91c2VXaGVlbFpvb20sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2ltZ1dpbmRvdy56b29tLnJhbmdlJzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJpbWdXaW5kb3dab29tUmFuZ2UiKSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dGFyZWEnLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMuaW1nV2luZG93Lnpvb20ucmFuZ2Uuam9pbignLCAnKSwKICAgICAgICAgICAgICAgICAgICB0aXRsZTogaTE4bigiaW1nV2luZG93Wm9vbVJhbmdlVGlwIiksCiAgICAgICAgICAgICAgICAgICAgYXR0cjogewogICAgICAgICAgICAgICAgICAgICAgICAic3BlbGxjaGVjayI6ICJmYWxzZSIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgIC8vIOWFtuWugwogICAgICAgICAgICAgICAgJ3dhaXRJbWdMb2FkJzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJ3YWl0SW1nTG9hZCIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy53YWl0SW1nTG9hZCwKICAgICAgICAgICAgICAgICAgICBzZWN0aW9uOiBbaTE4bigib3RoZXJzIildLAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpMThuKCJ3YWl0SW1nTG9hZFRpcCIpCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2RlYnVnJzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJkZWJ1ZyIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBwcmVmcy5kZWJ1ZwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIC8qJ2ZpcnN0RW5naW5lJzogewogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpMThuKCJmaXJzdEVuZ2luZSIpLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgIlRpbmV5ZSI6IlRpbmV5ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJHb29nbGUiOiJHb29nbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiQmFpZHUiOiJCYWlkdSIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogcHJlZnMuZmlyc3RFbmdpbmUsCiAgICAgICAgICAgICAgICB9LCovCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50czogewogICAgICAgICAgICAgICAgb3BlbjogZnVuY3Rpb24oZG9jLCB3aW4sIGZyYW1lKSB7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2F2ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgbG9hZFByZWZzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCgogICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoJ1BpY3ZpZXdlciBDRSsgJytpMThuKCJjb25maWciKSwgb3BlblByZWZzKTsKCiAgICAgICAgbG9hZFByZWZzKCk7CgogICAgICAgIGlmKHByZWZzLmdhbGxlcnkuYXV0b09wZW5TaXRlcyAmJiBuZXcgUmVnRXhwKHByZWZzLmdhbGxlcnkuYXV0b09wZW5TaXRlcykudGVzdChsb2NhdGlvbi5ocmVmKSl7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtvcGVuR2FsbGVyeSgpO30sMjAwMCk7CiAgICAgICAgfQoKICAgICAgICAvLyDms6jlhozmjInplK4KICAgICAgICBpZiAocHJlZnMuZmxvYXRCYXIua2V5cy5lbmFibGUpIHsKICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGtleWRvd24sIGZhbHNlKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG9wZW5QcmVmcygpIHsKICAgICAgICAgICAgR01fY29uZmlnLm9wZW4oKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGxvYWRQcmVmcygpIHsKICAgICAgICAgICAgLy8g5qC55o2uIEdNX2NvbmZpZyDnmoQga2V5IOi9veWFpeiuvue9ruWIsCBwcmVmcwogICAgICAgICAgICBPYmplY3Qua2V5cyhHTV9jb25maWcuZmllbGRzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleVN0cikgewogICAgICAgICAgICAgICAgdmFyIGtleXMgPSBrZXlTdHIuc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgIHZhciBsYXN0S2V5ID0ga2V5cy5wb3AoKTsKCiAgICAgICAgICAgICAgICB2YXIgbGFzdFByZWYgPSBrZXlzLnJlZHVjZShmdW5jdGlvbihwcmV2aW91c1ZhbHVlLCBjdXJLZXkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNWYWx1ZVtjdXJLZXldOwogICAgICAgICAgICAgICAgfSwgcHJlZnMpIHx8IHByZWZzOwoKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IEdNX2NvbmZpZy5nZXQoa2V5U3RyKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAvLyDnibnmrornmoQKICAgICAgICAgICAgICAgICAgICBpZiAoa2V5U3RyID09ICdtYWduaWZpZXIud2hlZWxab29tLnJhbmdlJyB8fCBrZXlTdHIgPT0gJ2ltZ1dpbmRvdy56b29tLnJhbmdlJykgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0UHJlZltsYXN0S2V5XSA9IHZhbHVlLnNwbGl0KC9bLO+8jF1ccyovKS5tYXAoZnVuY3Rpb24ocykgeyByZXR1cm4gcGFyc2VGbG9hdChzKX0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihrZXlTdHIgPT0gJ2Zsb2F0QmFyLmJ1dG9uT3JkZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQcmVmW2xhc3RLZXldID0gdmFsdWUucmVwbGFjZSgvXlxzKnxccyokL2csIiIpLnNwbGl0KC9ccypbLO+8jF1ccyovKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0UHJlZltsYXN0S2V5XSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkZWJ1ZyA9IHByZWZzLmRlYnVnID8gY29uc29sZS5kZWJ1Zy5iaW5kKGNvbnNvbGUpIDogZnVuY3Rpb24oKSB7fTsKICAgICAgICB9CgogICAgfTsKCiAgICBmdW5jdGlvbiBpbml0MigpewogICAgICAgIGluaXQodG9wT2JqZWN0LHdpbmRvdyxkb2N1bWVudCxhcnJheUZuLGVudmlyLHN0b3JhZ2UsdW5zYWZlV2luZG93KTsKICAgIH07CgoKICAgIC8v5aSn6Ie05qOA5rWL6L+Q6KGM546v5aKDCiAgICB2YXIgZW52aXI9ewogICAgICAgIGllOnR5cGVvZiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gJ251bWJlcicsCiAgICAgICAgZmlyZWZveDp0eXBlb2YgWFBDTmF0aXZlV3JhcHBlciA9PSAnZnVuY3Rpb24nLAogICAgICAgIG9wZXJhOiEhd2luZG93Lm9wZXJhLAogICAgICAgIGNocm9tZTohIXdpbmRvdy5jaHJvbWUsCiAgICB9OwoKICAgIC8vaWXnmoTor53vvIzkuI3mlK/mjIEgPCBpZTnnmoTniYjmnKwKICAgIGlmKGVudmlyLmllICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8IDkpewogICAgICAgIHJldHVybjsKICAgIH07CgoKICAgIHZhciBhcnJheUZuPShmdW5jdGlvbigpewogICAgICAgIC8vQXJyYXnnmoTmn5Dkupvmlrnms5Xlr7nmiYDmnInnmoTnsbvmlbDnu4Tpg73mnInmlYjvvIzmr5TlpoJIVE1MQ29sbGVjdGlvbixOb2RlTGlzdCxET01TdHJpbmdMaXN0Li4uLi4KCiAgICAgICAgLy/mt7vliqDkuIDkuKrlvZPlh73mlbDov5Tlm550cnVl5pe277yM6L+U5ZueW2FycmF5W2luZGV4XSxpbmRleF3vvIzlubbkuJTot7Plh7rlvqrnjq/nmoTmlrnms5UKICAgICAgICAvL+exu+S8vOWBmuWIsCBmb3Ig5b6q546v77yM5Zyo5ruh6Laz5p2h5Lu255qE5pe25YCZ55u05o6lYnJlYWvot7Plh7rnmoTmlYjmnpzjgIIKICAgICAgICBpZih0eXBlb2YgQXJyYXkucHJvdG90eXBlWydfZmluZCddIT0nZnVuY3Rpb24nKXsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwnX2ZpbmQnLHsKICAgICAgICAgICAgICAgIHZhbHVlOmZ1bmN0aW9uKGNhbGxiYWNrICwgdGhpc0FyZyl7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMgPT0gbnVsbCl7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoICJ0aGlzIGlzIG51bGwgb3Igbm90IGRlZmluZWQiICk7CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggY2FsbGJhY2sgKyAiIGlzIG5vdCBhIGZ1bmN0aW9uIiApOwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgIHZhciBpID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgbCA9IHRoaXMubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3duUHJvcGVydHk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eQogICAgICAgICAgICAgICAgICAgIDsKCgogICAgICAgICAgICAgICAgICAgIHdoaWxlKGk8bCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGhhc093blByb3BlcnR5LmNhbGwodGhpcyxpKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjYWxsYmFjay5jYWxsKCB0aGlzQXJnLCB2YWx1ZSwgaSwgdGhpcyApPT09dHJ1ZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt2YWx1ZSxpLHRoaXNdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgd3JpdGFibGU6dHJ1ZSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ZmFsc2UsLy/kuI7ljp/nlJ/mlrnms5XkuIDmoLfkuI3lj6/mnprkuL7vvIznu7TmiqTnvZHpobXlkozosJDjgILjgILjgIIKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTp0cnVlLAogICAgICAgICAgICB9KTsKICAgICAgICB9OwoKICAgICAgICB2YXIgYXJyYXlQcm90bz1BcnJheS5wcm90b3R5cGU7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgX2ZpbmQ6YXJyYXlQcm90by5fZmluZCwKICAgICAgICAgICAgc2xpY2U6YXJyYXlQcm90by5zbGljZSwKICAgICAgICAgICAgZm9yRWFjaDphcnJheVByb3RvLmZvckVhY2gsCiAgICAgICAgICAgIHNvbWU6YXJyYXlQcm90by5zb21lLAogICAgICAgICAgICBldmVyeTphcnJheVByb3RvLmV2ZXJ5LAogICAgICAgICAgICBtYXA6YXJyYXlQcm90by5tYXAsCiAgICAgICAgICAgIGZpbHRlcjphcnJheVByb3RvLmZpbHRlciwKICAgICAgICAgICAgaW5kZXhPZjphcnJheVByb3RvLmluZGV4T2YsCiAgICAgICAgICAgIGxhc3RJbmRleE9mOmFycmF5UHJvdG8ubGFzdEluZGV4T2YsCiAgICAgICAgfTsKCiAgICB9KSgpOwoKCiAgICB2YXIgc3RvcmFnZT17CiAgICAgICAgc3VwcG9ydEdNOiB0eXBlb2YgR01fZ2V0VmFsdWU9PSdmdW5jdGlvbicgJiYgdHlwZW9mIEdNX2dldFZhbHVlKCdhJywnYicpIT0ndW5kZWZpbmVkJywvL2Nocm9tZeeahGdt5Ye95pWw5byP56m65Ye95pWwCiAgICAgICAgbXhBcHBTdG9yYWdlOihmdW5jdGlvbigpey8v5YKy5ri45omp5bGV5YKo5a2Y5o6l5Y+jCiAgICAgICAgICAgIHRyeXsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZXh0ZXJuYWwubXhHZXRSdW50aW1lKCkuc3RvcmFnZTsKICAgICAgICAgICAgfWNhdGNoKGUpewogICAgICAgICAgICB9OwogICAgICAgIH0pKCksCiAgICAgICAgb3BlcmFVSlNTdG9yYWdlOihmdW5jdGlvbigpey8vb3BlcmEgdXNlcmpz5YWo5bGA5a2Y5YKo5o6l5Y+jCiAgICAgICAgICAgIHRyeXsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cub3BlcmEuc2NyaXB0U3RvcmFnZTsKICAgICAgICAgICAgfWNhdGNoKGUpewogICAgICAgICAgICB9OwogICAgICAgIH0pKCksCiAgICAgICAgc2V0SXRlbTpmdW5jdGlvbihrZXksdmFsdWUpewogICAgICAgICAgICBpZih0aGlzLm9wZXJhVUpTU3RvcmFnZSl7CiAgICAgICAgICAgICAgICB0aGlzLm9wZXJhVUpTU3RvcmFnZS5zZXRJdGVtKGtleSx2YWx1ZSk7CiAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMubXhBcHBTdG9yYWdlKXsKICAgICAgICAgICAgICAgIHRoaXMubXhBcHBTdG9yYWdlLnNldENvbmZpZyhrZXksdmFsdWUpOwogICAgICAgICAgICB9ZWxzZSBpZih0aGlzLnN1cHBvcnRHTSl7CiAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZShrZXksdmFsdWUpOwogICAgICAgICAgICB9ZWxzZSBpZih3aW5kb3cubG9jYWxTdG9yYWdlKXsKICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksdmFsdWUpOwogICAgICAgICAgICB9OwogICAgICAgIH0sCiAgICAgICAgZ2V0SXRlbTpmdW5jdGlvbihrZXkpewogICAgICAgICAgICB2YXIgdmFsdWU7CiAgICAgICAgICAgIGlmKHRoaXMub3BlcmFVSlNTdG9yYWdlKXsKICAgICAgICAgICAgICAgIHZhbHVlPXRoaXMub3BlcmFVSlNTdG9yYWdlLmdldEl0ZW0oa2V5KTsKICAgICAgICAgICAgfWVsc2UgaWYodGhpcy5teEFwcFN0b3JhZ2UpewogICAgICAgICAgICAgICAgdmFsdWU9dGhpcy5teEFwcFN0b3JhZ2UuZ2V0Q29uZmlnKGtleSk7CiAgICAgICAgICAgIH1lbHNlIGlmKHRoaXMuc3VwcG9ydEdNKXsKICAgICAgICAgICAgICAgIHZhbHVlPUdNX2dldFZhbHVlKGtleSk7CiAgICAgICAgICAgIH1lbHNlIGlmKHdpbmRvdy5sb2NhbFN0b3JhZ2UpewogICAgICAgICAgICAgICAgdmFsdWU9d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9LAogICAgfTsKCiAgICBmdW5jdGlvbiBnZXRVcmwodXJsLCBjYWxsYmFjaywgb25FcnJvcil7CiAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgICAgb25sb2FkOiBjYWxsYmFjaywKICAgICAgICAgICAgb25lcnJvcjogb25FcnJvcgogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldFNlYXJjaFN0YXRlKHdvcmRzLGltZ0Nvbil7CiAgICAgICAgaWYod29yZHMpY29uc29sZS5pbmZvKHdvcmRzKTsKICAgICAgICB2YXIgc2VhcmNoU3RhdGUgPSAoaW1nQ29uP2ltZ0Nvbjpkb2N1bWVudCkucXVlcnlTZWxlY3RvcignLnB2LXBpYy1zZWFyY2gtc3RhdGUnKTsKICAgICAgICBpZihzZWFyY2hTdGF0ZSlzZWFyY2hTdGF0ZS5pbm5lckhUTUw9d29yZHM7CiAgICB9CgogICAgdmFyIHNlYXJjaFNvcnQ9WyJUaW5leWUiLCJHb29nbGUiLCJCYWlkdSJdOwogICAgZnVuY3Rpb24gc29ydFNlYXJjaCgpewogICAgICAgIGZvcih2YXIgaT0wO2k8c2VhcmNoU29ydC5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgaWYoc2VhcmNoU29ydFtpXT09cHJlZnMuZmlyc3RFbmdpbmUpewogICAgICAgICAgICAgICAgc2VhcmNoU29ydC5zcGxpY2UoaSwxKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNlYXJjaFNvcnQudW5zaGlmdChwcmVmcy5maXJzdEVuZ2luZSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VhcmNoSW1nQnlJbWcoaW1nU3JjLCBpbWdDb24sIGNhbGxCYWNrLCBvbkVycm9yLCBub25lUmVzdWx0LCBzZWFyY2hGcm9tKXsKICAgICAgICBsZXQgc3Jjcz1bXTsKICAgICAgICB2YXIgc2VhcmNoQmFpZHU9ZnVuY3Rpb24oKXsKICAgICAgICAgICAgc2V0U2VhcmNoU3RhdGUoaTE4bigiYmVnaW5TZWFyY2hJbWciLCLnmb7luqYiKSxpbWdDb24pOwogICAgICAgICAgICBnZXRVcmwoImh0dHA6Ly9pbWFnZS5iYWlkdS5jb20vbi9zYW1lP3F1ZXJ5SW1hZ2VVcmw9IitlbmNvZGVVUklDb21wb25lbnQoaW1nU3JjKSsiJmlzZ3Vlc3N3b3JkPTEmcm49MzAmZnI9cGMmcG49MCZzb3J0PXNpemUiLCBmdW5jdGlvbihkKXsKICAgICAgICAgICAgICAgIGxldCBiYWlkdUpzb247CiAgICAgICAgICAgICAgICB0cnl7CiAgICAgICAgICAgICAgICAgICAgYmFpZHVKc29uPUpTT04ucGFyc2UoZC5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgfWNhdGNoKGUpewogICAgICAgICAgICAgICAgICAgIHNldFNlYXJjaFN0YXRlKGkxOG4oImZpbmROb1BpYyIpLGltZ0Nvbik7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWFyY2hTdGF0ZSgiIixpbWdDb24pOwogICAgICAgICAgICAgICAgICAgIH0sMjAwMCk7CiAgICAgICAgICAgICAgICAgICAgc2VhcmNoTmV4dCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKGJhaWR1SnNvbi5kYXRhWzBdKXsKICAgICAgICAgICAgICAgICAgICBzcmNzPVtdOwogICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaW1nRGF0YSBvZiBiYWlkdUpzb24uZGF0YSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNyY3MubGVuZ3RoPjIpYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIHNyY3MucHVzaChpbWdEYXRhLm9ialVSTCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFNlYXJjaFN0YXRlKGkxOG4oImZpbmRPdmVyQmVnaW5Mb2FkIixbIueZvuW6piIsc3Jjcy5sZW5ndGhdKSxpbWdDb24pOwogICAgICAgICAgICAgICAgICAgIGNhbGxCYWNrRnVuKHNyY3MpOwogICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgc2VhcmNoTmV4dCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgb25FcnJvcik7CiAgICAgICAgfTsKICAgICAgICB2YXIgc2VhcmNoR29vZ2xlPWZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHNldFNlYXJjaFN0YXRlKGkxOG4oImJlZ2luU2VhcmNoSW1nIiwiR29vZ2xlIiksaW1nQ29uKTsKICAgICAgICAgICAgZ2V0VXJsKCJodHRwczovL3d3dy5nb29nbGUuY29tL3NlYXJjaGJ5aW1hZ2U/c2FmZT1vZmYmaW1hZ2VfdXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGltZ1NyYyksIGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgICAgbGV0IGdvb2dsZUh0bWw9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCcnKTsKICAgICAgICAgICAgICAgIGdvb2dsZUh0bWwuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IGQucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgbGV0IHNpemVVcmw9Z29vZ2xlSHRtbC5xdWVyeVNlbGVjdG9yKCJkaXYuY2FyZC1zZWN0aW9uPmRpdj5kaXY+c3Bhbi5nbD5hIik7CiAgICAgICAgICAgICAgICBpZihzaXplVXJsKXsKICAgICAgICAgICAgICAgICAgICBnZXRVcmwoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20iK3NpemVVcmwuZ2V0QXR0cmlidXRlKCJocmVmIiksIGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgICAgICAgICAgICBnb29nbGVIdG1sLmRvY3VtZW50RWxlbWVudC5pbm5lckhUTUwgPSBkLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltZ3M9Z29vZ2xlSHRtbC5xdWVyeVNlbGVjdG9yQWxsKCJkaXYucmdfbWV0YSIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZihpbWdzLmxlbmd0aD09MCl7c2VhcmNoTmV4dCgpO3JldHVybjt9CiAgICAgICAgICAgICAgICAgICAgICAgIHNyY3M9W107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8aW1ncy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNyY3MubGVuZ3RoPjIpYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQganNvbkRhdGE9SlNPTi5wYXJzZShpbWdzW2ldLmlubmVySFRNTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNzLnB1c2goanNvbkRhdGEub3UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlYXJjaFN0YXRlKGkxOG4oImZpbmRPdmVyQmVnaW5Mb2FkIixbIkdvb2dsZSIsc3Jjcy5sZW5ndGhdKSxpbWdDb24pOwogICAgICAgICAgICAgICAgICAgICAgICBjYWxsQmFja0Z1bihzcmNzKTsKICAgICAgICAgICAgICAgICAgICB9LCBvbkVycm9yKTsKICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgIHNlYXJjaE5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgb25FcnJvcik7CiAgICAgICAgfTsKICAgICAgICB2YXIgc2VhcmNoVGluZXllPWZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHNldFNlYXJjaFN0YXRlKGkxOG4oImJlZ2luU2VhcmNoSW1nIiwiVGluZXllIiksaW1nQ29uKTsKICAgICAgICAgICAgZ2V0VXJsKCJodHRwczovL3d3dy50aW5leWUuY29tL3NlYXJjaD91cmw9IitlbmNvZGVVUklDb21wb25lbnQoaW1nU3JjKSsiJnNvcnQ9c2l6ZSIsIGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgICAgbGV0IHRpbmV5ZUh0bWw9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCcnKTsKICAgICAgICAgICAgICAgIHRpbmV5ZUh0bWwuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCA9IGQucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgbGV0IHNlYXJjaEltZz10aW5leWVIdG1sLnF1ZXJ5U2VsZWN0b3JBbGwoIi5tYXRjaC1kZXRhaWxzPmRpdi5tYXRjaDpmaXJzdC1vZi10eXBlPnAuaW1hZ2UtbGluazpmaXJzdC1vZi10eXBlPmEiKTsKICAgICAgICAgICAgICAgIGlmKHNlYXJjaEltZy5sZW5ndGg+MCl7CiAgICAgICAgICAgICAgICAgICAgc3Jjcz1bXTsKICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGk9MDtpPHNlYXJjaEltZy5sZW5ndGg7aSsrKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3Jjcy5sZW5ndGg+MilicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgc3Jjcy5wdXNoKHNlYXJjaEltZ1tpXS5ocmVmKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0U2VhcmNoU3RhdGUoaTE4bigiZmluZE92ZXJCZWdpbkxvYWQiLFsiVGluZXllIixzcmNzLmxlbmd0aF0pLGltZ0Nvbik7CiAgICAgICAgICAgICAgICAgICAgY2FsbEJhY2tGdW4oc3Jjcyk7CiAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICBzZWFyY2hOZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIG9uRXJyb3IpOwogICAgICAgIH07CiAgICAgICAgdmFyIHNlYXJjaE5leHQ9ZnVuY3Rpb24oKXsKICAgICAgICAgICAgc2VhcmNoRnJvbSsrOwogICAgICAgICAgICBpZihzZWFyY2hGcm9tPD1zZWFyY2hTb3J0Lmxlbmd0aClzd2l0Y2hTZWFyY2goKTsKICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgIGlmKG5vbmVSZXN1bHQpbm9uZVJlc3VsdCgpOwogICAgICAgICAgICAgICAgc2V0U2VhcmNoU3RhdGUoaTE4bigiZmluZE5vUGljIiksaW1nQ29uKTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICBzZXRTZWFyY2hTdGF0ZSgiIixpbWdDb24pOwogICAgICAgICAgICAgICAgfSwyMDAwKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIGNhbGxCYWNrRnVuPWZ1bmN0aW9uKHNyY3MpewogICAgICAgICAgICBjYWxsQmFjayhzcmNzLCBzZWFyY2hGcm9tKTsKICAgICAgICB9OwogICAgICAgIGlmKCFzZWFyY2hGcm9tKXNlYXJjaEZyb209MTsKICAgICAgICB2YXIgc3dpdGNoU2VhcmNoPWZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHN3aXRjaChzZWFyY2hTb3J0W3NlYXJjaEZyb20tMV0pewogICAgICAgICAgICAgICAgY2FzZSAiQmFpZHUiOgogICAgICAgICAgICAgICAgICAgIHNlYXJjaEJhaWR1KCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJHb29nbGUiOgogICAgICAgICAgICAgICAgICAgIHNlYXJjaEdvb2dsZSgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiVGluZXllIjoKICAgICAgICAgICAgICAgICAgICBzZWFyY2hUaW5leWUoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgc2VhcmNoVGluZXllKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHN3aXRjaFNlYXJjaCgpOwogICAgfQoKICAgIGluaXQyKCk7Cgp9KSh0aGlzLHdpbmRvdyxkb2N1bWVudCwodHlwZW9mIHVuc2FmZVdpbmRvdz09J3VuZGVmaW5lZCc/IHdpbmRvdyA6IHVuc2FmZVdpbmRvdykpOw==","requires":[{"meta":{"name":"GM_config%20CN.js","url":"https://greasyfork.org/scripts/6158-gm-config-cn/code/GM_config%20CN.js?version=23710","ts":1649763945044,"mimetype":"text/javascript"},"source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIEdNX2NvbmZpZyBDTgovLyBAbmFtZXNwYWNlICAgaHR0cHM6Ly9naXRodWIuY29tL3l3emhhaXFpLwovLyBAZGVzY3JpcHRpb24gc2l6emxlbWN0d2l6emxlIOeahCBHTV9jb25maWcg5bqT5Lit5paH54mI5pysCi8vIEBzb3VyY2UgICAgICBodHRwczovL2dpdGh1Yi5jb20veXd6aGFpcWkvR01fY29uZmlnCi8vIEB2ZXJzaW9uICAgICAxLjEKCi8vIEBjb3B5cmlnaHQgICBzaXp6bGVtY3R3aXp6bGUKCi8vIEBncmFudCAgICAgICBHTV9nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgR01fc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgIEdNX2RlbGV0ZVZhbHVlCi8vIEBsaWNlbnNlICAgICBMR1BMIDMKLy8gPT0vVXNlclNjcmlwdD09CgovKgogIOS/ruaUueivtOaYjgogICAgMeOAgeaUueaIkOS4reaWhyAi56Gu5a6aIuOAgSLlj5bmtogiIOaMiemSruOAggogICAgMuOAgXNlbGVjdCDmlrDlop7kuoYgdGV4dENvbnRlbnRzIOaVsOe7hOOAggoqLwoKLyoKQ29weXJpZ2h0IDIwMDkrLCBHTV9jb25maWcgQ29udHJpYnV0b3JzIChodHRwczovL2dpdGh1Yi5jb20vc2l6emxlbWN0d2l6emxlL0dNX2NvbmZpZykKCkdNX2NvbmZpZyBDb250cmlidXRvcnM6CiAgICAgICAgTWlrZSBNZWRsZXkgPG1lZGxleW1pbmRAZ21haWwuY29tPgogICAgICAgIEpvZSBTaW1tb25zCiAgICAgICAgSXp6eSBTb2Z0CiAgICAgICAgTWFydGkgTWFydHoKCkdNX2NvbmZpZyBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KCiAgICAgICAgR01fY29uZmlnIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgICAgIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCi8vIFRoZSBHTV9jb25maWcgY29uc3RydWN0b3IKZnVuY3Rpb24gR01fY29uZmlnU3RydWN0KCkgewogICAgLy8gY2FsbCBpbml0KCkgaWYgc2V0dGluZ3Mgd2VyZSBwYXNzZWQgdG8gY29uc3RydWN0b3IKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgR01fY29uZmlnSW5pdCh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIHRoaXMub25Jbml0KCk7CiAgICB9Cn0KCi8vIFRoaXMgaXMgdGhlIGluaXRpYWxpemVyIGZ1bmN0aW9uCmZ1bmN0aW9uIEdNX2NvbmZpZ0luaXQoY29uZmlnLCBhcmdzKSB7CiAgICAvLyBJbml0aWFsaXplIGluc3RhbmNlIHZhcmlhYmxlcwogICAgaWYgKHR5cGVvZiBjb25maWcuZmllbGRzID09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgY29uZmlnLmZpZWxkcyA9IHt9OwogICAgICAgIGNvbmZpZy5vbkluaXQgPSBjb25maWcub25Jbml0IHx8IGZ1bmN0aW9uKCkge307CiAgICAgICAgY29uZmlnLm9uT3BlbiA9IGNvbmZpZy5vbk9wZW4gfHwgZnVuY3Rpb24oKSB7fTsKICAgICAgICBjb25maWcub25TYXZlID0gY29uZmlnLm9uU2F2ZSB8fCBmdW5jdGlvbigpIHt9OwogICAgICAgIGNvbmZpZy5vbkNsb3NlID0gY29uZmlnLm9uQ2xvc2UgfHwgZnVuY3Rpb24oKSB7fTsKICAgICAgICBjb25maWcub25SZXNldCA9IGNvbmZpZy5vblJlc2V0IHx8IGZ1bmN0aW9uKCkge307CiAgICAgICAgY29uZmlnLmlzT3BlbiA9IGZhbHNlOwogICAgICAgIGNvbmZpZy50aXRsZSA9ICfnlKjmiLfohJrmnKzorr7nva4nOwogICAgICAgIGNvbmZpZy5jc3MgPSB7CiAgICAgICAgICAgIGJhc2ljOiBbCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAqIHsgZm9udC1mYW1pbHk6IGFyaWFsLHRhaG9tYSxteXJpYWQgcHJvLHNhbnMtc2VyaWY7IH0iLAogICAgICAgICAgICAgICAgIiNHTV9jb25maWcgeyBiYWNrZ3JvdW5kOiAjRkZGOyB9IiwKICAgICAgICAgICAgICAgICIjR01fY29uZmlnIGlucHV0W3R5cGU9J3JhZGlvJ10geyBtYXJnaW4tcmlnaHQ6IDhweDsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAuaW5kZW50NDAgeyBtYXJnaW4tbGVmdDogNDAlOyB9IiwKICAgICAgICAgICAgICAgICIjR01fY29uZmlnIC5maWVsZF9sYWJlbCB7IGZvbnQtc2l6ZTogMTJweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi1yaWdodDogNnB4OyB9IiwKICAgICAgICAgICAgICAgICIjR01fY29uZmlnIC5yYWRpb19sYWJlbCB7IGZvbnQtc2l6ZTogMTJweDsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAuYmxvY2sgeyBkaXNwbGF5OiBibG9jazsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAuc2F2ZWNsb3NlX2J1dHRvbnMgeyBtYXJnaW46IDE2cHggMTBweCAxMHB4OyBwYWRkaW5nOiAycHggMTJweDsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAucmVzZXQsICNHTV9jb25maWcgLnJlc2V0IGEsIiArCiAgICAgICAgICAgICAgICAgICIgI0dNX2NvbmZpZ19idXR0b25zX2hvbGRlciB7IGNvbG9yOiAjMDAwOyB0ZXh0LWFsaWduOiByaWdodDsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAuY29uZmlnX2hlYWRlciB7IGZvbnQtc2l6ZTogMjBwdDsgbWFyZ2luOiAwOyB9IiwKICAgICAgICAgICAgICAgICIjR01fY29uZmlnIC5jb25maWdfZGVzYywgI0dNX2NvbmZpZyAuc2VjdGlvbl9kZXNjLCAjR01fY29uZmlnIC5yZXNldCB7IGZvbnQtc2l6ZTogOXB0OyB9IiwKICAgICAgICAgICAgICAgICIjR01fY29uZmlnIC5jZW50ZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0iLAogICAgICAgICAgICAgICAgIiNHTV9jb25maWcgLnNlY3Rpb25faGVhZGVyX2hvbGRlciB7IG1hcmdpbi10b3A6IDhweDsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAuY29uZmlnX3ZhciB7IG1hcmdpbjogMCAwIDRweDsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAuc2VjdGlvbl9oZWFkZXIgeyBiYWNrZ3JvdW5kOiAjNDE0MTQxOyBib3JkZXI6IDFweCBzb2xpZCAjMDAwOyBjb2xvcjogI0ZGRjsiLAogICAgICAgICAgICAgICAgIiBmb250LXNpemU6IDEzcHQ7IG1hcmdpbjogMDsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAuc2VjdGlvbl9kZXNjIHsgYmFja2dyb3VuZDogI0VGRUZFRjsgYm9yZGVyOiAxcHggc29saWQgI0NDQzsgY29sb3I6ICM1NzU3NTc7IiArCiAgICAgICAgICAgICAgICAgICIgZm9udC1zaXplOiA5cHQ7IG1hcmdpbjogMCAwIDZweDsgfSIsCiAgICAgICAgICAgICAgICAvLyBuZXdlcgogICAgICAgICAgICAgICAgIiNHTV9jb25maWcgaW5wdXRbdHlwZT0nbnVtYmVyJ10geyB3aWR0aDogNjBweDsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAubmF2LXRhYnMgeyBtYXJnaW46IDEwIDB9IiwKICAgICAgICAgICAgICAgICIjR01fY29uZmlnIC5uYXYtdGFicyA+IGRpdiB7IGRpc3BsYXk6IGlubGluZTsgcGFkZGluZzogM3B4IDEwcHg7IH0iLAogICAgICAgICAgICAgICAgIiNwdi1wcmVmcyAuc2VjdGlvbl9oZWFkZXJfaG9sZGVyIHsgcGFkZGluZy1sZWZ0OiAxMHB4OyB9IiwKICAgICAgICAgICAgICAgIF0uam9pbignXG4nKSArICdcbicsCiAgICAgICAgICAgIHNraW5fdGFiOiBbCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyB7IGJhY2tncm91bmQ6ICNFRUU7IH0iLAogICAgICAgICAgICAgICAgIiNHTV9jb25maWcgdGV4dGFyZWEgeyB3aWR0aDogOTglOyBoZWlnaHQ6IDQ1cHg7IG1hcmdpbi10b3A6IDVweDsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAuZmllbGRfbGFiZWwgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0iLAogICAgICAgICAgICAgICAgLy8g5Zyo5ZCM5LiA6KGM5YaF55qE6K6+572uCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAuaW5saW5lIGlucHV0W3R5cGU9J2NoZWNrYm94J10geyBtYXJnaW4tbGVmdDogMDsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAuaW5saW5lIC5jb25maWdfdmFyIHsgbWFyZ2luLWxlZnQ6IDE1cHg7IH0iLAogICAgICAgICAgICAgICAgLy8g5YaF5a655qC35byPCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAuY29uZmlnX3ZhciB7IGZvbnQtc2l6ZTogMTJweDsgcGFkZGluZzogNXB4OyBtYXJnaW46IDA7IH0iLAogICAgICAgICAgICAgICAgIiNHTV9jb25maWcgLmNvbmZpZ19oZWFkZXIgYSB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6ICMwMDA7IH0iLAogICAgICAgICAgICAgICAgIiNHTV9jb25maWcgLm5hdi10YWJzIHsgbWFyZ2luOiAyMCAwfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAubmF2LXRhYnMgPiBkaXYgeyBmb250LXNpemU6IDE0cHg7IGNvbG9yOiAjOTk5OyBjdXJzb3I6IHBvaW50ZXI7IHBhZGRpbmc6IDEwcHggMjBweDsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAubmF2LXRhYnMgPiAuYWN0aXZlIHsgY3Vyc29yOiBkZWZhdWx0OyBjb2xvcjogI0ZGRjsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyAubmF2LXRhYnMgPiBkaXY6aG92ZXIgeyBjb2xvcjogI0ZGRjsgfSIsCiAgICAgICAgICAgICAgICBdLmpvaW4oJ1xuJykgKyAnXG4nLAogICAgICAgICAgICBza2luXzE6IFsgIC8vIOS7vyBNb3VzZW92ZXIgUG9wdXAgSW1hZ2UgVmlld2VyIOagt+W8jwogICAgICAgICAgICAgICAgIiNHTV9jb25maWcgeyBiYWNrZ3JvdW5kOiAjRUVFOyB9IiwKICAgICAgICAgICAgICAgICIjR01fY29uZmlnIHRleHRhcmVhIHsgd2lkdGg6IDk4JTsgaGVpZ2h0OiA0NXB4OyBtYXJnaW4tdG9wOiA1cHg7IH0iLAogICAgICAgICAgICAgICAgIiNHTV9jb25maWcgLmNvbmZpZ192YXIgeyBmb250LXNpemU6IDEycHg7IH0iLAogICAgICAgICAgICAgICAgIiNHTV9jb25maWcgLmlubGluZSAuY29uZmlnX3ZhciB7IG1hcmdpbi1sZWZ0OiAxNXB4OyB9IiwKICAgICAgICAgICAgICAgICIjR01fY29uZmlnIC5maWVsZF9sYWJlbCB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyB7IHBhZGRpbmc6IDIwcHggMzBweDsgbWFyZ2luOiAwOyB9IiwKICAgICAgICAgICAgICAgICIjR01fY29uZmlnIC5jb25maWdfaGVhZGVyIHsgbWFyZ2luLWJvdHRvbTogMTBweDsgfSIsCiAgICAgICAgICAgICAgICAiI0dNX2NvbmZpZyBkaXYuY29uZmlnX3ZhciB7IHBhZGRpbmc6IDdweCAwOyB9IiwKICAgICAgICAgICAgICAgIF0uam9pbignXG4nKSArICdcbicsCiAgICAgICAgICAgIGJhc2ljUHJlZml4OiAiR01fY29uZmlnIiwKICAgICAgICAgICAgc3R5bGlzaDogIiIKICAgICAgICB9OwogICAgfQoKICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxICYmCiAgICAgICAgdHlwZW9mIGFyZ3NbMF0uaWQgPT0gInN0cmluZyIgJiYKICAgICAgICB0eXBlb2YgYXJnc1swXS5hcHBlbmRDaGlsZCAhPSAiZnVuY3Rpb24iKSB2YXIgc2V0dGluZ3MgPSBhcmdzWzBdOwogICAgZWxzZSB7CiAgICAgICAgLy8gUHJvdmlkZSBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIGFyZ3VtZW50IHN0eWxlIGludGlhbGl6YXRpb24KICAgICAgICB2YXIgc2V0dGluZ3MgPSB7fTsKCiAgICAgICAgLy8gbG9vcCB0aHJvdWdoIEdNX2NvbmZpZy5pbml0KCkgYXJndW1lbnRzCiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmdzLmxlbmd0aCwgYXJnOyBpIDwgbDsgKytpKSB7CiAgICAgICAgICAgIGFyZyA9IGFyZ3NbaV07CgogICAgICAgICAgICAvLyBBbiBlbGVtZW50IHRvIHVzZSBhcyB0aGUgY29uZmlnIHdpbmRvdwogICAgICAgICAgICBpZiAodHlwZW9mIGFyZy5hcHBlbmRDaGlsZCA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICBzZXR0aW5ncy5mcmFtZSA9IGFyZzsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBhcmcpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiBpbiBhcmcpIHsgLy8gY291bGQgYmUgYSBjYWxsYmFjayBmdW5jdGlvbnMgb3Igc2V0dGluZ3Mgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnW2pdICE9ICJmdW5jdGlvbiIpIHsgLy8gd2UgYXJlIGluIHRoZSBzZXR0aW5ncyBvYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnW2pdID09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZnJhbWVTdHlsZSA9IGFyZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuZmllbGRzID0gYXJnOyAvLyBzdG9yZSBzZXR0aW5ncyBvYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBsZWF2ZSB0aGUgbG9vcAogICAgICAgICAgICAgICAgICAgICAgICB9IC8vIG90aGVyd2lzZSBpdCBtdXN0IGJlIGEgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5ldmVudHMpIHNldHRpbmdzLmV2ZW50cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5ldmVudHNbal0gPSBhcmdbal07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZnVuY3Rpb24nOiAvLyBwYXNzaW5nIGEgYmFyZSBmdW5jdGlvbiBpcyBzZXQgdG8gb3BlbiBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmV2ZW50cyA9IHtvcGVuOiBhcmd9OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzogLy8gY291bGQgYmUgY3VzdG9tIENTUyBvciB0aGUgdGl0bGUgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKC9bXHdcLl0rXHMqXHtccypbXHctXStccyo6XHMqXHcrW1xzfFxTXSpcfS8udGVzdChhcmcpKQogICAgICAgICAgICAgICAgICAgIGlmICgvW1x3XC5dK1xzKlx7XHMqW1x3LV0rXHMqOltcc3xcU10qXH0vLnRlc3QoYXJnKSkKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuY3NzID0gYXJnOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZykKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MudGl0bGUgPSBhcmc7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyogSW5pdGlhbGl6ZSBldmVyeXRoaW5nIHVzaW5nIHRoZSBuZXcgc2V0dGluZ3Mgb2JqZWN0ICovCiAgICAvLyBTZXQgdGhlIGlkCiAgICBpZiAoc2V0dGluZ3MuaWQpIGNvbmZpZy5pZCA9IHNldHRpbmdzLmlkOwogICAgZWxzZSBpZiAodHlwZW9mIGNvbmZpZy5pZCA9PSAidW5kZWZpbmVkIikgY29uZmlnLmlkID0gJ0dNX2NvbmZpZyc7CgogICAgLy8gU2V0IHRoZSB0aXRsZQogICAgaWYgKHNldHRpbmdzLnRpdGxlKSBjb25maWcudGl0bGUgPSBzZXR0aW5ncy50aXRsZTsKCiAgICAvLyBTZXQgdGhlIGN1c3RvbSBjc3MKICAgIGlmIChzZXR0aW5ncy5jc3MpIGNvbmZpZy5jc3Muc3R5bGlzaCA9IHNldHRpbmdzLmNzczsKCiAgICBpZiAoc2V0dGluZ3Muc2tpbikgewogICAgICAgIHZhciBza2luID0gY29uZmlnLmNzc1snc2tpbl8nICsgc2V0dGluZ3Muc2tpbl07CiAgICAgICAgaWYgKHNraW4pIHsKICAgICAgICAgICAgY29uZmlnLmNzcy5iYXNpYyArPSBza2luOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBTZXQgdGhlIGZyYW1lCiAgICBpZiAoc2V0dGluZ3MuZnJhbWUpIGNvbmZpZy5mcmFtZSA9IHNldHRpbmdzLmZyYW1lOwogICAgaWYgKHNldHRpbmdzLmZyYW1lU3R5bGUpIGNvbmZpZy5mcmFtZVN0eWxlID0gc2V0dGluZ3MuZnJhbWVTdHlsZTsKCiAgICBjb25maWcuaXNUYWJzID0gc2V0dGluZ3MuaXNUYWJzOwoKICAgIC8vIFNldCB0aGUgZXZlbnQgY2FsbGJhY2tzCiAgICBpZiAoc2V0dGluZ3MuZXZlbnRzKSB7CiAgICAgICAgdmFyIGV2ZW50cyA9IHNldHRpbmdzLmV2ZW50czsKICAgICAgICBmb3IgKHZhciBlIGluIGV2ZW50cykKICAgICAgICAgICAgY29uZmlnWyJvbiIgKyBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgZS5zbGljZSgxKV0gPSBldmVudHNbZV07CiAgICB9CgogICAgLy8gQ3JlYXRlIHRoZSBmaWVsZHMKICAgIGlmIChzZXR0aW5ncy5maWVsZHMpIHsKICAgICAgICB2YXIgc3RvcmVkID0gY29uZmlnLnJlYWQoKSwgLy8gcmVhZCB0aGUgc3RvcmVkIHNldHRpbmdzCiAgICAgICAgICAgICAgICBmaWVsZHMgPSBzZXR0aW5ncy5maWVsZHMsCiAgICAgICAgICAgICAgICBjdXN0b21UeXBlcyA9IHNldHRpbmdzLnR5cGVzIHx8IHt9OwoKICAgICAgICBmb3IgKHZhciBpZCBpbiBmaWVsZHMpIHsKICAgICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2lkXTsKCiAgICAgICAgICAgIC8vIGZvciBlYWNoIGZpZWxkIGRlZmluaXRpb24gY3JlYXRlIGEgZmllbGQgb2JqZWN0CiAgICAgICAgICAgIGlmIChmaWVsZCkKICAgICAgICAgICAgICAgIGNvbmZpZy5maWVsZHNbaWRdID0gbmV3IEdNX2NvbmZpZ0ZpZWxkKGZpZWxkLCBzdG9yZWRbaWRdLCBpZCwKICAgICAgICAgICAgICAgICAgICBjdXN0b21UeXBlc1tmaWVsZC50eXBlXSk7CiAgICAgICAgICAgIGVsc2UgaWYgKGNvbmZpZy5maWVsZHNbaWRdKSBkZWxldGUgY29uZmlnLmZpZWxkc1tpZF07CiAgICAgICAgfQogICAgfQoKICAgIC8vIElmIHRoZSBpZCBoYXMgY2hhbmdlZCB3ZSBtdXN0IG1vZGlmeSB0aGUgZGVmYXVsdCBzdHlsZQogICAgaWYgKGNvbmZpZy5pZCAhPSBjb25maWcuY3NzLmJhc2ljUHJlZml4KSB7CiAgICAgICAgY29uZmlnLmNzcy5iYXNpYyA9IGNvbmZpZy5jc3MuYmFzaWMucmVwbGFjZSgKICAgICAgICAgICAgbmV3IFJlZ0V4cCgnIycgKyBjb25maWcuY3NzLmJhc2ljUHJlZml4LCAnZ20nKSwgJyMnICsgY29uZmlnLmlkKTsKICAgICAgICBjb25maWcuY3NzLmJhc2ljUHJlZml4ID0gY29uZmlnLmlkOwogICAgfQp9CgpHTV9jb25maWdTdHJ1Y3QucHJvdG90eXBlID0gewogICAgLy8gU3VwcG9ydCBvbGQgbWV0aG9kIG9mIGluaXRhbGl6aW5nCiAgICBpbml0OiBmdW5jdGlvbigpIHsKICAgICAgICBHTV9jb25maWdJbml0KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5vbkluaXQoKTsKICAgIH0sCgogICAgLy8gY2FsbCBHTV9jb25maWcub3BlbigpIGZyb20geW91ciBzY3JpcHQgdG8gb3BlbiB0aGUgbWVudQogICAgb3BlbjogZnVuY3Rpb24gKCkgewogICAgICAgIC8vIERpZSBpZiB0aGUgbWVudSBpcyBhbHJlYWR5IG9wZW4gb24gdGhpcyBwYWdlCiAgICAgICAgLy8gWW91IGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBidXQgeW91IGNhbid0IG9wZW4gdGhlIHNhbWUgaW5zdGFuY2UgdHdpY2UKICAgICAgICB2YXIgbWF0Y2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmlkKTsKICAgICAgICBpZiAobWF0Y2ggJiYgKG1hdGNoLnRhZ05hbWUgPT0gIklGUkFNRSIgfHwgbWF0Y2guY2hpbGROb2Rlcy5sZW5ndGggPiAwKSkgcmV0dXJuOwoKICAgICAgICAvLyBTb21ldGltZXMgInRoaXMiIGdldHMgb3ZlcndyaXR0ZW4gc28gY3JlYXRlIGFuIGFsaWFzCiAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXM7CgogICAgICAgIC8vIEZ1bmN0aW9uIHRvIGJ1aWxkIHRoZSBtaWdodHkgY29uZmlnIHdpbmRvdyA6KQogICAgICAgIGZ1bmN0aW9uIGJ1aWxkQ29uZmlnV2luIChib2R5LCBoZWFkKSB7CiAgICAgICAgICAgIHZhciBjcmVhdGUgPSBjb25maWcuY3JlYXRlLAogICAgICAgICAgICAgICAgICAgIGZpZWxkcyA9IGNvbmZpZy5maWVsZHMsCiAgICAgICAgICAgICAgICAgICAgY29uZmlnSWQgPSBjb25maWcuaWQsCiAgICAgICAgICAgICAgICAgICAgYm9keVdyYXBwZXIgPSBjcmVhdGUoJ2RpdicsIHtpZDogY29uZmlnSWQgKyAnX3dyYXBwZXInfSk7CgogICAgICAgICAgICAvLyBBcHBlbmQgdGhlIHN0eWxlIHdoaWNoIGlzIG91ciBkZWZhdWx0IHN0eWxlIHBsdXMgdGhlIHVzZXIgc3R5bGUKICAgICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZCgKICAgICAgICAgICAgICAgIGNyZWF0ZSgnc3R5bGUnLCB7CiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dC9jc3MnLAogICAgICAgICAgICAgICAgdGV4dENvbnRlbnQ6IGNvbmZpZy5jc3MuYmFzaWMgKyBjb25maWcuY3NzLnN0eWxpc2gKICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgLy8gQWRkIGhlYWRlciBhbmQgdGl0bGUKICAgICAgICAgICAgYm9keVdyYXBwZXIuYXBwZW5kQ2hpbGQoY3JlYXRlKCdkaXYnLCB7CiAgICAgICAgICAgICAgICBpZDogY29uZmlnSWQgKyAnX2hlYWRlcicsCiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdjb25maWdfaGVhZGVyIGJsb2NrIGNlbnRlcicKICAgICAgICAgICAgfSwgY29uZmlnLnRpdGxlKSk7CgogICAgICAgICAgICAvLyBBcHBlbmQgZWxlbWVudHMKICAgICAgICAgICAgdmFyIHNlY3Rpb24gPSBib2R5V3JhcHBlciwKICAgICAgICAgICAgICAgICAgICBzZWNOdW0gPSAwOyAvLyBTZWN0aW9uIGNvdW50CiAgICAgICAgICAgIHZhciBsYXN0UGFyZW50Tm9kZSA9IG51bGw7CgogICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggZmllbGRzCiAgICAgICAgICAgIGZvciAodmFyIGlkIGluIGZpZWxkcykgewogICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW2lkXSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSBmaWVsZC5zZXR0aW5nczsKCiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3Muc2VjdGlvbikgeyAvLyB0aGUgc3RhcnQgb2YgYSBuZXcgc2VjdGlvbgogICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBib2R5V3JhcHBlci5hcHBlbmRDaGlsZChjcmVhdGUoJ2RpdicsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3NlY3Rpb25faGVhZGVyX2hvbGRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogY29uZmlnSWQgKyAnX3NlY3Rpb25fJyArIHNlY051bQogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc2V0dGluZ3Muc2VjdGlvbikgIT09ICdbb2JqZWN0IEFycmF5XScpCiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnNlY3Rpb24gPSBbc2V0dGluZ3Muc2VjdGlvbl07CgogICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5zZWN0aW9uWzBdKQogICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKGNyZWF0ZSgnZGl2JywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnc2VjdGlvbl9oZWFkZXIgY2VudGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBjb25maWdJZCArICdfc2VjdGlvbl9oZWFkZXJfJyArIHNlY051bQogICAgICAgICAgICAgICAgICAgICAgICB9LCBzZXR0aW5ncy5zZWN0aW9uWzBdKSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5zZWN0aW9uWzFdKQogICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLmFwcGVuZENoaWxkKGNyZWF0ZSgncCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3NlY3Rpb25fZGVzYyBjZW50ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbmZpZ0lkICsgJ19zZWN0aW9uX2Rlc2NfJyArIHNlY051bQogICAgICAgICAgICAgICAgICAgICAgICB9LCBzZXR0aW5ncy5zZWN0aW9uWzFdKSk7CiAgICAgICAgICAgICAgICAgICAgKytzZWNOdW07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmxpbmUgPT0gJ3N0YXJ0JyAmJiBsYXN0UGFyZW50Tm9kZSkgeyAgLy8g5YiH5o2i5Yiw5LiL5LiA6KGMCiAgICAgICAgICAgICAgICAgICAgbGFzdFBhcmVudE5vZGUgPSBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBmaWVsZCBlbGVtZW50cyBhbmQgYXBwZW5kIHRvIGN1cnJlbnQgc2VjdGlvbgogICAgICAgICAgICAgICAgKGxhc3RQYXJlbnROb2RlIHx8IHNlY3Rpb24pLmFwcGVuZENoaWxkKChmaWVsZC53cmFwcGVyID0gZmllbGQudG9Ob2RlKGNvbmZpZ0lkLCBsYXN0UGFyZW50Tm9kZSkpKTsKCiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MubGluZSA9PSAnc3RhcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgbGFzdFBhcmVudE5vZGUgPSBmaWVsZC53cmFwcGVyOwogICAgICAgICAgICAgICAgICAgIGxhc3RQYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoJ2lubGluZScpCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNldHRpbmdzLmxpbmUgPT0gJ2VuZCcpIHsKICAgICAgICAgICAgICAgICAgICBsYXN0UGFyZW50Tm9kZSA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFkZCBzYXZlIGFuZCBjbG9zZSBidXR0b25zCiAgICAgICAgICAgIGJvZHlXcmFwcGVyLmFwcGVuZENoaWxkKGNyZWF0ZSgnZGl2JywKICAgICAgICAgICAgICAgIHtpZDogY29uZmlnSWQgKyAnX2J1dHRvbnNfaG9sZGVyJ30sCgogICAgICAgICAgICAgICAgY3JlYXRlKCdidXR0b24nLCB7CiAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbmZpZ0lkICsgJ19zYXZlQnRuJywKICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudDogJ+ehruWumicsCiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfpg6jliIbpgInpobnpnIDopoHliLfmlrDpobXpnaLmiY3og73nlJ/mlYgnLAogICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3NhdmVjbG9zZV9idXR0b25zJywKICAgICAgICAgICAgICAgICAgICBvbmNsaWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYXZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLAoKICAgICAgICAgICAgICAgIGNyZWF0ZSgnYnV0dG9uJywgewogICAgICAgICAgICAgICAgICAgIGlkOiBjb25maWdJZCArICdfY2xvc2VCdG4nLAogICAgICAgICAgICAgICAgICAgIHRleHRDb250ZW50OiAn5Y+W5raIJywKICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+WPlua2iOacrOasoeiuvue9ru+8jOaJgOaciemAiemhuei/mOWOnycsCiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnc2F2ZWNsb3NlX2J1dHRvbnMnLAogICAgICAgICAgICAgICAgICAgIG9uY2xpY2s6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSwKCiAgICAgICAgICAgICAgICBjcmVhdGUoJ2RpdicsCiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogJ3Jlc2V0X2hvbGRlciBibG9jayd9LAoKICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBsaW5rCiAgICAgICAgICAgICAgICAgICAgY3JlYXRlKCdhJywgewogICAgICAgICAgICAgICAgICAgICAgICBpZDogY29uZmlnSWQgKyAnX3Jlc2V0TGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRDb250ZW50OiAn5oGi5aSN6buY6K6k6K6+572uJywKICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogJyMnLAogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+aBouWkjeaJgOacieiuvue9rueahOWGheWuueS4uum7mOiupOWAvCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3Jlc2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgb25jbGljazogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5yZXNldCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICApKSk7CgogICAgICAgICAgICBib2R5LmFwcGVuZENoaWxkKGJvZHlXcmFwcGVyKTsgLy8gUGFpbnQgZXZlcnl0aGluZyB0byB3aW5kb3cgYXQgb25jZQogICAgICAgICAgICBjb25maWcuY2VudGVyKCk7IC8vIFNob3cgYW5kIGNlbnRlciBpZnJhbWUKICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGNvbmZpZy5jZW50ZXIsIGZhbHNlKTsgLy8gQ2VudGVyIGZyYW1lIG9uIHJlc2l6ZQoKICAgICAgICAgICAgLy8gQ2FsbCB0aGUgb3BlbigpIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgICAgICAgIGNvbmZpZy5vbk9wZW4oY29uZmlnLmZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBjb25maWcuZnJhbWUub3duZXJEb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mcmFtZS5jb250ZW50V2luZG93IHx8IHdpbmRvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mcmFtZSk7CgogICAgICAgICAgICBpZiAoY29uZmlnLmlzVGFicykgewogICAgICAgICAgICAgICAgY29uZmlnLnRvVGFicygpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDbG9zZSBmcmFtZSBvbiB3aW5kb3cgY2xvc2UKICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcuY2xvc2UoKTsKICAgICAgICAgICAgfSwgZmFsc2UpOwoKICAgICAgICAgICAgLy8gTm93IHRoYXQgZXZlcnl0aGluZyBpcyBsb2FkZWQsIG1ha2UgaXQgdmlzaWJsZQogICAgICAgICAgICBjb25maWcuZnJhbWUuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CiAgICAgICAgICAgIGNvbmZpZy5pc09wZW4gPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hhbmdlIHRoaXMgaW4gdGhlIG9uT3BlbiBjYWxsYmFjayB1c2luZyB0aGlzLmZyYW1lLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnJykKICAgICAgICB2YXIgZGVmYXVsdFN0eWxlID0gJ2JvdHRvbTogYXV0bzsgYm9yZGVyOiAxcHggc29saWQgIzAwMDsgZGlzcGxheTogbm9uZTsgaGVpZ2h0OiA3NSU7JwoJCQkrICcgbGVmdDogMDsgbWFyZ2luOiAwOyBtYXgtaGVpZ2h0OiA5NSU7IG1heC13aWR0aDogOTUlOyBvcGFjaXR5OiAwOycKCQkJKyAnIG92ZXJmbG93OiBhdXRvOyBwYWRkaW5nOiAwOyBwb3NpdGlvbjogZml4ZWQ7IHJpZ2h0OiBhdXRvOyB0b3A6IDA7JwoJCQkrICcgd2lkdGg6IDc1JTsgei1pbmRleDogOTk5OTk5OTk5Oyc7CgogICAgICAgIC8vIEVpdGhlciB1c2UgdGhlIGVsZW1lbnQgcGFzc2VkIHRvIGluaXQoKSBvciBjcmVhdGUgYW4gaWZyYW1lCiAgICAgICAgaWYgKHRoaXMuZnJhbWUpIHsKICAgICAgICAgICAgdGhpcy5mcmFtZS5pZCA9IHRoaXMuaWQ7IC8vIEFsbG93cyBmb3IgcHJlZml4aW5nIHN0eWxlcyB3aXRoIHRoZSBjb25maWcgaWQKICAgICAgICAgICAgdGhpcy5mcmFtZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgZGVmYXVsdFN0eWxlKTsKICAgICAgICAgICAgYnVpbGRDb25maWdXaW4odGhpcy5mcmFtZSwgdGhpcy5mcmFtZS5vd25lckRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIENyZWF0ZSBmcmFtZQogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCh0aGlzLmZyYW1lID0gdGhpcy5jcmVhdGUoJ2lmcmFtZScsIHsKICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLAogICAgICAgICAgICAgICAgc3R5bGU6IGRlZmF1bHRTdHlsZQogICAgICAgICAgICB9KSkpOwoKICAgICAgICAgICAgaWYgKHRoaXMuZnJhbWVTdHlsZSkgewogICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5mcmFtZVN0eWxlKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mcmFtZS5zdHlsZVtrZXldID0gY29uZmlnLmZyYW1lU3R5bGVba2V5XTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEluIFdlYktpdCBzcmMgY2FuJ3QgYmUgc2V0IHVudGlsIGl0IGlzIGFkZGVkIHRvIHRoZSBwYWdlCiAgICAgICAgICAgIHRoaXMuZnJhbWUuc3JjID0gJ2Fib3V0OmJsYW5rJzsKICAgICAgICAgICAgLy8gd2Ugd2FpdCBmb3IgdGhlIGlmcmFtZSB0byBsb2FkIGJlZm9yZSB3ZSBjYW4gbW9kaWZ5IGl0CiAgICAgICAgICAgIHRoaXMuZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZnJhbWUgPSBjb25maWcuZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgdmFyIGJvZHkgPSBmcmFtZS5jb250ZW50RG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXTsKICAgICAgICAgICAgICAgICAgICBib2R5LmlkID0gY29uZmlnLmlkOyAvLyBBbGxvd3MgZm9yIHByZWZpeGluZyBzdHlsZXMgd2l0aCB0aGUgY29uZmlnIGlkCiAgICAgICAgICAgICAgICAgICAgYnVpbGRDb25maWdXaW4oYm9keSwgZnJhbWUuY29udGVudERvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0pOwogICAgICAgICAgICB9LCBmYWxzZSk7CiAgICAgICAgfQogICAgfSwKCiAgICBzYXZlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGZvcmdvdHRlbiA9IHRoaXMud3JpdGUoKTsKICAgICAgICB0aGlzLm9uU2F2ZShmb3Jnb3R0ZW4pOyAvLyBDYWxsIHRoZSBzYXZlKCkgY2FsbGJhY2sgZnVuY3Rpb24KICAgIH0sCgogICAgY2xvc2U6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghdGhpcy5mcmFtZSkgcmV0dXJuOwogICAgICAgIC8vIElmIGZyYW1lIGlzIGFuIGlmcmFtZSB0aGVuIHJlbW92ZSBpdAogICAgICAgIGlmICh0aGlzLmZyYW1lLmNvbnRlbnREb2N1bWVudCkgewogICAgICAgICAgICB0aGlzLnJlbW92ZSh0aGlzLmZyYW1lKTsKICAgICAgICAgICAgdGhpcy5mcmFtZSA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsgLy8gZWxzZSB3aXBlIGl0cyBjb250ZW50CiAgICAgICAgICAgIHRoaXMuZnJhbWUuaW5uZXJIVE1MID0gIiI7CiAgICAgICAgICAgIHRoaXMuZnJhbWUuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgICAgICB9CgogICAgICAgIC8vIE51bGwgb3V0IGFsbCB0aGUgZmllbGRzIHNvIHdlIGRvbid0IGxlYWsgbWVtb3J5CiAgICAgICAgdmFyIGZpZWxkcyA9IHRoaXMuZmllbGRzOwogICAgICAgIGZvciAodmFyIGlkIGluIGZpZWxkcykgewogICAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbaWRdOwogICAgICAgICAgICBmaWVsZC53cmFwcGVyID0gbnVsbDsKICAgICAgICAgICAgZmllbGQubm9kZSA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICB0aGlzLm9uQ2xvc2UoKTsgLy8gIENhbGwgdGhlIGNsb3NlKCkgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlOwogICAgfSwKCiAgICBzZXQ6IGZ1bmN0aW9uIChuYW1lLCB2YWwpIHsKICAgICAgICB0aGlzLmZpZWxkc1tuYW1lXS52YWx1ZSA9IHZhbDsKICAgIH0sCgogICAgZ2V0OiBmdW5jdGlvbiAobmFtZSkgewogICAgICAgIHJldHVybiB0aGlzLmZpZWxkc1tuYW1lXS52YWx1ZTsKICAgIH0sCgogICAgd3JpdGU6IGZ1bmN0aW9uIChzdG9yZSwgb2JqKSB7CiAgICAgICAgaWYgKCFvYmopIHsKICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHt9LAogICAgICAgICAgICAgICAgICAgIGZvcmdvdHRlbiA9IHt9LAogICAgICAgICAgICAgICAgICAgIGZpZWxkcyA9IHRoaXMuZmllbGRzOwoKICAgICAgICAgICAgZm9yICh2YXIgaWQgaW4gZmllbGRzKSB7CiAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbaWRdOwogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZmllbGQudG9WYWx1ZSgpOwoKICAgICAgICAgICAgICAgIGlmIChmaWVsZC5zYXZlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2lkXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaWRdID0gZmllbGQudmFsdWU7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICBmb3Jnb3R0ZW5baWRdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShzdG9yZSB8fCB0aGlzLmlkLCB0aGlzLnN0cmluZ2lmeShvYmogfHwgdmFsdWVzKSk7CiAgICAgICAgfSBjYXRjaChlKSB7CiAgICAgICAgICAgIHRoaXMubG9nKCJHTV9jb25maWcgZmFpbGVkIHRvIHNhdmUgc2V0dGluZ3MhIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZm9yZ290dGVuOwogICAgfSwKCiAgICByZWFkOiBmdW5jdGlvbiAoc3RvcmUpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgcnZhbCA9IHRoaXMucGFyc2VyKHRoaXMuZ2V0VmFsdWUoc3RvcmUgfHwgdGhpcy5pZCwgJ3t9JykpOwogICAgICAgIH0gY2F0Y2goZSkgewogICAgICAgICAgICB0aGlzLmxvZygiR01fY29uZmlnIGZhaWxlZCB0byByZWFkIHNhdmVkIHNldHRpbmdzISIpOwogICAgICAgICAgICB2YXIgcnZhbCA9IHt9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcnZhbDsKICAgIH0sCgogICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgZmllbGRzID0gdGhpcy5maWVsZHM7CgogICAgICAgIC8vIFJlc2V0IGFsbCB0aGUgZmllbGRzCiAgICAgICAgZm9yICh2YXIgaWQgaW4gZmllbGRzKSBmaWVsZHNbaWRdLnJlc2V0KCk7CgogICAgICAgIHRoaXMub25SZXNldCgpOyAvLyBDYWxsIHRoZSByZXNldCgpIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICB9LAoKICAgIGNyZWF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHN3aXRjaChhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgIHZhciBBID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYXJndW1lbnRzWzBdKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdmFyIEEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGFyZ3VtZW50c1swXSksCiAgICAgICAgICAgICAgICAgICAgICAgIEIgPSBhcmd1bWVudHNbMV07CiAgICAgICAgICAgICAgICBmb3IgKHZhciBiIGluIEIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYi5pbmRleE9mKCJvbiIpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIEEuYWRkRXZlbnRMaXN0ZW5lcihiLnN1YnN0cmluZygyKSwgQltiXSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCIsc3R5bGUsYWNjZXNza2V5LGlkLG5hbWUsc3JjLGhyZWYsd2hpY2gsZm9yIi5pbmRleE9mKCIsIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnRvTG93ZXJDYXNlKCkpICE9IC0xKQogICAgICAgICAgICAgICAgICAgICAgICBBLnNldEF0dHJpYnV0ZShiLCBCW2JdKTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgQltiXSAhPSAndW5kZWZpbmVkJykKICAgICAgICAgICAgICAgICAgICAgICAgQVtiXSA9IEJbYl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1syXSA9PSAic3RyaW5nIikKICAgICAgICAgICAgICAgICAgICBBLmlubmVySFRNTCA9IGFyZ3VtZW50c1syXTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMiwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgKytpKQogICAgICAgICAgICAgICAgICAgICAgICBBLmFwcGVuZENoaWxkKGFyZ3VtZW50c1tpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBBOwogICAgfSwKCiAgICBjZW50ZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZnJhbWU7CiAgICAgICAgaWYgKCFub2RlKSByZXR1cm47CiAgICAgICAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZSwKICAgICAgICAgICAgICAgIGJlZm9yZU9wYWNpdHkgPSBzdHlsZS5vcGFjaXR5OwogICAgICAgIGlmIChzdHlsZS5kaXNwbGF5ID09ICdub25lJykgc3R5bGUub3BhY2l0eSA9ICcwJzsKICAgICAgICBzdHlsZS5kaXNwbGF5ID0gJyc7CiAgICAgICAgc3R5bGUudG9wID0gTWF0aC5mbG9vcigod2luZG93LmlubmVySGVpZ2h0IC8gMikgLSAobm9kZS5vZmZzZXRIZWlnaHQgLyAyKSkgKyAncHgnOwogICAgICAgIHN0eWxlLmxlZnQgPSBNYXRoLmZsb29yKCh3aW5kb3cuaW5uZXJXaWR0aCAvIDIpIC0gKG5vZGUub2Zmc2V0V2lkdGggLyAyKSkgKyAncHgnOwogICAgICAgIHN0eWxlLm9wYWNpdHkgPSAnMSc7CiAgICB9LAoKICAgIHJlbW92ZTogZnVuY3Rpb24gKGVsKSB7CiAgICAgICAgaWYgKGVsICYmIGVsLnBhcmVudE5vZGUpIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpOwogICAgfSwKCiAgICB0b1RhYnM6IGZ1bmN0aW9uKCkgeyAgLy8g6L2s5Li6IHRhYiDnmoTlvaLlvI8KICAgICAgICB2YXIgYm9keSA9IHRoaXMuZnJhbWUudGFnTmFtZSA9PSAnSUZSQU1FJyA/IHRoaXMuZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudCA6IHRoaXMuZnJhbWUsCiAgICAgICAgICAgIGNvbmZpZ0lkID0gdGhpcy5pZDsKICAgICAgICB2YXIgJCA9IGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgICAgIHJldHVybiBib2R5LmdldEVsZW1lbnRCeUlkKGNvbmZpZ0lkICsgJ18nICsgaWQpOwogICAgICAgIH07CgogICAgICAgIHZhciBoZWFkZXJzID0gYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcuc2VjdGlvbl9oZWFkZXInKTsKICAgICAgICBpZiAoIWhlYWRlcnMubGVuZ3RoKSByZXR1cm47CgogICAgICAgIHZhciBhbmNoID0gdGhpcy5jcmVhdGUoJ2RpdicsIHsKICAgICAgICAgICAgLy8gaWQ6IGNvbmZpZ0lkICsgJ190YWJfaG9sZGVyJywKICAgICAgICAgICAgY2xhc3NOYW1lOiAnbmF2LXRhYnMnLAogICAgICAgIH0pOwoKICAgICAgICBmb3IgKHZhciBpID0gMCwgaGVhZGVyOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBoZWFkZXIgPSBoZWFkZXJzW2ldOwogICAgICAgICAgICBpZiAoaSA9PSAwKSB7CiAgICAgICAgICAgICAgICBoZWFkZXIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYW5jaC5hcHBlbmRDaGlsZChoZWFkZXIpOwogICAgICAgIH0KCiAgICAgICAgYW5jaC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMudG9nZ2xlVGFiLmJpbmQodGhpcyksIGZhbHNlKTsKCiAgICAgICAgJCgnc2VjdGlvbl8wJykucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYW5jaCwgJCgnc2VjdGlvbl8wJykpOwoKICAgICAgICB2YXIgY3VyVGFiID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3BpY3ZpZXdlckNFLmNvbmZpZy5jdXJUYWInKSB8fCAwOwogICAgICAgIHRoaXMudG9nZ2xlVGFiKHBhcnNlSW50KGN1clRhYiwgMTApKTsKICAgIH0sCiAgICB0b2dnbGVUYWI6IGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgYm9keSA9IHRoaXMuZnJhbWUudGFnTmFtZSA9PSAnSUZSQU1FJyA/IHRoaXMuZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudCA6IHRoaXMuZnJhbWUsCiAgICAgICAgICAgIGNvbmZpZ0lkID0gdGhpcy5pZDsKCiAgICAgICAgdmFyIGN1clRhYiA9IHR5cGVvZiBlID09ICdudW1iZXInID8gZSA6IC9cXyhcZCspLy5leGVjKGUudGFyZ2V0LmlkKVsxXTsKCiAgICAgICAgW10uZm9yRWFjaC5jYWxsKGJvZHkucXVlcnlTZWxlY3RvckFsbCgnLnNlY3Rpb25faGVhZGVyJyksIGZ1bmN0aW9uKGhlYWRlciwgaSkgewogICAgICAgICAgICBpZiAoaSA9PSBjdXJUYWIpIHsKICAgICAgICAgICAgICAgIGhlYWRlci5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGhlYWRlci5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBbXS5mb3JFYWNoLmNhbGwoYm9keS5xdWVyeVNlbGVjdG9yQWxsKCcuc2VjdGlvbl9oZWFkZXJfaG9sZGVyJyksIGZ1bmN0aW9uKGhvbGRlciwgaSkgewogICAgICAgICAgICBob2xkZXIuc3R5bGUuZGlzcGxheSA9IChpID09IGN1clRhYikgPyAnYmxvY2snIDogJ25vbmUnOwogICAgICAgIH0pOwoKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncGljdmlld2VyQ0UuY29uZmlnLmN1clRhYicsIGN1clRhYikKICAgIH0KfTsKCi8vIERlZmluZSBhIGJ1bmNoIG9mIEFQSSBzdHVmZgooZnVuY3Rpb24oKSB7CiAgICB2YXIgaXNHTSA9IHR5cGVvZiBHTV9nZXRWYWx1ZSAhPSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIEdNX2dldFZhbHVlKCdhJywgJ2InKSAhPSAndW5kZWZpbmVkJywKICAgICAgICAgICAgc2V0VmFsdWUsIGdldFZhbHVlLCBzdHJpbmdpZnksIHBhcnNlcjsKCiAgICAvLyBEZWZpbmUgdmFsdWUgc3RvcmluZyBhbmQgcmVhZGluZyBBUEkKICAgIGlmICghaXNHTSkgewogICAgICAgIHNldFZhbHVlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lLCB2YWx1ZSk7CiAgICAgICAgfTsKICAgICAgICBnZXRWYWx1ZSA9IGZ1bmN0aW9uKG5hbWUsIGRlZil7CiAgICAgICAgICAgIHZhciBzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obmFtZSk7CiAgICAgICAgICAgIHJldHVybiBzID09IG51bGwgPyBkZWYgOiBzCiAgICAgICAgfTsKCiAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IEpTT04gcGFyc2VyIG91dHNpZGUgR00KICAgICAgICBzdHJpbmdpZnkgPSBKU09OLnN0cmluZ2lmeTsKICAgICAgICBwYXJzZXIgPSBKU09OLnBhcnNlOwogICAgfSBlbHNlIHsKICAgICAgICBzZXRWYWx1ZSA9IEdNX3NldFZhbHVlOwogICAgICAgIGdldFZhbHVlID0gR01fZ2V0VmFsdWU7CiAgICAgICAgc3RyaW5naWZ5ID0gdHlwZW9mIEpTT04gPT0gInVuZGVmaW5lZCIgPwogICAgICAgICAgICBmdW5jdGlvbihvYmopIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmoudG9Tb3VyY2UoKTsKICAgICAgICB9IDogSlNPTi5zdHJpbmdpZnk7CiAgICAgICAgcGFyc2VyID0gdHlwZW9mIEpTT04gPT0gInVuZGVmaW5lZCIgPwogICAgICAgICAgICBmdW5jdGlvbihqc29uRGF0YSkgewogICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgRnVuY3Rpb24oJ3JldHVybiAnICsganNvbkRhdGEgKyAnOycpKSgpOwogICAgICAgIH0gOiBKU09OLnBhcnNlOwogICAgfQoKICAgIEdNX2NvbmZpZ1N0cnVjdC5wcm90b3R5cGUuaXNHTSA9IGlzR007CiAgICBHTV9jb25maWdTdHJ1Y3QucHJvdG90eXBlLnNldFZhbHVlID0gc2V0VmFsdWU7CiAgICBHTV9jb25maWdTdHJ1Y3QucHJvdG90eXBlLmdldFZhbHVlID0gZ2V0VmFsdWU7CiAgICBHTV9jb25maWdTdHJ1Y3QucHJvdG90eXBlLnN0cmluZ2lmeSA9IHN0cmluZ2lmeTsKICAgIEdNX2NvbmZpZ1N0cnVjdC5wcm90b3R5cGUucGFyc2VyID0gcGFyc2VyOwogICAgR01fY29uZmlnU3RydWN0LnByb3RvdHlwZS5sb2cgPSAgd2luZG93LmNvbnNvbGUgPwogICAgICAgIGNvbnNvbGUubG9nIDogKGlzR00gJiYgdHlwZW9mIEdNX2xvZyAhPSAndW5kZWZpbmVkJyA/CiAgICAgICAgICAgIEdNX2xvZyA6ICh3aW5kb3cub3BlcmEgPwogICAgICAgICAgICAgICAgb3BlcmEucG9zdEVycm9yIDogZnVuY3Rpb24oKXsgLyogbm8gbG9nZ2luZyAqLyB9CiAgICApKTsKfSkoKTsKCmZ1bmN0aW9uIEdNX2NvbmZpZ0RlZmF1bHRWYWx1ZSh0eXBlLCBvcHRpb25zKSB7CiAgICB2YXIgdmFsdWU7CgogICAgaWYgKHR5cGUgJiYgdHlwZS5pbmRleE9mKCd1bnNpZ25lZCAnKSA9PSAwKQogICAgICAgIHR5cGUgPSB0eXBlLnN1YnN0cmluZyg5KTsKCiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICBjYXNlICdyYWRpbyc6IGNhc2UgJ3NlbGVjdCc6CiAgICAgICAgICAgIHZhbHVlID0gb3B0aW9uc1swXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnY2hlY2tib3gnOgogICAgICAgICAgICB2YWx1ZSA9IGZhbHNlOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdpbnQnOiBjYXNlICdpbnRlZ2VyJzoKICAgICAgICBjYXNlICdmbG9hdCc6IGNhc2UgJ251bWJlcic6CiAgICAgICAgICAgIHZhbHVlID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdmFsdWUgPSAnJzsKICAgIH0KCiAgICByZXR1cm4gdmFsdWU7Cn0KCmZ1bmN0aW9uIEdNX2NvbmZpZ0ZpZWxkKHNldHRpbmdzLCBzdG9yZWQsIGlkLCBjdXN0b21UeXBlKSB7CiAgICAvLyBTdG9yZSB0aGUgZmllbGQncyBzZXR0aW5ncwogICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzOwogICAgdGhpcy5pZCA9IGlkOwogICAgdGhpcy5ub2RlID0gbnVsbDsKICAgIHRoaXMud3JhcHBlciA9IG51bGw7CiAgICB0aGlzLnNhdmUgPSB0eXBlb2Ygc2V0dGluZ3Muc2F2ZSA9PSAidW5kZWZpbmVkIiA/IHRydWUgOiBzZXR0aW5ncy5zYXZlOwoKICAgIC8vIEJ1dHRvbnMgYXJlIHN0YXRpYyBhbmQgZG9uJ3QgaGF2ZSBhIHN0b3JlZCB2YWx1ZQogICAgaWYgKHNldHRpbmdzLnR5cGUgPT0gImJ1dHRvbiIpIHRoaXMuc2F2ZSA9IGZhbHNlOwogICAgaWYgKHNldHRpbmdzLnR5cGUgPT0gInNwYW4iKSB0aGlzLnNhdmUgPSBmYWxzZTsKCiAgICAvLyBpZiBhIGRlZmF1bHQgdmFsdWUgd2Fzbid0IHBhc3NlZCB0aHJvdWdoIGluaXQoKSB0aGVuCiAgICAvLyAgIGlmIHRoZSB0eXBlIGlzIGN1c3RvbSB1c2UgaXRzIGRlZmF1bHQgdmFsdWUKICAgIC8vICAgZWxzZSB1c2UgZGVmYXVsdCB2YWx1ZSBmb3IgdHlwZQogICAgLy8gZWxzZSB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgcGFzc2VkIHRocm91Z2ggaW5pdCgpCiAgICB0aGlzWydkZWZhdWx0J10gPSB0eXBlb2Ygc2V0dGluZ3NbJ2RlZmF1bHQnXSA9PSAidW5kZWZpbmVkIiA/CiAgICAgICAgY3VzdG9tVHlwZSA/CiAgICAgICAgICAgIGN1c3RvbVR5cGVbJ2RlZmF1bHQnXQogICAgICAgICAgICA6IEdNX2NvbmZpZ0RlZmF1bHRWYWx1ZShzZXR0aW5ncy50eXBlLCBzZXR0aW5ncy5vcHRpb25zKQogICAgICAgIDogc2V0dGluZ3NbJ2RlZmF1bHQnXTsKCiAgICAvLyBTdG9yZSB0aGUgZmllbGQncyB2YWx1ZQogICAgdGhpcy52YWx1ZSA9IHR5cGVvZiBzdG9yZWQgPT0gInVuZGVmaW5lZCIgPyB0aGlzWydkZWZhdWx0J10gOiBzdG9yZWQ7CgogICAgLy8gU2V0dXAgbWV0aG9kcyBmb3IgYSBjdXN0b20gdHlwZQogICAgaWYgKGN1c3RvbVR5cGUpIHsKICAgICAgICB0aGlzLnRvTm9kZSA9IGN1c3RvbVR5cGUudG9Ob2RlOwogICAgICAgIHRoaXMudG9WYWx1ZSA9IGN1c3RvbVR5cGUudG9WYWx1ZTsKICAgICAgICB0aGlzLnJlc2V0ID0gY3VzdG9tVHlwZS5yZXNldDsKICAgIH0KfQoKR01fY29uZmlnRmllbGQucHJvdG90eXBlID0gewogICAgY3JlYXRlOiBHTV9jb25maWdTdHJ1Y3QucHJvdG90eXBlLmNyZWF0ZSwKCiAgICB0b05vZGU6IGZ1bmN0aW9uKGNvbmZpZ0lkLCBsYXN0UGFyZW50Tm9kZSkgewogICAgICAgIHZhciBmaWVsZCA9IHRoaXMuc2V0dGluZ3MsCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMudmFsdWUsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gZmllbGQub3B0aW9ucywKICAgICAgICAgICAgICAgIHR5cGUgPSBmaWVsZC50eXBlLAogICAgICAgICAgICAgICAgaWQgPSB0aGlzLmlkLAogICAgICAgICAgICAgICAgbGFiZWxQb3MgPSBmaWVsZC5sYWJlbFBvcywKICAgICAgICAgICAgICAgIGNyZWF0ZSA9IHRoaXMuY3JlYXRlOwoKICAgICAgICBmdW5jdGlvbiBhZGRMYWJlbChwb3MsIGxhYmVsRWwsIHBhcmVudE5vZGUsIGJlZm9yZUVsKSB7CiAgICAgICAgICAgIGlmICghYmVmb3JlRWwpIHsKICAgICAgICAgICAgICAgIGJlZm9yZUVsID0gbGFzdFBhcmVudE5vZGUgPyBwYXJlbnROb2RlLmxhc3RDaGlsZCA6IHBhcmVudE5vZGUuZmlyc3RDaGlsZDsgIC8vIG9uZUxpbmUg55qE5L+u5q2jCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN3aXRjaCAocG9zKSB7CiAgICAgICAgICAgICAgICBjYXNlICdyaWdodCc6IGNhc2UgJ2JlbG93JzoKICAgICAgICAgICAgICAgICAgICBpZiAocG9zID09ICdiZWxvdycpCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY3JlYXRlKCdicicsIHt9KSk7CiAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChsYWJlbEVsKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSAnYWJvdmUnKQogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjcmVhdGUoJ2JyJywge30pLCBiZWZvcmVFbCk7CiAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobGFiZWxFbCwgYmVmb3JlRWwpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgcmV0Tm9kZSA9IGNyZWF0ZShsYXN0UGFyZW50Tm9kZSA/ICdzcGFuJyA6ICdkaXYnLCB7IGNsYXNzTmFtZTogJ2NvbmZpZ192YXInLAogICAgICAgICAgICAgICAgICAgIGlkOiBjb25maWdJZCArICdfJyArIGlkICsgJ192YXInLAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiBmaWVsZC50aXRsZSB9KSwKICAgICAgICAgICAgZmlyc3RQcm9wOwogICAgICAgIGlmIChsYXN0UGFyZW50Tm9kZSAmJiBmaWVsZC5jbGFzc05hbWUpIHJldE5vZGUuY2xhc3NMaXN0LmFkZChmaWVsZC5jbGFzc05hbWUpOwoKICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZmlyc3QgcHJvcAogICAgICAgIGZvciAodmFyIGkgaW4gZmllbGQpIHsgZmlyc3RQcm9wID0gaTsgYnJlYWs7IH0KCiAgICAgICAgdmFyIGxhYmVsID0gZmllbGQubGFiZWwgJiYgdHlwZSAhPSAiYnV0dG9uIiA/CiAgICAgICAgICAgIGNyZWF0ZSgnbGFiZWwnLCB7CiAgICAgICAgICAgICAgICBpZDogY29uZmlnSWQgKyAnXycgKyBpZCArICdfZmllbGRfbGFiZWwnLAogICAgICAgICAgICAgICAgZm9yOiBjb25maWdJZCArICdfZmllbGRfJyArIGlkLAogICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnZmllbGRfbGFiZWwnCiAgICAgICAgICAgIH0sIGZpZWxkLmxhYmVsKSA6IG51bGw7CgogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlICdzcGFuJzoKICAgICAgICAgICAgICAgIGxhYmVsID0gbnVsbDsKCiAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBjcmVhdGUoJ3NwYW4nLCB7CiAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBmaWVsZC5sYWJlbCwKICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdmaWVsZF9sYWJlbCcsCiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGZpZWxkLnRpdGxlLAogICAgICAgICAgICAgICAgICAgIHN0eWxlOiBmaWVsZC5zdHlsZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXROb2RlID0gdGhpcy5ub2RlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3RleHRhcmVhJzoKICAgICAgICAgICAgICAgIHJldE5vZGUuYXBwZW5kQ2hpbGQoKHRoaXMubm9kZSA9IGNyZWF0ZSgndGV4dGFyZWEnLCB7CiAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICBpZDogY29uZmlnSWQgKyAnX2ZpZWxkXycgKyBpZCwKICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdibG9jaycgKyAoZmllbGQuY2xhc3NOYW1lID8gKCIgIiArIGZpZWxkLmNsYXNzTmFtZSkgOiAnJyksCiAgICAgICAgICAgICAgICAgICAgY29sczogKGZpZWxkLmNvbHMgPyBmaWVsZC5jb2xzIDogMjApLAogICAgICAgICAgICAgICAgICAgIHJvd3M6IChmaWVsZC5yb3dzID8gZmllbGQucm93cyA6IDIpLAogICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBmaWVsZC5wbGFjZWhvbGRlcgogICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdyYWRpbyc6CiAgICAgICAgICAgICAgICB2YXIgd3JhcCA9IGNyZWF0ZSgnZGl2JywgewogICAgICAgICAgICAgICAgICAgIGlkOiBjb25maWdJZCArICdfZmllbGRfJyArIGlkLAogICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogZmllbGQuY2xhc3NOYW1lCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHdyYXA7CgogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG9wdGlvbnMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmFkTGFiZWwgPSBjcmVhdGUoJ2xhYmVsJywgewogICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdyYWRpb19sYWJlbCcKICAgICAgICAgICAgICAgICAgICB9LCBvcHRpb25zW2ldKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIHJhZCA9IHdyYXAuYXBwZW5kQ2hpbGQoY3JlYXRlKCdpbnB1dCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyYWRpbycsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGlkLAogICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkOiBvcHRpb25zW2ldID09IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgcmFkTGFiZWxQb3MgPSBsYWJlbFBvcyAmJgogICAgICAgICAgICAgICAgICAgICAgICAobGFiZWxQb3MgPT0gJ2xlZnQnIHx8IGxhYmVsUG9zID09ICdyaWdodCcpID8KICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxQb3MgOiBmaXJzdFByb3AgPT0gJ29wdGlvbnMnID8gJ2xlZnQnIDogJ3JpZ2h0JzsKCiAgICAgICAgICAgICAgICAgICAgYWRkTGFiZWwocmFkTGFiZWxQb3MsIHJhZExhYmVsLCB3cmFwLCByYWQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldE5vZGUuYXBwZW5kQ2hpbGQod3JhcCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2VsZWN0JzoKICAgICAgICAgICAgICAgIHZhciB3cmFwID0gY3JlYXRlKCdzZWxlY3QnLCB7CiAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbmZpZ0lkICsgJ19maWVsZF8nICsgaWQsCiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBmaWVsZC5jbGFzc05hbWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gd3JhcDsKCiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkgeyAgLy8g6L2s5Li6IG9iamVjdCDnmoTmoLzlvI8KICAgICAgICAgICAgICAgICAgICB2YXIgbmV3T3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbihvcHRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3B0aW9uc1tvcHRpb25dID0gb3B0aW9uOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBuZXdPcHRpb25zOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLmZvckVhY2goZnVuY3Rpb24ob3B0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgd3JhcC5hcHBlbmRDaGlsZChjcmVhdGUoJ29wdGlvbicsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IG9wdGlvbiA9PSB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICB9LCBvcHRpb25zW29wdGlvbl0pKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0Tm9kZS5hcHBlbmRDaGlsZCh3cmFwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OiAvLyBmaWVsZHMgdXNpbmcgaW5wdXQgZWxlbWVudHMKICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IHsKICAgICAgICAgICAgICAgICAgICBpZDogY29uZmlnSWQgKyAnX2ZpZWxkXycgKyBpZCwKICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0eXBlID09ICdidXR0b24nID8gZmllbGQubGFiZWwgOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGZpZWxkLmNsYXNzTmFtZQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdjaGVja2JveCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmNoZWNrZWQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYnV0dG9uJzoKICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMuc2l6ZSA9IGZpZWxkLnNpemUgPyBmaWVsZC5zaXplIDogMjU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5zY3JpcHQpIGZpZWxkLmNsaWNrID0gZmllbGQuc2NyaXB0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuY2xpY2spIHByb3BzLm9uY2xpY2sgPSBmaWVsZC5jbGljazsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnaGlkZGVuJzoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSA9IHRleHQsIGludCwgb3IgZmxvYXQKICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMudHlwZSA9ICd0ZXh0JzsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMuc2l6ZSA9IGZpZWxkLnNpemUgPyBmaWVsZC5zaXplIDogMjU7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnBsYWNlaG9sZGVyID0gZmllbGQucGxhY2Vob2xkZXI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0Tm9kZS5hcHBlbmRDaGlsZCgodGhpcy5ub2RlID0gY3JlYXRlKCdpbnB1dCcsIHByb3BzKSkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGxhYmVsKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBsYWJlbCBpcyBwYXNzZWQgZmlyc3QsIGluc2VydCBpdCBiZWZvcmUgdGhlIGZpZWxkCiAgICAgICAgICAgIC8vIGVsc2UgaW5zZXJ0IGl0IGFmdGVyCiAgICAgICAgICAgIGlmICghbGFiZWxQb3MpCiAgICAgICAgICAgICAgICBsYWJlbFBvcyA9IGZpcnN0UHJvcCA9PSAibGFiZWwiIHx8IHR5cGUgPT0gInJhZGlvIiA/CiAgICAgICAgICAgICAgICAgICAgImxlZnQiIDogInJpZ2h0IjsKCiAgICAgICAgICAgIGlmICgnY2xhc3NOYW1lJyBpbiBmaWVsZCkgewogICAgICAgICAgICAgICAgbGFiZWwuY2xhc3NOYW1lICs9ICcgJyArIGZpZWxkLmNsYXNzTmFtZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGZpZWxkLnN0eWxlICYmIGZpZWxkLnN0eWxlLmxhYmVsKSB7CiAgICAgICAgICAgICAgICBsYWJlbC5zdHlsZS5jc3NUZXh0ID0gZmllbGQuc3R5bGUubGFiZWw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFkZExhYmVsKGxhYmVsUG9zLCBsYWJlbCwgcmV0Tm9kZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoZmllbGQuYWZ0ZXIpIHsKICAgICAgICAgICAgcmV0Tm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShmaWVsZC5hZnRlcikpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJldE5vZGU7CiAgICB9LAoKICAgIHRvVmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlLAogICAgICAgICAgICAgICAgZmllbGQgPSB0aGlzLnNldHRpbmdzLAogICAgICAgICAgICAgICAgdHlwZSA9IGZpZWxkLnR5cGUsCiAgICAgICAgICAgICAgICB1bnNpZ25lZCA9IGZhbHNlLAogICAgICAgICAgICAgICAgcnZhbCA9IG51bGw7CgogICAgICAgIGlmICghbm9kZSkgcmV0dXJuIHJ2YWw7CgogICAgICAgIGlmICh0eXBlICYmIHR5cGUuaW5kZXhPZigndW5zaWduZWQgJykgPT0gMCkgewogICAgICAgICAgICB0eXBlID0gdHlwZS5zdWJzdHJpbmcoOSk7CiAgICAgICAgICAgIHVuc2lnbmVkID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlICdjaGVja2JveCc6CiAgICAgICAgICAgICAgICBydmFsID0gbm9kZS5jaGVja2VkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NlbGVjdCc6CiAgICAgICAgICAgICAgICBydmFsID0gbm9kZVtub2RlLnNlbGVjdGVkSW5kZXhdLnZhbHVlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3JhZGlvJzoKICAgICAgICAgICAgICAgIHZhciByYWRpb3MgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHJhZGlvcy5sZW5ndGg7IGkgPCBsZW47ICsraSkKICAgICAgICAgICAgICAgICAgICBpZiAocmFkaW9zW2ldLmNoZWNrZWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJ2YWwgPSByYWRpb3NbaV0udmFsdWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYnV0dG9uJzoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdpbnQnOiBjYXNlICdpbnRlZ2VyJzoKICAgICAgICAgICAgY2FzZSAnZmxvYXQnOiBjYXNlICdudW1iZXInOgogICAgICAgICAgICAgICAgdmFyIG51bSA9IE51bWJlcihub2RlLnZhbHVlKTsKICAgICAgICAgICAgICAgIHZhciB3YXJuID0gJ0ZpZWxkIGxhYmVsZWQgIicgKyBmaWVsZC5sYWJlbCArICciIGV4cGVjdHMgYScgKwogICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCA/ICcgcG9zaXRpdmUgJyA6ICduICcpICsgJ2ludGVnZXIgdmFsdWUnOwoKICAgICAgICAgICAgICAgIGlmIChpc05hTihudW0pIHx8ICh0eXBlLnN1YnN0cigwLCAzKSA9PSAnaW50JyAmJgogICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmNlaWwobnVtKSAhPSBNYXRoLmZsb29yKG51bSkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCAmJiBudW0gPCAwKSkgewogICAgICAgICAgICAgICAgICAgIGFsZXJ0KHdhcm4gKyAnLicpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2hlY2tOdW1iZXJSYW5nZShudW0sIHdhcm4pKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgcnZhbCA9IG51bTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcnZhbCA9IG5vZGUudmFsdWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHJldHVybiBydmFsOyAvLyB2YWx1ZSByZWFkIHN1Y2Nlc3NmdWxseQogICAgfSwKCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUsCiAgICAgICAgICAgICAgICBmaWVsZCA9IHRoaXMuc2V0dGluZ3MsCiAgICAgICAgICAgICAgICB0eXBlID0gZmllbGQudHlwZTsKCiAgICAgICAgaWYgKCFub2RlKSByZXR1cm47CgogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlICdjaGVja2JveCc6CiAgICAgICAgICAgICAgICBub2RlLmNoZWNrZWQgPSB0aGlzWydkZWZhdWx0J107CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2VsZWN0JzoKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBub2RlLm9wdGlvbnMubGVuZ3RoOyBpIDwgbGVuOyArK2kpCiAgICAgICAgICAgICAgICBpZiAobm9kZS5vcHRpb25zW2ldLnZhbHVlID09IHRoaXNbJ2RlZmF1bHQnXSkKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zZWxlY3RlZEluZGV4ID0gaTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdyYWRpbyc6CiAgICAgICAgICAgICAgICB2YXIgcmFkaW9zID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSByYWRpb3MubGVuZ3RoOyBpIDwgbGVuOyArK2kpCiAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGlvc1tpXS52YWx1ZSA9PSB0aGlzWydkZWZhdWx0J10pCiAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlvc1tpXS5jaGVja2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdidXR0b24nIDoKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgbm9kZS52YWx1ZSA9IHRoaXNbJ2RlZmF1bHQnXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICB9LAoKICAgIHJlbW92ZTogZnVuY3Rpb24oZWwpIHsKICAgICAgICBHTV9jb25maWdTdHJ1Y3QucHJvdG90eXBlLnJlbW92ZShlbCB8fCB0aGlzLndyYXBwZXIpOwogICAgICAgIHRoaXMud3JhcHBlciA9IG51bGw7CiAgICAgICAgdGhpcy5ub2RlID0gbnVsbDsKICAgIH0sCgogICAgcmVsb2FkOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgd3JhcHBlciA9IHRoaXMud3JhcHBlcjsKICAgICAgICBpZiAod3JhcHBlcikgewogICAgICAgICAgICB2YXIgZmllbGRQYXJlbnQgPSB3cmFwcGVyLnBhcmVudE5vZGU7CiAgICAgICAgICAgIGZpZWxkUGFyZW50Lmluc2VydEJlZm9yZSgodGhpcy53cmFwcGVyID0gdGhpcy50b05vZGUoKSksIHdyYXBwZXIpOwogICAgICAgICAgICB0aGlzLnJlbW92ZSh3cmFwcGVyKTsKICAgICAgICB9CiAgICB9LAoKICAgIF9jaGVja051bWJlclJhbmdlOiBmdW5jdGlvbihudW0sIHdhcm4pIHsKICAgICAgICB2YXIgZmllbGQgPSB0aGlzLnNldHRpbmdzOwogICAgICAgIGlmICh0eXBlb2YgZmllbGQubWluID09ICJudW1iZXIiICYmIG51bSA8IGZpZWxkLm1pbikgewogICAgICAgICAgICBhbGVydCh3YXJuICsgJyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJyArIGZpZWxkLm1pbiArICcuJyk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKHR5cGVvZiBmaWVsZC5tYXggPT0gIm51bWJlciIgJiYgbnVtID4gZmllbGQubWF4KSB7CiAgICAgICAgICAgIGFsZXJ0KHdhcm4gKyAnIGxlc3MgdGhhbiBvciBlcXVhbCB0byAnICsgZmllbGQubWF4ICsgJy4nKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9OwoKLy8gQ3JlYXRlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgR01fY29uZmlnCnZhciBHTV9jb25maWcgPSBuZXcgR01fY29uZmlnU3RydWN0KCk7Cg=="},{"meta":{"name":"FileSaver.min.js","url":"https://cdn.jsdelivr.net/npm/file-saver@2.0.2/dist/FileSaver.min.js","ts":1649763944746,"mimetype":"text/javascript"},"source":"KGZ1bmN0aW9uKGEsYil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZClkZWZpbmUoW10sYik7ZWxzZSBpZigidW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHMpYigpO2Vsc2V7YigpLGEuRmlsZVNhdmVyPXtleHBvcnRzOnt9fS5leHBvcnRzfX0pKHRoaXMsZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihhLGIpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgYj9iPXthdXRvQm9tOiExfToib2JqZWN0IiE9dHlwZW9mIGImJihjb25zb2xlLndhcm4oIkRlcHJlY2F0ZWQ6IEV4cGVjdGVkIHRoaXJkIGFyZ3VtZW50IHRvIGJlIGEgb2JqZWN0IiksYj17YXV0b0JvbTohYn0pLGIuYXV0b0JvbSYmL15ccyooPzp0ZXh0XC9cUyp8YXBwbGljYXRpb25cL3htbHxcUypcL1xTKlwreG1sKVxzKjsuKmNoYXJzZXRccyo9XHMqdXRmLTgvaS50ZXN0KGEudHlwZSk/bmV3IEJsb2IoWyJcdUZFRkYiLGFdLHt0eXBlOmEudHlwZX0pOmF9ZnVuY3Rpb24gYyhiLGMsZCl7dmFyIGU9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub3BlbigiR0VUIixiKSxlLnJlc3BvbnNlVHlwZT0iYmxvYiIsZS5vbmxvYWQ9ZnVuY3Rpb24oKXthKGUucmVzcG9uc2UsYyxkKX0sZS5vbmVycm9yPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiY291bGQgbm90IGRvd25sb2FkIGZpbGUiKX0sZS5zZW5kKCl9ZnVuY3Rpb24gZChhKXt2YXIgYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yi5vcGVuKCJIRUFEIixhLCExKTt0cnl7Yi5zZW5kKCl9Y2F0Y2goYSl7fXJldHVybiAyMDA8PWIuc3RhdHVzJiYyOTk+PWIuc3RhdHVzfWZ1bmN0aW9uIGUoYSl7dHJ5e2EuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgiY2xpY2siKSl9Y2F0Y2goYyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIk1vdXNlRXZlbnRzIik7Yi5pbml0TW91c2VFdmVudCgiY2xpY2siLCEwLCEwLHdpbmRvdywwLDAsMCw4MCwyMCwhMSwhMSwhMSwhMSwwLG51bGwpLGEuZGlzcGF0Y2hFdmVudChiKX19dmFyIGY9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy53aW5kb3c9PT13aW5kb3c/d2luZG93OiJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZi5zZWxmPT09c2VsZj9zZWxmOiJvYmplY3QiPT10eXBlb2YgZ2xvYmFsJiZnbG9iYWwuZ2xvYmFsPT09Z2xvYmFsP2dsb2JhbDp2b2lkIDAsYT1mLnNhdmVBc3x8KCJvYmplY3QiIT10eXBlb2Ygd2luZG93fHx3aW5kb3chPT1mP2Z1bmN0aW9uKCl7fToiZG93bmxvYWQiaW4gSFRNTEFuY2hvckVsZW1lbnQucHJvdG90eXBlP2Z1bmN0aW9uKGIsZyxoKXt2YXIgaT1mLlVSTHx8Zi53ZWJraXRVUkwsaj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Zz1nfHxiLm5hbWV8fCJkb3dubG9hZCIsai5kb3dubG9hZD1nLGoucmVsPSJub29wZW5lciIsInN0cmluZyI9PXR5cGVvZiBiPyhqLmhyZWY9YixqLm9yaWdpbj09PWxvY2F0aW9uLm9yaWdpbj9lKGopOmQoai5ocmVmKT9jKGIsZyxoKTplKGosai50YXJnZXQ9Il9ibGFuayIpKTooai5ocmVmPWkuY3JlYXRlT2JqZWN0VVJMKGIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpLnJldm9rZU9iamVjdFVSTChqLmhyZWYpfSw0RTQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKGopfSwwKSl9OiJtc1NhdmVPck9wZW5CbG9iImluIG5hdmlnYXRvcj9mdW5jdGlvbihmLGcsaCl7aWYoZz1nfHxmLm5hbWV8fCJkb3dubG9hZCIsInN0cmluZyIhPXR5cGVvZiBmKW5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGIoZixoKSxnKTtlbHNlIGlmKGQoZikpYyhmLGcsaCk7ZWxzZXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7aS5ocmVmPWYsaS50YXJnZXQ9Il9ibGFuayIsc2V0VGltZW91dChmdW5jdGlvbigpe2UoaSl9KX19OmZ1bmN0aW9uKGEsYixkLGUpe2lmKGU9ZXx8b3BlbigiIiwiX2JsYW5rIiksZSYmKGUuZG9jdW1lbnQudGl0bGU9ZS5kb2N1bWVudC5ib2R5LmlubmVyVGV4dD0iZG93bmxvYWRpbmcuLi4iKSwic3RyaW5nIj09dHlwZW9mIGEpcmV0dXJuIGMoYSxiLGQpO3ZhciBnPSJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iPT09YS50eXBlLGg9L2NvbnN0cnVjdG9yL2kudGVzdChmLkhUTUxFbGVtZW50KXx8Zi5zYWZhcmksaT0vQ3JpT1NcL1tcZF0rLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO2lmKChpfHxnJiZoKSYmIm9iamVjdCI9PXR5cGVvZiBGaWxlUmVhZGVyKXt2YXIgaj1uZXcgRmlsZVJlYWRlcjtqLm9ubG9hZGVuZD1mdW5jdGlvbigpe3ZhciBhPWoucmVzdWx0O2E9aT9hOmEucmVwbGFjZSgvXmRhdGE6W147XSo7LywiZGF0YTphdHRhY2htZW50L2ZpbGU7IiksZT9lLmxvY2F0aW9uLmhyZWY9YTpsb2NhdGlvbj1hLGU9bnVsbH0sai5yZWFkQXNEYXRhVVJMKGEpfWVsc2V7dmFyIGs9Zi5VUkx8fGYud2Via2l0VVJMLGw9ay5jcmVhdGVPYmplY3RVUkwoYSk7ZT9lLmxvY2F0aW9uPWw6bG9jYXRpb24uaHJlZj1sLGU9bnVsbCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ay5yZXZva2VPYmplY3RVUkwobCl9LDRFNCl9fSk7Zi5zYXZlQXM9YS5zYXZlQXM9YSwidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSYmKG1vZHVsZS5leHBvcnRzPWEpfSk7CgovLyMgc291cmNlTWFwcGluZ1VSTD1GaWxlU2F2ZXIubWluLmpzLm1hcA=="}]},{"name":"b站首页增加已追番入口","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_prototypes":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*://www.bilibili.com/*","*://space.bilibili.com/*","*://t.bilibili.com/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"tab_types":null,"unwrap":null},"storage":{"ts":1624620458205,"data":{}},"enabled":true,"position":8,"file_url":"https://greasyfork.org/scripts/370127-b%E7%AB%99%E9%A6%96%E9%A1%B5%E5%A2%9E%E5%8A%A0%E5%B7%B2%E8%BF%BD%E7%95%AA%E5%85%A5%E5%8F%A3/code/b%E7%AB%99%E9%A6%96%E9%A1%B5%E5%A2%9E%E5%8A%A0%E5%B7%B2%E8%BF%BD%E7%95%AA%E5%85%A5%E5%8F%A3.user.js","uuid":"86d6e451-e12c-4ea5-a2cb-6ec38bed9702","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBi56uZ6aaW6aG15aKe5Yqg5bey6L+955Wq5YWl5Y+jCi8vIEBuYW1lc3BhY2UKLy8gQHZlcnNpb24gICAgICAxLjYKLy8gQGRlc2NyaXB0aW9uICDlnKhiaWxpYmlsaee9kemhteerr+S4iuaWueiPnOWNlea3u+WKoFvlt7Lov73nlapd55qE5YWl5Y+jCi8vIEBhdXRob3IgICAgICAgZnJhbnh4Ci8vIEBtYXRjaCAgICAgICAgKjovL3d3dy5iaWxpYmlsaS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly9zcGFjZS5iaWxpYmlsaS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly90LmJpbGliaWxpLmNvbS8qCi8vIEBncmFudCAgICAgICAgbm9uZQovLyBAbGljZW5zZSAgICAgIEdQTC0zLjAtb25seQovLyBAY29tcGF0aWJsZSAgIGNocm9tZSA4MCsKLy8gQG5hbWVzcGFjZSAKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7Ly/pppbpobXlop7liqDov73nlarlhaXlj6MKICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llOwogICAgdmFyIGlkPWNvb2tpZXMubWF0Y2goL0RlZGVVc2VySUQ9KFxkKykvKVsxXTsKICAgIHZhciBiYW5ndW1pTGluaz0iaHR0cHM6Ly9zcGFjZS5iaWxpYmlsaS5jb20vIitpZCsiL2Jhbmd1bWkiOwoKICAgIG9sZE1vZGlmaWVyMSgpOwogICAgb2xkTW9kaWZpZXIyKCk7CiAgICBuZXdNb2RpZmllcjEoKTsKICAgIG5ld01vZGlmaWVyMigpOwogICAgYmV0YU1vZGlmaWVyMSgpOwoKICAgIHZhciB0aW1lc3RhbXA9bmV3IERhdGUoKS5nZXRUaW1lKCk7CgogICAgZnVuY3Rpb24gZ2V0VGV4dE5vZGUoKXsKICAgICAgICB2YXIgbmV3Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIG5ld05vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsIml0ZW0iKTsKICAgICAgICBuZXdOb2RlLmlubmVySFRNTD0iPGEgaHJlZj0nIitiYW5ndW1pTGluaysiJyB0YXJnZXQ9J19ibGFuayc+PHNwYW4gY2xhc3M9J25hbWUnPui/veeVqjwvc3Bhbj48L2E+IjsKICAgICAgICByZXR1cm4gbmV3Tm9kZTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRJbWFnZU5vZGUoKXsKICAgICAgICB2YXIgbmV3Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIik7CiAgICAgICAgbmV3Tm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwidi1wb3BvdmVyLXdyYXAiKTsKICAgICAgICB2YXIgc3RyPSc8YSBocmVmPSInK2Jhbmd1bWlMaW5rKyciIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0icmlnaHQtZW50cnlfX291dHNpZGUiPjxzdmcgd2lkdGg9IjIwIiBoZWlnaHQ9IjIxIiB2aWV3Qm94PSIwIDAgMjAgMjEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgY2xhc3M9InJpZ2h0LWVudHJ5LWljb24iPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMy43MzI1MiAyLjY3MDk0QzMuMzMyMjkgMi4yODQ4NCAzLjMzMjI5IDEuNjQzNzMgMy43MzI1MiAxLjI1NzY0QzQuMTEyOTEgMC44OTA2ODQgNC43MTU1MiAwLjg5MDY4NCA1LjA5NTkxIDEuMjU3NjRMNy4yMTcyMyAzLjMwNDAzQzcuMjc3NDkgMy4zNjIxOCA3LjMyODY5IDMuNDI2MSA3LjM3MDgxIDMuNDk0MDdIMTAuNTc4OUMxMC42MjExIDMuNDI2MSAxMC42NzIzIDMuMzYyMTggMTAuNzMyNSAzLjMwNDAzTDEyLjg1MzggMS4yNTc2NEMxMy4yMzQyIDAuODkwNjg0IDEzLjgzNjggMC44OTA2ODQgMTQuMjE3MiAxLjI1NzY0QzE0LjYxNzUgMS42NDM3MyAxNC42MTc1IDIuMjg0ODQgMTQuMjE3MiAyLjY3MDk0TDEzLjM2NCAzLjQ5NDA3SDE0QzE2LjIwOTEgMy40OTQwNyAxOCA1LjI4NDkzIDE4IDcuNDk0MDdWMTIuOTk5NkMxOCAxNS4yMDg3IDE2LjIwOTEgMTYuOTk5NiAxNCAxNi45OTk2SDRDMS43OTA4NiAxNi45OTk2IDAgMTUuMjA4NyAwIDEyLjk5OTZWNy40OTQwNkMwIDUuMjg0OTIgMS43OTA4NiAzLjQ5NDA3IDQgMy40OTQwN0g0LjU4NTc5TDMuNzMyNTIgMi42NzA5NFpNNCA1LjQyMzQzQzIuODk1NDMgNS40MjM0MyAyIDYuMzE4ODYgMiA3LjQyMzQzVjEzLjA3MDJDMiAxNC4xNzQ4IDIuODk1NDMgMTUuMDcwMiA0IDE1LjA3MDJIMTRDMTUuMTA0NiAxNS4wNzAyIDE2IDE0LjE3NDggMTYgMTMuMDcwMlY3LjQyMzQzQzE2IDYuMzE4ODYgMTUuMTA0NiA1LjQyMzQzIDE0IDUuNDIzNDNINFpNNSA5LjMxNzQ3QzUgOC43NjUxOSA1LjQ0NzcyIDguMzE3NDcgNiA4LjMxNzQ3QzYuNTUyMjggOC4zMTc0NyA3IDguNzY1MTkgNyA5LjMxNzQ3VjEwLjIxMTVDNyAxMC43NjM4IDYuNTUyMjggMTEuMjExNSA2IDExLjIxMTVDNS40NDc3MiAxMS4yMTE1IDUgMTAuNzYzOCA1IDEwLjIxMTVWOS4zMTc0N1pNMTIgOC4zMTc0N0MxMS40NDc3IDguMzE3NDcgMTEgOC43NjUxOSAxMSA5LjMxNzQ3VjEwLjIxMTVDMTEgMTAuNzYzOCAxMS40NDc3IDExLjIxMTUgMTIgMTEuMjExNUMxMi41NTIzIDExLjIxMTUgMTMgMTAuNzYzOCAxMyAxMC4yMTE1VjkuMzE3NDdDMTMgOC43NjUxOSAxMi41NTIzIDguMzE3NDcgMTIgOC4zMTc0N1oiIGZpbGw9ImN1cnJlbnRDb2xvciI+PC9wYXRoPjwvc3ZnPjxzcGFuIGNsYXNzPSJyaWdodC1lbnRyeS10ZXh0Ij7ov73nlao8L3NwYW4+PC9hPic7CiAgICAgICAgbmV3Tm9kZS5pbm5lckhUTUw9c3RyOwogICAgICAgIHJldHVybiBuZXdOb2RlOwogICAgfQoKICAgIGZ1bmN0aW9uIHRlbXBsYXRlTW9kaWZpZXIoT2JqLGdldE5ld05vZGUsY2FsbGVyKXsKICAgICAgICBpZihPYmopewogICAgICAgICAgICBPYmoucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZ2V0TmV3Tm9kZSgpLE9iaik7CiAgICAgICAgICAgIHRpbWVzdGFtcD0wOy8vY3J1ZGVseSBlbmQKICAgICAgICAgICAgY29uc29sZS5sb2coIkLlop7ov70+IitjYWxsZXIubmFtZSsiIGFwcGxpZWQiKTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhjYWxsZXIubmFtZSsiIHdhaXRpbmciKTsKICAgICAgICAgICAgdmFyIHRpbWVzdGFtcERpZmY9bmV3IERhdGUoKS5nZXRUaW1lKCktdGltZXN0YW1wOwogICAgICAgICAgICBpZih0aW1lc3RhbXBEaWZmPjMwKjEwMDApcmV0dXJuOwogICAgICAgICAgICBzZXRUaW1lb3V0KGNhbGxlciw1MDApOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBvbGRNb2RpZmllcjEoKXsvL29sZCB2ZXJzaW9uCiAgICAgICAgdmFyIE9iaj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaW50ZXJuYXRpb25hbEhlYWRlciA+IGRpdi5taW5pLWhlYWRlci5tLWhlYWRlciA+IGRpdiA+IGRpdi5uYXYtdXNlci1jZW50ZXIgPiBkaXYudXNlci1jb24uc2lnbmluID4gZGl2Om50aC1jaGlsZCg1KSIpOwogICAgICAgIHRlbXBsYXRlTW9kaWZpZXIoT2JqLGdldFRleHROb2RlLG9sZE1vZGlmaWVyMSk7CiAgICB9CgogICAgZnVuY3Rpb24gb2xkTW9kaWZpZXIyKCl7Ly9vbGQgdmVyc2lvbiByZWFkCiAgICAgICAgdmFyIE9iaj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjYmlsaS1oZWFkZXItY29udGFpbmVyID4gZGl2ID4gZGl2ID4gdWwucmlnaHQtZW50cnkgPiBsaTpudGgtY2hpbGQoNSkiKTsKICAgICAgICB0ZW1wbGF0ZU1vZGlmaWVyKE9iaixnZXRJbWFnZU5vZGUsb2xkTW9kaWZpZXIyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBuZXdNb2RpZmllcjEoKXsvL25ldyB2ZXJzaW9uCiAgICAgICAgdmFyIE9iaj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaV9jZWNyZWFtID4gZGl2LmJpbGktaGVhZGVyLmxhcmdlLWhlYWRlciA+IGRpdi5iaWxpLWhlYWRlcl9fYmFyID4gdWwucmlnaHQtZW50cnkgPiBsaTpudGgtY2hpbGQoNSkiKTsKICAgICAgICB0ZW1wbGF0ZU1vZGlmaWVyKE9iaixnZXRJbWFnZU5vZGUsbmV3TW9kaWZpZXIxKTsKICAgIH0KCiAgICBmdW5jdGlvbiBuZXdNb2RpZmllcjIoKXsvL25ldyB2ZXJzaW9uIHZpZGVvIHBhZ2UKICAgICAgICB2YXIgT2JqPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNiaWxpTWFpbkhlYWRlciA+IGRpdiA+IGRpdiA+IHVsLnJpZ2h0LWVudHJ5ID4gbGk6bnRoLWNoaWxkKDUpIik7CiAgICAgICAgdGVtcGxhdGVNb2RpZmllcihPYmosZ2V0SW1hZ2VOb2RlLG5ld01vZGlmaWVyMik7CiAgICB9CgogICAgZnVuY3Rpb24gYmV0YU1vZGlmaWVyMSgpey8vYmV0YSB2ZXJzaW9uCiAgICAgICAgdmFyIE9iaj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjaV9jZWNyZWFtID4gZGl2LmJpbGktZmVlZDQgPiBkaXYuYmlsaS1oZWFkZXIubGFyZ2UtaGVhZGVyID4gZGl2LmJpbGktaGVhZGVyX19iYXIgPiB1bC5yaWdodC1lbnRyeSA+IGxpOm50aC1jaGlsZCg1KSIpOwogICAgICAgIHRlbXBsYXRlTW9kaWZpZXIoT2JqLGdldEltYWdlTm9kZSxiZXRhTW9kaWZpZXIxKTsKICAgIH0KfSkoKTs="},{"name":"reCaptcha 验证码镜像加载","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_prototypes":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_excludes":[],"orig_includes":[],"orig_matches":["*://*/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":["/(^[^:\\/#\\?]*:\\/\\/([^#\\?\\/]*\\.)?docs\\.qq\\.com(:[0-9]{1,5})?\\/.*$)/"],"use_includes":[],"use_matches":[]},"run_at":null,"tab_types":null},"storage":{"ts":1624620458205,"data":{}},"enabled":true,"position":9,"file_url":"https://greasyfork.org/scripts/387185-recaptcha-%E9%AA%8C%E8%AF%81%E7%A0%81%E9%95%9C%E5%83%8F%E5%8A%A0%E8%BD%BD/code/reCaptcha%20%E9%AA%8C%E8%AF%81%E7%A0%81%E9%95%9C%E5%83%8F%E5%8A%A0%E8%BD%BD.user.js","uuid":"3e545875-0462-4763-9631-5dcf42ae7e70","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWVzcGFjZQkJCXh5ei50cmVlMAovLyBAbmFtZQkJCQkJcmVDYXB0Y2hhIOmqjOivgeeggemVnOWDj+WKoOi9vQovLyBAZGVzY3JpcHRpb24JCeabv+aNouS9v+eUqOWumOaWueWcsOWdgOeahCByZUNhcHRjaGEg5Li65a6Y5pa56ZWc5YOP5Zyw5Z2A77yM6K6p5aKZ5YaF55So5oi355qEIHJlQ2FwdGNoIOiDveato+W4uOaYvuekuuOAgijlj6/og73lr7nmtbflpJbnlKjmiLfmmK/lh4/pgJ8yMzMzCi8vIEBkZXNjcmlwdGlvbgkJ5Ly85LmO5Y+q6IO955So5LqOIHJlQ2FwdGNoYSB2MgovLyBAYXV0aG9yCQkJCWFuX2FudGhvbnkKLy8gQHZlcnNpb24JCQkJMC4xLjIuMgovLyBAZ3JhbnQJCQkJCW5vbmUKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly8qLyoKLy8gPT0vVXNlclNjcmlwdD09Cgp2YXIgc2NyQXJyID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpOwpmb3IodmFyIGsgPSAwO2sgPCBzY3JBcnIubGVuZ3RoOysraykKewoJaWYoc2NyQXJyW2tdLnNyYyAhPT0gbnVsbCAmJiBzY3JBcnJba10uc3JjLmluZGV4T2YoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhL2FwaSIpICE9IC0xKXsKCQl2YXIgc2NyQXBwZW5kID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICBzY3JBcHBlbmQuc3JjID0gc2NyQXJyW2tdLnNyYy5yZXBsYWNlKCJnb29nbGUuY29tIiwicmVjYXB0Y2hhLm5ldCIpOwoJCXNjckFwcGVuZC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7CiAgICBzY3JBcHBlbmQuYXN5bmMgPSB0cnVlOwogICAgc2NyQXJyW2tdLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoc2NyQXBwZW5kKTsgCiAgICBzY3JBcnJba10ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JBcnJba10pOwogICAgYWxlcnQoIuW3suabv+aNouivpemhtemdoueahCByZUNhcHRjaGEg5Zyw5Z2A77yM5aaC5p6c6L+Y5pyq5pi+56S65Ye6IHJlQ2FwdGNoYSBMb2dv77yM6K+356iN562JKOe6pjMwcylcbuWmguaenOS+neeEtuayoeacieato+ehruaYvuekuu+8jOivt+aaguaXtuWvueivpeermeeCueWFs+mXrei3n+i4quWZqOaLpuaIquWKn+iDvSIpOwoJfQoJCn0K"},{"name":"anti-redirect","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_prototypes":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["www.baidu.com","*"],"orig_excludes":[],"orig_includes":["*://www.google*"],"orig_matches":["*://www.baidu.com/*","*://tieba.baidu.com/*","*://v.baidu.com/*","*://xueshu.baidu.com/*","*://www.google.com/*","*://docs.google.com/*","*://mail.google.com/*","*://play.google.com/*","*://youtube.com/watch?v=*","*://youtube.com/channel/*","*://encrypted.google.com/*","*://www.so.com/*","*://www.zhihu.com/*","*://daily.zhihu.com/*","*://zhuanlan.zhihu.com/*","*://weibo.com/*","*://twitter.com/*","*://www.sogou.com/*","*://juejin.im/*","*://juejin.cn/*","*://mail.qq.com/*","*://addons.mozilla.org/*","*://www.jianshu.com/*","*://www.douban.com/*","*://getpocket.com/*","*://www.dogedoge.com/*","*://51.ruyo.net/*","*://steamcommunity.com/*","*://mijisou.com/*","*://blog.csdn.net/*","*://*.oschina.net/*","*://app.yinxiang.com/*","*://www.logonews.cn/*","*://afdian.net/*","*://blog.51cto.com/*"],"orig_noframes":null,"orig_run_at":"document-start","use_blockers":[],"use_connects":["search.dangdang.com","www.hep.edu.cn","hebau.edu.cn","douban.com","jd.com","*"],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"tab_types":null,"unwrap":null},"storage":{"ts":1624620458209,"data":{}},"enabled":true,"position":10,"file_url":"https://greasyfork.org/scripts/11915-anti-redirect/code/anti-redirect.user.js","uuid":"7a2487ba-5a84-4756-a209-8e801c6a8e18","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICAgIGFudGktcmVkaXJlY3QKLy8gQGF1dGhvciAgICAgICAgICAgIEF4ZXRyb3kKLy8gQGRlc2NyaXB0aW9uICAgICAgIOWOu+mZpOmHjeWumuWQkSwg5pSv5oyB6LC35q2ML+eZvuW6pi/mkJzni5cvMzYwL+efpeS5ji/otLTlkKcv566A5LmmL+ixhueToy/lvq7ljZouLi4KLy8gQHZlcnNpb24gICAgICAgICAgIDIuMjAuMAovLyBAdXBkYXRlICAgICAgICAgICAgMjAyMi0xMC0wMyAxMzozODoxNAovLyBAZ3JhbnQgICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly93d3cuYmFpZHUuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly90aWViYS5iYWlkdS5jb20vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3YuYmFpZHUuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly94dWVzaHUuYmFpZHUuY29tLyoKLy8gQGluY2x1ZGUgICAgICAgICAgICo6Ly93d3cuZ29vZ2xlKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3d3dy5nb29nbGUuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9kb2NzLmdvb2dsZS5jb20vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL21haWwuZ29vZ2xlLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vcGxheS5nb29nbGUuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95b3V0dWJlLmNvbS93YXRjaD92PSoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly95b3V0dWJlLmNvbS9jaGFubmVsLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9lbmNyeXB0ZWQuZ29vZ2xlLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vd3d3LnNvLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vd3d3LnpoaWh1LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vZGFpbHkuemhpaHUuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly96aHVhbmxhbi56aGlodS5jb20vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3dlaWJvLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vdHdpdHRlci5jb20vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3d3dy5zb2dvdS5jb20vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL2p1ZWppbi5pbS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vanVlamluLmNuLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9tYWlsLnFxLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vYWRkb25zLm1vemlsbGEub3JnLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly93d3cuamlhbnNodS5jb20vKgovLyBAbWF0Y2ggICAgICAgICAgICAgKjovL3d3dy5kb3ViYW4uY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9nZXRwb2NrZXQuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly93d3cuZG9nZWRvZ2UuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly81MS5ydXlvLm5ldC8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vc3RlYW1jb21tdW5pdHkuY29tLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9taWppc291LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vYmxvZy5jc2RuLm5ldC8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vKi5vc2NoaW5hLm5ldC8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vYXBwLnlpbnhpYW5nLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgICAgICAqOi8vd3d3LmxvZ29uZXdzLmNuLyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9hZmRpYW4ubmV0LyoKLy8gQG1hdGNoICAgICAgICAgICAgICo6Ly9ibG9nLjUxY3RvLmNvbS8qCi8vIEBjb25uZWN0ICAgICAgICAgICB3d3cuYmFpZHUuY29tCi8vIEBjb25uZWN0ICAgICAgICAgICAqCi8vIEBjb21wYXRpYmxlICAgICAgICBjaHJvbWUgIOWujOe+jui/kOihjAovLyBAY29tcGF0aWJsZSAgICAgICAgZmlyZWZveCAg5a6M576O6L+Q6KGMCi8vIEBzdXBwb3J0VVJMICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYXhldHJveS9hbnRpLXJlZGlyZWN0L2lzc3Vlcy9uZXcvY2hvb3NlCi8vIEBob21lcGFnZSAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYXhldHJveS9hbnRpLXJlZGlyZWN0Ci8vIEBydW4tYXQgICAgICAgICAgICBkb2N1bWVudC1zdGFydAovLyBAY29udHJpYnV0aW9uVVJMICAgdHJveTQ1MDQwOTQwNUBnbWFpbC5jb218YWxpcGF5LmNvbQovLyBAbmFtZXNwYWNlICAgICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi91c2Vycy8zNDAwLWF4ZXRyb3kKLy8gQGxpY2Vuc2UgICAgICAgICAgIEFudGkgOTk2IExpY2Vuc2U7IGh0dHBzOi8vZ2l0aHViLmNvbS9heGV0cm95L2FudGktcmVkaXJlY3QvYmxvYi9tYXN0ZXIvTElDRU5TRQovLyA9PS9Vc2VyU2NyaXB0PT0KCi8vIEdpdGh1Yua6kOeggTogaHR0cHM6Ly9naXRodWIuY29tL2F4ZXRyb3kvYW50aS1yZWRpcmVjdAoKLy8g5aaC5p6c6L+Z6IO95biu5Yqp5Yiw5L2g77yM5qyi6L+O5ZyoIEdpdGh1YiDkuIrngrnlh7sgc3RhciDlkowgZm9sbG93LgoKLy8g5oiW6ICF5Zyo5pSv5LuY5a6d5pCc57SiICIgNTExMTE4MTMyICIg6aKG5Y+W57qi5YyFCgovLyDkvaDnmoTmlK/mjIHlsLHmmK/miJHmm7TmlrDnmoTliqjlipsKCgovKioqKioqLyAoKCkgPT4geyAvLyB3ZWJwYWNrQm9vdHN0cmFwCi8qKioqKiovIAl2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9IChbCi8qIDAgKi8sCi8qIDEgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgovKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UKdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUKTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKClRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRApXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLApNRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULgoKU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KdmFyIFJlZmxlY3Q7CihmdW5jdGlvbiAoUmVmbGVjdCkgewogICAgLy8gTWV0YWRhdGEgUHJvcG9zYWwKICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvCiAgICAoZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICAgICB2YXIgcm9vdCA9IHR5cGVvZiBfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPT09ICJvYmplY3QiID8gX193ZWJwYWNrX3JlcXVpcmVfXy5nIDoKICAgICAgICAgICAgdHlwZW9mIHNlbGYgPT09ICJvYmplY3QiID8gc2VsZiA6CiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcyA9PT0gIm9iamVjdCIgPyB0aGlzIDoKICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbigicmV0dXJuIHRoaXM7IikoKTsKICAgICAgICB2YXIgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIoUmVmbGVjdCk7CiAgICAgICAgaWYgKHR5cGVvZiByb290LlJlZmxlY3QgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgIHJvb3QuUmVmbGVjdCA9IFJlZmxlY3Q7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBleHBvcnRlciA9IG1ha2VFeHBvcnRlcihyb290LlJlZmxlY3QsIGV4cG9ydGVyKTsKICAgICAgICB9CiAgICAgICAgZmFjdG9yeShleHBvcnRlcik7CiAgICAgICAgZnVuY3Rpb24gbWFrZUV4cG9ydGVyKHRhcmdldCwgcHJldmlvdXMpIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChwcmV2aW91cykKICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyhrZXksIHZhbHVlKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9KShmdW5jdGlvbiAoZXhwb3J0ZXIpIHsKICAgICAgICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgICAgICAvLyBmZWF0dXJlIHRlc3QgZm9yIFN5bWJvbCBzdXBwb3J0CiAgICAgICAgdmFyIHN1cHBvcnRzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIjsKICAgICAgICB2YXIgdG9QcmltaXRpdmVTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCAmJiB0eXBlb2YgU3ltYm9sLnRvUHJpbWl0aXZlICE9PSAidW5kZWZpbmVkIiA/IFN5bWJvbC50b1ByaW1pdGl2ZSA6ICJAQHRvUHJpbWl0aXZlIjsKICAgICAgICB2YXIgaXRlcmF0b3JTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yICE9PSAidW5kZWZpbmVkIiA/IFN5bWJvbC5pdGVyYXRvciA6ICJAQGl0ZXJhdG9yIjsKICAgICAgICB2YXIgc3VwcG9ydHNDcmVhdGUgPSB0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gImZ1bmN0aW9uIjsgLy8gZmVhdHVyZSB0ZXN0IGZvciBPYmplY3QuY3JlYXRlIHN1cHBvcnQKICAgICAgICB2YXIgc3VwcG9ydHNQcm90byA9IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXk7IC8vIGZlYXR1cmUgdGVzdCBmb3IgX19wcm90b19fIHN1cHBvcnQKICAgICAgICB2YXIgZG93bkxldmVsID0gIXN1cHBvcnRzQ3JlYXRlICYmICFzdXBwb3J0c1Byb3RvOwogICAgICAgIHZhciBIYXNoTWFwID0gewogICAgICAgICAgICAvLyBjcmVhdGUgYW4gb2JqZWN0IGluIGRpY3Rpb25hcnkgbW9kZSAoYS5rLmEuICJzbG93IiBtb2RlIGluIHY4KQogICAgICAgICAgICBjcmVhdGU6IHN1cHBvcnRzQ3JlYXRlCiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KE9iamVjdC5jcmVhdGUobnVsbCkpOyB9CiAgICAgICAgICAgICAgICA6IHN1cHBvcnRzUHJvdG8KICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KHsgX19wcm90b19fOiBudWxsIH0pOyB9CiAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeSh7fSk7IH0sCiAgICAgICAgICAgIGhhczogZG93bkxldmVsCiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gaGFzT3duLmNhbGwobWFwLCBrZXkpOyB9CiAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4ga2V5IGluIG1hcDsgfSwKICAgICAgICAgICAgZ2V0OiBkb3duTGV2ZWwKICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBoYXNPd24uY2FsbChtYXAsIGtleSkgPyBtYXBba2V5XSA6IHVuZGVmaW5lZDsgfQogICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIG1hcFtrZXldOyB9LAogICAgICAgIH07CiAgICAgICAgLy8gTG9hZCBnbG9iYWwgb3Igc2hpbSB2ZXJzaW9ucyBvZiBNYXAsIFNldCwgYW5kIFdlYWtNYXAKICAgICAgICB2YXIgZnVuY3Rpb25Qcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRnVuY3Rpb24pOwogICAgICAgIHZhciB1c2VQb2x5ZmlsbCA9IHR5cGVvZiBwcm9jZXNzID09PSAib2JqZWN0IiAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudlsiUkVGTEVDVF9NRVRBREFUQV9VU0VfTUFQX1BPTFlGSUxMIl0gPT09ICJ0cnVlIjsKICAgICAgICB2YXIgX01hcCA9ICF1c2VQb2x5ZmlsbCAmJiB0eXBlb2YgTWFwID09PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmVudHJpZXMgPT09ICJmdW5jdGlvbiIgPyBNYXAgOiBDcmVhdGVNYXBQb2x5ZmlsbCgpOwogICAgICAgIHZhciBfU2V0ID0gIXVzZVBvbHlmaWxsICYmIHR5cGVvZiBTZXQgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcyA9PT0gImZ1bmN0aW9uIiA/IFNldCA6IENyZWF0ZVNldFBvbHlmaWxsKCk7CiAgICAgICAgdmFyIF9XZWFrTWFwID0gIXVzZVBvbHlmaWxsICYmIHR5cGVvZiBXZWFrTWFwID09PSAiZnVuY3Rpb24iID8gV2Vha01hcCA6IENyZWF0ZVdlYWtNYXBQb2x5ZmlsbCgpOwogICAgICAgIC8vIFtbTWV0YWRhdGFdXSBpbnRlcm5hbCBzbG90CiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnktb2JqZWN0LWludGVybmFsLW1ldGhvZHMtYW5kLWludGVybmFsLXNsb3RzCiAgICAgICAgdmFyIE1ldGFkYXRhID0gbmV3IF9XZWFrTWFwKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQXBwbGllcyBhIHNldCBvZiBkZWNvcmF0b3JzIHRvIGEgcHJvcGVydHkgb2YgYSB0YXJnZXQgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSBkZWNvcmF0b3JzIEFuIGFycmF5IG9mIGRlY29yYXRvcnMuCiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IHRvIGRlY29yYXRlLgogICAgICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSB0YXJnZXQga2V5LgogICAgICAgICAqIEByZW1hcmtzIERlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZSBvcmRlci4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUgewogICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OgogICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5OwogICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfQogICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH0KICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH0KICAgICAgICAgKiAgICAgfQogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yCiAgICAgICAgICogICAgIEV4YW1wbGUgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZSk7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKQogICAgICAgICAqICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZSwgInN0YXRpY1Byb3BlcnR5Iik7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSkKICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCAicHJvcGVydHkiKTsKICAgICAgICAgKgogICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKQogICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZSwgInN0YXRpY01ldGhvZCIsCiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZSwgInN0YXRpY01ldGhvZCIsCiAgICAgICAgICogICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFeGFtcGxlLCAic3RhdGljTWV0aG9kIikpKTsKICAgICAgICAgKgogICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSkKICAgICAgICAgKiAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEV4YW1wbGUucHJvdG90eXBlLCAibWV0aG9kIiwKICAgICAgICAgKiAgICAgICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLnByb3RvdHlwZSwgIm1ldGhvZCIsCiAgICAgICAgICogICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFeGFtcGxlLnByb3RvdHlwZSwgIm1ldGhvZCIpKSk7CiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBkZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKSB7CiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOwogICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsKICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoYXR0cmlidXRlcykgJiYgIUlzVW5kZWZpbmVkKGF0dHJpYnV0ZXMpICYmICFJc051bGwoYXR0cmlidXRlcykpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOwogICAgICAgICAgICAgICAgaWYgKElzTnVsbChhdHRyaWJ1dGVzKSkKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTsKICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFJc0FycmF5KGRlY29yYXRvcnMpKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsKICAgICAgICAgICAgICAgIGlmICghSXNDb25zdHJ1Y3Rvcih0YXJnZXQpKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsKICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0ZXIoImRlY29yYXRlIiwgZGVjb3JhdGUpOwogICAgICAgIC8vIDQuMS4yIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpCiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jcmVmbGVjdC5tZXRhZGF0YQogICAgICAgIC8qKgogICAgICAgICAqIEEgZGVmYXVsdCBtZXRhZGF0YSBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIG9uIGEgY2xhc3MsIGNsYXNzIG1lbWJlciwgb3IgcGFyYW1ldGVyLgogICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgZW50cnkuCiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhVmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEgZW50cnkuCiAgICAgICAgICogQHJldHVybnMgQSBkZWNvcmF0b3IgZnVuY3Rpb24uCiAgICAgICAgICogQHJlbWFya3MKICAgICAgICAgKiBJZiBgbWV0YWRhdGFLZXlgIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhlIHRhcmdldCBhbmQgdGFyZ2V0IGtleSwgdGhlCiAgICAgICAgICogbWV0YWRhdGFWYWx1ZSBmb3IgdGhhdCBrZXkgd2lsbCBiZSBvdmVyd3JpdHRlbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yCiAgICAgICAgICogICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpCiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUgewogICAgICAgICAqICAgICB9CiAgICAgICAgICoKICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yLCBUeXBlU2NyaXB0IG9ubHkpCiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUgewogICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSkKICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTsKICAgICAgICAgKiAgICAgfQogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUsIFR5cGVTY3JpcHQgb25seSkKICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7CiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKQogICAgICAgICAqICAgICAgICAgcHJvcGVydHk7CiAgICAgICAgICogICAgIH0KICAgICAgICAgKgogICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKQogICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHsKICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpCiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKCkgeyB9CiAgICAgICAgICogICAgIH0KICAgICAgICAgKgogICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSkKICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7CiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKQogICAgICAgICAqICAgICAgICAgbWV0aG9kKCkgeyB9CiAgICAgICAgICogICAgIH0KICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5KSB7CiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOwogICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkgJiYgIUlzUHJvcGVydHlLZXkocHJvcGVydHlLZXkpKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsKICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZWNvcmF0b3I7CiAgICAgICAgfQogICAgICAgIGV4cG9ydGVyKCJtZXRhZGF0YSIsIG1ldGFkYXRhKTsKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmUgYSB1bmlxdWUgbWV0YWRhdGEgZW50cnkgb24gdGhlIHRhcmdldC4KICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuCiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhVmFsdWUgQSB2YWx1ZSB0aGF0IGNvbnRhaW5zIGF0dGFjaGVkIG1ldGFkYXRhLgogICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdG8gZGVmaW5lIG1ldGFkYXRhLgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHsKICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDoKICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTsKICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5OwogICAgICAgICAqCiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH0KICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9CiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9CiAgICAgICAgICogICAgIH0KICAgICAgICAgKgogICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvcgogICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKCJjdXN0b206YW5ub3RhdGlvbiIsIG9wdGlvbnMsIEV4YW1wbGUpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcikKICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSgiY3VzdG9tOmFubm90YXRpb24iLCBvcHRpb25zLCBFeGFtcGxlLCAic3RhdGljUHJvcGVydHkiKTsKICAgICAgICAgKgogICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKQogICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKCJjdXN0b206YW5ub3RhdGlvbiIsIG9wdGlvbnMsIEV4YW1wbGUucHJvdG90eXBlLCAicHJvcGVydHkiKTsKICAgICAgICAgKgogICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKQogICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKCJjdXN0b206YW5ub3RhdGlvbiIsIG9wdGlvbnMsIEV4YW1wbGUsICJzdGF0aWNNZXRob2QiKTsKICAgICAgICAgKgogICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSkKICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSgiY3VzdG9tOmFubm90YXRpb24iLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgIm1ldGhvZCIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIGRlY29yYXRvciBmYWN0b3J5IGFzIG1ldGFkYXRhLXByb2R1Y2luZyBhbm5vdGF0aW9uLgogICAgICAgICAqICAgICBmdW5jdGlvbiBNeUFubm90YXRpb24ob3B0aW9ucyk6IERlY29yYXRvciB7CiAgICAgICAgICogICAgICAgICByZXR1cm4gKHRhcmdldCwga2V5PykgPT4gUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSgiY3VzdG9tOmFubm90YXRpb24iLCBvcHRpb25zLCB0YXJnZXQsIGtleSk7CiAgICAgICAgICogICAgIH0KICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7CiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsKICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpCiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpOwogICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7CiAgICAgICAgfQogICAgICAgIGV4cG9ydGVyKCJkZWZpbmVNZXRhZGF0YSIsIGRlZmluZU1ldGFkYXRhKTsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4gaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC4KICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuCiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC4KICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LgogICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEga2V5IHdhcyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW47IG90aGVyd2lzZSwgYGZhbHNlYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUgewogICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OgogICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5OwogICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfQogICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH0KICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH0KICAgICAgICAgKiAgICAgfQogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yCiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoImN1c3RvbTphbm5vdGF0aW9uIiwgRXhhbXBsZSk7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKQogICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKCJjdXN0b206YW5ub3RhdGlvbiIsIEV4YW1wbGUsICJzdGF0aWNQcm9wZXJ0eSIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpCiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoImN1c3RvbTphbm5vdGF0aW9uIiwgRXhhbXBsZS5wcm90b3R5cGUsICJwcm9wZXJ0eSIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpCiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoImN1c3RvbTphbm5vdGF0aW9uIiwgRXhhbXBsZSwgInN0YXRpY01ldGhvZCIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKQogICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKCJjdXN0b206YW5ub3RhdGlvbiIsIEV4YW1wbGUucHJvdG90eXBlLCAibWV0aG9kIik7CiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBoYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkgewogICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKQogICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTsKICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpOwogICAgICAgIH0KICAgICAgICBleHBvcnRlcigiaGFzTWV0YWRhdGEiLCBoYXNNZXRhZGF0YSk7CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGFyZ2V0IG9iamVjdCBoYXMgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBkZWZpbmVkLgogICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS4KICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLgogICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuCiAgICAgICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBtZXRhZGF0YSBrZXkgd2FzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Q7IG90aGVyd2lzZSwgYGZhbHNlYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUgewogICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OgogICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5OwogICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfQogICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH0KICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH0KICAgICAgICAgKiAgICAgfQogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yCiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoImN1c3RvbTphbm5vdGF0aW9uIiwgRXhhbXBsZSk7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKQogICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKCJjdXN0b206YW5ub3RhdGlvbiIsIEV4YW1wbGUsICJzdGF0aWNQcm9wZXJ0eSIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpCiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoImN1c3RvbTphbm5vdGF0aW9uIiwgRXhhbXBsZS5wcm90b3R5cGUsICJwcm9wZXJ0eSIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpCiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoImN1c3RvbTphbm5vdGF0aW9uIiwgRXhhbXBsZSwgInN0YXRpY01ldGhvZCIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKQogICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKCJjdXN0b206YW5ub3RhdGlvbiIsIEV4YW1wbGUucHJvdG90eXBlLCAibWV0aG9kIik7CiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBoYXNPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkgewogICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKQogICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTsKICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpOwogICAgICAgIH0KICAgICAgICBleHBvcnRlcigiaGFzT3duTWV0YWRhdGEiLCBoYXNPd25NZXRhZGF0YSk7CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi4KICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuCiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC4KICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LgogICAgICAgICAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIG1ldGFkYXRhIGtleSBpZiBmb3VuZDsgb3RoZXJ3aXNlLCBgdW5kZWZpbmVkYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUgewogICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OgogICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5OwogICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfQogICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH0KICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH0KICAgICAgICAgKiAgICAgfQogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yCiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoImN1c3RvbTphbm5vdGF0aW9uIiwgRXhhbXBsZSk7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKQogICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKCJjdXN0b206YW5ub3RhdGlvbiIsIEV4YW1wbGUsICJzdGF0aWNQcm9wZXJ0eSIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpCiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoImN1c3RvbTphbm5vdGF0aW9uIiwgRXhhbXBsZS5wcm90b3R5cGUsICJwcm9wZXJ0eSIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpCiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoImN1c3RvbTphbm5vdGF0aW9uIiwgRXhhbXBsZSwgInN0YXRpY01ldGhvZCIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKQogICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKCJjdXN0b206YW5ub3RhdGlvbiIsIEV4YW1wbGUucHJvdG90eXBlLCAibWV0aG9kIik7CiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkgewogICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKQogICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTsKICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpOwogICAgICAgIH0KICAgICAgICBleHBvcnRlcigiZ2V0TWV0YWRhdGEiLCBnZXRNZXRhZGF0YSk7CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLgogICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC4KICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHsKICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDoKICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTsKICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5OwogICAgICAgICAqCiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH0KICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9CiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9CiAgICAgICAgICogICAgIH0KICAgICAgICAgKgogICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvcgogICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKCJjdXN0b206YW5ub3RhdGlvbiIsIEV4YW1wbGUpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcikKICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YSgiY3VzdG9tOmFubm90YXRpb24iLCBFeGFtcGxlLCAic3RhdGljUHJvcGVydHkiKTsKICAgICAgICAgKgogICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKQogICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKCJjdXN0b206YW5ub3RhdGlvbiIsIEV4YW1wbGUucHJvdG90eXBlLCAicHJvcGVydHkiKTsKICAgICAgICAgKgogICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKQogICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKCJjdXN0b206YW5ub3RhdGlvbiIsIEV4YW1wbGUsICJzdGF0aWNNZXRob2QiKTsKICAgICAgICAgKgogICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSkKICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YSgiY3VzdG9tOmFubm90YXRpb24iLCBFeGFtcGxlLnByb3RvdHlwZSwgIm1ldGhvZCIpOwogICAgICAgICAqCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHsKICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOwogICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSkKICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7CiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTsKICAgICAgICB9CiAgICAgICAgZXhwb3J0ZXIoImdldE93bk1ldGFkYXRhIiwgZ2V0T3duTWV0YWRhdGEpOwogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIGtleXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdCBvciBpdHMgcHJvdG90eXBlIGNoYWluLgogICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC4KICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1bmlxdWUgbWV0YWRhdGEga2V5cy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUgewogICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OgogICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5OwogICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfQogICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH0KICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH0KICAgICAgICAgKiAgICAgfQogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yCiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcikKICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgInN0YXRpY1Byb3BlcnR5Iik7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSkKICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsICJwcm9wZXJ0eSIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpCiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUsICJzdGF0aWNNZXRob2QiKTsKICAgICAgICAgKgogICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSkKICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsICJtZXRob2QiKTsKICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldE1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KSB7CiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsKICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpCiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpOwogICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlNZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSk7CiAgICAgICAgfQogICAgICAgIGV4cG9ydGVyKCJnZXRNZXRhZGF0YUtleXMiLCBnZXRNZXRhZGF0YUtleXMpOwogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIHVuaXF1ZSBtZXRhZGF0YSBrZXlzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC4KICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LgogICAgICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHVuaXF1ZSBtZXRhZGF0YSBrZXlzLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7CiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6CiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7CiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTsKICAgICAgICAgKgogICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9CiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfQogICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfQogICAgICAgICAqICAgICB9CiAgICAgICAgICoKICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3IKICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSk7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKQogICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCAic3RhdGljUHJvcGVydHkiKTsKICAgICAgICAgKgogICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKQogICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgInByb3BlcnR5Iik7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcikKICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSwgInN0YXRpY01ldGhvZCIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKQogICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgIm1ldGhvZCIpOwogICAgICAgICAqCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHsKICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOwogICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSkKICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7CiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KTsKICAgICAgICB9CiAgICAgICAgZXhwb3J0ZXIoImdldE93bk1ldGFkYXRhS2V5cyIsIGdldE93bk1ldGFkYXRhS2V5cyk7CiAgICAgICAgLyoqCiAgICAgICAgICogRGVsZXRlcyB0aGUgbWV0YWRhdGEgZW50cnkgZnJvbSB0aGUgdGFyZ2V0IG9iamVjdCB3aXRoIHRoZSBwcm92aWRlZCBrZXkuCiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLgogICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuCiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC4KICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGVudHJ5IHdhcyBmb3VuZCBhbmQgZGVsZXRlZDsgb3RoZXJ3aXNlLCBmYWxzZS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUgewogICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OgogICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5OwogICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfQogICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH0KICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH0KICAgICAgICAgKiAgICAgfQogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yCiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoImN1c3RvbTphbm5vdGF0aW9uIiwgRXhhbXBsZSk7CiAgICAgICAgICoKICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKQogICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKCJjdXN0b206YW5ub3RhdGlvbiIsIEV4YW1wbGUsICJzdGF0aWNQcm9wZXJ0eSIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpCiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoImN1c3RvbTphbm5vdGF0aW9uIiwgRXhhbXBsZS5wcm90b3R5cGUsICJwcm9wZXJ0eSIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpCiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoImN1c3RvbTphbm5vdGF0aW9uIiwgRXhhbXBsZSwgInN0YXRpY01ldGhvZCIpOwogICAgICAgICAqCiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKQogICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKCJjdXN0b206YW5ub3RhdGlvbiIsIEV4YW1wbGUucHJvdG90eXBlLCAibWV0aG9kIik7CiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBkZWxldGVNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkgewogICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKQogICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTsKICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcCh0YXJnZXQsIHByb3BlcnR5S2V5LCAvKkNyZWF0ZSovIGZhbHNlKTsKICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaWYgKCFtZXRhZGF0YU1hcC5kZWxldGUobWV0YWRhdGFLZXkpKQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICBpZiAobWV0YWRhdGFNYXAuc2l6ZSA+IDApCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gTWV0YWRhdGEuZ2V0KHRhcmdldCk7CiAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLmRlbGV0ZShwcm9wZXJ0eUtleSk7CiAgICAgICAgICAgIGlmICh0YXJnZXRNZXRhZGF0YS5zaXplID4gMCkKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICBNZXRhZGF0YS5kZWxldGUodGFyZ2V0KTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGV4cG9ydGVyKCJkZWxldGVNZXRhZGF0YSIsIGRlbGV0ZU1ldGFkYXRhKTsKICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgICAgICAgdmFyIGRlY29yYXRvciA9IGRlY29yYXRvcnNbaV07CiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHRhcmdldCk7CiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc0NvbnN0cnVjdG9yKGRlY29yYXRlZCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkZWNvcmF0ZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gRGVjb3JhdGVQcm9wZXJ0eShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdG9yID0gZGVjb3JhdG9yc1tpXTsKICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChkZWNvcmF0ZWQpKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IGRlY29yYXRlZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBDcmVhdGUpIHsKICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gTWV0YWRhdGEuZ2V0KE8pOwogICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKSB7CiAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEgPSBuZXcgX01hcCgpOwogICAgICAgICAgICAgICAgTWV0YWRhdGEuc2V0KE8sIHRhcmdldE1ldGFkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSB0YXJnZXRNZXRhZGF0YS5nZXQoUCk7CiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpIHsKICAgICAgICAgICAgICAgIGlmICghQ3JlYXRlKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcCA9IG5ldyBfTWFwKCk7CiAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5zZXQoUCwgbWV0YWRhdGFNYXApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YU1hcDsKICAgICAgICB9CiAgICAgICAgLy8gMy4xLjEuMSBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKQogICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5aGFzbWV0YWRhdGEKICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7CiAgICAgICAgICAgIHZhciBoYXNPd24gPSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTsKICAgICAgICAgICAgaWYgKGhhc093bikKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTsKICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSkKICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIDMuMS4yLjEgT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkKICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc293bm1ldGFkYXRhCiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkgewogICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpOwogICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICByZXR1cm4gVG9Cb29sZWFuKG1ldGFkYXRhTWFwLmhhcyhNZXRhZGF0YUtleSkpOwogICAgICAgIH0KICAgICAgICAvLyAzLjEuMy4xIE9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApCiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRtZXRhZGF0YQogICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHsKICAgICAgICAgICAgdmFyIGhhc093biA9IE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApOwogICAgICAgICAgICBpZiAoaGFzT3duKQogICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApOwogICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTsKICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSkKICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApOwogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICAvLyAzLjEuNC4xIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApCiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRvd25tZXRhZGF0YQogICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHsKICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTsKICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSkKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YU1hcC5nZXQoTWV0YWRhdGFLZXkpOwogICAgICAgIH0KICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApCiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlkZWZpbmVvd25tZXRhZGF0YQogICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApIHsKICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIHRydWUpOwogICAgICAgICAgICBtZXRhZGF0YU1hcC5zZXQoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUpOwogICAgICAgIH0KICAgICAgICAvLyAzLjEuNi4xIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApCiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnltZXRhZGF0YWtleXMKICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKSB7CiAgICAgICAgICAgIHZhciBvd25LZXlzID0gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7CiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pOwogICAgICAgICAgICBpZiAocGFyZW50ID09PSBudWxsKQogICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7CiAgICAgICAgICAgIHZhciBwYXJlbnRLZXlzID0gT3JkaW5hcnlNZXRhZGF0YUtleXMocGFyZW50LCBQKTsKICAgICAgICAgICAgaWYgKHBhcmVudEtleXMubGVuZ3RoIDw9IDApCiAgICAgICAgICAgICAgICByZXR1cm4gb3duS2V5czsKICAgICAgICAgICAgaWYgKG93bktleXMubGVuZ3RoIDw9IDApCiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50S2V5czsKICAgICAgICAgICAgdmFyIHNldCA9IG5ldyBfU2V0KCk7CiAgICAgICAgICAgIHZhciBrZXlzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgb3duS2V5c18xID0gb3duS2V5czsgX2kgPCBvd25LZXlzXzEubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gb3duS2V5c18xW19pXTsKICAgICAgICAgICAgICAgIHZhciBoYXNLZXkgPSBzZXQuaGFzKGtleSk7CiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkgewogICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTsKICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBfYSA9IDAsIHBhcmVudEtleXNfMSA9IHBhcmVudEtleXM7IF9hIDwgcGFyZW50S2V5c18xLmxlbmd0aDsgX2ErKykgewogICAgICAgICAgICAgICAgdmFyIGtleSA9IHBhcmVudEtleXNfMVtfYV07CiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpOwogICAgICAgICAgICAgICAgaWYgKCFoYXNLZXkpIHsKICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7CiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGtleXM7CiAgICAgICAgfQogICAgICAgIC8vIDMuMS43LjEgT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCkKICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW93bm1ldGFkYXRha2V5cwogICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApIHsKICAgICAgICAgICAgdmFyIGtleXMgPSBbXTsKICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTsKICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSkKICAgICAgICAgICAgICAgIHJldHVybiBrZXlzOwogICAgICAgICAgICB2YXIga2V5c09iaiA9IG1ldGFkYXRhTWFwLmtleXMoKTsKICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gR2V0SXRlcmF0b3Ioa2V5c09iaik7CiAgICAgICAgICAgIHZhciBrID0gMDsKICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTsKICAgICAgICAgICAgICAgIGlmICghbmV4dCkgewogICAgICAgICAgICAgICAgICAgIGtleXMubGVuZ3RoID0gazsKICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5czsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBuZXh0VmFsdWUgPSBJdGVyYXRvclZhbHVlKG5leHQpOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBrZXlzW2tdID0gbmV4dFZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIDYgRUNNQVNjcmlwdCBEYXRhIFR5cDBlcyBhbmQgVmFsdWVzCiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1kYXRhLXR5cGVzLWFuZC12YWx1ZXMKICAgICAgICBmdW5jdGlvbiBUeXBlKHgpIHsKICAgICAgICAgICAgaWYgKHggPT09IG51bGwpCiAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiBOdWxsICovOwogICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB4KSB7CiAgICAgICAgICAgICAgICBjYXNlICJ1bmRlZmluZWQiOiByZXR1cm4gMCAvKiBVbmRlZmluZWQgKi87CiAgICAgICAgICAgICAgICBjYXNlICJib29sZWFuIjogcmV0dXJuIDIgLyogQm9vbGVhbiAqLzsKICAgICAgICAgICAgICAgIGNhc2UgInN0cmluZyI6IHJldHVybiAzIC8qIFN0cmluZyAqLzsKICAgICAgICAgICAgICAgIGNhc2UgInN5bWJvbCI6IHJldHVybiA0IC8qIFN5bWJvbCAqLzsKICAgICAgICAgICAgICAgIGNhc2UgIm51bWJlciI6IHJldHVybiA1IC8qIE51bWJlciAqLzsKICAgICAgICAgICAgICAgIGNhc2UgIm9iamVjdCI6IHJldHVybiB4ID09PSBudWxsID8gMSAvKiBOdWxsICovIDogNiAvKiBPYmplY3QgKi87CiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gNiAvKiBPYmplY3QgKi87CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gNi4xLjEgVGhlIFVuZGVmaW5lZCBUeXBlCiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcy11bmRlZmluZWQtdHlwZQogICAgICAgIGZ1bmN0aW9uIElzVW5kZWZpbmVkKHgpIHsKICAgICAgICAgICAgcmV0dXJuIHggPT09IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgLy8gNi4xLjIgVGhlIE51bGwgVHlwZQogICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtbnVsbC10eXBlCiAgICAgICAgZnVuY3Rpb24gSXNOdWxsKHgpIHsKICAgICAgICAgICAgcmV0dXJuIHggPT09IG51bGw7CiAgICAgICAgfQogICAgICAgIC8vIDYuMS41IFRoZSBTeW1ib2wgVHlwZQogICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtc3ltYm9sLXR5cGUKICAgICAgICBmdW5jdGlvbiBJc1N5bWJvbCh4KSB7CiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gInN5bWJvbCI7CiAgICAgICAgfQogICAgICAgIC8vIDYuMS43IFRoZSBPYmplY3QgVHlwZQogICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC10eXBlCiAgICAgICAgZnVuY3Rpb24gSXNPYmplY3QoeCkgewogICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09ICJvYmplY3QiID8geCAhPT0gbnVsbCA6IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iOwogICAgICAgIH0KICAgICAgICAvLyA3LjEgVHlwZSBDb252ZXJzaW9uCiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZS1jb252ZXJzaW9uCiAgICAgICAgLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pCiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmUKICAgICAgICBmdW5jdGlvbiBUb1ByaW1pdGl2ZShpbnB1dCwgUHJlZmVycmVkVHlwZSkgewogICAgICAgICAgICBzd2l0Y2ggKFR5cGUoaW5wdXQpKSB7CiAgICAgICAgICAgICAgICBjYXNlIDAgLyogVW5kZWZpbmVkICovOiByZXR1cm4gaW5wdXQ7CiAgICAgICAgICAgICAgICBjYXNlIDEgLyogTnVsbCAqLzogcmV0dXJuIGlucHV0OwogICAgICAgICAgICAgICAgY2FzZSAyIC8qIEJvb2xlYW4gKi86IHJldHVybiBpbnB1dDsKICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiBpbnB1dDsKICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiBpbnB1dDsKICAgICAgICAgICAgICAgIGNhc2UgNSAvKiBOdW1iZXIgKi86IHJldHVybiBpbnB1dDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgaGludCA9IFByZWZlcnJlZFR5cGUgPT09IDMgLyogU3RyaW5nICovID8gInN0cmluZyIgOiBQcmVmZXJyZWRUeXBlID09PSA1IC8qIE51bWJlciAqLyA/ICJudW1iZXIiIDogImRlZmF1bHQiOwogICAgICAgICAgICB2YXIgZXhvdGljVG9QcmltID0gR2V0TWV0aG9kKGlucHV0LCB0b1ByaW1pdGl2ZVN5bWJvbCk7CiAgICAgICAgICAgIGlmIChleG90aWNUb1ByaW0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGV4b3RpY1RvUHJpbS5jYWxsKGlucHV0LCBoaW50KTsKICAgICAgICAgICAgICAgIGlmIChJc09iamVjdChyZXN1bHQpKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIGhpbnQgPT09ICJkZWZhdWx0IiA/ICJudW1iZXIiIDogaGludCk7CiAgICAgICAgfQogICAgICAgIC8vIDcuMS4xLjEgT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KQogICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmUKICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeVRvUHJpbWl0aXZlKE8sIGhpbnQpIHsKICAgICAgICAgICAgaWYgKGhpbnQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMSA9IE8udG9TdHJpbmc7CiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18xKSkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0b1N0cmluZ18xLmNhbGwoTyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHZhbHVlT2YgPSBPLnZhbHVlT2Y7CiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZU9mLmNhbGwoTyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlT2YgPSBPLnZhbHVlT2Y7CiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZU9mLmNhbGwoTyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRvU3RyaW5nXzIgPSBPLnRvU3RyaW5nOwogICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMikpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMi5jYWxsKE8pOwogICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QocmVzdWx0KSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIC8vIDcuMS4yIFRvQm9vbGVhbihhcmd1bWVudCkKICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvMjAxNi8jc2VjLXRvYm9vbGVhbgogICAgICAgIGZ1bmN0aW9uIFRvQm9vbGVhbihhcmd1bWVudCkgewogICAgICAgICAgICByZXR1cm4gISFhcmd1bWVudDsKICAgICAgICB9CiAgICAgICAgLy8gNy4xLjEyIFRvU3RyaW5nKGFyZ3VtZW50KQogICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvc3RyaW5nCiAgICAgICAgZnVuY3Rpb24gVG9TdHJpbmcoYXJndW1lbnQpIHsKICAgICAgICAgICAgcmV0dXJuICIiICsgYXJndW1lbnQ7CiAgICAgICAgfQogICAgICAgIC8vIDcuMS4xNCBUb1Byb3BlcnR5S2V5KGFyZ3VtZW50KQogICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXkKICAgICAgICBmdW5jdGlvbiBUb1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7CiAgICAgICAgICAgIHZhciBrZXkgPSBUb1ByaW1pdGl2ZShhcmd1bWVudCwgMyAvKiBTdHJpbmcgKi8pOwogICAgICAgICAgICBpZiAoSXNTeW1ib2woa2V5KSkKICAgICAgICAgICAgICAgIHJldHVybiBrZXk7CiAgICAgICAgICAgIHJldHVybiBUb1N0cmluZyhrZXkpOwogICAgICAgIH0KICAgICAgICAvLyA3LjIgVGVzdGluZyBhbmQgQ29tcGFyaXNvbiBPcGVyYXRpb25zCiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdGVzdGluZy1hbmQtY29tcGFyaXNvbi1vcGVyYXRpb25zCiAgICAgICAgLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudCkKICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2FycmF5CiAgICAgICAgZnVuY3Rpb24gSXNBcnJheShhcmd1bWVudCkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheQogICAgICAgICAgICAgICAgPyBBcnJheS5pc0FycmF5KGFyZ3VtZW50KQogICAgICAgICAgICAgICAgOiBhcmd1bWVudCBpbnN0YW5jZW9mIE9iamVjdAogICAgICAgICAgICAgICAgICAgID8gYXJndW1lbnQgaW5zdGFuY2VvZiBBcnJheQogICAgICAgICAgICAgICAgICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50KSA9PT0gIltvYmplY3QgQXJyYXldIjsKICAgICAgICB9CiAgICAgICAgLy8gNy4yLjMgSXNDYWxsYWJsZShhcmd1bWVudCkKICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NhbGxhYmxlCiAgICAgICAgZnVuY3Rpb24gSXNDYWxsYWJsZShhcmd1bWVudCkgewogICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGlzIGFuIGFwcHJveGltYXRpb24gYXMgd2UgY2Fubm90IGNoZWNrIGZvciBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2QuCiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09ICJmdW5jdGlvbiI7CiAgICAgICAgfQogICAgICAgIC8vIDcuMi40IElzQ29uc3RydWN0b3IoYXJndW1lbnQpCiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNjb25zdHJ1Y3RvcgogICAgICAgIGZ1bmN0aW9uIElzQ29uc3RydWN0b3IoYXJndW1lbnQpIHsKICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBtZXRob2QuCiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09ICJmdW5jdGlvbiI7CiAgICAgICAgfQogICAgICAgIC8vIDcuMi43IElzUHJvcGVydHlLZXkoYXJndW1lbnQpCiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNwcm9wZXJ0eWtleQogICAgICAgIGZ1bmN0aW9uIElzUHJvcGVydHlLZXkoYXJndW1lbnQpIHsKICAgICAgICAgICAgc3dpdGNoIChUeXBlKGFyZ3VtZW50KSkgewogICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICBjYXNlIDQgLyogU3ltYm9sICovOiByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyA3LjMgT3BlcmF0aW9ucyBvbiBPYmplY3RzCiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1vYmplY3RzCiAgICAgICAgLy8gNy4zLjkgR2V0TWV0aG9kKFYsIFApCiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kCiAgICAgICAgZnVuY3Rpb24gR2V0TWV0aG9kKFYsIFApIHsKICAgICAgICAgICAgdmFyIGZ1bmMgPSBWW1BdOwogICAgICAgICAgICBpZiAoZnVuYyA9PT0gdW5kZWZpbmVkIHx8IGZ1bmMgPT09IG51bGwpCiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICBpZiAoIUlzQ2FsbGFibGUoZnVuYykpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CiAgICAgICAgICAgIHJldHVybiBmdW5jOwogICAgICAgIH0KICAgICAgICAvLyA3LjQgT3BlcmF0aW9ucyBvbiBJdGVyYXRvciBPYmplY3RzCiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1pdGVyYXRvci1vYmplY3RzCiAgICAgICAgZnVuY3Rpb24gR2V0SXRlcmF0b3Iob2JqKSB7CiAgICAgICAgICAgIHZhciBtZXRob2QgPSBHZXRNZXRob2Qob2JqLCBpdGVyYXRvclN5bWJvbCk7CiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShtZXRob2QpKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpOyAvLyBmcm9tIENhbGwKICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbWV0aG9kLmNhbGwob2JqKTsKICAgICAgICAgICAgaWYgKCFJc09iamVjdChpdGVyYXRvcikpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7CiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgICAgICB9CiAgICAgICAgLy8gNy40LjQgSXRlcmF0b3JWYWx1ZShpdGVyUmVzdWx0KQogICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtaXRlcmF0b3J2YWx1ZQogICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdCkgewogICAgICAgICAgICByZXR1cm4gaXRlclJlc3VsdC52YWx1ZTsKICAgICAgICB9CiAgICAgICAgLy8gNy40LjUgSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKQogICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yc3RlcAogICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yU3RlcChpdGVyYXRvcikgewogICAgICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyBmYWxzZSA6IHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbikKICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pdGVyYXRvcmNsb3NlCiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JDbG9zZShpdGVyYXRvcikgewogICAgICAgICAgICB2YXIgZiA9IGl0ZXJhdG9yWyJyZXR1cm4iXTsKICAgICAgICAgICAgaWYgKGYpCiAgICAgICAgICAgICAgICBmLmNhbGwoaXRlcmF0b3IpOwogICAgICAgIH0KICAgICAgICAvLyA5LjEgT3JkaW5hcnkgT2JqZWN0IEludGVybmFsIE1ldGhvZHMgYW5kIEludGVybmFsIFNsb3RzCiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3JkaW5hcnktb2JqZWN0LWludGVybmFsLW1ldGhvZHMtYW5kLWludGVybmFsLXNsb3RzCiAgICAgICAgLy8gOS4xLjEuMSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pCiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3JkaW5hcnlnZXRwcm90b3R5cGVvZgogICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTykgewogICAgICAgICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTyk7CiAgICAgICAgICAgIGlmICh0eXBlb2YgTyAhPT0gImZ1bmN0aW9uIiB8fCBPID09PSBmdW5jdGlvblByb3RvdHlwZSkKICAgICAgICAgICAgICAgIHJldHVybiBwcm90bzsKICAgICAgICAgICAgLy8gVHlwZVNjcmlwdCBkb2Vzbid0IHNldCBfX3Byb3RvX18gaW4gRVM1LCBhcyBpdCdzIG5vbi1zdGFuZGFyZC4KICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvci4gQ29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbnMKICAgICAgICAgICAgLy8gbXVzdCBlaXRoZXIgc2V0IF9fcHJvdG9fXyBvbiBhIHN1YmNsYXNzIGNvbnN0cnVjdG9yIHRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLAogICAgICAgICAgICAvLyBvciBlbnN1cmUgZWFjaCBjbGFzcyBoYXMgYSB2YWxpZCBgY29uc3RydWN0b3JgIHByb3BlcnR5IG9uIGl0cyBwcm90b3R5cGUgdGhhdAogICAgICAgICAgICAvLyBwb2ludHMgYmFjayB0byB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIEZ1bmN0aW9uLltbUHJvdG90eXBlXV0sIHRoZW4gdGhpcyBpcyBkZWZpbmF0ZWx5IGluaGVyaXRlZC4KICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVuIGluIEVTNiBvciB3aGVuIHVzaW5nIF9fcHJvdG9fXyBpbiBhIGNvbXBhdGlibGUgYnJvd3Nlci4KICAgICAgICAgICAgaWYgKHByb3RvICE9PSBmdW5jdGlvblByb3RvdHlwZSkKICAgICAgICAgICAgICAgIHJldHVybiBwcm90bzsKICAgICAgICAgICAgLy8gSWYgdGhlIHN1cGVyIHByb3RvdHlwZSBpcyBPYmplY3QucHJvdG90eXBlLCBudWxsLCBvciB1bmRlZmluZWQsIHRoZW4gd2UgY2Fubm90IGRldGVybWluZSB0aGUgaGVyaXRhZ2UuCiAgICAgICAgICAgIHZhciBwcm90b3R5cGUgPSBPLnByb3RvdHlwZTsKICAgICAgICAgICAgdmFyIHByb3RvdHlwZVByb3RvID0gcHJvdG90eXBlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpOwogICAgICAgICAgICBpZiAocHJvdG90eXBlUHJvdG8gPT0gbnVsbCB8fCBwcm90b3R5cGVQcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSkKICAgICAgICAgICAgICAgIHJldHVybiBwcm90bzsKICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnN0cnVjdG9yIHdhcyBub3QgYSBmdW5jdGlvbiwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS4KICAgICAgICAgICAgdmFyIGNvbnN0cnVjdG9yID0gcHJvdG90eXBlUHJvdG8uY29uc3RydWN0b3I7CiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09ICJmdW5jdGlvbiIpCiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87CiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc29tZSBraW5kIG9mIHNlbGYtcmVmZXJlbmNlLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLgogICAgICAgICAgICBpZiAoY29uc3RydWN0b3IgPT09IE8pCiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87CiAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBwcmV0dHkgZ29vZCBndWVzcyBhdCB0aGUgaGVyaXRhZ2UuCiAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3RvcjsKICAgICAgICB9CiAgICAgICAgLy8gbmFpdmUgTWFwIHNoaW0KICAgICAgICBmdW5jdGlvbiBDcmVhdGVNYXBQb2x5ZmlsbCgpIHsKICAgICAgICAgICAgdmFyIGNhY2hlU2VudGluZWwgPSB7fTsKICAgICAgICAgICAgdmFyIGFycmF5U2VudGluZWwgPSBbXTsKICAgICAgICAgICAgdmFyIE1hcEl0ZXJhdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwSXRlcmF0b3Ioa2V5cywgdmFsdWVzLCBzZWxlY3RvcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0ga2V5czsKICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBzZWxlY3RvcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVsiQEBpdGVyYXRvciJdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTsKICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9OwogICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5faW5kZXg7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLl9rZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fc2VsZWN0b3IodGhpcy5fa2V5c1tpbmRleF0sIHRoaXMuX3ZhbHVlc1tpbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyAxID49IHRoaXMuX2tleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBhcnJheVNlbnRpbmVsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXgrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzdWx0LCBkb25lOiBmYWxzZSB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlLnRocm93ID0gZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5yZXR1cm4gPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5kZXggPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiB0cnVlIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIE1hcEl0ZXJhdG9yOwogICAgICAgICAgICB9KCkpOwogICAgICAgICAgICByZXR1cm4gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hcC5wcm90b3R5cGUsICJzaXplIiwgewogICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGg7IH0sCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSkgPj0gMDsgfTsKICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IHRoaXMuX3ZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIHRydWUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNpemUgPSB0aGlzLl9rZXlzLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4ICsgMTsgaSA8IHNpemU7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5c1tpIC0gMV0gPSB0aGlzLl9rZXlzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2kgLSAxXSA9IHRoaXMuX3ZhbHVlc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLmxlbmd0aC0tOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoLS07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IHRoaXMuX2NhY2hlS2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldEtleSk7IH07CiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldFZhbHVlKTsgfTsKICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldEVudHJ5KTsgfTsKICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGVbIkBAaXRlcmF0b3IiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9OwogICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmVudHJpZXMoKTsgfTsKICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuX2ZpbmQgPSBmdW5jdGlvbiAoa2V5LCBpbnNlcnQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVLZXkgIT09IGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gdGhpcy5fa2V5cy5pbmRleE9mKHRoaXMuX2NhY2hlS2V5ID0ga2V5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlSW5kZXggPCAwICYmIGluc2VydCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gdGhpcy5fa2V5cy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMucHVzaChrZXkpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMucHVzaCh1bmRlZmluZWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVJbmRleDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gTWFwOwogICAgICAgICAgICB9KCkpOwogICAgICAgICAgICBmdW5jdGlvbiBnZXRLZXkoa2V5LCBfKSB7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFZhbHVlKF8sIHZhbHVlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RW50cnkoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtrZXksIHZhbHVlXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBuYWl2ZSBTZXQgc2hpbQogICAgICAgIGZ1bmN0aW9uIENyZWF0ZVNldFBvbHlmaWxsKCkgewogICAgICAgICAgICByZXR1cm4gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gU2V0KCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcCA9IG5ldyBfTWFwKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoU2V0LnByb3RvdHlwZSwgInNpemUiLCB7CiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAuc2l6ZTsgfSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmhhcyh2YWx1ZSk7IH07CiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLnNldCh2YWx1ZSwgdmFsdWUpLCB0aGlzOyB9OwogICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRoaXMuX21hcC5kZWxldGUodmFsdWUpOyB9OwogICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fbWFwLmNsZWFyKCk7IH07CiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAua2V5cygpOyB9OwogICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAudmFsdWVzKCk7IH07CiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAuZW50cmllcygpOyB9OwogICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZVsiQEBpdGVyYXRvciJdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzKCk7IH07CiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMua2V5cygpOyB9OwogICAgICAgICAgICAgICAgcmV0dXJuIFNldDsKICAgICAgICAgICAgfSgpKTsKICAgICAgICB9CiAgICAgICAgLy8gbmFpdmUgV2Vha01hcCBzaGltCiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlV2Vha01hcFBvbHlmaWxsKCkgewogICAgICAgICAgICB2YXIgVVVJRF9TSVpFID0gMTY7CiAgICAgICAgICAgIHZhciBrZXlzID0gSGFzaE1hcC5jcmVhdGUoKTsKICAgICAgICAgICAgdmFyIHJvb3RLZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTsKICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFdlYWtNYXAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5ID0gQ3JlYXRlVW5pcXVlS2V5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IEhhc2hNYXAuaGFzKHRhYmxlLCB0aGlzLl9rZXkpIDogZmFsc2U7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlICE9PSB1bmRlZmluZWQgPyBIYXNoTWFwLmdldCh0YWJsZSwgdGhpcy5fa2V5KSA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB0YWJsZVt0aGlzLl9rZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlICE9PSB1bmRlZmluZWQgPyBkZWxldGUgdGFibGVbdGhpcy5fa2V5XSA6IGZhbHNlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IG5vdCBhIHJlYWwgY2xlYXIsIGp1c3QgbWFrZXMgdGhlIHByZXZpb3VzIGRhdGEgdW5yZWFjaGFibGUKICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gV2Vha01hcDsKICAgICAgICAgICAgfSgpKTsKICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVW5pcXVlS2V5KCkgewogICAgICAgICAgICAgICAgdmFyIGtleTsKICAgICAgICAgICAgICAgIGRvCiAgICAgICAgICAgICAgICAgICAga2V5ID0gIkBAV2Vha01hcEBAIiArIENyZWF0ZVVVSUQoKTsKICAgICAgICAgICAgICAgIHdoaWxlIChIYXNoTWFwLmhhcyhrZXlzLCBrZXkpKTsKICAgICAgICAgICAgICAgIGtleXNba2V5XSA9IHRydWU7CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgY3JlYXRlKSB7CiAgICAgICAgICAgICAgICBpZiAoIWhhc093bi5jYWxsKHRhcmdldCwgcm9vdEtleSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCByb290S2V5LCB7IHZhbHVlOiBIYXNoTWFwLmNyZWF0ZSgpIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtyb290S2V5XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBGaWxsUmFuZG9tQnl0ZXMoYnVmZmVyLCBzaXplKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSkKICAgICAgICAgICAgICAgICAgICBidWZmZXJbaV0gPSBNYXRoLnJhbmRvbSgpICogMHhmZiB8IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIEdlblJhbmRvbUJ5dGVzKHNpemUpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVWludDhBcnJheSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAidW5kZWZpbmVkIikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoc2l6ZSkpOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbXNDcnlwdG8gIT09ICJ1bmRlZmluZWQiKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KHNpemUpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmlsbFJhbmRvbUJ5dGVzKG5ldyBVaW50OEFycmF5KHNpemUpLCBzaXplKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBGaWxsUmFuZG9tQnl0ZXMobmV3IEFycmF5KHNpemUpLCBzaXplKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBDcmVhdGVVVUlEKCkgewogICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBHZW5SYW5kb21CeXRlcyhVVUlEX1NJWkUpOwogICAgICAgICAgICAgICAgLy8gbWFyayBhcyByYW5kb20gLSBSRkMgNDEyMiDCpyA0LjQKICAgICAgICAgICAgICAgIGRhdGFbNl0gPSBkYXRhWzZdICYgMHg0ZiB8IDB4NDA7CiAgICAgICAgICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSAmIDB4YmYgfCAweDgwOwogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICAgICAgICAgICAgZm9yICh2YXIgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgVVVJRF9TSVpFOyArK29mZnNldCkgewogICAgICAgICAgICAgICAgICAgIHZhciBieXRlID0gZGF0YVtvZmZzZXRdOwogICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IDQgfHwgb2Zmc2V0ID09PSA2IHx8IG9mZnNldCA9PT0gOCkKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICItIjsKICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZSA8IDE2KQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIjAiOwogICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBieXRlLnRvU3RyaW5nKDE2KS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyB1c2VzIGEgaGV1cmlzdGljIHVzZWQgYnkgdjggYW5kIGNoYWtyYSB0byBmb3JjZSBhbiBvYmplY3QgaW50byBkaWN0aW9uYXJ5IG1vZGUuCiAgICAgICAgZnVuY3Rpb24gTWFrZURpY3Rpb25hcnkob2JqKSB7CiAgICAgICAgICAgIG9iai5fXyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgZGVsZXRlIG9iai5fXzsKICAgICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICB9CiAgICB9KTsKfSkoUmVmbGVjdCB8fCAoUmVmbGVjdCA9IHt9KSk7CgoKLyoqKi8gfSksCi8qIDIgKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgX19kZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7CiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkOwogICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAib2JqZWN0IiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gImZ1bmN0aW9uIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpOwogICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjsKICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7Cn07CnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgewogICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9CiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQogICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9CiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOwogICAgfSk7Cn07Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7IHZhbHVlOiB0cnVlIH0pKTsKZXhwb3J0cy5BcHAgPSB2b2lkIDA7CmNvbnN0IHV0aWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwpjbGFzcyBBcHAgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy5wcm92aWRlcyA9IFtdOwogICAgICAgIGNvbnNvbGUubG9nKCIlYyBBbnRpLVJlZGlyZWN0ICVjIENvcHlyaWdodCBceGE5IDIwMTUtJXMgJXMiLCAnZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjY0cHg7Y29sb3I6IzAwYmJlZTstd2Via2l0LXRleHQtZmlsbC1jb2xvcjojMDBiYmVlOy13ZWJraXQtdGV4dC1zdHJva2U6IDFweCAjMDBiYmVlOycsICJmb250LXNpemU6MTJweDtjb2xvcjojOTk5OTk5OyIsIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSwgIlxuIiArICJBdXRob3IgQEF4ZXRyb3kiKTsKICAgICAgICBjb25zb2xlLmxvZygiW0FudGkgUmVkaXJlY3RdOiDlpoLmnpzlj5HnjrDpobXpnaLph43lrprlkJHmnKrljrvpmaTvvIzmrKLov47lj43ppoghIik7CiAgICAgICAgY29uc29sZS5sb2coYCVjW0FudGkgUmVkaXJlY3RdOiDmlK/ku5jlrp3mkJzntKIgIiVjNTExMTE4MTMyJWMiIOmihuWPlue6ouWMheaUr+aMgeS9nOiAhSFgLCAiZm9udC1zaXplOiAxMnB4OyIsICJmb250LXNpemU6IDE2cHg7Y29sb3I6IHJlZCIsICJmb250LXNpemU6IDEycHg7Iik7CiAgICB9CiAgICAvKioKICAgICAqIEEg5qCH562+5piv5ZCm5Yy56YWN5pyN5Yqh5o+Q5L6b6ICFCiAgICAgKiBAcGFyYW0gYUVsZW1lbnQKICAgICAqIEBwYXJhbSBwcm92aWRlcgogICAgICovCiAgICBpc01hdGNoUHJvdmlkZXIoYUVsZW1lbnQsIHByb3ZpZGVyKSB7CiAgICAgICAgaWYgKGFFbGVtZW50LmdldEF0dHJpYnV0ZSh1dGlsc18xLk1hcmtlci5SZWRpcmVjdFN0YXR1c0RvbmUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKHByb3ZpZGVyLnRlc3QgaW5zdGFuY2VvZiBSZWdFeHAgJiYgIXByb3ZpZGVyLnRlc3QudGVzdChhRWxlbWVudC5ocmVmKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXIudGVzdCA9PT0gImZ1bmN0aW9uIiAmJiAhcHJvdmlkZXIudGVzdChhRWxlbWVudCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAocHJvdmlkZXIudGVzdCBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLnRlc3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiDlvZPpvKDmoIfnp7vliqjliLAgQSDmoIfnrb7kuIrml7YKICAgICAqIEBwYXJhbSBldmVudAogICAgICovCiAgICBvbkhvdmVyKGV2ZW50KSB7CiAgICAgICAgY29uc3QgYUVsZW1lbnQgPSBldmVudC50YXJnZXQ7CiAgICAgICAgaWYgKGFFbGVtZW50LnRhZ05hbWUgIT09ICJBIikgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIHRyaWdnZXIgb24gaG92ZXIgaGFuZGxlcgogICAgICAgIGZvciAoY29uc3QgcHJvdmlkZXIgb2YgdGhpcy5wcm92aWRlcykgewogICAgICAgICAgICBpZiAodGhpcy5pc01hdGNoUHJvdmlkZXIoYUVsZW1lbnQsIHByb3ZpZGVyKSkgewogICAgICAgICAgICAgICAgcHJvdmlkZXIucmVzb2x2ZShhRWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIOW9k+mhtemdoua7muWKqOaXtgogICAgICovCiAgICBvblNjcm9sbCgpIHsKICAgICAgICAvLyDnrZvpgInmiYDmnInlnKjlj6/op4bljLrln5/lhoXnmoRB5qCH562+CiAgICAgICAgY29uc3QgdmlzaWJsZUVsZW1lbnRzID0gW10uc2xpY2UKICAgICAgICAgICAgLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiYVtocmVmXSIpKQogICAgICAgICAgICAuZmlsdGVyKChhRWxlbWVudCkgPT4gewogICAgICAgICAgICByZXR1cm4gKGFFbGVtZW50LmhyZWYuaW5kZXhPZigiaHR0cCIpID4gLTEgJiYKICAgICAgICAgICAgICAgICgwLCB1dGlsc18xLmlzSW5WaWV3KShhRWxlbWVudCkgJiYKICAgICAgICAgICAgICAgICgwLCB1dGlsc18xLmdldFJlZGlyZWN0KShhRWxlbWVudCkgPD0gMik7CiAgICAgICAgfSk7CiAgICAgICAgLy8gdHJpZ2dlciBzY3JvbGwgaGFuZGxlcgogICAgICAgIGZvciAoY29uc3QgcHJvdmlkZXIgb2YgdGhpcy5wcm92aWRlcykgewogICAgICAgICAgICBmb3IgKGNvbnN0IGFFbGVtZW50IG9mIHZpc2libGVFbGVtZW50cykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNYXRjaFByb3ZpZGVyKGFFbGVtZW50LCBwcm92aWRlcikpIHsKICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5yZXNvbHZlKGFFbGVtZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICog5b2T6aG16Z2i5YeG5aSH5bCx57uq5pe277yM6L+b6KGM5Yid5aeL5YyW5Yqo5L2cCiAgICAgKi8KICAgIHBhZ2VPblJlYWR5KCkgewogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvdmlkZXIgb2YgdGhpcy5wcm92aWRlcykgewogICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyLm9uSW5pdCkgewogICAgICAgICAgICAgICAgICAgIHlpZWxkIHByb3ZpZGVyLm9uSW5pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8g5aaC5p6c6aG16Z2i5aSE5LqO5Yid5aeL55qE54q25oCB77yM5rKh5pyJ5rua5Yqo6L+H77yM5YiZ5Ye65Y+R5LiA5qyhb25TY3JvbGzkuovku7YKICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuc2Nyb2xsWSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNjcm9sbCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIOiuvue9rumFjee9rgogICAgICogQHBhcmFtIGNvbmZpZwogICAgICovCiAgICBzZXRDb25maWcoY29uZmlnKSB7CiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CiAgICAvKioKICAgICAqIOazqOWGjOacjeWKoeaPkOS+m+iAhQogICAgICogQHBhcmFtIHByb3ZpZGVycwogICAgICovCiAgICByZWdpc3RlclByb3ZpZGVyKHByb3ZpZGVycykgewogICAgICAgIGZvciAoY29uc3QgcHJvdmlkZUNvbmZpZyBvZiBwcm92aWRlcnMpIHsKICAgICAgICAgICAgLy8gdGVzdCDlpoLmnpzmmK8gYm9vbGVhbgogICAgICAgICAgICBpZiAocHJvdmlkZUNvbmZpZy50ZXN0ID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gdGVzdCDlpoLmnpzmmK/mraPliJnooajovr7lvI8KICAgICAgICAgICAgaWYgKHByb3ZpZGVDb25maWcudGVzdCBpbnN0YW5jZW9mIFJlZ0V4cCAmJgogICAgICAgICAgICAgICAgIXByb3ZpZGVDb25maWcudGVzdC50ZXN0KGRvY3VtZW50LmRvbWFpbikpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHRlc3Qg5aaC5p6c5piv5LiA5LiqZnVuY3Rpb24KICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlQ29uZmlnLnRlc3QgPT09ICJmdW5jdGlvbiIgJiYKICAgICAgICAgICAgICAgIHByb3ZpZGVDb25maWcudGVzdCgpID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgcHJvdmlkZUNvbmZpZy5wcm92aWRlcigpOwogICAgICAgICAgICBwcm92aWRlci5pc0RlYnVnID0gdGhpcy5jb25maWcuaXNEZWJ1ZzsKICAgICAgICAgICAgdGhpcy5wcm92aWRlcy5wdXNoKHByb3ZpZGVyKTsKICAgICAgICAgICAgY29uc29sZS5pbmZvKGBbQW50aS1yZWRpcmVjdF06IOWKoOi9veW8leaTjiAke3Byb3ZpZGVDb25maWcubmFtZX1gKTsKICAgICAgICAgICAgY29uc29sZS5pbmZvKGDlvZPliY3pobXpnaI6ICcke2xvY2F0aW9uLmhyZWZ9J2ApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KICAgIC8qKgogICAgICog5ZCv5Yqo5bqU55SoCiAgICAgKi8KICAgIGJvb3RzdHJhcCgpIHsKICAgICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCB0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcykpOwogICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsIHRoaXMub25Ib3Zlci5iaW5kKHRoaXMpKTsKICAgICAgICBhZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgdGhpcy5wYWdlT25SZWFkeS5iaW5kKHRoaXMpKTsKICAgIH0KfQpfX2RlY29yYXRlKFsKICAgICgwLCB1dGlsc18xLnRocm90dGxlRGVjb3JhdG9yKSg1MCkKXSwgQXBwLnByb3RvdHlwZSwgIm9uSG92ZXIiLCBudWxsKTsKX19kZWNvcmF0ZShbCiAgICAoMCwgdXRpbHNfMS5kZWJvdW5jZURlY29yYXRvcikoMzAwKQpdLCBBcHAucHJvdG90eXBlLCAib25TY3JvbGwiLCBudWxsKTsKZXhwb3J0cy5BcHAgPSBBcHA7CgoKLyoqKi8gfSksCi8qIDMgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsgdmFsdWU6IHRydWUgfSkpOwpleHBvcnRzLmFudGlSZWRpcmVjdCA9IGV4cG9ydHMuZGVjcmVhc2VSZWRpcmVjdCA9IGV4cG9ydHMuaW5jcmVhc2VSZWRpcmVjdCA9IGV4cG9ydHMuZ2V0UmVkaXJlY3QgPSBleHBvcnRzLmlzSW5WaWV3ID0gZXhwb3J0cy5kZWJvdW5jZURlY29yYXRvciA9IGV4cG9ydHMudGhyb3R0bGVEZWNvcmF0b3IgPSBleHBvcnRzLmdldFRleHQgPSBleHBvcnRzLnF1ZXJ5UGFyc2VyID0gZXhwb3J0cy5tYXRjaExpbmtGcm9tVXJsID0gZXhwb3J0cy5NYXJrZXIgPSB2b2lkIDA7CmNvbnN0IGRlYm91bmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKY29uc3QgdGhyb3R0bGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpOwp2YXIgTWFya2VyOwooZnVuY3Rpb24gKE1hcmtlcikgewogICAgTWFya2VyWyJSZWRpcmVjdENvdW50Il0gPSAicmVkaXJlY3QtY291bnQiOwogICAgTWFya2VyWyJSZWRpcmVjdFN0YXR1c0RvbmUiXSA9ICJhbnRpLXJlZGlyZWN0LW9yaWdpbi1ocmVmIjsKfSkoTWFya2VyID0gZXhwb3J0cy5NYXJrZXIgfHwgKGV4cG9ydHMuTWFya2VyID0ge30pKTsKLyoqCiAqIOagueaNrnVybOS4iueahOi3r+W+hOWMuemFje+8jOWOu+mZpOmHjeWumuWQkQogKiBAcGFyYW0ge0hUTUxBbmNob3JFbGVtZW50fSBhRWxlbWVudAogKiBAcGFyYW0ge1JlZ0V4cH0gdGVzdGVyCiAqIEByZXR1cm5zIHtib29sZWFufQogKi8KZnVuY3Rpb24gbWF0Y2hMaW5rRnJvbVVybChhRWxlbWVudCwgdGVzdGVyKSB7CiAgICBjb25zdCBtYXRjaGVyID0gdGVzdGVyLmV4ZWMoYUVsZW1lbnQuaHJlZik7CiAgICBpZiAoIW1hdGNoZXIgfHwgIW1hdGNoZXIubGVuZ3RoIHx8ICFtYXRjaGVyWzFdKSB7CiAgICAgICAgcmV0dXJuICIiOwogICAgfQogICAgbGV0IHVybCA9ICIiOwogICAgdHJ5IHsKICAgICAgICB1cmwgPSBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hlclsxXSk7CiAgICB9CiAgICBjYXRjaCAoZSkgewogICAgICAgIHVybCA9IC9odHRwcz86XC9cLy8udGVzdChtYXRjaGVyWzFdKSA/IG1hdGNoZXJbMV0gOiAiIjsKICAgIH0KICAgIHJldHVybiB1cmw7Cn0KZXhwb3J0cy5tYXRjaExpbmtGcm9tVXJsID0gbWF0Y2hMaW5rRnJvbVVybDsKY2xhc3MgUXVlcnkgewogICAgY29uc3RydWN0b3IocXVlcnlTdHIpIHsKICAgICAgICB0aGlzLnF1ZXJ5U3RyID0gcXVlcnlTdHI7CiAgICAgICAgdGhpcy5vYmplY3QgPSB7fTsKICAgICAgICB0aGlzLm9iamVjdCA9IHRoaXMudG9PYmplY3QocXVlcnlTdHIucmVwbGFjZSgvXlw/Ky8sICIiKSk7CiAgICB9CiAgICB0b09iamVjdChxdWVyeVN0cikgewogICAgICAgIGNvbnN0IG9iaiA9IHt9OwogICAgICAgIHF1ZXJ5U3RyLnNwbGl0KCImIikuZm9yRWFjaCgoaXRlbSkgPT4gewogICAgICAgICAgICBjb25zdCBhcnIgPSBpdGVtLnNwbGl0KCI9IikgfHwgW107CiAgICAgICAgICAgIGxldCBrZXkgPSBhcnJbMF0gfHwgIiI7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGFyclsxXSB8fCAiIjsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGtleSA9IGRlY29kZVVSSUNvbXBvbmVudChhcnJbMF0gfHwgIiIpOwogICAgICAgICAgICAgICAgdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQoYXJyWzFdIHx8ICIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChrZXkpIHsKICAgICAgICAgICAgICAgIG9ialtrZXldID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gb2JqOwogICAgfQogICAgdG9TdHJpbmcoKSB7CiAgICAgICAgY29uc3QgYXJyID0gW107CiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5vYmplY3QpIHsKICAgICAgICAgICAgaWYgKHRoaXMub2JqZWN0Lmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5vYmplY3Rba2V5XTsKICAgICAgICAgICAgICAgIGFyci5wdXNoKGtleSArICI9IiArIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJyLmxlbmd0aCA/ICI/IiArIGFyci5qb2luKCImIikgOiAiIjsKICAgIH0KfQpmdW5jdGlvbiBxdWVyeVBhcnNlcihxdWVyeVN0cmluZykgewogICAgcmV0dXJuIG5ldyBRdWVyeShxdWVyeVN0cmluZyk7Cn0KZXhwb3J0cy5xdWVyeVBhcnNlciA9IHF1ZXJ5UGFyc2VyOwpmdW5jdGlvbiBnZXRUZXh0KGh0bWxFbGVtZW50KSB7CiAgICByZXR1cm4gKGh0bWxFbGVtZW50LmlubmVyVGV4dCB8fCBodG1sRWxlbWVudC50ZXh0Q29udGVudCkudHJpbSgpOwp9CmV4cG9ydHMuZ2V0VGV4dCA9IGdldFRleHQ7CmZ1bmN0aW9uIHRocm90dGxlRGVjb3JhdG9yKHdhaXQsIG9wdGlvbnMgPSB7fSkgewogICAgcmV0dXJuICh0YXJnZXQsIG5hbWUsIGRlc2NyaXB0b3IpID0+IHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGRlc2NyaXB0b3IuZW51bWVyYWJsZSwKICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG5hbWUsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aHJvdHRsZShkZXNjcmlwdG9yLnZhbHVlLCB3YWl0LCBvcHRpb25zKSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbbmFtZV07CiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH07Cn0KZXhwb3J0cy50aHJvdHRsZURlY29yYXRvciA9IHRocm90dGxlRGVjb3JhdG9yOwpmdW5jdGlvbiBkZWJvdW5jZURlY29yYXRvcih3YWl0LCBvcHRpb25zID0ge30pIHsKICAgIHJldHVybiAodGFyZ2V0LCBuYW1lLCBkZXNjcmlwdG9yKSA9PiB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBkZXNjcmlwdG9yLmVudW1lcmFibGUsCiAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBuYW1lLCB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGRlc2NyaXB0b3IuZW51bWVyYWJsZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZGVib3VuY2UoZGVzY3JpcHRvci52YWx1ZSwgd2FpdCwgb3B0aW9ucyksCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW25hbWVdOwogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9Owp9CmV4cG9ydHMuZGVib3VuY2VEZWNvcmF0b3IgPSBkZWJvdW5jZURlY29yYXRvcjsKZnVuY3Rpb24gaXNJblZpZXcoZWxlbWVudCkgewogICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICBjb25zdCB2V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7CiAgICBjb25zdCB2SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7CiAgICBjb25zdCBlZnAgPSAoeCwgeSkgPT4gewogICAgICAgIHJldHVybiBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHgsIHkpOwogICAgfTsKICAgIC8vIFJldHVybiBmYWxzZSBpZiBpdCdzIG5vdCBpbiB0aGUgdmlld3BvcnQKICAgIGlmIChyZWN0LnJpZ2h0IDwgMCB8fAogICAgICAgIHJlY3QuYm90dG9tIDwgMCB8fAogICAgICAgIHJlY3QubGVmdCA+IHZXaWR0aCB8fAogICAgICAgIHJlY3QudG9wID4gdkhlaWdodCkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgaXRzIGZvdXIgY29ybmVycyBhcmUgdmlzaWJsZQogICAgcmV0dXJuIChlbGVtZW50LmNvbnRhaW5zKGVmcChyZWN0LmxlZnQsIHJlY3QudG9wKSkgfHwKICAgICAgICBlbGVtZW50LmNvbnRhaW5zKGVmcChyZWN0LnJpZ2h0LCByZWN0LnRvcCkpIHx8CiAgICAgICAgZWxlbWVudC5jb250YWlucyhlZnAocmVjdC5yaWdodCwgcmVjdC5ib3R0b20pKSB8fAogICAgICAgIGVsZW1lbnQuY29udGFpbnMoZWZwKHJlY3QubGVmdCwgcmVjdC5ib3R0b20pKSk7Cn0KZXhwb3J0cy5pc0luVmlldyA9IGlzSW5WaWV3OwpmdW5jdGlvbiBnZXRSZWRpcmVjdChhRWxlbWVudCkgewogICAgcmV0dXJuICsoYUVsZW1lbnQuZ2V0QXR0cmlidXRlKE1hcmtlci5SZWRpcmVjdENvdW50KSB8fCAwKTsKfQpleHBvcnRzLmdldFJlZGlyZWN0ID0gZ2V0UmVkaXJlY3Q7CmZ1bmN0aW9uIGluY3JlYXNlUmVkaXJlY3QoYUVsZW1lbnQpIHsKICAgIGNvbnN0IG51bSA9IGdldFJlZGlyZWN0KGFFbGVtZW50KTsKICAgIGFFbGVtZW50LnNldEF0dHJpYnV0ZShNYXJrZXIuUmVkaXJlY3RDb3VudCwgbnVtICsgMSArICIiKTsKfQpleHBvcnRzLmluY3JlYXNlUmVkaXJlY3QgPSBpbmNyZWFzZVJlZGlyZWN0OwpmdW5jdGlvbiBkZWNyZWFzZVJlZGlyZWN0KGFFbGVtZW50KSB7CiAgICBjb25zdCBudW0gPSBnZXRSZWRpcmVjdChhRWxlbWVudCk7CiAgICBpZiAobnVtID4gMCkgewogICAgICAgIGFFbGVtZW50LnNldEF0dHJpYnV0ZShNYXJrZXIuUmVkaXJlY3RDb3VudCwgbnVtIC0gMSArICIiKTsKICAgIH0KfQpleHBvcnRzLmRlY3JlYXNlUmVkaXJlY3QgPSBkZWNyZWFzZVJlZGlyZWN0OwovKioKICog5Y676Zmk6YeN5a6a5ZCRCiAqIEBwYXJhbSBhRWxlbWVudCBB5qCH562+5YWD57SgCiAqIEBwYXJhbSByZWFsVXJsIOecn+WunueahOWcsOWdgAogKiBAcGFyYW0gb3B0aW9ucwogKi8KZnVuY3Rpb24gYW50aVJlZGlyZWN0KGFFbGVtZW50LCByZWFsVXJsLCBvcHRpb25zID0ge30pIHsKICAgIG9wdGlvbnMuZGVidWcgPQogICAgICAgIHR5cGVvZiBvcHRpb25zLmRlYnVnID09PSAidW5kZWZpbmVkIgogICAgICAgICAgICA/ICJwcm9kdWN0aW9uIiAhPT0gInByb2R1Y3Rpb24iCiAgICAgICAgICAgIDogb3B0aW9ucy5kZWJ1ZzsKICAgIG9wdGlvbnMuZm9yY2UgPSBvcHRpb25zLmZvcmNlIHx8IGZhbHNlOwogICAgaWYgKCFvcHRpb25zLmZvcmNlICYmICghcmVhbFVybCB8fCBhRWxlbWVudC5ocmVmID09PSByZWFsVXJsKSkgewogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChvcHRpb25zLmRlYnVnKSB7CiAgICAgICAgYUVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gImdyZWVuIjsKICAgIH0KICAgIGFFbGVtZW50LnNldEF0dHJpYnV0ZShNYXJrZXIuUmVkaXJlY3RTdGF0dXNEb25lLCBhRWxlbWVudC5ocmVmKTsKICAgIGFFbGVtZW50LmhyZWYgPSByZWFsVXJsOwp9CmV4cG9ydHMuYW50aVJlZGlyZWN0ID0gYW50aVJlZGlyZWN0OwoKCi8qKiovIH0pLAovKiA0ICovCi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCi8qKgogKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+CiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz0ibnBtIiAtbyAuL2AKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+CiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT4KICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT4KICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCiAqLwoKLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yICJGdW5jdGlvbnMiIG1ldGhvZHMuICovCnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7CgovKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi8KdmFyIE5BTiA9IDAgLyAwOwoKLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqLwp2YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7CgovKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqLwp2YXIgcmVUcmltID0gL15ccyt8XHMrJC9nOwoKLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi8KdmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTsKCi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi8KdmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7CgovKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi8KdmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7CgovKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqLwp2YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7CgovKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqLwp2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPT0gJ29iamVjdCcgJiYgX193ZWJwYWNrX3JlcXVpcmVfXy5nICYmIF9fd2VicGFja19yZXF1aXJlX18uZy5PYmplY3QgPT09IE9iamVjdCAmJiBfX3dlYnBhY2tfcmVxdWlyZV9fLmc7CgovKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqLwp2YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjsKCi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqLwp2YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTsKCi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi8KdmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTsKCi8qKgogKiBVc2VkIHRvIHJlc29sdmUgdGhlCiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKQogKiBvZiB2YWx1ZXMuCiAqLwp2YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZzsKCi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi8KdmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LAogICAgbmF0aXZlTWluID0gTWF0aC5taW47CgovKioKICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlCiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLgogKgogKiBAc3RhdGljCiAqIEBtZW1iZXJPZiBfCiAqIEBzaW5jZSAyLjQuMAogKiBAY2F0ZWdvcnkgRGF0ZQogKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuCiAqIEBleGFtcGxlCiAqCiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHsKICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApOwogKiB9LCBfLm5vdygpKTsKICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi4KICovCnZhciBub3cgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gcm9vdC5EYXRlLm5vdygpOwp9OwoKLyoqCiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YAogKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXMKICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbAogKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS4KICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlCiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQKICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudAogKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYAogKiBpbnZvY2F0aW9uLgogKgogKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzCiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uCiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC4KICoKICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkCiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC4KICoKICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pCiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuCiAqCiAqIEBzdGF0aWMKICogQG1lbWJlck9mIF8KICogQHNpbmNlIDAuMS4wCiAqIEBjYXRlZ29yeSBGdW5jdGlvbgogKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS4KICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LgogKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC4KICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXQogKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LgogKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF0KICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLgogKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdCiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LgogKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uCiAqIEBleGFtcGxlCiAqCiAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguCiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7CiAqCiAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLgogKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7CiAqICAgJ2xlYWRpbmcnOiB0cnVlLAogKiAgICd0cmFpbGluZyc6IGZhbHNlCiAqIH0pKTsKICoKICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy4KICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7CiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTsKICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpOwogKgogKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLgogKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTsKICovCmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHsKICB2YXIgbGFzdEFyZ3MsCiAgICAgIGxhc3RUaGlzLAogICAgICBtYXhXYWl0LAogICAgICByZXN1bHQsCiAgICAgIHRpbWVySWQsCiAgICAgIGxhc3RDYWxsVGltZSwKICAgICAgbGFzdEludm9rZVRpbWUgPSAwLAogICAgICBsZWFkaW5nID0gZmFsc2UsCiAgICAgIG1heGluZyA9IGZhbHNlLAogICAgICB0cmFpbGluZyA9IHRydWU7CgogIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7CiAgfQogIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwOwogIGlmIChpc09iamVjdChvcHRpb25zKSkgewogICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nOwogICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7CiAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0OwogICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZzsKICB9CgogIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkgewogICAgdmFyIGFyZ3MgPSBsYXN0QXJncywKICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7CgogICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDsKICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTsKICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkgewogICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci4KICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTsKICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuCiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpOwogICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuCiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7CiAgfQoKICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHsKICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsCiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSwKICAgICAgICByZXN1bHQgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7CgogICAgcmV0dXJuIG1heGluZyA/IG5hdGl2ZU1pbihyZXN1bHQsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKSA6IHJlc3VsdDsKICB9CgogIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7CiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLAogICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7CgogICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGUKICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nCiAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuCiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fAogICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpOwogIH0KCiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkgewogICAgdmFyIHRpbWUgPSBub3coKTsKICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHsKICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTsKICAgIH0KICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLgogICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTsKICB9CgogIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7CiAgICB0aW1lcklkID0gdW5kZWZpbmVkOwoKICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW4KICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLgogICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7CiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpOwogICAgfQogICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBmdW5jdGlvbiBjYW5jZWwoKSB7CiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTsKICAgIH0KICAgIGxhc3RJbnZva2VUaW1lID0gMDsKICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkOwogIH0KCiAgZnVuY3Rpb24gZmx1c2goKSB7CiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTsKICB9CgogIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHsKICAgIHZhciB0aW1lID0gbm93KCksCiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTsKCiAgICBsYXN0QXJncyA9IGFyZ3VtZW50czsKICAgIGxhc3RUaGlzID0gdGhpczsKICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7CgogICAgaWYgKGlzSW52b2tpbmcpIHsKICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpOwogICAgICB9CiAgICAgIGlmIChtYXhpbmcpIHsKICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLgogICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7CiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTsKICAgICAgfQogICAgfQogICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkgewogICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDsKICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDsKICByZXR1cm4gZGVib3VuY2VkOwp9CgovKioKICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlCiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcykKICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKQogKgogKiBAc3RhdGljCiAqIEBtZW1iZXJPZiBfCiAqIEBzaW5jZSAwLjEuMAogKiBAY2F0ZWdvcnkgTGFuZwogKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuCiAqIEBleGFtcGxlCiAqCiAqIF8uaXNPYmplY3Qoe30pOwogKiAvLyA9PiB0cnVlCiAqCiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTsKICogLy8gPT4gdHJ1ZQogKgogKiBfLmlzT2JqZWN0KF8ubm9vcCk7CiAqIC8vID0+IHRydWUKICoKICogXy5pc09iamVjdChudWxsKTsKICogLy8gPT4gZmFsc2UKICovCmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7CiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7CiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTsKfQoKLyoqCiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYAogKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mICJvYmplY3QiLgogKgogKiBAc3RhdGljCiAqIEBtZW1iZXJPZiBfCiAqIEBzaW5jZSA0LjAuMAogKiBAY2F0ZWdvcnkgTGFuZwogKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC4KICogQGV4YW1wbGUKICoKICogXy5pc09iamVjdExpa2Uoe30pOwogKiAvLyA9PiB0cnVlCiAqCiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7CiAqIC8vID0+IHRydWUKICoKICogXy5pc09iamVjdExpa2UoXy5ub29wKTsKICogLy8gPT4gZmFsc2UKICoKICogXy5pc09iamVjdExpa2UobnVsbCk7CiAqIC8vID0+IGZhbHNlCiAqLwpmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHsKICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7Cn0KCi8qKgogKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC4KICoKICogQHN0YXRpYwogKiBAbWVtYmVyT2YgXwogKiBAc2luY2UgNC4wLjAKICogQGNhdGVnb3J5IExhbmcKICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuCiAqIEBleGFtcGxlCiAqCiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTsKICogLy8gPT4gdHJ1ZQogKgogKiBfLmlzU3ltYm9sKCdhYmMnKTsKICogLy8gPT4gZmFsc2UKICovCmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fAogICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTsKfQoKLyoqCiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuCiAqCiAqIEBzdGF0aWMKICogQG1lbWJlck9mIF8KICogQHNpbmNlIDQuMC4wCiAqIEBjYXRlZ29yeSBMYW5nCiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuCiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci4KICogQGV4YW1wbGUKICoKICogXy50b051bWJlcigzLjIpOwogKiAvLyA9PiAzLjIKICoKICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTsKICogLy8gPT4gNWUtMzI0CiAqCiAqIF8udG9OdW1iZXIoSW5maW5pdHkpOwogKiAvLyA9PiBJbmZpbml0eQogKgogKiBfLnRvTnVtYmVyKCczLjInKTsKICogLy8gPT4gMy4yCiAqLwpmdW5jdGlvbiB0b051bWJlcih2YWx1ZSkgewogIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHsKICAgIHJldHVybiB2YWx1ZTsKICB9CiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkgewogICAgcmV0dXJuIE5BTjsKICB9CiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkgewogICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlOwogICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjsKICB9CiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgewogICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7CiAgfQogIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTsKICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpOwogIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKQogICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpCiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTsKfQoKbW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZTsKCgovKioqLyB9KSwKLyogNSAqLwovKioqLyAoKG1vZHVsZSwgX191bnVzZWRfd2VicGFja19leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgovKioKICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPgogKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9Im5wbSIgLW8gLi9gCiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPgogKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+CiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+CiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9ycwogKi8KCi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciAiRnVuY3Rpb25zIiBtZXRob2RzLiAqLwp2YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nOwoKLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovCnZhciBOQU4gPSAwIC8gMDsKCi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi8KdmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nOwoKLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi8KdmFyIHJlVHJpbSA9IC9eXHMrfFxzKyQvZzsKCi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovCnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7CgovKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovCnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pOwoKLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovCnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pOwoKLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi8KdmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50OwoKLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi8KdmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgX193ZWJwYWNrX3JlcXVpcmVfXy5nID09ICdvYmplY3QnICYmIF9fd2VicGFja19yZXF1aXJlX18uZyAmJiBfX3dlYnBhY2tfcmVxdWlyZV9fLmcuT2JqZWN0ID09PSBPYmplY3QgJiYgX193ZWJwYWNrX3JlcXVpcmVfXy5nOwoKLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi8KdmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7CgovKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi8KdmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7CgovKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovCnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7CgovKioKICogVXNlZCB0byByZXNvbHZlIHRoZQogKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZykKICogb2YgdmFsdWVzLgogKi8KdmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7CgovKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovCnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCwKICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluOwoKLyoqCiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZQogKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4KICoKICogQHN0YXRpYwogKiBAbWVtYmVyT2YgXwogKiBAc2luY2UgMi40LjAKICogQGNhdGVnb3J5IERhdGUKICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLgogKiBAZXhhbXBsZQogKgogKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7CiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTsKICogfSwgXy5ub3coKSk7CiAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uCiAqLwp2YXIgbm93ID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTsKfTsKCi8qKgogKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGAKICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzCiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWwKICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uCiAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZQogKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkCiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQKICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AKICogaW52b2NhdGlvbi4KICoKICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpcwogKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvbgogKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuCiAqCiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZAogKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuCiAqCiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKQogKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLgogKgogKiBAc3RhdGljCiAqIEBtZW1iZXJPZiBfCiAqIEBzaW5jZSAwLjEuMAogKiBAY2F0ZWdvcnkgRnVuY3Rpb24KICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuCiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS4KICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuCiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV0KICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC4KICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdCiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC4KICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXQogKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC4KICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLgogKiBAZXhhbXBsZQogKgogKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LgogKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpOwogKgogKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy4KICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwgewogKiAgICdsZWFkaW5nJzogdHJ1ZSwKICogICAndHJhaWxpbmcnOiBmYWxzZQogKiB9KSk7CiAqCiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuCiAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pOwogKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7CiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTsKICoKICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi4KICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7CiAqLwpmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7CiAgdmFyIGxhc3RBcmdzLAogICAgICBsYXN0VGhpcywKICAgICAgbWF4V2FpdCwKICAgICAgcmVzdWx0LAogICAgICB0aW1lcklkLAogICAgICBsYXN0Q2FsbFRpbWUsCiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCwKICAgICAgbGVhZGluZyA9IGZhbHNlLAogICAgICBtYXhpbmcgPSBmYWxzZSwKICAgICAgdHJhaWxpbmcgPSB0cnVlOwoKICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpOwogIH0KICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDsKICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHsKICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZzsKICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zOwogICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDsKICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7CiAgfQoKICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHsKICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsCiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzOwoKICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7CiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7CiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHsKICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuCiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7CiAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLgogICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTsKICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLgogICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7CiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLAogICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsCiAgICAgICAgcmVzdWx0ID0gd2FpdCAtIHRpbWVTaW5jZUxhc3RDYWxsOwoKICAgIHJldHVybiBtYXhpbmcgPyBuYXRpdmVNaW4ocmVzdWx0LCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSkgOiByZXN1bHQ7CiAgfQoKICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkgewogICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSwKICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lOwoKICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlCiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZwogICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LgogICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHwKICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTsKICB9CgogIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHsKICAgIHZhciB0aW1lID0gbm93KCk7CiAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7CiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7CiAgICB9CiAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci4KICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7CiAgfQoKICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkgewogICAgdGltZXJJZCA9IHVuZGVmaW5lZDsKCiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuCiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS4KICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykgewogICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTsKICAgIH0KICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gY2FuY2VsKCkgewogICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkgewogICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7CiAgICB9CiAgICBsYXN0SW52b2tlVGltZSA9IDA7CiAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDsKICB9CgogIGZ1bmN0aW9uIGZsdXNoKCkgewogICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7CiAgfQoKICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7CiAgICB2YXIgdGltZSA9IG5vdygpLAogICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7CgogICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7CiAgICBsYXN0VGhpcyA9IHRoaXM7CiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lOwoKICAgIGlmIChpc0ludm9raW5nKSB7CiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTsKICAgICAgfQogICAgICBpZiAobWF4aW5nKSB7CiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC4KICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpOwogICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7CiAgICAgIH0KICAgIH0KICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHsKICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7CiAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7CiAgcmV0dXJuIGRlYm91bmNlZDsKfQoKLyoqCiAqIENyZWF0ZXMgYSB0aHJvdHRsZWQgZnVuY3Rpb24gdGhhdCBvbmx5IGludm9rZXMgYGZ1bmNgIGF0IG1vc3Qgb25jZSBwZXIKICogZXZlcnkgYHdhaXRgIG1pbGxpc2Vjb25kcy4gVGhlIHRocm90dGxlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAKICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0bwogKiBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS4gUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2AKICogc2hvdWxkIGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YAogKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlCiAqIHRocm90dGxlZCBmdW5jdGlvbi4gU3Vic2VxdWVudCBjYWxscyB0byB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIHJldHVybiB0aGUKICogcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLgogKgogKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzCiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uCiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC4KICoKICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkCiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC4KICoKICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pCiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuCiAqCiAqIEBzdGF0aWMKICogQG1lbWJlck9mIF8KICogQHNpbmNlIDAuMS4wCiAqIEBjYXRlZ29yeSBGdW5jdGlvbgogKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS4KICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRocm90dGxlIGludm9jYXRpb25zIHRvLgogKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC4KICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdCiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuCiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV0KICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuCiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHRocm90dGxlZCBmdW5jdGlvbi4KICogQGV4YW1wbGUKICoKICogLy8gQXZvaWQgZXhjZXNzaXZlbHkgdXBkYXRpbmcgdGhlIHBvc2l0aW9uIHdoaWxlIHNjcm9sbGluZy4KICogalF1ZXJ5KHdpbmRvdykub24oJ3Njcm9sbCcsIF8udGhyb3R0bGUodXBkYXRlUG9zaXRpb24sIDEwMCkpOwogKgogKiAvLyBJbnZva2UgYHJlbmV3VG9rZW5gIHdoZW4gdGhlIGNsaWNrIGV2ZW50IGlzIGZpcmVkLCBidXQgbm90IG1vcmUgdGhhbiBvbmNlIGV2ZXJ5IDUgbWludXRlcy4KICogdmFyIHRocm90dGxlZCA9IF8udGhyb3R0bGUocmVuZXdUb2tlbiwgMzAwMDAwLCB7ICd0cmFpbGluZyc6IGZhbHNlIH0pOwogKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTsKICoKICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyB0aHJvdHRsZWQgaW52b2NhdGlvbi4KICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7CiAqLwpmdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7CiAgdmFyIGxlYWRpbmcgPSB0cnVlLAogICAgICB0cmFpbGluZyA9IHRydWU7CgogIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7CiAgfQogIGlmIChpc09iamVjdChvcHRpb25zKSkgewogICAgbGVhZGluZyA9ICdsZWFkaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLmxlYWRpbmcgOiBsZWFkaW5nOwogICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZzsKICB9CiAgcmV0dXJuIGRlYm91bmNlKGZ1bmMsIHdhaXQsIHsKICAgICdsZWFkaW5nJzogbGVhZGluZywKICAgICdtYXhXYWl0Jzogd2FpdCwKICAgICd0cmFpbGluZyc6IHRyYWlsaW5nCiAgfSk7Cn0KCi8qKgogKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGUKICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKQogKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApCiAqCiAqIEBzdGF0aWMKICogQG1lbWJlck9mIF8KICogQHNpbmNlIDAuMS4wCiAqIEBjYXRlZ29yeSBMYW5nCiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC4KICogQGV4YW1wbGUKICoKICogXy5pc09iamVjdCh7fSk7CiAqIC8vID0+IHRydWUKICoKICogXy5pc09iamVjdChbMSwgMiwgM10pOwogKiAvLyA9PiB0cnVlCiAqCiAqIF8uaXNPYmplY3QoXy5ub29wKTsKICogLy8gPT4gdHJ1ZQogKgogKiBfLmlzT2JqZWN0KG51bGwpOwogKiAvLyA9PiBmYWxzZQogKi8KZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHsKICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpOwp9CgovKioKICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgCiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgIm9iamVjdCIuCiAqCiAqIEBzdGF0aWMKICogQG1lbWJlck9mIF8KICogQHNpbmNlIDQuMC4wCiAqIEBjYXRlZ29yeSBMYW5nCiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLgogKiBAZXhhbXBsZQogKgogKiBfLmlzT2JqZWN0TGlrZSh7fSk7CiAqIC8vID0+IHRydWUKICoKICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTsKICogLy8gPT4gdHJ1ZQogKgogKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApOwogKiAvLyA9PiBmYWxzZQogKgogKiBfLmlzT2JqZWN0TGlrZShudWxsKTsKICogLy8gPT4gZmFsc2UKICovCmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkgewogIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JzsKfQoKLyoqCiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LgogKgogKiBAc3RhdGljCiAqIEBtZW1iZXJPZiBfCiAqIEBzaW5jZSA0LjAuMAogKiBAY2F0ZWdvcnkgTGFuZwogKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC4KICogQGV4YW1wbGUKICoKICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpOwogKiAvLyA9PiB0cnVlCiAqCiAqIF8uaXNTeW1ib2woJ2FiYycpOwogKiAvLyA9PiBmYWxzZQogKi8KZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHsKICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8CiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpOwp9CgovKioKICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci4KICoKICogQHN0YXRpYwogKiBAbWVtYmVyT2YgXwogKiBAc2luY2UgNC4wLjAKICogQGNhdGVnb3J5IExhbmcKICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy4KICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLgogKiBAZXhhbXBsZQogKgogKiBfLnRvTnVtYmVyKDMuMik7CiAqIC8vID0+IDMuMgogKgogKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpOwogKiAvLyA9PiA1ZS0zMjQKICoKICogXy50b051bWJlcihJbmZpbml0eSk7CiAqIC8vID0+IEluZmluaXR5CiAqCiAqIF8udG9OdW1iZXIoJzMuMicpOwogKiAvLyA9PiAzLjIKICovCmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykgewogICAgcmV0dXJuIHZhbHVlOwogIH0KICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7CiAgICByZXR1cm4gTkFOOwogIH0KICBpZiAoaXNPYmplY3QodmFsdWUpKSB7CiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7CiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyOwogIH0KICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7CiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTsKICB9CiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpOwogIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7CiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpCiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOCkKICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpOwp9Cgptb2R1bGUuZXhwb3J0cyA9IHRocm90dGxlOwoKCi8qKiovIH0pLAovKiA2ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7IHZhbHVlOiB0cnVlIH0pKTsKZXhwb3J0cy5SdXlvUHJvdmlkZXIgPSB2b2lkIDA7CmNvbnN0IHV0aWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwpjbGFzcyBSdXlvUHJvdmlkZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZXN0ID0gL1wvW15cP10qXD91PSguKikvOwogICAgfQogICAgcmVzb2x2ZShhRWxlbWVudCkgewogICAgICAgICgwLCB1dGlsc18xLmFudGlSZWRpcmVjdCkoYUVsZW1lbnQsIG5ldyBVUkwoYUVsZW1lbnQuaHJlZikuc2VhcmNoUGFyYW1zLmdldCgidSIpKTsKICAgIH0KfQpleHBvcnRzLlJ1eW9Qcm92aWRlciA9IFJ1eW9Qcm92aWRlcjsKCgovKioqLyB9KSwKLyogNyAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7CmV4cG9ydHMuTW96aWxsYVByb3ZpZGVyID0gdm9pZCAwOwpjb25zdCB1dGlsc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKY2xhc3MgTW96aWxsYVByb3ZpZGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMudGVzdCA9IC9vdXRnb2luZ1wucHJvZFwubW96YXdzXC5uZXRcL3ZcZFwvXHcrXC8oLiopLzsKICAgIH0KICAgIHJlc29sdmUoYUVsZW1lbnQpIHsKICAgICAgICAoMCwgdXRpbHNfMS5hbnRpUmVkaXJlY3QpKGFFbGVtZW50LCAoMCwgdXRpbHNfMS5tYXRjaExpbmtGcm9tVXJsKShhRWxlbWVudCwgdGhpcy50ZXN0KSk7CiAgICB9Cn0KZXhwb3J0cy5Nb3ppbGxhUHJvdmlkZXIgPSBNb3ppbGxhUHJvdmlkZXI7CgoKLyoqKi8gfSksCi8qIDggKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHsKICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQogICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQogICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQogICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsKICAgIH0pOwp9OwpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7CmV4cG9ydHMuWWluWGlhbmdQcm92aWRlciA9IHZvaWQgMDsKY29uc3QgdXRpbHNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7CmNsYXNzIFlpblhpYW5nUHJvdmlkZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZXN0ID0gL15odHRwOlwvXC8vOwogICAgfQogICAgcmVzb2x2ZShhRWxlbWVudCkgewogICAgICAgIC8vIOe8lui+keWZqAogICAgICAgIGlmIChhRWxlbWVudC5oYXNBdHRyaWJ1dGUoImRhdGEtbWNlLWhyZWYiKSkgewogICAgICAgICAgICBpZiAoIWFFbGVtZW50Lm9uY2xpY2spIHsKICAgICAgICAgICAgICAgICgwLCB1dGlsc18xLmFudGlSZWRpcmVjdCkoYUVsZW1lbnQsIGFFbGVtZW50LmhyZWYsIHsgZm9yY2U6IHRydWUgfSk7CiAgICAgICAgICAgICAgICBhRWxlbWVudC5vbmNsaWNrID0gKGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyDpmLvmraLkuovku7blhpLms6EsIOWboOS4uuS4iuWxguWFg+e0oOe7keWumueahGNsaWNr5LqL5Lu25Lya6YeN5a6a5ZCRCiAgICAgICAgICAgICAgICAgICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFFbGVtZW50LnNldEF0dHJpYnV0ZSgidGFyZ2V0IiwgIl9ibGFuayIpOwogICAgICAgICAgICAgICAgICAgIHdpbmRvdy50b3AKICAgICAgICAgICAgICAgICAgICAgICAgPyB3aW5kb3cudG9wLm9wZW4oYUVsZW1lbnQuaHJlZikKICAgICAgICAgICAgICAgICAgICAgICAgOiB3aW5kb3cub3BlbihhRWxlbWVudC5ocmVmKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8g5YiG5Lqr6aG16Z2iCiAgICAgICAgZWxzZSBpZiAoL15odHRwczpcL1wvYXBwXC55aW54aWFuZ1wuY29tXC9PdXRib3VuZFJlZGlyZWN0XC5hY3Rpb25cP2Rlc3Q9Ly50ZXN0KGFFbGVtZW50LmhyZWYpKSB7CiAgICAgICAgICAgICgwLCB1dGlsc18xLmFudGlSZWRpcmVjdCkoYUVsZW1lbnQsIG5ldyBVUkwoYUVsZW1lbnQuaHJlZikuc2VhcmNoUGFyYW1zLmdldCgiZGVzdCIpKTsKICAgICAgICB9CiAgICB9CiAgICBvbkluaXQoKSB7CiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBkb20gPSBlLnRhcmdldDsKICAgICAgICAgICAgICAgIGNvbnN0IHRhZ05hbWUgPSBkb20udGFnTmFtZS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgc3dpdGNoICh0YWdOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiQSI6CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZShkb20pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJJRlJBTUUiOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9tLmhhc0F0dHJpYnV0ZSgiYW50aS1yZWRpcmVjdC1oYW5kbGVkIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKCJhbnRpLXJlZGlyZWN0LWhhbmRsZWQiLCAiMSIpOwogICAgICAgICAgICAgICAgICAgICAgICBkb20uY29udGVudFdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBoYW5kbGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGhhbmRsZXIpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9KTsKICAgIH0KfQpleHBvcnRzLllpblhpYW5nUHJvdmlkZXIgPSBZaW5YaWFuZ1Byb3ZpZGVyOwoKCi8qKiovIH0pLAovKiA5ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7IHZhbHVlOiB0cnVlIH0pKTsKZXhwb3J0cy5DU0ROUHJvdmlkZXIgPSB2b2lkIDA7CmNvbnN0IHV0aWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwpjbGFzcyBDU0ROUHJvdmlkZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZXN0ID0gL15odHRwcz86XC9cLy87CiAgICB9CiAgICByZXNvbHZlKGFFbGVtZW50KSB7CiAgICAgICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjY29udGVudF92aWV3cyIpOwogICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5jb250YWlucyhhRWxlbWVudCkpIHsKICAgICAgICAgICAgaWYgKCFhRWxlbWVudC5vbmNsaWNrICYmIGFFbGVtZW50Lm9yaWdpbiAhPT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbikgewogICAgICAgICAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShhRWxlbWVudCwgYUVsZW1lbnQuaHJlZiwgeyBmb3JjZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgIGFFbGVtZW50Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIOmYu+atouS6i+S7tuWGkuazoSwg5Zug5Li65LiK5bGC5YWD57Sg57uR5a6a55qEY2xpY2vkuovku7bkvJrph43lrprlkJEKICAgICAgICAgICAgICAgICAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYUVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0YXJnZXQiLCAiX2JsYW5rIik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CmV4cG9ydHMuQ1NETlByb3ZpZGVyID0gQ1NETlByb3ZpZGVyOwoKCi8qKiovIH0pLAovKiAxMCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7CmV4cG9ydHMuT1NDaGluYVByb3ZpZGVyID0gdm9pZCAwOwpjb25zdCB1dGlsc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKY2xhc3MgT1NDaGluYVByb3ZpZGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMudGVzdCA9IC9vc2NoaW5hXC5uZXRcL2FjdGlvblwvR29Ub0xpbmtcP3VybD0oLiopLzsKICAgIH0KICAgIHJlc29sdmUoYUVsZW1lbnQpIHsKICAgICAgICAoMCwgdXRpbHNfMS5hbnRpUmVkaXJlY3QpKGFFbGVtZW50LCBuZXcgVVJMKGFFbGVtZW50LmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoInVybCIpKTsKICAgIH0KfQpleHBvcnRzLk9TQ2hpbmFQcm92aWRlciA9IE9TQ2hpbmFQcm92aWRlcjsKCgovKioqLyB9KSwKLyogMTEgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsgdmFsdWU6IHRydWUgfSkpOwpleHBvcnRzLlpoaWh1RGFpbHlQcm92aWRlciA9IHZvaWQgMDsKY29uc3QgdXRpbHNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7CmNsYXNzIFpoaWh1RGFpbHlQcm92aWRlciB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLnRlc3QgPSAvemhpaHVcLmNvbVwvXD90YXJnZXQ9KC4qKS87CiAgICB9CiAgICByZXNvbHZlKGFFbGVtZW50KSB7CiAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCJ0YXJnZXQiKSk7CiAgICB9Cn0KZXhwb3J0cy5aaGlodURhaWx5UHJvdmlkZXIgPSBaaGlodURhaWx5UHJvdmlkZXI7CgoKLyoqKi8gfSksCi8qIDEyICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7IHZhbHVlOiB0cnVlIH0pKTsKZXhwb3J0cy5Hb29nbGVEb2NzUHJvdmlkZXIgPSB2b2lkIDA7CmNvbnN0IHV0aWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwpjbGFzcyBHb29nbGVEb2NzUHJvdmlkZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZXN0ID0gL3d3d1wuZ29vZ2xlXC5jb21cL3VybFw/cT0oLiopLzsKICAgIH0KICAgIHJlc29sdmUoYUVsZW1lbnQpIHsKICAgICAgICAoMCwgdXRpbHNfMS5hbnRpUmVkaXJlY3QpKGFFbGVtZW50LCBuZXcgVVJMKGFFbGVtZW50LmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoInEiKSk7CiAgICB9Cn0KZXhwb3J0cy5Hb29nbGVEb2NzUHJvdmlkZXIgPSBHb29nbGVEb2NzUHJvdmlkZXI7CgoKLyoqKi8gfSksCi8qIDEzICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7IHZhbHVlOiB0cnVlIH0pKTsKZXhwb3J0cy5Qb2NrZXRQcm92aWRlciA9IHZvaWQgMDsKY29uc3QgdXRpbHNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7CmNsYXNzIFBvY2tldFByb3ZpZGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMudGVzdCA9IC9nZXRwb2NrZXRcLmNvbVwvcmVkaXJlY3RcP3VybD0oLiopLzsKICAgIH0KICAgIHJlc29sdmUoYUVsZW1lbnQpIHsKICAgICAgICAoMCwgdXRpbHNfMS5hbnRpUmVkaXJlY3QpKGFFbGVtZW50LCBuZXcgVVJMKGFFbGVtZW50LmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoInVybCIpKTsKICAgIH0KfQpleHBvcnRzLlBvY2tldFByb3ZpZGVyID0gUG9ja2V0UHJvdmlkZXI7CgoKLyoqKi8gfSksCi8qIDE0ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7IHZhbHVlOiB0cnVlIH0pKTsKZXhwb3J0cy5HbWFpbFByb3ZpZGVyID0gdm9pZCAwOwpjb25zdCB1dGlsc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKY2xhc3MgR21haWxQcm92aWRlciB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLnRlc3QgPSB0cnVlOwogICAgICAgIHRoaXMuUkVESVJFQ1RfUFJPUEVSVFkgPSAiZGF0YS1zYWZlcmVkaXJlY3R1cmwiOwogICAgfQogICAgcmVzb2x2ZShhRWxlbWVudCkgewogICAgICAgIC8vIOenu+mZpOi/meS4quWxnuaAp++8jOmCo+S5iCBhIOmTvuaOpeWwseS4jeS8mui3s+i9rAogICAgICAgIC8vIEZJWE1FOiBnbWFpbCDmmK/lpJrlsYIgaWZyYW1lIOW1jOWllwogICAgICAgIGlmIChhRWxlbWVudC5nZXRBdHRyaWJ1dGUodGhpcy5SRURJUkVDVF9QUk9QRVJUWSkpIHsKICAgICAgICAgICAgYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHRoaXMuUkVESVJFQ1RfUFJPUEVSVFkpOwogICAgICAgICAgICAoMCwgdXRpbHNfMS5hbnRpUmVkaXJlY3QpKGFFbGVtZW50LCBhRWxlbWVudC5ocmVmKTsKICAgICAgICB9CiAgICB9Cn0KZXhwb3J0cy5HbWFpbFByb3ZpZGVyID0gR21haWxQcm92aWRlcjsKCgovKioqLyB9KSwKLyogMTUgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsgdmFsdWU6IHRydWUgfSkpOwpleHBvcnRzLkp1ZWppblByb3ZpZGVyID0gdm9pZCAwOwpjb25zdCB1dGlsc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKY2xhc3MgSnVlamluUHJvdmlkZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZXN0ID0gL2xpbmtcLmp1ZWppblwuKGltfGNuKVwvXD90YXJnZXQ9KC4qKS87CiAgICB9CiAgICByZXNvbHZlKGFFbGVtZW50KSB7CiAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCJ0YXJnZXQiKSk7CiAgICB9Cn0KZXhwb3J0cy5KdWVqaW5Qcm92aWRlciA9IEp1ZWppblByb3ZpZGVyOwoKCi8qKiovIH0pLAovKiAxNiAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSA9PiB7CgoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7CmV4cG9ydHMuUVFNYWlsUHJvdmlkZXIgPSB2b2lkIDA7CmNsYXNzIFFRTWFpbFByb3ZpZGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMudGVzdCA9IHRydWU7CiAgICB9CiAgICByZXNvbHZlKGFFbGVtZW50KSB7CiAgICAgICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjY29udGVudERpdiIpOwogICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5jb250YWlucyhhRWxlbWVudCkpIHsKICAgICAgICAgICAgaWYgKGFFbGVtZW50Lm9uY2xpY2spIHsKICAgICAgICAgICAgICAgIGFFbGVtZW50Lm9uY2xpY2sgPSAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIOmYu+atouS6i+S7tuWGkuazoSwg5Zug5Li65LiK5bGC5YWD57Sg57uR5a6a55qEY2xpY2vkuovku7bkvJrph43lrprlkJEKICAgICAgICAgICAgICAgICAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CmV4cG9ydHMuUVFNYWlsUHJvdmlkZXIgPSBRUU1haWxQcm92aWRlcjsKCgovKioqLyB9KSwKLyogMTcgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsgdmFsdWU6IHRydWUgfSkpOwpleHBvcnRzLk1pSmlQcm92aWRlciA9IHZvaWQgMDsKY29uc3QgdXRpbHNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7CmNsYXNzIE1pSmlQcm92aWRlciB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLnRlc3QgPSAvbWlqaXNvdVwuY29tXC91cmxfcHJveHlcP3Byb3h5dXJsPSguKikvOwogICAgfQogICAgcmVzb2x2ZShhRWxlbWVudCkgewogICAgICAgICgwLCB1dGlsc18xLmFudGlSZWRpcmVjdCkoYUVsZW1lbnQsIG5ldyBVUkwoYUVsZW1lbnQuaHJlZikuc2VhcmNoUGFyYW1zLmdldCgicHJveHl1cmwiKSk7CiAgICB9Cn0KZXhwb3J0cy5NaUppUHJvdmlkZXIgPSBNaUppUHJvdmlkZXI7CgoKLyoqKi8gfSksCi8qIDE4ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7IHZhbHVlOiB0cnVlIH0pKTsKZXhwb3J0cy5Hb29nbGVQbGF5UHJvdmlkZXIgPSB2b2lkIDA7CmNvbnN0IHV0aWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwpjbGFzcyBHb29nbGVQbGF5UHJvdmlkZXIgewogICAgdGVzdChhRWxlbWVudCkgewogICAgICAgIGlmICgvZ29vZ2xlXC5jb21cL3VybFw/cT0oLiopLy50ZXN0KGFFbGVtZW50LmhyZWYpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgvXlwvc3RvcmVcL2FwcHNcL2RldGFpbHMvLnRlc3QobG9jYXRpb24ucGF0aG5hbWUpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXNvbHZlKGFFbGVtZW50KSB7CiAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCJxIikpOwogICAgICAgIC8vIOenu+mZpOW8gOWPkeiAheagj+ebruS4i+eahOmHjeWumuWQkQogICAgICAgIGNvbnN0IGVsZXMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImEuaHJUYnAiKSk7CiAgICAgICAgZm9yIChjb25zdCBlbGUgb2YgZWxlcykgewogICAgICAgICAgICBpZiAoIWVsZS5ocmVmKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZWxlLmdldEF0dHJpYnV0ZSh1dGlsc18xLk1hcmtlci5SZWRpcmVjdFN0YXR1c0RvbmUpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbGUuc2V0QXR0cmlidXRlKHV0aWxzXzEuTWFya2VyLlJlZGlyZWN0U3RhdHVzRG9uZSwgZWxlLmhyZWYpOwogICAgICAgICAgICBlbGUuc2V0QXR0cmlidXRlKCJ0YXJnZXQiLCAiX2JsYW5rIik7CiAgICAgICAgICAgIGVsZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICB9LCB0cnVlKTsKICAgICAgICB9CiAgICB9Cn0KZXhwb3J0cy5Hb29nbGVQbGF5UHJvdmlkZXIgPSBHb29nbGVQbGF5UHJvdmlkZXI7CgoKLyoqKi8gfSksCi8qIDE5ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7IHZhbHVlOiB0cnVlIH0pKTsKZXhwb3J0cy5TdGVhbVByb3ZpZGVyID0gdm9pZCAwOwpjb25zdCB1dGlsc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKY2xhc3MgU3RlYW1Qcm92aWRlciB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLnRlc3QgPSAvc3RlYW1jb21tdW5pdHlcLmNvbVwvbGlua2ZpbHRlclwvXD91cmw9KC4qKS87CiAgICB9CiAgICByZXNvbHZlKGFFbGVtZW50KSB7CiAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCd1cmwnKSk7CiAgICB9Cn0KZXhwb3J0cy5TdGVhbVByb3ZpZGVyID0gU3RlYW1Qcm92aWRlcjsKCgovKioqLyB9KSwKLyogMjAgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsgdmFsdWU6IHRydWUgfSkpOwpleHBvcnRzLlRpZWJhUHJvdmlkZXIgPSB2b2lkIDA7CmNvbnN0IHV0aWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwpjbGFzcyBUaWViYVByb3ZpZGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMudGVzdCA9IC9qdW1wXGQqXC5iZGltZ1wuY29tLzsKICAgIH0KICAgIHJlc29sdmUoYUVsZW1lbnQpIHsKICAgICAgICBpZiAoIXRoaXMudGVzdC50ZXN0KGFFbGVtZW50LmhyZWYpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbGV0IHVybCA9ICIiOwogICAgICAgIGNvbnN0IHRleHQgPSBhRWxlbWVudC5pbm5lclRleHQgfHwgYUVsZW1lbnQudGV4dENvbnRlbnQgfHwgIiI7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKC9odHRwcz86XC9cLy8udGVzdCh0ZXh0KSkgewogICAgICAgICAgICAgICAgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KHRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIHVybCA9IC9odHRwcz86XC9cLy8udGVzdCh0ZXh0KSA/IHRleHQgOiAiIjsKICAgICAgICB9CiAgICAgICAgaWYgKHVybCkgewogICAgICAgICAgICAoMCwgdXRpbHNfMS5hbnRpUmVkaXJlY3QpKGFFbGVtZW50LCB1cmwpOwogICAgICAgIH0KICAgIH0KfQpleHBvcnRzLlRpZWJhUHJvdmlkZXIgPSBUaWViYVByb3ZpZGVyOwoKCi8qKiovIH0pLAovKiAyMSAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7CmV4cG9ydHMuVHdpdHRlclByb3ZpZGVyID0gdm9pZCAwOwpjb25zdCB1dGlsc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKY2xhc3MgVHdpdHRlclByb3ZpZGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMudGVzdCA9IC90XC5jb1wvXHcrLzsKICAgIH0KICAgIHJlc29sdmUoYUVsZW1lbnQpIHsKICAgICAgICBpZiAoIXRoaXMudGVzdC50ZXN0KGFFbGVtZW50LmhyZWYpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKC9odHRwcz86XC9cLy8udGVzdChhRWxlbWVudC50aXRsZSkpIHsKICAgICAgICAgICAgY29uc3QgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGFFbGVtZW50LnRpdGxlKTsKICAgICAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShhRWxlbWVudCwgdXJsKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBpbm5lclRleHQgPSBhRWxlbWVudC5pbm5lclRleHQucmVwbGFjZSgv4oCmJC8sICIiKTsKICAgICAgICBpZiAoL2h0dHBzPzpcL1wvLy50ZXN0KGlubmVyVGV4dCkpIHsKICAgICAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShhRWxlbWVudCwgaW5uZXJUZXh0KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KfQpleHBvcnRzLlR3aXR0ZXJQcm92aWRlciA9IFR3aXR0ZXJQcm92aWRlcjsKCgovKioqLyB9KSwKLyogMjIgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsgdmFsdWU6IHRydWUgfSkpOwpleHBvcnRzLkJhaWR1VmlkZW9Qcm92aWRlciA9IHZvaWQgMDsKY29uc3QgZ21faHR0cF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CmNvbnN0IHV0aWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwpjbGFzcyBCYWlkdVZpZGVvUHJvdmlkZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZXN0ID0gL3ZcLmJhaWR1XC5jb21cL2xpbmtcP3VybD0vOwogICAgfQogICAgcmVzb2x2ZShhRWxlbWVudCkgewogICAgICAgIGdtX2h0dHBfMS5kZWZhdWx0CiAgICAgICAgICAgIC5yZXF1ZXN0KHsKICAgICAgICAgICAgdXJsOiBhRWxlbWVudC5ocmVmLAogICAgICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgICAgICBhbm9ueW1vdXM6IHRydWUKICAgICAgICB9KQogICAgICAgICAgICAudGhlbigocmVzKSA9PiB7CiAgICAgICAgICAgIGlmIChyZXMuZmluYWxVcmwpIHsKICAgICAgICAgICAgICAgICgwLCB1dGlsc18xLmFudGlSZWRpcmVjdCkoYUVsZW1lbnQsIHJlcy5maW5hbFVybCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgICAgICAuY2F0Y2goZXJyID0+IHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgIH0pOwogICAgfQp9CmV4cG9ydHMuQmFpZHVWaWRlb1Byb3ZpZGVyID0gQmFpZHVWaWRlb1Byb3ZpZGVyOwoKCi8qKiovIH0pLAovKiAyMyAqLwovKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7CgooZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkgewoJaWYodHJ1ZSkKCQltb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKCWVsc2Uge30KfSkodGhpcywgZnVuY3Rpb24oKSB7CnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwCi8qKioqKiovIAkvLyBUaGUgbW9kdWxlIGNhY2hlCi8qKioqKiovIAl2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9OwovKioqKioqLwovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fbmVzdGVkX3dlYnBhY2tfcmVxdWlyZV81MzVfXyhtb2R1bGVJZCkgewovKioqKioqLwovKioqKioqLyAJCS8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZQovKioqKioqLyAJCWlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7Ci8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOwovKioqKioqLyAJCX0KLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKLyoqKioqKi8gCQkJaTogbW9kdWxlSWQsCi8qKioqKiovIAkJCWw6IGZhbHNlLAovKioqKioqLyAJCQlleHBvcnRzOiB7fQovKioqKioqLyAJCX07Ci8qKioqKiovCi8qKioqKiovIAkJLy8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uCi8qKioqKiovIAkJbW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX19uZXN0ZWRfd2VicGFja19yZXF1aXJlXzUzNV9fKTsKLyoqKioqKi8KLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkCi8qKioqKiovIAkJbW9kdWxlLmwgPSB0cnVlOwovKioqKioqLwovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlCi8qKioqKiovIAkJcmV0dXJuIG1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJfQovKioqKioqLwovKioqKioqLwovKioqKioqLyAJLy8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXykKLyoqKioqKi8gCV9fbmVzdGVkX3dlYnBhY2tfcmVxdWlyZV81MzVfXy5tID0gbW9kdWxlczsKLyoqKioqKi8KLyoqKioqKi8gCS8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlCi8qKioqKiovIAlfX25lc3RlZF93ZWJwYWNrX3JlcXVpcmVfNTM1X18uYyA9IGluc3RhbGxlZE1vZHVsZXM7Ci8qKioqKiovCi8qKioqKiovIAkvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHMKLyoqKioqKi8gCV9fbmVzdGVkX3dlYnBhY2tfcmVxdWlyZV81MzVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7Ci8qKioqKiovIAkJaWYoIV9fbmVzdGVkX3dlYnBhY2tfcmVxdWlyZV81MzVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7Ci8qKioqKiovIAkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7Ci8qKioqKiovIAkJCQljb25maWd1cmFibGU6IGZhbHNlLAovKioqKioqLyAJCQkJZW51bWVyYWJsZTogdHJ1ZSwKLyoqKioqKi8gCQkJCWdldDogZ2V0dGVyCi8qKioqKiovIAkJCX0pOwovKioqKioqLyAJCX0KLyoqKioqKi8gCX07Ci8qKioqKiovCi8qKioqKiovIAkvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlcwovKioqKioqLyAJX19uZXN0ZWRfd2VicGFja19yZXF1aXJlXzUzNV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHsKLyoqKioqKi8gCQl2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID8KLyoqKioqKi8gCQkJZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDoKLyoqKioqKi8gCQkJZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTsKLyoqKioqKi8gCQlfX25lc3RlZF93ZWJwYWNrX3JlcXVpcmVfNTM1X18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTsKLyoqKioqKi8gCQlyZXR1cm4gZ2V0dGVyOwovKioqKioqLyAJfTsKLyoqKioqKi8KLyoqKioqKi8gCS8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbAovKioqKioqLyAJX19uZXN0ZWRfd2VicGFja19yZXF1aXJlXzUzNV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07Ci8qKioqKiovCi8qKioqKiovIAkvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfXwovKioqKioqLyAJX19uZXN0ZWRfd2VicGFja19yZXF1aXJlXzUzNV9fLnAgPSAiIjsKLyoqKioqKi8KLyoqKioqKi8gCS8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0cwovKioqKioqLyAJcmV0dXJuIF9fbmVzdGVkX3dlYnBhY2tfcmVxdWlyZV81MzVfXyhfX25lc3RlZF93ZWJwYWNrX3JlcXVpcmVfNTM1X18ucyA9IDApOwovKioqKioqLyB9KQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqLyAoWwovKiAwICovCi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCi8qKgogKiBDcmVhdGVkIGJ5IGF4ZXRyb3kgb24gMTctNi0yMy4KICovCi8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4vaW5kZXguZC50cyIgLz4KdmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7CiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHsKICAgICAgICBzID0gYXJndW1lbnRzW2ldOwogICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkKICAgICAgICAgICAgdFtwXSA9IHNbcF07CiAgICB9CiAgICByZXR1cm4gdDsKfTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKZnVuY3Rpb24gaXNGdW5jdGlvbihmdW5jKSB7CiAgICByZXR1cm4gdHlwZW9mIGZ1bmMgPT09ICJmdW5jdGlvbiI7Cn0KdmFyIEh0dHAgPSAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gSHR0cChjb25maWcpIHsKICAgICAgICBpZiAoY29uZmlnID09PSB2b2lkIDApIHsgY29uZmlnID0ge307IH0KICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKICAgIH0KICAgIEh0dHAucHJvdG90eXBlLnNldENvbmZpZyA9IGZ1bmN0aW9uIChjb25maWcpIHsKICAgICAgICBpZiAoY29uZmlnID09PSB2b2lkIDApIHsgY29uZmlnID0ge307IH0KICAgICAgICB0aGlzLmNvbmZpZyA9IF9fYXNzaWduKHt9LCB0aGlzLmNvbmZpZywgY29uZmlnKTsKICAgIH07CiAgICBIdHRwLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAoY29uZmlnKSB7CiAgICAgICAgcmV0dXJuIG5ldyBIdHRwKGNvbmZpZyk7CiAgICB9OwogICAgSHR0cC5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uIChjb25maWcpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgIHZhciBjb21tb25SZXF1ZXN0Q29uZmlnID0gewogICAgICAgICAgICAgICAgbWV0aG9kOiBjb25maWcubWV0aG9kLAogICAgICAgICAgICAgICAgdXJsOiBjb25maWcudXJsLAogICAgICAgICAgICAgICAgZGF0YTogY29uZmlnLmJvZHksCiAgICAgICAgICAgICAgICBoZWFkZXI6IGNvbmZpZy5oZWFkZXJzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBHTV94bWxodHRwUmVxdWVzdENvbmZpZyA9IF9fYXNzaWduKHt9LCBjb21tb25SZXF1ZXN0Q29uZmlnLCBjb25maWcsIF90aGlzLmNvbmZpZyk7CiAgICAgICAgICAgIHZhciBvbnJlYWR5c3RhdGVjaGFuZ2UgPSBHTV94bWxodHRwUmVxdWVzdENvbmZpZy5vbnJlYWR5c3RhdGVjaGFuZ2UsIG9uZXJyb3IgPSBHTV94bWxodHRwUmVxdWVzdENvbmZpZy5vbmVycm9yLCBvbmFib3J0ID0gR01feG1saHR0cFJlcXVlc3RDb25maWcub25hYm9ydCwgb250aW1lb3V0ID0gR01feG1saHR0cFJlcXVlc3RDb25maWcub250aW1lb3V0OwogICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdENvbmZpZy5zeW5jaHJvbm91cyA9IHRydWU7IC8vIGFzeW5jCiAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0Q29uZmlnLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpc0Z1bmN0aW9uKG9ucmVhZHlzdGF0ZWNoYW5nZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgb25yZWFkeXN0YXRlY2hhbmdlLmNhbGwodGhpcywgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlYWR5U3RhdGUgIT09IDQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiByZXNwb25zZS5zdGF0dXMgPCA0MDAKICAgICAgICAgICAgICAgICAgICA/IHJlc29sdmUocmVzcG9uc2UpCiAgICAgICAgICAgICAgICAgICAgOiByZWplY3QocmVzcG9uc2UpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdENvbmZpZy5vbmVycm9yID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlzRnVuY3Rpb24ob25lcnJvcikgJiYgb25lcnJvci5jYWxsKHRoaXMsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICByZWplY3QocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdENvbmZpZy5vbmFib3J0ID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlzRnVuY3Rpb24ob25hYm9ydCkgJiYgb25hYm9ydC5jYWxsKHRoaXMsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICByZWplY3QocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdENvbmZpZy5vbnRpbWVvdXQgPSBmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaXNGdW5jdGlvbihvbnRpbWVvdXQpICYmIG9udGltZW91dC5jYWxsKHRoaXMsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICByZWplY3QocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoX3RoaXMuY29uZmlnLmRlYnVnKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiJWNbIiArIGNvbW1vblJlcXVlc3RDb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCkgKyAiXSVjOiAiICsgY29tbW9uUmVxdWVzdENvbmZpZy51cmwsICJjb2xvcjogZ3JlZW4iLCAiY29sb3I6ICMwMDA7dGV4dC1zdHlsZTogdW5kZXItbGluZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KF9fYXNzaWduKHt9LCBHTV94bWxodHRwUmVxdWVzdENvbmZpZykpOwogICAgICAgIH0pOwogICAgfTsKICAgIEh0dHAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh1cmwsIGRhdGEsIGhlYWRlcnMsIGNvbmZpZykgewogICAgICAgIGlmIChoZWFkZXJzID09PSB2b2lkIDApIHsgaGVhZGVycyA9IHt9OyB9CiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdm9pZCAwKSB7IGNvbmZpZyA9IHt9OyB9CiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChfX2Fzc2lnbih7IHVybDogdXJsLCBtZXRob2Q6ICJHRVQiLCBib2R5OiBkYXRhLCBoZWFkZXJzOiBoZWFkZXJzIH0sIGNvbmZpZykpOwogICAgfTsKICAgIEh0dHAucHJvdG90eXBlLnBvc3QgPSBmdW5jdGlvbiAodXJsLCBkYXRhLCBoZWFkZXJzLCBjb25maWcpIHsKICAgICAgICBpZiAoaGVhZGVycyA9PT0gdm9pZCAwKSB7IGhlYWRlcnMgPSB7fTsgfQogICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfQogICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoX19hc3NpZ24oeyB1cmw6IHVybCwgbWV0aG9kOiAiUE9TVCIsIGJvZHk6IGRhdGEsIGhlYWRlcnM6IGhlYWRlcnMgfSwgY29uZmlnKSk7CiAgICB9OwogICAgSHR0cC5wcm90b3R5cGUucHV0ID0gZnVuY3Rpb24gKHVybCwgZGF0YSwgaGVhZGVycywgY29uZmlnKSB7CiAgICAgICAgaWYgKGhlYWRlcnMgPT09IHZvaWQgMCkgeyBoZWFkZXJzID0ge307IH0KICAgICAgICBpZiAoY29uZmlnID09PSB2b2lkIDApIHsgY29uZmlnID0ge307IH0KICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KF9fYXNzaWduKHsgdXJsOiB1cmwsIG1ldGhvZDogIlBPU1QiLCBib2R5OiBkYXRhLCBoZWFkZXJzOiBoZWFkZXJzIH0sIGNvbmZpZykpOwogICAgfTsKICAgIEh0dHAucHJvdG90eXBlWyJkZWxldGUiXSA9IGZ1bmN0aW9uICh1cmwsIGRhdGEsIGhlYWRlcnMsIGNvbmZpZykgewogICAgICAgIGlmIChoZWFkZXJzID09PSB2b2lkIDApIHsgaGVhZGVycyA9IHt9OyB9CiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdm9pZCAwKSB7IGNvbmZpZyA9IHt9OyB9CiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChfX2Fzc2lnbih7IHVybDogdXJsLCBtZXRob2Q6ICJERUxFVEUiLCBib2R5OiBkYXRhLCBoZWFkZXJzOiBoZWFkZXJzIH0sIGNvbmZpZykpOwogICAgfTsKICAgIEh0dHAucHJvdG90eXBlLmhlYWQgPSBmdW5jdGlvbiAodXJsLCBkYXRhLCBoZWFkZXJzLCBjb25maWcpIHsKICAgICAgICBpZiAoaGVhZGVycyA9PT0gdm9pZCAwKSB7IGhlYWRlcnMgPSB7fTsgfQogICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfQogICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoX19hc3NpZ24oeyB1cmw6IHVybCwgbWV0aG9kOiAiSEVBRCIsIGJvZHk6IGRhdGEsIGhlYWRlcnM6IGhlYWRlcnMgfSwgY29uZmlnKSk7CiAgICB9OwogICAgcmV0dXJuIEh0dHA7Cn0oKSk7CmV4cG9ydHMuSHR0cCA9IEh0dHA7CnZhciB0aW1lb3V0ID0gNTAwMDsKZXhwb3J0cy50aW1lb3V0ID0gdGltZW91dDsKdmFyIGh0dHAgPSBuZXcgSHR0cCh7IHRpbWVvdXQ6IHRpbWVvdXQgfSk7CmV4cG9ydHMuaHR0cCA9IGh0dHA7CmV4cG9ydHMuZGVmYXVsdCA9IGh0dHA7CgoKLyoqKi8gfSkKLyoqKioqKi8gXSk7Cn0pOwoKLyoqKi8gfSksCi8qIDI0ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7IHZhbHVlOiB0cnVlIH0pKTsKZXhwb3J0cy5XZWJvUHJvdmlkZXIgPSB2b2lkIDA7CmNvbnN0IHV0aWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwpjbGFzcyBXZWJvUHJvdmlkZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZXN0ID0gL3RcLmNuXC9cdysvOwogICAgfQogICAgcmVzb2x2ZShhRWxlbWVudCkgewogICAgICAgIGlmICghdGhpcy50ZXN0LnRlc3QoYUVsZW1lbnQuaHJlZikgfHwKICAgICAgICAgICAgIS9eaHR0cHM/OlwvXC8vLnRlc3QoYUVsZW1lbnQudGl0bGUpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGFFbGVtZW50LnRpdGxlKTsKICAgICAgICBpZiAodXJsKSB7CiAgICAgICAgICAgIGFFbGVtZW50LmhyZWYgPSB1cmw7CiAgICAgICAgICAgICgwLCB1dGlsc18xLmFudGlSZWRpcmVjdCkoYUVsZW1lbnQsIHVybCk7CiAgICAgICAgfQogICAgfQp9CmV4cG9ydHMuV2Vib1Byb3ZpZGVyID0gV2Vib1Byb3ZpZGVyOwoKCi8qKiovIH0pLAovKiAyNSAqLwovKioqLyAoZnVuY3Rpb24oX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKCiJ1c2Ugc3RyaWN0IjsKCnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgewogICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9CiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQogICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9CiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOwogICAgfSk7Cn07Ck9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7IHZhbHVlOiB0cnVlIH0pKTsKZXhwb3J0cy5CYWlkdVByb3ZpZGVyID0gdm9pZCAwOwpjb25zdCBnbV9odHRwXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKTsKY29uc3QgdXRpbHNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7CmNvbnN0IHBfcmV0cnlfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMjYpOwpjbGFzcyBCYWlkdVByb3ZpZGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMudGVzdCA9IC93d3dcLmJhaWR1XC5jb21cL2xpbmtcP3VybD0vOwogICAgfQogICAgcmVzb2x2ZShhRWxlbWVudCkgewogICAgICAgIGNvbnNvbGUubG9nKGFFbGVtZW50KTsKICAgICAgICBpZiAoKDAsIHV0aWxzXzEuZ2V0UmVkaXJlY3QpKGFFbGVtZW50KSA8PSAyICYmIHRoaXMudGVzdC50ZXN0KGFFbGVtZW50LmhyZWYpKSB7CiAgICAgICAgICAgICgwLCB1dGlsc18xLmluY3JlYXNlUmVkaXJlY3QpKGFFbGVtZW50KTsKICAgICAgICAgICAgKDAsIHBfcmV0cnlfMS5kZWZhdWx0KSgoKSA9PiB0aGlzLmhhbmRsZXJPbmVFbGVtZW50KGFFbGVtZW50KSwgeyByZXRyaWVzOiAzIH0pCiAgICAgICAgICAgICAgICAudGhlbigocmVzKSA9PiB7CiAgICAgICAgICAgICAgICAoMCwgdXRpbHNfMS5kZWNyZWFzZVJlZGlyZWN0KShhRWxlbWVudCk7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gewogICAgICAgICAgICAgICAgKDAsIHV0aWxzXzEuZGVjcmVhc2VSZWRpcmVjdCkoYUVsZW1lbnQpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICBoYW5kbGVyT25lRWxlbWVudChhRWxlbWVudCkgewogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSB5aWVsZCBnbV9odHRwXzEuZGVmYXVsdC5yZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICB1cmw6IGFFbGVtZW50LmhyZWYsCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgICAgICAgICAgICBhbm9ueW1vdXM6IHRydWUsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChyZXMuZmluYWxVcmwpIHsKICAgICAgICAgICAgICAgICAgICAoMCwgdXRpbHNfMS5hbnRpUmVkaXJlY3QpKGFFbGVtZW50LCByZXMuZmluYWxVcmwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBbaHR0cF06ICR7YUVsZW1lbnQuaHJlZn0gZmFpbGApKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQp9CmV4cG9ydHMuQmFpZHVQcm92aWRlciA9IEJhaWR1UHJvdmlkZXI7CgoKLyoqKi8gfSksCi8qIDI2ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19fX3dlYnBhY2tfbW9kdWxlX18sIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKX193ZWJwYWNrX3JlcXVpcmVfXy5yKF9fd2VicGFja19leHBvcnRzX18pOwovKiBoYXJtb255IGV4cG9ydCAqLyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoX193ZWJwYWNrX2V4cG9ydHNfXywgewovKiBoYXJtb255IGV4cG9ydCAqLyAgICJBYm9ydEVycm9yIjogKCkgPT4gKC8qIGJpbmRpbmcgKi8gQWJvcnRFcnJvciksCi8qIGhhcm1vbnkgZXhwb3J0ICovICAgImRlZmF1bHQiOiAoKSA9PiAoLyogYmluZGluZyAqLyBwUmV0cnkpCi8qIGhhcm1vbnkgZXhwb3J0ICovIH0pOwovKiBoYXJtb255IGltcG9ydCAqLyB2YXIgcmV0cnlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMjcpOwoKCmNvbnN0IG5ldHdvcmtFcnJvck1zZ3MgPSBuZXcgU2V0KFsKCSdGYWlsZWQgdG8gZmV0Y2gnLCAvLyBDaHJvbWUKCSdOZXR3b3JrRXJyb3Igd2hlbiBhdHRlbXB0aW5nIHRvIGZldGNoIHJlc291cmNlLicsIC8vIEZpcmVmb3gKCSdUaGUgSW50ZXJuZXQgY29ubmVjdGlvbiBhcHBlYXJzIHRvIGJlIG9mZmxpbmUuJywgLy8gU2FmYXJpCgknTmV0d29yayByZXF1ZXN0IGZhaWxlZCcsIC8vIGBjcm9zcy1mZXRjaGAKXSk7CgpjbGFzcyBBYm9ydEVycm9yIGV4dGVuZHMgRXJyb3IgewoJY29uc3RydWN0b3IobWVzc2FnZSkgewoJCXN1cGVyKCk7CgoJCWlmIChtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHsKCQkJdGhpcy5vcmlnaW5hbEVycm9yID0gbWVzc2FnZTsKCQkJKHttZXNzYWdlfSA9IG1lc3NhZ2UpOwoJCX0gZWxzZSB7CgkJCXRoaXMub3JpZ2luYWxFcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTsKCQkJdGhpcy5vcmlnaW5hbEVycm9yLnN0YWNrID0gdGhpcy5zdGFjazsKCQl9CgoJCXRoaXMubmFtZSA9ICdBYm9ydEVycm9yJzsKCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwoJfQp9Cgpjb25zdCBkZWNvcmF0ZUVycm9yV2l0aENvdW50cyA9IChlcnJvciwgYXR0ZW1wdE51bWJlciwgb3B0aW9ucykgPT4gewoJLy8gTWludXMgMSBmcm9tIGF0dGVtcHROdW1iZXIgYmVjYXVzZSB0aGUgZmlyc3QgYXR0ZW1wdCBkb2VzIG5vdCBjb3VudCBhcyBhIHJldHJ5Cgljb25zdCByZXRyaWVzTGVmdCA9IG9wdGlvbnMucmV0cmllcyAtIChhdHRlbXB0TnVtYmVyIC0gMSk7CgoJZXJyb3IuYXR0ZW1wdE51bWJlciA9IGF0dGVtcHROdW1iZXI7CgllcnJvci5yZXRyaWVzTGVmdCA9IHJldHJpZXNMZWZ0OwoJcmV0dXJuIGVycm9yOwp9OwoKY29uc3QgaXNOZXR3b3JrRXJyb3IgPSBlcnJvck1lc3NhZ2UgPT4gbmV0d29ya0Vycm9yTXNncy5oYXMoZXJyb3JNZXNzYWdlKTsKCmNvbnN0IGdldERPTUV4Y2VwdGlvbiA9IGVycm9yTWVzc2FnZSA9PiBnbG9iYWxUaGlzLkRPTUV4Y2VwdGlvbiA9PT0gdW5kZWZpbmVkCgk/IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpCgk6IG5ldyBET01FeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKCmFzeW5jIGZ1bmN0aW9uIHBSZXRyeShpbnB1dCwgb3B0aW9ucykgewoJcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKCQlvcHRpb25zID0gewoJCQlvbkZhaWxlZEF0dGVtcHQoKSB7fSwKCQkJcmV0cmllczogMTAsCgkJCS4uLm9wdGlvbnMsCgkJfTsKCgkJY29uc3Qgb3BlcmF0aW9uID0gcmV0cnlfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfXy5vcGVyYXRpb24ob3B0aW9ucyk7CgoJCW9wZXJhdGlvbi5hdHRlbXB0KGFzeW5jIGF0dGVtcHROdW1iZXIgPT4gewoJCQl0cnkgewoJCQkJcmVzb2x2ZShhd2FpdCBpbnB1dChhdHRlbXB0TnVtYmVyKSk7CgkJCX0gY2F0Y2ggKGVycm9yKSB7CgkJCQlpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkgewoJCQkJCXJlamVjdChuZXcgVHlwZUVycm9yKGBOb24tZXJyb3Igd2FzIHRocm93bjogIiR7ZXJyb3J9Ii4gWW91IHNob3VsZCBvbmx5IHRocm93IGVycm9ycy5gKSk7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCWlmIChlcnJvciBpbnN0YW5jZW9mIEFib3J0RXJyb3IpIHsKCQkJCQlvcGVyYXRpb24uc3RvcCgpOwoJCQkJCXJlamVjdChlcnJvci5vcmlnaW5hbEVycm9yKTsKCQkJCX0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgIWlzTmV0d29ya0Vycm9yKGVycm9yLm1lc3NhZ2UpKSB7CgkJCQkJb3BlcmF0aW9uLnN0b3AoKTsKCQkJCQlyZWplY3QoZXJyb3IpOwoJCQkJfSBlbHNlIHsKCQkJCQlkZWNvcmF0ZUVycm9yV2l0aENvdW50cyhlcnJvciwgYXR0ZW1wdE51bWJlciwgb3B0aW9ucyk7CgoJCQkJCXRyeSB7CgkJCQkJCWF3YWl0IG9wdGlvbnMub25GYWlsZWRBdHRlbXB0KGVycm9yKTsKCQkJCQl9IGNhdGNoIChlcnJvcikgewoJCQkJCQlyZWplY3QoZXJyb3IpOwoJCQkJCQlyZXR1cm47CgkJCQkJfQoKCQkJCQlpZiAoIW9wZXJhdGlvbi5yZXRyeShlcnJvcikpIHsKCQkJCQkJcmVqZWN0KG9wZXJhdGlvbi5tYWluRXJyb3IoKSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSk7CgoJCWlmIChvcHRpb25zLnNpZ25hbCAmJiAhb3B0aW9ucy5zaWduYWwuYWJvcnRlZCkgewoJCQlvcHRpb25zLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHsKCQkJCW9wZXJhdGlvbi5zdG9wKCk7CgkJCQljb25zdCByZWFzb24gPSBvcHRpb25zLnNpZ25hbC5yZWFzb24gPT09IHVuZGVmaW5lZAoJCQkJCT8gZ2V0RE9NRXhjZXB0aW9uKCdUaGUgb3BlcmF0aW9uIHdhcyBhYm9ydGVkLicpCgkJCQkJOiBvcHRpb25zLnNpZ25hbC5yZWFzb247CgkJCQlyZWplY3QocmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24gOiBnZXRET01FeGNlcHRpb24ocmVhc29uKSk7CgkJCX0sIHsKCQkJCW9uY2U6IHRydWUsCgkJCX0pOwoJCX0KCX0pOwp9CgoKLyoqKi8gfSksCi8qIDI3ICovCi8qKiovICgobW9kdWxlLCBfX3VudXNlZF93ZWJwYWNrX2V4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOCk7CgovKioqLyB9KSwKLyogMjggKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKdmFyIFJldHJ5T3BlcmF0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygyOSk7CgpleHBvcnRzLm9wZXJhdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICB2YXIgdGltZW91dHMgPSBleHBvcnRzLnRpbWVvdXRzKG9wdGlvbnMpOwogIHJldHVybiBuZXcgUmV0cnlPcGVyYXRpb24odGltZW91dHMsIHsKICAgICAgZm9yZXZlcjogb3B0aW9ucyAmJiAob3B0aW9ucy5mb3JldmVyIHx8IG9wdGlvbnMucmV0cmllcyA9PT0gSW5maW5pdHkpLAogICAgICB1bnJlZjogb3B0aW9ucyAmJiBvcHRpb25zLnVucmVmLAogICAgICBtYXhSZXRyeVRpbWU6IG9wdGlvbnMgJiYgb3B0aW9ucy5tYXhSZXRyeVRpbWUKICB9KTsKfTsKCmV4cG9ydHMudGltZW91dHMgPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBBcnJheSkgewogICAgcmV0dXJuIFtdLmNvbmNhdChvcHRpb25zKTsKICB9CgogIHZhciBvcHRzID0gewogICAgcmV0cmllczogMTAsCiAgICBmYWN0b3I6IDIsCiAgICBtaW5UaW1lb3V0OiAxICogMTAwMCwKICAgIG1heFRpbWVvdXQ6IEluZmluaXR5LAogICAgcmFuZG9taXplOiBmYWxzZQogIH07CiAgZm9yICh2YXIga2V5IGluIG9wdGlvbnMpIHsKICAgIG9wdHNba2V5XSA9IG9wdGlvbnNba2V5XTsKICB9CgogIGlmIChvcHRzLm1pblRpbWVvdXQgPiBvcHRzLm1heFRpbWVvdXQpIHsKICAgIHRocm93IG5ldyBFcnJvcignbWluVGltZW91dCBpcyBncmVhdGVyIHRoYW4gbWF4VGltZW91dCcpOwogIH0KCiAgdmFyIHRpbWVvdXRzID0gW107CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRzLnJldHJpZXM7IGkrKykgewogICAgdGltZW91dHMucHVzaCh0aGlzLmNyZWF0ZVRpbWVvdXQoaSwgb3B0cykpOwogIH0KCiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5mb3JldmVyICYmICF0aW1lb3V0cy5sZW5ndGgpIHsKICAgIHRpbWVvdXRzLnB1c2godGhpcy5jcmVhdGVUaW1lb3V0KGksIG9wdHMpKTsKICB9CgogIC8vIHNvcnQgdGhlIGFycmF5IG51bWVyaWNhbGx5IGFzY2VuZGluZwogIHRpbWVvdXRzLnNvcnQoZnVuY3Rpb24oYSxiKSB7CiAgICByZXR1cm4gYSAtIGI7CiAgfSk7CgogIHJldHVybiB0aW1lb3V0czsKfTsKCmV4cG9ydHMuY3JlYXRlVGltZW91dCA9IGZ1bmN0aW9uKGF0dGVtcHQsIG9wdHMpIHsKICB2YXIgcmFuZG9tID0gKG9wdHMucmFuZG9taXplKQogICAgPyAoTWF0aC5yYW5kb20oKSArIDEpCiAgICA6IDE7CgogIHZhciB0aW1lb3V0ID0gTWF0aC5yb3VuZChyYW5kb20gKiBNYXRoLm1heChvcHRzLm1pblRpbWVvdXQsIDEpICogTWF0aC5wb3cob3B0cy5mYWN0b3IsIGF0dGVtcHQpKTsKICB0aW1lb3V0ID0gTWF0aC5taW4odGltZW91dCwgb3B0cy5tYXhUaW1lb3V0KTsKCiAgcmV0dXJuIHRpbWVvdXQ7Cn07CgpleHBvcnRzLndyYXAgPSBmdW5jdGlvbihvYmosIG9wdGlvbnMsIG1ldGhvZHMpIHsKICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICBtZXRob2RzID0gb3B0aW9uczsKICAgIG9wdGlvbnMgPSBudWxsOwogIH0KCiAgaWYgKCFtZXRob2RzKSB7CiAgICBtZXRob2RzID0gW107CiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7CiAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBtZXRob2RzLnB1c2goa2V5KTsKICAgICAgfQogICAgfQogIH0KCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgbWV0aG9kICAgPSBtZXRob2RzW2ldOwogICAgdmFyIG9yaWdpbmFsID0gb2JqW21ldGhvZF07CgogICAgb2JqW21ldGhvZF0gPSBmdW5jdGlvbiByZXRyeVdyYXBwZXIob3JpZ2luYWwpIHsKICAgICAgdmFyIG9wICAgICAgID0gZXhwb3J0cy5vcGVyYXRpb24ob3B0aW9ucyk7CiAgICAgIHZhciBhcmdzICAgICA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7CgogICAgICBhcmdzLnB1c2goZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgaWYgKG9wLnJldHJ5KGVycikpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGVycikgewogICAgICAgICAgYXJndW1lbnRzWzBdID0gb3AubWFpbkVycm9yKCk7CiAgICAgICAgfQogICAgICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH0pOwoKICAgICAgb3AuYXR0ZW1wdChmdW5jdGlvbigpIHsKICAgICAgICBvcmlnaW5hbC5hcHBseShvYmosIGFyZ3MpOwogICAgICB9KTsKICAgIH0uYmluZChvYmosIG9yaWdpbmFsKTsKICAgIG9ialttZXRob2RdLm9wdGlvbnMgPSBvcHRpb25zOwogIH0KfTsKCgovKioqLyB9KSwKLyogMjkgKi8KLyoqKi8gKChtb2R1bGUpID0+IHsKCmZ1bmN0aW9uIFJldHJ5T3BlcmF0aW9uKHRpbWVvdXRzLCBvcHRpb25zKSB7CiAgLy8gQ29tcGF0aWJpbGl0eSBmb3IgdGhlIG9sZCAodGltZW91dHMsIHJldHJ5Rm9yZXZlcikgc2lnbmF0dXJlCiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicpIHsKICAgIG9wdGlvbnMgPSB7IGZvcmV2ZXI6IG9wdGlvbnMgfTsKICB9CgogIHRoaXMuX29yaWdpbmFsVGltZW91dHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRpbWVvdXRzKSk7CiAgdGhpcy5fdGltZW91dHMgPSB0aW1lb3V0czsKICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICB0aGlzLl9tYXhSZXRyeVRpbWUgPSBvcHRpb25zICYmIG9wdGlvbnMubWF4UmV0cnlUaW1lIHx8IEluZmluaXR5OwogIHRoaXMuX2ZuID0gbnVsbDsKICB0aGlzLl9lcnJvcnMgPSBbXTsKICB0aGlzLl9hdHRlbXB0cyA9IDE7CiAgdGhpcy5fb3BlcmF0aW9uVGltZW91dCA9IG51bGw7CiAgdGhpcy5fb3BlcmF0aW9uVGltZW91dENiID0gbnVsbDsKICB0aGlzLl90aW1lb3V0ID0gbnVsbDsKICB0aGlzLl9vcGVyYXRpb25TdGFydCA9IG51bGw7CiAgdGhpcy5fdGltZXIgPSBudWxsOwoKICBpZiAodGhpcy5fb3B0aW9ucy5mb3JldmVyKSB7CiAgICB0aGlzLl9jYWNoZWRUaW1lb3V0cyA9IHRoaXMuX3RpbWVvdXRzLnNsaWNlKDApOwogIH0KfQptb2R1bGUuZXhwb3J0cyA9IFJldHJ5T3BlcmF0aW9uOwoKUmV0cnlPcGVyYXRpb24ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7CiAgdGhpcy5fYXR0ZW1wdHMgPSAxOwogIHRoaXMuX3RpbWVvdXRzID0gdGhpcy5fb3JpZ2luYWxUaW1lb3V0cy5zbGljZSgwKTsKfQoKUmV0cnlPcGVyYXRpb24ucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbigpIHsKICBpZiAodGhpcy5fdGltZW91dCkgewogICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpOwogIH0KICBpZiAodGhpcy5fdGltZXIpIHsKICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7CiAgfQoKICB0aGlzLl90aW1lb3V0cyAgICAgICA9IFtdOwogIHRoaXMuX2NhY2hlZFRpbWVvdXRzID0gbnVsbDsKfTsKClJldHJ5T3BlcmF0aW9uLnByb3RvdHlwZS5yZXRyeSA9IGZ1bmN0aW9uKGVycikgewogIGlmICh0aGlzLl90aW1lb3V0KSB7CiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7CiAgfQoKICBpZiAoIWVycikgewogICAgcmV0dXJuIGZhbHNlOwogIH0KICB2YXIgY3VycmVudFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICBpZiAoZXJyICYmIGN1cnJlbnRUaW1lIC0gdGhpcy5fb3BlcmF0aW9uU3RhcnQgPj0gdGhpcy5fbWF4UmV0cnlUaW1lKSB7CiAgICB0aGlzLl9lcnJvcnMucHVzaChlcnIpOwogICAgdGhpcy5fZXJyb3JzLnVuc2hpZnQobmV3IEVycm9yKCdSZXRyeU9wZXJhdGlvbiB0aW1lb3V0IG9jY3VycmVkJykpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgdGhpcy5fZXJyb3JzLnB1c2goZXJyKTsKCiAgdmFyIHRpbWVvdXQgPSB0aGlzLl90aW1lb3V0cy5zaGlmdCgpOwogIGlmICh0aW1lb3V0ID09PSB1bmRlZmluZWQpIHsKICAgIGlmICh0aGlzLl9jYWNoZWRUaW1lb3V0cykgewogICAgICAvLyByZXRyeSBmb3JldmVyLCBvbmx5IGtlZXAgbGFzdCBlcnJvcgogICAgICB0aGlzLl9lcnJvcnMuc3BsaWNlKDAsIHRoaXMuX2Vycm9ycy5sZW5ndGggLSAxKTsKICAgICAgdGltZW91dCA9IHRoaXMuX2NhY2hlZFRpbWVvdXRzLnNsaWNlKC0xKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIHZhciBzZWxmID0gdGhpczsKICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICBzZWxmLl9hdHRlbXB0cysrOwoKICAgIGlmIChzZWxmLl9vcGVyYXRpb25UaW1lb3V0Q2IpIHsKICAgICAgc2VsZi5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgc2VsZi5fb3BlcmF0aW9uVGltZW91dENiKHNlbGYuX2F0dGVtcHRzKTsKICAgICAgfSwgc2VsZi5fb3BlcmF0aW9uVGltZW91dCk7CgogICAgICBpZiAoc2VsZi5fb3B0aW9ucy51bnJlZikgewogICAgICAgICAgc2VsZi5fdGltZW91dC51bnJlZigpOwogICAgICB9CiAgICB9CgogICAgc2VsZi5fZm4oc2VsZi5fYXR0ZW1wdHMpOwogIH0sIHRpbWVvdXQpOwoKICBpZiAodGhpcy5fb3B0aW9ucy51bnJlZikgewogICAgICB0aGlzLl90aW1lci51bnJlZigpOwogIH0KCiAgcmV0dXJuIHRydWU7Cn07CgpSZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUuYXR0ZW1wdCA9IGZ1bmN0aW9uKGZuLCB0aW1lb3V0T3BzKSB7CiAgdGhpcy5fZm4gPSBmbjsKCiAgaWYgKHRpbWVvdXRPcHMpIHsKICAgIGlmICh0aW1lb3V0T3BzLnRpbWVvdXQpIHsKICAgICAgdGhpcy5fb3BlcmF0aW9uVGltZW91dCA9IHRpbWVvdXRPcHMudGltZW91dDsKICAgIH0KICAgIGlmICh0aW1lb3V0T3BzLmNiKSB7CiAgICAgIHRoaXMuX29wZXJhdGlvblRpbWVvdXRDYiA9IHRpbWVvdXRPcHMuY2I7CiAgICB9CiAgfQoKICB2YXIgc2VsZiA9IHRoaXM7CiAgaWYgKHRoaXMuX29wZXJhdGlvblRpbWVvdXRDYikgewogICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIHNlbGYuX29wZXJhdGlvblRpbWVvdXRDYigpOwogICAgfSwgc2VsZi5fb3BlcmF0aW9uVGltZW91dCk7CiAgfQoKICB0aGlzLl9vcGVyYXRpb25TdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwoKICB0aGlzLl9mbih0aGlzLl9hdHRlbXB0cyk7Cn07CgpSZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUudHJ5ID0gZnVuY3Rpb24oZm4pIHsKICBjb25zb2xlLmxvZygnVXNpbmcgUmV0cnlPcGVyYXRpb24udHJ5KCkgaXMgZGVwcmVjYXRlZCcpOwogIHRoaXMuYXR0ZW1wdChmbik7Cn07CgpSZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbihmbikgewogIGNvbnNvbGUubG9nKCdVc2luZyBSZXRyeU9wZXJhdGlvbi5zdGFydCgpIGlzIGRlcHJlY2F0ZWQnKTsKICB0aGlzLmF0dGVtcHQoZm4pOwp9OwoKUmV0cnlPcGVyYXRpb24ucHJvdG90eXBlLnN0YXJ0ID0gUmV0cnlPcGVyYXRpb24ucHJvdG90eXBlLnRyeTsKClJldHJ5T3BlcmF0aW9uLnByb3RvdHlwZS5lcnJvcnMgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gdGhpcy5fZXJyb3JzOwp9OwoKUmV0cnlPcGVyYXRpb24ucHJvdG90eXBlLmF0dGVtcHRzID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHRoaXMuX2F0dGVtcHRzOwp9OwoKUmV0cnlPcGVyYXRpb24ucHJvdG90eXBlLm1haW5FcnJvciA9IGZ1bmN0aW9uKCkgewogIGlmICh0aGlzLl9lcnJvcnMubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIHZhciBjb3VudHMgPSB7fTsKICB2YXIgbWFpbkVycm9yID0gbnVsbDsKICB2YXIgbWFpbkVycm9yQ291bnQgPSAwOwoKICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2Vycm9ycy5sZW5ndGg7IGkrKykgewogICAgdmFyIGVycm9yID0gdGhpcy5fZXJyb3JzW2ldOwogICAgdmFyIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlOwogICAgdmFyIGNvdW50ID0gKGNvdW50c1ttZXNzYWdlXSB8fCAwKSArIDE7CgogICAgY291bnRzW21lc3NhZ2VdID0gY291bnQ7CgogICAgaWYgKGNvdW50ID49IG1haW5FcnJvckNvdW50KSB7CiAgICAgIG1haW5FcnJvciA9IGVycm9yOwogICAgICBtYWluRXJyb3JDb3VudCA9IGNvdW50OwogICAgfQogIH0KCiAgcmV0dXJuIG1haW5FcnJvcjsKfTsKCgovKioqLyB9KSwKLyogMzAgKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHsKICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQogICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQogICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQogICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsKICAgIH0pOwp9OwpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7CmV4cG9ydHMuRG9nZURvZ2VQcm92aWRlciA9IHZvaWQgMDsKY29uc3QgZ21faHR0cF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CmNvbnN0IHV0aWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwpjbGFzcyBEb2dlRG9nZVByb3ZpZGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMudGVzdCA9IC93d3dcLmRvZ2Vkb2dlXC5jb21cL3JkXC8uezEsfS87CiAgICB9CiAgICByZXNvbHZlKGFFbGVtZW50KSB7CiAgICAgICAgaWYgKCgwLCB1dGlsc18xLmdldFJlZGlyZWN0KShhRWxlbWVudCkgPD0gMiAmJiB0aGlzLnRlc3QudGVzdChhRWxlbWVudC5ocmVmKSkgewogICAgICAgICAgICAoMCwgdXRpbHNfMS5pbmNyZWFzZVJlZGlyZWN0KShhRWxlbWVudCk7CiAgICAgICAgICAgIHRoaXMuaGFuZGxlck9uZUVsZW1lbnQoYUVsZW1lbnQpCiAgICAgICAgICAgICAgICAudGhlbihyZXMgPT4gewogICAgICAgICAgICAgICAgKDAsIHV0aWxzXzEuZGVjcmVhc2VSZWRpcmVjdCkoYUVsZW1lbnQpOwogICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7CiAgICAgICAgICAgICAgICAoMCwgdXRpbHNfMS5kZWNyZWFzZVJlZGlyZWN0KShhRWxlbWVudCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KICAgIGhhbmRsZXJPbmVFbGVtZW50KGFFbGVtZW50KSB7CiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHlpZWxkIGdtX2h0dHBfMS5kZWZhdWx0LnJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgIHVybDogYUVsZW1lbnQuaHJlZiwKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgICAgICAgICAgICAgIGFub255bW91czogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAocmVzLmZpbmFsVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShhRWxlbWVudCwgcmVzLmZpbmFsVXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9Cn0KZXhwb3J0cy5Eb2dlRG9nZVByb3ZpZGVyID0gRG9nZURvZ2VQcm92aWRlcjsKCgovKioqLyB9KSwKLyogMzEgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsgdmFsdWU6IHRydWUgfSkpOwpleHBvcnRzLkRvdUJhblByb3ZpZGVyID0gdm9pZCAwOwpjb25zdCB1dGlsc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKY2xhc3MgRG91QmFuUHJvdmlkZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZXN0ID0gL2RvdWJhblwuY29tXC9saW5rMlwvP1w/dXJsPSguKikvOwogICAgfQogICAgcmVzb2x2ZShhRWxlbWVudCkgewogICAgICAgICgwLCB1dGlsc18xLmFudGlSZWRpcmVjdCkoYUVsZW1lbnQsIG5ldyBVUkwoYUVsZW1lbnQuaHJlZikuc2VhcmNoUGFyYW1zLmdldCgidXJsIikpOwogICAgfQp9CmV4cG9ydHMuRG91QmFuUHJvdmlkZXIgPSBEb3VCYW5Qcm92aWRlcjsKCgovKioqLyB9KSwKLyogMzIgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsgdmFsdWU6IHRydWUgfSkpOwpleHBvcnRzLkdvb2dsZVByb3ZpZGVyID0gdm9pZCAwOwpjb25zdCB1dGlsc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKY2xhc3MgR29vZ2xlUHJvdmlkZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZXN0ID0gdHJ1ZTsKICAgIH0KICAgIHJlc29sdmUoYUVsZW1lbnQpIHsKICAgICAgICBjb25zdCB0cmFjZVByb3BlcnRpZXMgPSBbInBpbmciLCAiZGF0YS1qc2Fyd3QiLCAiZGF0YS11c2ciLCAiZGF0YS12ZWQiXTsKICAgICAgICAvLyDnp7vpmaTov73ouKoKICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHRyYWNlUHJvcGVydGllcykgewogICAgICAgICAgICBpZiAoYUVsZW1lbnQuZ2V0QXR0cmlidXRlKHByb3BlcnR5KSkgewogICAgICAgICAgICAgICAgYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHByb3BlcnR5KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyDnp7vpmaTlpJrkvZnnmoTkuovku7YKICAgICAgICBpZiAoYUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJvbm1vdXNlZG93biIpKSB7CiAgICAgICAgICAgIGFFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgib25tb3VzZWRvd24iKTsKICAgICAgICB9CiAgICAgICAgLy8g5bCd6K+V5Y676Zmk6YeN5a6a5ZCRCiAgICAgICAgaWYgKGFFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1ocmVmIikpIHsKICAgICAgICAgICAgY29uc3QgcmVhbFVybCA9IGFFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1ocmVmIik7CiAgICAgICAgICAgICgwLCB1dGlsc18xLmFudGlSZWRpcmVjdCkoYUVsZW1lbnQsIHJlYWxVcmwpOwogICAgICAgIH0KICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGFFbGVtZW50LmhyZWYpOwogICAgICAgIGlmICh1cmwuc2VhcmNoUGFyYW1zLmdldCgidXJsIikpIHsKICAgICAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShhRWxlbWVudCwgdXJsLnNlYXJjaFBhcmFtcy5nZXQoInVybCIpKTsKICAgICAgICB9CiAgICB9Cn0KZXhwb3J0cy5Hb29nbGVQcm92aWRlciA9IEdvb2dsZVByb3ZpZGVyOwoKCi8qKiovIH0pLAovKiAzMyAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7CmV4cG9ydHMuSmlhblNodVByb3ZpZGVyID0gdm9pZCAwOwpjb25zdCB1dGlsc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKY2xhc3MgSmlhblNodVByb3ZpZGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMudGVzdCA9IChhRWxlbWVudCkgPT4gewogICAgICAgICAgICBjb25zdCBpc0xpbmsxID0gL2xpbmtzXC5qaWFuc2h1XC5jb21cL2dvLy50ZXN0KGFFbGVtZW50LmhyZWYpOwogICAgICAgICAgICBjb25zdCBpc0xpbmsyID0gL2xpbmtcLmppYW5zaHVcLmNvbShcLyk/XD90PS8udGVzdChhRWxlbWVudC5ocmVmKTsKICAgICAgICAgICAgY29uc3QgaXNMaW5rMyA9IC9qaWFuc2h1XC5jb21cL2dvLXdpbGRcLz9cPyguKil1cmw9Ly50ZXN0KGFFbGVtZW50LmhyZWYpOwogICAgICAgICAgICBpZiAoaXNMaW5rMSB8fCBpc0xpbmsyIHx8IGlzTGluazMpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9OwogICAgfQogICAgcmVzb2x2ZShhRWxlbWVudCkgewogICAgICAgIGNvbnN0IHNlYXJjaCA9IG5ldyBVUkwoYUVsZW1lbnQuaHJlZikuc2VhcmNoUGFyYW1zOwogICAgICAgICgwLCB1dGlsc18xLmFudGlSZWRpcmVjdCkoYUVsZW1lbnQsIHNlYXJjaC5nZXQoJ3RvJykgfHwgc2VhcmNoLmdldCgndCcpIHx8IHNlYXJjaC5nZXQoJ3VybCcpKTsKICAgIH0KfQpleHBvcnRzLkppYW5TaHVQcm92aWRlciA9IEppYW5TaHVQcm92aWRlcjsKCgovKioqLyB9KSwKLyogMzQgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsgdmFsdWU6IHRydWUgfSkpOwpleHBvcnRzLlNvUHJvdmlkZXIgPSB2b2lkIDA7CmNvbnN0IHV0aWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwpjbGFzcyBTb1Byb3ZpZGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMudGVzdCA9IC9zb1wuY29tXC9saW5rXD8oLiopLzsKICAgIH0KICAgIHJlc29sdmUoYUVsZW1lbnQpIHsKICAgICAgICBjb25zdCB1cmwgPSBhRWxlbWVudC5nZXRBdHRyaWJ1dGUoImRhdGEtbWR1cmwiKSB8fCBhRWxlbWVudC5nZXRBdHRyaWJ1dGUoImUtbGFuZHVybCIpOwogICAgICAgIGlmICh1cmwpIHsKICAgICAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShhRWxlbWVudCwgdXJsKTsKICAgICAgICB9CiAgICAgICAgLy8gcmVtb3ZlIHRyYWNrCiAgICAgICAgYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJlX2hyZWYiKTsKICAgICAgICBhRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoImRhdGEtcmVzIik7CiAgICB9Cn0KZXhwb3J0cy5Tb1Byb3ZpZGVyID0gU29Qcm92aWRlcjsKCgovKioqLyB9KSwKLyogMzUgKi8KLyoqKi8gKGZ1bmN0aW9uKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CgoidXNlIHN0cmljdCI7Cgp2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHsKICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQogICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQogICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQogICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsKICAgIH0pOwp9OwpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7CmV4cG9ydHMuU29Hb3VQcm92aWRlciA9IHZvaWQgMDsKY29uc3QgZ21faHR0cF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMyk7CmNvbnN0IHV0aWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwpjbGFzcyBTb0dvdVByb3ZpZGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMudGVzdCA9IC93d3dcLnNvZ291XC5jb21cL2xpbmtcP3VybD0vOwogICAgfQogICAgcmVzb2x2ZShhRWxlbWVudCkgewogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAoKDAsIHV0aWxzXzEuZ2V0UmVkaXJlY3QpKGFFbGVtZW50KSA8PSAyICYmIHRoaXMudGVzdC50ZXN0KGFFbGVtZW50LmhyZWYpKSB7CiAgICAgICAgICAgICAgICAgICAgKDAsIHV0aWxzXzEuaW5jcmVhc2VSZWRpcmVjdCkoYUVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IHlpZWxkIGdtX2h0dHBfMS5kZWZhdWx0LnJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGFFbGVtZW50LmhyZWYsCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFub255bW91czogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICgwLCB1dGlsc18xLmRlY3JlYXNlUmVkaXJlY3QpKGFFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5hbFVybCA9IHJlcy5maW5hbFVybDsKICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWxVcmwgJiYgIXRoaXMudGVzdC50ZXN0KGZpbmFsVXJsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAoMCwgdXRpbHNfMS5hbnRpUmVkaXJlY3QpKGFFbGVtZW50LCByZXMuZmluYWxVcmwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlciA9IHJlcy5yZXNwb25zZVRleHQubWF0Y2goL1VSTD1bJyJdKFteJyJdKylbJyJdLyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyICYmIG1hdGNoZXJbMV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCB1dGlsc18xLmFudGlSZWRpcmVjdCkoYUVsZW1lbnQsIHJlcy5maW5hbFVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgKDAsIHV0aWxzXzEuZGVjcmVhc2VSZWRpcmVjdCkoYUVsZW1lbnQpOwogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICBwYXJzZVBhZ2UocmVzKSB7CiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gcmVzLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC8oc3JjPVtePl0qfGxpbms9W14+XSkvZywgIiIpOwogICAgICAgIGNvbnN0IGh0bWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJodG1sIik7CiAgICAgICAgaHRtbC5pbm5lckhUTUwgPSByZXNwb25zZVRleHQ7CiAgICAgICAgLy8gbGV0IHNlbGVjdG9yID0gJyNtYWluIC5yZXN1bHRzIGRpdi52cndyYXA+aDMnOwogICAgICAgIC8vIGxldCBzZWxlY3RvciA9ICcjbWFpbiAucmVzdWx0cyBoMz5hJzsKICAgICAgICBjb25zdCBzZWxlY3RvciA9ICcjbWFpbiAucmVzdWx0cyBhW2hyZWYqPSJ3d3cuc29nb3UuY29tL2xpbms/dXJsPSJdJzsKICAgICAgICBjb25zdCByZW1vdGVzID0gW10uc2xpY2UuY2FsbChodG1sLnF1ZXJ5U2VsZWN0b3JBbGwoIiNtYWluIC5yZXN1bHRzIGFbaHJlZl0iKSk7CiAgICAgICAgY29uc3QgbG9jYWxzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7CiAgICAgICAgZm9yIChjb25zdCBsb2NhbEVsZSBvZiBsb2NhbHMpIHsKICAgICAgICAgICAgZm9yIChjb25zdCByZW1vdGVFbGUgb2YgcmVtb3RlcykgewogICAgICAgICAgICAgICAgbGV0IGxvY2FsVGV4dCA9ICgwLCB1dGlsc18xLmdldFRleHQpKGxvY2FsRWxlKTsKICAgICAgICAgICAgICAgIGxldCByZW1vdGVUZXh0ID0gKDAsIHV0aWxzXzEuZ2V0VGV4dCkocmVtb3RlRWxlKTsKICAgICAgICAgICAgICAgIC8vIOmAmueUqOaMiemSru+8jOS+i+WmguOAkOeCueWHu+S4i+i9veOAkQogICAgICAgICAgICAgICAgaWYgKGxvY2FsRWxlLmNsYXNzTGlzdC5jb250YWlucygic3RyLXB1YmxpYy1idG4iKSkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsVGV4dCA9ICgwLCB1dGlsc18xLmdldFRleHQpKGxvY2FsRWxlLnBhcmVudE5vZGUpOwogICAgICAgICAgICAgICAgICAgIHJlbW90ZVRleHQgPSAoMCwgdXRpbHNfMS5nZXRUZXh0KShyZW1vdGVFbGUucGFyZW50Tm9kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2NhbEVsZS5jbGFzc0xpc3QuY29udGFpbnMoInN0cl9pbWciKSkgewogICAgICAgICAgICAgICAgICAgIC8vIOWbvueJhwogICAgICAgICAgICAgICAgICAgIGxvY2FsVGV4dCA9ICgwLCB1dGlsc18xLmdldFRleHQpKGxvY2FsRWxlLnBhcmVudE5vZGUucGFyZW50Tm9kZSk7CiAgICAgICAgICAgICAgICAgICAgcmVtb3RlVGV4dCA9ICgwLCB1dGlsc18xLmdldFRleHQpKHJlbW90ZUVsZS5wYXJlbnROb2RlLnBhcmVudE5vZGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFsb2NhbFRleHQgfHwgbG9jYWxUZXh0ICE9PSByZW1vdGVUZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShsb2NhbEVsZSwgcmVtb3RlRWxlLmhyZWYpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgb25Jbml0KCkgewogICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgICAgIGlmICghL3d3d1wuc29nb3VcLmNvbVwvd2ViLy50ZXN0KHdpbmRvdy50b3AubG9jYXRpb24uaHJlZikpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBxdWVyeSA9ICgwLCB1dGlsc18xLnF1ZXJ5UGFyc2VyKSh3aW5kb3cudG9wLmxvY2F0aW9uLnNlYXJjaCk7CiAgICAgICAgICAgIC8vIOaQnOe0ouS9v+eUqGh0dHDmkJzntKLvvIzlvpfliLDnmoTmmK/nm7TmjqXpk77mjqUKICAgICAgICAgICAgY29uc3QgdXJsID0gYCR7bG9jYXRpb24ucHJvdG9jb2wKICAgICAgICAgICAgICAgIC5yZXBsYWNlKC86JC8sICIiKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoInMiLCAiIil9Oi8vJHtsb2NhdGlvbi5ob3N0ICsgbG9jYXRpb24ucGF0aG5hbWUgKyBxdWVyeX1gOwogICAgICAgICAgICBnbV9odHRwXzEuZGVmYXVsdAogICAgICAgICAgICAgICAgLmdldCh1cmwpCiAgICAgICAgICAgICAgICAudGhlbigocmVzKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlUGFnZShyZXMpOwogICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9KTsKICAgIH0KfQpleHBvcnRzLlNvR291UHJvdmlkZXIgPSBTb0dvdVByb3ZpZGVyOwoKCi8qKiovIH0pLAovKiAzNiAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7CmV4cG9ydHMuWW91dHViZVByb3ZpZGVyID0gdm9pZCAwOwpjb25zdCB1dGlsc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKY2xhc3MgWW91dHViZVByb3ZpZGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMudGVzdCA9IC93d3dcLnlvdXR1YmVcLmNvbVwvcmVkaXJlY3RcPy57MSx9LzsKICAgIH0KICAgIHJlc29sdmUoYUVsZW1lbnQpIHsKICAgICAgICAoMCwgdXRpbHNfMS5hbnRpUmVkaXJlY3QpKGFFbGVtZW50LCBuZXcgVVJMKGFFbGVtZW50LmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoInEiKSk7CiAgICB9Cn0KZXhwb3J0cy5Zb3V0dWJlUHJvdmlkZXIgPSBZb3V0dWJlUHJvdmlkZXI7CgoKLyoqKi8gfSksCi8qIDM3ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7IHZhbHVlOiB0cnVlIH0pKTsKZXhwb3J0cy5aaGlodVByb3ZpZGVyID0gdm9pZCAwOwpjb25zdCB1dGlsc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKY2xhc3MgWmhpaHVQcm92aWRlciB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLnRlc3QgPSAvemhpaHVcLmNvbVwvXD90YXJnZXQ9KC4qKS87CiAgICB9CiAgICByZXNvbHZlKGFFbGVtZW50KSB7CiAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCJ0YXJnZXQiKSk7CiAgICB9Cn0KZXhwb3J0cy5aaGlodVByb3ZpZGVyID0gWmhpaHVQcm92aWRlcjsKCgovKioqLyB9KSwKLyogMzggKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsgdmFsdWU6IHRydWUgfSkpOwpleHBvcnRzLkJhaWR1WHVlc2h1UHJvdmlkZXIgPSB2b2lkIDA7CmNvbnN0IHV0aWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwpjbGFzcyBCYWlkdVh1ZXNodVByb3ZpZGVyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHRoaXMudGVzdCA9IC94dWVzaHVcLmJhaWR1XC5jb21cL3M/XD8oLiopLzsgLy8g5q2k5aSE5peg55SoCiAgICB9CiAgICByZXNvbHZlKGFFbGVtZW50KSB7CiAgICAgICAgY29uc3QgcmVhbEhyZWYgPSBhRWxlbWVudC5nZXRBdHRyaWJ1dGUoImRhdGEtbGluayIpIHx8IGFFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS11cmwiKTsKICAgICAgICBpZiAocmVhbEhyZWYpIHsKICAgICAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShhRWxlbWVudCwgZGVjb2RlVVJJQ29tcG9uZW50KHJlYWxIcmVmKSk7CiAgICAgICAgfQogICAgfQp9CmV4cG9ydHMuQmFpZHVYdWVzaHVQcm92aWRlciA9IEJhaWR1WHVlc2h1UHJvdmlkZXI7CgoKLyoqKi8gfSksCi8qIDM5ICovCi8qKiovICgoX191bnVzZWRfd2VicGFja19tb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pID0+IHsKCiJ1c2Ugc3RyaWN0IjsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7IHZhbHVlOiB0cnVlIH0pKTsKZXhwb3J0cy5aaGlodVpodWFubGFuUHJvdmlkZXIgPSB2b2lkIDA7CmNvbnN0IHV0aWxzXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwpjbGFzcyBaaGlodVpodWFubGFuUHJvdmlkZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZXN0ID0gL2xpbmtcLnpoaWh1XC5jb21cL1w/dGFyZ2V0PSguKikvOwogICAgfQogICAgcmVzb2x2ZShhRWxlbWVudCkgewogICAgICAgICgwLCB1dGlsc18xLmFudGlSZWRpcmVjdCkoYUVsZW1lbnQsIG5ldyBVUkwoYUVsZW1lbnQuaHJlZikuc2VhcmNoUGFyYW1zLmdldCgidGFyZ2V0IikpOwogICAgfQp9CmV4cG9ydHMuWmhpaHVaaHVhbmxhblByb3ZpZGVyID0gWmhpaHVaaHVhbmxhblByb3ZpZGVyOwoKCi8qKiovIH0pLAovKiA0MCAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSA9PiB7CgoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7CmV4cG9ydHMuTG9nb25ld3NQcm92aWRlciA9IHZvaWQgMDsKY29uc3QgdXRpbHNfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7CmNsYXNzIExvZ29uZXdzUHJvdmlkZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZXN0ID0gL2xpbmtcLmxvZ29uZXdzXC5jblwvXD91cmw9KC4qKS87CiAgICB9CiAgICByZXNvbHZlKGFFbGVtZW50KSB7CiAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCJ1cmwiKSk7CiAgICB9Cn0KZXhwb3J0cy5Mb2dvbmV3c1Byb3ZpZGVyID0gTG9nb25ld3NQcm92aWRlcjsKCgovKioqLyB9KSwKLyogNDEgKi8KLyoqKi8gKChfX3VudXNlZF93ZWJwYWNrX21vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgPT4gewoKInVzZSBzdHJpY3QiOwoKT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgKHsgdmFsdWU6IHRydWUgfSkpOwpleHBvcnRzLkFmRGlhbk5ldFByb3ZpZGVyID0gdm9pZCAwOwpjb25zdCB1dGlsc18xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTsKY2xhc3MgQWZEaWFuTmV0UHJvdmlkZXIgewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZXN0ID0gL2FmZGlhblwubmV0XC9saW5rXD90YXJnZXQ9KC4qKS87CiAgICB9CiAgICByZXNvbHZlKGFFbGVtZW50KSB7CiAgICAgICAgKDAsIHV0aWxzXzEuYW50aVJlZGlyZWN0KShhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCJ0YXJnZXQiKSk7CiAgICB9Cn0KZXhwb3J0cy5BZkRpYW5OZXRQcm92aWRlciA9IEFmRGlhbk5ldFByb3ZpZGVyOwoKCi8qKiovIH0pLAovKiA0MiAqLwovKioqLyAoKF9fdW51c2VkX3dlYnBhY2tfbW9kdWxlLCBleHBvcnRzKSA9PiB7CgoidXNlIHN0cmljdCI7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCAoeyB2YWx1ZTogdHJ1ZSB9KSk7CmV4cG9ydHMuQmxvZzUxQ1RPID0gdm9pZCAwOwpjbGFzcyBCbG9nNTFDVE8gewogICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgdGhpcy50ZXN0ID0gdHJ1ZTsKICAgIH0KICAgIHJlc29sdmUoYUVsZW1lbnQpIHsKICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5hcnRpY2xlLWRldGFpbCIpOwogICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5jb250YWlucyhhRWxlbWVudCkpIHsKICAgICAgICAgICAgaWYgKCFhRWxlbWVudC5vbmNsaWNrICYmIGFFbGVtZW50LmhyZWYpIHsKICAgICAgICAgICAgICAgIGFFbGVtZW50Lm9uY2xpY2sgPSBmdW5jdGlvbiBhbnRpUmVkaXJlY3RPbkNsaWNrRm4oZSkgewogICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgJGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CiAgICAgICAgICAgICAgICAgICAgJGEuaHJlZiA9IGFFbGVtZW50LmhyZWY7CiAgICAgICAgICAgICAgICAgICAgJGEudGFyZ2V0ID0gYUVsZW1lbnQudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgICRhLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CmV4cG9ydHMuQmxvZzUxQ1RPID0gQmxvZzUxQ1RPOwoKCi8qKiovIH0pCi8qKioqKiovIAldKTsKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTsKLyoqKioqKi8gCQovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKLyoqKioqKi8gCQkvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGUKLyoqKioqKi8gCQl2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTsKLyoqKioqKi8gCQlpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHsKLyoqKioqKi8gCQkJcmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJCX0KLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0gewovKioqKioqLyAJCQkvLyBubyBtb2R1bGUuaWQgbmVlZGVkCi8qKioqKiovIAkJCS8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkCi8qKioqKiovIAkJCWV4cG9ydHM6IHt9Ci8qKioqKiovIAkJfTsKLyoqKioqKi8gCQovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCV9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwovKioqKioqLyAJCi8qKioqKiovIAkJLy8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGUKLyoqKioqKi8gCQlyZXR1cm4gbW9kdWxlLmV4cG9ydHM7Ci8qKioqKiovIAl9Ci8qKioqKiovIAkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gCS8qIHdlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyAqLwovKioqKioqLyAJKCgpID0+IHsKLyoqKioqKi8gCQkvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzCi8qKioqKiovIAkJX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHsKLyoqKioqKi8gCQkJZm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgewovKioqKioqLyAJCQkJaWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7Ci8qKioqKiovIAkJCQkJT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTsKLyoqKioqKi8gCQkJCX0KLyoqKioqKi8gCQkJfQovKioqKioqLyAJCX07Ci8qKioqKiovIAl9KSgpOwovKioqKioqLyAJCi8qKioqKiovIAkvKiB3ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsICovCi8qKioqKiovIAkoKCkgPT4gewovKioqKioqLyAJCV9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHsKLyoqKioqKi8gCQkJaWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7Ci8qKioqKiovIAkJCXRyeSB7Ci8qKioqKiovIAkJCQlyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTsKLyoqKioqKi8gCQkJfSBjYXRjaCAoZSkgewovKioqKioqLyAJCQkJaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93OwovKioqKioqLyAJCQl9Ci8qKioqKiovIAkJfSkoKTsKLyoqKioqKi8gCX0pKCk7Ci8qKioqKiovIAkKLyoqKioqKi8gCS8qIHdlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQgKi8KLyoqKioqKi8gCSgoKSA9PiB7Ci8qKioqKiovIAkJX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKQovKioqKioqLyAJfSkoKTsKLyoqKioqKi8gCQovKioqKioqLyAJLyogd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCAqLwovKioqKioqLyAJKCgpID0+IHsKLyoqKioqKi8gCQkvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzCi8qKioqKiovIAkJX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHsKLyoqKioqKi8gCQkJaWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7Ci8qKioqKiovIAkJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTsKLyoqKioqKi8gCQkJfQovKioqKioqLyAJCQlPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOwovKioqKioqLyAJCX07Ci8qKioqKiovIAl9KSgpOwovKioqKioqLyAJCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0ge307Ci8vIFRoaXMgZW50cnkgbmVlZCB0byBiZSB3cmFwcGVkIGluIGFuIElJRkUgYmVjYXVzZSBpdCBuZWVkIHRvIGJlIGluIHN0cmljdCBtb2RlLgooKCkgPT4gewoidXNlIHN0cmljdCI7CnZhciBleHBvcnRzID0gX193ZWJwYWNrX2V4cG9ydHNfXzsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsICh7IHZhbHVlOiB0cnVlIH0pKTsKX193ZWJwYWNrX3JlcXVpcmVfXygxKTsKY29uc3QgYXBwXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpOwpjb25zdCBfNTFfcnV5b19uZXRfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNik7CmNvbnN0IGFkZG9uc19tb3ppbGxhX29yZ18xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTsKY29uc3QgYXBwX3lpbnhpYW5nX2NvbV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTsKY29uc3QgYmxvZ19jc2RuX25ldF8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTsKY29uc3Qgb3NjaGluYV9jb21fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTApOwpjb25zdCBkYWlseV96aGlodV9jb21fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpOwpjb25zdCBkb2NzX2dvb2dsZV9jb21fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpOwpjb25zdCBnZXRwb2NrZXRfY29tXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTsKY29uc3QgZ21haWxfZ29vZ2xlX2NvbV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7CmNvbnN0IGp1ZWppbl9jb21fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpOwpjb25zdCBtYWlsX3FxX2NvbV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNik7CmNvbnN0IG1pamlzb3VfY29tXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTsKY29uc3QgcGxheV9nb29nbGVfY29tXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE4KTsKY29uc3Qgc3RlYW1jb21tdW5pdHlfY29tXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE5KTsKY29uc3QgdGllYmFfYmFpZHVfY29tXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIwKTsKY29uc3QgdHdpdHRlcl9jb21fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpOwpjb25zdCB2aWRlb19iYWlkdV9jb21fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpOwpjb25zdCB3ZWlib19jb21fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMjQpOwpjb25zdCB3d3dfYmFpZHVfY29tXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTsKY29uc3Qgd3d3X2RvZ2Vkb2dlX2NvbV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCk7CmNvbnN0IHd3d19kb3ViYW5fY29tXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMxKTsKY29uc3Qgd3d3X2dvb2dsZV9jb21fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMzIpOwpjb25zdCB3d3dfamlhbnNodV9jb21fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMzMpOwpjb25zdCB3d3dfc29fY29tXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM0KTsKY29uc3Qgd3d3X3NvZ291X2NvbV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNSk7CmNvbnN0IHd3d195b3V0dWJlX2NvbV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNik7CmNvbnN0IHd3d196aGlodV9jb21fMSA9IF9fd2VicGFja19yZXF1aXJlX18oMzcpOwpjb25zdCB4dWVzaHVfYmFpZHVfY29tXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM4KTsKY29uc3Qgemh1YW5sYW5femhpaHVfY29tXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM5KTsKY29uc3Qgd3d3X2xvZ29uZXdzX2NuXzEgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQwKTsKY29uc3QgYWZhZGlhbl9uZXRfMSA9IF9fd2VicGFja19yZXF1aXJlX18oNDEpOwpjb25zdCBibG9nXzUxY3RvX2NvbV8xID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Mik7CmNvbnN0IGdtX2h0dHBfMSA9IF9fd2VicGFja19yZXF1aXJlX18oMjMpOwpjb25zdCBhcHAgPSBuZXcgYXBwXzEuQXBwKCk7CmNvbnN0IGlzRGVidWcgPSAicHJvZHVjdGlvbiIgIT09ICJwcm9kdWN0aW9uIjsKZ21faHR0cF8xLmRlZmF1bHQuc2V0Q29uZmlnKHsgZGVidWc6IGlzRGVidWcgfSk7CmFwcAogICAgLnNldENvbmZpZyh7IGlzRGVidWcgfSkKICAgIC5yZWdpc3RlclByb3ZpZGVyKFsKICAgIHsKICAgICAgICAvLyDmtYvor5XlnLDlnYA6IGh0dHBzOi8vd3d3LnpoaWh1LmNvbS9xdWVzdGlvbi8yNTI1ODc3NQogICAgICAgIG5hbWU6ICLnn6XkuY4iLAogICAgICAgIHRlc3Q6IC93d3dcLnpoaWh1XC5jb20vLAogICAgICAgIHByb3ZpZGVyOiB3d3dfemhpaHVfY29tXzEuWmhpaHVQcm92aWRlciwKICAgIH0sCiAgICB7CiAgICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwczovL3podWFubGFuLnpoaWh1LmNvbS9wLzIwNTQ5OTc4CiAgICAgICAgbmFtZTogIuefpeS5juS4k+agjyIsCiAgICAgICAgdGVzdDogL3podWFubGFuXC56aGlodVwuY29tLywKICAgICAgICBwcm92aWRlcjogemh1YW5sYW5femhpaHVfY29tXzEuWmhpaHVaaHVhbmxhblByb3ZpZGVyLAogICAgfSwKICAgIHsKICAgICAgICAvLyDmtYvor5XlnLDlnYA6CiAgICAgICAgbmFtZTogIuefpeS5juaXpeaKpSIsCiAgICAgICAgdGVzdDogL2RhaWx5XC56aGlodVwuY29tLywKICAgICAgICBwcm92aWRlcjogZGFpbHlfemhpaHVfY29tXzEuWmhpaHVEYWlseVByb3ZpZGVyLAogICAgfSwKICAgIHsKICAgICAgICBuYW1lOiAiR29vZ2xl5pCc57SiIiwKICAgICAgICB0ZXN0OiAvXHcrXC5nb29nbGVcLi8sCiAgICAgICAgcHJvdmlkZXI6IHd3d19nb29nbGVfY29tXzEuR29vZ2xlUHJvdmlkZXIsCiAgICB9LAogICAgewogICAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMVRGY0VYTWNLcndvSUFFQ0lWeUJVMEdQb1NtUnFaN0EwVkJ2cWVLWVZTd3cvaHRtbHZpZXcKICAgICAgICBuYW1lOiAiR29vZ2xlIERvY3MiLAogICAgICAgIHRlc3Q6IC9kb2NzXC5nb29nbGVcLmNvbS8sCiAgICAgICAgcHJvdmlkZXI6IGRvY3NfZ29vZ2xlX2NvbV8xLkdvb2dsZURvY3NQcm92aWRlciwKICAgIH0sCiAgICB7CiAgICAgICAgbmFtZTogIkdtYWlsIiwKICAgICAgICB0ZXN0OiAvbWFpbFwuZ29vZ2xlXC5jb20vLAogICAgICAgIHByb3ZpZGVyOiBnbWFpbF9nb29nbGVfY29tXzEuR21haWxQcm92aWRlciwKICAgIH0sCiAgICB7CiAgICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwczovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS9tb3ZpZXMvZGV0YWlscy8lRTclQTclQkIlRTUlOEIlOTUlRTglQkYlQjclRTUlQUUlQUVfJUU2JUFEJUJCJUU0JUJBJUExJUU4JUE3JUEzJUU4JTk3JUE1P2lkPVlOeTdnUnF3dE1rCiAgICAgICAgbmFtZTogIkdvb2dsZSBQbGF5IiwKICAgICAgICB0ZXN0OiAvcGxheVwuZ29vZ2xlXC5jb20vLAogICAgICAgIHByb3ZpZGVyOiBwbGF5X2dvb2dsZV9jb21fMS5Hb29nbGVQbGF5UHJvdmlkZXIsCiAgICB9LAogICAgewogICAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1YVFhTUlJTdjFiWQogICAgICAgIG5hbWU6ICJHb29nbGUgWW91dHViZSIsCiAgICAgICAgdGVzdDogL3d3d1wueW91dHViZVwuY29tLywKICAgICAgICBwcm92aWRlcjogd3d3X3lvdXR1YmVfY29tXzEuWW91dHViZVByb3ZpZGVyLAogICAgfSwKICAgIHsKICAgICAgICAvLyDmtYvor5XlnLDlnYA6IGh0dHBzOi8vd3d3LnNvLmNvbS9zP2llPXV0Zi04JmZyPW5vbmUmc3JjPTM2MHNvdV9uZXdob21lJnE9Y2hyb21lCiAgICAgICAgbmFtZTogIjM2MOaQnOe0oiIsCiAgICAgICAgdGVzdDogL3d3d1wuc29cLmNvbS8sCiAgICAgICAgcHJvdmlkZXI6IHd3d19zb19jb21fMS5Tb1Byb3ZpZGVyLAogICAgfSwKICAgIHsKICAgICAgICBuYW1lOiAi5paw5rWq5b6u5Y2aIiwKICAgICAgICB0ZXN0OiAvXC53ZWlib1wuY29tLywKICAgICAgICBwcm92aWRlcjogd2VpYm9fY29tXzEuV2Vib1Byb3ZpZGVyLAogICAgfSwKICAgIC8vIOa1i+ivlTogaHR0cHM6Ly90d2l0dGVyLmNvbS9mdGl1bTQvc3RhdHVzLzE1MTI4MTUxMTY4MTA1MjI2MzEKICAgIHsKICAgICAgICBuYW1lOiAiVHdpdHRlciIsCiAgICAgICAgdGVzdDogL3R3aXR0ZXJcLmNvbS8sCiAgICAgICAgcHJvdmlkZXI6IHR3aXR0ZXJfY29tXzEuVHdpdHRlclByb3ZpZGVyLAogICAgfSwKICAgIHsKICAgICAgICAvLyDmtYvor5U6IGh0dHA6Ly93d3cuc29nb3UuY29tL3dlYj9xdWVyeT1jaHJvbWUmX2FzZj13d3cuc29nb3UuY29tJl9hc3Q9Jnc9MDEwMTk5MDAmcD00MDA0MDEwMCZpZT11dGY4JmZyb209aW5kZXgtbm9sb2dpbiZzX2Zyb209aW5kZXgmc3V0PTE1Mjcmc3N0MD0xNTA0MzQ3MzY3NjExJmxrdD0wJTJDMCUyQzAmc3Vnc3V2PTAwMDkxNjUxQjQ4Q0E0NUY1OTNCNjFBMjlCMTMxNDA1JnN1Z3RpbWU9MTUwNDM0NzM2NzYxMQogICAgICAgIG5hbWU6ICLmkJzni5fmkJzntKIiLAogICAgICAgIHRlc3Q6IC93d3dcLnNvZ291XC5jb20vLAogICAgICAgIHByb3ZpZGVyOiB3d3dfc29nb3VfY29tXzEuU29Hb3VQcm92aWRlciwKICAgIH0sCiAgICB7CiAgICAgICAgLy8g5rWL6K+VOiBodHRwczovL3d3dy5iYWlkdS5jb20vcz93ZD1jaHJvbWUmcnN2X3NwdD0xJnJzdl9pcWlkPTB4Y2IxMzYyMzcwMDBlZDQwZSZpc3NwPTEmZj04JnJzdl9icD0wJnJzdl9pZHg9MiZpZT11dGYtOCZ0bj1iYWlkdWxvY2FsJnJzdl9lbnRlcj0xJnJzdl9zdWczPTcmcnN2X3N1ZzE9NyZyc3Zfc3VnNz0xMDEmcnN2X3N1ZzI9MCZpbnB1dFQ9ODEzJnJzdl9zdWc0PTk4OSZ0aW1lc3RhbXA9MTUwNDM0OTIyOTI2NiZybj01MCZ2Zl9ibD0xCiAgICAgICAgbmFtZTogIueZvuW6puaQnOe0oiIsCiAgICAgICAgdGVzdDogL3d3d1wuYmFpZHVcLmNvbS8sCiAgICAgICAgcHJvdmlkZXI6IHd3d19iYWlkdV9jb21fMS5CYWlkdVByb3ZpZGVyLAogICAgfSwKICAgIHsKICAgICAgICAvLyDmtYvor5U6IGh0dHBzOi8vd3d3LmJhaWR1LmNvbS9zP3dkPWNocm9tZSZwbj0yMCZvcT1jaHJvbWUmdG49YmFpZHVob21lX3BnJmllPXV0Zi04JnVzbT0zJnJzdl9pZHg9MiZyc3ZfcHE9ZTA0MzkwMGQwMDAwNzUyZCZyc3ZfdD02YmIwVXFFd3AyVGxlNlRBTUJEbFUzV2clMkJTeG9xdnZPaFpLeVFnTSUyQlZRUDhHYzU0UVpMaGNEY2o2MmVHZk5HNzVhcTUmcnN2X3BhZ2U9MQogICAgICAgIG5hbWU6ICLnmb7luqbop4bpopEiLAogICAgICAgIHRlc3Q6IC92XC5iYWlkdVwuY29tLywKICAgICAgICBwcm92aWRlcjogdmlkZW9fYmFpZHVfY29tXzEuQmFpZHVWaWRlb1Byb3ZpZGVyLAogICAgfSwKICAgIHsKICAgICAgICAvLyDmtYvor5U6IGh0dHA6Ly94dWVzaHUuYmFpZHUuY29tL3M/d2Q9cGFwZXJ1cmklM0ElMjhhZTRkNmI1ZGEwNWVjYTU1MmRhYjA1YWVlZmI5NjZlNiUyOSZpZT11dGYtOCZmaWx0ZXI9c2NfbG9uZ19zaWduJnNjX2tzX3BhcmE9cSUzRCVFMiU4MCU5QyVFNCVCQSU5MiVFOCU4MSU5NCVFNyVCRCU5MSUyQiVFNSU4MSVBNSVFNSVCQSVCNyVFNyVBRSVBMSVFNyU5MCU4NiVFMiU4MCU5RCVFNiVBOCVBMSVFNSVCQyU4RiVFNiU4RSVBMiVFOCVBRSVBOCVFNSU4RiU4QSVFNSU4NSVCNiVFNSVCQSU5NCVFNyU5NCVBOCZ0bj1TRV9iYWlkdXh1ZXNodV9jMWdqZXVwYQogICAgICAgIG5hbWU6ICLnmb7luqblrabmnK8iLAogICAgICAgIHRlc3Q6IC94dWVzaHVcLmJhaWR1XC5jb20vLAogICAgICAgIHByb3ZpZGVyOiB4dWVzaHVfYmFpZHVfY29tXzEuQmFpZHVYdWVzaHVQcm92aWRlciwKICAgIH0sCiAgICB7CiAgICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwOi8vdGllYmEuYmFpZHUuY29tL3AvNTMwMDg0NDE4MAogICAgICAgIG5hbWU6ICLnmb7luqbotLTlkKciLAogICAgICAgIHRlc3Q6IC90aWViYVwuYmFpZHVcLmNvbS8sCiAgICAgICAgcHJvdmlkZXI6IHRpZWJhX2JhaWR1X2NvbV8xLlRpZWJhUHJvdmlkZXIsCiAgICB9LAogICAgewogICAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly9qdWVqaW4uaW0vZW50cnkvNTlhYzhmYTU1MTg4MjUyNDI0MWE4ODAyP3V0bV9zb3VyY2U9Z29sZF9icm93c2VyX2V4dGVuc2lvbgogICAgICAgIG5hbWU6ICLmjpjph5EiLAogICAgICAgIHRlc3Q6IC9qdWVqaW5cLihpbXxjbikvLAogICAgICAgIHByb3ZpZGVyOiBqdWVqaW5fY29tXzEuSnVlamluUHJvdmlkZXIsCiAgICB9LAogICAgewogICAgICAgIG5hbWU6ICJRUemCrueusSIsCiAgICAgICAgdGVzdDogL21haWxcLnFxXC5jb20vLAogICAgICAgIHByb3ZpZGVyOiBtYWlsX3FxX2NvbV8xLlFRTWFpbFByb3ZpZGVyLAogICAgfSwKICAgIHsKICAgICAgICAvLyDmtYvor5XlnLDlnYA6IGh0dHBzOi8vYWRkb25zLm1vemlsbGEub3JnL3poLUNOL2ZpcmVmb3gvYWRkb24vZXZlcm5vdGUtd2ViLWNsaXBwZXIvCiAgICAgICAgbmFtZTogIk1vemlsbGEiLAogICAgICAgIHRlc3Q6IC9hZGRvbnNcLm1vemlsbGFcLm9yZy8sCiAgICAgICAgcHJvdmlkZXI6IGFkZG9uc19tb3ppbGxhX29yZ18xLk1vemlsbGFQcm92aWRlciwKICAgIH0sCiAgICB7CiAgICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwczovL3d3dy5qaWFuc2h1LmNvbS9wLzk3OTc3NmNhNDRiOAogICAgICAgIC8vIGh0dHBzOi8vd3d3LmppYW5zaHUuY29tL3AvZmM4YWJjNjViYmIyCiAgICAgICAgbmFtZTogIueugOS5piIsCiAgICAgICAgdGVzdDogL3d3d1wuamlhbnNodVwuY29tLywKICAgICAgICBwcm92aWRlcjogd3d3X2ppYW5zaHVfY29tXzEuSmlhblNodVByb3ZpZGVyLAogICAgfSwKICAgIHsKICAgICAgICAvLyDmtYvor5XlnLDlnYA6IGh0dHBzOi8vd3d3LmRvdWJhbi5jb20vZG91bGlzdC8yNDA5NjIvCiAgICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwczovL3d3dy5kb3ViYW4uY29tL3NlYXJjaD9jYXQ9MTAwMiZxPSVFOSVCQiU5MSVFOSU5NSU5QwogICAgICAgIG5hbWU6ICLosYbnk6MiLAogICAgICAgIHRlc3Q6IC9kb3ViYW5cLmNvbS8sCiAgICAgICAgcHJvdmlkZXI6IHd3d19kb3ViYW5fY29tXzEuRG91QmFuUHJvdmlkZXIsCiAgICB9LAogICAgewogICAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly9nZXRwb2NrZXQuY29tL2EvcmVjb21tZW5kZWQvCiAgICAgICAgLy8g6ZyA6KaB55m76ZmGCiAgICAgICAgbmFtZTogIlBvY2tldCIsCiAgICAgICAgdGVzdDogL2dldHBvY2tldFwuY29tLywKICAgICAgICBwcm92aWRlcjogZ2V0cG9ja2V0X2NvbV8xLlBvY2tldFByb3ZpZGVyLAogICAgfSwKICAgIHsKICAgICAgICAvLyDmtYvor5XlnLDlnYA6IGh0dHBzOi8vd3d3LmRvZ2Vkb2dlLmNvbS9yZXN1bHRzP3E9Y2hyb21lCiAgICAgICAgbmFtZTogIkRvZ2VEb2dlIiwKICAgICAgICB0ZXN0OiAvd3d3XC5kb2dlZG9nZVwuY29tLywKICAgICAgICBwcm92aWRlcjogd3d3X2RvZ2Vkb2dlX2NvbV8xLkRvZ2VEb2dlUHJvdmlkZXIsCiAgICB9LAogICAgewogICAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly81MS5ydXlvLm5ldC8xNTA1My5odG1sCiAgICAgICAgbmFtZTogIlJ1eW8iLAogICAgICAgIHRlc3Q6IC81MVwucnV5b1wubmV0LywKICAgICAgICBwcm92aWRlcjogXzUxX3J1eW9fbmV0XzEuUnV5b1Byb3ZpZGVyLAogICAgfSwKICAgIHsKICAgICAgICAvLyDmtYvor5XlnLDlnYA6IGh0dHBzOi8vc3RlYW1jb21tdW5pdHkuY29tL3NoYXJlZGZpbGVzL2ZpbGVkZXRhaWxzLz9pZD0xMzExNTM1NTMxCiAgICAgICAgbmFtZTogIlN0ZWFtIiwKICAgICAgICB0ZXN0OiAvc3RlYW1jb21tdW5pdHlcLmNvbS8sCiAgICAgICAgcHJvdmlkZXI6IHN0ZWFtY29tbXVuaXR5X2NvbV8xLlN0ZWFtUHJvdmlkZXIsCiAgICB9LAogICAgewogICAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly9taWppc291LmNvbS8/cT1jaHJvbWUmY2F0ZWdvcnlfZ2VuZXJhbD1vbiZ0aW1lX3JhbmdlPSZsYW5ndWFnZT16aC1DTiZwYWdlbm89MQogICAgICAgIG5hbWU6ICLnp5jov7kiLAogICAgICAgIHRlc3Q6IC9taWppc291XC5jb20vLAogICAgICAgIHByb3ZpZGVyOiBtaWppc291X2NvbV8xLk1pSmlQcm92aWRlciwKICAgIH0sCiAgICB7CiAgICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwczovL2dpdGh1Yi5jb20vYXhldHJveS9hbnRpLXJlZGlyZWN0L2lzc3Vlcy8zNTAKICAgICAgICBuYW1lOiAiQ1NETiIsCiAgICAgICAgdGVzdDogL2Jsb2dcLmNzZG5cLm5ldC8sCiAgICAgICAgcHJvdmlkZXI6IGJsb2dfY3Nkbl9uZXRfMS5DU0ROUHJvdmlkZXIsCiAgICB9LAogICAgewogICAgICAgIC8vIOa1i+ivleWcsOWdgO+8mmh0dHBzOi8vbXkub3NjaGluYS5uZXQvY2hpcG8vYmxvZy8zMDY3NjcyCiAgICAgICAgbmFtZTogIk9TIENoaW5hIiwKICAgICAgICB0ZXN0OiAvb3NjaGluYVwubmV0LywKICAgICAgICBwcm92aWRlcjogb3NjaGluYV9jb21fMS5PU0NoaW5hUHJvdmlkZXIsCiAgICB9LAogICAgewogICAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly9naXRodWIuY29tL2F4ZXRyb3kvYW50aS1yZWRpcmVjdC9pc3N1ZXMvMzUwCiAgICAgICAgbmFtZTogIuWNsOixoeeslOiusCIsCiAgICAgICAgdGVzdDogL2FwcFwueWlueGlhbmdcLmNvbS8sCiAgICAgICAgcHJvdmlkZXI6IGFwcF95aW54aWFuZ19jb21fMS5ZaW5YaWFuZ1Byb3ZpZGVyLAogICAgfSwKICAgIHsKICAgICAgICAvLyDmtYvor5XlnLDlnYA6IGh0dHBzOi8vd3d3LmxvZ29uZXdzLmNuLzIwMjEwNzMwMDI0MjAxNDEuaHRtbAogICAgICAgIG5hbWU6ICLmoIflv5fmg4XmiqXlsYAiLAogICAgICAgIHRlc3Q6IC93d3dcLmxvZ29uZXdzXC5jbi8sCiAgICAgICAgcHJvdmlkZXI6IHd3d19sb2dvbmV3c19jbl8xLkxvZ29uZXdzUHJvdmlkZXIsCiAgICB9LAogICAgewogICAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly9hZmRpYW4ubmV0L2EveGlhb2ZhbkVyaWMKICAgICAgICBuYW1lOiAi54ix5Y+R55S1IiwKICAgICAgICB0ZXN0OiAvYWZkaWFuXC5uZXQvLAogICAgICAgIHByb3ZpZGVyOiBhZmFkaWFuX25ldF8xLkFmRGlhbk5ldFByb3ZpZGVyLAogICAgfSwKICAgIHsKICAgICAgICAvLyDmtYvor5XlnLDlnYA6IGh0dHBzOi8vYmxvZy41MWN0by5jb20vdV8xMTUxMjgyNi8yMDY4NDIxCiAgICAgICAgbmFtZTogIjUxQ1RP5Y2a5a6iIiwKICAgICAgICB0ZXN0OiAvYmxvZ1wuNTFjdG9cLmNvbS8sCiAgICAgICAgcHJvdmlkZXI6IGJsb2dfNTFjdG9fY29tXzEuQmxvZzUxQ1RPLAogICAgfSwKXSkKICAgIC5ib290c3RyYXAoKTsKCn0pKCk7CgovKioqKioqLyB9KSgpCjs="},{"name":"自动展开豆瓣、站长之家、米坛、cnbeta、知乎、慕课网、Awesomes、喜马拉雅、CSDN博客、CSDN下载、道客88、百度文库、百度知道、回形针、人民日报客户端、凤凰网页面的隐藏内容","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_prototypes":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_excludes":[],"orig_includes":[],"orig_matches":["*blog.csdn.net/*","*bbs.csdn.net/*","*download.csdn.net/download/*/*","*www.doc88.com/*","*wenku.baidu.com/view/*","*zhidao.baidu.com/question*","*www.ipaperclip.net/doku.php?id=*","*wap.peopleapp.com/article/*","*ishare.ifeng.com/c/s/*","*www.ximalaya.com/*","*www.awesomes.cn/*","*www.imooc.com/article/*","*www.zhihu.com/question/*","*www.bandbbs.cn/*","*www.cnbeta.com/*","*www.chinaz.com/*","*www.douban.com/note/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"tab_types":null},"storage":{"ts":1624620458210,"data":{}},"enabled":true,"position":11,"file_url":"https://greasyfork.org/scripts/397933-%E8%87%AA%E5%8A%A8%E5%B1%95%E5%BC%80%E8%B1%86%E7%93%A3-%E7%AB%99%E9%95%BF%E4%B9%8B%E5%AE%B6-%E7%B1%B3%E5%9D%9B-cnbeta-%E7%9F%A5%E4%B9%8E-%E6%85%95%E8%AF%BE%E7%BD%91-awesomes-%E5%96%9C%E9%A9%AC%E6%8B%89%E9%9B%85-csdn%E5%8D%9A%E5%AE%A2-csdn%E4%B8%8B%E8%BD%BD-%E9%81%93%E5%AE%A288-%E7%99%BE%E5%BA%A6%E6%96%87%E5%BA%93-%E7%99%BE%E5%BA%A6%E7%9F%A5%E9%81%93-%E5%9B%9E%E5%BD%A2%E9%92%88-%E4%BA%BA%E6%B0%91%E6%97%A5%E6%8A%A5%E5%AE%A2%E6%88%B7%E7%AB%AF-%E5%87%A4%E5%87%B0%E7%BD%91%E9%A1%B5%E9%9D%A2%E7%9A%84%E9%9A%90%E8%97%8F%E5%86%85%E5%AE%B9/code/%E8%87%AA%E5%8A%A8%E5%B1%95%E5%BC%80%E8%B1%86%E7%93%A3%E3%80%81%E7%AB%99%E9%95%BF%E4%B9%8B%E5%AE%B6%E3%80%81%E7%B1%B3%E5%9D%9B%E3%80%81cnbeta%E3%80%81%E7%9F%A5%E4%B9%8E%E3%80%81%E6%85%95%E8%AF%BE%E7%BD%91%E3%80%81Awesomes%E3%80%81%E5%96%9C%E9%A9%AC%E6%8B%89%E9%9B%85%E3%80%81CSDN%E5%8D%9A%E5%AE%A2%E3%80%81CSDN%E4%B8%8B%E8%BD%BD%E3%80%81%E9%81%93%E5%AE%A288%E3%80%81%E7%99%BE%E5%BA%A6%E6%96%87%E5%BA%93%E3%80%81%E7%99%BE%E5%BA%A6%E7%9F%A5%E9%81%93%E3%80%81%E5%9B%9E%E5%BD%A2%E9%92%88%E3%80%81%E4%BA%BA%E6%B0%91%E6%97%A5%E6%8A%A5%E5%AE%A2%E6%88%B7%E7%AB%AF%E3%80%81%E5%87%A4%E5%87%B0%E7%BD%91%E9%A1%B5%E9%9D%A2%E7%9A%84%E9%9A%90%E8%97%8F%E5%86%85%E5%AE%B9.user.js","uuid":"16b7d868-de60-43e3-bb20-5b3212ac493b","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDoh6rliqjlsZXlvIDosYbnk6PjgIHnq5nplb/kuYvlrrbjgIHnsbPlnZvjgIFjbmJldGHjgIHnn6XkuY7jgIHmhZXor77nvZHjgIFBd2Vzb21lc+OAgeWWnOmprOaLiembheOAgUNTRE7ljZrlrqLjgIFDU0RO5LiL6L2944CB6YGT5a6iODjjgIHnmb7luqbmloflupPjgIHnmb7luqbnn6XpgZPjgIHlm57lvaLpkojjgIHkurrmsJHml6XmiqXlrqLmiLfnq6/jgIHlh6Tlh7DnvZHpobXpnaLnmoTpmpDol4/lhoXlrrkKLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vdGFtcGVybW9ua2V5Lm5ldC8KLy8gQHZlcnNpb24gICAgICAwLjEuNgovLyBAZGVzY3JpcHRpb24gIOiHquWKqOWxleW8gOS4gOS6m1BD572R56uZ55qE6ZqQ6JeP5YaF5a6577yb5Liq5Lq66KeJ5b6X5omL5py656uv5LiN6ZyA6KaB5YGa77yM5pWF5Y+q5ZyoUEPnq6/mnInnlKjvvJvkuLrkuobmm7Tlpb3nmoTkuIrnvZHkvZPpqozvvIzkuI3lhbzlrrnkvY7niYjmnKzmtY/op4jlmajlkoxJRea1j+iniOWZqOOAguWkp+WutuWmguacieWPkeeOsOexu+S8vOmcgOimgeaJi+WKqOeCueW8gOmakOiXj+WGheWuueeahOe9keerme+8jOivt+iHs+S7peS4i+e9keWdgOWPjemmiOWQp2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vZm9ydW0vZGlzY3Vzc2lvbi83MjU3MS94Ci8vIEBhdXRob3IgICAgICAgbGlmZTAwMDEKLy8gQG1hdGNoICAgICAgICAqYmxvZy5jc2RuLm5ldC8qCi8vIEBtYXRjaCAgICAgICAgKmJicy5jc2RuLm5ldC8qCi8vIEBtYXRjaCAgICAgICAgKmRvd25sb2FkLmNzZG4ubmV0L2Rvd25sb2FkLyovKgovLyBAbWF0Y2ggICAgICAgICp3d3cuZG9jODguY29tLyoKLy8gQG1hdGNoICAgICAgICAqd2Vua3UuYmFpZHUuY29tL3ZpZXcvKgovLyBAbWF0Y2ggICAgICAgICp6aGlkYW8uYmFpZHUuY29tL3F1ZXN0aW9uKgovLyBAbWF0Y2ggICAgICAgICp3d3cuaXBhcGVyY2xpcC5uZXQvZG9rdS5waHA/aWQ9KgovLyBAbWF0Y2ggICAgICAgICp3YXAucGVvcGxlYXBwLmNvbS9hcnRpY2xlLyoKLy8gQG1hdGNoICAgICAgICAqaXNoYXJlLmlmZW5nLmNvbS9jL3MvKgovLyBAbWF0Y2ggICAgICAgICp3d3cueGltYWxheWEuY29tLyoKLy8gQG1hdGNoICAgICAgICAqd3d3LmF3ZXNvbWVzLmNuLyoKLy8gQG1hdGNoICAgICAgICAqd3d3Lmltb29jLmNvbS9hcnRpY2xlLyoKLy8gQG1hdGNoICAgICAgICAqd3d3LnpoaWh1LmNvbS9xdWVzdGlvbi8qCi8vIEBtYXRjaCAgICAgICAgKnd3dy5iYW5kYmJzLmNuLyoKLy8gQG1hdGNoICAgICAgICAqd3d3LmNuYmV0YS5jb20vKgovLyBAbWF0Y2ggICAgICAgICp3d3cuY2hpbmF6LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKnd3dy5kb3ViYW4uY29tL25vdGUvKgovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGNvbnN0IGJ0bnMgPSBBcnJheSgKICAgICAgICAnLmJ0bi1yZWFkbW9yZScsCiAgICAgICAgJy5zaG93LWhpZGUtYnRuJywKICAgICAgICAnLmRvd24tYXJyb3cnLAogICAgICAgICcucGFwZXJjbGlwX19zaG93YnRuJywKICAgICAgICAnLmV4cGVuZCcsCiAgICAgICAgJy5zaGFkb3ctMm41b2lkWHQnLAogICAgICAgICcucmVhZF9tb3JlX2J0bicsCiAgICAgICAgJy5RdWVzdGlvblJpY2hUZXh0LW1vcmUnLAogICAgICAgICcuUXVlc3Rpb25NYWluQWN0aW9uJywKICAgICAgICAnLkNvbnRlbnRJdGVtLWV4cGFuZEJ1dHRvbicsCiAgICAgICAgJy5qc19zaG93X3RvcGljJywKICAgICAgICAnLnRibC1yZWFkLW1vcmUtYnRuJywKICAgICAgICAnLm1vcmUtaW50cm8td3JhcHBlcicsCiAgICAgICAgJy5zaG93TW9yZScsCiAgICAgICAgJy51bmZvbGRGdWxsVGV4dCcsCiAgICAgICAgJy50YWJvb2xhLW9wZW4nLAogICAgKSwKICAgICAgICBhc3luY0J0bnMgPSBBcnJheSgKICAgICAgICAgICAgJyNjb250aW51ZUJ1dHRvbicsCiAgICAgICAgICAgICcucmVhZC1tb3JlLXpoYW5rYWknLAogICAgICAgICAgICAnLndndC1hbnN3ZXJzLXNob3didG4nLAogICAgICAgICAgICAnLndndC1iZXN0LXNob3didG4nLAogICAgICAgICAgICAnLmJiQ29kZUJsb2NrLWV4cGFuZExpbmsnCiAgICAgICAgKSwgZGVsYXkgPSA1MDA7CiAgICBsZXQgdGltZXI7CgogICAgZnVuY3Rpb24gc2hvd0Z1bGwoYnRucywgZm4sIGlzRG9uZSkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnRucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBidG5zW2ldLCBkb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGQpOwogICAgICAgICAgICAgICAgaWYgKCEhZG9tWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgZm4oZG9tLCBkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICAgIGlmICghaXNEb25lKSB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gc2hvd0Z1bGwoYnRucywgZm4sIGZhbHNlKSwgZGVsYXkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRvU2hvdyhkb20sIGQpIHsKICAgICAgICBpZiAoZCA9PT0gJy5wYXBlcmNsaXBfX3Nob3didG4nKSB7CiAgICAgICAgICAgIGRvbS5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5jbGljaygpKTsKICAgICAgICB9IGVsc2UgaWYgKGQgPT09ICcuc2hvd01vcmUnKSB7CiAgICAgICAgICAgIGRvbVswXS5xdWVyeVNlbGVjdG9yKCdzcGFuJykuY2xpY2soKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkb21bMF0uY2xpY2soKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZG9Bc3luY1Nob3coZG9tLCBkKSB7CiAgICAgICAgZG9tWzBdLmNsaWNrKCk7CiAgICB9CgogICAgc2hvd0Z1bGwoYnRucywgZG9TaG93LCBmYWxzZSk7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsICgpID0+IHsKICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gc2hvd0Z1bGwoYXN5bmNCdG5zLCBkb0FzeW5jU2hvdywgdHJ1ZSksIGRlbGF5KTsKICAgIH0pOwp9KSgpOw=="},{"name":"【省一省】双11超级红包!优惠券+返现+抢购秒杀助手--任意网站抢购、秒杀、抢券等,支持淘宝、天猫、京东、唯品会、考拉海购领券,配合APP扫码下单后即可获得返现!!!。","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_prototypes":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["taobao.com","gwdang.com","jd.com","suning.com","pinduoduo.com","vmall.com","mi.com","youyizhineng.top"],"orig_excludes":["*://login.taobao.com/*","*://pages.tmall.com/*","*://uland.taobao.com/*","*://uland.taobao.com/*"],"orig_includes":[],"orig_matches":["*://*.taobao.com/*","*://*.tmall.com/*","*://*.tmall.hk/*","*://*.liangxinyao.com/*","*://*.jd.com/*","*://*.jd.hk/*","*://*.vip.com/*","*://*.kaola.com/*","*://*.suning.com/*","*://*.fengwd.com/*","https://*/*","http://*/*"],"orig_noframes":true,"orig_run_at":"document-start","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"tab_types":null,"unwrap":null},"storage":{"ts":1654780614758,"data":{"BWlist_sel":"swhite_mode","blockUrl":"shk.sz.gov.cn:8118","newPlanFinish":"s1","obj_plans":"s{\"plan_1654408507156\":{\"plan_name\":\"1\",\"plan_info\":\"11\",\"plan_type\":\"1\",\"jd_spike\":\"0\",\"plan_attributes1\":\"\",\"plan_attributes2\":\"\",\"plan_attributes3\":\"\",\"isfinish\":\"1\",\"keys\":{\"hk.sz.gov.cn:8118\":[{\"key_name\":\"我要预约\",\"press_num\":\"1\",\"press_interval\":\"200\",\"css_path\":\"a#a_canBookHotel\"}]}}}","virtualCookie":"o{\"mjdLogin\": {\"active\": \"0\",\"start_time\": \"0\",\"theLifeCycle\": 7200000,\"property1\": \"\",\"property2\": \"\",\"property3\": \"\"},\"plan_1654408507156\": {\"active\": \"0\",\"start_time\": 1654408666544,\"theLifeCycle\": 60000,\"property1\": \"\",\"property2\": \"\",\"property3\": \"\"}}"}},"enabled":false,"position":12,"file_url":"https://greasyfork.org/scripts/411085-%E8%8A%B1%E5%89%8D%E7%9C%81%E4%B8%80%E7%9C%81-%E9%9A%90%E8%97%8F%E5%88%B8-%E8%BF%94%E7%8E%B0-%E6%94%AF%E6%8C%81%E6%B7%98%E5%AE%9D-%E5%A4%A9%E7%8C%AB-%E4%BA%AC%E4%B8%9C-%E5%94%AF%E5%93%81%E4%BC%9A-%E8%80%83%E6%8B%89%E6%B5%B7%E8%B4%AD-%E5%8F%AF%E6%98%BE%E7%A4%BA%E8%BF%94%E7%8E%B0%E9%87%91%E9%A2%9D-%E5%8E%86%E5%8F%B2%E4%BB%B7%E6%A0%BC%E8%B5%B0%E5%8A%BF-%E9%85%8D%E5%90%88app%E6%89%AB%E7%A0%81%E4%B8%8B%E5%8D%95%E5%90%8E%E5%8D%B3%E5%8F%AF%E8%8E%B7%E5%BE%97%E8%BF%94%E7%8E%B0-%E9%95%BF%E6%9C%9F%E6%9B%B4%E6%96%B0-%E6%94%BE%E5%BF%83%E4%BD%BF%E7%94%A8/code/%E8%8A%B1%E5%89%8D%E7%9C%81%E4%B8%80%E7%9C%81%C2%A9--%E3%80%90%E9%9A%90%E8%97%8F%E5%88%B8+%E8%BF%94%E7%8E%B0%EF%BC%81%E3%80%91--%E6%94%AF%E6%8C%81%E6%B7%98%E5%AE%9D%E3%80%81%E5%A4%A9%E7%8C%AB%E3%80%81%E4%BA%AC%E4%B8%9C%E3%80%81%E5%94%AF%E5%93%81%E4%BC%9A%E3%80%81%E8%80%83%E6%8B%89%E6%B5%B7%E8%B4%AD%EF%BC%8C%E5%8F%AF%E6%98%BE%E7%A4%BA%E8%BF%94%E7%8E%B0%E9%87%91%E9%A2%9D%EF%BC%8C%E5%8E%86%E5%8F%B2%E4%BB%B7%E6%A0%BC%E8%B5%B0%E5%8A%BF%EF%BC%8C%E9%85%8D%E5%90%88APP%E6%89%AB%E7%A0%81%E4%B8%8B%E5%8D%95%E5%90%8E%E5%8D%B3%E5%8F%AF%E8%8E%B7%E5%BE%97%E8%BF%94%E7%8E%B0~~%E9%95%BF%E6%9C%9F%E6%9B%B4%E6%96%B0%EF%BC%8C%E6%94%BE%E5%BF%83%E4%BD%BF%E7%94%A8%E3%80%82.user.js","uuid":"c24affca-675e-4911-a446-739d2d12fec0","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDjgJDnnIHkuIDnnIHjgJHlj4wxMei2hee6p+e6ouWMhSHkvJjmg6DliLgr6L+U546wK+aKoui0reenkuadgOWKqeaJiy0t5Lu75oSP572R56uZ5oqi6LSt44CB56eS5p2A44CB5oqi5Yi4562J77yM5pSv5oyB5reY5a6d44CB5aSp54yr44CB5Lqs5Lic44CB5ZSv5ZOB5Lya44CB6ICD5ouJ5rW36LSt6aKG5Yi477yM6YWN5ZCIQVBQ5omr56CB5LiL5Y2V5ZCO5Y2z5Y+v6I635b6X6L+U546wISEh44CCCi8vIEBuYW1lc3BhY2UgICAgY3l6bGl6aGUKLy8gQHZlcnNpb24gICAgICA1LjMKLy8gQGRlc2NyaXB0aW9uICDjgJDmiqLotK3np5LmnYDliqnmiYvjgJHku7vmhI/nvZHnq5nmiqLotK3jgIHnp5LmnYDjgIHmiqLliLjnrYnvvIzmlK/mjIHoh6rlu7rnp5LmnYDmlrnmoYjjgIHku47orrrlnZvlr7zlhaXnp5LmnYDmlrnmoYjvvIzpnZ7luLjngbXmtLvjgILjgJDpoobliLgr6L+U546w44CR5Zyo5reY5a6d44CB5aSp54yr44CB5Lqs5Lic44CB5ZSv5ZOB5Lya44CB6ICD5ouJ5rW36LSt55qE4oCY5ZWG5ZOB5pCc57Si6aG14oCZ5ZKM4oCY5ZWG5ZOB6K+m5oOF6aG14oCZ5LiK5pi+56S65LyY5oOg5Yi45Y+K6L+U546w77yM5Yqf6IO9566A5Y2V77yM5pi+56S655u06KeC77yM5Zyo5ZWG5ZOB6K+m5oOF6aG16YCa6L+H44CM6Iqx5YmN55yB5LiA55yB44CNQVBQ5omr56CB77yM55u05o6l5ZyoQVBQ6L+b5YWl5ZWG5ZOB44CB6aKG5Yi45Y+K6I635b6X6L+U546w44CCCi8vIEBhdXRob3IgICAgICAgY3l6bGl6aGUKLy8gQGljb24gICAgICAgICBodHRwczovL3MzLmF4MXguY29tLzIwMjAvMTIvMTUvcktRQ29kLnBuZwovLyBAbWF0Y2ggICAgICAgICo6Ly8qLnRhb2Jhby5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLnRtYWxsLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoudG1hbGwuaGsvKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmxpYW5neGlueWFvLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyouamQuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5qZC5oay8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoudmlwLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoua2FvbGEuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5zdW5pbmcuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5mZW5nd2QuY29tLyoKLy8gQG1hdGNoICAgICAgICBodHRwczovLyovKgovLyBAbWF0Y2ggICAgICAgIGh0dHA6Ly8qLyoKLy8gQGV4Y2x1ZGUgICAgICAqOi8vbG9naW4udGFvYmFvLmNvbS8qCi8vIEBleGNsdWRlICAgICAgKjovL3BhZ2VzLnRtYWxsLmNvbS8qCi8vIEBleGNsdWRlICAgICAgKjovL3VsYW5kLnRhb2Jhby5jb20vKgovLyBAZXhjbHVkZSAgICAgICo6Ly91bGFuZC50YW9iYW8uY29tLyoKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2Nkbi5ib290Y2RuLm5ldC9hamF4L2xpYnMvanF1ZXJ5LzEuNi4zL2pxdWVyeS5qcwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vY2RuLmJvb3Rjc3MuY29tL2pxdWVyeS5xcmNvZGUvMS4wL2pxdWVyeS5xcmNvZGUubWluLmpzCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9jZG4uYm9vdGNkbi5uZXQvYWpheC9saWJzL2FwZXhjaGFydHMvMy45LjAvYXBleGNoYXJ0cy5taW4uanMKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2Nkbi5ib290Y2RuLm5ldC9hamF4L2xpYnMvc3dlZXRhbGVydC8yLjEuMi9zd2VldGFsZXJ0Lm1pbi5qcwovLyBAcnVuLWF0ICAgICAgIGRvY3VtZW50LXN0YXJ0Ci8vIEBncmFudCAgICAgICAgR01feG1saHR0cFJlcXVlc3QKLy8gQGdyYW50ICAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX2dldFZhbHVlCi8vIEBncmFudCAgICAgICAgR01fc2V0Q2xpcGJvYXJkCi8vIEBncmFudCAgICAgICAgR01fb3BlbkluVGFiCi8vIEBub2ZyYW1lcyAgICB0cnVlCi8vIEBjb25uZWN0ICAgICB0YW9iYW8uY29tCi8vIEBjb25uZWN0ICAgICBnd2RhbmcuY29tCi8vIEBjb25uZWN0ICAgICBqZC5jb20KLy8gQGNvbm5lY3QgICAgIHN1bmluZy5jb20KLy8gQGNvbm5lY3QgICAgIHBpbmR1b2R1by5jb20KLy8gQGNvbm5lY3QgICAgIHZtYWxsLmNvbQovLyBAY29ubmVjdCAgICAgbWkuY29tCi8vIEBjb25uZWN0ICAgICB5b3V5aXpoaW5lbmcudG9wCi8vIEBhbnRpZmVhdHVyZSByZWZlcnJhbC1saW5rIOOAkOW6lEdyZWFzeUZvcmvku6PnoIHop4TojIPopoHmsYLvvJrlkKvmnInkvJjmg6DliLjmn6Xor6Llip/og73nmoTohJrmnKzlv4Xpobvmt7vliqDmraTmj5DnpLrvvIHjgJEKLy8gQG5vdGUgICAgMjAyMeW5tDAx5pyIMTnml6UxMDo0ODo0MiBidWfkv67lpI3vvIzmlrDlop7lubTotKfoioLotoXnuqfnuqLljIXvvIzosIPmlbTku6XpgILlupTmm7TlpJrmlrnmoYjjgIIKLy8gQG5vdGUgICAgMjAyMeW5tDAx5pyIMTPml6UxMToxMDowNCDnlYzpnaLosIPmlbQKLy8gQG5vdGUgICAgMjAyMeW5tDAx5pyIMTHml6UxMTowODozMSAxLuiuvue9ruS4reaCrOa1rueQg+WPr+S7pemAieaLqeeZveWQjeWNleaIluiAhem7keWQjeWNleWxj+iUvSAyLuS8mOWMlui/lOeOsOaYvuekuumAu+i+kSAzLuWFtuS7luW6leWxguS8mOWMlgovLyBAbm90ZSAgICAyMDIw5bm0MTLmnIgzMeaXpTExOjE1OjMyIDEu5L+u5aSN6K6+572u5oyB57ut5pe26Ze05LiN6LW35L2c55So55qEYnVnIDIu5o+S5Lu26LCD5pW077yM5Lul6YCC5bqU5o2h5ryP5qih5byPIDMu5aKe5Yqg5oqi6LSt5Yqp5omL5L2/55So6K+05piOIDQu5aKe5Yqg56uL5Y2z5omn6KGM5oyJ6ZKu77yM5Y+v5Lul56uL5Y2z5omn6KGM5pa55qGI44CCCi8vIEBub3RlICAgIDIwMjDlubQxMuaciDIy5pelMjI6MDU6NDMg5LyY5YyW5reY5a6d5b+r6YCf5LiL5Y2V6aKE572u5pa55qGI77yM5paw5aKe5a+55aSp54yr6LaF5biCd29ybGTpobXpnaLnmoTmlK/mjIHjgIIKLy8gQG5vdGUgICAgMjAyMOW5tDEy5pyIMTXml6UxMTowNTowMiDlhajmlrDniYjmnKzvvIzlhajmlrDlh7rlj5HvvIzmlrDlop7miqLotK3np5LmnYDliqnmiYvvvIzov5TliKnmnLrlmajkurrjgIIKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24gKCkgewogICAgInVzZSBzdHJpY3QiOwogICAgdmFyICQyID0gJC5ub0NvbmZsaWN0KCk7CiAgICB2YXIgdmVyc2lvbiA9IEdNX2luZm8uc2NyaXB0LnZlcnNpb247CiAgICAvLyBZb3VyIGNvZGUgaGVyZS4uLgoKICAgIC8v5riF6Zmk5Lu75YqhIOiLpeW3peS9nOS4jeato+W4uO+8jOaKiuS4i+mdouS4ieihjOazqOmHiuaJk+W8gOmaj+S+v+aJk+W8gOS4gOS4que9kemhte+8jOeEtuWQjuWGjeazqOmHiuS4iuWNs+WPrwogICAgLy8gR01fc2V0VmFsdWUoJ29ial9wbGFucycsIG51bGwpOwogICAgLy8gR01fc2V0VmFsdWUoJ3ZpcnR1YWxDb29raWUnLCBudWxsKTsKICAgIC8vIHJldHVybgoKICAgIHZhciBvYmogPSB7fTsKICAgIHZhciBxdWVyeV9pdGVtX2xpc3QgPSAnJzsKICAgIHZhciBxdWVyeV9kYXRhX2xpc3RfYmFjayA9ICcnOwogICAgdmFyIGNoZWNrX3VybCA9ICcnOwogICAgdmFyIHN0b3AgPSAnJzsKCiAgICAvL+WKoOi9veWxj+iUvee9keWdgAogICAgdmFyIGJsb2NrVXJsID0gR01fZ2V0VmFsdWUoJ2Jsb2NrVXJsJywgJycpOwogICAgY29uc29sZS5sb2coYmxvY2tVcmwpOwogICAgdmFyIHBhc3NVcmwgPSBHTV9nZXRWYWx1ZSgncGFzc1VybCcsICcnKTsKICAgIGNvbnNvbGUubG9nKHBhc3NVcmwpOwogICAgdmFyIEJXbGlzdF9zZWwgPSBHTV9nZXRWYWx1ZSgnQldsaXN0X3NlbCcsICcnKTsKICAgIGlmIChCV2xpc3Rfc2VsID09ICcnKSB7CiAgICAgICAgR01fc2V0VmFsdWUoJ0JXbGlzdF9zZWwnLCAnd2hpdGVfbW9kZScpOwogICAgICAgIEJXbGlzdF9zZWwgPSAnd2hpdGVfbW9kZSc7CiAgICB9CiAgICAvLyBCV2xpc3Rfc2VsID0gJ3doaXRlX21vZGUnOwogICAgLy8jcmVnaW9uIGNzc+agt+W8jwogICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgIHN0eWxlLnR5cGUgPSAidGV4dC9jc3MiOwogICAgc3R5bGUuaW5uZXJIVE1MID0gJy5jb3Vwb24td3JhcHttYXJnaW46MTBweCAwIDVweCAwO2NvbG9yOiNmZmZ9LmNvdXBvbi13cmFwLXJte21hcmdpbjoxcHggMCA1cHggMDtvdmVyZmxvdzpoaWRkZW47Y29sb3I6IzAwMH0uY291cG9uLXdyYXAtcXJ7bWFyZ2luOjFweCAwIDhweCAwO292ZXJmbG93OmhpZGRlbjtjb2xvcjojMDAwfS5jb3Vwb24td3JhcC10cmVuZHttYXJnaW46MXB4IDAgMCAwO292ZXJmbG93OmhpZGRlbjtjb2xvcjojMDAwO2Rpc3BsYXk6bm9uZX0uY291cG9uLXdyYXAtcHJpY2V7bWFyZ2luOjFweCAwIDAgMDtvdmVyZmxvdzpoaWRkZW47Y29sb3I6IzAwMH0uY291cG9uLXdyYXAtdHJlbmR7bWFyZ2luOjFweCAwIDAgMDtvdmVyZmxvdzpoaWRkZW47Y29sb3I6IzAwMDtkaXNwbGF5Om5vbmV9LmNvdXBvbi13cmFwIC5jb3Vwb257YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQoMTUwZGVnLCNmOTAsI2Y2OSk7ZGlzcGxheTppbmxpbmUtZmxleDtjb2xvcjp3aGl0ZTtwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czouM3JlbTtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czouM3JlbTtvdmVyZmxvdzpoaWRkZW59LmNvdXBvbi13cmFwIC5jb3Vwb246OmJlZm9yZXtsZWZ0Oi03cHg7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxNHB4O2JhY2tncm91bmQtaW1hZ2U6cmFkaWFsLWdyYWRpZW50KHdoaXRlIDAsd2hpdGUgNHB4LHRyYW5zcGFyZW50IDRweCk7YmFja2dyb3VuZC1zaXplOjE0cHggMTRweDt6LWluZGV4OjE7YmFja2dyb3VuZC1wb3NpdGlvbjowIDJweDtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteX0uY291cG9uLXdyYXAgLmNvdXBvbiAuY291cG9uLWluZm97Ym9yZGVyLXJpZ2h0OjJweCBkYXNoZWQgd2hpdGU7cGFkZGluZy1sZWZ0OjIwcHg7cGFkZGluZy10b3A6MjBweDtwYWRkaW5nLWJvdHRvbToyMHB4O3Bvc2l0aW9uOnJlbGF0aXZlO21pbi13aWR0aDoyMDBweDtmb250LXNpemU6MTRweH0uY291cG9uLXdyYXAgLmNvdXBvbiAuY291cG9uLWluZm86OmJlZm9yZSwuY291cG9uLXdyYXAgLmNvdXBvbiAuY291cG9uLWluZm86OmFmdGVye2NvbnRlbnQ6IiI7d2lkdGg6MjBweDtoZWlnaHQ6MjBweDtiYWNrZ3JvdW5kLWNvbG9yOndoaXRlO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi0xMXB4O2JvcmRlci1yYWRpdXM6NTAlfS5jb3Vwb24td3JhcCAuY291cG9uIC5jb3Vwb24taW5mbzo6YmVmb3Jle3RvcDotMTBweH0uY291cG9uLXdyYXAgLmNvdXBvbiAuY291cG9uLWluZm86OmFmdGVye2JvdHRvbTotMTBweH0uY291cG9uLXdyYXAgLmNvdXBvbiAuY291cG9uLWluZm8gLmNvdXBvbi1kZXNje2ZvbnQtc2l6ZToxOHB4fS5jb3Vwb24td3JhcCAuY291cG9uIC5jb3Vwb24tZ2V0e2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjEwMHB4O3Bvc2l0aW9uOnJlbGF0aXZlO2ZvbnQtc2l6ZToyMHB4O2NvbG9yOiNmZmY7cGFkZGluZzoyMHB4fSN0Yi1jb29sLWFyZWF7Ym9yZGVyOjFweCBzb2xpZCAjZWVlO21hcmdpbjowIGF1dG87cG9zaXRpb246cmVsYXRpdmU7Y2xlYXI6Ym90aDtkaXNwbGF5Om5vbmV9I3RiLWNvb2wtYXJlYSAudGItY29vbC1hcmVhLWhvbWV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjVweDtyaWdodDoxMHB4O3otaW5kZXg6ODh9I3RiLWNvb2wtYXJlYSAudGItY29vbC1hcmVhLWhvbWUgYXtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNTE1ODU4O2ZvbnQtc2l6ZToxMHB4O3RleHQtZGVjb3JhdGlvbjpub25lfSN0Yi1jb29sLWFyZWEgLnRiLWNvb2wtYXJlYS1ob21lIGEubmV3LXZlcnNpb257Y29sb3I6I2ZmMDAzNn0jdGItY29vbC1hcmVhIC50Yi1jb29sLWFyZWEtYmVuZWZpdHt3aWR0aDoyNDBweDtmbG9hdDpsZWZ0fSN0Yi1jb29sLWFyZWEgLnRiLWNvb2wtYXJlYS1iZW5lZml0IC50Yi1jb29sLXF1YW4tcXJjb2Rle3RleHQtYWxpZ246Y2VudGVyO21pbi1oZWlnaHQ6MTUwcHg7bWFyZ2luLXRvcDo0MHB4fSN0Yi1jb29sLWFyZWEgLnRiLWNvb2wtYXJlYS1iZW5lZml0IC50Yi1jb29sLXF1YW4tcXJjb2RlIGNhbnZhcywjdGItY29vbC1hcmVhIC50Yi1jb29sLWFyZWEtYmVuZWZpdCAudGItY29vbC1xdWFuLXFyY29kZSBpbWd7bWFyZ2luOjAgYXV0b30jdGItY29vbC1hcmVhIC50Yi1jb29sLWFyZWEtYmVuZWZpdCAudGItY29vbC1xdWFuLXRpdGxle21hcmdpbi10b3A6MjBweDtjb2xvcjojMDAwO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LWFsaWduOmNlbnRlcn0jdGItY29vbC1hcmVhIC50Yi1jb29sLWFyZWEtYmVuZWZpdCAudGItY29vbC1xdWFuLXRpdGxlIHNwYW57Y29sb3I6I2ZmMDAzNjtmb250LXdlaWdodDo3MDB9I3RiLWNvb2wtYXJlYSAudGItY29vbC1hcmVhLWJlbmVmaXQgLnRiLWNvb2wtcXVhbi1hY3Rpb257bWFyZ2luLXRvcDoxMHB4O3RleHQtYWxpZ246Y2VudGVyfSN0Yi1jb29sLWFyZWEgLnRiLWNvb2wtYXJlYS1iZW5lZml0IC50Yi1jb29sLXF1YW4tYWN0aW9uIGF7dGV4dC1kZWNvcmF0aW9uOm5vbmV9I3RiLWNvb2wtYXJlYSAudGItY29vbC1hcmVhLWJlbmVmaXQgLnRiLWNvb2wtcXVhbi1hY3Rpb24gLnRiLWNvb2wtcXVhbi1idXR0b257bWluLXdpZHRoOjEyMHB4O3BhZGRpbmc6MCA4cHg7bGluZS1oZWlnaHQ6MzVweDtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2ZmMDAzNjtmb250LXNpemU6MTNweDtmb250LXdlaWdodDo3MDA7bGV0dGVyLXNwYWNpbmc6MS41cHg7bWFyZ2luOjAgYXV0bzt0ZXh0LWFsaWduOmNlbnRlcjtib3JkZXItcmFkaXVzOjE1cHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7Y3Vyc29yOnBvaW50ZXJ9I3RiLWNvb2wtYXJlYSAudGItY29vbC1hcmVhLWJlbmVmaXQgLnRiLWNvb2wtcXVhbi1hY3Rpb24gLnRiLWNvb2wtcXVhbi1idXR0b24ucXVhbi1ub25le2NvbG9yOiMwMDA7YmFja2dyb3VuZDojYmVjNWM1fSN0Yi1jb29sLWFyZWEgLnRiLWNvb2wtYXJlYS1oaXN0b3J5e2hlaWdodDozMDBweDtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9I3RiLWNvb2wtYXJlYSAudGItY29vbC1hcmVhLWhpc3RvcnkgI3RiLWNvb2wtYXJlYS1jaGFydCwjdGItY29vbC1hcmVhIC50Yi1jb29sLWFyZWEtaGlzdG9yeSAudGItY29vbC1hcmVhLWNvbnRhaW5lcnt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfSN0Yi1jb29sLWFyZWEgLnRiLWNvb2wtYXJlYS1oaXN0b3J5IC50Yi1jb29sLWhpc3RvcnktdGlwe3Bvc2l0aW9uOmFic29sdXRlO21hcmdpbjowO3RvcDo1MCU7bGVmdDo1MCU7bGV0dGVyLXNwYWNpbmc6MXB4O2ZvbnQtc2l6ZToxNXB4O3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSl9I3RiLWNvb2wtYXJlYSAudGItY29vbC1hcmVhLXRhYmxle21hcmdpbi10b3A6MTBweDtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW59I3RiLWNvb2wtYXJlYSAudGItY29vbC1xdWFuLXRpcHtwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW46MDt0b3A6NTAlO2xlZnQ6NTAlO2xldHRlci1zcGFjaW5nOjFweDtmb250LXNpemU6MTVweDtvcGFjaXR5OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKX0jdGItY29vbC1hcmVhIC50Yi1jb29sLXF1YW4tdGlwIGF7Y29sb3I6IzMzMztmb250LXdlaWdodDo0MDA7dGV4dC1kZWNvcmF0aW9uOm5vbmV9I3RiLWNvb2wtYXJlYSAudGItY29vbC1xdWFuLXRpcCBhOmhvdmVye2NvbG9yOiNmZjAwMzZ9I3RiLWNvb2wtYXJlYSAudGItY29vbC1hcmVhLXRhYmxlIC50Yi1jb29sLXF1YW4tdGFibGV7d2lkdGg6MTAwJTtmb250LXNpemU6MTRweDt0ZXh0LWFsaWduOmNlbnRlcn0jdGItY29vbC1hcmVhIC50Yi1jb29sLWFyZWEtdGFibGUgLnRiLWNvb2wtcXVhbi10YWJsZSB0ciB0ZHtwYWRkaW5nOjRweDtjb2xvcjojMWMyMzIzO2JvcmRlci10b3A6MXB4IHNvbGlkICNlZWU7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNlZWV9I3RiLWNvb2wtYXJlYSAudGItY29vbC1hcmVhLXRhYmxlIC50Yi1jb29sLXF1YW4tdGFibGUgdHIgdGQgc3Bhbntjb2xvcjojZmYwMDM2O2ZvbnQtd2VpZ2h0OjcwMH0jdGItY29vbC1hcmVhIC50Yi1jb29sLWFyZWEtdGFibGUgLnRiLWNvb2wtcXVhbi10YWJsZSB0ciB0ZDpmaXJzdC1jaGlsZHtib3JkZXItbGVmdDpub25lfSN0Yi1jb29sLWFyZWEgLnRiLWNvb2wtYXJlYS10YWJsZSAudGItY29vbC1xdWFuLXRhYmxlIC50Yi1jb29sLXF1YW4tbGlua3t3aWR0aDo2MHB4O2xpbmUtaGVpZ2h0OjI0cHg7Zm9udC1zaXplOjEycHg7YmFja2dyb3VuZDojZmYwMDM2O3RleHQtZGVjb3JhdGlvbjpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrfSN0Yi1jb29sLWFyZWEgLnRiLWNvb2wtYXJlYS10YWJsZSAudGItY29vbC1xdWFuLXRhYmxlIC50Yi1jb29sLXF1YW4tbGluay1lbmFibGV7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6I2ZmZn0jdGItY29vbC1hcmVhIC50Yi1jb29sLWFyZWEtdGFibGUgLnRiLWNvb2wtcXVhbi10YWJsZSAudGItY29vbC1xdWFuLWxpbmstZGlzYWJsZXtjdXJzb3I6ZGVmYXVsdDtjb2xvcjojMDAwO2JhY2tncm91bmQ6I2NjY30jdGItY29vbC1hcmVhIC50Yi1jb29sLXF1YW4tZW1wdHkgLnRiLWNvb2wtcXVhbi10aXB7b3BhY2l0eToxfSN0Yi1jb29sLWFyZWEgLnRiLWNvb2wtcXVhbi1lbXB0eSAudGItY29vbC1xdWFuLXRhYmxle2ZpbHRlcjpibHVyKDNweCk7LXdlYmtpdC1maWx0ZXI6Ymx1cigzcHgpOy1tb3otZmlsdGVyOmJsdXIoM3B4KTstbXMtZmlsdGVyOmJsdXIoM3B4KX0udGItY29vbC1ib3gtYXJlYXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MjBweDtyaWdodDowO3otaW5kZXg6ODd9LnRiLWNvb2wtYm94LWFyZWEtcm17cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwcHg7cmlnaHQ6MDt6LWluZGV4Ojg3fScgKwogICAgICAgICcudGItY29vbC1ib3gtd2FpdHtjdXJzb3I6cG9pbnRlcn0udGItY29vbC1ib3gtd2FpdC1ybXtjdXJzb3I6cG9pbnRlcn0udGItY29vbC1ib3gtYWxyZWFkeXtwb3NpdGlvbjpyZWxhdGl2ZX0udGItY29vbC1ib3gtaW5mb3t3aWR0aDphdXRvIWltcG9ydGFudDtoZWlnaHQ6YXV0byFpbXBvcnRhbnQ7cGFkZGluZzo2cHggOHB4IWltcG9ydGFudDtmb250LXNpemU6MTJweDtjb2xvcjojZmZmIWltcG9ydGFudDtib3JkZXItcmFkaXVzOjE1cHggMCAwIDE1cHg7Y3Vyc29yOnBvaW50ZXI7dXNlci1zZWxlY3Q6bm9uZX0udGItY29vbC1ib3gtaW5mbywudGItY29vbC1ib3gtaW5mbzpob3ZlciwudGItY29vbC1ib3gtaW5mbzp2aXNpdGVke3RleHQtZGVjb3JhdGlvbjpub25lIWltcG9ydGFudH0udGItY29vbC1ib3gtaW5mby1kZWZhdWx0e2JhY2tncm91bmQ6IzMxODZmZCFpbXBvcnRhbnR9LnRiLWNvb2wtYm94LWluZm8tZmluZHtiYWNrZ3JvdW5kOiNmZjAwMzYhaW1wb3J0YW50fS50Yi1jb29sLWJveC1pbmZvLWZpbmQtcm17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQoI2ZmZDAwMCwjZmNlYTllKSFpbXBvcnRhbnQ7Y29sb3I6IzAwMCFpbXBvcnRhbnR9LnRiLWNvb2wtYm94LWluZm8tZW1wdHl7Y29sb3I6IzAwMCFpbXBvcnRhbnQ7YmFja2dyb3VuZDojY2NjIWltcG9ydGFudH0udGItY29vbC1ib3gtaW5mby10cmFuc2x1Y2VudHtvcGFjaXR5Oi4zM30ubXVpLXplYnJhLW1vZHVsZSAudGItY29vbC1ib3gtaW5mb3tmb250LXNpemU6MTBweH0uaW1wb3J0LXNoYW5nb3UtaXRlbWNlbGwgLnRiLWNvb2wtYm94LWFyZWEsLnplYnJhLXppeWluZy1xaWFuZ2dvdSAudGItY29vbC1ib3gtYXJlYXtyaWdodDoxMHB4O2xlZnQ6YXV0b30uaXRlbV9zX2NwYiAudGItY29vbC1ib3gtYXJlYXt0b3A6YXV0bztib3R0b206MTBweH0uai1tZHYtY2hhb3NoaSAubS1mbG9vciAudGItY29vbC1ib3gtYXJlYSBhe3dpZHRoOmF1dG87aGVpZ2h0OmF1dG99LmxlZnQtd2lkZXIgLnByb2luZm8tbWFpbnttYXJnaW4tYm90dG9tOjQwcHh9LmRldGFpbEhkIC5tLWluZm97bWFyZ2luLWJvdHRvbToyMHB4fS50Yi1jb29sLXF1YW4tZGF0ZXtjb2xvcjojMjMzYjNkO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTJweH0udGItY29vbC1hcmVhLWhhcy1kYXRlIC50Yi1jb29sLXF1YW4tcXJjb2Rle21hcmdpbi10b3A6MzBweCFpbXBvcnRhbnR9LnRiLWNvb2wtYXJlYS1oYXMtZGF0ZSAudGItY29vbC1xdWFuLXRpdGxle21hcmdpbi10b3A6MTBweCFpbXBvcnRhbnR9LnJtLWRpdnstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKTtsaW5lLWhlaWdodDoxLjQyODU3MTQzO2NvbG9yOiMzMzM7Zm9udC1zaXplOjEycHghaW1wb3J0YW50O2ZvbnQtZmFtaWx5OiJPcGVuIFNhbnMiLEFyaWFsLHNhbnMtc2VyaWY7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlO21pbi1oZWlnaHQ6MXB4O3BhZGRpbmctcmlnaHQ6MTVweDtwYWRkaW5nLWxlZnQ6MDtmbG9hdDpsZWZ0O3dpZHRoOjM1MHB4fS5ybS1kaXYgc3Bhbnstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKTtmb250LWZhbWlseToiT3BlbiBTYW5zIixBcmlhbCxzYW5zLXNlcmlmO2JveC1zaXppbmc6Ym9yZGVyLWJveDt0ZXh0LWRlY29yYXRpb246bm9uZTttYXJnaW4tYm90dG9tOjA7Zm9udC13ZWlnaHQ6bm9ybWFsO3RleHQtYWxpZ246bGVmdDt3aGl0ZS1zcGFjZTpub3dyYXA7dmVydGljYWwtYWxpZ246bWlkZGxlO3RvdWNoLWFjdGlvbjptYW5pcHVsYXRpb247dXNlci1zZWxlY3Q6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZmZkMDAwO3BhZGRpbmc6MCAwIDAgOHB4O2xpbmUtaGVpZ2h0OjMwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MjE1cHg7bGV0dGVyLXNwYWNpbmc6LjZweDtmb250LXNpemU6MTZweDstd2Via2l0LWZvbnQtc21vb3RoaW5nOnN1YnBpeGVsLWFudGlhbGlhc2VkO3RyYW5zaXRpb246Ym9yZGVyIC4yNXMgbGluZWFyLGNvbG9yIC4yNXMgbGluZWFyLGJhY2tncm91bmQtY29sb3IgLjI1cyBsaW5lYXI7Y29sb3I6IzAwMDtib3JkZXI6MDtib3JkZXItcmFkaXVzOjk5cHggMCAwIDk5cHg7ZmxvYXQ6bGVmdH0ucm0tZGl2IC5ybS1idG57LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsMCk7Zm9udC1mYW1pbHk6Ik9wZW4gU2FucyIsQXJpYWwsc2Fucy1zZXJpZjtib3gtc2l6aW5nOmJvcmRlci1ib3g7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bWFyZ2luLWJvdHRvbTowO2ZvbnQtd2VpZ2h0Om5vcm1hbDt0ZXh0LWFsaWduOmxlZnQ7d2hpdGUtc3BhY2U6bm93cmFwO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt0b3VjaC1hY3Rpb246bWFuaXB1bGF0aW9uO2N1cnNvcjpwb2ludGVyO3VzZXItc2VsZWN0Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lO2JhY2tncm91bmQtY29sb3I6I2ZmZDAwMDtwYWRkaW5nOjAgMCAwIDhweDtsaW5lLWhlaWdodDozMHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEyMHB4O2xldHRlci1zcGFjaW5nOi42cHg7Zm9udC1zaXplOjE2cHg7LXdlYmtpdC1mb250LXNtb290aGluZzpzdWJwaXhlbC1hbnRpYWxpYXNlZDt0cmFuc2l0aW9uOmJvcmRlciAuMjVzIGxpbmVhcixjb2xvciAuMjVzIGxpbmVhcixiYWNrZ3JvdW5kLWNvbG9yIC4yNXMgbGluZWFyO2NvbG9yOiMwMDA7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czo5OXB4IDAgMCA5OXB4O2Zsb2F0OmxlZnQ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6MCA5OXB4IDk5cHggMDtib3JkZXI6MXB4IHNvbGlkICNjMmJhYmE7cGFkZGluZzowIDAgMCA4cHg7bGluZS1oZWlnaHQ6MjguMnB4fS5ybS1kaXYgLnRyZW5kLWJ0bnstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgwLDAsMCwwKTtmb250LWZhbWlseToiT3BlbiBTYW5zIixBcmlhbCxzYW5zLXNlcmlmO2JveC1zaXppbmc6Ym9yZGVyLWJveDt0ZXh0LWRlY29yYXRpb246bm9uZTtmb250LXdlaWdodDpub3JtYWw7dGV4dC1hbGlnbjpsZWZ0O3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7dG91Y2gtYWN0aW9uOm1hbmlwdWxhdGlvbjtjdXJzb3I6cG9pbnRlcjt1c2VyLXNlbGVjdDpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMzYhaW1wb3J0YW50O3BhZGRpbmc6MCAwIDAgOHB4O2xpbmUtaGVpZ2h0OjMwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTQwcHg7bGV0dGVyLXNwYWNpbmc6LjZweDtmb250LXNpemU6MTZweDstd2Via2l0LWZvbnQtc21vb3RoaW5nOnN1YnBpeGVsLWFudGlhbGlhc2VkO3RyYW5zaXRpb246Ym9yZGVyIC4yNXMgbGluZWFyLGNvbG9yIC4yNXMgbGluZWFyLGJhY2tncm91bmQtY29sb3IgLjI1cyBsaW5lYXI7Y29sb3I6I2ZmZjtib3JkZXI6MDtib3JkZXItcmFkaXVzOjk5cHggOTlweCA5OXB4IDk5cHghaW1wb3J0YW50O2Zsb2F0OmxlZnQ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6MCA5OXB4IDk5cHggMDtwYWRkaW5nOjAgMCAwIDhweDtsaW5lLWhlaWdodDoyN3B4fS5ybS1kaXYgLnRyZW5kLWJ0bi1pbWd7bWF4LWhlaWdodDoxNXB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZSFpbXBvcnRhbnR9LmZsb2F0X2Rpdnt3aWR0aDoyMDBweDtoZWlnaHQ6MjAwcHg7YmFja2dyb3VuZC1jb2xvcjpyZWQ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjEwMHB4O2xlZnQ6MTAwcHg7ZmxvYXQ6bGVmdDt6LWluZGV4Ojk5OTk5fS5xci1jb2RlLWRpdnt3aWR0aDo0NDBweDtib3JkZXItcmFkaXVzOjEwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2t9LnRyZW5kLWRpdnt3aWR0aDo0NDBweDtib3JkZXItcmFkaXVzOjEwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2t9I3FyY29kZXtkaXNwbGF5OmlubGluZX0ucXItY29kZS1kaXYgLnRpdGxle2Zsb2F0OnJpZ2h0O2ZvbnQtc2l6ZToxM3B4O3dpZHRoOjI4MHB4fS5xci1jb2RlLWRpdiAuZm9vdHtmb250LXNpemU6MTJweDt0ZXh0LWFsaWduOm1pZGRsZTt3aWR0aDoxMDAlfS5xci1jb2RlLWRpdiAucXItaW1ne2hlaWdodDoxNTBweDt3aWR0aDoxNTBweH0uZnJhbWVfZGl2e3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjcwMHB4O2hlaWdodDo0NTBweDt6LWluZGV4Ojk5OTk5OTk5OTtkaXNwbGF5Om5vbmU7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6MTBweDtib3JkZXI6MXB4IHNvbGlkICNjMmJhYmE7cGFkZGluZzoxNXB4O2xlZnQ6MDt0b3A6MDtyaWdodDowO2JvdHRvbTowOy13ZWJraXQtYm94LXNoYWRvdzojNjY2IDAgMCAxMHB4Oy1tb3otYm94LXNoYWRvdzojNjY2IDAgMCAxMHB4O2JveC1zaGFkb3c6IzY2NiAwIDAgMTBweH0jaWZyYW1lX2NoZWNre3Bvc2l0aW9uOnJlbGF0aXZlO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmltYWdlLXN0YXR1c3ttYXJnaW4tbGVmdDoxMHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSk7aGVpZ2h0OjIwcHh9LnN0YXR1cy1zcGFue21hcmdpbi1sZWZ0OjM1cHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0uZnJhbWVfZGl2IC5jb3Zlcntwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjEwcHg7dGV4dC1hbGlnbjpjZW50ZXI7dG9wOjA7cmlnaHQ6MDtoZWlnaHQ6ODVweDt3aWR0aDoxMDAlO2JhY2tncm91bmQtY29sb3I6I2ZmZjtmb250LXNpemU6MjBweH0uZnJhbWVfZGl2IC5jb3ZlciBpbWd7dGV4dC1hbGlnbjpjZW50ZXI7aGVpZ2h0OjQ1cHg7YmFja2dyb3VuZC1jb2xvcjojZmZmO2ZvbnQtc2l6ZTo0MHB4fS5jb3Zlci1jbG9zZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO2hlaWdodDo0MHB4O2N1cnNvcjpwb2ludGVyfScgKwogICAgICAgICcuY292ZXItY2hhcnQtc3Bhbntwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoyMDBweDtoZWlnaHQ6MjAwcHh9I2NoYXJ0e21pbi1oZWlnaHQ6MjE1cHg7bWFyZ2luLWJvdHRvbTotMjBweH0uZGl2LWhlbHBlci1ib3ggLmJ1dHlJbnB1dCwuZGl2LWhlbHBlci1ib3ggYSwuZGl2LWhlbHBlci1ib3ggc2VsZWN0e2ZvbnQtc2l6ZToxMnB4O2JvcmRlcjoxcHggc29saWQgI2NjYztwYWRkaW5nOjRweCAwO2JvcmRlci1yYWRpdXM6M3B4O3BhZGRpbmctbGVmdDo1cHg7LXdlYmtpdC1ib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDc1KTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMDc1KTstd2Via2l0LXRyYW5zaXRpb246Ym9yZGVyLWNvbG9yIGVhc2UtaW4tb3V0IC4xNXMsLXdlYmtpdC1ib3gtc2hhZG93IGVhc2UtaW4tb3V0IC4xNXM7LW8tdHJhbnNpdGlvbjpib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgLjE1cyxib3gtc2hhZG93IGVhc2UtaW4tb3V0IC4xNXM7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgZWFzZS1pbi1vdXQgLjE1cyxib3gtc2hhZG93IGVhc2UtaW4tb3V0IC4xNXN9I2ltZ1BsYW5JbmZve2hlaWdodDoxNnB4O3dpZHRoOjE2cHg7dmVydGljYWwtYWxpZ246bWlkZGxlfS5kaXYtaGVscGVyLWJveCAuYnV0eUlucHV0OmZvY3VzLC5kaXYtaGVscGVyLWJveCBhOmZvY3VzLC5kaXYtaGVscGVyLWJveCBzZWxlY3Q6Zm9jdXN7Ym9yZGVyLWNvbG9yOiMyNWE3NjU7b3V0bGluZTowOy13ZWJraXQtYm94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwwLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLDAuNik7Ym94LXNoYWRvdzppbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwwLjA3NSksMCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLDAuNil9LmRpdi1oZWxwZXItYm94e21hcmdpbi10b3A6NXB4O2ZvbnQtc2l6ZToxMnB4fS5kaXYtaGVscGVyLWJveCBidXR0b257d2lkdGg6ODBweDtoZWlnaHQ6MzVweDtib3JkZXItd2lkdGg6MDtib3JkZXItcmFkaXVzOjVweDtiYWNrZ3JvdW5kOiMyNWE3NjU7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTowO2ZvbnQtZmFtaWx5Ok1pY3Jvc29mdCBZYUhlaTtjb2xvcjp3aGl0ZTtmb250LXNpemU6MTZweH0uZGl2LWhlbHBlci1ib3ggYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6I2ZjMDtjb2xvcjpibGFja30jYnV0dG9uX2RlbFRhc2ssI2J1dHRvbl9zeW4sI2J1dHRvbl9kZWxQbGFuLCNidXR0b25fc2F2ZVRoaXNQYWdlLCNzYXZlX3RlbXBvcmFyeUJsb2NrLCN0ZW1wb3JhcnlCbG9jaywjcGFzc1RoaXNQYWdlLCNwZXJtYW5lbnRseUJsb2NrLCNidXR0b25fc2F2ZVNldHRpbmcsI2J1dHRvbl9jYXB0dXJlLCNidXR0b25fZ2V0Q3VycmVudFRpbWUsI2J1dHRvbl9uZXdQbGFuLCNpbXBvcnRGcm9tQmJzLCNzaGFyZVRvQmJzLCNidXR0b25fZWRpdFBsYW4sI2J1dHRvbl9leHBvcnRQbGFuLCNidXR0b25faW1wb3J0UGxhbntiYWNrZ3JvdW5kLWNvbG9yOiMxZTkwZmY7d2lkdGg6NzBweDtoZWlnaHQ6MjVweDtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo0MDAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnR9I3N0YXJ0X2J1eSwjcGxhbkNvbXBsZXRlZHtmb250LXdlaWdodDo0MDAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnR9LmR5bmFtaWNESVZ7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2Q2ZDZkNjtmb250LXNpemU6MTJweH0uZHluYW1pY1NwYW57dmVydGljYWwtYWxpZ246bWlkZGxlO3dpZHRoOjE1MHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzOy1vLXRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO2ZvbnQtc2l6ZToxMnB4fS5keW5hbWljSW5wdXR7dmVydGljYWwtYWxpZ246bWlkZGxlO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICMxMmJlMDI7Ym9yZGVyLXRvcDowO2JvcmRlci1sZWZ0OjA7Ym9yZGVyLXJpZ2h0OjA7d2lkdGg6MTUwcHg7Zm9udC1zaXplOjEycHh9LmR5bmFtaWNIb3N0U3BhbntkaXNwbGF5OmJsb2NrO3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiMwMDA7YmFja2dyb3VuZC1jb2xvcjojZTBmZmVmO2JvcmRlci1yYWRpdXM6MTBweH0jYnV0dG9uX2FkZF9tamR7ZGlzcGxheTpub25lO2JhY2tncm91bmQtY29sb3I6I2YzMDIxMztjb2xvcjojZmZmO3dpZHRoOjEwMHB4O2hlaWdodDoyNXB4O2ZvbnQtc2l6ZToxMnB4fSNidXR0b25fYWRkX3JlZnJlc2h7YmFja2dyb3VuZC1jb2xvcjojZjMwMjEzO2NvbG9yOiNmZmY7d2lkdGg6ODBweDtoZWlnaHQ6MjVweDtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo0MDAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnR9LnN3YWxfaW5mbywuc3dhbC1vdmVybGF5e3otaW5kZXg6OTk5OTk5OTk5OX0gLnN3YWxfaW5mbyAuc3dhbC1vdmVybGF5e3otaW5kZXg6OTk5OTk5OTk5O30uc3dhbF9pbmZvIC5zd2FsLW1vZGFse3otaW5kZXg6OTk5OTk5OTk5O2JhY2tncm91bmQtY29sb3I6cmdiYSg2MywyNTUsMTA2LDAuNjkpO2JvcmRlcjozcHggc29saWQgd2hpdGV9LnN3YWxfaW5mbyAuc3dhbC10aXRsZXttYXJnaW46MDtmb250LXNpemU6MTZweDtib3gtc2hhZG93OjAgMXB4IDFweCByZ2JhKDAsMCwwLDAuMjEpO21hcmdpbi1ib3R0b206MjhweDtiYWNrZ3JvdW5kLWNvbG9yOiNmYzA7Y29sb3I6IzAwMDtib3JkZXItcmFkaXVzOjVweCA1cHggMCAwfS5zd2FsX2luZm8gLnN3YWwtdGV4dHtiYWNrZ3JvdW5kLWNvbG9yOiNlZGZmZWI7cGFkZGluZzoxN3B4O2JvcmRlcjoxcHggc29saWQgIzAwMDtkaXNwbGF5OmJsb2NrO21hcmdpbjoyMnB4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiMyNWE3NjU7Ym9yZGVyLXJhZGl1czo1cHg7Zm9udC13ZWlnaHQ6NjAwO3RleHQtYWxpZ246bGVmdH0uc3dhbF9pbmZvIC5zd2FsLWZvb3RlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNWY4ZmE7bWFyZ2luLXRvcDozMnB4O2JvcmRlci10b3A6MXB4IHNvbGlkICNlOWVlZjE7b3ZlcmZsb3c6aGlkZGVufS5zd2FsX2luZm8gLnN3YWwtYnV0dG9uLS1jb25maXJte2JhY2tncm91bmQtY29sb3I6I2YzMDIxM30jZmxvYXRfYXNzaXN0YW50e3BhZGRpbmc6M3B4O2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4O2JvcmRlci1yYWRpdXM6MTBweDtwb3NpdGlvbjpmaXhlZDt0b3A6OGVtO3JpZ2h0OjFlbTt0ZXh0LWFsaWduOmxlZnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7ei1pbmRleDo5OTk5OTk5O2JveC1zaGFkb3c6MCAwIDE1cHggIzRlNGU0ZX0gLmNhbGxvdXR7ei1pbmRleDo5OTk7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTUwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZjgyODAwO2JhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjVweDttYXJnaW4tdG9wOi41ZW0gIWltcG9ydGFudDt0ZXh0LWFsaWduOmNlbnRlcn0uY2FsbG91dDo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6ICNmNjc5MmY7ei1pbmRleDotMTtjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDotLjQxZW07bGVmdDozMHB4O3BhZGRpbmc6LjM1ZW07Ym9yZGVyOmluaGVyaXQ7Ym9yZGVyLXJpZ2h0OjA7Ym9yZGVyLWJvdHRvbTowO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfScKICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIikuaXRlbSgwKS5hcHBlbmRDaGlsZChzdHlsZSk7CgogICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgIHN0eWxlLnR5cGUgPSAidGV4dC9jc3MiOwogICAgc3R5bGUuaW5uZXJIVE1MID0gJ0BjaGFyc2V0ICJ1dGYtOCI7LmRlbW97d2lkdGg6NDEwcHg7bWFyZ2luOjAgYXV0b30uc3RhbXAgKntwYWRkaW5nOjA7bWFyZ2luOjA7bGlzdC1zdHlsZTpub25lO2ZvbnQtZmFtaWx5OiJNaWNyb3NvZnQgWWFIZWkiLCJTb3VyY2UgQ29kZSBQcm8iLE1lbmxvLENvbnNvbGFzLE1vbmFjbyxtb25vc3BhY2V9LnN0YW1we3dpZHRoOjM0MHB4O2hlaWdodDoxMTBweDtwYWRkaW5nOjAgMTBweDtwb3NpdGlvbjpyZWxhdGl2ZTt9LnN0YW1wOmJlZm9yZXtjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MTBweDtyaWdodDoxMHB4O3otaW5kZXg6LTF9LnN0YW1wIGl7cG9zaXRpb246YWJzb2x1dGU7bGVmdDoyMCU7dG9wOjQ1cHg7aGVpZ2h0OjE5MHB4O3dpZHRoOjM5MHB4O2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTUpO3RyYW5zZm9ybTpyb3RhdGUoLTMwZGVnKTtwb2ludGVyLWV2ZW50czpub25lfS5zdGFtcCAucGFye2Zsb2F0OmxlZnQ7cGFkZGluZzoxMHB4IDEwcHg7d2lkdGg6MTgwcHg7Ym9yZGVyLXJpZ2h0OjJweCBkYXNoZWQgcmdiYSgyNTUsMjU1LDI1NSwuMyk7dGV4dC1hbGlnbjpsZWZ0O2hlaWdodDo5MHB4fS5zdGFtcCAucGFyIHB7Y29sb3I6I2ZmZjtmb250LXNpemU6MTZweDtsaW5lLWhlaWdodDoyMXB4fS5zdGFtcCAucGFyIHNwYW57Zm9udC1zaXplOjQwcHg7Y29sb3I6I2ZmZjttYXJnaW4tcmlnaHQ6NXB4O2xpbmUtaGVpZ2h0OjY1cHh9LnN0YW1wIC5wYXIgLnNpZ257Zm9udC1zaXplOjI1cHh9LnN0YW1wIC5wYXIgc3Vie3Bvc2l0aW9uOnJlbGF0aXZlO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjgpfS5zdGFtcCAuY29weXtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjIxcHggMTRweDt3aWR0aDoxMDBweDt2ZXJ0aWNhbC1hbGlnbjp0ZXh0LWJvdHRvbTtmb250LXNpemU6MzBweDtjb2xvcjojZmZmO3RleHQtYWxpZ246Y2VudGVyO2xpbmUtaGVpZ2h0OmluaXRpYWx9LnN0YW1wIC5jb3B5IHB7Zm9udC1zaXplOjE2cHg7bWFyZ2luLXRvcDoxNXB4fS5zdGFtcDAxe2JhY2tncm91bmQ6cmFkaWFsLWdyYWRpZW50KHJnYmEoMCwwLDAsMCkgMCxyZ2JhKDAsMCwwLDApIDVweCwjZjM5YjAwIDVweCk7YmFja2dyb3VuZC1zaXplOjE1cHggMTVweDtiYWNrZ3JvdW5kLXBvc2l0aW9uOjlweCAzcHh9LnN0YW1wMDE6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6I2YzOWIwMH0uc3RhbXAwMntiYWNrZ3JvdW5kOnJhZGlhbC1ncmFkaWVudCh0cmFuc3BhcmVudCAwLHRyYW5zcGFyZW50IDVweCwjZDI0MTYxIDVweCk7YmFja2dyb3VuZC1zaXplOjE1cHggMTVweDtiYWNrZ3JvdW5kLXBvc2l0aW9uOjlweCAzcHh9LnN0YW1wMDI6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6I2QyNDE2MX0uc3RhbXAwM3tiYWNrZ3JvdW5kOnJhZGlhbC1ncmFkaWVudCh0cmFuc3BhcmVudCAwLHRyYW5zcGFyZW50IDVweCwjN2VhYjFlIDVweCk7YmFja2dyb3VuZC1zaXplOjE1cHggMTVweDtiYWNrZ3JvdW5kLXBvc2l0aW9uOjlweCAzcHh9LnN0YW1wMDM6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6IzdlYWIxZX0uc3RhbXAwMyAuY29weXtwYWRkaW5nOjEwcHggNnB4IDEwcHggMTJweDtmb250LXNpemU6MjRweH0uc3RhbXAwMyAuY29weSBwe2ZvbnQtc2l6ZToxNHB4O21hcmdpbi10b3A6NXB4O21hcmdpbi1ib3R0b206OHB4fS5zdGFtcDAzIC5jb3B5IGF7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMzMzM7Zm9udC1zaXplOjE0cHg7dGV4dC1kZWNvcmF0aW9uOm5vbmU7cGFkZGluZzo1cHggMTBweDtib3JkZXItcmFkaXVzOjNweDtkaXNwbGF5OmJsb2NrfS5zdGFtcDA0e3dpZHRoOjMyMHB4O2JhY2tncm91bmQ6cmFkaWFsLWdyYWRpZW50KHJnYmEoMCwwLDAsMCkgMCxyZ2JhKDAsMCwwLDApIDRweCwjZjU2MTBiIDRweCk7Ym9yZGVyLXJhZGl1czozcHh9LnN0YW1wMDQ6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6I2Y1NjEwYjtsZWZ0OjVweDtyaWdodDo1cHh9LnN0YW1wMDQgLmNvcHl7cGFkZGluZzo4cHggNHB4IDhweCAxMHB4O2ZvbnQtc2l6ZToyMHB4fS5zdGFtcDA0IC5jb3B5IHB7Zm9udC1zaXplOjEycHg7bWFyZ2luLXRvcDozcHg7bWFyZ2luLWJvdHRvbTo1cHh9LnN0YW1wMDQgLmNvcHkgYXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzMzMztmb250LXNpemU6MTRweDt0ZXh0LWRlY29yYXRpb246bm9uZTtwYWRkaW5nOjVweCAxMHB4O2JvcmRlci1yYWRpdXM6M3B4O2Rpc3BsYXk6YmxvY2s7ei1pbmRleDoyMDB9JzsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIikuaXRlbSgwKS5hcHBlbmRDaGlsZChzdHlsZSk7CgogICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgIHN0eWxlLnR5cGUgPSAidGV4dC9jc3MiOwogICAgc3R5bGUuaW5uZXJIVE1MID0gJ2Rpdi5jYXJkLXRhYnMtYmFyIGF7cGFkZGluZzo1cHg7cGFkZGluZy1ib3R0b206MXB4O2JvcmRlcjoxcHggc29saWQgdHJhbnNwYXJhbnQ7Y29sb3I6IzU3NWI2Njt0ZXh0LWRlY29yYXRpb246bm9uZTttYXJnaW4tbGVmdDo1cHg7b3V0bGluZTowfWRpdi5jYXJkLXRhYnMtYmFyIGE6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MTBweH1kaXYuY2FyZC10YWJzLWJhciBhOmhvdmVye3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9ZGl2LmNhcmQtdGFicy1iYXIgYS5hY3RpdmV7Ym9yZGVyLWJvdHRvbTowO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2NvbG9yOmJsYWNrO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyLXJhZGl1czo0cHggNHB4IDAgMDtwYWRkaW5nLXRvcDo2cHg7bWFyZ2luLWJvdHRvbTotMTBweDtiYWNrZ3JvdW5kOiNmZmZ9ZGl2LmNhcmQtdGFicy1iYXIgYS5hY3RpdmU6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9ZGl2LmNhcmQtdGFicy1iYXIudGl0bGVze21hcmdpbi10b3A6LTEwcHh9ZGl2LmNhcmQtdGFicy1iYXIudGl0bGVzIGF7Zm9udC1zaXplOjE3cHh9ZGl2LmNhcmQtdGFicy1zdGFjayBkaXZbZGF0YS10YWJde2Rpc3BsYXk6bm9uZTtib3JkZXItdG9wOjA7cGFkZGluZzoxMHB4fWRpdi5jYXJkLXRhYnMtc3RhY2sgZGl2W2RhdGEtdGFiXTpmaXJzdC1jaGlsZHtkaXNwbGF5OmJsb2NrfWRpdi5jYXJkLXRhYnMtYmFyLmluc2V0e2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlNWU1ZTU7Ym9yZGVyLXJhZGl1czozcHh9ZGl2LmNhcmQtdGFicy1iYXIuaW5zZXQgYS5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2JveC1zaGFkb3c6aW5zZXQgMCAwIDEwcHggcmdiYSgwLDAsMCwwLjA1KX1kaXYuY2FyZC10YWJzLXN0YWNrLmluc2V0IGRpdltkYXRhLXRhYl17cGFkZGluZzoxMHB4O2JvcmRlci10b3A6MDtib3JkZXItcmFkaXVzOjNweDtib3gtc2hhZG93Omluc2V0IDAgMCAxMHB4IHJnYmEoMCwwLDAsMC4wNSl9ZGl2LmNhcmQtdGFicy1iYXIuZ3JheWdyZWVue2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlNWU1ZTV9ZGl2LmNhcmQtdGFicy1iYXIuZ3JheWdyZWVuIGF7cGFkZGluZzoxNXB4O2JvcmRlci1yYWRpdXM6MDttYXJnaW46MDtwYWRkaW5nLWJvdHRvbToxMHB4O21hcmdpbi1ib3R0b206LTJweDtmb250LXNpemU6MTdweH1kaXYuY2FyZC10YWJzLWJhci5ncmF5Z3JlZW4gYS5hY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2JvcmRlci10b3A6NHB4IHNvbGlkICMyY2MxODV9ZGl2LmNhcmQtdGFicy1zdGFjay5ncmF5Z3JlZW4gZGl2W2RhdGEtdGFiXXtwYWRkaW5nOjEwcHg7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2JvcmRlcjoxcHggc29saWQgI2U1ZTVlNTtib3JkZXItdG9wOjB9ZGl2LmNhcmQtdGFicy1iYXIud2lraXtib3JkZXItcmFkaXVzOjA7dGV4dC1hbGlnbjpsZWZ0O2Rpc3BsYXk6aW5saW5lLWJsb2NrfWRpdi5jYXJkLXRhYnMtYmFyLndpa2kgYXtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTtib3JkZXItcmFkaXVzOjA7bWFyZ2luOjA7cGFkZGluZy1ib3R0b206MTBweDttYXJnaW4tYm90dG9tOi0xcHg7bWFyZ2luLWxlZnQ6MnB4O2ZvbnQtc2l6ZToxMnB4O2JhY2tncm91bmQ6I2ZlZmVmZTtiYWNrZ3JvdW5kOi1tb3otbGluZWFyLWdyYWRpZW50KHRvcCwjZmVmZWZlIDAsI2ZkY2Q5NyAxMDAlKTtiYWNrZ3JvdW5kOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwjZmVmZWZlIDAsI2ZkY2Q5NyAxMDAlKTtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sI2ZlZmVmZSAwLCNmZGNkOTcgMTAwJSk7Ym9yZGVyLXRvcDojZmY4NzAwIDFweCBzb2xpZDtib3JkZXItbGVmdDojZmY4NzAwIDFweCBzb2xpZDtib3JkZXItcmlnaHQ6I2ZmODcwMCAxcHggc29saWQ7Y3Vyc29yOiBwb2ludGVyfWRpdi5jYXJkLXRhYnMtYmFyLndpa2kgYTpmaXJzdC1jaGlsZHtib3JkZXItbGVmdDojZmY4NzAwIDFweCBzb2xpZDttYXJnaW4tbGVmdDowfWRpdi5jYXJkLXRhYnMtYmFyLndpa2kgYTpsYXN0LWNoaWxke2JvcmRlci1yaWdodDojZmY4NzAwIDFweCBzb2xpZH1kaXYuY2FyZC10YWJzLWJhci53aWtpIGEuYWN0aXZle2JvcmRlci10b3A6MXB4IHNvbGlkICNmZjg3MDA7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNmZjg3MDA7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZmY4NzAwO2JhY2tncm91bmQ6d2hpdGU7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgd2hpdGV9ZGl2LmNhcmQtdGFicy1zdGFjay53aWtpIGRpdltkYXRhLXRhYl17ZGlzcGxheToibm9uZSIhaW1wb3J0YW50O3dpZHRoOmZpdC1jb250ZW50O3dpZHRoOi13ZWJraXQtZml0LWNvbnRlbnQ7d2lkdGg6LW1vei1maXQtY29udGVudDtwYWRkaW5nOjEzcHg7Ym9yZGVyOjFweCBzb2xpZCAjZmY4NzAwO2JvcmRlci1yYWRpdXM6MCA4cHggOHB4IDhweDt0ZXh0LWFsaWduOmxlZnQ7YmFja2dyb3VuZC1jb2xvcjp3aGl0ZX0nOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKS5pdGVtKDApLmFwcGVuZENoaWxkKHN0eWxlKTsKICAgIC8vI2VuZHJlZ2lvbgogICAgb2JqLmdldF9kYXRlX25vd19tcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodHlwZW9mIChEYXRlLm5vdygpKSA9PSAibnVtYmVyIikgewogICAgICAgICAgICByZXR1cm4gRGF0ZS5ub3coKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAoRGF0ZS5ub3coKSkgPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coRGF0ZS5ub3coKS5nZXRUaW1lKCkpOwogICAgICAgICAgICByZXR1cm4gRGF0ZS5ub3coKS5nZXRUaW1lKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCk7CiAgICAgICAgfQogICAgfQogICAgLy8g5a+5RGF0ZeeahOaJqeWxle+8jOWwhiBEYXRlIOi9rOWMluS4uuaMh+WumuagvOW8j+eahFN0cmluZyAgIAogICAgLy8g5pyIKE0p44CB5pelKGQp44CB5bCP5pe2KEgp44CB5YiGKG0p44CB56eSKHMp44CB5a2j5bqmKHEpIOWPr+S7peeUqCAxLTIg5Liq5Y2g5L2N56ym77yMICAgCiAgICAvLyDlubQoeSnlj6/ku6XnlKggMS00IOS4quWNoOS9jeespu+8jOavq+enkihTKeWPquiDveeUqCAxIOS4quWNoOS9jeespijmmK8gMS0zIOS9jeeahOaVsOWtlykgICAKICAgIC8vIOS+i+WtkO+8miAgIAogICAgLy8gKG5ldyBEYXRlKCkpLkZvcm1hdCgieXl5eS1NTS1kZCBISDptbTpzcy5TIikgPT0+IDIwMDYtMDctMDIgMDg6MDk6MDQuNDIzICAgCiAgICAvLyAobmV3IERhdGUoKSkuRm9ybWF0KCJ5eXl5LU0tZCBIOm06cy5TIikgICAgICA9PT4gMjAwNi03LTIgODo5OjQuMTggICAKICAgIERhdGUucHJvdG90eXBlLkZvcm1hdCA9IGZ1bmN0aW9uIChmbXQpIHsgLy9hdXRob3I6IG1laXp6ICAgCiAgICAgICAgdmFyIG8gPSB7CiAgICAgICAgICAgICJNKyI6IHRoaXMuZ2V0TW9udGgoKSArIDEsICAgICAgICAgICAgICAgICAvL+aciOS7vSAgIAogICAgICAgICAgICAiZCsiOiB0aGlzLmdldERhdGUoKSwgICAgICAgICAgICAgICAgICAgIC8v5pelICAgCiAgICAgICAgICAgICJoKyI6IHRoaXMuZ2V0SG91cnMoKSwgICAgICAgICAgICAgICAgICAgLy/lsI/ml7YgICAKICAgICAgICAgICAgIm0rIjogdGhpcy5nZXRNaW51dGVzKCksICAgICAgICAgICAgICAgICAvL+WIhiAgIAogICAgICAgICAgICAicysiOiB0aGlzLmdldFNlY29uZHMoKSwgICAgICAgICAgICAgICAgIC8v56eSICAgCiAgICAgICAgICAgICJxKyI6IE1hdGguZmxvb3IoKHRoaXMuZ2V0TW9udGgoKSArIDMpIC8gMyksIC8v5a2j5bqmICAgCiAgICAgICAgICAgICJTIjogdGhpcy5nZXRNaWxsaXNlY29uZHMoKSAgICAgICAgICAgICAvL+avq+enkiAgIAogICAgICAgIH07CiAgICAgICAgaWYgKC8oeSspLy50ZXN0KGZtdCkpCiAgICAgICAgICAgIGZtdCA9IGZtdC5yZXBsYWNlKFJlZ0V4cC4kMSwgKHRoaXMuZ2V0RnVsbFllYXIoKSArICIiKS5zdWJzdHIoNCAtIFJlZ0V4cC4kMS5sZW5ndGgpKTsKICAgICAgICBmb3IgKHZhciBrIGluIG8pCiAgICAgICAgICAgIGlmIChuZXcgUmVnRXhwKCIoIiArIGsgKyAiKSIpLnRlc3QoZm10KSkKICAgICAgICAgICAgICAgIGZtdCA9IGZtdC5yZXBsYWNlKFJlZ0V4cC4kMSwgKFJlZ0V4cC4kMS5sZW5ndGggPT0gMSkgPyAob1trXSkgOiAoKCIwMCIgKyBvW2tdKS5zdWJzdHIoKCIiICsgb1trXSkubGVuZ3RoKSkpOwogICAgICAgIHJldHVybiBmbXQ7CiAgICB9CiAgICBjb25zb2xlLmxvZygn4pa96L295YWl5pe26Ze04pa9Jyk7CiAgICBjb25zb2xlLmxvZyhvYmouZ2V0X2RhdGVfbm93X21zKCkpOwogICAgb2JqLnN3YWxfaW5mbyA9IGZ1bmN0aW9uICh0aXRsZSwgdGV4dCwgYnV0dG9uLCBGdW5jKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHNbMF0pIHRpdGxlID0gIlNZUy3miqLotK3liqnmiYvmj5DphpIiOwogICAgICAgIGlmICghYXJndW1lbnRzWzJdKSBidXR0b24gPSAi56Gu6K6kIjsKICAgICAgICBzd2FsKHsKICAgICAgICAgICAgY2xhc3NOYW1lOiAic3dhbF9pbmZvIiwKICAgICAgICAgICAgdGl0bGU6IHRpdGxlLAogICAgICAgICAgICB0ZXh0OiB0ZXh0LAogICAgICAgICAgICBidXR0b246IGJ1dHRvbiwKICAgICAgICB9KS50aGVuKCh2YWx1ZSkgPT4gewogICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwogICAgICAgICAgICBpZiAodHlwZW9mIChGdW5jKSA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICBGdW5jKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KICAgIG9iai5zd2FsX2ZhZGVBd2F5ID0gZnVuY3Rpb24gKHRleHQsIHRpbWVfbXMpIHsKICAgICAgICBpZiAoIWFyZ3VtZW50c1sxXSkgdGltZV9tcyA9IDEwMDA7CiAgICAgICAgc3dhbCh0ZXh0LCB7CiAgICAgICAgICAgIGJ1dHRvbnM6IGZhbHNlLAogICAgICAgICAgICB0aW1lcjogdGltZV9tcywKICAgICAgICB9KTsKICAgIH0KICAgIG9iai5nZXRPYmpLZXlzID0gZnVuY3Rpb24gKG9iaikgewogICAgICAgIHZhciBhcnJ5ID0gW107CiAgICAgICAgZm9yICh2YXIgaSBpbiBvYmopIHsKICAgICAgICAgICAgYXJyeS5wdXNoKGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJyeTsKICAgIH0KICAgIG9iai5zZXRWaXJ0dWFsQ29va2llID0gZnVuY3Rpb24gKG5hbWUsIGFjdGl2ZSwgc3RhcnRfdGltZSwgdGhlTGlmZUN5Y2xlKSB7CiAgICAgICAgdmFyIHZpcnR1YWxDb29raWUgPSBHTV9nZXRWYWx1ZSgndmlydHVhbENvb2tpZScpOwogICAgICAgIGlmICh2aXJ0dWFsQ29va2llID09IG51bGwpIHsKICAgICAgICAgICAgdmlydHVhbENvb2tpZSA9IHt9OwogICAgICAgIH0KICAgICAgICBpZiAoIXZpcnR1YWxDb29raWUuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgICAgICAgdmlydHVhbENvb2tpZVtuYW1lXSA9IHt9OwogICAgICAgIH0KICAgICAgICBpZiAoYWN0aXZlICE9ICdrZWVwJykgewogICAgICAgICAgICB2aXJ0dWFsQ29va2llW25hbWVdWydhY3RpdmUnXSA9IGFjdGl2ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YXJ0X3RpbWUgIT0gJ2tlZXAnKSB7CiAgICAgICAgICAgIHZpcnR1YWxDb29raWVbbmFtZV1bJ3N0YXJ0X3RpbWUnXSA9IHN0YXJ0X3RpbWU7CiAgICAgICAgfQogICAgICAgIGlmICh0aGVMaWZlQ3ljbGUgIT0gJ2tlZXAnKSB7CiAgICAgICAgICAgIHZpcnR1YWxDb29raWVbbmFtZV1bJ3RoZUxpZmVDeWNsZSddID0gdGhlTGlmZUN5Y2xlOwogICAgICAgIH0KICAgICAgICB2aXJ0dWFsQ29va2llW25hbWVdWydwcm9wZXJ0eTEnXSA9ICcnOwogICAgICAgIHZpcnR1YWxDb29raWVbbmFtZV1bJ3Byb3BlcnR5MiddID0gJyc7CiAgICAgICAgdmlydHVhbENvb2tpZVtuYW1lXVsncHJvcGVydHkzJ10gPSAnJzsKICAgICAgICBHTV9zZXRWYWx1ZSgndmlydHVhbENvb2tpZScsIHZpcnR1YWxDb29raWUpOwogICAgfQogICAgb2JqLmdldFZpcnR1YWxDb29raWVCeU5hbWUgPSBmdW5jdGlvbiAobmFtZSkgewogICAgICAgIHZhciB2aXJ0dWFsQ29va2llID0gR01fZ2V0VmFsdWUoJ3ZpcnR1YWxDb29raWUnKTsKICAgICAgICBpZiAodmlydHVhbENvb2tpZSA9PSBudWxsKSB7CiAgICAgICAgICAgIHZpcnR1YWxDb29raWUgPSB7fTsKICAgICAgICB9CiAgICAgICAgaWYgKHZpcnR1YWxDb29raWUuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgICAgICAgcmV0dXJuIHZpcnR1YWxDb29raWVbbmFtZV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQogICAgb2JqLmp1ZGdtZW50VmlydHVhbENvb2tpZSA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgdmFyIGp1ZGdtZW50ID0gb2JqLmdldFZpcnR1YWxDb29raWVCeU5hbWUobmFtZSk7CiAgICAgICAgaWYgKGp1ZGdtZW50ID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChvYmouZ2V0X2RhdGVfbm93X21zKCkgLSBqdWRnbWVudFsnc3RhcnRfdGltZSddID4ganVkZ21lbnRbJ3RoZUxpZmVDeWNsZSddKSB7CiAgICAgICAgICAgICAgICBvYmouc2V0VmlydHVhbENvb2tpZShuYW1lLCAnMCcsICdrZWVwJywgJ2tlZXAnKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG9iai5kZWxWaXJ0dWFsQ29va2llID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLeWIpOaWreWIoOmZpGNvb2tpZS0tLS0tLS0tLS0nKTsKICAgICAgICBjb25zb2xlLmxvZyhuYW1lKTsKICAgICAgICB2YXIgZGVsID0gb2JqLmdldFZpcnR1YWxDb29raWVCeU5hbWUobmFtZSk7CiAgICAgICAgaWYgKGRlbCAhPSBudWxsKSB7CiAgICAgICAgICAgIGRlbGV0ZSBkZWxbbmFtZV07CiAgICAgICAgfQogICAgICAgIEdNX3NldFZhbHVlKCd2aXJ0dWFsQ29va2llJywgZGVsKTsKICAgIH0KCiAgICBvYmouY2FwdHVyZUJ1dHRvbkNsaWNrID0gZnVuY3Rpb24gKGNzc1BhdGgsIGRlbGF5KSB7CiAgICAgICAgaWYgKGNzc1BhdGggIT0gJ3JlZnJlc2hfcGFnZScpIHsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNzc1BhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY3NzUGF0aCkuY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ+WPkeeOsOW8guW4uO+8jOivt+W/veeVpe+8gScpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIGRlbGF5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICB9LCBkZWxheSk7CiAgICAgICAgfQogICAgfQoKICAgIC8vI3JlZ2lvbiDor7vlj5bmiqLotK3liqnmiYvmlrnmoYjkv6Hmga8KICAgIHZhciBvYmpfcGxhbnMgPSBHTV9nZXRWYWx1ZSgnb2JqX3BsYW5zJyk7CiAgICBpZiAob2JqX3BsYW5zID09IHVuZGVmaW5lZCkgewogICAgICAgIHZhciBvYmpfcGxhbnMgPSB7fTsKICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG9ial9wbGFucyA9IEpTT04ucGFyc2Uob2JqX3BsYW5zKTsKICAgICAgICBjb25zb2xlLmxvZygn4pa95omA5pyJ5pa55qGI4pa9Jyk7CiAgICAgICAgY29uc29sZS5sb2cob2JqX3BsYW5zKTsKICAgIH0KCiAgICAvL+mSiOWvueS6rOS4nOW/q+mAn+S4i+WNle+8jOWBmuS4quexu+S8vGNvb2tpZeeahOS4nOS4nAogICAgdmFyIHBhZ2VfdHlwZSA9ICcnOwogICAgaWYgKG9iai5nZXRWaXJ0dWFsQ29va2llQnlOYW1lKCdtamRMb2dpbicpID09IG51bGwpIHsKICAgICAgICBvYmouc2V0VmlydHVhbENvb2tpZSgnbWpkTG9naW4nLCAnMCcsICcwJywgMiAqIDYwICogNjAgKiAxMDAwKTsKICAgIH0KCiAgICBpZiAoZG9jdW1lbnQucmVmZXJyZXIuaW5kZXhPZigicGxvZ2luLm0uamQuY29tIikgPiAtMSkgewogICAgICAgIG9iai5zZXRWaXJ0dWFsQ29va2llKCdtamRMb2dpbicsICcxJywgb2JqLmdldF9kYXRlX25vd19tcygpLCAna2VlcCcpOwogICAgfQoKICAgIHZhciB2X2Nvb2tpZSA9IEdNX2dldFZhbHVlKCd2aXJ0dWFsQ29va2llJyk7CiAgICBjb25zb2xlLmxvZygn4pa95omA5pyJ5Lu75Yqh4pa9Jyk7CiAgICBjb25zb2xlLmxvZyh2X2Nvb2tpZSk7CiAgICAvLyNlbmRyZWdpb24KCiAgICBvYmouaW1wb3J0UGxhbiA9IGZ1bmN0aW9uIChmcm9tLCB2YWx1ZSkgewoKICAgICAgICAvLyB2YXIgcGxhbl9zdHIgPSB2YWx1ZS5yZXBsYWNlKC9cey9nLCAiXG57Iik7CiAgICAgICAgLy8gdmFyIHBsYW5fc3RyID0gdmFsdWUucmVwbGFjZSgvXH0vZywgIlxufSIpOwogICAgICAgIC8vIHBsYW5fc3RyID0gcGxhbl9zdHIucmVwbGFjZSgvXFsvZywgIlxuWyIpOwogICAgICAgIC8vIHBsYW5fc3RyID0gcGxhbl9zdHIucmVwbGFjZSgvXF0vZywgIlxuXSIpOwogICAgICAgIC8vIHBsYW5fc3RyID0gcGxhbl9zdHIucmVwbGFjZSgvXCwvZywgIlxuIik7CiAgICAgICAgLy8gc3dhbChwbGFuX3N0cik7CiAgICAgICAgaWYgKGZyb20gPT0gJ3BsdWdpbicpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBvYmpfcGxhbl90bXAgPSBKU09OLnBhcnNlKHZhbHVlKTsKICAgICAgICAgICAgICAgIHZhciBhcnJ5X2ltcG9ydF9wbGFuaWQgPSBvYmouZ2V0T2JqS2V5cyhvYmpfcGxhbl90bXApOwogICAgICAgICAgICAgICAgb2JqX3BsYW5zW2FycnlfaW1wb3J0X3BsYW5pZFswXV0gPSBvYmpfcGxhbl90bXBbYXJyeV9pbXBvcnRfcGxhbmlkWzBdXTsKICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJvYmpfcGxhbnMiLCBKU09OLnN0cmluZ2lmeShvYmpfcGxhbnMpKTsKICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICAgICAgc3dhbCgn5a+85YWl5oiQ5YqfJyk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHN3YWwoZS5tZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZnJvbSA9PSAnYmJzJykgewogICAgICAgICAgICB0cnkgewoKICAgICAgICAgICAgICAgIG9iai5zd2FsX2luZm8oJ+ehruiupOWvvOWFpeaWueahiOWQl++8nycsIHZhbHVlLCAn56Gu6K6k5a+85YWlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBvYmpfcGxhbl90bXAgPSBKU09OLnBhcnNlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYXJyeV9pbXBvcnRfcGxhbmlkID0gb2JqLmdldE9iaktleXMob2JqX3BsYW5fdG1wKTsKICAgICAgICAgICAgICAgICAgICBvYmpfcGxhbnNbYXJyeV9pbXBvcnRfcGxhbmlkWzBdXSA9IG9ial9wbGFuX3RtcFthcnJ5X2ltcG9ydF9wbGFuaWRbMF1dOwogICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJvYmpfcGxhbnMiLCBKU09OLnN0cmluZ2lmeShvYmpfcGxhbnMpKTsKICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICBzd2FsKCflr7zlhaXmiJDlip8nKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHN3YWwoZS5tZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyNyZWdpb24g6LaL5Yq/5Zu+5Y+C5pWwCiAgICB2YXIgY2hhcnQ7CiAgICB2YXIgb3B0aW9ucyA9IHsKICAgICAgICB0aXRsZTogeyAvLyDmmL7npLrmipjnjrDlm77nmoR0aXRsZQogICAgICAgICAgICB0ZXh0OiAn6Iqx5YmN55yB5LiA55yBLeWVhuWTgeWOhuWPsuS7t+agvOi1sOWKv+WbvicsCiAgICAgICAgICAgIGZvbnRTaXplOiAnMTJweCcKICAgICAgICB9LAogICAgICAgIG1hcmtlcnM6IHsKICAgICAgICAgICAgc2l6ZTogMCwKICAgICAgICAgICAgY29sb3JzOiBbJyNmYmI1YjAnXSwKICAgICAgICB9LAogICAgICAgIGNoYXJ0OiB7CiAgICAgICAgICAgIGhlaWdodDogMjAwLAogICAgICAgICAgICB3aWR0aDogIjEwMCUiLAogICAgICAgICAgICB0eXBlOiAiYXJlYSIsCiAgICAgICAgICAgIGFuaW1hdGlvbnM6IHsKICAgICAgICAgICAgICAgIGluaXRpYWxBbmltYXRpb246IHsKICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBzZXJpZXM6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmFtZTogIuS7t+agvCIsCiAgICAgICAgICAgICAgICBkYXRhOiBbXQogICAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICB4YXhpczogewogICAgICAgICAgICB0eXBlOiAiZGF0ZXRpbWUiLAogICAgICAgICAgICBsYWJlbHM6IHsKICAgICAgICAgICAgICAgIGRhdGV0aW1lRm9ybWF0dGVyOiB7CiAgICAgICAgICAgICAgICAgICAgeWVhcjogJ3l5eXknLAogICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnTU0gXC15eScsCiAgICAgICAgICAgICAgICAgICAgZGF5OiAneXl5eS1NTS1kZCcsCiAgICAgICAgICAgICAgICAgICAgaG91cjogJ0hIOm1tJwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBzdHJva2U6IHsKICAgICAgICAgICAgY3VydmU6ICdzbW9vdGgnLAogICAgICAgICAgICB3aWR0aDogWzAuNSwgMC41LCAwLjVdCiAgICAgICAgfSwKICAgICAgICBjb2xvcnM6IFsnI0Y0NDMzNiddLAogICAgICAgIGRhdGFMYWJlbHM6IHsKICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCiAgICAgICAgICAgIHN0eWxlOiB7CiAgICAgICAgICAgICAgICBjb2xvcnM6IFsnIzAwMDAwMCddCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHRvb2x0aXA6IHsKICAgICAgICAgICAgeDogewogICAgICAgICAgICAgICAgZm9ybWF0OiAneXl5eS1NTS1kZCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgeTogW3sKICAgICAgICAgICAgICAgIGZvcm1hdHRlcjogZnVuY3Rpb24gKHkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHkgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5LnRvRml4ZWQoMCkgKyAi5YWDIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH1dCiAgICAgICAgfQogICAgfQogICAgLy8jZW5kcmVnaW9uCiAgICBvYmouZ2V0TmV3VmVyc2lvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgZ2V0X3Zlcl91cmw7CiAgICAgICAgZ2V0X3Zlcl91cmwgPSAiaHR0cHM6Ly93d3cueW91eWl6aGluZW5nLnRvcC9xdWVyeV9jb3Vwb24vZ2V0X3ZlcnNpb24ucGhwIjsKCiAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICB1cmw6IGdldF92ZXJfdXJsLAogICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICB0aW1lb3V0OiAxMDAwMCwKICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgICAgICAnQ2FjaGUtQ29udHJvbCc6ICdwdWJsaWMnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24gKHhocikgewogICAgICAgICAgICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0ganNvbjsKICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uIDwgZGF0YS52ZXIpIHsKICAgICAgICAgICAgICAgICAgICAkMigiI3BsdWdpblVwZGF0ZSIpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgICAgICQyKCIjcGx1Z2luVXBkYXRlIikuY3NzKCJjb2xvciIsIGRhdGEuY29sb3IpOwogICAgICAgICAgICAgICAgICAgICQyKCIjcGx1Z2luVXBkYXRlIikuaHRtbChkYXRhLnRleHQpOwogICAgICAgICAgICAgICAgICAgICQyKCIjcGx1Z2luVXBkYXRlIikuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBHTV9vcGVuSW5UYWIoZGF0YS51cmwsIHsgYWN0aXZlOiB0cnVlLCBzZXRQYXJlbnQ6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQyKCIjcGx1Z2luVXBkYXRlIikucGFyZW50KCkuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgJDIuZm4uY2FyZFRhYnMgPSBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIHZhciBtYWluQ2xhc3MgPSAkMih0aGlzKS5hdHRyKCdjbGFzcycpOwogICAgICAgIHZhciBhY3RpdmVDb3VudCA9IDA7CiAgICAgICAgdmFyIHNldHRpbmdzID0gJDIuZXh0ZW5kKHsKICAgICAgICAgICAgdGhlbWU6ICcnLAogICAgICAgIH0sIG9wdGlvbnMpOwogICAgICAgIC8vIEluaXRpYWxpemluZwogICAgICAgIHZhciBodG1sSW5uZXIgPSAkMih0aGlzKS5odG1sKCk7CiAgICAgICAgdmFyIHN0YWNrID0gJDIoJzxkaXYgLz4nKS5hZGRDbGFzcygnY2FyZC10YWJzLXN0YWNrJykuaHRtbChodG1sSW5uZXIpOwogICAgICAgIHZhciBiYXIgPSAkMignPGRpdiAvPicpLmFkZENsYXNzKCdjYXJkLXRhYnMtYmFyJyk7CiAgICAgICAgJDIoJy4nICsgbWFpbkNsYXNzKS5jaGlsZHJlbignZGl2W2RhdGEtdGFiXScpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICBiYXIuYXBwZW5kKCQyKCc8YSAvPicpLmRhdGEoJ3RhYicsICQyKHRoaXMpLmRhdGEoJ3RhYicpKS5hcHBlbmQoJDIodGhpcykuZGF0YSgndGFiJykpKTsKICAgICAgICB9KTsKICAgICAgICAkMignLicgKyBtYWluQ2xhc3MpLmh0bWwoJycpLmFwcGVuZChiYXIpLmFwcGVuZChzdGFjayk7CiAgICAgICAgLy8gRml4aW5nIHRoZSB0aGVtZQogICAgICAgIGlmIChzZXR0aW5ncy50aGVtZSAhPSAnJykgewogICAgICAgICAgICAkMignLicgKyBtYWluQ2xhc3MgKyAnIC5jYXJkLXRhYnMtYmFyJykuYWRkQ2xhc3Moc2V0dGluZ3MudGhlbWUpOwogICAgICAgICAgICAkMignLicgKyBtYWluQ2xhc3MgKyAnIC5jYXJkLXRhYnMtc3RhY2snKS5hZGRDbGFzcyhzZXR0aW5ncy50aGVtZSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB0b2dnbGVUYWIob2JqKSB7CiAgICAgICAgICAgICQyKCcuJyArIG1haW5DbGFzcyArICIgLmNhcmQtdGFicy1zdGFjayBkaXZbZGF0YS10YWJdW2RhdGEtdGFiPSciICsgb2JqLmRhdGEoJ3RhYicpICsgIiddIikuc2hvdygpOwogICAgICAgICAgICAkMignLicgKyBtYWluQ2xhc3MgKyAiIC5jYXJkLXRhYnMtc3RhY2sgZGl2W2RhdGEtdGFiXVtkYXRhLXRhYiE9JyIgKyBvYmouZGF0YSgndGFiJykgKyAiJ10iKS5oaWRlKCk7CiAgICAgICAgfQogICAgICAgIC8vIENoZWNraW5nIHdoZXRoZXIgd2UgaGF2ZSB0byBzZXQgYSB0YWIgYXMgYWN0aXZlCiAgICAgICAgJDIoJy4nICsgbWFpbkNsYXNzICsgJyAuY2FyZC10YWJzLXN0YWNrJykuY2hpbGRyZW4oJ2RpdltkYXRhLXRhYl0nKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCQyKHRoaXMpLmhhc0NsYXNzKCdhY3RpdmUnKSkgewogICAgICAgICAgICAgICAgJDIoJy4nICsgbWFpbkNsYXNzICsgIiAuY2FyZC10YWJzLWJhciBhW2RhdGEtdGFiPSciICsgJDIodGhpcykuZGF0YSgndGFiJykgKyAiJ10iKS5hZGRDbGFzcygnYWN0aXZlJyk7CiAgICAgICAgICAgICAgICB0b2dnbGVUYWIoJDIodGhpcykpOwogICAgICAgICAgICAgICAgJDIodGhpcykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwogICAgICAgICAgICAgICAgYWN0aXZlQ291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIC8vIE90aGVyd2lzZSwgaXQncyB0aGUgZmlyc3Qgb25lLCBhbmQgdGhlIGZpcnN0IHRhYiBpbiB0aGUgYmFyIG5lZWRzIHRvIGJlIGFjdGl2ZQogICAgICAgIGlmIChhY3RpdmVDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICQyKCcuJyArIG1haW5DbGFzcyArICcgLmNhcmQtdGFicy1iYXIgYTpmaXJzdC1jaGlsZCcpLmFkZENsYXNzKCdhY3RpdmUnKTsKICAgICAgICB9CiAgICAgICAgJDIoJy4nICsgbWFpbkNsYXNzICsgJyAuY2FyZC10YWJzLWJhciBhJykuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkMignLicgKyBtYWluQ2xhc3MgKyAnIC5jYXJkLXRhYnMtYmFyIGEnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7CiAgICAgICAgICAgICQyKHRoaXMpLmFkZENsYXNzKCdhY3RpdmUnKTsKICAgICAgICAgICAgdG9nZ2xlVGFiKCQyKHRoaXMpKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CiAgICBvYmouaGFzU2VsZWN0UGxhbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgc2VsZWN0X3ZhbCA9ICQyKCIjcGFuaWNCdXlpbmdQbGFuIikudmFsKCk7CiAgICAgICAgaWYgKHNlbGVjdF92YWwgPT0gIi0tLeivt+mAieaLqS0tLSIpIHsKICAgICAgICAgICAgb2JqLnN3YWxfaW5mbyhudWxsLCAi5oKo5rKh5pyJ6YCJ5oup5pa55qGI77yBIik7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBvYmouYWRkUGxhbiA9IGZ1bmN0aW9uICh2YWx1ZV9zdHIpIHsKICAgICAgICB2YXIgb2JqX3BsYW5fdG1wID0gSlNPTi5wYXJzZSh2YWx1ZV9zdHIpOwogICAgICAgIHZhciBhcnJ5X2ltcG9ydF9wbGFuaWQgPSBvYmouZ2V0T2JqS2V5cyhvYmpfcGxhbl90bXApOwogICAgICAgIG9ial9wbGFuc1thcnJ5X2ltcG9ydF9wbGFuaWRbMF1dID0gb2JqX3BsYW5fdG1wW2FycnlfaW1wb3J0X3BsYW5pZFswXV07CiAgICAgICAgR01fc2V0VmFsdWUoIm9ial9wbGFucyIsIEpTT04uc3RyaW5naWZ5KG9ial9wbGFucykpOwogICAgfQogICAgLy/liIfmjaJ0YWIKICAgIG9iai5zZWxlY3RfdGFiID0gZnVuY3Rpb24gKHRhYl92YWwsIGRpc3BsYXksIGNsaWNrKSB7CiAgICAgICAgdmFyIGFsbF90YWJzID0gJDIoJy5jYXJkLXRhYnMtYmFyLndpa2knKVswXS5jaGlsZE5vZGVzOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsX3RhYnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGFsbF90YWJzW2ldLnRleHQgPT0gdGFiX3ZhbCkgewogICAgICAgICAgICAgICAgYWxsX3RhYnNbaV0uc3R5bGUuZGlzcGxheSA9IGRpc3BsYXk7CiAgICAgICAgICAgICAgICBpZiAoY2xpY2sgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIGFsbF90YWJzW2ldLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICAvL+WIl+ihqOmhtemdouaTjeS9nAogICAgb2JqLmluaXRTZWFyY2hIdG1sID0gZnVuY3Rpb24gKHNlbGVjdG9yTGlzdCkgewogICAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgc2VsZWN0b3JMaXN0LmZvckVhY2goZnVuY3Rpb24gKHNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICBvYmouaW5pdFNlYXJjaEl0ZW1TZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIDEwMDApOwogICAgfTsKICAgIG9iai5pbml0U2VhcmNoSXRlbVNlbGVjdG9yID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7CiAgICAgICAgJDIoc2VsZWN0b3IpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICBvYmouaW5pdFNlYXJjaEl0ZW0odGhpcyk7CiAgICAgICAgfSk7CiAgICB9OwogICAgb2JqLmFkZENsaWNrVGFzayA9IGZ1bmN0aW9uIChrZXlzKSB7CiAgICAgICAgY29uc29sZS5sb2coa2V5cyk7CiAgICAgICAgdmFyIHRpbWVfbGluZSA9IDA7CiAgICAgICAgdmFyIHJlZnJlc2hfa2V5ID0gJyc7CiAgICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAga2V5c1tpXVsncHJlc3NfbnVtJ10gPSBrZXlzW2ldWydwcmVzc19udW0nXSAtIDE7CiAgICAgICAgICAgICAgICAvL3RvZG8g5aaC5p6c5piv5Yi35paw77yM55u05o6l6Lez5Ye6CiAgICAgICAgICAgICAgICBpZiAoa2V5c1tpXVsnY3NzX3BhdGgnXSA9PSAicmVmcmVzaF9wYWdlIikgewogICAgICAgICAgICAgICAgICAgIHJlZnJlc2hfa2V5ID0ga2V5c1tpXTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRpbWVfbGluZSA9IHRpbWVfbGluZSArIE51bWJlcihrZXlzW2ldWydwcmVzc19pbnRlcnZhbCddKTsKICAgICAgICAgICAgICAgIHZhciBjc3NQYXRoID0ga2V5c1tpXVsnY3NzX3BhdGgnXTsKICAgICAgICAgICAgICAgIG9iai5jYXB0dXJlQnV0dG9uQ2xpY2soY3NzUGF0aCwgdGltZV9saW5lKTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmt7vliqDku7vliqHvvJonLCAn5pe25Yi7JyArIHRpbWVfbGluZSwga2V5c1tpXVsna2V5X25hbWUnXSwga2V5c1tpXVsnY3NzX3BhdGgnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IGtleXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgIGlmIChrZXlzW2ldWydwcmVzc19udW0nXSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAga2V5cy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGlmIChyZWZyZXNoX2tleSAhPSAnJykgewogICAgICAgICAgICB0aW1lX2xpbmUgPSB0aW1lX2xpbmUgKyBOdW1iZXIocmVmcmVzaF9rZXlbJ3ByZXNzX2ludGVydmFsJ10pOwogICAgICAgICAgICBjb25zb2xlLmxvZygn5re75Yqg5Lu75YqhJywgcmVmcmVzaF9rZXlbJ2tleV9uYW1lJ10sICfml7bliLsnICsgdGltZV9saW5lKTsKICAgICAgICAgICAgLy8gcmV0dXJuOwogICAgICAgICAgICBvYmouY2FwdHVyZUJ1dHRvbkNsaWNrKHJlZnJlc2hfa2V5Wydjc3NfcGF0aCddLCB0aW1lX2xpbmUpOwogICAgICAgIH0KICAgIH0KICAgIG9iai5pbml0U2VhcmNoSXRlbSA9IGZ1bmN0aW9uIChzZWxlY3RvcikgewogICAgICAgIHZhciAkdGhpcyA9ICQyKHNlbGVjdG9yKTsKICAgICAgICB2YXIgbmlkOwogICAgICAgIGlmICgkdGhpcy5oYXNDbGFzcygidGItY29vbC1ib3gtYWxyZWFkeSIpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy5hZGRDbGFzcygidGItY29vbC1ib3gtYWxyZWFkeSIpOwogICAgICAgIH0KICAgICAgICBpZiAob2JqLnNpdGVfdHlwZSgpID09ICJ0YW9iYW9fbHN0X3BhZ2UiKSB7CiAgICAgICAgICAgIG5pZCA9ICR0aGlzLmF0dHIoImRhdGEtaWQiKTsKICAgICAgICAgICAgaWYgKCFvYmouaXNWYWlsaWRJdGVtSWQobmlkKSkgewogICAgICAgICAgICAgICAgbmlkID0gJHRoaXMuYXR0cigiZGF0YS1pdGVtaWQiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFvYmouaXNWYWlsaWRJdGVtSWQobmlkKSkgewogICAgICAgICAgICAgICAgaWYgKCR0aGlzLmF0dHIoImhyZWYiKSkgewogICAgICAgICAgICAgICAgICAgIG5pZCA9IGxvY2F0aW9uLnByb3RvY29sICsgJHRoaXMuYXR0cigiaHJlZiIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgJGEgPSAkdGhpcy5maW5kKCJhIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkYS5sZW5ndGgpIHsgcmV0dXJuOyB9CiAgICAgICAgICAgICAgICAgICAgbmlkID0gJGEuYXR0cigiZGF0YS1uaWQiKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9iai5pc1ZhaWxpZEl0ZW1JZChuaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYS5oYXNDbGFzcygial9SZWNlaXZlQ291cG9uIikgJiYgJGEubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlkID0gbG9jYXRpb24ucHJvdG9jb2wgKyAkMigkYVsxXSkuYXR0cigiaHJlZiIpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlkID0gbG9jYXRpb24ucHJvdG9jb2wgKyAkYS5hdHRyKCJocmVmIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAob2JqLnNpdGVfdHlwZSgpID09ICJqaW5nZG9uZ19sc3RfcGFnZSIpIHsKICAgICAgICAgICAgbmlkID0gJHRoaXMuYXR0cigiZGF0YS1za3UiKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiAobmlkKSA9PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICAgICAgbmlkID0gJHRoaXMuZmluZCgnLnByaWNlJykuYXR0cigiZGF0YS1za3VpZCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb2JqLmlzVmFpbGlkSXRlbUlkKG5pZCkpIHsKICAgICAgICAgICAgICAgIG5pZCA9ICR0aGlzLmZpbmQoIi5wLW9wZXJhdGUiKS5maW5kKCJhIikuYXR0cigic2t1aWQiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gInZpcF9saXN0X3BhZ2UiKSB7CiAgICAgICAgICAgIG5pZCA9ICR0aGlzLmF0dHIoImRhdGEtcHJvZHVjdC1pZCIpOwogICAgICAgICAgICBpZiAodHlwZW9mIChuaWQpID09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgICAgICBuaWQgPSAkdGhpcy5maW5kKCcuYy1nb29kcy1pdGVtX19zYWxlLXByaWNlJykuaHRtbCgpLnNwbGl0KCI8L3NwYW4+IilbMV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFvYmouaXNWYWlsaWRJdGVtSWQobmlkKSkgewogICAgICAgICAgICAgICAgLy8gbmlkID0gJHRoaXMuZmluZCgiLnAtb3BlcmF0ZSIpLmZpbmQoImEiKS5hdHRyKCJza3VpZCIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9iai5zaXRlX3R5cGUoKSA9PSAia2FvbGFfbGlzdF9wYWdlIikgewogICAgICAgICAgICBuaWQgPSAkdGhpcy5maW5kKCdhJykuZXEoMCkuYXR0cigiaHJlZiIpLnNwbGl0KCIvcHJvZHVjdC8iKVsxXS5zcGxpdCgiLiIpWzBdOwogICAgICAgIH0KCiAgICAgICAgaWYgKG9iai5pc1ZhbGlkTmlkKG5pZCkpIHsKICAgICAgICAgICAgb2JqLmFwcGVuQmFzaWNRdWVyeUh0bWwoJHRoaXMsIG5pZCk7CiAgICAgICAgfQogICAgfTsKICAgIC8v5Zu+54mH5LiK5pi+56S65o+Q56S65Zu+5qCHCiAgICBvYmouaW5pdFNlYXJjaEV2ZW50ID0gZnVuY3Rpb24gKCkgewogICAgICAgICQyKCIudGItY29vbC1ib3gtYXJlYSIpLmxpdmUoImNsaWNrIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgU2hvd19oaWRlX2Rpdl9pZCA9ICQyKHRoaXMpLmF0dHIoIm5hbWUiKTsKICAgICAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShTaG93X2hpZGVfZGl2X2lkKVswXS5zdHlsZS5vcGFjaXR5OwogICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoU2hvd19oaWRlX2Rpdl9pZCkubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoYSA9PSAiIiB8fCBhID09ICIxIikgewogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKFNob3dfaGlkZV9kaXZfaWQpW2luZGV4XS5zdHlsZS5vcGFjaXR5ID0gIjAuMiI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKFNob3dfaGlkZV9kaXZfaWQpW2luZGV4XS5zdHlsZS5vcGFjaXR5ID0gIjEiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgJDIoIi50Yi1jb29sLWJveC1hcmVhLXJtIikubGl2ZSgiY2xpY2siLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBTaG93X2hpZGVfZGl2X2lkID0gJDIodGhpcykuYXR0cigibmFtZSIpOwogICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKFNob3dfaGlkZV9kaXZfaWQpWzBdLnN0eWxlLm9wYWNpdHk7CiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShTaG93X2hpZGVfZGl2X2lkKS5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgICAgICAgIGlmIChhID09ICIiIHx8IGEgPT0gIjEiKSB7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoU2hvd19oaWRlX2Rpdl9pZClbaW5kZXhdLnN0eWxlLm9wYWNpdHkgPSAiMC4yIjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoU2hvd19oaWRlX2Rpdl9pZClbaW5kZXhdLnN0eWxlLm9wYWNpdHkgPSAiMSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgb2JqLmJhc2ljUXVlcnkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkMigiLnRiLWNvb2wtYm94LXdhaXQiKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIG9iai5iYXNpY1F1ZXJ5SXRlbSh0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgMzAwKTsKICAgIH07CgogICAgb2JqLmJhc2ljUXVlcnlfbGlzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICgkMigiLnRiLWNvb2wtYm94LXdhaXQiKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBxdWVyeV9pdGVtX2xpc3QgPSBxdWVyeV9pdGVtX2xpc3Quc3Vic3RyKDAsIHF1ZXJ5X2l0ZW1fbGlzdC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIG9iai51cGRhdGVfbGlzdF9kYXRhKHF1ZXJ5X2l0ZW1fbGlzdCk7CiAgICAgICAgICAgICAgICBxdWVyeV9pdGVtX2xpc3QgPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJDIoIi50Yi1jb29sLWJveC13YWl0LXJtIikubGVuZ3RoID4gMCAmJiBxdWVyeV9kYXRhX2xpc3RfYmFjayAhPSAnJykgewogICAgICAgICAgICAgICAgJDIoIi50Yi1jb29sLWJveC13YWl0LXJtIikuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgb2JqLmJhc2ljUXVlcnlMaXN0SXRlbSh0aGlzLCBxdWVyeV9kYXRhX2xpc3RfYmFjaywgJ3JlZnJlc2hfY2FzaGJhY2snKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcXVlcnlfZGF0YV9saXN0X2JhY2sgPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0sIDUwMCk7CiAgICB9OwoKICAgIG9iai51cGRhdGVfbGlzdF9kYXRhID0gZnVuY3Rpb24gKHF1ZXJ5X2l0ZW1fbGlzdCkgewogICAgICAgIGlmIChxdWVyeV9pdGVtX2xpc3QgPT0gJycpIHsgcmV0dXJuOyB9CiAgICAgICAgdmFyIG9wZXJhdGUgPSAnJzsKICAgICAgICBpZiAob2JqLnNpdGVfdHlwZSgpID09ICJqaW5nZG9uZ19sc3RfcGFnZSIpIHsgb3BlcmF0ZSA9ICJxdWVydF9saXN0X2pkIjsgfQogICAgICAgIGVsc2UgaWYgKG9iai5zaXRlX3R5cGUoKSA9PSAidmlwX2xpc3RfcGFnZSIpIHsgb3BlcmF0ZSA9ICJxdWVydF9saXN0X3ZpcCI7IH0KICAgICAgICBlbHNlIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gInRhb2Jhb19sc3RfcGFnZSIpIHsgb3BlcmF0ZSA9ICJxdWVydF9saXN0X3RiIjsgfQogICAgICAgIGVsc2UgaWYgKG9iai5zaXRlX3R5cGUoKSA9PSAia2FvbGFfbGlzdF9wYWdlIikgeyBvcGVyYXRlID0gImthb2xhX2xpc3QiOyB9CiAgICAgICAgdmFyIHVybCA9ICJodHRwczovL3d3dy55b3V5aXpoaW5lbmcudG9wL3F1ZXJ5X2NvdXBvbi9xdWVyeV9jb3Vwb25fdjIxMDEyMC5waHA/b3BlcmF0ZT0iICsgb3BlcmF0ZSArICImaXRlbWlkX2xpc3Q9IiArIHF1ZXJ5X2l0ZW1fbGlzdDsKICAgICAgICBjb25zb2xlLmxvZyh1cmwpOwogICAgICAgICQyLmdldEpTT04odXJsLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhkYXRhKTsKICAgICAgICAgICAgJDIoIi50Yi1jb29sLWJveC13YWl0IikuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBvYmouYmFzaWNRdWVyeUxpc3RJdGVtKHRoaXMsIGRhdGEsICcnKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHF1ZXJ5X2RhdGFfbGlzdF9iYWNrID0gZGF0YTsKICAgICAgICB9KTsKICAgIH0KCgogICAgb2JqLmFwcGVuQmFzaWNRdWVyeUh0bWwgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIG5pZCkgewogICAgICAgIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gImppbmdkb25nX2xzdF9wYWdlIiB8fCBvYmouc2l0ZV90eXBlKCkgPT0gInZpcF9saXN0X3BhZ2UiIHx8IG9iai5zaXRlX3R5cGUoKSA9PSAidGFvYmFvX2xzdF9wYWdlIiB8fCBvYmouc2l0ZV90eXBlKCkgPT0gImthb2xhX2xpc3RfcGFnZSIpIHsKICAgICAgICAgICAgcXVlcnlfaXRlbV9saXN0ID0gcXVlcnlfaXRlbV9saXN0ICsgbmlkICsgIiwiOwogICAgICAgIH0KCiAgICAgICAgc2VsZWN0b3IuYXBwZW5kKAogICAgICAgICAgICAnPGRpdiBjbGFzcz0idGItY29vbC1ib3gtYXJlYSB0Yi1jb29sLWJveC13YWl0IiAgZGF0YS1uaWQ9IicgKyBuaWQgKyAnIiAgbmFtZT0iY19kaXZfJyArCiAgICAgICAgICAgIG5pZCArCiAgICAgICAgICAgICciPjxhIGNsYXNzPSJ0Yi1jb29sLWJveC1pbmZvIHRiLWNvb2wtYm94LWluZm8tZGVmYXVsdCIgdGl0bGU9IueCueWHu+afpeivoiI+5p+l6K+i5LitLi4uPC9hPjwvZGl2PicKICAgICAgICApOwogICAgICAgIHNlbGVjdG9yLmFwcGVuZCgKICAgICAgICAgICAgJzxkaXYgY2xhc3M9InRiLWNvb2wtYm94LWFyZWEtcm0gdGItY29vbC1ib3gtd2FpdC1ybSIgIGRhdGEtbmlkPSInICsgbmlkICsgJyIgIG5hbWU9InJfZGl2XycgKwogICAgICAgICAgICBuaWQgKwogICAgICAgICAgICAnIj48YSBjbGFzcz0idGItY29vbC1ib3gtaW5mbyB0Yi1jb29sLWJveC1pbmZvLWRlZmF1bHQiIHRpdGxlPSLngrnlh7vmn6Xor6IiPuafpeivouS4rS4uLjwvYT48L2Rpdj4nCiAgICAgICAgKTsKICAgIH07CgogICAgb2JqLmJhc2ljUXVlcnlJdGVtID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7CiAgICAgICAgdmFyICR0aGlzID0gJDIoc2VsZWN0b3IpOwogICAgICAgIHZhciB1cmw7CiAgICAgICAgJHRoaXMucmVtb3ZlQ2xhc3MoInRiLWNvb2wtYm94LXdhaXQiKTsKCiAgICAgICAgdmFyIG5pZCA9ICR0aGlzLmF0dHIoImRhdGEtbmlkIik7CiAgICAgICAgdXJsID0gImh0dHBzOi8vd3d3LnlvdXlpemhpbmVuZy50b3AvcXVlcnlfY291cG9uL3F1ZXJ5X2NvdXBvbl92MjEwMTIwLnBocD9vcGVyYXRlPXF1ZXJ0X3NpbmdsZSZpdGVtaWQ9IiArIG5pZDsKCiAgICAgICAgdmFyIHhocjEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsvL+esrOS4gOatpe+8muaWsOW7uuWvueixoQogICAgICAgIHhocjEub3BlbignR0VUJywgdXJsLCB0cnVlKTsvL+esrOS6jOatpe+8muaJk+W8gOi/nuaOpSAg5bCG6K+35rGC5Y+C5pWw5YaZ5ZyodXJs5LitCiAgICAgICAgeGhyMS5zZW5kKCk7Ly/nrKzkuInmraXvvJrlj5HpgIHor7fmsYIgIOWwhuivt+axguWPguaVsOWGmeWcqFVSTOS4rQogICAgICAgIC8qKgogICAgICAgICAqIOiOt+WPluaVsOaNruWQjueahOWkhOeQhueoi+W6jwogICAgICAgICAqLwogICAgICAgIHhocjEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoeGhyMS5yZWFkeVN0YXRlID09IDQgJiYgeGhyMS5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVzID0geGhyMS5yZXNwb25zZVRleHQ7Ly/ojrflj5bliLBqc29u5a2X56ym5Liy77yM6Kej5p6QCiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UocmVzKTsKCiAgICAgICAgICAgICAgICBpZiAoZGF0YS5jb3Vwb25tb25leSAhPSAwIHx8IGRhdGEucmV0dXJuX21vbmV5X3JhdGUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIG9iai5zaG93QmFzaWNRdWVyeUZpbmQoJHRoaXMsIGRhdGEuY291cG9ubW9uZXksIGRhdGEucmV0dXJuX21vbmV5X3JhdGUsIGRhdGEudXJsMiwgJycpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBvYmouc2hvd0Jhc2ljUXVlcnlFbXB0eSgkdGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgb2JqLmJhc2ljUXVlcnlMaXN0SXRlbSA9IGZ1bmN0aW9uIChzZWxlY3RvciwgZGF0YSwgZmxhZykgewogICAgICAgIGlmIChmbGFnID09ICdyZWZyZXNoX2Nhc2hiYWNrJykgewogICAgICAgICAgICB2YXIgJHRoaXMgPSAkMihzZWxlY3RvcikucHJldigpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciAkdGhpcyA9ICQyKHNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgICAgdmFyIHVybDsKICAgICAgICB2YXIgZWFjaF9jb3Vwb25tb25leTsKICAgICAgICB2YXIgZWFjaF9yZXR1cm5fbW9uZXlfcmF0ZTsKICAgICAgICB2YXIgZWFjaF9yZXR1cm5fbW9uZXk7CiAgICAgICAgdmFyIGVhY2hfdXJsMjsKICAgICAgICBpZiAoJHRoaXMuaGFzQ2xhc3MoInRiLWNvb2wtYm94LXdhaXQiKSkgewogICAgICAgICAgICAkdGhpcy5yZW1vdmVDbGFzcygidGItY29vbC1ib3gtd2FpdCIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gJHRoaXMubmV4dCgpLnJlbW92ZUNsYXNzKCJ0Yi1jb29sLWJveC13YWl0LXJtIik7CgogICAgICAgIHZhciBuaWQgPSAkdGhpcy5hdHRyKCJkYXRhLW5pZCIpOwogICAgICAgIGlmICh0eXBlb2YgKGRhdGFbbmlkXSkgPT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgZWFjaF9jb3Vwb25tb25leSA9IDA7CiAgICAgICAgICAgIGVhY2hfcmV0dXJuX21vbmV5X3JhdGUgPSAwOwogICAgICAgICAgICBlYWNoX3VybDIgPSAnJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVhY2hfY291cG9ubW9uZXkgPSBkYXRhW25pZF0uY291cG9ubW9uZXk7CiAgICAgICAgICAgIGVhY2hfcmV0dXJuX21vbmV5X3JhdGUgPSBkYXRhW25pZF0ucmV0dXJuX21vbmV5X3JhdGU7CiAgICAgICAgICAgIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gInZpcF9saXN0X3BhZ2UiIHx8IG9iai5zaXRlX3R5cGUoKSA9PSAia2FvbGFfbGlzdF9wYWdlIikgewogICAgICAgICAgICAgICAgZWFjaF9yZXR1cm5fbW9uZXkgPSBkYXRhW25pZF0ucmV0dXJuX21vbmV5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVhY2hfdXJsMiA9IGRhdGFbbmlkXS51cmwyOwogICAgICAgIH0KCiAgICAgICAgaWYgKGVhY2hfY291cG9ubW9uZXkgIT0gMCB8fCBlYWNoX3JldHVybl9tb25leV9yYXRlICE9IDApIHsKICAgICAgICAgICAgb2JqLnNob3dCYXNpY1F1ZXJ5RmluZCgkdGhpcywgZWFjaF9jb3Vwb25tb25leSwgZWFjaF9yZXR1cm5fbW9uZXlfcmF0ZSwgZWFjaF91cmwyLCBlYWNoX3JldHVybl9tb25leSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvYmouc2hvd0Jhc2ljUXVlcnlFbXB0eSgkdGhpcyk7CiAgICAgICAgfQogICAgfTsKCiAgICBvYmouc2hvd0Jhc2ljUXVlcnlGaW5kID0gZnVuY3Rpb24gKHNlbGVjdG9yLCBjb3Vwb25Nb25leSwgcm1fTW9uZXksIHVybDIsIHJldHVybl9tb25leSkgewogICAgICAgIHZhciBwcmljZTsKICAgICAgICBpZiAoc2VsZWN0b3IuZmluZCgiLnRiLWNvb2wtYm94LWluZm8tZmluZCIpLmxlbmd0aCA+IDApIHsgcmV0dXJuOyB9CiAgICAgICAgaWYgKGNvdXBvbk1vbmV5ID09ICIwIikgewogICAgICAgICAgICBzZWxlY3Rvci5odG1sKAogICAgICAgICAgICAgICAgJzxhIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0idGItY29vbC1ib3gtaW5mbyB0Yi1jb29sLWJveC1pbmZvLWZpbmQiIHRpdGxlPSLmmL7npLov6ZqQ6JePIj7ml6DliLg8L2E+JwogICAgICAgICAgICApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNlbGVjdG9yLmh0bWwoCiAgICAgICAgICAgICAgICAnPGEgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJ0Yi1jb29sLWJveC1pbmZvIHRiLWNvb2wtYm94LWluZm8tZmluZCIgdGl0bGU9IuaYvuekui/pmpDol48iPuacieWIuO+8iOWHjycgKwogICAgICAgICAgICAgICAgY291cG9uTW9uZXkgKwogICAgICAgICAgICAgICAgIuWFg++8iTwvYT4iCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICB2YXIgdXJsID0gbG9jYXRpb24uaHJlZjsKICAgICAgICBpZiAodXJsLmluZGV4T2YoIi8vcy50YW9iYW8uY29tL3NlYXJjaCIpID4gMCB8fCB1cmwuaW5kZXhPZigiLy9zLnRhb2Jhby5jb20vbGlzdCIpID4gMCkgewogICAgICAgICAgICBwcmljZSA9IHNlbGVjdG9yLnByZXYoKS5maW5kKCJzdHJvbmciKS5odG1sKCk7CiAgICAgICAgICAgIGlmICh1cmwyICE9ICcnKSB7CiAgICAgICAgICAgICAgICBzZWxlY3Rvci5wcmV2KCkuZmluZCgiLkpfQ2xpY2tTdGF0IikuYXR0cigiaHJlZiIsIHVybDIpOwogICAgICAgICAgICAgICAgc2VsZWN0b3IucHJldigpLnByZXYoKS5maW5kKCIucGljIikuZmluZCgiYSIpLmF0dHIoImhyZWYiLCB1cmwyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh1cmwuaW5kZXhPZigiLy9saXN0LnRtYWxsLmNvbS9zZWFyY2hfcHJvZHVjdC5odG0iKSA+IDApIHsKICAgICAgICAgICAgcHJpY2UgPSBzZWxlY3Rvci5wcmV2KCkuZmluZCgiZW0iKS5hdHRyKCd0aXRsZScpOwogICAgICAgICAgICBpZiAocHJpY2UgPiAwKSB7CiAgICAgICAgICAgICAgICBwcmljZSA9IHNlbGVjdG9yLnByZXYoKS5maW5kKCJlbSIpLmF0dHIoJ3RpdGxlJyk7CiAgICAgICAgICAgICAgICBpZiAodXJsMiAhPSAnJykgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnByZXYoKS5maW5kKCIucHJvZHVjdFRpdGxlIikuZmluZCgiYSIpLmF0dHIoImhyZWYiLCB1cmwyKTsKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5wcmV2KCkuZmluZCgiLnByb2R1Y3RJbWciKS5hdHRyKCJocmVmIiwgdXJsMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwcmljZSA9IHNlbGVjdG9yLnByZXYoKS5maW5kKCIuaXRlbS1wcmljZSIpLmZpbmQoInN0cm9uZyIpLmh0bWwoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh1cmwuaW5kZXhPZigiLy9saXN0LnRtYWxsLmhrL3NlYXJjaF9wcm9kdWN0Lmh0bSIpID4gMCkgewogICAgICAgICAgICBwcmljZSA9IHNlbGVjdG9yLnByZXYoKS5maW5kKCJlbSIpLmF0dHIoJ3RpdGxlJyk7CiAgICAgICAgICAgIGlmICh1cmwyICE9ICcnKSB7CiAgICAgICAgICAgICAgICBzZWxlY3Rvci5wcmV2KCkuZmluZCgiLnByb2R1Y3RUaXRsZSIpLmZpbmQoImEiKS5hdHRyKCJocmVmIiwgdXJsMik7CiAgICAgICAgICAgICAgICBzZWxlY3Rvci5wcmV2KCkuZmluZCgiLnByb2R1Y3RJbWciKS5hdHRyKCJocmVmIiwgdXJsMik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodXJsLmluZGV4T2YoIi8vbWFpeWFvLmxpYW5neGlueWFvLmNvbS9zaG9wL3ZpZXdfc2hvcC5odG0iKSA+IDApIHsKICAgICAgICAgICAgcHJpY2UgPSBzZWxlY3Rvci5wcmV2KCkucHJldigpLmZpbmQoIi5jLXByaWNlIikuaHRtbCgpOwogICAgICAgICAgICBpZiAocHJpY2UgPiAwKSB7CiAgICAgICAgICAgICAgICBwcmljZSA9IHNlbGVjdG9yLnByZXYoKS5wcmV2KCkuZmluZCgiLmMtcHJpY2UiKS5odG1sKCk7CiAgICAgICAgICAgICAgICBpZiAodXJsMiAhPSAnJykgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnByZXYoKS5wcmV2KCkuZmluZCgiYSIpLmF0dHIoImhyZWYiLCB1cmwyKTsKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci5wcmV2KCkucHJldigpLnByZXYoKS5maW5kKCJhIikuYXR0cigiaHJlZiIsIHVybDIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHJpY2UgPSBzZWxlY3Rvci5wcmV2KCkuZmluZCgiLmMtcHJpY2UiKS5odG1sKCk7CiAgICAgICAgICAgICAgICBpZiAodXJsMiAhPSAnJykgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnByZXYoKS5maW5kKCJhIikuYXR0cigiaHJlZiIsIHVybDIpOwogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLnByZXYoKS5wcmV2KCkuZmluZCgiYSIpLmF0dHIoImhyZWYiLCB1cmwyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh1cmwuaW5kZXhPZigiLy9zZWFyY2guamQuY29tL1NlYXJjaCIpID4gMCB8fCB1cmwuaW5kZXhPZigiLy9saXN0LmpkLmNvbS9saXN0Lmh0bWwiKSA+IDAgfHwgdXJsLmluZGV4T2YoIi8vaS1zZWFyY2guamQuY29tL1NlYXJjaCIpID4gMCkgewogICAgICAgICAgICBwcmljZSA9IHNlbGVjdG9yLnByZXYoKS5maW5kKCIucC1wcmljZSIpLmZpbmQoImkiKS5odG1sKCk7CiAgICAgICAgICAgIGlmIChwcmljZSA+IDApIHsKICAgICAgICAgICAgICAgIHByaWNlID0gc2VsZWN0b3IucHJldigpLmZpbmQoIi5wLXByaWNlIikuZmluZCgiaSIpLmh0bWwoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh1cmwudG9Mb3dlckNhc2UoKS5pbmRleE9mKCIvL3NlYXJjaC5qZC5oay9zZWFyY2giLnRvTG93ZXJDYXNlKCkpID4gMCkgewogICAgICAgICAgICBwcmljZSA9IHNlbGVjdG9yLnByZXYoKS5maW5kKCIucHJpY2UiKS5maW5kKCJzcGFuIikuaHRtbCgpLnNwbGl0KCc+JylbMl07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHVybC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIi8vd3d3LmpkLmNvbS94aW5rdWFuIi50b0xvd2VyQ2FzZSgpKSA+IDApIHsKICAgICAgICAgICAgcHJpY2UgPSBzZWxlY3Rvci5wcmV2KCkuZmluZCgiLnByaWNlIikuZmluZCgic3Ryb25nIikuaHRtbCgpLnNwbGl0KCfCpScpWzFdOwogICAgICAgICAgICBpZiAocHJpY2UgPT0gIuaaguaXoOaKpeS7tyIpIHsgcmV0dXJuOyB9CiAgICAgICAgfQoKICAgICAgICBpZiAob2JqLnNpdGVfdHlwZSgpICE9ICJ2aXBfbGlzdF9wYWdlIiAmJiBvYmouc2l0ZV90eXBlKCkgIT0gImthb2xhX2xpc3RfcGFnZSIpIHsKICAgICAgICAgICAgdmFyIHJtX01vbmV5X2NsYyA9IE1hdGgucm91bmQoTWF0aC5mbG9vcigocHJpY2UgLSBjb3Vwb25Nb25leSkgKiBybV9Nb25leSAqIDEwMDApIC8gMTApIC8gMTAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBybV9Nb25leV9jbGMgPSBNYXRoLmZsb29yKHJldHVybl9tb25leSAqIDEwMCkgLyAxMDA7CiAgICAgICAgfQoKICAgICAgICBpZiAocm1fTW9uZXlfY2xjIDwgMCkgewogICAgICAgICAgICBybV9Nb25leV9jbGMgPSBNYXRoLnJvdW5kKE1hdGguZmxvb3IocHJpY2UgKiBybV9Nb25leSAqIDEwMDApIC8gMTApIC8gMTAwOwogICAgICAgIH0KCiAgICAgICAgaWYgKHJtX01vbmV5X2NsYyAhPSAwKSB7CiAgICAgICAgICAgIHNlbGVjdG9yLm5leHQoKS5odG1sKAogICAgICAgICAgICAgICAgJzxhIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0idGItY29vbC1ib3gtaW5mbyB0Yi1jb29sLWJveC1pbmZvLWZpbmQtcm0iIHRpdGxlPSLkvb/nlKhBUFDjgIzoirHliY3nnIHkuIDnnIHjgI3miavnoIHlrp3otJ3or6bmg4XpobXkuoznu7TnoIHlj6/lvpfov5TnjrAiPui/lOeOsO+8iOe6picgKwogICAgICAgICAgICAgICAgcm1fTW9uZXlfY2xjICsKICAgICAgICAgICAgICAgICLlhYPvvIk8L2E+IgogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc2VsZWN0b3IubmV4dCgpLmh0bWwoCiAgICAgICAgICAgICAgICAnPGEgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJ0Yi1jb29sLWJveC1pbmZvIHRiLWNvb2wtYm94LWluZm8tZmluZCIgdGl0bGU9IuaYvuekui/pmpDol48iPuaXoOi/lOeOsDwvYT4nCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfTsKICAgIC8vIOacgOeugOWNleaVsOe7hOWOu+mHjeazlQogICAgb2JqLnVuaXF1ZUFyciA9IGZ1bmN0aW9uIChhcnJheSkgewogICAgICAgIHZhciBuID0gW107IC8v5LiA5Liq5paw55qE5Li05pe25pWw57uECiAgICAgICAgLy/pgY3ljoblvZPliY3mlbDnu4QKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8v5aaC5p6c5b2T5YmN5pWw57uE55qE56ysaeW3sue7j+S/neWtmOi/m+S6huS4tOaXtuaVsOe7hO+8jOmCo+S5iOi3s+i/h++8jAogICAgICAgICAgICAvL+WQpuWImeaKiuW9k+WJjemhuXB1c2jliLDkuLTml7bmlbDnu4Tph4zpnaIKICAgICAgICAgICAgaWYgKG4uaW5kZXhPZihhcnJheVtpXSkgPT0gLTEgJiYgYXJyYXlbaV0gIT0gJycpIG4ucHVzaChhcnJheVtpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuOwogICAgfQogICAgb2JqLmlzTnVtYmVyID0gZnVuY3Rpb24gKHZhbCkgewogICAgICAgIHZhciByZWdQb3MgPSAvXlxkKyhcLlxkKyk/JC87IC8v6Z2e6LSf5rWu54K55pWwCiAgICAgICAgdmFyIHJlZ05lZyA9IC9eKC0oKFswLTldK1wuWzAtOV0qWzEtOV1bMC05XSopfChbMC05XSpbMS05XVswLTldKlwuWzAtOV0rKXwoWzAtOV0qWzEtOV1bMC05XSopKSkkLzsgLy/otJ/mta7ngrnmlbAKICAgICAgICBpZiAocmVnUG9zLnRlc3QodmFsKSB8fCByZWdOZWcudGVzdCh2YWwpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBvYmouc2hvd0Jhc2ljUXVlcnlFbXB0eSA9IGZ1bmN0aW9uIChzZWxlY3RvcikgewogICAgICAgIC8vIHNlbGVjdG9yLmFkZENsYXNzKCJ0Yi1jb29sLWJveC1pbmZvLXRyYW5zbHVjZW50Iik7CiAgICAgICAgc2VsZWN0b3IuaHRtbCgnPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyIgY2xhc3M9InRiLWNvb2wtYm94LWluZm8gdGItY29vbC1ib3gtaW5mby1lbXB0eSIgc3R5bGU9Im9wYWNpdHk6MC41OyIgdGl0bGU9IuWIh+aNoumAj+aYjuW6piI+5pqC5peg5LyY5oOgPC9hPicpOwogICAgICAgIHNlbGVjdG9yLm5leHQoKS5odG1sKCc8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBjbGFzcz0idGItY29vbC1ib3gtaW5mbyB0Yi1jb29sLWJveC1pbmZvLWVtcHR5IiBzdHlsZT0ib3BhY2l0eTowLjU7IiB0aXRsZT0i5YiH5o2i6YCP5piO5bqmIj7mmoLml6Dov5TnjrA8L2E+Jyk7CiAgICB9OwoKICAgIG9iai5zaXRlX3R5cGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHVybCA9IGxvY2F0aW9uLmhyZWY7CiAgICAgICAgaWYgKAogICAgICAgICAgICB1cmwuaW5kZXhPZigiLy9pdGVtLnRhb2Jhby5jb20vaXRlbS5odG0iKSA+IDAgfHwKICAgICAgICAgICAgdXJsLmluZGV4T2YoIi8vZGV0YWlsLnRtYWxsLmNvbS9pdGVtLmh0bSIpID4gMCB8fAogICAgICAgICAgICB1cmwuaW5kZXhPZigiLy9jaGFvc2hpLmRldGFpbC50bWFsbC5jb20vaXRlbS5odG0iKSA+IDAgfHwKICAgICAgICAgICAgdXJsLmluZGV4T2YoIi8vZGV0YWlsLnRtYWxsLmhrL2hrL2l0ZW0uaHRtIikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL2RldGFpbC5saWFuZ3hpbnlhby5jb20vaXRlbS5odG0iKSA+IDAgfHwKICAgICAgICAgICAgdXJsLmluZGV4T2YoIi8vd29ybGQudG1hbGwuY29tIikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL2RldGFpbC50bWFsbC5oay9pdGVtLmh0bSIpID4gMAogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gInRhb2Jhb19kZXRhaWxzX3BhZ2UiOwogICAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL21haXlhby5saWFuZ3hpbnlhby5jb20vc2hvcC92aWV3X3Nob3AuaHRtIikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL2xpc3QudG1hbGwuY29tL3NlYXJjaF9wcm9kdWN0Lmh0bSIpID4gMCB8fAogICAgICAgICAgICB1cmwuaW5kZXhPZigiLy9zLnRhb2Jhby5jb20vc2VhcmNoIikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL2xpc3QudG1hbGwuaGsvc2VhcmNoX3Byb2R1Y3QuaHRtIikgPiAwCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAidGFvYmFvX2xzdF9wYWdlIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoCiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL3NlYXJjaC5qZC5jb20vU2VhcmNoIikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL3NlYXJjaC5qZC5oay9zZWFyY2giKSA+IDAgfHwKICAgICAgICAgICAgdXJsLmluZGV4T2YoIi8vd3d3LmpkLmNvbS94aW5rdWFuIikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL2xpc3QuamQuY29tL2xpc3QuaHRtbCIpID4gMCB8fAogICAgICAgICAgICB1cmwuaW5kZXhPZigiLy9pLXNlYXJjaC5qZC5jb20vU2VhcmNoIikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL3NlYXJjaC5qZC5oay9TZWFyY2giKSA+IDAKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuICJqaW5nZG9uZ19sc3RfcGFnZSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKAogICAgICAgICAgICB1cmwuaW5kZXhPZigiLy9pdGVtLmpkLmhrIikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL3BjaXRlbS5qZC5oayIpID4gMCB8fAogICAgICAgICAgICB1cmwuaW5kZXhPZigiLy9pLWl0ZW0uamQuY29tIikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL2l0ZW0uamQuY29tIikgPiAwCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAiamluZ2RvbmdfZGV0YWlsc19wYWdlIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoCiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL2NhdGVnb3J5LnZpcC5jb20vc3VnZ2VzdC5waHAiKSA+IDAgfHwKICAgICAgICAgICAgdXJsLmluZGV4T2YoIi8vbGlzdC52aXAuY29tIikgPiAwCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAidmlwX2xpc3RfcGFnZSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKAogICAgICAgICAgICB1cmwuaW5kZXhPZigiLy9kZXRhaWwudmlwLmNvbSIpID4gMAogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gInZpcF9kZXRhaWxfcGFnZSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKAogICAgICAgICAgICB1cmwuaW5kZXhPZigiLy9tLnZpcC5jb20vcHJvZHVjdCIpID4gMAogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gInZpcF9kZXRhaWxfcGFnZV9tIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoCiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL2dvb2RzLmthb2xhLmNvbS9wcm9kdWN0IikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL2dvb2RzLmthb2xhLmNvbS5oay9wcm9kdWN0IikgPiAwCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAia2FvbGFfZGV0YWlsX3BhZ2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgKICAgICAgICAgICAgdXJsLmluZGV4T2YoIi8vc2VhcmNoLmthb2xhLmNvbS9zZWFyY2guaHRtbCIpID4gMAogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gImthb2xhX2xpc3RfcGFnZSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKAogICAgICAgICAgICB1cmwuaW5kZXhPZigiLy9wcm9kdWN0LnN1bmluZy5jb20iKSA+IDAKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuICJzdW5pbmdfZGV0YWlsX3BhZ2UiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgKICAgICAgICAgICAgdXJsLmluZGV4T2YoIi8vd3d3LnZtYWxsLmNvbS9wcm9kdWN0IikgPiAwCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAiaHVhd2VpX2RldGFpbF9wYWdlIjsKICAgICAgICB9CiAgICB9CiAgICBvYmoucGxhdGZvcm0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHVybCA9IGxvY2F0aW9uLmhvc3Q7CiAgICAgICAgaWYgKAogICAgICAgICAgICB1cmwuaW5kZXhPZigidGFvYmFvLmNvbSIpID4gMCB8fAogICAgICAgICAgICB1cmwuaW5kZXhPZigidG1hbGwuY29tIikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCJ0bWFsbC5oayIpID4gMCB8fAogICAgICAgICAgICB1cmwuaW5kZXhPZigibGlhbmd4aW55YW8uY29tIikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCJhbGlwYXkuY29tIikgPiAwCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAidGFvYmFvIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoCiAgICAgICAgICAgIHVybC5pbmRleE9mKCJqZC5jb20iKSA+IDAgfHwKICAgICAgICAgICAgdXJsLmluZGV4T2YoImpkLmhrIikgPiAwCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAiamluZ2RvbmciOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgKICAgICAgICAgICAgdXJsLmluZGV4T2YoInZpcC5jb20iKSA+IDAKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuICJ2aXAiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgKICAgICAgICAgICAgdXJsLmluZGV4T2YoImthb2xhLmNvbSIpID4gMAogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gImthb2xhIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoCiAgICAgICAgICAgIHVybC5pbmRleE9mKCJzdW5pbmcuY29tIikgPiAwCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAic3VuaW5nIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoCiAgICAgICAgICAgIHVybC5pbmRleE9mKCJ2bWFsbC5jb20iKSA+IDAKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuICJodWF3ZWkiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgKICAgICAgICAgICAgdXJsLmluZGV4T2YoInhpYW9taXlvdXBpbi5jb20iKSA+IDAKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuICJ4aWFvbWl5b3VwaW4iOwogICAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgICAgIHVybC5pbmRleE9mKCJwaW5kdW9kdW8uY29tIikgPiAwCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAicGluZHVvZHVvIjsKICAgICAgICB9CiAgICB9CiAgICBvYmouaXNEZXRhaWxQYWdlVGFvQmFvID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgIGlmICgKICAgICAgICAgICAgdXJsLmluZGV4T2YoIi8vaXRlbS50YW9iYW8uY29tL2l0ZW0uaHRtIikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL2RldGFpbC50bWFsbC5jb20vaXRlbS5odG0iKSA+IDAgfHwKICAgICAgICAgICAgdXJsLmluZGV4T2YoIi8vY2hhb3NoaS5kZXRhaWwudG1hbGwuY29tL2l0ZW0uaHRtIikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL2RldGFpbC50bWFsbC5oay9oay9pdGVtLmh0bSIpID4gMAogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfTsKCiAgICBvYmouRGV0YWlsUGFnZVRCX29yX1RNX29yX0pEID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciB1cmwgPSBsb2NhdGlvbi5ocmVmOwogICAgICAgIGlmICh1cmwuaW5kZXhPZigiLy9pdGVtLnRhb2Jhby5jb20vaXRlbS5odG0iKSA+IDAgfHwKICAgICAgICAgICAgdXJsLmluZGV4T2YoIi8vZGV0YWlsLmxpYW5neGlueWFvLmNvbS9pdGVtLmh0bSIpID4gMAogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoCiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL2RldGFpbC50bWFsbC5jb20vaXRlbS5odG0iKSA+IDAgfHwKICAgICAgICAgICAgdXJsLmluZGV4T2YoIi8vY2hhb3NoaS5kZXRhaWwudG1hbGwuY29tL2l0ZW0uaHRtIikgPiAwIHx8CiAgICAgICAgICAgIHVybC5pbmRleE9mKCIvL2RldGFpbC50bWFsbC5oay9oay9pdGVtLmh0bSIpID4gMCB8fAogICAgICAgICAgICB1cmwuaW5kZXhPZigiLy93b3JsZC50bWFsbC5jb20iKSA+IDAgfHwKICAgICAgICAgICAgdXJsLmluZGV4T2YoIi8vZGV0YWlsLnRtYWxsLmhrL2l0ZW0uaHRtIikgPiAwCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gImppbmdkb25nX2RldGFpbHNfcGFnZSIpIHsKICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgfQogICAgfTsKCgogICAgb2JqLmlzVmFpbGlkSXRlbUlkID0gZnVuY3Rpb24gKGl0ZW1JZCkgewogICAgICAgIGlmICghaXRlbUlkKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdmFyIGl0ZW1JZEludCA9IHBhcnNlSW50KGl0ZW1JZCk7CiAgICAgICAgaWYgKGl0ZW1JZEludCA9PSBpdGVtSWQgJiYgaXRlbUlkID4gMTAwMDApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH07CgogICAgb2JqLmlzVmFsaWROaWQgPSBmdW5jdGlvbiAobmlkKSB7CiAgICAgICAgaWYgKCFuaWQpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZSBpZiAobmlkLmluZGV4T2YoImh0dHAiKSA+PSAwKSB7CiAgICAgICAgICAgIGlmIChvYmouaXNEZXRhaWxQYWdlVGFvQmFvKG5pZCkgfHwgbmlkLmluZGV4T2YoIi8vZGV0YWlsLmp1LnRhb2Jhby5jb20vaG9tZS5odG0iKSA+IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfTsKCgogICAgb2JqLmdldF90Yl9wcmljZSA9IGZ1bmN0aW9uIChwcmljZV9zdHIpIHsKICAgICAgICB2YXIgcHJpY2UgPSAnJzsKICAgICAgICBpZiAocHJpY2Vfc3RyICE9IG51bGwpIHsKICAgICAgICAgICAgaWYgKHByaWNlX3N0ci5pbmRleE9mKCItIikgPiAwKSB7CiAgICAgICAgICAgICAgICBwcmljZSA9IHByaWNlX3N0ci5zcGxpdCgiLSIpWzBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHJpY2UgPSBwcmljZV9zdHI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHByaWNlOwogICAgfTsKCiAgICBvYmouZ2V0X2RhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gYWxlcnQoMSk7CiAgICAgICAgdmFyIG9wZXJhdGUgPSAnJzsKICAgICAgICBpZiAob2JqLnNpdGVfdHlwZSgpID09ICJ2aXBfZGV0YWlsX3BhZ2UiKSB7CiAgICAgICAgICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoIndxPTEiKSA+IDApIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIG9wZXJhdGUgPSAiZ2V0X2luZm9fdmlwJnZpcF90eXBlPTEiOwogICAgICAgIH0gZWxzZSBpZiAob2JqLnNpdGVfdHlwZSgpID09ICJ2aXBfZGV0YWlsX3BhZ2VfbSIpIHsKICAgICAgICAgICAgdmFyIGFycnlfdXJsX3RtcCA9IGxvY2F0aW9uLmhyZWYuc3BsaXQoJ20udmlwLmNvbS9wcm9kdWN0Jyk7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYXJyeV91cmxfdG1wWzBdICsgJ2RldGFpbC52aXAuY29tL2RldGFpbCcgKyBhcnJ5X3VybF90bXBbMV07CiAgICAgICAgICAgIHN0b3AgPSAnMSc7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIHVybCA9ICJodHRwczovL3d3dy55b3V5aXpoaW5lbmcudG9wL3F1ZXJ5X2NvdXBvbi9xdWVyeV9jb3Vwb25fdjIxMDEyMC5waHA/b3BlcmF0ZT1nZXRfaW5mbyZkYXRhX2k9IiArIGVuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKTsKICAgICAgICBjb25zb2xlLmxvZyh1cmwpOwogICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PScpOwoKICAgICAgICAkMi5hamF4KHsKICAgICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICAgIGFzeW5jOiBmYWxzZSwKICAgICAgICAgICAgdGltZW91dDogNTAwLAogICAgICAgICAgICAvLyBkYXRhVHlwZTogImpzb24iLAogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhkYXRhKTsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YV90bXAgPSBKU09OLnBhcnNlKGRhdGEpOwogICAgICAgICAgICAgICAgICAgIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gInRhb2Jhb19kZXRhaWxzX3BhZ2UiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhX3RtcC5kYXRhX2lpID4gMCkgeyByZXR1cm47IH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFfdG1wLmRhdGFfaSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZGF0YV90bXAuZGF0YV9pOwogICAgICAgICAgICAgICAgICAgICAgICBzdG9wID0gJzEnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggeyB9CiAgICAgICAgICAgIH0KICAgICAgICB9KQogICAgfTsKCiAgICBvYmouZ2VuZXJhdGVfdHJlbmRfZGF0YSA9IGZ1bmN0aW9uIChhbGxfYmVnaW5fdGltZSwgYWxsX2xpbmUpIHsKCiAgICAgICAgaWYgKGFsbF9saW5lLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFsbF9saW5lLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgdmFyIGRhdGFfdG1wID0ge307CiAgICAgICAgICAgICAgICB2YXIgbmV3VGltZSA9IG5ldyBEYXRlKGFsbF9iZWdpbl90aW1lKTsKICAgICAgICAgICAgICAgIG5ld1RpbWUgPSBuZXdUaW1lLnNldERhdGUobmV3VGltZS5nZXREYXRlKCkgKyBpbmRleCk7CiAgICAgICAgICAgICAgICBuZXdUaW1lID0gbmV3IERhdGUobmV3VGltZSk7CgogICAgICAgICAgICAgICAgdmFyIG5ld1RpbWVfZCA9IChuZXdUaW1lLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAiLSIgKyBuZXdUaW1lLmdldERhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAiLSIgKyBuZXdUaW1lLmdldEZ1bGxZZWFyKCkgKyAiIEdNVCI7CiAgICAgICAgICAgICAgICBkYXRhX3RtcFsieCJdID0gbmV3VGltZV9kOwogICAgICAgICAgICAgICAgZGF0YV90bXBbInkiXSA9IGFsbF9saW5lW2luZGV4XTsKICAgICAgICAgICAgICAgIG9wdGlvbnMuc2VyaWVzWzBdLmRhdGEucHVzaChkYXRhX3RtcCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgb2JqLnF1ZXJ5X3RyZW5kX2RhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy/ojrflvpfku7fmoLzms6Lliqh2YXIgdXJsID0gbG9jYXRpb24uaHJlZjsKICAgICAgICB2YXIgZ3dkVXJsID0gImh0dHBzOi8vYnJvd3Nlci5nd2RhbmcuY29tL2V4dGVuc2lvbi9wcmljZV90b3dhcmRzP3VybD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpOwogICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgdXJsOiBnd2RVcmwsCiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgICAgIHRpbWVvdXQ6IDEwMDAwLAogICAgICAgICAgICBoZWFkZXJzOiB7CiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgICAgICAgICdDYWNoZS1Db250cm9sJzogJ3B1YmxpYycKICAgICAgICAgICAgfSwKICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICAgICAgICAvL2xvYWRpbmdNYXNrLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobWFzayk7CiAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShyZXMucmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBqc29uOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuaXNfYmFuID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0eXBlb2YgKGRhdGEuc3RvcmUpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYWxsX2xpbmU7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFsbF9iZWdpbl90aW1lOwogICAgICAgICAgICAgICAgICAgIGlmICgkMigiI2Zsb2F0X2RpdiIpLmNzcygiZGlzcGxheSIpID09ICJibG9jayIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGRhdGEuc3RvcmUpICE9ICJ1bmRlZmluZWQiICYmIGRhdGEuc3RvcmVbMF0uYWxsX2xpbmUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBhbGxfYmVnaW5fdGltZSA9IGRhdGEuc3RvcmVbMF0uYWxsX2xpbmVfYmVnaW5fdGltZTsKICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2xpbmUgPSBkYXRhLnN0b3JlWzBdLmFsbF9saW5lOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsX2xpbmUubGVuZ3RoICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5nZW5lcmF0ZV90cmVuZF9kYXRhKGFsbF9iZWdpbl90aW1lLCBhbGxfbGluZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnRpdGxlLnRleHQgPSAi6Iqx5YmN55yB5LiA55yBLeacrOWVhuWTgeaaguaXoOWOhuWPsuaVsOaNriI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudGl0bGUudGV4dCA9ICLoirHliY3nnIHkuIDnnIEt5pys5ZWG5ZOB5pqC5peg5Y6G5Y+y5pWw5o2uIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coY2hlY2tfdXJsKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50aXRsZS50ZXh0ID0gIuacrOasoemcgOimgemqjOivgTrjgJDngrnlh7vkuIrmlrnmjInpkq7ov5vooYzpqozor4HjgJEiOwogICAgICAgICAgICAgICAgICAgIGNoZWNrX3VybCA9IGRhdGEuYWN0aW9uLnRvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb2JqLmFkZF9pZnJhbWUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgb2JqLmFkZF9pZnJhbWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKG9wdGlvbnMudGl0bGUudGV4dCA9PSAi6Iqx5YmN55yB5LiA55yBLeacrOWVhuWTgeaaguaXoOWOhuWPsuaVsOaNriIpIHsKICAgICAgICAgICAgJDIoIi5pbWFnZS1zdGF0dXMiKS5hdHRyKCJ0aXRsZSIsICLljoblj7LmlbDmja7liqDovb3miJDlip8iKTsKICAgICAgICAgICAgJDIoIi5pbWFnZS1zdGF0dXMiKS5hdHRyKCJzcmMiLCAiaHR0cHM6Ly9zMS5heDF4LmNvbS8yMDIwLzEwLzI2L0JuWVFrbi5wbmciKTsKCiAgICAgICAgICAgICQyKCIuc3RhdHVzLXNwYW4iKS5odG1sKCLnu4/mn6Xor6LvvIzmnKzllYblk4HmmoLml6Dljoblj7LmlbDmja4iKTsKICAgICAgICAgICAgJDIoIiNjb3Vwb24td3JhcC10cmVuZCIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICQyKCIudHJlbmQtZGl2IikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5zZXJpZXNbMF0uZGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICQyKCIuaW1hZ2Utc3RhdHVzIikuYXR0cigidGl0bGUiLCAi5Y6G5Y+y5pWw5o2u5Yqg6L295oiQ5YqfIik7CiAgICAgICAgICAgICQyKCIuaW1hZ2Utc3RhdHVzIikuYXR0cigic3JjIiwgImh0dHBzOi8vczEuYXgxeC5jb20vMjAyMC8xMC8yNi9CbllRa24ucG5nIik7CgogICAgICAgICAgICBjaGFydCA9IG5ldyBBcGV4Q2hhcnRzKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNjaGFydCIpLCBvcHRpb25zKTsKICAgICAgICAgICAgY2hhcnQucmVuZGVyKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy/lnKhjaGFydOS4iuaPkOekuuaYvuekuuaWh+WtlwogICAgICAgICAgICAkMigiLnRyZW5kLWRpdiIpLmFwcGVuZCgnPHNwYW4gY2xhc3M9ImNvdmVyLWNoYXJ0LXNwYW4iPjwvc3Bhbj4nKTsKCiAgICAgICAgICAgICQyKCIuaW1hZ2Utc3RhdHVzIikuYXR0cigidGl0bGUiLCAi6ZyA6KaB6aqM6K+BIik7CiAgICAgICAgICAgICQyKCIuaW1hZ2Utc3RhdHVzIikuYXR0cigic3JjIiwgImh0dHBzOi8vczEuYXgxeC5jb20vMjAyMC8xMC8yNi9CbllrZlAuZ2lmIik7CiAgICAgICAgICAgICQyKCIuaW1hZ2Utc3RhdHVzIikuY3NzKCJjdXJzb3IiLCAicG9pbnRlciIpOwogICAgICAgICAgICAkMigiI2NvdXBvbi13cmFwLXRyZW5kIikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKCiAgICAgICAgICAgICQyKCIuc3RhdHVzLXNwYW4iKS5odG1sKCLihpAg54K55Ye75bem5L6n5oyJ6ZKu6aqM6K+BIik7CgogICAgICAgICAgICAkMigiLmltYWdlLXN0YXR1cyIpLmNsaWNrKGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgJDIoImJvZHkiKS5hcHBlbmQoJzxkaXYgaWQ9ImZsb2F0X2RpdiIgY2xhc3M9ImZyYW1lX2RpdiI+PC9kaXY+Jyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZmxvYXRfZGl2Iikuc3R5bGUubGVmdCA9ICh3aW5kb3cuc2NyZWVuLndpZHRoIC0gODAwKSAvIDIgKyAicHgiOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZsb2F0X2RpdiIpLnN0eWxlLnRvcCA9ICh3aW5kb3cuc2NyZWVuLmhlaWdodCAtIDUwMCkgLyAyICsgInB4IjsKICAgICAgICAgICAgICAgICQyKCIjZmxvYXRfZGl2IikuYXBwZW5kKCc8aWZyYW1lIGlkPSJpZnJhbWVfY2hlY2siIHNyYz0iIiA+PC9pZnJhbWU+Jyk7CiAgICAgICAgICAgICAgICAkMigiI2lmcmFtZV9jaGVjayIpLmF0dHIoInNyYyIsIGNoZWNrX3VybCk7CiAgICAgICAgICAgICAgICAkMigiI2lmcmFtZV9jaGVjayIpLmF0dHIoInNjcm9sbGluZyIsICJubyIpOwogICAgICAgICAgICAgICAgJDIoIiNmbG9hdF9kaXYiKS5hcHBlbmQoJzxkaXYgY2xhc3M9ImNvdmVyIj48aW1nIHNyYz0iaHR0cHM6Ly9zMS5heDF4LmNvbS8yMDIwLzA5LzIzL3dqU0I0Sy5wbmciIGFsdD0i5pyq5ZG95ZCNMTYwMDgyNTE2OSIgYm9yZGVyPSIwIj48YnI+6aqM6K+B5ZCO5bCG6Ieq5Yqo5Yi35paw77yM6Iul5LiA55u06aqM6K+B5aSx6LSl77yMPGEgc3R5bGU9ImNvbG9yOnJlZCIgdGFyZ2V0PSJfYmxhbmsiICBocmVmPSInICsgY2hlY2tfdXJsICsgJyI+54K55Ye75q2k5aSEPC9hPuWcqOeLrOeri+mhtemdouS4remqjOivgeWQjuWFs+mXreWNs+WPrzwvZGl2PicpOwogICAgICAgICAgICAgICAgJDIoIiNmbG9hdF9kaXYiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwogICAgICAgICAgICAgICAgLy/lhbPpl63mjInpkq4KICAgICAgICAgICAgICAgICQyKCIjZmxvYXRfZGl2IikuYXBwZW5kKCc8aW1nIGNsYXNzPSJjb3Zlci1jbG9zZSIgc3JjPSJodHRwczovL3MxLmF4MXguY29tLzIwMjAvMTAvMjYvQm5ZWVhGLnBuZyIgPjwvaW1nPicpOwogICAgICAgICAgICAgICAgJDIoIi5jb3Zlci1jbG9zZSIpLmNsaWNrKGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICQyKCIjZmxvYXRfZGl2IikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKCQyKCIjZmxvYXRfZGl2IikuY3NzKCJkaXNwbGF5IikgPT0gImJsb2NrIikgewogICAgICAgICAgICAgICAgICAgICQyKCIjZmxvYXRfZGl2IikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJDIoIiNmbG9hdF9kaXYiKS5jc3MoImRpc3BsYXkiLCAiYmxvY2siKTsKICAgICAgICAgICAgICAgICAgICB2YXIgd19jaGVjayA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnF1ZXJ5X3RyZW5kX2RhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuc2VyaWVzWzBdLmRhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cob3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMigiI2Zsb2F0X2RpdiIpLmNzcygiZGlzcGxheSIsICJub25lIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydCA9IG5ldyBBcGV4Q2hhcnRzKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNjaGFydCIpLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0LnJlbmRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh3X2NoZWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIDEwMDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgb2JqLmNsb3NlID0gZnVuY3Rpb24gKCkgewogICAgICAgIHdpbmRvdy5jbG9zZSgpOwogICAgfQogICAgb2JqLmNzc1BhdGggPSBmdW5jdGlvbiAoZWwpIHsKICAgICAgICBpZiAoIShlbCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIHBhdGggPSBbXTsKICAgICAgICB3aGlsZSAoZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3RvciA9IGVsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGlmIChlbC5pZCkgewogICAgICAgICAgICAgICAgc2VsZWN0b3IgKz0gJyMnICsgZWwuaWQ7CiAgICAgICAgICAgICAgICBwYXRoLnVuc2hpZnQoc2VsZWN0b3IpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlbC5jbGFzc05hbWUpLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RyX2NsYXNzID0gJDIudHJpbShlbC5jbGFzc05hbWUpOwogICAgICAgICAgICAgICAgc3RyX2NsYXNzID0gc3RyX2NsYXNzLnJlcGxhY2UoL1xzKy9nLCAnICcpOwogICAgICAgICAgICAgICAgc2VsZWN0b3IgKz0gJy4nICsgc3RyX2NsYXNzLnJlcGxhY2UoL1wgL2csICcuJyk7CiAgICAgICAgICAgICAgICBwYXRoLnVuc2hpZnQoc2VsZWN0b3IpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgc2liID0gZWwsIG50aCA9IDE7CiAgICAgICAgICAgICAgICB3aGlsZSAoc2liID0gc2liLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2liLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbnRoKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG50aCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgKz0gIjpudGgtb2YtdHlwZSgiICsgbnRoICsgIikiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHBhdGgudW5zaGlmdChzZWxlY3Rvcik7CiAgICAgICAgICAgIGVsID0gZWwucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhdGguam9pbigiID4gIik7CiAgICB9CiAgICBvYmouaXNQYXJlbnQgPSBmdW5jdGlvbiAob2JqLCBwYXJlbnRPYmopIHsKICAgICAgICB3aGlsZSAob2JqICE9IHVuZGVmaW5lZCAmJiBvYmogIT0gbnVsbCAmJiBvYmoudGFnTmFtZSAhPSBudWxsICYmIG9iai50YWdOYW1lLnRvVXBwZXJDYXNlKCkgIT0gJ0JPRFknKSB7CiAgICAgICAgICAgIGlmIChvYmogPT0gcGFyZW50T2JqKSB7IHJldHVybiB0cnVlOyB9CiAgICAgICAgICAgIG9iaiA9IG9iai5wYXJlbnROb2RlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBvYmouY2xlYXJBbGxOb2RlcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzcGxheUJ1dHRvbicpLmlubmVySFRNTCA9ICcnOwogICAgfQogICAgLy8jcmVnaW9uIOWIneWni+WMluiuvue9rgogICAgb2JqLmluaXRpYWxTZXR1cCA9IGZ1bmN0aW9uICgpIHsKCiAgICB9CiAgICAvLyNlbmRyZWdpb24g5Yid5aeL5YyW6K6+572uCiAgICB2YXIgc3RhcnRNb25pdG9yaW5nRmxhZyA9ICcwJwogICAgdmFyIHNldHRpbWVfbXMgPSAwCiAgICB2YXIgY3JpdGljYWxWYWx1ZSA9IDMwMDAwIC8vMC415YiG6ZKfCiAgICB2YXIgc2V0dGltZV9tc19kaWZmZXJlbmNlX2xhc3QgPSBjcml0aWNhbFZhbHVlOwogICAgb2JqLnRpbWluZyA9IGZ1bmN0aW9uIChvcGVyYXRlKSB7CiAgICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGltZXN0YW1wID0gJDIoJyN0aW1lX3NwYW5fbXMnKS5odG1sKCk7CiAgICAgICAgICAgIHZhciBudW1fdGltZXN0YW1wID0gTnVtYmVyKHRpbWVzdGFtcCk7CiAgICAgICAgICAgIHZhciBudW1fdGltZXN0YW1wX25vdyA9IG51bV90aW1lc3RhbXAgKyA1MDsKICAgICAgICAgICAgdmFyIG15ZGF0ZV90bXAgPSBuZXcgRGF0ZShudW1fdGltZXN0YW1wKTsKICAgICAgICAgICAgLy8gJDIoJyN0aW1lX3NwYW4nKS5odG1sKG15ZGF0ZV90bXAudG9Mb2NhbGVTdHJpbmcoJ2NoaW5lc2UnLCB7IGhvdXIxMjogZmFsc2UsIHllYXI6ICdudW1lcmljJywgbW9udGg6ICcyLWRpZ2l0JywgZGF5OiAnMi1kaWdpdCcsIGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcsIHNlY29uZDogJzItZGlnaXQnIH0pICsgJyAnICsgbXlkYXRlX3RtcC5nZXRNaWxsaXNlY29uZHMoKSk7CiAgICAgICAgICAgICQyKCcjdGltZV9zcGFuJykuaHRtbChteWRhdGVfdG1wLkZvcm1hdCgieXl5eS1NTS1kZCBoaDptbTpzcyIpICsgJyAnICsgbXlkYXRlX3RtcC5nZXRNaWxsaXNlY29uZHMoKSk7CiAgICAgICAgICAgICQyKCcjdGltZV9zcGFuX21zJykuaHRtbChudW1fdGltZXN0YW1wX25vdyk7CiAgICAgICAgICAgIGlmIChzdGFydE1vbml0b3JpbmdGbGFnID09ICcxJykgewogICAgICAgICAgICAgICAgLy/lvIDlkK/nm5HmjqflkI4KICAgICAgICAgICAgICAgIHZhciBzZXR0aW1lX21zX2RpZmZlcmVuY2VfY3VycmVudCA9IHNldHRpbWVfbXMgLSBudW1fdGltZXN0YW1wX25vdzsKICAgICAgICAgICAgICAgIGlmIChzZXR0aW1lX21zX2RpZmZlcmVuY2VfY3VycmVudCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBsYW5JZCA9ICQyKCIjcGFuaWNCdXlpbmdQbGFuIikudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGtleV9pbmZvID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmpfcGxhbnNbcGxhbklkXVsna2V5cyddW2xvY2F0aW9uLmhvc3RdKSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlY29uZCA9IE51bWJlcigkMignI2R1cmF0aW9uJykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihzZWNvbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCA9IDYwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvYmouc2V0VmlydHVhbENvb2tpZShwbGFuSWQsICcxJywgb2JqLmdldF9kYXRlX25vd19tcygpLCBzZWNvbmQgKiAxMDAwKTsKICAgICAgICAgICAgICAgICAgICBvYmouYWRkQ2xpY2tUYXNrKGtleV9pbmZvKTsKICAgICAgICAgICAgICAgICAgICBzdGFydE1vbml0b3JpbmdGbGFnID0gJzAnOwogICAgICAgICAgICAgICAgICAgICQyKCcjcnVuU3RhdHVzJykudmFsKCfmlrnmoYjlt7Lnu4/miafooYzvvIzlj6/lnKjov5DooYzkuK3nmoTph4zpnaLmib7liLDmlrnmoYjlubblgZzmraInKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNldHRpbWVfbXNfZGlmZmVyZW5jZV9jdXJyZW50IDwgY3JpdGljYWxWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICQyKCcjcnVuU3RhdHVzJykudmFsKCflgJLorqHml7bvvJonICsgKChzZXR0aW1lX21zX2RpZmZlcmVuY2VfY3VycmVudCkgLyAxMDAwKS50b1N0cmluZygpICsgJ+enkicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJDIoJyNydW5TdGF0dXMnKS52YWwoJ+W8gOWni+ebkeaOpyzlsIblnKggJyArIGNyaXRpY2FsVmFsdWUgLyAxMDAwICsgJ+enkuWQjuW8gOWni+WAkuiuoeaXtuW5tuiHquWKqOWQjOatpeaXtumXtCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNldHRpbWVfbXNfZGlmZmVyZW5jZV9jdXJyZW50IDw9IGNyaXRpY2FsVmFsdWUgJiYgc2V0dGltZV9tc19kaWZmZXJlbmNlX2xhc3QgPj0gY3JpdGljYWxWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIG9iai5zeW50aW1lKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2V0dGltZV9tc19kaWZmZXJlbmNlX2xhc3QgPSBzZXR0aW1lX21zX2RpZmZlcmVuY2VfY3VycmVudDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vICQyKCcjcnVuU3RhdHVzJykudmFsKCfnrYnlvoXmiqLotK3vvIzor7fnoa7kv53lt7Lnu4/nmbvpmYblubblt7Lnu4/pgInlpb3llYblk4Hop4TmoLwnKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIDUwKTsKICAgIH0KICAgIG9iai5zdGFydE1vbml0b3JpbmcgPSBmdW5jdGlvbiAocGxhbklkLCBpbmZvKSB7CiAgICAgICAgaWYgKGluZm8gPT0gImZpcnN0X3BhZ2UiKSB7CiAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgfQogICAgfQogICAgb2JqLnN0b3BNb25pdG9yaW5nID0gZnVuY3Rpb24gKCkgewoKICAgIH0KICAgIC8vI3JlZ2lvbiDot7PovazliLDmlrDmlrnmoYjpobUKICAgIG9iai5iaW5kaW5nTm90Q29tcGxldGVkID0gZnVuY3Rpb24gKGluZm8pIHsKICAgICAgICAvL3RvZG8g5aaC5p6c5piv5paw5bu6CiAgICAgICAgaWYgKGluZm8gPT0gJ25ldycpIHsKICAgICAgICAgICAgb2JqLmNsZWFyQWxsTm9kZXMoKTsKICAgICAgICAgICAgdmFyIHBsYW5faWQgPSAncGxhbl8nICsgb2JqLmdldF9kYXRlX25vd19tcygpOwogICAgICAgICAgICAkMigiI3BsYW5JZCIpLmh0bWwocGxhbl9pZCk7CiAgICAgICAgICAgICQyKCIjaXNGaW5pc2giKS5odG1sKCcwJyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBvYmouY2xlYXJBbGxOb2RlcygpOwogICAgICAgICAgICB2YXIgcGxhbl9pZCA9IGluZm87CiAgICAgICAgICAgICQyKCIjcGxhbklkIikuaHRtbChwbGFuX2lkKTsKICAgICAgICAgICAgJDIoIiNpc0ZpbmlzaCIpLmh0bWwob2JqX3BsYW5zW3BsYW5faWRdWydpc2ZpbmlzaCddKTsKICAgICAgICAgICAgJDIoIiNwbGFuTmFtZSIpLnZhbChvYmpfcGxhbnNbcGxhbl9pZF1bJ3BsYW5fbmFtZSddKTsKICAgICAgICAgICAgJDIoIiNwbGFuSW5mbyIpLnZhbChvYmpfcGxhbnNbcGxhbl9pZF1bJ3BsYW5faW5mbyddKTsKICAgICAgICAgICAgdmFyIGFycnlfcGxhbl9rZXlzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gb2JqX3BsYW5zW3BsYW5faWRdLmtleXMpIHsKICAgICAgICAgICAgICAgIGFycnlfcGxhbl9rZXlzLnB1c2gocCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycnlfcGxhbl9rZXlzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgaWYgKGFycnlfcGxhbl9rZXlzW2luZGV4XSAhPSBsb2NhdGlvbi5ob3N0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhvc3RfdG1wID0gYXJyeV9wbGFuX2tleXNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdfZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgICAgICAgICAgbmV3X2Rpdi5pZCA9IGhvc3RfdG1wOwogICAgICAgICAgICAgICAgICAgIG5ld19kaXYuc2V0QXR0cmlidXRlKCdkYXRhLWRvbWFpbk5hbWUnLCBob3N0X3RtcCk7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlCdXR0b24nKS5hcHBlbmRDaGlsZChuZXdfZGl2KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3X3NwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgICAgICAgICAgICAgbmV3X3NwYW4uY2xhc3NOYW1lID0gJ2R5bmFtaWNIb3N0U3Bhbic7CiAgICAgICAgICAgICAgICAgICAgbmV3X3NwYW4uaW5uZXJIVE1MID0gJ1vlt7Lkv53lrZhdICAgICcgKyAn6aG16Z2i77yaJyArIGhvc3RfdG1wOwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGhvc3RfdG1wKS5hcHBlbmRDaGlsZChuZXdfc3Bhbik7CgogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb2JqX3BsYW5zW3BsYW5faWRdWydrZXlzJ11baG9zdF90bXBdLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXlfaW5mbyA9IG9ial9wbGFuc1twbGFuX2lkXVsna2V5cyddW2hvc3RfdG1wXVtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld19kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2Rpdi5jbGFzc05hbWUgPSAnZHluYW1pY0RJVic7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdfc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NwYW4uaW5uZXJUZXh0ID0gJ+KWticgKyBrZXlfaW5mb1sna2V5X25hbWUnXTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NwYW4udGl0bGUgPSAn4pa2JyArIGtleV9pbmZvWydrZXlfbmFtZSddICsgIlxuIiArIGtleV9pbmZvWydjc3NfcGF0aCddOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3Bhbi5jbGFzc05hbWUgPSAnZHluYW1pY1NwYW4nOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5X2luZm9bJ2Nzc19wYXRoJ10gPT0gInJlZnJlc2hfcGFnZSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zcGFuLnN0eWxlLmNvbG9yID0gJ3JlZCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2Rpdi5hcHBlbmRDaGlsZChuZXdfc3Bhbik7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3Bhbi5pbm5lckhUTUwgPSAnJm5ic3AmbmJzcCZuYnNwJm5ic3DphY3nva7vvJonOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5X2luZm9bJ2Nzc19wYXRoJ10gPT0gInJlZnJlc2hfcGFnZSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zcGFuLmlubmVySFRNTCA9ICcmbmJzcCZuYnNwJm5ic3AmbmJzcOmFjee9ru+8mic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NwYW4udGl0bGUgPSAn5L6L77ya5oyJ6ZKu5oC75YWx54K55Ye7M+asoe+8jOS4juS4iuS4gOS4quaMiemSrumXtOmalDIwMOavq+enku+8jOi+k+WFpTMtMjAwJzsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NwYW4uc3R5bGUuY29sb3IgPSAnZ3JlZW4nOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3Bhbi5zdHlsZS52ZXJ0aWNhbEFsaWduID0gJ21pZGRsZSc7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19kaXYuYXBwZW5kQ2hpbGQobmV3X3NwYW4pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3X2lucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2lucHV0LmNsYXNzTmFtZSA9ICdkeW5hbWljSW5wdXQnOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfaW5wdXQucGxhY2Vob2xkZXIgPSAn5qC85byP77ya5qyh5pWwLemXtOmalCjmr6vnp5IpJzsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2lucHV0LnZhbHVlID0gKGtleV9pbmZvWydwcmVzc19udW0nXSArICctJyArIGtleV9pbmZvWydwcmVzc19pbnRlcnZhbCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleV9pbmZvWydjc3NfcGF0aCddID09ICJyZWZyZXNoX3BhZ2UiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfaW5wdXQucGxhY2Vob2xkZXIgPSAn5Yi35paw5oyJ6ZKu5Y+q6IO96YWN572u5Li6MS14eCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfaW5wdXQuaWQgPSBob3N0X3RtcCArICJfcmVmcmVzaF9wYWdlIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBuZXdfZGl2LmFwcGVuZENoaWxkKG5ld19pbnB1dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3Bhbi5pbm5lckhUTUwgPSBrZXlfaW5mb1snY3NzX3BhdGgnXTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NwYW4uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2Rpdi5hcHBlbmRDaGlsZChuZXdfc3Bhbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGhvc3RfdG1wKS5hcHBlbmRDaGlsZChuZXdfZGl2KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQyLmluQXJyYXkobG9jYXRpb24uaG9zdCwgYXJyeV9wbGFuX2tleXMpID49IDApIHsKICAgICAgICAgICAgICAgIHZhciBuZXdfZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgICAgICBuZXdfZGl2LmlkID0gbG9jYXRpb24uaG9zdDsKICAgICAgICAgICAgICAgIG5ld19kaXYuc2V0QXR0cmlidXRlKCdkYXRhLWRvbWFpbk5hbWUnLCBsb2NhdGlvbi5ob3N0KTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNwbGF5QnV0dG9uJykuYXBwZW5kQ2hpbGQobmV3X2Rpdik7CiAgICAgICAgICAgICAgICB2YXIgbmV3X3NwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgICAgICAgICBuZXdfc3Bhbi5jbGFzc05hbWUgPSAnZHluYW1pY0hvc3RTcGFuJzsKICAgICAgICAgICAgICAgIG5ld19zcGFuLmlubmVySFRNTCA9ICdb5bey5L+d5a2YXSAgICAnICsgJ+mhtemdou+8micgKyBsb2NhdGlvbi5ob3N0OwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobG9jYXRpb24uaG9zdCkuYXBwZW5kQ2hpbGQobmV3X3NwYW4pOwoKICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgb2JqX3BsYW5zW3BsYW5faWRdWydrZXlzJ11bbG9jYXRpb24uaG9zdF0ubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5X2luZm8gPSBvYmpfcGxhbnNbcGxhbl9pZF1bJ2tleXMnXVtsb2NhdGlvbi5ob3N0XVtqXTsKICAgICAgICAgICAgICAgICAgICB2YXIgbmV3X2RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICAgICAgICAgIG5ld19kaXYuY2xhc3NOYW1lID0gJ2R5bmFtaWNESVYnOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXdfc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgICAgICAgICAgICAgICBuZXdfc3Bhbi5pbm5lclRleHQgPSAn4pa2JyArIGtleV9pbmZvWydrZXlfbmFtZSddOwogICAgICAgICAgICAgICAgICAgIG5ld19zcGFuLnRpdGxlID0gJ+KWticgKyBrZXlfaW5mb1sna2V5X25hbWUnXSArICJcbiIgKyBrZXlfaW5mb1snY3NzX3BhdGgnXTsKICAgICAgICAgICAgICAgICAgICBuZXdfc3Bhbi5jbGFzc05hbWUgPSAnZHluYW1pY1NwYW4nOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXlfaW5mb1snY3NzX3BhdGgnXSA9PSAicmVmcmVzaF9wYWdlIikgewogICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3Bhbi5zdHlsZS5jb2xvciA9ICdyZWQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuZXdfZGl2LmFwcGVuZENoaWxkKG5ld19zcGFuKTsKICAgICAgICAgICAgICAgICAgICBuZXdfc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgICAgICAgICAgICAgICBuZXdfc3Bhbi5pbm5lckhUTUwgPSAnJm5ic3AmbmJzcCZuYnNwJm5ic3DphY3nva7vvJonOwogICAgICAgICAgICAgICAgICAgIGlmIChrZXlfaW5mb1snY3NzX3BhdGgnXSA9PSAicmVmcmVzaF9wYWdlIikgewogICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3Bhbi5pbm5lckhUTUwgPSAnJm5ic3AmbmJzcCZuYnNwJm5ic3DphY3nva7vvJonOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuZXdfc3Bhbi50aXRsZSA9ICfkvovvvJrmjInpkq7mgLvlhbHngrnlh7sz5qyh77yM5LiO5LiK5LiA5Liq5oyJ6ZKu6Ze06ZqUMjAw5q+r56eS77yM6L6T5YWlMy0yMDAnOwogICAgICAgICAgICAgICAgICAgIG5ld19zcGFuLnN0eWxlLmNvbG9yID0gJ2dyZWVuJzsKICAgICAgICAgICAgICAgICAgICBuZXdfc3Bhbi5zdHlsZS52ZXJ0aWNhbEFsaWduID0gJ21pZGRsZSc7CiAgICAgICAgICAgICAgICAgICAgbmV3X2Rpdi5hcHBlbmRDaGlsZChuZXdfc3Bhbik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld19pbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CiAgICAgICAgICAgICAgICAgICAgbmV3X2lucHV0LmNsYXNzTmFtZSA9ICdkeW5hbWljSW5wdXQnOwogICAgICAgICAgICAgICAgICAgIG5ld19pbnB1dC5wbGFjZWhvbGRlciA9ICfmoLzlvI/vvJrmrKHmlbAt6Ze06ZqUKOavq+enkiknOwogICAgICAgICAgICAgICAgICAgIG5ld19pbnB1dC52YWx1ZSA9IChrZXlfaW5mb1sncHJlc3NfbnVtJ10gKyAnLScgKyBrZXlfaW5mb1sncHJlc3NfaW50ZXJ2YWwnXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleV9pbmZvWydjc3NfcGF0aCddID09ICJyZWZyZXNoX3BhZ2UiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19pbnB1dC5wbGFjZWhvbGRlciA9ICfliLfmlrDmjInpkq7lj6rog73phY3nva7kuLoxLXh4JzsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2lucHV0LmlkID0gbG9jYXRpb24uaG9zdCArICJfcmVmcmVzaF9wYWdlIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmV3X2Rpdi5hcHBlbmRDaGlsZChuZXdfaW5wdXQpOwogICAgICAgICAgICAgICAgICAgIG5ld19zcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgICAgICAgICAgICAgICAgIG5ld19zcGFuLmlubmVySFRNTCA9IGtleV9pbmZvWydjc3NfcGF0aCddOwogICAgICAgICAgICAgICAgICAgIG5ld19zcGFuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgbmV3X2Rpdi5hcHBlbmRDaGlsZChuZXdfc3Bhbik7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobG9jYXRpb24uaG9zdCkuYXBwZW5kQ2hpbGQobmV3X2Rpdik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy90b2RvIOWmguaenOacieS8oOWPguWImeWPguaVsOS4unBsYW5pZAoKICAgIH0KICAgIG9iai5zd2l0Y2hUb05ldyA9IGZ1bmN0aW9uIChzb3VyY2UpIHsKICAgICAgICBvYmouc2VsZWN0X3RhYign5paw5pa55qGIJywgJycsIDEpOwogICAgICAgIGlmIChzb3VyY2UgPT0gJ2VkaXRfYnV0dG9uJykgewogICAgICAgICAgICBvYmouYmluZGluZ05vdENvbXBsZXRlZCgkMigiI3BhbmljQnV5aW5nUGxhbiIpLnZhbCgpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgYXJyeV9wbGFuc19jb2RlID0gW107CiAgICAgICAgZm9yICh2YXIgcCBpbiBvYmpfcGxhbnMpIHsKICAgICAgICAgICAgYXJyeV9wbGFuc19jb2RlLnB1c2gocCk7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhcnJ5X3BsYW5zX2NvZGUubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICAgIGlmIChvYmpfcGxhbnNbYXJyeV9wbGFuc19jb2RlW2luZGV4XV1bJ2lzZmluaXNoJ10gPT0gJzAnKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5pyq5a6M5oiQJyk7CiAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlID09ICduZXdfYnV0dG9uJykgewogICAgICAgICAgICAgICAgICAgIG9iai5zd2FsX2luZm8obnVsbCwgJ+aCqOacieWwmuacquS/neWtmOeahOaWueahiO+8jOS/neWtmOWQjuaJjeiDveaWsOW7uicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb2JqLmJpbmRpbmdOb3RDb21wbGV0ZWQoYXJyeV9wbGFuc19jb2RlW2luZGV4XSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb2JqLmJpbmRpbmdOb3RDb21wbGV0ZWQoJ25ldycpOwogICAgfQogICAgLy8jZW5kcmVnaW9uCiAgICAvLyNyZWdpb24gb2JqLmluaXRpYWxpemVQYW5pY0J1eWluZ0Fzc2lzdGFudCDmiqLotK3liqnmiYvliJ3lp4vljJYKICAgIHZhciBsaXN0ZW5fY2xpY2sgPSAnMCc7CiAgICBvYmouY2FwdHVyZUV4ZWN1dGlvbiA9IGZ1bmN0aW9uICh0YXJnZXQpIHsKICAgICAgICBpZiAobGlzdGVuX2NsaWNrID09ICcwJykgeyByZXR1cm47IH0KICAgICAgICBpZiAob2JqLmlzUGFyZW50KHRhcmdldCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvdXBvbi13cmFwLXFyIikpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgaWYgKG9iai5pc1BhcmVudChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY291cG9uLXdyYXAtcXIiKSwgdGFyZ2V0KSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICh0YXJnZXQuaWQgPT0gImJ1dHRvbl9jYXB0dXJlIiB8fCB0YXJnZXQuaWQgPT0gImJ1dHRvbl9zYXZlVGhpc1BhZ2UiIHx8IHRhcmdldC5pbm5lclRleHQgPT0gIuWujOaIkCIpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAob2JqLmlzUGFyZW50KHRhcmdldCwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnc3dhbC1vdmVybGF5JykpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGNzc1RhcmdldFN0ciA9IG9iai5jc3NQYXRoKHRhcmdldCk7CiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxvY2F0aW9uLmhvc3QpID09IG51bGwpIHsKICAgICAgICAgICAgdmFyIG5ld19kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgbmV3X2Rpdi5pZCA9IGxvY2F0aW9uLmhvc3Q7CiAgICAgICAgICAgIG5ld19kaXYuc2V0QXR0cmlidXRlKCdkYXRhLWRvbWFpbk5hbWUnLCBsb2NhdGlvbi5ob3N0KTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc3BsYXlCdXR0b24nKS5hcHBlbmRDaGlsZChuZXdfZGl2KTsKICAgICAgICAgICAgdmFyIG5ld19zcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgICAgICAgICBuZXdfc3Bhbi5jbGFzc05hbWUgPSAnZHluYW1pY0hvc3RTcGFuJzsKICAgICAgICAgICAgbmV3X3NwYW4uaW5uZXJIVE1MID0gJ1vmnKrkv53lrZhdICAgICcgKyAn6aG16Z2i77yaJyArIGxvY2F0aW9uLmhvc3Q7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxvY2F0aW9uLmhvc3QpLmFwcGVuZENoaWxkKG5ld19zcGFuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsb2NhdGlvbi5ob3N0KS5jaGlsZE5vZGVzWzBdLmlubmVySFRNTCA9ICdb5pyq5L+d5a2YXSAgICAnICsgJ+mhtemdou+8micgKyBsb2NhdGlvbi5ob3N0OwogICAgICAgIH0KICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobG9jYXRpb24uaG9zdCkubGFzdENoaWxkLmZpcnN0Q2hpbGQuaW5uZXJUZXh0ID09ICLilrbliLfmlrDpobXpnaIiKSB7CiAgICAgICAgICAgIG9iai5zd2FsX2ZhZGVBd2F5KCLliLfmlrDmk43kvZzlkI7kuI3og73lho3mt7vliqDmjInpkq5+IiwgMTIwMCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIG5ld19kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICBuZXdfZGl2LmNsYXNzTmFtZSA9ICdkeW5hbWljRElWJzsKICAgICAgICBuZXdfc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgICBpZiAodGFyZ2V0LmlubmVyVGV4dCAhPSBudWxsKSB7CiAgICAgICAgICAgIG5ld19zcGFuLmlubmVyVGV4dCA9ICfilrYnICsgdGFyZ2V0LmlubmVyVGV4dC5yZXBsYWNlKCdcbicsICcgJyk7CiAgICAgICAgICAgIG5ld19zcGFuLnRpdGxlID0gJ+KWticgKyB0YXJnZXQuaW5uZXJUZXh0ICsgIlxuIiArIGNzc1RhcmdldFN0cjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXdfc3Bhbi5pbm5lclRleHQgPSAn4pa25om+5LiN5Yiw5ZCN56ewJzsKICAgICAgICAgICAgbmV3X3NwYW4udGl0bGUgPSAn4pa25om+5LiN5Yiw5ZCN56ewJyArICJcbiIgKyBjc3NUYXJnZXRTdHI7CiAgICAgICAgfQogICAgICAgIG5ld19zcGFuLmNsYXNzTmFtZSA9ICdkeW5hbWljU3Bhbic7CiAgICAgICAgbmV3X2Rpdi5hcHBlbmRDaGlsZChuZXdfc3Bhbik7CiAgICAgICAgbmV3X3NwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgbmV3X3NwYW4uaW5uZXJIVE1MID0gJyZuYnNwJm5ic3AmbmJzcCZuYnNw6YWN572u77yaJzsKICAgICAgICBuZXdfc3Bhbi50aXRsZSA9ICfkvovvvJrmjInpkq7mgLvlhbHngrnlh7sz5qyh77yM5LiO5LiK5LiA5Liq5oyJ6ZKu6Ze06ZqUMjAw5q+r56eS77yM6L6T5YWlMy0yMDAnOwogICAgICAgIG5ld19zcGFuLnN0eWxlLmNvbG9yID0gJ2dyZWVuJzsKICAgICAgICBuZXdfc3Bhbi5zdHlsZS52ZXJ0aWNhbEFsaWduID0gJ21pZGRsZSc7CiAgICAgICAgbmV3X2Rpdi5hcHBlbmRDaGlsZChuZXdfc3Bhbik7CiAgICAgICAgdmFyIG5ld19pbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CiAgICAgICAgbmV3X2lucHV0LmNsYXNzTmFtZSA9ICdkeW5hbWljSW5wdXQnOwogICAgICAgIG5ld19pbnB1dC5wbGFjZWhvbGRlciA9ICfmoLzlvI/vvJrmrKHmlbAt6Ze06ZqUKOavq+enkiknOwogICAgICAgIG5ld19kaXYuYXBwZW5kQ2hpbGQobmV3X2lucHV0KTsKICAgICAgICBuZXdfc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgICBuZXdfc3Bhbi5pbm5lckhUTUwgPSBjc3NUYXJnZXRTdHI7CiAgICAgICAgbmV3X3NwYW4uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICBuZXdfZGl2LmFwcGVuZENoaWxkKG5ld19zcGFuKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsb2NhdGlvbi5ob3N0KS5hcHBlbmRDaGlsZChuZXdfZGl2KTsKICAgICAgICB0YXJnZXQucmVtb3ZlKCk7CiAgICB9CgogICAgb2JqLmJpbmRQbGFuSW5mbyA9IGZ1bmN0aW9uIChwbGFuSWQpIHsKICAgICAgICB2YXIgaW5mb19zdHIgPSAn5pa55qGI57yW5Y+377yaJyArIHBsYW5JZCArICdcbic7CiAgICAgICAgaW5mb19zdHIgKz0gJ+aWueahiOWQjeensO+8micgKyBvYmpfcGxhbnNbcGxhbklkXVsncGxhbl9uYW1lJ10gKyAnXG4nOwogICAgICAgIGluZm9fc3RyICs9ICfmlrnmoYjor7TmmI7vvJonICsgb2JqX3BsYW5zW3BsYW5JZF1bJ3BsYW5faW5mbyddICsgJ1xuJzsKICAgICAgICB2YXIgYXJyeV9ob3N0cyA9IG9iai5nZXRPYmpLZXlzKG9ial9wbGFuc1twbGFuSWRdWydrZXlzJ10pOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyeV9ob3N0cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpbmZvX3N0ciArPSAnXG7kvZznlKjpobXpnaLvvJonICsgYXJyeV9ob3N0c1tpXSArICdcbic7CiAgICAgICAgICAgIHZhciBrZXlJbmZvID0gb2JqX3BsYW5zW3BsYW5JZF1bJ2tleXMnXVthcnJ5X2hvc3RzW2ldXTsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBrZXlJbmZvLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICBpbmZvX3N0ciArPSAnICAgICAgIOeCueWHuy0tJyArIGtleUluZm9bal0ua2V5X25hbWUgKyAnXG4nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICQyKCcjaW1nUGxhbkluZm8nKS5hdHRyKCd0aXRsZScsIGluZm9fc3RyKTsKICAgIH0KICAgIG9iai5zZXRTZWxlY3QgPSBmdW5jdGlvbiAoaWQsIHRleHQpIHsKICAgICAgICB2YXIgY291bnQgPSAkMigiIyIgKyBpZCkuZ2V0KDApLm9wdGlvbnMubGVuZ3RoOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICBpZiAoJDIoIiMiICsgaWQpLmdldCgwKS5vcHRpb25zW2ldLnRleHQgPT0gdGV4dCkgewogICAgICAgICAgICAgICAgJDIoIiMiICsgaWQpLmdldCgwKS5vcHRpb25zW2ldLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgdmFyIG1vdXNlX1RPID0gJyc7CiAgICBvYmouaW5pdGlhbGl6ZVBhbmljQnV5aW5nQXNzaXN0YW50ID0gZnVuY3Rpb24gKHR5cGUpIHsKICAgICAgICBpZiAocGFnZV90eXBlID09ICdvdGhlcl9wYWdlJykgewogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmxvYXRfYXNzaXN0YW50Jykub25tb3VzZWVudGVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKG1vdXNlX1RPICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG1vdXNlX1RPKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG9iai5nZXROZXdWZXJzaW9uKCk7CiAgICAgICAgICAgICAgICAkMignI2Zsb2F0X2Fzc2lzdGFudCcpWzBdLmNoaWxkcmVuWzBdLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsKICAgICAgICAgICAgICAgICQyKCcjZmxvYXRfYXNzaXN0YW50JylbMF0uY2hpbGRyZW5bMV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgICQyKCcjZmxvYXRfYXNzaXN0YW50JylbMF0uc3R5bGUuYm9yZGVyUmFkaXVzID0gIjZweCI7CiAgICAgICAgICAgICAgICAkMignI2Zsb2F0X2Fzc2lzdGFudCcpWzBdLnN0eWxlLnBhZGRpbmcgPSAiMTBweCAxMHB4IDBweCAxMHB4ICI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zsb2F0X2Fzc2lzdGFudCcpLm9ubW91c2VsZWF2ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIG1vdXNlX1RPID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJDIoJyNmbG9hdF9hc3Npc3RhbnQnKVswXS5jaGlsZHJlblsxXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICAgICAgICAgICAgICAkMignI2Zsb2F0X2Fzc2lzdGFudCcpWzBdLmNoaWxkcmVuWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgJDIoJyNmbG9hdF9hc3Npc3RhbnQnKVswXS5zdHlsZS5ib3JkZXJSYWRpdXMgPSAiOTlweCI7CiAgICAgICAgICAgICAgICAgICAgJDIoJyNmbG9hdF9hc3Npc3RhbnQnKVswXS5zdHlsZS5wYWRkaW5nID0gIjNweCI7CiAgICAgICAgICAgICAgICB9LCA1MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmbG9hdF9hc3Npc3RhbnQnKS5vbm1vdXNlZG93biA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB2YXIgZSA9IGUgfHwgd2luZG93LmV2ZW50CiAgICAgICAgICAgICAgICBpZiAoZS5idXR0b24gPT0gIjEiKSB7CiAgICAgICAgICAgICAgICAgICAgJDIoJyNmbG9hdF9hc3Npc3RhbnQnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb2JqLmdldE5ld1ZlcnNpb24oKTsKICAgICAgICB9CiAgICAgICAgLy/ml7bpkp/lkIzmraXmupDpgInmi6kKICAgICAgICBpZiAob2JqLnBsYXRmb3JtKCkgPT0gInRhb2JhbyIpIHsKICAgICAgICAgICAgb2JqLnNldFNlbGVjdCgnc3luX3RpbWVfYXBpJywgJ+a6kO+8mua3mOWuneacjeWKoeWZqOaXtumXtCcpOwogICAgICAgIH0gZWxzZSBpZiAob2JqLnBsYXRmb3JtKCkgPT0gImppbmdkb25nIikgewogICAgICAgICAgICBvYmouc2V0U2VsZWN0KCdzeW5fdGltZV9hcGknLCAn5rqQ77ya5Lqs5Lic5pyN5Yqh5Zmo5pe26Ze0Jyk7CiAgICAgICAgfSBlbHNlIGlmIChvYmoucGxhdGZvcm0oKSA9PSAic3VuaW5nIikgewogICAgICAgICAgICBvYmouc2V0U2VsZWN0KCdzeW5fdGltZV9hcGknLCAn5rqQ77ya6IuP5a6B5pyN5Yqh5Zmo5pe26Ze0Jyk7CiAgICAgICAgfSBlbHNlIGlmIChvYmoucGxhdGZvcm0oKSA9PSAiaHVhd2VpIikgewogICAgICAgICAgICBvYmouc2V0U2VsZWN0KCdzeW5fdGltZV9hcGknLCAn5rqQ77ya5Y2O5Li65ZWG5Z+O5pyN5Yqh5Zmo5pe26Ze0Jyk7CiAgICAgICAgfSBlbHNlIGlmIChvYmoucGxhdGZvcm0oKSA9PSAieGlhb21peW91cGluIikgewogICAgICAgICAgICBvYmouc2V0U2VsZWN0KCdzeW5fdGltZV9hcGknLCAn5rqQ77ya5bCP57Gz5pyJ5ZOB5pyN5Yqh5Zmo5pe26Ze0Jyk7CiAgICAgICAgfSBlbHNlIGlmIChvYmoucGxhdGZvcm0oKSA9PSAicGluZHVvZHVvIikgewogICAgICAgICAgICBvYmouc2V0U2VsZWN0KCdzeW5fdGltZV9hcGknLCAn5rqQ77ya5ou85aSa5aSa5pyN5Yqh5Zmo5pe26Ze0Jyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb2JqLnNldFNlbGVjdCgnc3luX3RpbWVfYXBpJywgJ+a6kO+8muacrOmhtemdouacjeWKoeWZqO+8iOeyvuehruWIsOenku+8iScpOwogICAgICAgIH0KICAgICAgICAkMigiI2R1cmF0aW9uIikudmFsKDYwKTsKICAgICAgICAvL+e7keWumuaWueahiAogICAgICAgIHZhciBhcnJ5UGxhbklkID0gb2JqLmdldE9iaktleXMob2JqX3BsYW5zKTsKICAgICAgICB2YXIgc2VsZWN0X3BsYW5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhbmljQnV5aW5nUGxhbicpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyeVBsYW5JZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAob2JqX3BsYW5zW2FycnlQbGFuSWRbaV1dWydpc2ZpbmlzaCddID09ICcwJykKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB2YXIgbmV3X29wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOwogICAgICAgICAgICBuZXdfb3B0aW9uLnZhbHVlID0gYXJyeVBsYW5JZFtpXTsKICAgICAgICAgICAgbmV3X29wdGlvbi5pbm5lclRleHQgPSBvYmpfcGxhbnNbYXJyeVBsYW5JZFtpXV1bJ3BsYW5fbmFtZSddOwogICAgICAgICAgICBzZWxlY3RfcGxhbnMuYXBwZW5kQ2hpbGQobmV3X29wdGlvbik7CiAgICAgICAgfQoKICAgICAgICAvL+e7keWumuS7u+WKoWluUHJvZ3Jlc3MKICAgICAgICB2YXIgYXJyYXlfdGFzayA9IG9iai5nZXRPYmpLZXlzKHZfY29va2llKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5X3Rhc2subGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGFycmF5X3Rhc2tbaV0gPT0gJ21qZExvZ2luJykgY29udGludWU7CiAgICAgICAgICAgIGlmIChvYmpfcGxhbnNbYXJyYXlfdGFza1tpXV0gPT0gbnVsbCB8fCBvYmpfcGxhbnNbYXJyYXlfdGFza1tpXV0gPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvYmouZGVsVmlydHVhbENvb2tpZShhcnJheV90YXNrW2ldKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcnJheV90YXNrW2ldLmluZGV4T2YoJ3BsYW5fJykgPiAtMSAmJiB2X2Nvb2tpZVthcnJheV90YXNrW2ldXVsnYWN0aXZlJ10gPT0gJzEnICYmIG9iai5qdWRnbWVudFZpcnR1YWxDb29raWUoYXJyYXlfdGFza1tpXSkpIHsKICAgICAgICAgICAgICAgIC8v57uR5a6a5Lu75YqhaW5Qcm9ncmVzcwogICAgICAgICAgICAgICAgdmFyIGluUHJvZ3Jlc3NfcGxhbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5Qcm9ncmVzcycpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coaW5Qcm9ncmVzc19wbGFucyk7CiAgICAgICAgICAgICAgICB2YXIgbmV3X29wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOwogICAgICAgICAgICAgICAgbmV3X29wdGlvbi52YWx1ZSA9IGFycmF5X3Rhc2tbaV07CiAgICAgICAgICAgICAgICBuZXdfb3B0aW9uLmlubmVyVGV4dCA9IG9ial9wbGFuc1thcnJheV90YXNrW2ldXVsncGxhbl9uYW1lJ107CiAgICAgICAgICAgICAgICBpblByb2dyZXNzX3BsYW5zLmFwcGVuZENoaWxkKG5ld19vcHRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICQyKCcjYnV0dG9uX2RlbFRhc2snKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIG9iai5zd2FsX2luZm8obnVsbCwgIuWNs+WwhuWBnOatouS7u+WKoe+8miIgKyAkMigiI2luUHJvZ3Jlc3MiKS5maW5kKCJvcHRpb246c2VsZWN0ZWQiKS50ZXh0KCksICLnoa7lrpoiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBvYmouZGVsVmlydHVhbENvb2tpZSgkMigiI2luUHJvZ3Jlc3MiKS52YWwoKSk7CiAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgfSkKICAgICAgICB9KTsKCiAgICAgICAgJDIoIiNwYWdlVXJsIikudGV4dChsb2NhdGlvbi5ob3N0KTsKICAgICAgICBvYmouc2VsZWN0X3RhYign5paw5pa55qGIJywgJ25vbmUnLCAwKTsKICAgICAgICB2YXIgbXlEYXRlID0gb2JqLmdldF9kYXRlX25vd19tcygpOwogICAgICAgICQyKCcjdGltZV9zcGFuX21zJykuaHRtbChteURhdGUpOwoKICAgICAgICAkMignI2J1dHRvbl9zeW4nKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIG9iai5zeW50aW1lKCk7CiAgICAgICAgfSk7CiAgICAgICAgJDIoJyNidXR0b25fZ2V0Q3VycmVudFRpbWUnKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBteURhdGUgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAvLyAkMignI3NldF90aW1lJykuYXR0cigidmFsdWUiLCBteURhdGUudG9Mb2NhbGVTdHJpbmcoJ2NoaW5lc2UnLCB7IGhvdXIxMjogZmFsc2UsIHllYXI6ICdudW1lcmljJywgbW9udGg6ICcyLWRpZ2l0JywgZGF5OiAnMi1kaWdpdCcsIGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcsIHNlY29uZDogJzItZGlnaXQnIH0pKTsKICAgICAgICAgICAgJDIoJyNzZXRfdGltZScpLmF0dHIoInZhbHVlIiwgbXlEYXRlLkZvcm1hdCgieXl5eS1NTS1kZCBoaDptbTpzcyIpKTsKICAgICAgICB9KTsKICAgICAgICAkMignI3BhbmljQnV5aW5nUGxhbicpLmNoYW5nZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBwbGFuSWQgPSAkMih0aGlzKS52YWwoKTsKICAgICAgICAgICAgaWYgKG9ial9wbGFuc1twbGFuSWRdWydqZF9zcGlrZSddID09ICcxJykgewogICAgICAgICAgICAgICAgdmFyIGFjdGl2ZSA9ICcxJzsKICAgICAgICAgICAgICAgIGlmICghb2JqLmp1ZGdtZW50VmlydHVhbENvb2tpZSgnbWpkTG9naW4nKSkgewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZSA9ICcwJzsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn6L+H5pyfJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlID09ICcwJykgewogICAgICAgICAgICAgICAgICAgIG9iai5zd2FsX2luZm8obnVsbCwgJ+mAieaLqeS6rOS4nOaegemAn+S4i+WNleaWueahiOWQju+8jOivt+eCueWHuyLljrvnmbvpmYYi56Gu5L+d5bey57uP55m76ZmG5LqGd2Vi54mI5Lqs5Licfu+8jOacrOa2iOaBrzLlsI/ml7blhoXkuI3lho3mj5DphpInLCAn5Y6755m76ZmGJywgZnVuY3Rpb24gKCkgeyAkMignI21qZExvZ2luJylbMF0uY2xpY2soKSB9KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iai5iaW5kUGxhbkluZm8ocGxhbklkKTsKCiAgICAgICAgfSk7CiAgICAgICAgJDIoJyNidXR0b25fZGVsUGxhbicpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCFvYmouaGFzU2VsZWN0UGxhbigpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBzZWxlY3RfdmFsID0gJDIoIiNwYW5pY0J1eWluZ1BsYW4iKS52YWwoKTsKICAgICAgICAgICAgdmFyIHBsYW5fbmFtZSA9IG9ial9wbGFuc1tzZWxlY3RfdmFsXVsncGxhbl9uYW1lJ107CiAgICAgICAgICAgIG9iai5zd2FsX2luZm8obnVsbCwgJ+WNs+WwhuWIoOmZpOaWueahiO+8geaWueahiOWQjeensO+8micgKyBwbGFuX25hbWUsICLnoa7orqTliKDpmaQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgb2JqX3BsYW5zW3NlbGVjdF92YWxdCiAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgib2JqX3BsYW5zIiwgSlNPTi5zdHJpbmdpZnkob2JqX3BsYW5zKSk7CiAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgJDIoJyNidXR0b25fbmV3UGxhbicpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgb2JqLnN3aXRjaFRvTmV3KCduZXdfYnV0dG9uJyk7CiAgICAgICAgfSk7CiAgICAgICAgJDIoJyNidXR0b25fZWRpdFBsYW4nKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICghb2JqLmhhc1NlbGVjdFBsYW4oKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9iai5zd2l0Y2hUb05ldygnZWRpdF9idXR0b24nKTsKICAgICAgICB9KTsKICAgICAgICAkMignI3ZpZXdUdXRvcmlhbCcpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgR01fb3BlbkluVGFiKCdodHRwczovL2Jicy55b3V5aXpoaW5lbmcudG9wL2QvMTAnLCB7IGFjdGl2ZTogdHJ1ZSwgc2V0UGFyZW50OiB0cnVlIH0pOwogICAgICAgIH0pOwoKICAgICAgICAkMignLnN5cy1kZXNjcmlwdGlvbicpLmNzcygiZGlzcGxheSIsICdub25lJyk7CiAgICAgICAgJDIoJyN2aWV3RGVzY3JpcHRpb24nKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICgkMignI3ZpZXdEZXNjcmlwdGlvbicpLnRleHQoKS5pbmRleE9mKCLlsZXlvIAiKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAkMignLnN5cy1kZXNjcmlwdGlvbicpLmNzcygiZGlzcGxheSIsICdibG9jaycpOwogICAgICAgICAgICAgICAgJDIoJyN2aWV3RGVzY3JpcHRpb24nKS50ZXh0KCI+PumakOiXj+ivtOaYjiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJDIoJy5zeXMtZGVzY3JpcHRpb24nKS5jc3MoImRpc3BsYXkiLCAnbm9uZScpOwogICAgICAgICAgICAgICAgJDIoJyN2aWV3RGVzY3JpcHRpb24nKS50ZXh0KCI+PuWxleW8gOivtOaYjiIpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgJDIoJyNidXR0b25fc3RhcnROb3cnKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8v5qOA5p+l5piv5ZCm5piv5Lqs5Lic5b+r6YCf6YCa6YGT5bm255m76ZmGCiAgICAgICAgICAgIHZhciBzZWxlY3RfdmFsID0gJDIoIiNwYW5pY0J1eWluZ1BsYW4iKS52YWwoKTsKCiAgICAgICAgICAgIC8v6K6+5a6a55qE5pe26Ze06L2s5q+r56eSCiAgICAgICAgICAgIHZhciBzZXRfdGltZSA9ICQyKCcjc2V0X3RpbWUnKS52YWwoKTsKCiAgICAgICAgICAgIGlmIChzZWxlY3RfdmFsID09ICItLS3or7fpgInmi6ktLS0iKSB7CiAgICAgICAgICAgICAgICBvYmouc3dhbF9pbmZvKG51bGwsICLmgqjmsqHmnInpgInmi6nmlrnmoYjvvIzor7fpgInmi6nlkIjpgILnmoTmlrnmoYjlk6Z+Iik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGFycnlfcGxhbnMgPSBvYmouZ2V0T2JqS2V5cyhvYmpfcGxhbnNbc2VsZWN0X3ZhbF1bJ2tleXMnXSk7CiAgICAgICAgICAgIGlmIChhcnJ5X3BsYW5zLmxlbmd0aCA+IDAgJiYgJDIuaW5BcnJheShsb2NhdGlvbi5ob3N0LCBhcnJ5X3BsYW5zKSA9PSAtMSkgewogICAgICAgICAgICAgICAgb2JqLnN3YWxfaW5mbyhudWxsLCAi6YCJ5Lit55qE5pa55qGI5LiN5Y+v5L2c55So5LqO5pys6aG15ZOmfiIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG9ial9wbGFuc1tzZWxlY3RfdmFsXVsnamRfc3Bpa2UnXSA9PSAnMScgJiYgIW9iai5qdWRnbWVudFZpcnR1YWxDb29raWUoJ21qZExvZ2luJykpIHsKICAgICAgICAgICAgICAgIG9iai5zd2FsX2luZm8obnVsbCwgJ+mAieaLqeS6rOS4nOaegemAn+S4i+WNleaWueahiOWQju+8jOivt+eCueWHuyLljrvnmbvpmYYi56Gu5L+d5bey57uP55m76ZmG5LqGd2Vi54mI5Lqs5Licfu+8jOacrOa2iOaBrzLlsI/ml7blhoXkuI3lho3mj5DphpInLCAn5Y6755m76ZmGJywgZnVuY3Rpb24gKCkgeyAkMignI21qZExvZ2luJylbMF0uY2xpY2soKSB9KQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2V0dGltZV9tcyA9IDA7CiAgICAgICAgICAgICAgICBzdGFydE1vbml0b3JpbmdGbGFnID0gJzEnOwogICAgICAgICAgICAgICAgJDIoJyNydW5TdGF0dXMnKS52YWwoJ+aWueahiOW3sue7j+aJp+ihjO+8jOWPr+WcqOi/kOihjOS4reeahOmHjOmdouaJvuWIsOaWueahiOW5tuWBnOatoicpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgICQyKCcjYnV0dG9uX3N0YXJ0TW9uaXRvcmluZycpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy/mt7vliqDku7vliqHliLB2X2Nvb2tpZQogICAgICAgICAgICBpZiAoc3RhcnRNb25pdG9yaW5nRmxhZyA9PSAnMScpIHsKICAgICAgICAgICAgICAgIHN0YXJ0TW9uaXRvcmluZ0ZsYWcgPSAnMCc7CiAgICAgICAgICAgICAgICAkMignI2J1dHRvbl9zdGFydE1vbml0b3JpbmcnKS50ZXh0KCflvIDlp4vmiafooYwnKTsKICAgICAgICAgICAgICAgICQyKCcjYnV0dG9uX3N0YXJ0TW9uaXRvcmluZycpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjMjVhNzY1Jyk7CiAgICAgICAgICAgICAgICAkMignI2J1dHRvbl9zdGFydE1vbml0b3JpbmcnKS5jc3MoJ2NvbG9yJywgJyNmZmZmZmYnKTsKICAgICAgICAgICAgICAgICQyKCIjcGFuaWNCdXlpbmdQbGFuIikuYXR0cigiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkMigiI3NldF90aW1lIikuYXR0cigiZGlzYWJsZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkMigiI3N5bl90aW1lX2FwaSIpLmF0dHIoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAgICAgJDIoIiNzZXRfdGltZV9tcyIpLmF0dHIoImRpc2FibGVkIiwgZmFsc2UpOwogICAgICAgICAgICAgICAgJDIoIiNlYXJseU9yTGF0ZSIpLmF0dHIoImRpc2FibGVkIiwgZmFsc2UpOwoKICAgICAgICAgICAgICAgICQyKCcjcnVuU3RhdHVzJykudmFsKCfnrYnlvoXmiqLotK3vvIzor7fnoa7kv53lt7Lnu4/nmbvpmYblubblt7Lnu4/pgInlpb3llYblk4Hop4TmoLwnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8v5qOA5p+l5piv5ZCm5piv5Lqs5Lic5b+r6YCf6YCa6YGT5bm255m76ZmGCiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0X3ZhbCA9ICQyKCIjcGFuaWNCdXlpbmdQbGFuIikudmFsKCk7CgogICAgICAgICAgICAgICAgLy/orr7lrprnmoTml7bpl7Tovazmr6vnp5IKICAgICAgICAgICAgICAgIHZhciBzZXRfdGltZSA9ICQyKCcjc2V0X3RpbWUnKS52YWwoKTsKCiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0X3ZhbCA9PSAiLS0t6K+36YCJ5oupLS0tIikgewogICAgICAgICAgICAgICAgICAgIG9iai5zd2FsX2luZm8obnVsbCwgIuaCqOayoeaciemAieaLqeaWueahiO+8jOivt+mAieaLqeWQiOmAgueahOaWueahiOWTpn4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgYXJyeV9wbGFucyA9IG9iai5nZXRPYmpLZXlzKG9ial9wbGFuc1tzZWxlY3RfdmFsXVsna2V5cyddKTsKICAgICAgICAgICAgICAgIGlmIChhcnJ5X3BsYW5zLmxlbmd0aCA+IDAgJiYgJDIuaW5BcnJheShsb2NhdGlvbi5ob3N0LCBhcnJ5X3BsYW5zKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIG9iai5zd2FsX2luZm8obnVsbCwgIumAieS4reeahOaWueahiOS4jeWPr+S9nOeUqOS6juacrOmhteWTpn4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChvYmpfcGxhbnNbc2VsZWN0X3ZhbF1bJ2pkX3NwaWtlJ10gPT0gJzEnICYmICFvYmouanVkZ21lbnRWaXJ0dWFsQ29va2llKCdtamRMb2dpbicpKSB7CiAgICAgICAgICAgICAgICAgICAgb2JqLnN3YWxfaW5mbyhudWxsLCAn6YCJ5oup5Lqs5Lic5p6B6YCf5LiL5Y2V5pa55qGI5ZCO77yM6K+354K55Ye7IuWOu+eZu+mZhiLnoa7kv53lt7Lnu4/nmbvpmYbkuoZ3ZWLniYjkuqzkuJx+77yM5pys5raI5oGvMuWwj+aXtuWGheS4jeWGjeaPkOmGkicsICfljrvnmbvpmYYnLCBmdW5jdGlvbiAoKSB7ICQyKCcjbWpkTG9naW4nKVswXS5jbGljaygpIH0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc2V0X3RpbWUgPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBvYmouc3dhbF9pbmZvKG51bGwsICLorr7lrprml7bpl7TkuI3og73kuLrnqboiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gbmV3IERhdGUoc2V0X3RpbWUpOwogICAgICAgICAgICAgICAgICAgIHZhciBkX21zID0gTnVtYmVyKGQpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihOdW1iZXIoZCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9iai5zd2FsX2luZm8obnVsbCwgIuivt+i+k+WFpeato+ehrueahOaXtumXtOagvOW8jyIpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TW9uaXRvcmluZ0ZsYWcgPSAnMSc7CiAgICAgICAgICAgICAgICAgICAgICAgICQyKCcjYnV0dG9uX3N0YXJ0TW9uaXRvcmluZycpLnRleHQoJ+ebkeaOp+S4rS4uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQyKCcjYnV0dG9uX3N0YXJ0TW9uaXRvcmluZycpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjZmZjYzAwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQyKCcjYnV0dG9uX3N0YXJ0TW9uaXRvcmluZycpLmNzcygnY29sb3InLCAnIzAwMDAwMCcpOwogICAgICAgICAgICAgICAgICAgICAgICAkMigiI3BhbmljQnV5aW5nUGxhbiIpLmF0dHIoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICQyKCIjc2V0X3RpbWUiKS5hdHRyKCJkaXNhYmxlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAkMigiI3N5bl90aW1lX2FwaSIpLmF0dHIoImRpc2FibGVkIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICQyKCIjc2V0X3RpbWVfbXMiKS5hdHRyKCJkaXNhYmxlZCIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAkMigiI2Vhcmx5T3JMYXRlIikuYXR0cigiZGlzYWJsZWQiLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQyKCcjZWFybHlPckxhdGUnKS52YWwoKSA9PSAnaW5BZHZhbmNlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGltZV9tcyA9IGRfbXMgLSBOdW1iZXIoJDIoJyNzZXRfdGltZV9tcycpLnZhbCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbWVfbXMgPSBkX21zICsgTnVtYmVyKCQyKCcjc2V0X3RpbWVfbXMnKS52YWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAkMignI2J1dHRvbl9zYXZlVGhpc1BhZ2UnKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCQyKCIjcGxhbk5hbWUiKS50ZXh0KCkpOwoKICAgICAgICAgICAgdmFyIGVycm9yID0gMDsKICAgICAgICAgICAgaWYgKCQyKCIjcGxhbk5hbWUiKS52YWwoKSA9PSAnJykgewogICAgICAgICAgICAgICAgLy8gb2JqLnN3YWxfaW5mbyhudWxsLCAi5pa55qGI5ZCN56ew5LiN5Y+v5Li656m677yBIik7CiAgICAgICAgICAgICAgICBvYmouc3dhbF9mYWRlQXdheSgi5pa55qGI5ZCN56ew5LiN5Y+v5Li656m677yBIiwgMTIwMCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQyKCIjcGxhbk5hbWUiKS52YWwoKSA9PSAnJykgewogICAgICAgICAgICAgICAgLy8gb2JqLnN3YWxfaW5mbyhudWxsLCAi5pa55qGI5ZCN56ew5LiN5Y+v5Li656m677yBIik7CiAgICAgICAgICAgICAgICBvYmouc3dhbF9mYWRlQXdheSgi5pa55qGI5ZCN56ew5LiN5Y+v5Li656m677yBIiwgMTIwMCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQyKCIjcGxhbkluZm8iKS52YWwoKSA9PSAnJykgewogICAgICAgICAgICAgICAgLy8gb2JqLnN3YWxfaW5mbyhudWxsLCAi5pa55qGI5o+P6L+w5LiN5Y+v5Li656m677yBIik7CiAgICAgICAgICAgICAgICBvYmouc3dhbF9mYWRlQXdheSgi5pa55qGI5o+P6L+w5LiN5Y+v5Li656m677yBIiwgMTIwMCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQyKCIjZGlzcGxheUJ1dHRvbiIpLmZpbmQoJ2RpdicpLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBvYmouc3dhbF9pbmZvKG51bGwsICLmsqHmnInmjZXojrfku7vkvZXmjInplK7vvIEiKTsKICAgICAgICAgICAgICAgIG9iai5zd2FsX2ZhZGVBd2F5KCLmsqHmnInmjZXojrfku7vkvZXmjInplK7vvIEiLCAxMjAwKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCduZXdQbGFuRmluaXNoJywgJzAnKTsKICAgICAgICAgICAgICAgIC8vdG9kbyDkv53lrZjmnKzpobXphY3nva7pobkKICAgICAgICAgICAgICAgIHZhciBwbGFuX2lkID0gJDIoIiNwbGFuSWQiKS50ZXh0KCk7CiAgICAgICAgICAgICAgICBvYmpfcGxhbnNbcGxhbl9pZF0gPSB7fTsKICAgICAgICAgICAgICAgIG9ial9wbGFuc1twbGFuX2lkXVsncGxhbl9uYW1lJ10gPSAkMigiI3BsYW5OYW1lIikudmFsKCk7CiAgICAgICAgICAgICAgICBvYmpfcGxhbnNbcGxhbl9pZF1bJ3BsYW5faW5mbyddID0gJDIoIiNwbGFuSW5mbyIpLnZhbCgpOwogICAgICAgICAgICAgICAgb2JqX3BsYW5zW3BsYW5faWRdWydwbGFuX3R5cGUnXSA9ICcxJzsKICAgICAgICAgICAgICAgIG9ial9wbGFuc1twbGFuX2lkXVsnamRfc3Bpa2UnXSA9ICcwJzsKICAgICAgICAgICAgICAgIG9ial9wbGFuc1twbGFuX2lkXVsncGxhbl9hdHRyaWJ1dGVzMSddID0gJyc7CiAgICAgICAgICAgICAgICBvYmpfcGxhbnNbcGxhbl9pZF1bJ3BsYW5fYXR0cmlidXRlczInXSA9ICcnOwogICAgICAgICAgICAgICAgb2JqX3BsYW5zW3BsYW5faWRdWydwbGFuX2F0dHJpYnV0ZXMzJ10gPSAnJzsKICAgICAgICAgICAgICAgIG9ial9wbGFuc1twbGFuX2lkXVsnaXNmaW5pc2gnXSA9ICcwJzsKICAgICAgICAgICAgICAgIG9ial9wbGFuc1twbGFuX2lkXVsna2V5cyddID0ge307CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICQyKCIuZHluYW1pY0hvc3RTcGFuIikubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaG9zdCA9ICQyKCIuZHluYW1pY0hvc3RTcGFuIilbaV0udGV4dENvbnRlbnQuc3BsaXQoJ++8micpWzFdOwogICAgICAgICAgICAgICAgICAgIG9ial9wbGFuc1twbGFuX2lkXVsna2V5cyddW2hvc3RdID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDE7IGogPCAkMignW2RhdGEtZG9tYWlubmFtZT0iJyArIGhvc3QgKyAnIl0nKVswXS5jaGlsZE5vZGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZG5vZGVzID0gJDIoJ1tkYXRhLWRvbWFpbm5hbWU9IicgKyBob3N0ICsgJyJdJylbMF0uY2hpbGROb2Rlc1tqXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleV9pbmZvID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dF92YWwgPSBjaGlsZG5vZGVzLmNoaWxkTm9kZXNbMl0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGlucHV0X3ZhbC5pbmRleE9mKCctJykgPiAwKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdmFsLnNwbGl0KCctJykubGVuZ3RoIDwgMiB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIW9iai5pc051bWJlcihpbnB1dF92YWwuc3BsaXQoJy0nKVswXSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICFvYmouaXNOdW1iZXIoaW5wdXRfdmFsLnNwbGl0KCctJylbMV0pCiAgICAgICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnJvciArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF92YWwgPSAnMS0yMDAnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGtleV9pbmZvWydrZXlfbmFtZSddID0gY2hpbGRub2Rlcy5jaGlsZE5vZGVzWzBdLnRleHRDb250ZW50LnNwbGl0KCfilrYnKVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAga2V5X2luZm9bJ3ByZXNzX251bSddID0gaW5wdXRfdmFsLnNwbGl0KCctJylbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGtleV9pbmZvWydwcmVzc19pbnRlcnZhbCddID0gaW5wdXRfdmFsLnNwbGl0KCctJylbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIGtleV9pbmZvWydjc3NfcGF0aCddID0gY2hpbGRub2Rlcy5jaGlsZE5vZGVzWzNdLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRub2Rlcy5jaGlsZE5vZGVzWzNdLnRleHRDb250ZW50ID09ICJyZWZyZXNoX3BhZ2UiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfaW5mb1sncHJlc3NfbnVtJ10gPSAnMSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0X3ZhbC5zcGxpdCgnLScpWzBdICE9ICcwJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqX3BsYW5zW3BsYW5faWRdWydrZXlzJ11baG9zdF0ucHVzaChrZXlfaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG9ial9wbGFuc1twbGFuX2lkXVsna2V5cyddW2hvc3RdLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvYmpfcGxhbnNbcGxhbl9pZF1bJ2tleXMnXVtob3N0XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoIm9ial9wbGFucyIsIEpTT04uc3RyaW5naWZ5KG9ial9wbGFucykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZXJyb3IgPiAwKSB7CiAgICAgICAgICAgICAgICBsaXN0ZW5fY2xpY2sgPSAnMCc7CiAgICAgICAgICAgICAgICBvYmouc3dhbF9pbmZvKG51bGwsICLlj5HnjrDmnInplJnor6/nmoTphY3nva7pobnvvIzlt7LlsIbplJnor6/nmoTphY3nva7pobnoh6rliqjosIPmlbTkuLoxLTIwMO+8gSIsIG51bGwsIGZ1bmN0aW9uICgpIHsgbG9jYXRpb24ucmVsb2FkKCk7IH0pCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgICQyKCcjcGxhbkNvbXBsZXRlZCcpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAkMignLmR5bmFtaWNIb3N0U3BhbicpLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoJDIoJy5keW5hbWljSG9zdFNwYW4nKVtpXS5pbm5lclRleHQuaW5kZXhPZign5pyq5L+d5a2YJykgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgb2JqLnN3YWxfZmFkZUF3YXkoIuivt+WFiOS/neWtmOacrOmhte+8gSIsIDEyMDApOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBHTV9zZXRWYWx1ZSgnbmV3UGxhbkZpbmlzaCcsICcxJyk7CiAgICAgICAgICAgIG9ial9wbGFuc1skMigiI3BsYW5JZCIpLnRleHQoKV1bJ2lzZmluaXNoJ10gPSAnMSc7CiAgICAgICAgICAgIEdNX3NldFZhbHVlKCJvYmpfcGxhbnMiLCBKU09OLnN0cmluZ2lmeShvYmpfcGxhbnMpKTsKICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgfSk7CiAgICAgICAgJDIoJyN0ZW1wb3JhcnlCbG9jaycpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgb2JqLnN3YWxfaW5mbyhudWxsLCAi6byg5qCH5pS+5Zyo5oKs5rWu55CD5LiK54K55Ye75Lit6ZSu5Lmf5Y+v5Li05pe25bGP6JS95oKs5rWu55CDIiwgIuaIkeefpemBk+S6hiIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICQyKCcjZmxvYXRfYXNzaXN0YW50JykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAgICAgICAgfSkKICAgICAgICB9KTsKICAgICAgICAkMignI3NhdmVfdGVtcG9yYXJ5QmxvY2snKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB0ZXh0YXJlYV90ZXh0ID0gJDIoJyN0ZXh0YXJlYV94enMnKS52YWwoKTsKICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2Jsb2NrVXJsJywgdGV4dGFyZWFfdGV4dCk7CiAgICAgICAgICAgIC8v5L+d5a2Y55m95ZCN5Y2VCiAgICAgICAgICAgIHZhciB0ZXh0YXJlYV90ZXh0ID0gJDIoJyN0ZXh0YXJlYV93bGlzdCcpLnZhbCgpOwogICAgICAgICAgICB2YXIgYXJyeV93bGlzdCA9IHRleHRhcmVhX3RleHQuc3BsaXQoIlxuIik7CiAgICAgICAgICAgIHZhciBzdHJfd2xpc3QgPSBvYmoudW5pcXVlQXJyKGFycnlfd2xpc3QpLmpvaW4oIlxuIik7CiAgICAgICAgICAgIEdNX3NldFZhbHVlKCdwYXNzVXJsJywgc3RyX3dsaXN0KTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAkMignLnJhZGlvX3NzJykubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICgkMignLnJhZGlvX3NzJylbaV0uY2hlY2tlZCkgewogICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdCV2xpc3Rfc2VsJywgJDIoJy5yYWRpb19zcycpW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBvYmouc3dhbF9pbmZvKG51bGwsICLkv53lrZjmiJDlip/vvIEiLCAi56Gu5a6aIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICAgICQyKCcjcGVybWFuZW50bHlCbG9jaycpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHRleHRhcmVhX3RleHQgPSAkMignI3RleHRhcmVhX3h6cycpLnZhbCgpOwogICAgICAgICAgICB2YXIgdGV4dGFyZWFfaG9zdHMgPSB0ZXh0YXJlYV90ZXh0LnNwbGl0KCJcbiIpOwogICAgICAgICAgICBpZiAodGV4dGFyZWFfaG9zdHMubGVuZ3RoID4gMCAmJiAkMi5pbkFycmF5KGxvY2F0aW9uLmhvc3QsIHRleHRhcmVhX2hvc3RzKSA+IC0xKSB7CiAgICAgICAgICAgICAgICBvYmouc3dhbF9pbmZvKG51bGwsICLmnKzln5/lkI3lt7LlnKjlsY/olL3liJfooajvvIEiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRleHRhcmVhX2hvc3RzLnB1c2gobG9jYXRpb24uaG9zdCk7CiAgICAgICAgICAgICAgICB2YXIgdGV4dGFyZWFfaG9zdHMgPSB0ZXh0YXJlYV9ob3N0cy5maWx0ZXIoZnVuY3Rpb24gKHMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyAmJiBzLnRyaW0oKTsgLy8g5rOo77yaSUU5KOS4jeWMheWQq0lFOSnku6XkuIvnmoTniYjmnKzmsqHmnIl0cmltKCnmlrnms5UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIHZhbF9uZXdfdXJsID0gdGV4dGFyZWFfaG9zdHMuam9pbigiXG4iKTsKICAgICAgICAgICAgICAgICQyKCcjdGV4dGFyZWFfeHpzJykudmFsKHZhbF9uZXdfdXJsKTsKICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdibG9ja1VybCcsIHZhbF9uZXdfdXJsKTsKICAgICAgICAgICAgICAgIG9iai5zd2FsX2luZm8obnVsbCwgIua3u+WKoOaIkOWKn++8gSIsIG51bGwsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAkMignI2Zsb2F0X2Fzc2lzdGFudCcpLmNzcygnZGlzcGxheScsICdub25lJyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgICQyKCcjcGFzc1RoaXNQYWdlJykuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkMignI3RleHRhcmVhX3dsaXN0JykudmFsKGxvY2F0aW9uLmhvc3QgKyAiXG4iICsgJDIoJyN0ZXh0YXJlYV93bGlzdCcpLnZhbCgpKTsKICAgICAgICB9KTsKICAgICAgICAkMignI2J1dHRvbl9hZGRfcmVmcmVzaCcpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbGlzdGVuX2NsaWNrID0gJzAnOwogICAgICAgICAgICBvYmouc3dhbF9pbmZvKG51bGwsCiAgICAgICAgICAgICAgICAi5bCP5o+Q56S6OlxuMS7mt7vliqDliLfmlrDpobXpnaLmjInpkq7lkI7vvIzlsIbml6Dms5Xnu6fnu63mjZXojrfmjInpkq5cbjIu5Yi35paw6aG16Z2i5oyJ6ZKu5YmN5b+F6aG75pyJ5bey57uP5o2V6I6355qE5oyJ6ZKuXG4zLuWIt+aWsOmhtemdouaMiemSruWPquiDvea3u+WKoOS4gOS4qlxuNC7liLfmlrDmk43kvZzlsIblnKjmiYDmnInmjInpkq7ngrnlh7vlrozmr5XlkI7miafooYwiLAogICAgICAgICAgICAgICAgIuehruWumua3u+WKoCIsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxvY2F0aW9uLmhvc3QpID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnN3YWxfZmFkZUF3YXkoIua3u+WKoOWIt+aWsOS5i+WJjeW/hemhu+imgeacieW3suaNleaNieeahOaMiemSru+8gSIsIDEyMDApOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobG9jYXRpb24uaG9zdCArICJfcmVmcmVzaF9wYWdlIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnN3YWxfZmFkZUF3YXkoIuWIt+aWsOmhtemdouaTjeS9nOWPquiDvea3u+WKoOS4gOS4qu+8gSIsIDEyMDApOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdfZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19kaXYuY2xhc3NOYW1lID0gJ2R5bmFtaWNESVYnOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3X3NwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zcGFuLmlubmVyVGV4dCA9ICfilrbliLfmlrDpobXpnaInOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3Bhbi5zdHlsZS5jb2xvciA9ICdyZWQnOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3Bhbi50aXRsZSA9ICfilrbliLfmlrDpobXpnaInOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3Bhbi5jbGFzc05hbWUgPSAnZHluYW1pY1NwYW4nOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfZGl2LmFwcGVuZENoaWxkKG5ld19zcGFuKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zcGFuLmlubmVySFRNTCA9ICcmbmJzcCZuYnNwJm5ic3AmbmJzcOmFjee9ru+8mic7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zcGFuLnRpdGxlID0gJ+S+i++8muaMiemSruaAu+WFseeCueWHuzPmrKHvvIzkuI7kuIrkuIDkuKrmjInpkq7pl7TpmpQyMDDmr6vnp5LvvIzovpPlhaUzLTIwMCc7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zcGFuLnN0eWxlLmNvbG9yID0gJ2dyZWVuJzsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NwYW4uc3R5bGUudmVydGljYWxBbGlnbiA9ICdtaWRkbGUnOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfZGl2LmFwcGVuZENoaWxkKG5ld19zcGFuKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld19pbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19pbnB1dC5jbGFzc05hbWUgPSAnZHluYW1pY0lucHV0JzsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2lucHV0LnBsYWNlaG9sZGVyID0gJ+WIt+aWsOaMiemSruWPquiDvemFjee9ruS4ujEteHgnOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdfaW5wdXQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2lucHV0LnZhbHVlID0gJzEtMjAwJzsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2Rpdi5hcHBlbmRDaGlsZChuZXdfaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfaW5wdXQuaWQgPSBsb2NhdGlvbi5ob3N0ICsgIl9yZWZyZXNoX3BhZ2UiOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NwYW4uaW5uZXJIVE1MID0gJ3JlZnJlc2hfcGFnZSc7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zcGFuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19kaXYuYXBwZW5kQ2hpbGQobmV3X3NwYW4pOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsb2NhdGlvbi5ob3N0KS5hcHBlbmRDaGlsZChuZXdfZGl2KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KQogICAgICAgIH0pOwogICAgICAgICQyKCcjYnV0dG9uX2NhcHR1cmUnKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICgkMigiI2J1dHRvbl9jYXB0dXJlIikudGV4dCgpID09ICfmjInpkq7mjZXojrcnKSB7CiAgICAgICAgICAgICAgICAkMigiI2J1dHRvbl9jYXB0dXJlIikudGV4dCgn57uT5p2f5o2V6I63Jyk7CiAgICAgICAgICAgICAgICAkMigiI2J1dHRvbl9jYXB0dXJlIikuY3NzKCdiYWNrZ3JvdW5kQ29sb3InLCAnI2ZmY2MwMCcpOwogICAgICAgICAgICAgICAgJDIoIiNidXR0b25fY2FwdHVyZSIpLmNzcygnY29sb3InLCAnIzAwMDAwMCcpOwogICAgICAgICAgICAgICAgbGlzdGVuX2NsaWNrID0gJzEnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJDIoIiNidXR0b25fY2FwdHVyZSIpLnRleHQoJ+aMiemSruaNleiOtycpOwogICAgICAgICAgICAgICAgJDIoIiNidXR0b25fY2FwdHVyZSIpLmNzcygnYmFja2dyb3VuZENvbG9yJywgJyMxZTkwZmYnKTsKICAgICAgICAgICAgICAgICQyKCIjYnV0dG9uX2NhcHR1cmUiKS5jc3MoJ2NvbG9yJywgJyNmZmZmZmYnKTsKICAgICAgICAgICAgICAgIGxpc3Rlbl9jbGljayA9ICcwJzsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYWxsRG9tID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpOwogICAgICAgICAgICBOb2RlTGlzdC5wcm90b3R5cGUuZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoOwogICAgICAgICAgICBhbGxEb20uZm9yRWFjaCgoaXRlbSkgPT4gewoKICAgICAgICAgICAgICAgIGlmIChpdGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gJ1NDUklQVCcpIHsKICAgICAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZSgpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaXRlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09ICdBJykgewogICAgICAgICAgICAgICAgICAgIGl0ZW0uaHJlZiA9ICIjIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpdGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT0gJ0JPRFknIHx8IGl0ZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PSAnSFRNTCcpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpdGVtLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICJyZ2JhKDc4LDExMCwyNDIsMCkiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChvYmouaXNQYXJlbnQoaXRlbSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvdXBvbi13cmFwLXFyIikpKSB7CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmouaXNQYXJlbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvdXBvbi13cmFwLXFyIiksIGl0ZW0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ub25mb2N1cyA9IGZ1bmN0aW9uIChldnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBldmVudCA9IGV2dCB8fCB3aW5kb3cuZXZlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLmNhcHR1cmVFeGVjdXRpb24odGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm9uY2xpY2sgPSBmdW5jdGlvbiAoZXZ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXZlbnQgPSBldnQgfHwgd2luZG93LmV2ZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLmNhcHR1cmVFeGVjdXRpb24odGFyZ2V0KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcicKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbG9yID0gaXRlbS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ub25tb3VzZWVudGVyID0gZnVuY3Rpb24gKCkgeyBpdGVtLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICJyZ2JhKDc4LDExMCwyNDIsMC4xNSkiOyB9CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ub25tb3VzZWxlYXZlID0gZnVuY3Rpb24gKCkgeyBpdGVtLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yOyB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KQogICAgICAgIH0pOwogICAgICAgICQyKCcjYnV0dG9uX2V4cG9ydFBsYW4nKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvYmpfcGxhbl90bXAgPSB7fTsKICAgICAgICAgICAgaWYgKCFvYmouaGFzU2VsZWN0UGxhbigpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNlbGVjdF92YWwgPSAkMigiI3BhbmljQnV5aW5nUGxhbiIpLnZhbCgpOwogICAgICAgICAgICBvYmpfcGxhbl90bXBbc2VsZWN0X3ZhbF0gPSBvYmpfcGxhbnNbc2VsZWN0X3ZhbF07CiAgICAgICAgICAgIHZhciBwbGFuX3N0ciA9IEpTT04uc3RyaW5naWZ5KG9ial9wbGFuX3RtcCk7CiAgICAgICAgICAgIG9iai5zd2FsX2luZm8oIuaWueahiOW6j+WIl+WMlue7k+aenCIsIHBsYW5fc3RyLCAn5aSN5Yi2JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKHBsYW5fc3RyLCAndGV4dCcpOwogICAgICAgICAgICAgICAgb2JqLnN3YWxfZmFkZUF3YXkoJ+WkjeWItuaIkOWKnycsIDEyMDApOwogICAgICAgICAgICB9KQogICAgICAgIH0pOwogICAgICAgICQyKCcjYnV0dG9uX2ltcG9ydFBsYW4nKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHN3YWwoIuivt+eymOi0tOW6j+WIl+WMluWQjueahOaWueahiCIsIHsKICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICJpbnB1dCIsCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAudGhlbigodmFsdWUpID0+IHsKICAgICAgICAgICAgICAgICAgICBvYmouaW1wb3J0UGxhbigncGx1Z2luJywgdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgJDIoJyNzaGFyZVRvQmJzJykuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoIW9iai5oYXNTZWxlY3RQbGFuKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBvYmpfcGxhbl90bXAgPSB7fTsKICAgICAgICAgICAgICAgIHZhciBzZWxlY3RfdmFsID0gJDIoIiNwYW5pY0J1eWluZ1BsYW4iKS52YWwoKTsKICAgICAgICAgICAgICAgIG9ial9wbGFuX3RtcFtzZWxlY3RfdmFsXSA9IG9ial9wbGFuc1tzZWxlY3RfdmFsXTsKICAgICAgICAgICAgICAgIHZhciBwbGFuX3N0ciA9IEpTT04uc3RyaW5naWZ5KG9ial9wbGFuX3RtcCk7CiAgICAgICAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQocGxhbl9zdHIsICd0ZXh0Jyk7CiAgICAgICAgICAgICAgICBvYmouc3dhbF9mYWRlQXdheSgi5aSN5Yi25oiQ5Yqf77yB5q2j5Zyo5omT5byA6K665Z2bIiwgMTIwMCk7CiAgICAgICAgICAgICAgICBHTV9vcGVuSW5UYWIoJ2h0dHBzOi8vYmJzLnlvdXlpemhpbmVuZy50b3AvZC8xNScsIHsgYWN0aXZlOiB0cnVlLCBzZXRQYXJlbnQ6IHRydWUgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAkMignI2ltcG9ydEZyb21CYnMnKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIEdNX29wZW5JblRhYignaHR0cHM6Ly9iYnMueW91eWl6aGluZW5nLnRvcC90L3NoYXJlJywgeyBhY3RpdmU6IHRydWUsIHNldFBhcmVudDogdHJ1ZSB9KTsKICAgICAgICB9KTsKICAgICAgICB2YXIgbmV3UGxhbkZpbmlzaCA9IEdNX2dldFZhbHVlKCduZXdQbGFuRmluaXNoJyk7CiAgICAgICAgaWYgKG5ld1BsYW5GaW5pc2ggPT0gJzAnKSB7CiAgICAgICAgICAgIG9iai5zd2l0Y2hUb05ldygnJyk7CiAgICAgICAgfQogICAgICAgIG9iai50aW1pbmcoKTsKICAgICAgICAvL+e7keWumuWxj+iUvee9keWdgAogICAgICAgICQyKCcjdGV4dGFyZWFfeHpzJykudmFsKGJsb2NrVXJsKTsKICAgICAgICAvL+e7keWumueZveWQjeWNlQogICAgICAgICQyKCIjdGV4dGFyZWFfd2xpc3QiKS52YWwocGFzc1VybCk7CiAgICAgICAgLy8gb2JqLmdldE5ld1ZlcnNpb24oKTsKICAgIH0KICAgIC8vI2VuZHJlZ2lvbiDmiqLotK3liqnmiYvliJ3lp4vljJYKICAgIC8vI3JlZ2lvbiBvYmouc3ludGltZSDlkIzmraXlip/og70KICAgIG9iai5zeW50aW1lID0gZnVuY3Rpb24gKCkgewogICAgICAgICQyKCcjdGltZV9zeW5jUmVzdWx0JykuaHRtbCgn5ZCM5q2l5LitLi4uJyk7CiAgICAgICAgdmFyIHN5bl90aW1lX2FwaV9zZWxlY3QgPSAkMigiI3N5bl90aW1lX2FwaSIpLnZhbCgpOwogICAgICAgIGlmIChzeW5fdGltZV9hcGlfc2VsZWN0ID09ICdsb2NhbCcpIHsKICAgICAgICAgICAgJDIoJyN0aW1lX3NwYW5fbXMnKS5odG1sKG9iai5nZXRfZGF0ZV9ub3dfbXMoKSk7CiAgICAgICAgICAgICQyKCcjdGltZV9zeW5jUmVzdWx0JykuaHRtbCgn5ZCM5q2l5pys5Zyw5pe26Ze05oiQ5YqfJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCQyKCIjc3luX3RpbWVfYXBpIikudmFsKCkuaW5kZXhPZigneW91eWl6aGluZW5nLnRvcCcpID4gMCkgewogICAgICAgICAgICAgICAgdmFyIHVybF9zYWx0ID0gc3luX3RpbWVfYXBpX3NlbGVjdCArICImc2FsdD0iICsgTWF0aC5yYW5kb20oKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciB1cmxfc2FsdCA9IHN5bl90aW1lX2FwaV9zZWxlY3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gY29uc29sZS5sb2codXJsX3NhbHQpOwogICAgICAgICAgICB2YXIgbm93MSA9IE51bWJlcihvYmouZ2V0X2RhdGVfbm93X21zKCkpOwogICAgICAgICAgICB2YXIgbm93MiA9IE51bWJlcihvYmouZ2V0X2RhdGVfbm93X21zKCkpOwogICAgICAgICAgICBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgICAgICAgICB1cmw6IHVybF9zYWx0LAogICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDEwMDAwLAogICAgICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgICAgICAgICAgICAnQ2FjaGUtQ29udHJvbCc6ICdwdWJsaWMnCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbiAoeGhyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09IDQgJiYgeGhyLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm93MiA9IE51bWJlcihvYmouZ2V0X2RhdGVfbm93X21zKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0geGhyLnJlc3BvbnNlVGV4dDsvL+iOt+WPluWIsGpzb27lrZfnrKbkuLLvvIzop6PmnpBzeXNUaW1lMQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJDIoIiNzeW5fdGltZV9hcGkiKS52YWwoKS5pbmRleE9mKCd5b3V5aXpoaW5lbmcudG9wJykgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UocmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDIoJyN0aW1lX3NwYW5fbXMnKS5odG1sKE51bWJlcihkYXRhLnNlcnZlclRpbWUpICsgcGFyc2VJbnQoKG5vdzIgLSBub3cxKSAvIDIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCcjdGltZV9zeW5jUmVzdWx0JykuaHRtbCgn5ZCM5q2l5Lqs5Lic5pyN5Yqh5Zmo5pe26Ze05oiQ5Yqf77yBJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJDIoIiNzeW5fdGltZV9hcGkiKS52YWwoKS5pbmRleE9mKCd0YW9iYW8uY29tJykgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UocmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDIoJyN0aW1lX3NwYW5fbXMnKS5odG1sKE51bWJlcihkYXRhLmRhdGEudCkgKyBwYXJzZUludCgobm93MiAtIG5vdzEpIC8gMikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDIoJyN0aW1lX3N5bmNSZXN1bHQnKS5odG1sKCflkIzmraXmt5jlrp3mnI3liqHlmajml7bpl7TmiJDlip/vvIEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkMigiI3N5bl90aW1lX2FwaSIpLnZhbCgpLmluZGV4T2YoJ3N1bmluZy5jb20nKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShyZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNuX3RpbWUgPSBuZXcgRGF0ZShkYXRhLnN5c1RpbWUyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCcjdGltZV9zcGFuX21zJykuaHRtbChOdW1iZXIoc25fdGltZSkgKyBwYXJzZUludCgobm93MiAtIG5vdzEpIC8gMikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDIoJyN0aW1lX3N5bmNSZXN1bHQnKS5odG1sKCflkIzmraXoi4/lroHmnI3liqHlmajml7bpl7TmiJDlip/vvIEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkMigiI3N5bl90aW1lX2FwaSIpLnZhbCgpLmluZGV4T2YoJ3BpbmR1b2R1by5jb20nKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShyZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMignI3RpbWVfc3Bhbl9tcycpLmh0bWwoTnVtYmVyKGRhdGEuc2VydmVyX3RpbWUpICsgcGFyc2VJbnQoKG5vdzIgLSBub3cxKSAvIDIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCcjdGltZV9zeW5jUmVzdWx0JykuaHRtbCgn5ZCM5q2l5ou85aSa5aSa5pyN5Yqh5Zmo5pe26Ze05oiQ5Yqf77yBJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJDIoIiNzeW5fdGltZV9hcGkiKS52YWwoKS5pbmRleE9mKCd2bWFsbC5jb20nKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShyZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMignI3RpbWVfc3Bhbl9tcycpLmh0bWwoTnVtYmVyKGRhdGEuY3VycmVudFRpbWUpICsgcGFyc2VJbnQoKG5vdzIgLSBub3cxKSAvIDIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCcjdGltZV9zeW5jUmVzdWx0JykuaHRtbCgn5ZCM5q2l5Y2O5Li65ZWG5Z+O5pyN5Yqh5Zmo5pe26Ze05oiQ5Yqf77yBJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJDIoIiNzeW5fdGltZV9hcGkiKS52YWwoKS5pbmRleE9mKCdtaS5jb20nKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeG1UaW1lc3RhbXAgPSByZXMuc3BsaXQoJz0nKVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCcjdGltZV9zcGFuX21zJykuaHRtbChOdW1iZXIoeG1UaW1lc3RhbXApICogMTAwMCArIHBhcnNlSW50KChub3cyIC0gbm93MSkgLyAyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMignI3RpbWVfc3luY1Jlc3VsdCcpLmh0bWwoJ+WQjOatpeWwj+exs+acieWTgeacjeWKoeWZqOaXtumXtOaIkOWKn++8gScpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlSGVhZGVycyA9IHhoci5yZXNwb25zZUhlYWRlcnMuc3BsaXQoIlxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcG9uc2VIZWFkZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUhlYWRlcnNbaV0uc3BsaXQoImRhdGU6IikubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2VIZWFkZXJzW2ldLnNwbGl0KCJkYXRlOiIpWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzbl90aW1lID0gbmV3IERhdGUocmVzcG9uc2VIZWFkZXJzW2ldLnNwbGl0KCJkYXRlOiIpWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCcjdGltZV9zcGFuX21zJykuaHRtbChOdW1iZXIoc25fdGltZSkgKyBwYXJzZUludCgobm93MiAtIG5vdzEpIC8gMikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDIoJyN0aW1lX3N5bmNSZXN1bHQnKS5odG1sKCflkIzmraXlvZPliY3pobXpnaLmnI3liqHlmajml7bpl7TmiJDlip/vvIEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCcjdGltZV9zcGFuX21zJykuaHRtbChvYmouZ2V0X2RhdGVfbm93X21zKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCcjdGltZV9zeW5jUmVzdWx0JykuaHRtbCgn5ZCM5q2l5Y+R55Sf6ZSZ6K+v77yM5bey5YiH5o2i5ZCM5q2l5pys5Zyw5pe26Ze0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkMignI3RpbWVfc3Bhbl9tcycpLmh0bWwob2JqLmdldF9kYXRlX25vd19tcygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgJDIoJyN0aW1lX3N5bmNSZXN1bHQnKS5odG1sKCflkIzmraXlj5HnlJ/plJnor6/vvIzlt7LliIfmjaLlkIzmraXmnKzlnLDml7bpl7QnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KICAgIC8vI2VuZHJlZ2lvbgogICAgb2JqLmdldEFzc2lzdGFudEh0bWwgPSBmdW5jdGlvbiAodHlwZSkgewogICAgICAgIHZhciBodG1sID0gJyc7CiAgICAgICAgaWYgKHR5cGUgIT0gJ2RldGFpbFBhZ2UnKSB7CiAgICAgICAgICAgIGh0bWwgPSBodG1sICsKICAgICAgICAgICAgICAgICc8ZGl2IGlkPSJmbG9hdF9hc3Npc3RhbnQiPicgKwogICAgICAgICAgICAgICAgJzxkaXYgaWQ9ImNvdXBvbi13cmFwLXFyIiBjbGFzcz0iY291cG9uLXdyYXAtcXIiIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazsiPicgKwogICAgICAgICAgICAgICAgJyAgIDxkaXYgY2xhc3M9InRhYnNob2xkZXIyIiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7Ij4nOwogICAgICAgIH0KICAgICAgICBodG1sID0gaHRtbCArCiAgICAgICAgICAgICc8ZGl2IGRhdGEtdGFiPSLmiqLotK3liqnmiYsiPicgKwogICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94IiBzdHlsZT0ibWFyZ2luLWJvdHRvbToxMHB4OyIgPicgKwogICAgICAgICAgICAnICAgICAgICA8c3BhbiBpZD0icGx1Z2luVXBkYXRlIiBzdHlsZT0iY3Vyc29yOnBvaW50ZXI7Y29sb3I6IzFlOTBmZjtkaXNwbGF5Om5vbmU7Ij7mj5Lku7bmnInmm7TmlrAs54K55Ye75pu05pawPC9zcGFuPicgKwogICAgICAgICAgICAnICAgIDwvZGl2PicgKwogICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94IiBzdHlsZT0ibWFyZ2luOjBweDsiPicgKwogICAgICAgICAgICAnICAgICAgICA8c3Bhbj7mn6XnnIvmlZnnqIvvvJo8L3NwYW4+JyArCiAgICAgICAgICAgICcgICAgICAgIDxzcGFuIGlkPSJ2aWV3VHV0b3JpYWwiIHN0eWxlPSJjdXJzb3I6cG9pbnRlcjtjb2xvcjojMWU5MGZmOyI+54K55Ye75p+l55yL5pWZ56iLPC9zcGFuPicgKwogICAgICAgICAgICAnICAgICAgICA8c3BhbiBpZD0idmlld0Rlc2NyaXB0aW9uIiBzdHlsZT0iY3Vyc29yOnBvaW50ZXI7Y29sb3I6IzNiOWQzYjttYXJnaW4tbGVmdDoyMHB4O2ZvbnQtd2VpZ2h0OjcwMCI+Pj7lsZXlvIDor7TmmI48L3NwYW4+JyArCiAgICAgICAgICAgIC8vICcgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJ2aWV3VHV0b3JpYWwiIHN0eWxlPSJib3JkZXI6MHB4O2JveC1zaGFkb3c6Oy13ZWJraXQtYm94LXNoYWRvdzo7Ij7ngrnlh7vmn6XnnIvmlZnnqIs8L2E+JyArCiAgICAgICAgICAgICcgICAgPC9kaXY+JyArCiAgICAgICAgICAgICcgICAgPGRpdiBjbGFzcz0iZGl2LWhlbHBlci1ib3giPicgKwogICAgICAgICAgICAnICAgICAgICA8c3Bhbj7miafooYzkuK3nmoTvvJo8L3NwYW4+JyArCiAgICAgICAgICAgICcgICAgICAgIDxzZWxlY3QgaWQ9ImluUHJvZ3Jlc3MiIHN0eWxlPSJ3aWR0aDoxNjVweDsiPicgKwogICAgICAgICAgICAnICAgICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHNlbGVjdGVkPi0tLeivt+mAieaLqS0tLTwvb3B0aW9uPicgKwogICAgICAgICAgICAnICAgICAgICA8L3NlbGVjdD4nICsKICAgICAgICAgICAgJyAgICAgICAgPGJ1dHRvbiBpZD0iYnV0dG9uX2RlbFRhc2siIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjMUU5MEZGOyI+5YGc5q2i5Lu75YqhPC9idXR0b24+JyArCiAgICAgICAgICAgICcgICAgPC9kaXY+JyArCiAgICAgICAgICAgICcgICAgPGRpdiBjbGFzcz0iZGl2LWhlbHBlci1ib3ggc3lzLWRlc2NyaXB0aW9uIiBzdHlsZT0ibWFyZ2luOjBweDsiPicgKwogICAgICAgICAgICAnICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6IzNiOWQzYiI+4pay5b2T5YmN5omn6KGM5Lit55qE5Lu75Yqh77yM6Iul5Lu75Yqh5omn6KGM5b2x5ZON5q2j5bi45rWP6KeI77yM5Y+v5Lul5YGc5q2i5a+55bqU55qE5Lu75YqhPC9zcGFuPicgKwogICAgICAgICAgICAnICAgIDwvZGl2PicgKwogICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94Ij4nICsKICAgICAgICAgICAgJyAgICAgICAgPHNwYW4+5b2T5YmN5pe26Ze077yaPC9zcGFuPicgKwogICAgICAgICAgICAnICAgICAgICA8c3BhbiBpZD0idGltZV9zcGFuIiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6IDE2MHB4OyI+PC9zcGFuPicgKwogICAgICAgICAgICAnICAgICAgICA8c3BhbiBpZD0idGltZV9zcGFuX21zIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9zcGFuPicgKwogICAgICAgICAgICAnICAgICAgICA8c3BhbiBpZD0idGltZV9zeW5jUmVzdWx0IiBzdHlsZT0iY29sb3I6IGdyZWVuOyI+5pyq5ZCM5q2lPC9zcGFuPicgKwogICAgICAgICAgICAnICAgIDwvZGl2PicgKwogICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94IHN5cy1kZXNjcmlwdGlvbiIgc3R5bGU9Im1hcmdpbjowcHg7Ij4nICsKICAgICAgICAgICAgJyAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiMzYjlkM2IiPuKWsuW9k+WJjeaXtumXtO+8jOWQjOatpeS5i+WQjuaJjeS8muWHhuehru+8jOacgOWlveWcqOW/q+W8gOWni+aKoui0reaXtuWAmeWQjOatpeS4gOasoTwvc3Bhbj4nICsKICAgICAgICAgICAgJyAgICA8L2Rpdj4nICsKICAgICAgICAgICAgJyAgICA8ZGl2IGNsYXNzPSJkaXYtaGVscGVyLWJveCI+JyArCiAgICAgICAgICAgICcgICAgICAgIDxzcGFuPuWQjOatpeaXtumXtO+8mjwvc3Bhbj4nICsKICAgICAgICAgICAgJyAgICAgICAgPHNlbGVjdCBpZD0ic3luX3RpbWVfYXBpIiBzdHlsZT0id2lkdGg6MTY1cHg7Ij4nICsKICAgICAgICAgICAgJyAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImxvY2FsIj7mupDvvJrmnKzlnLDml7bpl7Q8L29wdGlvbj4nICsKICAgICAgICAgICAgJyAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHBzOi8vYXBpLm0udGFvYmFvLmNvbS9yZXN0L2FwaTMuZG8/YXBpPW10b3AuY29tbW9uLmdldFRpbWVzdGFtcCI+5rqQ77ya5reY5a6d5pyN5Yqh5Zmo5pe26Ze0PC9vcHRpb24+JyArCiAgICAgICAgICAgICcgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwczovL3d3dy55b3V5aXpoaW5lbmcudG9wLy9xdWVyeV9jb3Vwb24vcXVlcnlfY291cG9uX3YyMTAxMjAucGhwP29wZXJhdGU9c3luX3RpbWUmdHlwZT1qZCI+5rqQ77ya5Lqs5Lic5pyN5Yqh5Zmo5pe26Ze0PC9vcHRpb24+JyArCiAgICAgICAgICAgICcgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwczovL3F1YW4uc3VuaW5nLmNvbS9nZXRTeXNUaW1lLmRvIj7mupDvvJroi4/lroHmnI3liqHlmajml7bpl7Q8L29wdGlvbj4nICsKICAgICAgICAgICAgJyAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHBzOi8vYXBpLnBpbmR1b2R1by5jb20vYXBpL3NlcnZlci9fc3RtIj7mupDvvJrmi7zlpJrlpJrmnI3liqHlmajml7bpl7Q8L29wdGlvbj4nICsKICAgICAgICAgICAgJyAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHBzOi8vbWJ1eS52bWFsbC5jb20vZ2V0U2t1UnVzaGJ1eUluZm8uanNvbiI+5rqQ77ya5Y2O5Li65ZWG5Z+O5pyN5Yqh5Zmo5pe26Ze0PC9vcHRpb24+JyArCiAgICAgICAgICAgICcgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwczovL3RwdG0uaGQubWkuY29tL2dldHRpbWVzdGFtcCI+5rqQ77ya5bCP57Gz5pyJ5ZOB5pyN5Yqh5Zmo5pe26Ze0PC9vcHRpb24+JyArCiAgICAgICAgICAgICcgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSInICsgbG9jYXRpb24uaHJlZiArICciPua6kO+8muacrOmhtemdouacjeWKoeWZqO+8iOeyvuehruWIsOenku+8iTwvb3B0aW9uPicgKwogICAgICAgICAgICAnICAgICAgICA8L3NlbGVjdD4nICsKICAgICAgICAgICAgJyAgICAgICAgPGJ1dHRvbiBpZD0iYnV0dG9uX3N5biIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICMxRTkwRkY7Ij7lkIzmraXml7bpl7Q8L2J1dHRvbj4nICsKICAgICAgICAgICAgJyAgICA8L2Rpdj4nICsKICAgICAgICAgICAgJyAgICA8ZGl2IGNsYXNzPSJkaXYtaGVscGVyLWJveCBzeXMtZGVzY3JpcHRpb24iIHN0eWxlPSJtYXJnaW46MHB4OyI+JyArCiAgICAgICAgICAgICcgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjojM2I5ZDNiIj7ilrLpgInmi6nlkIzmraXml7bpl7TmupDvvIzpgqPkuKrlubPlj7DlsLHpgInlk6rkuKrmupDvvIzngrnlh7vlkIzmraXml7bpl7Tlj6/ku6XlkIzmraXkuIDmrKE8L3NwYW4+JyArCiAgICAgICAgICAgICcgICAgPC9kaXY+JyArCiAgICAgICAgICAgICcgICAgPGRpdiBjbGFzcz0iZGl2LWhlbHBlci1ib3giPicgKwogICAgICAgICAgICAnICAgICAgICA8c3Bhbj7miqLotK3ml7bpl7TvvJo8L3NwYW4+JyArCiAgICAgICAgICAgICcgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0eUlucHV0IiB0eXBlPSJ0ZXh0IiBpZD0ic2V0X3RpbWUiIHN0eWxlPSJ3aWR0aDoxNThweDsiIHBsYWNlaG9sZGVyPSLmoLzlvI86MjAyMC0xMS0xMSAxMTo1OTo1OSI+JyArCiAgICAgICAgICAgICcgICAgICAgIDxidXR0b24gaWQ9ImJ1dHRvbl9nZXRDdXJyZW50VGltZSIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICMxRTkwRkY7Ij7ojrflj5blvZPliY08L2J1dHRvbj4nICsKICAgICAgICAgICAgJyAgICAgICAgPHNlbGVjdCBpZD0iZWFybHlPckxhdGUiPicgKwogICAgICAgICAgICAnICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW5BZHZhbmNlIj7mj5DliY08L29wdGlvbj4nICsKICAgICAgICAgICAgJyAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InBvc3Rwb25lIj7lu7blkI48L29wdGlvbj4nICsKICAgICAgICAgICAgJyAgICAgICAgPC9zZWxlY3Q+JyArCiAgICAgICAgICAgICcgICAgICAgIDwhLS0gPHNwYW4+Jm5ic3AmbmJzcCZuYnNwJm5ic3Dmj5DliY08L3NwYW4+IC0tPicgKwogICAgICAgICAgICAnICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHlJbnB1dCIgdHlwZT0idGV4dCIgaWQ9InNldF90aW1lX21zIiBzdHlsZT0id2lkdGg6IDMwcHg7Ij4nICsKICAgICAgICAgICAgJyAgICAgICAgPHNwYW4+5q+r56eSPC9zcGFuPicgKwogICAgICAgICAgICAnICAgIDwvZGl2PicgKwogICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94IHN5cy1kZXNjcmlwdGlvbiIgc3R5bGU9Im1hcmdpbjowcHg7Ij4nICsKICAgICAgICAgICAgJyAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiMzYjlkM2IiPuKWsuiuvue9ruaKoui0reaXtumXtO+8jOWPr+S7peiuvue9ruaPkOWJjeaIluiAheW7tuWQju+8jOaPkOWJjeWSjOW7tuWQjueahOWAvOagueaNruiHquW3seeahOe7j+mqjOiuvue9ru+8jOS4jeiuvue9ruWImeS4ujA8L3NwYW4+JyArCiAgICAgICAgICAgICcgICAgPC9kaXY+JyArCiAgICAgICAgICAgICcgICAgPGRpdiBjbGFzcz0iZGl2LWhlbHBlci1ib3giPicgKwogICAgICAgICAgICAnICAgICAgICA8c3Bhbj7miqLotK3mlrnmoYjvvJo8L3NwYW4+JyArCiAgICAgICAgICAgICcgICAgICAgIDxzZWxlY3QgIHN0eWxlPSJ3aWR0aDoxNjVweDsiIGlkPSJwYW5pY0J1eWluZ1BsYW4iPicgKwogICAgICAgICAgICAnICAgICAgICA8b3B0aW9uIGRpc2FibGVkIHNlbGVjdGVkPi0tLeivt+mAieaLqS0tLTwvb3B0aW9uPicgKwogICAgICAgICAgICAnICAgICAgICA8L3NlbGVjdD4nICsKICAgICAgICAgICAgJyAgICAgICAgPGltZyBpZD0iaW1nUGxhbkluZm8iIHNyYz0iaHR0cHM6Ly9zMy5heDF4LmNvbS8yMDIwLzExLzMwL0RneDF2cS5wbmciPicgKwogICAgICAgICAgICAnICAgICAgICA8YnV0dG9uIGlkPSJidXR0b25fbmV3UGxhbiI+5paw5bu65pa55qGIPC9idXR0b24+JyArCiAgICAgICAgICAgICcgICAgICAgIDxidXR0b24gaWQ9ImJ1dHRvbl9lZGl0UGxhbiI+57yW6L6R5pa55qGIPC9idXR0b24+JyArCiAgICAgICAgICAgICcgICAgPC9kaXY+JyArCiAgICAgICAgICAgICcgICAgPGRpdiBjbGFzcz0iZGl2LWhlbHBlci1ib3giPicgKwogICAgICAgICAgICAnICAgICAgICA8c3BhbiBzdHlsZT0idmlzaWJpbGl0eTpoaWRkZW4iPuaIkeadpeWNoOS9je+8mjwvc3Bhbj4nICsKICAgICAgICAgICAgJyAgICAgICAgPGJ1dHRvbiBpZD0iYnV0dG9uX2RlbFBsYW4iIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOnJlZCI+5Yig6Zmk5pa55qGIPC9idXR0b24+JyArCiAgICAgICAgICAgICcgICAgICAgIDxidXR0b24gaWQ9ImJ1dHRvbl9leHBvcnRQbGFuIj7lr7zlh7rmlrnmoYg8L2J1dHRvbj4nICsKICAgICAgICAgICAgJyAgICAgICAgPGJ1dHRvbiBpZD0iYnV0dG9uX2ltcG9ydFBsYW4iPuWvvOWFpeaWueahiDwvYnV0dG9uPicgKwogICAgICAgICAgICAnICAgICAgICA8YnV0dG9uIGlkPSJzaGFyZVRvQmJzIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojZWE3NDYwO3dpZHRoPTkwcHgiPuWIhuS6q+WIsOiuuuWdmzwvYnV0dG9uPicgKwogICAgICAgICAgICAnICAgICAgICA8YnV0dG9uIGlkPSJpbXBvcnRGcm9tQmJzIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojZWE3NDYwO3dpZHRoPTkwcHgiPuS7juiuuuWdm+WvvOWFpTwvYnV0dG9uPicgKwogICAgICAgICAgICAnICAgIDwvZGl2PicgKwogICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94IHN5cy1kZXNjcmlwdGlvbiIgc3R5bGU9Im1hcmdpbjowcHg7Ij4nICsKICAgICAgICAgICAgJyAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiMzYjlkM2IiPuKWsuaKoui0reaWueahiOmAieaLqeOAgeaWsOW7uuOAgee8lui+keOAgeWvvOWFpeOAgeWvvOWHujwvc3Bhbj4nICsKICAgICAgICAgICAgJyAgICA8L2Rpdj4nICsKICAgICAgICAgICAgJyAgICA8ZGl2IGNsYXNzPSJkaXYtaGVscGVyLWJveCI+JyArCiAgICAgICAgICAgICcgICAgICAgIDxzcGFuPuaMgee7reaXtumXtO+8mjwvc3Bhbj4nICsKICAgICAgICAgICAgJyAgICAgICAgPGlucHV0IGNsYXNzPSJidXR5SW5wdXQiIHR5cGU9InRleHQiIGlkPSJkdXJhdGlvbiIgc3R5bGU9IndpZHRoOjMwcHg7Ij4nICsKICAgICAgICAgICAgJyAgICAgICAgPHNwYW4+56eSKOm7mOiupDYw56eSKSA8L3NwYW4+ICA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPuivtOaYju+8muS7juaKoui0reaXtuWIu+W8gOWni+eahOaMgee7reaKoui0reaXtumXtDwvc3Bhbj4nICsKICAgICAgICAgICAgJyAgICA8L2Rpdj4nICsKICAgICAgICAgICAgJyAgICA8ZGl2IGNsYXNzPSJkaXYtaGVscGVyLWJveCBzeXMtZGVzY3JpcHRpb24iIHN0eWxlPSJtYXJnaW46MHB4OyI+JyArCiAgICAgICAgICAgICcgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjojM2I5ZDNiIj7ilrLku47miqLotK3ml7bliLvlvIDlp4vnmoTmjIHnu63miqLotK3ml7bpl7TvvIzoi6Xorr7nva7nmoTml7bpl7Tov4fplb/vvIzmiqLotK3ku7vliqHkvJrkuIDnm7TmiqLotK3vvIzlj6/lnKjigJzov5vooYzkuK3nmoTigJ3lgZzmraLku7vliqHjgII8L3NwYW4+JyArCiAgICAgICAgICAgICcgICAgPC9kaXY+JyArCiAgICAgICAgICAgICcgICAgPGRpdiBjbGFzcz0iZGl2LWhlbHBlci1ib3giPicgKwogICAgICAgICAgICAnICAgICAgICA8c3Bhbj7ov5DooYznirbmgIHvvJo8L3NwYW4+JyArCiAgICAgICAgICAgICcgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0eUlucHV0IiB0eXBlPSJ0ZXh0IiBpZD0icnVuU3RhdHVzIiBzdHlsZT0id2lkdGg6IDMwMHB4O2JhY2tncm91bmQtY29sb3I6ICNmOGY4Zjg7IiByZWFkb25seT0icmVhZG9ubHkiPicgKwogICAgICAgICAgICAnICAgIDwvZGl2PicgKwogICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94Ij4nICsKICAgICAgICAgICAgJyAgICAgICAgPGJ1dHRvbiBpZD0iYnV0dG9uX3N0YXJ0TW9uaXRvcmluZyIgY2xhc3M9Im5vdFJ1biI+5byA5aeL55uR5o6nPC9idXR0b24+JyArCiAgICAgICAgICAgICcgICAgICAgIDxidXR0b24gaWQ9ImJ1dHRvbl9zdGFydE5vdyIgY2xhc3M9Im5vdFJ1biI+56uL5Y2z5omn6KGMPC9idXR0b24+JyArCiAgICAgICAgICAgICcgICAgPC9kaXY+JyArCiAgICAgICAgICAgICcgICAgPGRpdiBjbGFzcz0iZGl2LWhlbHBlci1ib3ggc3lzLWRlc2NyaXB0aW9uIiBzdHlsZT0ibWFyZ2luOjBweDsiPicgKwogICAgICAgICAgICAnICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6IzNiOWQzYiI+4pay5byA5aeL55uR5o6n77ya5Yiw6K6+572u55qE5pe26Ze054K55ZCO5omn6KGM44CC56uL5Y2z5omn6KGM77ya5Zyo546w5Zyo5pe25Yi755u05o6l5omn6KGM5pa55qGIPC9zcGFuPicgKwogICAgICAgICAgICAnICAgIDwvZGl2PicgKwogICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICc8ZGl2IGRhdGEtdGFiPSLmlrDmlrnmoYgiPicgKwogICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94IiBzdHlsZSA9ICJkaXNwbGF5Om5vbmU7Ij4nICsKICAgICAgICAgICAgJyAgICAgICAgPHNwYW4gaWQ9InBsYW5JZCI+PC9zcGFuPicgKwogICAgICAgICAgICAnICAgICAgICA8c3BhbiBpZD0iaXNGaW5pc2giPjwvc3Bhbj4nICsKICAgICAgICAgICAgJyAgICA8L2Rpdj4nICsKICAgICAgICAgICAgJyAgICA8ZGl2IGNsYXNzPSJkaXYtaGVscGVyLWJveCI+JyArCiAgICAgICAgICAgICcgICAgICAgIDxzcGFuPuaWueahiOWQjeensO+8mjwvc3Bhbj4nICsKICAgICAgICAgICAgJyAgICAgICAgPGlucHV0IGlkPSJwbGFuTmFtZSIgY2xhc3M9ImJ1dHlJbnB1dCIgdHlwZT0idGV4dCIgc3R5bGU9IndpZHRoOiAxNTBweDsiPicgKwogICAgICAgICAgICAnICAgIDwvZGl2PicgKwogICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94Ij4nICsKICAgICAgICAgICAgJyAgICAgICAgPHNwYW4+5pa55qGI5o+P6L+w77yaPC9zcGFuPicgKwogICAgICAgICAgICAnICAgICAgICA8aW5wdXQgaWQ9InBsYW5JbmZvIiBjbGFzcz0iYnV0eUlucHV0IiB0eXBlPSJ0ZXh0IiBzdHlsZT0id2lkdGg6IDI1MHB4OyI+JyArCiAgICAgICAgICAgICcgICAgPC9kaXY+JyArCiAgICAgICAgICAgICcgICAgPGRpdiBjbGFzcz0iZGl2LWhlbHBlci1ib3giPicgKwogICAgICAgICAgICAnICAgICAgICA8ZGl2PicgKwogICAgICAgICAgICAnICAgICAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpibG9jazt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNmM2YxZjE7Ij7ilrzlt7LmjZXojrfmjInpkq7mtYHilrw8L3NwYW4+JyArCiAgICAgICAgICAgICcgICAgICAgIDwvZGl2PicgKwogICAgICAgICAgICAnICAgIDwvZGl2PicgKwogICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94Ij4nICsKICAgICAgICAgICAgJyAgICAgICAgPGRpdiBpZD0iZGlzcGxheUJ1dHRvbiI+JyArCiAgICAgICAgICAgICcgICAgICAgIDwvZGl2PicgKwogICAgICAgICAgICAnICAgIDwvZGl2PicgKwogICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94Ij4nICsKICAgICAgICAgICAgJyAgICAgICAgPGJ1dHRvbiBpZD0iYnV0dG9uX2NhcHR1cmUiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjMUU5MEZGOyI+5oyJ6ZKu5o2V6I63PC9idXR0b24+JyArCiAgICAgICAgICAgICcgICAgICAgIDxidXR0b24gaWQ9ImJ1dHRvbl9zYXZlVGhpc1BhZ2UiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjMUU5MEZGOyI+5L+d5a2Y5pys6aG1PC9idXR0b24+JyArCiAgICAgICAgICAgICcgICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDozMHB4Ij48L3NwYW4+JyArCiAgICAgICAgICAgICcgICAgICAgIDxidXR0b24gaWQ9ImJ1dHRvbl9hZGRfbWpkIj4r5Lqs5Lic5b+r6YCf6YCa6YGTPC9idXR0b24+JyArCiAgICAgICAgICAgICcgICAgICAgIDxidXR0b24gaWQ9ImJ1dHRvbl9hZGRfcmVmcmVzaCI+K+WIt+aWsOmhtemdojwvYnV0dG9uPicgKwogICAgICAgICAgICAnICAgIDwvZGl2PicgKwogICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94Ij4nICsKICAgICAgICAgICAgJyAgICAgICAgPGJ1dHRvbiBpZD0icGxhbkNvbXBsZXRlZCI+5L+d5a2Y5pa55qGIPC9idXR0b24+JyArCiAgICAgICAgICAgICcgICAgPC9kaXY+JyArCiAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgIGlmICh0eXBlICE9ICdkZXRhaWxQYWdlJykgewogICAgICAgICAgICBodG1sID0gaHRtbCArCiAgICAgICAgICAgICAgICAnPGRpdiBkYXRhLXRhYj0i6K6+572uIj4nICsKICAgICAgICAgICAgICAgICcgICAgPGRpdiBjbGFzcz0iZGl2LWhlbHBlci1ib3giPicgKwogICAgICAgICAgICAgICAgJyAgICAgICAgPGlucHV0IGNsYXNzPSJyYWRpb19zcyIgdHlwZT0icmFkaW8iIG5hbWU9InVybE1vZGUiIHZhbHVlPSJibGFja19tb2RlIj7pu5HlkI3ljZXmqKHlvI8gJyArCiAgICAgICAgICAgICAgICAnICAgICAgICA8aW5wdXQgY2xhc3M9InJhZGlvX3NzIiB0eXBlPSJyYWRpbyIgbmFtZT0idXJsTW9kZSIgdmFsdWU9IndoaXRlX21vZGUiPueZveWQjeWNleaooeW8jycgKwogICAgICAgICAgICAgICAgJyAgICA8L2Rpdj4nICsKICAgICAgICAgICAgICAgICcgICA8ZGl2IGNsYXNzPSJkaXYtaGVscGVyLWJveCI+JyArCiAgICAgICAgICAgICAgICAnICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5OiBibG9jazsiPuWxj+iUvee9keWdgO+8iOm7keWQjeWNle+8ie+8mue9keWdgOS4jue9keWdgOS5i+mXtOmcgOimgeaNouihjDwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICcgICAgICAgPHRleHRhcmVhIGlkPSJ0ZXh0YXJlYV94enMiIHJvd3M9IjEwIiBjb2xzPSI4MCIgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkOyI+PC90ZXh0YXJlYT4nICsKICAgICAgICAgICAgICAgICcgICA8L2Rpdj4nICsKICAgICAgICAgICAgICAgICcgICA8ZGl2IGNsYXNzPSJkaXYtaGVscGVyLWJveCI+JyArCiAgICAgICAgICAgICAgICAnICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5OiBibG9jazsiPuaUvuihjOe9keWdgO+8iOeZveWQjeWNle+8ie+8mue9keWdgOS4jue9keWdgOS5i+mXtOmcgOimgeaNouihjCzmlrnmoYjkuK3nmoTnvZHlnYDoh6rliqjliqDlhaXnmb3lkI3ljZU8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAnICAgICAgIDx0ZXh0YXJlYSBpZD0idGV4dGFyZWFfd2xpc3QiIHJvd3M9IjEwIiBjb2xzPSI4MCIgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkOyI+PC90ZXh0YXJlYT4nICsKICAgICAgICAgICAgICAgICcgICA8L2Rpdj4nICsKICAgICAgICAgICAgICAgICcgICA8ZGl2IGNsYXNzPSJkaXYtaGVscGVyLWJveCIgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPicgKwogICAgICAgICAgICAgICAgJyAgICAgICAgICAgPGJ1dHRvbiBpZD0ic2F2ZV90ZW1wb3JhcnlCbG9jayI+5L+d5a2YPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAnICAgPC9kaXY+JyArCiAgICAgICAgICAgICAgICAnICAgPGRpdiBjbGFzcz0iZGl2LWhlbHBlci1ib3giPicgKwogICAgICAgICAgICAgICAgJyAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTogYmxvY2s7Y29sb3I6Z3JlZW4iPuS4tOaXtuWxj+iUveS7heacrOasoeeUn+aViDwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICcgICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6IGJsb2NrO2NvbG9yOmdyZWVuIj7msLjkuYXlsY/olL3lkI7lj6/lnKjkuIrpnaLliKDpmaTlr7nlupTnmoTnvZHnq5nop6PpmaTlsY/olL08L3NwYW4+JyArCiAgICAgICAgICAgICAgICAnICAgICAgIDxzcGFuID7mnKzpobXmk43kvZzvvJo8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAnICAgICAgIDxidXR0b24gaWQ9InRlbXBvcmFyeUJsb2NrIj7kuLTml7blsY/olL08L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICcgICAgICAgPGJ1dHRvbiBpZD0icGVybWFuZW50bHlCbG9jayIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6cmVkIj7msLjkuYXlsY/olL08L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICcgICAgICAgPGJ1dHRvbiBpZD0icGFzc1RoaXNQYWdlIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpncmVlbjt3aWR0aDoxMTBweCI+5re75Yqg5pys6aG15Yiw55m95ZCN5Y2VPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAnICAgPC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAnICAgIDwvZGl2PicgKwogICAgICAgICAgICAgICAgJyAgICA8L2Rpdj4nICsKICAgICAgICAgICAgICAgICcgICAgPC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGh0bWw7CiAgICB9CiAgICBvYmouZ2VuZXJhdGVDb3Vwb25BcmVhID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBwcm9kdWN0SWQgPSAnJzsgdmFyIG9wZXJhdGUgPSAnJzsgdmFyIHNpbmdsZU9ybGlzdCA9ICcnOwogICAgICAgIHZhciBzaXRlX3R5cGVfY2hpbmVzZSA9ICLmt5jlrp0iOwogICAgICAgIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gInRhb2Jhb19kZXRhaWxzX3BhZ2UiKSB7CiAgICAgICAgICAgIG9wZXJhdGUgPSAncXVlcnRfc2luZ2xlJzsKICAgICAgICAgICAgc2luZ2xlT3JsaXN0ID0gJ2l0ZW1pZCc7CiAgICAgICAgICAgIG9iai5nZXRfZGF0YSgpOwogICAgICAgICAgICBpZiAoc3RvcCA9PSAnMScpIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIHZhciBwYXJhbXMgPSBsb2NhdGlvbi5zZWFyY2guc3BsaXQoIj8iKVsxXS5zcGxpdCgiJiIpOwogICAgICAgICAgICBmb3IgKHZhciBpbmRleCBpbiBwYXJhbXMpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbaW5kZXhdLnNwbGl0KCI9IilbMF0gPT0gImlkIikgewogICAgICAgICAgICAgICAgICAgIHByb2R1Y3RJZCA9IHBhcmFtc1tpbmRleF0uc3BsaXQoIj0iKVsxXTsgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2l0ZV90eXBlX2NoaW5lc2UgPSAi5reY5a6dIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAob2JqLnNpdGVfdHlwZSgpID09ICJqaW5nZG9uZ19kZXRhaWxzX3BhZ2UiKSB7CiAgICAgICAgICAgIG9wZXJhdGUgPSAncXVlcnRfc2luZ2xlX2pkJzsKICAgICAgICAgICAgc2luZ2xlT3JsaXN0ID0gJ2l0ZW1pZCc7CiAgICAgICAgICAgIC8vZ2V0IGRhdGEKICAgICAgICAgICAgb2JqLmdldF9kYXRhKCk7CiAgICAgICAgICAgIGlmIChzdG9wID09ICcxJykgeyByZXR1cm47IH0KICAgICAgICAgICAgcHJvZHVjdElkID0gbG9jYXRpb24uaHJlZi5zcGxpdCgiLy8iKVsxXS5zcGxpdCgiLyIpWzFdLnNwbGl0KCIuIilbMF07CiAgICAgICAgICAgIHNpdGVfdHlwZV9jaGluZXNlID0gIuS6rOS4nCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9iai5zaXRlX3R5cGUoKSA9PSAidmlwX2RldGFpbF9wYWdlIiB8fCBvYmouc2l0ZV90eXBlKCkgPT0gInZpcF9kZXRhaWxfcGFnZV9tIikgewogICAgICAgICAgICBvcGVyYXRlID0gJ3F1ZXJ0X2xpc3RfdmlwJzsKICAgICAgICAgICAgc2luZ2xlT3JsaXN0ID0gJ2l0ZW1pZF9saXN0JzsKICAgICAgICAgICAgLy9nZXQgZGF0YQogICAgICAgICAgICBvYmouZ2V0X2RhdGEoKTsKICAgICAgICAgICAgaWYgKHN0b3AgPT0gJzEnKSB7IHJldHVybjsgfQogICAgICAgICAgICBwcm9kdWN0SWQgPSBsb2NhdGlvbi5ocmVmLnNwbGl0KCItIilbbG9jYXRpb24uaHJlZi5zcGxpdCgiLSIpLmxlbmd0aCAtIDFdLnNwbGl0KCIuIilbMF07CiAgICAgICAgICAgIHNpdGVfdHlwZV9jaGluZXNlID0gIuWUr+WTgeS8miI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9iai5zaXRlX3R5cGUoKSA9PSAia2FvbGFfZGV0YWlsX3BhZ2UiKSB7CiAgICAgICAgICAgIG9wZXJhdGUgPSAna2FvbGFfc2luZ2xlJzsKICAgICAgICAgICAgc2luZ2xlT3JsaXN0ID0gJ2l0ZW1pZF9saXN0JzsKICAgICAgICAgICAgLy8gLy9nZXQgZGF0YQogICAgICAgICAgICAvLyBvYmouZ2V0X2RhdGEoKTsKICAgICAgICAgICAgLy8gaWYgKHN0b3AgPT0gJzEnKSB7IHJldHVybjsgfQogICAgICAgICAgICBwcm9kdWN0SWQgPSBsb2NhdGlvbi5ocmVmLnNwbGl0KCIvcHJvZHVjdC8iKVsxXS5zcGxpdCgiLiIpWzBdOwogICAgICAgICAgICBzaXRlX3R5cGVfY2hpbmVzZSA9ICLogIPmi4nmtbfotK0iOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gInN1bmluZ19kZXRhaWxfcGFnZSIpIHsKICAgICAgICAgICAgb3BlcmF0ZSA9ICdzdW5pbmdfc2luZ2xlJzsKICAgICAgICAgICAgc2luZ2xlT3JsaXN0ID0gJ2l0ZW1pZCc7CiAgICAgICAgICAgIC8vIC8vZ2V0IGRhdGEKICAgICAgICAgICAgLy8gb2JqLmdldF9kYXRhKCk7CiAgICAgICAgICAgIC8vIGlmIChzdG9wID09ICcxJykgeyByZXR1cm47IH0KICAgICAgICAgICAgLy8gdmFyIG1lcnRDb2RlID0gbG9jYXRpb24uaHJlZi5zcGxpdCgicHJvZHVjdC5zdW5pbmcuY29tLyIpWzFdLnNwbGl0KCIuaHRtbCIpWzBdLnNwbGl0KCIvIilbMF07CiAgICAgICAgICAgIHZhciBjb21tQ29kZSA9IGxvY2F0aW9uLmhyZWYuc3BsaXQoInByb2R1Y3Quc3VuaW5nLmNvbS8iKVsxXS5zcGxpdCgiLmh0bWwiKVswXS5zcGxpdCgiLyIpWzFdOwogICAgICAgICAgICBwcm9kdWN0SWQgPSBjb21tQ29kZTsKICAgICAgICAgICAgc2l0ZV90eXBlX2NoaW5lc2UgPSAi6IuP5a6B5piT6LStIjsKICAgICAgICB9CgogICAgICAgIHZhciB1cmwgPSAiaHR0cHM6Ly93d3cueW91eWl6aGluZW5nLnRvcC9xdWVyeV9jb3Vwb24vcXVlcnlfY291cG9uX3YyMTAxMjAucGhwP29wZXJhdGU9IiArIG9wZXJhdGUgKyAiJiIgKyBzaW5nbGVPcmxpc3QgKyAiPSIgKyBwcm9kdWN0SWQ7CiAgICAgICAgY29uc29sZS5sb2codXJsKTsKICAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7Ly/nrKzkuIDmraXvvJrmlrDlu7rlr7nosaEKICAgICAgICB4aHIub3BlbignR0VUJywgdXJsLCB0cnVlKTsvL+esrOS6jOatpe+8muaJk+W8gOi/nuaOpSAg5bCG6K+35rGC5Y+C5pWw5YaZ5ZyodXJs5LitCiAgICAgICAgeGhyLnNlbmQoKTsvL+esrOS4ieatpe+8muWPkemAgeivt+axgiAg5bCG6K+35rGC5Y+C5pWw5YaZ5ZyoVVJM5LitCiAgICAgICAgLyoqCiAgICAgICAgICog6I635Y+W5pWw5o2u5ZCO55qE5aSE55CG56iL5bqPCiAgICAgICAgICovCiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09IDQgJiYgeGhyLnN0YXR1cyA9PSAyMDApIHsKICAgICAgICAgICAgICAgIHZhciByZXMgPSB4aHIucmVzcG9uc2VUZXh0Oy8v6I635Y+W5YiwanNvbuWtl+espuS4su+8jOino+aekAogICAgICAgICAgICAgICAgdmFyIGRhdGE7CiAgICAgICAgICAgICAgICBpZiAob2JqLnNpdGVfdHlwZSgpID09ICJ0YW9iYW9fZGV0YWlsc19wYWdlIikgewogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHJlcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gImppbmdkb25nX2RldGFpbHNfcGFnZSIgfHwgb2JqLnNpdGVfdHlwZSgpID09ICJ2aXBfZGV0YWlsX3BhZ2UiIHx8IG9iai5zaXRlX3R5cGUoKSA9PSAidmlwX2RldGFpbF9wYWdlX20iIHx8IG9iai5zaXRlX3R5cGUoKSA9PSAia2FvbGFfZGV0YWlsX3BhZ2UiIHx8IG9iai5zaXRlX3R5cGUoKSA9PSAic3VuaW5nX2RldGFpbF9wYWdlIikgewogICAgICAgICAgICAgICAgICAgIHZhciBkYXRhX3RtcCA9IEpTT04ucGFyc2UocmVzKTsKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YV90bXBbcHJvZHVjdElkXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBjb3Vwb25BcmVhOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuY291cG9ubW9uZXkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGNvdXBvbkFyZWEgPQogICAgICAgICAgICAgICAgICAgICAgICAvLyNyZWdpb24g5peg5LyY5oOg5Yi45pi+56S6CiAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJjb3Vwb24td3JhcCI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICcgICA8ZGl2IGNsYXNzPSJzdGFtcCBzdGFtcDA0Ij4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICA8ZGl2IGNsYXNzPSJwYXIiID4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgPHN1YiBjbGFzcz0ic2lnbiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtkaXNwbGF5Om5vbmU7Ij7ov5Q8L3N1Yj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgPHNwYW4gaWQ9ImZhY2VWYWx1ZSIgc3R5bGU9ImZvbnQtc2l6ZToxOHB4O2xpbmUtaGVpZ2h0OjUwcHgiPuaaguaXoOmakOiXj+S8mOaDoOWIuDwvc3Bhbj48cD48L3A+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgIDxwIGlkPSJmYWNlVmFsdWVFeHBsYWluIiBzdHlsZT0iZm9udC1zaXplOjhweCI+PC9wPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDxkaXYgaWQ9ImNvcHlfZGl2IiBjbGFzcz0iY29weSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPui/lOeOsCcgKwogICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICA8cD7ml6DkvJjmg6DliLg8YnI+5pyJ6L+U546wPC9wPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICA8YSBpZD0iYV9zY2FuQ29kZUNhc2hiYWNrIj4nICsgIuaJq+eggei/lOeOsCIgKyAnPC9hPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDxpPjwvaT4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAvLyNlbmRyZWdpb24g5LyY5oOg5Yi45pi+56S6CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBob3dUb0dldENvdXBvbnMgPSAn55u05o6l6aKG5Yi4JzsKICAgICAgICAgICAgICAgICAgICBjb3Vwb25BcmVhID0KICAgICAgICAgICAgICAgICAgICAgICAgLy8jcmVnaW9uIOacieS8mOaDoOWIuOaYvuekugogICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iY291cG9uLXdyYXAiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnICAgPGRpdiBjbGFzcz0ic3RhbXAgc3RhbXAwNCI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgPGRpdiBjbGFzcz0icGFyIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgPHN1YiBjbGFzcz0ic2lnbiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsiPu+/pTwvc3ViPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1zaXplOjIwcHg7Ij4nICsgZGF0YS5jb3Vwb25tb25leSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgIDxwPicgKyBkYXRhLmNvdXBvbmV4cGxhaW4gKyAnPC9wPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgIDxkaXYgY2xhc3M9ImNvcHkiPuS8mOaDoOWIuCcgKwogICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICA8cD4nICsgZGF0YS5jb3Vwb25zdGFydHRpbWUgKyAiPGJyPiIgKyBkYXRhLmNvdXBvbmVuZHRpbWUgKyAnPC9wPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICA8YSBocmVmPSInICsgZGF0YS51cmwxICsgJyI+JyArIGhvd1RvR2V0Q291cG9ucyArICc8L2E+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgPGk+PC9pPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnICAgPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgIC8vI2VuZHJlZ2lvbiDmnInkvJjmg6DliLjmmL7npLoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vI3JlZ2lvbiDov5TnjrDmloflrZcKICAgICAgICAgICAgICAgIGlmIChkYXRhLnJldHVybl9tb25leV9yYXRlID09IDApIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3Bhbl90ZXh0ID0gJ+aaguaXoOi/lOeOsCc7CiAgICAgICAgICAgICAgICAgICAgdmFyIG90aGVyX3RleHQgPSAn5YW25LuW5Yqf6IO9JzsKICAgICAgICAgICAgICAgICAgICB2YXIgaHRtbF9xcl9jb2RlID0gJzxpbWcgY2xhc3M9InFyLWltZyIgc3JjPSJodHRwczovL3MxLmF4MXguY29tLzIwMjAvMTAvMjYvQm5ZN2pTLnBuZyI+PC9pbWc+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0idGl0bGUiPuOAjOiKseWJjeecgeS4gOecgeOAjeaYr+S4gOasvumihuWIuOi/lOeOsOeahEFQUO+8jOaUr+aMgea3mOWuneOAgeWkqeeMq+OAgeS6rOS4nOOAgeaLvOWkmuWkmuOAgeWUr+WTgeS8muetieetieS4u+a1geW5s+WPsH7ov5jmnInngrnlpJbljZbpoobliLjov5TnjrDvvIznlLXlvbHnpajkvJjmg6DotK3vvIzlhajnvZF2aXDop4bpopHlhY3otLnnnIvnrYnlip/og73vvIzorqnmgqjoirHpkrHkuYvliY3vvIzlho3nnIHkuIDnnIE8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iZm9vdCIgc3R5bGU9ImhlaWdodDoyMHB4OyI+5omr56CB5LiL6L2977yM5pSv5oyBSU9T5ZKM5a6J5Y2T77yM5Lmf5Y+v5Zyo5ZCE5aSn5bqU55So5biC5Zy65LiL6L29PC9zcGFuPic7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBzcGFuX3RleHQgPSAn6L+U546w5p+l6K+i5LitLi4uJzsKICAgICAgICAgICAgICAgICAgICB2YXIgb3RoZXJfdGV4dCA9ICfngrnlh7vpooblj5bov5TnjrAnOwogICAgICAgICAgICAgICAgICAgIHZhciBodG1sX3FyX2NvZGUgPSAnPGRpdiBpZD0icXJjb2RlIj48L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJ0aXRsZSI+6I635b6X6L+U546w5Y+q6ZyA5LiJ5q2lfjwvYnI+PC9icj7ikaDlupTnlKjllYblupfkuIvovb1BUFDvvJroirHliY3nnIHkuIDnnIE8L2JyPuKRoeS9v+eUqEFQUOS4u+mhteaJq+S4gOaJq+WKn+iDveaJq+W3puS+p+eUn+aIkOeahOWVhuWTgeeggTwvYnI+4pGi6YCJ5oup6Ieq6LSt55yB77yM5LuO6Iqx5YmN55yB5LiA55yBQVBQ6Lez6L2s5YiwJyArIHNpdGVfdHlwZV9jaGluZXNlICsgJ0FQUOS4i+WNle+8jOehruiupOaUtui0p+WQjui/lOeOsOWwhui/m+WFpeiKseWJjeecgeS4gOecgUFQUOi0puaIt+S9meminX48L2JyPjxicj48L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iZm9vdCIgc3R5bGU9ImhlaWdodDoyMHB4Ij7mlK/mjIFJT1PlkozlronljZPvvIzlkITlpKflupTnlKjluILlnLrlnYfmnInkuIvovb08L2JyPjwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJmb290IiBzdHlsZT0iaGVpZ2h0OjIwcHg7Y29sb3I6Z3JlZW47Zm9udC13ZWlnaHQ6NzAwO2Rpc3BsYXk6IGJsb2NrOyB0ZXh0LWFsaWduOiByaWdodDsiPuiKseWJjeecgeS4gOecgS0t6Iqx6ZKx5LmL5YmN77yM5YaN55yB5LiA55yBPC9zcGFuPic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyNlbmRyZWdpb24g6L+U546w5paH5a2XCiAgICAgICAgICAgICAgICBjb3Vwb25BcmVhID0gY291cG9uQXJlYSArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImNvdXBvbi13cmFwLXJtIj4nICsKICAgICAgICAgICAgICAgICAgICAnICAgPGRpdiBjbGFzcz0icm0tZGl2IiBzdHlsZT0id2lkdGg6NjAwcHg7dGV4dC1hbGlnbjpjZW50ZXIiPicgKwogICAgICAgICAgICAgICAgICAgICcgICAgICAgPHNwYW4gaWQ9InJtX21vbmV5Ij4nICsgc3Bhbl90ZXh0ICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnICAgICAgIDxkaXYgY2xhc3M9InJtLWJ0biIgaWQ9ImFfY2xpY2siPicgKyBvdGhlcl90ZXh0ICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICcgICA8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCgogICAgICAgICAgICAgICAgICAgICc8ZGl2IGlkPSJjb3Vwb24td3JhcC1xciIgY2xhc3M9ImNvdXBvbi13cmFwLXFyIj4nICsKICAgICAgICAgICAgICAgICAgICAnICAgPGRpdiBjbGFzcz0idGFic2hvbGRlcjIiPic7CiAgICAgICAgICAgICAgICAvLyNyZWdpb24g6L+U546w56CBCiAgICAgICAgICAgICAgICBjb3Vwb25BcmVhID0gY291cG9uQXJlYSArCiAgICAgICAgICAgICAgICAgICAgJyAgICAgICA8ZGl2IGRhdGEtdGFiPSLov5TnjrDnoIEiPicgKwogICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgIDxkaXYgY2xhc3M9InFyLWNvZGUtZGl2Ij4nICsKICAgICAgICAgICAgICAgICAgICBodG1sX3FyX2NvZGUgKwogICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgIDwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICcgICAgICAgPC9kaXY+JzsKICAgICAgICAgICAgICAgIC8vI2VuZHJlZ2lvbgogICAgICAgICAgICAgICAgLy8jcmVnaW9uIOS7t+agvOi1sOWKvwogICAgICAgICAgICAgICAgY291cG9uQXJlYSA9IGNvdXBvbkFyZWEgKwogICAgICAgICAgICAgICAgICAgICcgICAgICAgPGRpdiBkYXRhLXRhYj0i5Lu35qC86LWw5Yq/Ij4nICsKICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3Vwb24td3JhcC1ybSI+JyArCiAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJtLWRpdiI+JyArCiAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0cmVuZC1idG4iIGlkPSJ0cmVuZF9jbGljayI+5Y6G5Y+y5Lu35qC86LWw5Yq/PGltZyBjbGFzcz0idHJlbmQtYnRuLWltZyIgc3JjPSJodHRwczovL3MxLmF4MXguY29tLzIwMjAvMTAvMjYvQm5ZMHQxLnBuZyIgYWx0PSIiPjwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgPGltZyAgY2xhc3M9ImltYWdlLXN0YXR1cyIgPicgKwogICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgPGVtIGNsYXNzPSJzdGF0dXMtc3BhbiI+PC9lbT4nICsKICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgPGRpdiBjbGFzcz0idHJlbmQtZGl2Ij4nICsKICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgPGRpdiBpZD0iY2hhcnQiPjwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgIDwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICcgICAgICAgPC9kaXY+JzsKICAgICAgICAgICAgICAgIC8vI2VuZHJlZ2lvbgogICAgICAgICAgICAgICAgLy8jcmVnaW9uIOaKoui0reWKqeaJiwogICAgICAgICAgICAgICAgY291cG9uQXJlYSA9IGNvdXBvbkFyZWEgKyBvYmouZ2V0QXNzaXN0YW50SHRtbCgnZGV0YWlsUGFnZScpOwogICAgICAgICAgICAgICAgLy8jZW5kcmVnaW9uCiAgICAgICAgICAgICAgICAvLyNyZWdpb24g5Yqo5oCBCiAgICAgICAgICAgICAgICBpZiAoZGF0YS50YWJfaHRtbCAhPSBudWxsICYmIGRhdGEudGFiX2h0bWwgIT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBjb3Vwb25BcmVhID0gY291cG9uQXJlYSArIGRhdGEudGFiX2h0bWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyPorr7nva7pobUKICAgICAgICAgICAgICAgIGNvdXBvbkFyZWEgPSBjb3Vwb25BcmVhICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBkYXRhLXRhYj0i6K6+572uIj4nICsKICAgICAgICAgICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94Ij4nICsKICAgICAgICAgICAgICAgICAgICAnICAgICAgICA8bGFiZWwgZm9yPSIiIHN0eWxlPSJ3aWR0aDogMzAwcHg7ZGlzcGxheTogYmxvY2s7Ij7or7fpgInmi6npu5jorqTlsZXnpLrlhoXlrrk8L2xhYmVsPicgKwogICAgICAgICAgICAgICAgICAgICcgICAgPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJyAgICA8ZGl2IGNsYXNzPSJkaXYtaGVscGVyLWJveCI+JyArCiAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgPGlucHV0IGNsYXNzPSJyYWRpb19zIiB0eXBlPSJyYWRpbyIgbmFtZT0ic2V4IiB2YWx1ZT0iaGlkZSI+5YWo6YOo6ZqQ6JePJyArCiAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgPGlucHV0IGNsYXNzPSJyYWRpb19zIiB0eXBlPSJyYWRpbyIgbmFtZT0ic2V4IiB2YWx1ZT0icXJjb2RlIj7ov5TnjrDnoIEnICsKICAgICAgICAgICAgICAgICAgICAnICAgICAgICA8aW5wdXQgY2xhc3M9InJhZGlvX3MiIHR5cGU9InJhZGlvIiBuYW1lPSJzZXgiIHZhbHVlPSJ0cmVuZCI+5Lu35qC86LWw5Yq/JyArCiAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgPGlucHV0IGNsYXNzPSJyYWRpb19zIiB0eXBlPSJyYWRpbyIgbmFtZT0ic2V4IiB2YWx1ZT0iYXNzaXN0YW50Ij7miqLotK3liqnmiYsnICsKICAgICAgICAgICAgICAgICAgICAnICAgIDwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICcgICAgPGRpdiBjbGFzcz0iZGl2LWhlbHBlci1ib3giPicgKwogICAgICAgICAgICAgICAgICAgICcgICAgICAgIDxsYWJlbCBmb3I9IiIgc3R5bGU9IndpZHRoOiAzMDBweDtkaXNwbGF5OiBibG9jazsiPuivt+mAieaLqeaCrOa1rueQg+Wxj+iUveaooeW8jzwvbGFiZWw+JyArCiAgICAgICAgICAgICAgICAgICAgJyAgICA8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94Ij4nICsKICAgICAgICAgICAgICAgICAgICAnICAgICAgICA8aW5wdXQgY2xhc3M9InJhZGlvX3NzIiB0eXBlPSJyYWRpbyIgbmFtZT0ic2hpZWxkTW9kZSIgdmFsdWU9ImJsYWNrX21vZGUiPum7keWQjeWNleaooeW8jycgKwogICAgICAgICAgICAgICAgICAgICcgICAgICAgIDxpbnB1dCBjbGFzcz0icmFkaW9fc3MiIHR5cGU9InJhZGlvIiBuYW1lPSJzaGllbGRNb2RlIiB2YWx1ZT0id2hpdGVfbW9kZSI+55m95ZCN5Y2V5qih5byPJyArCiAgICAgICAgICAgICAgICAgICAgJyAgICA8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImRpdi1oZWxwZXItYm94Ij4nICsKICAgICAgICAgICAgICAgICAgICAnICAgICAgICA8YnV0dG9uIGlkPSJidXR0b25fc2F2ZVNldHRpbmciPuS/neWtmDwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICcgICAgPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAgICAgICAgICAgICAvLyNlbmRyZWdpb24KICAgICAgICAgICAgICAgIGNvdXBvbkFyZWEgPSBjb3Vwb25BcmVhICsKICAgICAgICAgICAgICAgICAgICAnICAgPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzwvZGl2Pic7CiAgICAgICAgICAgICAgICB2YXIgbHMgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCQyKCIuY291cG9uLXdyYXAiKS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqLnNpdGVfdHlwZSgpID09ICJ0YW9iYW9fZGV0YWlsc19wYWdlIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQyKCIudG0tZmNzLXBhbmVsIikubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCIudG0tZmNzLXBhbmVsIikuYWZ0ZXIoY291cG9uQXJlYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCQyKCJ1bC50Yi1tZXRhIikubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCJ1bC50Yi1tZXRhIikuYWZ0ZXIoY291cG9uQXJlYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXJfY29kZV90ZXh0ID0gb2JqLkRldGFpbFBhZ2VUQl9vcl9UTV9vcl9KRCgpICsgJy8vJyArIHByb2R1Y3RJZDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gImppbmdkb25nX2RldGFpbHNfcGFnZSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJy8vaXRlbS5qZC5jb20nKSA+IDAgfHwgbG9jYXRpb24uaHJlZi5pbmRleE9mKCcvL2ktaXRlbS5qZC5jb20nKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJDIoIi5zdW1tYXJ5LWZpcnN0IikubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMigiLnN1bW1hcnktZmlyc3QiKS5hZnRlcihjb3Vwb25BcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJDIoIiNzdW1tYXJ5IikubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMigiI3N1bW1hcnkiKS5hZnRlcihjb3Vwb25BcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJDIoIiNwaW5nb3UiKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCIjcGluZ291IikuYWZ0ZXIoY291cG9uQXJlYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbi5ocmVmLmluZGV4T2YoJy8vaXRlbS5qZC5oaycpID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkMigiLnN1bW1hcnktZmlyc3QiKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCIuc3VtbWFyeS1maXJzdCIpLmFmdGVyKGNvdXBvbkFyZWEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgkMigiI3N1bW1hcnkiKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCIjc3VtbWFyeSIpLmFmdGVyKGNvdXBvbkFyZWEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgkMigiI3N1bW1hcnktd3JhcCIpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDIoIiNzdW1tYXJ5LXdyYXAiKS5hZnRlcihjb3Vwb25BcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJDIoIi5zdW1tYXJ5IikubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMigiLnN1bW1hcnkiKS5hZnRlcihjb3Vwb25BcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2F0aW9uLmhyZWYuaW5kZXhPZignLy9wY2l0ZW0uamQuaGsnKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJDIoIi5zdW1tYXJ5IikubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMigiLnN1bW1hcnkiKS5hZnRlcihjb3Vwb25BcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXJfY29kZV90ZXh0ID0gb2JqLkRldGFpbFBhZ2VUQl9vcl9UTV9vcl9KRCgpICsgJy8vJyArIHByb2R1Y3RJZDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gInZpcF9kZXRhaWxfcGFnZSIgfHwgb2JqLnNpdGVfdHlwZSgpID09ICJ2aXBfZGV0YWlsX3BhZ2VfbSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkMigiI0otcGktcHJpY2UtYm94IikubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCIjSi1waS1wcmljZS1ib3giKS5hZnRlcihjb3Vwb25BcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxcl9jb2RlX3RleHQgPSBsb2NhdGlvbi5ocmVmLnNwbGl0KCI/IilbMF0gKyAiPy8tLS92aXB2aXAiOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iai5zaXRlX3R5cGUoKSA9PSAia2FvbGFfZGV0YWlsX3BhZ2UiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJDIoIi5tLXByaWNlLXdyYXAiKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDIoIi5tLXByaWNlLXdyYXAiKS5hZnRlcihjb3Vwb25BcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxcl9jb2RlX3RleHQgPSBsb2NhdGlvbi5ocmVmLnNwbGl0KCI/IilbMF0gKyAiPy8tLS9rYW9sYSI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAob2JqLnNpdGVfdHlwZSgpID09ICJzdW5pbmdfZGV0YWlsX3BhZ2UiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJDIoIiNwcmljZURvbSIpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMigiI3ByaWNlRG9tIikuYWZ0ZXIoY291cG9uQXJlYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXJfY29kZV90ZXh0ID0gbG9jYXRpb24uaHJlZi5zcGxpdCgiPyIpWzBdICsgIj8vLS0vc3VuaW5nIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkMignLnRhYnNob2xkZXIyJykuY2FyZFRhYnMoeyB0aGVtZTogJ3dpa2knIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAkMigiLmNvdXBvbi13cmFwIikuZXEoMCkuYmVmb3JlKGRhdGEuaHRtbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQyKCIjcXJjb2RlIikucXJjb2RlKHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAxNTAsIHRleHQ6IHFyX2NvZGVfdGV4dCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgJDIoIiNhX2NsaWNrIikuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJDIoIiNjb3Vwb24td3JhcC1xciIpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnNlbGVjdF90YWIoJ+i/lOeOsOeggScsICcnLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICQyKCcjYnV0dG9uX3NhdmVTZXR0aW5nJykuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAkMignLnJhZGlvX3MnKS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkMignLnJhZGlvX3MnKVtpXS5jaGVja2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdyYWRpb19zJywgJDIoJy5yYWRpb19zJylbaV0udmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICQyKCcucmFkaW9fc3MnKS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkMignLnJhZGlvX3NzJylbaV0uY2hlY2tlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgnQldsaXN0X3NlbCcsICQyKCcucmFkaW9fc3MnKVtpXS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5zd2FsX2ZhZGVBd2F5KCLkv53lrZjmiJDlip8iLCAxMjAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByYWRpb19zZWxlY3QgPSBHTV9nZXRWYWx1ZSgncmFkaW9fcycsICdxcmNvZGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YWNrX2NoaWxkcmVuID0gJDIoJy5jYXJkLXRhYnMtc3RhY2sud2lraScpWzBdLmNoaWxkcmVuOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFyX2NoaWxkcmVuID0gJDIoJy5jYXJkLXRhYnMtYmFyLndpa2knKVswXS5jaGlsZHJlbjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhZGlvX3NlbGVjdCA9PSAiaGlkZSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2tfY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja19jaGlsZHJlbltpXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXJfY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJfY2hpbGRyZW5baV0ucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJhZGlvX3NlbGVjdCA9PSAiYXNzaXN0YW50IikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnNlbGVjdF90YWIoIuaKoui0reWKqeaJiyIsICIiLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyYWRpb19zZWxlY3QgPT0gInFyY29kZSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5zZWxlY3RfdGFiKCLov5TnjrDnoIEiLCAiIiwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmFkaW9fc2VsZWN0ID09ICJ0cmVuZCIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iai5zZWxlY3RfdGFiKCLku7fmoLzotbDlir8iLCAiIiwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAkMignLnJhZGlvX3MnKS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQyKCcucmFkaW9fcycpW2ldLnZhbHVlID09IHJhZGlvX3NlbGVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCcucmFkaW9fcycpW2ldLmNoZWNrZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgJDIoJy5yYWRpb19zcycpLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJDIoJy5yYWRpb19zcycpW2ldLnZhbHVlID09IEJXbGlzdF9zZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMignLnJhZGlvX3NzJylbaV0uY2hlY2tlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiY2FyZC10YWJzLWJhciB3aWtpIilbMF0uY2hpbGRyZW5bMl0uc3R5bGUuY29sb3IgPSAnI2ZiNTQxNCc7CiAgICAgICAgICAgICAgICAgICAgICAgIG9iai5pbml0aWFsaXplUGFuaWNCdXlpbmdBc3Npc3RhbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnF1ZXJ5X3RyZW5kX2RhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vdXNlX1RPMTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gInRhb2Jhb19kZXRhaWxzX3BhZ2UiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAkMigiI3FyY29kZV9jb3Vwb24iKS5xcmNvZGUoeyB3aWR0aDogMTQwLCBoZWlnaHQ6IDE0MCwgdGV4dDogZGF0YS51cmwxLCBjb3JyZWN0TGV2ZWw6IDAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAkMigiI2J1dHRvbl9nZXRDb3Vwb24iKS5tb3VzZWVudGVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAkMignI2NvdXBvbl9mbG9hdF9xcicpLmNzcygiZGlzcGxheSIsICJpbmxpbmUtYmxvY2siKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgJDIoIiNidXR0b25fZ2V0Q291cG9uIikubW91c2VsZWF2ZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgJDIoJyNjb3Vwb25fZmxvYXRfcXInKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCAxMDApOwoKICAgICAgICAgICAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcm0gPSAnMCc7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByaWNlID0gJzAnOwogICAgICAgICAgICAgICAgICAgIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gInRhb2Jhb19kZXRhaWxzX3BhZ2UiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmljZV9zdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQyKCIudG0tcHJpY2UtcGFuZWwiKS5maW5kKCIudG0tcHJpY2UiKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJpY2Vfc3RyID0gJDIoIi50bS1wcmljZS1wYW5lbCIpLmZpbmQoIi50bS1wcmljZSIpLmh0bWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkMigiI0pfU3RyUHJpY2UiKS5maW5kKCIudGItcm1iLW51bSIpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmljZV9zdHIgPSAkMigiI0pfU3RyUHJpY2UiKS5maW5kKCIudGItcm1iLW51bSIpLmh0bWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJpY2UgPSBvYmouZ2V0X3RiX3ByaWNlKHByaWNlX3N0cik7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmljZV9wcm9tcHRfc3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkMigiLnRtLXByb21vLXByaWNlIikuZmluZCgiLnRtLXByaWNlIikubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2VfcHJvbXB0X3N0ciA9ICQyKCIudG0tcHJvbW8tcHJpY2UiKS5maW5kKCIudG0tcHJpY2UiKS5odG1sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJDIoIiNKX1Byb21vUHJpY2VOdW0iKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZV9wcm9tcHRfc3RyID0gJDIoIiNKX1Byb21vUHJpY2VOdW0iKS5odG1sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByaWNlX3Byb21wdCA9IG9iai5nZXRfdGJfcHJpY2UocHJpY2VfcHJvbXB0X3N0cik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmljZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJpY2VfcHJvbXB0ICE9IG51bGwgJiYgcHJpY2VfcHJvbXB0ICE9ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm0gPSBNYXRoLnJvdW5kKE1hdGguZmxvb3IoKHByaWNlX3Byb21wdCAtIGRhdGEuY291cG9ubW9uZXkpICogZGF0YS5yZXR1cm5fbW9uZXlfcmF0ZSAqIDEwMDApIC8gMTApIC8gMTAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChybSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm0gPSBNYXRoLnJvdW5kKE1hdGguZmxvb3IocHJpY2VfcHJvbXB0ICogZGF0YS5yZXR1cm5fbW9uZXlfcmF0ZSAqIDEwMDApIC8gMTApIC8gMTAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtID0gTWF0aC5yb3VuZChNYXRoLmZsb29yKChwcmljZSAtIGRhdGEuY291cG9ubW9uZXkpICogZGF0YS5yZXR1cm5fbW9uZXlfcmF0ZSAqIDEwMDApIC8gMTApIC8gMTAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChybSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm0gPSBNYXRoLnJvdW5kKE1hdGguZmxvb3IocHJpY2UgKiBkYXRhLnJldHVybl9tb25leV9yYXRlICogMTAwMCkgLyAxMCkgLyAxMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9iai5zaXRlX3R5cGUoKSA9PSAiamluZ2RvbmdfZGV0YWlsc19wYWdlIikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCcvL2l0ZW0uamQuY29tJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkMigiI3N1bW1hcnktcHJpY2UiKS5maW5kKCIjamQtcHJpY2UiKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2UgPSAkMigiI3N1bW1hcnktcHJpY2UiKS5maW5kKCIjamQtcHJpY2UiKS5odG1sKCkuc3BsaXQoIjwvc3Bhbj4iKVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJDIoIi5wLXByaWNlIikuZmluZCgic3BhbiIpLmVxKDEpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZSA9ICQyKCIucC1wcmljZSIpLmZpbmQoInNwYW4iKS5lcSgxKS5odG1sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZSA9ICQyKCIucC1wcmljZSIpLmZpbmQoInNwYW4iKS5lcSgxKS5odG1sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmljZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtID0gTWF0aC5yb3VuZChNYXRoLmZsb29yKChwcmljZSAtIGRhdGEuY291cG9ubW9uZXkpICogZGF0YS5yZXR1cm5fbW9uZXlfcmF0ZSAqIDEwMDApIC8gMTApIC8gMTAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJtIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtID0gTWF0aC5yb3VuZChNYXRoLmZsb29yKHByaWNlICogZGF0YS5yZXR1cm5fbW9uZXlfcmF0ZSAqIDEwMDApIC8gMTApIC8gMTAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gInZpcF9kZXRhaWxfcGFnZSIgfHwgb2JqLnNpdGVfdHlwZSgpID09ICJ2aXBfZGV0YWlsX3BhZ2VfbSIgfHwgb2JqLnNpdGVfdHlwZSgpID09ICJrYW9sYV9kZXRhaWxfcGFnZSIgfHwgb2JqLnNpdGVfdHlwZSgpID09ICJzdW5pbmdfZGV0YWlsX3BhZ2UiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkMigiI3JtX21vbmV5IikubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEucmV0dXJuX21vbmV5ID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCIjcm1fbW9uZXkiKS5odG1sKCLov5TnjrDnuqbvvJoiICsgTWF0aC5mbG9vcihkYXRhLnJldHVybl9tb25leSAqIDEwMCkgLyAxMDAgKyAi5YWDIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuY291cG9ubW9uZXkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMigiI2ZhY2VWYWx1ZSIpLmh0bWwoTWF0aC5mbG9vcihkYXRhLnJldHVybl9tb25leSAqIDEwMCkgLyAxMDAgKyAi5YWDIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCIjZmFjZVZhbHVlRXhwbGFpbiIpLmh0bWwoIjEu6Iqx5YmN55yB5LiA55yBQVBQ5omr6L+U546w56CB6Lez6L2sPGJyPjIuIiArIHNpdGVfdHlwZV9jaGluZXNlICsgIkFQUOS4i+WNlSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMigiI2NvcHlfZGl2IikuY3NzKCJkaXNwbGF5IiwgIiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMigiLnNpZ24iKS5jc3MoImRpc3BsYXkiLCAiIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCIjYV9zY2FuQ29kZUNhc2hiYWNrIikuY3NzKCJjdXJzb3IiLCAicG9pbnRlciIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMigiI2Ffc2NhbkNvZGVDYXNoYmFjayIpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCIuY2FyZC10YWJzLXN0YWNrLndpa2kiKS5jc3MoImRpc3BsYXkiLCAibm9uZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnNlbGVjdF90YWIoJ+i/lOeOsOeggScsICcnLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMigiLmNhcmQtdGFicy1zdGFjay53aWtpIikuY3NzKCJkaXNwbGF5IiwgImJsb2NrIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocm0gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSAn6L+U546w57qmOicgKyBybSArICflhYMnCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHIxID0gcm0gKyAn5YWDJwogICAgICAgICAgICAgICAgICAgICAgICAkMigiI3JtX21vbmV5IikuaHRtbChzdHIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5jb3Vwb25tb25leSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqLnNpdGVfdHlwZSgpICE9ICJqaW5nZG9uZ19kZXRhaWxzX3BhZ2UiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDIoIiNmYWNlVmFsdWUiKS5odG1sKHN0cjEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCIjZmFjZVZhbHVlRXhwbGFpbiIpLmh0bWwoIjEu6Iqx5YmN55yB5LiA55yBQVBQ5omr6L+U546w56CB6Lez6L2sPGJyPjIuIiArIHNpdGVfdHlwZV9jaGluZXNlICsgIkFQUOS4i+WNlSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCIjY29weV9kaXYiKS5jc3MoImRpc3BsYXkiLCAiIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDIoIi5zaWduIikuY3NzKCJkaXNwbGF5IiwgIiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCIjYV9zY2FuQ29kZUNhc2hiYWNrIikuY3NzKCJjdXJzb3IiLCAicG9pbnRlciIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQyKCIjYV9zY2FuQ29kZUNhc2hiYWNrIikuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMigiLmNhcmQtdGFicy1zdGFjay53aWtpIikuY3NzKCJkaXNwbGF5IiwgIm5vbmUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouc2VsZWN0X3RhYign6L+U546w56CBJywgJycsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDIoIi5jYXJkLXRhYnMtc3RhY2sud2lraSIpLmNzcygiZGlzcGxheSIsICJibG9jayIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgMzAwKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9OwoKICAgIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gInRhb2Jhb19kZXRhaWxzX3BhZ2UiKSB7CiAgICAgICAgb2JqLmdlbmVyYXRlQ291cG9uQXJlYSgpOwogICAgfSBlbHNlIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gInRhb2Jhb19sc3RfcGFnZSIpIHsKICAgICAgICBpZiAoZG9jdW1lbnQudGl0bGUuaW5kZXhPZigi5aSp54yr6LaF5biCIikgPiAwKSB7CiAgICAgICAgICAgIC8vIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIHNlbGVjdG9yTGlzdCA9IFtdOwogICAgICAgIHZhciB1cmwgPSBsb2NhdGlvbi5ocmVmOwogICAgICAgIGlmICgKICAgICAgICAgICAgdXJsLmluZGV4T2YoIi8vcy50YW9iYW8uY29tL3NlYXJjaCIpID4gMCB8fAogICAgICAgICAgICB1cmwuaW5kZXhPZigiLy9zLnRhb2Jhby5jb20vbGlzdCIpID4gMAogICAgICAgICkgewogICAgICAgICAgICBzZWxlY3Rvckxpc3QucHVzaCgiLml0ZW1zIC5pdGVtIik7CiAgICAgICAgfSBlbHNlIGlmICh1cmwuaW5kZXhPZigiLy9saXN0LnRtYWxsLmNvbS9zZWFyY2hfcHJvZHVjdC5odG0iKSA+IDApIHsKICAgICAgICAgICAgc2VsZWN0b3JMaXN0LnB1c2goIi5wcm9kdWN0Iik7CiAgICAgICAgICAgIHNlbGVjdG9yTGlzdC5wdXNoKCIuY2hhb3NoaS1yZWNvbW1lbmQtbGlzdCAuY2hhb3NoaS1yZWNvbW1lbmQtaXRlbSIpOwogICAgICAgIH0gZWxzZSBpZiAodXJsLmluZGV4T2YoIi8vbGlzdC50bWFsbC5oay9zZWFyY2hfcHJvZHVjdC5odG0iKSA+IDApIHsKICAgICAgICAgICAgc2VsZWN0b3JMaXN0LnB1c2goIiNKX0l0ZW1MaXN0IC5wcm9kdWN0Iik7CiAgICAgICAgfSBlbHNlIGlmICh1cmwuaW5kZXhPZigiLy9tYWl5YW8ubGlhbmd4aW55YW8uY29tL3Nob3Avdmlld19zaG9wIikgPiAwKSB7CiAgICAgICAgICAgIHNlbGVjdG9yTGlzdC5wdXNoKCIjSl9TaG9wU2VhcmNoUmVzdWx0IC5pdGVtIik7CiAgICAgICAgfQogICAgICAgIGlmIChzZWxlY3Rvckxpc3QgJiYgc2VsZWN0b3JMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgb2JqLmluaXRTZWFyY2hIdG1sKHNlbGVjdG9yTGlzdCk7CiAgICAgICAgICAgIG9iai5pbml0U2VhcmNoRXZlbnQoKTsKICAgICAgICAgICAgb2JqLmJhc2ljUXVlcnlfbGlzdCgpOwogICAgICAgIH0KICAgIH0gZWxzZSBpZiAob2JqLnNpdGVfdHlwZSgpID09ICJqaW5nZG9uZ19kZXRhaWxzX3BhZ2UiKSB7CiAgICAgICAgb2JqLmdlbmVyYXRlQ291cG9uQXJlYSgpOwogICAgfSBlbHNlIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gImppbmdkb25nX2xzdF9wYWdlIikgewogICAgICAgIHZhciBzZWxlY3Rvckxpc3RfamQgPSBbXTsKICAgICAgICBzZWxlY3Rvckxpc3RfamQucHVzaCgiLmdsLWl0ZW0iKTsKICAgICAgICBzZWxlY3Rvckxpc3RfamQucHVzaCgiLnNrdS1kZXRhaWwiKTsKICAgICAgICBvYmouaW5pdFNlYXJjaEh0bWwoc2VsZWN0b3JMaXN0X2pkKTsKICAgICAgICBvYmouaW5pdFNlYXJjaEV2ZW50KCk7CiAgICAgICAgb2JqLmJhc2ljUXVlcnlfbGlzdCgpOwogICAgfSBlbHNlIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gInZpcF9saXN0X3BhZ2UiKSB7CiAgICAgICAgdmFyIHNlbGVjdG9yTGlzdF92aXAgPSBbXTsKICAgICAgICBzZWxlY3Rvckxpc3RfdmlwLnB1c2goIi5jLWdvb2RzLWl0ZW0iKTsKICAgICAgICBvYmouaW5pdFNlYXJjaEh0bWwoc2VsZWN0b3JMaXN0X3ZpcCk7CiAgICAgICAgb2JqLmluaXRTZWFyY2hFdmVudCgpOwogICAgICAgIG9iai5iYXNpY1F1ZXJ5X2xpc3QoKTsKICAgIH0gZWxzZSBpZiAob2JqLnNpdGVfdHlwZSgpID09ICJ2aXBfZGV0YWlsX3BhZ2UiIHx8IG9iai5zaXRlX3R5cGUoKSA9PSAidmlwX2RldGFpbF9wYWdlX20iKSB7CiAgICAgICAgb2JqLmdlbmVyYXRlQ291cG9uQXJlYSgpOwogICAgfSBlbHNlIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gImh1YXdlaV9kZXRhaWxfcGFnZSIpIHsKICAgICAgICBvYmouZ2V0X2RhdGEoKTsKICAgIH0gZWxzZSBpZiAob2JqLnNpdGVfdHlwZSgpID09ICJzdW5pbmdfZGV0YWlsX3BhZ2UiKSB7CiAgICAgICAgLy8gb2JqLmdlbmVyYXRlQ291cG9uQXJlYSgpOwogICAgICAgIC8vZ2V0IGRhdGEKICAgICAgICBvYmouZ2V0X2RhdGEoKTsKICAgICAgICBpZiAoc3RvcCA9PSAnMScpIHsgcmV0dXJuOyB9CiAgICB9IGVsc2UgaWYgKG9iai5zaXRlX3R5cGUoKSA9PSAia2FvbGFfZGV0YWlsX3BhZ2UiKSB7CiAgICAgICAgLy8gb2JqLmdlbmVyYXRlQ291cG9uQXJlYSgpOwogICAgICAgIC8vZ2V0IGRhdGEKICAgICAgICBvYmouZ2V0X2RhdGEoKTsKICAgICAgICBpZiAoc3RvcCA9PSAnMScpIHsgcmV0dXJuOyB9CiAgICB9CgogICAgd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKCiAgICB9CgogICAgJDIoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAob2JqLnNpdGVfdHlwZSgpID09ICJqaW5nZG9uZ19kZXRhaWxzX3BhZ2UiKSB7CiAgICAgICAgICAgIC8v5YWI5Zyo6aG16Z2i5pyA5LiL6Z2i5re75Yqg5LiA5Liq5b+r6YCf5LiL5Y2V5oyJ6ZKuCiAgICAgICAgICAgIHZhciBnb29kc0lkID0gbG9jYXRpb24uaHJlZi5zcGxpdCgiLy8iKVsxXS5zcGxpdCgiLyIpWzFdLnNwbGl0KCIuIilbMF07CiAgICAgICAgICAgIHZhciBwcmVfamRfaHRtbCA9CiAgICAgICAgICAgICAgICAnPGEgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIGhyZWY9Imh0dHBzOi8vcGxvZ2luLm0uamQuY29tL2xvZ2luL2xvZ2luP3JldHVybnVybD0nICsgZW5jb2RlVVJJKGxvY2F0aW9uLmhyZWYpICsgJyIgaWQ9Im1qZExvZ2luIj7nmbvpmYY8L2E+JyArCiAgICAgICAgICAgICAgICAnPGEgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIGhyZWY9Imh0dHBzOi8vd3FzLmpkLmNvbS9vcmRlci9zX2NvbmZpcm1fbWlhby5zaHRtbD9zY2VuZXZhbD0yJnNjZW5lPWpkJmlzQ2FuRWRpdD0xJmNvbW1saXN0PSwsMSwnICsgZ29vZHNJZCArICciIGlkPSJtamRDaGFubmVsIiBzdHlsZT0iZGlzcGxheToiPuW8gOWni+aKoui0rTwvYT4nOwogICAgICAgICAgICAkMignYm9keScpLmFwcGVuZChwcmVfamRfaHRtbCk7CiAgICAgICAgfQogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBpZiAob2JqLnNpdGVfdHlwZSgpID09ICJrYW9sYV9kZXRhaWxfcGFnZSIpIHsKICAgICAgICAgICAgICAgIG9iai5nZW5lcmF0ZUNvdXBvbkFyZWEoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gInN1bmluZ19kZXRhaWxfcGFnZSIpIHsKICAgICAgICAgICAgICAgIG9iai5nZW5lcmF0ZUNvdXBvbkFyZWEoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIDMwMCk7CgoKICAgICAgICB2YXIga2V5c0FjdGl2ZVRoaXNQYWdlID0gW107CiAgICAgICAgdmFyIGFycmF5X3Rhc2sgPSBvYmouZ2V0T2JqS2V5cyh2X2Nvb2tpZSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheV90YXNrLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChhcnJheV90YXNrW2ldID09ICdtamRMb2dpbicpIGNvbnRpbnVlOwogICAgICAgICAgICBjb25zb2xlLmxvZygn4pa95pa55qGI6L+H5pyf5oOF5Ya14pa9Jyk7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKGFycmF5X3Rhc2tbaV0gKyAnXG4nICsgb2JqLmp1ZGdtZW50VmlydHVhbENvb2tpZShhcnJheV90YXNrW2ldKSk7CiAgICAgICAgICAgIGlmIChvYmpfcGxhbnNbYXJyYXlfdGFza1tpXV0gPT0gbnVsbCB8fCBvYmpfcGxhbnNbYXJyYXlfdGFza1tpXV0gPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvYmouZGVsVmlydHVhbENvb2tpZShhcnJheV90YXNrW2ldKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoYXJyYXlfdGFza1tpXS5pbmRleE9mKCdwbGFuXycpID4gLTEgJiYgdl9jb29raWVbYXJyYXlfdGFza1tpXV1bJ2FjdGl2ZSddID09ICcxJyAmJiBvYmouanVkZ21lbnRWaXJ0dWFsQ29va2llKGFycmF5X3Rhc2tbaV0pKSB7CiAgICAgICAgICAgICAgICB2YXIgb2JqUGxhbl90bXAgPSBvYmpfcGxhbnNbYXJyYXlfdGFza1tpXV1bJ2tleXMnXTsKICAgICAgICAgICAgICAgIHZhciBob3N0X2FycmF5ID0gb2JqLmdldE9iaktleXMob2JqUGxhbl90bXApOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJDIuaW5BcnJheShsb2NhdGlvbi5ob3N0LCBob3N0X2FycmF5KSA+IC0xKTsKICAgICAgICAgICAgICAgIGlmICgkMi5pbkFycmF5KGxvY2F0aW9uLmhvc3QsIGhvc3RfYXJyYXkpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICBrZXlzQWN0aXZlVGhpc1BhZ2UgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9ial9wbGFuc1thcnJheV90YXNrW2ldXVsna2V5cyddW2xvY2F0aW9uLmhvc3RdKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc29sZS5sb2coJ+KWvWtleXNBY3RpdmVUaGlzUGFnZeKWvScpOwogICAgICAgIGNvbnNvbGUubG9nKGtleXNBY3RpdmVUaGlzUGFnZSk7CgogICAgICAgIGlmIChrZXlzQWN0aXZlVGhpc1BhZ2UgIT0gdW5kZWZpbmVkICYmIGtleXNBY3RpdmVUaGlzUGFnZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIG9iai5hZGRDbGlja1Rhc2soa2V5c0FjdGl2ZVRoaXNQYWdlKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9iai5zaXRlX3R5cGUoKSAhPSAiamluZ2RvbmdfZGV0YWlsc19wYWdlIiAmJgogICAgICAgICAgICBvYmouc2l0ZV90eXBlKCkgIT0gInRhb2Jhb19kZXRhaWxzX3BhZ2UiICYmCiAgICAgICAgICAgIG9iai5zaXRlX3R5cGUoKSAhPSAia2FvbGFfZGV0YWlsX3BhZ2UiICYmCiAgICAgICAgICAgIG9iai5zaXRlX3R5cGUoKSAhPSAidmlwX2RldGFpbF9wYWdlIiAmJgogICAgICAgICAgICBvYmouc2l0ZV90eXBlKCkgIT0gInN1bmluZ19kZXRhaWxfcGFnZSIgJiYKICAgICAgICAgICAgbG9jYXRpb24uaG9zdCAhPSAiYmJzLnlvdXlpemhpbmVuZy50b3AiCiAgICAgICAgKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKEJXbGlzdF9zZWwpOwogICAgICAgICAgICB2YXIgcGFzc1VybF9hcnJ5ID0gcGFzc1VybC5zcGxpdCgiXG4iKTsKICAgICAgICAgICAgdmFyIHBsYW5zX2FycnkgPSBvYmouZ2V0T2JqS2V5cyhvYmpfcGxhbnMpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYW5zX2FycnkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBob3N0X2FycnkgPSBvYmouZ2V0T2JqS2V5cyhvYmpfcGxhbnNbcGxhbnNfYXJyeVtpXV1bJ2tleXMnXSk7CiAgICAgICAgICAgICAgICBwYXNzVXJsX2FycnkgPSBwYXNzVXJsX2FycnkuY29uY2F0KGhvc3RfYXJyeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFzc1VybCA9IG9iai51bmlxdWVBcnIocGFzc1VybF9hcnJ5KS5qb2luKCJcbiIpOwoKICAgICAgICAgICAgaWYgKEJXbGlzdF9zZWwgPT0gImJsYWNrX21vZGUiKSB7CiAgICAgICAgICAgICAgICB2YXIgYmxvY2tVcmxfYXJyeSA9IGJsb2NrVXJsLnNwbGl0KCJcbiIpOwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coYmxvY2tVcmxfYXJyeSk7CiAgICAgICAgICAgICAgICBpZiAoIShibG9ja1VybF9hcnJ5Lmxlbmd0aCA+IDAgJiYgJDIuaW5BcnJheShsb2NhdGlvbi5ob3N0LCBibG9ja1VybF9hcnJ5KSA+IC0xKSkgewogICAgICAgICAgICAgICAgICAgIC8v5Y2V54us5Yqg6L295oqi6LSt5Yqp5omLCiAgICAgICAgICAgICAgICAgICAgcGFnZV90eXBlID0gJ290aGVyX3BhZ2UnOwogICAgICAgICAgICAgICAgICAgICQyKCdib2R5JykuYXBwZW5kKG9iai5nZXRBc3Npc3RhbnRIdG1sKCkpOwogICAgICAgICAgICAgICAgICAgICQyKCcjZmxvYXRfYXNzaXN0YW50JykuYXBwZW5kKCc8aW1nIGlkPSJzbWFsbEljb24iIHNyYz0iaHR0cHM6Ly9zMy5heDF4LmNvbS8yMDIwLzEyLzE1L3JLUUNvZC5wbmciIHN0eWxlPSJkaXNwbGF5OmJsb2NrO3dpZHRoOjIycHg7aGVpZ2h0OjIycHgiPicpCiAgICAgICAgICAgICAgICAgICAgJDIoJy50YWJzaG9sZGVyMicpLmNhcmRUYWJzKHsgdGhlbWU6ICd3aWtpJyB9KTsKICAgICAgICAgICAgICAgICAgICAkMignI2Zsb2F0X2Fzc2lzdGFudCcpWzBdLmNoaWxkcmVuWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScKICAgICAgICAgICAgICAgICAgICAkMignI2Zsb2F0X2Fzc2lzdGFudCcpWzBdLnN0eWxlLmJvcmRlclJhZGl1cyA9ICI5OTlweCI7CiAgICAgICAgICAgICAgICAgICAgb2JqLmluaXRpYWxpemVQYW5pY0J1eWluZ0Fzc2lzdGFudCgnb3RoZXJfcGFnZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCQyLmluQXJyYXkobG9jYXRpb24uaG9zdCwgcGFzc1VybF9hcnJ5KSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgLy/ljZXni6zliqDovb3miqLotK3liqnmiYsKICAgICAgICAgICAgICAgICAgICBwYWdlX3R5cGUgPSAnb3RoZXJfcGFnZSc7CiAgICAgICAgICAgICAgICAgICAgJDIoJ2JvZHknKS5hcHBlbmQob2JqLmdldEFzc2lzdGFudEh0bWwoKSk7CiAgICAgICAgICAgICAgICAgICAgJDIoJyNmbG9hdF9hc3Npc3RhbnQnKS5hcHBlbmQoJzxpbWcgaWQ9InNtYWxsSWNvbiIgc3JjPSJodHRwczovL3MzLmF4MXguY29tLzIwMjAvMTIvMTUvcktRQ29kLnBuZyIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7d2lkdGg6MjJweDtoZWlnaHQ6MjJweCI+JykKICAgICAgICAgICAgICAgICAgICAkMignLnRhYnNob2xkZXIyJykuY2FyZFRhYnMoeyB0aGVtZTogJ3dpa2knIH0pOwogICAgICAgICAgICAgICAgICAgICQyKCcjZmxvYXRfYXNzaXN0YW50JylbMF0uY2hpbGRyZW5bMF0uc3R5bGUuZGlzcGxheSA9ICdub25lJwogICAgICAgICAgICAgICAgICAgICQyKCcjZmxvYXRfYXNzaXN0YW50JylbMF0uc3R5bGUuYm9yZGVyUmFkaXVzID0gIjk5OXB4IjsKICAgICAgICAgICAgICAgICAgICBvYmouaW5pdGlhbGl6ZVBhbmljQnV5aW5nQXNzaXN0YW50KCdvdGhlcl9wYWdlJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvL+mBjeWOhuaWueahiCzmiormlrnmoYjkuK3nmoTln5/lkI3mt7vliqDov5vlhaXnmb3lkI3ljZUKICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHBhc3NVcmwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICQyKCcucmFkaW9fc3MnKS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKCQyKCcucmFkaW9fc3MnKVtpXS52YWx1ZSA9PSBCV2xpc3Rfc2VsKSB7CiAgICAgICAgICAgICAgICAgICAgJDIoJy5yYWRpb19zcycpW2ldLmNoZWNrZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy/pppbmrKHlronoo4Xmj5DphpIKICAgICAgICAgICAgdmFyIGZpcnN0X2luc3RhbGwgPSBHTV9nZXRWYWx1ZSgnZmlyc3RfaW5zdGFsbCcsICcxJyk7CiAgICAgICAgICAgIGlmIChmaXJzdF9pbnN0YWxsID09ICcxJykgewogICAgICAgICAgICAgICAgb2JqLnN3YWxfaW5mbygi5rip6aao5o+Q6YaSIiwgIuWwiuaVrOeahOecgeS4gOecgVRhbXBlcm1vbmtleeaPkuS7tueUqOaIt++8jOaCqOWlve+8mlxuXG7mhJ/osKLmgqjkuIDnm7Tku6XmnaXnmoTpmarkvLTvvIzluIzmnJvmnKzmj5Lku7blj4pBUFDnu5nmgqjnmoTotK3nianluKbmnaXkvr/liKnjgILmnKzmrKHmj5Lku7bov47mnaXph43lpKfljYfnuqc6XG5cbjEuIOaWsOWinuaKoui0reWKqeaJi++8jOaWueS+v+aCqOi/m+ihjOaVtOeCueenkuadgOetieaKoui0reaTjeS9nFxuMi4g5oqi6LSt5pa55qGI5Y+v5Lul6Ieq6KGM5Yi25a6a77yM55CG6K665LiK5Lu75L2V572R56uZ5oqi5Lu75L2V5Lic6KW/6YO95Y+v5Lul5L2/55SoXG4zLiDmiqLotK3mlrnmoYjmlK/mjIHliIbkuqvlj4rlr7zlhaXvvIzlubborr7nq4vkuoborrrlnZvmlrnkvr/lpKflrrbliIbkuqvlj4rkuqTmtYHlj43ppohcbjQuIOagueaNrueUqOaIt+eahOWPjemmiO+8jOWvuemhtemdoui/m+ihjOS6huaUueeJiO+8jOabtOiKguecgeepuumXtOWQjOaXtuWPr+WxleekuuWGheWuueabtOS4sOWvjO+8jOWPr+S7peiuvue9ruaYr+WQpum7mOiupOWxleekuuKAnOi/lOeOsOeggeKAne+8jOKAnOS7t+agvOi1sOWKv+KAneetieWKn+iDvVxuXG7mnKzmtojmga/ku4XlnKjpppbmrKHlh7rnjrDvvIzmhJ/osKLmgqjnmoTmlK/mjIHvvIzov5nmmK/miJHku6zlm6LpmJ/liY3ov5vnmoTmnIDlpKfliqjlipsiLCAi5oiR55+l6YGT5ZWmIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHN3YWwoIumFjee9ruWujOavleivt+WwveaDheS9v+eUqH4iLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICJzdWNjZXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uczogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyOiAxMjAwLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIG9iai5zZWxlY3RfdGFiKCLmiqLotK3liqnmiYsiLCAiIiwgMSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByZVBsYW5fc3RyMSA9ICd7InBsYW5fcHJlU2V0X2pkanMiOnsicGxhbl9uYW1lIjoi6aKE572u77ya5Lqs5Lic5p6B6YCf56eS5p2AdjEuMCIsInBsYW5faW5mbyI6IuS6rOS4nOaegemAn+enkuadgOaWueahiCIsInBsYW5fdHlwZSI6IjEiLCJqZF9zcGlrZSI6IjEiLCJwbGFuX2F0dHJpYnV0ZXMxIjoiIiwicGxhbl9hdHRyaWJ1dGVzMiI6IiIsInBsYW5fYXR0cmlidXRlczMiOiIiLCJpc2ZpbmlzaCI6IjEiLCJrZXlzIjp7IndxLmpkLmNvbSI6W3sia2V5X25hbWUiOiLlnKjnur/mlK/ku5giLCJwcmVzc19udW0iOiIyIiwicHJlc3NfaW50ZXJ2YWwiOiIyMDAiLCJjc3NfcGF0aCI6ImRpdiNwYXlCdG5MaXN0ID4gZGl2Om50aC1vZi10eXBlKDEwKSA+IGEifV0sInBheS5tLmpkLmNvbSI6W3sia2V5X25hbWUiOiLmiZPnmb3mnaHmlK/ku5giLCJwcmVzc19udW0iOiIyIiwicHJlc3NfaW50ZXJ2YWwiOiIyMDAiLCJjc3NfcGF0aCI6ImEuYnRuLnBheS1uZXh0LmNvbmZpcm0tcGF5In1dLCJpdGVtLmpkLmNvbSI6W3sia2V5X25hbWUiOiLlvIDlp4vmiqLotK0iLCJwcmVzc19udW0iOiIxIiwicHJlc3NfaW50ZXJ2YWwiOiIyMDAiLCJjc3NfcGF0aCI6ImEjbWpkQ2hhbm5lbCJ9XX19fSc7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByZVBsYW5fc3RyMiA9ICd7InBsYW5fcHJlU2V0X2pka3MiOnsicGxhbl9uYW1lIjoi6aKE572u77ya5Lqs5Lic5b+r6YCf5LiL5Y2VdjEuMCIsInBsYW5faW5mbyI6IjEu5Yqg5YWl6LSt54mp6L2mIDIu5Y676LSt54mp6L2m57uT566XIDMu5o+Q5Lqk6K6i5Y2VICIsInBsYW5fdHlwZSI6IjEiLCJqZF9zcGlrZSI6IjAiLCJwbGFuX2F0dHJpYnV0ZXMxIjoiIiwicGxhbl9hdHRyaWJ1dGVzMiI6IiIsInBsYW5fYXR0cmlidXRlczMiOiIiLCJpc2ZpbmlzaCI6IjEiLCJrZXlzIjp7Iml0ZW0uamQuY29tIjpbeyJrZXlfbmFtZSI6IuWKoOWFpei0reeJqei9piIsInByZXNzX251bSI6IjEiLCJwcmVzc19pbnRlcnZhbCI6IjAiLCJjc3NfcGF0aCI6ImEjSW5pdENhcnRVcmwifV0sImNhcnQuamQuY29tIjpbeyJrZXlfbmFtZSI6IuWOu+i0reeJqei9pue7k+eulyIsInByZXNzX251bSI6IjIiLCJwcmVzc19pbnRlcnZhbCI6IjIwMCIsImNzc19wYXRoIjoiYSNHb3RvU2hvcHBpbmdDYXJ0In0seyJrZXlfbmFtZSI6IuWOu+e7k+eulyIsInByZXNzX251bSI6IjIiLCJwcmVzc19pbnRlcnZhbCI6IjIwMCIsImNzc19wYXRoIjoiYS5jb21tb24tc3VibWl0LWJ0biJ9XSwicGF5LmpkLmNvbSI6W3sia2V5X25hbWUiOiLnq4vljbPmlK/ku5giLCJwcmVzc19udW0iOiI1MCIsInByZXNzX2ludGVydmFsIjoiMjAwIiwiY3NzX3BhdGgiOiJkaXYuYmFzZS1idXR0b24ucG9pbnRlci1nIn1dLCJ0cmFkZS5qZC5jb20iOlt7ImtleV9uYW1lIjoi5o+Q5Lqk6K6i5Y2VIiwicHJlc3NfbnVtIjoiNSIsInByZXNzX2ludGVydmFsIjoiMzAwIiwiY3NzX3BhdGgiOiJidXR0b24jb3JkZXItc3VibWl0In1dfX19JzsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJlUGxhbl9zdHIzID0gJ3sicGxhbl9wcmVTZXRfdGJrcyI6eyJwbGFuX25hbWUiOiLpooTnva7vvJrmt5jlrp3jgIHlpKnnjKvlv6vpgJ/kuIvljZV2MS4wIiwicGxhbl9pbmZvIjoi56uL5Y2z6LSt5LmwLT7mj5DkuqTorqLljZUtPuacgOe7iOS7mOasviIsInBsYW5fdHlwZSI6IjEiLCJqZF9zcGlrZSI6IjAiLCJwbGFuX2F0dHJpYnV0ZXMxIjoiIiwicGxhbl9hdHRyaWJ1dGVzMiI6IiIsInBsYW5fYXR0cmlidXRlczMiOiIiLCJpc2ZpbmlzaCI6IjEiLCJrZXlzIjp7ImJ1eS50bWFsbC5jb20iOlt7ImtleV9uYW1lIjoi5o+Q5Lqk6K6i5Y2VIiwicHJlc3NfbnVtIjoiMSIsInByZXNzX2ludGVydmFsIjoiMjAwIiwiY3NzX3BhdGgiOiJhLmdvLWJ0biJ9XSwiY2FzaGllcmdhbi5hbGlwYXkuY29tIjpbeyJrZXlfbmFtZSI6IuehruiupOS7mOasviIsInByZXNzX251bSI6IjUwIiwicHJlc3NfaW50ZXJ2YWwiOiIyMDAiLCJjc3NfcGF0aCI6ImlucHV0I0pfYXV0aFN1Ym1pdCJ9XSwiZGV0YWlsLnRtYWxsLmNvbSI6W3sia2V5X25hbWUiOiLnq4vljbPotK3kubAiLCJwcmVzc19udW0iOiIxIiwicHJlc3NfaW50ZXJ2YWwiOiIwIiwiY3NzX3BhdGgiOiJhI0pfTGlua0J1eSJ9XSwiYnV5LnRhb2Jhby5jb20iOlt7ImtleV9uYW1lIjoi5o+Q5Lqk6K6i5Y2VIiwicHJlc3NfbnVtIjoiMSIsInByZXNzX2ludGVydmFsIjoiMjAwIiwiY3NzX3BhdGgiOiJhLmdvLWJ0biJ9XSwiaXRlbS50YW9iYW8uY29tIjpbeyJrZXlfbmFtZSI6Iueri+WNs+i0reS5sCIsInByZXNzX251bSI6IjEiLCJwcmVzc19pbnRlcnZhbCI6IjAiLCJjc3NfcGF0aCI6ImEuSl9MaW5rQnV5In1dfX19JzsKICAgICAgICAgICAgICAgICAgICBvYmouYWRkUGxhbihwcmVQbGFuX3N0cjEpOwogICAgICAgICAgICAgICAgICAgIG9iai5hZGRQbGFuKHByZVBsYW5fc3RyMik7CiAgICAgICAgICAgICAgICAgICAgb2JqLmFkZFBsYW4ocHJlUGxhbl9zdHIzKTsKICAgICAgICAgICAgICAgICAgICAvL+e7keWumuaWueahiAogICAgICAgICAgICAgICAgICAgIHZhciBwbGFuc3MgPSBHTV9nZXRWYWx1ZSgib2JqX3BsYW5zIik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9ial9wbGFuc3MgPSBKU09OLnBhcnNlKHBsYW5zcyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFycnlQbGFuSWQgPSBvYmouZ2V0T2JqS2V5cyhvYmpfcGxhbnNzKTsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0X3BsYW5zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhbmljQnV5aW5nUGxhbicpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyeVBsYW5JZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqX3BsYW5zc1thcnJ5UGxhbklkW2ldXVsnaXNmaW5pc2gnXSA9PSAnMCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld19vcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29wdGlvbi52YWx1ZSA9IGFycnlQbGFuSWRbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19vcHRpb24uaW5uZXJUZXh0ID0gb2JqX3BsYW5zc1thcnJ5UGxhbklkW2ldXVsncGxhbl9uYW1lJ107CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdF9wbGFucy5hcHBlbmRDaGlsZChuZXdfb3B0aW9uKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ2ZpcnN0X2luc3RhbGwnLCAnMCcpOwogICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdsYXN0X3ZlcicsIHZlcnNpb24pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgbGFzdF92ZXIgPSBHTV9nZXRWYWx1ZSgnbGFzdF92ZXInLCAnJyk7CiAgICAgICAgICAgICAgICBpZiAobGFzdF92ZXIgPT0gJycgfHwgbGFzdF92ZXIgPCB2ZXJzaW9uKSB7CiAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoJ0JXbGlzdF9zZWwnLCAnd2hpdGVfbW9kZScpOwogICAgICAgICAgICAgICAgICAgIG9iai5zd2FsX2luZm8obnVsbCwgIuaPkuS7tuabtOaWsOaIkOWKn++8jOacrOasoeabtOaWsFxuXG4xLuaWsOWinuiLj+WugeaYk+i0rei/lOeOsOeggeaYvuekuuOAglxuMi4g6buY6K6k5oKs5rWu55CD5bGP6JS95qih5byP5Li655m95ZCN5Y2V5qih5byPIiwgIuehruWumiIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZVBsYW5fc3RyMSA9ICd7InBsYW5fcHJlU2V0X2pkanMiOnsicGxhbl9uYW1lIjoi6aKE572u77ya5Lqs5Lic5p6B6YCf56eS5p2AdjEuMCIsInBsYW5faW5mbyI6IuS6rOS4nOaegemAn+enkuadgOaWueahiCIsInBsYW5fdHlwZSI6IjEiLCJqZF9zcGlrZSI6IjEiLCJwbGFuX2F0dHJpYnV0ZXMxIjoiIiwicGxhbl9hdHRyaWJ1dGVzMiI6IiIsInBsYW5fYXR0cmlidXRlczMiOiIiLCJpc2ZpbmlzaCI6IjEiLCJrZXlzIjp7IndxLmpkLmNvbSI6W3sia2V5X25hbWUiOiLlnKjnur/mlK/ku5giLCJwcmVzc19udW0iOiIyIiwicHJlc3NfaW50ZXJ2YWwiOiIyMDAiLCJjc3NfcGF0aCI6ImRpdiNwYXlCdG5MaXN0ID4gZGl2Om50aC1vZi10eXBlKDEwKSA+IGEifV0sInBheS5tLmpkLmNvbSI6W3sia2V5X25hbWUiOiLmiZPnmb3mnaHmlK/ku5giLCJwcmVzc19udW0iOiIyIiwicHJlc3NfaW50ZXJ2YWwiOiIyMDAiLCJjc3NfcGF0aCI6ImEuYnRuLnBheS1uZXh0LmNvbmZpcm0tcGF5In1dLCJpdGVtLmpkLmNvbSI6W3sia2V5X25hbWUiOiLlvIDlp4vmiqLotK0iLCJwcmVzc19udW0iOiIxIiwicHJlc3NfaW50ZXJ2YWwiOiIyMDAiLCJjc3NfcGF0aCI6ImEjbWpkQ2hhbm5lbCJ9XX19fSc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmVQbGFuX3N0cjIgPSAneyJwbGFuX3ByZVNldF9qZGtzIjp7InBsYW5fbmFtZSI6IumihOe9ru+8muS6rOS4nOW/q+mAn+S4i+WNlXYxLjAiLCJwbGFuX2luZm8iOiIxLuWKoOWFpei0reeJqei9piAyLuWOu+i0reeJqei9pue7k+eulyAzLuaPkOS6pOiuouWNlSAiLCJwbGFuX3R5cGUiOiIxIiwiamRfc3Bpa2UiOiIwIiwicGxhbl9hdHRyaWJ1dGVzMSI6IiIsInBsYW5fYXR0cmlidXRlczIiOiIiLCJwbGFuX2F0dHJpYnV0ZXMzIjoiIiwiaXNmaW5pc2giOiIxIiwia2V5cyI6eyJpdGVtLmpkLmNvbSI6W3sia2V5X25hbWUiOiLliqDlhaXotK3nianovaYiLCJwcmVzc19udW0iOiIxIiwicHJlc3NfaW50ZXJ2YWwiOiIwIiwiY3NzX3BhdGgiOiJhI0luaXRDYXJ0VXJsIn1dLCJjYXJ0LmpkLmNvbSI6W3sia2V5X25hbWUiOiLljrvotK3nianovabnu5PnrpciLCJwcmVzc19udW0iOiIyIiwicHJlc3NfaW50ZXJ2YWwiOiIyMDAiLCJjc3NfcGF0aCI6ImEjR290b1Nob3BwaW5nQ2FydCJ9LHsia2V5X25hbWUiOiLljrvnu5PnrpciLCJwcmVzc19udW0iOiIyIiwicHJlc3NfaW50ZXJ2YWwiOiIyMDAiLCJjc3NfcGF0aCI6ImEuY29tbW9uLXN1Ym1pdC1idG4ifV0sInBheS5qZC5jb20iOlt7ImtleV9uYW1lIjoi56uL5Y2z5pSv5LuYIiwicHJlc3NfbnVtIjoiNTAiLCJwcmVzc19pbnRlcnZhbCI6IjIwMCIsImNzc19wYXRoIjoiZGl2LmJhc2UtYnV0dG9uLnBvaW50ZXItZyJ9XSwidHJhZGUuamQuY29tIjpbeyJrZXlfbmFtZSI6IuaPkOS6pOiuouWNlSIsInByZXNzX251bSI6IjUiLCJwcmVzc19pbnRlcnZhbCI6IjMwMCIsImNzc19wYXRoIjoiYnV0dG9uI29yZGVyLXN1Ym1pdCJ9XX19fSc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmVQbGFuX3N0cjMgPSAneyJwbGFuX3ByZVNldF90YmtzIjp7InBsYW5fbmFtZSI6IumihOe9ru+8mua3mOWuneOAgeWkqeeMq+W/q+mAn+S4i+WNlXYxLjAiLCJwbGFuX2luZm8iOiLnq4vljbPotK3kubAtPuaPkOS6pOiuouWNlS0+5pyA57uI5LuY5qy+IiwicGxhbl90eXBlIjoiMSIsImpkX3NwaWtlIjoiMCIsInBsYW5fYXR0cmlidXRlczEiOiIiLCJwbGFuX2F0dHJpYnV0ZXMyIjoiIiwicGxhbl9hdHRyaWJ1dGVzMyI6IiIsImlzZmluaXNoIjoiMSIsImtleXMiOnsiYnV5LnRtYWxsLmNvbSI6W3sia2V5X25hbWUiOiLmj5DkuqTorqLljZUiLCJwcmVzc19udW0iOiIxIiwicHJlc3NfaW50ZXJ2YWwiOiIyMDAiLCJjc3NfcGF0aCI6ImEuZ28tYnRuIn1dLCJjYXNoaWVyZ2FuLmFsaXBheS5jb20iOlt7ImtleV9uYW1lIjoi56Gu6K6k5LuY5qy+IiwicHJlc3NfbnVtIjoiNTAiLCJwcmVzc19pbnRlcnZhbCI6IjIwMCIsImNzc19wYXRoIjoiaW5wdXQjSl9hdXRoU3VibWl0In1dLCJkZXRhaWwudG1hbGwuY29tIjpbeyJrZXlfbmFtZSI6Iueri+WNs+i0reS5sCIsInByZXNzX251bSI6IjEiLCJwcmVzc19pbnRlcnZhbCI6IjAiLCJjc3NfcGF0aCI6ImEjSl9MaW5rQnV5In1dLCJidXkudGFvYmFvLmNvbSI6W3sia2V5X25hbWUiOiLmj5DkuqTorqLljZUiLCJwcmVzc19udW0iOiIxIiwicHJlc3NfaW50ZXJ2YWwiOiIyMDAiLCJjc3NfcGF0aCI6ImEuZ28tYnRuIn1dLCJpdGVtLnRhb2Jhby5jb20iOlt7ImtleV9uYW1lIjoi56uL5Y2z6LSt5LmwIiwicHJlc3NfbnVtIjoiMSIsInByZXNzX2ludGVydmFsIjoiMCIsImNzc19wYXRoIjoiYS5KX0xpbmtCdXkifV19fX0nOwogICAgICAgICAgICAgICAgICAgICAgICBvYmouYWRkUGxhbihwcmVQbGFuX3N0cjEpOwogICAgICAgICAgICAgICAgICAgICAgICBvYmouYWRkUGxhbihwcmVQbGFuX3N0cjIpOwogICAgICAgICAgICAgICAgICAgICAgICBvYmouYWRkUGxhbihwcmVQbGFuX3N0cjMpOwogICAgICAgICAgICAgICAgICAgICAgICAvL+e7keWumuaWueahiAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGxhbnNzID0gR01fZ2V0VmFsdWUoIm9ial9wbGFucyIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqX3BsYW5zcyA9IEpTT04ucGFyc2UocGxhbnNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFycnlQbGFuSWQgPSBvYmouZ2V0T2JqS2V5cyhvYmpfcGxhbnNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdF9wbGFucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYW5pY0J1eWluZ1BsYW4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJ5UGxhbklkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqX3BsYW5zc1thcnJ5UGxhbklkW2ldXVsnaXNmaW5pc2gnXSA9PSAnMCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3X29wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X29wdGlvbi52YWx1ZSA9IGFycnlQbGFuSWRbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfb3B0aW9uLmlubmVyVGV4dCA9IG9ial9wbGFuc3NbYXJyeVBsYW5JZFtpXV1bJ3BsYW5fbmFtZSddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0X3BsYW5zLmFwcGVuZENoaWxkKG5ld19vcHRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCdsYXN0X3ZlcicsIHZlcnNpb24pOwogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChvYmouc2l0ZV90eXBlKCkgPT0gImthb2xhX2xpc3RfcGFnZSIpIHsKICAgICAgICAgICAgdmFyIHNlbGVjdG9yTGlzdF9rYW9sYSA9IFtdOwogICAgICAgICAgICBzZWxlY3Rvckxpc3Rfa2FvbGEucHVzaCgiLmdvb2RzLmNvbG9yc2t1Iik7CiAgICAgICAgICAgIG9iai5pbml0U2VhcmNoSHRtbChzZWxlY3Rvckxpc3Rfa2FvbGEpOwogICAgICAgICAgICBvYmouaW5pdFNlYXJjaEV2ZW50KCk7CiAgICAgICAgICAgIG9iai5iYXNpY1F1ZXJ5X2xpc3QoKTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyB3aW5kb3cub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgJDIod2luZG93KS5sb2FkKGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAobG9jYXRpb24uaG9zdCA9PSAiYmJzLnlvdXlpemhpbmVuZy50b3AiKSB7CiAgICAgICAgICAgIC8v5Y2V54us5Yqg6L295oqi6LSt5Yqp5omLCiAgICAgICAgICAgIHBhZ2VfdHlwZSA9ICdvdGhlcl9wYWdlJzsKICAgICAgICAgICAgJDIoJ2JvZHknKS5hcHBlbmQob2JqLmdldEFzc2lzdGFudEh0bWwoKSk7CiAgICAgICAgICAgICQyKCcjZmxvYXRfYXNzaXN0YW50JykuYXBwZW5kKCc8aW1nIGlkPSJzbWFsbEljb24iIHNyYz0iaHR0cHM6Ly9zMy5heDF4LmNvbS8yMDIwLzEyLzE1L3JLUUNvZC5wbmciIHN0eWxlPSJkaXNwbGF5OmJsb2NrO3dpZHRoOjIycHg7aGVpZ2h0OjIycHgiPicpCiAgICAgICAgICAgICQyKCcudGFic2hvbGRlcjInKS5jYXJkVGFicyh7IHRoZW1lOiAnd2lraScgfSk7CiAgICAgICAgICAgICQyKCcjZmxvYXRfYXNzaXN0YW50JylbMF0uY2hpbGRyZW5bMF0uc3R5bGUuZGlzcGxheSA9ICdub25lJwogICAgICAgICAgICAkMignI2Zsb2F0X2Fzc2lzdGFudCcpWzBdLnN0eWxlLmJvcmRlclJhZGl1cyA9ICI5OTlweCI7CiAgICAgICAgICAgIG9iai5pbml0aWFsaXplUGFuaWNCdXlpbmdBc3Npc3RhbnQoJ290aGVyX3BhZ2UnKTsKCiAgICAgICAgICAgIHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgICAgIHZhciBhcnJheV90b3BpY3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdsYW5ndWFnZS1qc29uIGhsanMnKTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlfdG9waWNzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5X3RvcGljc1tpXS5oYXNBdHRyaWJ1dGUoJ3BsdWdpbicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld19kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2Rpdi5zdHlsZS50ZXh0QWxpZ24gPSAnbGVmdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0b24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2J1dHRvbi5jbGFzc05hbWUgPSAnIFNwbGl0RHJvcGRvd24tYnV0dG9uIEJ1dHRvbiBCdXR0b24tLXByaW1hcnkgaGFzSWNvbic7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19idXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNmZmNjMDAnOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfYnV0dG9uLnN0eWxlLmNvbG9yID0gJyMwMDAwMDAnOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfYnV0dG9uLmlubmVySFRNTCA9ICflr7zlhaXmlrnmoYjliLDlsI/liqnmiYsnOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfYnV0dG9uLnNldEF0dHJpYnV0ZSgnbmFtZScsICd5aCcpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfYnV0dG9uLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGxhbl9zdHIgPSB0aGlzLnBhcmVudE5vZGUucHJldmlvdXNTaWJsaW5nLnF1ZXJ5U2VsZWN0b3IoJ2NvZGUnKS5pbm5lclRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmouaW1wb3J0UGxhbignYmJzJywgcGxhbl9zdHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdfYnV0dG9uX2NvcHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXRvbicpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfYnV0dG9uX2NvcHkuY2xhc3NOYW1lID0gJyBTcGxpdERyb3Bkb3duLWJ1dHRvbiBCdXR0b24gQnV0dG9uLS1wcmltYXJ5IGhhc0ljb24nOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfYnV0dG9uX2NvcHkuaW5uZXJIVE1MID0gJ+WkjeWItic7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19idXR0b25fY29weS5zdHlsZS5mbG9hdCA9ICdyaWdodCc7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19idXR0b25fY29weS5vbmNsaWNrID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBsYW5fc3RyID0gdGhpcy5wYXJlbnROb2RlLnByZXZpb3VzU2libGluZy5xdWVyeVNlbGVjdG9yKCdjb2RlJykuaW5uZXJUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKHBsYW5fc3RyLCAndGV4dCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqLnN3YWxfZmFkZUF3YXkoIuWkjeWItuaIkOWKnyIsIDEyMDApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19kaXYuYXBwZW5kKG5ld19idXR0b24pOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdfZGl2LmFwcGVuZChuZXdfYnV0dG9uX2NvcHkpOwogICAgICAgICAgICAgICAgICAgICAgICBhcnJheV90b3BpY3NbaV0ucGFyZW50Tm9kZS5hZnRlcihuZXdfZGl2KTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2J1dHRvbi5wYXJlbnROb2RlLnByZXZpb3VzU2libGluZy5zZXRBdHRyaWJ1dGUoJ2ZsYWcnLCAndHJ1ZScpOwogICAgICAgICAgICAgICAgICAgICAgICBhcnJheV90b3BpY3NbaV0uc2V0QXR0cmlidXRlKCdwbHVnaW4nLCAndHJ1ZScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgYXJyYXlfaW5zdGVyX2J1dHRvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCd5aCcpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheV9pbnN0ZXJfYnV0dG9uLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IGFycmF5X2luc3Rlcl9idXR0b25baV0ucGFyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRtcCA9PSBudWxsIHx8ICF0bXAuaGFzQXR0cmlidXRlKCdmbGFnJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfaW5zdGVyX2J1dHRvbltpXS5wYXJlbnROb2RlLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL+WNh+e6p+WIpOaWrQogICAgICAgICAgICAgICAgdmFyIHZlcnNpb25fbmV3ID0gJDIoIi5pdGVtLWxpbmsxIikuZmluZCgnYScpWzBdLnRleHQ7CiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbl9uZXcuaW5kZXhPZigiKOacieabtOaWsCkiKSA8IDAgJiYgdmVyc2lvbiA8IHZlcnNpb25fbmV3LnNwbGl0KCJ2IilbMV0pIHsKICAgICAgICAgICAgICAgICAgICAkMigiLml0ZW0tbGluazEiKS5maW5kKCdhJylbMF0udGV4dCA9ICh2ZXJzaW9uX25ldyArICIo5pyJ5pu05pawKSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgIH0pCn0pKCk7Cg==","requires":[{"meta":{"name":"jquery.js","url":"https://cdn.bootcdn.net/ajax/libs/jquery/1.6.3/jquery.js","ts":1654514782974,"mimetype":"text/javascript"},"source":"LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNi4zCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgMjAxMSwgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cDovL3NpenpsZWpzLmNvbS8KICogQ29weXJpZ2h0IDIwMTEsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgogKgogKiBEYXRlOiBXZWQgQXVnIDMxIDEwOjM1OjE1IDIwMTEgLTA0MDAKICovCihmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7CgovLyBVc2UgdGhlIGNvcnJlY3QgZG9jdW1lbnQgYWNjb3JkaW5nbHkgd2l0aCB3aW5kb3cgYXJndW1lbnQgKHNhbmRib3gpCnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCwKCW5hdmlnYXRvciA9IHdpbmRvdy5uYXZpZ2F0b3IsCglsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjsKdmFyIGpRdWVyeSA9IChmdW5jdGlvbigpIHsKCi8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5CnZhciBqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJcmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKTsKCX0sCgoJLy8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSwKCgkvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZQoJXyQgPSB3aW5kb3cuJCwKCgkvLyBBIGNlbnRyYWwgcmVmZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1bWVudCkKCXJvb3RqUXVlcnksCgoJLy8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Mgb3IgSUQgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJcXVpY2tFeHByID0gL14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLAoKCS8vIENoZWNrIGlmIGEgc3RyaW5nIGhhcyBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiBpdAoJcm5vdHdoaXRlID0gL1xTLywKCgkvLyBVc2VkIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlCgl0cmltTGVmdCA9IC9eXHMrLywKCXRyaW1SaWdodCA9IC9ccyskLywKCgkvLyBDaGVjayBmb3IgZGlnaXRzCglyZGlnaXQgPSAvXGQvLAoKCS8vIE1hdGNoIGEgc3RhbmRhbG9uZSB0YWcKCXJzaW5nbGVUYWcgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLAoKCS8vIEpTT04gUmVnRXhwCglydmFsaWRjaGFycyA9IC9eW1xdLDp7fVxzXSokLywKCXJ2YWxpZGVzY2FwZSA9IC9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2csCglydmFsaWR0b2tlbnMgPSAvIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2csCglydmFsaWRicmFjZXMgPSAvKD86Xnw6fCwpKD86XHMqXFspKy9nLAoKCS8vIFVzZXJhZ2VudCBSZWdFeHAKCXJ3ZWJraXQgPSAvKHdlYmtpdClbIFwvXShbXHcuXSspLywKCXJvcGVyYSA9IC8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLywKCXJtc2llID0gLyhtc2llKSAoW1x3Ll0rKS8sCglybW96aWxsYSA9IC8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sCgoJLy8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nCglyZGFzaEFscGhhID0gLy0oW2Etel18WzAtOV0pL2lnLAoJcm1zUHJlZml4ID0gL14tbXMtLywKCgkvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpCglmY2FtZWxDYXNlID0gZnVuY3Rpb24oIGFsbCwgbGV0dGVyICkgewoJCXJldHVybiAoIGxldHRlciArICIiICkudG9VcHBlckNhc2UoKTsKCX0sCgoJLy8gS2VlcCBhIFVzZXJBZ2VudCBzdHJpbmcgZm9yIHVzZSB3aXRoIGpRdWVyeS5icm93c2VyCgl1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LAoKCS8vIEZvciBtYXRjaGluZyB0aGUgZW5naW5lIGFuZCB2ZXJzaW9uIG9mIHRoZSBicm93c2VyCglicm93c2VyTWF0Y2gsCgoJLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5CglyZWFkeUxpc3QsCgoJLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIKCURPTUNvbnRlbnRMb2FkZWQsCgoJLy8gU2F2ZSBhIHJlZmVyZW5jZSB0byBzb21lIGNvcmUgbWV0aG9kcwoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAoJaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwKCXB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaCwKCXNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLAoJdHJpbSA9IFN0cmluZy5wcm90b3R5cGUudHJpbSwKCWluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiwKCgkvLyBbW0NsYXNzXV0gLT4gdHlwZSBwYWlycwoJY2xhc3MydHlwZSA9IHt9OwoKalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKCWNvbnN0cnVjdG9yOiBqUXVlcnksCglpbml0OiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKSB7CgkJdmFyIG1hdGNoLCBlbGVtLCByZXQsIGRvYzsKCgkJLy8gSGFuZGxlICQoIiIpLCAkKG51bGwpLCBvciAkKHVuZGVmaW5lZCkKCQlpZiAoICFzZWxlY3RvciApIHsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQkvLyBIYW5kbGUgJChET01FbGVtZW50KQoJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CgkJCXRoaXMuY29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCS8vIFRoZSBib2R5IGVsZW1lbnQgb25seSBleGlzdHMgb25jZSwgb3B0aW1pemUgZmluZGluZyBpdAoJCWlmICggc2VsZWN0b3IgPT09ICJib2R5IiAmJiAhY29udGV4dCAmJiBkb2N1bWVudC5ib2R5ICkgewoJCQl0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKCQkJdGhpc1swXSA9IGRvY3VtZW50LmJvZHk7CgkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCS8vIEFyZSB3ZSBkZWFsaW5nIHdpdGggSFRNTCBzdHJpbmcgb3IgYW4gSUQ/CgkJCWlmICggc2VsZWN0b3IuY2hhckF0KDApID09PSAiPCIgJiYgc2VsZWN0b3IuY2hhckF0KCBzZWxlY3Rvci5sZW5ndGggLSAxICkgPT09ICI+IiAmJiBzZWxlY3Rvci5sZW5ndGggPj0gMyApIHsKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOwoJCQl9CgoJCQkvLyBWZXJpZnkgYSBtYXRjaCwgYW5kIHRoYXQgbm8gY29udGV4dCB3YXMgc3BlY2lmaWVkIGZvciAjaWQKCQkJaWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0gfHwgIWNvbnRleHQpICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsxXSApIHsKCQkJCQljb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbMF0gOiBjb250ZXh0OwoJCQkJCWRvYyA9IChjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCk7CgoJCQkJCS8vIElmIGEgc2luZ2xlIHN0cmluZyBpcyBwYXNzZWQgaW4gYW5kIGl0J3MgYSBzaW5nbGUgdGFnCgkJCQkJLy8ganVzdCBkbyBhIGNyZWF0ZUVsZW1lbnQgYW5kIHNraXAgdGhlIHJlc3QKCQkJCQlyZXQgPSByc2luZ2xlVGFnLmV4ZWMoIHNlbGVjdG9yICk7CgoJCQkJCWlmICggcmV0ICkgewoJCQkJCQlpZiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCQlzZWxlY3RvciA9IFsgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggcmV0WzFdICkgXTsKCQkJCQkJCWpRdWVyeS5mbi5hdHRyLmNhbGwoIHNlbGVjdG9yLCBjb250ZXh0LCB0cnVlICk7CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJc2VsZWN0b3IgPSBbIGRvYy5jcmVhdGVFbGVtZW50KCByZXRbMV0gKSBdOwoJCQkJCQl9CgoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBbIG1hdGNoWzFdIF0sIFsgZG9jIF0gKTsKCQkJCQkJc2VsZWN0b3IgPSAocmV0LmNhY2hlYWJsZSA/IGpRdWVyeS5jbG9uZShyZXQuZnJhZ21lbnQpIDogcmV0LmZyYWdtZW50KS5jaGlsZE5vZGVzOwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5tZXJnZSggdGhpcywgc2VsZWN0b3IgKTsKCgkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCgkJCQl9IGVsc2UgewoJCQkJCWVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbMl0gKTsKCgkJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKCQkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCgkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1cm4gaXRlbXMKCQkJCQkJLy8gYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCWlmICggZWxlbS5pZCAhPT0gbWF0Y2hbMl0gKSB7CgkJCQkJCQlyZXR1cm4gcm9vdGpRdWVyeS5maW5kKCBzZWxlY3RvciApOwoJCQkJCQl9CgoJCQkJCQkvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CgkJCQkJCXRoaXMubGVuZ3RoID0gMTsKCQkJCQkJdGhpc1swXSA9IGVsZW07CgkJCQkJfQoKCQkJCQl0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKCQkJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9CgoJCQkvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKQoJCQl9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHsKCQkJCXJldHVybiAoY29udGV4dCB8fCByb290alF1ZXJ5KS5maW5kKCBzZWxlY3RvciApOwoKCQkJLy8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpCgkJCS8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKQoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApOwoJCQl9CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHsKCQkJcmV0dXJuIHJvb3RqUXVlcnkucmVhZHkoIHNlbGVjdG9yICk7CgkJfQoKCQlpZiAoc2VsZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCkgewoJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7CgkJCXRoaXMuY29udGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7CgkJfQoKCQlyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKCX0sCgoJLy8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvcgoJc2VsZWN0b3I6ICIiLAoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogIjEuNi4zIiwKCgkvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKCWxlbmd0aDogMCwKCgkvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldAoJc2l6ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubGVuZ3RoOwoJfSwKCgl0b0FycmF5OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcywgMCApOwoJfSwKCgkvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SCgkvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQoJZ2V0OiBmdW5jdGlvbiggbnVtICkgewoJCXJldHVybiBudW0gPT0gbnVsbCA/CgoJCQkvLyBSZXR1cm4gYSAnY2xlYW4nIGFycmF5CgkJCXRoaXMudG9BcnJheSgpIDoKCgkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKCQkJKCBudW0gPCAwID8gdGhpc1sgdGhpcy5sZW5ndGggKyBudW0gXSA6IHRoaXNbIG51bSBdICk7Cgl9LAoKCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQoJcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgewoJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CgkJdmFyIHJldCA9IHRoaXMuY29uc3RydWN0b3IoKTsKCgkJaWYgKCBqUXVlcnkuaXNBcnJheSggZWxlbXMgKSApIHsKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcyApOwoKCQl9IGVsc2UgewoJCQlqUXVlcnkubWVyZ2UoIHJldCwgZWxlbXMgKTsKCQl9CgoJCS8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpCgkJcmV0LnByZXZPYmplY3QgPSB0aGlzOwoKCQlyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDsKCgkJaWYgKCBuYW1lID09PSAiZmluZCIgKSB7CgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAodGhpcy5zZWxlY3RvciA/ICIgIiA6ICIiKSArIHNlbGVjdG9yOwoJCX0gZWxzZSBpZiAoIG5hbWUgKSB7CgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAiLiIgKyBuYW1lICsgIigiICsgc2VsZWN0b3IgKyAiKSI7CgkJfQoKCQkvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldAoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCgkvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpcwoJLy8gb25seSB1c2VkIGludGVybmFsbHkuKQoJZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBhcmdzICkgewoJCXJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2ssIGFyZ3MgKTsKCX0sCgoJcmVhZHk6IGZ1bmN0aW9uKCBmbiApIHsKCQkvLyBBdHRhY2ggdGhlIGxpc3RlbmVycwoJCWpRdWVyeS5iaW5kUmVhZHkoKTsKCgkJLy8gQWRkIHRoZSBjYWxsYmFjawoJCXJlYWR5TGlzdC5kb25lKCBmbiApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZXE6IGZ1bmN0aW9uKCBpICkgewoJCXJldHVybiBpID09PSAtMSA/CgkJCXRoaXMuc2xpY2UoIGkgKSA6CgkJCXRoaXMuc2xpY2UoIGksICtpICsgMSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSwKCQkJInNsaWNlIiwgc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSApOwoJfSwKCgltYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSkpOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTsKCX0sCgoJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgoJLy8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuCglwdXNoOiBwdXNoLAoJc29ydDogW10uc29ydCwKCXNwbGljZTogW10uc3BsaWNlCn07CgovLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCmpRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKCmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7Cgl2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsCgkJdGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LAoJCWkgPSAxLAoJCWxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsCgkJZGVlcCA9IGZhbHNlOwoKCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgewoJCWRlZXAgPSB0YXJnZXQ7CgkJdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9OwoJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKCQlpID0gMjsKCX0KCgkvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSkKCWlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGxlbmd0aCA9PT0gaSApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCS0taTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgewoJCQkvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CgkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKCQkJCXNyYyA9IHRhcmdldFsgbmFtZSBdOwoJCQkJY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKCgkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wCgkJCQlpZiAoIHRhcmdldCA9PT0gY29weSApIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXMKCQkJCWlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7CgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdOwoKCQkJCQl9IGVsc2UgewoJCQkJCQljbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoewoJbm9Db25mbGljdDogZnVuY3Rpb24oIGRlZXAgKSB7CgkJaWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkgewoJCQl3aW5kb3cuJCA9IF8kOwoJCX0KCgkJaWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHsKCQkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CgkJfQoKCQlyZXR1cm4galF1ZXJ5OwoJfSwKCgkvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLgoJaXNSZWFkeTogZmFsc2UsCgoJLy8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZQoJLy8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODEKCXJlYWR5V2FpdDogMSwKCgkvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnQKCWhvbGRSZWFkeTogZnVuY3Rpb24oIGhvbGQgKSB7CgkJaWYgKCBob2xkICkgewoJCQlqUXVlcnkucmVhZHlXYWl0Kys7CgkJfSBlbHNlIHsKCQkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7CgkJfQoJfSwKCgkvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5CglyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7CgkJLy8gRWl0aGVyIGEgcmVsZWFzZWQgaG9sZCBvciBhbiBET01yZWFkeS9sb2FkIGV2ZW50IGFuZCBub3QgeWV0IHJlYWR5CgkJaWYgKCAod2FpdCA9PT0gdHJ1ZSAmJiAhLS1qUXVlcnkucmVhZHlXYWl0KSB8fCAod2FpdCAhPT0gdHJ1ZSAmJiAhalF1ZXJ5LmlzUmVhZHkpICkgewoJCQkvLyBNYWtlIHN1cmUgYm9keSBleGlzdHMsIGF0IGxlYXN0LCBpbiBjYXNlIElFIGdldHMgYSBsaXR0bGUgb3ZlcnplYWxvdXMgKHRpY2tldCAjNTQ0MykuCgkJCWlmICggIWRvY3VtZW50LmJvZHkgKSB7CgkJCQlyZXR1cm4gc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5LCAxICk7CgkJCX0KCgkJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCQlqUXVlcnkuaXNSZWFkeSA9IHRydWU7CgoJCQkvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZQoJCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCQlyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7CgoJCQkvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHMKCQkJaWYgKCBqUXVlcnkuZm4udHJpZ2dlciApIHsKCQkJCWpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VyKCAicmVhZHkiICkudW5iaW5kKCAicmVhZHkiICk7CgkJCX0KCQl9Cgl9LAoKCWJpbmRSZWFkeTogZnVuY3Rpb24oKSB7CgkJaWYgKCByZWFkeUxpc3QgKSB7CgkJCXJldHVybjsKCQl9CgoJCXJlYWR5TGlzdCA9IGpRdWVyeS5fRGVmZXJyZWQoKTsKCgkJLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlCgkJLy8gYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KCQlpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7CgkJCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJCQlyZXR1cm4gc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5LCAxICk7CgkJfQoKCQkvLyBNb3ppbGxhLCBPcGVyYSBhbmQgd2Via2l0IG5pZ2h0bGllcyBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIGV2ZW50CgkJaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJCQkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCgkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTsKCgkJCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAibG9hZCIsIGpRdWVyeS5yZWFkeSwgZmFsc2UgKTsKCgkJLy8gSWYgSUUgZXZlbnQgbW9kZWwgaXMgdXNlZAoJCX0gZWxzZSBpZiAoIGRvY3VtZW50LmF0dGFjaEV2ZW50ICkgewoJCQkvLyBlbnN1cmUgZmlyaW5nIGJlZm9yZSBvbmxvYWQsCgkJCS8vIG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBmb3IgaWZyYW1lcwoJCQlkb2N1bWVudC5hdHRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsKCgkJCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgkJCXdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGpRdWVyeS5yZWFkeSApOwoKCQkJLy8gSWYgSUUgYW5kIG5vdCBhIGZyYW1lCgkJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKCQkJdmFyIHRvcGxldmVsID0gZmFsc2U7CgoJCQl0cnkgewoJCQkJdG9wbGV2ZWwgPSB3aW5kb3cuZnJhbWVFbGVtZW50ID09IG51bGw7CgkJCX0gY2F0Y2goZSkge30KCgkJCWlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICYmIHRvcGxldmVsICkgewoJCQkJZG9TY3JvbGxDaGVjaygpOwoJCQl9CgkJfQoJfSwKCgkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgoJLy8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAoJLy8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS4KCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09ICJmdW5jdGlvbiI7Cgl9LAoKCWlzQXJyYXk6IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImFycmF5IjsKCX0sCgoJLy8gQSBjcnVkZSB3YXkgb2YgZGV0ZXJtaW5pbmcgaWYgYW4gb2JqZWN0IGlzIGEgd2luZG93Cglpc1dpbmRvdzogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICJvYmplY3QiICYmICJzZXRJbnRlcnZhbCIgaW4gb2JqOwoJfSwKCglpc05hTjogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gb2JqID09IG51bGwgfHwgIXJkaWdpdC50ZXN0KCBvYmogKSB8fCBpc05hTiggb2JqICk7Cgl9LAoKCXR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIG9iaiA9PSBudWxsID8KCQkJU3RyaW5nKCBvYmogKSA6CgkJCWNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwob2JqKSBdIHx8ICJvYmplY3QiOwoJfSwKCglpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkgewoJCS8vIE11c3QgYmUgYW4gT2JqZWN0LgoJCS8vIEJlY2F1c2Ugb2YgSUUsIHdlIGFsc28gaGF2ZSB0byBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgdGhlIGNvbnN0cnVjdG9yIHByb3BlcnR5LgoJCS8vIE1ha2Ugc3VyZSB0aGF0IERPTSBub2RlcyBhbmQgd2luZG93IG9iamVjdHMgZG9uJ3QgcGFzcyB0aHJvdWdoLCBhcyB3ZWxsCgkJaWYgKCAhb2JqIHx8IGpRdWVyeS50eXBlKG9iaikgIT09ICJvYmplY3QiIHx8IG9iai5ub2RlVHlwZSB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQl0cnkgewoJCQkvLyBOb3Qgb3duIGNvbnN0cnVjdG9yIHByb3BlcnR5IG11c3QgYmUgT2JqZWN0CgkJCWlmICggb2JqLmNvbnN0cnVjdG9yICYmCgkJCQkhaGFzT3duLmNhbGwob2JqLCAiY29uc3RydWN0b3IiKSAmJgoJCQkJIWhhc093bi5jYWxsKG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsICJpc1Byb3RvdHlwZU9mIikgKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IGNhdGNoICggZSApIHsKCQkJLy8gSUU4LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9uIGNlcnRhaW4gaG9zdCBvYmplY3RzICM5ODk3CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIE93biBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLAoJCS8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLgoKCQl2YXIga2V5OwoJCWZvciAoIGtleSBpbiBvYmogKSB7fQoKCQlyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgfHwgaGFzT3duLmNhbGwoIG9iaiwga2V5ICk7Cgl9LAoKCWlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7CgkJZm9yICggdmFyIG5hbWUgaW4gb2JqICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfSwKCgllcnJvcjogZnVuY3Rpb24oIG1zZyApIHsKCQl0aHJvdyBtc2c7Cgl9LAoKCXBhcnNlSlNPTjogZnVuY3Rpb24oIGRhdGEgKSB7CgkJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgfHwgIWRhdGEgKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJLy8gTWFrZSBzdXJlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZW1vdmVkIChJRSBjYW4ndCBoYW5kbGUgaXQpCgkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7CgoJCS8vIEF0dGVtcHQgdG8gcGFyc2UgdXNpbmcgdGhlIG5hdGl2ZSBKU09OIHBhcnNlciBmaXJzdAoJCWlmICggd2luZG93LkpTT04gJiYgd2luZG93LkpTT04ucGFyc2UgKSB7CgkJCXJldHVybiB3aW5kb3cuSlNPTi5wYXJzZSggZGF0YSApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoZSBpbmNvbWluZyBkYXRhIGlzIGFjdHVhbCBKU09OCgkJLy8gTG9naWMgYm9ycm93ZWQgZnJvbSBodHRwOi8vanNvbi5vcmcvanNvbjIuanMKCQlpZiAoIHJ2YWxpZGNoYXJzLnRlc3QoIGRhdGEucmVwbGFjZSggcnZhbGlkZXNjYXBlLCAiQCIgKQoJCQkucmVwbGFjZSggcnZhbGlkdG9rZW5zLCAiXSIgKQoJCQkucmVwbGFjZSggcnZhbGlkYnJhY2VzLCAiIikpICkgewoKCQkJcmV0dXJuIChuZXcgRnVuY3Rpb24oICJyZXR1cm4gIiArIGRhdGEgKSkoKTsKCgkJfQoJCWpRdWVyeS5lcnJvciggIkludmFsaWQgSlNPTjogIiArIGRhdGEgKTsKCX0sCgoJLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZwoJcGFyc2VYTUw6IGZ1bmN0aW9uKCBkYXRhICkgewoJCXZhciB4bWwsIHRtcDsKCQl0cnkgewoJCQlpZiAoIHdpbmRvdy5ET01QYXJzZXIgKSB7IC8vIFN0YW5kYXJkCgkJCQl0bXAgPSBuZXcgRE9NUGFyc2VyKCk7CgkJCQl4bWwgPSB0bXAucGFyc2VGcm9tU3RyaW5nKCBkYXRhICwgInRleHQveG1sIiApOwoJCQl9IGVsc2UgeyAvLyBJRQoJCQkJeG1sID0gbmV3IEFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MRE9NIiApOwoJCQkJeG1sLmFzeW5jID0gImZhbHNlIjsKCQkJCXhtbC5sb2FkWE1MKCBkYXRhICk7CgkJCX0KCQl9IGNhdGNoKCBlICkgewoJCQl4bWwgPSB1bmRlZmluZWQ7CgkJfQoJCWlmICggIXhtbCB8fCAheG1sLmRvY3VtZW50RWxlbWVudCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJwYXJzZXJlcnJvciIgKS5sZW5ndGggKSB7CgkJCWpRdWVyeS5lcnJvciggIkludmFsaWQgWE1MOiAiICsgZGF0YSApOwoJCX0KCQlyZXR1cm4geG1sOwoJfSwKCglub29wOiBmdW5jdGlvbigpIHt9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CgkvLyBXb3JrYXJvdW5kcyBiYXNlZCBvbiBmaW5kaW5ncyBieSBKaW0gRHJpc2NvbGwKCS8vIGh0dHA6Ly93ZWJsb2dzLmphdmEubmV0L2Jsb2cvZHJpc2NvbGwvYXJjaGl2ZS8yMDA5LzA5LzA4L2V2YWwtamF2YXNjcmlwdC1nbG9iYWwtY29udGV4dAoJZ2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CgkJaWYgKCBkYXRhICYmIHJub3R3aGl0ZS50ZXN0KCBkYXRhICkgKSB7CgkJCS8vIFdlIHVzZSBleGVjU2NyaXB0IG9uIEludGVybmV0IEV4cGxvcmVyCgkJCS8vIFdlIHVzZSBhbiBhbm9ueW1vdXMgZnVuY3Rpb24gc28gdGhhdCBjb250ZXh0IGlzIHdpbmRvdwoJCQkvLyByYXRoZXIgdGhhbiBqUXVlcnkgaW4gRmlyZWZveAoJCQkoIHdpbmRvdy5leGVjU2NyaXB0IHx8IGZ1bmN0aW9uKCBkYXRhICkgewoJCQkJd2luZG93WyAiZXZhbCIgXS5jYWxsKCB3aW5kb3csIGRhdGEgKTsKCQkJfSApKCBkYXRhICk7CgkJfQoJfSwKCgkvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzCgkvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCgljYW1lbENhc2U6IGZ1bmN0aW9uKCBzdHJpbmcgKSB7CgkJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwoJfSwKCglub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBuYW1lLnRvVXBwZXJDYXNlKCk7Cgl9LAoKCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKCWVhY2g6IGZ1bmN0aW9uKCBvYmplY3QsIGNhbGxiYWNrLCBhcmdzICkgewoJCXZhciBuYW1lLCBpID0gMCwKCQkJbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aCwKCQkJaXNPYmogPSBsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNGdW5jdGlvbiggb2JqZWN0ICk7CgoJCWlmICggYXJncyApIHsKCQkJaWYgKCBpc09iaiApIHsKCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkgewoJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgbmFtZSBdLCBhcmdzICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCA7IGkgPCBsZW5ndGg7ICkgewoJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgaSsrIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaAoJCX0gZWxzZSB7CgkJCWlmICggaXNPYmogKSB7CgkJCQlmb3IgKCBuYW1lIGluIG9iamVjdCApIHsKCQkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9iamVjdFsgbmFtZSBdLCBuYW1lLCBvYmplY3RbIG5hbWUgXSApID09PSBmYWxzZSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyApIHsKCQkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9iamVjdFsgaSBdLCBpLCBvYmplY3RbIGkrKyBdICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmplY3Q7Cgl9LAoKCS8vIFVzZSBuYXRpdmUgU3RyaW5nLnRyaW0gZnVuY3Rpb24gd2hlcmV2ZXIgcG9zc2libGUKCXRyaW06IHRyaW0gPwoJCWZ1bmN0aW9uKCB0ZXh0ICkgewoJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KCQkJCSIiIDoKCQkJCXRyaW0uY2FsbCggdGV4dCApOwoJCX0gOgoKCQkvLyBPdGhlcndpc2UgdXNlIG91ciBvd24gdHJpbW1pbmcgZnVuY3Rpb25hbGl0eQoJCWZ1bmN0aW9uKCB0ZXh0ICkgewoJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KCQkJCSIiIDoKCQkJCXRleHQudG9TdHJpbmcoKS5yZXBsYWNlKCB0cmltTGVmdCwgIiIgKS5yZXBsYWNlKCB0cmltUmlnaHQsICIiICk7CgkJfSwKCgkvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKCQl2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTsKCgkJaWYgKCBhcnJheSAhPSBudWxsICkgewoJCQkvLyBUaGUgd2luZG93LCBzdHJpbmdzIChhbmQgZnVuY3Rpb25zKSBhbHNvIGhhdmUgJ2xlbmd0aCcKCQkJLy8gVGhlIGV4dHJhIHR5cGVvZiBmdW5jdGlvbiBjaGVjayBpcyB0byBwcmV2ZW50IGNyYXNoZXMKCQkJLy8gaW4gU2FmYXJpIDIgKFNlZTogIzMwMzkpCgkJCS8vIFR3ZWFrZWQgbG9naWMgc2xpZ2h0bHkgdG8gaGFuZGxlIEJsYWNrYmVycnkgNC43IFJlZ0V4cCBpc3N1ZXMgIzY5MzAKCQkJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggYXJyYXkgKTsKCgkJCWlmICggYXJyYXkubGVuZ3RoID09IG51bGwgfHwgdHlwZSA9PT0gInN0cmluZyIgfHwgdHlwZSA9PT0gImZ1bmN0aW9uIiB8fCB0eXBlID09PSAicmVnZXhwIiB8fCBqUXVlcnkuaXNXaW5kb3coIGFycmF5ICkgKSB7CgkJCQlwdXNoLmNhbGwoIHJldCwgYXJyYXkgKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeS5tZXJnZSggcmV0LCBhcnJheSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyYXkgKSB7CgkJaWYgKCAhYXJyYXkgKSB7CgkJCXJldHVybiAtMTsKCQl9CgoJCWlmICggaW5kZXhPZiApIHsKCQkJcmV0dXJuIGluZGV4T2YuY2FsbCggYXJyYXksIGVsZW0gKTsKCQl9CgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCWlmICggYXJyYXlbIGkgXSA9PT0gZWxlbSApIHsKCQkJCXJldHVybiBpOwoJCQl9CgkJfQoKCQlyZXR1cm4gLTE7Cgl9LAoKCW1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHsKCQl2YXIgaSA9IGZpcnN0Lmxlbmd0aCwKCQkJaiA9IDA7CgoJCWlmICggdHlwZW9mIHNlY29uZC5sZW5ndGggPT09ICJudW1iZXIiICkgewoJCQlmb3IgKCB2YXIgbCA9IHNlY29uZC5sZW5ndGg7IGogPCBsOyBqKysgKSB7CgkJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQkJfQoKCQl9IGVsc2UgewoJCQl3aGlsZSAoIHNlY29uZFtqXSAhPT0gdW5kZWZpbmVkICkgewoJCQkJZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTsKCQkJfQoJCX0KCgkJZmlyc3QubGVuZ3RoID0gaTsKCgkJcmV0dXJuIGZpcnN0OwoJfSwKCglncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CgkJdmFyIHJldCA9IFtdLCByZXRWYWw7CgkJaW52ID0gISFpbnY7CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXMKCQkvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvbgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCXJldFZhbCA9ICEhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTsKCQkJaWYgKCBpbnYgIT09IHJldFZhbCApIHsKCQkJCXJldC5wdXNoKCBlbGVtc1sgaSBdICk7CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7CgkJdmFyIHZhbHVlLCBrZXksIHJldCA9IFtdLAoJCQlpID0gMCwKCQkJbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAoJCQkvLyBqcXVlcnkgb2JqZWN0cyBhcmUgdHJlYXRlZCBhcyBhcnJheXMKCQkJaXNBcnJheSA9IGVsZW1zIGluc3RhbmNlb2YgalF1ZXJ5IHx8IGxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBsZW5ndGggPT09ICJudW1iZXIiICYmICggKCBsZW5ndGggPiAwICYmIGVsZW1zWyAwIF0gJiYgZWxlbXNbIGxlbmd0aCAtMSBdICkgfHwgbGVuZ3RoID09PSAwIHx8IGpRdWVyeS5pc0FycmF5KCBlbGVtcyApICkgOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIKCQlpZiAoIGlzQXJyYXkgKSB7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBrZXkgaW4gZWxlbXMgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sga2V5IF0sIGtleSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMKCQlyZXR1cm4gcmV0LmNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55CgkvLyBhcmd1bWVudHMuCglwcm94eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQgPT09ICJzdHJpbmciICkgewoJCQl2YXIgdG1wID0gZm5bIGNvbnRleHQgXTsKCQkJY29udGV4dCA9IGZuOwoJCQlmbiA9IHRtcDsKCQl9CgoJCS8vIFF1aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVjCgkJLy8gdGhpcyB0aHJvd3MgYSBUeXBlRXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC4KCQlpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsKCQkJcmV0dXJuIHVuZGVmaW5lZDsKCQl9CgoJCS8vIFNpbXVsYXRlZCBiaW5kCgkJdmFyIGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKSwKCQkJcHJveHkgPSBmdW5jdGlvbigpIHsKCQkJCXJldHVybiBmbi5hcHBseSggY29udGV4dCwgYXJncy5jb25jYXQoIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTsKCQkJfTsKCgkJLy8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkCgkJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IHByb3h5Lmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKzsKCgkJcmV0dXJuIHByb3h5OwoJfSwKCgkvLyBNdXRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIHRvIGEgY29sbGVjdGlvbgoJLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uCglhY2Nlc3M6IGZ1bmN0aW9uKCBlbGVtcywga2V5LCB2YWx1ZSwgZXhlYywgZm4sIHBhc3MgKSB7CgkJdmFyIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCgkJLy8gU2V0dGluZyBtYW55IGF0dHJpYnV0ZXMKCQlpZiAoIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgewoJCQlmb3IgKCB2YXIgayBpbiBrZXkgKSB7CgkJCQlqUXVlcnkuYWNjZXNzKCBlbGVtcywgaywga2V5W2tdLCBleGVjLCBmbiwgdmFsdWUgKTsKCQkJfQoJCQlyZXR1cm4gZWxlbXM7CgkJfQoKCQkvLyBTZXR0aW5nIG9uZSBhdHRyaWJ1dGUKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCS8vIE9wdGlvbmFsbHksIGZ1bmN0aW9uIHZhbHVlcyBnZXQgZXhlY3V0ZWQgaWYgZXhlYyBpcyB0cnVlCgkJCWV4ZWMgPSAhcGFzcyAmJiBleGVjICYmIGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKTsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQkJZm4oIGVsZW1zW2ldLCBrZXksIGV4ZWMgPyB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApIDogdmFsdWUsIHBhc3MgKTsKCQkJfQoKCQkJcmV0dXJuIGVsZW1zOwoJCX0KCgkJLy8gR2V0dGluZyBhbiBhdHRyaWJ1dGUKCQlyZXR1cm4gbGVuZ3RoID8gZm4oIGVsZW1zWzBdLCBrZXkgKSA6IHVuZGVmaW5lZDsKCX0sCgoJbm93OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKCX0sCgoJLy8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGZyb3duZWQgdXBvbi4KCS8vIE1vcmUgZGV0YWlsczogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VdGlsaXRpZXMvalF1ZXJ5LmJyb3dzZXIKCXVhTWF0Y2g6IGZ1bmN0aW9uKCB1YSApIHsKCQl1YSA9IHVhLnRvTG93ZXJDYXNlKCk7CgoJCXZhciBtYXRjaCA9IHJ3ZWJraXQuZXhlYyggdWEgKSB8fAoJCQlyb3BlcmEuZXhlYyggdWEgKSB8fAoJCQlybXNpZS5leGVjKCB1YSApIHx8CgkJCXVhLmluZGV4T2YoImNvbXBhdGlibGUiKSA8IDAgJiYgcm1vemlsbGEuZXhlYyggdWEgKSB8fAoJCQlbXTsKCgkJcmV0dXJuIHsgYnJvd3NlcjogbWF0Y2hbMV0gfHwgIiIsIHZlcnNpb246IG1hdGNoWzJdIHx8ICIwIiB9OwoJfSwKCglzdWI6IGZ1bmN0aW9uKCkgewoJCWZ1bmN0aW9uIGpRdWVyeVN1Yiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CgkJCXJldHVybiBuZXcgalF1ZXJ5U3ViLmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7CgkJfQoJCWpRdWVyeS5leHRlbmQoIHRydWUsIGpRdWVyeVN1YiwgdGhpcyApOwoJCWpRdWVyeVN1Yi5zdXBlcmNsYXNzID0gdGhpczsKCQlqUXVlcnlTdWIuZm4gPSBqUXVlcnlTdWIucHJvdG90eXBlID0gdGhpcygpOwoJCWpRdWVyeVN1Yi5mbi5jb25zdHJ1Y3RvciA9IGpRdWVyeVN1YjsKCQlqUXVlcnlTdWIuc3ViID0gdGhpcy5zdWI7CgkJalF1ZXJ5U3ViLmZuLmluaXQgPSBmdW5jdGlvbiBpbml0KCBzZWxlY3RvciwgY29udGV4dCApIHsKCQkJaWYgKCBjb250ZXh0ICYmIGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgJiYgIShjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5U3ViKSApIHsKCQkJCWNvbnRleHQgPSBqUXVlcnlTdWIoIGNvbnRleHQgKTsKCQkJfQoKCQkJcmV0dXJuIGpRdWVyeS5mbi5pbml0LmNhbGwoIHRoaXMsIHNlbGVjdG9yLCBjb250ZXh0LCByb290alF1ZXJ5U3ViICk7CgkJfTsKCQlqUXVlcnlTdWIuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnlTdWIuZm47CgkJdmFyIHJvb3RqUXVlcnlTdWIgPSBqUXVlcnlTdWIoZG9jdW1lbnQpOwoJCXJldHVybiBqUXVlcnlTdWI7Cgl9LAoKCWJyb3dzZXI6IHt9Cn0pOwoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLCBmdW5jdGlvbihpLCBuYW1lKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9KTsKCmJyb3dzZXJNYXRjaCA9IGpRdWVyeS51YU1hdGNoKCB1c2VyQWdlbnQgKTsKaWYgKCBicm93c2VyTWF0Y2guYnJvd3NlciApIHsKCWpRdWVyeS5icm93c2VyWyBicm93c2VyTWF0Y2guYnJvd3NlciBdID0gdHJ1ZTsKCWpRdWVyeS5icm93c2VyLnZlcnNpb24gPSBicm93c2VyTWF0Y2gudmVyc2lvbjsKfQoKLy8gRGVwcmVjYXRlZCwgdXNlIGpRdWVyeS5icm93c2VyLndlYmtpdCBpbnN0ZWFkCmlmICggalF1ZXJ5LmJyb3dzZXIud2Via2l0ICkgewoJalF1ZXJ5LmJyb3dzZXIuc2FmYXJpID0gdHJ1ZTsKfQoKLy8gSUUgZG9lc24ndCBtYXRjaCBub24tYnJlYWtpbmcgc3BhY2VzIHdpdGggXHMKaWYgKCBybm90d2hpdGUudGVzdCggIlx4QTAiICkgKSB7Cgl0cmltTGVmdCA9IC9eW1xzXHhBMF0rLzsKCXRyaW1SaWdodCA9IC9bXHNceEEwXSskLzsKfQoKLy8gQWxsIGpRdWVyeSBvYmplY3RzIHNob3VsZCBwb2ludCBiYWNrIHRvIHRoZXNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoZG9jdW1lbnQpOwoKLy8gQ2xlYW51cCBmdW5jdGlvbnMgZm9yIHRoZSBkb2N1bWVudCByZWFkeSBtZXRob2QKaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJRE9NQ29udGVudExvYWRlZCA9IGZ1bmN0aW9uKCkgewoJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTsKCQlqUXVlcnkucmVhZHkoKTsKCX07Cgp9IGVsc2UgaWYgKCBkb2N1bWVudC5hdHRhY2hFdmVudCApIHsKCURPTUNvbnRlbnRMb2FkZWQgPSBmdW5jdGlvbigpIHsKCQkvLyBNYWtlIHN1cmUgYm9keSBleGlzdHMsIGF0IGxlYXN0LCBpbiBjYXNlIElFIGdldHMgYSBsaXR0bGUgb3ZlcnplYWxvdXMgKHRpY2tldCAjNTQ0MykuCgkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgewoJCQlkb2N1bWVudC5kZXRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsKCQkJalF1ZXJ5LnJlYWR5KCk7CgkJfQoJfTsKfQoKLy8gVGhlIERPTSByZWFkeSBjaGVjayBmb3IgSW50ZXJuZXQgRXhwbG9yZXIKZnVuY3Rpb24gZG9TY3JvbGxDaGVjaygpIHsKCWlmICggalF1ZXJ5LmlzUmVhZHkgKSB7CgkJcmV0dXJuOwoJfQoKCXRyeSB7CgkJLy8gSWYgSUUgaXMgdXNlZCwgdXNlIHRoZSB0cmljayBieSBEaWVnbyBQZXJpbmkKCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLwoJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpOwoJfSBjYXRjaChlKSB7CgkJc2V0VGltZW91dCggZG9TY3JvbGxDaGVjaywgMSApOwoJCXJldHVybjsKCX0KCgkvLyBhbmQgZXhlY3V0ZSBhbnkgd2FpdGluZyBmdW5jdGlvbnMKCWpRdWVyeS5yZWFkeSgpOwp9CgpyZXR1cm4galF1ZXJ5OwoKfSkoKTsKCgp2YXIgLy8gUHJvbWlzZSBtZXRob2RzCglwcm9taXNlTWV0aG9kcyA9ICJkb25lIGZhaWwgaXNSZXNvbHZlZCBpc1JlamVjdGVkIHByb21pc2UgdGhlbiBhbHdheXMgcGlwZSIuc3BsaXQoICIgIiApLAoJLy8gU3RhdGljIHJlZmVyZW5jZSB0byBzbGljZQoJc2xpY2VEZWZlcnJlZCA9IFtdLnNsaWNlOwoKalF1ZXJ5LmV4dGVuZCh7CgkvLyBDcmVhdGUgYSBzaW1wbGUgZGVmZXJyZWQgKG9uZSBjYWxsYmFja3MgbGlzdCkKCV9EZWZlcnJlZDogZnVuY3Rpb24oKSB7CgkJdmFyIC8vIGNhbGxiYWNrcyBsaXN0CgkJCWNhbGxiYWNrcyA9IFtdLAoJCQkvLyBzdG9yZWQgWyBjb250ZXh0ICwgYXJncyBdCgkJCWZpcmVkLAoJCQkvLyB0byBhdm9pZCBmaXJpbmcgd2hlbiBhbHJlYWR5IGRvaW5nIHNvCgkJCWZpcmluZywKCQkJLy8gZmxhZyB0byBrbm93IGlmIHRoZSBkZWZlcnJlZCBoYXMgYmVlbiBjYW5jZWxsZWQKCQkJY2FuY2VsbGVkLAoJCQkvLyB0aGUgZGVmZXJyZWQgaXRzZWxmCgkJCWRlZmVycmVkICA9IHsKCgkJCQkvLyBkb25lKCBmMSwgZjIsIC4uLikKCQkJCWRvbmU6IGZ1bmN0aW9uKCkgewoJCQkJCWlmICggIWNhbmNlbGxlZCApIHsKCQkJCQkJdmFyIGFyZ3MgPSBhcmd1bWVudHMsCgkJCQkJCQlpLAoJCQkJCQkJbGVuZ3RoLAoJCQkJCQkJZWxlbSwKCQkJCQkJCXR5cGUsCgkJCQkJCQlfZmlyZWQ7CgkJCQkJCWlmICggZmlyZWQgKSB7CgkJCQkJCQlfZmlyZWQgPSBmaXJlZDsKCQkJCQkJCWZpcmVkID0gMDsKCQkJCQkJfQoJCQkJCQlmb3IgKCBpID0gMCwgbGVuZ3RoID0gYXJncy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCQkJCWVsZW0gPSBhcmdzWyBpIF07CgkJCQkJCQl0eXBlID0galF1ZXJ5LnR5cGUoIGVsZW0gKTsKCQkJCQkJCWlmICggdHlwZSA9PT0gImFycmF5IiApIHsKCQkJCQkJCQlkZWZlcnJlZC5kb25lLmFwcGx5KCBkZWZlcnJlZCwgZWxlbSApOwoJCQkJCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiApIHsKCQkJCQkJCQljYWxsYmFja3MucHVzaCggZWxlbSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWlmICggX2ZpcmVkICkgewoJCQkJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIF9maXJlZFsgMCBdLCBfZmlyZWRbIDEgXSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCgkJCQkvLyByZXNvbHZlIHdpdGggZ2l2ZW4gY29udGV4dCBhbmQgYXJncwoJCQkJcmVzb2x2ZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkgewoJCQkJCWlmICggIWNhbmNlbGxlZCAmJiAhZmlyZWQgJiYgIWZpcmluZyApIHsKCQkJCQkJLy8gbWFrZSBzdXJlIGFyZ3MgYXJlIGF2YWlsYWJsZSAoIzg0MjEpCgkJCQkJCWFyZ3MgPSBhcmdzIHx8IFtdOwoJCQkJCQlmaXJpbmcgPSAxOwoJCQkJCQl0cnkgewoJCQkJCQkJd2hpbGUoIGNhbGxiYWNrc1sgMCBdICkgewoJCQkJCQkJCWNhbGxiYWNrcy5zaGlmdCgpLmFwcGx5KCBjb250ZXh0LCBhcmdzICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZmluYWxseSB7CgkJCQkJCQlmaXJlZCA9IFsgY29udGV4dCwgYXJncyBdOwoJCQkJCQkJZmlyaW5nID0gMDsKCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gcmVzb2x2ZSB3aXRoIHRoaXMgYXMgY29udGV4dCBhbmQgZ2l2ZW4gYXJndW1lbnRzCgkJCQlyZXNvbHZlOiBmdW5jdGlvbigpIHsKCQkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIEhhcyB0aGlzIGRlZmVycmVkIGJlZW4gcmVzb2x2ZWQ/CgkJCQlpc1Jlc29sdmVkOiBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gISEoIGZpcmluZyB8fCBmaXJlZCApOwoJCQkJfSwKCgkJCQkvLyBDYW5jZWwKCQkJCWNhbmNlbDogZnVuY3Rpb24oKSB7CgkJCQkJY2FuY2VsbGVkID0gMTsKCQkJCQljYWxsYmFja3MgPSBbXTsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJfTsKCgkJcmV0dXJuIGRlZmVycmVkOwoJfSwKCgkvLyBGdWxsIGZsZWRnZWQgZGVmZXJyZWQgKHR3byBjYWxsYmFja3MgbGlzdCkKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgZGVmZXJyZWQgPSBqUXVlcnkuX0RlZmVycmVkKCksCgkJCWZhaWxEZWZlcnJlZCA9IGpRdWVyeS5fRGVmZXJyZWQoKSwKCQkJcHJvbWlzZTsKCQkvLyBBZGQgZXJyb3JEZWZlcnJlZCBtZXRob2RzLCB0aGVuIGFuZCBwcm9taXNlCgkJalF1ZXJ5LmV4dGVuZCggZGVmZXJyZWQsIHsKCQkJdGhlbjogZnVuY3Rpb24oIGRvbmVDYWxsYmFja3MsIGZhaWxDYWxsYmFja3MgKSB7CgkJCQlkZWZlcnJlZC5kb25lKCBkb25lQ2FsbGJhY2tzICkuZmFpbCggZmFpbENhbGxiYWNrcyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWFsd2F5czogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gZGVmZXJyZWQuZG9uZS5hcHBseSggZGVmZXJyZWQsIGFyZ3VtZW50cyApLmZhaWwuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQl9LAoJCQlmYWlsOiBmYWlsRGVmZXJyZWQuZG9uZSwKCQkJcmVqZWN0V2l0aDogZmFpbERlZmVycmVkLnJlc29sdmVXaXRoLAoJCQlyZWplY3Q6IGZhaWxEZWZlcnJlZC5yZXNvbHZlLAoJCQlpc1JlamVjdGVkOiBmYWlsRGVmZXJyZWQuaXNSZXNvbHZlZCwKCQkJcGlwZTogZnVuY3Rpb24oIGZuRG9uZSwgZm5GYWlsICkgewoJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7CgkJCQkJalF1ZXJ5LmVhY2goIHsKCQkJCQkJZG9uZTogWyBmbkRvbmUsICJyZXNvbHZlIiBdLAoJCQkJCQlmYWlsOiBbIGZuRmFpbCwgInJlamVjdCIgXQoJCQkJCX0sIGZ1bmN0aW9uKCBoYW5kbGVyLCBkYXRhICkgewoJCQkJCQl2YXIgZm4gPSBkYXRhWyAwIF0sCgkJCQkJCQlhY3Rpb24gPSBkYXRhWyAxIF0sCgkJCQkJCQlyZXR1cm5lZDsKCQkJCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsKCQkJCQkJCWRlZmVycmVkWyBoYW5kbGVyIF0oZnVuY3Rpb24oKSB7CgkJCQkJCQkJcmV0dXJuZWQgPSBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQkJCQkJaWYgKCByZXR1cm5lZCAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkudGhlbiggbmV3RGVmZXIucmVzb2x2ZSwgbmV3RGVmZXIucmVqZWN0ICk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJbmV3RGVmZXJbIGFjdGlvbiArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IG5ld0RlZmVyIDogdGhpcywgWyByZXR1cm5lZCBdICk7CgkJCQkJCQkJfQoJCQkJCQkJfSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlkZWZlcnJlZFsgaGFuZGxlciBdKCBuZXdEZWZlclsgYWN0aW9uIF0gKTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJfSkucHJvbWlzZSgpOwoJCQl9LAoJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCS8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3QKCQkJcHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHsKCQkJCWlmICggb2JqID09IG51bGwgKSB7CgkJCQkJaWYgKCBwcm9taXNlICkgewoJCQkJCQlyZXR1cm4gcHJvbWlzZTsKCQkJCQl9CgkJCQkJcHJvbWlzZSA9IG9iaiA9IHt9OwoJCQkJfQoJCQkJdmFyIGkgPSBwcm9taXNlTWV0aG9kcy5sZW5ndGg7CgkJCQl3aGlsZSggaS0tICkgewoJCQkJCW9ialsgcHJvbWlzZU1ldGhvZHNbaV0gXSA9IGRlZmVycmVkWyBwcm9taXNlTWV0aG9kc1tpXSBdOwoJCQkJfQoJCQkJcmV0dXJuIG9iajsKCQkJfQoJCX0pOwoJCS8vIE1ha2Ugc3VyZSBvbmx5IG9uZSBjYWxsYmFjayBsaXN0IHdpbGwgYmUgdXNlZAoJCWRlZmVycmVkLmRvbmUoIGZhaWxEZWZlcnJlZC5jYW5jZWwgKS5mYWlsKCBkZWZlcnJlZC5jYW5jZWwgKTsKCQkvLyBVbmV4cG9zZSBjYW5jZWwKCQlkZWxldGUgZGVmZXJyZWQuY2FuY2VsOwoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoJCXJldHVybiBkZWZlcnJlZDsKCX0sCgoJLy8gRGVmZXJyZWQgaGVscGVyCgl3aGVuOiBmdW5jdGlvbiggZmlyc3RQYXJhbSApIHsKCQl2YXIgYXJncyA9IGFyZ3VtZW50cywKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGFyZ3MubGVuZ3RoLAoJCQljb3VudCA9IGxlbmd0aCwKCQkJZGVmZXJyZWQgPSBsZW5ndGggPD0gMSAmJiBmaXJzdFBhcmFtICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBmaXJzdFBhcmFtLnByb21pc2UgKSA/CgkJCQlmaXJzdFBhcmFtIDoKCQkJCWpRdWVyeS5EZWZlcnJlZCgpOwoJCWZ1bmN0aW9uIHJlc29sdmVGdW5jKCBpICkgewoJCQlyZXR1cm4gZnVuY3Rpb24oIHZhbHVlICkgewoJCQkJYXJnc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZURlZmVycmVkLmNhbGwoIGFyZ3VtZW50cywgMCApIDogdmFsdWU7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQkvLyBTdHJhbmdlIGJ1ZyBpbiBGRjQ6CgkJCQkJLy8gVmFsdWVzIGNoYW5nZWQgb250byB0aGUgYXJndW1lbnRzIG9iamVjdCBzb21ldGltZXMgZW5kIHVwIGFzIHVuZGVmaW5lZCB2YWx1ZXMKCQkJCQkvLyBvdXRzaWRlIHRoZSAkLndoZW4gbWV0aG9kLiBDbG9uaW5nIHRoZSBvYmplY3QgaW50byBhIGZyZXNoIGFycmF5IHNvbHZlcyB0aGUgaXNzdWUKCQkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggZGVmZXJyZWQsIHNsaWNlRGVmZXJyZWQuY2FsbCggYXJncywgMCApICk7CgkJCQl9CgkJCX07CgkJfQoJCWlmICggbGVuZ3RoID4gMSApIHsKCQkJZm9yKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCWlmICggYXJnc1sgaSBdICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBhcmdzWyBpIF0ucHJvbWlzZSApICkgewoJCQkJCWFyZ3NbIGkgXS5wcm9taXNlKCkudGhlbiggcmVzb2x2ZUZ1bmMoaSksIGRlZmVycmVkLnJlamVjdCApOwoJCQkJfSBlbHNlIHsKCQkJCQktLWNvdW50OwoJCQkJfQoJCQl9CgkJCWlmICggIWNvdW50ICkgewoJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGRlZmVycmVkLCBhcmdzICk7CgkJCX0KCQl9IGVsc2UgaWYgKCBkZWZlcnJlZCAhPT0gZmlyc3RQYXJhbSApIHsKCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGRlZmVycmVkLCBsZW5ndGggPyBbIGZpcnN0UGFyYW0gXSA6IFtdICk7CgkJfQoJCXJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7Cgl9Cn0pOwoKCgpqUXVlcnkuc3VwcG9ydCA9IChmdW5jdGlvbigpIHsKCgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJYWxsLAoJCWEsCgkJc2VsZWN0LAoJCW9wdCwKCQlpbnB1dCwKCQltYXJnaW5EaXYsCgkJc3VwcG9ydCwKCQlmcmFnbWVudCwKCQlib2R5LAoJCXRlc3RFbGVtZW50UGFyZW50LAoJCXRlc3RFbGVtZW50LAoJCXRlc3RFbGVtZW50U3R5bGUsCgkJdGRzLAoJCWV2ZW50cywKCQlldmVudE5hbWUsCgkJaSwKCQlpc1N1cHBvcnRlZDsKCgkvLyBQcmVsaW1pbmFyeSB0ZXN0cwoJZGl2LnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwgInQiKTsKCWRpdi5pbm5lckhUTUwgPSAiICAgPGxpbms+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnIHN0eWxlPSd0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPWNoZWNrYm94PiI7CgoKCWFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICk7CglhID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAiYSIgKVsgMCBdOwoKCS8vIENhbid0IGdldCBiYXNpYyB0ZXN0IHN1cHBvcnQKCWlmICggIWFsbCB8fCAhYWxsLmxlbmd0aCB8fCAhYSApIHsKCQlyZXR1cm4ge307Cgl9CgoJLy8gRmlyc3QgYmF0Y2ggb2Ygc3VwcG9ydHMgdGVzdHMKCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICk7CglvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpICk7CglpbnB1dCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggImlucHV0IiApWyAwIF07CgoJc3VwcG9ydCA9IHsKCQkvLyBJRSBzdHJpcHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gLmlubmVySFRNTCBpcyB1c2VkCgkJbGVhZGluZ1doaXRlc3BhY2U6ICggZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDMgKSwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGJvZHkgZWxlbWVudHMgYXJlbid0IGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQKCQkvLyBJRSB3aWxsIGluc2VydCB0aGVtIGludG8gZW1wdHkgdGFibGVzCgkJdGJvZHk6ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJ0Ym9keSIgKS5sZW5ndGgsCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IGxpbmsgZWxlbWVudHMgZ2V0IHNlcmlhbGl6ZWQgY29ycmVjdGx5IGJ5IGlubmVySFRNTAoJCS8vIFRoaXMgcmVxdWlyZXMgYSB3cmFwcGVyIGVsZW1lbnQgaW4gSUUKCQlodG1sU2VyaWFsaXplOiAhIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggImxpbmsiICkubGVuZ3RoLAoKCQkvLyBHZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZyb20gZ2V0QXR0cmlidXRlCgkJLy8gKElFIHVzZXMgLmNzc1RleHQgaW5zdGVhZCkKCQlzdHlsZTogL3RvcC8udGVzdCggYS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgKSwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgVVJMcyBhcmVuJ3QgbWFuaXB1bGF0ZWQKCQkvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0KQoJCWhyZWZOb3JtYWxpemVkOiAoIGEuZ2V0QXR0cmlidXRlKCAiaHJlZiIgKSA9PT0gIi9hIiApLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBlbGVtZW50IG9wYWNpdHkgZXhpc3RzCgkJLy8gKElFIHVzZXMgZmlsdGVyIGluc3RlYWQpCgkJLy8gVXNlIGEgcmVnZXggdG8gd29yayBhcm91bmQgYSBXZWJLaXQgaXNzdWUuIFNlZSAjNTE0NQoJCW9wYWNpdHk6IC9eMC41NSQvLnRlc3QoIGEuc3R5bGUub3BhY2l0eSApLAoKCQkvLyBWZXJpZnkgc3R5bGUgZmxvYXQgZXhpc3RlbmNlCgkJLy8gKElFIHVzZXMgc3R5bGVGbG9hdCBpbnN0ZWFkIG9mIGNzc0Zsb2F0KQoJCWNzc0Zsb2F0OiAhIWEuc3R5bGUuY3NzRmxvYXQsCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCBmb3IgYSBjaGVja2JveAoJCS8vIHRoYXQgaXQgZGVmYXVsdHMgdG8gIm9uIi4KCQkvLyAoV2ViS2l0IGRlZmF1bHRzIHRvICIiIGluc3RlYWQpCgkJY2hlY2tPbjogKCBpbnB1dC52YWx1ZSA9PT0gIm9uIiApLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBhIHNlbGVjdGVkLWJ5LWRlZmF1bHQgb3B0aW9uIGhhcyBhIHdvcmtpbmcgc2VsZWN0ZWQgcHJvcGVydHkuCgkJLy8gKFdlYktpdCBkZWZhdWx0cyB0byBmYWxzZSBpbnN0ZWFkIG9mIHRydWUsIElFIHRvbywgaWYgaXQncyBpbiBhbiBvcHRncm91cCkKCQlvcHRTZWxlY3RlZDogb3B0LnNlbGVjdGVkLAoKCQkvLyBUZXN0IHNldEF0dHJpYnV0ZSBvbiBjYW1lbENhc2UgY2xhc3MuIElmIGl0IHdvcmtzLCB3ZSBuZWVkIGF0dHJGaXhlcyB3aGVuIGRvaW5nIGdldC9zZXRBdHRyaWJ1dGUgKGllNi83KQoJCWdldFNldEF0dHJpYnV0ZTogZGl2LmNsYXNzTmFtZSAhPT0gInQiLAoKCQkvLyBXaWxsIGJlIGRlZmluZWQgbGF0ZXIKCQlzdWJtaXRCdWJibGVzOiB0cnVlLAoJCWNoYW5nZUJ1YmJsZXM6IHRydWUsCgkJZm9jdXNpbkJ1YmJsZXM6IGZhbHNlLAoJCWRlbGV0ZUV4cGFuZG86IHRydWUsCgkJbm9DbG9uZUV2ZW50OiB0cnVlLAoJCWlubGluZUJsb2NrTmVlZHNMYXlvdXQ6IGZhbHNlLAoJCXNocmlua1dyYXBCbG9ja3M6IGZhbHNlLAoJCXJlbGlhYmxlTWFyZ2luUmlnaHQ6IHRydWUKCX07CgoJLy8gTWFrZSBzdXJlIGNoZWNrZWQgc3RhdHVzIGlzIHByb3Blcmx5IGNsb25lZAoJaW5wdXQuY2hlY2tlZCA9IHRydWU7CglzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gaW5wdXQuY2xvbmVOb2RlKCB0cnVlICkuY2hlY2tlZDsKCgkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgb3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmVuJ3QgbWFya2VkIGFzIGRpc2FibGVkCgkvLyAoV2ViS2l0IG1hcmtzIHRoZW0gYXMgZGlzYWJsZWQpCglzZWxlY3QuZGlzYWJsZWQgPSB0cnVlOwoJc3VwcG9ydC5vcHREaXNhYmxlZCA9ICFvcHQuZGlzYWJsZWQ7CgoJLy8gVGVzdCB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkZWxldGUgYW4gZXhwYW5kbyBmcm9tIGFuIGVsZW1lbnQKCS8vIEZhaWxzIGluIEludGVybmV0IEV4cGxvcmVyCgl0cnkgewoJCWRlbGV0ZSBkaXYudGVzdDsKCX0gY2F0Y2goIGUgKSB7CgkJc3VwcG9ydC5kZWxldGVFeHBhbmRvID0gZmFsc2U7Cgl9CgoJaWYgKCAhZGl2LmFkZEV2ZW50TGlzdGVuZXIgJiYgZGl2LmF0dGFjaEV2ZW50ICYmIGRpdi5maXJlRXZlbnQgKSB7CgkJZGl2LmF0dGFjaEV2ZW50KCAib25jbGljayIsIGZ1bmN0aW9uKCkgewoJCQkvLyBDbG9uaW5nIGEgbm9kZSBzaG91bGRuJ3QgY29weSBvdmVyIGFueQoJCQkvLyBib3VuZCBldmVudCBoYW5kbGVycyAoSUUgZG9lcyB0aGlzKQoJCQlzdXBwb3J0Lm5vQ2xvbmVFdmVudCA9IGZhbHNlOwoJCX0pOwoJCWRpdi5jbG9uZU5vZGUoIHRydWUgKS5maXJlRXZlbnQoICJvbmNsaWNrIiApOwoJfQoKCS8vIENoZWNrIGlmIGEgcmFkaW8gbWFpbnRhaW5zIGl0J3MgdmFsdWUKCS8vIGFmdGVyIGJlaW5nIGFwcGVuZGVkIHRvIHRoZSBET00KCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKCWlucHV0LnZhbHVlID0gInQiOwoJaW5wdXQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgInJhZGlvIik7CglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOwoKCWlucHV0LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsICJjaGVja2VkIik7CglkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICk7CglmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKCWZyYWdtZW50LmFwcGVuZENoaWxkKCBkaXYuZmlyc3RDaGlsZCApOwoKCS8vIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50cwoJc3VwcG9ydC5jaGVja0Nsb25lID0gZnJhZ21lbnQuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJZGl2LmlubmVySFRNTCA9ICIiOwoKCS8vIEZpZ3VyZSBvdXQgaWYgdGhlIFczQyBib3ggbW9kZWwgd29ya3MgYXMgZXhwZWN0ZWQKCWRpdi5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS5wYWRkaW5nTGVmdCA9ICIxcHgiOwoKCWJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImJvZHkiIClbIDAgXTsKCS8vIFdlIHVzZSBvdXIgb3duLCBpbnZpc2libGUsIGJvZHkgdW5sZXNzIHRoZSBib2R5IGlzIGFscmVhZHkgcHJlc2VudAoJLy8gaW4gd2hpY2ggY2FzZSB3ZSB1c2UgYSBkaXYgKCM5MjM5KQoJdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBib2R5ID8gImRpdiIgOiAiYm9keSIgKTsKCXRlc3RFbGVtZW50U3R5bGUgPSB7CgkJdmlzaWJpbGl0eTogImhpZGRlbiIsCgkJd2lkdGg6IDAsCgkJaGVpZ2h0OiAwLAoJCWJvcmRlcjogMCwKCQltYXJnaW46IDAsCgkJYmFja2dyb3VuZDogIm5vbmUiCgl9OwoJaWYgKCBib2R5ICkgewoJCWpRdWVyeS5leHRlbmQoIHRlc3RFbGVtZW50U3R5bGUsIHsKCQkJcG9zaXRpb246ICJhYnNvbHV0ZSIsCgkJCWxlZnQ6ICItMTAwMHB4IiwKCQkJdG9wOiAiLTEwMDBweCIKCQl9KTsKCX0KCWZvciAoIGkgaW4gdGVzdEVsZW1lbnRTdHlsZSApIHsKCQl0ZXN0RWxlbWVudC5zdHlsZVsgaSBdID0gdGVzdEVsZW1lbnRTdHlsZVsgaSBdOwoJfQoJdGVzdEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGRpdiApOwoJdGVzdEVsZW1lbnRQYXJlbnQgPSBib2R5IHx8IGRvY3VtZW50RWxlbWVudDsKCXRlc3RFbGVtZW50UGFyZW50Lmluc2VydEJlZm9yZSggdGVzdEVsZW1lbnQsIHRlc3RFbGVtZW50UGFyZW50LmZpcnN0Q2hpbGQgKTsKCgkvLyBDaGVjayBpZiBhIGRpc2Nvbm5lY3RlZCBjaGVja2JveCB3aWxsIHJldGFpbiBpdHMgY2hlY2tlZAoJLy8gdmFsdWUgb2YgdHJ1ZSBhZnRlciBhcHBlbmRlZCB0byB0aGUgRE9NIChJRTYvNykKCXN1cHBvcnQuYXBwZW5kQ2hlY2tlZCA9IGlucHV0LmNoZWNrZWQ7CgoJc3VwcG9ydC5ib3hNb2RlbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMjsKCglpZiAoICJ6b29tIiBpbiBkaXYuc3R5bGUgKSB7CgkJLy8gQ2hlY2sgaWYgbmF0aXZlbHkgYmxvY2stbGV2ZWwgZWxlbWVudHMgYWN0IGxpa2UgaW5saW5lLWJsb2NrCgkJLy8gZWxlbWVudHMgd2hlbiBzZXR0aW5nIHRoZWlyIGRpc3BsYXkgdG8gJ2lubGluZScgYW5kIGdpdmluZwoJCS8vIHRoZW0gbGF5b3V0CgkJLy8gKElFIDwgOCBkb2VzIHRoaXMpCgkJZGl2LnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKCQlkaXYuc3R5bGUuem9vbSA9IDE7CgkJc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0ID0gKCBkaXYub2Zmc2V0V2lkdGggPT09IDIgKTsKCgkJLy8gQ2hlY2sgaWYgZWxlbWVudHMgd2l0aCBsYXlvdXQgc2hyaW5rLXdyYXAgdGhlaXIgY2hpbGRyZW4KCQkvLyAoSUUgNiBkb2VzIHRoaXMpCgkJZGl2LnN0eWxlLmRpc3BsYXkgPSAiIjsKCQlkaXYuaW5uZXJIVE1MID0gIjxkaXYgc3R5bGU9J3dpZHRoOjRweDsnPjwvZGl2PiI7CgkJc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzID0gKCBkaXYub2Zmc2V0V2lkdGggIT09IDIgKTsKCX0KCglkaXYuaW5uZXJIVE1MID0gIjx0YWJsZT48dHI+PHRkIHN0eWxlPSdwYWRkaW5nOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lJz48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IjsKCXRkcyA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggInRkIiApOwoKCS8vIENoZWNrIGlmIHRhYmxlIGNlbGxzIHN0aWxsIGhhdmUgb2Zmc2V0V2lkdGgvSGVpZ2h0IHdoZW4gdGhleSBhcmUgc2V0CgkvLyB0byBkaXNwbGF5Om5vbmUgYW5kIHRoZXJlIGFyZSBzdGlsbCBvdGhlciB2aXNpYmxlIHRhYmxlIGNlbGxzIGluIGEKCS8vIHRhYmxlIHJvdzsgaWYgc28sIG9mZnNldFdpZHRoL0hlaWdodCBhcmUgbm90IHJlbGlhYmxlIGZvciB1c2Ugd2hlbgoJLy8gZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBoYXMgYmVlbiBoaWRkZW4gZGlyZWN0bHkgdXNpbmcKCS8vIGRpc3BsYXk6bm9uZSAoaXQgaXMgc3RpbGwgc2FmZSB0byB1c2Ugb2Zmc2V0cyBpZiBhIHBhcmVudCBlbGVtZW50IGlzCgkvLyBoaWRkZW47IGRvbiBzYWZldHkgZ29nZ2xlcyBhbmQgc2VlIGJ1ZyAjNDUxMiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCgkvLyAob25seSBJRSA4IGZhaWxzIHRoaXMgdGVzdCkKCWlzU3VwcG9ydGVkID0gKCB0ZHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDAgKTsKCgl0ZHNbIDAgXS5zdHlsZS5kaXNwbGF5ID0gIiI7Cgl0ZHNbIDEgXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoKCS8vIENoZWNrIGlmIGVtcHR5IHRhYmxlIGNlbGxzIHN0aWxsIGhhdmUgb2Zmc2V0V2lkdGgvSGVpZ2h0CgkvLyAoSUUgPCA4IGZhaWwgdGhpcyB0ZXN0KQoJc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgPSBpc1N1cHBvcnRlZCAmJiAoIHRkc1sgMCBdLm9mZnNldEhlaWdodCA9PT0gMCApOwoJZGl2LmlubmVySFRNTCA9ICIiOwoKCS8vIENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHkKCS8vIGdldHMgY29tcHV0ZWQgbWFyZ2luLXJpZ2h0IGJhc2VkIG9uIHdpZHRoIG9mIGNvbnRhaW5lci4gRm9yIG1vcmUKCS8vIGluZm8gc2VlIGJ1ZyAjMzMzMwoJLy8gRmFpbHMgaW4gV2ViS2l0IGJlZm9yZSBGZWIgMjAxMSBuaWdodGxpZXMKCS8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAoJaWYgKCBkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlICkgewoJCW1hcmdpbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICk7CgkJbWFyZ2luRGl2LnN0eWxlLndpZHRoID0gIjAiOwoJCW1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9ICIwIjsKCQlkaXYuYXBwZW5kQ2hpbGQoIG1hcmdpbkRpdiApOwoJCXN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCA9CgkJCSggcGFyc2VJbnQoICggZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggbWFyZ2luRGl2LCBudWxsICkgfHwgeyBtYXJnaW5SaWdodDogMCB9ICkubWFyZ2luUmlnaHQsIDEwICkgfHwgMCApID09PSAwOwoJfQoKCS8vIFJlbW92ZSB0aGUgYm9keSBlbGVtZW50IHdlIGFkZGVkCgl0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSAiIjsKCXRlc3RFbGVtZW50UGFyZW50LnJlbW92ZUNoaWxkKCB0ZXN0RWxlbWVudCApOwoKCS8vIFRlY2huaXF1ZSBmcm9tIEp1cml5IFpheXRzZXYKCS8vIGh0dHA6Ly90aGlua3dlYjIuY29tL3Byb2plY3RzL3Byb3RvdHlwZS9kZXRlY3RpbmctZXZlbnQtc3VwcG9ydC13aXRob3V0LWJyb3dzZXItc25pZmZpbmcvCgkvLyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGNhc2Ugd2hlcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHN5c3RlbXMKCS8vIGFyZSB1c2VkLCBuYW1lbHkgaW4gSUUuIFNob3J0LWNpcmN1aXRpbmcgaGVyZSBoZWxwcyB1cyB0bwoJLy8gYXZvaWQgYW4gZXZhbCBjYWxsIChpbiBzZXRBdHRyaWJ1dGUpIHdoaWNoIGNhbiBjYXVzZSBDU1AKCS8vIHRvIGdvIGhheXdpcmUuIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vU2VjdXJpdHkvQ1NQCglpZiAoIGRpdi5hdHRhY2hFdmVudCApIHsKCQlmb3IoIGkgaW4gewoJCQlzdWJtaXQ6IDEsCgkJCWNoYW5nZTogMSwKCQkJZm9jdXNpbjogMQoJCX0gKSB7CgkJCWV2ZW50TmFtZSA9ICJvbiIgKyBpOwoJCQlpc1N1cHBvcnRlZCA9ICggZXZlbnROYW1lIGluIGRpdiApOwoJCQlpZiAoICFpc1N1cHBvcnRlZCApIHsKCQkJCWRpdi5zZXRBdHRyaWJ1dGUoIGV2ZW50TmFtZSwgInJldHVybjsiICk7CgkJCQlpc1N1cHBvcnRlZCA9ICggdHlwZW9mIGRpdlsgZXZlbnROYW1lIF0gPT09ICJmdW5jdGlvbiIgKTsKCQkJfQoJCQlzdXBwb3J0WyBpICsgIkJ1YmJsZXMiIF0gPSBpc1N1cHBvcnRlZDsKCQl9Cgl9CgoJLy8gTnVsbCBjb25uZWN0ZWQgZWxlbWVudHMgdG8gYXZvaWQgbGVha3MgaW4gSUUKCXRlc3RFbGVtZW50ID0gZnJhZ21lbnQgPSBzZWxlY3QgPSBvcHQgPSBib2R5ID0gbWFyZ2luRGl2ID0gZGl2ID0gaW5wdXQgPSBudWxsOwoKCXJldHVybiBzdXBwb3J0Owp9KSgpOwoKLy8gS2VlcCB0cmFjayBvZiBib3hNb2RlbApqUXVlcnkuYm94TW9kZWwgPSBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbDsKCgoKCnZhciByYnJhY2UgPSAvXig/Olx7LipcfXxcWy4qXF0pJC8sCglybXVsdGlEYXNoID0gLyhbYS16XSkoW0EtWl0pL2c7CgpqUXVlcnkuZXh0ZW5kKHsKCWNhY2hlOiB7fSwKCgkvLyBQbGVhc2UgdXNlIHdpdGggY2F1dGlvbgoJdXVpZDogMCwKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCS8vIE5vbi1kaWdpdHMgcmVtb3ZlZCB0byBtYXRjaCByaW5saW5lalF1ZXJ5CglleHBhbmRvOiAialF1ZXJ5IiArICggalF1ZXJ5LmZuLmpxdWVyeSArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXEQvZywgIiIgKSwKCgkvLyBUaGUgZm9sbG93aW5nIGVsZW1lbnRzIHRocm93IHVuY2F0Y2hhYmxlIGV4Y2VwdGlvbnMgaWYgeW91CgkvLyBhdHRlbXB0IHRvIGFkZCBleHBhbmRvIHByb3BlcnRpZXMgdG8gdGhlbS4KCW5vRGF0YTogewoJCSJlbWJlZCI6IHRydWUsCgkJLy8gQmFuIGFsbCBvYmplY3RzIGV4Y2VwdCBmb3IgRmxhc2ggKHdoaWNoIGhhbmRsZSBleHBhbmRvcykKCQkib2JqZWN0IjogImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsCgkJImFwcGxldCI6IHRydWUKCX0sCgoJaGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CgkJZWxlbSA9IGVsZW0ubm9kZVR5cGUgPyBqUXVlcnkuY2FjaGVbIGVsZW1balF1ZXJ5LmV4cGFuZG9dIF0gOiBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdOwoKCQlyZXR1cm4gISFlbGVtICYmICFpc0VtcHR5RGF0YU9iamVjdCggZWxlbSApOwoJfSwKCglkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSwgcHZ0IC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgewoJCWlmICggIWpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciB0aGlzQ2FjaGUsIHJldCwKCQkJaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKCQkJZ2V0QnlOYW1lID0gdHlwZW9mIG5hbWUgPT09ICJzdHJpbmciLAoKCQkJLy8gV2UgaGF2ZSB0byBoYW5kbGUgRE9NIG5vZGVzIGFuZCBKUyBvYmplY3RzIGRpZmZlcmVudGx5IGJlY2F1c2UgSUU2LTcKCQkJLy8gY2FuJ3QgR0Mgb2JqZWN0IHJlZmVyZW5jZXMgcHJvcGVybHkgYWNyb3NzIHRoZSBET00tSlMgYm91bmRhcnkKCQkJaXNOb2RlID0gZWxlbS5ub2RlVHlwZSwKCgkJCS8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgdGhlIGdsb2JhbCBqUXVlcnkgY2FjaGU7IEpTIG9iamVjdCBkYXRhIGlzCgkJCS8vIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBvYmplY3Qgc28gR0MgY2FuIG9jY3VyIGF1dG9tYXRpY2FsbHkKCQkJY2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLAoKCQkJLy8gT25seSBkZWZpbmluZyBhbiBJRCBmb3IgSlMgb2JqZWN0cyBpZiBpdHMgY2FjaGUgYWxyZWFkeSBleGlzdHMgYWxsb3dzCgkJCS8vIHRoZSBjb2RlIHRvIHNob3J0Y3V0IG9uIHRoZSBzYW1lIHBhdGggYXMgYSBET00gbm9kZSB3aXRoIG5vIGNhY2hlCgkJCWlkID0gaXNOb2RlID8gZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXSA6IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gJiYgalF1ZXJ5LmV4cGFuZG87CgoJCS8vIEF2b2lkIGRvaW5nIGFueSBtb3JlIHdvcmsgdGhhbiB3ZSBuZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFuCgkJLy8gb2JqZWN0IHRoYXQgaGFzIG5vIGRhdGEgYXQgYWxsCgkJaWYgKCAoIWlkIHx8IChwdnQgJiYgaWQgJiYgKGNhY2hlWyBpZCBdICYmICFjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSkpKSAmJiBnZXRCeU5hbWUgJiYgZGF0YSA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoICFpZCApIHsKCQkJLy8gT25seSBET00gbm9kZXMgbmVlZCBhIG5ldyB1bmlxdWUgSUQgZm9yIGVhY2ggZWxlbWVudCBzaW5jZSB0aGVpciBkYXRhCgkJCS8vIGVuZHMgdXAgaW4gdGhlIGdsb2JhbCBjYWNoZQoJCQlpZiAoIGlzTm9kZSApIHsKCQkJCWVsZW1bIGpRdWVyeS5leHBhbmRvIF0gPSBpZCA9ICsralF1ZXJ5LnV1aWQ7CgkJCX0gZWxzZSB7CgkJCQlpZCA9IGpRdWVyeS5leHBhbmRvOwoJCQl9CgkJfQoKCQlpZiAoICFjYWNoZVsgaWQgXSApIHsKCQkJY2FjaGVbIGlkIF0gPSB7fTsKCgkJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gQXZvaWRzIGV4cG9zaW5nIGpRdWVyeQoJCQkvLyBtZXRhZGF0YSBvbiBwbGFpbiBKUyBvYmplY3RzIHdoZW4gdGhlIG9iamVjdCBpcyBzZXJpYWxpemVkIHVzaW5nCgkJCS8vIEpTT04uc3RyaW5naWZ5CgkJCWlmICggIWlzTm9kZSApIHsKCQkJCWNhY2hlWyBpZCBdLnRvSlNPTiA9IGpRdWVyeS5ub29wOwoJCQl9CgkJfQoKCQkvLyBBbiBvYmplY3QgY2FuIGJlIHBhc3NlZCB0byBqUXVlcnkuZGF0YSBpbnN0ZWFkIG9mIGEga2V5L3ZhbHVlIHBhaXI7IHRoaXMgZ2V0cwoJCS8vIHNoYWxsb3cgY29waWVkIG92ZXIgb250byB0aGUgZXhpc3RpbmcgY2FjaGUKCQlpZiAoIHR5cGVvZiBuYW1lID09PSAib2JqZWN0IiB8fCB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiApIHsKCQkJaWYgKCBwdnQgKSB7CgkJCQljYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSA9IGpRdWVyeS5leHRlbmQoY2FjaGVbIGlkIF1bIGludGVybmFsS2V5IF0sIG5hbWUpOwoJCQl9IGVsc2UgewoJCQkJY2FjaGVbIGlkIF0gPSBqUXVlcnkuZXh0ZW5kKGNhY2hlWyBpZCBdLCBuYW1lKTsKCQkJfQoJCX0KCgkJdGhpc0NhY2hlID0gY2FjaGVbIGlkIF07CgoJCS8vIEludGVybmFsIGpRdWVyeSBkYXRhIGlzIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG9iamVjdCBpbnNpZGUgdGhlIG9iamVjdCdzIGRhdGEKCQkvLyBjYWNoZSBpbiBvcmRlciB0byBhdm9pZCBrZXkgY29sbGlzaW9ucyBiZXR3ZWVuIGludGVybmFsIGRhdGEgYW5kIHVzZXItZGVmaW5lZAoJCS8vIGRhdGEKCQlpZiAoIHB2dCApIHsKCQkJaWYgKCAhdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdICkgewoJCQkJdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdID0ge307CgkJCX0KCgkJCXRoaXNDYWNoZSA9IHRoaXNDYWNoZVsgaW50ZXJuYWxLZXkgXTsKCQl9CgoJCWlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkgewoJCQl0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdID0gZGF0YTsKCQl9CgoJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gSXQgd2lsbCBiZSByZW1vdmVkIGluIDEuNi4gVXNlcnMgc2hvdWxkCgkJLy8gbm90IGF0dGVtcHQgdG8gaW5zcGVjdCB0aGUgaW50ZXJuYWwgZXZlbnRzIG9iamVjdCB1c2luZyBqUXVlcnkuZGF0YSwgYXMgdGhpcwoJCS8vIGludGVybmFsIGRhdGEgb2JqZWN0IGlzIHVuZG9jdW1lbnRlZCBhbmQgc3ViamVjdCB0byBjaGFuZ2UuCgkJaWYgKCBuYW1lID09PSAiZXZlbnRzIiAmJiAhdGhpc0NhY2hlW25hbWVdICkgewoJCQlyZXR1cm4gdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdICYmIHRoaXNDYWNoZVsgaW50ZXJuYWxLZXkgXS5ldmVudHM7CgkJfQoKCQkvLyBDaGVjayBmb3IgYm90aCBjb252ZXJ0ZWQtdG8tY2FtZWwgYW5kIG5vbi1jb252ZXJ0ZWQgZGF0YSBwcm9wZXJ0eSBuYW1lcwoJCS8vIElmIGEgZGF0YSBwcm9wZXJ0eSB3YXMgc3BlY2lmaWVkCgkJaWYgKCBnZXRCeU5hbWUgKSB7CgoJCQkvLyBGaXJzdCBUcnkgdG8gZmluZCBhcy1pcyBwcm9wZXJ0eSBkYXRhCgkJCXJldCA9IHRoaXNDYWNoZVsgbmFtZSBdOwoKCQkJLy8gVGVzdCBmb3IgbnVsbHx1bmRlZmluZWQgcHJvcGVydHkgZGF0YQoJCQlpZiAoIHJldCA9PSBudWxsICkgewoKCQkJCS8vIFRyeSB0byBmaW5kIHRoZSBjYW1lbENhc2VkIHByb3BlcnR5CgkJCQlyZXQgPSB0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdOwoJCQl9CgkJfSBlbHNlIHsKCQkJcmV0ID0gdGhpc0NhY2hlOwoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHB2dCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsKCQlpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgdGhpc0NhY2hlLAoKCQkJLy8gUmVmZXJlbmNlIHRvIGludGVybmFsIGRhdGEgY2FjaGUga2V5CgkJCWludGVybmFsS2V5ID0galF1ZXJ5LmV4cGFuZG8sCgoJCQlpc05vZGUgPSBlbGVtLm5vZGVUeXBlLAoKCQkJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uCgkJCWNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSwKCgkJCS8vIFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZvcm1hdGlvbgoJCQlpZCA9IGlzTm9kZSA/IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gOiBqUXVlcnkuZXhwYW5kbzsKCgkJLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBubyBjYWNoZSBlbnRyeSBmb3IgdGhpcyBvYmplY3QsIHRoZXJlIGlzIG5vCgkJLy8gcHVycG9zZSBpbiBjb250aW51aW5nCgkJaWYgKCAhY2FjaGVbIGlkIF0gKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggbmFtZSApIHsKCgkJCXRoaXNDYWNoZSA9IHB2dCA/IGNhY2hlWyBpZCBdWyBpbnRlcm5hbEtleSBdIDogY2FjaGVbIGlkIF07CgoJCQlpZiAoIHRoaXNDYWNoZSApIHsKCgkJCQkvLyBTdXBwb3J0IGludGVyb3BlcmFibGUgcmVtb3ZhbCBvZiBoeXBoZW5hdGVkIG9yIGNhbWVsY2FzZWQga2V5cwoJCQkJaWYgKCAhdGhpc0NhY2hlWyBuYW1lIF0gKSB7CgkJCQkJbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKTsKCQkJCX0KCgkJCQlkZWxldGUgdGhpc0NhY2hlWyBuYW1lIF07CgoJCQkJLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSBsZWZ0IGluIHRoZSBjYWNoZSwgd2Ugd2FudCB0byBjb250aW51ZQoJCQkJLy8gYW5kIGxldCB0aGUgY2FjaGUgb2JqZWN0IGl0c2VsZiBnZXQgZGVzdHJveWVkCgkJCQlpZiAoICFpc0VtcHR5RGF0YU9iamVjdCh0aGlzQ2FjaGUpICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uCgkJaWYgKCBwdnQgKSB7CgkJCWRlbGV0ZSBjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXTsKCgkJCS8vIERvbid0IGRlc3Ryb3kgdGhlIHBhcmVudCBjYWNoZSB1bmxlc3MgdGhlIGludGVybmFsIGRhdGEgb2JqZWN0CgkJCS8vIGhhZCBiZWVuIHRoZSBvbmx5IHRoaW5nIGxlZnQgaW4gaXQKCQkJaWYgKCAhaXNFbXB0eURhdGFPYmplY3QoY2FjaGVbIGlkIF0pICkgewoJCQkJcmV0dXJuOwoJCQl9CgkJfQoKCQl2YXIgaW50ZXJuYWxDYWNoZSA9IGNhY2hlWyBpZCBdWyBpbnRlcm5hbEtleSBdOwoKCQkvLyBCcm93c2VycyB0aGF0IGZhaWwgZXhwYW5kbyBkZWxldGlvbiBhbHNvIHJlZnVzZSB0byBkZWxldGUgZXhwYW5kb3Mgb24KCQkvLyB0aGUgd2luZG93LCBidXQgaXQgd2lsbCBhbGxvdyBpdCBvbiBhbGwgb3RoZXIgSlMgb2JqZWN0czsgb3RoZXIgYnJvd3NlcnMKCQkvLyBkb24ndCBjYXJlCgkJLy8gRW5zdXJlIHRoYXQgYGNhY2hlYCBpcyBub3QgYSB3aW5kb3cgb2JqZWN0ICMxMDA4MAoJCWlmICggalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8fCAhY2FjaGUuc2V0SW50ZXJ2YWwgKSB7CgkJCWRlbGV0ZSBjYWNoZVsgaWQgXTsKCQl9IGVsc2UgewoJCQljYWNoZVsgaWQgXSA9IG51bGw7CgkJfQoKCQkvLyBXZSBkZXN0cm95ZWQgdGhlIGVudGlyZSB1c2VyIGNhY2hlIGF0IG9uY2UgYmVjYXVzZSBpdCdzIGZhc3RlciB0aGFuCgkJLy8gaXRlcmF0aW5nIHRocm91Z2ggZWFjaCBrZXksIGJ1dCB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRvIHBlcnNpc3QgaW50ZXJuYWwKCQkvLyBkYXRhIGlmIGl0IGV4aXN0ZWQKCQlpZiAoIGludGVybmFsQ2FjaGUgKSB7CgkJCWNhY2hlWyBpZCBdID0ge307CgkJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gQXZvaWRzIGV4cG9zaW5nIGpRdWVyeQoJCQkvLyBtZXRhZGF0YSBvbiBwbGFpbiBKUyBvYmplY3RzIHdoZW4gdGhlIG9iamVjdCBpcyBzZXJpYWxpemVkIHVzaW5nCgkJCS8vIEpTT04uc3RyaW5naWZ5CgkJCWlmICggIWlzTm9kZSApIHsKCQkJCWNhY2hlWyBpZCBdLnRvSlNPTiA9IGpRdWVyeS5ub29wOwoJCQl9CgoJCQljYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSA9IGludGVybmFsQ2FjaGU7CgoJCS8vIE90aGVyd2lzZSwgd2UgbmVlZCB0byBlbGltaW5hdGUgdGhlIGV4cGFuZG8gb24gdGhlIG5vZGUgdG8gYXZvaWQKCQkvLyBmYWxzZSBsb29rdXBzIGluIHRoZSBjYWNoZSBmb3IgZW50cmllcyB0aGF0IG5vIGxvbmdlciBleGlzdAoJCX0gZWxzZSBpZiAoIGlzTm9kZSApIHsKCQkJLy8gSUUgZG9lcyBub3QgYWxsb3cgdXMgdG8gZGVsZXRlIGV4cGFuZG8gcHJvcGVydGllcyBmcm9tIG5vZGVzLAoJCQkvLyBub3IgZG9lcyBpdCBoYXZlIGEgcmVtb3ZlQXR0cmlidXRlIGZ1bmN0aW9uIG9uIERvY3VtZW50IG5vZGVzOwoJCQkvLyB3ZSBtdXN0IGhhbmRsZSBhbGwgb2YgdGhlc2UgY2FzZXMKCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5kZWxldGVFeHBhbmRvICkgewoJCQkJZGVsZXRlIGVsZW1bIGpRdWVyeS5leHBhbmRvIF07CgkJCX0gZWxzZSBpZiAoIGVsZW0ucmVtb3ZlQXR0cmlidXRlICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGpRdWVyeS5leHBhbmRvICk7CgkJCX0gZWxzZSB7CgkJCQllbGVtWyBqUXVlcnkuZXhwYW5kbyBdID0gbnVsbDsKCQkJfQoJCX0KCX0sCgoJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBqUXVlcnkuZGF0YSggZWxlbSwgbmFtZSwgZGF0YSwgdHJ1ZSApOwoJfSwKCgkvLyBBIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBET00gbm9kZSBjYW4gaGFuZGxlIHRoZSBkYXRhIGV4cGFuZG8KCWFjY2VwdERhdGE6IGZ1bmN0aW9uKCBlbGVtICkgewoJCWlmICggZWxlbS5ub2RlTmFtZSApIHsKCQkJdmFyIG1hdGNoID0galF1ZXJ5Lm5vRGF0YVsgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQlpZiAoIG1hdGNoICkgewoJCQkJcmV0dXJuICEobWF0Y2ggPT09IHRydWUgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKSAhPT0gbWF0Y2gpOwoJCQl9CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXZhciBkYXRhID0gbnVsbDsKCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAidW5kZWZpbmVkIiApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSApOwoKCQkJCWlmICggdGhpc1swXS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJICAgIHZhciBhdHRyID0gdGhpc1swXS5hdHRyaWJ1dGVzLCBuYW1lOwoJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGF0dHIubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCQluYW1lID0gYXR0cltpXS5uYW1lOwoKCQkJCQkJaWYgKCBuYW1lLmluZGV4T2YoICJkYXRhLSIgKSA9PT0gMCApIHsKCQkJCQkJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lLnN1YnN0cmluZyg1KSApOwoKCQkJCQkJCWRhdGFBdHRyKCB0aGlzWzBdLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgoJCX0gZWxzZSBpZiAoIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSApOwoJCQl9KTsKCQl9CgoJCXZhciBwYXJ0cyA9IGtleS5zcGxpdCgiLiIpOwoJCXBhcnRzWzFdID0gcGFydHNbMV0gPyAiLiIgKyBwYXJ0c1sxXSA6ICIiOwoKCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCWRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsKCgkJCS8vIFRyeSB0byBmZXRjaCBhbnkgaW50ZXJuYWxseSBzdG9yZWQgZGF0YSBmaXJzdAoJCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSwga2V5ICk7CgkJCQlkYXRhID0gZGF0YUF0dHIoIHRoaXNbMF0sIGtleSwgZGF0YSApOwoJCQl9CgoJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8KCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6CgkJCQlkYXRhOwoKCQl9IGVsc2UgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyICR0aGlzID0galF1ZXJ5KCB0aGlzICksCgkJCQkJYXJncyA9IFsgcGFydHNbMF0sIHZhbHVlIF07CgoJCQkJJHRoaXMudHJpZ2dlckhhbmRsZXIoICJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBhcmdzICk7CgkJCQlqUXVlcnkuZGF0YSggdGhpcywga2V5LCB2YWx1ZSApOwoJCQkJJHRoaXMudHJpZ2dlckhhbmRsZXIoICJjaGFuZ2VEYXRhIiArIHBhcnRzWzFdICsgIiEiLCBhcmdzICk7CgkJCX0pOwoJCX0KCX0sCgoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywga2V5ICk7CgkJfSk7Cgl9Cn0pOwoKZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKCS8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnkKCS8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZQoJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQl2YXIgbmFtZSA9ICJkYXRhLSIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgIiQxLSQyIiApLnRvTG93ZXJDYXNlKCk7CgoJCWRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOwoKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCQkJdHJ5IHsKCQkJCWRhdGEgPSBkYXRhID09PSAidHJ1ZSIgPyB0cnVlIDoKCQkJCWRhdGEgPT09ICJmYWxzZSIgPyBmYWxzZSA6CgkJCQlkYXRhID09PSAibnVsbCIgPyBudWxsIDoKCQkJCSFqUXVlcnkuaXNOYU4oIGRhdGEgKSA/IHBhcnNlRmxvYXQoIGRhdGEgKSA6CgkJCQkJcmJyYWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVyeS5wYXJzZUpTT04oIGRhdGEgKSA6CgkJCQkJZGF0YTsKCQkJfSBjYXRjaCggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJalF1ZXJ5LmRhdGEoIGVsZW0sIGtleSwgZGF0YSApOwoKCQl9IGVsc2UgewoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCX0KCglyZXR1cm4gZGF0YTsKfQoKLy8gVE9ETzogVGhpcyBpcyBhIGhhY2sgZm9yIDEuNSBPTkxZIHRvIGFsbG93IG9iamVjdHMgd2l0aCBhIHNpbmdsZSB0b0pTT04KLy8gcHJvcGVydHkgdG8gYmUgY29uc2lkZXJlZCBlbXB0eSBvYmplY3RzOyB0aGlzIHByb3BlcnR5IGFsd2F5cyBleGlzdHMgaW4KLy8gb3JkZXIgdG8gbWFrZSBzdXJlIEpTT04uc3RyaW5naWZ5IGRvZXMgbm90IGV4cG9zZSBpbnRlcm5hbCBtZXRhZGF0YQpmdW5jdGlvbiBpc0VtcHR5RGF0YU9iamVjdCggb2JqICkgewoJZm9yICggdmFyIG5hbWUgaW4gb2JqICkgewoJCWlmICggbmFtZSAhPT0gInRvSlNPTiIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJcmV0dXJuIHRydWU7Cn0KCgoKCmZ1bmN0aW9uIGhhbmRsZVF1ZXVlTWFya0RlZmVyKCBlbGVtLCB0eXBlLCBzcmMgKSB7Cgl2YXIgZGVmZXJEYXRhS2V5ID0gdHlwZSArICJkZWZlciIsCgkJcXVldWVEYXRhS2V5ID0gdHlwZSArICJxdWV1ZSIsCgkJbWFya0RhdGFLZXkgPSB0eXBlICsgIm1hcmsiLAoJCWRlZmVyID0galF1ZXJ5LmRhdGEoIGVsZW0sIGRlZmVyRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICk7CglpZiAoIGRlZmVyICYmCgkJKCBzcmMgPT09ICJxdWV1ZSIgfHwgIWpRdWVyeS5kYXRhKCBlbGVtLCBxdWV1ZURhdGFLZXksIHVuZGVmaW5lZCwgdHJ1ZSApICkgJiYKCQkoIHNyYyA9PT0gIm1hcmsiIHx8ICFqUXVlcnkuZGF0YSggZWxlbSwgbWFya0RhdGFLZXksIHVuZGVmaW5lZCwgdHJ1ZSApICkgKSB7CgkJLy8gR2l2ZSByb29tIGZvciBoYXJkLWNvZGVkIGNhbGxiYWNrcyB0byBmaXJlIGZpcnN0CgkJLy8gYW5kIGV2ZW50dWFsbHkgbWFyay9xdWV1ZSBzb21ldGhpbmcgZWxzZSBvbiB0aGUgZWxlbWVudAoJCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQlpZiAoICFqUXVlcnkuZGF0YSggZWxlbSwgcXVldWVEYXRhS2V5LCB1bmRlZmluZWQsIHRydWUgKSAmJgoJCQkJIWpRdWVyeS5kYXRhKCBlbGVtLCBtYXJrRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgKSB7CgkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgZGVmZXJEYXRhS2V5LCB0cnVlICk7CgkJCQlkZWZlci5yZXNvbHZlKCk7CgkJCX0KCQl9LCAwICk7Cgl9Cn0KCmpRdWVyeS5leHRlbmQoewoKCV9tYXJrOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQlpZiAoIGVsZW0gKSB7CgkJCXR5cGUgPSAodHlwZSB8fCAiZngiKSArICJtYXJrIjsKCQkJalF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUsIChqUXVlcnkuZGF0YShlbGVtLHR5cGUsdW5kZWZpbmVkLHRydWUpIHx8IDApICsgMSwgdHJ1ZSApOwoJCX0KCX0sCgoJX3VubWFyazogZnVuY3Rpb24oIGZvcmNlLCBlbGVtLCB0eXBlICkgewoJCWlmICggZm9yY2UgIT09IHRydWUgKSB7CgkJCXR5cGUgPSBlbGVtOwoJCQllbGVtID0gZm9yY2U7CgkJCWZvcmNlID0gZmFsc2U7CgkJfQoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCQkJdmFyIGtleSA9IHR5cGUgKyAibWFyayIsCgkJCQljb3VudCA9IGZvcmNlID8gMCA6ICggKGpRdWVyeS5kYXRhKCBlbGVtLCBrZXksIHVuZGVmaW5lZCwgdHJ1ZSkgfHwgMSApIC0gMSApOwoJCQlpZiAoIGNvdW50ICkgewoJCQkJalF1ZXJ5LmRhdGEoIGVsZW0sIGtleSwgY291bnQsIHRydWUgKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCBrZXksIHRydWUgKTsKCQkJCWhhbmRsZVF1ZXVlTWFya0RlZmVyKCBlbGVtLCB0eXBlLCAibWFyayIgKTsKCQkJfQoJCX0KCX0sCgoJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICh0eXBlIHx8ICJmeCIpICsgInF1ZXVlIjsKCQkJdmFyIHEgPSBqUXVlcnkuZGF0YSggZWxlbSwgdHlwZSwgdW5kZWZpbmVkLCB0cnVlICk7CgkJCS8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXAKCQkJaWYgKCBkYXRhICkgewoJCQkJaWYgKCAhcSB8fCBqUXVlcnkuaXNBcnJheShkYXRhKSApIHsKCQkJCQlxID0galF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSksIHRydWUgKTsKCQkJCX0gZWxzZSB7CgkJCQkJcS5wdXNoKCBkYXRhICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHEgfHwgW107CgkJfQoJfSwKCglkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl0eXBlID0gdHlwZSB8fCAiZngiOwoKCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwKCQkJZm4gPSBxdWV1ZS5zaGlmdCgpLAoJCQlkZWZlcjsKCgkJLy8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbAoJCWlmICggZm4gPT09ICJpbnByb2dyZXNzIiApIHsKCQkJZm4gPSBxdWV1ZS5zaGlmdCgpOwoJCX0KCgkJaWYgKCBmbiApIHsKCQkJLy8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZwoJCQkvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkCgkJCWlmICggdHlwZSA9PT0gImZ4IiApIHsKCQkJCXF1ZXVlLnVuc2hpZnQoImlucHJvZ3Jlc3MiKTsKCQkJfQoKCQkJZm4uY2FsbChlbGVtLCBmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKGVsZW0sIHR5cGUpOwoJCQl9KTsKCQl9CgoJCWlmICggIXF1ZXVlLmxlbmd0aCApIHsKCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIHR5cGUgKyAicXVldWUiLCB0cnVlICk7CgkJCWhhbmRsZVF1ZXVlTWFya0RlZmVyKCBlbGVtLCB0eXBlLCAicXVldWUiICk7CgkJfQoJfQp9KTsKCmpRdWVyeS5mbi5leHRlbmQoewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewoJCQlkYXRhID0gdHlwZTsKCQkJdHlwZSA9ICJmeCI7CgkJfQoKCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOwoJCX0KCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCWlmICggdHlwZSA9PT0gImZ4IiAmJiBxdWV1ZVswXSAhPT0gImlucHJvZ3Jlc3MiICkgewoJCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKCQkJfQoJCX0pOwoJfSwKCWRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSk7Cgl9LAoJLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLgoJLy8gaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5LwoJZGVsYXk6IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgewoJCXRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzW3RpbWVdIHx8IHRpbWUgOiB0aW1lOwoJCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbigpIHsKCQkJdmFyIGVsZW0gPSB0aGlzOwoJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTsKCQkJfSwgdGltZSApOwoJCX0pOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoJLy8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZQoJLy8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpCglwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqZWN0ICkgewoJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewoJCQlvYmplY3QgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQl0eXBlID0gdHlwZSB8fCAiZngiOwoJCXZhciBkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLAoJCQllbGVtZW50cyA9IHRoaXMsCgkJCWkgPSBlbGVtZW50cy5sZW5ndGgsCgkJCWNvdW50ID0gMSwKCQkJZGVmZXJEYXRhS2V5ID0gdHlwZSArICJkZWZlciIsCgkJCXF1ZXVlRGF0YUtleSA9IHR5cGUgKyAicXVldWUiLAoJCQltYXJrRGF0YUtleSA9IHR5cGUgKyAibWFyayIsCgkJCXRtcDsKCQlmdW5jdGlvbiByZXNvbHZlKCkgewoJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCWRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7CgkJCX0KCQl9CgkJd2hpbGUoIGktLSApIHsKCQkJaWYgKCggdG1wID0galF1ZXJ5LmRhdGEoIGVsZW1lbnRzWyBpIF0sIGRlZmVyRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgfHwKCQkJCQkoIGpRdWVyeS5kYXRhKCBlbGVtZW50c1sgaSBdLCBxdWV1ZURhdGFLZXksIHVuZGVmaW5lZCwgdHJ1ZSApIHx8CgkJCQkJCWpRdWVyeS5kYXRhKCBlbGVtZW50c1sgaSBdLCBtYXJrRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgKSAmJgoJCQkJCWpRdWVyeS5kYXRhKCBlbGVtZW50c1sgaSBdLCBkZWZlckRhdGFLZXksIGpRdWVyeS5fRGVmZXJyZWQoKSwgdHJ1ZSApICkpIHsKCQkJCWNvdW50Kys7CgkJCQl0bXAuZG9uZSggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSgpOwoJfQp9KTsKCgoKCnZhciByY2xhc3MgPSAvW1xuXHRccl0vZywKCXJzcGFjZSA9IC9ccysvLAoJcnJldHVybiA9IC9cci9nLAoJcnR5cGUgPSAvXig/OmJ1dHRvbnxpbnB1dCkkL2ksCglyZm9jdXNhYmxlID0gL14oPzpidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksCglyY2xpY2thYmxlID0gL15hKD86cmVhKT8kL2ksCglyYm9vbGVhbiA9IC9eKD86YXV0b2ZvY3VzfGF1dG9wbGF5fGFzeW5jfGNoZWNrZWR8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWR8c2VsZWN0ZWQpJC9pLAoJbm9kZUhvb2ssIGJvb2xIb29rOwoKalF1ZXJ5LmZuLmV4dGVuZCh7CglhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIG5hbWUsIHZhbHVlLCB0cnVlLCBqUXVlcnkuYXR0ciApOwoJfSwKCglyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0pOwoJfSwKCQoJcHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJCXJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBuYW1lLCB2YWx1ZSwgdHJ1ZSwgalF1ZXJ5LnByb3AgKTsKCX0sCgkKCXJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1lICkgewoJCW5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJLy8gdHJ5L2NhdGNoIGhhbmRsZXMgY2FzZXMgd2hlcmUgSUUgYmFsa3MgKHN1Y2ggYXMgcmVtb3ZpbmcgYSBwcm9wZXJ0eSBvbiB3aW5kb3cpCgkJCXRyeSB7CgkJCQl0aGlzWyBuYW1lIF0gPSB1bmRlZmluZWQ7CgkJCQlkZWxldGUgdGhpc1sgbmFtZSBdOwoJCQl9IGNhdGNoKCBlICkge30KCQl9KTsKCX0sCgoJYWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgY2xhc3NOYW1lcywgaSwgbCwgZWxlbSwKCQkJc2V0Q2xhc3MsIGMsIGNsOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgewoJCQkJalF1ZXJ5KCB0aGlzICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaiwgdGhpcy5jbGFzc05hbWUpICk7CgkJCX0pOwoJCX0KCgkJaWYgKCB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICkgewoJCQljbGFzc05hbWVzID0gdmFsdWUuc3BsaXQoIHJzcGFjZSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCWVsZW0gPSB0aGlzWyBpIF07CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWVsZW0uY2xhc3NOYW1lICYmIGNsYXNzTmFtZXMubGVuZ3RoID09PSAxICkgewoJCQkJCQllbGVtLmNsYXNzTmFtZSA9IHZhbHVlOwoKCQkJCQl9IGVsc2UgewoJCQkJCQlzZXRDbGFzcyA9ICIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiOwoKCQkJCQkJZm9yICggYyA9IDAsIGNsID0gY2xhc3NOYW1lcy5sZW5ndGg7IGMgPCBjbDsgYysrICkgewoJCQkJCQkJaWYgKCAhfnNldENsYXNzLmluZGV4T2YoICIgIiArIGNsYXNzTmFtZXNbIGMgXSArICIgIiApICkgewoJCQkJCQkJCXNldENsYXNzICs9IGNsYXNzTmFtZXNbIGMgXSArICIgIjsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbGVtLmNsYXNzTmFtZSA9IGpRdWVyeS50cmltKCBzZXRDbGFzcyApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzTmFtZXMsIGksIGwsIGVsZW0sIGNsYXNzTmFtZSwgYywgY2w7CgoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQljbGFzc05hbWVzID0gKHZhbHVlIHx8ICIiKS5zcGxpdCggcnNwYWNlICk7CgoJCQlmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbIGkgXTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5jbGFzc05hbWUgKSB7CgkJCQkJaWYgKCB2YWx1ZSApIHsKCQkJCQkJY2xhc3NOYW1lID0gKCIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiKS5yZXBsYWNlKCByY2xhc3MsICIgIiApOwoJCQkJCQlmb3IgKCBjID0gMCwgY2wgPSBjbGFzc05hbWVzLmxlbmd0aDsgYyA8IGNsOyBjKysgKSB7CgkJCQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgiICIgKyBjbGFzc05hbWVzWyBjIF0gKyAiICIsICIgIik7CgkJCQkJCX0KCQkJCQkJZWxlbS5jbGFzc05hbWUgPSBqUXVlcnkudHJpbSggY2xhc3NOYW1lICk7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCWVsZW0uY2xhc3NOYW1lID0gIiI7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCgkJCWlzQm9vbCA9IHR5cGVvZiBzdGF0ZVZhbCA9PT0gImJvb2xlYW4iOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkJalF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaSwgdGhpcy5jbGFzc05hbWUsIHN0YXRlVmFsKSwgc3RhdGVWYWwgKTsKCQkJfSk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICkgewoJCQkJLy8gdG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXMKCQkJCXZhciBjbGFzc05hbWUsCgkJCQkJaSA9IDAsCgkJCQkJc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJCXN0YXRlID0gc3RhdGVWYWwsCgkJCQkJY2xhc3NOYW1lcyA9IHZhbHVlLnNwbGl0KCByc3BhY2UgKTsKCgkJCQl3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7CgkJCQkJLy8gY2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGVyYXRlZCBsaXN0CgkJCQkJc3RhdGUgPSBpc0Jvb2wgPyBzdGF0ZSA6ICFzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKTsKCQkJCQlzZWxmWyBzdGF0ZSA/ICJhZGRDbGFzcyIgOiAicmVtb3ZlQ2xhc3MiIF0oIGNsYXNzTmFtZSApOwoJCQkJfQoKCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZSA9PT0gImJvb2xlYW4iICkgewoJCQkJaWYgKCB0aGlzLmNsYXNzTmFtZSApIHsKCQkJCQkvLyBzdG9yZSBjbGFzc05hbWUgaWYgc2V0CgkJCQkJalF1ZXJ5Ll9kYXRhKCB0aGlzLCAiX19jbGFzc05hbWVfXyIsIHRoaXMuY2xhc3NOYW1lICk7CgkJCQl9CgoJCQkJLy8gdG9nZ2xlIHdob2xlIGNsYXNzTmFtZQoJCQkJdGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyAiIiA6IGpRdWVyeS5fZGF0YSggdGhpcywgIl9fY2xhc3NOYW1lX18iICkgfHwgIiI7CgkJCX0KCQl9KTsKCX0sCgoJaGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgY2xhc3NOYW1lID0gIiAiICsgc2VsZWN0b3IgKyAiICI7CgkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCWlmICggdGhpc1tpXS5ub2RlVHlwZSA9PT0gMSAmJiAoIiAiICsgdGhpc1tpXS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UocmNsYXNzLCAiICIpLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfSwKCgl2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgaG9va3MsIHJldCwKCQkJZWxlbSA9IHRoaXNbMF07CgkJCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJaWYgKCBlbGVtICkgewoJCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF07CgoJCQkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCAidmFsdWUiICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIHJldDsKCQkJCX0KCgkJCQlyZXQgPSBlbGVtLnZhbHVlOwoKCQkJCXJldHVybiB0eXBlb2YgcmV0ID09PSAic3RyaW5nIiA/IAoJCQkJCS8vIGhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXMKCQkJCQlyZXQucmVwbGFjZShycmV0dXJuLCAiIikgOiAKCQkJCQkvLyBoYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKCQkJCQlyZXQgPT0gbnVsbCA/ICIiIDogcmV0OwoJCQl9CgoJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCX0KCgkJdmFyIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyksIHZhbDsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCBpc0Z1bmN0aW9uICkgewoJCQkJdmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgc2VsZi52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCQkJfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWwgKz0gIiI7CgkJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWwgKSApIHsKCQkJCXZhbCA9IGpRdWVyeS5tYXAodmFsLCBmdW5jdGlvbiAoIHZhbHVlICkgewoJCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiOwoJCQkJfSk7CgkJCX0KCgkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdOwoKCQkJLy8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmcKCQkJaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsICJ2YWx1ZSIgKSA9PT0gdW5kZWZpbmVkICkgewoJCQkJdGhpcy52YWx1ZSA9IHZhbDsKCQkJfQoJCX0pOwoJfQp9KTsKCmpRdWVyeS5leHRlbmQoewoJdmFsSG9va3M6IHsKCQlvcHRpb246IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCS8vIGF0dHJpYnV0ZXMudmFsdWUgaXMgdW5kZWZpbmVkIGluIEJsYWNrYmVycnkgNC43IGJ1dAoJCQkJLy8gdXNlcyAudmFsdWUuIFNlZSAjNjkzMgoJCQkJdmFyIHZhbCA9IGVsZW0uYXR0cmlidXRlcy52YWx1ZTsKCQkJCXJldHVybiAhdmFsIHx8IHZhbC5zcGVjaWZpZWQgPyBlbGVtLnZhbHVlIDogZWxlbS50ZXh0OwoJCQl9CgkJfSwKCQlzZWxlY3Q6IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXZhciB2YWx1ZSwKCQkJCQlpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCwKCQkJCQl2YWx1ZXMgPSBbXSwKCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiOwoKCQkJCS8vIE5vdGhpbmcgd2FzIHNlbGVjdGVkCgkJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCQlyZXR1cm4gbnVsbDsKCQkJCX0KCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQlmb3IgKCB2YXIgaSA9IG9uZSA/IGluZGV4IDogMCwgbWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQl2YXIgb3B0aW9uID0gb3B0aW9uc1sgaSBdOwoKCQkJCQkvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwCgkJCQkJaWYgKCBvcHRpb24uc2VsZWN0ZWQgJiYgKGpRdWVyeS5zdXBwb3J0Lm9wdERpc2FibGVkID8gIW9wdGlvbi5kaXNhYmxlZCA6IG9wdGlvbi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT09IG51bGwpICYmCgkJCQkJCQkoIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkpICkgewoKCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgoJCQkJCQl2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7CgoJCQkJCQkvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cwoJCQkJCQlpZiAoIG9uZSApIHsKCQkJCQkJCXJldHVybiB2YWx1ZTsKCQkJCQkJfQoKCQkJCQkJLy8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXkKCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIEZpeGVzIEJ1ZyAjMjU1MSAtLSBzZWxlY3QudmFsKCkgYnJva2VuIGluIElFIGFmdGVyIGZvcm0ucmVzZXQoKQoJCQkJaWYgKCBvbmUgJiYgIXZhbHVlcy5sZW5ndGggJiYgb3B0aW9ucy5sZW5ndGggKSB7CgkJCQkJcmV0dXJuIGpRdWVyeSggb3B0aW9uc1sgaW5kZXggXSApLnZhbCgpOwoJCQkJfQoKCQkJCXJldHVybiB2YWx1ZXM7CgkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApOwoKCQkJCWpRdWVyeShlbGVtKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCXRoaXMuc2VsZWN0ZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KHRoaXMpLnZhbCgpLCB2YWx1ZXMgKSA+PSAwOwoJCQkJfSk7CgoJCQkJaWYgKCAhdmFsdWVzLmxlbmd0aCApIHsKCQkJCQllbGVtLnNlbGVjdGVkSW5kZXggPSAtMTsKCQkJCX0KCQkJCXJldHVybiB2YWx1ZXM7CgkJCX0KCQl9Cgl9LAoKCWF0dHJGbjogewoJCXZhbDogdHJ1ZSwKCQljc3M6IHRydWUsCgkJaHRtbDogdHJ1ZSwKCQl0ZXh0OiB0cnVlLAoJCWRhdGE6IHRydWUsCgkJd2lkdGg6IHRydWUsCgkJaGVpZ2h0OiB0cnVlLAoJCW9mZnNldDogdHJ1ZQoJfSwKCQoJYXR0ckZpeDogewoJCS8vIEFsd2F5cyBub3JtYWxpemUgdG8gZW5zdXJlIGhvb2sgdXNhZ2UKCQl0YWJpbmRleDogInRhYkluZGV4IgoJfSwKCQoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBwYXNzICkgewoJCXZhciBuVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgkJCgkJLy8gZG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcwoJCWlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIHBhc3MgJiYgbmFtZSBpbiBqUXVlcnkuYXR0ckZuICkgewoJCQlyZXR1cm4galF1ZXJ5KCBlbGVtIClbIG5hbWUgXSggdmFsdWUgKTsKCQl9CgoJCS8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkCgkJaWYgKCAhKCJnZXRBdHRyaWJ1dGUiIGluIGVsZW0pICkgewoJCQlyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7CgkJfQoKCQl2YXIgcmV0LCBob29rcywKCQkJbm90eG1sID0gblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOwoKCQkvLyBOb3JtYWxpemUgdGhlIG5hbWUgaWYgbmVlZGVkCgkJaWYgKCBub3R4bWwgKSB7CgkJCW5hbWUgPSBqUXVlcnkuYXR0ckZpeFsgbmFtZSBdIHx8IG5hbWU7CgoJCQlob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXTsKCgkJCWlmICggIWhvb2tzICkgewoJCQkJLy8gVXNlIGJvb2xIb29rIGZvciBib29sZWFuIGF0dHJpYnV0ZXMKCQkJCWlmICggcmJvb2xlYW4udGVzdCggbmFtZSApICkgewoJCQkJCWhvb2tzID0gYm9vbEhvb2s7CgoJCQkJLy8gVXNlIG5vZGVIb29rIGlmIGF2YWlsYWJsZSggSUU2LzcgKQoJCQkJfSBlbHNlIGlmICggbm9kZUhvb2sgKSB7CgkJCQkJaG9va3MgPSBub2RlSG9vazsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJaWYgKCB2YWx1ZSA9PT0gbnVsbCApIHsKCQkJCWpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CgkJCQlyZXR1cm4gdW5kZWZpbmVkOwoKCQkJfSBlbHNlIGlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYgbm90eG1sICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoKCQkJfSBlbHNlIHsKCQkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCAiIiArIHZhbHVlICk7CgkJCQlyZXR1cm4gdmFsdWU7CgkJCX0KCgkJfSBlbHNlIGlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgbm90eG1sICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7CgkJCXJldHVybiByZXQ7CgoJCX0gZWxzZSB7CgoJCQlyZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOwoKCQkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKCQkJcmV0dXJuIHJldCA9PT0gbnVsbCA/CgkJCQl1bmRlZmluZWQgOgoJCQkJcmV0OwoJCX0KCX0sCgoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJdmFyIHByb3BOYW1lOwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJbmFtZSA9IGpRdWVyeS5hdHRyRml4WyBuYW1lIF0gfHwgbmFtZTsKCgkJCWpRdWVyeS5hdHRyKCBlbGVtLCBuYW1lLCAiIiApOwoJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApOwoKCQkJLy8gU2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdG8gZmFsc2UgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwoJCQlpZiAoIHJib29sZWFuLnRlc3QoIG5hbWUgKSAmJiAocHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUpIGluIGVsZW0gKSB7CgkJCQllbGVtWyBwcm9wTmFtZSBdID0gZmFsc2U7CgkJCX0KCQl9Cgl9LAoKCWF0dHJIb29rczogewoJCXR5cGU6IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQkvLyBXZSBjYW4ndCBhbGxvdyB0aGUgdHlwZSBwcm9wZXJ0eSB0byBiZSBjaGFuZ2VkIChzaW5jZSBpdCBjYXVzZXMgcHJvYmxlbXMgaW4gSUUpCgkJCQlpZiAoIHJ0eXBlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQkJalF1ZXJ5LmVycm9yKCAidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIiApOwoJCQkJfSBlbHNlIGlmICggIWpRdWVyeS5zdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYgalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICJpbnB1dCIpICkgewoJCQkJCS8vIFNldHRpbmcgdGhlIHR5cGUgb24gYSByYWRpbyBidXR0b24gYWZ0ZXIgdGhlIHZhbHVlIHJlc2V0cyB0aGUgdmFsdWUgaW4gSUU2LTkKCQkJCQkvLyBSZXNldCB2YWx1ZSB0byBpdCdzIGRlZmF1bHQgaW4gY2FzZSB0eXBlIGlzIHNldCBhZnRlciB2YWx1ZQoJCQkJCS8vIFRoaXMgaXMgZm9yIGVsZW1lbnQgY3JlYXRpb24KCQkJCQl2YXIgdmFsID0gZWxlbS52YWx1ZTsKCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggInR5cGUiLCB2YWx1ZSApOwoJCQkJCWlmICggdmFsICkgewoJCQkJCQllbGVtLnZhbHVlID0gdmFsOwoJCQkJCX0KCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQl9CgkJCX0KCQl9LAoJCS8vIFVzZSB0aGUgdmFsdWUgcHJvcGVydHkgZm9yIGJhY2sgY29tcGF0CgkJLy8gVXNlIHRoZSBub2RlSG9vayBmb3IgYnV0dG9uIGVsZW1lbnRzIGluIElFNi83ICgjMTk1NCkKCQl2YWx1ZTogewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCQkJaWYgKCBub2RlSG9vayAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJidXR0b24iICkgKSB7CgkJCQkJcmV0dXJuIG5vZGVIb29rLmdldCggZWxlbSwgbmFtZSApOwoJCQkJfQoJCQkJcmV0dXJuIG5hbWUgaW4gZWxlbSA/CgkJCQkJZWxlbS52YWx1ZSA6CgkJCQkJbnVsbDsKCQkJfSwKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7CgkJCQlpZiAoIG5vZGVIb29rICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImJ1dHRvbiIgKSApIHsKCQkJCQlyZXR1cm4gbm9kZUhvb2suc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApOwoJCQkJfQoJCQkJLy8gRG9lcyBub3QgcmV0dXJuIHNvIHRoYXQgc2V0QXR0cmlidXRlIGlzIGFsc28gdXNlZAoJCQkJZWxlbS52YWx1ZSA9IHZhbHVlOwoJCQl9CgkJfQoJfSwKCglwcm9wRml4OiB7CgkJdGFiaW5kZXg6ICJ0YWJJbmRleCIsCgkJcmVhZG9ubHk6ICJyZWFkT25seSIsCgkJImZvciI6ICJodG1sRm9yIiwKCQkiY2xhc3MiOiAiY2xhc3NOYW1lIiwKCQltYXhsZW5ndGg6ICJtYXhMZW5ndGgiLAoJCWNlbGxzcGFjaW5nOiAiY2VsbFNwYWNpbmciLAoJCWNlbGxwYWRkaW5nOiAiY2VsbFBhZGRpbmciLAoJCXJvd3NwYW46ICJyb3dTcGFuIiwKCQljb2xzcGFuOiAiY29sU3BhbiIsCgkJdXNlbWFwOiAidXNlTWFwIiwKCQlmcmFtZWJvcmRlcjogImZyYW1lQm9yZGVyIiwKCQljb250ZW50ZWRpdGFibGU6ICJjb250ZW50RWRpdGFibGUiCgl9LAoJCglwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJdmFyIG5UeXBlID0gZWxlbS5ub2RlVHlwZTsKCgkJLy8gZG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcwoJCWlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQl2YXIgcmV0LCBob29rcywKCQkJbm90eG1sID0gblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOwoKCQlpZiAoIG5vdHhtbCApIHsKCQkJLy8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rcwoJCQluYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOwoJCQlob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTsKCQl9CgoJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIHJldDsKCgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gKGVsZW1bIG5hbWUgXSA9IHZhbHVlKTsKCQkJfQoKCQl9IGVsc2UgewoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7CgkJCQlyZXR1cm4gcmV0OwoKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBlbGVtWyBuYW1lIF07CgkJCX0KCQl9Cgl9LAoJCglwcm9wSG9va3M6IHsKCQl0YWJJbmRleDogewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldAoJCQkJLy8gaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC8KCQkJCXZhciBhdHRyaWJ1dGVOb2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJ0YWJpbmRleCIpOwoKCQkJCXJldHVybiBhdHRyaWJ1dGVOb2RlICYmIGF0dHJpYnV0ZU5vZGUuc3BlY2lmaWVkID8KCQkJCQlwYXJzZUludCggYXR0cmlidXRlTm9kZS52YWx1ZSwgMTAgKSA6CgkJCQkJcmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHwgcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYgZWxlbS5ocmVmID8KCQkJCQkJMCA6CgkJCQkJCXVuZGVmaW5lZDsKCQkJfQoJCX0KCX0KfSk7CgovLyBBZGQgdGhlIHRhYmluZGV4IHByb3BIb29rIHRvIGF0dHJIb29rcyBmb3IgYmFjay1jb21wYXQKalF1ZXJ5LmF0dHJIb29rcy50YWJJbmRleCA9IGpRdWVyeS5wcm9wSG9va3MudGFiSW5kZXg7CgovLyBIb29rIGZvciBib29sZWFuIGF0dHJpYnV0ZXMKYm9vbEhvb2sgPSB7CglnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCS8vIEFsaWduIGJvb2xlYW4gYXR0cmlidXRlcyB3aXRoIGNvcnJlc3BvbmRpbmcgcHJvcGVydGllcwoJCS8vIEZhbGwgYmFjayB0byBhdHRyaWJ1dGUgcHJlc2VuY2Ugd2hlcmUgc29tZSBib29sZWFucyBhcmUgbm90IHN1cHBvcnRlZAoJCXZhciBhdHRyTm9kZTsKCQlyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUgKSA9PT0gdHJ1ZSB8fCAoIGF0dHJOb2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkgKSAmJiBhdHRyTm9kZS5ub2RlVmFsdWUgIT09IGZhbHNlID8KCQkJbmFtZS50b0xvd2VyQ2FzZSgpIDoKCQkJdW5kZWZpbmVkOwoJfSwKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCXZhciBwcm9wTmFtZTsKCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCS8vIHZhbHVlIGlzIHRydWUgc2luY2Ugd2Uga25vdyBhdCB0aGlzIHBvaW50IGl0J3MgdHlwZSBib29sZWFuIGFuZCBub3QgZmFsc2UKCQkJLy8gU2V0IGJvb2xlYW4gYXR0cmlidXRlcyB0byB0aGUgc2FtZSBuYW1lIGFuZCBzZXQgdGhlIERPTSBwcm9wZXJ0eQoJCQlwcm9wTmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaWYgKCBwcm9wTmFtZSBpbiBlbGVtICkgewoJCQkJLy8gT25seSBzZXQgdGhlIElETCBzcGVjaWZpY2FsbHkgaWYgaXQgYWxyZWFkeSBleGlzdHMgb24gdGhlIGVsZW1lbnQKCQkJCWVsZW1bIHByb3BOYW1lIF0gPSB0cnVlOwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKLy8gSUU2LzcgZG8gbm90IHN1cHBvcnQgZ2V0dGluZy9zZXR0aW5nIHNvbWUgYXR0cmlidXRlcyB3aXRoIGdldC9zZXRBdHRyaWJ1dGUKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlICkgewoJCgkvLyBVc2UgdGhpcyBmb3IgYW55IGF0dHJpYnV0ZSBpbiBJRTYvNwoJLy8gVGhpcyBmaXhlcyBhbG1vc3QgZXZlcnkgSUU2LzcgaXNzdWUKCW5vZGVIb29rID0galF1ZXJ5LnZhbEhvb2tzLmJ1dHRvbiA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCQl2YXIgcmV0OwoJCQlyZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTsKCQkJLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBub2RlVmFsdWUgaXMgZW1wdHkgc3RyaW5nCgkJCXJldHVybiByZXQgJiYgcmV0Lm5vZGVWYWx1ZSAhPT0gIiIgPwoJCQkJcmV0Lm5vZGVWYWx1ZSA6CgkJCQl1bmRlZmluZWQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKCQkJLy8gU2V0IHRoZSBleGlzdGluZyBvciBjcmVhdGUgYSBuZXcgYXR0cmlidXRlIG5vZGUKCQkJdmFyIHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApOwoJCQlpZiAoICFyZXQgKSB7CgkJCQlyZXQgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoIG5hbWUgKTsKCQkJCWVsZW0uc2V0QXR0cmlidXRlTm9kZSggcmV0ICk7CgkJCX0KCQkJcmV0dXJuIChyZXQubm9kZVZhbHVlID0gdmFsdWUgKyAiIik7CgkJfQoJfTsKCgkvLyBTZXQgd2lkdGggYW5kIGhlaWdodCB0byBhdXRvIGluc3RlYWQgb2YgMCBvbiBlbXB0eSBzdHJpbmcoIEJ1ZyAjODE1MCApCgkvLyBUaGlzIGlzIGZvciByZW1vdmFscwoJalF1ZXJ5LmVhY2goWyAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCQlqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQlpZiAoIHZhbHVlID09PSAiIiApIHsKCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgImF1dG8iICk7CgkJCQkJcmV0dXJuIHZhbHVlOwoJCQkJfQoJCQl9CgkJfSk7Cgl9KTsKfQoKCi8vIFNvbWUgYXR0cmlidXRlcyByZXF1aXJlIGEgc3BlY2lhbCBjYWxsIG9uIElFCmlmICggIWpRdWVyeS5zdXBwb3J0LmhyZWZOb3JtYWxpemVkICkgewoJalF1ZXJ5LmVhY2goWyAiaHJlZiIsICJzcmMiLCAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCQlqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgMiApOwoJCQkJcmV0dXJuIHJldCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDsKCQkJfQoJCX0pOwoJfSk7Cn0KCmlmICggIWpRdWVyeS5zdXBwb3J0LnN0eWxlICkgewoJalF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBSZXR1cm4gdW5kZWZpbmVkIGluIHRoZSBjYXNlIG9mIGVtcHR5IHN0cmluZwoJCQkvLyBOb3JtYWxpemUgdG8gbG93ZXJjYXNlIHNpbmNlIElFIHVwcGVyY2FzZXMgY3NzIHByb3BlcnR5IG5hbWVzCgkJCXJldHVybiBlbGVtLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKSB8fCB1bmRlZmluZWQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJcmV0dXJuIChlbGVtLnN0eWxlLmNzc1RleHQgPSAiIiArIHZhbHVlKTsKCQl9Cgl9Owp9CgovLyBTYWZhcmkgbWlzLXJlcG9ydHMgdGhlIGRlZmF1bHQgc2VsZWN0ZWQgcHJvcGVydHkgb2YgYW4gb3B0aW9uCi8vIEFjY2Vzc2luZyB0aGUgcGFyZW50J3Mgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eSBmaXhlcyBpdAppZiAoICFqUXVlcnkuc3VwcG9ydC5vcHRTZWxlY3RlZCApIHsKCWpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkLCB7CgkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCgkJCWlmICggcGFyZW50ICkgewoJCQkJcGFyZW50LnNlbGVjdGVkSW5kZXg7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgaXQgYWxzbyB3b3JrcyB3aXRoIG9wdGdyb3Vwcywgc2VlICM1NzAxCgkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIG51bGw7CgkJfQoJfSk7Cn0KCi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyCmlmICggIWpRdWVyeS5zdXBwb3J0LmNoZWNrT24gKSB7CglqUXVlcnkuZWFjaChbICJyYWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24oKSB7CgkJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgaW4gV2Via2l0ICIiIGlzIHJldHVybmVkIGluc3RlYWQgb2YgIm9uIiBpZiBhIHZhbHVlIGlzbid0IHNwZWNpZmllZAoJCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpID09PSBudWxsID8gIm9uIiA6IGVsZW0udmFsdWU7CgkJCX0KCQl9OwoJfSk7Cn0KalF1ZXJ5LmVhY2goWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkudmFsSG9va3NbIHRoaXMgXSwgewoJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCQlpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkgewoJCQkJcmV0dXJuIChlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KGVsZW0pLnZhbCgpLCB2YWx1ZSApID49IDApOwoJCQl9CgkJfQoJfSk7Cn0pOwoKCgoKdmFyIHJuYW1lc3BhY2VzID0gL1wuKC4qKSQvLAoJcmZvcm1FbGVtcyA9IC9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSwKCXJwZXJpb2QgPSAvXC4vZywKCXJzcGFjZXMgPSAvIC9nLAoJcmVzY2FwZSA9IC9bXlx3XHMufGBdL2csCglmY2xlYW51cCA9IGZ1bmN0aW9uKCBubSApIHsKCQlyZXR1cm4gbm0ucmVwbGFjZShyZXNjYXBlLCAiXFwkJiIpOwoJfTsKCi8qCiAqIEEgbnVtYmVyIG9mIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBmb3IgbWFuYWdpbmcgZXZlbnRzLgogKiBNYW55IG9mIHRoZSBpZGVhcyBiZWhpbmQgdGhpcyBjb2RlIG9yaWdpbmF0ZWQgZnJvbQogKiBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkuCiAqLwpqUXVlcnkuZXZlbnQgPSB7CgoJLy8gQmluZCBhbiBldmVudCB0byBhbiBlbGVtZW50CgkvLyBPcmlnaW5hbCBieSBEZWFuIEVkd2FyZHMKCWFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhICkgewoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGhhbmRsZXIgPT09IGZhbHNlICkgewoJCQloYW5kbGVyID0gcmV0dXJuRmFsc2U7CgkJfSBlbHNlIGlmICggIWhhbmRsZXIgKSB7CgkJCS8vIEZpeGVzIGJ1ZyAjNzIyOS4gRml4IHJlY29tbWVuZGVkIGJ5IGpkYWx0b24KCQkJcmV0dXJuOwoJCX0KCgkJdmFyIGhhbmRsZU9iakluLCBoYW5kbGVPYmo7CgoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGJlaW5nIGV4ZWN1dGVkIGhhcyBhIHVuaXF1ZSBJRAoJCWlmICggIWhhbmRsZXIuZ3VpZCApIHsKCQkJaGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKzsKCQl9CgoJCS8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUKCQl2YXIgZWxlbURhdGEgPSBqUXVlcnkuX2RhdGEoIGVsZW0gKTsKCgkJLy8gSWYgbm8gZWxlbURhdGEgaXMgZm91bmQgdGhlbiB3ZSBtdXN0IGJlIHRyeWluZyB0byBiaW5kIHRvIG9uZSBvZiB0aGUKCQkvLyBiYW5uZWQgbm9EYXRhIGVsZW1lbnRzCgkJaWYgKCAhZWxlbURhdGEgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMsCgkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlOwoKCQlpZiAoICFldmVudHMgKSB7CgkJCWVsZW1EYXRhLmV2ZW50cyA9IGV2ZW50cyA9IHt9OwoJCX0KCgkJaWYgKCAhZXZlbnRIYW5kbGUgKSB7CgkJCWVsZW1EYXRhLmhhbmRsZSA9IGV2ZW50SGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CgkJCQkvLyBEaXNjYXJkIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dlcigpIGFuZAoJCQkJLy8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZAoJCQkJcmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09ICJ1bmRlZmluZWQiICYmICghZSB8fCBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUpID8KCQkJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCBldmVudEhhbmRsZS5lbGVtLCBhcmd1bWVudHMgKSA6CgkJCQkJdW5kZWZpbmVkOwoJCQl9OwoJCX0KCgkJLy8gQWRkIGVsZW0gYXMgYSBwcm9wZXJ0eSBvZiB0aGUgaGFuZGxlIGZ1bmN0aW9uCgkJLy8gVGhpcyBpcyB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBub24tbmF0aXZlIGV2ZW50cyBpbiBJRS4KCQlldmVudEhhbmRsZS5lbGVtID0gZWxlbTsKCgkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQoJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQl0eXBlcyA9IHR5cGVzLnNwbGl0KCIgIik7CgoJCXZhciB0eXBlLCBpID0gMCwgbmFtZXNwYWNlczsKCgkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgKSB7CgkJCWhhbmRsZU9iaiA9IGhhbmRsZU9iakluID8KCQkJCWpRdWVyeS5leHRlbmQoe30sIGhhbmRsZU9iakluKSA6CgkJCQl7IGhhbmRsZXI6IGhhbmRsZXIsIGRhdGE6IGRhdGEgfTsKCgkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKCQkJaWYgKCB0eXBlLmluZGV4T2YoIi4iKSA+IC0xICkgewoJCQkJbmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIi4iKTsKCQkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5zbGljZSgwKS5zb3J0KCkuam9pbigiLiIpOwoKCQkJfSBlbHNlIHsKCQkJCW5hbWVzcGFjZXMgPSBbXTsKCQkJCWhhbmRsZU9iai5uYW1lc3BhY2UgPSAiIjsKCQkJfQoKCQkJaGFuZGxlT2JqLnR5cGUgPSB0eXBlOwoJCQlpZiAoICFoYW5kbGVPYmouZ3VpZCApIHsKCQkJCWhhbmRsZU9iai5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQl9CgoJCQkvLyBHZXQgdGhlIGN1cnJlbnQgbGlzdCBvZiBmdW5jdGlvbnMgYm91bmQgdG8gdGhpcyBldmVudAoJCQl2YXIgaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSwKCQkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZQoJCQlpZiAoICFoYW5kbGVycyApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCgkJCQkvLyBDaGVjayBmb3IgYSBzcGVjaWFsIGV2ZW50IGhhbmRsZXIKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwKCQkJCS8vIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2UKCQkJCWlmICggIXNwZWNpYWwuc2V0dXAgfHwgc3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHsKCQkJCQkvLyBCaW5kIHRoZSBnbG9iYWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudAoJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlLCBmYWxzZSApOwoKCQkJCQl9IGVsc2UgaWYgKCBlbGVtLmF0dGFjaEV2ZW50ICkgewoJCQkJCQllbGVtLmF0dGFjaEV2ZW50KCAib24iICsgdHlwZSwgZXZlbnRIYW5kbGUgKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWlmICggc3BlY2lhbC5hZGQgKSB7CgkJCQlzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKCgkJCQlpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkgewoJCQkJCWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7CgkJCQl9CgkJCX0KCgkJCS8vIEFkZCB0aGUgZnVuY3Rpb24gdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QKCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgoJCQkvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGJlZW4gdXNlZCwgZm9yIGV2ZW50IG9wdGltaXphdGlvbgoJCQlqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlOwoJCX0KCgkJLy8gTnVsbGlmeSBlbGVtIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzIGluIElFCgkJZWxlbSA9IG51bGw7Cgl9LAoKCWdsb2JhbDoge30sCgoJLy8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50CglyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgcG9zICkgewoJCS8vIGRvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggaGFuZGxlciA9PT0gZmFsc2UgKSB7CgkJCWhhbmRsZXIgPSByZXR1cm5GYWxzZTsKCQl9CgoJCXZhciByZXQsIHR5cGUsIGZuLCBqLCBpID0gMCwgYWxsLCBuYW1lc3BhY2VzLCBuYW1lc3BhY2UsIHNwZWNpYWwsIGV2ZW50VHlwZSwgaGFuZGxlT2JqLCBvcmlnVHlwZSwKCQkJZWxlbURhdGEgPSBqUXVlcnkuaGFzRGF0YSggZWxlbSApICYmIGpRdWVyeS5fZGF0YSggZWxlbSApLAoJCQlldmVudHMgPSBlbGVtRGF0YSAmJiBlbGVtRGF0YS5ldmVudHM7CgoJCWlmICggIWVsZW1EYXRhIHx8ICFldmVudHMgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIHR5cGVzIGlzIGFjdHVhbGx5IGFuIGV2ZW50IG9iamVjdCBoZXJlCgkJaWYgKCB0eXBlcyAmJiB0eXBlcy50eXBlICkgewoJCQloYW5kbGVyID0gdHlwZXMuaGFuZGxlcjsKCQkJdHlwZXMgPSB0eXBlcy50eXBlOwoJCX0KCgkJLy8gVW5iaW5kIGFsbCBldmVudHMgZm9yIHRoZSBlbGVtZW50CgkJaWYgKCAhdHlwZXMgfHwgdHlwZW9mIHR5cGVzID09PSAic3RyaW5nIiAmJiB0eXBlcy5jaGFyQXQoMCkgPT09ICIuIiApIHsKCQkJdHlwZXMgPSB0eXBlcyB8fCAiIjsKCgkJCWZvciAoIHR5cGUgaW4gZXZlbnRzICkgewoJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzICk7CgkJCX0KCgkJCXJldHVybjsKCQl9CgoJCS8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UKCQkvLyBqUXVlcnkoLi4uKS51bmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQl0eXBlcyA9IHR5cGVzLnNwbGl0KCIgIik7CgoJCXdoaWxlICggKHR5cGUgPSB0eXBlc1sgaSsrIF0pICkgewoJCQlvcmlnVHlwZSA9IHR5cGU7CgkJCWhhbmRsZU9iaiA9IG51bGw7CgkJCWFsbCA9IHR5cGUuaW5kZXhPZigiLiIpIDwgMDsKCQkJbmFtZXNwYWNlcyA9IFtdOwoKCQkJaWYgKCAhYWxsICkgewoJCQkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycwoJCQkJbmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIi4iKTsKCQkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgoJCQkJbmFtZXNwYWNlID0gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKwoJCQkJCWpRdWVyeS5tYXAoIG5hbWVzcGFjZXMuc2xpY2UoMCkuc29ydCgpLCBmY2xlYW51cCApLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSArICIoXFwufCQpIik7CgkJCX0KCgkJCWV2ZW50VHlwZSA9IGV2ZW50c1sgdHlwZSBdOwoKCQkJaWYgKCAhZXZlbnRUeXBlICkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmICggIWhhbmRsZXIgKSB7CgkJCQlmb3IgKCBqID0gMDsgaiA8IGV2ZW50VHlwZS5sZW5ndGg7IGorKyApIHsKCQkJCQloYW5kbGVPYmogPSBldmVudFR5cGVbIGogXTsKCgkJCQkJaWYgKCBhbGwgfHwgbmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgb3JpZ1R5cGUsIGhhbmRsZU9iai5oYW5kbGVyLCBqICk7CgkJCQkJCWV2ZW50VHlwZS5zcGxpY2UoIGotLSwgMSApOwoJCQkJCX0KCQkJCX0KCgkJCQljb250aW51ZTsKCQkJfQoKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQlmb3IgKCBqID0gcG9zIHx8IDA7IGogPCBldmVudFR5cGUubGVuZ3RoOyBqKysgKSB7CgkJCQloYW5kbGVPYmogPSBldmVudFR5cGVbIGogXTsKCgkJCQlpZiAoIGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSB7CgkJCQkJLy8gcmVtb3ZlIHRoZSBnaXZlbiBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gdHlwZQoJCQkJCWlmICggYWxsIHx8IG5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7CgkJCQkJCWlmICggcG9zID09IG51bGwgKSB7CgkJCQkJCQlldmVudFR5cGUuc3BsaWNlKCBqLS0sIDEgKTsKCQkJCQkJfQoKCQkJCQkJaWYgKCBzcGVjaWFsLnJlbW92ZSApIHsKCQkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQlpZiAoIHBvcyAhPSBudWxsICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIHJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQlpZiAoIGV2ZW50VHlwZS5sZW5ndGggPT09IDAgfHwgcG9zICE9IG51bGwgJiYgZXZlbnRUeXBlLmxlbmd0aCA9PT0gMSApIHsKCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwgc3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzICkgPT09IGZhbHNlICkgewoJCQkJCWpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7CgkJCQl9CgoJCQkJcmV0ID0gbnVsbDsKCQkJCWRlbGV0ZSBldmVudHNbIHR5cGUgXTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHsKCQkJdmFyIGhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZTsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuZWxlbSA9IG51bGw7CgkJCX0KCgkJCWRlbGV0ZSBlbGVtRGF0YS5ldmVudHM7CgkJCWRlbGV0ZSBlbGVtRGF0YS5oYW5kbGU7CgoJCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBlbGVtRGF0YSApICkgewoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIHVuZGVmaW5lZCwgdHJ1ZSApOwoJCQl9CgkJfQoJfSwKCQoJLy8gRXZlbnRzIHRoYXQgYXJlIHNhZmUgdG8gc2hvcnQtY2lyY3VpdCBpZiBubyBoYW5kbGVycyBhcmUgYXR0YWNoZWQuCgkvLyBOYXRpdmUgRE9NIGV2ZW50cyBzaG91bGQgbm90IGJlIGFkZGVkLCB0aGV5IG1heSBoYXZlIGlubGluZSBoYW5kbGVycy4KCWN1c3RvbUV2ZW50OiB7CgkJImdldERhdGEiOiB0cnVlLAoJCSJzZXREYXRhIjogdHJ1ZSwKCQkiY2hhbmdlRGF0YSI6IHRydWUKCX0sCgoJdHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7CgkJLy8gRXZlbnQgb2JqZWN0IG9yIGV2ZW50IHR5cGUKCQl2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgZXZlbnQsCgkJCW5hbWVzcGFjZXMgPSBbXSwKCQkJZXhjbHVzaXZlOwoKCQlpZiAoIHR5cGUuaW5kZXhPZigiISIpID49IDAgKSB7CgkJCS8vIEV4Y2x1c2l2ZSBldmVudHMgdHJpZ2dlciBvbmx5IGZvciB0aGUgZXhhY3QgZXZlbnQgKG5vIG5hbWVzcGFjZXMpCgkJCXR5cGUgPSB0eXBlLnNsaWNlKDAsIC0xKTsKCQkJZXhjbHVzaXZlID0gdHJ1ZTsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCIuIikgPj0gMCApIHsKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOwoJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOwoJCQluYW1lc3BhY2VzLnNvcnQoKTsKCQl9CgoJCWlmICggKCFlbGVtIHx8IGpRdWVyeS5ldmVudC5jdXN0b21FdmVudFsgdHlwZSBdKSAmJiAhalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdICkgewoJCQkvLyBObyBqUXVlcnkgaGFuZGxlcnMgZm9yIHRoaXMgZXZlbnQgdHlwZSwgYW5kIGl0IGNhbid0IGhhdmUgaW5saW5lIGhhbmRsZXJzCgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBFdmVudCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09ICJvYmplY3QiID8KCQkJLy8galF1ZXJ5LkV2ZW50IG9iamVjdAoJCQlldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/IGV2ZW50IDoKCQkJLy8gT2JqZWN0IGxpdGVyYWwKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgZXZlbnQgKSA6CgkJCS8vIEp1c3QgdGhlIGV2ZW50IHR5cGUgKHN0cmluZykKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSApOwoKCQlldmVudC50eXBlID0gdHlwZTsKCQlldmVudC5leGNsdXNpdmUgPSBleGNsdXNpdmU7CgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCIuIik7CgkJZXZlbnQubmFtZXNwYWNlX3JlID0gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSArICIoXFwufCQpIik7CgkJCgkJLy8gdHJpZ2dlckhhbmRsZXIoKSBhbmQgZ2xvYmFsIGV2ZW50cyBkb24ndCBidWJibGUgb3IgcnVuIHRoZSBkZWZhdWx0IGFjdGlvbgoJCWlmICggb25seUhhbmRsZXJzIHx8ICFlbGVtICkgewoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQl9CgoJCS8vIEhhbmRsZSBhIGdsb2JhbCB0cmlnZ2VyCgkJaWYgKCAhZWxlbSApIHsKCQkJLy8gVE9ETzogU3RvcCB0YXVudGluZyB0aGUgZGF0YSBjYWNoZTsgcmVtb3ZlIGdsb2JhbCBldmVudHMgYW5kIGFsd2F5cyBhdHRhY2ggdG8gZG9jdW1lbnQKCQkJalF1ZXJ5LmVhY2goIGpRdWVyeS5jYWNoZSwgZnVuY3Rpb24oKSB7CgkJCQkvLyBpbnRlcm5hbEtleSB2YXJpYWJsZSBpcyBqdXN0IHVzZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZmluZAoJCQkJLy8gYW5kIHBvdGVudGlhbGx5IGNoYW5nZSB0aGlzIHN0dWZmIGxhdGVyOyBjdXJyZW50bHkgaXQganVzdAoJCQkJLy8gcG9pbnRzIHRvIGpRdWVyeS5leHBhbmRvCgkJCQl2YXIgaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKCQkJCQlpbnRlcm5hbENhY2hlID0gdGhpc1sgaW50ZXJuYWxLZXkgXTsKCQkJCWlmICggaW50ZXJuYWxDYWNoZSAmJiBpbnRlcm5hbENhY2hlLmV2ZW50cyAmJiBpbnRlcm5hbENhY2hlLmV2ZW50c1sgdHlwZSBdICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgaW50ZXJuYWxDYWNoZS5oYW5kbGUuZWxlbSApOwoJCQkJfQoJCQl9KTsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWV2ZW50LnRhcmdldCA9IGVsZW07CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSAhPSBudWxsID8galF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApIDogW107CgkJZGF0YS51bnNoaWZ0KCBldmVudCApOwoKCQl2YXIgY3VyID0gZWxlbSwKCQkJLy8gSUUgZG9lc24ndCBsaWtlIG1ldGhvZCBuYW1lcyB3aXRoIGEgY29sb24gKCMzNTMzLCAjODI3MikKCQkJb250eXBlID0gdHlwZS5pbmRleE9mKCI6IikgPCAwID8gIm9uIiArIHR5cGUgOiAiIjsKCgkJLy8gRmlyZSBldmVudCBvbiB0aGUgY3VycmVudCBlbGVtZW50LCB0aGVuIGJ1YmJsZSB1cCB0aGUgRE9NIHRyZWUKCQlkbyB7CgkJCXZhciBoYW5kbGUgPSBqUXVlcnkuX2RhdGEoIGN1ciwgImhhbmRsZSIgKTsKCgkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXI7CgkJCWlmICggaGFuZGxlICkgewoJCQkJaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJfQoKCQkJLy8gVHJpZ2dlciBhbiBpbmxpbmUgYm91bmQgc2NyaXB0CgkJCWlmICggb250eXBlICYmIGpRdWVyeS5hY2NlcHREYXRhKCBjdXIgKSAmJiBjdXJbIG9udHlwZSBdICYmIGN1clsgb250eXBlIF0uYXBwbHkoIGN1ciwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJCWV2ZW50LnJlc3VsdCA9IGZhbHNlOwoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfQoKCQkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdwoJCQljdXIgPSBjdXIucGFyZW50Tm9kZSB8fCBjdXIub3duZXJEb2N1bWVudCB8fCBjdXIgPT09IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50ICYmIHdpbmRvdzsKCQl9IHdoaWxlICggY3VyICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICk7CgoJCS8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3cKCQlpZiAoICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCQkJdmFyIG9sZCwKCQkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJaWYgKCAoIXNwZWNpYWwuX2RlZmF1bHQgfHwgc3BlY2lhbC5fZGVmYXVsdC5jYWxsKCBlbGVtLm93bmVyRG9jdW1lbnQsIGV2ZW50ICkgPT09IGZhbHNlKSAmJgoJCQkJISh0eXBlID09PSAiY2xpY2siICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImEiICkpICYmIGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CgoJCQkJLy8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgoJCQkJLy8gQ2FuJ3QgdXNlIGFuIC5pc0Z1bmN0aW9uKSgpIGNoZWNrIGhlcmUgYmVjYXVzZSBJRTYvNyBmYWlscyB0aGF0IHRlc3QuCgkJCQkvLyBJRTw5IGRpZXMgb24gZm9jdXMgdG8gaGlkZGVuIGVsZW1lbnQgKCMxNDg2KSwgbWF5IHdhbnQgdG8gcmV2aXNpdCBhIHRyeS9jYXRjaC4KCQkJCXRyeSB7CgkJCQkJaWYgKCBvbnR5cGUgJiYgZWxlbVsgdHlwZSBdICkgewoJCQkJCQkvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kCgkJCQkJCW9sZCA9IGVsZW1bIG9udHlwZSBdOwoKCQkJCQkJaWYgKCBvbGQgKSB7CgkJCQkJCQllbGVtWyBvbnR5cGUgXSA9IG51bGw7CgkJCQkJCX0KCgkJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlOwoJCQkJCQllbGVtWyB0eXBlIF0oKTsKCQkJCQl9CgkJCQl9IGNhdGNoICggaWVFcnJvciApIHt9CgoJCQkJaWYgKCBvbGQgKSB7CgkJCQkJZWxlbVsgb250eXBlIF0gPSBvbGQ7CgkJCQl9CgoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgloYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlldmVudCA9IGpRdWVyeS5ldmVudC5maXgoIGV2ZW50IHx8IHdpbmRvdy5ldmVudCApOwoJCS8vIFNuYXBzaG90IHRoZSBoYW5kbGVycyBsaXN0IHNpbmNlIGEgY2FsbGVkIGhhbmRsZXIgbWF5IGFkZC9yZW1vdmUgZXZlbnRzLgoJCXZhciBoYW5kbGVycyA9ICgoalF1ZXJ5Ll9kYXRhKCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9KVsgZXZlbnQudHlwZSBdIHx8IFtdKS5zbGljZSgwKSwKCQkJcnVuX2FsbCA9ICFldmVudC5leGNsdXNpdmUgJiYgIWV2ZW50Lm5hbWVzcGFjZSwKCQkJYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMsIDAgKTsKCgkJLy8gVXNlIHRoZSBmaXgtZWQgRXZlbnQgcmF0aGVyIHRoYW4gdGhlIChyZWFkLW9ubHkpIG5hdGl2ZSBldmVudAoJCWFyZ3NbMF0gPSBldmVudDsKCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gdGhpczsKCgkJZm9yICggdmFyIGogPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBqIDwgbDsgaisrICkgewoJCQl2YXIgaGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTsKCgkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IDEpIGJlIG5vbi1leGNsdXNpdmUgYW5kIGhhdmUgbm8gbmFtZXNwYWNlLCBvcgoJCQkvLyAyKSBoYXZlIG5hbWVzcGFjZShzKSBhIHN1YnNldCBvciBlcXVhbCB0byB0aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQuCgkJCWlmICggcnVuX2FsbCB8fCBldmVudC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgewoJCQkJLy8gUGFzcyBpbiBhIHJlZmVyZW5jZSB0byB0aGUgaGFuZGxlciBmdW5jdGlvbiBpdHNlbGYKCQkJCS8vIFNvIHRoYXQgd2UgY2FuIGxhdGVyIHJlbW92ZSBpdAoJCQkJZXZlbnQuaGFuZGxlciA9IGhhbmRsZU9iai5oYW5kbGVyOwoJCQkJZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhOwoJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoKCQkJCXZhciByZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJncyApOwoKCQkJCWlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJZXZlbnQucmVzdWx0ID0gcmV0OwoJCQkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCQkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCglwcm9wczogImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhhbmRsZXIga2V5Q29kZSBsYXllclggbGF5ZXJZIG1ldGFLZXkgbmV3VmFsdWUgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHByZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNjcmVlblggc2NyZWVuWSBzaGlmdEtleSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgiICIpLAoKCWZpeDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWlmICggZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gKSB7CgkJCXJldHVybiBldmVudDsKCQl9CgoJCS8vIHN0b3JlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0CgkJLy8gYW5kICJjbG9uZSIgdG8gc2V0IHJlYWQtb25seSBwcm9wZXJ0aWVzCgkJdmFyIG9yaWdpbmFsRXZlbnQgPSBldmVudDsKCQlldmVudCA9IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApOwoKCQlmb3IgKCB2YXIgaSA9IHRoaXMucHJvcHMubGVuZ3RoLCBwcm9wOyBpOyApIHsKCQkJcHJvcCA9IHRoaXMucHJvcHNbIC0taSBdOwoJCQlldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsgcHJvcCBdOwoJCX0KCgkJLy8gRml4IHRhcmdldCBwcm9wZXJ0eSwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQudGFyZ2V0ICkgewoJCQkvLyBGaXhlcyAjMTkyNSB3aGVyZSBzcmNFbGVtZW50IG1pZ2h0IG5vdCBiZSBkZWZpbmVkIGVpdGhlcgoJCQlldmVudC50YXJnZXQgPSBldmVudC5zcmNFbGVtZW50IHx8IGRvY3VtZW50OwoJCX0KCgkJLy8gY2hlY2sgaWYgdGFyZ2V0IGlzIGEgdGV4dG5vZGUgKHNhZmFyaSkKCQlpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7CgkJfQoKCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApIHsKCQkJZXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC50YXJnZXQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUKCQlpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwgJiYgZXZlbnQuY2xpZW50WCAhPSBudWxsICkgewoJCQl2YXIgZXZlbnREb2N1bWVudCA9IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50LAoJCQkJZG9jID0gZXZlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJCQlib2R5ID0gZXZlbnREb2N1bWVudC5ib2R5OwoKCQkJZXZlbnQucGFnZVggPSBldmVudC5jbGllbnRYICsgKGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwKSAtIChkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCk7CgkJCWV2ZW50LnBhZ2VZID0gZXZlbnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCAgfHwgMCkgLSAoZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDApOwoJCX0KCgkJLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCgkJaWYgKCBldmVudC53aGljaCA9PSBudWxsICYmIChldmVudC5jaGFyQ29kZSAhPSBudWxsIHx8IGV2ZW50LmtleUNvZGUgIT0gbnVsbCkgKSB7CgkJCWV2ZW50LndoaWNoID0gZXZlbnQuY2hhckNvZGUgIT0gbnVsbCA/IGV2ZW50LmNoYXJDb2RlIDogZXZlbnQua2V5Q29kZTsKCQl9CgoJCS8vIEFkZCBtZXRhS2V5IHRvIG5vbi1NYWMgYnJvd3NlcnMgKHVzZSBjdHJsIGZvciBQQydzIGFuZCBNZXRhIGZvciBNYWNzKQoJCWlmICggIWV2ZW50Lm1ldGFLZXkgJiYgZXZlbnQuY3RybEtleSApIHsKCQkJZXZlbnQubWV0YUtleSA9IGV2ZW50LmN0cmxLZXk7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJLy8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXQKCQlpZiAoICFldmVudC53aGljaCAmJiBldmVudC5idXR0b24gIT09IHVuZGVmaW5lZCApIHsKCQkJZXZlbnQud2hpY2ggPSAoZXZlbnQuYnV0dG9uICYgMSA/IDEgOiAoIGV2ZW50LmJ1dHRvbiAmIDIgPyAzIDogKCBldmVudC5idXR0b24gJiA0ID8gMiA6IDAgKSApKTsKCQl9CgoJCXJldHVybiBldmVudDsKCX0sCgoJLy8gRGVwcmVjYXRlZCwgdXNlIGpRdWVyeS5ndWlkIGluc3RlYWQKCWd1aWQ6IDFFOCwKCgkvLyBEZXByZWNhdGVkLCB1c2UgalF1ZXJ5LnByb3h5IGluc3RlYWQKCXByb3h5OiBqUXVlcnkucHJveHksCgoJc3BlY2lhbDogewoJCXJlYWR5OiB7CgkJCS8vIE1ha2Ugc3VyZSB0aGUgcmVhZHkgZXZlbnQgaXMgc2V0dXAKCQkJc2V0dXA6IGpRdWVyeS5iaW5kUmVhZHksCgkJCXRlYXJkb3duOiBqUXVlcnkubm9vcAoJCX0sCgoJCWxpdmU6IHsKCQkJYWRkOiBmdW5jdGlvbiggaGFuZGxlT2JqICkgewoJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywKCQkJCQlsaXZlQ29udmVydCggaGFuZGxlT2JqLm9yaWdUeXBlLCBoYW5kbGVPYmouc2VsZWN0b3IgKSwKCQkJCQlqUXVlcnkuZXh0ZW5kKHt9LCBoYW5kbGVPYmosIHtoYW5kbGVyOiBsaXZlSGFuZGxlciwgZ3VpZDogaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZH0pICk7CgkJCX0sCgoJCQlyZW1vdmU6IGZ1bmN0aW9uKCBoYW5kbGVPYmogKSB7CgkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCBsaXZlQ29udmVydCggaGFuZGxlT2JqLm9yaWdUeXBlLCBoYW5kbGVPYmouc2VsZWN0b3IgKSwgaGFuZGxlT2JqICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsKCQkJc2V0dXA6IGZ1bmN0aW9uKCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApIHsKCQkJCS8vIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIHNwZWNpYWwgY2FzZSBvbiB3aW5kb3dzCgkJCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggdGhpcyApICkgewoJCQkJCXRoaXMub25iZWZvcmV1bmxvYWQgPSBldmVudEhhbmRsZTsKCQkJCX0KCQkJfSwKCgkJCXRlYXJkb3duOiBmdW5jdGlvbiggbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSB7CgkJCQlpZiAoIHRoaXMub25iZWZvcmV1bmxvYWQgPT09IGV2ZW50SGFuZGxlICkgewoJCQkJCXRoaXMub25iZWZvcmV1bmxvYWQgPSBudWxsOwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciA/CglmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkgewoJCWlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkgewoJCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSwgZmFsc2UgKTsKCQl9Cgl9IDoKCWZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7CgkJaWYgKCBlbGVtLmRldGFjaEV2ZW50ICkgewoJCQllbGVtLmRldGFjaEV2ZW50KCAib24iICsgdHlwZSwgaGFuZGxlICk7CgkJfQoJfTsKCmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkgewoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICF0aGlzLnByZXZlbnREZWZhdWx0ICkgewoJCXJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7Cgl9CgoJLy8gRXZlbnQgb2JqZWN0CglpZiAoIHNyYyAmJiBzcmMudHlwZSApIHsKCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CgkJdGhpcy50eXBlID0gc3JjLnR5cGU7CgoJCS8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkCgkJLy8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuCgkJdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSAoc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwgc3JjLnJldHVyblZhbHVlID09PSBmYWxzZSB8fAoJCQlzcmMuZ2V0UHJldmVudERlZmF1bHQgJiYgc3JjLmdldFByZXZlbnREZWZhdWx0KCkpID8gcmV0dXJuVHJ1ZSA6IHJldHVybkZhbHNlOwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gdGltZVN0YW1wIGlzIGJ1Z2d5IGZvciBzb21lIGV2ZW50cyBvbiBGaXJlZm94KCMzODQzKQoJLy8gU28gd2Ugd29uJ3QgcmVseSBvbiB0aGUgbmF0aXZlIHZhbHVlCgl0aGlzLnRpbWVTdGFtcCA9IGpRdWVyeS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCmZ1bmN0aW9uIHJldHVybkZhbHNlKCkgewoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIHJldHVyblRydWUoKSB7CglyZXR1cm4gdHJ1ZTsKfQoKLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbApqUXVlcnkuRXZlbnQucHJvdG90eXBlID0gewoJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgkJaWYgKCAhZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKCQlpZiAoIGUucHJldmVudERlZmF1bHQgKSB7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCgkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgcmV0dXJuVmFsdWUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGZhbHNlIChJRSkKCQl9IGVsc2UgewoJCQllLnJldHVyblZhbHVlID0gZmFsc2U7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7CgoJCXZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OwoJCWlmICggIWUgKSB7CgkJCXJldHVybjsKCQl9CgkJLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CgkJaWYgKCBlLnN0b3BQcm9wYWdhdGlvbiApIHsKCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKCQl9CgkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgY2FuY2VsQnViYmxlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byB0cnVlIChJRSkKCQllLmNhbmNlbEJ1YmJsZSA9IHRydWU7Cgl9LAoJc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKCQl0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfSwKCWlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsCglpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCglpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UKfTsKCi8vIENoZWNrcyBpZiBhbiBldmVudCBoYXBwZW5lZCBvbiBhbiBlbGVtZW50IHdpdGhpbiBhbm90aGVyIGVsZW1lbnQKLy8gVXNlZCBpbiBqUXVlcnkuZXZlbnQuc3BlY2lhbC5tb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGhhbmRsZXJzCnZhciB3aXRoaW5FbGVtZW50ID0gZnVuY3Rpb24oIGV2ZW50ICkgewoKCS8vIENoZWNrIGlmIG1vdXNlKG92ZXJ8b3V0KSBhcmUgc3RpbGwgd2l0aGluIHRoZSBzYW1lIHBhcmVudCBlbGVtZW50Cgl2YXIgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsCgkJaW5zaWRlID0gZmFsc2UsCgkJZXZlbnRUeXBlID0gZXZlbnQudHlwZTsKCglldmVudC50eXBlID0gZXZlbnQuZGF0YTsKCglpZiAoIHJlbGF0ZWQgIT09IHRoaXMgKSB7CgoJCWlmICggcmVsYXRlZCApIHsKCQkJaW5zaWRlID0galF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCByZWxhdGVkICk7CgkJfQoKCQlpZiAoICFpbnNpZGUgKSB7CgoJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCgkJCWV2ZW50LnR5cGUgPSBldmVudFR5cGU7CgkJfQoJfQp9LAoKLy8gSW4gY2FzZSBvZiBldmVudCBkZWxlZ2F0aW9uLCB3ZSBvbmx5IG5lZWQgdG8gcmVuYW1lIHRoZSBldmVudC50eXBlLAovLyBsaXZlSGFuZGxlciB3aWxsIHRha2UgY2FyZSBvZiB0aGUgcmVzdC4KZGVsZWdhdGUgPSBmdW5jdGlvbiggZXZlbnQgKSB7CglldmVudC50eXBlID0gZXZlbnQuZGF0YTsKCWpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwp9OwoKLy8gQ3JlYXRlIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzCmpRdWVyeS5lYWNoKHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0Igp9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgewoJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHsKCQlzZXR1cDogZnVuY3Rpb24oIGRhdGEgKSB7CgkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIGZpeCwgZGF0YSAmJiBkYXRhLnNlbGVjdG9yID8gZGVsZWdhdGUgOiB3aXRoaW5FbGVtZW50LCBvcmlnICk7CgkJfSwKCQl0ZWFyZG93bjogZnVuY3Rpb24oIGRhdGEgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIGZpeCwgZGF0YSAmJiBkYXRhLnNlbGVjdG9yID8gZGVsZWdhdGUgOiB3aXRoaW5FbGVtZW50ICk7CgkJfQoJfTsKfSk7CgovLyBzdWJtaXQgZGVsZWdhdGlvbgppZiAoICFqUXVlcnkuc3VwcG9ydC5zdWJtaXRCdWJibGVzICkgewoKCWpRdWVyeS5ldmVudC5zcGVjaWFsLnN1Ym1pdCA9IHsKCQlzZXR1cDogZnVuY3Rpb24oIGRhdGEsIG5hbWVzcGFjZXMgKSB7CgkJCWlmICggIWpRdWVyeS5ub2RlTmFtZSggdGhpcywgImZvcm0iICkgKSB7CgkJCQlqUXVlcnkuZXZlbnQuYWRkKHRoaXMsICJjbGljay5zcGVjaWFsU3VibWl0IiwgZnVuY3Rpb24oIGUgKSB7CgkJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwKCQkJCQkJdHlwZSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8gZWxlbS50eXBlIDogIiI7CgoJCQkJCWlmICggKHR5cGUgPT09ICJzdWJtaXQiIHx8IHR5cGUgPT09ICJpbWFnZSIpICYmIGpRdWVyeSggZWxlbSApLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGggKSB7CgkJCQkJCXRyaWdnZXIoICJzdWJtaXQiLCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCQl9CgkJCQl9KTsKCgkJCQlqUXVlcnkuZXZlbnQuYWRkKHRoaXMsICJrZXlwcmVzcy5zcGVjaWFsU3VibWl0IiwgZnVuY3Rpb24oIGUgKSB7CgkJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwKCQkJCQkJdHlwZSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8gZWxlbS50eXBlIDogIiI7CgoJCQkJCWlmICggKHR5cGUgPT09ICJ0ZXh0IiB8fCB0eXBlID09PSAicGFzc3dvcmQiKSAmJiBqUXVlcnkoIGVsZW0gKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoICYmIGUua2V5Q29kZSA9PT0gMTMgKSB7CgkJCQkJCXRyaWdnZXIoICJzdWJtaXQiLCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCQl9CgkJCQl9KTsKCgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9LAoKCQl0ZWFyZG93bjogZnVuY3Rpb24oIG5hbWVzcGFjZXMgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuc3BlY2lhbFN1Ym1pdCIgKTsKCQl9Cgl9OwoKfQoKLy8gY2hhbmdlIGRlbGVnYXRpb24sIGhhcHBlbnMgaGVyZSBzbyB3ZSBoYXZlIGJpbmQuCmlmICggIWpRdWVyeS5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMgKSB7CgoJdmFyIGNoYW5nZUZpbHRlcnMsCgoJZ2V0VmFsID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHR5cGUgPSBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSA/IGVsZW0udHlwZSA6ICIiLAoJCQl2YWwgPSBlbGVtLnZhbHVlOwoKCQlpZiAoIHR5cGUgPT09ICJyYWRpbyIgfHwgdHlwZSA9PT0gImNoZWNrYm94IiApIHsKCQkJdmFsID0gZWxlbS5jaGVja2VkOwoKCQl9IGVsc2UgaWYgKCB0eXBlID09PSAic2VsZWN0LW11bHRpcGxlIiApIHsKCQkJdmFsID0gZWxlbS5zZWxlY3RlZEluZGV4ID4gLTEgPwoJCQkJalF1ZXJ5Lm1hcCggZWxlbS5vcHRpb25zLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZDsKCQkJCX0pLmpvaW4oIi0iKSA6CgkJCQkiIjsKCgkJfSBlbHNlIGlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkgewoJCQl2YWwgPSBlbGVtLnNlbGVjdGVkSW5kZXg7CgkJfQoKCQlyZXR1cm4gdmFsOwoJfSwKCgl0ZXN0Q2hhbmdlID0gZnVuY3Rpb24gdGVzdENoYW5nZSggZSApIHsKCQl2YXIgZWxlbSA9IGUudGFyZ2V0LCBkYXRhLCB2YWw7CgoJCWlmICggIXJmb3JtRWxlbXMudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IGVsZW0ucmVhZE9ubHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWRhdGEgPSBqUXVlcnkuX2RhdGEoIGVsZW0sICJfY2hhbmdlX2RhdGEiICk7CgkJdmFsID0gZ2V0VmFsKGVsZW0pOwoKCQkvLyB0aGUgY3VycmVudCBkYXRhIHdpbGwgYmUgYWxzbyByZXRyaWV2ZWQgYnkgYmVmb3JlYWN0aXZhdGUKCQlpZiAoIGUudHlwZSAhPT0gImZvY3Vzb3V0IiB8fCBlbGVtLnR5cGUgIT09ICJyYWRpbyIgKSB7CgkJCWpRdWVyeS5fZGF0YSggZWxlbSwgIl9jaGFuZ2VfZGF0YSIsIHZhbCApOwoJCX0KCgkJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBkYXRhICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGRhdGEgIT0gbnVsbCB8fCB2YWwgKSB7CgkJCWUudHlwZSA9ICJjaGFuZ2UiOwoJCQllLmxpdmVGaXJlZCA9IHVuZGVmaW5lZDsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIGFyZ3VtZW50c1sxXSwgZWxlbSApOwoJCX0KCX07CgoJalF1ZXJ5LmV2ZW50LnNwZWNpYWwuY2hhbmdlID0gewoJCWZpbHRlcnM6IHsKCQkJZm9jdXNvdXQ6IHRlc3RDaGFuZ2UsCgoJCQliZWZvcmVkZWFjdGl2YXRlOiB0ZXN0Q2hhbmdlLAoKCQkJY2xpY2s6IGZ1bmN0aW9uKCBlICkgewoJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwgdHlwZSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8gZWxlbS50eXBlIDogIiI7CgoJCQkJaWYgKCB0eXBlID09PSAicmFkaW8iIHx8IHR5cGUgPT09ICJjaGVja2JveCIgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkgewoJCQkJCXRlc3RDaGFuZ2UuY2FsbCggdGhpcywgZSApOwoJCQkJfQoJCQl9LAoKCQkJLy8gQ2hhbmdlIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlIHN1Ym1pdAoJCQkvLyBLZXlkb3duIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBrZXlwcmVzcywgd2hpY2ggaXMgdXNlZCBpbiBzdWJtaXQtZXZlbnQgZGVsZWdhdGlvbgoJCQlrZXlkb3duOiBmdW5jdGlvbiggZSApIHsKCQkJCXZhciBlbGVtID0gZS50YXJnZXQsIHR5cGUgPSBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSA/IGVsZW0udHlwZSA6ICIiOwoKCQkJCWlmICggKGUua2V5Q29kZSA9PT0gMTMgJiYgIWpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInRleHRhcmVhIiApICkgfHwKCQkJCQkoZS5rZXlDb2RlID09PSAzMiAmJiAodHlwZSA9PT0gImNoZWNrYm94IiB8fCB0eXBlID09PSAicmFkaW8iKSkgfHwKCQkJCQl0eXBlID09PSAic2VsZWN0LW11bHRpcGxlIiApIHsKCQkJCQl0ZXN0Q2hhbmdlLmNhbGwoIHRoaXMsIGUgKTsKCQkJCX0KCQkJfSwKCgkJCS8vIEJlZm9yZWFjdGl2YXRlIGhhcHBlbnMgYWxzbyBiZWZvcmUgdGhlIHByZXZpb3VzIGVsZW1lbnQgaXMgYmx1cnJlZAoJCQkvLyB3aXRoIHRoaXMgZXZlbnQgeW91IGNhbid0IHRyaWdnZXIgYSBjaGFuZ2UgZXZlbnQsIGJ1dCB5b3UgY2FuIHN0b3JlCgkJCS8vIGluZm9ybWF0aW9uCgkJCWJlZm9yZWFjdGl2YXRlOiBmdW5jdGlvbiggZSApIHsKCQkJCXZhciBlbGVtID0gZS50YXJnZXQ7CgkJCQlqUXVlcnkuX2RhdGEoIGVsZW0sICJfY2hhbmdlX2RhdGEiLCBnZXRWYWwoZWxlbSkgKTsKCQkJfQoJCX0sCgoJCXNldHVwOiBmdW5jdGlvbiggZGF0YSwgbmFtZXNwYWNlcyApIHsKCQkJaWYgKCB0aGlzLnR5cGUgPT09ICJmaWxlIiApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJZm9yICggdmFyIHR5cGUgaW4gY2hhbmdlRmlsdGVycyApIHsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUgKyAiLnNwZWNpYWxDaGFuZ2UiLCBjaGFuZ2VGaWx0ZXJzW3R5cGVdICk7CgkJCX0KCgkJCXJldHVybiByZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKCQl9LAoKCQl0ZWFyZG93bjogZnVuY3Rpb24oIG5hbWVzcGFjZXMgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuc3BlY2lhbENoYW5nZSIgKTsKCgkJCXJldHVybiByZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKCQl9Cgl9OwoKCWNoYW5nZUZpbHRlcnMgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbC5jaGFuZ2UuZmlsdGVyczsKCgkvLyBIYW5kbGUgd2hlbiB0aGUgaW5wdXQgaXMgLmZvY3VzKCknZAoJY2hhbmdlRmlsdGVycy5mb2N1cyA9IGNoYW5nZUZpbHRlcnMuYmVmb3JlYWN0aXZhdGU7Cn0KCmZ1bmN0aW9uIHRyaWdnZXIoIHR5cGUsIGVsZW0sIGFyZ3MgKSB7CgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuCgkvLyBGYWtlIG9yaWdpbmFsRXZlbnQgdG8gYXZvaWQgZG9ub3IncyBzdG9wUHJvcGFnYXRpb24sIGJ1dCBpZiB0aGUKCS8vIHNpbXVsYXRlZCBldmVudCBwcmV2ZW50cyBkZWZhdWx0IHRoZW4gd2UgZG8gdGhlIHNhbWUgb24gdGhlIGRvbm9yLgoJLy8gRG9uJ3QgcGFzcyBhcmdzIG9yIHJlbWVtYmVyIGxpdmVGaXJlZDsgdGhleSBhcHBseSB0byB0aGUgZG9ub3IgZXZlbnQuCgl2YXIgZXZlbnQgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgYXJnc1sgMCBdICk7CglldmVudC50eXBlID0gdHlwZTsKCWV2ZW50Lm9yaWdpbmFsRXZlbnQgPSB7fTsKCWV2ZW50LmxpdmVGaXJlZCA9IHVuZGVmaW5lZDsKCWpRdWVyeS5ldmVudC5oYW5kbGUuY2FsbCggZWxlbSwgZXZlbnQgKTsKCWlmICggZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CgkJYXJnc1sgMCBdLnByZXZlbnREZWZhdWx0KCk7Cgl9Cn0KCi8vIENyZWF0ZSAiYnViYmxpbmciIGZvY3VzIGFuZCBibHVyIGV2ZW50cwppZiAoICFqUXVlcnkuc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHsKCWpRdWVyeS5lYWNoKHsgZm9jdXM6ICJmb2N1c2luIiwgYmx1cjogImZvY3Vzb3V0IiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgewoKCQkvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGF0dGFjaGVzID0gMDsKCgkJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0gewoJCQlzZXR1cDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGF0dGFjaGVzKysgPT09IDAgKSB7CgkJCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQl9LAoJCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIC0tYXR0YWNoZXMgPT09IDAgKSB7CgkJCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQl9CgkJfTsKCgkJZnVuY3Rpb24gaGFuZGxlciggZG9ub3IgKSB7CgkJCS8vIERvbm9yIGV2ZW50IGlzIGFsd2F5cyBhIG5hdGl2ZSBvbmU7IGZpeCBpdCBhbmQgc3dpdGNoIGl0cyB0eXBlLgoJCQkvLyBMZXQgZm9jdXNpbi9vdXQgaGFuZGxlciBjYW5jZWwgdGhlIGRvbm9yIGZvY3VzL2JsdXIgZXZlbnQuCgkJCXZhciBlID0galF1ZXJ5LmV2ZW50LmZpeCggZG9ub3IgKTsKCQkJZS50eXBlID0gZml4OwoJCQllLm9yaWdpbmFsRXZlbnQgPSB7fTsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGUudGFyZ2V0ICk7CgkJCWlmICggZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCQkJCWRvbm9yLnByZXZlbnREZWZhdWx0KCk7CgkJCX0KCQl9Cgl9KTsKfQoKalF1ZXJ5LmVhY2goWyJiaW5kIiwgIm9uZSJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgewoJCXZhciBoYW5kbGVyOwoKCQkvLyBIYW5kbGUgb2JqZWN0IGxpdGVyYWxzCgkJaWYgKCB0eXBlb2YgdHlwZSA9PT0gIm9iamVjdCIgKSB7CgkJCWZvciAoIHZhciBrZXkgaW4gdHlwZSApIHsKCQkJCXRoaXNbIG5hbWUgXShrZXksIGRhdGEsIHR5cGVba2V5XSwgZm4pOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAyIHx8IGRhdGEgPT09IGZhbHNlICkgewoJCQlmbiA9IGRhdGE7CgkJCWRhdGEgPSB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIG5hbWUgPT09ICJvbmUiICkgewoJCQloYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJalF1ZXJ5KCB0aGlzICkudW5iaW5kKCBldmVudCwgaGFuZGxlciApOwoJCQkJcmV0dXJuIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJfTsKCQkJaGFuZGxlci5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOwoJCX0gZWxzZSB7CgkJCWhhbmRsZXIgPSBmbjsKCQl9CgoJCWlmICggdHlwZSA9PT0gInVubG9hZCIgJiYgbmFtZSAhPT0gIm9uZSIgKSB7CgkJCXRoaXMub25lKCB0eXBlLCBkYXRhLCBmbiApOwoKCQl9IGVsc2UgewoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXNbaV0sIHR5cGUsIGhhbmRsZXIsIGRhdGEgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Owp9KTsKCmpRdWVyeS5mbi5leHRlbmQoewoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CgkJLy8gSGFuZGxlIG9iamVjdCBsaXRlcmFscwoJCWlmICggdHlwZW9mIHR5cGUgPT09ICJvYmplY3QiICYmICF0eXBlLnByZXZlbnREZWZhdWx0ICkgewoJCQlmb3IgKCB2YXIga2V5IGluIHR5cGUgKSB7CgkJCQl0aGlzLnVuYmluZChrZXksIHR5cGVba2V5XSk7CgkJCX0KCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzW2ldLCB0eXBlLCBmbiApOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGRhdGEsIGZuICkgewoJCXJldHVybiB0aGlzLmxpdmUoIHR5cGVzLCBkYXRhLCBmbiwgc2VsZWN0b3IgKTsKCX0sCgoJdW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7CgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQlyZXR1cm4gdGhpcy51bmJpbmQoICJsaXZlIiApOwoKCQl9IGVsc2UgewoJCQlyZXR1cm4gdGhpcy5kaWUoIHR5cGVzLCBudWxsLCBmbiwgc2VsZWN0b3IgKTsKCQl9Cgl9LAoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7CgkJfSk7Cgl9LAoKCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlpZiAoIHRoaXNbMF0gKSB7CgkJCXJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpc1swXSwgdHJ1ZSApOwoJCX0KCX0sCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CgkJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZQoJCXZhciBhcmdzID0gYXJndW1lbnRzLAoJCQlndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrLAoJCQlpID0gMCwKCQkJdG9nZ2xlciA9IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24gdG8gZXhlY3V0ZQoJCQkJdmFyIGxhc3RUb2dnbGUgPSAoIGpRdWVyeS5kYXRhKCB0aGlzLCAibGFzdFRvZ2dsZSIgKyBmbi5ndWlkICkgfHwgMCApICUgaTsKCQkJCWpRdWVyeS5kYXRhKCB0aGlzLCAibGFzdFRvZ2dsZSIgKyBmbi5ndWlkLCBsYXN0VG9nZ2xlICsgMSApOwoKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wCgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJCS8vIGFuZCBleGVjdXRlIHRoZSBmdW5jdGlvbgoJCQkJcmV0dXJuIGFyZ3NbIGxhc3RUb2dnbGUgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgfHwgZmFsc2U7CgkJCX07CgoJCS8vIGxpbmsgYWxsIHRoZSBmdW5jdGlvbnMsIHNvIGFueSBvZiB0aGVtIGNhbiB1bmJpbmQgdGhpcyBjbGljayBoYW5kbGVyCgkJdG9nZ2xlci5ndWlkID0gZ3VpZDsKCQl3aGlsZSAoIGkgPCBhcmdzLmxlbmd0aCApIHsKCQkJYXJnc1sgaSsrIF0uZ3VpZCA9IGd1aWQ7CgkJfQoKCQlyZXR1cm4gdGhpcy5jbGljayggdG9nZ2xlciApOwoJfSwKCglob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7CgkJcmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7Cgl9Cn0pOwoKdmFyIGxpdmVNYXAgPSB7Cglmb2N1czogImZvY3VzaW4iLAoJYmx1cjogImZvY3Vzb3V0IiwKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0Igp9OwoKalF1ZXJ5LmVhY2goWyJsaXZlIiwgImRpZSJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiwgb3JpZ1NlbGVjdG9yIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgewoJCXZhciB0eXBlLCBpID0gMCwgbWF0Y2gsIG5hbWVzcGFjZXMsIHByZVR5cGUsCgkJCXNlbGVjdG9yID0gb3JpZ1NlbGVjdG9yIHx8IHRoaXMuc2VsZWN0b3IsCgkJCWNvbnRleHQgPSBvcmlnU2VsZWN0b3IgPyB0aGlzIDogalF1ZXJ5KCB0aGlzLmNvbnRleHQgKTsKCgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICYmICF0eXBlcy5wcmV2ZW50RGVmYXVsdCApIHsKCQkJZm9yICggdmFyIGtleSBpbiB0eXBlcyApIHsKCQkJCWNvbnRleHRbIG5hbWUgXSgga2V5LCBkYXRhLCB0eXBlc1trZXldLCBzZWxlY3RvciApOwoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCWlmICggbmFtZSA9PT0gImRpZSIgJiYgIXR5cGVzICYmCgkJCQkJb3JpZ1NlbGVjdG9yICYmIG9yaWdTZWxlY3Rvci5jaGFyQXQoMCkgPT09ICIuIiApIHsKCgkJCWNvbnRleHQudW5iaW5kKCBvcmlnU2VsZWN0b3IgKTsKCgkJCXJldHVybiB0aGlzOwoJCX0KCgkJaWYgKCBkYXRhID09PSBmYWxzZSB8fCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgewoJCQlmbiA9IGRhdGEgfHwgcmV0dXJuRmFsc2U7CgkJCWRhdGEgPSB1bmRlZmluZWQ7CgkJfQoKCQl0eXBlcyA9ICh0eXBlcyB8fCAiIikuc3BsaXQoIiAiKTsKCgkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgIT0gbnVsbCApIHsKCQkJbWF0Y2ggPSBybmFtZXNwYWNlcy5leGVjKCB0eXBlICk7CgkJCW5hbWVzcGFjZXMgPSAiIjsKCgkJCWlmICggbWF0Y2ggKSAgewoJCQkJbmFtZXNwYWNlcyA9IG1hdGNoWzBdOwoJCQkJdHlwZSA9IHR5cGUucmVwbGFjZSggcm5hbWVzcGFjZXMsICIiICk7CgkJCX0KCgkJCWlmICggdHlwZSA9PT0gImhvdmVyIiApIHsKCQkJCXR5cGVzLnB1c2goICJtb3VzZWVudGVyIiArIG5hbWVzcGFjZXMsICJtb3VzZWxlYXZlIiArIG5hbWVzcGFjZXMgKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlwcmVUeXBlID0gdHlwZTsKCgkJCWlmICggbGl2ZU1hcFsgdHlwZSBdICkgewoJCQkJdHlwZXMucHVzaCggbGl2ZU1hcFsgdHlwZSBdICsgbmFtZXNwYWNlcyApOwoJCQkJdHlwZSA9IHR5cGUgKyBuYW1lc3BhY2VzOwoKCQkJfSBlbHNlIHsKCQkJCXR5cGUgPSAobGl2ZU1hcFsgdHlwZSBdIHx8IHR5cGUpICsgbmFtZXNwYWNlczsKCQkJfQoKCQkJaWYgKCBuYW1lID09PSAibGl2ZSIgKSB7CgkJCQkvLyBiaW5kIGxpdmUgaGFuZGxlcgoJCQkJZm9yICggdmFyIGogPSAwLCBsID0gY29udGV4dC5sZW5ndGg7IGogPCBsOyBqKysgKSB7CgkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggY29udGV4dFtqXSwgImxpdmUuIiArIGxpdmVDb252ZXJ0KCB0eXBlLCBzZWxlY3RvciApLAoJCQkJCQl7IGRhdGE6IGRhdGEsIHNlbGVjdG9yOiBzZWxlY3RvciwgaGFuZGxlcjogZm4sIG9yaWdUeXBlOiB0eXBlLCBvcmlnSGFuZGxlcjogZm4sIHByZVR5cGU6IHByZVR5cGUgfSApOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCS8vIHVuYmluZCBsaXZlIGhhbmRsZXIKCQkJCWNvbnRleHQudW5iaW5kKCAibGl2ZS4iICsgbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICksIGZuICk7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfTsKfSk7CgpmdW5jdGlvbiBsaXZlSGFuZGxlciggZXZlbnQgKSB7Cgl2YXIgc3RvcCwgbWF4TGV2ZWwsIHJlbGF0ZWQsIG1hdGNoLCBoYW5kbGVPYmosIGVsZW0sIGosIGksIGwsIGRhdGEsIGNsb3NlLCBuYW1lc3BhY2UsIHJldCwKCQllbGVtcyA9IFtdLAoJCXNlbGVjdG9ycyA9IFtdLAoJCWV2ZW50cyA9IGpRdWVyeS5fZGF0YSggdGhpcywgImV2ZW50cyIgKTsKCgkvLyBNYWtlIHN1cmUgd2UgYXZvaWQgbm9uLWxlZnQtY2xpY2sgYnViYmxpbmcgaW4gRmlyZWZveCAoIzM4NjEpIGFuZCBkaXNhYmxlZCBlbGVtZW50cyBpbiBJRSAoIzY5MTEpCglpZiAoIGV2ZW50LmxpdmVGaXJlZCA9PT0gdGhpcyB8fCAhZXZlbnRzIHx8ICFldmVudHMubGl2ZSB8fCBldmVudC50YXJnZXQuZGlzYWJsZWQgfHwgZXZlbnQuYnV0dG9uICYmIGV2ZW50LnR5cGUgPT09ICJjbGljayIgKSB7CgkJcmV0dXJuOwoJfQoKCWlmICggZXZlbnQubmFtZXNwYWNlICkgewoJCW5hbWVzcGFjZSA9IG5ldyBSZWdFeHAoIihefFxcLikiICsgZXZlbnQubmFtZXNwYWNlLnNwbGl0KCIuIikuam9pbigiXFwuKD86LipcXC4pPyIpICsgIihcXC58JCkiKTsKCX0KCglldmVudC5saXZlRmlyZWQgPSB0aGlzOwoKCXZhciBsaXZlID0gZXZlbnRzLmxpdmUuc2xpY2UoMCk7CgoJZm9yICggaiA9IDA7IGogPCBsaXZlLmxlbmd0aDsgaisrICkgewoJCWhhbmRsZU9iaiA9IGxpdmVbal07CgoJCWlmICggaGFuZGxlT2JqLm9yaWdUeXBlLnJlcGxhY2UoIHJuYW1lc3BhY2VzLCAiIiApID09PSBldmVudC50eXBlICkgewoJCQlzZWxlY3RvcnMucHVzaCggaGFuZGxlT2JqLnNlbGVjdG9yICk7CgoJCX0gZWxzZSB7CgkJCWxpdmUuc3BsaWNlKCBqLS0sIDEgKTsKCQl9Cgl9CgoJbWF0Y2ggPSBqUXVlcnkoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoIHNlbGVjdG9ycywgZXZlbnQuY3VycmVudFRhcmdldCApOwoKCWZvciAoIGkgPSAwLCBsID0gbWF0Y2gubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCWNsb3NlID0gbWF0Y2hbaV07CgoJCWZvciAoIGogPSAwOyBqIDwgbGl2ZS5sZW5ndGg7IGorKyApIHsKCQkJaGFuZGxlT2JqID0gbGl2ZVtqXTsKCgkJCWlmICggY2xvc2Uuc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciAmJiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2UudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApKSAmJiAhY2xvc2UuZWxlbS5kaXNhYmxlZCApIHsKCQkJCWVsZW0gPSBjbG9zZS5lbGVtOwoJCQkJcmVsYXRlZCA9IG51bGw7CgoJCQkJLy8gVGhvc2UgdHdvIGV2ZW50cyByZXF1aXJlIGFkZGl0aW9uYWwgY2hlY2tpbmcKCQkJCWlmICggaGFuZGxlT2JqLnByZVR5cGUgPT09ICJtb3VzZWVudGVyIiB8fCBoYW5kbGVPYmoucHJlVHlwZSA9PT0gIm1vdXNlbGVhdmUiICkgewoJCQkJCWV2ZW50LnR5cGUgPSBoYW5kbGVPYmoucHJlVHlwZTsKCQkJCQlyZWxhdGVkID0galF1ZXJ5KCBldmVudC5yZWxhdGVkVGFyZ2V0ICkuY2xvc2VzdCggaGFuZGxlT2JqLnNlbGVjdG9yIClbMF07CgoJCQkJCS8vIE1ha2Ugc3VyZSBub3QgdG8gYWNjaWRlbnRhbGx5IG1hdGNoIGEgY2hpbGQgZWxlbWVudCB3aXRoIHRoZSBzYW1lIHNlbGVjdG9yCgkJCQkJaWYgKCByZWxhdGVkICYmIGpRdWVyeS5jb250YWlucyggZWxlbSwgcmVsYXRlZCApICkgewoJCQkJCQlyZWxhdGVkID0gZWxlbTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCAhcmVsYXRlZCB8fCByZWxhdGVkICE9PSBlbGVtICkgewoJCQkJCWVsZW1zLnB1c2goeyBlbGVtOiBlbGVtLCBoYW5kbGVPYmo6IGhhbmRsZU9iaiwgbGV2ZWw6IGNsb3NlLmxldmVsIH0pOwoJCQkJfQoJCQl9CgkJfQoJfQoKCWZvciAoIGkgPSAwLCBsID0gZWxlbXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCW1hdGNoID0gZWxlbXNbaV07CgoJCWlmICggbWF4TGV2ZWwgJiYgbWF0Y2gubGV2ZWwgPiBtYXhMZXZlbCApIHsKCQkJYnJlYWs7CgkJfQoKCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2guZWxlbTsKCQlldmVudC5kYXRhID0gbWF0Y2guaGFuZGxlT2JqLmRhdGE7CgkJZXZlbnQuaGFuZGxlT2JqID0gbWF0Y2guaGFuZGxlT2JqOwoKCQlyZXQgPSBtYXRjaC5oYW5kbGVPYmoub3JpZ0hhbmRsZXIuYXBwbHkoIG1hdGNoLmVsZW0sIGFyZ3VtZW50cyApOwoKCQlpZiAoIHJldCA9PT0gZmFsc2UgfHwgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbWF4TGV2ZWwgPSBtYXRjaC5sZXZlbDsKCgkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKCQkJCXN0b3AgPSBmYWxzZTsKCQkJfQoJCQlpZiAoIGV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCglyZXR1cm4gc3RvcDsKfQoKZnVuY3Rpb24gbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICkgewoJcmV0dXJuICh0eXBlICYmIHR5cGUgIT09ICIqIiA/IHR5cGUgKyAiLiIgOiAiIikgKyBzZWxlY3Rvci5yZXBsYWNlKHJwZXJpb2QsICJgIikucmVwbGFjZShyc3BhY2VzLCAiJiIpOwp9CgpqUXVlcnkuZWFjaCggKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayAiICsKCSJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSAiICsKCSJjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIikuc3BsaXQoIiAiKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CgoJLy8gSGFuZGxlIGV2ZW50IGJpbmRpbmcKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkgewoJCWlmICggZm4gPT0gbnVsbCApIHsKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gbnVsbDsKCQl9CgoJCXJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/CgkJCXRoaXMuYmluZCggbmFtZSwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKCglpZiAoIGpRdWVyeS5hdHRyRm4gKSB7CgkJalF1ZXJ5LmF0dHJGblsgbmFtZSBdID0gdHJ1ZTsKCX0KfSk7CgoKCi8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZQogKiAgQ29weXJpZ2h0IDIwMTEsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4KICogIE1vcmUgaW5mb3JtYXRpb246IGh0dHA6Ly9zaXp6bGVqcy5jb20vCiAqLwooZnVuY3Rpb24oKXsKCnZhciBjaHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZywKCWRvbmUgPSAwLAoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAoJaGFzRHVwbGljYXRlID0gZmFsc2UsCgliYXNlSGFzRHVwbGljYXRlID0gdHJ1ZSwKCXJCYWNrc2xhc2ggPSAvXFwvZywKCXJOb25Xb3JkID0gL1xXLzsKCi8vIEhlcmUgd2UgY2hlY2sgaWYgdGhlIEphdmFTY3JpcHQgZW5naW5lIGlzIHVzaW5nIHNvbWUgc29ydCBvZgovLyBvcHRpbWl6YXRpb24gd2hlcmUgaXQgZG9lcyBub3QgYWx3YXlzIGNhbGwgb3VyIGNvbXBhcmlzaW9uCi8vIGZ1bmN0aW9uLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBkaXNjYXJkIHRoZSBoYXNEdXBsaWNhdGUgdmFsdWUuCi8vICAgVGh1cyBmYXIgdGhhdCBpbmNsdWRlcyBHb29nbGUgQ2hyb21lLgpbMCwgMF0uc29ydChmdW5jdGlvbigpIHsKCWJhc2VIYXNEdXBsaWNhdGUgPSBmYWxzZTsKCXJldHVybiAwOwp9KTsKCnZhciBTaXp6bGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7CglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwoKCXZhciBvcmlnQ29udGV4dCA9IGNvbnRleHQ7CgoJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKSB7CgkJcmV0dXJuIFtdOwoJfQoJCglpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCXJldHVybiByZXN1bHRzOwoJfQoKCXZhciBtLCBzZXQsIGNoZWNrU2V0LCBleHRyYSwgcmV0LCBjdXIsIHBvcCwgaSwKCQlwcnVuZSA9IHRydWUsCgkJY29udGV4dFhNTCA9IFNpenpsZS5pc1hNTCggY29udGV4dCApLAoJCXBhcnRzID0gW10sCgkJc29GYXIgPSBzZWxlY3RvcjsKCQoJLy8gUmVzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaHVua2VyIHJlZ2V4cCAoc3RhcnQgZnJvbSBoZWFkKQoJZG8gewoJCWNodW5rZXIuZXhlYyggIiIgKTsKCQltID0gY2h1bmtlci5leGVjKCBzb0ZhciApOwoKCQlpZiAoIG0gKSB7CgkJCXNvRmFyID0gbVszXTsKCQkKCQkJcGFydHMucHVzaCggbVsxXSApOwoJCQoJCQlpZiAoIG1bMl0gKSB7CgkJCQlleHRyYSA9IG1bM107CgkJCQlicmVhazsKCQkJfQoJCX0KCX0gd2hpbGUgKCBtICk7CgoJaWYgKCBwYXJ0cy5sZW5ndGggPiAxICYmIG9yaWdQT1MuZXhlYyggc2VsZWN0b3IgKSApIHsKCgkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDIgJiYgRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSApIHsKCQkJc2V0ID0gcG9zUHJvY2VzcyggcGFydHNbMF0gKyBwYXJ0c1sxXSwgY29udGV4dCApOwoKCQl9IGVsc2UgewoJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdID8KCQkJCVsgY29udGV4dCBdIDoKCQkJCVNpenpsZSggcGFydHMuc2hpZnQoKSwgY29udGV4dCApOwoKCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQlzZWxlY3RvciA9IHBhcnRzLnNoaWZ0KCk7CgoJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyBzZWxlY3RvciBdICkgewoJCQkJCXNlbGVjdG9yICs9IHBhcnRzLnNoaWZ0KCk7CgkJCQl9CgkJCQkKCQkJCXNldCA9IHBvc1Byb2Nlc3MoIHNlbGVjdG9yLCBzZXQgKTsKCQkJfQoJCX0KCgl9IGVsc2UgewoJCS8vIFRha2UgYSBzaG9ydGN1dCBhbmQgc2V0IHRoZSBjb250ZXh0IGlmIHRoZSByb290IHNlbGVjdG9yIGlzIGFuIElECgkJLy8gKGJ1dCBub3QgaWYgaXQnbGwgYmUgZmFzdGVyIGlmIHRoZSBpbm5lciBzZWxlY3RvciBpcyBhbiBJRCkKCQlpZiAoICFzZWVkICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiAhY29udGV4dFhNTCAmJgoJCQkJRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzWzBdKSAmJiAhRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSApIHsKCgkJCXJldCA9IFNpenpsZS5maW5kKCBwYXJ0cy5zaGlmdCgpLCBjb250ZXh0LCBjb250ZXh0WE1MICk7CgkJCWNvbnRleHQgPSByZXQuZXhwciA/CgkJCQlTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApWzBdIDoKCQkJCXJldC5zZXRbMF07CgkJfQoKCQlpZiAoIGNvbnRleHQgKSB7CgkJCXJldCA9IHNlZWQgPwoJCQkJeyBleHByOiBwYXJ0cy5wb3AoKSwgc2V0OiBtYWtlQXJyYXkoc2VlZCkgfSA6CgkJCQlTaXp6bGUuZmluZCggcGFydHMucG9wKCksIHBhcnRzLmxlbmd0aCA9PT0gMSAmJiAocGFydHNbMF0gPT09ICJ+IiB8fCBwYXJ0c1swXSA9PT0gIisiKSAmJiBjb250ZXh0LnBhcmVudE5vZGUgPyBjb250ZXh0LnBhcmVudE5vZGUgOiBjb250ZXh0LCBjb250ZXh0WE1MICk7CgoJCQlzZXQgPSByZXQuZXhwciA/CgkJCQlTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApIDoKCQkJCXJldC5zZXQ7CgoJCQlpZiAoIHBhcnRzLmxlbmd0aCA+IDAgKSB7CgkJCQljaGVja1NldCA9IG1ha2VBcnJheSggc2V0ICk7CgoJCQl9IGVsc2UgewoJCQkJcHJ1bmUgPSBmYWxzZTsKCQkJfQoKCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQljdXIgPSBwYXJ0cy5wb3AoKTsKCQkJCXBvcCA9IGN1cjsKCgkJCQlpZiAoICFFeHByLnJlbGF0aXZlWyBjdXIgXSApIHsKCQkJCQljdXIgPSAiIjsKCQkJCX0gZWxzZSB7CgkJCQkJcG9wID0gcGFydHMucG9wKCk7CgkJCQl9CgoJCQkJaWYgKCBwb3AgPT0gbnVsbCApIHsKCQkJCQlwb3AgPSBjb250ZXh0OwoJCQkJfQoKCQkJCUV4cHIucmVsYXRpdmVbIGN1ciBdKCBjaGVja1NldCwgcG9wLCBjb250ZXh0WE1MICk7CgkJCX0KCgkJfSBlbHNlIHsKCQkJY2hlY2tTZXQgPSBwYXJ0cyA9IFtdOwoJCX0KCX0KCglpZiAoICFjaGVja1NldCApIHsKCQljaGVja1NldCA9IHNldDsKCX0KCglpZiAoICFjaGVja1NldCApIHsKCQlTaXp6bGUuZXJyb3IoIGN1ciB8fCBzZWxlY3RvciApOwoJfQoKCWlmICggdG9TdHJpbmcuY2FsbChjaGVja1NldCkgPT09ICJbb2JqZWN0IEFycmF5XSIgKSB7CgkJaWYgKCAhcHJ1bmUgKSB7CgkJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgY2hlY2tTZXQgKTsKCgkJfSBlbHNlIGlmICggY29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSAxICkgewoJCQlmb3IgKCBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgU2l6emxlLmNvbnRhaW5zKGNvbnRleHQsIGNoZWNrU2V0W2ldKSkgKSB7CgkJCQkJcmVzdWx0cy5wdXNoKCBzZXRbaV0gKTsKCQkJCX0KCQkJfQoKCQl9IGVsc2UgewoJCQlmb3IgKCBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiBjaGVja1NldFtpXS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOwoJCQkJfQoJCQl9CgkJfQoKCX0gZWxzZSB7CgkJbWFrZUFycmF5KCBjaGVja1NldCwgcmVzdWx0cyApOwoJfQoKCWlmICggZXh0cmEgKSB7CgkJU2l6emxlKCBleHRyYSwgb3JpZ0NvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTsKCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJfQoKCXJldHVybiByZXN1bHRzOwp9OwoKU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHsKCWlmICggc29ydE9yZGVyICkgewoJCWhhc0R1cGxpY2F0ZSA9IGJhc2VIYXNEdXBsaWNhdGU7CgkJcmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTsKCgkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJCWZvciAoIHZhciBpID0gMTsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIHJlc3VsdHNbaV0gPT09IHJlc3VsdHNbIGkgLSAxIF0gKSB7CgkJCQkJcmVzdWx0cy5zcGxpY2UoIGktLSwgMSApOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiByZXN1bHRzOwp9OwoKU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgc2V0ICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgc2V0ICk7Cn07CgpTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIG5vZGUsIGV4cHIgKSB7CglyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBbbm9kZV0gKS5sZW5ndGggPiAwOwp9OwoKU2l6emxlLmZpbmQgPSBmdW5jdGlvbiggZXhwciwgY29udGV4dCwgaXNYTUwgKSB7Cgl2YXIgc2V0OwoKCWlmICggIWV4cHIgKSB7CgkJcmV0dXJuIFtdOwoJfQoKCWZvciAoIHZhciBpID0gMCwgbCA9IEV4cHIub3JkZXIubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciBtYXRjaCwKCQkJdHlwZSA9IEV4cHIub3JkZXJbaV07CgkJCgkJaWYgKCAobWF0Y2ggPSBFeHByLmxlZnRNYXRjaFsgdHlwZSBdLmV4ZWMoIGV4cHIgKSkgKSB7CgkJCXZhciBsZWZ0ID0gbWF0Y2hbMV07CgkJCW1hdGNoLnNwbGljZSggMSwgMSApOwoKCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgIT09ICJcXCIgKSB7CgkJCQltYXRjaFsxXSA9IChtYXRjaFsxXSB8fCAiIikucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKTsKCQkJCXNldCA9IEV4cHIuZmluZFsgdHlwZSBdKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKTsKCgkJCQlpZiAoIHNldCAhPSBudWxsICkgewoJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCX0KCglpZiAoICFzZXQgKSB7CgkJc2V0ID0gdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiID8KCQkJY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICkgOgoJCQlbXTsKCX0KCglyZXR1cm4geyBzZXQ6IHNldCwgZXhwcjogZXhwciB9Owp9OwoKU2l6emxlLmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBzZXQsIGlucGxhY2UsIG5vdCApIHsKCXZhciBtYXRjaCwgYW55Rm91bmQsCgkJb2xkID0gZXhwciwKCQlyZXN1bHQgPSBbXSwKCQljdXJMb29wID0gc2V0LAoJCWlzWE1MRmlsdGVyID0gc2V0ICYmIHNldFswXSAmJiBTaXp6bGUuaXNYTUwoIHNldFswXSApOwoKCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkgewoJCWZvciAoIHZhciB0eXBlIGluIEV4cHIuZmlsdGVyICkgewoJCQlpZiAoIChtYXRjaCA9IEV4cHIubGVmdE1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSAhPSBudWxsICYmIG1hdGNoWzJdICkgewoJCQkJdmFyIGZvdW5kLCBpdGVtLAoJCQkJCWZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sCgkJCQkJbGVmdCA9IG1hdGNoWzFdOwoKCQkJCWFueUZvdW5kID0gZmFsc2U7CgoJCQkJbWF0Y2guc3BsaWNlKDEsMSk7CgoJCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgPT09ICJcXCIgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJaWYgKCBjdXJMb29wID09PSByZXN1bHQgKSB7CgkJCQkJcmVzdWx0ID0gW107CgkJCQl9CgoJCQkJaWYgKCBFeHByLnByZUZpbHRlclsgdHlwZSBdICkgewoJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOwoKCQkJCQlpZiAoICFtYXRjaCApIHsKCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7CgoJCQkJCX0gZWxzZSBpZiAoIG1hdGNoID09PSB0cnVlICkgewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBtYXRjaCApIHsKCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJCQlpZiAoIGl0ZW0gKSB7CgkJCQkJCQlmb3VuZCA9IGZpbHRlciggaXRlbSwgbWF0Y2gsIGksIGN1ckxvb3AgKTsKCQkJCQkJCXZhciBwYXNzID0gbm90IF4gISFmb3VuZDsKCgkJCQkJCQlpZiAoIGlucGxhY2UgJiYgZm91bmQgIT0gbnVsbCApIHsKCQkJCQkJCQlpZiAoIHBhc3MgKSB7CgkJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKCgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOwoJCQkJCQkJCX0KCgkJCQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgewoJCQkJCQkJCXJlc3VsdC5wdXNoKCBpdGVtICk7CgkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZm91bmQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlpZiAoICFpbnBsYWNlICkgewoJCQkJCQljdXJMb29wID0gcmVzdWx0OwoJCQkJCX0KCgkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOwoKCQkJCQlpZiAoICFhbnlGb3VuZCApIHsKCQkJCQkJcmV0dXJuIFtdOwoJCQkJCX0KCgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24KCQlpZiAoIGV4cHIgPT09IG9sZCApIHsKCQkJaWYgKCBhbnlGb3VuZCA9PSBudWxsICkgewoJCQkJU2l6emxlLmVycm9yKCBleHByICk7CgoJCQl9IGVsc2UgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCW9sZCA9IGV4cHI7Cgl9CgoJcmV0dXJuIGN1ckxvb3A7Cn07CgpTaXp6bGUuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkgewoJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2c7Cn07Cgp2YXIgRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7CglvcmRlcjogWyAiSUQiLCAiTkFNRSIsICJUQUciIF0sCgoJbWF0Y2g6IHsKCQlJRDogLyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLAoJCUNMQVNTOiAvXC4oKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLAoJCU5BTUU6IC9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLywKCQlBVFRSOiAvXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLywKCQlUQUc6IC9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKlwtXXxcXC4pKykvLAoJCUNISUxEOiAvOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LywKCQlQT1M6IC86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLAoJCVBTRVVETzogLzooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykoPzpcKChbJyJdPykoKD86XChbXlwpXStcKXxbXlwoXCldKikrKVwyXCkpPy8KCX0sCgoJbGVmdE1hdGNoOiB7fSwKCglhdHRyTWFwOiB7CgkJImNsYXNzIjogImNsYXNzTmFtZSIsCgkJImZvciI6ICJodG1sRm9yIgoJfSwKCglhdHRySGFuZGxlOiB7CgkJaHJlZjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggImhyZWYiICk7CgkJfSwKCQl0eXBlOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCAidHlwZSIgKTsKCQl9Cgl9LAoKCXJlbGF0aXZlOiB7CgkJIisiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCl7CgkJCXZhciBpc1BhcnRTdHIgPSB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIsCgkJCQlpc1RhZyA9IGlzUGFydFN0ciAmJiAhck5vbldvcmQudGVzdCggcGFydCApLAoJCQkJaXNQYXJ0U3RyTm90VGFnID0gaXNQYXJ0U3RyICYmICFpc1RhZzsKCgkJCWlmICggaXNUYWcgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGgsIGVsZW07IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIChlbGVtID0gY2hlY2tTZXRbaV0pICkgewoJCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtLnByZXZpb3VzU2libGluZykgJiYgZWxlbS5ub2RlVHlwZSAhPT0gMSApIHt9CgoJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyTm90VGFnIHx8IGVsZW0gJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJ0ID8KCQkJCQkJZWxlbSB8fCBmYWxzZSA6CgkJCQkJCWVsZW0gPT09IHBhcnQ7CgkJCQl9CgkJCX0KCgkJCWlmICggaXNQYXJ0U3RyTm90VGFnICkgewoJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKCQkJfQoJCX0sCgoJCSI+IjogZnVuY3Rpb24oIGNoZWNrU2V0LCBwYXJ0ICkgewoJCQl2YXIgZWxlbSwKCQkJCWlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiwKCQkJCWkgPSAwLAoJCQkJbCA9IGNoZWNrU2V0Lmxlbmd0aDsKCgkJCWlmICggaXNQYXJ0U3RyICYmICFyTm9uV29yZC50ZXN0KCBwYXJ0ICkgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoKCQkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCQllbGVtID0gY2hlY2tTZXRbaV07CgoJCQkJCWlmICggZWxlbSApIHsKCQkJCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJCQkJY2hlY2tTZXRbaV0gPSBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFydCA/IHBhcmVudCA6IGZhbHNlOwoJCQkJCX0KCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJZWxlbSA9IGNoZWNrU2V0W2ldOwoKCQkJCQlpZiAoIGVsZW0gKSB7CgkJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyID8KCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA6CgkJCQkJCQllbGVtLnBhcmVudE5vZGUgPT09IHBhcnQ7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggaXNQYXJ0U3RyICkgewoJCQkJCVNpenpsZS5maWx0ZXIoIHBhcnQsIGNoZWNrU2V0LCB0cnVlICk7CgkJCQl9CgkJCX0KCQl9LAoKCQkiIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsKCQkJdmFyIG5vZGVDaGVjaywKCQkJCWRvbmVOYW1lID0gZG9uZSsrLAoJCQkJY2hlY2tGbiA9IGRpckNoZWNrOwoKCQkJaWYgKCB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIgJiYgIXJOb25Xb3JkLnRlc3QoIHBhcnQgKSApIHsKCQkJCXBhcnQgPSBwYXJ0LnRvTG93ZXJDYXNlKCk7CgkJCQlub2RlQ2hlY2sgPSBwYXJ0OwoJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsKCQkJfQoKCQkJY2hlY2tGbiggInBhcmVudE5vZGUiLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKTsKCQl9LAoKCQkifiI6IGZ1bmN0aW9uKCBjaGVja1NldCwgcGFydCwgaXNYTUwgKSB7CgkJCXZhciBub2RlQ2hlY2ssCgkJCQlkb25lTmFtZSA9IGRvbmUrKywKCQkJCWNoZWNrRm4gPSBkaXJDaGVjazsKCgkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICFyTm9uV29yZC50ZXN0KCBwYXJ0ICkgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoJCQkJbm9kZUNoZWNrID0gcGFydDsKCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CgkJCX0KCgkJCWNoZWNrRm4oICJwcmV2aW91c1NpYmxpbmciLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKTsKCQl9Cgl9LAoKCWZpbmQ6IHsKCQlJRDogZnVuY3Rpb24oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgewoJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCgkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCgkJCQlyZXR1cm4gbSAmJiBtLnBhcmVudE5vZGUgPyBbbV0gOiBbXTsKCQkJfQoJCX0sCgoJCU5BTUU6IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSAhPT0gInVuZGVmaW5lZCIgKSB7CgkJCQl2YXIgcmV0ID0gW10sCgkJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUoIG1hdGNoWzFdICk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpID09PSBtYXRjaFsxXSApIHsKCQkJCQkJcmV0LnB1c2goIHJlc3VsdHNbaV0gKTsKCQkJCQl9CgkJCQl9CgoJCQkJcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0OwoJCQl9CgkJfSwKCgkJVEFHOiBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIG1hdGNoWzFdICk7CgkJCX0KCQl9Cgl9LAoJcHJlRmlsdGVyOiB7CgkJQ0xBU1M6IGZ1bmN0aW9uKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MICkgewoJCQltYXRjaCA9ICIgIiArIG1hdGNoWzFdLnJlcGxhY2UoIHJCYWNrc2xhc2gsICIiICkgKyAiICI7CgoJCQlpZiAoIGlzWE1MICkgewoJCQkJcmV0dXJuIG1hdGNoOwoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBlbGVtICkgewoJCQkJCWlmICggbm90IF4gKGVsZW0uY2xhc3NOYW1lICYmICgiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIikucmVwbGFjZSgvW1x0XG5ccl0vZywgIiAiKS5pbmRleE9mKG1hdGNoKSA+PSAwKSApIHsKCQkJCQkJaWYgKCAhaW5wbGFjZSApIHsKCQkJCQkJCXJlc3VsdC5wdXNoKCBlbGVtICk7CgkJCQkJCX0KCgkJCQkJfSBlbHNlIGlmICggaW5wbGFjZSApIHsKCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0sCgoJCUlEOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCXJldHVybiBtYXRjaFsxXS5yZXBsYWNlKCByQmFja3NsYXNoLCAiIiApOwoJCX0sCgoJCVRBRzogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wICkgewoJCQlyZXR1cm4gbWF0Y2hbMV0ucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKS50b0xvd2VyQ2FzZSgpOwoJCX0sCgoJCUNISUxEOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCWlmICggbWF0Y2hbMV0gPT09ICJudGgiICkgewoJCQkJaWYgKCAhbWF0Y2hbMl0gKSB7CgkJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQkJfQoKCQkJCW1hdGNoWzJdID0gbWF0Y2hbMl0ucmVwbGFjZSgvXlwrfFxzKi9nLCAnJyk7CgoJCQkJLy8gcGFyc2UgZXF1YXRpb25zIGxpa2UgJ2V2ZW4nLCAnb2RkJywgJzUnLCAnMm4nLCAnM24rMicsICc0bi0xJywgJy1uKzYnCgkJCQl2YXIgdGVzdCA9IC8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYygKCQkJCQltYXRjaFsyXSA9PT0gImV2ZW4iICYmICIybiIgfHwgbWF0Y2hbMl0gPT09ICJvZGQiICYmICIybisxIiB8fAoJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7CgoJCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXJzIChmaXJzdCluKyhsYXN0KSBpbmNsdWRpbmcgaWYgdGhleSBhcmUgbmVnYXRpdmUKCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOwoJCQkJbWF0Y2hbM10gPSB0ZXN0WzNdIC0gMDsKCQkJfQoJCQllbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCX0KCgkJCS8vIFRPRE86IE1vdmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lzdGVtCgkJCW1hdGNoWzBdID0gZG9uZSsrOwoKCQkJcmV0dXJuIG1hdGNoOwoJCX0sCgoJCUFUVFI6IGZ1bmN0aW9uKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MICkgewoJCQl2YXIgbmFtZSA9IG1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKTsKCQkJCgkJCWlmICggIWlzWE1MICYmIEV4cHIuYXR0ck1hcFtuYW1lXSApIHsKCQkJCW1hdGNoWzFdID0gRXhwci5hdHRyTWFwW25hbWVdOwoJCQl9CgoJCQkvLyBIYW5kbGUgaWYgYW4gdW4tcXVvdGVkIHZhbHVlIHdhcyB1c2VkCgkJCW1hdGNoWzRdID0gKCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJCYWNrc2xhc2gsICIiICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbNF0gPSAiICIgKyBtYXRjaFs0XSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoOwoJCX0sCgoJCVBTRVVETzogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCApIHsKCQkJaWYgKCBtYXRjaFsxXSA9PT0gIm5vdCIgKSB7CgkJCQkvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQoJCQkJaWYgKCAoIGNodW5rZXIuZXhlYyhtYXRjaFszXSkgfHwgIiIgKS5sZW5ndGggPiAxIHx8IC9eXHcvLnRlc3QobWF0Y2hbM10pICkgewoJCQkJCW1hdGNoWzNdID0gU2l6emxlKG1hdGNoWzNdLCBudWxsLCBudWxsLCBjdXJMb29wKTsKCgkJCQl9IGVsc2UgewoJCQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVlIF4gbm90KTsKCgkJCQkJaWYgKCAhaW5wbGFjZSApIHsKCQkJCQkJcmVzdWx0LnB1c2guYXBwbHkoIHJlc3VsdCwgcmV0ICk7CgkJCQkJfQoKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgoJCQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCQoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJUE9TOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoLnVuc2hpZnQoIHRydWUgKTsKCgkJCXJldHVybiBtYXRjaDsKCQl9Cgl9LAoJCglmaWx0ZXJzOiB7CgkJZW5hYmxlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSAmJiBlbGVtLnR5cGUgIT09ICJoaWRkZW4iOwoJCX0sCgoJCWRpc2FibGVkOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CgkJfSwKCgkJY2hlY2tlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmNoZWNrZWQgPT09IHRydWU7CgkJfSwKCQkKCQlzZWxlY3RlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCS8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHQKCQkJLy8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseQoJCQlpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OwoJCQl9CgkJCQoJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKCQl9LAoKCQlwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gISFlbGVtLmZpcnN0Q2hpbGQ7CgkJfSwKCgkJZW1wdHk6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIWVsZW0uZmlyc3RDaGlsZDsKCQl9LAoKCQloYXM6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuICEhU2l6emxlKCBtYXRjaFszXSwgZWxlbSApLmxlbmd0aDsKCQl9LAoKCQloZWFkZXI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gKC9oXGQvaSkudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCXRleHQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCAidHlwZSIgKSwgdHlwZSA9IGVsZW0udHlwZTsKCQkJLy8gSUU2IGFuZCA3IHdpbGwgbWFwIGVsZW0udHlwZSB0byAndGV4dCcgZm9yIG5ldyBIVE1MNSB0eXBlcyAoc2VhcmNoLCBldGMpIAoJCQkvLyB1c2UgZ2V0QXR0cmlidXRlIGluc3RlYWQgdG8gdGVzdCB0aGlzIGNhc2UKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAidGV4dCIgPT09IHR5cGUgJiYgKCBhdHRyID09PSB0eXBlIHx8IGF0dHIgPT09IG51bGwgKTsKCQl9LAoKCQlyYWRpbzogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYgInJhZGlvIiA9PT0gZWxlbS50eXBlOwoJCX0sCgoJCWNoZWNrYm94OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAiY2hlY2tib3giID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJZmlsZTogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYgImZpbGUiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJcGFzc3dvcmQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaW5wdXQiICYmICJwYXNzd29yZCIgPT09IGVsZW0udHlwZTsKCQl9LAoKCQlzdWJtaXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiAic3VibWl0IiA9PT0gZWxlbS50eXBlOwoJCX0sCgoJCWltYWdlOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAiaW1hZ2UiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJcmVzZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiAicmVzZXQiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJYnV0dG9uOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmICJidXR0b24iID09PSBlbGVtLnR5cGUgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJaW5wdXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gKC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kpLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQlmb2N1czogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBlbGVtLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCQl9Cgl9LAoJc2V0RmlsdGVyczogewoJCWZpcnN0OiBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuIGkgPT09IDA7CgkJfSwKCgkJbGFzdDogZnVuY3Rpb24oIGVsZW0sIGksIG1hdGNoLCBhcnJheSApIHsKCQkJcmV0dXJuIGkgPT09IGFycmF5Lmxlbmd0aCAtIDE7CgkJfSwKCgkJZXZlbjogZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBpICUgMiA9PT0gMDsKCQl9LAoKCQlvZGQ6IGZ1bmN0aW9uKCBlbGVtLCBpICkgewoJCQlyZXR1cm4gaSAlIDIgPT09IDE7CgkJfSwKCgkJbHQ6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIGkgPCBtYXRjaFszXSAtIDA7CgkJfSwKCgkJZ3Q6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIGkgPiBtYXRjaFszXSAtIDA7CgkJfSwKCgkJbnRoOiBmdW5jdGlvbiggZWxlbSwgaSwgbWF0Y2ggKSB7CgkJCXJldHVybiBtYXRjaFszXSAtIDAgPT09IGk7CgkJfSwKCgkJZXE6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PT0gaTsKCQl9Cgl9LAoJZmlsdGVyOiB7CgkJUFNFVURPOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2gsIGksIGFycmF5ICkgewoJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLAoJCQkJZmlsdGVyID0gRXhwci5maWx0ZXJzWyBuYW1lIF07CgoJCQlpZiAoIGZpbHRlciApIHsKCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOwoKCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsKCQkJCXJldHVybiAoZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBTaXp6bGUuZ2V0VGV4dChbIGVsZW0gXSkgfHwgIiIpLmluZGV4T2YobWF0Y2hbM10pID49IDA7CgoJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAibm90IiApIHsKCQkJCXZhciBub3QgPSBtYXRjaFszXTsKCgkJCQlmb3IgKCB2YXIgaiA9IDAsIGwgPSBub3QubGVuZ3RoOyBqIDwgbDsgaisrICkgewoJCQkJCWlmICggbm90W2pdID09PSBlbGVtICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiB0cnVlOwoKCQkJfSBlbHNlIHsKCQkJCVNpenpsZS5lcnJvciggbmFtZSApOwoJCQl9CgkJfSwKCgkJQ0hJTEQ6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIHR5cGUgPSBtYXRjaFsxXSwKCQkJCW5vZGUgPSBlbGVtOwoKCQkJc3dpdGNoICggdHlwZSApIHsKCQkJCWNhc2UgIm9ubHkiOgoJCQkJY2FzZSAiZmlyc3QiOgoJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZykgKQkgewoJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7IAoJCQkJCQkJcmV0dXJuIGZhbHNlOyAKCQkJCQkJfQoJCQkJCX0KCgkJCQkJaWYgKCB0eXBlID09PSAiZmlyc3QiICkgeyAKCQkJCQkJcmV0dXJuIHRydWU7IAoJCQkJCX0KCgkJCQkJbm9kZSA9IGVsZW07CgoJCQkJY2FzZSAibGFzdCI6CgkJCQkJd2hpbGUgKCAobm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpICkJIHsKCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgeyAKCQkJCQkJCXJldHVybiBmYWxzZTsgCgkJCQkJCX0KCQkJCQl9CgoJCQkJCXJldHVybiB0cnVlOwoKCQkJCWNhc2UgIm50aCI6CgkJCQkJdmFyIGZpcnN0ID0gbWF0Y2hbMl0sCgkJCQkJCWxhc3QgPSBtYXRjaFszXTsKCgkJCQkJaWYgKCBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQkJCgkJCQkJdmFyIGRvbmVOYW1lID0gbWF0Y2hbMF0sCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQoJCQkJCWlmICggcGFyZW50ICYmIChwYXJlbnQuc2l6Y2FjaGUgIT09IGRvbmVOYW1lIHx8ICFlbGVtLm5vZGVJbmRleCkgKSB7CgkJCQkJCXZhciBjb3VudCA9IDA7CgkJCQkJCQoJCQkJCQlmb3IgKCBub2RlID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nICkgewoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJCW5vZGUubm9kZUluZGV4ID0gKytjb3VudDsKCQkJCQkJCX0KCQkJCQkJfSAKCgkJCQkJCXBhcmVudC5zaXpjYWNoZSA9IGRvbmVOYW1lOwoJCQkJCX0KCQkJCQkKCQkJCQl2YXIgZGlmZiA9IGVsZW0ubm9kZUluZGV4IC0gbGFzdDsKCgkJCQkJaWYgKCBmaXJzdCA9PT0gMCApIHsKCQkJCQkJcmV0dXJuIGRpZmYgPT09IDA7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJfQoJCX0sCgoJCUlEOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2ggKSB7CgkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpID09PSBtYXRjaDsKCQl9LAoKCQlUQUc6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJcmV0dXJuIChtYXRjaCA9PT0gIioiICYmIGVsZW0ubm9kZVR5cGUgPT09IDEpIHx8IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbWF0Y2g7CgkJfSwKCQkKCQlDTEFTUzogZnVuY3Rpb24oIGVsZW0sIG1hdGNoICkgewoJCQlyZXR1cm4gKCIgIiArIChlbGVtLmNsYXNzTmFtZSB8fCBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkgKyAiICIpCgkJCQkuaW5kZXhPZiggbWF0Y2ggKSA+IC0xOwoJCX0sCgoJCUFUVFI6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwKCQkJCXJlc3VsdCA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8KCQkJCQlFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSggZWxlbSApIDoKCQkJCQllbGVtWyBuYW1lIF0gIT0gbnVsbCA/CgkJCQkJCWVsZW1bIG5hbWUgXSA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICksCgkJCQl2YWx1ZSA9IHJlc3VsdCArICIiLAoJCQkJdHlwZSA9IG1hdGNoWzJdLAoJCQkJY2hlY2sgPSBtYXRjaFs0XTsKCgkJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/CgkJCQl0eXBlID09PSAiIT0iIDoKCQkJCXR5cGUgPT09ICI9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gIio9IiA/CgkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCXR5cGUgPT09ICJ+PSIgPwoJCQkJKCIgIiArIHZhbHVlICsgIiAiKS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCSFjaGVjayA/CgkJCQl2YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoKCQkJCXR5cGUgPT09ICIhPSIgPwoJCQkJdmFsdWUgIT09IGNoZWNrIDoKCQkJCXR5cGUgPT09ICJePSIgPwoJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPT09IDAgOgoJCQkJdHlwZSA9PT0gIiQ9IiA/CgkJCQl2YWx1ZS5zdWJzdHIodmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoKSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gInw9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgfHwgdmFsdWUuc3Vic3RyKDAsIGNoZWNrLmxlbmd0aCArIDEpID09PSBjaGVjayArICItIiA6CgkJCQlmYWxzZTsKCQl9LAoKCQlQT1M6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCwgaSwgYXJyYXkgKSB7CgkJCXZhciBuYW1lID0gbWF0Y2hbMl0sCgkJCQlmaWx0ZXIgPSBFeHByLnNldEZpbHRlcnNbIG5hbWUgXTsKCgkJCWlmICggZmlsdGVyICkgewoJCQkJcmV0dXJuIGZpbHRlciggZWxlbSwgaSwgbWF0Y2gsIGFycmF5ICk7CgkJCX0KCQl9Cgl9Cn07Cgp2YXIgb3JpZ1BPUyA9IEV4cHIubWF0Y2guUE9TLAoJZmVzY2FwZSA9IGZ1bmN0aW9uKGFsbCwgbnVtKXsKCQlyZXR1cm4gIlxcIiArIChudW0gLSAwICsgMSk7Cgl9OwoKZm9yICggdmFyIHR5cGUgaW4gRXhwci5tYXRjaCApIHsKCUV4cHIubWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UgKyAoLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSApOwoJRXhwci5sZWZ0TWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2UgKyBFeHByLm1hdGNoWyB0eXBlIF0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZywgZmVzY2FwZSkgKTsKfQoKdmFyIG1ha2VBcnJheSA9IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKCWFycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5LCAwICk7CgoJaWYgKCByZXN1bHRzICkgewoJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgYXJyYXkgKTsKCQlyZXR1cm4gcmVzdWx0czsKCX0KCQoJcmV0dXJuIGFycmF5Owp9OwoKLy8gUGVyZm9ybSBhIHNpbXBsZSBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGhlIGJyb3dzZXIgaXMgY2FwYWJsZSBvZgovLyBjb252ZXJ0aW5nIGEgTm9kZUxpc3QgdG8gYW4gYXJyYXkgdXNpbmcgYnVpbHRpbiBtZXRob2RzLgovLyBBbHNvIHZlcmlmaWVzIHRoYXQgdGhlIHJldHVybmVkIGFycmF5IGhvbGRzIERPTSBub2RlcwovLyAod2hpY2ggaXMgbm90IHRoZSBjYXNlIGluIHRoZSBCbGFja2JlcnJ5IGJyb3dzZXIpCnRyeSB7CglBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsIDAgKVswXS5ub2RlVHlwZTsKCi8vIFByb3ZpZGUgYSBmYWxsYmFjayBtZXRob2QgaWYgaXQgZG9lcyBub3Qgd29yawp9IGNhdGNoKCBlICkgewoJbWFrZUFycmF5ID0gZnVuY3Rpb24oIGFycmF5LCByZXN1bHRzICkgewoJCXZhciBpID0gMCwKCQkJcmV0ID0gcmVzdWx0cyB8fCBbXTsKCgkJaWYgKCB0b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKCQkJQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIHJldCwgYXJyYXkgKTsKCgkJfSBlbHNlIHsKCQkJaWYgKCB0eXBlb2YgYXJyYXkubGVuZ3RoID09PSAibnVtYmVyIiApIHsKCQkJCWZvciAoIHZhciBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCXJldC5wdXNoKCBhcnJheVtpXSApOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCWZvciAoIDsgYXJyYXlbaV07IGkrKyApIHsKCQkJCQlyZXQucHVzaCggYXJyYXlbaV0gKTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX07Cn0KCnZhciBzb3J0T3JkZXIsIHNpYmxpbmdDaGVjazsKCmlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICkgewoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCWlmICggIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gfHwgIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7CgkJCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8gLTEgOiAxOwoJCX0KCgkJcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiA0ID8gLTEgOiAxOwoJfTsKCn0gZWxzZSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBUaGUgbm9kZXMgYXJlIGlkZW50aWNhbCwgd2UgY2FuIGV4aXQgZWFybHkKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJCXJldHVybiAwOwoKCQkvLyBGYWxsYmFjayB0byB1c2luZyBzb3VyY2VJbmRleCAoaW4gSUUpIGlmIGl0J3MgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXMKCQl9IGVsc2UgaWYgKCBhLnNvdXJjZUluZGV4ICYmIGIuc291cmNlSW5kZXggKSB7CgkJCXJldHVybiBhLnNvdXJjZUluZGV4IC0gYi5zb3VyY2VJbmRleDsKCQl9CgoJCXZhciBhbCwgYmwsCgkJCWFwID0gW10sCgkJCWJwID0gW10sCgkJCWF1cCA9IGEucGFyZW50Tm9kZSwKCQkJYnVwID0gYi5wYXJlbnROb2RlLAoJCQljdXIgPSBhdXA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MgKG9yIGlkZW50aWNhbCkgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2sKCQlpZiAoIGF1cCA9PT0gYnVwICkgewoJCQlyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7CgoJCS8vIElmIG5vIHBhcmVudHMgd2VyZSBmb3VuZCB0aGVuIHRoZSBub2RlcyBhcmUgZGlzY29ubmVjdGVkCgkJfSBlbHNlIGlmICggIWF1cCApIHsKCQkJcmV0dXJuIC0xOwoKCQl9IGVsc2UgaWYgKCAhYnVwICkgewoJCQlyZXR1cm4gMTsKCQl9CgoJCS8vIE90aGVyd2lzZSB0aGV5J3JlIHNvbWV3aGVyZSBlbHNlIGluIHRoZSB0cmVlIHNvIHdlIG5lZWQKCQkvLyB0byBidWlsZCB1cCBhIGZ1bGwgbGlzdCBvZiB0aGUgcGFyZW50Tm9kZXMgZm9yIGNvbXBhcmlzb24KCQl3aGlsZSAoIGN1ciApIHsKCQkJYXAudW5zaGlmdCggY3VyICk7CgkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCX0KCgkJY3VyID0gYnVwOwoKCQl3aGlsZSAoIGN1ciApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCX0KCgkJYWwgPSBhcC5sZW5ndGg7CgkJYmwgPSBicC5sZW5ndGg7CgoJCS8vIFN0YXJ0IHdhbGtpbmcgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5CgkJZm9yICggdmFyIGkgPSAwOyBpIDwgYWwgJiYgaSA8IGJsOyBpKysgKSB7CgkJCWlmICggYXBbaV0gIT09IGJwW2ldICkgewoJCQkJcmV0dXJuIHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICk7CgkJCX0KCQl9CgoJCS8vIFdlIGVuZGVkIHNvbWVwbGFjZSB1cCB0aGUgdHJlZSBzbyBkbyBhIHNpYmxpbmcgY2hlY2sKCQlyZXR1cm4gaSA9PT0gYWwgPwoJCQlzaWJsaW5nQ2hlY2soIGEsIGJwW2ldLCAtMSApIDoKCQkJc2libGluZ0NoZWNrKCBhcFtpXSwgYiwgMSApOwoJfTsKCglzaWJsaW5nQ2hlY2sgPSBmdW5jdGlvbiggYSwgYiwgcmV0ICkgewoJCWlmICggYSA9PT0gYiApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXZhciBjdXIgPSBhLm5leHRTaWJsaW5nOwoKCQl3aGlsZSAoIGN1ciApIHsKCQkJaWYgKCBjdXIgPT09IGIgKSB7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCgkJCWN1ciA9IGN1ci5uZXh0U2libGluZzsKCQl9CgoJCXJldHVybiAxOwoJfTsKfQoKLy8gVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmVpdmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbXMgKSB7Cgl2YXIgcmV0ID0gIiIsIGVsZW07CgoJZm9yICggdmFyIGkgPSAwOyBlbGVtc1tpXTsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1tpXTsKCgkJLy8gR2V0IHRoZSB0ZXh0IGZyb20gdGV4dCBub2RlcyBhbmQgQ0RBVEEgbm9kZXMKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gNCApIHsKCQkJcmV0ICs9IGVsZW0ubm9kZVZhbHVlOwoKCQkvLyBUcmF2ZXJzZSBldmVyeXRoaW5nIGVsc2UsIGV4Y2VwdCBjb21tZW50IG5vZGVzCgkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSAhPT0gOCApIHsKCQkJcmV0ICs9IFNpenpsZS5nZXRUZXh0KCBlbGVtLmNoaWxkTm9kZXMgKTsKCQl9Cgl9CgoJcmV0dXJuIHJldDsKfTsKCi8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUgd2hlbgovLyBxdWVyeWluZyBieSBnZXRFbGVtZW50QnlJZCAoYW5kIHByb3ZpZGUgYSB3b3JrYXJvdW5kKQooZnVuY3Rpb24oKXsKCS8vIFdlJ3JlIGdvaW5nIHRvIGluamVjdCBhIGZha2UgaW5wdXQgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWVkIG5hbWUKCXZhciBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCgkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksCgkJcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCglmb3JtLmlubmVySFRNTCA9ICI8YSBuYW1lPSciICsgaWQgKyAiJy8+IjsKCgkvLyBJbmplY3QgaXQgaW50byB0aGUgcm9vdCBlbGVtZW50LCBjaGVjayBpdHMgc3RhdHVzLCBhbmQgcmVtb3ZlIGl0IHF1aWNrbHkKCXJvb3QuaW5zZXJ0QmVmb3JlKCBmb3JtLCByb290LmZpcnN0Q2hpbGQgKTsKCgkvLyBUaGUgd29ya2Fyb3VuZCBoYXMgdG8gZG8gYWRkaXRpb25hbCBjaGVja3MgYWZ0ZXIgYSBnZXRFbGVtZW50QnlJZAoJLy8gV2hpY2ggc2xvd3MgdGhpbmdzIGRvd24gZm9yIG90aGVyIGJyb3dzZXJzIChoZW5jZSB0aGUgYnJhbmNoaW5nKQoJaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHsKCQlFeHByLmZpbmQuSUQgPSBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOwoKCQkJCXJldHVybiBtID8KCQkJCQltLmlkID09PSBtYXRjaFsxXSB8fCB0eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlID09PSBtYXRjaFsxXSA/CgkJCQkJCVttXSA6CgkJCQkJCXVuZGVmaW5lZCA6CgkJCQkJW107CgkJCX0KCQl9OwoKCQlFeHByLmZpbHRlci5JRCA9IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgoJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlICYmIG5vZGUubm9kZVZhbHVlID09PSBtYXRjaDsKCQl9OwoJfQoKCXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsKCgkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJcm9vdCA9IGZvcm0gPSBudWxsOwp9KSgpOwoKKGZ1bmN0aW9uKCl7CgkvLyBDaGVjayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgcmV0dXJucyBvbmx5IGVsZW1lbnRzCgkvLyB3aGVuIGRvaW5nIGdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikKCgkvLyBDcmVhdGUgYSBmYWtlIGVsZW1lbnQKCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCWRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiIikgKTsKCgkvLyBNYWtlIHN1cmUgbm8gY29tbWVudHMgYXJlIGZvdW5kCglpZiAoIGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aCA+IDAgKSB7CgkJRXhwci5maW5kLlRBRyA9IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCApIHsKCQkJdmFyIHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBtYXRjaFsxXSApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIG1hdGNoWzFdID09PSAiKiIgKSB7CgkJCQl2YXIgdG1wID0gW107CgoJCQkJZm9yICggdmFyIGkgPSAwOyByZXN1bHRzW2ldOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggcmVzdWx0c1tpXSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXN1bHRzID0gdG1wOwoJCQl9CgoJCQlyZXR1cm4gcmVzdWx0czsKCQl9OwoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiBhbiBhdHRyaWJ1dGUgcmV0dXJucyBub3JtYWxpemVkIGhyZWYgYXR0cmlidXRlcwoJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKCglpZiAoIGRpdi5maXJzdENoaWxkICYmIHR5cGVvZiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCWRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpICE9PSAiIyIgKSB7CgoJCUV4cHIuYXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggImhyZWYiLCAyICk7CgkJfTsKCX0KCgkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJZGl2ID0gbnVsbDsKfSkoKTsKCmlmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApIHsKCShmdW5jdGlvbigpewoJCXZhciBvbGRTaXp6bGUgPSBTaXp6bGUsCgkJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAoJCQlpZCA9ICJfX3NpenpsZV9fIjsKCgkJZGl2LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CgoJCS8vIFNhZmFyaSBjYW4ndCBoYW5kbGUgdXBwZXJjYXNlIG9yIHVuaWNvZGUgY2hhcmFjdGVycyB3aGVuCgkJLy8gaW4gcXVpcmtzIG1vZGUuCgkJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CgkJCXJldHVybjsKCQl9CgkKCQlTaXp6bGUgPSBmdW5jdGlvbiggcXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkICkgewoJCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJCS8vIE9ubHkgdXNlIHF1ZXJ5U2VsZWN0b3JBbGwgb24gbm9uLVhNTCBkb2N1bWVudHMKCQkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1MIGRvY3VtZW50cykKCQkJaWYgKCAhc2VlZCAmJiAhU2l6emxlLmlzWE1MKGNvbnRleHQpICkgewoJCQkJLy8gU2VlIGlmIHdlIGZpbmQgYSBzZWxlY3RvciB0byBzcGVlZCB1cAoJCQkJdmFyIG1hdGNoID0gL14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoIHF1ZXJ5ICk7CgkJCQkKCQkJCWlmICggbWF0Y2ggJiYgKGNvbnRleHQubm9kZVR5cGUgPT09IDEgfHwgY29udGV4dC5ub2RlVHlwZSA9PT0gOSkgKSB7CgkJCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiVEFHIikKCQkJCQlpZiAoIG1hdGNoWzFdICkgewoJCQkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBxdWVyeSApLCBleHRyYSApOwoJCQkJCQoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoIi5DTEFTUyIpCgkJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gJiYgRXhwci5maW5kLkNMQVNTICYmIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHsKCQkJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBtYXRjaFsyXSApLCBleHRyYSApOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICkgewoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoImJvZHkiKQoJCQkJCS8vIFRoZSBib2R5IGVsZW1lbnQgb25seSBleGlzdHMgb25jZSwgb3B0aW1pemUgZmluZGluZyBpdAoJCQkJCWlmICggcXVlcnkgPT09ICJib2R5IiAmJiBjb250ZXh0LmJvZHkgKSB7CgkJCQkJCXJldHVybiBtYWtlQXJyYXkoIFsgY29udGV4dC5ib2R5IF0sIGV4dHJhICk7CgkJCQkJCQoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoIiNJRCIpCgkJCQkJfSBlbHNlIGlmICggbWF0Y2ggJiYgbWF0Y2hbM10gKSB7CgkJCQkJCXZhciBlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbM10gKTsKCgkJCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCgkJCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKCQkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSBhbmQgT3BlcmEgcmV0dXJuIGl0ZW1zCgkJCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKCQkJCQkJCWlmICggZWxlbS5pZCA9PT0gbWF0Y2hbM10gKSB7CgkJCQkJCQkJcmV0dXJuIG1ha2VBcnJheSggWyBlbGVtIF0sIGV4dHJhICk7CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXJldHVybiBtYWtlQXJyYXkoIFtdLCBleHRyYSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJCQoJCQkJCXRyeSB7CgkJCQkJCXJldHVybiBtYWtlQXJyYXkoIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbChxdWVyeSksIGV4dHJhICk7CgkJCQkJfSBjYXRjaChxc2FFcnJvcikge30KCgkJCQkvLyBxU0Egd29ya3Mgc3RyYW5nZWx5IG9uIEVsZW1lbnQtcm9vdGVkIHF1ZXJpZXMKCQkJCS8vIFdlIGNhbiB3b3JrIGFyb3VuZCB0aGlzIGJ5IHNwZWNpZnlpbmcgYW4gZXh0cmEgSUQgb24gdGhlIHJvb3QKCQkJCS8vIGFuZCB3b3JraW5nIHVwIGZyb20gdGhlcmUgKFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGUgdGVjaG5pcXVlKQoJCQkJLy8gSUUgOCBkb2Vzbid0IHdvcmsgb24gb2JqZWN0IGVsZW1lbnRzCgkJCQl9IGVsc2UgaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSAxICYmIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgkJCQkJdmFyIG9sZENvbnRleHQgPSBjb250ZXh0LAoJCQkJCQlvbGQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggImlkIiApLAoJCQkJCQluaWQgPSBvbGQgfHwgaWQsCgkJCQkJCWhhc1BhcmVudCA9IGNvbnRleHQucGFyZW50Tm9kZSwKCQkJCQkJcmVsYXRpdmVIaWVyYXJjaHlTZWxlY3RvciA9IC9eXHMqWyt+XS8udGVzdCggcXVlcnkgKTsKCgkJCQkJaWYgKCAhb2xkICkgewoJCQkJCQljb250ZXh0LnNldEF0dHJpYnV0ZSggImlkIiwgbmlkICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJbmlkID0gbmlkLnJlcGxhY2UoIC8nL2csICJcXCQmIiApOwoJCQkJCX0KCQkJCQlpZiAoIHJlbGF0aXZlSGllcmFyY2h5U2VsZWN0b3IgJiYgaGFzUGFyZW50ICkgewoJCQkJCQljb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlOwoJCQkJCX0KCgkJCQkJdHJ5IHsKCQkJCQkJaWYgKCAhcmVsYXRpdmVIaWVyYXJjaHlTZWxlY3RvciB8fCBoYXNQYXJlbnQgKSB7CgkJCQkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoICJbaWQ9JyIgKyBuaWQgKyAiJ10gIiArIHF1ZXJ5ICksIGV4dHJhICk7CgkJCQkJCX0KCgkJCQkJfSBjYXRjaChwc2V1ZG9FcnJvcikgewoJCQkJCX0gZmluYWxseSB7CgkJCQkJCWlmICggIW9sZCApIHsKCQkJCQkJCW9sZENvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkKCQkJcmV0dXJuIG9sZFNpenpsZShxdWVyeSwgY29udGV4dCwgZXh0cmEsIHNlZWQpOwoJCX07CgoJCWZvciAoIHZhciBwcm9wIGluIG9sZFNpenpsZSApIHsKCQkJU2l6emxlWyBwcm9wIF0gPSBvbGRTaXp6bGVbIHByb3AgXTsKCQl9CgoJCS8vIHJlbGVhc2UgbWVtb3J5IGluIElFCgkJZGl2ID0gbnVsbDsKCX0pKCk7Cn0KCihmdW5jdGlvbigpewoJdmFyIGh0bWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJbWF0Y2hlcyA9IGh0bWwubWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwubXNNYXRjaGVzU2VsZWN0b3I7CgoJaWYgKCBtYXRjaGVzICkgewoJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCS8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkgZmFpbHMgdGhpcykKCQl2YXIgZGlzY29ubmVjdGVkTWF0Y2ggPSAhbWF0Y2hlcy5jYWxsKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLCAiZGl2IiApLAoJCQlwc2V1ZG9Xb3JrcyA9IGZhbHNlOwoKCQl0cnkgewoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICJbdGVzdCE9JyddOnNpenpsZSIgKTsKCQoJCX0gY2F0Y2goIHBzZXVkb0Vycm9yICkgewoJCQlwc2V1ZG9Xb3JrcyA9IHRydWU7CgkJfQoKCQlTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIG5vZGUsIGV4cHIgKSB7CgkJCS8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZAoJCQlleHByID0gZXhwci5yZXBsYWNlKC9cPVxzKihbXiciXF1dKilccypcXS9nLCAiPSckMSddIik7CgoJCQlpZiAoICFTaXp6bGUuaXNYTUwoIG5vZGUgKSApIHsKCQkJCXRyeSB7IAoJCQkJCWlmICggcHNldWRvV29ya3MgfHwgIUV4cHIubWF0Y2guUFNFVURPLnRlc3QoIGV4cHIgKSAmJiAhLyE9Ly50ZXN0KCBleHByICkgKSB7CgkJCQkJCXZhciByZXQgPSBtYXRjaGVzLmNhbGwoIG5vZGUsIGV4cHIgKTsKCgkJCQkJCS8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXMKCQkJCQkJaWYgKCByZXQgfHwgIWRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5LCBzbyBjaGVjayBmb3IgdGhhdAoJCQkJCQkJCW5vZGUuZG9jdW1lbnQgJiYgbm9kZS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7CgkJCQkJCQlyZXR1cm4gcmV0OwoJCQkJCQl9CgkJCQkJfQoJCQkJfSBjYXRjaChlKSB7fQoJCQl9CgoJCQlyZXR1cm4gU2l6emxlKGV4cHIsIG51bGwsIG51bGwsIFtub2RlXSkubGVuZ3RoID4gMDsKCQl9OwoJfQp9KSgpOwoKKGZ1bmN0aW9uKCl7Cgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgoJZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7CgoJLy8gT3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBjbGFzc25hbWUgKGluIDkuNikKCS8vIEFsc28sIG1ha2Ugc3VyZSB0aGF0IGdldEVsZW1lbnRzQnlDbGFzc05hbWUgYWN0dWFsbHkgZXhpc3RzCglpZiAoICFkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSB8fCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMCApIHsKCQlyZXR1cm47Cgl9CgoJLy8gU2FmYXJpIGNhY2hlcyBjbGFzcyBhdHRyaWJ1dGVzLCBkb2Vzbid0IGNhdGNoIGNoYW5nZXMgKGluIDMuMikKCWRpdi5sYXN0Q2hpbGQuY2xhc3NOYW1lID0gImUiOwoKCWlmICggZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDEgKSB7CgkJcmV0dXJuOwoJfQoJCglFeHByLm9yZGVyLnNwbGljZSgxLCAwLCAiQ0xBU1MiKTsKCUV4cHIuZmluZC5DTEFTUyA9IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKSB7CgkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobWF0Y2hbMV0pOwoJCX0KCX07CgoJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKCWRpdiA9IG51bGw7Cn0pKCk7CgpmdW5jdGlvbiBkaXJOb2RlQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7Cglmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKCgkJaWYgKCBlbGVtICkgewoJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKCgkJCWVsZW0gPSBlbGVtW2Rpcl07CgoJCQl3aGlsZSAoIGVsZW0gKSB7CgkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgewoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsKCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJZWxlbS5zaXpzZXQgPSBpOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBjdXIgKSB7CgkJCQkJbWF0Y2ggPSBlbGVtOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWVsZW0gPSBlbGVtW2Rpcl07CgkJCX0KCgkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CgkJfQoJfQp9CgpmdW5jdGlvbiBkaXJDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoKCQlpZiAoIGVsZW0gKSB7CgkJCXZhciBtYXRjaCA9IGZhbHNlOwoJCQkKCQkJZWxlbSA9IGVsZW1bZGlyXTsKCgkJCXdoaWxlICggZWxlbSApIHsKCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CgkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWlzWE1MICkgewoJCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJCQl9CgoJCQkJCWlmICggdHlwZW9mIGN1ciAhPT0gInN0cmluZyIgKSB7CgkJCQkJCWlmICggZWxlbSA9PT0gY3VyICkgewoJCQkJCQkJbWF0Y2ggPSB0cnVlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCgkJCQkJfSBlbHNlIGlmICggU2l6emxlLmZpbHRlciggY3VyLCBbZWxlbV0gKS5sZW5ndGggPiAwICkgewoJCQkJCQltYXRjaCA9IGVsZW07CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCgkJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl9CgoJCQljaGVja1NldFtpXSA9IG1hdGNoOwoJCX0KCX0KfQoKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMgKSB7CglTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlyZXR1cm4gYSAhPT0gYiAmJiAoYS5jb250YWlucyA/IGEuY29udGFpbnMoYikgOiB0cnVlKTsKCX07Cgp9IGVsc2UgaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7CglTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlyZXR1cm4gISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDE2KTsKCX07Cgp9IGVsc2UgewoJU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZhbHNlOwoJfTsKfQoKU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykgCgl2YXIgZG9jdW1lbnRFbGVtZW50ID0gKGVsZW0gPyBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSA6IDApLmRvY3VtZW50RWxlbWVudDsKCglyZXR1cm4gZG9jdW1lbnRFbGVtZW50ID8gZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lICE9PSAiSFRNTCIgOiBmYWxzZTsKfTsKCnZhciBwb3NQcm9jZXNzID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJdmFyIG1hdGNoLAoJCXRtcFNldCA9IFtdLAoJCWxhdGVyID0gIiIsCgkJcm9vdCA9IGNvbnRleHQubm9kZVR5cGUgPyBbY29udGV4dF0gOiBjb250ZXh0OwoKCS8vIFBvc2l0aW9uIHNlbGVjdG9ycyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbHRlcgoJLy8gQW5kIHNvIG11c3QgOm5vdChwb3NpdGlvbmFsKSBzbyB3ZSBtb3ZlIGFsbCBQU0VVRE9zIHRvIHRoZSBlbmQKCXdoaWxlICggKG1hdGNoID0gRXhwci5tYXRjaC5QU0VVRE8uZXhlYyggc2VsZWN0b3IgKSkgKSB7CgkJbGF0ZXIgKz0gbWF0Y2hbMF07CgkJc2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKCBFeHByLm1hdGNoLlBTRVVETywgIiIgKTsKCX0KCglzZWxlY3RvciA9IEV4cHIucmVsYXRpdmVbc2VsZWN0b3JdID8gc2VsZWN0b3IgKyAiKiIgOiBzZWxlY3RvcjsKCglmb3IgKCB2YXIgaSA9IDAsIGwgPSByb290Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQlTaXp6bGUoIHNlbGVjdG9yLCByb290W2ldLCB0bXBTZXQgKTsKCX0KCglyZXR1cm4gU2l6emxlLmZpbHRlciggbGF0ZXIsIHRtcFNldCApOwp9OwoKLy8gRVhQT1NFCmpRdWVyeS5maW5kID0gU2l6emxlOwpqUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7CmpRdWVyeS5leHByWyI6Il0gPSBqUXVlcnkuZXhwci5maWx0ZXJzOwpqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwoKCn0pKCk7CgoKdmFyIHJ1bnRpbCA9IC9VbnRpbCQvLAoJcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sCgkvLyBOb3RlOiBUaGlzIFJlZ0V4cCBzaG91bGQgYmUgaW1wcm92ZWQsIG9yIGxpa2VseSBwdWxsZWQgZnJvbSBTaXp6bGUKCXJtdWx0aXNlbGVjdG9yID0gLywvLAoJaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvLAoJc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsCglQT1MgPSBqUXVlcnkuZXhwci5tYXRjaC5QT1MsCgkvLyBtZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBmcm9tIGEgdW5pcXVlIHNldAoJZ3VhcmFudGVlZFVuaXF1ZSA9IHsKCQljaGlsZHJlbjogdHJ1ZSwKCQljb250ZW50czogdHJ1ZSwKCQluZXh0OiB0cnVlLAoJCXByZXY6IHRydWUKCX07CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgc2VsZiA9IHRoaXMsCgkJCWksIGw7CgoJCWlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCQlmb3IgKCBpID0gMCwgbCA9IHNlbGYubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9CgoJCXZhciByZXQgPSB0aGlzLnB1c2hTdGFjayggIiIsICJmaW5kIiwgc2VsZWN0b3IgKSwKCQkJbGVuZ3RoLCBuLCByOwoKCQlmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQlsZW5ndGggPSByZXQubGVuZ3RoOwoJCQlqUXVlcnkuZmluZCggc2VsZWN0b3IsIHRoaXNbaV0sIHJldCApOwoKCQkJaWYgKCBpID4gMCApIHsKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHRzIGFyZSB1bmlxdWUKCQkJCWZvciAoIG4gPSBsZW5ndGg7IG4gPCByZXQubGVuZ3RoOyBuKysgKSB7CgkJCQkJZm9yICggciA9IDA7IHIgPCBsZW5ndGg7IHIrKyApIHsKCQkJCQkJaWYgKCByZXRbcl0gPT09IHJldFtuXSApIHsKCQkJCQkJCXJldC5zcGxpY2Uobi0tLCAxKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCgloYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7CgkJdmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCApOwoJCXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1tpXSApICkgewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJfSk7Cgl9LAoKCW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCBmYWxzZSksICJub3QiLCBzZWxlY3Rvcik7Cgl9LAoKCWZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCB0cnVlKSwgImZpbHRlciIsIHNlbGVjdG9yICk7Cgl9LAoKCWlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuICEhc2VsZWN0b3IgJiYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHRoaXMgKS5sZW5ndGggPiAwIDoKCQkJdGhpcy5maWx0ZXIoIHNlbGVjdG9yICkubGVuZ3RoID4gMCApOwoJfSwKCgljbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkgewoJCXZhciByZXQgPSBbXSwgaSwgbCwgY3VyID0gdGhpc1swXTsKCQkKCQkvLyBBcnJheQoJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHNlbGVjdG9ycyApICkgewoJCQl2YXIgbWF0Y2gsIHNlbGVjdG9yLAoJCQkJbWF0Y2hlcyA9IHt9LAoJCQkJbGV2ZWwgPSAxOwoKCQkJaWYgKCBjdXIgJiYgc2VsZWN0b3JzLmxlbmd0aCApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gc2VsZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCQlzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsKCgkJCQkJaWYgKCAhbWF0Y2hlc1sgc2VsZWN0b3IgXSApIHsKCQkJCQkJbWF0Y2hlc1sgc2VsZWN0b3IgXSA9IFBPUy50ZXN0KCBzZWxlY3RvciApID8KCQkJCQkJCWpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgoJCQkJCQkJc2VsZWN0b3I7CgkJCQkJfQoJCQkJfQoKCQkJCXdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICYmIGN1ciAhPT0gY29udGV4dCApIHsKCQkJCQlmb3IgKCBzZWxlY3RvciBpbiBtYXRjaGVzICkgewoJCQkJCQltYXRjaCA9IG1hdGNoZXNbIHNlbGVjdG9yIF07CgoJCQkJCQlpZiAoIG1hdGNoLmpxdWVyeSA/IG1hdGNoLmluZGV4KCBjdXIgKSA+IC0xIDogalF1ZXJ5KCBjdXIgKS5pcyggbWF0Y2ggKSApIHsKCQkJCQkJCXJldC5wdXNoKHsgc2VsZWN0b3I6IHNlbGVjdG9yLCBlbGVtOiBjdXIsIGxldmVsOiBsZXZlbCB9KTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CgkJCQkJbGV2ZWwrKzsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIHJldDsKCQl9CgoJCS8vIFN0cmluZwoJCXZhciBwb3MgPSBQT1MudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgPwoJCQkJalF1ZXJ5KCBzZWxlY3RvcnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgoJCQkJMDsKCgkJZm9yICggaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJY3VyID0gdGhpc1tpXTsKCgkJCXdoaWxlICggY3VyICkgewoJCQkJaWYgKCBwb3MgPyBwb3MuaW5kZXgoY3VyKSA+IC0xIDogalF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGN1ciwgc2VsZWN0b3JzKSApIHsKCQkJCQlyZXQucHVzaCggY3VyICk7CgkJCQkJYnJlYWs7CgoJCQkJfSBlbHNlIHsKCQkJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKCQkJCQlpZiAoICFjdXIgfHwgIWN1ci5vd25lckRvY3VtZW50IHx8IGN1ciA9PT0gY29udGV4dCB8fCBjdXIubm9kZVR5cGUgPT09IDExICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldCA9IHJldC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQ7CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0LCAiY2xvc2VzdCIsIHNlbGVjdG9ycyApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCgkvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApID8gdGhpcy5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBpbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoIHRoaXNbMF0sIGpRdWVyeSggZWxlbSApICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCgkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAoJCQllbGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtLCB0aGlzICk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXZhciBzZXQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJCWpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSA6CgkJCQlqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciAmJiBzZWxlY3Rvci5ub2RlVHlwZSA/IFsgc2VsZWN0b3IgXSA6IHNlbGVjdG9yICksCgkJCWFsbCA9IGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggaXNEaXNjb25uZWN0ZWQoIHNldFswXSApIHx8IGlzRGlzY29ubmVjdGVkKCBhbGxbMF0gKSA/CgkJCWFsbCA6CgkJCWpRdWVyeS51bmlxdWUoIGFsbCApICk7Cgl9LAoKCWFuZFNlbGY6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7Cgl9Cn0pOwoKLy8gQSBwYWluZnVsbHkgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBhbiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZAovLyBmcm9tIGEgZG9jdW1lbnQgKHNob3VsZCBiZSBpbXByb3ZlZCwgd2hlcmUgZmVhc2libGUpLgpmdW5jdGlvbiBpc0Rpc2Nvbm5lY3RlZCggbm9kZSApIHsKCXJldHVybiAhbm9kZSB8fCAhbm9kZS5wYXJlbnROb2RlIHx8IG5vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMTE7Cn0KCmpRdWVyeS5lYWNoKHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIgKTsKCX0sCglwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiLCB1bnRpbCApOwoJfSwKCW5leHQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkubnRoKCBlbGVtLCAyLCAibmV4dFNpYmxpbmciICk7Cgl9LAoJcHJldjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5udGgoIGVsZW0sIDIsICJwcmV2aW91c1NpYmxpbmciICk7Cgl9LAoJbmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsKCX0sCgluZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgIm5leHRTaWJsaW5nIiwgdW50aWwgKTsKCX0sCglwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuc2libGluZyggZWxlbS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsIGVsZW0gKTsKCX0sCgljaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTsKCX0sCgljb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlmcmFtZSIgKSA/CgkJCWVsZW0uY29udGVudERvY3VtZW50IHx8IGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudCA6CgkJCWpRdWVyeS5tYWtlQXJyYXkoIGVsZW0uY2hpbGROb2RlcyApOwoJfQp9LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7CgkJdmFyIHJldCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApLAoJCQkvLyBUaGUgdmFyaWFibGUgJ2FyZ3MnIHdhcyBpbnRyb2R1Y2VkIGluCgkJCS8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L2NvbW1pdC81MmEwMjM4CgkJCS8vIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIENocm9tZSAxMCAoRGV2KSBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB0aGUgYnVnIGlzIGZpeGVkLgoJCQkvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMDUwCgkJCWFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7CgoJCWlmICggIXJ1bnRpbC50ZXN0KCBuYW1lICkgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCXJldCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKCQl9CgoJCXJldCA9IHRoaXMubGVuZ3RoID4gMSAmJiAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQ7CgoJCWlmICggKHRoaXMubGVuZ3RoID4gMSB8fCBybXVsdGlzZWxlY3Rvci50ZXN0KCBzZWxlY3RvciApKSAmJiBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkgewoJCQlyZXQgPSByZXQucmV2ZXJzZSgpOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQsIG5hbWUsIGFyZ3Muam9pbigiLCIpICk7Cgl9Owp9KTsKCmpRdWVyeS5leHRlbmQoewoJZmlsdGVyOiBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHsKCQlpZiAoIG5vdCApIHsKCQkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJCX0KCgkJcmV0dXJuIGVsZW1zLmxlbmd0aCA9PT0gMSA/CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihlbGVtc1swXSwgZXhwcikgPyBbIGVsZW1zWzBdIF0gOiBbXSA6CgkJCWpRdWVyeS5maW5kLm1hdGNoZXMoZXhwciwgZWxlbXMpOwoJfSwKCglkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJCXZhciBtYXRjaGVkID0gW10sCgkJCWN1ciA9IGVsZW1bIGRpciBdOwoKCQl3aGlsZSAoIGN1ciAmJiBjdXIubm9kZVR5cGUgIT09IDkgJiYgKHVudGlsID09PSB1bmRlZmluZWQgfHwgY3VyLm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkoIGN1ciApLmlzKCB1bnRpbCApKSApIHsKCQkJaWYgKCBjdXIubm9kZVR5cGUgPT09IDEgKSB7CgkJCQltYXRjaGVkLnB1c2goIGN1ciApOwoJCQl9CgkJCWN1ciA9IGN1cltkaXJdOwoJCX0KCQlyZXR1cm4gbWF0Y2hlZDsKCX0sCgoJbnRoOiBmdW5jdGlvbiggY3VyLCByZXN1bHQsIGRpciwgZWxlbSApIHsKCQlyZXN1bHQgPSByZXN1bHQgfHwgMTsKCQl2YXIgbnVtID0gMDsKCgkJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkgewoJCQlpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiArK251bSA9PT0gcmVzdWx0ICkgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCXJldHVybiBjdXI7Cgl9LAoKCXNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkgewoJCXZhciByID0gW107CgoJCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJCWlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkgewoJCQkJci5wdXNoKCBuICk7CgkJCX0KCQl9CgoJCXJldHVybiByOwoJfQp9KTsKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwga2VlcCApIHsKCgkvLyBDYW4ndCBwYXNzIG51bGwgb3IgdW5kZWZpbmVkIHRvIGluZGV4T2YgaW4gRmlyZWZveCA0CgkvLyBTZXQgdG8gMCB0byBza2lwIHN0cmluZyBjaGVjawoJcXVhbGlmaWVyID0gcXVhbGlmaWVyIHx8IDA7CgoJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJdmFyIHJldFZhbCA9ICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKCQkJcmV0dXJuIHJldFZhbCA9PT0ga2VlcDsKCQl9KTsKCgl9IGVsc2UgaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuIChlbGVtID09PSBxdWFsaWZpZXIpID09PSBrZWVwOwoJCX0pOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09ICJzdHJpbmciICkgewoJCXZhciBmaWx0ZXJlZCA9IGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7CgkJfSk7CgoJCWlmICggaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7CgkJCXJldHVybiBqUXVlcnkuZmlsdGVyKHF1YWxpZmllciwgZmlsdGVyZWQsICFrZWVwKTsKCQl9IGVsc2UgewoJCQlxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGZpbHRlcmVkICk7CgkJfQoJfQoKCXJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJcmV0dXJuIChqUXVlcnkuaW5BcnJheSggZWxlbSwgcXVhbGlmaWVyICkgPj0gMCkgPT09IGtlZXA7Cgl9KTsKfQoKCgoKdmFyIHJpbmxpbmVqUXVlcnkgPSAvIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLAoJcmxlYWRpbmdXaGl0ZXNwYWNlID0gL15ccysvLAoJcnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9pZywKCXJ0YWdOYW1lID0gLzwoW1x3Ol0rKS8sCglydGJvZHkgPSAvPHRib2R5L2ksCglyaHRtbCA9IC88fCYjP1x3KzsvLAoJcm5vY2FjaGUgPSAvPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLAoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJzY3JpcHRUeXBlID0gL1wvKGphdmF8ZWNtYSlzY3JpcHQvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8XC1cLSkvLAoJd3JhcE1hcCA9IHsKCQlvcHRpb246IFsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdLAoJCWxlZ2VuZDogWyAxLCAiPGZpZWxkc2V0PiIsICI8L2ZpZWxkc2V0PiIgXSwKCQl0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKCQl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCQl0ZDogWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+IiwgIjwvdHI+PC90Ym9keT48L3RhYmxlPiIgXSwKCQljb2w6IFsgMiwgIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgkJYXJlYTogWyAxLCAiPG1hcD4iLCAiPC9tYXA+IiBdLAoJCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCgl9OwoKd3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uOwp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCi8vIElFIGNhbid0IHNlcmlhbGl6ZSA8bGluaz4gYW5kIDxzY3JpcHQ+IHRhZ3Mgbm9ybWFsbHkKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSApIHsKCXdyYXBNYXAuX2RlZmF1bHQgPSBbIDEsICJkaXY8ZGl2PiIsICI8L2Rpdj4iIF07Cn0KCmpRdWVyeS5mbi5leHRlbmQoewoJdGV4dDogZnVuY3Rpb24oIHRleHQgKSB7CgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih0ZXh0KSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoKCQkJCXNlbGYudGV4dCggdGV4dC5jYWxsKHRoaXMsIGksIHNlbGYudGV4dCgpKSApOwoJCQl9KTsKCQl9CgoJCWlmICggdHlwZW9mIHRleHQgIT09ICJvYmplY3QiICYmIHRleHQgIT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoICh0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSApOwoJCX0KCgkJcmV0dXJuIGpRdWVyeS50ZXh0KCB0aGlzICk7Cgl9LAoKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQlqUXVlcnkodGhpcykud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7CgkJCX0pOwoJCX0KCgkJaWYgKCB0aGlzWzBdICkgewoJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZAoJCQl2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuZXEoMCkuY2xvbmUodHJ1ZSk7CgoJCQlpZiAoIHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWzBdICk7CgkJCX0KCgkJCXdyYXAubWFwKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGVsZW0gPSB0aGlzOwoKCQkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICYmIGVsZW0uZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQllbGVtID0gZWxlbS5maXJzdENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9KS5hcHBlbmQoIHRoaXMgKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgl3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQlqUXVlcnkodGhpcykud3JhcElubmVyKCBodG1sLmNhbGwodGhpcywgaSkgKTsKCQkJfSk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSk7Cgl9LAoKCXdyYXA6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwgKTsKCQl9KTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZiAoICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJib2R5IiApICkgewoJCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCQl9CgkJfSkuZW5kKCk7Cgl9LAoKCWFwcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxICkgewoJCQkJdGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOwoJCQl9CgkJfSk7Cgl9LAoKCXByZXBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCXRoaXMuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLmZpcnN0Q2hpbGQgKTsKCQkJfQoJCX0pOwoJfSwKCgliZWZvcmU6IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpc1swXSAmJiB0aGlzWzBdLnBhcmVudE5vZGUgKSB7CgkJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApOwoJCQl9KTsKCQl9IGVsc2UgaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQl2YXIgc2V0ID0galF1ZXJ5KGFyZ3VtZW50c1swXSk7CgkJCXNldC5wdXNoLmFwcGx5KCBzZXQsIHRoaXMudG9BcnJheSgpICk7CgkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggc2V0LCAiYmVmb3JlIiwgYXJndW1lbnRzICk7CgkJfQoJfSwKCglhZnRlcjogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKCQkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0pOwoJCX0gZWxzZSBpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXZhciBzZXQgPSB0aGlzLnB1c2hTdGFjayggdGhpcywgImFmdGVyIiwgYXJndW1lbnRzICk7CgkJCXNldC5wdXNoLmFwcGx5KCBzZXQsIGpRdWVyeShhcmd1bWVudHNbMF0pLnRvQXJyYXkoKSApOwoJCQlyZXR1cm4gc2V0OwoJCX0KCX0sCgoJLy8ga2VlcERhdGEgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LS1kbyBub3QgZG9jdW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoICFzZWxlY3RvciB8fCBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgWyBlbGVtIF0gKS5sZW5ndGggKSB7CgkJCQlpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSApOwoJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIFsgZWxlbSBdICk7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQkJZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgllbXB0eTogZnVuY3Rpb24oKSB7CgkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHsKCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCgkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSApOwoJCQl9CgoJCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2RlcwoJCQl3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCApIHsKCQkJCWVsZW0ucmVtb3ZlQ2hpbGQoIGVsZW0uZmlyc3RDaGlsZCApOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQlkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzOwoJCWRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50czsKCgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbiAoKSB7CgkJCXJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7CgkJfSk7Cgl9LAoKCWh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiB0aGlzWzBdICYmIHRoaXNbMF0ubm9kZVR5cGUgPT09IDEgPwoJCQkJdGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShyaW5saW5lalF1ZXJ5LCAiIikgOgoJCQkJbnVsbDsKCgkJLy8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTAoJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgIXJub2NhY2hlLnRlc3QoIHZhbHVlICkgJiYKCQkJKGpRdWVyeS5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlIHx8ICFybGVhZGluZ1doaXRlc3BhY2UudGVzdCggdmFsdWUgKSkgJiYKCQkJIXdyYXBNYXBbIChydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpIF0gKSB7CgoJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocnhodG1sVGFnLCAiPCQxPjwvJDI+Iik7CgoJCQl0cnkgewoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCgkJCQkJaWYgKCB0aGlzW2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQlqUXVlcnkuY2xlYW5EYXRhKCB0aGlzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgKTsKCQkJCQkJdGhpc1tpXS5pbm5lckhUTUwgPSB2YWx1ZTsKCQkJCQl9CgkJCQl9CgoJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJfSBjYXRjaChlKSB7CgkJCQl0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApOwoJCQl9CgoJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQl0aGlzLmVhY2goZnVuY3Rpb24oaSl7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoKCQkJCXNlbGYuaHRtbCggdmFsdWUuY2FsbCh0aGlzLCBpLCBzZWxmLmh0bWwoKSkgKTsKCQkJfSk7CgoJCX0gZWxzZSB7CgkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlpZiAoIHRoaXNbMF0gJiYgdGhpc1swXS5wYXJlbnROb2RlICkgewoJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZWxlbWVudHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGJlZm9yZSB0aGV5IGFyZSBpbnNlcnRlZAoJCQkvLyB0aGlzIGNhbiBoZWxwIGZpeCByZXBsYWNpbmcgYSBwYXJlbnQgd2l0aCBjaGlsZCBlbGVtZW50cwoJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyksIG9sZCA9IHNlbGYuaHRtbCgpOwoJCQkJCXNlbGYucmVwbGFjZVdpdGgoIHZhbHVlLmNhbGwoIHRoaXMsIGksIG9sZCApICk7CgkJCQl9KTsKCQkJfQoKCQkJaWYgKCB0eXBlb2YgdmFsdWUgIT09ICJzdHJpbmciICkgewoJCQkJdmFsdWUgPSBqUXVlcnkoIHZhbHVlICkuZGV0YWNoKCk7CgkJCX0KCgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgbmV4dCA9IHRoaXMubmV4dFNpYmxpbmcsCgkJCQkJcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwoKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZSgpOwoKCQkJCWlmICggbmV4dCApIHsKCQkJCQlqUXVlcnkobmV4dCkuYmVmb3JlKCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlqUXVlcnkocGFyZW50KS5hcHBlbmQoIHZhbHVlICk7CgkJCQl9CgkJCX0pOwoJCX0gZWxzZSB7CgkJCXJldHVybiB0aGlzLmxlbmd0aCA/CgkJCQl0aGlzLnB1c2hTdGFjayggalF1ZXJ5KGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlKCkgOiB2YWx1ZSksICJyZXBsYWNlV2l0aCIsIHZhbHVlICkgOgoJCQkJdGhpczsKCQl9Cgl9LAoKCWRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnJlbW92ZSggc2VsZWN0b3IsIHRydWUgKTsKCX0sCgoJZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKSB7CgkJdmFyIHJlc3VsdHMsIGZpcnN0LCBmcmFnbWVudCwgcGFyZW50LAoJCQl2YWx1ZSA9IGFyZ3NbMF0sCgkJCXNjcmlwdHMgPSBbXTsKCgkJLy8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0CgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hlY2tDbG9uZSAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCWpRdWVyeSh0aGlzKS5kb21NYW5pcCggYXJncywgdGFibGUsIGNhbGxiYWNrLCB0cnVlICk7CgkJCX0pOwoJCX0KCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih2YWx1ZSkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgewoJCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyk7CgkJCQlhcmdzWzBdID0gdmFsdWUuY2FsbCh0aGlzLCBpLCB0YWJsZSA/IHNlbGYuaHRtbCgpIDogdW5kZWZpbmVkKTsKCQkJCXNlbGYuZG9tTWFuaXAoIGFyZ3MsIHRhYmxlLCBjYWxsYmFjayApOwoJCQl9KTsKCQl9CgoJCWlmICggdGhpc1swXSApIHsKCQkJcGFyZW50ID0gdmFsdWUgJiYgdmFsdWUucGFyZW50Tm9kZTsKCgkJCS8vIElmIHdlJ3JlIGluIGEgZnJhZ21lbnQsIGp1c3QgdXNlIHRoYXQgaW5zdGVhZCBvZiBidWlsZGluZyBhIG5ldyBvbmUKCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5wYXJlbnROb2RlICYmIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT09IDExICYmIHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gdGhpcy5sZW5ndGggKSB7CgkJCQlyZXN1bHRzID0geyBmcmFnbWVudDogcGFyZW50IH07CgoJCQl9IGVsc2UgewoJCQkJcmVzdWx0cyA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBhcmdzLCB0aGlzLCBzY3JpcHRzICk7CgkJCX0KCgkJCWZyYWdtZW50ID0gcmVzdWx0cy5mcmFnbWVudDsKCgkJCWlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7CgkJCQlmaXJzdCA9IGZyYWdtZW50ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCQkJfSBlbHNlIHsKCQkJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCQkJfQoKCQkJaWYgKCBmaXJzdCApIHsKCQkJCXRhYmxlID0gdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBmaXJzdCwgInRyIiApOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoLCBsYXN0SW5kZXggPSBsIC0gMTsgaSA8IGw7IGkrKyApIHsKCQkJCQljYWxsYmFjay5jYWxsKAoJCQkJCQl0YWJsZSA/CgkJCQkJCQlyb290KHRoaXNbaV0sIGZpcnN0KSA6CgkJCQkJCQl0aGlzW2ldLAoJCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgbGVhayBtZW1vcnkgYnkgaW5hZHZlcnRlbnRseSBkaXNjYXJkaW5nCgkJCQkJCS8vIHRoZSBvcmlnaW5hbCBmcmFnbWVudCAod2hpY2ggbWlnaHQgaGF2ZSBhdHRhY2hlZCBkYXRhKSBpbnN0ZWFkIG9mCgkJCQkJCS8vIHVzaW5nIGl0OyBpbiBhZGRpdGlvbiwgdXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBvYmplY3QgZm9yIHRoZSBsYXN0CgkJCQkJCS8vIGl0ZW0gaW5zdGVhZCBvZiBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAgYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseQoJCQkJCQkvLyBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKEJ1ZyAjODA3MCkuCgkJCQkJCS8vIEZyYWdtZW50cyBmcm9tIHRoZSBmcmFnbWVudCBjYWNoZSBtdXN0IGFsd2F5cyBiZSBjbG9uZWQgYW5kIG5ldmVyIHVzZWQKCQkJCQkJLy8gaW4gcGxhY2UuCgkJCQkJCXJlc3VsdHMuY2FjaGVhYmxlIHx8IChsID4gMSAmJiBpIDwgbGFzdEluZGV4KSA/CgkJCQkJCQlqUXVlcnkuY2xvbmUoIGZyYWdtZW50LCB0cnVlLCB0cnVlICkgOgoJCQkJCQkJZnJhZ21lbnQKCQkJCQkpOwoJCQkJfQoJCQl9CgoJCQlpZiAoIHNjcmlwdHMubGVuZ3RoICkgewoJCQkJalF1ZXJ5LmVhY2goIHNjcmlwdHMsIGV2YWxTY3JpcHQgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Cn0pOwoKZnVuY3Rpb24gcm9vdCggZWxlbSwgY3VyICkgewoJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAidGFibGUiKSA/CgkJKGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF0gfHwKCQllbGVtLmFwcGVuZENoaWxkKGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKSkgOgoJCWVsZW07Cn0KCmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkuaGFzRGF0YSggc3JjICkgKSB7CgkJcmV0dXJuOwoJfQoKCXZhciBpbnRlcm5hbEtleSA9IGpRdWVyeS5leHBhbmRvLAoJCW9sZERhdGEgPSBqUXVlcnkuZGF0YSggc3JjICksCgkJY3VyRGF0YSA9IGpRdWVyeS5kYXRhKCBkZXN0LCBvbGREYXRhICk7CgoJLy8gU3dpdGNoIHRvIHVzZSB0aGUgaW50ZXJuYWwgZGF0YSBvYmplY3QsIGlmIGl0IGV4aXN0cywgZm9yIHRoZSBuZXh0CgkvLyBzdGFnZSBvZiBkYXRhIGNvcHlpbmcKCWlmICggKG9sZERhdGEgPSBvbGREYXRhWyBpbnRlcm5hbEtleSBdKSApIHsKCQl2YXIgZXZlbnRzID0gb2xkRGF0YS5ldmVudHM7CgkJCQljdXJEYXRhID0gY3VyRGF0YVsgaW50ZXJuYWxLZXkgXSA9IGpRdWVyeS5leHRlbmQoe30sIG9sZERhdGEpOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIGN1ckRhdGEuaGFuZGxlOwoJCQljdXJEYXRhLmV2ZW50cyA9IHt9OwoKCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkgewoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUgKyAoIGV2ZW50c1sgdHlwZSBdWyBpIF0ubmFtZXNwYWNlID8gIi4iIDogIiIgKSArIGV2ZW50c1sgdHlwZSBdWyBpIF0ubmFtZXNwYWNlLCBldmVudHNbIHR5cGUgXVsgaSBdLCBldmVudHNbIHR5cGUgXVsgaSBdLmRhdGEgKTsKCQkJCX0KCQkJfQoJCX0KCX0KfQoKZnVuY3Rpb24gY2xvbmVGaXhBdHRyaWJ1dGVzKCBzcmMsIGRlc3QgKSB7Cgl2YXIgbm9kZU5hbWU7CgoJLy8gV2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgZm9yIG5vbi1FbGVtZW50cwoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyBjbGVhckF0dHJpYnV0ZXMgcmVtb3ZlcyB0aGUgYXR0cmlidXRlcywgd2hpY2ggd2UgZG9uJ3Qgd2FudCwKCS8vIGJ1dCBhbHNvIHJlbW92ZXMgdGhlIGF0dGFjaEV2ZW50IGV2ZW50cywgd2hpY2ggd2UgKmRvKiB3YW50CglpZiAoIGRlc3QuY2xlYXJBdHRyaWJ1dGVzICkgewoJCWRlc3QuY2xlYXJBdHRyaWJ1dGVzKCk7Cgl9CgoJLy8gbWVyZ2VBdHRyaWJ1dGVzLCBpbiBjb250cmFzdCwgb25seSBtZXJnZXMgYmFjayBvbiB0aGUKCS8vIG9yaWdpbmFsIGF0dHJpYnV0ZXMsIG5vdCB0aGUgZXZlbnRzCglpZiAoIGRlc3QubWVyZ2VBdHRyaWJ1dGVzICkgewoJCWRlc3QubWVyZ2VBdHRyaWJ1dGVzKCBzcmMgKTsKCX0KCglub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBJRTYtOCBmYWlsIHRvIGNsb25lIGNoaWxkcmVuIGluc2lkZSBvYmplY3QgZWxlbWVudHMgdGhhdCB1c2UKCS8vIHRoZSBwcm9wcmlldGFyeSBjbGFzc2lkIGF0dHJpYnV0ZSB2YWx1ZSAocmF0aGVyIHRoYW4gdGhlIHR5cGUKCS8vIGF0dHJpYnV0ZSkgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgY29udGVudCB0byBkaXNwbGF5CglpZiAoIG5vZGVOYW1lID09PSAib2JqZWN0IiApIHsKCQlkZXN0Lm91dGVySFRNTCA9IHNyYy5vdXRlckhUTUw7CgoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgKHNyYy50eXBlID09PSAiY2hlY2tib3giIHx8IHNyYy50eXBlID09PSAicmFkaW8iKSApIHsKCQkvLyBJRTYtOCBmYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94CgkJLy8gb3IgcmFkaW8gYnV0dG9uLiBXb3JzZSwgSUU2LTcgZmFpbCB0byBnaXZlIHRoZSBjbG9uZWQgZWxlbWVudAoJCS8vIGEgY2hlY2tlZCBhcHBlYXJhbmNlIGlmIHRoZSBkZWZhdWx0Q2hlY2tlZCB2YWx1ZSBpc24ndCBhbHNvIHNldAoJCWlmICggc3JjLmNoZWNrZWQgKSB7CgkJCWRlc3QuZGVmYXVsdENoZWNrZWQgPSBkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCQl9CgoJCS8vIElFNi03IGdldCBjb25mdXNlZCBhbmQgZW5kIHVwIHNldHRpbmcgdGhlIHZhbHVlIG9mIGEgY2xvbmVkCgkJLy8gY2hlY2tib3gvcmFkaW8gYnV0dG9uIHRvIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mICJvbiIKCQlpZiAoIGRlc3QudmFsdWUgIT09IHNyYy52YWx1ZSApIHsKCQkJZGVzdC52YWx1ZSA9IHNyYy52YWx1ZTsKCQl9CgoJLy8gSUU2LTggZmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQKCS8vIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zCgl9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gIm9wdGlvbiIgKSB7CgkJZGVzdC5zZWxlY3RlZCA9IHNyYy5kZWZhdWx0U2VsZWN0ZWQ7CgoJLy8gSUU2LTggZmFpbHMgdG8gc2V0IHRoZSBkZWZhdWx0VmFsdWUgdG8gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbgoJLy8gY2xvbmluZyBvdGhlciB0eXBlcyBvZiBpbnB1dCBmaWVsZHMKCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiIHx8IG5vZGVOYW1lID09PSAidGV4dGFyZWEiICkgewoJCWRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTsKCX0KCgkvLyBFdmVudCBkYXRhIGdldHMgcmVmZXJlbmNlZCBpbnN0ZWFkIG9mIGNvcGllZCBpZiB0aGUgZXhwYW5kbwoJLy8gZ2V0cyBjb3BpZWQgdG9vCglkZXN0LnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKfQoKalF1ZXJ5LmJ1aWxkRnJhZ21lbnQgPSBmdW5jdGlvbiggYXJncywgbm9kZXMsIHNjcmlwdHMgKSB7Cgl2YXIgZnJhZ21lbnQsIGNhY2hlYWJsZSwgY2FjaGVyZXN1bHRzLCBkb2M7CgogIC8vIG5vZGVzIG1heSBjb250YWluIGVpdGhlciBhbiBleHBsaWNpdCBkb2N1bWVudCBvYmplY3QsCiAgLy8gYSBqUXVlcnkgY29sbGVjdGlvbiBvciBjb250ZXh0IG9iamVjdC4KICAvLyBJZiBub2Rlc1swXSBjb250YWlucyBhIHZhbGlkIG9iamVjdCB0byBhc3NpZ24gdG8gZG9jCiAgaWYgKCBub2RlcyAmJiBub2Rlc1swXSApIHsKICAgIGRvYyA9IG5vZGVzWzBdLm93bmVyRG9jdW1lbnQgfHwgbm9kZXNbMF07CiAgfQoKICAvLyBFbnN1cmUgdGhhdCBhbiBhdHRyIG9iamVjdCBkb2Vzbid0IGluY29ycmVjdGx5IHN0YW5kIGluIGFzIGEgZG9jdW1lbnQgb2JqZWN0CgkvLyBDaHJvbWUgYW5kIEZpcmVmb3ggc2VlbSB0byBhbGxvdyB0aGlzIHRvIG9jY3VyIGFuZCB3aWxsIHRocm93IGV4Y2VwdGlvbgoJLy8gRml4ZXMgIzg5NTAKCWlmICggIWRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50ICkgewoJCWRvYyA9IGRvY3VtZW50OwoJfQoKCS8vIE9ubHkgY2FjaGUgInNtYWxsIiAoMS8yIEtCKSBIVE1MIHN0cmluZ3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYWluIGRvY3VtZW50CgkvLyBDbG9uaW5nIG9wdGlvbnMgbG9zZXMgdGhlIHNlbGVjdGVkIHN0YXRlLCBzbyBkb24ndCBjYWNoZSB0aGVtCgkvLyBJRSA2IGRvZXNuJ3QgbGlrZSBpdCB3aGVuIHlvdSBwdXQgPG9iamVjdD4gb3IgPGVtYmVkPiBlbGVtZW50cyBpbiBhIGZyYWdtZW50CgkvLyBBbHNvLCBXZWJLaXQgZG9lcyBub3QgY2xvbmUgJ2NoZWNrZWQnIGF0dHJpYnV0ZXMgb24gY2xvbmVOb2RlLCBzbyBkb24ndCBjYWNoZQoJaWYgKCBhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gInN0cmluZyIgJiYgYXJnc1swXS5sZW5ndGggPCA1MTIgJiYgZG9jID09PSBkb2N1bWVudCAmJgoJCWFyZ3NbMF0uY2hhckF0KDApID09PSAiPCIgJiYgIXJub2NhY2hlLnRlc3QoIGFyZ3NbMF0gKSAmJiAoalF1ZXJ5LnN1cHBvcnQuY2hlY2tDbG9uZSB8fCAhcmNoZWNrZWQudGVzdCggYXJnc1swXSApKSApIHsKCgkJY2FjaGVhYmxlID0gdHJ1ZTsKCgkJY2FjaGVyZXN1bHRzID0galF1ZXJ5LmZyYWdtZW50c1sgYXJnc1swXSBdOwoJCWlmICggY2FjaGVyZXN1bHRzICYmIGNhY2hlcmVzdWx0cyAhPT0gMSApIHsKCQkJZnJhZ21lbnQgPSBjYWNoZXJlc3VsdHM7CgkJfQoJfQoKCWlmICggIWZyYWdtZW50ICkgewoJCWZyYWdtZW50ID0gZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKCQlqUXVlcnkuY2xlYW4oIGFyZ3MsIGRvYywgZnJhZ21lbnQsIHNjcmlwdHMgKTsKCX0KCglpZiAoIGNhY2hlYWJsZSApIHsKCQlqUXVlcnkuZnJhZ21lbnRzWyBhcmdzWzBdIF0gPSBjYWNoZXJlc3VsdHMgPyBmcmFnbWVudCA6IDE7Cgl9CgoJcmV0dXJuIHsgZnJhZ21lbnQ6IGZyYWdtZW50LCBjYWNoZWFibGU6IGNhY2hlYWJsZSB9Owp9OwoKalF1ZXJ5LmZyYWdtZW50cyA9IHt9OwoKalF1ZXJ5LmVhY2goewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSBbXSwKCQkJaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLAoJCQlwYXJlbnQgPSB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzWzBdLnBhcmVudE5vZGU7CgoJCWlmICggcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PT0gMTEgJiYgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmIGluc2VydC5sZW5ndGggPT09IDEgKSB7CgkJCWluc2VydFsgb3JpZ2luYWwgXSggdGhpc1swXSApOwoJCQlyZXR1cm4gdGhpczsKCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gaW5zZXJ0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCXZhciBlbGVtcyA9IChpID4gMCA/IHRoaXMuY2xvbmUodHJ1ZSkgOiB0aGlzKS5nZXQoKTsKCQkJCWpRdWVyeSggaW5zZXJ0W2ldIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7CgkJCQlyZXQgPSByZXQuY29uY2F0KCBlbGVtcyApOwoJCQl9CgoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgaW5zZXJ0LnNlbGVjdG9yICk7CgkJfQoJfTsKfSk7CgpmdW5jdGlvbiBnZXRBbGwoIGVsZW0gKSB7CglpZiAoICJnZXRFbGVtZW50c0J5VGFnTmFtZSIgaW4gZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICk7CgoJfSBlbHNlIGlmICggInF1ZXJ5U2VsZWN0b3JBbGwiIGluIGVsZW0gKSB7CgkJcmV0dXJuIGVsZW0ucXVlcnlTZWxlY3RvckFsbCggIioiICk7CgoJfSBlbHNlIHsKCQlyZXR1cm4gW107Cgl9Cn0KCi8vIFVzZWQgaW4gY2xlYW4sIGZpeGVzIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wZXJ0eQpmdW5jdGlvbiBmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApIHsKCWlmICggZWxlbS50eXBlID09PSAiY2hlY2tib3giIHx8IGVsZW0udHlwZSA9PT0gInJhZGlvIiApIHsKCQllbGVtLmRlZmF1bHRDaGVja2VkID0gZWxlbS5jaGVja2VkOwoJfQp9Ci8vIEZpbmRzIGFsbCBpbnB1dHMgYW5kIHBhc3NlcyB0aGVtIHRvIGZpeERlZmF1bHRDaGVja2VkCmZ1bmN0aW9uIGZpbmRJbnB1dHMoIGVsZW0gKSB7CglpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCWZpeERlZmF1bHRDaGVja2VkKCBlbGVtICk7Cgl9IGVsc2UgaWYgKCAiZ2V0RWxlbWVudHNCeVRhZ05hbWUiIGluIGVsZW0gKSB7CgkJalF1ZXJ5LmdyZXAoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IiksIGZpeERlZmF1bHRDaGVja2VkICk7Cgl9Cn0KCmpRdWVyeS5leHRlbmQoewoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgY2xvbmUgPSBlbGVtLmNsb25lTm9kZSh0cnVlKSwKCQkJCXNyY0VsZW1lbnRzLAoJCQkJZGVzdEVsZW1lbnRzLAoJCQkJaTsKCgkJaWYgKCAoIWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVFdmVudCB8fCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUNoZWNrZWQpICYmCgkJCQkoZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSkgJiYgIWpRdWVyeS5pc1hNTERvYyhlbGVtKSApIHsKCQkJLy8gSUUgY29waWVzIGV2ZW50cyBib3VuZCB2aWEgYXR0YWNoRXZlbnQgd2hlbiB1c2luZyBjbG9uZU5vZGUuCgkJCS8vIENhbGxpbmcgZGV0YWNoRXZlbnQgb24gdGhlIGNsb25lIHdpbGwgYWxzbyByZW1vdmUgdGhlIGV2ZW50cwoJCQkvLyBmcm9tIHRoZSBvcmlnaW5hbC4gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2Ugc29tZQoJCQkvLyBwcm9wcmlldGFyeSBtZXRob2RzIHRvIGNsZWFyIHRoZSBldmVudHMuIFRoYW5rcyB0byBNb29Ub29scwoJCQkvLyBndXlzIGZvciB0aGlzIGhvdG5lc3MuCgoJCQljbG9uZUZpeEF0dHJpYnV0ZXMoIGVsZW0sIGNsb25lICk7CgoJCQkvLyBVc2luZyBTaXp6bGUgaGVyZSBpcyBjcmF6eSBzbG93LCBzbyB3ZSB1c2UgZ2V0RWxlbWVudHNCeVRhZ05hbWUKCQkJLy8gaW5zdGVhZAoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoJCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7CgoJCQkvLyBXZWlyZCBpdGVyYXRpb24gYmVjYXVzZSBJRSB3aWxsIHJlcGxhY2UgdGhlIGxlbmd0aCBwcm9wZXJ0eQoJCQkvLyB3aXRoIGFuIGVsZW1lbnQgaWYgeW91IGFyZSBjbG9uaW5nIHRoZSBib2R5IGFuZCBvbmUgb2YgdGhlCgkJCS8vIGVsZW1lbnRzIG9uIHRoZSBwYWdlIGhhcyBhIG5hbWUgb3IgaWQgb2YgImxlbmd0aCIKCQkJZm9yICggaSA9IDA7IHNyY0VsZW1lbnRzW2ldOyArK2kgKSB7CgkJCQkvLyBFbnN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gbm9kZSBpcyBub3QgbnVsbDsgRml4ZXMgIzk1ODcKCQkJCWlmICggZGVzdEVsZW1lbnRzW2ldICkgewoJCQkJCWNsb25lRml4QXR0cmlidXRlcyggc3JjRWxlbWVudHNbaV0sIGRlc3RFbGVtZW50c1tpXSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lCgkJaWYgKCBkYXRhQW5kRXZlbnRzICkgewoJCQljbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTsKCgkJCWlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7CgkJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoJCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwOyBzcmNFbGVtZW50c1tpXTsgKytpICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1tpXSwgZGVzdEVsZW1lbnRzW2ldICk7CgkJCQl9CgkJCX0KCQl9CgoJCXNyY0VsZW1lbnRzID0gZGVzdEVsZW1lbnRzID0gbnVsbDsKCgkJLy8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0CgkJcmV0dXJuIGNsb25lOwoJfSwKCgljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBmcmFnbWVudCwgc2NyaXB0cyApIHsKCQl2YXIgY2hlY2tTY3JpcHRUeXBlOwoKCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JwoJCWlmICggdHlwZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVuZGVmaW5lZCIgKSB7CgkJCWNvbnRleHQgPSBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dFswXSAmJiBjb250ZXh0WzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7CgkJfQoKCQl2YXIgcmV0ID0gW10sIGo7CgoJCWZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAibnVtYmVyIiApIHsKCQkJCWVsZW0gKz0gIiI7CgkJCX0KCgkJCWlmICggIWVsZW0gKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcwoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJCWlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHsKCQkJCQllbGVtID0gY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyBGaXggIlhIVE1MIi1zdHlsZSB0YWdzIGluIGFsbCBicm93c2VycwoJCQkJCWVsZW0gPSBlbGVtLnJlcGxhY2UocnhodG1sVGFnLCAiPCQxPjwvJDI+Iik7CgoJCQkJCS8vIFRyaW0gd2hpdGVzcGFjZSwgb3RoZXJ3aXNlIGluZGV4T2Ygd29uJ3Qgd29yayBhcyBleHBlY3RlZAoJCQkJCXZhciB0YWcgPSAocnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpLAoJCQkJCQl3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdCwKCQkJCQkJZGVwdGggPSB3cmFwWzBdLAoJCQkJCQlkaXYgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoKCQkJCQkvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCgkJCQkJZGl2LmlubmVySFRNTCA9IHdyYXBbMV0gKyBlbGVtICsgd3JhcFsyXTsKCgkJCQkJLy8gTW92ZSB0byB0aGUgcmlnaHQgZGVwdGgKCQkJCQl3aGlsZSAoIGRlcHRoLS0gKSB7CgkJCQkJCWRpdiA9IGRpdi5sYXN0Q2hpbGQ7CgkJCQkJfQoKCQkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cwoJCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnRib2R5ICkgewoKCQkJCQkJLy8gU3RyaW5nIHdhcyBhIDx0YWJsZT4sICptYXkqIGhhdmUgc3B1cmlvdXMgPHRib2R5PgoJCQkJCQl2YXIgaGFzQm9keSA9IHJ0Ym9keS50ZXN0KGVsZW0pLAoJCQkJCQkJdGJvZHkgPSB0YWcgPT09ICJ0YWJsZSIgJiYgIWhhc0JvZHkgPwoJCQkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOgoKCQkJCQkJCQkvLyBTdHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD4KCQkJCQkJCQl3cmFwWzFdID09PSAiPHRhYmxlPiIgJiYgIWhhc0JvZHkgPwoJCQkJCQkJCQlkaXYuY2hpbGROb2RlcyA6CgkJCQkJCQkJCVtdOwoKCQkJCQkJZm9yICggaiA9IHRib2R5Lmxlbmd0aCAtIDE7IGogPj0gMCA7IC0taiApIHsKCQkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKSB7CgkJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIElFIGNvbXBsZXRlbHkga2lsbHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gaW5uZXJIVE1MIGlzIHVzZWQKCQkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiBybGVhZGluZ1doaXRlc3BhY2UudGVzdCggZWxlbSApICkgewoJCQkJCQlkaXYuaW5zZXJ0QmVmb3JlKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBybGVhZGluZ1doaXRlc3BhY2UuZXhlYyhlbGVtKVswXSApLCBkaXYuZmlyc3RDaGlsZCApOwoJCQkJCX0KCgkJCQkJZWxlbSA9IGRpdi5jaGlsZE5vZGVzOwoJCQkJfQoJCQl9CgoJCQkvLyBSZXNldHMgZGVmYXVsdENoZWNrZWQgZm9yIGFueSByYWRpb3MgYW5kIGNoZWNrYm94ZXMKCQkJLy8gYWJvdXQgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIERPTSBpbiBJRSA2LzcgKCM4MDYwKQoJCQl2YXIgbGVuOwoJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5hcHBlbmRDaGVja2VkICkgewoJCQkJaWYgKCBlbGVtWzBdICYmIHR5cGVvZiAobGVuID0gZWxlbS5sZW5ndGgpID09PSAibnVtYmVyIiApIHsKCQkJCQlmb3IgKCBqID0gMDsgaiA8IGxlbjsgaisrICkgewoJCQkJCQlmaW5kSW5wdXRzKCBlbGVtW2pdICk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlmaW5kSW5wdXRzKCBlbGVtICk7CgkJCQl9CgkJCX0KCgkJCWlmICggZWxlbS5ub2RlVHlwZSApIHsKCQkJCXJldC5wdXNoKCBlbGVtICk7CgkJCX0gZWxzZSB7CgkJCQlyZXQgPSBqUXVlcnkubWVyZ2UoIHJldCwgZWxlbSApOwoJCQl9CgkJfQoKCQlpZiAoIGZyYWdtZW50ICkgewoJCQljaGVja1NjcmlwdFR5cGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAhZWxlbS50eXBlIHx8IHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSApOwoJCQl9OwoJCQlmb3IgKCBpID0gMDsgcmV0W2ldOyBpKysgKSB7CgkJCQlpZiAoIHNjcmlwdHMgJiYgalF1ZXJ5Lm5vZGVOYW1lKCByZXRbaV0sICJzY3JpcHQiICkgJiYgKCFyZXRbaV0udHlwZSB8fCByZXRbaV0udHlwZS50b0xvd2VyQ2FzZSgpID09PSAidGV4dC9qYXZhc2NyaXB0IikgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCByZXRbaV0ucGFyZW50Tm9kZSA/IHJldFtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCByZXRbaV0gKSA6IHJldFtpXSApOwoKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCByZXRbaV0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCXZhciBqc1RhZ3MgPSBqUXVlcnkuZ3JlcCggcmV0W2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAic2NyaXB0IiApLCBjaGVja1NjcmlwdFR5cGUgKTsKCgkJCQkJCXJldC5zcGxpY2UuYXBwbHkoIHJldCwgW2kgKyAxLCAwXS5jb25jYXQoIGpzVGFncyApICk7CgkJCQkJfQoJCQkJCWZyYWdtZW50LmFwcGVuZENoaWxkKCByZXRbaV0gKTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGlkLCBjYWNoZSA9IGpRdWVyeS5jYWNoZSwgaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywgc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLAoJCQlkZWxldGVFeHBhbmRvID0galF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbzsKCgkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCWlmICggZWxlbS5ub2RlTmFtZSAmJiBqUXVlcnkubm9EYXRhW2VsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0gKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWQgPSBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdOwoKCQkJaWYgKCBpZCApIHsKCQkJCWRhdGEgPSBjYWNoZVsgaWQgXSAmJiBjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXTsKCgkJCQlpZiAoIGRhdGEgJiYgZGF0YS5ldmVudHMgKSB7CgkJCQkJZm9yICggdmFyIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCWlmICggc3BlY2lhbFsgdHlwZSBdICkgewoJCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApOwoKCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQl9IGVsc2UgewoJCQkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBOdWxsIHRoZSBET00gcmVmZXJlbmNlIHRvIGF2b2lkIElFNi83LzggbGVhayAoIzcwNTQpCgkJCQkJaWYgKCBkYXRhLmhhbmRsZSApIHsKCQkJCQkJZGF0YS5oYW5kbGUuZWxlbSA9IG51bGw7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZGVsZXRlRXhwYW5kbyApIHsKCQkJCQlkZWxldGUgZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKCgkJCQl9IGVsc2UgaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApIHsKCQkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKCQkJCX0KCgkJCQlkZWxldGUgY2FjaGVbIGlkIF07CgkJCX0KCQl9Cgl9Cn0pOwoKZnVuY3Rpb24gZXZhbFNjcmlwdCggaSwgZWxlbSApIHsKCWlmICggZWxlbS5zcmMgKSB7CgkJalF1ZXJ5LmFqYXgoewoJCQl1cmw6IGVsZW0uc3JjLAoJCQlhc3luYzogZmFsc2UsCgkJCWRhdGFUeXBlOiAic2NyaXB0IgoJCX0pOwoJfSBlbHNlIHsKCQlqUXVlcnkuZ2xvYmFsRXZhbCggKCBlbGVtLnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCAiIiApLnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgIi8qJDAqLyIgKSApOwoJfQoKCWlmICggZWxlbS5wYXJlbnROb2RlICkgewoJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOwoJfQp9CgoKCgp2YXIgcmFscGhhID0gL2FscGhhXChbXildKlwpL2ksCglyb3BhY2l0eSA9IC9vcGFjaXR5PShbXildKikvLAoJLy8gZml4ZWQgZm9yIElFOSwgc2VlICM4MzQ2CglydXBwZXIgPSAvKFtBLVpdfF5tcykvZywKCXJudW1weCA9IC9eLT9cZCsoPzpweCk/JC9pLAoJcm51bSA9IC9eLT9cZC8sCglycmVsTnVtID0gL14oW1wtK10pPShbXC0rLlxkZV0rKS8sCgoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NXaWR0aCA9IFsgIkxlZnQiLCAiUmlnaHQiIF0sCgljc3NIZWlnaHQgPSBbICJUb3AiLCAiQm90dG9tIiBdLAoJY3VyQ1NTLAoKCWdldENvbXB1dGVkU3R5bGUsCgljdXJyZW50U3R5bGU7CgpqUXVlcnkuZm4uY3NzID0gZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJLy8gU2V0dGluZyAndW5kZWZpbmVkJyBpcyBhIG5vLW9wCglpZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQlyZXR1cm4gdGhpczsKCX0KCglyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgbmFtZSwgdmFsdWUsIHRydWUsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/CgkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCWpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTsKCX0pOwp9OwoKalF1ZXJ5LmV4dGVuZCh7CgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCQkJCQkvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eQoJCQkJCXZhciByZXQgPSBjdXJDU1MoIGVsZW0sICJvcGFjaXR5IiwgIm9wYWNpdHkiICk7CgkJCQkJcmV0dXJuIHJldCA9PT0gIiIgPyAiMSIgOiByZXQ7CgoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gZWxlbS5zdHlsZS5vcGFjaXR5OwoJCQkJfQoJCQl9CgkJfQoJfSwKCgkvLyBFeGNsdWRlIHRoZSBmb2xsb3dpbmcgY3NzIHByb3BlcnRpZXMgdG8gYWRkIHB4Cgljc3NOdW1iZXI6IHsKCQkiZmlsbE9wYWNpdHkiOiB0cnVlLAoJCSJmb250V2VpZ2h0IjogdHJ1ZSwKCQkibGluZUhlaWdodCI6IHRydWUsCgkJIm9wYWNpdHkiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHsKCQkvLyBub3JtYWxpemUgZmxvYXQgY3NzIHByb3BlcnR5CgkJImZsb2F0IjogalF1ZXJ5LnN1cHBvcnQuY3NzRmxvYXQgPyAiY3NzRmxvYXQiIDogInN0eWxlRmxvYXQiCgl9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCQkvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lCgkJdmFyIHJldCwgdHlwZSwgb3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZSwgaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCW5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwgb3JpZ05hbWU7CgoJCS8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZQoJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJdHlwZSA9IHR5cGVvZiB2YWx1ZTsKCgkJCS8vIGNvbnZlcnQgcmVsYXRpdmUgbnVtYmVyIHN0cmluZ3MgKCs9IG9yIC09KSB0byByZWxhdGl2ZSBudW1iZXJzLiAjNzM0NQoJCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICYmIChyZXQgPSBycmVsTnVtLmV4ZWMoIHZhbHVlICkpICkgewoJCQkJdmFsdWUgPSAoICsoIHJldFsxXSArIDEpICogK3JldFsyXSApICsgcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApICk7CgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgTmFOIGFuZCBudWxsIHZhbHVlcyBhcmVuJ3Qgc2V0LiBTZWU6ICM3MTE2CgkJCWlmICggdmFsdWUgPT0gbnVsbCB8fCB0eXBlID09PSAibnVtYmVyIiAmJiBpc05hTiggdmFsdWUgKSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkICdweCcgdG8gdGhlIChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7CgkJCQl2YWx1ZSArPSAicHgiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgKHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSApKSAhPT0gdW5kZWZpbmVkICkgewoJCQkJLy8gV3JhcHBlZCB0byBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgZXJyb3JzIHdoZW4gJ2ludmFsaWQnIHZhbHVlcyBhcmUgcHJvdmlkZWQKCQkJCS8vIEZpeGVzIGJ1ZyAjNTUwOQoJCQkJdHJ5IHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9IGNhdGNoKGUpIHt9CgkJCX0KCgkJfSBlbHNlIHsKCQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQkvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdAoJCQlyZXR1cm4gc3R5bGVbIG5hbWUgXTsKCQl9Cgl9LAoKCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhICkgewoJCXZhciByZXQsIGhvb2tzOwoKCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKCQluYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApOwoJCWhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07CgkJbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdIHx8IG5hbWU7CgoJCS8vIGNzc0Zsb2F0IG5lZWRzIGEgc3BlY2lhbCB0cmVhdG1lbnQKCQlpZiAoIG5hbWUgPT09ICJjc3NGbG9hdCIgKSB7CgkJCW5hbWUgPSAiZmxvYXQiOwoJCX0KCgkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiByZXQ7CgoJCS8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0CgkJfSBlbHNlIGlmICggY3VyQ1NTICkgewoJCQlyZXR1cm4gY3VyQ1NTKCBlbGVtLCBuYW1lICk7CgkJfQoJfSwKCgkvLyBBIG1ldGhvZCBmb3IgcXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2FsY3VsYXRpb25zCglzd2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2sgKSB7CgkJdmFyIG9sZCA9IHt9OwoKCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkgewoJCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdOwoJCX0KCgkJY2FsbGJhY2suY2FsbCggZWxlbSApOwoKCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJCX0KCX0KfSk7CgovLyBERVBSRUNBVEVELCBVc2UgalF1ZXJ5LmNzcygpIGluc3RlYWQKalF1ZXJ5LmN1ckNTUyA9IGpRdWVyeS5jc3M7CgpqUXVlcnkuZWFjaChbImhlaWdodCIsICJ3aWR0aCJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5jc3NIb29rc1sgbmFtZSBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggY29tcHV0ZWQgKSB7CgkJCQlpZiAoIGVsZW0ub2Zmc2V0V2lkdGggIT09IDAgKSB7CgkJCQkJcmV0dXJuIGdldFdIKCBlbGVtLCBuYW1lLCBleHRyYSApOwoJCQkJfSBlbHNlIHsKCQkJCQlqUXVlcnkuc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCXZhbCA9IGdldFdIKCBlbGVtLCBuYW1lLCBleHRyYSApOwoJCQkJCX0pOwoJCQkJfQoKCQkJCXJldHVybiB2YWw7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJaWYgKCBybnVtcHgudGVzdCggdmFsdWUgKSApIHsKCQkJCS8vIGlnbm9yZSBuZWdhdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyAjMTU5OQoJCQkJdmFsdWUgPSBwYXJzZUZsb2F0KCB2YWx1ZSApOwoKCQkJCWlmICggdmFsdWUgPj0gMCApIHsKCQkJCQlyZXR1cm4gdmFsdWUgKyAicHgiOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB2YWx1ZTsKCQkJfQoJCX0KCX07Cn0pOwoKaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSApIHsKCWpRdWVyeS5jc3NIb29rcy5vcGFjaXR5ID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkvLyBJRSB1c2VzIGZpbHRlcnMgZm9yIG9wYWNpdHkKCQkJcmV0dXJuIHJvcGFjaXR5LnRlc3QoIChjb21wdXRlZCAmJiBlbGVtLmN1cnJlbnRTdHlsZSA/IGVsZW0uY3VycmVudFN0eWxlLmZpbHRlciA6IGVsZW0uc3R5bGUuZmlsdGVyKSB8fCAiIiApID8KCQkJCSggcGFyc2VGbG9hdCggUmVnRXhwLiQxICkgLyAxMDAgKSArICIiIDoKCQkJCWNvbXB1dGVkID8gIjEiIDogIiI7CgkJfSwKCgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZSA9IGVsZW0uc3R5bGUsCgkJCQljdXJyZW50U3R5bGUgPSBlbGVtLmN1cnJlbnRTdHlsZSwKCQkJCW9wYWNpdHkgPSBqUXVlcnkuaXNOYU4oIHZhbHVlICkgPyAiIiA6ICJhbHBoYShvcGFjaXR5PSIgKyB2YWx1ZSAqIDEwMCArICIpIiwKCQkJCWZpbHRlciA9IGN1cnJlbnRTdHlsZSAmJiBjdXJyZW50U3R5bGUuZmlsdGVyIHx8IHN0eWxlLmZpbHRlciB8fCAiIjsKCgkJCS8vIElFIGhhcyB0cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAoJCQkvLyBGb3JjZSBpdCBieSBzZXR0aW5nIHRoZSB6b29tIGxldmVsCgkJCXN0eWxlLnpvb20gPSAxOwoKCQkJLy8gaWYgc2V0dGluZyBvcGFjaXR5IHRvIDEsIGFuZCBubyBvdGhlciBmaWx0ZXJzIGV4aXN0IC0gYXR0ZW1wdCB0byByZW1vdmUgZmlsdGVyIGF0dHJpYnV0ZSAjNjY1MgoJCQlpZiAoIHZhbHVlID49IDEgJiYgalF1ZXJ5LnRyaW0oIGZpbHRlci5yZXBsYWNlKCByYWxwaGEsICIiICkgKSA9PT0gIiIgKSB7CgoJCQkJLy8gU2V0dGluZyBzdHlsZS5maWx0ZXIgdG8gbnVsbCwgIiIgJiAiICIgc3RpbGwgbGVhdmUgImZpbHRlcjoiIGluIHRoZSBjc3NUZXh0CgkJCQkvLyBpZiAiZmlsdGVyOiIgaXMgcHJlc2VudCBhdCBhbGwsIGNsZWFyVHlwZSBpcyBkaXNhYmxlZCwgd2Ugd2FudCB0byBhdm9pZCB0aGlzCgkJCQkvLyBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUgaXMgSUUgT25seSwgYnV0IHNvIGFwcGFyZW50bHkgaXMgdGhpcyBjb2RlIHBhdGguLi4KCQkJCXN0eWxlLnJlbW92ZUF0dHJpYnV0ZSggImZpbHRlciIgKTsKCgkJCQkvLyBpZiB0aGVyZSB0aGVyZSBpcyBubyBmaWx0ZXIgc3R5bGUgYXBwbGllZCBpbiBhIGNzcyBydWxlLCB3ZSBhcmUgZG9uZQoJCQkJaWYgKCBjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5maWx0ZXIgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQl9CgoJCQkvLyBvdGhlcndpc2UsIHNldCBuZXcgZmlsdGVyIHZhbHVlcwoJCQlzdHlsZS5maWx0ZXIgPSByYWxwaGEudGVzdCggZmlsdGVyICkgPwoJCQkJZmlsdGVyLnJlcGxhY2UoIHJhbHBoYSwgb3BhY2l0eSApIDoKCQkJCWZpbHRlciArICIgIiArIG9wYWNpdHk7CgkJfQoJfTsKfQoKalF1ZXJ5KGZ1bmN0aW9uKCkgewoJLy8gVGhpcyBob29rIGNhbm5vdCBiZSBhZGRlZCB1bnRpbCBET00gcmVhZHkgYmVjYXVzZSB0aGUgc3VwcG9ydCB0ZXN0CgkvLyBmb3IgaXQgaXMgbm90IHJ1biB1bnRpbCBhZnRlciBET00gcmVhZHkKCWlmICggIWpRdWVyeS5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQgKSB7CgkJalF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0gewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKCQkJCS8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAoJCQkJLy8gV29yayBhcm91bmQgYnkgdGVtcG9yYXJpbHkgc2V0dGluZyBlbGVtZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrCgkJCQl2YXIgcmV0OwoJCQkJalF1ZXJ5LnN3YXAoIGVsZW0sIHsgImRpc3BsYXkiOiAiaW5saW5lLWJsb2NrIiB9LCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJCQlyZXQgPSBjdXJDU1MoIGVsZW0sICJtYXJnaW4tcmlnaHQiLCAibWFyZ2luUmlnaHQiICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcmV0ID0gZWxlbS5zdHlsZS5tYXJnaW5SaWdodDsKCQkJCQl9CgkJCQl9KTsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9OwoJfQp9KTsKCmlmICggZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKCWdldENvbXB1dGVkU3R5bGUgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQl2YXIgcmV0LCBkZWZhdWx0VmlldywgY29tcHV0ZWRTdHlsZTsKCgkJbmFtZSA9IG5hbWUucmVwbGFjZSggcnVwcGVyLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7CgoJCWlmICggIShkZWZhdWx0VmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIChjb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApKSApIHsKCQkJcmV0ID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICk7CgkJCWlmICggcmV0ID09PSAiIiAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBlbGVtICkgKSB7CgkJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX07Cn0KCmlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSApIHsKCWN1cnJlbnRTdHlsZSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCXZhciBsZWZ0LAoJCQlyZXQgPSBlbGVtLmN1cnJlbnRTdHlsZSAmJiBlbGVtLmN1cnJlbnRTdHlsZVsgbmFtZSBdLAoJCQlyc0xlZnQgPSBlbGVtLnJ1bnRpbWVTdHlsZSAmJiBlbGVtLnJ1bnRpbWVTdHlsZVsgbmFtZSBdLAoJCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJCS8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMKCQkvLyBodHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQtMTAyMjkxCgoJCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlcgoJCS8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVscwoJCWlmICggIXJudW1weC50ZXN0KCByZXQgKSAmJiBybnVtLnRlc3QoIHJldCApICkgewoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCWxlZnQgPSBzdHlsZS5sZWZ0OwoKCQkJLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dAoJCQlpZiAoIHJzTGVmdCApIHsKCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0OwoJCQl9CgkJCXN0eWxlLmxlZnQgPSBuYW1lID09PSAiZm9udFNpemUiID8gIjFlbSIgOiAocmV0IHx8IDApOwoJCQlyZXQgPSBzdHlsZS5waXhlbExlZnQgKyAicHgiOwoKCQkJLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcwoJCQlzdHlsZS5sZWZ0ID0gbGVmdDsKCQkJaWYgKCByc0xlZnQgKSB7CgkJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcnNMZWZ0OwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0ID09PSAiIiA/ICJhdXRvIiA6IHJldDsKCX07Cn0KCmN1ckNTUyA9IGdldENvbXB1dGVkU3R5bGUgfHwgY3VycmVudFN0eWxlOwoKZnVuY3Rpb24gZ2V0V0goIGVsZW0sIG5hbWUsIGV4dHJhICkgewoKCS8vIFN0YXJ0IHdpdGggb2Zmc2V0IHByb3BlcnR5Cgl2YXIgdmFsID0gbmFtZSA9PT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCwKCQl3aGljaCA9IG5hbWUgPT09ICJ3aWR0aCIgPyBjc3NXaWR0aCA6IGNzc0hlaWdodDsKCglpZiAoIHZhbCA+IDAgKSB7CgkJaWYgKCBleHRyYSAhPT0gImJvcmRlciIgKSB7CgkJCWpRdWVyeS5lYWNoKCB3aGljaCwgZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFleHRyYSApIHsKCQkJCQl2YWwgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgInBhZGRpbmciICsgdGhpcyApICkgfHwgMDsKCQkJCX0KCQkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkgewoJCQkJCXZhbCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCBleHRyYSArIHRoaXMgKSApIHx8IDA7CgkJCQl9IGVsc2UgewoJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIHRoaXMgKyAiV2lkdGgiICkgKSB8fCAwOwoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldHVybiB2YWwgKyAicHgiOwoJfQoKCS8vIEZhbGwgYmFjayB0byBjb21wdXRlZCB0aGVuIHVuY29tcHV0ZWQgY3NzIGlmIG5lY2Vzc2FyeQoJdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBuYW1lICk7CglpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7CgkJdmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdIHx8IDA7Cgl9CgkvLyBOb3JtYWxpemUgIiIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYQoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGQgcGFkZGluZywgYm9yZGVyLCBtYXJnaW4KCWlmICggZXh0cmEgKSB7CgkJalF1ZXJ5LmVhY2goIHdoaWNoLCBmdW5jdGlvbigpIHsKCQkJdmFsICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMgKSApIHx8IDA7CgkJCWlmICggZXh0cmEgIT09ICJwYWRkaW5nIiApIHsKCQkJCXZhbCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIHRoaXMgKyAiV2lkdGgiICkgKSB8fCAwOwoJCQl9CgkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkgewoJCQkJdmFsICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgdGhpcyApICkgfHwgMDsKCQkJfQoJCX0pOwoJfQoKCXJldHVybiB2YWwgKyAicHgiOwp9CgppZiAoIGpRdWVyeS5leHByICYmIGpRdWVyeS5leHByLmZpbHRlcnMgKSB7CglqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciB3aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGgsCgkJCWhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0OwoKCQlyZXR1cm4gKHdpZHRoID09PSAwICYmIGhlaWdodCA9PT0gMCkgfHwgKCFqUXVlcnkuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgJiYgKGVsZW0uc3R5bGUuZGlzcGxheSB8fCBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSkgPT09ICJub25lIik7Cgl9OwoKCWpRdWVyeS5leHByLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhalF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4oIGVsZW0gKTsKCX07Cn0KCgoKCnZhciByMjAgPSAvJTIwL2csCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcmhhc2ggPSAvIy4qJC8sCglyaGVhZGVycyA9IC9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsIC8vIElFIGxlYXZlcyBhbiBcciBjaGFyYWN0ZXIgYXQgRU9MCglyaW5wdXQgPSAvXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLywKCXJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLAoJcnByb3RvY29sID0gL15cL1wvLywKCXJxdWVyeSA9IC9cPy8sCglyc2NyaXB0ID0gLzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksCglyc2VsZWN0VGV4dGFyZWEgPSAvXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSwKCXJzcGFjZXNBamF4ID0gL1xzKy8sCglydHMgPSAvKFs/Jl0pXz1bXiZdKi8sCglydXJsID0gL14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLAoKCS8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZCBtZXRob2QKCV9sb2FkID0galF1ZXJ5LmZuLmxvYWQsCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gRG9jdW1lbnQgbG9jYXRpb24KCWFqYXhMb2NhdGlvbiwKCgkvLyBEb2N1bWVudCBsb2NhdGlvbiBzZWdtZW50cwoJYWpheExvY1BhcnRzLAoJCgkvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb24KCWFsbFR5cGVzID0gWyIqLyJdICsgWyIqIl07CgovLyAjODEzOCwgSUUgbWF5IHRocm93IGFuIGV4Y2VwdGlvbiB3aGVuIGFjY2Vzc2luZwovLyBhIGZpZWxkIGZyb20gd2luZG93LmxvY2F0aW9uIGlmIGRvY3VtZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQKdHJ5IHsKCWFqYXhMb2NhdGlvbiA9IGxvY2F0aW9uLmhyZWY7Cn0gY2F0Y2goIGUgKSB7CgkvLyBVc2UgdGhlIGhyZWYgYXR0cmlidXRlIG9mIGFuIEEgZWxlbWVudAoJLy8gc2luY2UgSUUgd2lsbCBtb2RpZnkgaXQgZ2l2ZW4gZG9jdW1lbnQubG9jYXRpb24KCWFqYXhMb2NhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJYWpheExvY2F0aW9uLmhyZWYgPSAiIjsKCWFqYXhMb2NhdGlvbiA9IGFqYXhMb2NhdGlvbi5ocmVmOwp9CgovLyBTZWdtZW50IGxvY2F0aW9uIGludG8gcGFydHMKYWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2UoKSApIHx8IFtdOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7CgkJCXZhciBkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5zcGxpdCggcnNwYWNlc0FqYXggKSwKCQkJCWkgPSAwLAoJCQkJbGVuZ3RoID0gZGF0YVR5cGVzLmxlbmd0aCwKCQkJCWRhdGFUeXBlLAoJCQkJbGlzdCwKCQkJCXBsYWNlQmVmb3JlOwoKCQkJLy8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvbgoJCQlmb3IoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSBdOwoJCQkJLy8gV2UgY29udHJvbCBpZiB3ZSdyZSBhc2tlZCB0byBhZGQgYmVmb3JlCgkJCQkvLyBhbnkgZXhpc3RpbmcgZWxlbWVudAoJCQkJcGxhY2VCZWZvcmUgPSAvXlwrLy50ZXN0KCBkYXRhVHlwZSApOwoJCQkJaWYgKCBwbGFjZUJlZm9yZSApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnN1YnN0ciggMSApIHx8ICIqIjsKCQkJCX0KCQkJCWxpc3QgPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW107CgkJCQkvLyB0aGVuIHdlIGFkZCB0byB0aGUgc3RydWN0dXJlIGFjY29yZGluZ2x5CgkJCQlsaXN0WyBwbGFjZUJlZm9yZSA/ICJ1bnNoaWZ0IiA6ICJwdXNoIiBdKCBmdW5jICk7CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiwKCQlkYXRhVHlwZSAvKiBpbnRlcm5hbCAqLywgaW5zcGVjdGVkIC8qIGludGVybmFsICovICkgewoKCWRhdGFUeXBlID0gZGF0YVR5cGUgfHwgb3B0aW9ucy5kYXRhVHlwZXNbIDAgXTsKCWluc3BlY3RlZCA9IGluc3BlY3RlZCB8fCB7fTsKCglpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlOwoKCXZhciBsaXN0ID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdLAoJCWkgPSAwLAoJCWxlbmd0aCA9IGxpc3QgPyBsaXN0Lmxlbmd0aCA6IDAsCgkJZXhlY3V0ZU9ubHkgPSAoIHN0cnVjdHVyZSA9PT0gcHJlZmlsdGVycyApLAoJCXNlbGVjdGlvbjsKCglmb3IoOyBpIDwgbGVuZ3RoICYmICggZXhlY3V0ZU9ubHkgfHwgIXNlbGVjdGlvbiApOyBpKysgKSB7CgkJc2VsZWN0aW9uID0gbGlzdFsgaSBdKCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7CgkJLy8gSWYgd2UgZ290IHJlZGlyZWN0ZWQgdG8gYW5vdGhlciBkYXRhVHlwZQoJCS8vIHdlIHRyeSB0aGVyZSBpZiBleGVjdXRpbmcgb25seSBhbmQgbm90IGRvbmUgYWxyZWFkeQoJCWlmICggdHlwZW9mIHNlbGVjdGlvbiA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggIWV4ZWN1dGVPbmx5IHx8IGluc3BlY3RlZFsgc2VsZWN0aW9uIF0gKSB7CgkJCQlzZWxlY3Rpb24gPSB1bmRlZmluZWQ7CgkJCX0gZWxzZSB7CgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBzZWxlY3Rpb24gKTsKCQkJCXNlbGVjdGlvbiA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKAoJCQkJCQlzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIsIHNlbGVjdGlvbiwgaW5zcGVjdGVkICk7CgkJCX0KCQl9Cgl9CgkvLyBJZiB3ZSdyZSBvbmx5IGV4ZWN1dGluZyBvciBub3RoaW5nIHdhcyBzZWxlY3RlZAoJLy8gd2UgdHJ5IHRoZSBjYXRjaGFsbCBkYXRhVHlwZSBpZiBub3QgZG9uZSBhbHJlYWR5CglpZiAoICggZXhlY3V0ZU9ubHkgfHwgIXNlbGVjdGlvbiApICYmICFpbnNwZWN0ZWRbICIqIiBdICkgewoJCXNlbGVjdGlvbiA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKAoJCQkJc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSLCAiKiIsIGluc3BlY3RlZCApOwoJfQoJLy8gdW5uZWNlc3Nhcnkgd2hlbiBvbmx5IGV4ZWN1dGluZyAocHJlZmlsdGVycykKCS8vIGJ1dCBpdCdsbCBiZSBpZ25vcmVkIGJ5IHRoZSBjYWxsZXIgaW4gdGhhdCBjYXNlCglyZXR1cm4gc2VsZWN0aW9uOwp9CgovLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnMKLy8gdGhhdCB0YWtlcyAiZmxhdCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpCi8vIEZpeGVzICM5ODg3CmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkgewoJdmFyIGtleSwgZGVlcCwKCQlmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnMgfHwge307Cglmb3IoIGtleSBpbiBzcmMgKSB7CgkJaWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7CgkJCSggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8ICggZGVlcCA9IHt9ICkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07CgkJfQoJfQoJaWYgKCBkZWVwICkgewoJCWpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApOwoJfQp9CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWxvYWQ6IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CgkJaWYgKCB0eXBlb2YgdXJsICE9PSAic3RyaW5nIiAmJiBfbG9hZCApIHsKCQkJcmV0dXJuIF9sb2FkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCgkJLy8gRG9uJ3QgZG8gYSByZXF1ZXN0IGlmIG5vIGVsZW1lbnRzIGFyZSBiZWluZyByZXF1ZXN0ZWQKCQl9IGVsc2UgaWYgKCAhdGhpcy5sZW5ndGggKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJdmFyIG9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCQlpZiAoIG9mZiA+PSAwICkgewoJCQl2YXIgc2VsZWN0b3IgPSB1cmwuc2xpY2UoIG9mZiwgdXJsLmxlbmd0aCApOwoJCQl1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApOwoJCX0KCgkJLy8gRGVmYXVsdCB0byBhIEdFVCByZXF1ZXN0CgkJdmFyIHR5cGUgPSAiR0VUIjsKCgkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkCgkJaWYgKCBwYXJhbXMgKSB7CgkJCS8vIElmIGl0J3MgYSBmdW5jdGlvbgoJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHsKCQkJCS8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCgkJCQljYWxsYmFjayA9IHBhcmFtczsKCQkJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkJCS8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmcKCQkJfSBlbHNlIGlmICggdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJCQlwYXJhbXMgPSBqUXVlcnkucGFyYW0oIHBhcmFtcywgalF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCApOwoJCQkJdHlwZSA9ICJQT1NUIjsKCQkJfQoJCX0KCgkJdmFyIHNlbGYgPSB0aGlzOwoKCQkvLyBSZXF1ZXN0IHRoZSByZW1vdGUgZG9jdW1lbnQKCQlqUXVlcnkuYWpheCh7CgkJCXVybDogdXJsLAoJCQl0eXBlOiB0eXBlLAoJCQlkYXRhVHlwZTogImh0bWwiLAoJCQlkYXRhOiBwYXJhbXMsCgkJCS8vIENvbXBsZXRlIGNhbGxiYWNrIChyZXNwb25zZVRleHQgaXMgdXNlZCBpbnRlcm5hbGx5KQoJCQljb21wbGV0ZTogZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMsIHJlc3BvbnNlVGV4dCApIHsKCQkJCS8vIFN0b3JlIHRoZSByZXNwb25zZSBhcyBzcGVjaWZpZWQgYnkgdGhlIGpxWEhSIG9iamVjdAoJCQkJcmVzcG9uc2VUZXh0ID0ganFYSFIucmVzcG9uc2VUZXh0OwoJCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaW5qZWN0IHRoZSBIVE1MIGludG8gYWxsIHRoZSBtYXRjaGVkIGVsZW1lbnRzCgkJCQlpZiAoIGpxWEhSLmlzUmVzb2x2ZWQoKSApIHsKCQkJCQkvLyAjNDgyNTogR2V0IHRoZSBhY3R1YWwgcmVzcG9uc2UgaW4gY2FzZQoJCQkJCS8vIGEgZGF0YUZpbHRlciBpcyBwcmVzZW50IGluIGFqYXhTZXR0aW5ncwoJCQkJCWpxWEhSLmRvbmUoZnVuY3Rpb24oIHIgKSB7CgkJCQkJCXJlc3BvbnNlVGV4dCA9IHI7CgkJCQkJfSk7CgkJCQkJLy8gU2VlIGlmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZAoJCQkJCXNlbGYuaHRtbCggc2VsZWN0b3IgPwoJCQkJCQkvLyBDcmVhdGUgYSBkdW1teSBkaXYgdG8gaG9sZCB0aGUgcmVzdWx0cwoJCQkJCQlqUXVlcnkoIjxkaXY+IikKCQkJCQkJCS8vIGluamVjdCB0aGUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50IGluLCByZW1vdmluZyB0aGUgc2NyaXB0cwoJCQkJCQkJLy8gdG8gYXZvaWQgYW55ICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzIGluIElFCgkJCQkJCQkuYXBwZW5kKHJlc3BvbnNlVGV4dC5yZXBsYWNlKHJzY3JpcHQsICIiKSkKCgkJCQkJCQkvLyBMb2NhdGUgdGhlIHNwZWNpZmllZCBlbGVtZW50cwoJCQkJCQkJLmZpbmQoc2VsZWN0b3IpIDoKCgkJCQkJCS8vIElmIG5vdCwganVzdCBpbmplY3QgdGhlIGZ1bGwgcmVzdWx0CgkJCQkJCXJlc3BvbnNlVGV4dCApOwoJCQkJfQoKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJc2VsZi5lYWNoKCBjYWxsYmFjaywgWyByZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApOwoJCQkJfQoJCQl9CgkJfSk7CgoJCXJldHVybiB0aGlzOwoJfSwKCglzZXJpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApOwoJfSwKCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CgkJCXJldHVybiB0aGlzLmVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggdGhpcy5lbGVtZW50cyApIDogdGhpczsKCQl9KQoJCS5maWx0ZXIoZnVuY3Rpb24oKXsKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5kaXNhYmxlZCAmJgoJCQkJKCB0aGlzLmNoZWNrZWQgfHwgcnNlbGVjdFRleHRhcmVhLnRlc3QoIHRoaXMubm9kZU5hbWUgKSB8fAoJCQkJCXJpbnB1dC50ZXN0KCB0aGlzLnR5cGUgKSApOwoJCX0pCgkJLm1hcChmdW5jdGlvbiggaSwgZWxlbSApewoJCQl2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7CgoJCQlyZXR1cm4gdmFsID09IG51bGwgPwoJCQkJbnVsbCA6CgkJCQlqUXVlcnkuaXNBcnJheSggdmFsICkgPwoJCQkJCWpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCwgaSApewoJCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQkJfSkgOgoJCQkJCXsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCAiXHJcbiIgKSB9OwoJCX0pLmdldCgpOwoJfQp9KTsKCi8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzCmpRdWVyeS5lYWNoKCAiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCAiICIgKSwgZnVuY3Rpb24oIGksIG8gKXsKCWpRdWVyeS5mblsgbyBdID0gZnVuY3Rpb24oIGYgKXsKCQlyZXR1cm4gdGhpcy5iaW5kKCBvLCBmICk7Cgl9Owp9KTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZAoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCXJldHVybiBqUXVlcnkuYWpheCh7CgkJCXR5cGU6IG1ldGhvZCwKCQkJdXJsOiB1cmwsCgkJCWRhdGE6IGRhdGEsCgkJCXN1Y2Nlc3M6IGNhbGxiYWNrLAoJCQlkYXRhVHlwZTogdHlwZQoJCX0pOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9LAoKCWdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIgKTsKCX0sCgoJLy8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXQKCS8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy4KCS8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuCglhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkgewoJCWlmICggc2V0dGluZ3MgKSB7CgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApOwoJCX0gZWxzZSB7CgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJc2V0dGluZ3MgPSB0YXJnZXQ7CgkJCXRhcmdldCA9IGpRdWVyeS5hamF4U2V0dGluZ3M7CgkJfQoJCWFqYXhFeHRlbmQoIHRhcmdldCwgc2V0dGluZ3MgKTsKCQlyZXR1cm4gdGFyZ2V0OwoJfSwKCglhamF4U2V0dGluZ3M6IHsKCQl1cmw6IGFqYXhMb2NhdGlvbiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSApLAoJCWdsb2JhbDogdHJ1ZSwKCQl0eXBlOiAiR0VUIiwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCgkJcHJvY2Vzc0RhdGE6IHRydWUsCgkJYXN5bmM6IHRydWUsCgkJLyoKCQl0aW1lb3V0OiAwLAoJCWRhdGE6IG51bGwsCgkJZGF0YVR5cGU6IG51bGwsCgkJdXNlcm5hbWU6IG51bGwsCgkJcGFzc3dvcmQ6IG51bGwsCgkJY2FjaGU6IG51bGwsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWh0bWw6ICJ0ZXh0L2h0bWwiLAoJCQl0ZXh0OiAidGV4dC9wbGFpbiIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLAoJCQkiKiI6IGFsbFR5cGVzCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAveG1sLywKCQkJaHRtbDogL2h0bWwvLAoJCQlqc29uOiAvanNvbi8KCQl9LAoKCQlyZXNwb25zZUZpZWxkczogewoJCQl4bWw6ICJyZXNwb25zZVhNTCIsCgkJCXRleHQ6ICJyZXNwb25zZVRleHQiCgkJfSwKCgkJLy8gTGlzdCBvZiBkYXRhIGNvbnZlcnRlcnMKCQkvLyAxKSBrZXkgZm9ybWF0IGlzICJzb3VyY2VfdHlwZSBkZXN0aW5hdGlvbl90eXBlIiAoYSBzaW5nbGUgc3BhY2UgaW4tYmV0d2VlbikKCQkvLyAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZCBmb3Igc291cmNlX3R5cGUKCQljb252ZXJ0ZXJzOiB7CgoJCQkvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHQKCQkJIiogdGV4dCI6IHdpbmRvdy5TdHJpbmcsCgoJCQkvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbikKCQkJInRleHQgaHRtbCI6IHRydWUsCgoJCQkvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uCgkJCSJ0ZXh0IGpzb24iOiBqUXVlcnkucGFyc2VKU09OLAoKCQkJLy8gUGFyc2UgdGV4dCBhcyB4bWwKCQkJInRleHQgeG1sIjogalF1ZXJ5LnBhcnNlWE1MCgkJfSwKCgkJLy8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDoKCQkvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmCgkJLy8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmUKCQkvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZCkKCQlmbGF0T3B0aW9uczogewoJCQljb250ZXh0OiB0cnVlLAoJCQl1cmw6IHRydWUKCQl9Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3QKCQkJcyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoJCQkvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzCgkJCS8vIEl0J3MgdGhlIGNhbGxiYWNrQ29udGV4dCBpZiBvbmUgd2FzIHByb3ZpZGVkIGluIHRoZSBvcHRpb25zCgkJCS8vIGFuZCBpZiBpdCdzIGEgRE9NIG5vZGUgb3IgYSBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBjYWxsYmFja0NvbnRleHQgIT09IHMgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSApID8KCQkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6IGpRdWVyeS5ldmVudCwKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuX0RlZmVycmVkKCksCgkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCXN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sCgkJCS8vIGlmTW9kaWZpZWQga2V5CgkJCWlmTW9kaWZpZWRLZXksCgkJCS8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpCgkJCXJlcXVlc3RIZWFkZXJzID0ge30sCgkJCXJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSwKCQkJLy8gUmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcsCgkJCXJlc3BvbnNlSGVhZGVycywKCQkJLy8gdHJhbnNwb3J0CgkJCXRyYW5zcG9ydCwKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoJCQkvLyBDcm9zcy1kb21haW4gZGV0ZWN0aW9uIHZhcnMKCQkJcGFydHMsCgkJCS8vIFRoZSBqcVhIUiBzdGF0ZQoJCQlzdGF0ZSA9IDAsCgkJCS8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZAoJCQlmaXJlR2xvYmFscywKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoJCQkvLyBGYWtlIHhocgoJCQlqcVhIUiA9IHsKCgkJCQlyZWFkeVN0YXRlOiAwLAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCAhc3RhdGUgKSB7CgkJCQkJCXZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDsKCQkJCX0sCgoJCQkJLy8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZAoJCQkJZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7CgkJCQkJdmFyIG1hdGNoOwoJCQkJCWlmICggc3RhdGUgPT09IDIgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUoICggbWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSApICkgewoJCQkJCQkJCXJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09PSB1bmRlZmluZWQgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoICFzdGF0ZSApIHsKCQkJCQkJcy5taW1lVHlwZSA9IHR5cGU7CgkJCQkJfQoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCgkJCQkvLyBDYW5jZWwgdGhlIHJlcXVlc3QKCQkJCWFib3J0OiBmdW5jdGlvbiggc3RhdHVzVGV4dCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gc3RhdHVzVGV4dCB8fCAiYWJvcnQiOwoJCQkJCWlmICggdHJhbnNwb3J0ICkgewoJCQkJCQl0cmFuc3BvcnQuYWJvcnQoIHN0YXR1c1RleHQgKTsKCQkJCQl9CgkJCQkJZG9uZSggMCwgc3RhdHVzVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmUKCQkvLyBJdCBpcyBkZWZpbmVkIGhlcmUgYmVjYXVzZSBqc2xpbnQgY29tcGxhaW5zIGlmIGl0IGlzIGRlY2xhcmVkCgkJLy8gYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gKHdoaWNoIHdvdWxkIGJlIG1vcmUgbG9naWNhbCBhbmQgcmVhZGFibGUpCgkJZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7CgoJCQkvLyBDYWxsZWQgb25jZQoJCQlpZiAoIHN0YXRlID09PSAyICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTdGF0ZSBpcyAiZG9uZSIgbm93CgkJCXN0YXRlID0gMjsKCgkJCS8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzCgkJCWlmICggdGltZW91dFRpbWVyICkgewoJCQkJY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCXZhciBpc1N1Y2Nlc3MsCgkJCQlzdWNjZXNzLAoJCQkJZXJyb3IsCgkJCQlzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dCwKCQkJCXJlc3BvbnNlID0gcmVzcG9uc2VzID8gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIDogdW5kZWZpbmVkLAoJCQkJbGFzdE1vZGlmaWVkLAoJCQkJZXRhZzsKCgkJCS8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nCgkJCWlmICggc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoKCQkJCQlpZiAoICggbGFzdE1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApICkgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSA9IGxhc3RNb2RpZmllZDsKCQkJCQl9CgkJCQkJaWYgKCAoIGV0YWcgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggIkV0YWciICkgKSApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSA9IGV0YWc7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIElmIG5vdCBtb2RpZmllZAoJCQkJaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCgkJCQkJc3RhdHVzVGV4dCA9ICJub3Rtb2RpZmllZCI7CgkJCQkJaXNTdWNjZXNzID0gdHJ1ZTsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEKCQkJCX0gZWxzZSB7CgoJCQkJCXRyeSB7CgkJCQkJCXN1Y2Nlc3MgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UgKTsKCQkJCQkJc3RhdHVzVGV4dCA9ICJzdWNjZXNzIjsKCQkJCQkJaXNTdWNjZXNzID0gdHJ1ZTsKCQkJCQl9IGNhdGNoKGUpIHsKCQkJCQkJLy8gV2UgaGF2ZSBhIHBhcnNlcmVycm9yCgkJCQkJCXN0YXR1c1RleHQgPSAicGFyc2VyZXJyb3IiOwoJCQkJCQllcnJvciA9IGU7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gV2UgZXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQKCQkJCS8vIHRoZW4gbm9ybWFsaXplIHN0YXR1c1RleHQgYW5kIHN0YXR1cyBmb3Igbm9uLWFib3J0cwoJCQkJZXJyb3IgPSBzdGF0dXNUZXh0OwoJCQkJaWYoICFzdGF0dXNUZXh0IHx8IHN0YXR1cyApIHsKCQkJCQlzdGF0dXNUZXh0ID0gImVycm9yIjsKCQkJCQlpZiAoIHN0YXR1cyA8IDAgKSB7CgkJCQkJCXN0YXR1cyA9IDA7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdAoJCQlqcVhIUi5zdGF0dXMgPSBzdGF0dXM7CgkJCWpxWEhSLnN0YXR1c1RleHQgPSAiIiArICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICk7CgoJCQkvLyBTdWNjZXNzL0Vycm9yCgkJCWlmICggaXNTdWNjZXNzICkgewoJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7CgkJCX0gZWxzZSB7CgkJCQlkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTsKCQkJfQoKCQkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKCQkJanFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApOwoJCQlzdGF0dXNDb2RlID0gdW5kZWZpbmVkOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheCIgKyAoIGlzU3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJFcnJvciIgKSwKCQkJCQkJWyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTsKCQkJfQoKCQkJLy8gQ29tcGxldGUKCQkJY29tcGxldGVEZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTsKCgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhDb21wbGV0ZSIsIFsganFYSFIsIHMgXSApOwoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEF0dGFjaCBkZWZlcnJlZHMKCQlkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApOwoJCWpxWEhSLnN1Y2Nlc3MgPSBqcVhIUi5kb25lOwoJCWpxWEhSLmVycm9yID0ganFYSFIuZmFpbDsKCQlqcVhIUi5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuZG9uZTsKCgkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKCQlqcVhIUi5zdGF0dXNDb2RlID0gZnVuY3Rpb24oIG1hcCApIHsKCQkJaWYgKCBtYXAgKSB7CgkJCQl2YXIgdG1wOwoJCQkJaWYgKCBzdGF0ZSA8IDIgKSB7CgkJCQkJZm9yKCB0bXAgaW4gbWFwICkgewoJCQkJCQlzdGF0dXNDb2RlWyB0bXAgXSA9IFsgc3RhdHVzQ29kZVt0bXBdLCBtYXBbdG1wXSBdOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJdG1wID0gbWFwWyBqcVhIUi5zdGF0dXMgXTsKCQkJCQlqcVhIUi50aGVuKCB0bXAsIHRtcCApOwoJCQkJfQoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX07CgoJCS8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKQoJCS8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKCM1ODY2OiBJRTcgaXNzdWUgd2l0aCBwcm90b2NvbC1sZXNzIHVybHMpCgkJLy8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlCgkJcy51cmwgPSAoICggdXJsIHx8IHMudXJsICkgKyAiIiApLnJlcGxhY2UoIHJoYXNoLCAiIiApLnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyAiLy8iICk7CgoJCS8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3QKCQlzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkuc3BsaXQoIHJzcGFjZXNBamF4ICk7CgoJCS8vIERldGVybWluZSBpZiBhIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyCgkJaWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7CgkJCXBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7CgkJCXMuY3Jvc3NEb21haW4gPSAhISggcGFydHMgJiYKCQkJCSggcGFydHNbIDEgXSAhPSBhamF4TG9jUGFydHNbIDEgXSB8fCBwYXJ0c1sgMiBdICE9IGFqYXhMb2NQYXJ0c1sgMiBdIHx8CgkJCQkJKCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gImh0dHA6IiA/IDgwIDogNDQzICkgKSAhPQoJCQkJCQkoIGFqYXhMb2NQYXJ0c1sgMyBdIHx8ICggYWpheExvY1BhcnRzWyAxIF0gPT09ICJodHRwOiIgPyA4MCA6IDQ0MyApICkgKQoJCQkpOwoJCX0KCgkJLy8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nCgkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApIHsKCQkJcy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTsKCQl9CgoJCS8vIEFwcGx5IHByZWZpbHRlcnMKCQlpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWxlciwgc3RvcCB0aGVyZQoJCWlmICggc3RhdGUgPT09IDIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvCgkJZmlyZUdsb2JhbHMgPSBzLmdsb2JhbDsKCgkJLy8gVXBwZXJjYXNlIHRoZSB0eXBlCgkJcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7CgoJCS8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50CgkJcy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdpdGggbm8gY29udGVudAoJCWlmICggIXMuaGFzQ29udGVudCApIHsKCgkJCS8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmwKCQkJaWYgKCBzLmRhdGEgKSB7CgkJCQlzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyBzLmRhdGE7CgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBHZXQgaWZNb2RpZmllZEtleSBiZWZvcmUgYWRkaW5nIHRoZSBhbnRpLWNhY2hlIHBhcmFtZXRlcgoJCQlpZk1vZGlmaWVkS2V5ID0gcy51cmw7CgoJCQkvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgoJCQkJdmFyIHRzID0galF1ZXJ5Lm5vdygpLAoJCQkJCS8vIHRyeSByZXBsYWNpbmcgXz0gaWYgaXQgaXMgdGhlcmUKCQkJCQlyZXQgPSBzLnVybC5yZXBsYWNlKCBydHMsICIkMV89IiArIHRzICk7CgoJCQkJLy8gaWYgbm90aGluZyB3YXMgcmVwbGFjZWQsIGFkZCB0aW1lc3RhbXAgdG8gdGhlIGVuZAoJCQkJcy51cmwgPSByZXQgKyAoIChyZXQgPT09IHMudXJsICkgPyAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyAiXz0iICsgdHMgOiAiIiApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmTW9kaWZpZWRLZXkgPSBpZk1vZGlmaWVkS2V5IHx8IHMudXJsOwoJCQlpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSApOwoJCQl9CgkJCWlmICggalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Ob25lLU1hdGNoIiwgalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCgkJanFYSFIuc2V0UmVxdWVzdEhlYWRlcigKCQkJIkFjY2VwdCIsCgkJCXMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID8KCQkJCXMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbMF0gXSArICggcy5kYXRhVHlwZXNbIDAgXSAhPT0gIioiID8gIiwgIiArIGFsbFR5cGVzICsgIjsgcT0wLjAxIiA6ICIiICkgOgoJCQkJcy5hY2NlcHRzWyAiKiIgXQoJCSk7CgoJCS8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvbgoJCWZvciAoIGkgaW4gcy5oZWFkZXJzICkgewoJCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApOwoJCX0KCgkJLy8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydAoJCWlmICggcy5iZWZvcmVTZW5kICYmICggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHsKCQkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkKCQkJCWpxWEhSLmFib3J0KCk7CgkJCQlyZXR1cm4gZmFsc2U7CgoJCX0KCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJZm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkgewoJCQlqcVhIUlsgaSBdKCBzWyBpIF0gKTsKCQl9CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCQkJLy8gU2VuZCBnbG9iYWwgZXZlbnQKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheFNlbmQiLCBbIGpxWEhSLCBzIF0gKTsKCQkJfQoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gc2V0VGltZW91dCggZnVuY3Rpb24oKXsKCQkJCQlqcVhIUi5hYm9ydCggInRpbWVvdXQiICk7CgkJCQl9LCBzLnRpbWVvdXQgKTsKCQkJfQoKCQkJdHJ5IHsKCQkJCXN0YXRlID0gMTsKCQkJCXRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApOwoJCQl9IGNhdGNoIChlKSB7CgkJCQkvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lCgkJCQlpZiAoIHN0YXRlIDwgMiApIHsKCQkJCQlkb25lKCAtMSwgZSApOwoJCQkJLy8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlCgkJCQl9IGVsc2UgewoJCQkJCWpRdWVyeS5lcnJvciggZSApOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4ganFYSFI7Cgl9LAoKCS8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCgkvLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmcKCXBhcmFtOiBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7CgkJdmFyIHMgPSBbXSwKCQkJYWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUKCQkJCXZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogdmFsdWU7CgkJCQlzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTsKCQkJfTsKCgkJLy8gU2V0IHRyYWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci4KCQlpZiAoIHRyYWRpdGlvbmFsID09PSB1bmRlZmluZWQgKSB7CgkJCXRyYWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbDsKCQl9CgoJCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCgkJaWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHsKCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCgkJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJCWFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7CgkJCX0pOwoKCQl9IGVsc2UgewoJCQkvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSAib2xkIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXIKCQkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJCWZvciAoIHZhciBwcmVmaXggaW4gYSApIHsKCQkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJCX0KCQl9CgoJCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCQlyZXR1cm4gcy5qb2luKCAiJiIgKS5yZXBsYWNlKCByMjAsICIrIiApOwoJfQp9KTsKCmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHsKCWlmICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkgewoJCS8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLgoJCWpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkgewoJCQlpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkgewoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgkJCQkvLyBJZiBhcnJheSBpdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMKCQkJCS8vIG51bWVyaWMgaW5kZXggdG8gcmVzb2x2ZSBkZXNlcmlhbGl6YXRpb24gYW1iaWd1aXR5IGlzc3Vlcy4KCQkJCS8vIE5vdGUgdGhhdCByYWNrIChhcyBvZiAxLjAuMCkgY2FuJ3QgY3VycmVudGx5IGRlc2VyaWFsaXplCgkJCQkvLyBuZXN0ZWQgYXJyYXlzIHByb3Blcmx5LCBhbmQgYXR0ZW1wdGluZyB0byBkbyBzbyBtYXkgY2F1c2UKCQkJCS8vIGEgc2VydmVyIGVycm9yLiBQb3NzaWJsZSBmaXhlcyBhcmUgdG8gbW9kaWZ5IHJhY2sncwoJCQkJLy8gZGVzZXJpYWxpemF0aW9uIGFsZ29yaXRobSBvciB0byBwcm92aWRlIGFuIG9wdGlvbiBvciBmbGFnCgkJCQkvLyB0byBmb3JjZSBhcnJheSBzZXJpYWxpemF0aW9uIHRvIGJlIHNoYWxsb3cuCgkJCQlidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgKCB0eXBlb2YgdiA9PT0gIm9iamVjdCIgfHwgalF1ZXJ5LmlzQXJyYXkodikgPyBpIDogIiIgKSArICJdIiwgdiwgdHJhZGl0aW9uYWwsIGFkZCApOwoJCQl9CgkJfSk7CgoJfSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmogPT09ICJvYmplY3QiICkgewoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCB2YXIgbmFtZSBpbiBvYmogKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXggKyAiWyIgKyBuYW1lICsgIl0iLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApOwoJCX0KCgl9IGVsc2UgewoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFRoaXMgaXMgc3RpbGwgb24gdGhlIGpRdWVyeSBvYmplY3QuLi4gZm9yIG5vdwovLyBXYW50IHRvIG1vdmUgdGhpcyB0byBqUXVlcnkuYWpheCBzb21lIGRheQpqUXVlcnkuZXh0ZW5kKHsKCgkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKCWFjdGl2ZTogMCwKCgkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CglsYXN0TW9kaWZpZWQ6IHt9LAoJZXRhZzoge30KCn0pOwoKLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OgogKiAtIHNldHMgYWxsIHJlc3BvbnNlWFhYIGZpZWxkcyBhY2NvcmRpbmdseQogKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKQogKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKICovCmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7CgoJdmFyIGNvbnRlbnRzID0gcy5jb250ZW50cywKCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKCQlyZXNwb25zZUZpZWxkcyA9IHMucmVzcG9uc2VGaWVsZHMsCgkJY3QsCgkJdHlwZSwKCQlmaW5hbERhdGFUeXBlLAoJCWZpcnN0RGF0YVR5cGU7CgoJLy8gRmlsbCByZXNwb25zZVhYWCBmaWVsZHMKCWZvciggdHlwZSBpbiByZXNwb25zZUZpZWxkcyApIHsKCQlpZiAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlqcVhIUlsgcmVzcG9uc2VGaWVsZHNbdHlwZV0gXSA9IHJlc3BvbnNlc1sgdHlwZSBdOwoJCX0KCX0KCgkvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2VzcwoJd2hpbGUoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJjb250ZW50LXR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCQkvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzCgkJZm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7CgkJCWlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArICIgIiArIGRhdGFUeXBlc1swXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgkJLy8gT3IganVzdCB1c2UgZmlyc3Qgb25lCgkJZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTsKCX0KCgkvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlCgkvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZAoJLy8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQoJaWYgKCBmaW5hbERhdGFUeXBlICkgewoJCWlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7CgkJCWRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7CgkJfQoJCXJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTsKCX0KfQoKLy8gQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZQpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UgKSB7CgoJLy8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWQKCWlmICggcy5kYXRhRmlsdGVyICkgewoJCXJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApOwoJfQoKCXZhciBkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKCQljb252ZXJ0ZXJzID0ge30sCgkJaSwKCQlrZXksCgkJbGVuZ3RoID0gZGF0YVR5cGVzLmxlbmd0aCwKCQl0bXAsCgkJLy8gQ3VycmVudCBhbmQgcHJldmlvdXMgZGF0YVR5cGVzCgkJY3VycmVudCA9IGRhdGFUeXBlc1sgMCBdLAoJCXByZXYsCgkJLy8gQ29udmVyc2lvbiBleHByZXNzaW9uCgkJY29udmVyc2lvbiwKCQkvLyBDb252ZXJzaW9uIGZ1bmN0aW9uCgkJY29udiwKCQkvLyBDb252ZXJzaW9uIGZ1bmN0aW9ucyAodHJhbnNpdGl2ZSBjb252ZXJzaW9uKQoJCWNvbnYxLAoJCWNvbnYyOwoKCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBjaGFpbgoJZm9yKCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrICkgewoKCQkvLyBDcmVhdGUgY29udmVydGVycyBtYXAKCQkvLyB3aXRoIGxvd2VyY2FzZWQga2V5cwoJCWlmICggaSA9PT0gMSApIHsKCQkJZm9yKCBrZXkgaW4gcy5jb252ZXJ0ZXJzICkgewoJCQkJaWYoIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgewoJCQkJCWNvbnZlcnRlcnNbIGtleS50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGtleSBdOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBHZXQgdGhlIGRhdGFUeXBlcwoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXNbIGkgXTsKCgkJLy8gSWYgY3VycmVudCBpcyBhdXRvIGRhdGFUeXBlLCB1cGRhdGUgaXQgdG8gcHJldgoJCWlmKCBjdXJyZW50ID09PSAiKiIgKSB7CgkJCWN1cnJlbnQgPSBwcmV2OwoJCS8vIElmIG5vIGF1dG8gYW5kIGRhdGFUeXBlcyBhcmUgYWN0dWFsbHkgZGlmZmVyZW50CgkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkvLyBHZXQgdGhlIGNvbnZlcnRlcgoJCQljb252ZXJzaW9uID0gcHJldiArICIgIiArIGN1cnJlbnQ7CgkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBjb252ZXJzaW9uIF0gfHwgY29udmVydGVyc1sgIiogIiArIGN1cnJlbnQgXTsKCgkJCS8vIElmIHRoZXJlIGlzIG5vIGRpcmVjdCBjb252ZXJ0ZXIsIHNlYXJjaCB0cmFuc2l0aXZlbHkKCQkJaWYgKCAhY29udiApIHsKCQkJCWNvbnYyID0gdW5kZWZpbmVkOwoJCQkJZm9yKCBjb252MSBpbiBjb252ZXJ0ZXJzICkgewoJCQkJCXRtcCA9IGNvbnYxLnNwbGl0KCAiICIgKTsKCQkJCQlpZiAoIHRtcFsgMCBdID09PSBwcmV2IHx8IHRtcFsgMCBdID09PSAiKiIgKSB7CgkJCQkJCWNvbnYyID0gY29udmVydGVyc1sgdG1wWzFdICsgIiAiICsgY3VycmVudCBdOwoJCQkJCQlpZiAoIGNvbnYyICkgewoJCQkJCQkJY29udjEgPSBjb252ZXJ0ZXJzWyBjb252MSBdOwoJCQkJCQkJaWYgKCBjb252MSA9PT0gdHJ1ZSApIHsKCQkJCQkJCQljb252ID0gY29udjI7CgkJCQkJCQl9IGVsc2UgaWYgKCBjb252MiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQljb252ID0gY29udjE7CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQkvLyBJZiB3ZSBmb3VuZCBubyBjb252ZXJ0ZXIsIGRpc3BhdGNoIGFuIGVycm9yCgkJCWlmICggISggY29udiB8fCBjb252MiApICkgewoJCQkJalF1ZXJ5LmVycm9yKCAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBjb252ZXJzaW9uLnJlcGxhY2UoIiAiLCIgdG8gIikgKTsKCQkJfQoJCQkvLyBJZiBmb3VuZCBjb252ZXJ0ZXIgaXMgbm90IGFuIGVxdWl2YWxlbmNlCgkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCQkJCS8vIENvbnZlcnQgd2l0aCAxIG9yIDIgY29udmVydGVycyBhY2NvcmRpbmdseQoJCQkJcmVzcG9uc2UgPSBjb252ID8gY29udiggcmVzcG9uc2UgKSA6IGNvbnYyKCBjb252MShyZXNwb25zZSkgKTsKCQkJfQoJCX0KCX0KCXJldHVybiByZXNwb25zZTsKfQoKCgoKdmFyIGpzYyA9IGpRdWVyeS5ub3coKSwKCWpzcmUgPSAvKFw9KVw/KCZ8JCl8XD9cPy9pOwoKLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5ncwpqUXVlcnkuYWpheFNldHVwKHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGpRdWVyeS5leHBhbmRvICsgIl8iICsgKCBqc2MrKyApOwoJfQp9KTsKCi8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0cwpqUXVlcnkuYWpheFByZWZpbHRlciggImpzb24ganNvbnAiLCBmdW5jdGlvbiggcywgb3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7CgoJdmFyIGluc3BlY3REYXRhID0gcy5jb250ZW50VHlwZSA9PT0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgJiYKCQkoIHR5cGVvZiBzLmRhdGEgPT09ICJzdHJpbmciICk7CgoJaWYgKCBzLmRhdGFUeXBlc1sgMCBdID09PSAianNvbnAiIHx8CgkJcy5qc29ucCAhPT0gZmFsc2UgJiYgKCBqc3JlLnRlc3QoIHMudXJsICkgfHwKCQkJCWluc3BlY3REYXRhICYmIGpzcmUudGVzdCggcy5kYXRhICkgKSApIHsKCgkJdmFyIHJlc3BvbnNlQ29udGFpbmVyLAoJCQlqc29ucENhbGxiYWNrID0gcy5qc29ucENhbGxiYWNrID0KCQkJCWpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/IHMuanNvbnBDYWxsYmFjaygpIDogcy5qc29ucENhbGxiYWNrLAoJCQlwcmV2aW91cyA9IHdpbmRvd1sganNvbnBDYWxsYmFjayBdLAoJCQl1cmwgPSBzLnVybCwKCQkJZGF0YSA9IHMuZGF0YSwKCQkJcmVwbGFjZSA9ICIkMSIgKyBqc29ucENhbGxiYWNrICsgIiQyIjsKCgkJaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJdXJsID0gdXJsLnJlcGxhY2UoIGpzcmUsIHJlcGxhY2UgKTsKCQkJaWYgKCBzLnVybCA9PT0gdXJsICkgewoJCQkJaWYgKCBpbnNwZWN0RGF0YSApIHsKCQkJCQlkYXRhID0gZGF0YS5yZXBsYWNlKCBqc3JlLCByZXBsYWNlICk7CgkJCQl9CgkJCQlpZiAoIHMuZGF0YSA9PT0gZGF0YSApIHsKCQkJCQkvLyBBZGQgY2FsbGJhY2sgbWFudWFsbHkKCQkJCQl1cmwgKz0gKC9cPy8udGVzdCggdXJsICkgPyAiJiIgOiAiPyIpICsgcy5qc29ucCArICI9IiArIGpzb25wQ2FsbGJhY2s7CgkJCQl9CgkJCX0KCQl9CgoJCXMudXJsID0gdXJsOwoJCXMuZGF0YSA9IGRhdGE7CgoJCS8vIEluc3RhbGwgY2FsbGJhY2sKCQl3aW5kb3dbIGpzb25wQ2FsbGJhY2sgXSA9IGZ1bmN0aW9uKCByZXNwb25zZSApIHsKCQkJcmVzcG9uc2VDb250YWluZXIgPSBbIHJlc3BvbnNlIF07CgkJfTsKCgkJLy8gQ2xlYW4tdXAgZnVuY3Rpb24KCQlqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7CgkJCS8vIFNldCBjYWxsYmFjayBiYWNrIHRvIHByZXZpb3VzIHZhbHVlCgkJCXdpbmRvd1sganNvbnBDYWxsYmFjayBdID0gcHJldmlvdXM7CgkJCS8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZQoJCQlpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBwcmV2aW91cyApICkgewoJCQkJd2luZG93WyBqc29ucENhbGxiYWNrIF0oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoJCX0pOwoKCQkvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uCgkJcy5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdID0gZnVuY3Rpb24oKSB7CgkJCWlmICggIXJlc3BvbnNlQ29udGFpbmVyICkgewoJCQkJalF1ZXJ5LmVycm9yKCBqc29ucENhbGxiYWNrICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBmb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gRGVsZWdhdGUgdG8gc2NyaXB0CgkJcmV0dXJuICJzY3JpcHQiOwoJfQp9KTsKCgoKCi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlCmpRdWVyeS5hamF4U2V0dXAoewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0IgoJfSwKCWNvbnRlbnRzOiB7CgkJc2NyaXB0OiAvamF2YXNjcmlwdHxlY21hc2NyaXB0LwoJfSwKCWNvbnZlcnRlcnM6IHsKCQkidGV4dCBzY3JpcHQiOiBmdW5jdGlvbiggdGV4dCApIHsKCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTsKCQkJcmV0dXJuIHRleHQ7CgkJfQoJfQp9KTsKCi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgZ2xvYmFsCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQlzLmNhY2hlID0gZmFsc2U7Cgl9CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy50eXBlID0gIkdFVCI7CgkJcy5nbG9iYWwgPSBmYWxzZTsKCX0KfSk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbihzKSB7CgoJLy8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0cwoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoKCQl2YXIgc2NyaXB0LAoJCQloZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwoKCQlyZXR1cm4gewoKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNhbGxiYWNrICkgewoKCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzY3JpcHQiICk7CgoJCQkJc2NyaXB0LmFzeW5jID0gImFzeW5jIjsKCgkJCQlpZiAoIHMuc2NyaXB0Q2hhcnNldCApIHsKCQkJCQlzY3JpcHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsKCQkJCX0KCgkJCQlzY3JpcHQuc3JjID0gcy51cmw7CgoJCQkJLy8gQXR0YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJvd3NlcnMKCQkJCXNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7CgoJCQkJCWlmICggaXNBYm9ydCB8fCAhc2NyaXB0LnJlYWR5U3RhdGUgfHwgL2xvYWRlZHxjb21wbGV0ZS8udGVzdCggc2NyaXB0LnJlYWR5U3RhdGUgKSApIHsKCgkJCQkJCS8vIEhhbmRsZSBtZW1vcnkgbGVhayBpbiBJRQoJCQkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CgoJCQkJCQkvLyBSZW1vdmUgdGhlIHNjcmlwdAoJCQkJCQlpZiAoIGhlYWQgJiYgc2NyaXB0LnBhcmVudE5vZGUgKSB7CgkJCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKCQkJCQkJfQoKCQkJCQkJLy8gRGVyZWZlcmVuY2UgdGhlIHNjcmlwdAoJCQkJCQlzY3JpcHQgPSB1bmRlZmluZWQ7CgoJCQkJCQkvLyBDYWxsYmFjayBpZiBub3QgYWJvcnQKCQkJCQkJaWYgKCAhaXNBYm9ydCApIHsKCQkJCQkJCWNhbGxiYWNrKCAyMDAsICJzdWNjZXNzIiApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfTsKCQkJCS8vIFVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiBhcHBlbmRDaGlsZCAgdG8gY2lyY3VtdmVudCBhbiBJRTYgYnVnLgoJCQkJLy8gVGhpcyBhcmlzZXMgd2hlbiBhIGJhc2Ugbm9kZSBpcyB1c2VkICgjMjcwOSBhbmQgIzQzNzgpLgoJCQkJaGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHNjcmlwdCApIHsKCQkJCQlzY3JpcHQub25sb2FkKCAwLCAxICk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9KTsKCgoKCnZhciAvLyAjNTI4MDogSW50ZXJuZXQgRXhwbG9yZXIgd2lsbCBrZWVwIGNvbm5lY3Rpb25zIGFsaXZlIGlmIHdlIGRvbid0IGFib3J0IG9uIHVubG9hZAoJeGhyT25VbmxvYWRBYm9ydCA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ID8gZnVuY3Rpb24oKSB7CgkJLy8gQWJvcnQgYWxsIHBlbmRpbmcgcmVxdWVzdHMKCQlmb3IgKCB2YXIga2V5IGluIHhockNhbGxiYWNrcyApIHsKCQkJeGhyQ2FsbGJhY2tzWyBrZXkgXSggMCwgMSApOwoJCX0KCX0gOiBmYWxzZSwKCXhocklkID0gMCwKCXhockNhbGxiYWNrczsKCi8vIEZ1bmN0aW9ucyB0byBjcmVhdGUgeGhycwpmdW5jdGlvbiBjcmVhdGVTdGFuZGFyZFhIUigpIHsKCXRyeSB7CgkJcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsKCX0gY2F0Y2goIGUgKSB7fQp9CgpmdW5jdGlvbiBjcmVhdGVBY3RpdmVYSFIoKSB7Cgl0cnkgewoJCXJldHVybiBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MSFRUUCIgKTsKCX0gY2F0Y2goIGUgKSB7fQp9CgovLyBDcmVhdGUgdGhlIHJlcXVlc3Qgb2JqZWN0Ci8vIChUaGlzIGlzIHN0aWxsIGF0dGFjaGVkIHRvIGFqYXhTZXR0aW5ncyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkKalF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSB3aW5kb3cuQWN0aXZlWE9iamVjdCA/CgkvKiBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5CgkgKiBpbXBsZW1lbnQgdGhlIFhNTEh0dHBSZXF1ZXN0IGluIElFNyAoY2FuJ3QgcmVxdWVzdCBsb2NhbCBmaWxlcyksCgkgKiBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKCSAqIEFkZGl0aW9uYWxseSBYTUxIdHRwUmVxdWVzdCBjYW4gYmUgZGlzYWJsZWQgaW4gSUU3L0lFOCBzbwoJICogd2UgbmVlZCBhIGZhbGxiYWNrLgoJICovCglmdW5jdGlvbigpIHsKCQlyZXR1cm4gIXRoaXMuaXNMb2NhbCAmJiBjcmVhdGVTdGFuZGFyZFhIUigpIHx8IGNyZWF0ZUFjdGl2ZVhIUigpOwoJfSA6CgkvLyBGb3IgYWxsIG90aGVyIGJyb3dzZXJzLCB1c2UgdGhlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IG9iamVjdAoJY3JlYXRlU3RhbmRhcmRYSFI7CgovLyBEZXRlcm1pbmUgc3VwcG9ydCBwcm9wZXJ0aWVzCihmdW5jdGlvbiggeGhyICkgewoJalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LnN1cHBvcnQsIHsKCQlhamF4OiAhIXhociwKCQljb3JzOiAhIXhociAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhociApCgl9KTsKfSkoIGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCkgKTsKCi8vIENyZWF0ZSB0cmFuc3BvcnQgaWYgdGhlIGJyb3dzZXIgY2FuIHByb3ZpZGUgYW4geGhyCmlmICggalF1ZXJ5LnN1cHBvcnQuYWpheCApIHsKCglqUXVlcnkuYWpheFRyYW5zcG9ydChmdW5jdGlvbiggcyApIHsKCQkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CgkJaWYgKCAhcy5jcm9zc0RvbWFpbiB8fCBqUXVlcnkuc3VwcG9ydC5jb3JzICkgewoKCQkJdmFyIGNhbGxiYWNrOwoKCQkJcmV0dXJuIHsKCQkJCXNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHsKCgkJCQkJLy8gR2V0IGEgbmV3IHhocgoJCQkJCXZhciB4aHIgPSBzLnhocigpLAoJCQkJCQloYW5kbGUsCgkJCQkJCWk7CgoJCQkJCS8vIE9wZW4gdGhlIHNvY2tldAoJCQkJCS8vIFBhc3NpbmcgbnVsbCB1c2VybmFtZSwgZ2VuZXJhdGVzIGEgbG9naW4gcG9wdXAgb24gT3BlcmEgKCMyODY1KQoJCQkJCWlmICggcy51c2VybmFtZSApIHsKCQkJCQkJeGhyLm9wZW4oIHMudHlwZSwgcy51cmwsIHMuYXN5bmMsIHMudXNlcm5hbWUsIHMucGFzc3dvcmQgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl4aHIub3Blbiggcy50eXBlLCBzLnVybCwgcy5hc3luYyApOwoJCQkJCX0KCgkJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJCWlmICggcy54aHJGaWVsZHMgKSB7CgkJCQkJCWZvciAoIGkgaW4gcy54aHJGaWVsZHMgKSB7CgkJCQkJCQl4aHJbIGkgXSA9IHMueGhyRmllbGRzWyBpIF07CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCQlpZiAoIHMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7CgkJCQkJCXhoci5vdmVycmlkZU1pbWVUeXBlKCBzLm1pbWVUeXBlICk7CgkJCQkJfQoKCQkJCQkvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlcgoJCQkJCS8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmUKCQkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJCS8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKQoJCQkJCS8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLgoJCQkJCWlmICggIXMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbIlgtUmVxdWVzdGVkLVdpdGgiXSApIHsKCQkJCQkJaGVhZGVyc1sgIlgtUmVxdWVzdGVkLVdpdGgiIF0gPSAiWE1MSHR0cFJlcXVlc3QiOwoJCQkJCX0KCgkJCQkJLy8gTmVlZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9yIGNyb3NzIGRvbWFpbiByZXF1ZXN0cyBpbiBGaXJlZm94IDMKCQkJCQl0cnkgewoJCQkJCQlmb3IgKCBpIGluIGhlYWRlcnMgKSB7CgkJCQkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7CgkJCQkJCX0KCQkJCQl9IGNhdGNoKCBfICkge30KCgkJCQkJLy8gRG8gc2VuZCB0aGUgcmVxdWVzdAoJCQkJCS8vIFRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGljaCBpcyBhY3R1YWxseQoJCQkJCS8vIGhhbmRsZWQgaW4galF1ZXJ5LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKQoJCQkJCXhoci5zZW5kKCAoIHMuaGFzQ29udGVudCAmJiBzLmRhdGEgKSB8fCBudWxsICk7CgoJCQkJCS8vIExpc3RlbmVyCgkJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggXywgaXNBYm9ydCApIHsKCgkJCQkJCXZhciBzdGF0dXMsCgkJCQkJCQlzdGF0dXNUZXh0LAoJCQkJCQkJcmVzcG9uc2VIZWFkZXJzLAoJCQkJCQkJcmVzcG9uc2VzLAoJCQkJCQkJeG1sOwoKCQkJCQkJLy8gRmlyZWZveCB0aHJvd3MgZXhjZXB0aW9ucyB3aGVuIGFjY2Vzc2luZyBwcm9wZXJ0aWVzCgkJCQkJCS8vIG9mIGFuIHhociB3aGVuIGEgbmV0d29yayBlcnJvciBvY2N1cmVkCgkJCQkJCS8vIGh0dHA6Ly9oZWxwZnVsLmtub2JzLWRpYWxzLmNvbS9pbmRleC5waHAvQ29tcG9uZW50X3JldHVybmVkX2ZhaWx1cmVfY29kZTpfMHg4MDA0MDExMV8oTlNfRVJST1JfTk9UX0FWQUlMQUJMRSkKCQkJCQkJdHJ5IHsKCgkJCQkJCQkvLyBXYXMgbmV2ZXIgY2FsbGVkIGFuZCBpcyBhYm9ydGVkIG9yIGNvbXBsZXRlCgkJCQkJCQlpZiAoIGNhbGxiYWNrICYmICggaXNBYm9ydCB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApICkgewoKCQkJCQkJCQkvLyBPbmx5IGNhbGxlZCBvbmNlCgkJCQkJCQkJY2FsbGJhY2sgPSB1bmRlZmluZWQ7CgoJCQkJCQkJCS8vIERvIG5vdCBrZWVwIGFzIGFjdGl2ZSBhbnltb3JlCgkJCQkJCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBqUXVlcnkubm9vcDsKCQkJCQkJCQkJaWYgKCB4aHJPblVubG9hZEFib3J0ICkgewoJCQkJCQkJCQkJZGVsZXRlIHhockNhbGxiYWNrc1sgaGFuZGxlIF07CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgoJCQkJCQkJCS8vIElmIGl0J3MgYW4gYWJvcnQKCQkJCQkJCQlpZiAoIGlzQWJvcnQgKSB7CgkJCQkJCQkJCS8vIEFib3J0IGl0IG1hbnVhbGx5IGlmIG5lZWRlZAoJCQkJCQkJCQlpZiAoIHhoci5yZWFkeVN0YXRlICE9PSA0ICkgewoJCQkJCQkJCQkJeGhyLmFib3J0KCk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQlzdGF0dXMgPSB4aHIuc3RhdHVzOwoJCQkJCQkJCQlyZXNwb25zZUhlYWRlcnMgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CgkJCQkJCQkJCXJlc3BvbnNlcyA9IHt9OwoJCQkJCQkJCQl4bWwgPSB4aHIucmVzcG9uc2VYTUw7CgoJCQkJCQkJCQkvLyBDb25zdHJ1Y3QgcmVzcG9uc2UgbGlzdAoJCQkJCQkJCQlpZiAoIHhtbCAmJiB4bWwuZG9jdW1lbnRFbGVtZW50IC8qICM0OTU4ICovICkgewoJCQkJCQkJCQkJcmVzcG9uc2VzLnhtbCA9IHhtbDsKCQkJCQkJCQkJfQoJCQkJCQkJCQlyZXNwb25zZXMudGV4dCA9IHhoci5yZXNwb25zZVRleHQ7CgoJCQkJCQkJCQkvLyBGaXJlZm94IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcKCQkJCQkJCQkJLy8gc3RhdHVzVGV4dCBmb3IgZmF1bHR5IGNyb3NzLWRvbWFpbiByZXF1ZXN0cwoJCQkJCQkJCQl0cnkgewoJCQkJCQkJCQkJc3RhdHVzVGV4dCA9IHhoci5zdGF0dXNUZXh0OwoJCQkJCQkJCQl9IGNhdGNoKCBlICkgewoJCQkJCQkJCQkJLy8gV2Ugbm9ybWFsaXplIHdpdGggV2Via2l0IGdpdmluZyBhbiBlbXB0eSBzdGF0dXNUZXh0CgkJCQkJCQkJCQlzdGF0dXNUZXh0ID0gIiI7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIEZpbHRlciBzdGF0dXMgZm9yIG5vbiBzdGFuZGFyZCBiZWhhdmlvcnMKCgkJCQkJCQkJCS8vIElmIHRoZSByZXF1ZXN0IGlzIGxvY2FsIGFuZCB3ZSBoYXZlIGRhdGE6IGFzc3VtZSBhIHN1Y2Nlc3MKCQkJCQkJCQkJLy8gKHN1Y2Nlc3Mgd2l0aCBubyBkYXRhIHdvbid0IGdldCBub3RpZmllZCwgdGhhdCdzIHRoZSBiZXN0IHdlCgkJCQkJCQkJCS8vIGNhbiBkbyBnaXZlbiBjdXJyZW50IGltcGxlbWVudGF0aW9ucykKCQkJCQkJCQkJaWYgKCAhc3RhdHVzICYmIHMuaXNMb2NhbCAmJiAhcy5jcm9zc0RvbWFpbiApIHsKCQkJCQkJCQkJCXN0YXR1cyA9IHJlc3BvbnNlcy50ZXh0ID8gMjAwIDogNDA0OwoJCQkJCQkJCQkvLyBJRSAtICMxNDUwOiBzb21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCQkJCQkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDEyMjMgKSB7CgkJCQkJCQkJCQlzdGF0dXMgPSAyMDQ7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0gY2F0Y2goIGZpcmVmb3hBY2Nlc3NFeGNlcHRpb24gKSB7CgkJCQkJCQlpZiAoICFpc0Fib3J0ICkgewoJCQkJCQkJCWNvbXBsZXRlKCAtMSwgZmlyZWZveEFjY2Vzc0V4Y2VwdGlvbiApOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBDYWxsIGNvbXBsZXRlIGlmIG5lZWRlZAoJCQkJCQlpZiAoIHJlc3BvbnNlcyApIHsKCQkJCQkJCWNvbXBsZXRlKCBzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNlcywgcmVzcG9uc2VIZWFkZXJzICk7CgkJCQkJCX0KCQkJCQl9OwoKCQkJCQkvLyBpZiB3ZSdyZSBpbiBzeW5jIG1vZGUgb3IgaXQncyBpbiBjYWNoZQoJCQkJCS8vIGFuZCBoYXMgYmVlbiByZXRyaWV2ZWQgZGlyZWN0bHkgKElFNiAmIElFNykKCQkJCQkvLyB3ZSBuZWVkIHRvIG1hbnVhbGx5IGZpcmUgdGhlIGNhbGxiYWNrCgkJCQkJaWYgKCAhcy5hc3luYyB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCQkJCQkJY2FsbGJhY2soKTsKCQkJCQl9IGVsc2UgewoJCQkJCQloYW5kbGUgPSArK3hocklkOwoJCQkJCQlpZiAoIHhock9uVW5sb2FkQWJvcnQgKSB7CgkJCQkJCQkvLyBDcmVhdGUgdGhlIGFjdGl2ZSB4aHJzIGNhbGxiYWNrcyBsaXN0IGlmIG5lZWRlZAoJCQkJCQkJLy8gYW5kIGF0dGFjaCB0aGUgdW5sb2FkIGhhbmRsZXIKCQkJCQkJCWlmICggIXhockNhbGxiYWNrcyApIHsKCQkJCQkJCQl4aHJDYWxsYmFja3MgPSB7fTsKCQkJCQkJCQlqUXVlcnkoIHdpbmRvdyApLnVubG9hZCggeGhyT25VbmxvYWRBYm9ydCApOwoJCQkJCQkJfQoJCQkJCQkJLy8gQWRkIHRvIGxpc3Qgb2YgYWN0aXZlIHhocnMgY2FsbGJhY2tzCgkJCQkJCQl4aHJDYWxsYmFja3NbIGhhbmRsZSBdID0gY2FsbGJhY2s7CgkJCQkJCX0KCQkJCQkJeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGNhbGxiYWNrOwoJCQkJCX0KCQkJCX0sCgoJCQkJYWJvcnQ6IGZ1bmN0aW9uKCkgewoJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCWNhbGxiYWNrKDAsMSk7CgkJCQkJfQoJCQkJfQoJCQl9OwoJCX0KCX0pOwp9CgoKCgp2YXIgZWxlbWRpc3BsYXkgPSB7fSwKCWlmcmFtZSwgaWZyYW1lRG9jLAoJcmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sCglyZnhudW0gPSAvXihbK1wtXT0pPyhbXGQrLlwtXSspKFthLXolXSopJC9pLAoJdGltZXJJZCwKCWZ4QXR0cnMgPSBbCgkJLy8gaGVpZ2h0IGFuaW1hdGlvbnMKCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCgkJLy8gd2lkdGggYW5pbWF0aW9ucwoJCVsgIndpZHRoIiwgIm1hcmdpbkxlZnQiLCAibWFyZ2luUmlnaHQiLCAicGFkZGluZ0xlZnQiLCAicGFkZGluZ1JpZ2h0IiBdLAoJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucwoJCVsgIm9wYWNpdHkiIF0KCV0sCglmeE5vdzsKCmpRdWVyeS5mbi5leHRlbmQoewoJc2hvdzogZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXZhciBlbGVtLCBkaXNwbGF5OwoKCQlpZiAoIHNwZWVkIHx8IHNwZWVkID09PSAwICkgewoJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgic2hvdyIsIDMpLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CgoJCX0gZWxzZSB7CgkJCWZvciAoIHZhciBpID0gMCwgaiA9IHRoaXMubGVuZ3RoOyBpIDwgajsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbaV07CgoJCQkJaWYgKCBlbGVtLnN0eWxlICkgewoJCQkJCWRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7CgoJCQkJCS8vIFJlc2V0IHRoZSBpbmxpbmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXMKCQkJCQkvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90CgkJCQkJaWYgKCAhalF1ZXJ5Ll9kYXRhKGVsZW0sICJvbGRkaXNwbGF5IikgJiYgZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQkJCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQkJfQoKCQkJCQkvLyBTZXQgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIG92ZXJyaWRkZW4gd2l0aCBkaXNwbGF5OiBub25lCgkJCQkJLy8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXMKCQkJCQkvLyBmb3Igc3VjaCBhbiBlbGVtZW50CgkJCQkJaWYgKCBkaXNwbGF5ID09PSAiIiAmJiBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSA9PT0gIm5vbmUiICkgewoJCQkJCQlqUXVlcnkuX2RhdGEoZWxlbSwgIm9sZGRpc3BsYXkiLCBkZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgbW9zdCBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAoJCQkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CgkJCWZvciAoIGkgPSAwOyBpIDwgajsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbaV07CgoJCQkJaWYgKCBlbGVtLnN0eWxlICkgewoJCQkJCWRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7CgoJCQkJCWlmICggZGlzcGxheSA9PT0gIiIgfHwgZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQkJCQllbGVtLnN0eWxlLmRpc3BsYXkgPSBqUXVlcnkuX2RhdGEoZWxlbSwgIm9sZGRpc3BsYXkiKSB8fCAiIjsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCXJldHVybiB0aGlzOwoJCX0KCX0sCgoJaGlkZTogZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCWlmICggc3BlZWQgfHwgc3BlZWQgPT09IDAgKSB7CgkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4KCJoaWRlIiwgMyksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrKTsKCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBqID0gdGhpcy5sZW5ndGg7IGkgPCBqOyBpKysgKSB7CgkJCQlpZiAoIHRoaXNbaV0uc3R5bGUgKSB7CgkJCQkJdmFyIGRpc3BsYXkgPSBqUXVlcnkuY3NzKCB0aGlzW2ldLCAiZGlzcGxheSIgKTsKCgkJCQkJaWYgKCBkaXNwbGF5ICE9PSAibm9uZSIgJiYgIWpRdWVyeS5fZGF0YSggdGhpc1tpXSwgIm9sZGRpc3BsYXkiICkgKSB7CgkJCQkJCWpRdWVyeS5fZGF0YSggdGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdwoJCQlmb3IgKCBpID0gMDsgaSA8IGo7IGkrKyApIHsKCQkJCWlmICggdGhpc1tpXS5zdHlsZSApIHsKCQkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CgkJCQl9CgkJCX0KCgkJCXJldHVybiB0aGlzOwoJCX0KCX0sCgoJLy8gU2F2ZSB0aGUgb2xkIHRvZ2dsZSBmdW5jdGlvbgoJX3RvZ2dsZTogalF1ZXJ5LmZuLnRvZ2dsZSwKCgl0b2dnbGU6IGZ1bmN0aW9uKCBmbiwgZm4yLCBjYWxsYmFjayApIHsKCQl2YXIgYm9vbCA9IHR5cGVvZiBmbiA9PT0gImJvb2xlYW4iOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKGZuKSAmJiBqUXVlcnkuaXNGdW5jdGlvbihmbjIpICkgewoJCQl0aGlzLl90b2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQl9IGVsc2UgaWYgKCBmbiA9PSBudWxsIHx8IGJvb2wgKSB7CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBzdGF0ZSA9IGJvb2wgPyBmbiA6IGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpOwoJCQkJalF1ZXJ5KHRoaXMpWyBzdGF0ZSA/ICJzaG93IiA6ICJoaWRlIiBdKCk7CgkJCX0pOwoKCQl9IGVsc2UgewoJCQl0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsIDMpLCBmbiwgZm4yLCBjYWxsYmFjayk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsIDApLnNob3coKS5lbmQoKQoJCQkJCS5hbmltYXRlKHtvcGFjaXR5OiB0b30sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrKTsKCX0sCgoJYW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXZhciBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoc3BlZWQsIGVhc2luZywgY2FsbGJhY2spOwoKCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIG9wdGFsbC5jb21wbGV0ZSwgWyBmYWxzZSBdICk7CgkJfQoKCQkvLyBEbyBub3QgY2hhbmdlIHJlZmVyZW5jZWQgcHJvcGVydGllcyBhcyBwZXItcHJvcGVydHkgZWFzaW5nIHdpbGwgYmUgbG9zdAoJCXByb3AgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApOwoKCQlyZXR1cm4gdGhpc1sgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/ICJlYWNoIiA6ICJxdWV1ZSIgXShmdW5jdGlvbigpIHsKCQkJLy8gWFhYICd0aGlzJyBkb2VzIG5vdCBhbHdheXMgaGF2ZSBhIG5vZGVOYW1lIHdoZW4gcnVubmluZyB0aGUKCQkJLy8gdGVzdCBzdWl0ZQoKCQkJaWYgKCBvcHRhbGwucXVldWUgPT09IGZhbHNlICkgewoJCQkJalF1ZXJ5Ll9tYXJrKCB0aGlzICk7CgkJCX0KCgkJCXZhciBvcHQgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0YWxsICksCgkJCQlpc0VsZW1lbnQgPSB0aGlzLm5vZGVUeXBlID09PSAxLAoJCQkJaGlkZGVuID0gaXNFbGVtZW50ICYmIGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpLAoJCQkJbmFtZSwgdmFsLCBwLAoJCQkJZGlzcGxheSwgZSwKCQkJCXBhcnRzLCBzdGFydCwgZW5kLCB1bml0OwoKCQkJLy8gd2lsbCBzdG9yZSBwZXIgcHJvcGVydHkgZWFzaW5nIGFuZCBiZSB1c2VkIHRvIGRldGVybWluZSB3aGVuIGFuIGFuaW1hdGlvbiBpcyBjb21wbGV0ZQoJCQlvcHQuYW5pbWF0ZWRQcm9wZXJ0aWVzID0ge307CgoJCQlmb3IgKCBwIGluIHByb3AgKSB7CgoJCQkJLy8gcHJvcGVydHkgbmFtZSBub3JtYWxpemF0aW9uCgkJCQluYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggcCApOwoJCQkJaWYgKCBwICE9PSBuYW1lICkgewoJCQkJCXByb3BbIG5hbWUgXSA9IHByb3BbIHAgXTsKCQkJCQlkZWxldGUgcHJvcFsgcCBdOwoJCQkJfQoKCQkJCXZhbCA9IHByb3BbIG5hbWUgXTsKCgkJCQkvLyBlYXNpbmcgcmVzb2x1dGlvbjogcGVyIHByb3BlcnR5ID4gb3B0LnNwZWNpYWxFYXNpbmcgPiBvcHQuZWFzaW5nID4gJ3N3aW5nJyAoZGVmYXVsdCkKCQkJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJCW9wdC5hbmltYXRlZFByb3BlcnRpZXNbIG5hbWUgXSA9IHZhbFsgMSBdOwoJCQkJCXZhbCA9IHByb3BbIG5hbWUgXSA9IHZhbFsgMCBdOwoJCQkJfSBlbHNlIHsKCQkJCQlvcHQuYW5pbWF0ZWRQcm9wZXJ0aWVzWyBuYW1lIF0gPSBvcHQuc3BlY2lhbEVhc2luZyAmJiBvcHQuc3BlY2lhbEVhc2luZ1sgbmFtZSBdIHx8IG9wdC5lYXNpbmcgfHwgJ3N3aW5nJzsKCQkJCX0KCgkJCQlpZiAoIHZhbCA9PT0gImhpZGUiICYmIGhpZGRlbiB8fCB2YWwgPT09ICJzaG93IiAmJiAhaGlkZGVuICkgewoJCQkJCXJldHVybiBvcHQuY29tcGxldGUuY2FsbCggdGhpcyApOwoJCQkJfQoKCQkJCWlmICggaXNFbGVtZW50ICYmICggbmFtZSA9PT0gImhlaWdodCIgfHwgbmFtZSA9PT0gIndpZHRoIiApICkgewoJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgc25lYWtzIG91dAoJCQkJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QKCQkJCQkvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmQKCQkJCQkvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQoJCQkJCW9wdC5vdmVyZmxvdyA9IFsgdGhpcy5zdHlsZS5vdmVyZmxvdywgdGhpcy5zdHlsZS5vdmVyZmxvd1gsIHRoaXMuc3R5bGUub3ZlcmZsb3dZIF07CgoJCQkJCS8vIFNldCBkaXNwbGF5IHByb3BlcnR5IHRvIGlubGluZS1ibG9jayBmb3IgaGVpZ2h0L3dpZHRoCgkJCQkJLy8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodAoJCQkJCS8vIGFuaW1hdGVkCgkJCQkJaWYgKCBqUXVlcnkuY3NzKCB0aGlzLCAiZGlzcGxheSIgKSA9PT0gImlubGluZSIgJiYKCQkJCQkJCWpRdWVyeS5jc3MoIHRoaXMsICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoJCQkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0ICkgewoJCQkJCQkJdGhpcy5zdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJZGlzcGxheSA9IGRlZmF1bHREaXNwbGF5KCB0aGlzLm5vZGVOYW1lICk7CgoJCQkJCQkJLy8gaW5saW5lLWxldmVsIGVsZW1lbnRzIGFjY2VwdCBpbmxpbmUtYmxvY2s7CgkJCQkJCQkvLyBibG9jay1sZXZlbCBlbGVtZW50cyBuZWVkIHRvIGJlIGlubGluZSB3aXRoIGxheW91dAoJCQkJCQkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiApIHsKCQkJCQkJCQl0aGlzLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lLWJsb2NrIjsKCgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCXRoaXMuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOwoJCQkJCQkJCXRoaXMuc3R5bGUuem9vbSA9IDE7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWlmICggb3B0Lm92ZXJmbG93ICE9IG51bGwgKSB7CgkJCQl0aGlzLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJCX0KCgkJCWZvciAoIHAgaW4gcHJvcCApIHsKCQkJCWUgPSBuZXcgalF1ZXJ5LmZ4KCB0aGlzLCBvcHQsIHAgKTsKCQkJCXZhbCA9IHByb3BbIHAgXTsKCgkJCQlpZiAoIHJmeHR5cGVzLnRlc3QodmFsKSApIHsKCQkJCQllWyB2YWwgPT09ICJ0b2dnbGUiID8gaGlkZGVuID8gInNob3ciIDogImhpZGUiIDogdmFsIF0oKTsKCgkJCQl9IGVsc2UgewoJCQkJCXBhcnRzID0gcmZ4bnVtLmV4ZWMoIHZhbCApOwoJCQkJCXN0YXJ0ID0gZS5jdXIoKTsKCgkJCQkJaWYgKCBwYXJ0cyApIHsKCQkJCQkJZW5kID0gcGFyc2VGbG9hdCggcGFydHNbMl0gKTsKCQkJCQkJdW5pdCA9IHBhcnRzWzNdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcCBdID8gIiIgOiAicHgiICk7CgoJCQkJCQkvLyBXZSBuZWVkIHRvIGNvbXB1dGUgc3RhcnRpbmcgdmFsdWUKCQkJCQkJaWYgKCB1bml0ICE9PSAicHgiICkgewoJCQkJCQkJalF1ZXJ5LnN0eWxlKCB0aGlzLCBwLCAoZW5kIHx8IDEpICsgdW5pdCk7CgkJCQkJCQlzdGFydCA9ICgoZW5kIHx8IDEpIC8gZS5jdXIoKSkgKiBzdGFydDsKCQkJCQkJCWpRdWVyeS5zdHlsZSggdGhpcywgcCwgc3RhcnQgKyB1bml0KTsKCQkJCQkJfQoKCQkJCQkJLy8gSWYgYSArPS8tPSB0b2tlbiB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVsYXRpdmUgYW5pbWF0aW9uCgkJCQkJCWlmICggcGFydHNbMV0gKSB7CgkJCQkJCQllbmQgPSAoIChwYXJ0c1sgMSBdID09PSAiLT0iID8gLTEgOiAxKSAqIGVuZCApICsgc3RhcnQ7CgkJCQkJCX0KCgkJCQkJCWUuY3VzdG9tKCBzdGFydCwgZW5kLCB1bml0ICk7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCWUuY3VzdG9tKCBzdGFydCwgdmFsLCAiIiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yIEpTIHN0cmljdCBjb21wbGlhbmNlCgkJCXJldHVybiB0cnVlOwoJCX0pOwoJfSwKCglzdG9wOiBmdW5jdGlvbiggY2xlYXJRdWV1ZSwgZ290b0VuZCApIHsKCQlpZiAoIGNsZWFyUXVldWUgKSB7CgkJCXRoaXMucXVldWUoW10pOwoJCX0KCgkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWkgPSB0aW1lcnMubGVuZ3RoOwoJCQkvLyBjbGVhciBtYXJrZXIgY291bnRlcnMgaWYgd2Uga25vdyB0aGV5IHdvbid0IGJlCgkJCWlmICggIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuX3VubWFyayggdHJ1ZSwgdGhpcyApOwoJCQl9CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCB0aW1lcnNbaV0uZWxlbSA9PT0gdGhpcyApIHsKCQkJCQlpZiAoZ290b0VuZCkgewoJCQkJCQkvLyBmb3JjZSB0aGUgbmV4dCBzdGVwIHRvIGJlIHRoZSBsYXN0CgkJCQkJCXRpbWVyc1tpXSh0cnVlKTsKCQkJCQl9CgoJCQkJCXRpbWVycy5zcGxpY2UoaSwgMSk7CgkJCQl9CgkJCX0KCQl9KTsKCgkJLy8gc3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZAoJCWlmICggIWdvdG9FbmQgKSB7CgkJCXRoaXMuZGVxdWV1ZSgpOwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Cgp9KTsKCi8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHkKZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7CglzZXRUaW1lb3V0KCBjbGVhckZ4Tm93LCAwICk7CglyZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApOwp9CgpmdW5jdGlvbiBjbGVhckZ4Tm93KCkgewoJZnhOb3cgPSB1bmRlZmluZWQ7Cn0KCi8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uCmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBudW0gKSB7Cgl2YXIgb2JqID0ge307CgoJalF1ZXJ5LmVhY2goIGZ4QXR0cnMuY29uY2F0LmFwcGx5KFtdLCBmeEF0dHJzLnNsaWNlKDAsbnVtKSksIGZ1bmN0aW9uKCkgewoJCW9ialsgdGhpcyBdID0gdHlwZTsKCX0pOwoKCXJldHVybiBvYmo7Cn0KCi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnMKalF1ZXJ5LmVhY2goewoJc2xpZGVEb3duOiBnZW5GeCgic2hvdyIsIDEpLAoJc2xpZGVVcDogZ2VuRngoImhpZGUiLCAxKSwKCXNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiwgMSksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCXNwZWVkOiBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7CgkJdmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gIm9iamVjdCIgPyBqUXVlcnkuZXh0ZW5kKHt9LCBzcGVlZCkgOiB7CgkJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKCQkJZHVyYXRpb246IHNwZWVkLAoJCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKGVhc2luZykgJiYgZWFzaW5nCgkJfTsKCgkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVyIiA/IG9wdC5kdXJhdGlvbiA6CgkJCW9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzID8galF1ZXJ5LmZ4LnNwZWVkc1tvcHQuZHVyYXRpb25dIDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCgkJLy8gUXVldWVpbmcKCQlvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoJCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCBub1VubWFyayApIHsKCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQkJb3B0Lm9sZC5jYWxsKCB0aGlzICk7CgkJCX0KCgkJCWlmICggb3B0LnF1ZXVlICE9PSBmYWxzZSApIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzICk7CgkJCX0gZWxzZSBpZiAoIG5vVW5tYXJrICE9PSBmYWxzZSApIHsKCQkJCWpRdWVyeS5fdW5tYXJrKCB0aGlzICk7CgkJCX0KCQl9OwoKCQlyZXR1cm4gb3B0OwoJfSwKCgllYXNpbmc6IHsKCQlsaW5lYXI6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKCQkJcmV0dXJuIGZpcnN0TnVtICsgZGlmZiAqIHA7CgkJfSwKCQlzd2luZzogZnVuY3Rpb24oIHAsIG4sIGZpcnN0TnVtLCBkaWZmICkgewoJCQlyZXR1cm4gKCgtTWF0aC5jb3MocCpNYXRoLlBJKS8yKSArIDAuNSkgKiBkaWZmICsgZmlyc3ROdW07CgkJfQoJfSwKCgl0aW1lcnM6IFtdLAoKCWZ4OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCApIHsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCgkJb3B0aW9ucy5vcmlnID0gb3B0aW9ucy5vcmlnIHx8IHt9OwoJfQoKfSk7CgpqUXVlcnkuZngucHJvdG90eXBlID0gewoJLy8gU2ltcGxlIGZ1bmN0aW9uIGZvciBzZXR0aW5nIGEgc3R5bGUgdmFsdWUKCXVwZGF0ZTogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJKGpRdWVyeS5meC5zdGVwW3RoaXMucHJvcF0gfHwgalF1ZXJ5LmZ4LnN0ZXAuX2RlZmF1bHQpKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgY3VycmVudCBzaXplCgljdXI6IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpcy5lbGVtW3RoaXMucHJvcF0gIT0gbnVsbCAmJiAoIXRoaXMuZWxlbS5zdHlsZSB8fCB0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXSA9PSBudWxsKSApIHsKCQkJcmV0dXJuIHRoaXMuZWxlbVsgdGhpcy5wcm9wIF07CgkJfQoKCQl2YXIgcGFyc2VkLAoJCQlyID0galF1ZXJ5LmNzcyggdGhpcy5lbGVtLCB0aGlzLnByb3AgKTsKCQkvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kICJhdXRvIiBhcmUgY29udmVydGVkIHRvIDAsCgkJLy8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyAicm90YXRlKDFyYWQpIiBhcmUgcmV0dXJuZWQgYXMgaXMsCgkJLy8gc2ltcGxlIHZhbHVlcyBzdWNoIGFzICIxMHB4IiBhcmUgcGFyc2VkIHRvIEZsb2F0LgoJCXJldHVybiBpc05hTiggcGFyc2VkID0gcGFyc2VGbG9hdCggciApICkgPyAhciB8fCByID09PSAiYXV0byIgPyAwIDogciA6IHBhcnNlZDsKCX0sCgoJLy8gU3RhcnQgYW4gYW5pbWF0aW9uIGZyb20gb25lIG51bWJlciB0byBhbm90aGVyCgljdXN0b206IGZ1bmN0aW9uKCBmcm9tLCB0bywgdW5pdCApIHsKCQl2YXIgc2VsZiA9IHRoaXMsCgkJCWZ4ID0galF1ZXJ5LmZ4OwoKCQl0aGlzLnN0YXJ0VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCk7CgkJdGhpcy5zdGFydCA9IGZyb207CgkJdGhpcy5lbmQgPSB0bzsKCQl0aGlzLnVuaXQgPSB1bml0IHx8IHRoaXMudW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHRoaXMucHJvcCBdID8gIiIgOiAicHgiICk7CgkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0OwoJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDA7CgoJCWZ1bmN0aW9uIHQoIGdvdG9FbmQgKSB7CgkJCXJldHVybiBzZWxmLnN0ZXAoZ290b0VuZCk7CgkJfQoKCQl0LmVsZW0gPSB0aGlzLmVsZW07CgoJCWlmICggdCgpICYmIGpRdWVyeS50aW1lcnMucHVzaCh0KSAmJiAhdGltZXJJZCApIHsKCQkJdGltZXJJZCA9IHNldEludGVydmFsKCBmeC50aWNrLCBmeC5pbnRlcnZhbCApOwoJCX0KCX0sCgoJLy8gU2ltcGxlICdzaG93JyBmdW5jdGlvbgoJc2hvdzogZnVuY3Rpb24oKSB7CgkJLy8gUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCwgc28gdGhhdCB3ZSBjYW4gZ28gYmFjayB0byBpdCBsYXRlcgoJCXRoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF0gPSBqUXVlcnkuc3R5bGUoIHRoaXMuZWxlbSwgdGhpcy5wcm9wICk7CgkJdGhpcy5vcHRpb25zLnNob3cgPSB0cnVlOwoKCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2Ugc3RhcnQgYXQgYSBzbWFsbCB3aWR0aC9oZWlnaHQgdG8gYXZvaWQgYW55CgkJLy8gZmxhc2ggb2YgY29udGVudAoJCXRoaXMuY3VzdG9tKHRoaXMucHJvcCA9PT0gIndpZHRoIiB8fCB0aGlzLnByb3AgPT09ICJoZWlnaHQiID8gMSA6IDAsIHRoaXMuY3VyKCkpOwoKCQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBlbGVtZW50CgkJalF1ZXJ5KCB0aGlzLmVsZW0gKS5zaG93KCk7Cgl9LAoKCS8vIFNpbXBsZSAnaGlkZScgZnVuY3Rpb24KCWhpZGU6IGZ1bmN0aW9uKCkgewoJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LnN0eWxlKCB0aGlzLmVsZW0sIHRoaXMucHJvcCApOwoJCXRoaXMub3B0aW9ucy5oaWRlID0gdHJ1ZTsKCgkJLy8gQmVnaW4gdGhlIGFuaW1hdGlvbgoJCXRoaXMuY3VzdG9tKHRoaXMuY3VyKCksIDApOwoJfSwKCgkvLyBFYWNoIHN0ZXAgb2YgYW4gYW5pbWF0aW9uCglzdGVwOiBmdW5jdGlvbiggZ290b0VuZCApIHsKCQl2YXIgdCA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCgkJCWRvbmUgPSB0cnVlLAoJCQllbGVtID0gdGhpcy5lbGVtLAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQlpLCBuOwoKCQlpZiAoIGdvdG9FbmQgfHwgdCA+PSBvcHRpb25zLmR1cmF0aW9uICsgdGhpcy5zdGFydFRpbWUgKSB7CgkJCXRoaXMubm93ID0gdGhpcy5lbmQ7CgkJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDE7CgkJCXRoaXMudXBkYXRlKCk7CgoJCQlvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllc1sgdGhpcy5wcm9wIF0gPSB0cnVlOwoKCQkJZm9yICggaSBpbiBvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllcyApIHsKCQkJCWlmICggb3B0aW9ucy5hbmltYXRlZFByb3BlcnRpZXNbaV0gIT09IHRydWUgKSB7CgkJCQkJZG9uZSA9IGZhbHNlOwoJCQkJfQoJCQl9CgoJCQlpZiAoIGRvbmUgKSB7CgkJCQkvLyBSZXNldCB0aGUgb3ZlcmZsb3cKCQkJCWlmICggb3B0aW9ucy5vdmVyZmxvdyAhPSBudWxsICYmICFqUXVlcnkuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzICkgewoKCQkJCQlqUXVlcnkuZWFjaCggWyAiIiwgIlgiLCAiWSIgXSwgZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkgewoJCQkJCQllbGVtLnN0eWxlWyAib3ZlcmZsb3ciICsgdmFsdWUgXSA9IG9wdGlvbnMub3ZlcmZsb3dbaW5kZXhdOwoJCQkJCX0pOwoJCQkJfQoKCQkJCS8vIEhpZGUgdGhlIGVsZW1lbnQgaWYgdGhlICJoaWRlIiBvcGVyYXRpb24gd2FzIGRvbmUKCQkJCWlmICggb3B0aW9ucy5oaWRlICkgewoJCQkJCWpRdWVyeShlbGVtKS5oaWRlKCk7CgkJCQl9CgoJCQkJLy8gUmVzZXQgdGhlIHByb3BlcnRpZXMsIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGhpZGRlbiBvciBzaG93bgoJCQkJaWYgKCBvcHRpb25zLmhpZGUgfHwgb3B0aW9ucy5zaG93ICkgewoJCQkJCWZvciAoIHZhciBwIGluIG9wdGlvbnMuYW5pbWF0ZWRQcm9wZXJ0aWVzICkgewoJCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHAsIG9wdGlvbnMub3JpZ1twXSApOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBFeGVjdXRlIHRoZSBjb21wbGV0ZSBmdW5jdGlvbgoJCQkJb3B0aW9ucy5jb21wbGV0ZS5jYWxsKCBlbGVtICk7CgkJCX0KCgkJCXJldHVybiBmYWxzZTsKCgkJfSBlbHNlIHsKCQkJLy8gY2xhc3NpY2FsIGVhc2luZyBjYW5ub3QgYmUgdXNlZCB3aXRoIGFuIEluZmluaXR5IGR1cmF0aW9uCgkJCWlmICggb3B0aW9ucy5kdXJhdGlvbiA9PSBJbmZpbml0eSApIHsKCQkJCXRoaXMubm93ID0gdDsKCQkJfSBlbHNlIHsKCQkJCW4gPSB0IC0gdGhpcy5zdGFydFRpbWU7CgkJCQl0aGlzLnN0YXRlID0gbiAvIG9wdGlvbnMuZHVyYXRpb247CgoJCQkJLy8gUGVyZm9ybSB0aGUgZWFzaW5nIGZ1bmN0aW9uLCBkZWZhdWx0cyB0byBzd2luZwoJCQkJdGhpcy5wb3MgPSBqUXVlcnkuZWFzaW5nWyBvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllc1sgdGhpcy5wcm9wIF0gXSggdGhpcy5zdGF0ZSwgbiwgMCwgMSwgb3B0aW9ucy5kdXJhdGlvbiApOwoJCQkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0ICsgKCh0aGlzLmVuZCAtIHRoaXMuc3RhcnQpICogdGhpcy5wb3MpOwoJCQl9CgkJCS8vIFBlcmZvcm0gdGhlIG5leHQgc3RlcCBvZiB0aGUgYW5pbWF0aW9uCgkJCXRoaXMudXBkYXRlKCk7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5meCwgewoJdGljazogZnVuY3Rpb24oKSB7CgkJZm9yICggdmFyIHRpbWVycyA9IGpRdWVyeS50aW1lcnMsIGkgPSAwIDsgaSA8IHRpbWVycy5sZW5ndGggOyArK2kgKSB7CgkJCWlmICggIXRpbWVyc1tpXSgpICkgewoJCQkJdGltZXJzLnNwbGljZShpLS0sIDEpOwoJCQl9CgkJfQoKCQlpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCQlqUXVlcnkuZnguc3RvcCgpOwoJCX0KCX0sCgoJaW50ZXJ2YWw6IDEzLAoKCXN0b3A6IGZ1bmN0aW9uKCkgewoJCWNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKCQl0aW1lcklkID0gbnVsbDsKCX0sCgoJc3BlZWRzOiB7CgkJc2xvdzogNjAwLAoJCWZhc3Q6IDIwMCwKCQkvLyBEZWZhdWx0IHNwZWVkCgkJX2RlZmF1bHQ6IDQwMAoJfSwKCglzdGVwOiB7CgkJb3BhY2l0eTogZnVuY3Rpb24oIGZ4ICkgewoJCQlqUXVlcnkuc3R5bGUoIGZ4LmVsZW0sICJvcGFjaXR5IiwgZngubm93ICk7CgkJfSwKCgkJX2RlZmF1bHQ6IGZ1bmN0aW9uKCBmeCApIHsKCQkJaWYgKCBmeC5lbGVtLnN0eWxlICYmIGZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSAhPSBudWxsICkgewoJCQkJZnguZWxlbS5zdHlsZVsgZngucHJvcCBdID0gKGZ4LnByb3AgPT09ICJ3aWR0aCIgfHwgZngucHJvcCA9PT0gImhlaWdodCIgPyBNYXRoLm1heCgwLCBmeC5ub3cpIDogZngubm93KSArIGZ4LnVuaXQ7CgkJCX0gZWxzZSB7CgkJCQlmeC5lbGVtWyBmeC5wcm9wIF0gPSBmeC5ub3c7CgkJCX0KCQl9Cgl9Cn0pOwoKaWYgKCBqUXVlcnkuZXhwciAmJiBqUXVlcnkuZXhwci5maWx0ZXJzICkgewoJalF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7CgkJCXJldHVybiBlbGVtID09PSBmbi5lbGVtOwoJCX0pLmxlbmd0aDsKCX07Cn0KCi8vIFRyeSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxlbWVudApmdW5jdGlvbiBkZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7CgoJaWYgKCAhZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gKSB7CgoJCXZhciBib2R5ID0gZG9jdW1lbnQuYm9keSwKCQkJZWxlbSA9IGpRdWVyeSggIjwiICsgbm9kZU5hbWUgKyAiPiIgKS5hcHBlbmRUbyggYm9keSApLAoJCQlkaXNwbGF5ID0gZWxlbS5jc3MoICJkaXNwbGF5IiApOwoKCQllbGVtLnJlbW92ZSgpOwoKCQkvLyBJZiB0aGUgc2ltcGxlIHdheSBmYWlscywKCQkvLyBnZXQgZWxlbWVudCdzIHJlYWwgZGVmYXVsdCBkaXNwbGF5IGJ5IGF0dGFjaGluZyBpdCB0byBhIHRlbXAgaWZyYW1lCgkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgfHwgZGlzcGxheSA9PT0gIiIgKSB7CgkJCS8vIE5vIGlmcmFtZSB0byB1c2UgeWV0LCBzbyBjcmVhdGUgaXQKCQkJaWYgKCAhaWZyYW1lICkgewoJCQkJaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlmcmFtZSIgKTsKCQkJCWlmcmFtZS5mcmFtZUJvcmRlciA9IGlmcmFtZS53aWR0aCA9IGlmcmFtZS5oZWlnaHQgPSAwOwoJCQl9CgoJCQlib2R5LmFwcGVuZENoaWxkKCBpZnJhbWUgKTsKCgkJCS8vIENyZWF0ZSBhIGNhY2hlYWJsZSBjb3B5IG9mIHRoZSBpZnJhbWUgZG9jdW1lbnQgb24gZmlyc3QgY2FsbC4KCQkJLy8gSUUgYW5kIE9wZXJhIHdpbGwgYWxsb3cgdXMgdG8gcmV1c2UgdGhlIGlmcmFtZURvYyB3aXRob3V0IHJlLXdyaXRpbmcgdGhlIGZha2UgSFRNTAoJCQkvLyBkb2N1bWVudCB0byBpdDsgV2ViS2l0ICYgRmlyZWZveCB3b24ndCBhbGxvdyByZXVzaW5nIHRoZSBpZnJhbWUgZG9jdW1lbnQuCgkJCWlmICggIWlmcmFtZURvYyB8fCAhaWZyYW1lLmNyZWF0ZUVsZW1lbnQgKSB7CgkJCQlpZnJhbWVEb2MgPSAoIGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgKS5kb2N1bWVudDsKCQkJCWlmcmFtZURvYy53cml0ZSggKCBkb2N1bWVudC5jb21wYXRNb2RlID09PSAiQ1NTMUNvbXBhdCIgPyAiPCFkb2N0eXBlIGh0bWw+IiA6ICIiICkgKyAiPGh0bWw+PGJvZHk+IiApOwoJCQkJaWZyYW1lRG9jLmNsb3NlKCk7CgkJCX0KCgkJCWVsZW0gPSBpZnJhbWVEb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKTsKCgkJCWlmcmFtZURvYy5ib2R5LmFwcGVuZENoaWxkKCBlbGVtICk7CgoJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgoJCQlib2R5LnJlbW92ZUNoaWxkKCBpZnJhbWUgKTsKCQl9CgoJCS8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheQoJCWVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTsKCX0KCglyZXR1cm4gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07Cn0KCgoKCnZhciBydGFibGUgPSAvXnQoPzphYmxlfGR8aCkkL2ksCglycm9vdCA9IC9eKD86Ym9keXxodG1sKSQvaTsKCmlmICggImdldEJvdW5kaW5nQ2xpZW50UmVjdCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgewoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoJCXZhciBlbGVtID0gdGhpc1swXSwgYm94OwoKCQlpZiAoIG9wdGlvbnMgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQl9KTsKCQl9CgoJCWlmICggIWVsZW0gfHwgIWVsZW0ub3duZXJEb2N1bWVudCApIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoKCQlpZiAoIGVsZW0gPT09IGVsZW0ub3duZXJEb2N1bWVudC5ib2R5ICkgewoJCQlyZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCBlbGVtICk7CgkJfQoKCQl0cnkgewoJCQlib3ggPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCX0gY2F0Y2goZSkge30KCgkJdmFyIGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwKCQkJZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CgoJCS8vIE1ha2Ugc3VyZSB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgZGlzY29ubmVjdGVkIERPTSBub2RlCgkJaWYgKCAhYm94IHx8ICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHsKCQkJcmV0dXJuIGJveCA/IHsgdG9wOiBib3gudG9wLCBsZWZ0OiBib3gubGVmdCB9IDogeyB0b3A6IDAsIGxlZnQ6IDAgfTsKCQl9CgoJCXZhciBib2R5ID0gZG9jLmJvZHksCgkJCXdpbiA9IGdldFdpbmRvdyhkb2MpLAoJCQljbGllbnRUb3AgID0gZG9jRWxlbS5jbGllbnRUb3AgIHx8IGJvZHkuY2xpZW50VG9wICB8fCAwLAoJCQljbGllbnRMZWZ0ID0gZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwLAoJCQlzY3JvbGxUb3AgID0gd2luLnBhZ2VZT2Zmc2V0IHx8IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsVG9wICB8fCBib2R5LnNjcm9sbFRvcCwKCQkJc2Nyb2xsTGVmdCA9IHdpbi5wYWdlWE9mZnNldCB8fCBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbCAmJiBkb2NFbGVtLnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0LAoJCQl0b3AgID0gYm94LnRvcCAgKyBzY3JvbGxUb3AgIC0gY2xpZW50VG9wLAoJCQlsZWZ0ID0gYm94LmxlZnQgKyBzY3JvbGxMZWZ0IC0gY2xpZW50TGVmdDsKCgkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKCX07Cgp9IGVsc2UgewoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoJCXZhciBlbGVtID0gdGhpc1swXTsKCgkJaWYgKCBvcHRpb25zICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkJalF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoICFlbGVtIHx8ICFlbGVtLm93bmVyRG9jdW1lbnQgKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJaWYgKCBlbGVtID09PSBlbGVtLm93bmVyRG9jdW1lbnQuYm9keSApIHsKCQkJcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCggZWxlbSApOwoJCX0KCgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CgoJCXZhciBjb21wdXRlZFN0eWxlLAoJCQlvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCwKCQkJcHJldk9mZnNldFBhcmVudCA9IGVsZW0sCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwKCQkJZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQsCgkJCWJvZHkgPSBkb2MuYm9keSwKCQkJZGVmYXVsdFZpZXcgPSBkb2MuZGVmYXVsdFZpZXcsCgkJCXByZXZDb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcgPyBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICkgOiBlbGVtLmN1cnJlbnRTdHlsZSwKCQkJdG9wID0gZWxlbS5vZmZzZXRUb3AsCgkJCWxlZnQgPSBlbGVtLm9mZnNldExlZnQ7CgoJCXdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0gIT09IGJvZHkgJiYgZWxlbSAhPT0gZG9jRWxlbSApIHsKCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKCQkJCWJyZWFrOwoJCQl9CgoJCQljb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcgPyBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpIDogZWxlbS5jdXJyZW50U3R5bGU7CgkJCXRvcCAgLT0gZWxlbS5zY3JvbGxUb3A7CgkJCWxlZnQgLT0gZWxlbS5zY3JvbGxMZWZ0OwoKCQkJaWYgKCBlbGVtID09PSBvZmZzZXRQYXJlbnQgKSB7CgkJCQl0b3AgICs9IGVsZW0ub2Zmc2V0VG9wOwoJCQkJbGVmdCArPSBlbGVtLm9mZnNldExlZnQ7CgoJCQkJaWYgKCBqUXVlcnkub2Zmc2V0LmRvZXNOb3RBZGRCb3JkZXIgJiYgIShqUXVlcnkub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzICYmIHJ0YWJsZS50ZXN0KGVsZW0ubm9kZU5hbWUpKSApIHsKCQkJCQl0b3AgICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGggICkgfHwgMDsKCQkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKCQkJCX0KCgkJCQlwcmV2T2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50OwoJCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CgkJCX0KCgkJCWlmICggalF1ZXJ5Lm9mZnNldC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUgJiYgY29tcHV0ZWRTdHlsZS5vdmVyZmxvdyAhPT0gInZpc2libGUiICkgewoJCQkJdG9wICArPSBwYXJzZUZsb2F0KCBjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoICApIHx8IDA7CgkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKCQkJfQoKCQkJcHJldkNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlOwoJCX0KCgkJaWYgKCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInJlbGF0aXZlIiB8fCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCXRvcCAgKz0gYm9keS5vZmZzZXRUb3A7CgkJCWxlZnQgKz0gYm9keS5vZmZzZXRMZWZ0OwoJCX0KCgkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKCQkJdG9wICArPSBNYXRoLm1heCggZG9jRWxlbS5zY3JvbGxUb3AsIGJvZHkuc2Nyb2xsVG9wICk7CgkJCWxlZnQgKz0gTWF0aC5tYXgoIGRvY0VsZW0uc2Nyb2xsTGVmdCwgYm9keS5zY3JvbGxMZWZ0ICk7CgkJfQoKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfTsKfQoKalF1ZXJ5Lm9mZnNldCA9IHsKCWluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXZhciBib2R5ID0gZG9jdW1lbnQuYm9keSwgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksIGlubmVyRGl2LCBjaGVja0RpdiwgdGFibGUsIHRkLCBib2R5TWFyZ2luVG9wID0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luVG9wIikgKSB8fCAwLAoJCQlodG1sID0gIjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4Oyc+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OycgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiI7CgoJCWpRdWVyeS5leHRlbmQoIGNvbnRhaW5lci5zdHlsZSwgeyBwb3NpdGlvbjogImFic29sdXRlIiwgdG9wOiAwLCBsZWZ0OiAwLCBtYXJnaW46IDAsIGJvcmRlcjogMCwgd2lkdGg6ICIxcHgiLCBoZWlnaHQ6ICIxcHgiLCB2aXNpYmlsaXR5OiAiaGlkZGVuIiB9ICk7CgoJCWNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOwoJCWJvZHkuaW5zZXJ0QmVmb3JlKCBjb250YWluZXIsIGJvZHkuZmlyc3RDaGlsZCApOwoJCWlubmVyRGl2ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CgkJY2hlY2tEaXYgPSBpbm5lckRpdi5maXJzdENoaWxkOwoJCXRkID0gaW5uZXJEaXYubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkOwoKCQl0aGlzLmRvZXNOb3RBZGRCb3JkZXIgPSAoY2hlY2tEaXYub2Zmc2V0VG9wICE9PSA1KTsKCQl0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzID0gKHRkLm9mZnNldFRvcCA9PT0gNSk7CgoJCWNoZWNrRGl2LnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKCQljaGVja0Rpdi5zdHlsZS50b3AgPSAiMjBweCI7CgoJCS8vIHNhZmFyaSBzdWJ0cmFjdHMgcGFyZW50IGJvcmRlciB3aWR0aCBoZXJlIHdoaWNoIGlzIDVweAoJCXRoaXMuc3VwcG9ydHNGaXhlZFBvc2l0aW9uID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gMjAgfHwgY2hlY2tEaXYub2Zmc2V0VG9wID09PSAxNSk7CgkJY2hlY2tEaXYuc3R5bGUucG9zaXRpb24gPSBjaGVja0Rpdi5zdHlsZS50b3AgPSAiIjsKCgkJaW5uZXJEaXYuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKCQlpbm5lckRpdi5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CgoJCXRoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gLTUpOwoKCQl0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0ID0gKGJvZHkub2Zmc2V0VG9wICE9PSBib2R5TWFyZ2luVG9wKTsKCgkJYm9keS5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7CgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplID0galF1ZXJ5Lm5vb3A7Cgl9LAoKCWJvZHlPZmZzZXQ6IGZ1bmN0aW9uKCBib2R5ICkgewoJCXZhciB0b3AgPSBib2R5Lm9mZnNldFRvcCwKCQkJbGVmdCA9IGJvZHkub2Zmc2V0TGVmdDsKCgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CgoJCWlmICggalF1ZXJ5Lm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCApIHsKCQkJdG9wICArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGJvZHksICJtYXJnaW5Ub3AiKSApIHx8IDA7CgkJCWxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luTGVmdCIpICkgfHwgMDsKCQl9CgoJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07Cgl9LAoKCXNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7CgkJdmFyIHBvc2l0aW9uID0galF1ZXJ5LmNzcyggZWxlbSwgInBvc2l0aW9uIiApOwoKCQkvLyBzZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJdmFyIGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSwKCQkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKSwKCQkJY3VyQ1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgInRvcCIgKSwKCQkJY3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sICJsZWZ0IiApLAoJCQljYWxjdWxhdGVQb3NpdGlvbiA9IChwb3NpdGlvbiA9PT0gImFic29sdXRlIiB8fCBwb3NpdGlvbiA9PT0gImZpeGVkIikgJiYgalF1ZXJ5LmluQXJyYXkoImF1dG8iLCBbY3VyQ1NTVG9wLCBjdXJDU1NMZWZ0XSkgPiAtMSwKCQkJcHJvcHMgPSB7fSwgY3VyUG9zaXRpb24gPSB7fSwgY3VyVG9wLCBjdXJMZWZ0OwoKCQkvLyBuZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWQKCQlpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkgewoJCQljdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTsKCQkJY3VyVG9wID0gY3VyUG9zaXRpb24udG9wOwoJCQljdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDsKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7CgkJCW9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApOwoJCX0KCgkJaWYgKG9wdGlvbnMudG9wICE9IG51bGwpIHsKCQkJcHJvcHMudG9wID0gKG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCkgKyBjdXJUb3A7CgkJfQoJCWlmIChvcHRpb25zLmxlZnQgIT0gbnVsbCkgewoJCQlwcm9wcy5sZWZ0ID0gKG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0KSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoJCX0gZWxzZSB7CgkJCWN1ckVsZW0uY3NzKCBwcm9wcyApOwoJCX0KCX0KfTsKCgpqUXVlcnkuZm4uZXh0ZW5kKHsKCXBvc2l0aW9uOiBmdW5jdGlvbigpIHsKCQlpZiAoICF0aGlzWzBdICkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgoJCXZhciBlbGVtID0gdGhpc1swXSwKCgkJLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKCQlvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLAoKCQkvLyBHZXQgY29ycmVjdCBvZmZzZXRzCgkJb2Zmc2V0ICAgICAgID0gdGhpcy5vZmZzZXQoKSwKCQlwYXJlbnRPZmZzZXQgPSBycm9vdC50ZXN0KG9mZnNldFBhcmVudFswXS5ub2RlTmFtZSkgPyB7IHRvcDogMCwgbGVmdDogMCB9IDogb2Zmc2V0UGFyZW50Lm9mZnNldCgpOwoKCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1hcmdpbnMKCQkvLyBub3RlOiB3aGVuIGFuIGVsZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBhbmQgbWFyZ2luTGVmdAoJCS8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwCgkJb2Zmc2V0LnRvcCAgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhlbGVtLCAibWFyZ2luVG9wIikgKSB8fCAwOwoJCW9mZnNldC5sZWZ0IC09IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoZWxlbSwgIm1hcmdpbkxlZnQiKSApIHx8IDA7CgoJCS8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVycwoJCXBhcmVudE9mZnNldC50b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50WzBdLCAiYm9yZGVyVG9wV2lkdGgiKSApIHx8IDA7CgkJcGFyZW50T2Zmc2V0LmxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnRbMF0sICJib3JkZXJMZWZ0V2lkdGgiKSApIHx8IDA7CgoJCS8vIFN1YnRyYWN0IHRoZSB0d28gb2Zmc2V0cwoJCXJldHVybiB7CgkJCXRvcDogIG9mZnNldC50b3AgIC0gcGFyZW50T2Zmc2V0LnRvcCwKCQkJbGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdAoJCX07Cgl9LAoKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkgewoJCQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQuYm9keTsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgKCFycm9vdC50ZXN0KG9mZnNldFBhcmVudC5ub2RlTmFtZSkgJiYgalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnQsICJwb3NpdGlvbiIpID09PSAic3RhdGljIikgKSB7CgkJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OwoJCQl9CgkJCXJldHVybiBvZmZzZXRQYXJlbnQ7CgkJfSk7Cgl9Cn0pOwoKCi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kcwpqUXVlcnkuZWFjaCggWyJMZWZ0IiwgIlRvcCJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCXZhciBtZXRob2QgPSAic2Nyb2xsIiArIG5hbWU7CgoJalF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7CgkJdmFyIGVsZW0sIHdpbjsKCgkJaWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHsKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJCWlmICggIWVsZW0gKSB7CgkJCQlyZXR1cm4gbnVsbDsKCQkJfQoKCQkJd2luID0gZ2V0V2luZG93KCBlbGVtICk7CgoJCQkvLyBSZXR1cm4gdGhlIHNjcm9sbCBvZmZzZXQKCQkJcmV0dXJuIHdpbiA/ICgicGFnZVhPZmZzZXQiIGluIHdpbikgPyB3aW5bIGkgPyAicGFnZVlPZmZzZXQiIDogInBhZ2VYT2Zmc2V0IiBdIDoKCQkJCWpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIG1ldGhvZCBdIHx8CgkJCQkJd2luLmRvY3VtZW50LmJvZHlbIG1ldGhvZCBdIDoKCQkJCWVsZW1bIG1ldGhvZCBdOwoJCX0KCgkJLy8gU2V0IHRoZSBzY3JvbGwgb2Zmc2V0CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJd2luID0gZ2V0V2luZG93KCB0aGlzICk7CgoJCQlpZiAoIHdpbiApIHsKCQkJCXdpbi5zY3JvbGxUbygKCQkJCQkhaSA/IHZhbCA6IGpRdWVyeSggd2luICkuc2Nyb2xsTGVmdCgpLAoJCQkJCSBpID8gdmFsIDogalF1ZXJ5KCB3aW4gKS5zY3JvbGxUb3AoKQoJCQkJKTsKCgkJCX0gZWxzZSB7CgkJCQl0aGlzWyBtZXRob2QgXSA9IHZhbDsKCQkJfQoJCX0pOwoJfTsKfSk7CgpmdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmlzV2luZG93KCBlbGVtICkgPwoJCWVsZW0gOgoJCWVsZW0ubm9kZVR5cGUgPT09IDkgPwoJCQllbGVtLmRlZmF1bHRWaWV3IHx8IGVsZW0ucGFyZW50V2luZG93IDoKCQkJZmFsc2U7Cn0KCgoKCi8vIENyZWF0ZSB3aWR0aCwgaGVpZ2h0LCBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwpqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoKCXZhciB0eXBlID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKCS8vIGlubmVySGVpZ2h0IGFuZCBpbm5lcldpZHRoCglqUXVlcnkuZm5bICJpbm5lciIgKyBuYW1lIF0gPSBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSA9IHRoaXNbMF07CgkJcmV0dXJuIGVsZW0gJiYgZWxlbS5zdHlsZSA/CgkJCXBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsICJwYWRkaW5nIiApICkgOgoJCQludWxsOwoJfTsKCgkvLyBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aAoJalF1ZXJ5LmZuWyAib3V0ZXIiICsgbmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiApIHsKCQl2YXIgZWxlbSA9IHRoaXNbMF07CgkJcmV0dXJuIGVsZW0gJiYgZWxlbS5zdHlsZSA/CgkJCXBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIG1hcmdpbiA/ICJtYXJnaW4iIDogImJvcmRlciIgKSApIDoKCQkJbnVsbDsKCX07CgoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggc2l6ZSApIHsKCQkvLyBHZXQgd2luZG93IHdpZHRoIG9yIGhlaWdodAoJCXZhciBlbGVtID0gdGhpc1swXTsKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gc2l6ZSA9PSBudWxsID8gbnVsbCA6IHRoaXM7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzaXplICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoJCQkJc2VsZlsgdHlwZSBdKCBzaXplLmNhbGwoIHRoaXMsIGksIHNlbGZbIHR5cGUgXSgpICkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewoJCQkvLyBFdmVyeW9uZSBlbHNlIHVzZSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgb3IgZG9jdW1lbnQuYm9keSBkZXBlbmRpbmcgb24gUXVpcmtzIHZzIFN0YW5kYXJkcyBtb2RlCgkJCS8vIDNyZCBjb25kaXRpb24gYWxsb3dzIE5va2lhIHN1cHBvcnQsIGFzIGl0IHN1cHBvcnRzIHRoZSBkb2NFbGVtIHByb3AgYnV0IG5vdCBDU1MxQ29tcGF0CgkJCXZhciBkb2NFbGVtUHJvcCA9IGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyAiY2xpZW50IiArIG5hbWUgXSwKCQkJCWJvZHkgPSBlbGVtLmRvY3VtZW50LmJvZHk7CgkJCXJldHVybiBlbGVtLmRvY3VtZW50LmNvbXBhdE1vZGUgPT09ICJDU1MxQ29tcGF0IiAmJiBkb2NFbGVtUHJvcCB8fAoJCQkJYm9keSAmJiBib2R5WyAiY2xpZW50IiArIG5hbWUgXSB8fCBkb2NFbGVtUHJvcDsKCgkJLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAoJCX0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7CgkJCS8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSwgd2hpY2hldmVyIGlzIGdyZWF0ZXIKCQkJcmV0dXJuIE1hdGgubWF4KAoJCQkJZWxlbS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBuYW1lXSwKCQkJCWVsZW0uYm9keVsic2Nyb2xsIiArIG5hbWVdLCBlbGVtLmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIiArIG5hbWVdLAoJCQkJZWxlbS5ib2R5WyJvZmZzZXQiICsgbmFtZV0sIGVsZW0uZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiICsgbmFtZV0KCQkJKTsKCgkJLy8gR2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQl9IGVsc2UgaWYgKCBzaXplID09PSB1bmRlZmluZWQgKSB7CgkJCXZhciBvcmlnID0galF1ZXJ5LmNzcyggZWxlbSwgdHlwZSApLAoJCQkJcmV0ID0gcGFyc2VGbG9hdCggb3JpZyApOwoKCQkJcmV0dXJuIGpRdWVyeS5pc05hTiggcmV0ICkgPyBvcmlnIDogcmV0OwoKCQkvLyBTZXQgdGhlIHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCAoZGVmYXVsdCB0byBwaXhlbHMgaWYgdmFsdWUgaXMgdW5pdGxlc3MpCgkJfSBlbHNlIHsKCQkJcmV0dXJuIHRoaXMuY3NzKCB0eXBlLCB0eXBlb2Ygc2l6ZSA9PT0gInN0cmluZyIgPyBzaXplIDogc2l6ZSArICJweCIgKTsKCQl9Cgl9OwoKfSk7CgoKLy8gRXhwb3NlIGpRdWVyeSB0byB0aGUgZ2xvYmFsIG9iamVjdAp3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7Cn0pKHdpbmRvdyk7Cg=="},{"meta":{"name":"jquery.qrcode.min.js","url":"https://cdn.bootcss.com/jquery.qrcode/1.0/jquery.qrcode.min.js","ts":1654514782940,"mimetype":"text/javascript"},"source":"KGZ1bmN0aW9uKHIpe3IuZm4ucXJjb2RlPWZ1bmN0aW9uKGgpe3ZhciBzO2Z1bmN0aW9uIHUoYSl7dGhpcy5tb2RlPXM7dGhpcy5kYXRhPWF9ZnVuY3Rpb24gbyhhLGMpe3RoaXMudHlwZU51bWJlcj1hO3RoaXMuZXJyb3JDb3JyZWN0TGV2ZWw9Yzt0aGlzLm1vZHVsZXM9bnVsbDt0aGlzLm1vZHVsZUNvdW50PTA7dGhpcy5kYXRhQ2FjaGU9bnVsbDt0aGlzLmRhdGFMaXN0PVtdfWZ1bmN0aW9uIHEoYSxjKXtpZih2b2lkIDA9PWEubGVuZ3RoKXRocm93IEVycm9yKGEubGVuZ3RoKyIvIitjKTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoJiYwPT1hW2RdOylkKys7dGhpcy5udW09QXJyYXkoYS5sZW5ndGgtZCtjKTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoLWQ7YisrKXRoaXMubnVtW2JdPWFbYitkXX1mdW5jdGlvbiBwKGEsYyl7dGhpcy50b3RhbENvdW50PWE7dGhpcy5kYXRhQ291bnQ9Y31mdW5jdGlvbiB0KCl7dGhpcy5idWZmZXI9W107dGhpcy5sZW5ndGg9MH11LnByb3RvdHlwZT17Z2V0TGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5sZW5ndGh9LAp3cml0ZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuZGF0YS5sZW5ndGg7YysrKWEucHV0KHRoaXMuZGF0YS5jaGFyQ29kZUF0KGMpLDgpfX07by5wcm90b3R5cGU9e2FkZERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhTGlzdC5wdXNoKG5ldyB1KGEpKTt0aGlzLmRhdGFDYWNoZT1udWxsfSxpc0Rhcms6ZnVuY3Rpb24oYSxjKXtpZigwPmF8fHRoaXMubW9kdWxlQ291bnQ8PWF8fDA+Y3x8dGhpcy5tb2R1bGVDb3VudDw9Yyl0aHJvdyBFcnJvcihhKyIsIitjKTtyZXR1cm4gdGhpcy5tb2R1bGVzW2FdW2NdfSxnZXRNb2R1bGVDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vZHVsZUNvdW50fSxtYWtlOmZ1bmN0aW9uKCl7aWYoMT50aGlzLnR5cGVOdW1iZXIpe2Zvcih2YXIgYT0xLGE9MTs0MD5hO2ErKyl7Zm9yKHZhciBjPXAuZ2V0UlNCbG9ja3MoYSx0aGlzLmVycm9yQ29ycmVjdExldmVsKSxkPW5ldyB0LGI9MCxlPTA7ZTxjLmxlbmd0aDtlKyspYis9Y1tlXS5kYXRhQ291bnQ7CmZvcihlPTA7ZTx0aGlzLmRhdGFMaXN0Lmxlbmd0aDtlKyspYz10aGlzLmRhdGFMaXN0W2VdLGQucHV0KGMubW9kZSw0KSxkLnB1dChjLmdldExlbmd0aCgpLGouZ2V0TGVuZ3RoSW5CaXRzKGMubW9kZSxhKSksYy53cml0ZShkKTtpZihkLmdldExlbmd0aEluQml0cygpPD04KmIpYnJlYWt9dGhpcy50eXBlTnVtYmVyPWF9dGhpcy5tYWtlSW1wbCghMSx0aGlzLmdldEJlc3RNYXNrUGF0dGVybigpKX0sbWFrZUltcGw6ZnVuY3Rpb24oYSxjKXt0aGlzLm1vZHVsZUNvdW50PTQqdGhpcy50eXBlTnVtYmVyKzE3O3RoaXMubW9kdWxlcz1BcnJheSh0aGlzLm1vZHVsZUNvdW50KTtmb3IodmFyIGQ9MDtkPHRoaXMubW9kdWxlQ291bnQ7ZCsrKXt0aGlzLm1vZHVsZXNbZF09QXJyYXkodGhpcy5tb2R1bGVDb3VudCk7Zm9yKHZhciBiPTA7Yjx0aGlzLm1vZHVsZUNvdW50O2IrKyl0aGlzLm1vZHVsZXNbZF1bYl09bnVsbH10aGlzLnNldHVwUG9zaXRpb25Qcm9iZVBhdHRlcm4oMCwwKTt0aGlzLnNldHVwUG9zaXRpb25Qcm9iZVBhdHRlcm4odGhpcy5tb2R1bGVDb3VudC0KNywwKTt0aGlzLnNldHVwUG9zaXRpb25Qcm9iZVBhdHRlcm4oMCx0aGlzLm1vZHVsZUNvdW50LTcpO3RoaXMuc2V0dXBQb3NpdGlvbkFkanVzdFBhdHRlcm4oKTt0aGlzLnNldHVwVGltaW5nUGF0dGVybigpO3RoaXMuc2V0dXBUeXBlSW5mbyhhLGMpOzc8PXRoaXMudHlwZU51bWJlciYmdGhpcy5zZXR1cFR5cGVOdW1iZXIoYSk7bnVsbD09dGhpcy5kYXRhQ2FjaGUmJih0aGlzLmRhdGFDYWNoZT1vLmNyZWF0ZURhdGEodGhpcy50eXBlTnVtYmVyLHRoaXMuZXJyb3JDb3JyZWN0TGV2ZWwsdGhpcy5kYXRhTGlzdCkpO3RoaXMubWFwRGF0YSh0aGlzLmRhdGFDYWNoZSxjKX0sc2V0dXBQb3NpdGlvblByb2JlUGF0dGVybjpmdW5jdGlvbihhLGMpe2Zvcih2YXIgZD0tMTs3Pj1kO2QrKylpZighKC0xPj1hK2R8fHRoaXMubW9kdWxlQ291bnQ8PWErZCkpZm9yKHZhciBiPS0xOzc+PWI7YisrKS0xPj1jK2J8fHRoaXMubW9kdWxlQ291bnQ8PWMrYnx8KHRoaXMubW9kdWxlc1thK2RdW2MrYl09CjA8PWQmJjY+PWQmJigwPT1ifHw2PT1iKXx8MDw9YiYmNj49YiYmKDA9PWR8fDY9PWQpfHwyPD1kJiY0Pj1kJiYyPD1iJiY0Pj1iPyEwOiExKX0sZ2V0QmVzdE1hc2tQYXR0ZXJuOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYz0wLGQ9MDs4PmQ7ZCsrKXt0aGlzLm1ha2VJbXBsKCEwLGQpO3ZhciBiPWouZ2V0TG9zdFBvaW50KHRoaXMpO2lmKDA9PWR8fGE+YilhPWIsYz1kfXJldHVybiBjfSxjcmVhdGVNb3ZpZUNsaXA6ZnVuY3Rpb24oYSxjLGQpe2E9YS5jcmVhdGVFbXB0eU1vdmllQ2xpcChjLGQpO3RoaXMubWFrZSgpO2ZvcihjPTA7Yzx0aGlzLm1vZHVsZXMubGVuZ3RoO2MrKylmb3IodmFyIGQ9MSpjLGI9MDtiPHRoaXMubW9kdWxlc1tjXS5sZW5ndGg7YisrKXt2YXIgZT0xKmI7dGhpcy5tb2R1bGVzW2NdW2JdJiYoYS5iZWdpbkZpbGwoMCwxMDApLGEubW92ZVRvKGUsZCksYS5saW5lVG8oZSsxLGQpLGEubGluZVRvKGUrMSxkKzEpLGEubGluZVRvKGUsZCsxKSxhLmVuZEZpbGwoKSl9cmV0dXJuIGF9LApzZXR1cFRpbWluZ1BhdHRlcm46ZnVuY3Rpb24oKXtmb3IodmFyIGE9ODthPHRoaXMubW9kdWxlQ291bnQtODthKyspbnVsbD09dGhpcy5tb2R1bGVzW2FdWzZdJiYodGhpcy5tb2R1bGVzW2FdWzZdPTA9PWElMik7Zm9yKGE9ODthPHRoaXMubW9kdWxlQ291bnQtODthKyspbnVsbD09dGhpcy5tb2R1bGVzWzZdW2FdJiYodGhpcy5tb2R1bGVzWzZdW2FdPTA9PWElMil9LHNldHVwUG9zaXRpb25BZGp1c3RQYXR0ZXJuOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPWouZ2V0UGF0dGVyblBvc2l0aW9uKHRoaXMudHlwZU51bWJlciksYz0wO2M8YS5sZW5ndGg7YysrKWZvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgYj1hW2NdLGU9YVtkXTtpZihudWxsPT10aGlzLm1vZHVsZXNbYl1bZV0pZm9yKHZhciBmPS0yOzI+PWY7ZisrKWZvcih2YXIgaT0tMjsyPj1pO2krKyl0aGlzLm1vZHVsZXNbYitmXVtlK2ldPS0yPT1mfHwyPT1mfHwtMj09aXx8Mj09aXx8MD09ZiYmMD09aT8hMDohMX19LHNldHVwVHlwZU51bWJlcjpmdW5jdGlvbihhKXtmb3IodmFyIGM9CmouZ2V0QkNIVHlwZU51bWJlcih0aGlzLnR5cGVOdW1iZXIpLGQ9MDsxOD5kO2QrKyl7dmFyIGI9IWEmJjE9PShjPj5kJjEpO3RoaXMubW9kdWxlc1tNYXRoLmZsb29yKGQvMyldW2QlMyt0aGlzLm1vZHVsZUNvdW50LTgtM109Yn1mb3IoZD0wOzE4PmQ7ZCsrKWI9IWEmJjE9PShjPj5kJjEpLHRoaXMubW9kdWxlc1tkJTMrdGhpcy5tb2R1bGVDb3VudC04LTNdW01hdGguZmxvb3IoZC8zKV09Yn0sc2V0dXBUeXBlSW5mbzpmdW5jdGlvbihhLGMpe2Zvcih2YXIgZD1qLmdldEJDSFR5cGVJbmZvKHRoaXMuZXJyb3JDb3JyZWN0TGV2ZWw8PDN8YyksYj0wOzE1PmI7YisrKXt2YXIgZT0hYSYmMT09KGQ+PmImMSk7Nj5iP3RoaXMubW9kdWxlc1tiXVs4XT1lOjg+Yj90aGlzLm1vZHVsZXNbYisxXVs4XT1lOnRoaXMubW9kdWxlc1t0aGlzLm1vZHVsZUNvdW50LTE1K2JdWzhdPWV9Zm9yKGI9MDsxNT5iO2IrKyllPSFhJiYxPT0oZD4+YiYxKSw4PmI/dGhpcy5tb2R1bGVzWzhdW3RoaXMubW9kdWxlQ291bnQtCmItMV09ZTo5PmI/dGhpcy5tb2R1bGVzWzhdWzE1LWItMSsxXT1lOnRoaXMubW9kdWxlc1s4XVsxNS1iLTFdPWU7dGhpcy5tb2R1bGVzW3RoaXMubW9kdWxlQ291bnQtOF1bOF09IWF9LG1hcERhdGE6ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGQ9LTEsYj10aGlzLm1vZHVsZUNvdW50LTEsZT03LGY9MCxpPXRoaXMubW9kdWxlQ291bnQtMTswPGk7aS09Milmb3IoNj09aSYmaS0tOzspe2Zvcih2YXIgZz0wOzI+ZztnKyspaWYobnVsbD09dGhpcy5tb2R1bGVzW2JdW2ktZ10pe3ZhciBuPSExO2Y8YS5sZW5ndGgmJihuPTE9PShhW2ZdPj4+ZSYxKSk7ai5nZXRNYXNrKGMsYixpLWcpJiYobj0hbik7dGhpcy5tb2R1bGVzW2JdW2ktZ109bjtlLS07IC0xPT1lJiYoZisrLGU9Nyl9Yis9ZDtpZigwPmJ8fHRoaXMubW9kdWxlQ291bnQ8PWIpe2ItPWQ7ZD0tZDticmVha319fX07by5QQUQwPTIzNjtvLlBBRDE9MTc7by5jcmVhdGVEYXRhPWZ1bmN0aW9uKGEsYyxkKXtmb3IodmFyIGM9cC5nZXRSU0Jsb2NrcyhhLApjKSxiPW5ldyB0LGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9ZFtlXTtiLnB1dChmLm1vZGUsNCk7Yi5wdXQoZi5nZXRMZW5ndGgoKSxqLmdldExlbmd0aEluQml0cyhmLm1vZGUsYSkpO2Yud3JpdGUoYil9Zm9yKGU9YT0wO2U8Yy5sZW5ndGg7ZSsrKWErPWNbZV0uZGF0YUNvdW50O2lmKGIuZ2V0TGVuZ3RoSW5CaXRzKCk+OCphKXRocm93IEVycm9yKCJjb2RlIGxlbmd0aCBvdmVyZmxvdy4gKCIrYi5nZXRMZW5ndGhJbkJpdHMoKSsiPiIrOCphKyIpIik7Zm9yKGIuZ2V0TGVuZ3RoSW5CaXRzKCkrNDw9OCphJiZiLnB1dCgwLDQpOzAhPWIuZ2V0TGVuZ3RoSW5CaXRzKCklODspYi5wdXRCaXQoITEpO2Zvcig7IShiLmdldExlbmd0aEluQml0cygpPj04KmEpOyl7Yi5wdXQoby5QQUQwLDgpO2lmKGIuZ2V0TGVuZ3RoSW5CaXRzKCk+PTgqYSlicmVhaztiLnB1dChvLlBBRDEsOCl9cmV0dXJuIG8uY3JlYXRlQnl0ZXMoYixjKX07by5jcmVhdGVCeXRlcz1mdW5jdGlvbihhLGMpe2Zvcih2YXIgZD0KMCxiPTAsZT0wLGY9QXJyYXkoYy5sZW5ndGgpLGk9QXJyYXkoYy5sZW5ndGgpLGc9MDtnPGMubGVuZ3RoO2crKyl7dmFyIG49Y1tnXS5kYXRhQ291bnQsaD1jW2ddLnRvdGFsQ291bnQtbixiPU1hdGgubWF4KGIsbiksZT1NYXRoLm1heChlLGgpO2ZbZ109QXJyYXkobik7Zm9yKHZhciBrPTA7azxmW2ddLmxlbmd0aDtrKyspZltnXVtrXT0yNTUmYS5idWZmZXJbaytkXTtkKz1uO2s9ai5nZXRFcnJvckNvcnJlY3RQb2x5bm9taWFsKGgpO249KG5ldyBxKGZbZ10say5nZXRMZW5ndGgoKS0xKSkubW9kKGspO2lbZ109QXJyYXkoay5nZXRMZW5ndGgoKS0xKTtmb3Ioaz0wO2s8aVtnXS5sZW5ndGg7aysrKWg9aytuLmdldExlbmd0aCgpLWlbZ10ubGVuZ3RoLGlbZ11ba109MDw9aD9uLmdldChoKTowfWZvcihrPWc9MDtrPGMubGVuZ3RoO2srKylnKz1jW2tdLnRvdGFsQ291bnQ7ZD1BcnJheShnKTtmb3Ioaz1uPTA7azxiO2srKylmb3IoZz0wO2c8Yy5sZW5ndGg7ZysrKWs8ZltnXS5sZW5ndGgmJgooZFtuKytdPWZbZ11ba10pO2ZvcihrPTA7azxlO2srKylmb3IoZz0wO2c8Yy5sZW5ndGg7ZysrKWs8aVtnXS5sZW5ndGgmJihkW24rK109aVtnXVtrXSk7cmV0dXJuIGR9O3M9NDtmb3IodmFyIGo9e1BBVFRFUk5fUE9TSVRJT05fVEFCTEU6W1tdLFs2LDE4XSxbNiwyMl0sWzYsMjZdLFs2LDMwXSxbNiwzNF0sWzYsMjIsMzhdLFs2LDI0LDQyXSxbNiwyNiw0Nl0sWzYsMjgsNTBdLFs2LDMwLDU0XSxbNiwzMiw1OF0sWzYsMzQsNjJdLFs2LDI2LDQ2LDY2XSxbNiwyNiw0OCw3MF0sWzYsMjYsNTAsNzRdLFs2LDMwLDU0LDc4XSxbNiwzMCw1Niw4Ml0sWzYsMzAsNTgsODZdLFs2LDM0LDYyLDkwXSxbNiwyOCw1MCw3Miw5NF0sWzYsMjYsNTAsNzQsOThdLFs2LDMwLDU0LDc4LDEwMl0sWzYsMjgsNTQsODAsMTA2XSxbNiwzMiw1OCw4NCwxMTBdLFs2LDMwLDU4LDg2LDExNF0sWzYsMzQsNjIsOTAsMTE4XSxbNiwyNiw1MCw3NCw5OCwxMjJdLFs2LDMwLDU0LDc4LDEwMiwxMjZdLFs2LDI2LDUyLAo3OCwxMDQsMTMwXSxbNiwzMCw1Niw4MiwxMDgsMTM0XSxbNiwzNCw2MCw4NiwxMTIsMTM4XSxbNiwzMCw1OCw4NiwxMTQsMTQyXSxbNiwzNCw2Miw5MCwxMTgsMTQ2XSxbNiwzMCw1NCw3OCwxMDIsMTI2LDE1MF0sWzYsMjQsNTAsNzYsMTAyLDEyOCwxNTRdLFs2LDI4LDU0LDgwLDEwNiwxMzIsMTU4XSxbNiwzMiw1OCw4NCwxMTAsMTM2LDE2Ml0sWzYsMjYsNTQsODIsMTEwLDEzOCwxNjZdLFs2LDMwLDU4LDg2LDExNCwxNDIsMTcwXV0sRzE1OjEzMzUsRzE4Ojc5NzMsRzE1X01BU0s6MjE1MjIsZ2V0QkNIVHlwZUluZm86ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWE8PDEwOzA8PWouZ2V0QkNIRGlnaXQoYyktai5nZXRCQ0hEaWdpdChqLkcxNSk7KWNePWouRzE1PDxqLmdldEJDSERpZ2l0KGMpLWouZ2V0QkNIRGlnaXQoai5HMTUpO3JldHVybihhPDwxMHxjKV5qLkcxNV9NQVNLfSxnZXRCQ0hUeXBlTnVtYmVyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1hPDwxMjswPD1qLmdldEJDSERpZ2l0KGMpLQpqLmdldEJDSERpZ2l0KGouRzE4KTspY149ai5HMTg8PGouZ2V0QkNIRGlnaXQoYyktai5nZXRCQ0hEaWdpdChqLkcxOCk7cmV0dXJuIGE8PDEyfGN9LGdldEJDSERpZ2l0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wOzAhPWE7KWMrKyxhPj4+PTE7cmV0dXJuIGN9LGdldFBhdHRlcm5Qb3NpdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4gai5QQVRURVJOX1BPU0lUSU9OX1RBQkxFW2EtMV19LGdldE1hc2s6ZnVuY3Rpb24oYSxjLGQpe3N3aXRjaChhKXtjYXNlIDA6cmV0dXJuIDA9PShjK2QpJTI7Y2FzZSAxOnJldHVybiAwPT1jJTI7Y2FzZSAyOnJldHVybiAwPT1kJTM7Y2FzZSAzOnJldHVybiAwPT0oYytkKSUzO2Nhc2UgNDpyZXR1cm4gMD09KE1hdGguZmxvb3IoYy8yKStNYXRoLmZsb29yKGQvMykpJTI7Y2FzZSA1OnJldHVybiAwPT1jKmQlMitjKmQlMztjYXNlIDY6cmV0dXJuIDA9PShjKmQlMitjKmQlMyklMjtjYXNlIDc6cmV0dXJuIDA9PShjKmQlMysoYytkKSUyKSUyO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImJhZCBtYXNrUGF0dGVybjoiKwphKTt9fSxnZXRFcnJvckNvcnJlY3RQb2x5bm9taWFsOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1uZXcgcShbMV0sMCksZD0wO2Q8YTtkKyspYz1jLm11bHRpcGx5KG5ldyBxKFsxLGwuZ2V4cChkKV0sMCkpO3JldHVybiBjfSxnZXRMZW5ndGhJbkJpdHM6ZnVuY3Rpb24oYSxjKXtpZigxPD1jJiYxMD5jKXN3aXRjaChhKXtjYXNlIDE6cmV0dXJuIDEwO2Nhc2UgMjpyZXR1cm4gOTtjYXNlIHM6cmV0dXJuIDg7Y2FzZSA4OnJldHVybiA4O2RlZmF1bHQ6dGhyb3cgRXJyb3IoIm1vZGU6IithKTt9ZWxzZSBpZigyNz5jKXN3aXRjaChhKXtjYXNlIDE6cmV0dXJuIDEyO2Nhc2UgMjpyZXR1cm4gMTE7Y2FzZSBzOnJldHVybiAxNjtjYXNlIDg6cmV0dXJuIDEwO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIm1vZGU6IithKTt9ZWxzZSBpZig0MT5jKXN3aXRjaChhKXtjYXNlIDE6cmV0dXJuIDE0O2Nhc2UgMjpyZXR1cm4gMTM7Y2FzZSBzOnJldHVybiAxNjtjYXNlIDg6cmV0dXJuIDEyO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIm1vZGU6IisKYSk7fWVsc2UgdGhyb3cgRXJyb3IoInR5cGU6IitjKTt9LGdldExvc3RQb2ludDpmdW5jdGlvbihhKXtmb3IodmFyIGM9YS5nZXRNb2R1bGVDb3VudCgpLGQ9MCxiPTA7YjxjO2IrKylmb3IodmFyIGU9MDtlPGM7ZSsrKXtmb3IodmFyIGY9MCxpPWEuaXNEYXJrKGIsZSksZz0tMTsxPj1nO2crKylpZighKDA+YitnfHxjPD1iK2cpKWZvcih2YXIgaD0tMTsxPj1oO2grKykwPmUraHx8Yzw9ZStofHwwPT1nJiYwPT1ofHxpPT1hLmlzRGFyayhiK2csZStoKSYmZisrOzU8ZiYmKGQrPTMrZi01KX1mb3IoYj0wO2I8Yy0xO2IrKylmb3IoZT0wO2U8Yy0xO2UrKylpZihmPTAsYS5pc0RhcmsoYixlKSYmZisrLGEuaXNEYXJrKGIrMSxlKSYmZisrLGEuaXNEYXJrKGIsZSsxKSYmZisrLGEuaXNEYXJrKGIrMSxlKzEpJiZmKyssMD09Znx8ND09ZilkKz0zO2ZvcihiPTA7YjxjO2IrKylmb3IoZT0wO2U8Yy02O2UrKylhLmlzRGFyayhiLGUpJiYhYS5pc0RhcmsoYixlKzEpJiZhLmlzRGFyayhiLGUrCjIpJiZhLmlzRGFyayhiLGUrMykmJmEuaXNEYXJrKGIsZSs0KSYmIWEuaXNEYXJrKGIsZSs1KSYmYS5pc0RhcmsoYixlKzYpJiYoZCs9NDApO2ZvcihlPTA7ZTxjO2UrKylmb3IoYj0wO2I8Yy02O2IrKylhLmlzRGFyayhiLGUpJiYhYS5pc0RhcmsoYisxLGUpJiZhLmlzRGFyayhiKzIsZSkmJmEuaXNEYXJrKGIrMyxlKSYmYS5pc0RhcmsoYis0LGUpJiYhYS5pc0RhcmsoYis1LGUpJiZhLmlzRGFyayhiKzYsZSkmJihkKz00MCk7Zm9yKGU9Zj0wO2U8YztlKyspZm9yKGI9MDtiPGM7YisrKWEuaXNEYXJrKGIsZSkmJmYrKzthPU1hdGguYWJzKDEwMCpmL2MvYy01MCkvNTtyZXR1cm4gZCsxMCphfX0sbD17Z2xvZzpmdW5jdGlvbihhKXtpZigxPmEpdGhyb3cgRXJyb3IoImdsb2coIithKyIpIik7cmV0dXJuIGwuTE9HX1RBQkxFW2FdfSxnZXhwOmZ1bmN0aW9uKGEpe2Zvcig7MD5hOylhKz0yNTU7Zm9yKDsyNTY8PWE7KWEtPTI1NTtyZXR1cm4gbC5FWFBfVEFCTEVbYV19LEVYUF9UQUJMRTpBcnJheSgyNTYpLApMT0dfVEFCTEU6QXJyYXkoMjU2KX0sbT0wOzg+bTttKyspbC5FWFBfVEFCTEVbbV09MTw8bTtmb3IobT04OzI1Nj5tO20rKylsLkVYUF9UQUJMRVttXT1sLkVYUF9UQUJMRVttLTRdXmwuRVhQX1RBQkxFW20tNV1ebC5FWFBfVEFCTEVbbS02XV5sLkVYUF9UQUJMRVttLThdO2ZvcihtPTA7MjU1Pm07bSsrKWwuTE9HX1RBQkxFW2wuRVhQX1RBQkxFW21dXT1tO3EucHJvdG90eXBlPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubnVtW2FdfSxnZXRMZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5udW0ubGVuZ3RofSxtdWx0aXBseTpmdW5jdGlvbihhKXtmb3IodmFyIGM9QXJyYXkodGhpcy5nZXRMZW5ndGgoKSthLmdldExlbmd0aCgpLTEpLGQ9MDtkPHRoaXMuZ2V0TGVuZ3RoKCk7ZCsrKWZvcih2YXIgYj0wO2I8YS5nZXRMZW5ndGgoKTtiKyspY1tkK2JdXj1sLmdleHAobC5nbG9nKHRoaXMuZ2V0KGQpKStsLmdsb2coYS5nZXQoYikpKTtyZXR1cm4gbmV3IHEoYywwKX0sbW9kOmZ1bmN0aW9uKGEpe2lmKDA+CnRoaXMuZ2V0TGVuZ3RoKCktYS5nZXRMZW5ndGgoKSlyZXR1cm4gdGhpcztmb3IodmFyIGM9bC5nbG9nKHRoaXMuZ2V0KDApKS1sLmdsb2coYS5nZXQoMCkpLGQ9QXJyYXkodGhpcy5nZXRMZW5ndGgoKSksYj0wO2I8dGhpcy5nZXRMZW5ndGgoKTtiKyspZFtiXT10aGlzLmdldChiKTtmb3IoYj0wO2I8YS5nZXRMZW5ndGgoKTtiKyspZFtiXV49bC5nZXhwKGwuZ2xvZyhhLmdldChiKSkrYyk7cmV0dXJuKG5ldyBxKGQsMCkpLm1vZChhKX19O3AuUlNfQkxPQ0tfVEFCTEU9W1sxLDI2LDE5XSxbMSwyNiwxNl0sWzEsMjYsMTNdLFsxLDI2LDldLFsxLDQ0LDM0XSxbMSw0NCwyOF0sWzEsNDQsMjJdLFsxLDQ0LDE2XSxbMSw3MCw1NV0sWzEsNzAsNDRdLFsyLDM1LDE3XSxbMiwzNSwxM10sWzEsMTAwLDgwXSxbMiw1MCwzMl0sWzIsNTAsMjRdLFs0LDI1LDldLFsxLDEzNCwxMDhdLFsyLDY3LDQzXSxbMiwzMywxNSwyLDM0LDE2XSxbMiwzMywxMSwyLDM0LDEyXSxbMiw4Niw2OF0sWzQsNDMsMjddLApbNCw0MywxOV0sWzQsNDMsMTVdLFsyLDk4LDc4XSxbNCw0OSwzMV0sWzIsMzIsMTQsNCwzMywxNV0sWzQsMzksMTMsMSw0MCwxNF0sWzIsMTIxLDk3XSxbMiw2MCwzOCwyLDYxLDM5XSxbNCw0MCwxOCwyLDQxLDE5XSxbNCw0MCwxNCwyLDQxLDE1XSxbMiwxNDYsMTE2XSxbMyw1OCwzNiwyLDU5LDM3XSxbNCwzNiwxNiw0LDM3LDE3XSxbNCwzNiwxMiw0LDM3LDEzXSxbMiw4Niw2OCwyLDg3LDY5XSxbNCw2OSw0MywxLDcwLDQ0XSxbNiw0MywxOSwyLDQ0LDIwXSxbNiw0MywxNSwyLDQ0LDE2XSxbNCwxMDEsODFdLFsxLDgwLDUwLDQsODEsNTFdLFs0LDUwLDIyLDQsNTEsMjNdLFszLDM2LDEyLDgsMzcsMTNdLFsyLDExNiw5MiwyLDExNyw5M10sWzYsNTgsMzYsMiw1OSwzN10sWzQsNDYsMjAsNiw0NywyMV0sWzcsNDIsMTQsNCw0MywxNV0sWzQsMTMzLDEwN10sWzgsNTksMzcsMSw2MCwzOF0sWzgsNDQsMjAsNCw0NSwyMV0sWzEyLDMzLDExLDQsMzQsMTJdLFszLDE0NSwxMTUsMSwxNDYsCjExNl0sWzQsNjQsNDAsNSw2NSw0MV0sWzExLDM2LDE2LDUsMzcsMTddLFsxMSwzNiwxMiw1LDM3LDEzXSxbNSwxMDksODcsMSwxMTAsODhdLFs1LDY1LDQxLDUsNjYsNDJdLFs1LDU0LDI0LDcsNTUsMjVdLFsxMSwzNiwxMl0sWzUsMTIyLDk4LDEsMTIzLDk5XSxbNyw3Myw0NSwzLDc0LDQ2XSxbMTUsNDMsMTksMiw0NCwyMF0sWzMsNDUsMTUsMTMsNDYsMTZdLFsxLDEzNSwxMDcsNSwxMzYsMTA4XSxbMTAsNzQsNDYsMSw3NSw0N10sWzEsNTAsMjIsMTUsNTEsMjNdLFsyLDQyLDE0LDE3LDQzLDE1XSxbNSwxNTAsMTIwLDEsMTUxLDEyMV0sWzksNjksNDMsNCw3MCw0NF0sWzE3LDUwLDIyLDEsNTEsMjNdLFsyLDQyLDE0LDE5LDQzLDE1XSxbMywxNDEsMTEzLDQsMTQyLDExNF0sWzMsNzAsNDQsMTEsNzEsNDVdLFsxNyw0NywyMSw0LDQ4LDIyXSxbOSwzOSwxMywxNiw0MCwxNF0sWzMsMTM1LDEwNyw1LDEzNiwxMDhdLFszLDY3LDQxLDEzLDY4LDQyXSxbMTUsNTQsMjQsNSw1NSwyNV0sWzE1LAo0MywxNSwxMCw0NCwxNl0sWzQsMTQ0LDExNiw0LDE0NSwxMTddLFsxNyw2OCw0Ml0sWzE3LDUwLDIyLDYsNTEsMjNdLFsxOSw0NiwxNiw2LDQ3LDE3XSxbMiwxMzksMTExLDcsMTQwLDExMl0sWzE3LDc0LDQ2XSxbNyw1NCwyNCwxNiw1NSwyNV0sWzM0LDM3LDEzXSxbNCwxNTEsMTIxLDUsMTUyLDEyMl0sWzQsNzUsNDcsMTQsNzYsNDhdLFsxMSw1NCwyNCwxNCw1NSwyNV0sWzE2LDQ1LDE1LDE0LDQ2LDE2XSxbNiwxNDcsMTE3LDQsMTQ4LDExOF0sWzYsNzMsNDUsMTQsNzQsNDZdLFsxMSw1NCwyNCwxNiw1NSwyNV0sWzMwLDQ2LDE2LDIsNDcsMTddLFs4LDEzMiwxMDYsNCwxMzMsMTA3XSxbOCw3NSw0NywxMyw3Niw0OF0sWzcsNTQsMjQsMjIsNTUsMjVdLFsyMiw0NSwxNSwxMyw0NiwxNl0sWzEwLDE0MiwxMTQsMiwxNDMsMTE1XSxbMTksNzQsNDYsNCw3NSw0N10sWzI4LDUwLDIyLDYsNTEsMjNdLFszMyw0NiwxNiw0LDQ3LDE3XSxbOCwxNTIsMTIyLDQsMTUzLDEyM10sWzIyLDczLDQ1LAozLDc0LDQ2XSxbOCw1MywyMywyNiw1NCwyNF0sWzEyLDQ1LDE1LDI4LDQ2LDE2XSxbMywxNDcsMTE3LDEwLDE0OCwxMThdLFszLDczLDQ1LDIzLDc0LDQ2XSxbNCw1NCwyNCwzMSw1NSwyNV0sWzExLDQ1LDE1LDMxLDQ2LDE2XSxbNywxNDYsMTE2LDcsMTQ3LDExN10sWzIxLDczLDQ1LDcsNzQsNDZdLFsxLDUzLDIzLDM3LDU0LDI0XSxbMTksNDUsMTUsMjYsNDYsMTZdLFs1LDE0NSwxMTUsMTAsMTQ2LDExNl0sWzE5LDc1LDQ3LDEwLDc2LDQ4XSxbMTUsNTQsMjQsMjUsNTUsMjVdLFsyMyw0NSwxNSwyNSw0NiwxNl0sWzEzLDE0NSwxMTUsMywxNDYsMTE2XSxbMiw3NCw0NiwyOSw3NSw0N10sWzQyLDU0LDI0LDEsNTUsMjVdLFsyMyw0NSwxNSwyOCw0NiwxNl0sWzE3LDE0NSwxMTVdLFsxMCw3NCw0NiwyMyw3NSw0N10sWzEwLDU0LDI0LDM1LDU1LDI1XSxbMTksNDUsMTUsMzUsNDYsMTZdLFsxNywxNDUsMTE1LDEsMTQ2LDExNl0sWzE0LDc0LDQ2LDIxLDc1LDQ3XSxbMjksNTQsMjQsMTksCjU1LDI1XSxbMTEsNDUsMTUsNDYsNDYsMTZdLFsxMywxNDUsMTE1LDYsMTQ2LDExNl0sWzE0LDc0LDQ2LDIzLDc1LDQ3XSxbNDQsNTQsMjQsNyw1NSwyNV0sWzU5LDQ2LDE2LDEsNDcsMTddLFsxMiwxNTEsMTIxLDcsMTUyLDEyMl0sWzEyLDc1LDQ3LDI2LDc2LDQ4XSxbMzksNTQsMjQsMTQsNTUsMjVdLFsyMiw0NSwxNSw0MSw0NiwxNl0sWzYsMTUxLDEyMSwxNCwxNTIsMTIyXSxbNiw3NSw0NywzNCw3Niw0OF0sWzQ2LDU0LDI0LDEwLDU1LDI1XSxbMiw0NSwxNSw2NCw0NiwxNl0sWzE3LDE1MiwxMjIsNCwxNTMsMTIzXSxbMjksNzQsNDYsMTQsNzUsNDddLFs0OSw1NCwyNCwxMCw1NSwyNV0sWzI0LDQ1LDE1LDQ2LDQ2LDE2XSxbNCwxNTIsMTIyLDE4LDE1MywxMjNdLFsxMyw3NCw0NiwzMiw3NSw0N10sWzQ4LDU0LDI0LDE0LDU1LDI1XSxbNDIsNDUsMTUsMzIsNDYsMTZdLFsyMCwxNDcsMTE3LDQsMTQ4LDExOF0sWzQwLDc1LDQ3LDcsNzYsNDhdLFs0Myw1NCwyNCwyMiw1NSwyNV0sWzEwLAo0NSwxNSw2Nyw0NiwxNl0sWzE5LDE0OCwxMTgsNiwxNDksMTE5XSxbMTgsNzUsNDcsMzEsNzYsNDhdLFszNCw1NCwyNCwzNCw1NSwyNV0sWzIwLDQ1LDE1LDYxLDQ2LDE2XV07cC5nZXRSU0Jsb2Nrcz1mdW5jdGlvbihhLGMpe3ZhciBkPXAuZ2V0UnNCbG9ja1RhYmxlKGEsYyk7aWYodm9pZCAwPT1kKXRocm93IEVycm9yKCJiYWQgcnMgYmxvY2sgQCB0eXBlTnVtYmVyOiIrYSsiL2Vycm9yQ29ycmVjdExldmVsOiIrYyk7Zm9yKHZhciBiPWQubGVuZ3RoLzMsZT1bXSxmPTA7ZjxiO2YrKylmb3IodmFyIGg9ZFszKmYrMF0sZz1kWzMqZisxXSxqPWRbMypmKzJdLGw9MDtsPGg7bCsrKWUucHVzaChuZXcgcChnLGopKTtyZXR1cm4gZX07cC5nZXRSc0Jsb2NrVGFibGU9ZnVuY3Rpb24oYSxjKXtzd2l0Y2goYyl7Y2FzZSAxOnJldHVybiBwLlJTX0JMT0NLX1RBQkxFWzQqKGEtMSkrMF07Y2FzZSAwOnJldHVybiBwLlJTX0JMT0NLX1RBQkxFWzQqKGEtMSkrMV07Y2FzZSAzOnJldHVybiBwLlJTX0JMT0NLX1RBQkxFWzQqCihhLTEpKzJdO2Nhc2UgMjpyZXR1cm4gcC5SU19CTE9DS19UQUJMRVs0KihhLTEpKzNdfX07dC5wcm90b3R5cGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gMT09KHRoaXMuYnVmZmVyW01hdGguZmxvb3IoYS84KV0+Pj43LWElOCYxKX0scHV0OmZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBkPTA7ZDxjO2QrKyl0aGlzLnB1dEJpdCgxPT0oYT4+PmMtZC0xJjEpKX0sZ2V0TGVuZ3RoSW5CaXRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSxwdXRCaXQ6ZnVuY3Rpb24oYSl7dmFyIGM9TWF0aC5mbG9vcih0aGlzLmxlbmd0aC84KTt0aGlzLmJ1ZmZlci5sZW5ndGg8PWMmJnRoaXMuYnVmZmVyLnB1c2goMCk7YSYmKHRoaXMuYnVmZmVyW2NdfD0xMjg+Pj50aGlzLmxlbmd0aCU4KTt0aGlzLmxlbmd0aCsrfX07InN0cmluZyI9PT10eXBlb2YgaCYmKGg9e3RleHQ6aH0pO2g9ci5leHRlbmQoe30se3JlbmRlcjoiY2FudmFzIix3aWR0aDoyNTYsaGVpZ2h0OjI1Nix0eXBlTnVtYmVyOi0xLApjb3JyZWN0TGV2ZWw6MixiYWNrZ3JvdW5kOiIjZmZmZmZmIixmb3JlZ3JvdW5kOiIjMDAwMDAwIn0saCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBhO2lmKCJjYW52YXMiPT1oLnJlbmRlcil7YT1uZXcgbyhoLnR5cGVOdW1iZXIsaC5jb3JyZWN0TGV2ZWwpO2EuYWRkRGF0YShoLnRleHQpO2EubWFrZSgpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2Mud2lkdGg9aC53aWR0aDtjLmhlaWdodD1oLmhlaWdodDtmb3IodmFyIGQ9Yy5nZXRDb250ZXh0KCIyZCIpLGI9aC53aWR0aC9hLmdldE1vZHVsZUNvdW50KCksZT1oLmhlaWdodC9hLmdldE1vZHVsZUNvdW50KCksZj0wO2Y8YS5nZXRNb2R1bGVDb3VudCgpO2YrKylmb3IodmFyIGk9MDtpPGEuZ2V0TW9kdWxlQ291bnQoKTtpKyspe2QuZmlsbFN0eWxlPWEuaXNEYXJrKGYsaSk/aC5mb3JlZ3JvdW5kOmguYmFja2dyb3VuZDt2YXIgZz1NYXRoLmNlaWwoKGkrMSkqYiktTWF0aC5mbG9vcihpKmIpLApqPU1hdGguY2VpbCgoZisxKSpiKS1NYXRoLmZsb29yKGYqYik7ZC5maWxsUmVjdChNYXRoLnJvdW5kKGkqYiksTWF0aC5yb3VuZChmKmUpLGcsail9fWVsc2V7YT1uZXcgbyhoLnR5cGVOdW1iZXIsaC5jb3JyZWN0TGV2ZWwpO2EuYWRkRGF0YShoLnRleHQpO2EubWFrZSgpO2M9cigiPHRhYmxlPjwvdGFibGU+IikuY3NzKCJ3aWR0aCIsaC53aWR0aCsicHgiKS5jc3MoImhlaWdodCIsaC5oZWlnaHQrInB4IikuY3NzKCJib3JkZXIiLCIwcHgiKS5jc3MoImJvcmRlci1jb2xsYXBzZSIsImNvbGxhcHNlIikuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIixoLmJhY2tncm91bmQpO2Q9aC53aWR0aC9hLmdldE1vZHVsZUNvdW50KCk7Yj1oLmhlaWdodC9hLmdldE1vZHVsZUNvdW50KCk7Zm9yKGU9MDtlPGEuZ2V0TW9kdWxlQ291bnQoKTtlKyspe2Y9cigiPHRyPjwvdHI+IikuY3NzKCJoZWlnaHQiLGIrInB4IikuYXBwZW5kVG8oYyk7Zm9yKGk9MDtpPGEuZ2V0TW9kdWxlQ291bnQoKTtpKyspcigiPHRkPjwvdGQ+IikuY3NzKCJ3aWR0aCIsCmQrInB4IikuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIixhLmlzRGFyayhlLGkpP2guZm9yZWdyb3VuZDpoLmJhY2tncm91bmQpLmFwcGVuZFRvKGYpfX1hPWM7alF1ZXJ5KGEpLmFwcGVuZFRvKHRoaXMpfSl9fSkoalF1ZXJ5KTsK"},{"meta":{"name":"apexcharts.min.js","url":"https://cdn.bootcdn.net/ajax/libs/apexcharts/3.9.0/apexcharts.min.js","ts":1654514782980,"mimetype":"text/javascript"},"source":"LyohCiAqIEFwZXhDaGFydHMgdjMuOS4wCiAqIChjKSAyMDE4LTIwMTkgSnVuZWQgQ2hoaXBhCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KICovCiFmdW5jdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGUpOih0PXR8fHNlbGYpLkFwZXhDaGFydHM9ZSgpfSh0aGlzLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuKHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIHR9KShlKX1mdW5jdGlvbiBlKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaSh0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgcz1lW2ldO3MuZW51bWVyYWJsZT1zLmVudW1lcmFibGV8fCExLHMuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBzJiYocy53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQscy5rZXkscyl9fWZ1bmN0aW9uIHModCxlLHMpe3JldHVybiBlJiZpKHQucHJvdG90eXBlLGUpLHMmJmkodCxzKSx0fWZ1bmN0aW9uIGEodCxlLGkpe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6aSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09aSx0fWZ1bmN0aW9uIG4odCxlKXt2YXIgaT1PYmplY3Qua2V5cyh0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO2UmJihzPXMuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSxpLnB1c2guYXBwbHkoaSxzKX1yZXR1cm4gaX1mdW5jdGlvbiByKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBpPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e307ZSUyP24oaSwhMCkuZm9yRWFjaChmdW5jdGlvbihlKXthKHQsZSxpW2VdKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoaSkpOm4oaSkuZm9yRWFjaChmdW5jdGlvbihlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxlKSl9KX1yZXR1cm4gdH1mdW5jdGlvbiBvKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJmgodCxlKX1mdW5jdGlvbiBsKHQpe3JldHVybihsPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YodCl9KSh0KX1mdW5jdGlvbiBoKHQsZSl7cmV0dXJuKGg9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIGModCxlKXtyZXR1cm4hZXx8Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT9mdW5jdGlvbih0KXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIHR9KHQpOmV9ZnVuY3Rpb24gZCh0KXtyZXR1cm4gZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHZhciBlPTAsaT1uZXcgQXJyYXkodC5sZW5ndGgpO2U8dC5sZW5ndGg7ZSsrKWlbZV09dFtlXTtyZXR1cm4gaX19KHQpfHxmdW5jdGlvbih0KXtpZihTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpfHwiW29iamVjdCBBcmd1bWVudHNdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSlyZXR1cm4gQXJyYXkuZnJvbSh0KX0odCl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UiKX0oKX12YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIGkoKXtlKHRoaXMsaSl9cmV0dXJuIHMoaSxbe2tleToic2hhZGVSR0JDb2xvciIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLnNwbGl0KCIsIikscz10PDA/MDoyNTUsYT10PDA/LTEqdDp0LG49cGFyc2VJbnQoaVswXS5zbGljZSg0KSkscj1wYXJzZUludChpWzFdKSxvPXBhcnNlSW50KGlbMl0pO3JldHVybiJyZ2IoIisoTWF0aC5yb3VuZCgocy1uKSphKStuKSsiLCIrKE1hdGgucm91bmQoKHMtcikqYSkrcikrIiwiKyhNYXRoLnJvdW5kKChzLW8pKmEpK28pKyIpIn19LHtrZXk6InNoYWRlSGV4Q29sb3IiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9cGFyc2VJbnQoZS5zbGljZSgxKSwxNikscz10PDA/MDoyNTUsYT10PDA/LTEqdDp0LG49aT4+MTYscj1pPj44JjI1NSxvPTI1NSZpO3JldHVybiIjIisoMTY3NzcyMTYrNjU1MzYqKE1hdGgucm91bmQoKHMtbikqYSkrbikrMjU2KihNYXRoLnJvdW5kKChzLXIpKmEpK3IpKyhNYXRoLnJvdW5kKChzLW8pKmEpK28pKS50b1N0cmluZygxNikuc2xpY2UoMSl9fSx7a2V5OiJzaGFkZUNvbG9yIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiBlLmxlbmd0aD43P3RoaXMuc2hhZGVSR0JDb2xvcih0LGUpOnRoaXMuc2hhZGVIZXhDb2xvcih0LGUpfX1dLFt7a2V5OiJiaW5kIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGUsYXJndW1lbnRzKX19fSx7a2V5OiJpc09iamVjdCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJvYmplY3QiPT09dChlKSYmIUFycmF5LmlzQXJyYXkoZSkmJm51bGwhPWV9fSx7a2V5OiJsaXN0VG9BcnJheSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsaT1bXTtmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKWlbZV09dFtlXTtyZXR1cm4gaX19LHtrZXk6ImV4dGVuZCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzOyJmdW5jdGlvbiIhPXR5cGVvZiBPYmplY3QuYXNzaWduJiYoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbih0KXtpZihudWxsPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCIpO2Zvcih2YXIgZT1PYmplY3QodCksaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzPWFyZ3VtZW50c1tpXTtpZihudWxsIT1zKWZvcih2YXIgYSBpbiBzKXMuaGFzT3duUHJvcGVydHkoYSkmJihlW2FdPXNbYV0pfXJldHVybiBlfSk7dmFyIHM9T2JqZWN0LmFzc2lnbih7fSx0KTtyZXR1cm4gdGhpcy5pc09iamVjdCh0KSYmdGhpcy5pc09iamVjdChlKSYmT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihuKXtpLmlzT2JqZWN0KGVbbl0pJiZuIGluIHQ/c1tuXT1pLmV4dGVuZCh0W25dLGVbbl0pOk9iamVjdC5hc3NpZ24ocyxhKHt9LG4sZVtuXSkpfSksc319LHtrZXk6ImV4dGVuZEFycmF5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBzPVtdO3JldHVybiB0Lm1hcChmdW5jdGlvbih0KXtzLnB1c2goaS5leHRlbmQoZSx0KSl9KSx0PXN9fSx7a2V5OiJtb250aE1vZCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHQlMTJ9fSx7a2V5OiJhZGRQcm9wcyIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpeyJzdHJpbmciPT10eXBlb2YgZSYmKGU9ZS5zcGxpdCgiLiIpKSx0W2VbMF1dPXRbZVswXV18fHt9O3ZhciBzPXRbZVswXV07cmV0dXJuIGUubGVuZ3RoPjE/KGUuc2hpZnQoKSx0aGlzLmFkZFByb3BzKHMsZSxpKSk6dFtlWzBdXT1pLHR9fSx7a2V5OiJjbG9uZSIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSl7Zm9yKHZhciBpPVtdLHM9MDtzPGUubGVuZ3RoO3MrKylpW3NdPXRoaXMuY2xvbmUoZVtzXSk7cmV0dXJuIGl9aWYoIm9iamVjdCI9PT10KGUpKXt2YXIgYT17fTtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYoYVtuXT10aGlzLmNsb25lKGVbbl0pKTtyZXR1cm4gYX1yZXR1cm4gZX19LHtrZXk6ImxvZzEwIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5MTjEwfX0se2tleToicm91bmRUb0Jhc2UxMCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2cxMCh0KSkpfX0se2tleToicm91bmRUb0Jhc2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgucG93KGUsTWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLmxvZyhlKSkpfX0se2tleToicGFyc2VOdW1iZXIiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dD90OnBhcnNlRmxvYXQodCl9fSx7a2V5OiJub0V4cG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKHQpLnNwbGl0KC9bZUVdLyk7aWYoMT09ZS5sZW5ndGgpcmV0dXJuIGVbMF07dmFyIGk9IiIscz10PDA/Ii0iOiIiLGE9ZVswXS5yZXBsYWNlKCIuIiwiIiksbj1OdW1iZXIoZVsxXSkrMTtpZihuPDApe2ZvcihpPXMrIjAuIjtuKys7KWkrPSIwIjtyZXR1cm4gaSthLnJlcGxhY2UoL15cLS8sIiIpfWZvcihuLT1hLmxlbmd0aDtuLS07KWkrPSIwIjtyZXR1cm4gYStpfX0se2tleToiZ2V0RGltZW5zaW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9Z2V0Q29tcHV0ZWRTdHlsZSh0KSxpPVtdLHM9dC5jbGllbnRIZWlnaHQsYT10LmNsaWVudFdpZHRoO3JldHVybiBzLT1wYXJzZUZsb2F0KGUucGFkZGluZ1RvcCkrcGFyc2VGbG9hdChlLnBhZGRpbmdCb3R0b20pLGEtPXBhcnNlRmxvYXQoZS5wYWRkaW5nTGVmdCkrcGFyc2VGbG9hdChlLnBhZGRpbmdSaWdodCksaS5wdXNoKGEpLGkucHVzaChzKSxpfX0se2tleToiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt0b3A6ZS50b3AscmlnaHQ6ZS5yaWdodCxib3R0b206ZS5ib3R0b20sbGVmdDplLmxlZnQsd2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHQseDplLngseTplLnl9fX0se2tleToiaGV4VG9SZ2JhIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXToiIzk5OTk5OSIsZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06LjY7IiMiIT09dC5zdWJzdHJpbmcoMCwxKSYmKHQ9IiM5OTk5OTkiKTt2YXIgaT10LnJlcGxhY2UoIiMiLCIiKTtpPWkubWF0Y2gobmV3IFJlZ0V4cCgiKC57IitpLmxlbmd0aC8zKyJ9KSIsImciKSk7Zm9yKHZhciBzPTA7czxpLmxlbmd0aDtzKyspaVtzXT1wYXJzZUludCgxPT09aVtzXS5sZW5ndGg/aVtzXStpW3NdOmlbc10sMTYpO3JldHVybiB2b2lkIDAhPT1lJiZpLnB1c2goZSksInJnYmEoIitpLmpvaW4oIiwiKSsiKSJ9fSx7a2V5OiJnZXRPcGFjaXR5RnJvbVJHQkEiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybih0PXQubWF0Y2goL15yZ2JhP1tccytdP1woW1xzK10/KFxkKylbXHMrXT8sW1xzK10/KFxkKylbXHMrXT8sW1xzK10/KFxkKylbXHMrXT8vaSkpWzNdfX0se2tleToicmdiMmhleCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9dC5tYXRjaCgvXnJnYmE/W1xzK10/XChbXHMrXT8oXGQrKVtccytdPyxbXHMrXT8oXGQrKVtccytdPyxbXHMrXT8oXGQrKVtccytdPy9pKSkmJjQ9PT10Lmxlbmd0aD8iIyIrKCIwIitwYXJzZUludCh0WzFdLDEwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKSsoIjAiK3BhcnNlSW50KHRbMl0sMTApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpKygiMCIrcGFyc2VJbnQodFszXSwxMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMik6IiJ9fSx7a2V5OiJpc0NvbG9ySGV4Iix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4vKF4jWzAtOUEtRl17Nn0kKXwoXiNbMC05QS1GXXszfSQpL2kudGVzdCh0KX19LHtrZXk6InBvbGFyVG9DYXJ0ZXNpYW4iLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLHMpe3ZhciBhPShzLTkwKSpNYXRoLlBJLzE4MDtyZXR1cm57eDp0K2kqTWF0aC5jb3MoYSkseTplK2kqTWF0aC5zaW4oYSl9fX0se2tleToiZXNjYXBlU3RyaW5nIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06IngiLGk9dC50b1N0cmluZygpLnNsaWNlKCk7cmV0dXJuIGk9aS5yZXBsYWNlKC9bYCB+IUAjJCVeJiooKV98K1wtPT87OiciLC48Plx7XH1cW1xdXFxcL10vZ2ksZSl9fSx7a2V5OiJuZWdUb1plcm8iLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0PDA/MDp0fX0se2tleToibW92ZUluZGV4SW5BcnJheSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe2lmKGk+PXQubGVuZ3RoKWZvcih2YXIgcz1pLXQubGVuZ3RoKzE7cy0tOyl0LnB1c2godm9pZCAwKTtyZXR1cm4gdC5zcGxpY2UoaSwwLHQuc3BsaWNlKGUsMSlbMF0pLHR9fSx7a2V5OiJleHRyYWN0TnVtYmVyIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VGbG9hdCh0LnJlcGxhY2UoL1teXGRcLl0qL2csIiIpKX19LHtrZXk6InJhbmRvbVN0cmluZyIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSIiLGk9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLHM9MDtzPHQ7cysrKWUrPWkuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSppLmxlbmd0aCkpO3JldHVybiBlfX0se2tleToiZmluZEFuY2VzdG9yIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcig7KHQ9dC5wYXJlbnRFbGVtZW50KSYmIXQuY2xhc3NMaXN0LmNvbnRhaW5zKGUpOyk7cmV0dXJuIHR9fSx7a2V5OiJzZXRFTHN0eWxlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGkgaW4gZSllLmhhc093blByb3BlcnR5KGkpJiYodC5zdHlsZS5rZXk9ZVtpXSl9fSx7a2V5OiJpc051bWJlciIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIWlzTmFOKHQpJiZwYXJzZUZsb2F0KE51bWJlcih0KSk9PT10JiYhaXNOYU4ocGFyc2VJbnQodCwxMCkpfX0se2tleToiaXNGbG9hdCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0KT09PXQmJnQlMSE9MH19LHtrZXk6ImlzU2FmYXJpIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybi9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl9fSx7a2V5OiJpc0ZpcmVmb3giLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJmaXJlZm94Iik+LTF9fSx7a2V5OiJpc0lFMTEiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoLTEhPT13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIil8fHdpbmRvdy5uYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCJUcmlkZW50LyIpPi0xKXJldHVybiEwfX0se2tleToiaXNJRSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD13aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxlPXQuaW5kZXhPZigiTVNJRSAiKTtpZihlPjApcmV0dXJuIHBhcnNlSW50KHQuc3Vic3RyaW5nKGUrNSx0LmluZGV4T2YoIi4iLGUpKSwxMCk7aWYodC5pbmRleE9mKCJUcmlkZW50LyIpPjApe3ZhciBpPXQuaW5kZXhPZigicnY6Iik7cmV0dXJuIHBhcnNlSW50KHQuc3Vic3RyaW5nKGkrMyx0LmluZGV4T2YoIi4iLGkpKSwxMCl9dmFyIHM9dC5pbmRleE9mKCJFZGdlLyIpO3JldHVybiBzPjAmJnBhcnNlSW50KHQuc3Vic3RyaW5nKHMrNSx0LmluZGV4T2YoIi4iLHMpKSwxMCl9fV0pLGl9KCksZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaSl7ZSh0aGlzLHQpLHRoaXMuY3R4PWksdGhpcy53PWkud31yZXR1cm4gcyh0LFt7a2V5OiJnZXREZWZhdWx0RmlsdGVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudzt0LnVuZmlsdGVyKCEwKSwobmV3IHdpbmRvdy5TVkcuRmlsdGVyKS5zaXplKCIxMjAlIiwiMTgwJSIsIi01JSIsIi00MCUiKSwibm9uZSIhPT1pLmNvbmZpZy5zdGF0ZXMubm9ybWFsLmZpbHRlcj90aGlzLmFwcGx5RmlsdGVyKHQsZSxpLmNvbmZpZy5zdGF0ZXMubm9ybWFsLmZpbHRlci50eXBlLGkuY29uZmlnLnN0YXRlcy5ub3JtYWwuZmlsdGVyLnZhbHVlKTppLmNvbmZpZy5jaGFydC5kcm9wU2hhZG93LmVuYWJsZWQmJnRoaXMuZHJvcFNoYWRvdyh0LGkuY29uZmlnLmNoYXJ0LmRyb3BTaGFkb3csZSl9fSx7a2V5OiJhZGROb3JtYWxGaWx0ZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53O2kuY29uZmlnLmNoYXJ0LmRyb3BTaGFkb3cuZW5hYmxlZCYmdGhpcy5kcm9wU2hhZG93KHQsaS5jb25maWcuY2hhcnQuZHJvcFNoYWRvdyxlKX19LHtrZXk6ImFkZExpZ2h0ZW5GaWx0ZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcz10aGlzLGE9dGhpcy53LG49aS5pbnRlbnNpdHk7aWYoIXUuaXNGaXJlZm94KCkpe3QudW5maWx0ZXIoITApO3ZhciByPW5ldyB3aW5kb3cuU1ZHLkZpbHRlcjtyLnNpemUoIjEyMCUiLCIxODAlIiwiLTUlIiwiLTQwJSIpLHQuZmlsdGVyKGZ1bmN0aW9uKHQpe3ZhciBpPWEuY29uZmlnLmNoYXJ0LmRyb3BTaGFkb3c7KHI9aS5lbmFibGVkP3MuYWRkU2hhZG93KHQsZSxpKTp0KS5jb21wb25lbnRUcmFuc2Zlcih7cmdiOnt0eXBlOiJsaW5lYXIiLHNsb3BlOjEuNSxpbnRlcmNlcHQ6bn19KX0pLHQuZmlsdGVyZXIubm9kZS5zZXRBdHRyaWJ1dGUoImZpbHRlclVuaXRzIiwidXNlclNwYWNlT25Vc2UiKX19fSx7a2V5OiJhZGREYXJrZW5GaWx0ZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcz10aGlzLGE9dGhpcy53LG49aS5pbnRlbnNpdHk7aWYoIXUuaXNGaXJlZm94KCkpe3QudW5maWx0ZXIoITApO3ZhciByPW5ldyB3aW5kb3cuU1ZHLkZpbHRlcjtyLnNpemUoIjEyMCUiLCIxODAlIiwiLTUlIiwiLTQwJSIpLHQuZmlsdGVyKGZ1bmN0aW9uKHQpe3ZhciBpPWEuY29uZmlnLmNoYXJ0LmRyb3BTaGFkb3c7KHI9aS5lbmFibGVkP3MuYWRkU2hhZG93KHQsZSxpKTp0KS5jb21wb25lbnRUcmFuc2Zlcih7cmdiOnt0eXBlOiJsaW5lYXIiLHNsb3BlOm59fSl9KSx0LmZpbHRlcmVyLm5vZGUuc2V0QXR0cmlidXRlKCJmaWx0ZXJVbml0cyIsInVzZXJTcGFjZU9uVXNlIil9fX0se2tleToiYXBwbHlGaWx0ZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106LjU7c3dpdGNoKGkpe2Nhc2Uibm9uZSI6dGhpcy5hZGROb3JtYWxGaWx0ZXIodCxlKTticmVhaztjYXNlImxpZ2h0ZW4iOnRoaXMuYWRkTGlnaHRlbkZpbHRlcih0LGUse2ludGVuc2l0eTpzfSk7YnJlYWs7Y2FzZSJkYXJrZW4iOnRoaXMuYWRkRGFya2VuRmlsdGVyKHQsZSx7aW50ZW5zaXR5OnN9KX19fSx7a2V5OiJhZGRTaGFkb3ciLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcz1pLmJsdXIsYT1pLnRvcCxuPWkubGVmdCxyPWkuY29sb3Isbz1pLm9wYWNpdHksbD10LmZsb29kKEFycmF5LmlzQXJyYXkocik/cltlXTpyLG8pLmNvbXBvc2l0ZSh0LnNvdXJjZUFscGhhLCJpbiIpLm9mZnNldChuLGEpLmdhdXNzaWFuQmx1cihzKS5tZXJnZSh0LnNvdXJjZSk7cmV0dXJuIHQuYmxlbmQodC5zb3VyY2UsbCl9fSx7a2V5OiJkcm9wU2hhZG93Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTowLHM9ZS50b3AsYT1lLmxlZnQsbj1lLmJsdXIscj1lLmNvbG9yLG89ZS5vcGFjaXR5LGw9ZS5ub1VzZXJTcGFjZU9uVXNlLGg9dGhpcy53O3JldHVybiB0LnVuZmlsdGVyKCEwKSx1LmlzSUUoKSYmInJhZGlhbEJhciI9PT1oLmNvbmZpZy5jaGFydC50eXBlP3Q6KHI9QXJyYXkuaXNBcnJheShyKT9yW2ldOnIsKG5ldyB3aW5kb3cuU1ZHLkZpbHRlcikuc2l6ZSgiMTIwJSIsIjE4MCUiLCItNSUiLCItNDAlIiksdC5maWx0ZXIoZnVuY3Rpb24odCl7dmFyIGU9bnVsbDtlPXUuaXNTYWZhcmkoKXx8dS5pc0ZpcmVmb3goKXx8dS5pc0lFKCk/dC5mbG9vZChyLG8pLmNvbXBvc2l0ZSh0LnNvdXJjZUFscGhhLCJpbiIpLm9mZnNldChhLHMpLmdhdXNzaWFuQmx1cihuKTp0LmZsb29kKHIsbykuY29tcG9zaXRlKHQuc291cmNlQWxwaGEsImluIikub2Zmc2V0KGEscykuZ2F1c3NpYW5CbHVyKG4pLm1lcmdlKHQuc291cmNlKSx0LmJsZW5kKHQuc291cmNlLGUpfSksbHx8dC5maWx0ZXJlci5ub2RlLnNldEF0dHJpYnV0ZSgiZmlsdGVyVW5pdHMiLCJ1c2VyU3BhY2VPblVzZSIpLHQpfX0se2tleToic2V0U2VsZWN0aW9uRmlsdGVyIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIHM9dGhpcy53O2lmKHZvaWQgMCE9PXMuZ2xvYmFscy5zZWxlY3RlZERhdGFQb2ludHNbZV0mJnMuZ2xvYmFscy5zZWxlY3RlZERhdGFQb2ludHNbZV0uaW5kZXhPZihpKT4tMSl7dC5ub2RlLnNldEF0dHJpYnV0ZSgic2VsZWN0ZWQiLCEwKTt2YXIgYT1zLmNvbmZpZy5zdGF0ZXMuYWN0aXZlLmZpbHRlcjsibm9uZSIhPT1hJiZ0aGlzLmFwcGx5RmlsdGVyKHQsZSxhLnR5cGUsYS52YWx1ZSl9fX1dKSx0fSgpLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGkpe2UodGhpcyx0KSx0aGlzLmN0eD1pLHRoaXMudz1pLncsdGhpcy5zZXRFYXNpbmdGdW5jdGlvbnMoKX1yZXR1cm4gcyh0LFt7a2V5OiJzZXRFYXNpbmdGdW5jdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7aWYoIXRoaXMudy5nbG9iYWxzLmVhc2luZyl7c3dpdGNoKHRoaXMudy5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5lYXNpbmcpe2Nhc2UibGluZWFyIjp0PSItIjticmVhaztjYXNlImVhc2VpbiI6dD0iPCI7YnJlYWs7Y2FzZSJlYXNlb3V0Ijp0PSI+IjticmVhaztjYXNlImVhc2Vpbm91dCI6dD0iPD4iO2JyZWFrO2Nhc2Uic3dpbmciOnQ9ZnVuY3Rpb24odCl7dmFyIGU9MS43MDE1ODtyZXR1cm4odC09MSkqdCooKGUrMSkqdCtlKSsxfTticmVhaztjYXNlImJvdW5jZSI6dD1mdW5jdGlvbih0KXtyZXR1cm4gdDwxLzIuNzU/Ny41NjI1KnQqdDp0PDIvMi43NT83LjU2MjUqKHQtPTEuNS8yLjc1KSp0Ky43NTp0PDIuNS8yLjc1PzcuNTYyNSoodC09Mi4yNS8yLjc1KSp0Ky45Mzc1OjcuNTYyNSoodC09Mi42MjUvMi43NSkqdCsuOTg0Mzc1fTticmVhaztjYXNlImVsYXN0aWMiOnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0hIXQ/dDpNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigodC0uMDc1KSooMipNYXRoLlBJKS8uMykrMX07YnJlYWs7ZGVmYXVsdDp0PSI8PiJ9dGhpcy53Lmdsb2JhbHMuZWFzaW5nPXR9fX0se2tleToiYW5pbWF0ZUxpbmUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLHMpe3QuYXR0cihlKS5hbmltYXRlKHMpLmF0dHIoaSl9fSx7a2V5OiJhbmltYXRlQ2lyY2xlUmFkaXVzIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxzLGEpe2V8fChlPTApLHQuYXR0cih7cjplfSkuYW5pbWF0ZShzLGEpLmF0dHIoe3I6aX0pfX0se2tleToiYW5pbWF0ZUNpcmNsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkscyxhKXt0LmF0dHIoe3I6ZS5yLGN4OmUuY3gsY3k6ZS5jeX0pLmFuaW1hdGUocyxhKS5hdHRyKHtyOmkucixjeDppLmN4LGN5OmkuY3l9KX19LHtrZXk6ImFuaW1hdGVSZWN0Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSxzLGEpe3QuYXR0cihlKS5hbmltYXRlKHMpLmF0dHIoaSkuYWZ0ZXJBbGwoZnVuY3Rpb24oKXthKCl9KX19LHtrZXk6ImFuaW1hdGVQYXRoc0dyYWR1YWxseSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dC5lbCxpPXQuaixzPXQucGF0aEZyb20sYT10LnBhdGhUbyxuPXQuc3BlZWQscj10LmRlbGF5LG89dC5zdHJva2VXaWR0aCxsPXRoaXMudyxoPTA7bC5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5hbmltYXRlR3JhZHVhbGx5LmVuYWJsZWQmJihoPWwuY29uZmlnLmNoYXJ0LmFuaW1hdGlvbnMuYW5pbWF0ZUdyYWR1YWxseS5kZWxheSksbC5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5keW5hbWljQW5pbWF0aW9uLmVuYWJsZWQmJmwuZ2xvYmFscy5kYXRhQ2hhbmdlZCYmKGg9MCksdGhpcy5tb3JwaFNWRyhlLGkscyxhLG4sbyxyKmgpfX0se2tleToic2hvd0RlbGF5ZWRFbGVtZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLncuZ2xvYmFscy5kZWxheWVkRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbih0KXt0LmVsLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpfSl9fSx7a2V5OiJhbmltYXRpb25Db21wbGV0ZWQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53O3QuZ2xvYmFscy5hbmltYXRpb25FbmRlZD0hMCwiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25maWcuY2hhcnQuZXZlbnRzLmFuaW1hdGlvbkVuZCYmdC5jb25maWcuY2hhcnQuZXZlbnRzLmFuaW1hdGlvbkVuZCh0aGlzLmN0eCx0KX19LHtrZXk6Im1vcnBoU1ZHIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxzLGEsbixyKXt2YXIgbz10aGlzLGw9dGhpcy53O2l8fChpPXQuYXR0cigicGF0aEZyb20iKSksc3x8KHM9dC5hdHRyKCJwYXRoVG8iKSksKCFpfHxpLmluZGV4T2YoInVuZGVmaW5lZCIpPi0xfHxpLmluZGV4T2YoIk5hTiIpPi0xKSYmKGk9Ik0gMCAiLmNvbmNhdChsLmdsb2JhbHMuZ3JpZEhlaWdodCksYT0xKSwocy5pbmRleE9mKCJ1bmRlZmluZWQiKT4tMXx8cy5pbmRleE9mKCJOYU4iKT4tMSkmJihzPSJNIDAgIi5jb25jYXQobC5nbG9iYWxzLmdyaWRIZWlnaHQpLGE9MSksbC5nbG9iYWxzLnNob3VsZEFuaW1hdGV8fChhPTEpLHQucGxvdChpKS5hbmltYXRlKDEsbC5nbG9iYWxzLmVhc2luZyxyKS5wbG90KGkpLmFuaW1hdGUoYSxsLmdsb2JhbHMuZWFzaW5nLHIpLnBsb3QocykuYWZ0ZXJBbGwoZnVuY3Rpb24oKXt1LmlzTnVtYmVyKGUpP2U9PT1sLmdsb2JhbHMuc2VyaWVzW2wuZ2xvYmFscy5tYXhWYWxzSW5BcnJheUluZGV4XS5sZW5ndGgtMiYmbC5nbG9iYWxzLnNob3VsZEFuaW1hdGUmJm8uYW5pbWF0aW9uQ29tcGxldGVkKCk6bC5nbG9iYWxzLnNob3VsZEFuaW1hdGUmJm8uYW5pbWF0aW9uQ29tcGxldGVkKCksby5zaG93RGVsYXllZEVsZW1lbnRzKCl9KX19XSksdH0oKSxwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy5jdHg9aSx0aGlzLnc9aS53fXJldHVybiBzKHQsW3trZXk6ImRyYXdMaW5lIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxzKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06IiNhOGE4YTgiLG49YXJndW1lbnRzLmxlbmd0aD41JiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0/YXJndW1lbnRzWzVdOjAscj1hcmd1bWVudHMubGVuZ3RoPjYmJnZvaWQgMCE9PWFyZ3VtZW50c1s2XT9hcmd1bWVudHNbNl06bnVsbDtyZXR1cm4gdGhpcy53Lmdsb2JhbHMuZG9tLlBhcGVyLmxpbmUoKS5hdHRyKHt4MTp0LHkxOmUseDI6aSx5MjpzLHN0cm9rZTphLCJzdHJva2UtZGFzaGFycmF5IjpuLCJzdHJva2Utd2lkdGgiOnJ9KX19LHtrZXk6ImRyYXdSZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTowLGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAsaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06MCxzPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTowLGE9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOjAsbj1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06IiNmZWZlZmUiLHI9YXJndW1lbnRzLmxlbmd0aD42JiZ2b2lkIDAhPT1hcmd1bWVudHNbNl0/YXJndW1lbnRzWzZdOjEsbz1hcmd1bWVudHMubGVuZ3RoPjcmJnZvaWQgMCE9PWFyZ3VtZW50c1s3XT9hcmd1bWVudHNbN106bnVsbCxsPWFyZ3VtZW50cy5sZW5ndGg+OCYmdm9pZCAwIT09YXJndW1lbnRzWzhdP2FyZ3VtZW50c1s4XTpudWxsLGg9YXJndW1lbnRzLmxlbmd0aD45JiZ2b2lkIDAhPT1hcmd1bWVudHNbOV0/YXJndW1lbnRzWzldOjAsYz10aGlzLncuZ2xvYmFscy5kb20uUGFwZXIucmVjdCgpO3JldHVybiBjLmF0dHIoe3g6dCx5OmUsd2lkdGg6aT4wP2k6MCxoZWlnaHQ6cz4wP3M6MCxyeDphLHJ5OmEsZmlsbDpuLG9wYWNpdHk6ciwic3Ryb2tlLXdpZHRoIjpudWxsIT09bz9vOjAsc3Ryb2tlOm51bGwhPT1sP2w6Im5vbmUiLCJzdHJva2UtZGFzaGFycmF5IjpofSksY319LHtrZXk6ImRyYXdQb2x5Z29uIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06IiNlMWUxZTEiLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOiJub25lIjtyZXR1cm4gdGhpcy53Lmdsb2JhbHMuZG9tLlBhcGVyLnBvbHlnb24odCkuYXR0cih7ZmlsbDppLHN0cm9rZTplfSl9fSx7a2V5OiJkcmF3Q2lyY2xlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbCxpPXRoaXMudy5nbG9iYWxzLmRvbS5QYXBlci5jaXJjbGUoMip0KTtyZXR1cm4gbnVsbCE9PWUmJmkuYXR0cihlKSxpfX0se2tleToiZHJhd1BhdGgiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZCxpPXZvaWQgMD09PWU/IiI6ZSxzPXQuc3Ryb2tlLGE9dm9pZCAwPT09cz8iI2E4YThhOCI6cyxuPXQuc3Ryb2tlV2lkdGgscj12b2lkIDA9PT1uPzE6bixvPXQuZmlsbCxsPXQuZmlsbE9wYWNpdHksaD12b2lkIDA9PT1sPzE6bCxjPXQuc3Ryb2tlT3BhY2l0eSxkPXZvaWQgMD09PWM/MTpjLHU9dC5jbGFzc2VzLGc9dC5zdHJva2VMaW5lY2FwLGY9dm9pZCAwPT09Zz9udWxsOmcscD10LnN0cm9rZURhc2hBcnJheSx4PXZvaWQgMD09PXA/MDpwLGI9dGhpcy53O3JldHVybiBudWxsPT09ZiYmKGY9Yi5jb25maWcuc3Ryb2tlLmxpbmVDYXApLChpLmluZGV4T2YoInVuZGVmaW5lZCIpPi0xfHxpLmluZGV4T2YoIk5hTiIpPi0xKSYmKGk9Ik0gMCAiLmNvbmNhdChiLmdsb2JhbHMuZ3JpZEhlaWdodCkpLGIuZ2xvYmFscy5kb20uUGFwZXIucGF0aChpKS5hdHRyKHtmaWxsOm8sImZpbGwtb3BhY2l0eSI6aCxzdHJva2U6YSwic3Ryb2tlLW9wYWNpdHkiOmQsInN0cm9rZS1saW5lY2FwIjpmLCJzdHJva2Utd2lkdGgiOnIsInN0cm9rZS1kYXNoYXJyYXkiOngsY2xhc3M6dX0pfX0se2tleToiZ3JvdXAiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGwsZT10aGlzLncuZ2xvYmFscy5kb20uUGFwZXIuZ3JvdXAoKTtyZXR1cm4gbnVsbCE9PXQmJmUuYXR0cih0KSxlfX0se2tleToibW92ZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1bIk0iLHQsZV0uam9pbigiICIpO3JldHVybiBpfX0se2tleToibGluZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxzPW51bGw7cmV0dXJuIG51bGw9PT1pP3M9WyJMIix0LGVdLmpvaW4oIiAiKToiSCI9PT1pP3M9WyJIIix0XS5qb2luKCIgIik6IlYiPT09aSYmKHM9WyJWIixlXS5qb2luKCIgIikpLHN9fSx7a2V5OiJjdXJ2ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkscyxhLG4pe3ZhciByPVsiQyIsdCxlLGkscyxhLG5dLmpvaW4oIiAiKTtyZXR1cm4gcn19LHtrZXk6InF1YWRyYXRpY0N1cnZlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxzKXtyZXR1cm5bIlEiLHQsZSxpLHNdLmpvaW4oIiAiKX19LHtrZXk6ImFyYyIsdmFsdWU6ZnVuY3Rpb24odCxlLGkscyxhLG4scil7dmFyIG89IkEiO2FyZ3VtZW50cy5sZW5ndGg+NyYmdm9pZCAwIT09YXJndW1lbnRzWzddJiZhcmd1bWVudHNbN10mJihvPSJhIik7dmFyIGw9W28sdCxlLGkscyxhLG4scl0uam9pbigiICIpO3JldHVybiBsfX0se2tleToicmVuZGVyUGF0aHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLGk9dC5qLHM9dC5yZWFsSW5kZXgsYT10LnBhdGhGcm9tLG49dC5wYXRoVG8sbz10LnN0cm9rZSxsPXQuc3Ryb2tlV2lkdGgsaD10LnN0cm9rZUxpbmVjYXAsYz10LmZpbGwsZD10LmFuaW1hdGlvbkRlbGF5LHU9dC5pbml0aWFsU3BlZWQscD10LmRhdGFDaGFuZ2VTcGVlZCx4PXQuY2xhc3NOYW1lLGI9dC5zaG91bGRDbGlwVG9HcmlkLG09dm9pZCAwPT09Ynx8Yix2PXQuYmluZEV2ZW50c09uUGF0aHMseT12b2lkIDA9PT12fHx2LHc9dC5kcmF3U2hhZG93LGs9dm9pZCAwPT09d3x8dyxBPXRoaXMudyxTPW5ldyBnKHRoaXMuY3R4KSxDPW5ldyBmKHRoaXMuY3R4KSxMPXRoaXMudy5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5lbmFibGVkLFA9TCYmdGhpcy53LmNvbmZpZy5jaGFydC5hbmltYXRpb25zLmR5bmFtaWNBbmltYXRpb24uZW5hYmxlZCx6PSEhKEwmJiFBLmdsb2JhbHMucmVzaXplZHx8UCYmQS5nbG9iYWxzLmRhdGFDaGFuZ2VkJiZBLmdsb2JhbHMuc2hvdWxkQW5pbWF0ZSk7ej9lPWE6KGU9bixDLmFuaW1hdGlvbkNvbXBsZXRlZCgpKTt2YXIgTT1BLmNvbmZpZy5zdHJva2UuZGFzaEFycmF5LEU9MDtFPUFycmF5LmlzQXJyYXkoTSk/TVtzXTpBLmNvbmZpZy5zdHJva2UuZGFzaEFycmF5O3ZhciBUPXRoaXMuZHJhd1BhdGgoe2Q6ZSxzdHJva2U6byxzdHJva2VXaWR0aDpsLGZpbGw6YyxmaWxsT3BhY2l0eToxLGNsYXNzZXM6eCxzdHJva2VMaW5lY2FwOmgsc3Ryb2tlRGFzaEFycmF5OkV9KTtpZihULmF0dHIoImluZGV4IixzKSxtJiZULmF0dHIoeyJjbGlwLXBhdGgiOiJ1cmwoI2dyaWRSZWN0TWFzayIuY29uY2F0KEEuZ2xvYmFscy5jdWlkLCIpIil9KSwibm9uZSIhPT1BLmNvbmZpZy5zdGF0ZXMubm9ybWFsLmZpbHRlci50eXBlKVMuZ2V0RGVmYXVsdEZpbHRlcihULHMpO2Vsc2UgaWYoQS5jb25maWcuY2hhcnQuZHJvcFNoYWRvdy5lbmFibGVkJiZrJiYoIUEuY29uZmlnLmNoYXJ0LmRyb3BTaGFkb3cuZW5hYmxlZFNlcmllc3x8QS5jb25maWcuY2hhcnQuZHJvcFNoYWRvdy5lbmFibGVkU2VyaWVzJiYtMSE9PUEuY29uZmlnLmNoYXJ0LmRyb3BTaGFkb3cuZW5hYmxlZFNlcmllcy5pbmRleE9mKHMpKSl7dmFyIFg9QS5jb25maWcuY2hhcnQuZHJvcFNoYWRvdztTLmRyb3BTaGFkb3coVCxYLHMpfXkmJihULm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsdGhpcy5wYXRoTW91c2VFbnRlci5iaW5kKHRoaXMsVCkpLFQubm9kZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0aGlzLnBhdGhNb3VzZUxlYXZlLmJpbmQodGhpcyxUKSksVC5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5wYXRoTW91c2VEb3duLmJpbmQodGhpcyxUKSkpLFQuYXR0cih7cGF0aFRvOm4scGF0aEZyb206YX0pO3ZhciBJPXtlbDpULGo6aSxwYXRoRnJvbTphLHBhdGhUbzpuLHN0cm9rZVdpZHRoOmx9O3JldHVybiFMfHxBLmdsb2JhbHMucmVzaXplZHx8QS5nbG9iYWxzLmRhdGFDaGFuZ2VkPyFBLmdsb2JhbHMucmVzaXplZCYmQS5nbG9iYWxzLmRhdGFDaGFuZ2VkfHxDLnNob3dEZWxheWVkRWxlbWVudHMoKTpDLmFuaW1hdGVQYXRoc0dyYWR1YWxseShyKHt9LEkse3NwZWVkOnUsZGVsYXk6ZH0pKSxBLmdsb2JhbHMuZGF0YUNoYW5nZWQmJlAmJnomJkMuYW5pbWF0ZVBhdGhzR3JhZHVhbGx5KHIoe30sSSx7c3BlZWQ6cH0pKSxUfX0se2tleToiZHJhd1BhdHRlcm4iLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106IiNhOGE4YTgiLGE9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOjA7cmV0dXJuIHRoaXMudy5nbG9iYWxzLmRvbS5QYXBlci5wYXR0ZXJuKGUsaSxmdW5jdGlvbihuKXsiaG9yaXpvbnRhbExpbmVzIj09PXQ/bi5saW5lKDAsMCxpLDApLnN0cm9rZSh7Y29sb3I6cyx3aWR0aDphKzF9KToidmVydGljYWxMaW5lcyI9PT10P24ubGluZSgwLDAsMCxlKS5zdHJva2Uoe2NvbG9yOnMsd2lkdGg6YSsxfSk6InNsYW50ZWRMaW5lcyI9PT10P24ubGluZSgwLDAsZSxpKS5zdHJva2Uoe2NvbG9yOnMsd2lkdGg6YX0pOiJzcXVhcmVzIj09PXQ/bi5yZWN0KGUsaSkuZmlsbCgibm9uZSIpLnN0cm9rZSh7Y29sb3I6cyx3aWR0aDphfSk6ImNpcmNsZXMiPT09dCYmbi5jaXJjbGUoZSkuZmlsbCgibm9uZSIpLnN0cm9rZSh7Y29sb3I6cyx3aWR0aDphfSl9KX19LHtrZXk6ImRyYXdHcmFkaWVudCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkscyxhKXt2YXIgbixyPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTpudWxsLG89YXJndW1lbnRzLmxlbmd0aD42JiZ2b2lkIDAhPT1hcmd1bWVudHNbNl0/YXJndW1lbnRzWzZdOm51bGwsbD1hcmd1bWVudHMubGVuZ3RoPjcmJnZvaWQgMCE9PWFyZ3VtZW50c1s3XT9hcmd1bWVudHNbN106bnVsbCxoPWFyZ3VtZW50cy5sZW5ndGg+OCYmdm9pZCAwIT09YXJndW1lbnRzWzhdP2FyZ3VtZW50c1s4XTowLGM9dGhpcy53O2U9dS5oZXhUb1JnYmEoZSxzKSxpPXUuaGV4VG9SZ2JhKGksYSk7dmFyIGQ9MCxnPTEsZj0xLHA9bnVsbDtudWxsIT09byYmKGQ9dm9pZCAwIT09b1swXT9vWzBdLzEwMDowLGc9dm9pZCAwIT09b1sxXT9vWzFdLzEwMDoxLGY9dm9pZCAwIT09b1syXT9vWzJdLzEwMDoxLHA9dm9pZCAwIT09b1szXT9vWzNdLzEwMDpudWxsKTt2YXIgeD0hKCJkb251dCIhPT1jLmNvbmZpZy5jaGFydC50eXBlJiYicGllIiE9PWMuY29uZmlnLmNoYXJ0LnR5cGUmJiJidWJibGUiIT09Yy5jb25maWcuY2hhcnQudHlwZSk7aWYobj1udWxsPT09bHx8MD09PWwubGVuZ3RoP2MuZ2xvYmFscy5kb20uUGFwZXIuZ3JhZGllbnQoeD8icmFkaWFsIjoibGluZWFyIixmdW5jdGlvbih0KXt0LmF0KGQsZSxzKSx0LmF0KGcsaSxhKSx0LmF0KGYsaSxhKSxudWxsIT09cCYmdC5hdChwLGUscyl9KTpjLmdsb2JhbHMuZG9tLlBhcGVyLmdyYWRpZW50KHg/InJhZGlhbCI6ImxpbmVhciIsZnVuY3Rpb24odCl7KEFycmF5LmlzQXJyYXkobFtoXSk/bFtoXTpsKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuYXQoZS5vZmZzZXQvMTAwLGUuY29sb3IsZS5vcGFjaXR5KX0pfSkseCl7dmFyIGI9Yy5nbG9iYWxzLmdyaWRXaWR0aC8yLG09Yy5nbG9iYWxzLmdyaWRIZWlnaHQvMjsiYnViYmxlIiE9PWMuY29uZmlnLmNoYXJ0LnR5cGU/bi5hdHRyKHtncmFkaWVudFVuaXRzOiJ1c2VyU3BhY2VPblVzZSIsY3g6YixjeTptLHI6cn0pOm4uYXR0cih7Y3g6LjUsY3k6LjUscjouOCxmeDouMixmeTouMn0pfWVsc2UidmVydGljYWwiPT09dD9uLmZyb20oMCwwKS50bygwLDEpOiJkaWFnb25hbCI9PT10P24uZnJvbSgwLDApLnRvKDEsMSk6Imhvcml6b250YWwiPT09dD9uLmZyb20oMCwxKS50bygxLDEpOiJkaWFnb25hbDIiPT09dCYmbi5mcm9tKDAsMSkudG8oMiwyKTtyZXR1cm4gbn19LHtrZXk6ImRyYXdUZXh0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMudyxzPXQueCxhPXQueSxuPXQudGV4dCxyPXQudGV4dEFuY2hvcixvPXQuZm9udFNpemUsbD10LmZvbnRGYW1pbHksaD10LmZvbnRXZWlnaHQsYz10LmZvcmVDb2xvcixkPXQub3BhY2l0eTtyZXR1cm4gdm9pZCAwPT09biYmKG49IiIpLHJ8fChyPSJzdGFydCIpLGN8fChjPWkuY29uZmlnLmNoYXJ0LmZvcmVDb2xvciksbD1sfHxpLmNvbmZpZy5jaGFydC5mb250RmFtaWx5LGg9aHx8InJlZ3VsYXIiLChlPUFycmF5LmlzQXJyYXkobik/aS5nbG9iYWxzLmRvbS5QYXBlci50ZXh0KGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7ZSsrKXQudHNwYW4obltlXSl9KTppLmdsb2JhbHMuZG9tLlBhcGVyLnBsYWluKG4pKS5hdHRyKHt4OnMseTphLCJ0ZXh0LWFuY2hvciI6ciwiZG9taW5hbnQtYmFzZWxpbmUiOiJhdXRvIiwiZm9udC1zaXplIjpvLCJmb250LWZhbWlseSI6bCwiZm9udC13ZWlnaHQiOmgsZmlsbDpjLGNsYXNzOih0LmNzc0NsYXNzLHQuY3NzQ2xhc3MpfSksZS5ub2RlLnN0eWxlLmZvbnRGYW1pbHk9bCxlLm5vZGUuc3R5bGUub3BhY2l0eT1kLGV9fSx7a2V5OiJhZGRUc3BhbiIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBzPXQudHNwYW4oZSk7aXx8KGk9dGhpcy53LmNvbmZpZy5jaGFydC5mb250RmFtaWx5KSxzLm5vZGUuc3R5bGUuZm9udEZhbWlseT1pfX0se2tleToiZHJhd01hcmtlciIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3Q9dHx8MDt2YXIgcz1pLnBTaXplfHwwLGE9bnVsbDtpZigic3F1YXJlIj09PWkuc2hhcGUpe3ZhciBuPXZvaWQgMD09PWkucFJhZGl1cz9zLzI6aS5wUmFkaXVzO251bGw9PT1lJiYocz0wLG49MCk7dmFyIHI9MS4yKnMrbixvPXRoaXMuZHJhd1JlY3QocixyLHIscixuKTtvLmF0dHIoe3g6dC1yLzIseTplLXIvMixjeDp0LGN5OmUsY2xhc3M6aS5jbGFzcz9pLmNsYXNzOiIiLGZpbGw6aS5wb2ludEZpbGxDb2xvciwiZmlsbC1vcGFjaXR5IjppLnBvaW50RmlsbE9wYWNpdHk/aS5wb2ludEZpbGxPcGFjaXR5OjEsc3Ryb2tlOmkucG9pbnRTdHJva2VDb2xvciwic3Ryb2tlLXdpZHRoIjppLnBXaWR0aD9pLnBXaWR0aDowLCJzdHJva2Utb3BhY2l0eSI6aS5wb2ludFN0cm9rZU9wYWNpdHk/aS5wb2ludFN0cm9rZU9wYWNpdHk6MX0pLGE9b31lbHNlImNpcmNsZSIhPT1pLnNoYXBlJiZpLnNoYXBlfHwodS5pc051bWJlcihlKXx8KHM9MCxlPTApLGE9dGhpcy5kcmF3Q2lyY2xlKHMse2N4OnQsY3k6ZSxjbGFzczppLmNsYXNzP2kuY2xhc3M6IiIsc3Ryb2tlOmkucG9pbnRTdHJva2VDb2xvcixmaWxsOmkucG9pbnRGaWxsQ29sb3IsImZpbGwtb3BhY2l0eSI6aS5wb2ludEZpbGxPcGFjaXR5P2kucG9pbnRGaWxsT3BhY2l0eToxLCJzdHJva2Utd2lkdGgiOmkucFdpZHRoP2kucFdpZHRoOjAsInN0cm9rZS1vcGFjaXR5IjppLnBvaW50U3Ryb2tlT3BhY2l0eT9pLnBvaW50U3Ryb2tlT3BhY2l0eToxfSkpO3JldHVybiBhfX0se2tleToicGF0aE1vdXNlRW50ZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53LHM9bmV3IGcodGhpcy5jdHgpLGE9cGFyc2VJbnQodC5ub2RlLmdldEF0dHJpYnV0ZSgiaW5kZXgiKSksbj1wYXJzZUludCh0Lm5vZGUuZ2V0QXR0cmlidXRlKCJqIikpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBpLmNvbmZpZy5jaGFydC5ldmVudHMuZGF0YVBvaW50TW91c2VFbnRlciYmaS5jb25maWcuY2hhcnQuZXZlbnRzLmRhdGFQb2ludE1vdXNlRW50ZXIoZSx0aGlzLmN0eCx7c2VyaWVzSW5kZXg6YSxkYXRhUG9pbnRJbmRleDpuLHc6aX0pLHRoaXMuY3R4LmZpcmVFdmVudCgiZGF0YVBvaW50TW91c2VFbnRlciIsW2UsdGhpcy5jdHgse3Nlcmllc0luZGV4OmEsZGF0YVBvaW50SW5kZXg6bix3Oml9XSksKCJub25lIj09PWkuY29uZmlnLnN0YXRlcy5hY3RpdmUuZmlsdGVyLnR5cGV8fCJ0cnVlIiE9PXQubm9kZS5nZXRBdHRyaWJ1dGUoInNlbGVjdGVkIikpJiYibm9uZSIhPT1pLmNvbmZpZy5zdGF0ZXMuaG92ZXIuZmlsdGVyLnR5cGUmJiJub25lIiE9PWkuY29uZmlnLnN0YXRlcy5hY3RpdmUuZmlsdGVyLnR5cGUmJiFpLmdsb2JhbHMuaXNUb3VjaERldmljZSl7dmFyIHI9aS5jb25maWcuc3RhdGVzLmhvdmVyLmZpbHRlcjtzLmFwcGx5RmlsdGVyKHQsYSxyLnR5cGUsci52YWx1ZSl9fX0se2tleToicGF0aE1vdXNlTGVhdmUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53LHM9bmV3IGcodGhpcy5jdHgpLGE9cGFyc2VJbnQodC5ub2RlLmdldEF0dHJpYnV0ZSgiaW5kZXgiKSksbj1wYXJzZUludCh0Lm5vZGUuZ2V0QXR0cmlidXRlKCJqIikpOyJmdW5jdGlvbiI9PXR5cGVvZiBpLmNvbmZpZy5jaGFydC5ldmVudHMuZGF0YVBvaW50TW91c2VMZWF2ZSYmaS5jb25maWcuY2hhcnQuZXZlbnRzLmRhdGFQb2ludE1vdXNlTGVhdmUoZSx0aGlzLmN0eCx7c2VyaWVzSW5kZXg6YSxkYXRhUG9pbnRJbmRleDpuLHc6aX0pLHRoaXMuY3R4LmZpcmVFdmVudCgiZGF0YVBvaW50TW91c2VMZWF2ZSIsW2UsdGhpcy5jdHgse3Nlcmllc0luZGV4OmEsZGF0YVBvaW50SW5kZXg6bix3Oml9XSksIm5vbmUiIT09aS5jb25maWcuc3RhdGVzLmFjdGl2ZS5maWx0ZXIudHlwZSYmInRydWUiPT09dC5ub2RlLmdldEF0dHJpYnV0ZSgic2VsZWN0ZWQiKXx8Im5vbmUiIT09aS5jb25maWcuc3RhdGVzLmhvdmVyLmZpbHRlci50eXBlJiZzLmdldERlZmF1bHRGaWx0ZXIodCxhKX19LHtrZXk6InBhdGhNb3VzZURvd24iLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53LHM9bmV3IGcodGhpcy5jdHgpLGE9cGFyc2VJbnQodC5ub2RlLmdldEF0dHJpYnV0ZSgiaW5kZXgiKSksbj1wYXJzZUludCh0Lm5vZGUuZ2V0QXR0cmlidXRlKCJqIikpLHI9ImZhbHNlIjtpZigidHJ1ZSI9PT10Lm5vZGUuZ2V0QXR0cmlidXRlKCJzZWxlY3RlZCIpKXtpZih0Lm5vZGUuc2V0QXR0cmlidXRlKCJzZWxlY3RlZCIsImZhbHNlIiksaS5nbG9iYWxzLnNlbGVjdGVkRGF0YVBvaW50c1thXS5pbmRleE9mKG4pPi0xKXt2YXIgbz1pLmdsb2JhbHMuc2VsZWN0ZWREYXRhUG9pbnRzW2FdLmluZGV4T2Yobik7aS5nbG9iYWxzLnNlbGVjdGVkRGF0YVBvaW50c1thXS5zcGxpY2UobywxKX19ZWxzZXtpZighaS5jb25maWcuc3RhdGVzLmFjdGl2ZS5hbGxvd011bHRpcGxlRGF0YVBvaW50c1NlbGVjdGlvbiYmaS5nbG9iYWxzLnNlbGVjdGVkRGF0YVBvaW50cy5sZW5ndGg+MCl7aS5nbG9iYWxzLnNlbGVjdGVkRGF0YVBvaW50cz1bXTt2YXIgbD1pLmdsb2JhbHMuZG9tLlBhcGVyLnNlbGVjdCgiLmFwZXhjaGFydHMtc2VyaWVzIHBhdGgiKS5tZW1iZXJzLGg9aS5nbG9iYWxzLmRvbS5QYXBlci5zZWxlY3QoIi5hcGV4Y2hhcnRzLXNlcmllcyBjaXJjbGUsIC5hcGV4Y2hhcnRzLXNlcmllcyByZWN0IikubWVtYmVycztsLmZvckVhY2goZnVuY3Rpb24odCl7dC5ub2RlLnNldEF0dHJpYnV0ZSgic2VsZWN0ZWQiLCJmYWxzZSIpLHMuZ2V0RGVmYXVsdEZpbHRlcih0LGEpfSksaC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Qubm9kZS5zZXRBdHRyaWJ1dGUoInNlbGVjdGVkIiwiZmFsc2UiKSxzLmdldERlZmF1bHRGaWx0ZXIodCxhKX0pfXQubm9kZS5zZXRBdHRyaWJ1dGUoInNlbGVjdGVkIiwidHJ1ZSIpLHI9InRydWUiLHZvaWQgMD09PWkuZ2xvYmFscy5zZWxlY3RlZERhdGFQb2ludHNbYV0mJihpLmdsb2JhbHMuc2VsZWN0ZWREYXRhUG9pbnRzW2FdPVtdKSxpLmdsb2JhbHMuc2VsZWN0ZWREYXRhUG9pbnRzW2FdLnB1c2gobil9aWYoInRydWUiPT09cil7dmFyIGM9aS5jb25maWcuc3RhdGVzLmFjdGl2ZS5maWx0ZXI7Im5vbmUiIT09YyYmcy5hcHBseUZpbHRlcih0LGEsYy50eXBlLGMudmFsdWUpfWVsc2Uibm9uZSIhPT1pLmNvbmZpZy5zdGF0ZXMuYWN0aXZlLmZpbHRlci50eXBlJiZzLmdldERlZmF1bHRGaWx0ZXIodCxhKTsiZnVuY3Rpb24iPT10eXBlb2YgaS5jb25maWcuY2hhcnQuZXZlbnRzLmRhdGFQb2ludFNlbGVjdGlvbiYmaS5jb25maWcuY2hhcnQuZXZlbnRzLmRhdGFQb2ludFNlbGVjdGlvbihlLHRoaXMuY3R4LHtzZWxlY3RlZERhdGFQb2ludHM6aS5nbG9iYWxzLnNlbGVjdGVkRGF0YVBvaW50cyxzZXJpZXNJbmRleDphLGRhdGFQb2ludEluZGV4Om4sdzppfSksZSYmdGhpcy5jdHguZmlyZUV2ZW50KCJkYXRhUG9pbnRTZWxlY3Rpb24iLFtlLHRoaXMuY3R4LHtzZWxlY3RlZERhdGFQb2ludHM6aS5nbG9iYWxzLnNlbGVjdGVkRGF0YVBvaW50cyxzZXJpZXNJbmRleDphLGRhdGFQb2ludEluZGV4Om4sdzppfV0pfX0se2tleToicm90YXRlQXJvdW5kQ2VudGVyIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LmdldEJCb3goKTtyZXR1cm57eDplLngrZS53aWR0aC8yLHk6ZS55K2UuaGVpZ2h0LzJ9fX0se2tleToiZ2V0VGV4dFJlY3RzIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxzKXt2YXIgYT0hKGFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdKXx8YXJndW1lbnRzWzRdLG49dGhpcy53LHI9dGhpcy5kcmF3VGV4dCh7eDotMjAwLHk6LTIwMCx0ZXh0OnQsdGV4dEFuY2hvcjoic3RhcnQiLGZvbnRTaXplOmUsZm9udEZhbWlseTppLGZvcmVDb2xvcjoiI2ZmZiIsb3BhY2l0eTowfSk7cyYmci5hdHRyKCJ0cmFuc2Zvcm0iLHMpLG4uZ2xvYmFscy5kb20uUGFwZXIuYWRkKHIpO3ZhciBvPXIuYmJveCgpO3JldHVybiBhfHwobz1yLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLHIucmVtb3ZlKCkse3dpZHRoOm8ud2lkdGgsaGVpZ2h0Om8uaGVpZ2h0fX19LHtrZXk6InBsYWNlVGV4dFdpdGhFbGxpcHNpcyIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe2lmKHQudGV4dENvbnRlbnQ9ZSxlLmxlbmd0aD4wJiZ0LmdldENvbXB1dGVkVGV4dExlbmd0aCgpPj1pKXtmb3IodmFyIHM9ZS5sZW5ndGgtMztzPjA7cy09MylpZih0LmdldFN1YlN0cmluZ0xlbmd0aCgwLHMpPD1pKXJldHVybiB2b2lkKHQudGV4dENvbnRlbnQ9ZS5zdWJzdHJpbmcoMCxzKSsiLi4uIik7dC50ZXh0Q29udGVudD0iLi4uIn19fV0sW3trZXk6InNldEF0dHJzIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaSBpbiBlKWUuaGFzT3duUHJvcGVydHkoaSkmJnQuc2V0QXR0cmlidXRlKGksZVtpXSl9fV0pLHR9KCk7dmFyIHg9e25hbWU6ImVuIixvcHRpb25zOnttb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl0sZGF5czpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sdG9vbGJhcjp7ZXhwb3J0VG9TVkc6IkRvd25sb2FkIFNWRyIsZXhwb3J0VG9QTkc6IkRvd25sb2FkIFBORyIsbWVudToiTWVudSIsc2VsZWN0aW9uOiJTZWxlY3Rpb24iLHNlbGVjdGlvblpvb206IlNlbGVjdGlvbiBab29tIix6b29tSW46Ilpvb20gSW4iLHpvb21PdXQ6Ilpvb20gT3V0IixwYW46IlBhbm5pbmciLHJlc2V0OiJSZXNldCBab29tIn19fSxiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2UodGhpcyx0KSx0aGlzLnlBeGlzPXtzaG93OiEwLHNob3dBbHdheXM6ITEsc2VyaWVzTmFtZTp2b2lkIDAsb3Bwb3NpdGU6ITEscmV2ZXJzZWQ6ITEsbG9nYXJpdGhtaWM6ITEsdGlja0Ftb3VudDp2b2lkIDAsZm9yY2VOaWNlU2NhbGU6ITEsbWF4OnZvaWQgMCxtaW46dm9pZCAwLGZsb2F0aW5nOiExLGRlY2ltYWxzSW5GbG9hdDp2b2lkIDAsbGFiZWxzOntzaG93OiEwLG1pbldpZHRoOjAsbWF4V2lkdGg6MTYwLG9mZnNldFg6MCxvZmZzZXRZOjAsYWxpZ246dm9pZCAwLHJvdGF0ZTowLHBhZGRpbmc6MjAsc3R5bGU6e2NvbG9yczpbXSxmb250U2l6ZToiMTFweCIsZm9udEZhbWlseTp2b2lkIDAsY3NzQ2xhc3M6IiJ9LGZvcm1hdHRlcjp2b2lkIDB9LGF4aXNCb3JkZXI6e3Nob3c6ITEsY29sb3I6IiM3ODkwOUMiLG9mZnNldFg6MCxvZmZzZXRZOjB9LGF4aXNUaWNrczp7c2hvdzohMSxjb2xvcjoiIzc4OTA5QyIsd2lkdGg6NixvZmZzZXRYOjAsb2Zmc2V0WTowfSx0aXRsZTp7dGV4dDp2b2lkIDAscm90YXRlOjkwLG9mZnNldFk6MCxvZmZzZXRYOjAsc3R5bGU6e2NvbG9yOnZvaWQgMCxmb250U2l6ZToiMTFweCIsZm9udEZhbWlseTp2b2lkIDAsY3NzQ2xhc3M6IiJ9fSx0b29sdGlwOntlbmFibGVkOiExLG9mZnNldFg6MH0sY3Jvc3NoYWlyczp7c2hvdzohMCxwb3NpdGlvbjoiZnJvbnQiLHN0cm9rZTp7Y29sb3I6IiNiNmI2YjYiLHdpZHRoOjEsZGFzaEFycmF5OjB9fX0sdGhpcy54QXhpc0Fubm90YXRpb249e3g6MCx4MjpudWxsLHN0cm9rZURhc2hBcnJheToxLGZpbGxDb2xvcjoiI2MyYzJjMiIsYm9yZGVyQ29sb3I6IiNjMmMyYzIiLG9wYWNpdHk6LjMsb2Zmc2V0WDowLG9mZnNldFk6MCxsYWJlbDp7Ym9yZGVyQ29sb3I6IiNjMmMyYzIiLGJvcmRlcldpZHRoOjEsdGV4dDp2b2lkIDAsdGV4dEFuY2hvcjoibWlkZGxlIixvcmllbnRhdGlvbjoidmVydGljYWwiLHBvc2l0aW9uOiJ0b3AiLG9mZnNldFg6MCxvZmZzZXRZOjAsc3R5bGU6e2JhY2tncm91bmQ6IiNmZmYiLGNvbG9yOnZvaWQgMCxmb250U2l6ZToiMTFweCIsZm9udEZhbWlseTp2b2lkIDAsY3NzQ2xhc3M6IiIscGFkZGluZzp7bGVmdDo1LHJpZ2h0OjUsdG9wOjIsYm90dG9tOjJ9fX19LHRoaXMueUF4aXNBbm5vdGF0aW9uPXt5OjAseTI6bnVsbCxzdHJva2VEYXNoQXJyYXk6MSxmaWxsQ29sb3I6IiNjMmMyYzIiLGJvcmRlckNvbG9yOiIjYzJjMmMyIixvcGFjaXR5Oi4zLG9mZnNldFg6MCxvZmZzZXRZOjAseUF4aXNJbmRleDowLGxhYmVsOntib3JkZXJDb2xvcjoiI2MyYzJjMiIsYm9yZGVyV2lkdGg6MSx0ZXh0OnZvaWQgMCx0ZXh0QW5jaG9yOiJlbmQiLHBvc2l0aW9uOiJyaWdodCIsb2Zmc2V0WDowLG9mZnNldFk6LTMsc3R5bGU6e2JhY2tncm91bmQ6IiNmZmYiLGNvbG9yOnZvaWQgMCxmb250U2l6ZToiMTFweCIsZm9udEZhbWlseTp2b2lkIDAsY3NzQ2xhc3M6IiIscGFkZGluZzp7bGVmdDo1LHJpZ2h0OjUsdG9wOjAsYm90dG9tOjJ9fX19LHRoaXMucG9pbnRBbm5vdGF0aW9uPXt4OjAseTpudWxsLHlBeGlzSW5kZXg6MCxzZXJpZXNJbmRleDowLG1hcmtlcjp7c2l6ZTo0LGZpbGxDb2xvcjoiI2ZmZiIsc3Ryb2tlV2lkdGg6MixzdHJva2VDb2xvcjoiIzMzMyIsc2hhcGU6ImNpcmNsZSIsb2Zmc2V0WDowLG9mZnNldFk6MCxyYWRpdXM6Mixjc3NDbGFzczoiIn0sbGFiZWw6e2JvcmRlckNvbG9yOiIjYzJjMmMyIixib3JkZXJXaWR0aDoxLHRleHQ6dm9pZCAwLHRleHRBbmNob3I6Im1pZGRsZSIsb2Zmc2V0WDowLG9mZnNldFk6LTE1LHN0eWxlOntiYWNrZ3JvdW5kOiIjZmZmIixjb2xvcjp2b2lkIDAsZm9udFNpemU6IjExcHgiLGZvbnRGYW1pbHk6dm9pZCAwLGNzc0NsYXNzOiIiLHBhZGRpbmc6e2xlZnQ6NSxyaWdodDo1LHRvcDowLGJvdHRvbToyfX19LGN1c3RvbVNWRzp7U1ZHOnZvaWQgMCxjc3NDbGFzczp2b2lkIDAsb2Zmc2V0WDowLG9mZnNldFk6MH19fXJldHVybiBzKHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2Fubm90YXRpb25zOntwb3NpdGlvbjoiZnJvbnQiLHlheGlzOlt0aGlzLnlBeGlzQW5ub3RhdGlvbl0seGF4aXM6W3RoaXMueEF4aXNBbm5vdGF0aW9uXSxwb2ludHM6W3RoaXMucG9pbnRBbm5vdGF0aW9uXX0sY2hhcnQ6e2FuaW1hdGlvbnM6e2VuYWJsZWQ6ITAsZWFzaW5nOiJlYXNlaW5vdXQiLHNwZWVkOjgwMCxhbmltYXRlR3JhZHVhbGx5OntkZWxheToxNTAsZW5hYmxlZDohMH0sZHluYW1pY0FuaW1hdGlvbjp7ZW5hYmxlZDohMCxzcGVlZDozNTB9fSxiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsbG9jYWxlczpbeF0sZGVmYXVsdExvY2FsZToiZW4iLGRyb3BTaGFkb3c6e2VuYWJsZWQ6ITEsZW5hYmxlZFNlcmllczp2b2lkIDAsdG9wOjIsbGVmdDoyLGJsdXI6NCxjb2xvcjoiIzAwMCIsb3BhY2l0eTouMzV9LGV2ZW50czp7YW5pbWF0aW9uRW5kOnZvaWQgMCxiZWZvcmVNb3VudDp2b2lkIDAsbW91bnRlZDp2b2lkIDAsdXBkYXRlZDp2b2lkIDAsY2xpY2s6dm9pZCAwLG1vdXNlTW92ZTp2b2lkIDAsbGVnZW5kQ2xpY2s6dm9pZCAwLG1hcmtlckNsaWNrOnZvaWQgMCxzZWxlY3Rpb246dm9pZCAwLGRhdGFQb2ludFNlbGVjdGlvbjp2b2lkIDAsZGF0YVBvaW50TW91c2VFbnRlcjp2b2lkIDAsZGF0YVBvaW50TW91c2VMZWF2ZTp2b2lkIDAsYmVmb3JlWm9vbTp2b2lkIDAsem9vbWVkOnZvaWQgMCxzY3JvbGxlZDp2b2lkIDB9LGZvcmVDb2xvcjoiIzM3M2QzZiIsZm9udEZhbWlseToiSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiIsaGVpZ2h0OiJhdXRvIixwYXJlbnRIZWlnaHRPZmZzZXQ6MTUsaWQ6dm9pZCAwLGdyb3VwOnZvaWQgMCxvZmZzZXRYOjAsb2Zmc2V0WTowLHNlbGVjdGlvbjp7ZW5hYmxlZDohMSx0eXBlOiJ4IixmaWxsOntjb2xvcjoiIzI0MjkyZSIsb3BhY2l0eTouMX0sc3Ryb2tlOnt3aWR0aDoxLGNvbG9yOiIjMjQyOTJlIixvcGFjaXR5Oi40LGRhc2hBcnJheTozfSx4YXhpczp7bWluOnZvaWQgMCxtYXg6dm9pZCAwfSx5YXhpczp7bWluOnZvaWQgMCxtYXg6dm9pZCAwfX0sc3BhcmtsaW5lOntlbmFibGVkOiExfSxicnVzaDp7ZW5hYmxlZDohMSxhdXRvU2NhbGVZYXhpczohMCx0YXJnZXQ6dm9pZCAwfSxzdGFja2VkOiExLHN0YWNrVHlwZToibm9ybWFsIix0b29sYmFyOntzaG93OiEwLHRvb2xzOntkb3dubG9hZDohMCxzZWxlY3Rpb246ITAsem9vbTohMCx6b29taW46ITAsem9vbW91dDohMCxwYW46ITAscmVzZXQ6ITAsY3VzdG9tSWNvbnM6W119LGF1dG9TZWxlY3RlZDoiem9vbSJ9LHR5cGU6ImxpbmUiLHdpZHRoOiIxMDAlIix6b29tOntlbmFibGVkOiEwLHR5cGU6IngiLGF1dG9TY2FsZVlheGlzOiExLHpvb21lZEFyZWE6e2ZpbGw6e2NvbG9yOiIjOTBDQUY5IixvcGFjaXR5Oi40fSxzdHJva2U6e2NvbG9yOiIjMEQ0N0ExIixvcGFjaXR5Oi40LHdpZHRoOjF9fX19LHBsb3RPcHRpb25zOntiYXI6e2hvcml6b250YWw6ITEsY29sdW1uV2lkdGg6IjcwJSIsYmFySGVpZ2h0OiI3MCUiLGRpc3RyaWJ1dGVkOiExLGVuZGluZ1NoYXBlOiJmbGF0Iixjb2xvcnM6e3JhbmdlczpbXSxiYWNrZ3JvdW5kQmFyQ29sb3JzOltdLGJhY2tncm91bmRCYXJPcGFjaXR5OjF9LGRhdGFMYWJlbHM6e21heEl0ZW1zOjEwMCxoaWRlT3ZlcmZsb3dpbmdMYWJlbHM6ITAscG9zaXRpb246InRvcCJ9fSxjYW5kbGVzdGljazp7Y29sb3JzOnt1cHdhcmQ6IiMwMEI3NDYiLGRvd253YXJkOiIjRUY0MDNDIn0sd2ljazp7dXNlRmlsbENvbG9yOiEwfX0saGVhdG1hcDp7cmFkaXVzOjIsZW5hYmxlU2hhZGVzOiEwLHNoYWRlSW50ZW5zaXR5Oi41LHJldmVyc2VOZWdhdGl2ZVNoYWRlOiEwLGRpc3RyaWJ1dGVkOiExLGNvbG9yU2NhbGU6e2ludmVyc2U6ITEscmFuZ2VzOltdLG1pbjp2b2lkIDAsbWF4OnZvaWQgMH19LHJhZGlhbEJhcjp7c2l6ZTp2b2lkIDAsaW52ZXJzZU9yZGVyOiExLHN0YXJ0QW5nbGU6MCxlbmRBbmdsZTozNjAsb2Zmc2V0WDowLG9mZnNldFk6MCxob2xsb3c6e21hcmdpbjo1LHNpemU6IjUwJSIsYmFja2dyb3VuZDoidHJhbnNwYXJlbnQiLGltYWdlOnZvaWQgMCxpbWFnZVdpZHRoOjE1MCxpbWFnZUhlaWdodDoxNTAsaW1hZ2VPZmZzZXRYOjAsaW1hZ2VPZmZzZXRZOjAsaW1hZ2VDbGlwcGVkOiEwLHBvc2l0aW9uOiJmcm9udCIsZHJvcFNoYWRvdzp7ZW5hYmxlZDohMSx0b3A6MCxsZWZ0OjAsYmx1cjozLGNvbG9yOiIjMDAwIixvcGFjaXR5Oi41fX0sdHJhY2s6e3Nob3c6ITAsc3RhcnRBbmdsZTp2b2lkIDAsZW5kQW5nbGU6dm9pZCAwLGJhY2tncm91bmQ6IiNmMmYyZjIiLHN0cm9rZVdpZHRoOiI5NyUiLG9wYWNpdHk6MSxtYXJnaW46NSxkcm9wU2hhZG93OntlbmFibGVkOiExLHRvcDowLGxlZnQ6MCxibHVyOjMsY29sb3I6IiMwMDAiLG9wYWNpdHk6LjV9fSxkYXRhTGFiZWxzOntzaG93OiEwLG5hbWU6e3Nob3c6ITAsZm9udFNpemU6IjE2cHgiLGZvbnRGYW1pbHk6dm9pZCAwLGNvbG9yOnZvaWQgMCxvZmZzZXRZOjB9LHZhbHVlOntzaG93OiEwLGZvbnRTaXplOiIxNHB4Iixmb250RmFtaWx5OnZvaWQgMCxjb2xvcjp2b2lkIDAsb2Zmc2V0WToxNixmb3JtYXR0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiUifX0sdG90YWw6e3Nob3c6ITEsbGFiZWw6IlRvdGFsIixjb2xvcjp2b2lkIDAsZm9ybWF0dGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0Lmdsb2JhbHMuc2VyaWVzVG90YWxzLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9LDApL3QuZ2xvYmFscy5zZXJpZXMubGVuZ3RoKyIlIn19fX0scmFuZ2VCYXI6e30scGllOntzaXplOnZvaWQgMCxjdXN0b21TY2FsZToxLG9mZnNldFg6MCxvZmZzZXRZOjAsZXhwYW5kT25DbGljazohMCxkYXRhTGFiZWxzOntvZmZzZXQ6MCxtaW5BbmdsZVRvU2hvd0xhYmVsOjEwfSxkb251dDp7c2l6ZToiNjUlIixiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsbGFiZWxzOntzaG93OiExLG5hbWU6e3Nob3c6ITAsZm9udFNpemU6IjE2cHgiLGZvbnRGYW1pbHk6dm9pZCAwLGNvbG9yOnZvaWQgMCxvZmZzZXRZOi0xMH0sdmFsdWU6e3Nob3c6ITAsZm9udFNpemU6IjIwcHgiLGZvbnRGYW1pbHk6dm9pZCAwLGNvbG9yOnZvaWQgMCxvZmZzZXRZOjEwLGZvcm1hdHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdH19LHRvdGFsOntzaG93OiExLHNob3dBbHdheXM6ITEsbGFiZWw6IlRvdGFsIixjb2xvcjp2b2lkIDAsZm9ybWF0dGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0Lmdsb2JhbHMuc2VyaWVzVG90YWxzLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9LDApfX19fX0scmFkYXI6e3NpemU6dm9pZCAwLG9mZnNldFg6MCxvZmZzZXRZOjAscG9seWdvbnM6e3N0cm9rZUNvbG9yczoiI2U4ZThlOCIsY29ubmVjdG9yQ29sb3JzOiIjZThlOGU4IixmaWxsOntjb2xvcnM6dm9pZCAwfX19fSxjb2xvcnM6dm9pZCAwLGRhdGFMYWJlbHM6e2VuYWJsZWQ6ITAsZW5hYmxlZE9uU2VyaWVzOnZvaWQgMCxmb3JtYXR0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10P3Q6IiJ9LHRleHRBbmNob3I6Im1pZGRsZSIsb2Zmc2V0WDowLG9mZnNldFk6MCxzdHlsZTp7Zm9udFNpemU6IjEycHgiLGZvbnRGYW1pbHk6dm9pZCAwLGNvbG9yczp2b2lkIDB9LGRyb3BTaGFkb3c6e2VuYWJsZWQ6ITEsdG9wOjEsbGVmdDoxLGJsdXI6MSxjb2xvcjoiIzAwMCIsb3BhY2l0eTouNDV9fSxmaWxsOnt0eXBlOiJzb2xpZCIsY29sb3JzOnZvaWQgMCxvcGFjaXR5Oi44NSxncmFkaWVudDp7c2hhZGU6ImRhcmsiLHR5cGU6Imhvcml6b250YWwiLHNoYWRlSW50ZW5zaXR5Oi41LGdyYWRpZW50VG9Db2xvcnM6dm9pZCAwLGludmVyc2VDb2xvcnM6ITAsb3BhY2l0eUZyb206MSxvcGFjaXR5VG86MSxzdG9wczpbMCw1MCwxMDBdLGNvbG9yU3RvcHM6W119LGltYWdlOntzcmM6W10sd2lkdGg6dm9pZCAwLGhlaWdodDp2b2lkIDB9LHBhdHRlcm46e3N0eWxlOiJzcWF1cmVzIix3aWR0aDo2LGhlaWdodDo2LHN0cm9rZVdpZHRoOjJ9fSxncmlkOntzaG93OiEwLGJvcmRlckNvbG9yOiIjZTBlMGUwIixzdHJva2VEYXNoQXJyYXk6MCxwb3NpdGlvbjoiYmFjayIseGF4aXM6e2xpbmVzOntzaG93OiExLGFuaW1hdGU6ITF9fSx5YXhpczp7bGluZXM6e3Nob3c6ITAsYW5pbWF0ZTohMX19LHJvdzp7Y29sb3JzOnZvaWQgMCxvcGFjaXR5Oi41fSxjb2x1bW46e2NvbG9yczp2b2lkIDAsb3BhY2l0eTouNX0scGFkZGluZzp7dG9wOjAscmlnaHQ6MTAsYm90dG9tOjAsbGVmdDoxMn19LGxhYmVsczpbXSxsZWdlbmQ6e3Nob3c6ITAsc2hvd0ZvclNpbmdsZVNlcmllczohMSxzaG93Rm9yTnVsbFNlcmllczohMCxzaG93Rm9yWmVyb1NlcmllczohMCxmbG9hdGluZzohMSxwb3NpdGlvbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImNlbnRlciIsaW52ZXJzZU9yZGVyOiExLGZvbnRTaXplOiIxMnB4Iixmb250RmFtaWx5OnZvaWQgMCx3aWR0aDp2b2lkIDAsaGVpZ2h0OnZvaWQgMCxmb3JtYXR0ZXI6dm9pZCAwLHRvb2x0aXBIb3ZlckZvcm1hdHRlcjp2b2lkIDAsb2Zmc2V0WDotMjAsb2Zmc2V0WTowLGxhYmVsczp7Y29sb3JzOnZvaWQgMCx1c2VTZXJpZXNDb2xvcnM6ITF9LG1hcmtlcnM6e3dpZHRoOjEyLGhlaWdodDoxMixzdHJva2VXaWR0aDowLGZpbGxDb2xvcnM6dm9pZCAwLHN0cm9rZUNvbG9yOiIjZmZmIixyYWRpdXM6MTIsY3VzdG9tSFRNTDp2b2lkIDAsb2Zmc2V0WDowLG9mZnNldFk6MCxvbkNsaWNrOnZvaWQgMH0saXRlbU1hcmdpbjp7aG9yaXpvbnRhbDowLHZlcnRpY2FsOjV9LG9uSXRlbUNsaWNrOnt0b2dnbGVEYXRhU2VyaWVzOiEwfSxvbkl0ZW1Ib3Zlcjp7aGlnaGxpZ2h0RGF0YVNlcmllczohMH19LG1hcmtlcnM6e2Rpc2NyZXRlOltdLHNpemU6MCxjb2xvcnM6dm9pZCAwLHN0cm9rZUNvbG9yczoiI2ZmZiIsc3Ryb2tlV2lkdGg6MixzdHJva2VPcGFjaXR5Oi45LGZpbGxPcGFjaXR5OjEsc2hhcGU6ImNpcmNsZSIscmFkaXVzOjIsb2Zmc2V0WDowLG9mZnNldFk6MCxvbkNsaWNrOnZvaWQgMCxvbkRibENsaWNrOnZvaWQgMCxob3Zlcjp7c2l6ZTp2b2lkIDAsc2l6ZU9mZnNldDozfX0sbm9EYXRhOnt0ZXh0OnZvaWQgMCxhbGlnbjoiY2VudGVyIix2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLG9mZnNldFg6MCxvZmZzZXRZOjAsc3R5bGU6e2NvbG9yOnZvaWQgMCxmb250U2l6ZToiMTRweCIsZm9udEZhbWlseTp2b2lkIDB9fSxyZXNwb25zaXZlOltdLHNlcmllczp2b2lkIDAsc3RhdGVzOntub3JtYWw6e2ZpbHRlcjp7dHlwZToibm9uZSIsdmFsdWU6MH19LGhvdmVyOntmaWx0ZXI6e3R5cGU6ImxpZ2h0ZW4iLHZhbHVlOi4xNX19LGFjdGl2ZTp7YWxsb3dNdWx0aXBsZURhdGFQb2ludHNTZWxlY3Rpb246ITEsZmlsdGVyOnt0eXBlOiJkYXJrZW4iLHZhbHVlOi42NX19fSx0aXRsZTp7dGV4dDp2b2lkIDAsYWxpZ246ImxlZnQiLG1hcmdpbjoxMCxvZmZzZXRYOjAsb2Zmc2V0WTowLGZsb2F0aW5nOiExLHN0eWxlOntmb250U2l6ZToiMTRweCIsZm9udEZhbWlseTp2b2lkIDAsY29sb3I6dm9pZCAwfX0sc3VidGl0bGU6e3RleHQ6dm9pZCAwLGFsaWduOiJsZWZ0IixtYXJnaW46MTAsb2Zmc2V0WDowLG9mZnNldFk6MzAsZmxvYXRpbmc6ITEsc3R5bGU6e2ZvbnRTaXplOiIxMnB4Iixmb250RmFtaWx5OnZvaWQgMCxjb2xvcjp2b2lkIDB9fSxzdHJva2U6e3Nob3c6ITAsY3VydmU6InNtb290aCIsbGluZUNhcDoiYnV0dCIsd2lkdGg6Mixjb2xvcnM6dm9pZCAwLGRhc2hBcnJheTowfSx0b29sdGlwOntlbmFibGVkOiEwLGVuYWJsZWRPblNlcmllczp2b2lkIDAsc2hhcmVkOiEwLGZvbGxvd0N1cnNvcjohMSxpbnRlcnNlY3Q6ITEsaW52ZXJzZU9yZGVyOiExLGN1c3RvbTp2b2lkIDAsZmlsbFNlcmllc0NvbG9yOiExLHRoZW1lOiJsaWdodCIsc3R5bGU6e2ZvbnRTaXplOiIxMnB4Iixmb250RmFtaWx5OnZvaWQgMH0sb25EYXRhc2V0SG92ZXI6e2hpZ2hsaWdodERhdGFTZXJpZXM6ITF9LHg6e3Nob3c6ITAsZm9ybWF0OiJkZCBNTU0iLGZvcm1hdHRlcjp2b2lkIDB9LHk6e2Zvcm1hdHRlcjp2b2lkIDAsdGl0bGU6e2Zvcm1hdHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdH19fSx6Ontmb3JtYXR0ZXI6dm9pZCAwLHRpdGxlOiJTaXplOiAifSxtYXJrZXI6e3Nob3c6ITAsZmlsbENvbG9yczp2b2lkIDB9LGl0ZW1zOntkaXNwbGF5OiJmbGV4In0sZml4ZWQ6e2VuYWJsZWQ6ITEscG9zaXRpb246InRvcFJpZ2h0IixvZmZzZXRYOjAsb2Zmc2V0WTowfX0seGF4aXM6e3R5cGU6ImNhdGVnb3J5IixjYXRlZ29yaWVzOltdLG9mZnNldFg6MCxvZmZzZXRZOjAsbGFiZWxzOntzaG93OiEwLHJvdGF0ZTotNDUscm90YXRlQWx3YXlzOiExLGhpZGVPdmVybGFwcGluZ0xhYmVsczohMCx0cmltOiEwLG1pbkhlaWdodDp2b2lkIDAsbWF4SGVpZ2h0OjEyMCxzaG93RHVwbGljYXRlczohMCxzdHlsZTp7Y29sb3JzOltdLGZvbnRTaXplOiIxMnB4Iixmb250RmFtaWx5OnZvaWQgMCxjc3NDbGFzczoiIn0sb2Zmc2V0WDowLG9mZnNldFk6MCxmb3JtYXQ6dm9pZCAwLGZvcm1hdHRlcjp2b2lkIDAsZGF0ZXRpbWVGb3JtYXR0ZXI6e3llYXI6Inl5eXkiLG1vbnRoOiJNTU0gJ3l5IixkYXk6ImRkIE1NTSIsaG91cjoiSEg6bW0iLG1pbnV0ZToiSEg6bW06c3MifX0sYXhpc0JvcmRlcjp7c2hvdzohMCxjb2xvcjoiIzc4OTA5QyIsd2lkdGg6IjEwMCUiLGhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjB9LGF4aXNUaWNrczp7c2hvdzohMCxjb2xvcjoiIzc4OTA5QyIsaGVpZ2h0OjYsb2Zmc2V0WDowLG9mZnNldFk6MH0sdGlja0Ftb3VudDp2b2lkIDAsdGlja1BsYWNlbWVudDoib24iLG1pbjp2b2lkIDAsbWF4OnZvaWQgMCxyYW5nZTp2b2lkIDAsZmxvYXRpbmc6ITEscG9zaXRpb246ImJvdHRvbSIsdGl0bGU6e3RleHQ6dm9pZCAwLG9mZnNldFg6MCxvZmZzZXRZOjAsc3R5bGU6e2NvbG9yOnZvaWQgMCxmb250U2l6ZToiMTJweCIsZm9udEZhbWlseTp2b2lkIDAsY3NzQ2xhc3M6IiJ9fSxjcm9zc2hhaXJzOntzaG93OiEwLHdpZHRoOjEscG9zaXRpb246ImJhY2siLG9wYWNpdHk6Ljksc3Ryb2tlOntjb2xvcjoiI2I2YjZiNiIsd2lkdGg6MSxkYXNoQXJyYXk6M30sZmlsbDp7dHlwZToic29saWQiLGNvbG9yOiIjQjFCOUM0IixncmFkaWVudDp7Y29sb3JGcm9tOiIjRDhFM0YwIixjb2xvclRvOiIjQkVEMUU2IixzdG9wczpbMCwxMDBdLG9wYWNpdHlGcm9tOi40LG9wYWNpdHlUbzouNX19LGRyb3BTaGFkb3c6e2VuYWJsZWQ6ITEsbGVmdDowLHRvcDowLGJsdXI6MSxvcGFjaXR5Oi40fX0sdG9vbHRpcDp7ZW5hYmxlZDohMCxvZmZzZXRZOjAsZm9ybWF0dGVyOnZvaWQgMCxzdHlsZTp7Zm9udFNpemU6IjEycHgiLGZvbnRGYW1pbHk6dm9pZCAwfX19LHlheGlzOnRoaXMueUF4aXMsdGhlbWU6e21vZGU6ImxpZ2h0IixwYWxldHRlOiJwYWxldHRlMSIsbW9ub2Nocm9tZTp7ZW5hYmxlZDohMSxjb2xvcjoiIzAwOEZGQiIsc2hhZGVUbzoibGlnaHQiLHNoYWRlSW50ZW5zaXR5Oi42NX19fX19XSksdH0oKSxtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy5jdHg9aSx0aGlzLnc9aS53LHRoaXMuZ3JhcGhpY3M9bmV3IHAodGhpcy5jdHgpLHRoaXMudy5nbG9iYWxzLmlzQmFySG9yaXpvbnRhbCYmKHRoaXMuaW52ZXJ0QXhpcz0hMCksdGhpcy54RGl2aXNpb249dGhpcy53Lmdsb2JhbHMuZ3JpZFdpZHRoL3RoaXMudy5nbG9iYWxzLmRhdGFQb2ludHN9cmV0dXJuIHModCxbe2tleToiZHJhd0Fubm90YXRpb25zIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudztpZih0Lmdsb2JhbHMuYXhpc0NoYXJ0cyl7Zm9yKHZhciBlPXRoaXMuZHJhd1lBeGlzQW5ub3RhdGlvbnMoKSxpPXRoaXMuZHJhd1hBeGlzQW5ub3RhdGlvbnMoKSxzPXRoaXMuZHJhd1BvaW50QW5ub3RhdGlvbnMoKSxhPXQuY29uZmlnLmNoYXJ0LmFuaW1hdGlvbnMuZW5hYmxlZCxuPVtlLGksc10scj1baS5ub2RlLGUubm9kZSxzLm5vZGVdLG89MDtvPDM7bysrKXQuZ2xvYmFscy5kb20uZWxHcmFwaGljYWwuYWRkKG5bb10pLCFhfHx0Lmdsb2JhbHMucmVzaXplZHx8dC5nbG9iYWxzLmRhdGFDaGFuZ2VkfHwic2NhdHRlciIhPT10LmNvbmZpZy5jaGFydC50eXBlJiYiYnViYmxlIiE9PXQuY29uZmlnLmNoYXJ0LnR5cGUmJnJbb10uY2xhc3NMaXN0LmFkZCgiaGlkZGVuIiksdC5nbG9iYWxzLmRlbGF5ZWRFbGVtZW50cy5wdXNoKHtlbDpyW29dLGluZGV4OjB9KTt0aGlzLmFubm90YXRpb25zQmFja2dyb3VuZCgpfX19LHtrZXk6ImdldFN0cmluZ1giLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudyxpPXQscz1lLmdsb2JhbHMubGFiZWxzLmluZGV4T2YodCksYT1lLmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy14YXhpcy10ZXh0cy1nIHRleHQ6bnRoLWNoaWxkKCIrKHMrMSkrIikiKTtyZXR1cm4gYSYmKGk9cGFyc2VGbG9hdChhLmdldEF0dHJpYnV0ZSgieCIpKSksaX19LHtrZXk6ImFkZFhheGlzQW5ub3RhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBzPXRoaXMudyxhPXRoaXMuaW52ZXJ0QXhpcz9zLmdsb2JhbHMubWluWTpzLmdsb2JhbHMubWluWCxuPXRoaXMuaW52ZXJ0QXhpcz9zLmdsb2JhbHMueVJhbmdlWzBdOnMuZ2xvYmFscy54UmFuZ2Uscj0odC54LWEpLyhuL3MuZ2xvYmFscy5ncmlkV2lkdGgpLG89dC5sYWJlbC50ZXh0OyJjYXRlZ29yeSIhPT1zLmNvbmZpZy54YXhpcy50eXBlJiYhcy5jb25maWcueGF4aXMuY29udmVydGVkQ2F0VG9OdW1lcmljfHx0aGlzLmludmVydEF4aXN8fHMuZ2xvYmFscy5pc1hOdW1lcmljfHwocj10aGlzLmdldFN0cmluZ1godC54KSk7dmFyIGw9dC5zdHJva2VEYXNoQXJyYXk7aWYoIShyPDB8fHI+cy5nbG9iYWxzLmdyaWRXaWR0aCkpe2lmKG51bGw9PT10LngyKXt2YXIgaD10aGlzLmdyYXBoaWNzLmRyYXdMaW5lKHIrdC5vZmZzZXRYLDArdC5vZmZzZXRZLHIrdC5vZmZzZXRYLHMuZ2xvYmFscy5ncmlkSGVpZ2h0K3Qub2Zmc2V0WSx0LmJvcmRlckNvbG9yLGwpO2UuYXBwZW5kQ2hpbGQoaC5ub2RlKX1lbHNle3ZhciBjPSh0LngyLWEpLyhuL3MuZ2xvYmFscy5ncmlkV2lkdGgpO2lmKCJjYXRlZ29yeSIhPT1zLmNvbmZpZy54YXhpcy50eXBlJiYhcy5jb25maWcueGF4aXMuY29udmVydGVkQ2F0VG9OdW1lcmljfHx0aGlzLmludmVydEF4aXN8fHMuZ2xvYmFscy5pc1hOdW1lcmljfHwoYz10aGlzLmdldFN0cmluZ1godC54MikpLGM8cil7dmFyIGQ9cjtyPWMsYz1kfWlmKG8pe3ZhciB1PXRoaXMuZ3JhcGhpY3MuZHJhd1JlY3Qocit0Lm9mZnNldFgsMCt0Lm9mZnNldFksYy1yLHMuZ2xvYmFscy5ncmlkSGVpZ2h0K3Qub2Zmc2V0WSwwLHQuZmlsbENvbG9yLHQub3BhY2l0eSwxLHQuYm9yZGVyQ29sb3IsbCk7ZS5hcHBlbmRDaGlsZCh1Lm5vZGUpfX12YXIgZz0idG9wIj09PXQubGFiZWwucG9zaXRpb24/LTM6cy5nbG9iYWxzLmdyaWRIZWlnaHQsZj10aGlzLmdyYXBoaWNzLmRyYXdUZXh0KHt4OnIrdC5sYWJlbC5vZmZzZXRYLHk6Zyt0LmxhYmVsLm9mZnNldFksdGV4dDpvLHRleHRBbmNob3I6dC5sYWJlbC50ZXh0QW5jaG9yLGZvbnRTaXplOnQubGFiZWwuc3R5bGUuZm9udFNpemUsZm9udEZhbWlseTp0LmxhYmVsLnN0eWxlLmZvbnRGYW1pbHksZm9yZUNvbG9yOnQubGFiZWwuc3R5bGUuY29sb3IsY3NzQ2xhc3M6ImFwZXhjaGFydHMteGF4aXMtYW5ub3RhdGlvbi1sYWJlbCAiK3QubGFiZWwuc3R5bGUuY3NzQ2xhc3N9KTtmLmF0dHIoe3JlbDppfSksZS5hcHBlbmRDaGlsZChmLm5vZGUpLHRoaXMuc2V0T3JpZW50YXRpb25zKHQsaSl9fX0se2tleToiZHJhd1hBeGlzQW5ub3RhdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMudyxpPXRoaXMuZ3JhcGhpY3MuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLXhheGlzLWFubm90YXRpb25zIn0pO3JldHVybiBlLmNvbmZpZy5hbm5vdGF0aW9ucy54YXhpcy5tYXAoZnVuY3Rpb24oZSxzKXt0LmFkZFhheGlzQW5ub3RhdGlvbihlLGkubm9kZSxzKX0pLGl9fSx7a2V5OiJhZGRZYXhpc0Fubm90YXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcyxhLG49dGhpcy53LHI9dC5zdHJva2VEYXNoQXJyYXk7aWYodGhpcy5pbnZlcnRBeGlzKXt2YXIgbz1uLmdsb2JhbHMubGFiZWxzLmluZGV4T2YodC55KSxsPW4uZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3IoIi5hcGV4Y2hhcnRzLXlheGlzLXRleHRzLWcgdGV4dDpudGgtY2hpbGQoIisobysxKSsiKSIpO2wmJihzPXBhcnNlRmxvYXQobC5nZXRBdHRyaWJ1dGUoInkiKSkpfWVsc2Ugcz1uLmdsb2JhbHMuZ3JpZEhlaWdodC0odC55LW4uZ2xvYmFscy5taW5ZQXJyW3QueUF4aXNJbmRleF0pLyhuLmdsb2JhbHMueVJhbmdlW3QueUF4aXNJbmRleF0vbi5nbG9iYWxzLmdyaWRIZWlnaHQpLG4uY29uZmlnLnlheGlzW3QueUF4aXNJbmRleF0mJm4uY29uZmlnLnlheGlzW3QueUF4aXNJbmRleF0ucmV2ZXJzZWQmJihzPSh0Lnktbi5nbG9iYWxzLm1pbllBcnJbdC55QXhpc0luZGV4XSkvKG4uZ2xvYmFscy55UmFuZ2VbdC55QXhpc0luZGV4XS9uLmdsb2JhbHMuZ3JpZEhlaWdodCkpO3ZhciBoPXQubGFiZWwudGV4dDtpZihudWxsPT09dC55Mil7dmFyIGM9dGhpcy5ncmFwaGljcy5kcmF3TGluZSgwK3Qub2Zmc2V0WCxzK3Qub2Zmc2V0WSxuLmdsb2JhbHMuZ3JpZFdpZHRoK3Qub2Zmc2V0WCxzK3Qub2Zmc2V0WSx0LmJvcmRlckNvbG9yLHIpO2UuYXBwZW5kQ2hpbGQoYy5ub2RlKX1lbHNle2lmKHRoaXMuaW52ZXJ0QXhpcyl7dmFyIGQ9bi5nbG9iYWxzLmxhYmVscy5pbmRleE9mKHQueTIpLHU9bi5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMteWF4aXMtdGV4dHMtZyB0ZXh0Om50aC1jaGlsZCgiKyhkKzEpKyIpIik7dSYmKGE9cGFyc2VGbG9hdCh1LmdldEF0dHJpYnV0ZSgieSIpKSl9ZWxzZSBhPW4uZ2xvYmFscy5ncmlkSGVpZ2h0LSh0LnkyLW4uZ2xvYmFscy5taW5ZQXJyW3QueUF4aXNJbmRleF0pLyhuLmdsb2JhbHMueVJhbmdlW3QueUF4aXNJbmRleF0vbi5nbG9iYWxzLmdyaWRIZWlnaHQpLG4uY29uZmlnLnlheGlzW3QueUF4aXNJbmRleF0mJm4uY29uZmlnLnlheGlzW3QueUF4aXNJbmRleF0ucmV2ZXJzZWQmJihhPSh0LnkyLW4uZ2xvYmFscy5taW5ZQXJyW3QueUF4aXNJbmRleF0pLyhuLmdsb2JhbHMueVJhbmdlW3QueUF4aXNJbmRleF0vbi5nbG9iYWxzLmdyaWRIZWlnaHQpKTtpZihhPnMpe3ZhciBnPXM7cz1hLGE9Z31pZihoKXt2YXIgZj10aGlzLmdyYXBoaWNzLmRyYXdSZWN0KDArdC5vZmZzZXRYLGErdC5vZmZzZXRZLG4uZ2xvYmFscy5ncmlkV2lkdGgrdC5vZmZzZXRYLHMtYSwwLHQuZmlsbENvbG9yLHQub3BhY2l0eSwxLHQuYm9yZGVyQ29sb3Iscik7ZS5hcHBlbmRDaGlsZChmLm5vZGUpfX12YXIgcD0icmlnaHQiPT09dC5sYWJlbC5wb3NpdGlvbj9uLmdsb2JhbHMuZ3JpZFdpZHRoOjAseD10aGlzLmdyYXBoaWNzLmRyYXdUZXh0KHt4OnArdC5sYWJlbC5vZmZzZXRYLHk6KGF8fHMpK3QubGFiZWwub2Zmc2V0WS0zLHRleHQ6aCx0ZXh0QW5jaG9yOnQubGFiZWwudGV4dEFuY2hvcixmb250U2l6ZTp0LmxhYmVsLnN0eWxlLmZvbnRTaXplLGZvbnRGYW1pbHk6dC5sYWJlbC5zdHlsZS5mb250RmFtaWx5LGZvcmVDb2xvcjp0LmxhYmVsLnN0eWxlLmNvbG9yLGNzc0NsYXNzOiJhcGV4Y2hhcnRzLXlheGlzLWFubm90YXRpb24tbGFiZWwgIit0LmxhYmVsLnN0eWxlLmNzc0NsYXNzfSk7eC5hdHRyKHtyZWw6aX0pLGUuYXBwZW5kQ2hpbGQoeC5ub2RlKX19LHtrZXk6ImRyYXdZQXhpc0Fubm90YXRpb25zIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLncsaT10aGlzLmdyYXBoaWNzLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy15YXhpcy1hbm5vdGF0aW9ucyJ9KTtyZXR1cm4gZS5jb25maWcuYW5ub3RhdGlvbnMueWF4aXMubWFwKGZ1bmN0aW9uKGUscyl7dC5hZGRZYXhpc0Fubm90YXRpb24oZSxpLm5vZGUscyl9KSxpfX0se2tleToiY2xlYXJBbm5vdGF0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dC53Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy15YXhpcy1hbm5vdGF0aW9ucywgLmFwZXhjaGFydHMteGF4aXMtYW5ub3RhdGlvbnMsIC5hcGV4Y2hhcnRzLXBvaW50LWFubm90YXRpb25zIik7KGU9dS5saXN0VG9BcnJheShlKSkuZm9yRWFjaChmdW5jdGlvbih0KXtmb3IoO3QuZmlyc3RDaGlsZDspdC5yZW1vdmVDaGlsZCh0LmZpcnN0Q2hpbGQpfSl9fSx7a2V5OiJhZGRQb2ludEFubm90YXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcz10aGlzLncsYT0wLG49MCxyPTA7aWYodGhpcy5pbnZlcnRBeGlzJiZjb25zb2xlLndhcm4oIlBvaW50IGFubm90YXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBob3Jpem9udGFsIGJhciBjaGFydHMuIiksInN0cmluZyI9PXR5cGVvZiB0Lngpe3ZhciBvPXMuZ2xvYmFscy5sYWJlbHMuaW5kZXhPZih0LngpLGw9cy5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMteGF4aXMtdGV4dHMtZyB0ZXh0Om50aC1jaGlsZCgiKyhvKzEpKyIpIik7YT1wYXJzZUZsb2F0KGwuZ2V0QXR0cmlidXRlKCJ4IikpO3ZhciBoPXQueTtudWxsPT09dC55JiYoaD1zLmdsb2JhbHMuc2VyaWVzW3Quc2VyaWVzSW5kZXhdW29dKSxuPXMuZ2xvYmFscy5ncmlkSGVpZ2h0LShoLXMuZ2xvYmFscy5taW5ZQXJyW3QueUF4aXNJbmRleF0pLyhzLmdsb2JhbHMueVJhbmdlW3QueUF4aXNJbmRleF0vcy5nbG9iYWxzLmdyaWRIZWlnaHQpLXBhcnNlSW50KHQubGFiZWwuc3R5bGUuZm9udFNpemUpLXQubWFya2VyLnNpemUscj1zLmdsb2JhbHMuZ3JpZEhlaWdodC0oaC1zLmdsb2JhbHMubWluWUFyclt0LnlBeGlzSW5kZXhdKS8ocy5nbG9iYWxzLnlSYW5nZVt0LnlBeGlzSW5kZXhdL3MuZ2xvYmFscy5ncmlkSGVpZ2h0KSxzLmNvbmZpZy55YXhpc1t0LnlBeGlzSW5kZXhdJiZzLmNvbmZpZy55YXhpc1t0LnlBeGlzSW5kZXhdLnJldmVyc2VkJiYobj0oaC1zLmdsb2JhbHMubWluWUFyclt0LnlBeGlzSW5kZXhdKS8ocy5nbG9iYWxzLnlSYW5nZVt0LnlBeGlzSW5kZXhdL3MuZ2xvYmFscy5ncmlkSGVpZ2h0KStwYXJzZUludCh0LmxhYmVsLnN0eWxlLmZvbnRTaXplKSt0Lm1hcmtlci5zaXplLHI9KGgtcy5nbG9iYWxzLm1pbllBcnJbdC55QXhpc0luZGV4XSkvKHMuZ2xvYmFscy55UmFuZ2VbdC55QXhpc0luZGV4XS9zLmdsb2JhbHMuZ3JpZEhlaWdodCkpfWVsc2UgYT0odC54LXMuZ2xvYmFscy5taW5YKS8ocy5nbG9iYWxzLnhSYW5nZS9zLmdsb2JhbHMuZ3JpZFdpZHRoKSxuPXMuZ2xvYmFscy5ncmlkSGVpZ2h0LShwYXJzZUZsb2F0KHQueSktcy5nbG9iYWxzLm1pbllBcnJbdC55QXhpc0luZGV4XSkvKHMuZ2xvYmFscy55UmFuZ2VbdC55QXhpc0luZGV4XS9zLmdsb2JhbHMuZ3JpZEhlaWdodCktcGFyc2VJbnQodC5sYWJlbC5zdHlsZS5mb250U2l6ZSktdC5tYXJrZXIuc2l6ZSxyPXMuZ2xvYmFscy5ncmlkSGVpZ2h0LSh0Lnktcy5nbG9iYWxzLm1pbllBcnJbdC55QXhpc0luZGV4XSkvKHMuZ2xvYmFscy55UmFuZ2VbdC55QXhpc0luZGV4XS9zLmdsb2JhbHMuZ3JpZEhlaWdodCkscy5jb25maWcueWF4aXNbdC55QXhpc0luZGV4XSYmcy5jb25maWcueWF4aXNbdC55QXhpc0luZGV4XS5yZXZlcnNlZCYmKG49KHBhcnNlRmxvYXQodC55KS1zLmdsb2JhbHMubWluWUFyclt0LnlBeGlzSW5kZXhdKS8ocy5nbG9iYWxzLnlSYW5nZVt0LnlBeGlzSW5kZXhdL3MuZ2xvYmFscy5ncmlkSGVpZ2h0KS1wYXJzZUludCh0LmxhYmVsLnN0eWxlLmZvbnRTaXplKS10Lm1hcmtlci5zaXplLHI9KHQueS1zLmdsb2JhbHMubWluWUFyclt0LnlBeGlzSW5kZXhdKS8ocy5nbG9iYWxzLnlSYW5nZVt0LnlBeGlzSW5kZXhdL3MuZ2xvYmFscy5ncmlkSGVpZ2h0KSk7aWYoIShhPDB8fGE+cy5nbG9iYWxzLmdyaWRXaWR0aCkpe3ZhciBjPXtwU2l6ZTp0Lm1hcmtlci5zaXplLHBXaWR0aDp0Lm1hcmtlci5zdHJva2VXaWR0aCxwb2ludEZpbGxDb2xvcjp0Lm1hcmtlci5maWxsQ29sb3IscG9pbnRTdHJva2VDb2xvcjp0Lm1hcmtlci5zdHJva2VDb2xvcixzaGFwZTp0Lm1hcmtlci5zaGFwZSxyYWRpdXM6dC5tYXJrZXIucmFkaXVzLGNsYXNzOiJhcGV4Y2hhcnRzLXBvaW50LWFubm90YXRpb24tbWFya2VyICIrdC5tYXJrZXIuY3NzQ2xhc3N9LGQ9dGhpcy5ncmFwaGljcy5kcmF3TWFya2VyKGErdC5tYXJrZXIub2Zmc2V0WCxyK3QubWFya2VyLm9mZnNldFksYyk7ZS5hcHBlbmRDaGlsZChkLm5vZGUpO3ZhciB1PXQubGFiZWwudGV4dD90LmxhYmVsLnRleHQ6IiIsZz10aGlzLmdyYXBoaWNzLmRyYXdUZXh0KHt4OmErdC5sYWJlbC5vZmZzZXRYLHk6bit0LmxhYmVsLm9mZnNldFksdGV4dDp1LHRleHRBbmNob3I6dC5sYWJlbC50ZXh0QW5jaG9yLGZvbnRTaXplOnQubGFiZWwuc3R5bGUuZm9udFNpemUsZm9udEZhbWlseTp0LmxhYmVsLnN0eWxlLmZvbnRGYW1pbHksZm9yZUNvbG9yOnQubGFiZWwuc3R5bGUuY29sb3IsY3NzQ2xhc3M6ImFwZXhjaGFydHMtcG9pbnQtYW5ub3RhdGlvbi1sYWJlbCAiK3QubGFiZWwuc3R5bGUuY3NzQ2xhc3N9KTtpZihnLmF0dHIoe3JlbDppfSksZS5hcHBlbmRDaGlsZChnLm5vZGUpLHQuY3VzdG9tU1ZHLlNWRyl7dmFyIGY9dGhpcy5ncmFwaGljcy5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMtcG9pbnQtYW5ub3RhdGlvbnMtY3VzdG9tLXN2ZyAiK3QuY3VzdG9tU1ZHLmNzc0NsYXNzfSk7Zi5hdHRyKHt0cmFuc2Zvcm06InRyYW5zbGF0ZSgiLmNvbmNhdChhK3QuY3VzdG9tU1ZHLm9mZnNldFgsIiwgIikuY29uY2F0KG4rdC5jdXN0b21TVkcub2Zmc2V0WSwiKSIpfSksZi5ub2RlLmlubmVySFRNTD10LmN1c3RvbVNWRy5TVkcsZS5hcHBlbmRDaGlsZChmLm5vZGUpfX19fSx7a2V5OiJkcmF3UG9pbnRBbm5vdGF0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy53LGk9dGhpcy5ncmFwaGljcy5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMtcG9pbnQtYW5ub3RhdGlvbnMifSk7cmV0dXJuIGUuY29uZmlnLmFubm90YXRpb25zLnBvaW50cy5tYXAoZnVuY3Rpb24oZSxzKXt0LmFkZFBvaW50QW5ub3RhdGlvbihlLGkubm9kZSxzKX0pLGl9fSx7a2V5OiJzZXRPcmllbnRhdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpudWxsLGk9dGhpcy53O2lmKCJ2ZXJ0aWNhbCI9PT10LmxhYmVsLm9yaWVudGF0aW9uKXt2YXIgcz1udWxsIT09ZT9lOjAsYT1pLmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy14YXhpcy1hbm5vdGF0aW9ucyAuYXBleGNoYXJ0cy14YXhpcy1hbm5vdGF0aW9uLWxhYmVsW3JlbD0nIi5jb25jYXQocywiJ10iKSk7aWYobnVsbCE9PWEpe3ZhciBuPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7YS5zZXRBdHRyaWJ1dGUoIngiLHBhcnNlRmxvYXQoYS5nZXRBdHRyaWJ1dGUoIngiKSktbi5oZWlnaHQrNCksInRvcCI9PT10LmxhYmVsLnBvc2l0aW9uP2Euc2V0QXR0cmlidXRlKCJ5IixwYXJzZUZsb2F0KGEuZ2V0QXR0cmlidXRlKCJ5IikpK24ud2lkdGgpOmEuc2V0QXR0cmlidXRlKCJ5IixwYXJzZUZsb2F0KGEuZ2V0QXR0cmlidXRlKCJ5IikpLW4ud2lkdGgpO3ZhciByPXRoaXMuZ3JhcGhpY3Mucm90YXRlQXJvdW5kQ2VudGVyKGEpLG89ci54LGw9ci55O2Euc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJyb3RhdGUoLTkwICIuY29uY2F0KG8sIiAiKS5jb25jYXQobCwiKSIpKX19fX0se2tleToiYWRkQmFja2dyb3VuZFRvQW5ubyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnc7aWYoIWUubGFiZWwudGV4dHx8ZS5sYWJlbC50ZXh0JiYhZS5sYWJlbC50ZXh0LnRyaW0oKSlyZXR1cm4gbnVsbDt2YXIgcz1pLmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy1ncmlkIikuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ZS5sYWJlbC5zdHlsZS5wYWRkaW5nLmxlZnQscj1lLmxhYmVsLnN0eWxlLnBhZGRpbmcucmlnaHQsbz1lLmxhYmVsLnN0eWxlLnBhZGRpbmcudG9wLGw9ZS5sYWJlbC5zdHlsZS5wYWRkaW5nLmJvdHRvbTsidmVydGljYWwiPT09ZS5sYWJlbC5vcmllbnRhdGlvbiYmKG89ZS5sYWJlbC5zdHlsZS5wYWRkaW5nLmxlZnQsbD1lLmxhYmVsLnN0eWxlLnBhZGRpbmcucmlnaHQsbj1lLmxhYmVsLnN0eWxlLnBhZGRpbmcudG9wLHI9ZS5sYWJlbC5zdHlsZS5wYWRkaW5nLmJvdHRvbSk7dmFyIGg9YS5sZWZ0LXMubGVmdC1uLGM9YS50b3Atcy50b3AtbztyZXR1cm4gdGhpcy5ncmFwaGljcy5kcmF3UmVjdChoLGMsYS53aWR0aCtuK3IsYS5oZWlnaHQrbytsLDAsZS5sYWJlbC5zdHlsZS5iYWNrZ3JvdW5kLDEsZS5sYWJlbC5ib3JkZXJXaWR0aCxlLmxhYmVsLmJvcmRlckNvbG9yLDApfX0se2tleToiYW5ub3RhdGlvbnNCYWNrZ3JvdW5kIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLncsaT1mdW5jdGlvbihpLHMsYSl7dmFyIG49ZS5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtIi5jb25jYXQoYSwiLWFubm90YXRpb25zIC5hcGV4Y2hhcnRzLSIpLmNvbmNhdChhLCItYW5ub3RhdGlvbi1sYWJlbFtyZWw9JyIpLmNvbmNhdChzLCInXSIpKTtpZihuKXt2YXIgcj1uLnBhcmVudE5vZGUsbz10LmFkZEJhY2tncm91bmRUb0Fubm8obixpKTtvJiZyLmluc2VydEJlZm9yZShvLm5vZGUsbil9fTtlLmNvbmZpZy5hbm5vdGF0aW9ucy54YXhpcy5tYXAoZnVuY3Rpb24odCxlKXtpKHQsZSwieGF4aXMiKX0pLGUuY29uZmlnLmFubm90YXRpb25zLnlheGlzLm1hcChmdW5jdGlvbih0LGUpe2kodCxlLCJ5YXhpcyIpfSksZS5jb25maWcuYW5ub3RhdGlvbnMucG9pbnRzLm1hcChmdW5jdGlvbih0LGUpe2kodCxlLCJwb2ludCIpfSl9fSx7a2V5OiJhZGRUZXh0Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIHM9dC54LGE9dC55LG49dC50ZXh0LHI9dC50ZXh0QW5jaG9yLG89dC5hcHBlbmRUbyxsPXZvaWQgMD09PW8/Ii5hcGV4Y2hhcnRzLWlubmVyIjpvLGg9dC5mb3JlQ29sb3IsYz10LmZvbnRTaXplLGQ9dC5mb250RmFtaWx5LHU9dC5jc3NDbGFzcyxnPXQuYmFja2dyb3VuZENvbG9yLGY9dC5ib3JkZXJXaWR0aCxwPXQuc3Ryb2tlRGFzaEFycmF5LHg9dC5yYWRpdXMsYj10LmJvcmRlckNvbG9yLG09dC5wYWRkaW5nTGVmdCx2PXZvaWQgMD09PW0/NDptLHk9dC5wYWRkaW5nUmlnaHQsdz12b2lkIDA9PT15PzQ6eSxrPXQucGFkZGluZ0JvdHRvbSxBPXZvaWQgMD09PWs/MjprLFM9dC5wYWRkaW5nVG9wLEM9dm9pZCAwPT09Uz8yOlMsTD1pLFA9TC53LHo9UC5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcihsKSxNPXRoaXMuZ3JhcGhpY3MuZHJhd1RleHQoe3g6cyx5OmEsdGV4dDpuLHRleHRBbmNob3I6cnx8InN0YXJ0Iixmb250U2l6ZTpjfHwiMTJweCIsZm9udEZhbWlseTpkfHxQLmNvbmZpZy5jaGFydC5mb250RmFtaWx5LGZvcmVDb2xvcjpofHxQLmNvbmZpZy5jaGFydC5mb3JlQ29sb3IsY3NzQ2xhc3M6dX0pO3ouYXBwZW5kQ2hpbGQoTS5ub2RlKTt2YXIgRT1NLmJib3goKTtpZihuKXt2YXIgVD10aGlzLmdyYXBoaWNzLmRyYXdSZWN0KEUueC12LEUueS1DLEUud2lkdGgrdit3LEUuaGVpZ2h0K0ErQyx4LGcsMSxmLGIscCk7TS5iZWZvcmUoVCl9cmV0dXJuIGUmJlAuZ2xvYmFscy5tZW1vcnkubWV0aG9kc1RvRXhlYy5wdXNoKHtjb250ZXh0OkwsbWV0aG9kOkwuYWRkVGV4dCxwYXJhbXM6e3g6cyx5OmEsdGV4dDpuLHRleHRBbmNob3I6cixhcHBlbmRUbzpsLGZvcmVDb2xvcjpoLGZvbnRTaXplOmMsY3NzQ2xhc3M6dSxiYWNrZ3JvdW5kQ29sb3I6Zyxib3JkZXJXaWR0aDpmLHN0cm9rZURhc2hBcnJheTpwLHJhZGl1czp4LGJvcmRlckNvbG9yOmIscGFkZGluZ0xlZnQ6dixwYWRkaW5nUmlnaHQ6dyxwYWRkaW5nQm90dG9tOkEscGFkZGluZ1RvcDpDfX0pLGl9fSx7a2V5OiJhZGRQb2ludEFubm90YXRpb25FeHRlcm5hbCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB2b2lkIDA9PT10aGlzLmludmVydEF4aXMmJih0aGlzLmludmVydEF4aXM9aS53Lmdsb2JhbHMuaXNCYXJIb3Jpem9udGFsKSx0aGlzLmFkZEFubm90YXRpb25FeHRlcm5hbCh7cGFyYW1zOnQscHVzaFRvTWVtb3J5OmUsY29udGV4dDppLHR5cGU6InBvaW50Iixjb250ZXh0TWV0aG9kOmkuYWRkUG9pbnRBbm5vdGF0aW9ufSksaX19LHtrZXk6ImFkZFlheGlzQW5ub3RhdGlvbkV4dGVybmFsIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMuYWRkQW5ub3RhdGlvbkV4dGVybmFsKHtwYXJhbXM6dCxwdXNoVG9NZW1vcnk6ZSxjb250ZXh0OmksdHlwZToieWF4aXMiLGNvbnRleHRNZXRob2Q6aS5hZGRZYXhpc0Fubm90YXRpb259KSxpfX0se2tleToiYWRkWGF4aXNBbm5vdGF0aW9uRXh0ZXJuYWwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5hZGRBbm5vdGF0aW9uRXh0ZXJuYWwoe3BhcmFtczp0LHB1c2hUb01lbW9yeTplLGNvbnRleHQ6aSx0eXBlOiJ4YXhpcyIsY29udGV4dE1ldGhvZDppLmFkZFhheGlzQW5ub3RhdGlvbn0pLGl9fSx7a2V5OiJhZGRBbm5vdGF0aW9uRXh0ZXJuYWwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQucGFyYW1zLGk9dC5wdXNoVG9NZW1vcnkscz10LmNvbnRleHQsYT10LnR5cGUsbj10LmNvbnRleHRNZXRob2Qscj1zLG89ci53LGw9by5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtIi5jb25jYXQoYSwiLWFubm90YXRpb25zIikpLGg9bC5jaGlsZE5vZGVzLmxlbmd0aCsxLGM9bmV3IGIsZD1PYmplY3QuYXNzaWduKHt9LCJ4YXhpcyI9PT1hP2MueEF4aXNBbm5vdGF0aW9uOiJ5YXhpcyI9PT1hP2MueUF4aXNBbm5vdGF0aW9uOmMucG9pbnRBbm5vdGF0aW9uKSxnPXUuZXh0ZW5kKGQsZSk7c3dpdGNoKGEpe2Nhc2UieGF4aXMiOnRoaXMuYWRkWGF4aXNBbm5vdGF0aW9uKGcsbCxoKTticmVhaztjYXNlInlheGlzIjp0aGlzLmFkZFlheGlzQW5ub3RhdGlvbihnLGwsaCk7YnJlYWs7Y2FzZSJwb2ludCI6dGhpcy5hZGRQb2ludEFubm90YXRpb24oZyxsLGgpfXZhciBmPW8uZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3IoIi5hcGV4Y2hhcnRzLSIuY29uY2F0KGEsIi1hbm5vdGF0aW9ucyAuYXBleGNoYXJ0cy0iKS5jb25jYXQoYSwiLWFubm90YXRpb24tbGFiZWxbcmVsPSciKS5jb25jYXQoaCwiJ10iKSkscD10aGlzLmFkZEJhY2tncm91bmRUb0Fubm8oZixnKTtyZXR1cm4gcCYmbC5pbnNlcnRCZWZvcmUocC5ub2RlLGYpLGkmJm8uZ2xvYmFscy5tZW1vcnkubWV0aG9kc1RvRXhlYy5wdXNoKHtjb250ZXh0OnIsbWV0aG9kOm4scGFyYW1zOmV9KSxzfX1dKSx0fSgpLHY9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGkpe2UodGhpcyx0KSx0aGlzLmN0eD1pLHRoaXMudz1pLncsdGhpcy5tb250aHMzMT1bMSwzLDUsNyw4LDEwLDEyXSx0aGlzLm1vbnRoczMwPVsyLDQsNiw5LDExXSx0aGlzLmRheXNDbnRPZlllYXI9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF19cmV0dXJuIHModCxbe2tleToiaXNWYWxpZERhdGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiFpc05hTih0aGlzLnBhcnNlRGF0ZSh0KSl9fSx7a2V5OiJnZXRVVENUaW1lU3RhbXAiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBEYXRlLnBhcnNlKHQpP25ldyBEYXRlKG5ldyBEYXRlKHQpLnRvSVNPU3RyaW5nKCkuc3Vic3RyKDAsMjUpKS5nZXRUaW1lKCk6dH19LHtrZXk6InBhcnNlRGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9RGF0ZS5wYXJzZSh0KTtpZighaXNOYU4oZSkpcmV0dXJuIHRoaXMuZ2V0VVRDVGltZVN0YW1wKHQpO3ZhciBpPURhdGUucGFyc2UodC5yZXBsYWNlKC8tL2csIi8iKS5yZXBsYWNlKC9bYS16XSsvZ2ksIiAiKSk7cmV0dXJuIGk9dGhpcy5nZXRVVENUaW1lU3RhbXAoaSl9fSx7a2V5OiJ0cmVhdEFzVXRjIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgRGF0ZSh0KTtyZXR1cm4gZS5zZXRNaW51dGVzKGUuZ2V0TWludXRlcygpLWUuZ2V0VGltZXpvbmVPZmZzZXQoKSksZX19LHtrZXk6ImZvcm1hdERhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9IShhcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSl8fGFyZ3VtZW50c1syXSxzPSEoYXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10pfHxhcmd1bWVudHNbM10sYT10aGlzLncuZ2xvYmFscy5sb2NhbGUsbj1bIlwwIl0uY29uY2F0KGQoYS5tb250aHMpKSxyPVsiXHgwMSJdLmNvbmNhdChkKGEuc2hvcnRNb250aHMpKSxvPVsiXHgwMiJdLmNvbmNhdChkKGEuZGF5cykpLGw9WyJceDAzIl0uY29uY2F0KGQoYS5zaG9ydERheXMpKTtmdW5jdGlvbiBoKHQsZSl7dmFyIGk9dCsiIjtmb3IoZT1lfHwyO2kubGVuZ3RoPGU7KWk9IjAiK2k7cmV0dXJuIGl9cyYmKHQ9dGhpcy50cmVhdEFzVXRjKHQpKTt2YXIgYz1pP3QuZ2V0VVRDRnVsbFllYXIoKTp0LmdldEZ1bGxZZWFyKCk7ZT0oZT0oZT1lLnJlcGxhY2UoLyhefFteXFxdKXl5eXkrL2csIiQxIitjKSkucmVwbGFjZSgvKF58W15cXF0peXkvZywiJDEiK2MudG9TdHJpbmcoKS5zdWJzdHIoMiwyKSkpLnJlcGxhY2UoLyhefFteXFxdKXkvZywiJDEiK2MpO3ZhciB1PShpP3QuZ2V0VVRDTW9udGgoKTp0LmdldE1vbnRoKCkpKzE7ZT0oZT0oZT0oZT1lLnJlcGxhY2UoLyhefFteXFxdKU1NTU0rL2csIiQxIituWzBdKSkucmVwbGFjZSgvKF58W15cXF0pTU1NL2csIiQxIityWzBdKSkucmVwbGFjZSgvKF58W15cXF0pTU0vZywiJDEiK2godSkpKS5yZXBsYWNlKC8oXnxbXlxcXSlNL2csIiQxIit1KTt2YXIgZz1pP3QuZ2V0VVRDRGF0ZSgpOnQuZ2V0RGF0ZSgpO2U9KGU9KGU9KGU9ZS5yZXBsYWNlKC8oXnxbXlxcXSlkZGRkKy9nLCIkMSIrb1swXSkpLnJlcGxhY2UoLyhefFteXFxdKWRkZC9nLCIkMSIrbFswXSkpLnJlcGxhY2UoLyhefFteXFxdKWRkL2csIiQxIitoKGcpKSkucmVwbGFjZSgvKF58W15cXF0pZC9nLCIkMSIrZyk7dmFyIGY9aT90LmdldFVUQ0hvdXJzKCk6dC5nZXRIb3VycygpLHA9Zj4xMj9mLTEyOjA9PT1mPzEyOmY7ZT0oZT0oZT0oZT1lLnJlcGxhY2UoLyhefFteXFxdKUhIKy9nLCIkMSIraChmKSkpLnJlcGxhY2UoLyhefFteXFxdKUgvZywiJDEiK2YpKS5yZXBsYWNlKC8oXnxbXlxcXSloaCsvZywiJDEiK2gocCkpKS5yZXBsYWNlKC8oXnxbXlxcXSloL2csIiQxIitwKTt2YXIgeD1pP3QuZ2V0VVRDTWludXRlcygpOnQuZ2V0TWludXRlcygpO2U9KGU9ZS5yZXBsYWNlKC8oXnxbXlxcXSltbSsvZywiJDEiK2goeCkpKS5yZXBsYWNlKC8oXnxbXlxcXSltL2csIiQxIit4KTt2YXIgYj1pP3QuZ2V0VVRDU2Vjb25kcygpOnQuZ2V0U2Vjb25kcygpO2U9KGU9ZS5yZXBsYWNlKC8oXnxbXlxcXSlzcysvZywiJDEiK2goYikpKS5yZXBsYWNlKC8oXnxbXlxcXSlzL2csIiQxIitiKTt2YXIgbT1pP3QuZ2V0VVRDTWlsbGlzZWNvbmRzKCk6dC5nZXRNaWxsaXNlY29uZHMoKTtlPWUucmVwbGFjZSgvKF58W15cXF0pZmZmKy9nLCIkMSIraChtLDMpKSxtPU1hdGgucm91bmQobS8xMCksZT1lLnJlcGxhY2UoLyhefFteXFxdKWZmL2csIiQxIitoKG0pKSxtPU1hdGgucm91bmQobS8xMCk7dmFyIHY9ZjwxMj8iQU0iOiJQTSI7ZT0oZT0oZT1lLnJlcGxhY2UoLyhefFteXFxdKWYvZywiJDEiK20pKS5yZXBsYWNlKC8oXnxbXlxcXSlUVCsvZywiJDEiK3YpKS5yZXBsYWNlKC8oXnxbXlxcXSlUL2csIiQxIit2LmNoYXJBdCgwKSk7dmFyIHk9di50b0xvd2VyQ2FzZSgpO2U9KGU9ZS5yZXBsYWNlKC8oXnxbXlxcXSl0dCsvZywiJDEiK3kpKS5yZXBsYWNlKC8oXnxbXlxcXSl0L2csIiQxIit5LmNoYXJBdCgwKSk7dmFyIHc9LXQuZ2V0VGltZXpvbmVPZmZzZXQoKSxrPWl8fCF3PyJaIjp3PjA/IisiOiItIjtpZighaSl7dmFyIEE9KHc9TWF0aC5hYnModykpJTYwO2srPWgoTWF0aC5mbG9vcih3LzYwKSkrIjoiK2goQSl9ZT1lLnJlcGxhY2UoLyhefFteXFxdKUsvZywiJDEiK2spO3ZhciBTPShpP3QuZ2V0VVRDRGF5KCk6dC5nZXREYXkoKSkrMTtyZXR1cm4gZT0oZT0oZT0oZT0oZT1lLnJlcGxhY2UobmV3IFJlZ0V4cChvWzBdLCJnIiksb1tTXSkpLnJlcGxhY2UobmV3IFJlZ0V4cChsWzBdLCJnIiksbFtTXSkpLnJlcGxhY2UobmV3IFJlZ0V4cChuWzBdLCJnIiksblt1XSkpLnJlcGxhY2UobmV3IFJlZ0V4cChyWzBdLCJnIiksclt1XSkpLnJlcGxhY2UoL1xcKC4pL2csIiQxIil9fSx7a2V5OiJnZXRUaW1lVW5pdHNmcm9tVGltZXN0YW1wIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudzt2b2lkIDAhPT1pLmNvbmZpZy54YXhpcy5taW4mJih0PWkuY29uZmlnLnhheGlzLm1pbiksdm9pZCAwIT09aS5jb25maWcueGF4aXMubWF4JiYoZT1pLmNvbmZpZy54YXhpcy5tYXgpO3ZhciBzPW5ldyBEYXRlKHQpLmdldEZ1bGxZZWFyKCksYT1uZXcgRGF0ZShlKS5nZXRGdWxsWWVhcigpLG49bmV3IERhdGUodCkuZ2V0TW9udGgoKSxyPW5ldyBEYXRlKGUpLmdldE1vbnRoKCksbz1uZXcgRGF0ZSh0KS5nZXREYXRlKCksbD1uZXcgRGF0ZShlKS5nZXREYXRlKCksaD1uZXcgRGF0ZSh0KS5nZXRIb3VycygpLGM9bmV3IERhdGUoZSkuZ2V0SG91cnMoKTtyZXR1cm57bWluTWludXRlOm5ldyBEYXRlKHQpLmdldE1pbnV0ZXMoKSxtYXhNaW51dGU6bmV3IERhdGUoZSkuZ2V0TWludXRlcygpLG1pbkhvdXI6aCxtYXhIb3VyOmMsbWluRGF0ZTpvLG1heERhdGU6bCxtaW5Nb250aDpuLG1heE1vbnRoOnIsbWluWWVhcjpzLG1heFllYXI6YX19fSx7a2V5OiJpc0xlYXBZZWFyIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdCU0PT0wJiZ0JTEwMCE9MHx8dCU0MDA9PTB9fSx7a2V5OiJjYWxjdWxjYXRlTGFzdERheXNPZk1vbnRoIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMuZGV0ZXJtaW5lRGF5c09mTW9udGhzKHQsZSktaX19LHtrZXk6ImRldGVybWluZURheXNPZlllYXIiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPTM2NTtyZXR1cm4gdGhpcy5pc0xlYXBZZWFyKHQpJiYoZT0zNjYpLGV9fSx7a2V5OiJkZXRlcm1pbmVSZW1haW5pbmdEYXlzT2ZZZWFyIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIHM9dGhpcy5kYXlzQ250T2ZZZWFyW2VdK2k7cmV0dXJuIGU+MSYmdGhpcy5pc0xlYXBZZWFyKCkmJnMrKyxzfX0se2tleToiZGV0ZXJtaW5lRGF5c09mTW9udGhzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPTMwO3N3aXRjaCh0PXUubW9udGhNb2QodCksITApe2Nhc2UgdGhpcy5tb250aHMzMC5pbmRleE9mKHQpPi0xOjI9PT10JiYoaT10aGlzLmlzTGVhcFllYXIoZSk/Mjk6MjgpO2JyZWFrO2Nhc2UgdGhpcy5tb250aHMzMS5pbmRleE9mKHQpPi0xOmRlZmF1bHQ6aT0zMX1yZXR1cm4gaX19XSksdH0oKSx5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy5vcHRzPWl9cmV0dXJuIHModCxbe2tleToibGluZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57Y2hhcnQ6e2FuaW1hdGlvbnM6e2Vhc2luZzoic3dpbmcifX0sZGF0YUxhYmVsczp7ZW5hYmxlZDohMX0sc3Ryb2tlOnt3aWR0aDo1LGN1cnZlOiJzdHJhaWdodCJ9LG1hcmtlcnM6e3NpemU6MCxob3Zlcjp7c2l6ZU9mZnNldDo2fX0seGF4aXM6e2Nyb3NzaGFpcnM6e3dpZHRoOjF9fX19fSx7a2V5OiJzcGFya2xpbmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0cy55YXhpc1swXS5sYWJlbHMuc2hvdz0hMSx0aGlzLm9wdHMueWF4aXNbMF0uZmxvYXRpbmc9ITA7cmV0dXJuIHUuZXh0ZW5kKHQse2dyaWQ6e3Nob3c6ITEscGFkZGluZzp7bGVmdDowLHJpZ2h0OjAsdG9wOjAsYm90dG9tOjB9fSxsZWdlbmQ6e3Nob3c6ITF9LHhheGlzOntsYWJlbHM6e3Nob3c6ITF9LHRvb2x0aXA6e2VuYWJsZWQ6ITF9LGF4aXNCb3JkZXI6e3Nob3c6ITF9fSxjaGFydDp7dG9vbGJhcjp7c2hvdzohMX0sem9vbTp7ZW5hYmxlZDohMX19LGRhdGFMYWJlbHM6e2VuYWJsZWQ6ITF9fSl9fSx7a2V5OiJiYXIiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2NoYXJ0OntzdGFja2VkOiExLGFuaW1hdGlvbnM6e2Vhc2luZzoic3dpbmcifX0scGxvdE9wdGlvbnM6e2Jhcjp7ZGF0YUxhYmVsczp7cG9zaXRpb246ImNlbnRlciJ9fX0sZGF0YUxhYmVsczp7c3R5bGU6e2NvbG9yczpbIiNmZmYiXX19LHN0cm9rZTp7d2lkdGg6MH0sZmlsbDp7b3BhY2l0eTouODV9LGxlZ2VuZDp7bWFya2Vyczp7c2hhcGU6InNxdWFyZSIscmFkaXVzOjIsc2l6ZTo4fX0sdG9vbHRpcDp7c2hhcmVkOiExfSx4YXhpczp7dG9vbHRpcDp7ZW5hYmxlZDohMX0sY3Jvc3NoYWlyczp7d2lkdGg6ImJhcldpZHRoIixwb3NpdGlvbjoiYmFjayIsZmlsbDp7dHlwZToiZ3JhZGllbnQifSxkcm9wU2hhZG93OntlbmFibGVkOiExfSxzdHJva2U6e3dpZHRoOjB9fX19fX0se2tleToiY2FuZGxlc3RpY2siLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3N0cm9rZTp7d2lkdGg6MSxjb2xvcnM6WyIjMzMzIl19LGRhdGFMYWJlbHM6e2VuYWJsZWQ6ITF9LHRvb2x0aXA6e3NoYXJlZDohMCxjdXN0b206ZnVuY3Rpb24odCl7dmFyIGU9dC5zZXJpZXNJbmRleCxpPXQuZGF0YVBvaW50SW5kZXgscz10Lnc7cmV0dXJuJzxkaXYgY2xhc3M9ImFwZXhjaGFydHMtdG9vbHRpcC1jYW5kbGVzdGljayI+PGRpdj5PcGVuOiA8c3BhbiBjbGFzcz0idmFsdWUiPicrcy5nbG9iYWxzLnNlcmllc0NhbmRsZU9bZV1baV0rJzwvc3Bhbj48L2Rpdj48ZGl2PkhpZ2g6IDxzcGFuIGNsYXNzPSJ2YWx1ZSI+JytzLmdsb2JhbHMuc2VyaWVzQ2FuZGxlSFtlXVtpXSsnPC9zcGFuPjwvZGl2PjxkaXY+TG93OiA8c3BhbiBjbGFzcz0idmFsdWUiPicrcy5nbG9iYWxzLnNlcmllc0NhbmRsZUxbZV1baV0rJzwvc3Bhbj48L2Rpdj48ZGl2PkNsb3NlOiA8c3BhbiBjbGFzcz0idmFsdWUiPicrcy5nbG9iYWxzLnNlcmllc0NhbmRsZUNbZV1baV0rIjwvc3Bhbj48L2Rpdj48L2Rpdj4ifX0sc3RhdGVzOnthY3RpdmU6e2ZpbHRlcjp7dHlwZToibm9uZSJ9fX0seGF4aXM6e2Nyb3NzaGFpcnM6e3dpZHRoOjF9fX19fSx7a2V5OiJyYW5nZUJhciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57c3Ryb2tlOnt3aWR0aDowfSxwbG90T3B0aW9uczp7YmFyOntkYXRhTGFiZWxzOntwb3NpdGlvbjoiY2VudGVyIn19fSxkYXRhTGFiZWxzOntlbmFibGVkOiExLGZvcm1hdHRlcjpmdW5jdGlvbih0LGUpe2UuY3R4O3ZhciBpPWUuc2VyaWVzSW5kZXgscz1lLmRhdGFQb2ludEluZGV4LGE9ZS53LG49YS5nbG9iYWxzLnNlcmllc1JhbmdlU3RhcnRbaV1bc107cmV0dXJuIGEuZ2xvYmFscy5zZXJpZXNSYW5nZUVuZFtpXVtzXS1ufSxzdHlsZTp7Y29sb3JzOlsiI2ZmZiJdfX0sdG9vbHRpcDp7c2hhcmVkOiExLGZvbGxvd0N1cnNvcjohMCxjdXN0b206ZnVuY3Rpb24odCl7dmFyIGU9dC5jdHgsaT10LnNlcmllc0luZGV4LHM9dC5kYXRhUG9pbnRJbmRleCxhPXQudyxuPWEuZ2xvYmFscy5zZXJpZXNSYW5nZVN0YXJ0W2ldW3NdLHI9YS5nbG9iYWxzLnNlcmllc1JhbmdlRW5kW2ldW3NdLG89IiIsbD0iIixoPWEuZ2xvYmFscy5jb2xvcnNbaV07aWYodm9pZCAwPT09YS5jb25maWcudG9vbHRpcC54LmZvcm1hdHRlcilpZigiZGF0ZXRpbWUiPT09YS5jb25maWcueGF4aXMudHlwZSl7dmFyIGM9bmV3IHYoZSk7bz1jLmZvcm1hdERhdGUobmV3IERhdGUobiksYS5jb25maWcudG9vbHRpcC54LmZvcm1hdCwhMCwhMCksbD1jLmZvcm1hdERhdGUobmV3IERhdGUociksYS5jb25maWcudG9vbHRpcC54LmZvcm1hdCwhMCwhMCl9ZWxzZSBvPW4sbD1yO2Vsc2Ugbz1hLmNvbmZpZy50b29sdGlwLnguZm9ybWF0dGVyKG4pLGw9YS5jb25maWcudG9vbHRpcC54LmZvcm1hdHRlcihyKTt2YXIgZD1hLmdsb2JhbHMubGFiZWxzW3NdO3JldHVybic8ZGl2IGNsYXNzPSJhcGV4Y2hhcnRzLXRvb2x0aXAtcmFuZ2ViYXIiPjxkaXY+IDxzcGFuIGNsYXNzPSJzZXJpZXMtbmFtZSIgc3R5bGU9ImNvbG9yOiAnK2grJyI+JysoYS5jb25maWcuc2VyaWVzW2ldLm5hbWU/YS5jb25maWcuc2VyaWVzW2ldLm5hbWU6IiIpKyc8L3NwYW4+PC9kaXY+PGRpdj4gPHNwYW4gY2xhc3M9ImNhdGVnb3J5Ij4nK2QrJzogPC9zcGFuPiA8c3BhbiBjbGFzcz0idmFsdWUgc3RhcnQtdmFsdWUiPicrbysnPC9zcGFuPiA8c3BhbiBjbGFzcz0ic2VwYXJhdG9yIj4tPC9zcGFuPiA8c3BhbiBjbGFzcz0idmFsdWUgZW5kLXZhbHVlIj4nK2wrIjwvc3Bhbj48L2Rpdj48L2Rpdj4ifX0seGF4aXM6e3Rvb2x0aXA6e2VuYWJsZWQ6ITF9LGNyb3NzaGFpcnM6e3N0cm9rZTp7d2lkdGg6MH19fX19fSx7a2V5OiJhcmVhIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybntzdHJva2U6e3dpZHRoOjR9LGZpbGw6e3R5cGU6ImdyYWRpZW50IixncmFkaWVudDp7aW52ZXJzZUNvbG9yczohMSxzaGFkZToibGlnaHQiLHR5cGU6InZlcnRpY2FsIixvcGFjaXR5RnJvbTouNjUsb3BhY2l0eVRvOi41LHN0b3BzOlswLDEwMCwxMDBdfX0sbWFya2Vyczp7c2l6ZTowLGhvdmVyOntzaXplT2Zmc2V0OjZ9fSx0b29sdGlwOntmb2xsb3dDdXJzb3I6ITF9fX19LHtrZXk6ImJydXNoIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdS5leHRlbmQodCx7Y2hhcnQ6e3Rvb2xiYXI6e2F1dG9TZWxlY3RlZDoic2VsZWN0aW9uIixzaG93OiExfSx6b29tOntlbmFibGVkOiExfX0sZGF0YUxhYmVsczp7ZW5hYmxlZDohMX0sc3Ryb2tlOnt3aWR0aDoxfSx0b29sdGlwOntlbmFibGVkOiExfSx4YXhpczp7dG9vbHRpcDp7ZW5hYmxlZDohMX19fSl9fSx7a2V5OiJzdGFja2VkMTAwIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5vcHRzLmRhdGFMYWJlbHM9dGhpcy5vcHRzLmRhdGFMYWJlbHN8fHt9LHRoaXMub3B0cy5kYXRhTGFiZWxzLmZvcm1hdHRlcj10aGlzLm9wdHMuZGF0YUxhYmVscy5mb3JtYXR0ZXJ8fHZvaWQgMDt2YXIgZT10aGlzLm9wdHMuZGF0YUxhYmVscy5mb3JtYXR0ZXI7dGhpcy5vcHRzLnlheGlzLmZvckVhY2goZnVuY3Rpb24oZSxpKXt0Lm9wdHMueWF4aXNbaV0ubWluPTAsdC5vcHRzLnlheGlzW2ldLm1heD0xMDB9KSwiYmFyIj09PXRoaXMub3B0cy5jaGFydC50eXBlJiYodGhpcy5vcHRzLmRhdGFMYWJlbHMuZm9ybWF0dGVyPWV8fGZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD90LnRvRml4ZWQoMCkrIiUiOnR9KX19LHtrZXk6ImJ1YmJsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZGF0YUxhYmVsczp7c3R5bGU6e2NvbG9yczpbIiNmZmYiXX19LHRvb2x0aXA6e3NoYXJlZDohMSxpbnRlcnNlY3Q6ITB9LHhheGlzOntjcm9zc2hhaXJzOnt3aWR0aDowfX0sZmlsbDp7dHlwZToic29saWQiLGdyYWRpZW50OntzaGFkZToibGlnaHQiLGludmVyc2U6ITAsc2hhZGVJbnRlbnNpdHk6LjU1LG9wYWNpdHlGcm9tOi40LG9wYWNpdHlUbzouOH19fX19LHtrZXk6InNjYXR0ZXIiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2RhdGFMYWJlbHM6e2VuYWJsZWQ6ITF9LHRvb2x0aXA6e3NoYXJlZDohMSxpbnRlcnNlY3Q6ITB9LG1hcmtlcnM6e3NpemU6NixzdHJva2VXaWR0aDoyLGhvdmVyOntzaXplT2Zmc2V0OjJ9fX19fSx7a2V5OiJoZWF0bWFwIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybntjaGFydDp7c3RhY2tlZDohMSx6b29tOntlbmFibGVkOiExfX0sZmlsbDp7b3BhY2l0eToxfSxkYXRhTGFiZWxzOntzdHlsZTp7Y29sb3JzOlsiI2ZmZiJdfX0sc3Ryb2tlOntjb2xvcnM6WyIjZmZmIl19LHRvb2x0aXA6e2ZvbGxvd0N1cnNvcjohMCxtYXJrZXI6e3Nob3c6ITF9LHg6e3Nob3c6ITF9fSxsZWdlbmQ6e3Bvc2l0aW9uOiJ0b3AiLG1hcmtlcnM6e3NoYXBlOiJzcXVhcmUiLHNpemU6MTAsb2Zmc2V0WToyfX0sZ3JpZDp7cGFkZGluZzp7cmlnaHQ6MjB9fX19fSx7a2V5OiJwaWUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2NoYXJ0Ont0b29sYmFyOntzaG93OiExfX0scGxvdE9wdGlvbnM6e3BpZTp7ZG9udXQ6e2xhYmVsczp7c2hvdzohMX19fX0sZGF0YUxhYmVsczp7Zm9ybWF0dGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvRml4ZWQoMSkrIiUifSxzdHlsZTp7Y29sb3JzOlsiI2ZmZiJdfSxkcm9wU2hhZG93OntlbmFibGVkOiEwfX0sc3Ryb2tlOntjb2xvcnM6WyIjZmZmIl19LGZpbGw6e29wYWNpdHk6MSxncmFkaWVudDp7c2hhZGU6ImRhcmsiLHNoYWRlSW50ZW5zaXR5Oi4zNSxpbnZlcnNlQ29sb3JzOiExLHN0b3BzOlswLDEwMCwxMDBdfX0scGFkZGluZzp7cmlnaHQ6MCxsZWZ0OjB9LHRvb2x0aXA6e3RoZW1lOiJkYXJrIixmaWxsU2VyaWVzQ29sb3I6ITB9LGxlZ2VuZDp7cG9zaXRpb246InJpZ2h0In19fX0se2tleToiZG9udXQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2NoYXJ0Ont0b29sYmFyOntzaG93OiExfX0sZGF0YUxhYmVsczp7Zm9ybWF0dGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvRml4ZWQoMSkrIiUifSxzdHlsZTp7Y29sb3JzOlsiI2ZmZiJdfSxkcm9wU2hhZG93OntlbmFibGVkOiEwfX0sc3Ryb2tlOntjb2xvcnM6WyIjZmZmIl19LGZpbGw6e29wYWNpdHk6MSxncmFkaWVudDp7c2hhZGU6ImRhcmsiLHNoYWRlSW50ZW5zaXR5Oi40LGludmVyc2VDb2xvcnM6ITEsdHlwZToidmVydGljYWwiLG9wYWNpdHlGcm9tOjEsb3BhY2l0eVRvOjEsc3RvcHM6WzcwLDk4LDEwMF19fSxwYWRkaW5nOntyaWdodDowLGxlZnQ6MH0sdG9vbHRpcDp7dGhlbWU6ImRhcmsiLGZpbGxTZXJpZXNDb2xvcjohMH0sbGVnZW5kOntwb3NpdGlvbjoicmlnaHQifX19fSx7a2V5OiJyYWRhciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRzLnlheGlzWzBdLmxhYmVscy5zdHlsZS5mb250U2l6ZT0iMTNweCIsdGhpcy5vcHRzLnlheGlzWzBdLmxhYmVscy5vZmZzZXRZPTYse2RhdGFMYWJlbHM6e2VuYWJsZWQ6ITAsc3R5bGU6e2NvbG9yczpbIiNhOGE4YTgiXSxmb250U2l6ZToiMTFweCJ9fSxzdHJva2U6e3dpZHRoOjJ9LG1hcmtlcnM6e3NpemU6MyxzdHJva2VXaWR0aDoxLHN0cm9rZU9wYWNpdHk6MX0sZmlsbDp7b3BhY2l0eTouMn0sdG9vbHRpcDp7c2hhcmVkOiExLGludGVyc2VjdDohMCxmb2xsb3dDdXJzb3I6ITB9LGdyaWQ6e3Nob3c6ITF9LHhheGlzOnt0b29sdGlwOntlbmFibGVkOiExfSxjcm9zc2hhaXJzOntzaG93OiExfX19fX0se2tleToicmFkaWFsQmFyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybntjaGFydDp7YW5pbWF0aW9uczp7ZHluYW1pY0FuaW1hdGlvbjp7ZW5hYmxlZDohMCxzcGVlZDo4MDB9fSx0b29sYmFyOntzaG93OiExfX0sZmlsbDp7Z3JhZGllbnQ6e3NoYWRlOiJkYXJrIixzaGFkZUludGVuc2l0eTouNCxpbnZlcnNlQ29sb3JzOiExLHR5cGU6ImRpYWdvbmFsMiIsb3BhY2l0eUZyb206MSxvcGFjaXR5VG86MSxzdG9wczpbNzAsOTgsMTAwXX19LHBhZGRpbmc6e3JpZ2h0OjAsbGVmdDowfSxsZWdlbmQ6e3Nob3c6ITEscG9zaXRpb246InJpZ2h0In0sdG9vbHRpcDp7ZW5hYmxlZDohMSxmaWxsU2VyaWVzQ29sb3I6ITB9fX19XSxbe2tleToiY29udmVydENhdFRvTnVtZXJpYyIsdmFsdWU6ZnVuY3Rpb24odCl7dC54YXhpcy50eXBlPSJudW1lcmljIix0LnhheGlzLmNvbnZlcnRlZENhdFRvTnVtZXJpYz0hMCx0LnhheGlzLmxhYmVscz10LnhheGlzLmxhYmVsc3x8e30sdC54YXhpcy5sYWJlbHMuZm9ybWF0dGVyPXQueGF4aXMubGFiZWxzLmZvcm1hdHRlcnx8ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHQuY2hhcnQ9dC5jaGFydHx8e30sdC5jaGFydC56b29tPXQuY2hhcnQuem9vbXx8d2luZG93LkFwZXguY2hhcnQmJndpbmRvdy5BcGV4LmNoYXJ0Lnpvb218fHt9O3ZhciBlPXQueGF4aXMubGFiZWxzLmZvcm1hdHRlcixpPXQueGF4aXMuY2F0ZWdvcmllcyYmdC54YXhpcy5jYXRlZ29yaWVzLmxlbmd0aD90LnhheGlzLmNhdGVnb3JpZXM6dC5sYWJlbHM7cmV0dXJuIGkmJmkubGVuZ3RoJiYodC54YXhpcy5sYWJlbHMuZm9ybWF0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBlKGlbdC0xXSl9KSx0LnhheGlzLmNhdGVnb3JpZXM9W10sdC5sYWJlbHM9W10sdC5jaGFydC56b29tLmVuYWJsZWQ9dC5jaGFydC56b29tLmVuYWJsZWR8fCExLHR9fV0pLHR9KCksdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaSl7ZSh0aGlzLHQpLHRoaXMuY3R4PWksdGhpcy53PWkud31yZXR1cm4gcyh0LFt7a2V5OiJnZXRTdGFja2VkU2VyaWVzVG90YWxzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudyxlPVtdO2lmKDA9PT10Lmdsb2JhbHMuc2VyaWVzLmxlbmd0aClyZXR1cm4gZTtmb3IodmFyIGk9MDtpPHQuZ2xvYmFscy5zZXJpZXNbdC5nbG9iYWxzLm1heFZhbHNJbkFycmF5SW5kZXhdLmxlbmd0aDtpKyspe2Zvcih2YXIgcz0wLGE9MDthPHQuZ2xvYmFscy5zZXJpZXMubGVuZ3RoO2ErKylzKz10Lmdsb2JhbHMuc2VyaWVzW2FdW2ldO2UucHVzaChzKX1yZXR1cm4gdC5nbG9iYWxzLnN0YWNrZWRTZXJpZXNUb3RhbHM9ZSxlfX0se2tleToiZ2V0U2VyaWVzVG90YWxCeUluZGV4Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpudWxsO3JldHVybiBudWxsPT09dD90aGlzLncuY29uZmlnLnNlcmllcy5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlfSwwKTp0aGlzLncuZ2xvYmFscy5zZXJpZXNbdF0ucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0sMCl9fSx7a2V5OiJpc1Nlcmllc051bGwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGw7cmV0dXJuIDA9PT0obnVsbD09PXQ/dGhpcy53LmNvbmZpZy5zZXJpZXMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dH0pOnRoaXMudy5nbG9iYWxzLnNlcmllc1t0XS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10fSkpLmxlbmd0aH19LHtrZXk6InNlcmllc0hhdmVTYW1lVmFsdWVzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53Lmdsb2JhbHMuc2VyaWVzW3RdLmV2ZXJ5KGZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdD09PWlbMF19KX19LHtrZXk6ImdldExhcmdlc3RTZXJpZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53O3QuZ2xvYmFscy5tYXhWYWxzSW5BcnJheUluZGV4PXQuZ2xvYmFscy5zZXJpZXMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmxlbmd0aH0pLmluZGV4T2YoTWF0aC5tYXguYXBwbHkoTWF0aCx0Lmdsb2JhbHMuc2VyaWVzLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGh9KSkpfX0se2tleToiZ2V0TGFyZ2VzdE1hcmtlclNpemUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53LGU9MDtyZXR1cm4gdC5nbG9iYWxzLm1hcmtlcnMuc2l6ZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2U9TWF0aC5tYXgoZSx0KX0pLHQuZ2xvYmFscy5tYXJrZXJzLmxhcmdlc3RTaXplPWUsZX19LHtrZXk6ImdldFNlcmllc1RvdGFscyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnc7dC5nbG9iYWxzLnNlcmllc1RvdGFscz10Lmdsb2JhbHMuc2VyaWVzLm1hcChmdW5jdGlvbih0LGUpe3ZhciBpPTA7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKylpKz10W3NdO2Vsc2UgaSs9dDtyZXR1cm4gaX0pfX0se2tleToiZ2V0U2VyaWVzVG90YWxzWFJhbmdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudztyZXR1cm4gaS5nbG9iYWxzLnNlcmllcy5tYXAoZnVuY3Rpb24ocyxhKXtmb3IodmFyIG49MCxyPTA7cjxzLmxlbmd0aDtyKyspaS5nbG9iYWxzLnNlcmllc1hbYV1bcl0+dCYmaS5nbG9iYWxzLnNlcmllc1hbYV1bcl08ZSYmKG4rPXNbcl0pO3JldHVybiBufSl9fSx7a2V5OiJnZXRQZXJjZW50U2VyaWVzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudzt0Lmdsb2JhbHMuc2VyaWVzUGVyY2VudD10Lmdsb2JhbHMuc2VyaWVzLm1hcChmdW5jdGlvbihlLGkpe3ZhciBzPVtdO2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBuPXQuZ2xvYmFscy5zdGFja2VkU2VyaWVzVG90YWxzW2FdLHI9MDtuJiYocj0xMDAqZVthXS9uKSxzLnB1c2gocil9ZWxzZXt2YXIgbz0xMDAqZS90Lmdsb2JhbHMuc2VyaWVzVG90YWxzLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9LDApO3MucHVzaChvKX1yZXR1cm4gc30pfX0se2tleToiZ2V0Q2FsY3VsYXRlZFJhdGlvcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlLGkscyxhLG49dGhpcy53Lmdsb2JhbHMscj1bXSxvPVtdLGw9LjEsaD0wO2lmKG4ueVJhbmdlPVtdLG4uaXNNdWx0aXBsZVlBeGlzKWZvcih2YXIgYz0wO2M8bi5taW5ZQXJyLmxlbmd0aDtjKyspbi55UmFuZ2UucHVzaChNYXRoLmFicyhuLm1pbllBcnJbY10tbi5tYXhZQXJyW2NdKSksby5wdXNoKDApO2Vsc2Ugbi55UmFuZ2UucHVzaChNYXRoLmFicyhuLm1pblktbi5tYXhZKSk7bi54UmFuZ2U9TWF0aC5hYnMobi5tYXhYLW4ubWluWCksbi56UmFuZ2U9TWF0aC5hYnMobi5tYXhaLW4ubWluWik7Zm9yKHZhciBkPTA7ZDxuLnlSYW5nZS5sZW5ndGg7ZCsrKXIucHVzaChuLnlSYW5nZVtkXS9uLmdyaWRIZWlnaHQpO2lmKGU9bi54UmFuZ2Uvbi5ncmlkV2lkdGgsaT1NYXRoLmFicyhuLmluaXRpYWxtYXhYLW4uaW5pdGlhbG1pblgpL24uZ3JpZFdpZHRoLHQ9bi55UmFuZ2Uvbi5ncmlkV2lkdGgscz1uLnhSYW5nZS9uLmdyaWRIZWlnaHQsYT1uLnpSYW5nZS9uLmdyaWRIZWlnaHQqMTYsbi5taW5ZIT09TnVtYmVyLk1JTl9WQUxVRSYmMCE9PU1hdGguYWJzKG4ubWluWSkmJihuLmhhc05lZ3M9ITApLG4uaXNNdWx0aXBsZVlBeGlzKXtvPVtdO2Zvcih2YXIgdT0wO3U8ci5sZW5ndGg7dSsrKW8ucHVzaCgtbi5taW5ZQXJyW3VdL3JbdV0pfWVsc2Ugby5wdXNoKC1uLm1pblkvclswXSksbi5taW5ZIT09TnVtYmVyLk1JTl9WQUxVRSYmMCE9PU1hdGguYWJzKG4ubWluWSkmJihsPS1uLm1pblkvdCxoPW4ubWluWC9lKTtyZXR1cm57eVJhdGlvOnIsaW52ZXJ0ZWRZUmF0aW86dCx6UmF0aW86YSx4UmF0aW86ZSxpbml0aWFsWFJhdGlvOmksaW52ZXJ0ZWRYUmF0aW86cyxiYXNlTGluZUludmVydGVkWTpsLGJhc2VMaW5lWTpvLGJhc2VMaW5lWDpofX19LHtrZXk6ImdldExvZ1NlcmllcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53O3JldHVybiBlLmdsb2JhbHMuc2VyaWVzTG9nPXQubWFwKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIGUuY29uZmlnLnlheGlzW2ldJiZlLmNvbmZpZy55YXhpc1tpXS5sb2dhcml0aG1pYz90Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXQ/bnVsbDooTWF0aC5sb2codCktTWF0aC5sb2coZS5nbG9iYWxzLm1pbllBcnJbaV0pKS8oTWF0aC5sb2coZS5nbG9iYWxzLm1heFlBcnJbaV0pLU1hdGgubG9nKGUuZ2xvYmFscy5taW5ZQXJyW2ldKSl9KTp0fSksZS5nbG9iYWxzLnNlcmllc0xvZ319LHtrZXk6ImdldExvZ1lSYXRpb3MiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsaT10aGlzLncscz10aGlzLncuZ2xvYmFscztyZXR1cm4gcy55TG9nUmF0aW89dC5zbGljZSgpLHMubG9nWVJhbmdlPXMueVJhbmdlLm1hcChmdW5jdGlvbih0LGEpe2lmKGkuY29uZmlnLnlheGlzW2FdJiZlLncuY29uZmlnLnlheGlzW2FdLmxvZ2FyaXRobWljKXt2YXIgbixyPS1OdW1iZXIuTUFYX1ZBTFVFLG89TnVtYmVyLk1JTl9WQUxVRTtyZXR1cm4gcy5zZXJpZXNMb2cuZm9yRWFjaChmdW5jdGlvbih0LGUpe3QuZm9yRWFjaChmdW5jdGlvbih0KXtpLmNvbmZpZy55YXhpc1tlXSYmaS5jb25maWcueWF4aXNbZV0ubG9nYXJpdGhtaWMmJihyPU1hdGgubWF4KHQsciksbz1NYXRoLm1pbih0LG8pKX0pfSksbj1NYXRoLnBvdyhzLnlSYW5nZVthXSxNYXRoLmFicyhvLXIpL3MueVJhbmdlW2FdKSxzLnlMb2dSYXRpb1thXT1uL3MuZ3JpZEhlaWdodCxufX0pLHMueUxvZ1JhdGlvfX1dLFt7a2V5OiJjaGVja0NvbWJvU2VyaWVzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0hMSxpPSExO3JldHVybiB0Lmxlbmd0aCYmdm9pZCAwIT09dFswXS50eXBlJiYoZT0hMCx0LmZvckVhY2goZnVuY3Rpb24odCl7ImJhciIhPT10LnR5cGUmJiJjb2x1bW4iIT09dC50eXBlfHwoaT0hMCl9KSkse2NvbWJvQ2hhcnRzOmUsY29tYm9DaGFydHNIYXNCYXJzOml9fX0se2tleToiZXh0ZW5kQXJyYXlQcm9wcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS55YXhpcyYmKGU9dC5leHRlbmRZQXhpcyhlKSksZS5hbm5vdGF0aW9ucyYmKGUuYW5ub3RhdGlvbnMueWF4aXMmJihlPXQuZXh0ZW5kWUF4aXNBbm5vdGF0aW9ucyhlKSksZS5hbm5vdGF0aW9ucy54YXhpcyYmKGU9dC5leHRlbmRYQXhpc0Fubm90YXRpb25zKGUpKSxlLmFubm90YXRpb25zLnBvaW50cyYmKGU9dC5leHRlbmRQb2ludEFubm90YXRpb25zKGUpKSksZX19XSksdH0oKSxrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaSh0KXtlKHRoaXMsaSksdGhpcy5vcHRzPXR9cmV0dXJuIHMoaSxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdHMsaT1uZXcgYixzPW5ldyB5KGUpO3RoaXMuY2hhcnRUeXBlPWUuY2hhcnQudHlwZSwiaGlzdG9ncmFtIj09PXRoaXMuY2hhcnRUeXBlJiYoZS5jaGFydC50eXBlPSJiYXIiLGU9dS5leHRlbmQoe3Bsb3RPcHRpb25zOntiYXI6e2NvbHVtbldpZHRoOiI5OS45OSUifX19LGUpKSxlPXRoaXMuZXh0ZW5kWUF4aXMoZSksZT10aGlzLmV4dGVuZEFubm90YXRpb25zKGUpO3ZhciBhPWkuaW5pdCgpLG49e307aWYoZSYmIm9iamVjdCI9PT10KGUpKXt2YXIgcj17fTtzd2l0Y2godGhpcy5jaGFydFR5cGUpe2Nhc2UibGluZSI6cj1zLmxpbmUoKTticmVhaztjYXNlImFyZWEiOnI9cy5hcmVhKCk7YnJlYWs7Y2FzZSJiYXIiOnI9cy5iYXIoKTticmVhaztjYXNlImNhbmRsZXN0aWNrIjpyPXMuY2FuZGxlc3RpY2soKTticmVhaztjYXNlInJhbmdlQmFyIjpyPXMucmFuZ2VCYXIoKTticmVhaztjYXNlImhpc3RvZ3JhbSI6cj1zLmJhcigpO2JyZWFrO2Nhc2UiYnViYmxlIjpyPXMuYnViYmxlKCk7YnJlYWs7Y2FzZSJzY2F0dGVyIjpyPXMuc2NhdHRlcigpO2JyZWFrO2Nhc2UiaGVhdG1hcCI6cj1zLmhlYXRtYXAoKTticmVhaztjYXNlInBpZSI6cj1zLnBpZSgpO2JyZWFrO2Nhc2UiZG9udXQiOnI9cy5kb251dCgpO2JyZWFrO2Nhc2UicmFkYXIiOnI9cy5yYWRhcigpO2JyZWFrO2Nhc2UicmFkaWFsQmFyIjpyPXMucmFkaWFsQmFyKCk7YnJlYWs7ZGVmYXVsdDpyPXMubGluZSgpfWUuY2hhcnQuYnJ1c2gmJmUuY2hhcnQuYnJ1c2guZW5hYmxlZCYmKHI9cy5icnVzaChyKSksZS5jaGFydC5zdGFja2VkJiYiMTAwJSI9PT1lLmNoYXJ0LnN0YWNrVHlwZSYmcy5zdGFja2VkMTAwKCksdGhpcy5jaGVja0ZvckRhcmtUaGVtZSh3aW5kb3cuQXBleCksdGhpcy5jaGVja0ZvckRhcmtUaGVtZShlKSxlLnhheGlzPWUueGF4aXN8fHdpbmRvdy5BcGV4LnhheGlzfHx7fTt2YXIgbz13LmNoZWNrQ29tYm9TZXJpZXMoZS5zZXJpZXMpOyJsaW5lIiE9PWUuY2hhcnQudHlwZSYmImFyZWEiIT09ZS5jaGFydC50eXBlJiYic2NhdHRlciIhPT1lLmNoYXJ0LnR5cGV8fG8uY29tYm9DaGFydHNIYXNCYXJzfHwiZGF0ZXRpbWUiPT09ZS54YXhpcy50eXBlfHwibnVtZXJpYyI9PT1lLnhheGlzLnR5cGV8fCJiZXR3ZWVuIj09PWUueGF4aXMudGlja1BsYWNlbWVudHx8KGU9eS5jb252ZXJ0Q2F0VG9OdW1lcmljKGUpKSwoZS5jaGFydC5zcGFya2xpbmUmJmUuY2hhcnQuc3BhcmtsaW5lLmVuYWJsZWR8fHdpbmRvdy5BcGV4LmNoYXJ0JiZ3aW5kb3cuQXBleC5jaGFydC5zcGFya2xpbmUmJndpbmRvdy5BcGV4LmNoYXJ0LnNwYXJrbGluZS5lbmFibGVkKSYmKHI9cy5zcGFya2xpbmUocikpLG49dS5leHRlbmQoYSxyKX12YXIgbD11LmV4dGVuZChuLHdpbmRvdy5BcGV4KTtyZXR1cm4gYT11LmV4dGVuZChsLGUpLGE9dGhpcy5oYW5kbGVVc2VySW5wdXRFcnJvcnMoYSl9fSx7a2V5OiJleHRlbmRZQXhpcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGI7cmV0dXJuIHZvaWQgMD09PXQueWF4aXMmJih0LnlheGlzPXt9KSx0LnlheGlzLmNvbnN0cnVjdG9yIT09QXJyYXkmJndpbmRvdy5BcGV4LnlheGlzJiZ3aW5kb3cuQXBleC55YXhpcy5jb25zdHJ1Y3RvciE9PUFycmF5JiYodC55YXhpcz11LmV4dGVuZCh0LnlheGlzLHdpbmRvdy5BcGV4LnlheGlzKSksdC55YXhpcy5jb25zdHJ1Y3RvciE9PUFycmF5P3QueWF4aXM9W3UuZXh0ZW5kKGUueUF4aXMsdC55YXhpcyldOnQueWF4aXM9dS5leHRlbmRBcnJheSh0LnlheGlzLGUueUF4aXMpLHR9fSx7a2V5OiJleHRlbmRBbm5vdGF0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQuYW5ub3RhdGlvbnMmJih0LmFubm90YXRpb25zPXt9LHQuYW5ub3RhdGlvbnMueWF4aXM9W10sdC5hbm5vdGF0aW9ucy54YXhpcz1bXSx0LmFubm90YXRpb25zLnBvaW50cz1bXSksdD10aGlzLmV4dGVuZFlBeGlzQW5ub3RhdGlvbnModCksdD10aGlzLmV4dGVuZFhBeGlzQW5ub3RhdGlvbnModCksdD10aGlzLmV4dGVuZFBvaW50QW5ub3RhdGlvbnModCl9fSx7a2V5OiJleHRlbmRZQXhpc0Fubm90YXRpb25zIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgYjtyZXR1cm4gdC5hbm5vdGF0aW9ucy55YXhpcz11LmV4dGVuZEFycmF5KHZvaWQgMCE9PXQuYW5ub3RhdGlvbnMueWF4aXM/dC5hbm5vdGF0aW9ucy55YXhpczpbXSxlLnlBeGlzQW5ub3RhdGlvbiksdH19LHtrZXk6ImV4dGVuZFhBeGlzQW5ub3RhdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBiO3JldHVybiB0LmFubm90YXRpb25zLnhheGlzPXUuZXh0ZW5kQXJyYXkodm9pZCAwIT09dC5hbm5vdGF0aW9ucy54YXhpcz90LmFubm90YXRpb25zLnhheGlzOltdLGUueEF4aXNBbm5vdGF0aW9uKSx0fX0se2tleToiZXh0ZW5kUG9pbnRBbm5vdGF0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGI7cmV0dXJuIHQuYW5ub3RhdGlvbnMucG9pbnRzPXUuZXh0ZW5kQXJyYXkodm9pZCAwIT09dC5hbm5vdGF0aW9ucy5wb2ludHM/dC5hbm5vdGF0aW9ucy5wb2ludHM6W10sZS5wb2ludEFubm90YXRpb24pLHR9fSx7a2V5OiJjaGVja0ZvckRhcmtUaGVtZSIsdmFsdWU6ZnVuY3Rpb24odCl7dC50aGVtZSYmImRhcmsiPT09dC50aGVtZS5tb2RlJiYodC50b29sdGlwfHwodC50b29sdGlwPXt9KSwibGlnaHQiIT09dC50b29sdGlwLnRoZW1lJiYodC50b29sdGlwLnRoZW1lPSJkYXJrIiksdC5jaGFydC5mb3JlQ29sb3J8fCh0LmNoYXJ0LmZvcmVDb2xvcj0iI2Y2ZjdmOCIpLHQudGhlbWUucGFsZXR0ZXx8KHQudGhlbWUucGFsZXR0ZT0icGFsZXR0ZTQiKSl9fSx7a2V5OiJoYW5kbGVVc2VySW5wdXRFcnJvcnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQ7aWYoZS50b29sdGlwLnNoYXJlZCYmZS50b29sdGlwLmludGVyc2VjdCl0aHJvdyBuZXcgRXJyb3IoInRvb2x0aXAuc2hhcmVkIGNhbm5vdCBiZSBlbmFibGVkIHdoZW4gdG9vbHRpcC5pbnRlcnNlY3QgaXMgdHJ1ZS4gVHVybiBvZmYgYW55IG90aGVyIG9wdGlvbiBieSBzZXR0aW5nIGl0IHRvIGZhbHNlLiIpO2lmKGUuY2hhcnQuc2Nyb2xsZXImJmNvbnNvbGUud2FybigiU2Nyb2xsZXIgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2Mi4wLjAuIFBsZWFzZSByZW1vdmUgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGNoYXJ0LnNjcm9sbGVyIiksKCJiYXIiPT09ZS5jaGFydC50eXBlfHwicmFuZ2VCYXIiPT09ZS5jaGFydC50eXBlKSYmZS5wbG90T3B0aW9ucy5iYXIuaG9yaXpvbnRhbCl7aWYoZS55YXhpcy5sZW5ndGg+MSl0aHJvdyBuZXcgRXJyb3IoIk11bHRpcGxlIFkgQXhpcyBmb3IgYmFycyBhcmUgbm90IHN1cHBvcnRlZC4gU3dpdGNoIHRvIGNvbHVtbiBjaGFydCBieSBzZXR0aW5nIHBsb3RPcHRpb25zLmJhci5ob3Jpem9udGFsPWZhbHNlIik7ZS55YXhpc1swXS5yZXZlcnNlZCYmKGUueWF4aXNbMF0ub3Bwb3NpdGU9ITApLGUueGF4aXMudG9vbHRpcC5lbmFibGVkPSExLGUueWF4aXNbMF0udG9vbHRpcC5lbmFibGVkPSExLGUuY2hhcnQuem9vbS5lbmFibGVkPSExfXJldHVybiJiYXIiIT09ZS5jaGFydC50eXBlJiYicmFuZ2VCYXIiIT09ZS5jaGFydC50eXBlfHxlLnRvb2x0aXAuc2hhcmVkJiYoImJhcldpZHRoIj09PWUueGF4aXMuY3Jvc3NoYWlycy53aWR0aCYmZS5zZXJpZXMubGVuZ3RoPjEmJihjb25zb2xlLndhcm4oJ2Nyb3NzaGFpcnMud2lkdGggPSAiYmFyV2lkdGgiIGlzIG9ubHkgc3VwcG9ydGVkIGluIHNpbmdsZSBzZXJpZXMsIG5vdCBpbiBhIG11bHRpLXNlcmllcyBiYXJDaGFydC4nKSxlLnhheGlzLmNyb3NzaGFpcnMud2lkdGg9InRpY2tXaWR0aCIpLGUucGxvdE9wdGlvbnMuYmFyLmhvcml6b250YWwmJihlLnN0YXRlcy5ob3Zlci50eXBlPSJub25lIixlLnRvb2x0aXAuc2hhcmVkPSExKSxlLnRvb2x0aXAuZm9sbG93Q3Vyc29yfHwoY29uc29sZS53YXJuKCJmb2xsb3dDdXJzb3Igb3B0aW9uIGluIHNoYXJlZCBjb2x1bW5zIGNhbm5vdCBiZSB0dXJuZWQgb2ZmLiBQbGVhc2Ugc2V0ICVjdG9vbHRpcC5mb2xsb3dDdXJzb3I6IHRydWUiLCJjb2xvcjogYmx1ZTsiKSxlLnRvb2x0aXAuZm9sbG93Q3Vyc29yPSEwKSksImNhbmRsZXN0aWNrIj09PWUuY2hhcnQudHlwZSYmZS55YXhpc1swXS5yZXZlcnNlZCYmKGNvbnNvbGUud2FybigiUmV2ZXJzZWQgeS1heGlzIGluIGNhbmRsZXN0aWNrIGNoYXJ0IGlzIG5vdCBzdXBwb3J0ZWQuIiksZS55YXhpc1swXS5yZXZlcnNlZD0hMSksZS5jaGFydC5ncm91cCYmMD09PWUueWF4aXNbMF0ubGFiZWxzLm1pbldpZHRoJiZjb25zb2xlLndhcm4oIkl0IGxvb2tzIGxpa2UgeW91IGhhdmUgbXVsdGlwbGUgY2hhcnRzIGluIHN5bmNocm9uaXphdGlvbi4gWW91IG11c3QgcHJvdmlkZSB5YXhpcy5sYWJlbHMubWluV2lkdGggd2hpY2ggbXVzdCBiZSBFUVVBTCBmb3IgYWxsIGdyb3VwZWQgY2hhcnRzIHRvIHByZXZlbnQgaW5jb3JyZWN0IGJlaGF2aW91ci4iKSxBcnJheS5pc0FycmF5KGUuc3Ryb2tlLndpZHRoKSYmImxpbmUiIT09ZS5jaGFydC50eXBlJiYiYXJlYSIhPT1lLmNoYXJ0LnR5cGUmJihjb25zb2xlLndhcm4oInN0cm9rZS53aWR0aCBvcHRpb24gYWNjZXB0cyBhcnJheSBvbmx5IGZvciBsaW5lIGFuZCBhcmVhIGNoYXJ0cy4gUmV2ZXJ0ZWQgYmFjayB0byBOdW1iZXIiKSxlLnN0cm9rZS53aWR0aD1lLnN0cm9rZS53aWR0aFswXSksZX19XSksaX0oKSxBPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2UodGhpcyx0KX1yZXR1cm4gcyh0LFt7a2V5OiJnbG9iYWxWYXJzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm57Y2hhcnRJRDpudWxsLGN1aWQ6bnVsbCxldmVudHM6e2JlZm9yZU1vdW50OltdLG1vdW50ZWQ6W10sdXBkYXRlZDpbXSxjbGlja2VkOltdLHNlbGVjdGlvbjpbXSxkYXRhUG9pbnRTZWxlY3Rpb246W10sem9vbWVkOltdLHNjcm9sbGVkOltdfSxjb2xvcnM6W10sY2xpZW50WDpudWxsLGNsaWVudFk6bnVsbCxmaWxsOntjb2xvcnM6W119LHN0cm9rZTp7Y29sb3JzOltdfSxkYXRhTGFiZWxzOntzdHlsZTp7Y29sb3JzOltdfX0scmFkYXJQb2x5Z29uczp7ZmlsbDp7Y29sb3JzOltdfX0sbWFya2Vyczp7Y29sb3JzOltdLHNpemU6dC5tYXJrZXJzLnNpemUsbGFyZ2VzdFNpemU6MH0sYW5pbWF0aW9uRW5kZWQ6ITEsaXNUb3VjaERldmljZToib250b3VjaHN0YXJ0ImluIHdpbmRvd3x8bmF2aWdhdG9yLm1zTWF4VG91Y2hQb2ludHMsaXNEaXJ0eTohMSxpc0V4ZWNDYWxsZWQ6ITEsaW5pdGlhbENvbmZpZzpudWxsLGxhc3RYQXhpczpbXSxsYXN0WUF4aXM6W10sc2VyaWVzOltdLHNlcmllc1JhbmdlU3RhcnQ6W10sc2VyaWVzUmFuZ2VFbmQ6W10sc2VyaWVzUGVyY2VudDpbXSxzZXJpZXNUb3RhbHM6W10sc3RhY2tlZFNlcmllc1RvdGFsczpbXSxzZXJpZXNYOltdLHNlcmllc1o6W10sY29sdW1uU2VyaWVzOm51bGwsbGFiZWxzOltdLHRpbWVsaW5lTGFiZWxzOltdLGludmVydGVkVGltZWxpbmVMYWJlbHM6W10sc2VyaWVzTmFtZXM6W10sbm9MYWJlbHNQcm92aWRlZDohMSxhbGxTZXJpZXNDb2xsYXBzZWQ6ITEsY29sbGFwc2VkU2VyaWVzOltdLGNvbGxhcHNlZFNlcmllc0luZGljZXM6W10sYW5jaWxsYXJ5Q29sbGFwc2VkU2VyaWVzOltdLGFuY2lsbGFyeUNvbGxhcHNlZFNlcmllc0luZGljZXM6W10scmlzaW5nU2VyaWVzOltdLGRhdGFGb3JtYXRYTnVtZXJpYzohMSxjYXB0dXJlZFNlcmllc0luZGV4Oi0xLGNhcHR1cmVkRGF0YVBvaW50SW5kZXg6LTEsc2VsZWN0ZWREYXRhUG9pbnRzOltdLGlnbm9yZVlBeGlzSW5kZXhlczpbXSx5QXhpc1NhbWVTY2FsZUluZGljZXM6W10scGFkSG9yaXpvbnRhbDowLG1heFZhbHNJbkFycmF5SW5kZXg6MCxyYWRpYWxTaXplOjAsem9vbUVuYWJsZWQ6Inpvb20iPT09dC5jaGFydC50b29sYmFyLmF1dG9TZWxlY3RlZCYmdC5jaGFydC50b29sYmFyLnRvb2xzLnpvb20mJnQuY2hhcnQuem9vbS5lbmFibGVkLHBhbkVuYWJsZWQ6InBhbiI9PT10LmNoYXJ0LnRvb2xiYXIuYXV0b1NlbGVjdGVkJiZ0LmNoYXJ0LnRvb2xiYXIudG9vbHMucGFuLHNlbGVjdGlvbkVuYWJsZWQ6InNlbGVjdGlvbiI9PT10LmNoYXJ0LnRvb2xiYXIuYXV0b1NlbGVjdGVkJiZ0LmNoYXJ0LnRvb2xiYXIudG9vbHMuc2VsZWN0aW9uLHlheGlzOm51bGwsbWluWTpOdW1iZXIuTUlOX1ZBTFVFLG1heFk6LU51bWJlci5NQVhfVkFMVUUsbWluWUFycjpbXSxtYXhZQXJyOltdLG1heFg6LU51bWJlci5NQVhfVkFMVUUsaW5pdGlhbG1heFg6LU51bWJlci5NQVhfVkFMVUUsbWluWDpOdW1iZXIuTUlOX1ZBTFVFLGluaXRpYWxtaW5YOk51bWJlci5NSU5fVkFMVUUsbWluWjpOdW1iZXIuTUlOX1ZBTFVFLG1heFo6LU51bWJlci5NQVhfVkFMVUUsbWluWERpZmY6TnVtYmVyLk1BWF9WQUxVRSxtb3VzZWRvd246ITEsbGFzdENsaWVudFBvc2l0aW9uOnt9LHZpc2libGVYUmFuZ2U6dm9pZCAwLHlSYW5nZTpbXSx6UmFuZ2U6MCx4UmFuZ2U6MCx5VmFsdWVEZWNpbWFsOjAsdG90YWw6MCxTVkdOUzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHN2Z1dpZHRoOjAsc3ZnSGVpZ2h0OjAsbm9EYXRhOiExLGxvY2FsZTp7fSxkb206e30sbWVtb3J5OnttZXRob2RzVG9FeGVjOltdfSxzaG91bGRBbmltYXRlOiEwLHNraXBMYXN0VGltZWxpbmVsYWJlbDohMSxkZWxheWVkRWxlbWVudHM6W10sYXhpc0NoYXJ0czohMCxpc1hOdW1lcmljOiExLGlzRGF0YVhZWjohMSxyZXNpemVkOiExLHJlc2l6ZVRpbWVyOm51bGwsY29tYm9DaGFydHM6ITEsY29tYm9DaGFydHNIYXNCYXJzOiExLGRhdGFDaGFuZ2VkOiExLHByZXZpb3VzUGF0aHM6W10sc2VyaWVzWHZhbHVlczpbXSxzZXJpZXNZdmFsdWVzOltdLHNlcmllc0NhbmRsZU86W10sc2VyaWVzQ2FuZGxlSDpbXSxzZXJpZXNDYW5kbGVMOltdLHNlcmllc0NhbmRsZUM6W10sYWxsU2VyaWVzSGFzRXF1YWxYOiEwLGRhdGFQb2ludHM6MCxwb2ludHNBcnJheTpbXSxkYXRhTGFiZWxzUmVjdHM6W10sbGFzdERyYXduRGF0YUxhYmVsc0luZGV4ZXM6W10saGFzTnVsbFZhbHVlczohMSxlYXNpbmc6bnVsbCx6b29tZWQ6ITEsZ3JpZFdpZHRoOjAsZ3JpZEhlaWdodDowLHlBeGlzU2NhbGU6W10seEF4aXNTY2FsZTpudWxsLHhBeGlzVGlja3NQb3NpdGlvbnM6W10sdGltZXNjYWxlVGlja3M6W10scm90YXRlWExhYmVsczohMSxkZWZhdWx0TGFiZWxzOiExLHhMYWJlbEZvcm1hdHRlcjp2b2lkIDAseUxhYmVsRm9ybWF0dGVyczpbXSx4YXhpc1Rvb2x0aXBGb3JtYXR0ZXI6dm9pZCAwLHR0S2V5Rm9ybWF0dGVyOnZvaWQgMCx0dFZhbDp2b2lkIDAsdHRaRm9ybWF0dGVyOnZvaWQgMCxMSU5FX0hFSUdIVF9SQVRJTzoxLjYxOCx4QXhpc0xhYmVsc0hlaWdodDowLHlBeGlzTGFiZWxzV2lkdGg6MCxzY2FsZVg6MSxzY2FsZVk6MSx0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHRyYW5zbGF0ZVlBeGlzWDpbXSx5TGFiZWxzQ29vcmRzOltdLHlUaXRsZUNvb3JkczpbXSx5QXhpc1dpZHRoczpbXSx0cmFuc2xhdGVYQXhpc1k6MCx0cmFuc2xhdGVYQXhpc1g6MCx0b29sdGlwOm51bGwsdG9vbHRpcE9wdHM6bnVsbH19fSx7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdsb2JhbFZhcnModCk7cmV0dXJuIGUuaW5pdGlhbENvbmZpZz11LmV4dGVuZCh7fSx0KSxlLmluaXRpYWxTZXJpZXM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlLmluaXRpYWxDb25maWcuc2VyaWVzKSksZS5sYXN0WEF4aXM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlLmluaXRpYWxDb25maWcueGF4aXMpKSxlLmxhc3RZQXhpcz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUuaW5pdGlhbENvbmZpZy55YXhpcykpLGV9fV0pLHR9KCksUz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaSl7ZSh0aGlzLHQpLHRoaXMub3B0cz1pfXJldHVybiBzKHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGsodGhpcy5vcHRzKS5pbml0KCk7cmV0dXJue2NvbmZpZzp0LGdsb2JhbHM6KG5ldyBBKS5pbml0KHQpfX19XSksdH0oKSxDPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy5jdHg9aSx0aGlzLnc9aS53LHRoaXMub3B0cz1udWxsLHRoaXMuc2VyaWVzSW5kZXg9MH1yZXR1cm4gcyh0LFt7a2V5OiJjbGlwcGVkSW1nQXJlYSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53LGk9ZS5jb25maWcscz1wYXJzZUludChlLmdsb2JhbHMuZ3JpZFdpZHRoKSxhPXBhcnNlSW50KGUuZ2xvYmFscy5ncmlkSGVpZ2h0KSxuPXM+YT9zOmEscj10LmltYWdlLG89MCxsPTA7dm9pZCAwPT09dC53aWR0aCYmdm9pZCAwPT09dC5oZWlnaHQ/dm9pZCAwIT09aS5maWxsLmltYWdlLndpZHRoJiZ2b2lkIDAhPT1pLmZpbGwuaW1hZ2UuaGVpZ2h0PyhvPWkuZmlsbC5pbWFnZS53aWR0aCsxLGw9aS5maWxsLmltYWdlLmhlaWdodCk6KG89bisxLGw9bik6KG89dC53aWR0aCxsPXQuaGVpZ2h0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZS5nbG9iYWxzLlNWR05TLCJwYXR0ZXJuIik7cC5zZXRBdHRycyhoLHtpZDp0LnBhdHRlcm5JRCxwYXR0ZXJuVW5pdHM6dC5wYXR0ZXJuVW5pdHM/dC5wYXR0ZXJuVW5pdHM6InVzZXJTcGFjZU9uVXNlIix3aWR0aDpvKyJweCIsaGVpZ2h0OmwrInB4In0pO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhlLmdsb2JhbHMuU1ZHTlMsImltYWdlIik7aC5hcHBlbmRDaGlsZChjKSxjLnNldEF0dHJpYnV0ZU5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwiaHJlZiIscikscC5zZXRBdHRycyhjLHt4OjAseTowLHByZXNlcnZlQXNwZWN0UmF0aW86Im5vbmUiLHdpZHRoOm8rInB4IixoZWlnaHQ6bCsicHgifSksYy5zdHlsZS5vcGFjaXR5PXQub3BhY2l0eSxlLmdsb2JhbHMuZG9tLmVsRGVmcy5ub2RlLmFwcGVuZENoaWxkKGgpfX0se2tleToiZ2V0U2VyaWVzSW5kZXgiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudztyZXR1cm4iYmFyIj09PWUuY29uZmlnLmNoYXJ0LnR5cGUmJmUuY29uZmlnLnBsb3RPcHRpb25zLmJhci5kaXN0cmlidXRlZHx8ImhlYXRtYXAiPT09ZS5jb25maWcuY2hhcnQudHlwZT90aGlzLnNlcmllc0luZGV4PXQuc2VyaWVzTnVtYmVyOnRoaXMuc2VyaWVzSW5kZXg9dC5zZXJpZXNOdW1iZXIlZS5nbG9iYWxzLnNlcmllcy5sZW5ndGgsdGhpcy5zZXJpZXNJbmRleH19LHtrZXk6ImZpbGxQYXRoIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnc7dGhpcy5vcHRzPXQ7dmFyIGkscyxhLG49dGhpcy53LmNvbmZpZzt0aGlzLnNlcmllc0luZGV4PXRoaXMuZ2V0U2VyaWVzSW5kZXgodCk7dmFyIHI9dGhpcy5nZXRGaWxsQ29sb3JzKClbdGhpcy5zZXJpZXNJbmRleF07ImZ1bmN0aW9uIj09dHlwZW9mIHImJihyPXIoe3Nlcmllc0luZGV4OnRoaXMuc2VyaWVzSW5kZXgsdmFsdWU6dC52YWx1ZSx3OmV9KSk7dmFyIG89dGhpcy5nZXRGaWxsVHlwZSh0aGlzLnNlcmllc0luZGV4KSxsPUFycmF5LmlzQXJyYXkobi5maWxsLm9wYWNpdHkpP24uZmlsbC5vcGFjaXR5W3RoaXMuc2VyaWVzSW5kZXhdOm4uZmlsbC5vcGFjaXR5LGg9cjtyZXR1cm4gdC5jb2xvciYmKHI9dC5jb2xvciksLTE9PT1yLmluZGV4T2YoInJnYiIpP2g9dS5oZXhUb1JnYmEocixsKTpyLmluZGV4T2YoInJnYmEiKT4tMSYmKGw9IjAuIit1LmdldE9wYWNpdHlGcm9tUkdCQShyKSksInBhdHRlcm4iPT09byYmKHM9dGhpcy5oYW5kbGVQYXR0ZXJuRmlsbChzLHIsbCxoKSksImdyYWRpZW50Ij09PW8mJihhPXRoaXMuaGFuZGxlR3JhZGllbnRGaWxsKGEscixsLHRoaXMuc2VyaWVzSW5kZXgpKSxuLmZpbGwuaW1hZ2Uuc3JjLmxlbmd0aD4wJiYiaW1hZ2UiPT09bz90LnNlcmllc051bWJlcjxuLmZpbGwuaW1hZ2Uuc3JjLmxlbmd0aD8odGhpcy5jbGlwcGVkSW1nQXJlYSh7b3BhY2l0eTpsLGltYWdlOm4uZmlsbC5pbWFnZS5zcmNbdC5zZXJpZXNOdW1iZXJdLHBhdHRlcm5Vbml0czp0LnBhdHRlcm5Vbml0cyxwYXR0ZXJuSUQ6InBhdHRlcm4iLmNvbmNhdChlLmdsb2JhbHMuY3VpZCkuY29uY2F0KHQuc2VyaWVzTnVtYmVyKzEpfSksaT0idXJsKCNwYXR0ZXJuIi5jb25jYXQoZS5nbG9iYWxzLmN1aWQpLmNvbmNhdCh0LnNlcmllc051bWJlcisxLCIpIikpOmk9aDppPSJncmFkaWVudCI9PT1vP2E6InBhdHRlcm4iPT09bz9zOmgsdC5zb2xpZCYmKGk9aCksaX19LHtrZXk6ImdldEZpbGxUeXBlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnc7cmV0dXJuIEFycmF5LmlzQXJyYXkoZS5jb25maWcuZmlsbC50eXBlKT9lLmNvbmZpZy5maWxsLnR5cGVbdF06ZS5jb25maWcuZmlsbC50eXBlfX0se2tleToiZ2V0RmlsbENvbG9ycyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLncsZT10LmNvbmZpZyxpPXRoaXMub3B0cyxzPVtdO3JldHVybiB0Lmdsb2JhbHMuY29tYm9DaGFydHM/ImxpbmUiPT09dC5jb25maWcuc2VyaWVzW3RoaXMuc2VyaWVzSW5kZXhdLnR5cGU/dC5nbG9iYWxzLnN0cm9rZS5jb2xvcnMgaW5zdGFuY2VvZiBBcnJheT9zPXQuZ2xvYmFscy5zdHJva2UuY29sb3JzOnMucHVzaCh0Lmdsb2JhbHMuc3Ryb2tlLmNvbG9ycyk6dC5nbG9iYWxzLmZpbGwuY29sb3JzIGluc3RhbmNlb2YgQXJyYXk/cz10Lmdsb2JhbHMuZmlsbC5jb2xvcnM6cy5wdXNoKHQuZ2xvYmFscy5maWxsLmNvbG9ycyk6ImxpbmUiPT09ZS5jaGFydC50eXBlP3QuZ2xvYmFscy5zdHJva2UuY29sb3JzIGluc3RhbmNlb2YgQXJyYXk/cz10Lmdsb2JhbHMuc3Ryb2tlLmNvbG9yczpzLnB1c2godC5nbG9iYWxzLnN0cm9rZS5jb2xvcnMpOnQuZ2xvYmFscy5maWxsLmNvbG9ycyBpbnN0YW5jZW9mIEFycmF5P3M9dC5nbG9iYWxzLmZpbGwuY29sb3JzOnMucHVzaCh0Lmdsb2JhbHMuZmlsbC5jb2xvcnMpLHZvaWQgMCE9PWkuZmlsbENvbG9ycyYmKHM9W10saS5maWxsQ29sb3JzIGluc3RhbmNlb2YgQXJyYXk/cz1pLmZpbGxDb2xvcnMuc2xpY2UoKTpzLnB1c2goaS5maWxsQ29sb3JzKSksc319LHtrZXk6ImhhbmRsZVBhdHRlcm5GaWxsIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxzKXt2YXIgYT10aGlzLncuY29uZmlnLG49dGhpcy5vcHRzLHI9bmV3IHAodGhpcy5jdHgpLG89dm9pZCAwPT09YS5maWxsLnBhdHRlcm4uc3Ryb2tlV2lkdGg/QXJyYXkuaXNBcnJheShhLnN0cm9rZS53aWR0aCk/YS5zdHJva2Uud2lkdGhbdGhpcy5zZXJpZXNJbmRleF06YS5zdHJva2Uud2lkdGg6QXJyYXkuaXNBcnJheShhLmZpbGwucGF0dGVybi5zdHJva2VXaWR0aCk/YS5maWxsLnBhdHRlcm4uc3Ryb2tlV2lkdGhbdGhpcy5zZXJpZXNJbmRleF06YS5maWxsLnBhdHRlcm4uc3Ryb2tlV2lkdGgsbD1lO2EuZmlsbC5wYXR0ZXJuLnN0eWxlIGluc3RhbmNlb2YgQXJyYXk/dD12b2lkIDAhPT1hLmZpbGwucGF0dGVybi5zdHlsZVtuLnNlcmllc051bWJlcl0/ci5kcmF3UGF0dGVybihhLmZpbGwucGF0dGVybi5zdHlsZVtuLnNlcmllc051bWJlcl0sYS5maWxsLnBhdHRlcm4ud2lkdGgsYS5maWxsLnBhdHRlcm4uaGVpZ2h0LGwsbyxpKTpzOnQ9ci5kcmF3UGF0dGVybihhLmZpbGwucGF0dGVybi5zdHlsZSxhLmZpbGwucGF0dGVybi53aWR0aCxhLmZpbGwucGF0dGVybi5oZWlnaHQsbCxvLGkpO3JldHVybiB0fX0se2tleToiaGFuZGxlR3JhZGllbnRGaWxsIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxzKXt2YXIgYSxuLHI9dGhpcy53LmNvbmZpZyxvPXRoaXMub3B0cyxsPW5ldyBwKHRoaXMuY3R4KSxoPW5ldyB1LGM9ci5maWxsLmdyYWRpZW50LnR5cGUsZD12b2lkIDA9PT1yLmZpbGwuZ3JhZGllbnQub3BhY2l0eUZyb20/aTpBcnJheS5pc0FycmF5KHIuZmlsbC5ncmFkaWVudC5vcGFjaXR5RnJvbSk/ci5maWxsLmdyYWRpZW50Lm9wYWNpdHlGcm9tW3NdOnIuZmlsbC5ncmFkaWVudC5vcGFjaXR5RnJvbSxnPXZvaWQgMD09PXIuZmlsbC5ncmFkaWVudC5vcGFjaXR5VG8/aTpBcnJheS5pc0FycmF5KHIuZmlsbC5ncmFkaWVudC5vcGFjaXR5VG8pP3IuZmlsbC5ncmFkaWVudC5vcGFjaXR5VG9bc106ci5maWxsLmdyYWRpZW50Lm9wYWNpdHlUbztpZihhPWUsbj12b2lkIDA9PT1yLmZpbGwuZ3JhZGllbnQuZ3JhZGllbnRUb0NvbG9yc3x8MD09PXIuZmlsbC5ncmFkaWVudC5ncmFkaWVudFRvQ29sb3JzLmxlbmd0aD8iZGFyayI9PT1yLmZpbGwuZ3JhZGllbnQuc2hhZGU/aC5zaGFkZUNvbG9yKC0xKnBhcnNlRmxvYXQoci5maWxsLmdyYWRpZW50LnNoYWRlSW50ZW5zaXR5KSxlKTpoLnNoYWRlQ29sb3IocGFyc2VGbG9hdChyLmZpbGwuZ3JhZGllbnQuc2hhZGVJbnRlbnNpdHkpLGUpOnIuZmlsbC5ncmFkaWVudC5ncmFkaWVudFRvQ29sb3JzW28uc2VyaWVzTnVtYmVyXSxyLmZpbGwuZ3JhZGllbnQuaW52ZXJzZUNvbG9ycyl7dmFyIGY9YTthPW4sbj1mfXJldHVybiBsLmRyYXdHcmFkaWVudChjLGEsbixkLGcsby5zaXplLHIuZmlsbC5ncmFkaWVudC5zdG9wcyxyLmZpbGwuZ3JhZGllbnQuY29sb3JTdG9wcyxzKX19XSksdH0oKSxMPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpLHMpe2UodGhpcyx0KSx0aGlzLmN0eD1pLHRoaXMudz1pLnd9cmV0dXJuIHModCxbe2tleToic2V0R2xvYmFsTWFya2VyU2l6ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnc7aWYodC5nbG9iYWxzLm1hcmtlcnMuc2l6ZT1BcnJheS5pc0FycmF5KHQuY29uZmlnLm1hcmtlcnMuc2l6ZSk/dC5jb25maWcubWFya2Vycy5zaXplOlt0LmNvbmZpZy5tYXJrZXJzLnNpemVdLHQuZ2xvYmFscy5tYXJrZXJzLnNpemUubGVuZ3RoPjApe2lmKHQuZ2xvYmFscy5tYXJrZXJzLnNpemUubGVuZ3RoPHQuZ2xvYmFscy5zZXJpZXMubGVuZ3RoKzEpZm9yKHZhciBlPTA7ZTw9dC5nbG9iYWxzLnNlcmllcy5sZW5ndGg7ZSsrKXZvaWQgMD09PXQuZ2xvYmFscy5tYXJrZXJzLnNpemVbZV0mJnQuZ2xvYmFscy5tYXJrZXJzLnNpemUucHVzaCh0Lmdsb2JhbHMubWFya2Vycy5zaXplWzBdKX1lbHNlIHQuZ2xvYmFscy5tYXJrZXJzLnNpemU9dC5jb25maWcuc2VyaWVzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdC5jb25maWcubWFya2Vycy5zaXplfSl9fSx7a2V5OiJwbG90Q2hhcnRNYXJrZXJzIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIHMsYT10aGlzLncsbj1lLHI9dCxvPW51bGwsbD1uZXcgcCh0aGlzLmN0eCk7aWYoYS5nbG9iYWxzLm1hcmtlcnMuc2l6ZVtlXT4wJiYobz1sLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy1zZXJpZXMtbWFya2VycyJ9KSkuYXR0cigiY2xpcC1wYXRoIiwidXJsKCNncmlkUmVjdE1hcmtlck1hc2siLmNvbmNhdChhLmdsb2JhbHMuY3VpZCwiKSIpKSxyLnggaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGg9MDtoPHIueC5sZW5ndGg7aCsrKXt2YXIgYz1pOzE9PT1pJiYwPT09aCYmKGM9MCksMT09PWkmJjE9PT1oJiYoYz0xKTt2YXIgZD0iYXBleGNoYXJ0cy1tYXJrZXIiO2lmKCJsaW5lIiE9PWEuY29uZmlnLmNoYXJ0LnR5cGUmJiJhcmVhIiE9PWEuY29uZmlnLmNoYXJ0LnR5cGV8fGEuZ2xvYmFscy5jb21ib0NoYXJ0c3x8YS5jb25maWcudG9vbHRpcC5pbnRlcnNlY3R8fChkKz0iIG5vLXBvaW50ZXItZXZlbnRzIiksQXJyYXkuaXNBcnJheShhLmNvbmZpZy5tYXJrZXJzLnNpemUpP2EuZ2xvYmFscy5tYXJrZXJzLnNpemVbZV0+MDphLmNvbmZpZy5tYXJrZXJzLnNpemU+MCl7dS5pc051bWJlcihyLnlbaF0pP2QrPSIgdyIuY29uY2F0KChNYXRoLnJhbmRvbSgpKzEpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNCkpOmQ9ImFwZXhjaGFydHMtbnVsbHBvaW50Ijt2YXIgZj10aGlzLmdldE1hcmtlckNvbmZpZyhkLGUsYyk7YS5jb25maWcuc2VyaWVzW25dLmRhdGFbaV0mJihhLmNvbmZpZy5zZXJpZXNbbl0uZGF0YVtpXS5maWxsQ29sb3ImJihmLnBvaW50RmlsbENvbG9yPWEuY29uZmlnLnNlcmllc1tuXS5kYXRhW2ldLmZpbGxDb2xvciksYS5jb25maWcuc2VyaWVzW25dLmRhdGFbaV0uc3Ryb2tlQ29sb3ImJihmLnBvaW50U3Ryb2tlQ29sb3I9YS5jb25maWcuc2VyaWVzW25dLmRhdGFbaV0uc3Ryb2tlQ29sb3IpKSwocz1sLmRyYXdNYXJrZXIoci54W2hdLHIueVtoXSxmKSkuYXR0cigicmVsIixjKSxzLmF0dHIoImoiLGMpLHMuYXR0cigiaW5kZXgiLGUpLHMubm9kZS5zZXRBdHRyaWJ1dGUoImRlZmF1bHQtbWFya2VyLXNpemUiLGYucFNpemUpLG5ldyBnKHRoaXMuY3R4KS5zZXRTZWxlY3Rpb25GaWx0ZXIocyxlLGMpLHRoaXMuYWRkRXZlbnRzKHMpLG8mJm8uYWRkKHMpfWVsc2Ugdm9pZCAwPT09YS5nbG9iYWxzLnBvaW50c0FycmF5W2VdJiYoYS5nbG9iYWxzLnBvaW50c0FycmF5W2VdPVtdKSxhLmdsb2JhbHMucG9pbnRzQXJyYXlbZV0ucHVzaChbci54W2hdLHIueVtoXV0pfXJldHVybiBvfX0se2tleToiZ2V0TWFya2VyQ29uZmlnIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLHM9dGhpcy53LGE9dGhpcy5nZXRNYXJrZXJTdHlsZShlKSxuPXMuZ2xvYmFscy5tYXJrZXJzLnNpemVbZV0scj1zLmNvbmZpZy5tYXJrZXJzO251bGwhPT1pJiZyLmRpc2NyZXRlLmxlbmd0aCYmci5kaXNjcmV0ZS5tYXAoZnVuY3Rpb24odCl7dC5zZXJpZXNJbmRleD09PWUmJnQuZGF0YVBvaW50SW5kZXg9PT1pJiYoYS5wb2ludFN0cm9rZUNvbG9yPXQuc3Ryb2tlQ29sb3IsYS5wb2ludEZpbGxDb2xvcj10LmZpbGxDb2xvcixuPXQuc2l6ZSl9KTt2YXIgbz0iYnViYmxlIj09PXMuY29uZmlnLmNoYXJ0LnR5cGU/cy5jb25maWcuc3Ryb2tlLndpZHRoOnIuc3Ryb2tlV2lkdGg7cmV0dXJue3BTaXplOm4scFJhZGl1czpyLnJhZGl1cyxwV2lkdGg6byBpbnN0YW5jZW9mIEFycmF5P29bZV06byxwb2ludFN0cm9rZUNvbG9yOmEucG9pbnRTdHJva2VDb2xvcixwb2ludEZpbGxDb2xvcjphLnBvaW50RmlsbENvbG9yLHNoYXBlOnIuc2hhcGUgaW5zdGFuY2VvZiBBcnJheT9yLnNoYXBlW2VdOnIuc2hhcGUsY2xhc3M6dCxwb2ludFN0cm9rZU9wYWNpdHk6ci5zdHJva2VPcGFjaXR5IGluc3RhbmNlb2YgQXJyYXk/ci5zdHJva2VPcGFjaXR5W2VdOnIuc3Ryb2tlT3BhY2l0eSxwb2ludEZpbGxPcGFjaXR5OnIuZmlsbE9wYWNpdHkgaW5zdGFuY2VvZiBBcnJheT9yLmZpbGxPcGFjaXR5W2VdOnIuZmlsbE9wYWNpdHksc2VyaWVzSW5kZXg6ZX19fSx7a2V5OiJhZGRFdmVudHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudyxpPW5ldyBwKHRoaXMuY3R4KTt0Lm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsaS5wYXRoTW91c2VFbnRlci5iaW5kKHRoaXMuY3R4LHQpKSx0Lm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsaS5wYXRoTW91c2VMZWF2ZS5iaW5kKHRoaXMuY3R4LHQpKSx0Lm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixpLnBhdGhNb3VzZURvd24uYmluZCh0aGlzLmN0eCx0KSksdC5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixlLmNvbmZpZy5tYXJrZXJzLm9uQ2xpY2spLHQubm9kZS5hZGRFdmVudExpc3RlbmVyKCJkYmxjbGljayIsZS5jb25maWcubWFya2Vycy5vbkRibENsaWNrKSx0Lm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsaS5wYXRoTW91c2VEb3duLmJpbmQodGhpcy5jdHgsdCkse3Bhc3NpdmU6ITB9KX19LHtrZXk6ImdldE1hcmtlclN0eWxlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLncsaT1lLmdsb2JhbHMubWFya2Vycy5jb2xvcnMscz1lLmNvbmZpZy5tYXJrZXJzLnN0cm9rZUNvbG9yfHxlLmNvbmZpZy5tYXJrZXJzLnN0cm9rZUNvbG9ycztyZXR1cm57cG9pbnRTdHJva2VDb2xvcjpzIGluc3RhbmNlb2YgQXJyYXk/c1t0XTpzLHBvaW50RmlsbENvbG9yOmkgaW5zdGFuY2VvZiBBcnJheT9pW3RdOml9fX1dKSx0fSgpLFA9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGkpe2UodGhpcyx0KSx0aGlzLmN0eD1pLHRoaXMudz1pLncsdGhpcy5pbml0aWFsQW5pbT10aGlzLncuY29uZmlnLmNoYXJ0LmFuaW1hdGlvbnMuZW5hYmxlZCx0aGlzLmR5bmFtaWNBbmltPXRoaXMuaW5pdGlhbEFuaW0mJnRoaXMudy5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5keW5hbWljQW5pbWF0aW9uLmVuYWJsZWQsdGhpcy5yYWRpdXNTaXplcz1bXX1yZXR1cm4gcyh0LFt7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIHM9dGhpcy53LGE9bmV3IHAodGhpcy5jdHgpLG49aS5yZWFsSW5kZXgscj1pLnBvaW50c1BvcyxvPWkuelJhdGlvLGw9aS5lbFBhcmVudCxoPWEuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLXNlcmllcy1tYXJrZXJzIGFwZXhjaGFydHMtc2VyaWVzLSIuY29uY2F0KHMuY29uZmlnLmNoYXJ0LnR5cGUpfSk7aWYoaC5hdHRyKCJjbGlwLXBhdGgiLCJ1cmwoI2dyaWRSZWN0TWFya2VyTWFzayIuY29uY2F0KHMuZ2xvYmFscy5jdWlkLCIpIikpLHIueCBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgYz0wO2M8ci54Lmxlbmd0aDtjKyspe3ZhciBkPWUrMSx1PSEwOzA9PT1lJiYwPT09YyYmKGQ9MCksMD09PWUmJjE9PT1jJiYoZD0xKTt2YXIgZz0wLGY9cy5nbG9iYWxzLm1hcmtlcnMuc2l6ZVtuXTtvIT09MS8wJiYoZj1zLmdsb2JhbHMuc2VyaWVzWltuXVtkXS9vLHZvaWQgMD09PXRoaXMucmFkaXVzU2l6ZXNbbl0mJnRoaXMucmFkaXVzU2l6ZXMucHVzaChbXSksdGhpcy5yYWRpdXNTaXplc1tuXS5wdXNoKGYpKSxzLmNvbmZpZy5jaGFydC5hbmltYXRpb25zLmVuYWJsZWR8fChnPWYpO3ZhciB4PXIueFtjXSxiPXIueVtjXTtpZihnPWd8fDAsKDA9PT14JiYwPT09Ynx8bnVsbD09PWJ8fHZvaWQgMD09PXMuZ2xvYmFscy5zZXJpZXNbbl1bZF0pJiYodT0hMSksdSl7dmFyIG09dGhpcy5kcmF3UG9pbnQoeCxiLGcsZixuLGQsZSk7aC5hZGQobSl9bC5hZGQoaCl9fX0se2tleToiZHJhd1BvaW50Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSxzLGEsbixyKXt2YXIgbz10aGlzLncsbD1hLGg9bmV3IGYodGhpcy5jdHgpLGM9bmV3IGcodGhpcy5jdHgpLGQ9bmV3IEModGhpcy5jdHgpLHU9bmV3IEwodGhpcy5jdHgpLHg9bmV3IHAodGhpcy5jdHgpLGI9dS5nZXRNYXJrZXJDb25maWcoImFwZXhjaGFydHMtbWFya2VyIixsKSxtPWQuZmlsbFBhdGgoe3Nlcmllc051bWJlcjphLHBhdHRlcm5Vbml0czoib2JqZWN0Qm91bmRpbmdCb3giLHZhbHVlOm8uZ2xvYmFscy5zZXJpZXNbYV1bcl19KSx2PXguZHJhd0NpcmNsZShpKTtpZihvLmNvbmZpZy5zZXJpZXNbbF0uZGF0YVtuXSYmby5jb25maWcuc2VyaWVzW2xdLmRhdGFbbl0uZmlsbENvbG9yJiYobT1vLmNvbmZpZy5zZXJpZXNbbF0uZGF0YVtuXS5maWxsQ29sb3IpLHYuYXR0cih7Y3g6dCxjeTplLGZpbGw6bSxzdHJva2U6Yi5wb2ludFN0cm9rZUNvbG9yLCJzdHJva2Utd2lkdGgiOmIucFdpZHRofSksby5jb25maWcuY2hhcnQuZHJvcFNoYWRvdy5lbmFibGVkKXt2YXIgeT1vLmNvbmZpZy5jaGFydC5kcm9wU2hhZG93O2MuZHJvcFNoYWRvdyh2LHksYSl9aWYodGhpcy5pbml0aWFsQW5pbSYmIW8uZ2xvYmFscy5kYXRhQ2hhbmdlZCl7dmFyIHc9MTtvLmdsb2JhbHMucmVzaXplZHx8KHc9by5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5zcGVlZCksaC5hbmltYXRlQ2lyY2xlUmFkaXVzKHYsMCxzLHcsby5nbG9iYWxzLmVhc2luZyl9aWYoby5nbG9iYWxzLmRhdGFDaGFuZ2VkKWlmKHRoaXMuZHluYW1pY0FuaW0pe3ZhciBrLEEsUyxQLHo9by5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5keW5hbWljQW5pbWF0aW9uLnNwZWVkO251bGwhPShQPW8uZ2xvYmFscy5wcmV2aW91c1BhdGhzW2FdJiZvLmdsb2JhbHMucHJldmlvdXNQYXRoc1thXVtyXSkmJihrPVAueCxBPVAueSxTPXZvaWQgMCE9PVAucj9QLnI6cyk7Zm9yKHZhciBNPTA7TTxvLmdsb2JhbHMuY29sbGFwc2VkU2VyaWVzLmxlbmd0aDtNKyspby5nbG9iYWxzLmNvbGxhcHNlZFNlcmllc1tNXS5pbmRleD09PWEmJih6PTEscz0wKTswPT09dCYmMD09PWUmJihzPTApLGguYW5pbWF0ZUNpcmNsZSh2LHtjeDprLGN5OkEscjpTfSx7Y3g6dCxjeTplLHI6c30seixvLmdsb2JhbHMuZWFzaW5nKX1lbHNlIHYuYXR0cih7cjpzfSk7cmV0dXJuIHYuYXR0cih7cmVsOm4sajpuLGluZGV4OmEsImRlZmF1bHQtbWFya2VyLXNpemUiOnN9KSxjLnNldFNlbGVjdGlvbkZpbHRlcih2LGEsbiksdS5hZGRFdmVudHModiksdi5ub2RlLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtbWFya2VyIiksdn19LHtrZXk6ImNlbnRlclRleHRJbkJ1YmJsZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53O3JldHVybnt5OnQrPXBhcnNlSW50KGUuY29uZmlnLmRhdGFMYWJlbHMuc3R5bGUuZm9udFNpemUpLzR9fX1dKSx0fSgpLHo9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGkpe2UodGhpcyx0KSx0aGlzLmN0eD1pLHRoaXMudz1pLnd9cmV0dXJuIHModCxbe2tleToiZGF0YUxhYmVsc0NvcnJlY3Rpb24iLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLHMsYSxuLHIpe3ZhciBvPXRoaXMudyxsPSExLGg9bmV3IHAodGhpcy5jdHgpLmdldFRleHRSZWN0cyhpLHIpLGM9aC53aWR0aCxkPWguaGVpZ2h0O3ZvaWQgMD09PW8uZ2xvYmFscy5kYXRhTGFiZWxzUmVjdHNbc10mJihvLmdsb2JhbHMuZGF0YUxhYmVsc1JlY3RzW3NdPVtdKSxvLmdsb2JhbHMuZGF0YUxhYmVsc1JlY3RzW3NdLnB1c2goe3g6dCx5OmUsd2lkdGg6YyxoZWlnaHQ6ZH0pO3ZhciB1PW8uZ2xvYmFscy5kYXRhTGFiZWxzUmVjdHNbc10ubGVuZ3RoLTIsZz12b2lkIDAhPT1vLmdsb2JhbHMubGFzdERyYXduRGF0YUxhYmVsc0luZGV4ZXNbc10/by5nbG9iYWxzLmxhc3REcmF3bkRhdGFMYWJlbHNJbmRleGVzW3NdW28uZ2xvYmFscy5sYXN0RHJhd25EYXRhTGFiZWxzSW5kZXhlc1tzXS5sZW5ndGgtMV06MDtpZih2b2lkIDAhPT1vLmdsb2JhbHMuZGF0YUxhYmVsc1JlY3RzW3NdW3VdKXt2YXIgZj1vLmdsb2JhbHMuZGF0YUxhYmVsc1JlY3RzW3NdW2ddOyh0PmYueCtmLndpZHRoKzJ8fGU+Zi55K2YuaGVpZ2h0KzJ8fHQrYzxmLngpJiYobD0hMCl9cmV0dXJuKDA9PT1hfHxuKSYmKGw9ITApLHt4OnQseTplLHRleHRSZWN0czpoLGRyYXduZXh0TGFiZWw6bH19fSx7a2V5OiJkcmF3RGF0YUxhYmVsIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIHM9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOiJ0b3AiLGE9dGhpcy53LG49bmV3IHAodGhpcy5jdHgpLHI9YS5jb25maWcuZGF0YUxhYmVscyxvPTAsbD0wLGg9aSxjPW51bGw7aWYoIXIuZW5hYmxlZHx8dC54IGluc3RhbmNlb2YgQXJyYXkhPSEwKXJldHVybiBjO2M9bi5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMtZGF0YS1sYWJlbHMifSk7Zm9yKHZhciBkPTA7ZDx0LngubGVuZ3RoO2QrKylpZihvPXQueFtkXStyLm9mZnNldFgsbD10LnlbZF0rci5vZmZzZXRZLWEuZ2xvYmFscy5tYXJrZXJzLnNpemVbZV0tNSwiYm90dG9tIj09PXMmJihsPWwrMiphLmdsb2JhbHMubWFya2Vycy5zaXplW2VdKzEuNCpwYXJzZUludChyLnN0eWxlLmZvbnRTaXplKSksIWlzTmFOKG8pKXsxPT09aSYmMD09PWQmJihoPTApLDE9PT1pJiYxPT09ZCYmKGg9MSk7dmFyIHU9YS5nbG9iYWxzLnNlcmllc1tlXVtoXSxnPSIiO2lmKCJidWJibGUiPT09YS5jb25maWcuY2hhcnQudHlwZSl1PWEuZ2xvYmFscy5zZXJpZXNaW2VdW2hdLGc9YS5jb25maWcuZGF0YUxhYmVscy5mb3JtYXR0ZXIodSx7Y3R4OnRoaXMuY3R4LHNlcmllc0luZGV4OmUsZGF0YVBvaW50SW5kZXg6aCx3OmF9KSxsPXQueVtkXSthLmNvbmZpZy5kYXRhTGFiZWxzLm9mZnNldFksbD1uZXcgUCh0aGlzLmN0eCkuY2VudGVyVGV4dEluQnViYmxlKGwsZSxoKS55O2Vsc2Ugdm9pZCAwIT09dSYmKGc9YS5jb25maWcuZGF0YUxhYmVscy5mb3JtYXR0ZXIodSx7Y3R4OnRoaXMuY3R4LHNlcmllc0luZGV4OmUsZGF0YVBvaW50SW5kZXg6aCx3OmF9KSk7dGhpcy5wbG90RGF0YUxhYmVsc1RleHQoe3g6byx5OmwsdGV4dDpnLGk6ZSxqOmgscGFyZW50OmMsb2Zmc2V0Q29ycmVjdGlvbjohMCxkYXRhTGFiZWxzQ29uZmlnOmEuY29uZmlnLmRhdGFMYWJlbHN9KX1yZXR1cm4gY319LHtrZXk6InBsb3REYXRhTGFiZWxzVGV4dCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53LGk9bmV3IHAodGhpcy5jdHgpLHM9dC54LGE9dC55LG49dC5pLHI9dC5qLG89dC50ZXh0LGw9dC50ZXh0QW5jaG9yLGg9dC5wYXJlbnQsYz10LmRhdGFMYWJlbHNDb25maWcsZD10LmFsd2F5c0RyYXdEYXRhTGFiZWwsdT10Lm9mZnNldENvcnJlY3Rpb247aWYoIShBcnJheS5pc0FycmF5KGUuY29uZmlnLmRhdGFMYWJlbHMuZW5hYmxlZE9uU2VyaWVzKSYmZS5jb25maWcuZGF0YUxhYmVscy5lbmFibGVkT25TZXJpZXMuaW5kZXhPZihuKTwwKSl7dmFyIGY9e3g6cyx5OmEsZHJhd25leHRMYWJlbDohMH07aWYodSYmKGY9dGhpcy5kYXRhTGFiZWxzQ29ycmVjdGlvbihzLGEsbyxuLHIsZCxwYXJzZUludChjLnN0eWxlLmZvbnRTaXplKSkpLGUuZ2xvYmFscy56b29tZWR8fChzPWYueCxhPWYueSksZi50ZXh0UmVjdHMmJihzK2YudGV4dFJlY3RzLndpZHRoPDEwfHxzPmUuZ2xvYmFscy5ncmlkV2lkdGgrMTApJiYobz0iIiksZi5kcmF3bmV4dExhYmVsKXt2YXIgeD1pLmRyYXdUZXh0KHt3aWR0aDoxMDAsaGVpZ2h0OnBhcnNlSW50KGMuc3R5bGUuZm9udFNpemUpLHg6cyx5OmEsZm9yZUNvbG9yOmUuZ2xvYmFscy5kYXRhTGFiZWxzLnN0eWxlLmNvbG9yc1tuXSx0ZXh0QW5jaG9yOmx8fGMudGV4dEFuY2hvcix0ZXh0Om8sZm9udFNpemU6Yy5zdHlsZS5mb250U2l6ZSxmb250RmFtaWx5OmMuc3R5bGUuZm9udEZhbWlseX0pO2lmKHguYXR0cih7Y2xhc3M6ImFwZXhjaGFydHMtZGF0YWxhYmVsIixjeDpzLGN5OmF9KSxjLmRyb3BTaGFkb3cuZW5hYmxlZCl7dmFyIGI9Yy5kcm9wU2hhZG93O25ldyBnKHRoaXMuY3R4KS5kcm9wU2hhZG93KHgsYil9aC5hZGQoeCksdm9pZCAwPT09ZS5nbG9iYWxzLmxhc3REcmF3bkRhdGFMYWJlbHNJbmRleGVzW25dJiYoZS5nbG9iYWxzLmxhc3REcmF3bkRhdGFMYWJlbHNJbmRleGVzW25dPVtdKSxlLmdsb2JhbHMubGFzdERyYXduRGF0YUxhYmVsc0luZGV4ZXNbbl0ucHVzaChyKX19fX1dKSx0fSgpLE09ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGkscyl7ZSh0aGlzLHQpLHRoaXMuY3R4PWksdGhpcy53PWkudzt2YXIgYT10aGlzLnc7dGhpcy5iYXJPcHRpb25zPWEuY29uZmlnLnBsb3RPcHRpb25zLmJhcix0aGlzLmlzSG9yaXpvbnRhbD10aGlzLmJhck9wdGlvbnMuaG9yaXpvbnRhbCx0aGlzLnN0cm9rZVdpZHRoPWEuY29uZmlnLnN0cm9rZS53aWR0aCx0aGlzLmlzTnVsbFZhbHVlPSExLHRoaXMueHlSYXRpb3M9cyxudWxsIT09dGhpcy54eVJhdGlvcyYmKHRoaXMueFJhdGlvPXMueFJhdGlvLHRoaXMueVJhdGlvPXMueVJhdGlvLHRoaXMuaW52ZXJ0ZWRYUmF0aW89cy5pbnZlcnRlZFhSYXRpbyx0aGlzLmludmVydGVkWVJhdGlvPXMuaW52ZXJ0ZWRZUmF0aW8sdGhpcy5iYXNlTGluZVk9cy5iYXNlTGluZVksdGhpcy5iYXNlTGluZUludmVydGVkWT1zLmJhc2VMaW5lSW52ZXJ0ZWRZKSx0aGlzLnlheGlzSW5kZXg9MCx0aGlzLnNlcmllc0xlbj0wfXJldHVybiBzKHQsW3trZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53LHM9bmV3IHAodGhpcy5jdHgpLGE9bmV3IHcodGhpcy5jdHgsaSk7dD1hLmdldExvZ1Nlcmllcyh0KSx0aGlzLnNlcmllcz10LHRoaXMueVJhdGlvPWEuZ2V0TG9nWVJhdGlvcyh0aGlzLnlSYXRpbyksdGhpcy5pbml0VmFyaWFibGVzKHQpO3ZhciBuPXMuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLWJhci1zZXJpZXMgYXBleGNoYXJ0cy1wbG90LXNlcmllcyJ9KTtpLmNvbmZpZy5kYXRhTGFiZWxzLmVuYWJsZWQmJnRoaXMudG90YWxJdGVtcz50aGlzLmJhck9wdGlvbnMuZGF0YUxhYmVscy5tYXhJdGVtcyYmY29uc29sZS53YXJuKCJXQVJOSU5HOiBEYXRhTGFiZWxzIGFyZSBlbmFibGVkIGJ1dCB0aGVyZSBhcmUgdG9vIG1hbnkgdG8gZGlzcGxheS4gVGhpcyBtYXkgY2F1c2UgcGVyZm9ybWFuY2UgaXNzdWUgd2hlbiByZW5kZXJpbmcuIik7Zm9yKHZhciByPTAsbz0wO3I8dC5sZW5ndGg7cisrLG8rKyl7dmFyIGwsaCxjLGQsZz12b2lkIDAsZj12b2lkIDAseD12b2lkIDAsYj12b2lkIDAsbT1bXSx2PVtdLHk9aS5nbG9iYWxzLmNvbWJvQ2hhcnRzP2Vbcl06cixrPXMuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLXNlcmllcyIscmVsOnIrMSxzZXJpZXNOYW1lOnUuZXNjYXBlU3RyaW5nKGkuZ2xvYmFscy5zZXJpZXNOYW1lc1t5XSksImRhdGE6cmVhbEluZGV4Ijp5fSk7dGhpcy5jdHguc2VyaWVzLmFkZENvbGxhcHNlZENsYXNzVG9TZXJpZXMoayx5KSx0W3JdLmxlbmd0aD4wJiYodGhpcy52aXNpYmxlST10aGlzLnZpc2libGVJKzEpO3ZhciBBPTAsUz0wLEM9MDt0aGlzLnlSYXRpby5sZW5ndGg+MSYmKHRoaXMueWF4aXNJbmRleD15KSx0aGlzLmlzUmV2ZXJzZWQ9aS5jb25maWcueWF4aXNbdGhpcy55YXhpc0luZGV4XSYmaS5jb25maWcueWF4aXNbdGhpcy55YXhpc0luZGV4XS5yZXZlcnNlZDt2YXIgTD10aGlzLmluaXRpYWxQb3NpdGlvbnMoKTtiPUwueSxTPUwuYmFySGVpZ2h0LGg9TC55RGl2aXNpb24sZD1MLnplcm9XLHg9TC54LEM9TC5iYXJXaWR0aCxsPUwueERpdmlzaW9uLGM9TC56ZXJvSCx0aGlzLmhvcml6b250YWx8fHYucHVzaCh4K0MvMik7Zm9yKHZhciBQPXMuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLWRhdGFsYWJlbHMifSksej0wLE09aS5nbG9iYWxzLmRhdGFQb2ludHM7ejxpLmdsb2JhbHMuZGF0YVBvaW50czt6KyssTS0tKXt2b2lkIDA9PT10aGlzLnNlcmllc1tyXVt6XXx8bnVsbD09PXRbcl1bel0/dGhpcy5pc051bGxWYWx1ZT0hMDp0aGlzLmlzTnVsbFZhbHVlPSExLGkuY29uZmlnLnN0cm9rZS5zaG93JiYoQT10aGlzLmlzTnVsbFZhbHVlPzA6QXJyYXkuaXNBcnJheSh0aGlzLnN0cm9rZVdpZHRoKT90aGlzLnN0cm9rZVdpZHRoW3ldOnRoaXMuc3Ryb2tlV2lkdGgpO3ZhciBFPW51bGw7dGhpcy5pc0hvcml6b250YWw/KEU9dGhpcy5kcmF3QmFyUGF0aHMoe2luZGV4ZXM6e2k6cixqOnoscmVhbEluZGV4OnksYmM6b30sYmFySGVpZ2h0OlMsc3Ryb2tlV2lkdGg6QSxwYXRoVG86ZyxwYXRoRnJvbTpmLHplcm9XOmQseDp4LHk6Yix5RGl2aXNpb246aCxlbFNlcmllczprfSksQz10aGlzLnNlcmllc1tyXVt6XS90aGlzLmludmVydGVkWVJhdGlvKTooRT10aGlzLmRyYXdDb2x1bW5QYXRocyh7aW5kZXhlczp7aTpyLGo6eixyZWFsSW5kZXg6eSxiYzpvfSx4OngseTpiLHhEaXZpc2lvbjpsLHBhdGhUbzpnLHBhdGhGcm9tOmYsYmFyV2lkdGg6Qyx6ZXJvSDpjLHN0cm9rZVdpZHRoOkEsZWxTZXJpZXM6a30pLFM9dGhpcy5zZXJpZXNbcl1bel0vdGhpcy55UmF0aW9bdGhpcy55YXhpc0luZGV4XSksZz1FLnBhdGhUbyxmPUUucGF0aEZyb20sYj1FLnkseD1FLngsej4wJiZ2LnB1c2goeCtDLzIpLG0ucHVzaChiKTt2YXIgVD10aGlzLmdldFBhdGhGaWxsQ29sb3IodCxyLHoseSk7az10aGlzLnJlbmRlclNlcmllcyh7cmVhbEluZGV4OnkscGF0aEZpbGw6VCxqOnosaTpyLHBhdGhGcm9tOmYscGF0aFRvOmcsc3Ryb2tlV2lkdGg6QSxlbFNlcmllczprLHg6eCx5OmIsc2VyaWVzOnQsYmFySGVpZ2h0OlMsYmFyV2lkdGg6QyxlbERhdGFMYWJlbHNXcmFwOlAsdmlzaWJsZVNlcmllczp0aGlzLnZpc2libGVJLHR5cGU6ImJhciJ9KX1pLmdsb2JhbHMuc2VyaWVzWHZhbHVlc1t5XT12LGkuZ2xvYmFscy5zZXJpZXNZdmFsdWVzW3ldPW0sbi5hZGQoayl9cmV0dXJuIG59fSx7a2V5OiJnZXRQYXRoRmlsbENvbG9yIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxzKXt2YXIgYT10aGlzLncsbj1uZXcgQyh0aGlzLmN0eCkscj1udWxsLG89dGhpcy5iYXJPcHRpb25zLmRpc3RyaWJ1dGVkP2k6ZTt0aGlzLmJhck9wdGlvbnMuY29sb3JzLnJhbmdlcy5sZW5ndGg+MCYmdGhpcy5iYXJPcHRpb25zLmNvbG9ycy5yYW5nZXMubWFwKGZ1bmN0aW9uKHMpe3RbZV1baV0+PXMuZnJvbSYmdFtlXVtpXTw9cy50byYmKHI9cy5jb2xvcil9KTtyZXR1cm4gYS5jb25maWcuc2VyaWVzW2VdLmRhdGFbaV0mJmEuY29uZmlnLnNlcmllc1tlXS5kYXRhW2ldLmZpbGxDb2xvciYmKHI9YS5jb25maWcuc2VyaWVzW2VdLmRhdGFbaV0uZmlsbENvbG9yKSxuLmZpbGxQYXRoKHtzZXJpZXNOdW1iZXI6dGhpcy5iYXJPcHRpb25zLmRpc3RyaWJ1dGVkP286cyxjb2xvcjpyLHZhbHVlOnRbZV1baV19KX19LHtrZXk6InJlbmRlclNlcmllcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dC5yZWFsSW5kZXgsaT10LnBhdGhGaWxsLHM9dC5saW5lRmlsbCxhPXQuaixuPXQuaSxyPXQucGF0aEZyb20sbz10LnBhdGhUbyxsPXQuc3Ryb2tlV2lkdGgsaD10LmVsU2VyaWVzLGM9dC54LGQ9dC55LHU9dC5zZXJpZXMsZj10LmJhckhlaWdodCx4PXQuYmFyV2lkdGgsYj10LmVsRGF0YUxhYmVsc1dyYXAsbT10LnZpc2libGVTZXJpZXMsdj10LnR5cGUseT10aGlzLncsdz1uZXcgcCh0aGlzLmN0eCk7c3x8KHM9dGhpcy5iYXJPcHRpb25zLmRpc3RyaWJ1dGVkP3kuZ2xvYmFscy5zdHJva2UuY29sb3JzW2FdOnkuZ2xvYmFscy5zdHJva2UuY29sb3JzW2VdKSx5LmNvbmZpZy5zZXJpZXNbbl0uZGF0YVthXSYmeS5jb25maWcuc2VyaWVzW25dLmRhdGFbYV0uc3Ryb2tlQ29sb3ImJihzPXkuY29uZmlnLnNlcmllc1tuXS5kYXRhW2FdLnN0cm9rZUNvbG9yKSx0aGlzLmlzTnVsbFZhbHVlJiYoaT0ibm9uZSIpO3ZhciBrPWEveS5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5hbmltYXRlR3JhZHVhbGx5LmRlbGF5Kih5LmNvbmZpZy5jaGFydC5hbmltYXRpb25zLnNwZWVkL3kuZ2xvYmFscy5kYXRhUG9pbnRzKS8yLjQsQT13LnJlbmRlclBhdGhzKHtpOm4sajphLHJlYWxJbmRleDplLHBhdGhGcm9tOnIscGF0aFRvOm8sc3Ryb2tlOnMsc3Ryb2tlV2lkdGg6bCxzdHJva2VMaW5lQ2FwOnkuY29uZmlnLnN0cm9rZS5saW5lQ2FwLGZpbGw6aSxhbmltYXRpb25EZWxheTprLGluaXRpYWxTcGVlZDp5LmNvbmZpZy5jaGFydC5hbmltYXRpb25zLnNwZWVkLGRhdGFDaGFuZ2VTcGVlZDp5LmNvbmZpZy5jaGFydC5hbmltYXRpb25zLmR5bmFtaWNBbmltYXRpb24uc3BlZWQsY2xhc3NOYW1lOiJhcGV4Y2hhcnRzLSIuY29uY2F0KHYsIi1hcmVhIil9KTtBLmF0dHIoImNsaXAtcGF0aCIsInVybCgjZ3JpZFJlY3RNYXNrIi5jb25jYXQoeS5nbG9iYWxzLmN1aWQsIikiKSksbmV3IGcodGhpcy5jdHgpLnNldFNlbGVjdGlvbkZpbHRlcihBLGUsYSksaC5hZGQoQSk7dmFyIFM9dGhpcy5jYWxjdWxhdGVEYXRhTGFiZWxzUG9zKHt4OmMseTpkLGk6bixqOmEsc2VyaWVzOnUscmVhbEluZGV4OmUsYmFySGVpZ2h0OmYsYmFyV2lkdGg6eCxyZW5kZXJlZFBhdGg6QSx2aXNpYmxlU2VyaWVzOm19KTtyZXR1cm4gbnVsbCE9PVMmJmIuYWRkKFMpLGguYWRkKGIpLGh9fSx7a2V5OiJpbml0VmFyaWFibGVzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnc7dGhpcy5zZXJpZXM9dCx0aGlzLnRvdGFsSXRlbXM9MCx0aGlzLnNlcmllc0xlbj0wLHRoaXMudmlzaWJsZUk9LTEsdGhpcy52aXNpYmxlSXRlbXM9MTtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKylpZih0W2ldLmxlbmd0aD4wJiYodGhpcy5zZXJpZXNMZW49dGhpcy5zZXJpZXNMZW4rMSx0aGlzLnRvdGFsSXRlbXMrPXRbaV0ubGVuZ3RoKSxlLmdsb2JhbHMuaXNYTnVtZXJpYylmb3IodmFyIHM9MDtzPHRbaV0ubGVuZ3RoO3MrKyllLmdsb2JhbHMuc2VyaWVzWFtpXVtzXT5lLmdsb2JhbHMubWluWCYmZS5nbG9iYWxzLnNlcmllc1hbaV1bc108ZS5nbG9iYWxzLm1heFgmJnRoaXMudmlzaWJsZUl0ZW1zKys7ZWxzZSB0aGlzLnZpc2libGVJdGVtcz1lLmdsb2JhbHMuZGF0YVBvaW50czswPT09dGhpcy5zZXJpZXNMZW4mJih0aGlzLnNlcmllc0xlbj0xKX19LHtrZXk6ImluaXRpYWxQb3NpdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxpLHMsYSxuLHIsbyxsPXRoaXMudztyZXR1cm4gdGhpcy5pc0hvcml6b250YWw/KGE9KGk9bC5nbG9iYWxzLmdyaWRIZWlnaHQvbC5nbG9iYWxzLmRhdGFQb2ludHMpL3RoaXMuc2VyaWVzTGVuLGwuZ2xvYmFscy5pc1hOdW1lcmljJiYoYT0oaT1sLmdsb2JhbHMuZ3JpZEhlaWdodC90aGlzLnRvdGFsSXRlbXMpL3RoaXMuc2VyaWVzTGVuKSxhPWEqcGFyc2VJbnQodGhpcy5iYXJPcHRpb25zLmJhckhlaWdodCkvMTAwLG89dGhpcy5iYXNlTGluZUludmVydGVkWStsLmdsb2JhbHMucGFkSG9yaXpvbnRhbCsodGhpcy5pc1JldmVyc2VkP2wuZ2xvYmFscy5ncmlkV2lkdGg6MCktKHRoaXMuaXNSZXZlcnNlZD8yKnRoaXMuYmFzZUxpbmVJbnZlcnRlZFk6MCksZT0oaS1hKnRoaXMuc2VyaWVzTGVuKS8yKToobj0ocz1sLmdsb2JhbHMuZ3JpZFdpZHRoL3RoaXMudmlzaWJsZUl0ZW1zKS90aGlzLnNlcmllc0xlbipwYXJzZUludCh0aGlzLmJhck9wdGlvbnMuY29sdW1uV2lkdGgpLzEwMCxsLmdsb2JhbHMuaXNYTnVtZXJpYyYmKGwuZ2xvYmFscy5taW5YRGlmZiYmKHM9bC5nbG9iYWxzLm1pblhEaWZmL3RoaXMueFJhdGlvKSwobj1zL3RoaXMuc2VyaWVzTGVuKnBhcnNlSW50KHRoaXMuYmFyT3B0aW9ucy5jb2x1bW5XaWR0aCkvMTAwKTwxJiYobj0xKSkscj1sLmdsb2JhbHMuZ3JpZEhlaWdodC10aGlzLmJhc2VMaW5lWVt0aGlzLnlheGlzSW5kZXhdLSh0aGlzLmlzUmV2ZXJzZWQ/bC5nbG9iYWxzLmdyaWRIZWlnaHQ6MCkrKHRoaXMuaXNSZXZlcnNlZD8yKnRoaXMuYmFzZUxpbmVZW3RoaXMueWF4aXNJbmRleF06MCksdD1sLmdsb2JhbHMucGFkSG9yaXpvbnRhbCsocy1uKnRoaXMuc2VyaWVzTGVuKS8yKSx7eDp0LHk6ZSx5RGl2aXNpb246aSx4RGl2aXNpb246cyxiYXJIZWlnaHQ6YSxiYXJXaWR0aDpuLHplcm9IOnIsemVyb1c6b319fSx7a2V5OiJkcmF3QmFyUGF0aHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhlcyxpPXQuYmFySGVpZ2h0LHM9dC5zdHJva2VXaWR0aCxhPXQucGF0aFRvLG49dC5wYXRoRnJvbSxyPXQuemVyb1csbz10LngsbD10LnksaD10LnlEaXZpc2lvbixjPXQuZWxTZXJpZXMsZD10aGlzLncsdT1uZXcgcCh0aGlzLmN0eCksZz1lLmksZj1lLmoseD1lLnJlYWxJbmRleCxiPWUuYmM7ZC5nbG9iYWxzLmlzWE51bWVyaWMmJihsPShkLmdsb2JhbHMuc2VyaWVzWFtnXVtmXS1kLmdsb2JhbHMubWluWCkvdGhpcy5pbnZlcnRlZFhSYXRpby1pKTt2YXIgbT1sK2kqdGhpcy52aXNpYmxlSTthPXUubW92ZShyLG0pLG49dS5tb3ZlKHIsbSksZC5nbG9iYWxzLnByZXZpb3VzUGF0aHMubGVuZ3RoPjAmJihuPXRoaXMuZ2V0UGF0aEZyb20oeCxmKSk7dmFyIHY9e2JhckhlaWdodDppLHN0cm9rZVdpZHRoOnMsYmFyWVBvc2l0aW9uOm0seDpvPXZvaWQgMD09PXRoaXMuc2VyaWVzW2ddW2ZdfHxudWxsPT09dGhpcy5zZXJpZXNbZ11bZl0/cjpyK3RoaXMuc2VyaWVzW2ddW2ZdL3RoaXMuaW52ZXJ0ZWRZUmF0aW8tMioodGhpcy5pc1JldmVyc2VkP3RoaXMuc2VyaWVzW2ddW2ZdL3RoaXMuaW52ZXJ0ZWRZUmF0aW86MCksemVyb1c6cn0seT10aGlzLmJhckVuZGluZ1NoYXBlKGQsdix0aGlzLnNlcmllcyxnLGYpO2lmKGE9YSt1LmxpbmUoeS5uZXdYLG0pK3kucGF0aCt1LmxpbmUocixtK2ktcykrdS5saW5lKHIsbSksbj1uK3UubGluZShyLG0pK3kuZW5kaW5nX3BfZnJvbSt1LmxpbmUocixtK2ktcykrdS5saW5lKHIsbStpLXMpK3UubGluZShyLG0pLGQuZ2xvYmFscy5pc1hOdW1lcmljfHwobCs9aCksdGhpcy5iYXJPcHRpb25zLmNvbG9ycy5iYWNrZ3JvdW5kQmFyQ29sb3JzLmxlbmd0aD4wJiYwPT09Zyl7Yj49dGhpcy5iYXJPcHRpb25zLmNvbG9ycy5iYWNrZ3JvdW5kQmFyQ29sb3JzLmxlbmd0aCYmKGI9MCk7dmFyIHc9dGhpcy5iYXJPcHRpb25zLmNvbG9ycy5iYWNrZ3JvdW5kQmFyQ29sb3JzW2JdLGs9dS5kcmF3UmVjdCgwLG0taSp0aGlzLnZpc2libGVJLGQuZ2xvYmFscy5ncmlkV2lkdGgsaSp0aGlzLnNlcmllc0xlbiwwLHcsdGhpcy5iYXJPcHRpb25zLmNvbG9ycy5iYWNrZ3JvdW5kQmFyT3BhY2l0eSk7Yy5hZGQoayksay5ub2RlLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtYmFja2dyb3VuZEJhciIpfXJldHVybntwYXRoVG86YSxwYXRoRnJvbTpuLHg6byx5OmwsYmFyWVBvc2l0aW9uOm19fX0se2tleToiZHJhd0NvbHVtblBhdGhzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LmluZGV4ZXMsaT10Lngscz10LnksYT10LnhEaXZpc2lvbixuPXQucGF0aFRvLHI9dC5wYXRoRnJvbSxvPXQuYmFyV2lkdGgsbD10Lnplcm9ILGg9dC5zdHJva2VXaWR0aCxjPXQuZWxTZXJpZXMsZD10aGlzLncsdT1uZXcgcCh0aGlzLmN0eCksZz1lLmksZj1lLmoseD1lLnJlYWxJbmRleCxiPWUuYmM7aWYoZC5nbG9iYWxzLmlzWE51bWVyaWMpe3ZhciBtPWc7ZC5nbG9iYWxzLnNlcmllc1hbZ10ubGVuZ3RofHwobT1kLmdsb2JhbHMubWF4VmFsc0luQXJyYXlJbmRleCksaT0oZC5nbG9iYWxzLnNlcmllc1hbbV1bZl0tZC5nbG9iYWxzLm1pblgpL3RoaXMueFJhdGlvLW8vMn12YXIgdj1pK28qdGhpcy52aXNpYmxlSTtuPXUubW92ZSh2LGwpLHI9dS5tb3ZlKHYsbCksZC5nbG9iYWxzLnByZXZpb3VzUGF0aHMubGVuZ3RoPjAmJihyPXRoaXMuZ2V0UGF0aEZyb20oeCxmKSk7dmFyIHk9e2JhcldpZHRoOm8sc3Ryb2tlV2lkdGg6aCxiYXJYUG9zaXRpb246dix5OnM9dm9pZCAwPT09dGhpcy5zZXJpZXNbZ11bZl18fG51bGw9PT10aGlzLnNlcmllc1tnXVtmXT9sOmwtdGhpcy5zZXJpZXNbZ11bZl0vdGhpcy55UmF0aW9bdGhpcy55YXhpc0luZGV4XSsyKih0aGlzLmlzUmV2ZXJzZWQ/dGhpcy5zZXJpZXNbZ11bZl0vdGhpcy55UmF0aW9bdGhpcy55YXhpc0luZGV4XTowKSx6ZXJvSDpsfSx3PXRoaXMuYmFyRW5kaW5nU2hhcGUoZCx5LHRoaXMuc2VyaWVzLGcsZik7aWYobj1uK3UubGluZSh2LHcubmV3WSkrdy5wYXRoK3UubGluZSh2K28taCxsKSt1LmxpbmUodi1oLzIsbCkscj1yK3UubGluZSh2LGwpK3cuZW5kaW5nX3BfZnJvbSt1LmxpbmUoditvLWgsbCkrdS5saW5lKHYrby1oLGwpK3UubGluZSh2LWgvMixsKSxkLmdsb2JhbHMuaXNYTnVtZXJpY3x8KGkrPWEpLHRoaXMuYmFyT3B0aW9ucy5jb2xvcnMuYmFja2dyb3VuZEJhckNvbG9ycy5sZW5ndGg+MCYmMD09PWcpe2I+PXRoaXMuYmFyT3B0aW9ucy5jb2xvcnMuYmFja2dyb3VuZEJhckNvbG9ycy5sZW5ndGgmJihiPTApO3ZhciBrPXRoaXMuYmFyT3B0aW9ucy5jb2xvcnMuYmFja2dyb3VuZEJhckNvbG9yc1tiXSxBPXUuZHJhd1JlY3Qodi1vKnRoaXMudmlzaWJsZUksMCxvKnRoaXMuc2VyaWVzTGVuLGQuZ2xvYmFscy5ncmlkSGVpZ2h0LDAsayx0aGlzLmJhck9wdGlvbnMuY29sb3JzLmJhY2tncm91bmRCYXJPcGFjaXR5KTtjLmFkZChBKSxBLm5vZGUuY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy1iYWNrZ3JvdW5kQmFyIil9cmV0dXJue3BhdGhUbzpuLHBhdGhGcm9tOnIseDppLHk6cyxiYXJYUG9zaXRpb246dn19fSx7a2V5OiJnZXRQYXRoRnJvbSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGkscz10aGlzLncsYT0wO2E8cy5nbG9iYWxzLnByZXZpb3VzUGF0aHMubGVuZ3RoO2ErKyl7dmFyIG49cy5nbG9iYWxzLnByZXZpb3VzUGF0aHNbYV07bi5wYXRocyYmbi5wYXRocy5sZW5ndGg+MCYmcGFyc2VJbnQobi5yZWFsSW5kZXgpPT09cGFyc2VJbnQodCkmJnZvaWQgMCE9PXMuZ2xvYmFscy5wcmV2aW91c1BhdGhzW2FdLnBhdGhzW2VdJiYoaT1zLmdsb2JhbHMucHJldmlvdXNQYXRoc1thXS5wYXRoc1tlXS5kKX1yZXR1cm4gaX19LHtrZXk6ImNhbGN1bGF0ZURhdGFMYWJlbHNQb3MiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQueCxpPXQueSxzPXQuaSxhPXQuaixuPXQucmVhbEluZGV4LHI9dC5zZXJpZXMsbz10LmJhckhlaWdodCxsPXQuYmFyV2lkdGgsaD10LnZpc2libGVTZXJpZXMsYz10LnJlbmRlcmVkUGF0aCxkPXRoaXMudyx1PW5ldyBwKHRoaXMuY3R4KSxnPUFycmF5LmlzQXJyYXkodGhpcy5zdHJva2VXaWR0aCk/dGhpcy5zdHJva2VXaWR0aFtuXTp0aGlzLnN0cm9rZVdpZHRoLGY9ZStwYXJzZUZsb2F0KGwqaCkseD1pK3BhcnNlRmxvYXQobypoKTtkLmdsb2JhbHMuaXNYTnVtZXJpYyYmIWQuZ2xvYmFscy5pc0Jhckhvcml6b250YWwmJihmPWUrcGFyc2VGbG9hdChsKihoKzEpKSx4PWkrcGFyc2VGbG9hdChvKihoKzEpKS1nKTt2YXIgYj1lLG09aSx2PXt9LHk9ZC5jb25maWcuZGF0YUxhYmVscyx3PXRoaXMuYmFyT3B0aW9ucy5kYXRhTGFiZWxzLGs9eS5vZmZzZXRYLEE9eS5vZmZzZXRZLFM9e3dpZHRoOjAsaGVpZ2h0OjB9O3JldHVybiBkLmNvbmZpZy5kYXRhTGFiZWxzLmVuYWJsZWQmJihTPXUuZ2V0VGV4dFJlY3RzKGQuZ2xvYmFscy55TGFiZWxGb3JtYXR0ZXJzWzBdKGQuZ2xvYmFscy5tYXhZKSxwYXJzZUludCh5LnN0eWxlLmZvbnRTaXplKSkpLHY9dGhpcy5pc0hvcml6b250YWw/dGhpcy5jYWxjdWxhdGVCYXJzRGF0YUxhYmVsc1Bvc2l0aW9uKHt4OmUseTppLGk6cyxqOmEscmVuZGVyZWRQYXRoOmMsYmN5OngsYmFySGVpZ2h0Om8sYmFyV2lkdGg6bCx0ZXh0UmVjdHM6UyxzdHJva2VXaWR0aDpnLGRhdGFMYWJlbHNYOmIsZGF0YUxhYmVsc1k6bSxiYXJEYXRhTGFiZWxzQ29uZmlnOncsb2ZmWDprLG9mZlk6QX0pOnRoaXMuY2FsY3VsYXRlQ29sdW1uc0RhdGFMYWJlbHNQb3NpdGlvbih7eDplLHk6aSxpOnMsajphLHJlbmRlcmVkUGF0aDpjLHJlYWxJbmRleDpuLGJjeDpmLGJjeTp4LGJhckhlaWdodDpvLGJhcldpZHRoOmwsdGV4dFJlY3RzOlMsc3Ryb2tlV2lkdGg6ZyxkYXRhTGFiZWxzWTptLGJhckRhdGFMYWJlbHNDb25maWc6dyxvZmZYOmssb2ZmWTpBfSksYy5hdHRyKHtjeTp2LmJjeSxjeDp2LmJjeCxqOmEsdmFsOnJbc11bYV0sYmFySGVpZ2h0Om8sYmFyV2lkdGg6bH0pLHRoaXMuZHJhd0NhbGN1bGF0ZWREYXRhTGFiZWxzKHt4OnYuZGF0YUxhYmVsc1gseTp2LmRhdGFMYWJlbHNZLHZhbDpyW3NdW2FdLGk6bixqOmEsYmFyV2lkdGg6bCxiYXJIZWlnaHQ6byx0ZXh0UmVjdHM6UyxkYXRhTGFiZWxzQ29uZmlnOnl9KX19LHtrZXk6ImNhbGN1bGF0ZUNvbHVtbnNEYXRhTGFiZWxzUG9zaXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcy53LHM9dC5pLGE9dC5qLG49dC55LHI9dC5iY3gsbz10LmJhcldpZHRoLGw9dC5iYXJIZWlnaHQsaD10LnRleHRSZWN0cyxjPXQuZGF0YUxhYmVsc1ksZD10LmJhckRhdGFMYWJlbHNDb25maWcsdT10LnN0cm9rZVdpZHRoLGc9dC5vZmZYLGY9dC5vZmZZLHA9aS5nbG9iYWxzLmdyaWRXaWR0aC9pLmdsb2JhbHMuZGF0YVBvaW50cztyLT11LzIsZT1pLmdsb2JhbHMuaXNYTnVtZXJpYz9yLW8vMitnOnItcCtvLzIrZzt2YXIgeD10aGlzLnNlcmllc1tzXVthXTw9MDtzd2l0Y2godGhpcy5pc1JldmVyc2VkJiYobi09bCksZC5wb3NpdGlvbil7Y2FzZSJjZW50ZXIiOmM9eD9uK2wvMitoLmhlaWdodC8yK2Y6bitsLzIraC5oZWlnaHQvMi1mO2JyZWFrO2Nhc2UiYm90dG9tIjpjPXg/bitsK2guaGVpZ2h0K3UrZjpuK2wtaC5oZWlnaHQvMit1LWY7YnJlYWs7Y2FzZSJ0b3AiOmM9eD9uLWguaGVpZ2h0LzItZjpuK2guaGVpZ2h0K2Z9cmV0dXJuIGkuY29uZmlnLmNoYXJ0LnN0YWNrZWR8fChjPDA/Yz0wK3U6YytoLmhlaWdodC8zPmkuZ2xvYmFscy5ncmlkSGVpZ2h0JiYoYz1pLmdsb2JhbHMuZ3JpZEhlaWdodC11KSkse2JjeDpyLGJjeTpuLGRhdGFMYWJlbHNYOmUsZGF0YUxhYmVsc1k6Y319fSx7a2V5OiJjYWxjdWxhdGVCYXJzRGF0YUxhYmVsc1Bvc2l0aW9uIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLncsaT10Lngscz10LmksYT10Lmosbj10LmJjeSxyPXQuYmFySGVpZ2h0LG89dC5iYXJXaWR0aCxsPXQudGV4dFJlY3RzLGg9dC5kYXRhTGFiZWxzWCxjPXQuc3Ryb2tlV2lkdGgsZD10LmJhckRhdGFMYWJlbHNDb25maWcsdT10Lm9mZlgsZz10Lm9mZlksZj1uLWUuZ2xvYmFscy5ncmlkSGVpZ2h0L2UuZ2xvYmFscy5kYXRhUG9pbnRzK3IvMitsLmhlaWdodC8yK2ctMyxwPXRoaXMuc2VyaWVzW3NdW2FdPD0wO3N3aXRjaCh0aGlzLmlzUmV2ZXJzZWQmJihpKz1vKSxkLnBvc2l0aW9uKXtjYXNlImNlbnRlciI6aD1wP2ktby8yLXU6aS1vLzIrdTticmVhaztjYXNlImJvdHRvbSI6aD1wP2ktby1jLU1hdGgucm91bmQobC53aWR0aC8yKS11OmktbytjK01hdGgucm91bmQobC53aWR0aC8yKSt1O2JyZWFrO2Nhc2UidG9wIjpoPXA/aS1jK01hdGgucm91bmQobC53aWR0aC8yKS11OmktYy1NYXRoLnJvdW5kKGwud2lkdGgvMikrdX1yZXR1cm4gZS5jb25maWcuY2hhcnQuc3RhY2tlZHx8KGg8MD9oPWgrbC53aWR0aCtjOmgrbC53aWR0aC8yPmUuZ2xvYmFscy5ncmlkV2lkdGgmJihoPWUuZ2xvYmFscy5ncmlkV2lkdGgtbC53aWR0aC1jKSkse2JjeDppLGJjeTpuLGRhdGFMYWJlbHNYOmgsZGF0YUxhYmVsc1k6Zn19fSx7a2V5OiJkcmF3Q2FsY3VsYXRlZERhdGFMYWJlbHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQueCxpPXQueSxzPXQudmFsLGE9dC5pLG49dC5qLG89dC50ZXh0UmVjdHMsbD10LmJhckhlaWdodCxoPXQuYmFyV2lkdGgsYz10LmRhdGFMYWJlbHNDb25maWcsZD10aGlzLncsdT1uZXcgeih0aGlzLmN0eCksZz1uZXcgcCh0aGlzLmN0eCksZj1jLmZvcm1hdHRlcix4PW51bGwsYj1kLmdsb2JhbHMuY29sbGFwc2VkU2VyaWVzSW5kaWNlcy5pbmRleE9mKGEpPi0xO2lmKGMuZW5hYmxlZCYmIWIpe3g9Zy5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMtZGF0YS1sYWJlbHMifSk7dmFyIG09IiI7dm9pZCAwIT09cyYmKG09ZihzLHtzZXJpZXNJbmRleDphLGRhdGFQb2ludEluZGV4Om4sdzpkfSkpLDA9PT1zJiZkLmNvbmZpZy5jaGFydC5zdGFja2VkJiYobT0iIiksZC5jb25maWcuY2hhcnQuc3RhY2tlZCYmdGhpcy5iYXJPcHRpb25zLmRhdGFMYWJlbHMuaGlkZU92ZXJmbG93aW5nTGFiZWxzJiYodGhpcy5pc0hvcml6b250YWw/KChoPXRoaXMuc2VyaWVzW2FdW25dL3RoaXMueVJhdGlvW3RoaXMueWF4aXNJbmRleF0pPjAmJm8ud2lkdGgvMS42Pmh8fGg8MCYmby53aWR0aC8xLjY8aCkmJihtPSIiKToobD10aGlzLnNlcmllc1thXVtuXS90aGlzLnlSYXRpb1t0aGlzLnlheGlzSW5kZXhdLG8uaGVpZ2h0LzEuNj5sJiYobT0iIikpKTt2YXIgdj1yKHt9LGMpO3RoaXMuaXNIb3Jpem9udGFsJiZzPDAmJigic3RhcnQiPT09Yy50ZXh0QW5jaG9yP3YudGV4dEFuY2hvcj0iZW5kIjoiZW5kIj09PWMudGV4dEFuY2hvciYmKHYudGV4dEFuY2hvcj0ic3RhcnQiKSksdS5wbG90RGF0YUxhYmVsc1RleHQoe3g6ZSx5OmksdGV4dDptLGk6dGhpcy5iYXJPcHRpb25zLmRpc3RyaWJ1dGVkP246YSxqOm4scGFyZW50OngsZGF0YUxhYmVsc0NvbmZpZzp2LGFsd2F5c0RyYXdEYXRhTGFiZWw6ITAsb2Zmc2V0Q29ycmVjdGlvbjohMH0pfXJldHVybiB4fX0se2tleToiYmFyRW5kaW5nU2hhcGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLHMsYSl7dmFyIG49bmV3IHAodGhpcy5jdHgpO2lmKHRoaXMuaXNIb3Jpem9udGFsKXt2YXIgcj1udWxsLG89ZS54O2lmKHZvaWQgMCE9PWlbc11bYV18fG51bGwhPT1pW3NdW2FdKXt2YXIgbD1pW3NdW2FdPDAsaD1lLmJhckhlaWdodC8yLWUuc3Ryb2tlV2lkdGg7c3dpdGNoKGwmJihoPS1lLmJhckhlaWdodC8yLWUuc3Ryb2tlV2lkdGgpLHQuY29uZmlnLmNoYXJ0LnN0YWNrZWR8fCJyb3VuZGVkIj09PXRoaXMuYmFyT3B0aW9ucy5lbmRpbmdTaGFwZSYmKG89ZS54LWgvMiksdGhpcy5iYXJPcHRpb25zLmVuZGluZ1NoYXBlKXtjYXNlImZsYXQiOnI9bi5saW5lKG8sZS5iYXJZUG9zaXRpb24rZS5iYXJIZWlnaHQtZS5zdHJva2VXaWR0aCk7YnJlYWs7Y2FzZSJyb3VuZGVkIjpyPW4ucXVhZHJhdGljQ3VydmUobytoLGUuYmFyWVBvc2l0aW9uKyhlLmJhckhlaWdodC1lLnN0cm9rZVdpZHRoKS8yLG8sZS5iYXJZUG9zaXRpb24rZS5iYXJIZWlnaHQtZS5zdHJva2VXaWR0aCl9fXJldHVybntwYXRoOnIsZW5kaW5nX3BfZnJvbToiIixuZXdYOm99fXZhciBjPW51bGwsZD1lLnk7aWYodm9pZCAwIT09aVtzXVthXXx8bnVsbCE9PWlbc11bYV0pe3ZhciB1PWlbc11bYV08MCxnPWUuYmFyV2lkdGgvMi1lLnN0cm9rZVdpZHRoO3N3aXRjaCh1JiYoZz0tZS5iYXJXaWR0aC8yLWUuc3Ryb2tlV2lkdGgpLHQuY29uZmlnLmNoYXJ0LnN0YWNrZWR8fCJyb3VuZGVkIj09PXRoaXMuYmFyT3B0aW9ucy5lbmRpbmdTaGFwZSYmKGQrPWcvMiksdGhpcy5iYXJPcHRpb25zLmVuZGluZ1NoYXBlKXtjYXNlImZsYXQiOmM9bi5saW5lKGUuYmFyWFBvc2l0aW9uK2UuYmFyV2lkdGgtZS5zdHJva2VXaWR0aCxkKTticmVhaztjYXNlInJvdW5kZWQiOmM9bi5xdWFkcmF0aWNDdXJ2ZShlLmJhclhQb3NpdGlvbisoZS5iYXJXaWR0aC1lLnN0cm9rZVdpZHRoKS8yLGQtZyxlLmJhclhQb3NpdGlvbitlLmJhcldpZHRoLWUuc3Ryb2tlV2lkdGgsZCl9fXJldHVybntwYXRoOmMsZW5kaW5nX3BfZnJvbToiIixuZXdZOmR9fX1dKSx0fSgpLEU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gaSgpe3JldHVybiBlKHRoaXMsaSksYyh0aGlzLGwoaSkuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1yZXR1cm4gbyhpLE0pLHMoaSxbe2tleToiZHJhdyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnc7dGhpcy5ncmFwaGljcz1uZXcgcCh0aGlzLmN0eCksdGhpcy5maWxsPW5ldyBDKHRoaXMuY3R4KSx0aGlzLmJhcj1uZXcgTSh0aGlzLmN0eCx0aGlzLnh5UmF0aW9zKTt2YXIgcz1uZXcgdyh0aGlzLmN0eCxpKTt0PXMuZ2V0TG9nU2VyaWVzKHQpLHRoaXMueVJhdGlvPXMuZ2V0TG9nWVJhdGlvcyh0aGlzLnlSYXRpbyksdGhpcy5pbml0VmFyaWFibGVzKHQpLCIxMDAlIj09PWkuY29uZmlnLmNoYXJ0LnN0YWNrVHlwZSYmKHQ9aS5nbG9iYWxzLnNlcmllc1BlcmNlbnQuc2xpY2UoKSksdGhpcy5zZXJpZXM9dCx0aGlzLnRvdGFsSXRlbXM9MCx0aGlzLnByZXZZPVtdLHRoaXMucHJldlg9W10sdGhpcy5wcmV2WUY9W10sdGhpcy5wcmV2WEY9W10sdGhpcy5wcmV2WVZhbD1bXSx0aGlzLnByZXZYVmFsPVtdLHRoaXMueEFycmo9W10sdGhpcy54QXJyakY9W10sdGhpcy54QXJyalZhbD1bXSx0aGlzLnlBcnJqPVtdLHRoaXMueUFycmpGPVtdLHRoaXMueUFycmpWYWw9W107Zm9yKHZhciBhPTA7YTx0Lmxlbmd0aDthKyspdFthXS5sZW5ndGg+MCYmKHRoaXMudG90YWxJdGVtcys9dFthXS5sZW5ndGgpO2Zvcih2YXIgbj10aGlzLmdyYXBoaWNzLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy1iYXItc2VyaWVzIGFwZXhjaGFydHMtcGxvdC1zZXJpZXMifSkscj0wLG89MCxsPTAsaD0wO2w8dC5sZW5ndGg7bCsrLGgrKyl7dmFyIGM9dm9pZCAwLGQ9dm9pZCAwLGc9dm9pZCAwLGY9dm9pZCAwLHg9dm9pZCAwLGI9dm9pZCAwLG09W10sdj1bXSx5PWkuZ2xvYmFscy5jb21ib0NoYXJ0cz9lW2xdOmw7dGhpcy55UmF0aW8ubGVuZ3RoPjEmJih0aGlzLnlheGlzSW5kZXg9eSksdGhpcy5pc1JldmVyc2VkPWkuY29uZmlnLnlheGlzW3RoaXMueWF4aXNJbmRleF0mJmkuY29uZmlnLnlheGlzW3RoaXMueWF4aXNJbmRleF0ucmV2ZXJzZWQ7dmFyIGs9dGhpcy5ncmFwaGljcy5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMtc2VyaWVzIixzZXJpZXNOYW1lOnUuZXNjYXBlU3RyaW5nKGkuZ2xvYmFscy5zZXJpZXNOYW1lc1t5XSkscmVsOmwrMSwiZGF0YTpyZWFsSW5kZXgiOnl9KSxBPXRoaXMuZ3JhcGhpY3MuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLWRhdGFsYWJlbHMifSksUz0wLEw9MCxQPTAsej10aGlzLmluaXRpYWxQb3NpdGlvbnMocixvLGcsZix4LGIpO289ei55LEw9ei5iYXJIZWlnaHQsZj16LnlEaXZpc2lvbixiPXouemVyb1cscj16LngsUD16LmJhcldpZHRoLGc9ei54RGl2aXNpb24seD16Lnplcm9ILHRoaXMueUFycmo9W10sdGhpcy55QXJyakY9W10sdGhpcy55QXJyalZhbD1bXSx0aGlzLnhBcnJqPVtdLHRoaXMueEFycmpGPVtdLHRoaXMueEFycmpWYWw9W107Zm9yKHZhciBFPTA7RTxpLmdsb2JhbHMuZGF0YVBvaW50cztFKyspe2kuY29uZmlnLnN0cm9rZS5zaG93JiYoUz10aGlzLmlzTnVsbFZhbHVlPzA6QXJyYXkuaXNBcnJheSh0aGlzLnN0cm9rZVdpZHRoKT90aGlzLnN0cm9rZVdpZHRoW3ldOnRoaXMuc3Ryb2tlV2lkdGgpO3ZhciBUPW51bGw7dGhpcy5pc0hvcml6b250YWw/KFQ9dGhpcy5kcmF3QmFyUGF0aHMoe2luZGV4ZXM6e2k6bCxqOkUscmVhbEluZGV4OnksYmM6aH0sYmFySGVpZ2h0Okwsc3Ryb2tlV2lkdGg6UyxwYXRoVG86YyxwYXRoRnJvbTpkLHplcm9XOmIseDpyLHk6byx5RGl2aXNpb246ZixlbFNlcmllczprfSksUD10aGlzLnNlcmllc1tsXVtFXS90aGlzLmludmVydGVkWVJhdGlvKTooVD10aGlzLmRyYXdDb2x1bW5QYXRocyh7aW5kZXhlczp7aTpsLGo6RSxyZWFsSW5kZXg6eSxiYzpofSx4OnIseTpvLHhEaXZpc2lvbjpnLHBhdGhUbzpjLHBhdGhGcm9tOmQsYmFyV2lkdGg6UCx6ZXJvSDp4LHN0cm9rZVdpZHRoOlMsZWxTZXJpZXM6a30pLEw9dGhpcy5zZXJpZXNbbF1bRV0vdGhpcy55UmF0aW9bdGhpcy55YXhpc0luZGV4XSksYz1ULnBhdGhUbyxkPVQucGF0aEZyb20sbz1ULnkscj1ULngsbS5wdXNoKHIpLHYucHVzaChvKTt2YXIgWD10aGlzLmJhci5nZXRQYXRoRmlsbENvbG9yKHQsbCxFLHkpO2s9dGhpcy5yZW5kZXJTZXJpZXMoe3JlYWxJbmRleDp5LHBhdGhGaWxsOlgsajpFLGk6bCxwYXRoRnJvbTpkLHBhdGhUbzpjLHN0cm9rZVdpZHRoOlMsZWxTZXJpZXM6ayx4OnIseTpvLHNlcmllczp0LGJhckhlaWdodDpMLGJhcldpZHRoOlAsZWxEYXRhTGFiZWxzV3JhcDpBLHR5cGU6ImJhciIsdmlzaWJsZVNlcmllczowfSl9aS5nbG9iYWxzLnNlcmllc1h2YWx1ZXNbeV09bSxpLmdsb2JhbHMuc2VyaWVzWXZhbHVlc1t5XT12LHRoaXMucHJldlkucHVzaCh0aGlzLnlBcnJqKSx0aGlzLnByZXZZRi5wdXNoKHRoaXMueUFycmpGKSx0aGlzLnByZXZZVmFsLnB1c2godGhpcy55QXJyalZhbCksdGhpcy5wcmV2WC5wdXNoKHRoaXMueEFycmopLHRoaXMucHJldlhGLnB1c2godGhpcy54QXJyakYpLHRoaXMucHJldlhWYWwucHVzaCh0aGlzLnhBcnJqVmFsKSxuLmFkZChrKX1yZXR1cm4gbn19LHtrZXk6ImluaXRpYWxQb3NpdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLHMsYSxuKXt2YXIgcixvLGw9dGhpcy53O3JldHVybiB0aGlzLmlzSG9yaXpvbnRhbD8ocj0ocj1zPWwuZ2xvYmFscy5ncmlkSGVpZ2h0L2wuZ2xvYmFscy5kYXRhUG9pbnRzKSpwYXJzZUludChsLmNvbmZpZy5wbG90T3B0aW9ucy5iYXIuYmFySGVpZ2h0KS8xMDAsbj10aGlzLmJhc2VMaW5lSW52ZXJ0ZWRZK2wuZ2xvYmFscy5wYWRIb3Jpem9udGFsKyh0aGlzLmlzUmV2ZXJzZWQ/bC5nbG9iYWxzLmdyaWRXaWR0aDowKS0odGhpcy5pc1JldmVyc2VkPzIqdGhpcy5iYXNlTGluZUludmVydGVkWTowKSxlPShzLXIpLzIpOihvPWk9bC5nbG9iYWxzLmdyaWRXaWR0aC9sLmdsb2JhbHMuZGF0YVBvaW50cyxvPWwuZ2xvYmFscy5pc1hOdW1lcmljPyhpPWwuZ2xvYmFscy5taW5YRGlmZi90aGlzLnhSYXRpbykqcGFyc2VJbnQodGhpcy5iYXJPcHRpb25zLmNvbHVtbldpZHRoKS8xMDA6bypwYXJzZUludChsLmNvbmZpZy5wbG90T3B0aW9ucy5iYXIuY29sdW1uV2lkdGgpLzEwMCxhPXRoaXMuYmFzZUxpbmVZW3RoaXMueWF4aXNJbmRleF0rKHRoaXMuaXNSZXZlcnNlZD9sLmdsb2JhbHMuZ3JpZEhlaWdodDowKS0odGhpcy5pc1JldmVyc2VkPzIqdGhpcy5iYXNlTGluZVlbdGhpcy55YXhpc0luZGV4XTowKSx0PWwuZ2xvYmFscy5wYWRIb3Jpem9udGFsKyhpLW8pLzIpLHt4OnQseTplLHlEaXZpc2lvbjpzLHhEaXZpc2lvbjppLGJhckhlaWdodDpyLGJhcldpZHRoOm8semVyb0g6YSx6ZXJvVzpufX19LHtrZXk6ImRyYXdCYXJQYXRocyIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9dC5pbmRleGVzLHM9dC5iYXJIZWlnaHQsYT10LnN0cm9rZVdpZHRoLG49dC5wYXRoVG8scj10LnBhdGhGcm9tLG89dC56ZXJvVyxsPXQueCxoPXQueSxjPXQueURpdmlzaW9uLGQ9dC5lbFNlcmllcyx1PXRoaXMudyxnPWgsZj1pLmkscD1pLmoseD1pLnJlYWxJbmRleCxiPWkuYmMsbT0wLHY9MDt2PHRoaXMucHJldlhGLmxlbmd0aDt2KyspbSs9dGhpcy5wcmV2WEZbdl1bcF07aWYoZj4wKXt2YXIgeT1vO3RoaXMucHJldlhWYWxbZi0xXVtwXTwwP3k9dGhpcy5zZXJpZXNbZl1bcF0+PTA/dGhpcy5wcmV2WFtmLTFdW3BdK20tMioodGhpcy5pc1JldmVyc2VkP206MCk6dGhpcy5wcmV2WFtmLTFdW3BdOnRoaXMucHJldlhWYWxbZi0xXVtwXT49MCYmKHk9dGhpcy5zZXJpZXNbZl1bcF0+PTA/dGhpcy5wcmV2WFtmLTFdW3BdOnRoaXMucHJldlhbZi0xXVtwXS1tKzIqKHRoaXMuaXNSZXZlcnNlZD9tOjApKSxlPXl9ZWxzZSBlPW87bD1udWxsPT09dGhpcy5zZXJpZXNbZl1bcF0/ZTplK3RoaXMuc2VyaWVzW2ZdW3BdL3RoaXMuaW52ZXJ0ZWRZUmF0aW8tMioodGhpcy5pc1JldmVyc2VkP3RoaXMuc2VyaWVzW2ZdW3BdL3RoaXMuaW52ZXJ0ZWRZUmF0aW86MCk7dmFyIHc9e2JhckhlaWdodDpzLHN0cm9rZVdpZHRoOmEsaW52ZXJ0ZWRZUmF0aW86dGhpcy5pbnZlcnRlZFlSYXRpbyxiYXJZUG9zaXRpb246Zyx4Omx9LGs9dGhpcy5iYXIuYmFyRW5kaW5nU2hhcGUodSx3LHRoaXMuc2VyaWVzLGYscCk7aWYodGhpcy5zZXJpZXMubGVuZ3RoPjEmJmYhPT10aGlzLmVuZGluZ1NoYXBlT25TZXJpZXNOdW1iZXImJihrLnBhdGg9dGhpcy5ncmFwaGljcy5saW5lKGsubmV3WCxnK3MtYSkpLHRoaXMueEFycmoucHVzaChrLm5ld1gpLHRoaXMueEFycmpGLnB1c2goTWF0aC5hYnMoZS1rLm5ld1gpKSx0aGlzLnhBcnJqVmFsLnB1c2godGhpcy5zZXJpZXNbZl1bcF0pLG49dGhpcy5ncmFwaGljcy5tb3ZlKGUsZykscj10aGlzLmdyYXBoaWNzLm1vdmUoZSxnKSx1Lmdsb2JhbHMucHJldmlvdXNQYXRocy5sZW5ndGg+MCYmKHI9dGhpcy5iYXIuZ2V0UGF0aEZyb20oeCxwLCExKSksbj1uK3RoaXMuZ3JhcGhpY3MubGluZShrLm5ld1gsZykray5wYXRoK3RoaXMuZ3JhcGhpY3MubGluZShlLGcrcy1hKSt0aGlzLmdyYXBoaWNzLmxpbmUoZSxnKSxyPXIrdGhpcy5ncmFwaGljcy5saW5lKGUsZykrdGhpcy5ncmFwaGljcy5saW5lKGUsZytzLWEpK3RoaXMuZ3JhcGhpY3MubGluZShlLGcrcy1hKSt0aGlzLmdyYXBoaWNzLmxpbmUoZSxnK3MtYSkrdGhpcy5ncmFwaGljcy5saW5lKGUsZyksdS5jb25maWcucGxvdE9wdGlvbnMuYmFyLmNvbG9ycy5iYWNrZ3JvdW5kQmFyQ29sb3JzLmxlbmd0aD4wJiYwPT09Zil7Yj49dS5jb25maWcucGxvdE9wdGlvbnMuYmFyLmNvbG9ycy5iYWNrZ3JvdW5kQmFyQ29sb3JzLmxlbmd0aCYmKGI9MCk7dmFyIEE9dS5jb25maWcucGxvdE9wdGlvbnMuYmFyLmNvbG9ycy5iYWNrZ3JvdW5kQmFyQ29sb3JzW2JdLFM9dGhpcy5ncmFwaGljcy5kcmF3UmVjdCgwLGcsdS5nbG9iYWxzLmdyaWRXaWR0aCxzLDAsQSx1LmNvbmZpZy5wbG90T3B0aW9ucy5iYXIuY29sb3JzLmJhY2tncm91bmRCYXJPcGFjaXR5KTtkLmFkZChTKSxTLm5vZGUuY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy1iYWNrZ3JvdW5kQmFyIil9cmV0dXJue3BhdGhUbzpuLHBhdGhGcm9tOnIseDpsLHk6aCs9Y319fSx7a2V5OiJkcmF3Q29sdW1uUGF0aHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhlcyxpPXQueCxzPXQueSxhPXQueERpdmlzaW9uLG49dC5wYXRoVG8scj10LnBhdGhGcm9tLG89dC5iYXJXaWR0aCxsPXQuemVyb0gsaD10LnN0cm9rZVdpZHRoLGM9dC5lbFNlcmllcyxkPXRoaXMudyx1PWUuaSxnPWUuaixmPWUucmVhbEluZGV4LHA9ZS5iYztpZihkLmdsb2JhbHMuaXNYTnVtZXJpYyl7dmFyIHg9ZC5nbG9iYWxzLnNlcmllc1hbdV1bZ107eHx8KHg9MCksaT0oeC1kLmdsb2JhbHMubWluWCkvdGhpcy54UmF0aW8tby8yfWZvcih2YXIgYixtPWksdj0wLHk9MDt5PHRoaXMucHJldllGLmxlbmd0aDt5Kyspdis9dGhpcy5wcmV2WUZbeV1bZ107aWYodT4wJiYhZC5nbG9iYWxzLmlzWE51bWVyaWN8fHU+MCYmZC5nbG9iYWxzLmlzWE51bWVyaWMmJmQuZ2xvYmFscy5zZXJpZXNYW3UtMV1bZ109PT1kLmdsb2JhbHMuc2VyaWVzWFt1XVtnXSl7dmFyIHc9dGhpcy5wcmV2WVt1LTFdW2ddO2I9dGhpcy5wcmV2WVZhbFt1LTFdW2ddPDA/dGhpcy5zZXJpZXNbdV1bZ10+PTA/dy12KzIqKHRoaXMuaXNSZXZlcnNlZD92OjApOnc6dGhpcy5zZXJpZXNbdV1bZ10+PTA/dzp3K3YtMioodGhpcy5pc1JldmVyc2VkP3Y6MCl9ZWxzZSBiPWQuZ2xvYmFscy5ncmlkSGVpZ2h0LWw7cz1iLXRoaXMuc2VyaWVzW3VdW2ddL3RoaXMueVJhdGlvW3RoaXMueWF4aXNJbmRleF0rMioodGhpcy5pc1JldmVyc2VkP3RoaXMuc2VyaWVzW3VdW2ddL3RoaXMueVJhdGlvW3RoaXMueWF4aXNJbmRleF06MCk7dmFyIGs9e2JhcldpZHRoOm8sc3Ryb2tlV2lkdGg6aCx5UmF0aW86dGhpcy55UmF0aW9bdGhpcy55YXhpc0luZGV4XSxiYXJYUG9zaXRpb246bSx5OnN9LEE9dGhpcy5iYXIuYmFyRW5kaW5nU2hhcGUoZCxrLHRoaXMuc2VyaWVzLHUsZyk7aWYodGhpcy55QXJyai5wdXNoKEEubmV3WSksdGhpcy55QXJyakYucHVzaChNYXRoLmFicyhiLUEubmV3WSkpLHRoaXMueUFycmpWYWwucHVzaCh0aGlzLnNlcmllc1t1XVtnXSksbj10aGlzLmdyYXBoaWNzLm1vdmUobSxiKSxyPXRoaXMuZ3JhcGhpY3MubW92ZShtLGIpLGQuZ2xvYmFscy5wcmV2aW91c1BhdGhzLmxlbmd0aD4wJiYocj10aGlzLmJhci5nZXRQYXRoRnJvbShmLGcsITEpKSxuPW4rdGhpcy5ncmFwaGljcy5saW5lKG0sQS5uZXdZKStBLnBhdGgrdGhpcy5ncmFwaGljcy5saW5lKG0rby1oLGIpK3RoaXMuZ3JhcGhpY3MubGluZShtLWgvMixiKSxyPXIrdGhpcy5ncmFwaGljcy5saW5lKG0sYikrdGhpcy5ncmFwaGljcy5saW5lKG0rby1oLGIpK3RoaXMuZ3JhcGhpY3MubGluZShtK28taCxiKSt0aGlzLmdyYXBoaWNzLmxpbmUobStvLWgsYikrdGhpcy5ncmFwaGljcy5saW5lKG0taC8yLGIpLGQuY29uZmlnLnBsb3RPcHRpb25zLmJhci5jb2xvcnMuYmFja2dyb3VuZEJhckNvbG9ycy5sZW5ndGg+MCYmMD09PXUpe3A+PWQuY29uZmlnLnBsb3RPcHRpb25zLmJhci5jb2xvcnMuYmFja2dyb3VuZEJhckNvbG9ycy5sZW5ndGgmJihwPTApO3ZhciBTPWQuY29uZmlnLnBsb3RPcHRpb25zLmJhci5jb2xvcnMuYmFja2dyb3VuZEJhckNvbG9yc1twXSxDPXRoaXMuZ3JhcGhpY3MuZHJhd1JlY3QobSwwLG8sZC5nbG9iYWxzLmdyaWRIZWlnaHQsMCxTLGQuY29uZmlnLnBsb3RPcHRpb25zLmJhci5jb2xvcnMuYmFja2dyb3VuZEJhck9wYWNpdHkpO2MuYWRkKEMpLEMubm9kZS5jbGFzc0xpc3QuYWRkKCJhcGV4Y2hhcnRzLWJhY2tncm91bmRCYXIiKX1yZXR1cm4gaSs9YSx7cGF0aFRvOm4scGF0aEZyb206cix4OmQuZ2xvYmFscy5pc1hOdW1lcmljP2ktYTppLHk6c319fSx7a2V5OiJjaGVja1plcm9TZXJpZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LnNlcmllcyxpPXRoaXMudyxzPTA7czxlLmxlbmd0aDtzKyspe2Zvcih2YXIgYT0wLG49MDtuPGVbaS5nbG9iYWxzLm1heFZhbHNJbkFycmF5SW5kZXhdLmxlbmd0aDtuKyspYSs9ZVtzXVtuXTswPT09YSYmdGhpcy56ZXJvU2VyaWVzZXMucHVzaChzKX1mb3IodmFyIHI9ZS5sZW5ndGgtMTtyPj0wO3ItLSl0aGlzLnplcm9TZXJpZXNlcy5pbmRleE9mKHIpPi0xJiZyPT09dGhpcy5lbmRpbmdTaGFwZU9uU2VyaWVzTnVtYmVyJiYodGhpcy5lbmRpbmdTaGFwZU9uU2VyaWVzTnVtYmVyLT0xKX19XSksaX0oKSxUPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGkoKXtyZXR1cm4gZSh0aGlzLGkpLGModGhpcyxsKGkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9cmV0dXJuIG8oaSxNKSxzKGksW3trZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53LHM9bmV3IHAodGhpcy5jdHgpLGE9bmV3IEModGhpcy5jdHgpO3RoaXMuY2FuZGxlc3RpY2tPcHRpb25zPXRoaXMudy5jb25maWcucGxvdE9wdGlvbnMuY2FuZGxlc3RpY2s7dmFyIG49bmV3IHcodGhpcy5jdHgsaSk7dD1uLmdldExvZ1Nlcmllcyh0KSx0aGlzLnNlcmllcz10LHRoaXMueVJhdGlvPW4uZ2V0TG9nWVJhdGlvcyh0aGlzLnlSYXRpbyksdGhpcy5pbml0VmFyaWFibGVzKHQpO2Zvcih2YXIgcj1zLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy1jYW5kbGVzdGljay1zZXJpZXMgYXBleGNoYXJ0cy1wbG90LXNlcmllcyJ9KSxvPTAsbD0wO288dC5sZW5ndGg7bysrLGwrKyl7dmFyIGgsYyxkPXZvaWQgMCxnPXZvaWQgMCxmPXZvaWQgMCx4PXZvaWQgMCxiPVtdLG09W10sdj1pLmdsb2JhbHMuY29tYm9DaGFydHM/ZVtvXTpvLHk9cy5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMtc2VyaWVzIixzZXJpZXNOYW1lOnUuZXNjYXBlU3RyaW5nKGkuZ2xvYmFscy5zZXJpZXNOYW1lc1t2XSkscmVsOm8rMSwiZGF0YTpyZWFsSW5kZXgiOnZ9KTt0W29dLmxlbmd0aD4wJiYodGhpcy52aXNpYmxlST10aGlzLnZpc2libGVJKzEpO3ZhciBrLEEsUz0wO3RoaXMueVJhdGlvLmxlbmd0aD4xJiYodGhpcy55YXhpc0luZGV4PXYpO3ZhciBMPXRoaXMuaW5pdGlhbFBvc2l0aW9ucygpO3g9TC55LGs9TC5iYXJIZWlnaHQsZj1MLngsQT1MLmJhcldpZHRoLGg9TC54RGl2aXNpb24sYz1MLnplcm9ILG0ucHVzaChmK0EvMik7Zm9yKHZhciBQPXMuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLWRhdGFsYWJlbHMifSksej0wLE09aS5nbG9iYWxzLmRhdGFQb2ludHM7ejxpLmdsb2JhbHMuZGF0YVBvaW50czt6KyssTS0tKXt2b2lkIDA9PT10aGlzLnNlcmllc1tvXVt6XXx8bnVsbD09PXRbb11bel0/dGhpcy5pc051bGxWYWx1ZT0hMDp0aGlzLmlzTnVsbFZhbHVlPSExLGkuY29uZmlnLnN0cm9rZS5zaG93JiYoUz10aGlzLmlzTnVsbFZhbHVlPzA6QXJyYXkuaXNBcnJheSh0aGlzLnN0cm9rZVdpZHRoKT90aGlzLnN0cm9rZVdpZHRoW3ZdOnRoaXMuc3Ryb2tlV2lkdGgpO3ZhciBFLFQ9dGhpcy5kcmF3Q2FuZGxlU3RpY2tQYXRocyh7aW5kZXhlczp7aTpvLGo6eixyZWFsSW5kZXg6dixiYzpsfSx4OmYseTp4LHhEaXZpc2lvbjpoLHBhdGhUbzpkLHBhdGhGcm9tOmcsYmFyV2lkdGg6QSx6ZXJvSDpjLHN0cm9rZVdpZHRoOlMsZWxTZXJpZXM6eX0pO2Q9VC5wYXRoVG8sZz1ULnBhdGhGcm9tLHg9VC55LGY9VC54LEU9VC5jb2xvcix6PjAmJm0ucHVzaChmK0EvMiksYi5wdXNoKHgpO3ZhciBYPWEuZmlsbFBhdGgoe3Nlcmllc051bWJlcjp2LGNvbG9yOkUsdmFsdWU6dFtvXVt6XX0pLEk9dGhpcy5jYW5kbGVzdGlja09wdGlvbnMud2ljay51c2VGaWxsQ29sb3I/RTp2b2lkIDA7eT10aGlzLnJlbmRlclNlcmllcyh7cmVhbEluZGV4OnYscGF0aEZpbGw6WCxsaW5lRmlsbDpJLGo6eixpOm8scGF0aEZyb206ZyxwYXRoVG86ZCxzdHJva2VXaWR0aDpTLGVsU2VyaWVzOnkseDpmLHk6eCxzZXJpZXM6dCxiYXJIZWlnaHQ6ayxiYXJXaWR0aDpBLGVsRGF0YUxhYmVsc1dyYXA6UCx2aXNpYmxlU2VyaWVzOnRoaXMudmlzaWJsZUksdHlwZToiY2FuZGxlc3RpY2sifSl9aS5nbG9iYWxzLnNlcmllc1h2YWx1ZXNbdl09bSxpLmdsb2JhbHMuc2VyaWVzWXZhbHVlc1t2XT1iLHIuYWRkKHkpfXJldHVybiByfX0se2tleToiZHJhd0NhbmRsZVN0aWNrUGF0aHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhlcyxpPXQueCxzPSh0LnksdC54RGl2aXNpb24pLGE9dC5wYXRoVG8sbj10LnBhdGhGcm9tLHI9dC5iYXJXaWR0aCxvPXQuemVyb0gsbD10LnN0cm9rZVdpZHRoLGg9dGhpcy53LGM9bmV3IHAodGhpcy5jdHgpLGQ9ZS5pLHU9ZS5qLGc9ITAsZj1oLmNvbmZpZy5wbG90T3B0aW9ucy5jYW5kbGVzdGljay5jb2xvcnMudXB3YXJkLHg9aC5jb25maWcucGxvdE9wdGlvbnMuY2FuZGxlc3RpY2suY29sb3JzLmRvd253YXJkLGI9dGhpcy55UmF0aW9bdGhpcy55YXhpc0luZGV4XSxtPWUucmVhbEluZGV4LHY9dGhpcy5nZXRPSExDVmFsdWUobSx1KSx5PW8sdz1vO3Yubz52LmMmJihnPSExKTt2YXIgaz1NYXRoLm1pbih2Lm8sdi5jKSxBPU1hdGgubWF4KHYubyx2LmMpO2guZ2xvYmFscy5pc1hOdW1lcmljJiYoaT0oaC5nbG9iYWxzLnNlcmllc1hbZF1bdV0taC5nbG9iYWxzLm1pblgpL3RoaXMueFJhdGlvLXIvMik7dmFyIFM9aStyKnRoaXMudmlzaWJsZUk7cmV0dXJuIHZvaWQgMD09PXRoaXMuc2VyaWVzW2RdW3VdfHxudWxsPT09dGhpcy5zZXJpZXNbZF1bdV0/az1vOihrPW8tay9iLEE9by1BL2IseT1vLXYuaC9iLHc9by12LmwvYiksYy5tb3ZlKFMsbyksbj1jLm1vdmUoUyxrKSxoLmdsb2JhbHMucHJldmlvdXNQYXRocy5sZW5ndGg+MCYmKG49dGhpcy5nZXRQYXRoRnJvbShtLHUsITApKSxhPWMubW92ZShTLEEpK2MubGluZShTK3IvMixBKStjLmxpbmUoUytyLzIseSkrYy5saW5lKFMrci8yLEEpK2MubGluZShTK3IsQSkrYy5saW5lKFMrcixrKStjLmxpbmUoUytyLzIsaykrYy5saW5lKFMrci8yLHcpK2MubGluZShTK3IvMixrKStjLmxpbmUoUyxrKStjLmxpbmUoUyxBLWwvMiksbis9Yy5tb3ZlKFMsayksaC5nbG9iYWxzLmlzWE51bWVyaWN8fChpKz1zKSx7cGF0aFRvOmEscGF0aEZyb206bix4OmkseTpBLGJhclhQb3NpdGlvbjpTLGNvbG9yOmc/Zjp4fX19LHtrZXk6ImdldE9ITENWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnc7cmV0dXJue286aS5nbG9iYWxzLnNlcmllc0NhbmRsZU9bdF1bZV0saDppLmdsb2JhbHMuc2VyaWVzQ2FuZGxlSFt0XVtlXSxsOmkuZ2xvYmFscy5zZXJpZXNDYW5kbGVMW3RdW2VdLGM6aS5nbG9iYWxzLnNlcmllc0NhbmRsZUNbdF1bZV19fX1dKSxpfSgpLFg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGkpe2UodGhpcyx0KSx0aGlzLmN0eD1pLHRoaXMudz1pLnd9cmV0dXJuIHModCxbe2tleToiZHJhd1hDcm9zc2hhaXJzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudyxlPW5ldyBwKHRoaXMuY3R4KSxpPW5ldyBnKHRoaXMuY3R4KSxzPXQuY29uZmlnLnhheGlzLmNyb3NzaGFpcnMuZmlsbC5ncmFkaWVudCxhPXQuY29uZmlnLnhheGlzLmNyb3NzaGFpcnMuZHJvcFNoYWRvdyxuPXQuY29uZmlnLnhheGlzLmNyb3NzaGFpcnMuZmlsbC50eXBlLHI9cy5jb2xvckZyb20sbz1zLmNvbG9yVG8sbD1zLm9wYWNpdHlGcm9tLGg9cy5vcGFjaXR5VG8sYz1zLnN0b3BzLGQ9YS5lbmFibGVkLGY9YS5sZWZ0LHg9YS50b3AsYj1hLmJsdXIsbT1hLmNvbG9yLHY9YS5vcGFjaXR5LHk9dC5jb25maWcueGF4aXMuY3Jvc3NoYWlycy5maWxsLmNvbG9yO2lmKHQuY29uZmlnLnhheGlzLmNyb3NzaGFpcnMuc2hvdyl7ImdyYWRpZW50Ij09PW4mJih5PWUuZHJhd0dyYWRpZW50KCJ2ZXJ0aWNhbCIscixvLGwsaCxudWxsLGMsbnVsbCkpO3ZhciB3PWUuZHJhd1JlY3QoKTsxPT09dC5jb25maWcueGF4aXMuY3Jvc3NoYWlycy53aWR0aCYmKHc9ZS5kcmF3TGluZSgpKSx3LmF0dHIoe2NsYXNzOiJhcGV4Y2hhcnRzLXhjcm9zc2hhaXJzIix4OjAseTowLHkyOnQuZ2xvYmFscy5ncmlkSGVpZ2h0LHdpZHRoOnUuaXNOdW1iZXIodC5jb25maWcueGF4aXMuY3Jvc3NoYWlycy53aWR0aCk/dC5jb25maWcueGF4aXMuY3Jvc3NoYWlycy53aWR0aDowLGhlaWdodDp0Lmdsb2JhbHMuZ3JpZEhlaWdodCxmaWxsOnksZmlsdGVyOiJub25lIiwiZmlsbC1vcGFjaXR5Ijp0LmNvbmZpZy54YXhpcy5jcm9zc2hhaXJzLm9wYWNpdHksc3Ryb2tlOnQuY29uZmlnLnhheGlzLmNyb3NzaGFpcnMuc3Ryb2tlLmNvbG9yLCJzdHJva2Utd2lkdGgiOnQuY29uZmlnLnhheGlzLmNyb3NzaGFpcnMuc3Ryb2tlLndpZHRoLCJzdHJva2UtZGFzaGFycmF5Ijp0LmNvbmZpZy54YXhpcy5jcm9zc2hhaXJzLnN0cm9rZS5kYXNoQXJyYXl9KSxkJiYodz1pLmRyb3BTaGFkb3codyx7bGVmdDpmLHRvcDp4LGJsdXI6Yixjb2xvcjptLG9wYWNpdHk6dn0pKSx0Lmdsb2JhbHMuZG9tLmVsR3JhcGhpY2FsLmFkZCh3KX19fSx7a2V5OiJkcmF3WUNyb3NzaGFpcnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53LGU9bmV3IHAodGhpcy5jdHgpLGk9dC5jb25maWcueWF4aXNbMF0uY3Jvc3NoYWlycztpZih0LmNvbmZpZy55YXhpc1swXS5jcm9zc2hhaXJzLnNob3cpe3ZhciBzPWUuZHJhd0xpbmUoMCwwLHQuZ2xvYmFscy5ncmlkV2lkdGgsMCxpLnN0cm9rZS5jb2xvcixpLnN0cm9rZS5kYXNoQXJyYXksaS5zdHJva2Uud2lkdGgpO3MuYXR0cih7Y2xhc3M6ImFwZXhjaGFydHMteWNyb3NzaGFpcnMifSksdC5nbG9iYWxzLmRvbS5lbEdyYXBoaWNhbC5hZGQocyl9dmFyIGE9ZS5kcmF3TGluZSgwLDAsdC5nbG9iYWxzLmdyaWRXaWR0aCwwLGkuc3Ryb2tlLmNvbG9yLDAsMCk7YS5hdHRyKHtjbGFzczoiYXBleGNoYXJ0cy15Y3Jvc3NoYWlycy1oaWRkZW4ifSksdC5nbG9iYWxzLmRvbS5lbEdyYXBoaWNhbC5hZGQoYSl9fV0pLHR9KCksST1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaSxzKXtlKHRoaXMsdCksdGhpcy5jdHg9aSx0aGlzLnc9aS53LHRoaXMueFJhdGlvPXMueFJhdGlvLHRoaXMueVJhdGlvPXMueVJhdGlvLHRoaXMubmVnUmFuZ2U9ITEsdGhpcy5keW5hbWljQW5pbT10aGlzLncuY29uZmlnLmNoYXJ0LmFuaW1hdGlvbnMuZHluYW1pY0FuaW1hdGlvbix0aGlzLnJlY3RSYWRpdXM9dGhpcy53LmNvbmZpZy5wbG90T3B0aW9ucy5oZWF0bWFwLnJhZGl1cyx0aGlzLnN0cm9rZVdpZHRoPXRoaXMudy5jb25maWcuc3Ryb2tlLndpZHRofXJldHVybiBzKHQsW3trZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudyxpPW5ldyBwKHRoaXMuY3R4KSxzPWkuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLWhlYXRtYXAifSk7cy5hdHRyKCJjbGlwLXBhdGgiLCJ1cmwoI2dyaWRSZWN0TWFzayIuY29uY2F0KGUuZ2xvYmFscy5jdWlkLCIpIikpO3ZhciBhPWUuZ2xvYmFscy5ncmlkV2lkdGgvZS5nbG9iYWxzLmRhdGFQb2ludHMsbj1lLmdsb2JhbHMuZ3JpZEhlaWdodC9lLmdsb2JhbHMuc2VyaWVzLmxlbmd0aCxyPTAsbz0hMTt0aGlzLmNoZWNrQ29sb3JSYW5nZSgpO3ZhciBsPXQuc2xpY2UoKTtlLmNvbmZpZy55YXhpc1swXS5yZXZlcnNlZCYmKG89ITAsbC5yZXZlcnNlKCkpO2Zvcih2YXIgaD1vPzA6bC5sZW5ndGgtMTtvP2g8bC5sZW5ndGg6aD49MDtvP2grKzpoLS0pe3ZhciBjPWkuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLXNlcmllcyBhcGV4Y2hhcnRzLWhlYXRtYXAtc2VyaWVzIixzZXJpZXNOYW1lOnUuZXNjYXBlU3RyaW5nKGUuZ2xvYmFscy5zZXJpZXNOYW1lc1toXSkscmVsOmgrMSwiZGF0YTpyZWFsSW5kZXgiOmh9KTtpZihlLmNvbmZpZy5jaGFydC5kcm9wU2hhZG93LmVuYWJsZWQpe3ZhciBkPWUuY29uZmlnLmNoYXJ0LmRyb3BTaGFkb3c7bmV3IGcodGhpcy5jdHgpLmRyb3BTaGFkb3coYyxkLGgpfWZvcih2YXIgZj0wLHg9MDt4PGxbaF0ubGVuZ3RoO3grKyl7dmFyIGI9MSxtPXRoaXMuZGV0ZXJtaW5lSGVhdENvbG9yKGgseCk7aWYoZS5nbG9iYWxzLmhhc05lZ3N8fHRoaXMubmVnUmFuZ2Upe3ZhciB2PWUuY29uZmlnLnBsb3RPcHRpb25zLmhlYXRtYXAuc2hhZGVJbnRlbnNpdHk7Yj1lLmNvbmZpZy5wbG90T3B0aW9ucy5oZWF0bWFwLnJldmVyc2VOZWdhdGl2ZVNoYWRlP20ucGVyY2VudDwwP20ucGVyY2VudC8xMDAqKDEuMjUqdik6KDEtbS5wZXJjZW50LzEwMCkqKDEuMjUqdik6bS5wZXJjZW50PDA/MS0oMSttLnBlcmNlbnQvMTAwKSp2OigxLW0ucGVyY2VudC8xMDApKnZ9ZWxzZSBiPTEtbS5wZXJjZW50LzEwMDt2YXIgeT1tLmNvbG9yO2lmKGUuY29uZmlnLnBsb3RPcHRpb25zLmhlYXRtYXAuZW5hYmxlU2hhZGVzKXt2YXIgdz1uZXcgdTt5PXUuaGV4VG9SZ2JhKHcuc2hhZGVDb2xvcihiLG0uY29sb3IpLGUuY29uZmlnLmZpbGwub3BhY2l0eSl9dmFyIGs9dGhpcy5yZWN0UmFkaXVzLEE9aS5kcmF3UmVjdChmLHIsYSxuLGspO2lmKEEuYXR0cih7Y3g6ZixjeTpyfSksQS5ub2RlLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtaGVhdG1hcC1yZWN0IiksYy5hZGQoQSksQS5hdHRyKHtmaWxsOnksaTpoLGluZGV4Omgsajp4LHZhbDpsW2hdW3hdLCJzdHJva2Utd2lkdGgiOnRoaXMuc3Ryb2tlV2lkdGgsc3Ryb2tlOmUuZ2xvYmFscy5zdHJva2UuY29sb3JzWzBdLGNvbG9yOnl9KSxBLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsaS5wYXRoTW91c2VFbnRlci5iaW5kKHRoaXMsQSkpLEEubm9kZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixpLnBhdGhNb3VzZUxlYXZlLmJpbmQodGhpcyxBKSksQS5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsaS5wYXRoTW91c2VEb3duLmJpbmQodGhpcyxBKSksZS5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5lbmFibGVkJiYhZS5nbG9iYWxzLmRhdGFDaGFuZ2VkKXt2YXIgUz0xO2UuZ2xvYmFscy5yZXNpemVkfHwoUz1lLmNvbmZpZy5jaGFydC5hbmltYXRpb25zLnNwZWVkKSx0aGlzLmFuaW1hdGVIZWF0TWFwKEEsZixyLGEsbixTKX1pZihlLmdsb2JhbHMuZGF0YUNoYW5nZWQpe3ZhciBDPTE7aWYodGhpcy5keW5hbWljQW5pbS5lbmFibGVkJiZlLmdsb2JhbHMuc2hvdWxkQW5pbWF0ZSl7Qz10aGlzLmR5bmFtaWNBbmltLnNwZWVkO3ZhciBMPWUuZ2xvYmFscy5wcmV2aW91c1BhdGhzW2hdJiZlLmdsb2JhbHMucHJldmlvdXNQYXRoc1toXVt4XSYmZS5nbG9iYWxzLnByZXZpb3VzUGF0aHNbaF1beF0uY29sb3I7THx8KEw9InJnYmEoMjU1LCAyNTUsIDI1NSwgMCkiKSx0aGlzLmFuaW1hdGVIZWF0Q29sb3IoQSx1LmlzQ29sb3JIZXgoTCk/TDp1LnJnYjJoZXgoTCksdS5pc0NvbG9ySGV4KHkpP3k6dS5yZ2IyaGV4KHkpLEMpfX12YXIgUD10aGlzLmNhbGN1bGF0ZUhlYXRtYXBEYXRhTGFiZWxzKHt4OmYseTpyLGk6aCxqOngsc2VyaWVzOmwscmVjdEhlaWdodDpuLHJlY3RXaWR0aDphfSk7bnVsbCE9PVAmJmMuYWRkKFApLGYrPWF9cis9bixzLmFkZChjKX12YXIgej1lLmdsb2JhbHMueUF4aXNTY2FsZVswXS5yZXN1bHQuc2xpY2UoKTtlLmNvbmZpZy55YXhpc1swXS5yZXZlcnNlZD96LnVuc2hpZnQoIiIpOnoucHVzaCgiIiksZS5nbG9iYWxzLnlBeGlzU2NhbGVbMF0ucmVzdWx0PXo7dmFyIE09ZS5nbG9iYWxzLmdyaWRIZWlnaHQvZS5nbG9iYWxzLnNlcmllcy5sZW5ndGg7cmV0dXJuIGUuY29uZmlnLnlheGlzWzBdLmxhYmVscy5vZmZzZXRZPS1NLzIsc319LHtrZXk6ImNoZWNrQ29sb3JSYW5nZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy53LmNvbmZpZy5wbG90T3B0aW9ucy5oZWF0bWFwO2UuY29sb3JTY2FsZS5yYW5nZXMubGVuZ3RoPjAmJmUuY29sb3JTY2FsZS5yYW5nZXMubWFwKGZ1bmN0aW9uKGUsaSl7ZS5mcm9tPDAmJih0Lm5lZ1JhbmdlPSEwKX0pfX0se2tleToiZGV0ZXJtaW5lSGVhdENvbG9yIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudyxzPWkuZ2xvYmFscy5zZXJpZXNbdF1bZV0sYT1pLmNvbmZpZy5wbG90T3B0aW9ucy5oZWF0bWFwLG49YS5jb2xvclNjYWxlLmludmVyc2U/ZTp0LHI9aS5nbG9iYWxzLmNvbG9yc1tuXSxvPU1hdGgubWluLmFwcGx5KE1hdGgsZChpLmdsb2JhbHMuc2VyaWVzW3RdKSksbD1NYXRoLm1heC5hcHBseShNYXRoLGQoaS5nbG9iYWxzLnNlcmllc1t0XSkpO2EuZGlzdHJpYnV0ZWR8fChvPWkuZ2xvYmFscy5taW5ZLGw9aS5nbG9iYWxzLm1heFkpLHZvaWQgMCE9PWEuY29sb3JTY2FsZS5taW4mJihvPWEuY29sb3JTY2FsZS5taW48aS5nbG9iYWxzLm1pblk/YS5jb2xvclNjYWxlLm1pbjppLmdsb2JhbHMubWluWSxsPWEuY29sb3JTY2FsZS5tYXg+aS5nbG9iYWxzLm1heFk/YS5jb2xvclNjYWxlLm1heDppLmdsb2JhbHMubWF4WSk7dmFyIGg9TWF0aC5hYnMobCkrTWF0aC5hYnMobyksYz0xMDAqcy8oMD09PWg/aC0xZS02OmgpO2EuY29sb3JTY2FsZS5yYW5nZXMubGVuZ3RoPjAmJmEuY29sb3JTY2FsZS5yYW5nZXMubWFwKGZ1bmN0aW9uKHQsZSl7aWYocz49dC5mcm9tJiZzPD10LnRvKXtyPXQuY29sb3Isbz10LmZyb20sbD10LnRvO3ZhciBpPU1hdGguYWJzKGwpK01hdGguYWJzKG8pO2M9MTAwKnMvKDA9PT1pP2ktMWUtNjppKX19KTtyZXR1cm57Y29sb3I6cixwZXJjZW50OmN9fX0se2tleToiY2FsY3VsYXRlSGVhdG1hcERhdGFMYWJlbHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQueCxpPXQueSxzPXQuaSxhPXQuaixuPSh0LnNlcmllcyx0LnJlY3RIZWlnaHQpLHI9dC5yZWN0V2lkdGgsbz10aGlzLncsbD1vLmNvbmZpZy5kYXRhTGFiZWxzLGg9bmV3IHAodGhpcy5jdHgpLGM9bmV3IHoodGhpcy5jdHgpLGQ9bC5mb3JtYXR0ZXIsdT1udWxsO2lmKGwuZW5hYmxlZCl7dT1oLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy1kYXRhLWxhYmVscyJ9KTt2YXIgZz1sLm9mZnNldFgsZj1sLm9mZnNldFkseD1lK3IvMitnLGI9aStuLzIrcGFyc2VJbnQobC5zdHlsZS5mb250U2l6ZSkvMytmLG09ZChvLmdsb2JhbHMuc2VyaWVzW3NdW2FdLHtzZXJpZXNJbmRleDpzLGRhdGFQb2ludEluZGV4OmEsdzpvfSk7Yy5wbG90RGF0YUxhYmVsc1RleHQoe3g6eCx5OmIsdGV4dDptLGk6cyxqOmEscGFyZW50OnUsZGF0YUxhYmVsc0NvbmZpZzpsfSl9cmV0dXJuIHV9fSx7a2V5OiJhbmltYXRlSGVhdE1hcCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkscyxhLG4pe3ZhciByPW5ldyBmKHRoaXMuY3R4KTtyLmFuaW1hdGVSZWN0KHQse3g6ZStzLzIseTppK2EvMix3aWR0aDowLGhlaWdodDowfSx7eDplLHk6aSx3aWR0aDpzLGhlaWdodDphfSxuLGZ1bmN0aW9uKCl7ci5hbmltYXRpb25Db21wbGV0ZWQoKX0pfX0se2tleToiYW5pbWF0ZUhlYXRDb2xvciIsdmFsdWU6ZnVuY3Rpb24odCxlLGkscyl7dC5hdHRyKHtmaWxsOmV9KS5hbmltYXRlKHMpLmF0dHIoe2ZpbGw6aX0pfX1dKSx0fSgpLFk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGkpe2UodGhpcyx0KSx0aGlzLmN0eD1pLHRoaXMudz1pLncsdGhpcy5jaGFydFR5cGU9dGhpcy53LmNvbmZpZy5jaGFydC50eXBlLHRoaXMuaW5pdGlhbEFuaW09dGhpcy53LmNvbmZpZy5jaGFydC5hbmltYXRpb25zLmVuYWJsZWQsdGhpcy5keW5hbWljQW5pbT10aGlzLmluaXRpYWxBbmltJiZ0aGlzLncuY29uZmlnLmNoYXJ0LmFuaW1hdGlvbnMuZHluYW1pY0FuaW1hdGlvbi5lbmFibGVkLHRoaXMuYW5pbUJlZ2luQXJyPVswXSx0aGlzLmFuaW1EdXI9MCx0aGlzLmRvbnV0RGF0YUxhYmVscz10aGlzLncuY29uZmlnLnBsb3RPcHRpb25zLnBpZS5kb251dC5sYWJlbHM7dmFyIHM9dGhpcy53O3RoaXMubGluZUNvbG9yQXJyPXZvaWQgMCE9PXMuZ2xvYmFscy5zdHJva2UuY29sb3JzP3MuZ2xvYmFscy5zdHJva2UuY29sb3JzOnMuZ2xvYmFscy5jb2xvcnMsdGhpcy5kZWZhdWx0U2l6ZT1zLmdsb2JhbHMuc3ZnSGVpZ2h0PHMuZ2xvYmFscy5zdmdXaWR0aD9zLmdsb2JhbHMuc3ZnSGVpZ2h0LTM1OnMuZ2xvYmFscy5ncmlkV2lkdGgsdGhpcy5jZW50ZXJZPXRoaXMuZGVmYXVsdFNpemUvMix0aGlzLmNlbnRlclg9cy5nbG9iYWxzLmdyaWRXaWR0aC8yLHRoaXMuZnVsbEFuZ2xlPTM2MCxzLmdsb2JhbHMucmFkaWFsU2l6ZT10aGlzLmRlZmF1bHRTaXplLzIuMDUtcy5jb25maWcuc3Ryb2tlLndpZHRoLXMuY29uZmlnLmNoYXJ0LmRyb3BTaGFkb3cuYmx1cix2b2lkIDAhPT1zLmNvbmZpZy5wbG90T3B0aW9ucy5waWUuc2l6ZSYmKHMuZ2xvYmFscy5yYWRpYWxTaXplPXMuY29uZmlnLnBsb3RPcHRpb25zLnBpZS5zaXplKSx0aGlzLmRvbnV0U2l6ZT1zLmdsb2JhbHMucmFkaWFsU2l6ZSpwYXJzZUludChzLmNvbmZpZy5wbG90T3B0aW9ucy5waWUuZG9udXQuc2l6ZSkvMTAwLHRoaXMuc2xpY2VMYWJlbHM9W10sdGhpcy5wcmV2U2VjdG9yQW5nbGVBcnI9W119cmV0dXJuIHModCxbe2tleToiZHJhdyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53LGk9bmV3IHAodGhpcy5jdHgpLHM9aS5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMtcGllIn0pO2lmKGUuZ2xvYmFscy5ub0RhdGEpcmV0dXJuIHM7Zm9yKHZhciBhPTAsbj0wO248dC5sZW5ndGg7bisrKWErPXUubmVnVG9aZXJvKHRbbl0pO3ZhciByPVtdLG89aS5ncm91cCgpOzA9PT1hJiYoYT0xZS01KTtmb3IodmFyIGw9MDtsPHQubGVuZ3RoO2wrKyl7dmFyIGg9dGhpcy5mdWxsQW5nbGUqdS5uZWdUb1plcm8odFtsXSkvYTtyLnB1c2goaCl9aWYoZS5nbG9iYWxzLmRhdGFDaGFuZ2VkKXtmb3IodmFyIGMsZD0wLGc9MDtnPGUuZ2xvYmFscy5wcmV2aW91c1BhdGhzLmxlbmd0aDtnKyspZCs9dS5uZWdUb1plcm8oZS5nbG9iYWxzLnByZXZpb3VzUGF0aHNbZ10pO2Zvcih2YXIgZj0wO2Y8ZS5nbG9iYWxzLnByZXZpb3VzUGF0aHMubGVuZ3RoO2YrKyljPXRoaXMuZnVsbEFuZ2xlKnUubmVnVG9aZXJvKGUuZ2xvYmFscy5wcmV2aW91c1BhdGhzW2ZdKS9kLHRoaXMucHJldlNlY3RvckFuZ2xlQXJyLnB1c2goYyl9dGhpcy5kb251dFNpemU8MCYmKHRoaXMuZG9udXRTaXplPTApO3ZhciB4PWUuY29uZmlnLnBsb3RPcHRpb25zLnBpZS5jdXN0b21TY2FsZSxiPWUuZ2xvYmFscy5ncmlkV2lkdGgvMixtPWUuZ2xvYmFscy5ncmlkSGVpZ2h0LzIsdj1iLWUuZ2xvYmFscy5ncmlkV2lkdGgvMip4LHk9bS1lLmdsb2JhbHMuZ3JpZEhlaWdodC8yKng7aWYoImRvbnV0Ij09PWUuY29uZmlnLmNoYXJ0LnR5cGUpe3ZhciB3PWkuZHJhd0NpcmNsZSh0aGlzLmRvbnV0U2l6ZSk7dy5hdHRyKHtjeDp0aGlzLmNlbnRlclgsY3k6dGhpcy5jZW50ZXJZLGZpbGw6ZS5jb25maWcucGxvdE9wdGlvbnMucGllLmRvbnV0LmJhY2tncm91bmR9KSxvLmFkZCh3KX12YXIgaz10aGlzLmRyYXdBcmNzKHIsdCk7aWYodGhpcy5zbGljZUxhYmVscy5mb3JFYWNoKGZ1bmN0aW9uKHQpe2suYWRkKHQpfSksby5hdHRyKHt0cmFuc2Zvcm06InRyYW5zbGF0ZSgiLmNvbmNhdCh2LCIsICIpLmNvbmNhdCh5LTUsIikgc2NhbGUoIikuY29uY2F0KHgsIikiKX0pLHMuYXR0cih7ImRhdGE6aW5uZXJUcmFuc2xhdGVYIjp2LCJkYXRhOmlubmVyVHJhbnNsYXRlWSI6eS0yNX0pLG8uYWRkKGspLHMuYWRkKG8pLHRoaXMuZG9udXREYXRhTGFiZWxzLnNob3cpe3ZhciBBPXRoaXMucmVuZGVySW5uZXJEYXRhTGFiZWxzKHRoaXMuZG9udXREYXRhTGFiZWxzLHtob2xsb3dTaXplOnRoaXMuZG9udXRTaXplLGNlbnRlclg6dGhpcy5jZW50ZXJYLGNlbnRlclk6dGhpcy5jZW50ZXJZLG9wYWNpdHk6dGhpcy5kb251dERhdGFMYWJlbHMuc2hvdyx0cmFuc2xhdGVYOnYsdHJhbnNsYXRlWTp5fSk7cy5hZGQoQSl9cmV0dXJuIHN9fSx7a2V5OiJkcmF3QXJjcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLncscz1uZXcgZyh0aGlzLmN0eCksYT1uZXcgcCh0aGlzLmN0eCksbj1uZXcgQyh0aGlzLmN0eCkscj1hLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy1zbGljZXMifSksbz0wLGw9MCxoPTAsYz0wO3RoaXMuc3Ryb2tlV2lkdGg9aS5jb25maWcuc3Ryb2tlLnNob3c/aS5jb25maWcuc3Ryb2tlLndpZHRoOjA7Zm9yKHZhciBkPTA7ZDx0Lmxlbmd0aDtkKyspe3ZhciBmPWEuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLXNlcmllcyBhcGV4Y2hhcnRzLXBpZS1zZXJpZXMiLHNlcmllc05hbWU6dS5lc2NhcGVTdHJpbmcoaS5nbG9iYWxzLnNlcmllc05hbWVzW2RdKSxyZWw6ZCsxLCJkYXRhOnJlYWxJbmRleCI6ZH0pO3IuYWRkKGYpLGw9YyxoPShvPWgpK3RbZF0sYz1sK3RoaXMucHJldlNlY3RvckFuZ2xlQXJyW2RdO3ZhciB4PWgtbyxiPW4uZmlsbFBhdGgoe3Nlcmllc051bWJlcjpkLHNpemU6aS5nbG9iYWxzLnJhZGlhbFNpemUsdmFsdWU6ZVtkXX0pLG09dGhpcy5nZXRDaGFuZ2VkUGF0aChsLGMpLHY9YS5kcmF3UGF0aCh7ZDptLHN0cm9rZTp0aGlzLmxpbmVDb2xvckFyciBpbnN0YW5jZW9mIEFycmF5P3RoaXMubGluZUNvbG9yQXJyW2RdOnRoaXMubGluZUNvbG9yQXJyLHN0cm9rZVdpZHRoOnRoaXMuc3Ryb2tlV2lkdGgsZmlsbDpiLGZpbGxPcGFjaXR5OmkuY29uZmlnLmZpbGwub3BhY2l0eSxjbGFzc2VzOiJhcGV4Y2hhcnRzLXBpZS1hcmVhIGFwZXhjaGFydHMtIi5jb25jYXQoaS5jb25maWcuY2hhcnQudHlwZSwiLXNsaWNlLSIpLmNvbmNhdChkKX0pO2lmKHYuYXR0cih7aW5kZXg6MCxqOmR9KSxpLmNvbmZpZy5jaGFydC5kcm9wU2hhZG93LmVuYWJsZWQpe3ZhciB5PWkuY29uZmlnLmNoYXJ0LmRyb3BTaGFkb3c7cy5kcm9wU2hhZG93KHYseSxkKX10aGlzLmFkZExpc3RlbmVycyh2LHRoaXMuZG9udXREYXRhTGFiZWxzKSxwLnNldEF0dHJzKHYubm9kZSx7ImRhdGE6YW5nbGUiOngsImRhdGE6c3RhcnRBbmdsZSI6bywiZGF0YTpzdHJva2VXaWR0aCI6dGhpcy5zdHJva2VXaWR0aCwiZGF0YTp2YWx1ZSI6ZVtkXX0pO3ZhciB3PXt4OjAseTowfTsicGllIj09PWkuY29uZmlnLmNoYXJ0LnR5cGU/dz11LnBvbGFyVG9DYXJ0ZXNpYW4odGhpcy5jZW50ZXJYLHRoaXMuY2VudGVyWSxpLmdsb2JhbHMucmFkaWFsU2l6ZS8xLjI1K2kuY29uZmlnLnBsb3RPcHRpb25zLnBpZS5kYXRhTGFiZWxzLm9mZnNldCxvKyhoLW8pLzIpOiJkb251dCI9PT1pLmNvbmZpZy5jaGFydC50eXBlJiYodz11LnBvbGFyVG9DYXJ0ZXNpYW4odGhpcy5jZW50ZXJYLHRoaXMuY2VudGVyWSwoaS5nbG9iYWxzLnJhZGlhbFNpemUrdGhpcy5kb251dFNpemUpLzIraS5jb25maWcucGxvdE9wdGlvbnMucGllLmRhdGFMYWJlbHMub2Zmc2V0LG8rKGgtbykvMikpLGYuYWRkKHYpO3ZhciBrPTA7aWYoIXRoaXMuaW5pdGlhbEFuaW18fGkuZ2xvYmFscy5yZXNpemVkfHxpLmdsb2JhbHMuZGF0YUNoYW5nZWQ/dGhpcy5hbmltQmVnaW5BcnIucHVzaCgwKTooaz0oaC1vKS90aGlzLmZ1bGxBbmdsZSppLmNvbmZpZy5jaGFydC5hbmltYXRpb25zLnNwZWVkLHRoaXMuYW5pbUR1cj1rK3RoaXMuYW5pbUR1cix0aGlzLmFuaW1CZWdpbkFyci5wdXNoKHRoaXMuYW5pbUR1cikpLHRoaXMuZHluYW1pY0FuaW0mJmkuZ2xvYmFscy5kYXRhQ2hhbmdlZD90aGlzLmFuaW1hdGVQYXRocyh2LHtzaXplOmkuZ2xvYmFscy5yYWRpYWxTaXplLGVuZEFuZ2xlOmgsc3RhcnRBbmdsZTpvLHByZXZTdGFydEFuZ2xlOmwscHJldkVuZEFuZ2xlOmMsYW5pbWF0ZVN0YXJ0aW5nUG9zOiEwLGk6ZCxhbmltQmVnaW5BcnI6dGhpcy5hbmltQmVnaW5BcnIsZHVyOmkuY29uZmlnLmNoYXJ0LmFuaW1hdGlvbnMuZHluYW1pY0FuaW1hdGlvbi5zcGVlZH0pOnRoaXMuYW5pbWF0ZVBhdGhzKHYse3NpemU6aS5nbG9iYWxzLnJhZGlhbFNpemUsZW5kQW5nbGU6aCxzdGFydEFuZ2xlOm8saTpkLHRvdGFsSXRlbXM6dC5sZW5ndGgtMSxhbmltQmVnaW5BcnI6dGhpcy5hbmltQmVnaW5BcnIsZHVyOmt9KSxpLmNvbmZpZy5wbG90T3B0aW9ucy5waWUuZXhwYW5kT25DbGljayYmdi5jbGljayh0aGlzLnBpZUNsaWNrZWQuYmluZCh0aGlzLGQpKSxpLmNvbmZpZy5kYXRhTGFiZWxzLmVuYWJsZWQpe3ZhciBBPXcueCxTPXcueSxMPTEwMCooaC1vKS8zNjArIiUiO2lmKDAhPT14JiZpLmNvbmZpZy5wbG90T3B0aW9ucy5waWUuZGF0YUxhYmVscy5taW5BbmdsZVRvU2hvd0xhYmVsPHRbZF0pe3ZhciBQPWkuY29uZmlnLmRhdGFMYWJlbHMuZm9ybWF0dGVyO3ZvaWQgMCE9PVAmJihMPVAoaS5nbG9iYWxzLnNlcmllc1BlcmNlbnRbZF1bMF0se3Nlcmllc0luZGV4OmQsdzppfSkpO3ZhciB6PWkuZ2xvYmFscy5kYXRhTGFiZWxzLnN0eWxlLmNvbG9yc1tkXSxNPWEuZHJhd1RleHQoe3g6QSx5OlMsdGV4dDpMLHRleHRBbmNob3I6Im1pZGRsZSIsZm9udFNpemU6aS5jb25maWcuZGF0YUxhYmVscy5zdHlsZS5mb250U2l6ZSxmb250RmFtaWx5OmkuY29uZmlnLmRhdGFMYWJlbHMuc3R5bGUuZm9udEZhbWlseSxmb3JlQ29sb3I6en0pO2lmKGkuY29uZmlnLmRhdGFMYWJlbHMuZHJvcFNoYWRvdy5lbmFibGVkKXt2YXIgRT1pLmNvbmZpZy5kYXRhTGFiZWxzLmRyb3BTaGFkb3c7bmV3IGcodGhpcy5jdHgpLmRyb3BTaGFkb3coTSxFKX1NLm5vZGUuY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy1waWUtbGFiZWwiKSxpLmNvbmZpZy5jaGFydC5hbmltYXRpb25zLmFuaW1hdGUmJiExPT09aS5nbG9iYWxzLnJlc2l6ZWQmJihNLm5vZGUuY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy1waWUtbGFiZWwtZGVsYXkiKSxNLm5vZGUuc3R5bGUuYW5pbWF0aW9uRGVsYXk9aS5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5zcGVlZC85NDArInMiKSx0aGlzLnNsaWNlTGFiZWxzLnB1c2goTSl9fX1yZXR1cm4gcn19LHtrZXk6ImFkZExpc3RlbmVycyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1uZXcgcCh0aGlzLmN0eCk7dC5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLGkucGF0aE1vdXNlRW50ZXIuYmluZCh0aGlzLHQpKSx0Lm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsaS5wYXRoTW91c2VMZWF2ZS5iaW5kKHRoaXMsdCkpLHQubm9kZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIix0aGlzLnJldmVydERhdGFMYWJlbHNJbm5lci5iaW5kKHRoaXMsdC5ub2RlLGUpKSx0Lm5vZGUuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixpLnBhdGhNb3VzZURvd24uYmluZCh0aGlzLHQpKSx0aGlzLmRvbnV0RGF0YUxhYmVscy50b3RhbC5zaG93QWx3YXlzfHwodC5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZW50ZXIiLHRoaXMucHJpbnREYXRhTGFiZWxzSW5uZXIuYmluZCh0aGlzLHQubm9kZSxlKSksdC5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5wcmludERhdGFMYWJlbHNJbm5lci5iaW5kKHRoaXMsdC5ub2RlLGUpKSl9fSx7a2V5OiJhbmltYXRlUGF0aHMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53LHM9ZS5lbmRBbmdsZS1lLnN0YXJ0QW5nbGUsYT1zLG49ZS5zdGFydEFuZ2xlLHI9ZS5zdGFydEFuZ2xlO3ZvaWQgMCE9PWUucHJldlN0YXJ0QW5nbGUmJnZvaWQgMCE9PWUucHJldkVuZEFuZ2xlJiYobj1lLnByZXZFbmRBbmdsZSxhPWUucHJldkVuZEFuZ2xlLWUucHJldlN0YXJ0QW5nbGUpLGUuaT09PWkuY29uZmlnLnNlcmllcy5sZW5ndGgtMSYmKHMrcj50aGlzLmZ1bGxBbmdsZT9lLmVuZEFuZ2xlPWUuZW5kQW5nbGUtKHMrcik6cytyPHRoaXMuZnVsbEFuZ2xlJiYoZS5lbmRBbmdsZT1lLmVuZEFuZ2xlKyh0aGlzLmZ1bGxBbmdsZS0ocytyKSkpKSxzPT09dGhpcy5mdWxsQW5nbGUmJihzPXRoaXMuZnVsbEFuZ2xlLS4wMSksdGhpcy5hbmltYXRlQXJjKHQsbixyLHMsYSxlKX19LHtrZXk6ImFuaW1hdGVBcmMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLHMsYSxuKXt2YXIgcixvPXRoaXMsbD10aGlzLncsaD1uZXcgZih0aGlzLmN0eCksYz1uLnNpemU7KGlzTmFOKGUpfHxpc05hTihhKSkmJihlPWksYT1zLG4uZHVyPTApO3ZhciBkPXMsdT1pLGc9ZS1pO2wuZ2xvYmFscy5kYXRhQ2hhbmdlZCYmbi5zaG91bGRTZXRQcmV2UGF0aHMmJihyPW8uZ2V0UGllUGF0aCh7bWU6byxzdGFydEFuZ2xlOnUsYW5nbGU6YSxzaXplOmN9KSx0LmF0dHIoe2Q6cn0pKSwwIT09bi5kdXI/dC5hbmltYXRlKG4uZHVyLGwuZ2xvYmFscy5lYXNpbmcsbi5hbmltQmVnaW5BcnJbbi5pXSkuYWZ0ZXJBbGwoZnVuY3Rpb24oKXsicGllIiE9PWwuY29uZmlnLmNoYXJ0LnR5cGUmJiJkb251dCIhPT1sLmNvbmZpZy5jaGFydC50eXBlfHx0aGlzLmFuaW1hdGUoMzAwKS5hdHRyKHsic3Ryb2tlLXdpZHRoIjpsLmNvbmZpZy5zdHJva2Uud2lkdGh9KSxuLmk9PT1sLmNvbmZpZy5zZXJpZXMubGVuZ3RoLTEmJmguYW5pbWF0aW9uQ29tcGxldGVkKCl9KS5kdXJpbmcoZnVuY3Rpb24obCl7ZD1nKyhzLWcpKmwsbi5hbmltYXRlU3RhcnRpbmdQb3MmJihkPWErKHMtYSkqbCx1PWUtYSsoaS0oZS1hKSkqbCkscj1vLmdldFBpZVBhdGgoe21lOm8sc3RhcnRBbmdsZTp1LGFuZ2xlOmQsc2l6ZTpjfSksdC5ub2RlLnNldEF0dHJpYnV0ZSgiZGF0YTpwYXRoT3JpZyIsciksdC5hdHRyKHtkOnJ9KX0pOihyPW8uZ2V0UGllUGF0aCh7bWU6byxzdGFydEFuZ2xlOnUsYW5nbGU6cyxzaXplOmN9KSxuLmlzVHJhY2t8fChsLmdsb2JhbHMuYW5pbWF0aW9uRW5kZWQ9ITApLHQubm9kZS5zZXRBdHRyaWJ1dGUoImRhdGE6cGF0aE9yaWciLHIpLHQuYXR0cih7ZDpyfSkpfX0se2tleToicGllQ2xpY2tlZCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLncscz10aGlzLncuZ2xvYmFscy5yYWRpYWxTaXplKzQsYT1pLmdsb2JhbHMuZG9tLlBhcGVyLnNlbGVjdCgiLmFwZXhjaGFydHMtIi5jb25jYXQoaS5jb25maWcuY2hhcnQudHlwZS50b0xvd2VyQ2FzZSgpLCItc2xpY2UtIikuY29uY2F0KHQpKS5tZW1iZXJzWzBdLG49YS5hdHRyKCJkIik7aWYoInRydWUiIT09YS5hdHRyKCJkYXRhOnBpZUNsaWNrZWQiKSl7dmFyIHI9aS5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvckFsbCgiLmFwZXhjaGFydHMtcGllLWFyZWEiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHIsZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoImRhdGE6cGllQ2xpY2tlZCIsImZhbHNlIik7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGE6cGF0aE9yaWciKTt0LnNldEF0dHJpYnV0ZSgiZCIsZSl9KSxhLmF0dHIoImRhdGE6cGllQ2xpY2tlZCIsInRydWUiKTt2YXIgbz1wYXJzZUludChhLmF0dHIoImRhdGE6c3RhcnRBbmdsZSIpKSxsPXBhcnNlSW50KGEuYXR0cigiZGF0YTphbmdsZSIpKTtlPXRoaXMuZ2V0UGllUGF0aCh7bWU6dGhpcyxzdGFydEFuZ2xlOm8sYW5nbGU6bCxzaXplOnN9KSwzNjAhPT1sJiZhLnBsb3QoZSkuYW5pbWF0ZSgxKS5wbG90KG4pLmFuaW1hdGUoMTAwKS5wbG90KGUpfWVsc2V7YS5hdHRyKHsiZGF0YTpwaWVDbGlja2VkIjoiZmFsc2UifSksdGhpcy5yZXZlcnREYXRhTGFiZWxzSW5uZXIoYS5ub2RlLHRoaXMuZG9udXREYXRhTGFiZWxzKTt2YXIgaD1hLmF0dHIoImRhdGE6cGF0aE9yaWciKTthLmF0dHIoe2Q6aH0pfX19LHtrZXk6ImdldENoYW5nZWRQYXRoIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPSIiO3JldHVybiB0aGlzLmR5bmFtaWNBbmltJiZ0aGlzLncuZ2xvYmFscy5kYXRhQ2hhbmdlZCYmKGk9dGhpcy5nZXRQaWVQYXRoKHttZTp0aGlzLHN0YXJ0QW5nbGU6dCxhbmdsZTplLXQsc2l6ZTp0aGlzLnNpemV9KSksaX19LHtrZXk6ImdldFBpZVBhdGgiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQubWUsaT10LnN0YXJ0QW5nbGUscz10LmFuZ2xlLGE9dC5zaXplLG49dGhpcy53LHI9aSxvPU1hdGguUEkqKHItOTApLzE4MCxsPXMraTtNYXRoLmNlaWwobCk+PTM2MCYmKGw9MzU5Ljk5KTt2YXIgaD1NYXRoLlBJKihsLTkwKS8xODAsYz1lLmNlbnRlclgrYSpNYXRoLmNvcyhvKSxkPWUuY2VudGVyWSthKk1hdGguc2luKG8pLGc9ZS5jZW50ZXJYK2EqTWF0aC5jb3MoaCksZj1lLmNlbnRlclkrYSpNYXRoLnNpbihoKSxwPXUucG9sYXJUb0NhcnRlc2lhbihlLmNlbnRlclgsZS5jZW50ZXJZLGUuZG9udXRTaXplLGwpLHg9dS5wb2xhclRvQ2FydGVzaWFuKGUuY2VudGVyWCxlLmNlbnRlclksZS5kb251dFNpemUsciksYj1zPjE4MD8xOjA7cmV0dXJuImRvbnV0Ij09PW4uY29uZmlnLmNoYXJ0LnR5cGU/WyJNIixjLGQsIkEiLGEsYSwwLGIsMSxnLGYsIkwiLHAueCxwLnksIkEiLGUuZG9udXRTaXplLGUuZG9udXRTaXplLDAsYiwwLHgueCx4LnksIkwiLGMsZCwieiJdLmpvaW4oIiAiKToicGllIj09PW4uY29uZmlnLmNoYXJ0LnR5cGU/WyJNIixjLGQsIkEiLGEsYSwwLGIsMSxnLGYsIkwiLGUuY2VudGVyWCxlLmNlbnRlclksIkwiLGMsZF0uam9pbigiICIpOlsiTSIsYyxkLCJBIixhLGEsMCxiLDEsZyxmXS5qb2luKCIgIil9fSx7a2V5OiJyZW5kZXJJbm5lckRhdGFMYWJlbHMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53LHM9bmV3IHAodGhpcy5jdHgpLGE9cy5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMtZGF0YWxhYmVscy1ncm91cCIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoIi5jb25jYXQoZS50cmFuc2xhdGVYP2UudHJhbnNsYXRlWDowLCIsICIpLmNvbmNhdChlLnRyYW5zbGF0ZVk/ZS50cmFuc2xhdGVZOjAsIikiKX0pLG49dC50b3RhbC5zaG93O2Eubm9kZS5zdHlsZS5vcGFjaXR5PWUub3BhY2l0eTt2YXIgcixvLGw9ZS5jZW50ZXJYLGg9ZS5jZW50ZXJZO3I9dm9pZCAwPT09dC5uYW1lLmNvbG9yP2kuZ2xvYmFscy5jb2xvcnNbMF06dC5uYW1lLmNvbG9yLG89dm9pZCAwPT09dC52YWx1ZS5jb2xvcj9pLmNvbmZpZy5jaGFydC5mb3JlQ29sb3I6dC52YWx1ZS5jb2xvcjt2YXIgYz10LnZhbHVlLmZvcm1hdHRlcixkPSIiLHU9IiI7aWYobj8ocj10LnRvdGFsLmNvbG9yLHU9dC50b3RhbC5sYWJlbCxkPXQudG90YWwuZm9ybWF0dGVyKGkpKToxPT09aS5nbG9iYWxzLnNlcmllcy5sZW5ndGgmJihkPWMoaS5nbG9iYWxzLnNlcmllc1swXSxpKSx1PWkuZ2xvYmFscy5zZXJpZXNOYW1lc1swXSksdC5uYW1lLnNob3cpe3ZhciBnPXMuZHJhd1RleHQoe3g6bCx5OmgrcGFyc2VJbnQodC5uYW1lLm9mZnNldFkpLHRleHQ6dSx0ZXh0QW5jaG9yOiJtaWRkbGUiLGZvcmVDb2xvcjpyLGZvbnRTaXplOnQubmFtZS5mb250U2l6ZSxmb250RmFtaWx5OnQubmFtZS5mb250RmFtaWx5fSk7Zy5ub2RlLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtZGF0YWxhYmVsLWxhYmVsIiksYS5hZGQoZyl9aWYodC52YWx1ZS5zaG93KXt2YXIgZj10Lm5hbWUuc2hvdz9wYXJzZUludCh0LnZhbHVlLm9mZnNldFkpKzE2OnQudmFsdWUub2Zmc2V0WSx4PXMuZHJhd1RleHQoe3g6bCx5OmgrZix0ZXh0OmQsdGV4dEFuY2hvcjoibWlkZGxlIixmb3JlQ29sb3I6byxmb250U2l6ZTp0LnZhbHVlLmZvbnRTaXplLGZvbnRGYW1pbHk6dC52YWx1ZS5mb250RmFtaWx5fSk7eC5ub2RlLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtZGF0YWxhYmVsLXZhbHVlIiksYS5hZGQoeCl9cmV0dXJuIGF9fSx7a2V5OiJwcmludElubmVyTGFiZWxzIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxzKXt2YXIgYSxuPXRoaXMudztzP2E9dm9pZCAwPT09dC5uYW1lLmNvbG9yP24uZ2xvYmFscy5jb2xvcnNbcGFyc2VJbnQocy5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgicmVsIikpLTFdOnQubmFtZS5jb2xvcjpuLmdsb2JhbHMuc2VyaWVzLmxlbmd0aD4xJiZ0LnRvdGFsLnNob3cmJihhPXQudG90YWwuY29sb3IpO3ZhciByPW4uZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3IoIi5hcGV4Y2hhcnRzLWRhdGFsYWJlbC1sYWJlbCIpLG89bi5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtZGF0YWxhYmVsLXZhbHVlIik7aT0oMCx0LnZhbHVlLmZvcm1hdHRlcikoaSxuKSxzfHwiZnVuY3Rpb24iIT10eXBlb2YgdC50b3RhbC5mb3JtYXR0ZXJ8fChpPXQudG90YWwuZm9ybWF0dGVyKG4pKSxudWxsIT09ciYmKHIudGV4dENvbnRlbnQ9ZSksbnVsbCE9PW8mJihvLnRleHRDb250ZW50PWkpLG51bGwhPT1yJiYoci5zdHlsZS5maWxsPWEpfX0se2tleToicHJpbnREYXRhTGFiZWxzSW5uZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53LHM9dC5nZXRBdHRyaWJ1dGUoImRhdGE6dmFsdWUiKSxhPWkuZ2xvYmFscy5zZXJpZXNOYW1lc1twYXJzZUludCh0LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJyZWwiKSktMV07aS5nbG9iYWxzLnNlcmllcy5sZW5ndGg+MSYmdGhpcy5wcmludElubmVyTGFiZWxzKGUsYSxzLHQpO3ZhciBuPWkuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3IoIi5hcGV4Y2hhcnRzLWRhdGFsYWJlbHMtZ3JvdXAiKTtudWxsIT09biYmKG4uc3R5bGUub3BhY2l0eT0xKX19LHtrZXk6InJldmVydERhdGFMYWJlbHNJbm5lciIsdmFsdWU6ZnVuY3Rpb24oZSxpLHMpe3ZhciBhPXRoaXMsbj10aGlzLncscj1uLmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy1kYXRhbGFiZWxzLWdyb3VwIik7aWYoaS50b3RhbC5zaG93JiZuLmdsb2JhbHMuc2VyaWVzLmxlbmd0aD4xKXtuZXcgdCh0aGlzLmN0eCkucHJpbnRJbm5lckxhYmVscyhpLGkudG90YWwubGFiZWwsaS50b3RhbC5mb3JtYXR0ZXIobikpfWVsc2V7dmFyIG89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmFwZXhjaGFydHMtcGllLWFyZWEiKSxsPSExO2lmKEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobyxmdW5jdGlvbih0KXsidHJ1ZSI9PT10LmdldEF0dHJpYnV0ZSgiZGF0YTpwaWVDbGlja2VkIikmJihsPSEwLGEucHJpbnREYXRhTGFiZWxzSW5uZXIodCxpKSl9KSwhbClpZihuLmdsb2JhbHMuc2VsZWN0ZWREYXRhUG9pbnRzLmxlbmd0aCYmbi5nbG9iYWxzLnNlcmllcy5sZW5ndGg+MSlpZihuLmdsb2JhbHMuc2VsZWN0ZWREYXRhUG9pbnRzWzBdLmxlbmd0aD4wKXt2YXIgaD1uLmdsb2JhbHMuc2VsZWN0ZWREYXRhUG9pbnRzWzBdLGM9bi5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtIi5jb25jYXQobi5jb25maWcuY2hhcnQudHlwZS50b0xvd2VyQ2FzZSgpLCItc2xpY2UtIikuY29uY2F0KGgpKTt0aGlzLnByaW50RGF0YUxhYmVsc0lubmVyKGMsaSl9ZWxzZSByJiZuLmdsb2JhbHMuc2VsZWN0ZWREYXRhUG9pbnRzLmxlbmd0aCYmMD09PW4uZ2xvYmFscy5zZWxlY3RlZERhdGFQb2ludHNbMF0ubGVuZ3RoJiYoci5zdHlsZS5vcGFjaXR5PTApO2Vsc2UgciYmbi5nbG9iYWxzLnNlcmllcy5sZW5ndGg+MSYmKHIuc3R5bGUub3BhY2l0eT0wKX19fV0pLHR9KCksRj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaSl7ZSh0aGlzLHQpLHRoaXMuY3R4PWksdGhpcy53PWkudyx0aGlzLmNoYXJ0VHlwZT10aGlzLncuY29uZmlnLmNoYXJ0LnR5cGUsdGhpcy5pbml0aWFsQW5pbT10aGlzLncuY29uZmlnLmNoYXJ0LmFuaW1hdGlvbnMuZW5hYmxlZCx0aGlzLmR5bmFtaWNBbmltPXRoaXMuaW5pdGlhbEFuaW0mJnRoaXMudy5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5keW5hbWljQW5pbWF0aW9uLmVuYWJsZWQsdGhpcy5hbmltRHVyPTA7dmFyIHM9dGhpcy53O3RoaXMuZ3JhcGhpY3M9bmV3IHAodGhpcy5jdHgpLHRoaXMubGluZUNvbG9yQXJyPXZvaWQgMCE9PXMuZ2xvYmFscy5zdHJva2UuY29sb3JzP3MuZ2xvYmFscy5zdHJva2UuY29sb3JzOnMuZ2xvYmFscy5jb2xvcnMsdGhpcy5kZWZhdWx0U2l6ZT1zLmdsb2JhbHMuc3ZnSGVpZ2h0PHMuZ2xvYmFscy5zdmdXaWR0aD9zLmdsb2JhbHMuc3ZnSGVpZ2h0LTM1OnMuZ2xvYmFscy5ncmlkV2lkdGgsdGhpcy5tYXhWYWx1ZT10aGlzLncuZ2xvYmFscy5tYXhZLHRoaXMucG9seWdvbnM9cy5jb25maWcucGxvdE9wdGlvbnMucmFkYXIucG9seWdvbnMsdGhpcy5tYXhMYWJlbFdpZHRoPTIwO3ZhciBhPXMuZ2xvYmFscy5sYWJlbHMuc2xpY2UoKS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUubGVuZ3RoLXQubGVuZ3RofSlbMF0sbj10aGlzLmdyYXBoaWNzLmdldFRleHRSZWN0cyhhLHMuY29uZmlnLmRhdGFMYWJlbHMuc3R5bGUuZm9udFNpemUpO3RoaXMuc2l6ZT10aGlzLmRlZmF1bHRTaXplLzIuMS1zLmNvbmZpZy5zdHJva2Uud2lkdGgtcy5jb25maWcuY2hhcnQuZHJvcFNoYWRvdy5ibHVyLW4ud2lkdGgvMS43NSx2b2lkIDAhPT1zLmNvbmZpZy5wbG90T3B0aW9ucy5yYWRhci5zaXplJiYodGhpcy5zaXplPXMuY29uZmlnLnBsb3RPcHRpb25zLnJhZGFyLnNpemUpLHRoaXMuZGF0YVJhZGl1c09mUGVyY2VudD1bXSx0aGlzLmRhdGFSYWRpdXM9W10sdGhpcy5hbmdsZUFycj1bXSx0aGlzLnlheGlzTGFiZWxzVGV4dHNQb3M9W119cmV0dXJuIHModCxbe2tleToiZHJhdyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxpPXRoaXMudyxzPW5ldyBDKHRoaXMuY3R4KSxhPVtdO3QubGVuZ3RoJiYodGhpcy5kYXRhUG9pbnRzTGVuPXRbaS5nbG9iYWxzLm1heFZhbHNJbkFycmF5SW5kZXhdLmxlbmd0aCksdGhpcy5kaXNBbmdsZT0yKk1hdGguUEkvdGhpcy5kYXRhUG9pbnRzTGVuO3ZhciBuPWkuZ2xvYmFscy5ncmlkV2lkdGgvMixvPWkuZ2xvYmFscy5ncmlkSGVpZ2h0LzIsbD10aGlzLmdyYXBoaWNzLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy1yYWRhci1zZXJpZXMiLCJkYXRhOmlubmVyVHJhbnNsYXRlWCI6biwiZGF0YTppbm5lclRyYW5zbGF0ZVkiOm8tMjUsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoIi5jb25jYXQobnx8MCwiLCAiKS5jb25jYXQob3x8MCwiKSIpfSksaD1bXSxjPW51bGw7aWYodGhpcy55YXhpc0xhYmVscz10aGlzLmdyYXBoaWNzLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy15YXhpcyJ9KSx0LmZvckVhY2goZnVuY3Rpb24odCxuKXt2YXIgbz1lLmdyYXBoaWNzLmdyb3VwKCkuYXR0cih7Y2xhc3M6ImFwZXhjaGFydHMtc2VyaWVzIixzZXJpZXNOYW1lOnUuZXNjYXBlU3RyaW5nKGkuZ2xvYmFscy5zZXJpZXNOYW1lc1tuXSkscmVsOm4rMSwiZGF0YTpyZWFsSW5kZXgiOm59KTtlLmRhdGFSYWRpdXNPZlBlcmNlbnRbbl09W10sZS5kYXRhUmFkaXVzW25dPVtdLGUuYW5nbGVBcnJbbl09W10sdC5mb3JFYWNoKGZ1bmN0aW9uKHQsaSl7ZS5kYXRhUmFkaXVzT2ZQZXJjZW50W25dW2ldPXQvZS5tYXhWYWx1ZSxlLmRhdGFSYWRpdXNbbl1baV09ZS5kYXRhUmFkaXVzT2ZQZXJjZW50W25dW2ldKmUuc2l6ZSxlLmFuZ2xlQXJyW25dW2ldPWkqZS5kaXNBbmdsZX0pLGg9ZS5nZXREYXRhUG9pbnRzUG9zKGUuZGF0YVJhZGl1c1tuXSxlLmFuZ2xlQXJyW25dKTt2YXIgbD1lLmNyZWF0ZVBhdGhzKGgse3g6MCx5OjB9KTtjPWUuZ3JhcGhpY3MuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLXNlcmllcy1tYXJrZXJzLXdyYXAgaGlkZGVuIn0pLGkuZ2xvYmFscy5kZWxheWVkRWxlbWVudHMucHVzaCh7ZWw6Yy5ub2RlLGluZGV4Om59KTt2YXIgZD17aTpuLHJlYWxJbmRleDpuLGFuaW1hdGlvbkRlbGF5Om4saW5pdGlhbFNwZWVkOmkuY29uZmlnLmNoYXJ0LmFuaW1hdGlvbnMuc3BlZWQsZGF0YUNoYW5nZVNwZWVkOmkuY29uZmlnLmNoYXJ0LmFuaW1hdGlvbnMuZHluYW1pY0FuaW1hdGlvbi5zcGVlZCxjbGFzc05hbWU6ImFwZXhjaGFydHMtcmFkYXIiLHNob3VsZENsaXBUb0dyaWQ6ITEsYmluZEV2ZW50c09uUGF0aHM6ITEsc3Ryb2tlOmkuZ2xvYmFscy5zdHJva2UuY29sb3JzW25dLHN0cm9rZUxpbmVDYXA6aS5jb25maWcuc3Ryb2tlLmxpbmVDYXB9LGY9bnVsbDtpLmdsb2JhbHMucHJldmlvdXNQYXRocy5sZW5ndGg+MCYmKGY9ZS5nZXRQYXRoRnJvbShuKSk7Zm9yKHZhciBwPTA7cDxsLmxpbmVQYXRoc1RvLmxlbmd0aDtwKyspe3ZhciB4PWUuZ3JhcGhpY3MucmVuZGVyUGF0aHMocih7fSxkLHtwYXRoRnJvbTpudWxsPT09Zj9sLmxpbmVQYXRoc0Zyb21bcF06ZixwYXRoVG86bC5saW5lUGF0aHNUb1twXSxzdHJva2VXaWR0aDpBcnJheS5pc0FycmF5KGkuY29uZmlnLnN0cm9rZS53aWR0aCk/aS5jb25maWcuc3Ryb2tlLndpZHRoW25dOmkuY29uZmlnLnN0cm9rZS53aWR0aCxmaWxsOiJub25lIixkcmF3U2hhZG93OiExfSkpO28uYWRkKHgpO3ZhciBiPXMuZmlsbFBhdGgoe3Nlcmllc051bWJlcjpufSksbT1lLmdyYXBoaWNzLnJlbmRlclBhdGhzKHIoe30sZCx7cGF0aEZyb206bnVsbD09PWY/bC5hcmVhUGF0aHNGcm9tW3BdOmYscGF0aFRvOmwuYXJlYVBhdGhzVG9bcF0sc3Ryb2tlV2lkdGg6MCxmaWxsOmIsZHJhd1NoYWRvdzohMX0pKTtpZihpLmNvbmZpZy5jaGFydC5kcm9wU2hhZG93LmVuYWJsZWQpe3ZhciB2PW5ldyBnKGUuY3R4KSx5PWkuY29uZmlnLmNoYXJ0LmRyb3BTaGFkb3c7di5kcm9wU2hhZG93KG0sT2JqZWN0LmFzc2lnbih7fSx5LHtub1VzZXJTcGFjZU9uVXNlOiEwfSksbil9by5hZGQobSl9dC5mb3JFYWNoKGZ1bmN0aW9uKHQsaSl7dmFyIHM9bmV3IEwoZS5jdHgpLmdldE1hcmtlckNvbmZpZygiYXBleGNoYXJ0cy1tYXJrZXIiLG4saSksYT1lLmdyYXBoaWNzLmRyYXdNYXJrZXIoaFtpXS54LGhbaV0ueSxzKTthLmF0dHIoInJlbCIsaSksYS5hdHRyKCJqIixpKSxhLmF0dHIoImluZGV4IixuKSxhLm5vZGUuc2V0QXR0cmlidXRlKCJkZWZhdWx0LW1hcmtlci1zaXplIixzLnBTaXplKTt2YXIgcj1lLmdyYXBoaWNzLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy1zZXJpZXMtbWFya2VycyJ9KTtyJiZyLmFkZChhKSxjLmFkZChyKSxvLmFkZChjKX0pLGEucHVzaChvKX0pLHRoaXMuZHJhd1BvbHlnb25zKHtwYXJlbnQ6bH0pLGkuY29uZmlnLmRhdGFMYWJlbHMuZW5hYmxlZCl7dmFyIGQ9dGhpcy5kcmF3TGFiZWxzKCk7bC5hZGQoZCl9cmV0dXJuIGwuYWRkKHRoaXMueWF4aXNMYWJlbHMpLGEuZm9yRWFjaChmdW5jdGlvbih0KXtsLmFkZCh0KX0pLGx9fSx7a2V5OiJkcmF3UG9seWdvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLGk9dGhpcy53LHM9dC5wYXJlbnQsYT1pLmdsb2JhbHMueUF4aXNTY2FsZVswXS5yZXN1bHQucmV2ZXJzZSgpLG49YS5sZW5ndGgscj1bXSxvPXRoaXMuc2l6ZS8obi0xKSxsPTA7bDxuO2wrKylyW2xdPW8qbDtyLnJldmVyc2UoKTt2YXIgaD1bXSxjPVtdO3IuZm9yRWFjaChmdW5jdGlvbih0LGkpe3ZhciBzPWUuZ2V0UG9seWdvblBvcyh0KSxhPSIiO3MuZm9yRWFjaChmdW5jdGlvbih0LHMpe2lmKDA9PT1pKXt2YXIgbj1lLmdyYXBoaWNzLmRyYXdMaW5lKHQueCx0LnksMCwwLEFycmF5LmlzQXJyYXkoZS5wb2x5Z29ucy5jb25uZWN0b3JDb2xvcnMpP2UucG9seWdvbnMuY29ubmVjdG9yQ29sb3JzW3NdOmUucG9seWdvbnMuY29ubmVjdG9yQ29sb3JzKTtjLnB1c2gobil9MD09PXMmJmUueWF4aXNMYWJlbHNUZXh0c1Bvcy5wdXNoKHt4OnQueCx5OnQueX0pLGErPXQueCsiLCIrdC55KyIgIn0pLGgucHVzaChhKX0pLGguZm9yRWFjaChmdW5jdGlvbih0LGEpe3ZhciBuPWUucG9seWdvbnMuc3Ryb2tlQ29sb3JzLHI9ZS5ncmFwaGljcy5kcmF3UG9seWdvbih0LEFycmF5LmlzQXJyYXkobik/blthXTpuLGkuZ2xvYmFscy5yYWRhclBvbHlnb25zLmZpbGwuY29sb3JzW2FdKTtzLmFkZChyKX0pLGMuZm9yRWFjaChmdW5jdGlvbih0KXtzLmFkZCh0KX0pLGkuY29uZmlnLnlheGlzWzBdLnNob3cmJnRoaXMueWF4aXNMYWJlbHNUZXh0c1Bvcy5mb3JFYWNoKGZ1bmN0aW9uKHQsaSl7dmFyIHM9ZS5kcmF3WUF4aXNUZXh0KHQueCx0LnksaSxhW2ldKTtlLnlheGlzTGFiZWxzLmFkZChzKX0pfX0se2tleToiZHJhd1lBeGlzVGV4dCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkscyl7dmFyIGE9dGhpcy53LG49YS5jb25maWcueWF4aXNbMF0scj1hLmdsb2JhbHMueUxhYmVsRm9ybWF0dGVyc1swXTtyZXR1cm4gdGhpcy5ncmFwaGljcy5kcmF3VGV4dCh7eDp0K24ubGFiZWxzLm9mZnNldFgseTplK24ubGFiZWxzLm9mZnNldFksdGV4dDpyKHMsaSksdGV4dEFuY2hvcjoibWlkZGxlIixmb250U2l6ZTpuLmxhYmVscy5zdHlsZS5mb250U2l6ZSxmb250RmFtaWx5Om4ubGFiZWxzLnN0eWxlLmZvbnRGYW1pbHksZm9yZUNvbG9yOm4ubGFiZWxzLnN0eWxlLmNvbG9yfSl9fSx7a2V5OiJkcmF3TGFiZWxzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLncsaT0ibWlkZGxlIixzPWUuY29uZmlnLmRhdGFMYWJlbHMsYT10aGlzLmdyYXBoaWNzLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy1kYXRhbGFiZWxzIn0pLG49dGhpcy5nZXRQb2x5Z29uUG9zKHRoaXMuc2l6ZSkscj0wLG89MDtyZXR1cm4gZS5nbG9iYWxzLmxhYmVscy5mb3JFYWNoKGZ1bmN0aW9uKGwsaCl7dmFyIGM9cy5mb3JtYXR0ZXIsZD1uZXcgeih0LmN0eCk7aWYobltoXSl7cj1uW2hdLngsbz1uW2hdLnksTWF0aC5hYnMobltoXS54KT49MTA/bltoXS54PjA/KGk9InN0YXJ0IixyKz0xMCk6bltoXS54PDAmJihpPSJlbmQiLHItPTEwKTppPSJtaWRkbGUiLE1hdGguYWJzKG5baF0ueSk+PXQuc2l6ZS0xMCYmKG5baF0ueTwwP28tPTEwOm5baF0ueT4wJiYobys9MTApKTt2YXIgdT1jKGwse3Nlcmllc0luZGV4Oi0xLGRhdGFQb2ludEluZGV4OmgsdzplfSk7ZC5wbG90RGF0YUxhYmVsc1RleHQoe3g6cix5Om8sdGV4dDp1LHRleHRBbmNob3I6aSxpOmgsajpoLHBhcmVudDphLGRhdGFMYWJlbHNDb25maWc6cyxvZmZzZXRDb3JyZWN0aW9uOiExfSl9fSksYX19LHtrZXk6ImNyZWF0ZVBhdGhzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMscz1bXSxhPVtdLG49W10scj1bXTtpZih0Lmxlbmd0aCl7YT1bdGhpcy5ncmFwaGljcy5tb3ZlKGUueCxlLnkpXSxyPVt0aGlzLmdyYXBoaWNzLm1vdmUoZS54LGUueSldO3ZhciBvPXRoaXMuZ3JhcGhpY3MubW92ZSh0WzBdLngsdFswXS55KSxsPXRoaXMuZ3JhcGhpY3MubW92ZSh0WzBdLngsdFswXS55KTt0LmZvckVhY2goZnVuY3Rpb24oZSxzKXtvKz1pLmdyYXBoaWNzLmxpbmUoZS54LGUueSksbCs9aS5ncmFwaGljcy5saW5lKGUueCxlLnkpLHM9PT10Lmxlbmd0aC0xJiYobys9IloiLGwrPSJaIil9KSxzLnB1c2gobyksbi5wdXNoKGwpfXJldHVybntsaW5lUGF0aHNGcm9tOmEsbGluZVBhdGhzVG86cyxhcmVhUGF0aHNGcm9tOnIsYXJlYVBhdGhzVG86bn19fSx7a2V5OiJnZXRQYXRoRnJvbSIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMudyxpPW51bGwscz0wO3M8ZS5nbG9iYWxzLnByZXZpb3VzUGF0aHMubGVuZ3RoO3MrKyl7dmFyIGE9ZS5nbG9iYWxzLnByZXZpb3VzUGF0aHNbc107YS5wYXRocy5sZW5ndGg+MCYmcGFyc2VJbnQoYS5yZWFsSW5kZXgpPT09cGFyc2VJbnQodCkmJnZvaWQgMCE9PWUuZ2xvYmFscy5wcmV2aW91c1BhdGhzW3NdLnBhdGhzWzBdJiYoaT1lLmdsb2JhbHMucHJldmlvdXNQYXRoc1tzXS5wYXRoc1swXS5kKX1yZXR1cm4gaX19LHtrZXk6ImdldERhdGFQb2ludHNQb3MiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnRoaXMuZGF0YVBvaW50c0xlbjt0PXR8fFtdLGU9ZXx8W107Zm9yKHZhciBzPVtdLGE9MDthPGk7YSsrKXt2YXIgbj17fTtuLng9dFthXSpNYXRoLnNpbihlW2FdKSxuLnk9LXRbYV0qTWF0aC5jb3MoZVthXSkscy5wdXNoKG4pfXJldHVybiBzfX0se2tleToiZ2V0UG9seWdvblBvcyIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9MipNYXRoLlBJL3RoaXMuZGF0YVBvaW50c0xlbixzPTA7czx0aGlzLmRhdGFQb2ludHNMZW47cysrKXt2YXIgYT17fTthLng9dCpNYXRoLnNpbihzKmkpLGEueT0tdCpNYXRoLmNvcyhzKmkpLGUucHVzaChhKX1yZXR1cm4gZX19XSksdH0oKSxSPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGkodCl7dmFyIHM7ZSh0aGlzLGkpLChzPWModGhpcyxsKGkpLmNhbGwodGhpcyx0KSkpLmN0eD10LHMudz10Lncscy5hbmltQmVnaW5BcnI9WzBdLHMuYW5pbUR1cj0wO3ZhciBhPXMudztyZXR1cm4gcy5zdGFydEFuZ2xlPWEuY29uZmlnLnBsb3RPcHRpb25zLnJhZGlhbEJhci5zdGFydEFuZ2xlLHMuZW5kQW5nbGU9YS5jb25maWcucGxvdE9wdGlvbnMucmFkaWFsQmFyLmVuZEFuZ2xlLHMudHJhY2tTdGFydEFuZ2xlPWEuY29uZmlnLnBsb3RPcHRpb25zLnJhZGlhbEJhci50cmFjay5zdGFydEFuZ2xlLHMudHJhY2tFbmRBbmdsZT1hLmNvbmZpZy5wbG90T3B0aW9ucy5yYWRpYWxCYXIudHJhY2suZW5kQW5nbGUscy5yYWRpYWxEYXRhTGFiZWxzPWEuY29uZmlnLnBsb3RPcHRpb25zLnJhZGlhbEJhci5kYXRhTGFiZWxzLHMudHJhY2tTdGFydEFuZ2xlfHwocy50cmFja1N0YXJ0QW5nbGU9cy5zdGFydEFuZ2xlKSxzLnRyYWNrRW5kQW5nbGV8fChzLnRyYWNrRW5kQW5nbGU9cy5lbmRBbmdsZSksMzYwPT09cy5lbmRBbmdsZSYmKHMuZW5kQW5nbGU9MzU5Ljk5KSxzLmZ1bGxBbmdsZT0zNjAtYS5jb25maWcucGxvdE9wdGlvbnMucmFkaWFsQmFyLmVuZEFuZ2xlLWEuY29uZmlnLnBsb3RPcHRpb25zLnJhZGlhbEJhci5zdGFydEFuZ2xlLHMubWFyZ2luPXBhcnNlSW50KGEuY29uZmlnLnBsb3RPcHRpb25zLnJhZGlhbEJhci50cmFjay5tYXJnaW4pLHN9cmV0dXJuIG8oaSxZKSxzKGksW3trZXk6ImRyYXciLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudyxpPW5ldyBwKHRoaXMuY3R4KSxzPWkuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLXJhZGlhbGJhciJ9KTtpZihlLmdsb2JhbHMubm9EYXRhKXJldHVybiBzO3ZhciBhPWkuZ3JvdXAoKSxuPXRoaXMuZGVmYXVsdFNpemUvMixyPWUuZ2xvYmFscy5ncmlkV2lkdGgvMixvPXRoaXMuZGVmYXVsdFNpemUvMi4wNS1lLmNvbmZpZy5zdHJva2Uud2lkdGgtZS5jb25maWcuY2hhcnQuZHJvcFNoYWRvdy5ibHVyO3ZvaWQgMCE9PWUuY29uZmlnLnBsb3RPcHRpb25zLnJhZGlhbEJhci5zaXplJiYobz1lLmNvbmZpZy5wbG90T3B0aW9ucy5yYWRpYWxCYXIuc2l6ZSk7dmFyIGw9ZS5nbG9iYWxzLmZpbGwuY29sb3JzO2lmKGUuY29uZmlnLnBsb3RPcHRpb25zLnJhZGlhbEJhci50cmFjay5zaG93KXt2YXIgaD10aGlzLmRyYXdUcmFja3Moe3NpemU6byxjZW50ZXJYOnIsY2VudGVyWTpuLGNvbG9yQXJyOmwsc2VyaWVzOnR9KTthLmFkZChoKX12YXIgYz10aGlzLmRyYXdBcmNzKHtzaXplOm8sY2VudGVyWDpyLGNlbnRlclk6bixjb2xvckFycjpsLHNlcmllczp0fSksZD0zNjA7ZS5jb25maWcucGxvdE9wdGlvbnMucmFkaWFsQmFyLnN0YXJ0QW5nbGU8MCYmKGQ9TWF0aC5hYnMoZS5jb25maWcucGxvdE9wdGlvbnMucmFkaWFsQmFyLmVuZEFuZ2xlLWUuY29uZmlnLnBsb3RPcHRpb25zLnJhZGlhbEJhci5zdGFydEFuZ2xlKSk7dmFyIHU9KDM2MC1kKS8zNjA7aWYoZS5nbG9iYWxzLnJhZGlhbFNpemU9by1vKnUsdGhpcy5yYWRpYWxEYXRhTGFiZWxzLnZhbHVlLnNob3cpe3ZhciBnPU1hdGgubWF4KHRoaXMucmFkaWFsRGF0YUxhYmVscy52YWx1ZS5vZmZzZXRZLHRoaXMucmFkaWFsRGF0YUxhYmVscy5uYW1lLm9mZnNldFkpO2UuZ2xvYmFscy5yYWRpYWxTaXplKz1nKnV9cmV0dXJuIGEuYWRkKGMuZyksImZyb250Ij09PWUuY29uZmlnLnBsb3RPcHRpb25zLnJhZGlhbEJhci5ob2xsb3cucG9zaXRpb24mJihjLmcuYWRkKGMuZWxIb2xsb3cpLGMuZGF0YUxhYmVscyYmYy5nLmFkZChjLmRhdGFMYWJlbHMpKSxzLmFkZChhKSxzfX0se2tleToiZHJhd1RyYWNrcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53LGk9bmV3IHAodGhpcy5jdHgpLHM9aS5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMtdHJhY2tzIn0pLGE9bmV3IGcodGhpcy5jdHgpLG49bmV3IEModGhpcy5jdHgpLHI9dGhpcy5nZXRTdHJva2VXaWR0aCh0KTt0LnNpemU9dC5zaXplLXIvMjtmb3IodmFyIG89MDtvPHQuc2VyaWVzLmxlbmd0aDtvKyspe3ZhciBsPWkuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLXJhZGlhbGJhci10cmFjayBhcGV4Y2hhcnRzLXRyYWNrIn0pO3MuYWRkKGwpLGwuYXR0cih7cmVsOm8rMX0pLHQuc2l6ZT10LnNpemUtci10aGlzLm1hcmdpbjt2YXIgaD1lLmNvbmZpZy5wbG90T3B0aW9ucy5yYWRpYWxCYXIudHJhY2ssYz1uLmZpbGxQYXRoKHtzZXJpZXNOdW1iZXI6MCxzaXplOnQuc2l6ZSxmaWxsQ29sb3JzOkFycmF5LmlzQXJyYXkoaC5iYWNrZ3JvdW5kKT9oLmJhY2tncm91bmRbb106aC5iYWNrZ3JvdW5kLHNvbGlkOiEwfSksZD10aGlzLnRyYWNrU3RhcnRBbmdsZSx1PXRoaXMudHJhY2tFbmRBbmdsZTtNYXRoLmFicyh1KStNYXRoLmFicyhkKT49MzYwJiYodT0zNjAtTWF0aC5hYnModGhpcy5zdGFydEFuZ2xlKS0uMSk7dmFyIGY9aS5kcmF3UGF0aCh7ZDoiIixzdHJva2U6YyxzdHJva2VXaWR0aDpyKnBhcnNlSW50KGguc3Ryb2tlV2lkdGgpLzEwMCxmaWxsOiJub25lIixzdHJva2VPcGFjaXR5Omgub3BhY2l0eSxjbGFzc2VzOiJhcGV4Y2hhcnRzLXJhZGlhbGJhci1hcmVhIn0pO2lmKGguZHJvcFNoYWRvdy5lbmFibGVkKXt2YXIgeD1oLmRyb3BTaGFkb3c7YS5kcm9wU2hhZG93KGYseCl9bC5hZGQoZiksZi5hdHRyKCJpZCIsImFwZXhjaGFydHMtcmFkaWFsYmFyVHJhY2stIitvKSx0aGlzLmFuaW1hdGVQYXRocyhmLHtjZW50ZXJYOnQuY2VudGVyWCxjZW50ZXJZOnQuY2VudGVyWSxlbmRBbmdsZTp1LHN0YXJ0QW5nbGU6ZCxzaXplOnQuc2l6ZSxpOm8sdG90YWxJdGVtczoyLGFuaW1CZWdpbkFycjowLGR1cjowLGlzVHJhY2s6ITAsZWFzaW5nOmUuZ2xvYmFscy5lYXNpbmd9KX1yZXR1cm4gc319LHtrZXk6ImRyYXdBcmNzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLncsaT1uZXcgcCh0aGlzLmN0eCkscz1uZXcgQyh0aGlzLmN0eCksYT1uZXcgZyh0aGlzLmN0eCksbj1pLmdyb3VwKCkscj10aGlzLmdldFN0cm9rZVdpZHRoKHQpO3Quc2l6ZT10LnNpemUtci8yO3ZhciBvPWUuY29uZmlnLnBsb3RPcHRpb25zLnJhZGlhbEJhci5ob2xsb3cuYmFja2dyb3VuZCxsPXQuc2l6ZS1yKnQuc2VyaWVzLmxlbmd0aC10aGlzLm1hcmdpbip0LnNlcmllcy5sZW5ndGgtcipwYXJzZUludChlLmNvbmZpZy5wbG90T3B0aW9ucy5yYWRpYWxCYXIudHJhY2suc3Ryb2tlV2lkdGgpLzEwMC8yLGg9bC1lLmNvbmZpZy5wbG90T3B0aW9ucy5yYWRpYWxCYXIuaG9sbG93Lm1hcmdpbjt2b2lkIDAhPT1lLmNvbmZpZy5wbG90T3B0aW9ucy5yYWRpYWxCYXIuaG9sbG93LmltYWdlJiYobz10aGlzLmRyYXdIb2xsb3dJbWFnZSh0LG4sbCxvKSk7dmFyIGM9dGhpcy5kcmF3SG9sbG93KHtzaXplOmgsY2VudGVyWDp0LmNlbnRlclgsY2VudGVyWTp0LmNlbnRlclksZmlsbDpvfSk7aWYoZS5jb25maWcucGxvdE9wdGlvbnMucmFkaWFsQmFyLmhvbGxvdy5kcm9wU2hhZG93LmVuYWJsZWQpe3ZhciBkPWUuY29uZmlnLnBsb3RPcHRpb25zLnJhZGlhbEJhci5ob2xsb3cuZHJvcFNoYWRvdzthLmRyb3BTaGFkb3coYyxkKX12YXIgZj0xOyF0aGlzLnJhZGlhbERhdGFMYWJlbHMudG90YWwuc2hvdyYmZS5nbG9iYWxzLnNlcmllcy5sZW5ndGg+MSYmKGY9MCk7dmFyIHg9bnVsbDt0aGlzLnJhZGlhbERhdGFMYWJlbHMuc2hvdyYmKHg9dGhpcy5yZW5kZXJJbm5lckRhdGFMYWJlbHModGhpcy5yYWRpYWxEYXRhTGFiZWxzLHtob2xsb3dTaXplOmwsY2VudGVyWDp0LmNlbnRlclgsY2VudGVyWTp0LmNlbnRlclksb3BhY2l0eTpmfSkpLCJiYWNrIj09PWUuY29uZmlnLnBsb3RPcHRpb25zLnJhZGlhbEJhci5ob2xsb3cucG9zaXRpb24mJihuLmFkZChjKSx4JiZuLmFkZCh4KSk7dmFyIGI9ITE7ZS5jb25maWcucGxvdE9wdGlvbnMucmFkaWFsQmFyLmludmVyc2VPcmRlciYmKGI9ITApO2Zvcih2YXIgbT1iP3Quc2VyaWVzLmxlbmd0aC0xOjA7Yj9tPj0wOm08dC5zZXJpZXMubGVuZ3RoO2I/bS0tOm0rKyl7dmFyIHY9aS5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMtc2VyaWVzIGFwZXhjaGFydHMtcmFkaWFsLXNlcmllcyIsc2VyaWVzTmFtZTp1LmVzY2FwZVN0cmluZyhlLmdsb2JhbHMuc2VyaWVzTmFtZXNbbV0pfSk7bi5hZGQodiksdi5hdHRyKHtyZWw6bSsxLCJkYXRhOnJlYWxJbmRleCI6bX0pLHRoaXMuY3R4LnNlcmllcy5hZGRDb2xsYXBzZWRDbGFzc1RvU2VyaWVzKHYsbSksdC5zaXplPXQuc2l6ZS1yLXRoaXMubWFyZ2luO3ZhciB5PXMuZmlsbFBhdGgoe3Nlcmllc051bWJlcjptLHNpemU6dC5zaXplLHZhbHVlOnQuc2VyaWVzW21dfSksdz10aGlzLnN0YXJ0QW5nbGUsaz12b2lkIDAsQT1NYXRoLmFicyhlLmNvbmZpZy5wbG90T3B0aW9ucy5yYWRpYWxCYXIuZW5kQW5nbGUtZS5jb25maWcucGxvdE9wdGlvbnMucmFkaWFsQmFyLnN0YXJ0QW5nbGUpLFM9dS5uZWdUb1plcm8odC5zZXJpZXNbbV0+MTAwPzEwMDp0LnNlcmllc1ttXSkvMTAwLEw9TWF0aC5yb3VuZChBKlMpK3RoaXMuc3RhcnRBbmdsZSxQPXZvaWQgMDtlLmdsb2JhbHMuZGF0YUNoYW5nZWQmJihrPXRoaXMuc3RhcnRBbmdsZSxQPU1hdGgucm91bmQoQSp1Lm5lZ1RvWmVybyhlLmdsb2JhbHMucHJldmlvdXNQYXRoc1ttXSkvMTAwKStrKSxNYXRoLmFicyhMKStNYXRoLmFicyh3KT49MzYwJiYoTC09LjAxKSxNYXRoLmFicyhQKStNYXRoLmFicyhrKT49MzYwJiYoUC09LjAxKTt2YXIgej1MLXcsTT1BcnJheS5pc0FycmF5KGUuY29uZmlnLnN0cm9rZS5kYXNoQXJyYXkpP2UuY29uZmlnLnN0cm9rZS5kYXNoQXJyYXlbbV06ZS5jb25maWcuc3Ryb2tlLmRhc2hBcnJheSxFPWkuZHJhd1BhdGgoe2Q6IiIsc3Ryb2tlOnksc3Ryb2tlV2lkdGg6cixmaWxsOiJub25lIixmaWxsT3BhY2l0eTplLmNvbmZpZy5maWxsLm9wYWNpdHksY2xhc3NlczoiYXBleGNoYXJ0cy1yYWRpYWxiYXItYXJlYSBhcGV4Y2hhcnRzLXJhZGlhbGJhci1zbGljZS0iK20sc3Ryb2tlRGFzaEFycmF5Ok19KTtpZihwLnNldEF0dHJzKEUubm9kZSx7ImRhdGE6YW5nbGUiOnosImRhdGE6dmFsdWUiOnQuc2VyaWVzW21dfSksZS5jb25maWcuY2hhcnQuZHJvcFNoYWRvdy5lbmFibGVkKXt2YXIgVD1lLmNvbmZpZy5jaGFydC5kcm9wU2hhZG93O2EuZHJvcFNoYWRvdyhFLFQsbSl9dGhpcy5hZGRMaXN0ZW5lcnMoRSx0aGlzLnJhZGlhbERhdGFMYWJlbHMpLHYuYWRkKEUpLEUuYXR0cih7aW5kZXg6MCxqOm19KTt2YXIgWD0wOyF0aGlzLmluaXRpYWxBbmltfHxlLmdsb2JhbHMucmVzaXplZHx8ZS5nbG9iYWxzLmRhdGFDaGFuZ2VkfHwoWD0oTC13KS8zNjAqZS5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5zcGVlZCx0aGlzLmFuaW1EdXI9WC8oMS4yKnQuc2VyaWVzLmxlbmd0aCkrdGhpcy5hbmltRHVyLHRoaXMuYW5pbUJlZ2luQXJyLnB1c2godGhpcy5hbmltRHVyKSksZS5nbG9iYWxzLmRhdGFDaGFuZ2VkJiYoWD0oTC13KS8zNjAqZS5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5keW5hbWljQW5pbWF0aW9uLnNwZWVkLHRoaXMuYW5pbUR1cj1YLygxLjIqdC5zZXJpZXMubGVuZ3RoKSt0aGlzLmFuaW1EdXIsdGhpcy5hbmltQmVnaW5BcnIucHVzaCh0aGlzLmFuaW1EdXIpKSx0aGlzLmFuaW1hdGVQYXRocyhFLHtjZW50ZXJYOnQuY2VudGVyWCxjZW50ZXJZOnQuY2VudGVyWSxlbmRBbmdsZTpMLHN0YXJ0QW5nbGU6dyxwcmV2RW5kQW5nbGU6UCxwcmV2U3RhcnRBbmdsZTprLHNpemU6dC5zaXplLGk6bSx0b3RhbEl0ZW1zOjIsYW5pbUJlZ2luQXJyOnRoaXMuYW5pbUJlZ2luQXJyLGR1cjpYLHNob3VsZFNldFByZXZQYXRoczohMCxlYXNpbmc6ZS5nbG9iYWxzLmVhc2luZ30pfXJldHVybntnOm4sZWxIb2xsb3c6YyxkYXRhTGFiZWxzOnh9fX0se2tleToiZHJhd0hvbGxvdyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHAodGhpcy5jdHgpLmRyYXdDaXJjbGUoMip0LnNpemUpO3JldHVybiBlLmF0dHIoe2NsYXNzOiJhcGV4Y2hhcnRzLXJhZGlhbGJhci1ob2xsb3ciLGN4OnQuY2VudGVyWCxjeTp0LmNlbnRlclkscjp0LnNpemUsZmlsbDp0LmZpbGx9KSxlfX0se2tleToiZHJhd0hvbGxvd0ltYWdlIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxzKXt2YXIgYT10aGlzLncsbj1uZXcgQyh0aGlzLmN0eCkscj0oTWF0aC5yYW5kb20oKSsxKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDQpLG89YS5jb25maWcucGxvdE9wdGlvbnMucmFkaWFsQmFyLmhvbGxvdy5pbWFnZTtpZihhLmNvbmZpZy5wbG90T3B0aW9ucy5yYWRpYWxCYXIuaG9sbG93LmltYWdlQ2xpcHBlZCluLmNsaXBwZWRJbWdBcmVhKHt3aWR0aDppLGhlaWdodDppLGltYWdlOm8scGF0dGVybklEOiJwYXR0ZXJuIi5jb25jYXQoYS5nbG9iYWxzLmN1aWQpLmNvbmNhdChyKX0pLHM9InVybCgjcGF0dGVybiIuY29uY2F0KGEuZ2xvYmFscy5jdWlkKS5jb25jYXQociwiKSIpO2Vsc2V7dmFyIGw9YS5jb25maWcucGxvdE9wdGlvbnMucmFkaWFsQmFyLmhvbGxvdy5pbWFnZVdpZHRoLGg9YS5jb25maWcucGxvdE9wdGlvbnMucmFkaWFsQmFyLmhvbGxvdy5pbWFnZUhlaWdodDtpZih2b2lkIDA9PT1sJiZ2b2lkIDA9PT1oKXt2YXIgYz1hLmdsb2JhbHMuZG9tLlBhcGVyLmltYWdlKG8pLmxvYWRlZChmdW5jdGlvbihlKXt0aGlzLm1vdmUodC5jZW50ZXJYLWUud2lkdGgvMithLmNvbmZpZy5wbG90T3B0aW9ucy5yYWRpYWxCYXIuaG9sbG93LmltYWdlT2Zmc2V0WCx0LmNlbnRlclktZS5oZWlnaHQvMithLmNvbmZpZy5wbG90T3B0aW9ucy5yYWRpYWxCYXIuaG9sbG93LmltYWdlT2Zmc2V0WSl9KTtlLmFkZChjKX1lbHNle3ZhciBkPWEuZ2xvYmFscy5kb20uUGFwZXIuaW1hZ2UobykubG9hZGVkKGZ1bmN0aW9uKGUpe3RoaXMubW92ZSh0LmNlbnRlclgtbC8yK2EuY29uZmlnLnBsb3RPcHRpb25zLnJhZGlhbEJhci5ob2xsb3cuaW1hZ2VPZmZzZXRYLHQuY2VudGVyWS1oLzIrYS5jb25maWcucGxvdE9wdGlvbnMucmFkaWFsQmFyLmhvbGxvdy5pbWFnZU9mZnNldFkpLHRoaXMuc2l6ZShsLGgpfSk7ZS5hZGQoZCl9fXJldHVybiBzfX0se2tleToiZ2V0U3Ryb2tlV2lkdGgiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudztyZXR1cm4gdC5zaXplKigxMDAtcGFyc2VJbnQoZS5jb25maWcucGxvdE9wdGlvbnMucmFkaWFsQmFyLmhvbGxvdy5zaXplKSkvMTAwLyh0LnNlcmllcy5sZW5ndGgrMSktdGhpcy5tYXJnaW59fV0pLGl9KCksRD1mdW5jdGlvbih0KXtmdW5jdGlvbiBpKCl7cmV0dXJuIGUodGhpcyxpKSxjKHRoaXMsbChpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfXJldHVybiBvKGksTSkscyhpLFt7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudyxzPW5ldyBwKHRoaXMuY3R4KSxhPW5ldyBDKHRoaXMuY3R4KTt0aGlzLnJhbmdlQmFyT3B0aW9ucz10aGlzLncuY29uZmlnLnBsb3RPcHRpb25zLnJhbmdlQmFyLHRoaXMuc2VyaWVzPXQsdGhpcy5zZXJpZXNSYW5nZVN0YXJ0PWkuZ2xvYmFscy5zZXJpZXNSYW5nZVN0YXJ0LHRoaXMuc2VyaWVzUmFuZ2VFbmQ9aS5nbG9iYWxzLnNlcmllc1JhbmdlRW5kLHRoaXMuaW5pdFZhcmlhYmxlcyh0KTtmb3IodmFyIG49cy5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMtcmFuZ2ViYXItc2VyaWVzIGFwZXhjaGFydHMtcGxvdC1zZXJpZXMifSkscj0wLG89MDtyPHQubGVuZ3RoO3IrKyxvKyspe3ZhciBsLGgsYyxkLGc9dm9pZCAwLGY9dm9pZCAwLHg9dm9pZCAwLGI9dm9pZCAwLG09W10sdj1bXSx5PWkuZ2xvYmFscy5jb21ib0NoYXJ0cz9lW3JdOnIsdz1zLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy1zZXJpZXMiLHNlcmllc05hbWU6dS5lc2NhcGVTdHJpbmcoaS5nbG9iYWxzLnNlcmllc05hbWVzW3ldKSxyZWw6cisxLCJkYXRhOnJlYWxJbmRleCI6eX0pO3Rbcl0ubGVuZ3RoPjAmJih0aGlzLnZpc2libGVJPXRoaXMudmlzaWJsZUkrMSk7dmFyIGs9MCxBPTAsUz0wO3RoaXMueVJhdGlvLmxlbmd0aD4xJiYodGhpcy55YXhpc0luZGV4PXkpO3ZhciBMPXRoaXMuaW5pdGlhbFBvc2l0aW9ucygpO2I9TC55LGg9TC55RGl2aXNpb24sQT1MLmJhckhlaWdodCxkPUwuemVyb1cseD1MLngsUz1MLmJhcldpZHRoLGw9TC54RGl2aXNpb24sYz1MLnplcm9ILHYucHVzaCh4K1MvMik7Zm9yKHZhciBQPXMuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLWRhdGFsYWJlbHMifSksej0wLE09aS5nbG9iYWxzLmRhdGFQb2ludHM7ejxpLmdsb2JhbHMuZGF0YVBvaW50czt6KyssTS0tKXt2b2lkIDA9PT10aGlzLnNlcmllc1tyXVt6XXx8bnVsbD09PXRbcl1bel0/dGhpcy5pc051bGxWYWx1ZT0hMDp0aGlzLmlzTnVsbFZhbHVlPSExLGkuY29uZmlnLnN0cm9rZS5zaG93JiYoaz10aGlzLmlzTnVsbFZhbHVlPzA6QXJyYXkuaXNBcnJheSh0aGlzLnN0cm9rZVdpZHRoKT90aGlzLnN0cm9rZVdpZHRoW3ldOnRoaXMuc3Ryb2tlV2lkdGgpO3ZhciBFPW51bGw7dGhpcy5pc0hvcml6b250YWw/Uz0oRT10aGlzLmRyYXdSYW5nZUJhclBhdGhzKHtpbmRleGVzOntpOnIsajp6LHJlYWxJbmRleDp5LGJjOm99LGJhckhlaWdodDpBLHN0cm9rZVdpZHRoOmsscGF0aFRvOmcscGF0aEZyb206Zix6ZXJvVzpkLHg6eCx5OmIseURpdmlzaW9uOmgsZWxTZXJpZXM6d30pKS5iYXJXaWR0aDpBPShFPXRoaXMuZHJhd1JhbmdlQ29sdW1uUGF0aHMoe2luZGV4ZXM6e2k6cixqOnoscmVhbEluZGV4OnksYmM6b30seDp4LHk6Yix4RGl2aXNpb246bCxwYXRoVG86ZyxwYXRoRnJvbTpmLGJhcldpZHRoOlMsemVyb0g6YyxzdHJva2VXaWR0aDprLGVsU2VyaWVzOnd9KSkuYmFySGVpZ2h0LGc9RS5wYXRoVG8sZj1FLnBhdGhGcm9tLGI9RS55LHg9RS54LHo+MCYmdi5wdXNoKHgrUy8yKSxtLnB1c2goYik7dmFyIFQ9YS5maWxsUGF0aCh7c2VyaWVzTnVtYmVyOnl9KSxYPWkuZ2xvYmFscy5zdHJva2UuY29sb3JzW3ldO3c9dGhpcy5yZW5kZXJTZXJpZXMoe3JlYWxJbmRleDp5LHBhdGhGaWxsOlQsbGluZUZpbGw6WCxqOnosaTpyLHBhdGhGcm9tOmYscGF0aFRvOmcsc3Ryb2tlV2lkdGg6ayxlbFNlcmllczp3LHg6eCx5OmIsc2VyaWVzOnQsYmFySGVpZ2h0OkEsYmFyV2lkdGg6UyxlbERhdGFMYWJlbHNXcmFwOlAsdmlzaWJsZVNlcmllczp0aGlzLnZpc2libGVJLHR5cGU6InJhbmdlYmFyIn0pfWkuZ2xvYmFscy5zZXJpZXNYdmFsdWVzW3ldPXYsaS5nbG9iYWxzLnNlcmllc1l2YWx1ZXNbeV09bSxuLmFkZCh3KX1yZXR1cm4gbn19LHtrZXk6ImRyYXdSYW5nZUNvbHVtblBhdGhzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LmluZGV4ZXMsaT10Lngscz0odC55LHQuc3Ryb2tlV2lkdGgpLGE9dC54RGl2aXNpb24sbj10LnBhdGhUbyxyPXQucGF0aEZyb20sbz10LmJhcldpZHRoLGw9dC56ZXJvSCxoPXRoaXMudyxjPW5ldyBwKHRoaXMuY3R4KSxkPWUuaSx1PWUuaixnPXRoaXMueVJhdGlvW3RoaXMueWF4aXNJbmRleF0sZj1lLnJlYWxJbmRleCx4PXRoaXMuZ2V0UmFuZ2VWYWx1ZShmLHUpLGI9TWF0aC5taW4oeC5zdGFydCx4LmVuZCksbT1NYXRoLm1heCh4LnN0YXJ0LHguZW5kKTtoLmdsb2JhbHMuaXNYTnVtZXJpYyYmKGk9KGguZ2xvYmFscy5zZXJpZXNYW2RdW3VdLWguZ2xvYmFscy5taW5YKS90aGlzLnhSYXRpby1vLzIpO3ZhciB2PWkrbyp0aGlzLnZpc2libGVJO3ZvaWQgMD09PXRoaXMuc2VyaWVzW2RdW3VdfHxudWxsPT09dGhpcy5zZXJpZXNbZF1bdV0/Yj1sOihiPWwtYi9nLG09bC1tL2cpO3ZhciB5PU1hdGguYWJzKG0tYik7cmV0dXJuIGMubW92ZSh2LGwpLHI9Yy5tb3ZlKHYsYiksaC5nbG9iYWxzLnByZXZpb3VzUGF0aHMubGVuZ3RoPjAmJihyPXRoaXMuZ2V0UGF0aEZyb20oZix1LCEwKSksbj1jLm1vdmUodixtKStjLmxpbmUoditvLG0pK2MubGluZSh2K28sYikrYy5saW5lKHYsYikrYy5saW5lKHYsbS1zLzIpLHI9citjLm1vdmUodixiKStjLmxpbmUoditvLGIpK2MubGluZSh2K28sYikrYy5saW5lKHYsYiksaC5nbG9iYWxzLmlzWE51bWVyaWN8fChpKz1hKSx7cGF0aFRvOm4scGF0aEZyb206cixiYXJIZWlnaHQ6eSx4OmkseTptLGJhclhQb3NpdGlvbjp2fX19LHtrZXk6ImRyYXdSYW5nZUJhclBhdGhzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LmluZGV4ZXMsaT0odC54LHQueSkscz10LnlEaXZpc2lvbixhPXQucGF0aFRvLG49dC5wYXRoRnJvbSxyPXQuYmFySGVpZ2h0LG89dC56ZXJvVyxsPXRoaXMudyxoPW5ldyBwKHRoaXMuY3R4KSxjPWUuaSxkPWUuaix1PWUucmVhbEluZGV4LGc9byxmPW87bC5nbG9iYWxzLmlzWE51bWVyaWMmJihpPShsLmdsb2JhbHMuc2VyaWVzWFtjXVtkXS1sLmdsb2JhbHMubWluWCkvdGhpcy5pbnZlcnRlZFhSYXRpby1yKTt2YXIgeD1pK3IqdGhpcy52aXNpYmxlSTt2b2lkIDAhPT10aGlzLnNlcmllc1tjXVtkXSYmbnVsbCE9PXRoaXMuc2VyaWVzW2NdW2RdJiYoZz1vK3RoaXMuc2VyaWVzUmFuZ2VTdGFydFtjXVtkXS90aGlzLmludmVydGVkWVJhdGlvLGY9byt0aGlzLnNlcmllc1JhbmdlRW5kW2NdW2RdL3RoaXMuaW52ZXJ0ZWRZUmF0aW8pLGgubW92ZShvLHgpLG49aC5tb3ZlKG8seCksbC5nbG9iYWxzLnByZXZpb3VzUGF0aHMubGVuZ3RoPjAmJihuPXRoaXMuZ2V0UGF0aEZyb20odSxkKSk7dmFyIGI9TWF0aC5hYnMoZi1nKTtyZXR1cm4gYT1oLm1vdmUoZyx4KStoLmxpbmUoZix4KStoLmxpbmUoZix4K3IpK2gubGluZShnLHgrcikraC5saW5lKGcseCksbj1uK2gubGluZShnLHgpK2gubGluZShnLHgrcikraC5saW5lKGcseCtyKStoLmxpbmUoZyx4KSxsLmdsb2JhbHMuaXNYTnVtZXJpY3x8KGkrPXMpLHtwYXRoVG86YSxwYXRoRnJvbTpuLGJhcldpZHRoOmIseDpmLHk6aSxiYXJZUG9zaXRpb246eH19fSx7a2V5OiJnZXRSYW5nZVZhbHVlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudztyZXR1cm57c3RhcnQ6aS5nbG9iYWxzLnNlcmllc1JhbmdlU3RhcnRbdF1bZV0sZW5kOmkuZ2xvYmFscy5zZXJpZXNSYW5nZUVuZFt0XVtlXX19fV0pLGl9KCksTj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaSl7ZSh0aGlzLHQpLHRoaXMuY3R4PWksdGhpcy53PWkudyx0aGlzLnRvb2x0aXBLZXlGb3JtYXQ9ImRkIE1NTSJ9cmV0dXJuIHModCxbe2tleToieExhYmVsRm9ybWF0Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIHM9dGhpcy53O2lmKCJkYXRldGltZSI9PT1zLmNvbmZpZy54YXhpcy50eXBlJiYodm9pZCAwPT09cy5jb25maWcueGF4aXMubGFiZWxzLmZvcm1hdHRlciYmdm9pZCAwPT09cy5jb25maWcudG9vbHRpcC54LmZvcm1hdHRlcikpcmV0dXJuIG5ldyB2KHRoaXMuY3R4KS5mb3JtYXREYXRlKG5ldyBEYXRlKGUpLHMuY29uZmlnLnRvb2x0aXAueC5mb3JtYXQsITAsITApO3JldHVybiB0KGUsaSl9fSx7a2V5OiJzZXRMYWJlbEZvcm1hdHRlcnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53O3JldHVybiB0Lmdsb2JhbHMueExhYmVsRm9ybWF0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0fSx0Lmdsb2JhbHMueGF4aXNUb29sdGlwRm9ybWF0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0fSx0Lmdsb2JhbHMudHRLZXlGb3JtYXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHQuZ2xvYmFscy50dFpGb3JtYXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHQuZ2xvYmFscy5sZWdlbmRGb3JtYXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHZvaWQgMCE9PXQuY29uZmlnLnhheGlzLmxhYmVscy5mb3JtYXR0ZXI/dC5nbG9iYWxzLnhMYWJlbEZvcm1hdHRlcj10LmNvbmZpZy54YXhpcy5sYWJlbHMuZm9ybWF0dGVyOnQuZ2xvYmFscy54TGFiZWxGb3JtYXR0ZXI9ZnVuY3Rpb24oZSl7aWYodS5pc051bWJlcihlKSl7aWYoIm51bWVyaWMiPT09dC5jb25maWcueGF4aXMudHlwZSYmdC5nbG9iYWxzLmRhdGFQb2ludHM8NTApcmV0dXJuIGUudG9GaXhlZCgxKTtpZih0Lmdsb2JhbHMuaXNCYXJIb3Jpem9udGFsKWlmKHQuZ2xvYmFscy5tYXhZLXQuZ2xvYmFscy5taW5ZQXJyPDQpcmV0dXJuIGUudG9GaXhlZCgxKTtyZXR1cm4gZS50b0ZpeGVkKDApfXJldHVybiBlfSwiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25maWcudG9vbHRpcC54LmZvcm1hdHRlcj90Lmdsb2JhbHMudHRLZXlGb3JtYXR0ZXI9dC5jb25maWcudG9vbHRpcC54LmZvcm1hdHRlcjp0Lmdsb2JhbHMudHRLZXlGb3JtYXR0ZXI9dC5nbG9iYWxzLnhMYWJlbEZvcm1hdHRlciwiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25maWcueGF4aXMudG9vbHRpcC5mb3JtYXR0ZXImJih0Lmdsb2JhbHMueGF4aXNUb29sdGlwRm9ybWF0dGVyPXQuY29uZmlnLnhheGlzLnRvb2x0aXAuZm9ybWF0dGVyKSxBcnJheS5pc0FycmF5KHQuY29uZmlnLnRvb2x0aXAueSk/dC5nbG9iYWxzLnR0VmFsPXQuY29uZmlnLnRvb2x0aXAueTp2b2lkIDAhPT10LmNvbmZpZy50b29sdGlwLnkuZm9ybWF0dGVyJiYodC5nbG9iYWxzLnR0VmFsPXQuY29uZmlnLnRvb2x0aXAueSksdm9pZCAwIT09dC5jb25maWcudG9vbHRpcC56LmZvcm1hdHRlciYmKHQuZ2xvYmFscy50dFpGb3JtYXR0ZXI9dC5jb25maWcudG9vbHRpcC56LmZvcm1hdHRlciksdm9pZCAwIT09dC5jb25maWcubGVnZW5kLmZvcm1hdHRlciYmKHQuZ2xvYmFscy5sZWdlbmRGb3JtYXR0ZXI9dC5jb25maWcubGVnZW5kLmZvcm1hdHRlciksdC5jb25maWcueWF4aXMuZm9yRWFjaChmdW5jdGlvbihlLGkpe3ZvaWQgMCE9PWUubGFiZWxzLmZvcm1hdHRlcj90Lmdsb2JhbHMueUxhYmVsRm9ybWF0dGVyc1tpXT1lLmxhYmVscy5mb3JtYXR0ZXI6dC5nbG9iYWxzLnlMYWJlbEZvcm1hdHRlcnNbaV09ZnVuY3Rpb24ocyl7cmV0dXJuIHQuZ2xvYmFscy54eUNoYXJ0cyYmdS5pc051bWJlcihzKT8wIT09dC5nbG9iYWxzLnlWYWx1ZURlY2ltYWw/cy50b0ZpeGVkKHZvaWQgMCE9PWUuZGVjaW1hbHNJbkZsb2F0P2UuZGVjaW1hbHNJbkZsb2F0OnQuZ2xvYmFscy55VmFsdWVEZWNpbWFsKTp0Lmdsb2JhbHMubWF4WUFycltpXS10Lmdsb2JhbHMubWluWUFycltpXTwxMD9zLnRvRml4ZWQoMSk6cy50b0ZpeGVkKDApOnN9fSksdC5nbG9iYWxzfX0se2tleToiaGVhdG1hcExhYmVsRm9ybWF0dGVycyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnc7aWYoImhlYXRtYXAiPT09dC5jb25maWcuY2hhcnQudHlwZSl7dC5nbG9iYWxzLnlBeGlzU2NhbGVbMF0ucmVzdWx0PXQuZ2xvYmFscy5zZXJpZXNOYW1lcy5zbGljZSgpO3ZhciBlPXQuZ2xvYmFscy5zZXJpZXNOYW1lcy5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5sZW5ndGg+ZS5sZW5ndGg/dDplfSwwKTt0Lmdsb2JhbHMueUF4aXNTY2FsZVswXS5uaWNlTWF4PWUsdC5nbG9iYWxzLnlBeGlzU2NhbGVbMF0ubmljZU1pbj1lfX19XSksdH0oKSxPPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy5jdHg9aSx0aGlzLnc9aS53fXJldHVybiBzKHQsW3trZXk6ImdldExhYmVsIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxzKXt2YXIgYSxuPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTpbXSxyPXRoaXMudyxvPXZvaWQgMD09PXRbc10/IiI6dFtzXSxsPXIuZ2xvYmFscy54TGFiZWxGb3JtYXR0ZXIsaD1yLmNvbmZpZy54YXhpcy5sYWJlbHMuZm9ybWF0dGVyLGM9ITEsZD1vO2E9bmV3IE4odGhpcy5jdHgpLnhMYWJlbEZvcm1hdChsLG8sZCksdm9pZCAwIT09aCYmKGE9aChvLHRbc10scykpO3ZhciB1LGc7cmV0dXJuIGUubGVuZ3RoPjA/KHU9ZVtzXS51bml0LGc9bnVsbCxlLmZvckVhY2goZnVuY3Rpb24odCl7Im1vbnRoIj09PXQudW5pdD9nPSJ5ZWFyIjoiZGF5Ij09PXQudW5pdD9nPSJtb250aCI6ImhvdXIiPT09dC51bml0P2c9ImRheSI6Im1pbnV0ZSI9PT10LnVuaXQmJihnPSJob3VyIil9KSxjPWc9PT11LGk9ZVtzXS5wb3NpdGlvbixhPWVbc10udmFsdWUpOiJkYXRldGltZSI9PT1yLmNvbmZpZy54YXhpcy50eXBlJiZ2b2lkIDA9PT1oJiYoYT0iIiksdm9pZCAwPT09YSYmKGE9IiIpLCgwPT09KGE9YS50b1N0cmluZygpKS5pbmRleE9mKCJOYU4iKXx8MD09PWEudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJpbnZhbGlkIil8fGEudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJpbmZpbml0eSIpPj0wfHxuLmluZGV4T2YoYSk+PTAmJiFyLmNvbmZpZy54YXhpcy5sYWJlbHMuc2hvd0R1cGxpY2F0ZXMpJiYoYT0iIikse3g6aSx0ZXh0OmEsaXNCb2xkOmN9fX0se2tleToiZHJhd1lBeGlzVGlja3MiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLHMsYSxuLHIpe3ZhciBvPXRoaXMudyxsPW5ldyBwKHRoaXMuY3R4KSxoPW8uZ2xvYmFscy50cmFuc2xhdGVZO2lmKHMuc2hvdyl7ITA9PT1vLmNvbmZpZy55YXhpc1thXS5vcHBvc2l0ZSYmKHQrPXMud2lkdGgpO2Zvcih2YXIgYz1lO2M+PTA7Yy0tKXt2YXIgZD1oK2UvMTArby5jb25maWcueWF4aXNbYV0ubGFiZWxzLm9mZnNldFktMTtvLmdsb2JhbHMuaXNCYXJIb3Jpem9udGFsJiYoZD1uKmMpO3ZhciB1PWwuZHJhd0xpbmUodCtpLm9mZnNldFgtcy53aWR0aCtzLm9mZnNldFgsZCtzLm9mZnNldFksdCtpLm9mZnNldFgrcy5vZmZzZXRYLGQrcy5vZmZzZXRZLGkuY29sb3IpO3IuYWRkKHUpLGgrPW59fX19XSksdH0oKSxIPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy5jdHg9aSx0aGlzLnc9aS53O3ZhciBzPXRoaXMudzt0aGlzLnhheGlzRm9udFNpemU9cy5jb25maWcueGF4aXMubGFiZWxzLnN0eWxlLmZvbnRTaXplLHRoaXMuYXhpc0ZvbnRGYW1pbHk9cy5jb25maWcueGF4aXMubGFiZWxzLnN0eWxlLmZvbnRGYW1pbHksdGhpcy54YXhpc0ZvcmVDb2xvcnM9cy5jb25maWcueGF4aXMubGFiZWxzLnN0eWxlLmNvbG9ycyx0aGlzLnhBeGlzb2ZmWD0wLCJib3R0b20iPT09cy5jb25maWcueGF4aXMucG9zaXRpb24mJih0aGlzLnhBeGlzb2ZmWD1zLmdsb2JhbHMuZ3JpZEhlaWdodCksdGhpcy5kcmF3bkxhYmVscz1bXSx0aGlzLmF4ZXNVdGlscz1uZXcgTyhpKX1yZXR1cm4gcyh0LFt7a2V5OiJkcmF3WWF4aXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudyxpPW5ldyBwKHRoaXMuY3R4KSxzPWUuY29uZmlnLnlheGlzW3RdLmxhYmVscy5zdHlsZS5mb250U2l6ZSxhPWUuY29uZmlnLnlheGlzW3RdLmxhYmVscy5zdHlsZS5mb250RmFtaWx5LG49aS5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMteWF4aXMiLHJlbDp0LHRyYW5zZm9ybToidHJhbnNsYXRlKCIrZS5nbG9iYWxzLnRyYW5zbGF0ZVlBeGlzWFt0XSsiLCAwKSJ9KTtpZighZS5jb25maWcueWF4aXNbdF0uc2hvdylyZXR1cm4gbjt2YXIgcj1pLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy15YXhpcy10ZXh0cy1nIn0pO24uYWRkKHIpO3ZhciBvPWUuZ2xvYmFscy55QXhpc1NjYWxlW3RdLnJlc3VsdC5sZW5ndGgtMSxsPWUuZ2xvYmFscy5ncmlkSGVpZ2h0L28rLjEsaD1lLmdsb2JhbHMudHJhbnNsYXRlWSxjPWUuZ2xvYmFscy55TGFiZWxGb3JtYXR0ZXJzW3RdLGQ9ZS5nbG9iYWxzLnlBeGlzU2NhbGVbdF0ucmVzdWx0LnNsaWNlKCk7aWYoZS5jb25maWcueWF4aXNbdF0mJmUuY29uZmlnLnlheGlzW3RdLnJldmVyc2VkJiZkLnJldmVyc2UoKSxlLmNvbmZpZy55YXhpc1t0XS5sYWJlbHMuc2hvdylmb3IodmFyIHU9bzt1Pj0wO3UtLSl7dmFyIGc9ZFt1XTtnPWMoZyx1KTt2YXIgZj1lLmNvbmZpZy55YXhpc1t0XS5sYWJlbHMucGFkZGluZztlLmNvbmZpZy55YXhpc1t0XS5vcHBvc2l0ZSYmMCE9PWUuY29uZmlnLnlheGlzLmxlbmd0aCYmKGYqPS0xKTt2YXIgeD1pLmRyYXdUZXh0KHt4OmYseTpoK28vMTArZS5jb25maWcueWF4aXNbdF0ubGFiZWxzLm9mZnNldFkrMSx0ZXh0OmcsdGV4dEFuY2hvcjplLmNvbmZpZy55YXhpc1t0XS5vcHBvc2l0ZT8ic3RhcnQiOiJlbmQiLGZvbnRTaXplOnMsZm9udEZhbWlseTphLGZvcmVDb2xvcjplLmNvbmZpZy55YXhpc1t0XS5sYWJlbHMuc3R5bGUuY29sb3IsY3NzQ2xhc3M6ImFwZXhjaGFydHMteWF4aXMtbGFiZWwgIitlLmNvbmZpZy55YXhpc1t0XS5sYWJlbHMuc3R5bGUuY3NzQ2xhc3N9KTtyLmFkZCh4KTt2YXIgYj1pLnJvdGF0ZUFyb3VuZENlbnRlcih4Lm5vZGUpOzAhPT1lLmNvbmZpZy55YXhpc1t0XS5sYWJlbHMucm90YXRlJiZ4Lm5vZGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJyb3RhdGUoIi5jb25jYXQoZS5jb25maWcueWF4aXNbdF0ubGFiZWxzLnJvdGF0ZSwiICIpLmNvbmNhdChiLngsIiAiKS5jb25jYXQoYi55LCIpIikpLGgrPWx9aWYodm9pZCAwIT09ZS5jb25maWcueWF4aXNbdF0udGl0bGUudGV4dCl7dmFyIG09aS5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMteWF4aXMtdGl0bGUifSksdj0wO2UuY29uZmlnLnlheGlzW3RdLm9wcG9zaXRlJiYodj1lLmdsb2JhbHMudHJhbnNsYXRlWUF4aXNYW3RdKTt2YXIgeT1pLmRyYXdUZXh0KHt4OnYseTplLmdsb2JhbHMuZ3JpZEhlaWdodC8yK2UuZ2xvYmFscy50cmFuc2xhdGVZLHRleHQ6ZS5jb25maWcueWF4aXNbdF0udGl0bGUudGV4dCx0ZXh0QW5jaG9yOiJlbmQiLGZvcmVDb2xvcjplLmNvbmZpZy55YXhpc1t0XS50aXRsZS5zdHlsZS5jb2xvcixmb250U2l6ZTplLmNvbmZpZy55YXhpc1t0XS50aXRsZS5zdHlsZS5mb250U2l6ZSxmb250RmFtaWx5OmUuY29uZmlnLnlheGlzW3RdLnRpdGxlLnN0eWxlLmZvbnRGYW1pbHksY3NzQ2xhc3M6ImFwZXhjaGFydHMteWF4aXMtdGl0bGUtdGV4dCAiK2UuY29uZmlnLnlheGlzW3RdLnRpdGxlLnN0eWxlLmNzc0NsYXNzfSk7bS5hZGQoeSksbi5hZGQobSl9dmFyIHc9ZS5jb25maWcueWF4aXNbdF0uYXhpc0JvcmRlcjtpZih3LnNob3cpe3ZhciBrPTMxK3cub2Zmc2V0WDtlLmNvbmZpZy55YXhpc1t0XS5vcHBvc2l0ZSYmKGs9LTMxLXcub2Zmc2V0WCk7dmFyIEE9aS5kcmF3TGluZShrLGUuZ2xvYmFscy50cmFuc2xhdGVZK3cub2Zmc2V0WS0yLGssZS5nbG9iYWxzLmdyaWRIZWlnaHQrZS5nbG9iYWxzLnRyYW5zbGF0ZVkrdy5vZmZzZXRZKzIsdy5jb2xvcik7bi5hZGQoQSksdGhpcy5heGVzVXRpbHMuZHJhd1lBeGlzVGlja3MoayxvLHcsZS5jb25maWcueWF4aXNbdF0uYXhpc1RpY2tzLHQsbCxuKX1yZXR1cm4gbn19LHtrZXk6ImRyYXdZYXhpc0ludmVyc2VkIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLncsaT1uZXcgcCh0aGlzLmN0eCkscz1pLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy14YXhpcyBhcGV4Y2hhcnRzLXlheGlzLWludmVyc2VkIn0pLGE9aS5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMteGF4aXMtdGV4dHMtZyIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoIi5jb25jYXQoZS5nbG9iYWxzLnRyYW5zbGF0ZVhBeGlzWCwiLCAiKS5jb25jYXQoZS5nbG9iYWxzLnRyYW5zbGF0ZVhBeGlzWSwiKSIpfSk7cy5hZGQoYSk7dmFyIG49ZS5nbG9iYWxzLnlBeGlzU2NhbGVbdF0ucmVzdWx0Lmxlbmd0aC0xLHI9ZS5nbG9iYWxzLmdyaWRXaWR0aC9uKy4xLG89citlLmNvbmZpZy54YXhpcy5sYWJlbHMub2Zmc2V0WCxsPWUuZ2xvYmFscy54TGFiZWxGb3JtYXR0ZXIsaD1lLmdsb2JhbHMueUF4aXNTY2FsZVt0XS5yZXN1bHQuc2xpY2UoKSxjPWUuZ2xvYmFscy5pbnZlcnRlZFRpbWVsaW5lTGFiZWxzO2MubGVuZ3RoPjAmJih0aGlzLnhheGlzTGFiZWxzPWMuc2xpY2UoKSxuPShoPWMuc2xpY2UoKSkubGVuZ3RoKSxlLmNvbmZpZy55YXhpc1t0XSYmZS5jb25maWcueWF4aXNbdF0ucmV2ZXJzZWQmJmgucmV2ZXJzZSgpO3ZhciBkPWMubGVuZ3RoO2lmKGUuY29uZmlnLnhheGlzLmxhYmVscy5zaG93KWZvcih2YXIgdT1kPzA6bjtkP3U8ZC0xOnU+PTA7ZD91Kys6dS0tKXt2YXIgZz1oW3VdO2c9bChnLHUpO3ZhciBmPWUuZ2xvYmFscy5ncmlkV2lkdGgrZS5nbG9iYWxzLnBhZEhvcml6b250YWwtKG8tcitlLmNvbmZpZy54YXhpcy5sYWJlbHMub2Zmc2V0WCk7aWYoYy5sZW5ndGgpe3ZhciB4PXRoaXMuYXhlc1V0aWxzLmdldExhYmVsKGgsYyxmLHUsdGhpcy5kcmF3bkxhYmVscyk7Zj14LngsZz14LnRleHQsdGhpcy5kcmF3bkxhYmVscy5wdXNoKHgudGV4dCl9dmFyIGI9aS5kcmF3VGV4dCh7eDpmLHk6dGhpcy54QXhpc29mZlgrZS5jb25maWcueGF4aXMubGFiZWxzLm9mZnNldFkrMzAsdGV4dDoiIix0ZXh0QW5jaG9yOiJtaWRkbGUiLGZvcmVDb2xvcjpBcnJheS5pc0FycmF5KHRoaXMueGF4aXNGb3JlQ29sb3JzKT90aGlzLnhheGlzRm9yZUNvbG9yc1t0XTp0aGlzLnhheGlzRm9yZUNvbG9ycyxmb250U2l6ZTp0aGlzLnhheGlzRm9udFNpemUsZm9udEZhbWlseTp0aGlzLnhheGlzRm9udEZhbWlseSxjc3NDbGFzczoiYXBleGNoYXJ0cy14YXhpcy1sYWJlbCAiK2UuY29uZmlnLnhheGlzLmxhYmVscy5zdHlsZS5jc3NDbGFzc30pO2EuYWRkKGIpLGIudHNwYW4oZyk7dmFyIG09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGUuZ2xvYmFscy5TVkdOUywidGl0bGUiKTttLnRleHRDb250ZW50PWcsYi5ub2RlLmFwcGVuZENoaWxkKG0pLG8rPXJ9aWYodm9pZCAwIT09ZS5jb25maWcueGF4aXMudGl0bGUudGV4dCl7dmFyIHY9aS5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMteGF4aXMtdGl0bGUgYXBleGNoYXJ0cy15YXhpcy10aXRsZS1pbnZlcnNlZCJ9KSx5PWkuZHJhd1RleHQoe3g6ZS5nbG9iYWxzLmdyaWRXaWR0aC8yLHk6dGhpcy54QXhpc29mZlgrcGFyc2VJbnQodGhpcy54YXhpc0ZvbnRTaXplKStwYXJzZUludChlLmNvbmZpZy54YXhpcy50aXRsZS5zdHlsZS5mb250U2l6ZSkrMjAsdGV4dDplLmNvbmZpZy54YXhpcy50aXRsZS50ZXh0LHRleHRBbmNob3I6Im1pZGRsZSIsZm9udFNpemU6ZS5jb25maWcueGF4aXMudGl0bGUuc3R5bGUuZm9udFNpemUsZm9udEZhbWlseTplLmNvbmZpZy54YXhpcy50aXRsZS5zdHlsZS5mb250RmFtaWx5LGNzc0NsYXNzOiJhcGV4Y2hhcnRzLXhheGlzLXRpdGxlLXRleHQgIitlLmNvbmZpZy54YXhpcy50aXRsZS5zdHlsZS5jc3NDbGFzc30pO3YuYWRkKHkpLHMuYWRkKHYpfXZhciB3PWUuY29uZmlnLnlheGlzW3RdLmF4aXNCb3JkZXI7aWYody5zaG93KXt2YXIgaz1pLmRyYXdMaW5lKGUuZ2xvYmFscy5wYWRIb3Jpem9udGFsK3cub2Zmc2V0WCwxK3cub2Zmc2V0WSxlLmdsb2JhbHMucGFkSG9yaXpvbnRhbCt3Lm9mZnNldFgsZS5nbG9iYWxzLmdyaWRIZWlnaHQrdy5vZmZzZXRZLHcuY29sb3IpO3MuYWRkKGspfXJldHVybiBzfX0se2tleToieUF4aXNUaXRsZVJvdGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLncscz1uZXcgcCh0aGlzLmN0eCksYT17d2lkdGg6MCxoZWlnaHQ6MH0sbj17d2lkdGg6MCxoZWlnaHQ6MH0scj1pLmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIgLmFwZXhjaGFydHMteWF4aXNbcmVsPSciLmNvbmNhdCh0LCInXSAuYXBleGNoYXJ0cy15YXhpcy10ZXh0cy1nIikpO251bGwhPT1yJiYoYT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTt2YXIgbz1pLmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy15YXhpc1tyZWw9JyIuY29uY2F0KHQsIiddIC5hcGV4Y2hhcnRzLXlheGlzLXRpdGxlIHRleHQiKSk7aWYobnVsbCE9PW8mJihuPW8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLG51bGwhPT1vKXt2YXIgbD10aGlzLnhQYWRkaW5nRm9yWUF4aXNUaXRsZSh0LGEsbixlKTtvLnNldEF0dHJpYnV0ZSgieCIsbC54UG9zLShlPzEwOjApKX1pZihudWxsIT09byl7dmFyIGg9cy5yb3RhdGVBcm91bmRDZW50ZXIobyk7ZT9vLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwicm90YXRlKCIuY29uY2F0KGkuY29uZmlnLnlheGlzW3RdLnRpdGxlLnJvdGF0ZSwiICIpLmNvbmNhdChoLngsIiAiKS5jb25jYXQoaC55LCIpIikpOm8uc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJyb3RhdGUoLSIuY29uY2F0KGkuY29uZmlnLnlheGlzW3RdLnRpdGxlLnJvdGF0ZSwiICIpLmNvbmNhdChoLngsIiAiKS5jb25jYXQoaC55LCIpIikpfX19LHtrZXk6InhQYWRkaW5nRm9yWUF4aXNUaXRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkscyl7dmFyIGE9dGhpcy53LG49MCxyPTAsbz0xMDtyZXR1cm4gdm9pZCAwPT09YS5jb25maWcueWF4aXNbdF0udGl0bGUudGV4dHx8dDwwP3t4UG9zOnIscGFkZDowfToocz8ocj1lLndpZHRoK2EuY29uZmlnLnlheGlzW3RdLnRpdGxlLm9mZnNldFgraS53aWR0aC8yK28vMiwwPT09KG4rPTEpJiYoci09by8yKSk6KHI9LTEqZS53aWR0aCthLmNvbmZpZy55YXhpc1t0XS50aXRsZS5vZmZzZXRYK28vMitpLndpZHRoLzIsYS5nbG9iYWxzLmlzQmFySG9yaXpvbnRhbCYmKG89MjUscj0tMSplLndpZHRoLWEuY29uZmlnLnlheGlzW3RdLnRpdGxlLm9mZnNldFgtbykpLHt4UG9zOnIscGFkZDpvfSl9fSx7a2V5OiJzZXRZQXhpc1hQb3NpdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLncscz0wLGE9MCxuPTIxLHI9MTtpLmNvbmZpZy55YXhpcy5sZW5ndGg+MSYmKHRoaXMubXVsdGlwbGVZcz0hMCksaS5jb25maWcueWF4aXMubWFwKGZ1bmN0aW9uKG8sbCl7dmFyIGg9aS5nbG9iYWxzLmlnbm9yZVlBeGlzSW5kZXhlcy5pbmRleE9mKGwpPi0xfHwhby5zaG93fHxvLmZsb2F0aW5nfHwwPT09dFtsXS53aWR0aCxjPXRbbF0ud2lkdGgrZVtsXS53aWR0aDtvLm9wcG9zaXRlP2kuZ2xvYmFscy5pc0Jhckhvcml6b250YWw/KGE9aS5nbG9iYWxzLmdyaWRXaWR0aCtpLmdsb2JhbHMudHJhbnNsYXRlWC0xLGkuZ2xvYmFscy50cmFuc2xhdGVZQXhpc1hbbF09YS1vLmxhYmVscy5vZmZzZXRYKTooYT1pLmdsb2JhbHMuZ3JpZFdpZHRoK2kuZ2xvYmFscy50cmFuc2xhdGVYK3IsaHx8KHI9citjKzIwKSxpLmdsb2JhbHMudHJhbnNsYXRlWUF4aXNYW2xdPWEtby5sYWJlbHMub2Zmc2V0WCsyMCk6KHM9aS5nbG9iYWxzLnRyYW5zbGF0ZVgtbixofHwobj1uK2MrMjApLGkuZ2xvYmFscy50cmFuc2xhdGVZQXhpc1hbbF09cytvLmxhYmVscy5vZmZzZXRYKX0pfX0se2tleToic2V0WUF4aXNUZXh0QWxpZ25tZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLncsZT10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy15YXhpcyIpOyhlPXUubGlzdFRvQXJyYXkoZSkpLmZvckVhY2goZnVuY3Rpb24oZSxpKXt2YXIgcz10LmNvbmZpZy55YXhpc1tpXTtpZih2b2lkIDAhPT1zLmxhYmVscy5hbGlnbil7dmFyIGE9dC5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMteWF4aXNbcmVsPSciLmNvbmNhdChpLCInXSAuYXBleGNoYXJ0cy15YXhpcy10ZXh0cy1nIikpLG49dC5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvckFsbCgiLmFwZXhjaGFydHMteWF4aXNbcmVsPSciLmNvbmNhdChpLCInXSAuYXBleGNoYXJ0cy15YXhpcy1sYWJlbCIpKTtuPXUubGlzdFRvQXJyYXkobik7dmFyIHI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsibGVmdCI9PT1zLmxhYmVscy5hbGlnbj8obi5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dC5zZXRBdHRyaWJ1dGUoInRleHQtYW5jaG9yIiwic3RhcnQiKX0pLHMub3Bwb3NpdGV8fGEuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoLSIuY29uY2F0KHIud2lkdGgsIiwgMCkiKSkpOiJjZW50ZXIiPT09cy5sYWJlbHMuYWxpZ24/KG4uZm9yRWFjaChmdW5jdGlvbih0LGUpe3Quc2V0QXR0cmlidXRlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpfSksYS5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiLmNvbmNhdChyLndpZHRoLzIqKHMub3Bwb3NpdGU/MTotMSksIiwgMCkiKSkpOiJyaWdodCI9PT1zLmxhYmVscy5hbGlnbiYmKG4uZm9yRWFjaChmdW5jdGlvbih0LGUpe3Quc2V0QXR0cmlidXRlKCJ0ZXh0LWFuY2hvciIsImVuZCIpfSkscy5vcHBvc2l0ZSYmYS5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiLmNvbmNhdChyLndpZHRoLCIsIDApIikpKX19KX19XSksdH0oKSxXPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy5jdHg9aSx0aGlzLnc9aS53LHRoaXMubGdSZWN0PXt9LHRoaXMueUF4aXNXaWR0aD0wLHRoaXMueEF4aXNIZWlnaHQ9MCx0aGlzLmlzU3BhcmtsaW5lPXRoaXMudy5jb25maWcuY2hhcnQuc3BhcmtsaW5lLmVuYWJsZWQsdGhpcy54UGFkUmlnaHQ9MCx0aGlzLnhQYWRMZWZ0PTB9cmV0dXJuIHModCxbe2tleToicGxvdENvb3JkcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLncsZT10Lmdsb2JhbHMsaT10aGlzLmdldExlZ2VuZHNSZWN0KCk7ZS5heGlzQ2hhcnRzP3RoaXMuc2V0R3JpZENvb3Jkc0ZvckF4aXNDaGFydHMoaSk6dGhpcy5zZXRHcmlkQ29vcmRzRm9yTm9uQXhpc0NoYXJ0cyhpKSx0aGlzLnRpdGxlU3VidGl0bGVPZmZzZXQoKSxlLmdyaWRIZWlnaHQ9ZS5ncmlkSGVpZ2h0LXQuY29uZmlnLmdyaWQucGFkZGluZy50b3AtdC5jb25maWcuZ3JpZC5wYWRkaW5nLmJvdHRvbSxlLmdyaWRXaWR0aD1lLmdyaWRXaWR0aC10LmNvbmZpZy5ncmlkLnBhZGRpbmcubGVmdC10LmNvbmZpZy5ncmlkLnBhZGRpbmcucmlnaHQtdGhpcy54UGFkUmlnaHQtdGhpcy54UGFkTGVmdCxlLnRyYW5zbGF0ZVg9ZS50cmFuc2xhdGVYK3QuY29uZmlnLmdyaWQucGFkZGluZy5sZWZ0K3RoaXMueFBhZExlZnQsZS50cmFuc2xhdGVZPWUudHJhbnNsYXRlWSt0LmNvbmZpZy5ncmlkLnBhZGRpbmcudG9wfX0se2tleToiY29uZGl0aW9uYWxDaGVja3NGb3JBeGlzQ29vcmRzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudzt0aGlzLnhBeGlzSGVpZ2h0PSh0LmhlaWdodCtlLmhlaWdodCkqaS5nbG9iYWxzLkxJTkVfSEVJR0hUX1JBVElPKzE1LHRoaXMueEF4aXNXaWR0aD10LndpZHRoLHRoaXMueEF4aXNIZWlnaHQtZS5oZWlnaHQ+aS5jb25maWcueGF4aXMubGFiZWxzLm1heEhlaWdodCYmKHRoaXMueEF4aXNIZWlnaHQ9aS5jb25maWcueGF4aXMubGFiZWxzLm1heEhlaWdodCksaS5jb25maWcueGF4aXMubGFiZWxzLm1pbkhlaWdodCYmdGhpcy54QXhpc0hlaWdodDxpLmNvbmZpZy54YXhpcy5sYWJlbHMubWluSGVpZ2h0JiYodGhpcy54QXhpc0hlaWdodD1pLmNvbmZpZy54YXhpcy5sYWJlbHMubWluSGVpZ2h0KSxpLmNvbmZpZy54YXhpcy5mbG9hdGluZyYmKHRoaXMueEF4aXNIZWlnaHQ9MCksaS5nbG9iYWxzLmlzQmFySG9yaXpvbnRhbD90aGlzLnlBeGlzV2lkdGg9aS5nbG9iYWxzLnlMYWJlbHNDb29yZHNbMF0ud2lkdGgraS5nbG9iYWxzLnlUaXRsZUNvb3Jkc1swXS53aWR0aCsxNTp0aGlzLnlBeGlzV2lkdGg9dGhpcy5nZXRUb3RhbFlBeGlzV2lkdGgoKTt2YXIgcz0wLGE9MDtpLmNvbmZpZy55YXhpcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3MrPXQubGFiZWxzLm1pbldpZHRoLGErPXQubGFiZWxzLm1heFdpZHRofSksdGhpcy55QXhpc1dpZHRoPHMmJih0aGlzLnlBeGlzV2lkdGg9cyksdGhpcy55QXhpc1dpZHRoPmEmJih0aGlzLnlBeGlzV2lkdGg9YSl9fSx7a2V5OiJzZXRHcmlkQ29vcmRzRm9yQXhpc0NoYXJ0cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53LGk9ZS5nbG9iYWxzLHM9dGhpcy5nZXR5QXhpc0xhYmVsc0Nvb3JkcygpLGE9dGhpcy5nZXR4QXhpc0xhYmVsc0Nvb3JkcygpLG49dGhpcy5nZXR5QXhpc1RpdGxlQ29vcmRzKCkscj10aGlzLmdldHhBeGlzVGl0bGVDb29yZHMoKTtlLmdsb2JhbHMueUxhYmVsc0Nvb3Jkcz1bXSxlLmdsb2JhbHMueVRpdGxlQ29vcmRzPVtdLGUuY29uZmlnLnlheGlzLm1hcChmdW5jdGlvbih0LGkpe2UuZ2xvYmFscy55TGFiZWxzQ29vcmRzLnB1c2goe3dpZHRoOnNbaV0ud2lkdGgsaW5kZXg6aX0pLGUuZ2xvYmFscy55VGl0bGVDb29yZHMucHVzaCh7d2lkdGg6bltpXS53aWR0aCxpbmRleDppfSl9KSx0aGlzLmNvbmRpdGlvbmFsQ2hlY2tzRm9yQXhpc0Nvb3JkcyhhLHIpLGkudHJhbnNsYXRlWEF4aXNZPWUuZ2xvYmFscy5yb3RhdGVYTGFiZWxzP3RoaXMueEF4aXNIZWlnaHQvODotNCxpLnRyYW5zbGF0ZVhBeGlzWD1lLmdsb2JhbHMucm90YXRlWExhYmVscyYmZS5nbG9iYWxzLmlzWE51bWVyaWMmJmUuY29uZmlnLnhheGlzLmxhYmVscy5yb3RhdGU8PS00NT8tdGhpcy54QXhpc1dpZHRoLzQ6MCxlLmdsb2JhbHMuaXNCYXJIb3Jpem9udGFsJiYoaS5yb3RhdGVYTGFiZWxzPSExLGkudHJhbnNsYXRlWEF4aXNZPXBhcnNlSW50KGUuY29uZmlnLnhheGlzLmxhYmVscy5zdHlsZS5mb250U2l6ZSkvMS41Ki0xKSxpLnRyYW5zbGF0ZVhBeGlzWT1pLnRyYW5zbGF0ZVhBeGlzWStlLmNvbmZpZy54YXhpcy5sYWJlbHMub2Zmc2V0WSxpLnRyYW5zbGF0ZVhBeGlzWD1pLnRyYW5zbGF0ZVhBeGlzWCtlLmNvbmZpZy54YXhpcy5sYWJlbHMub2Zmc2V0WDt2YXIgbz10aGlzLnlBeGlzV2lkdGgsbD10aGlzLnhBeGlzSGVpZ2h0O2kueEF4aXNMYWJlbHNIZWlnaHQ9dGhpcy54QXhpc0hlaWdodCxpLnhBeGlzSGVpZ2h0PXRoaXMueEF4aXNIZWlnaHQ7dmFyIGg9MTA7c3dpdGNoKGUuY29uZmlnLmdyaWQuc2hvdyYmInJhZGFyIiE9PWUuY29uZmlnLmNoYXJ0LnR5cGV8fChvPTAsbD0zNSksdGhpcy5pc1NwYXJrbGluZSYmKHQ9e2hlaWdodDowLHdpZHRoOjB9LGw9MCxvPTAsaD0wKSx0aGlzLmFkZGl0aW9uYWxQYWRkaW5nWExhYmVscyhhKSxlLmNvbmZpZy5sZWdlbmQucG9zaXRpb24pe2Nhc2UiYm90dG9tIjppLnRyYW5zbGF0ZVk9aCxpLnRyYW5zbGF0ZVg9byxpLmdyaWRIZWlnaHQ9aS5zdmdIZWlnaHQtdC5oZWlnaHQtbC0odGhpcy5pc1NwYXJrbGluZT8wOmUuZ2xvYmFscy5yb3RhdGVYTGFiZWxzPzEwOjE1KSxpLmdyaWRXaWR0aD1pLnN2Z1dpZHRoLW87YnJlYWs7Y2FzZSJ0b3AiOmkudHJhbnNsYXRlWT10LmhlaWdodCtoLGkudHJhbnNsYXRlWD1vLGkuZ3JpZEhlaWdodD1pLnN2Z0hlaWdodC10LmhlaWdodC1sLSh0aGlzLmlzU3BhcmtsaW5lPzA6ZS5nbG9iYWxzLnJvdGF0ZVhMYWJlbHM/MTA6MTUpLGkuZ3JpZFdpZHRoPWkuc3ZnV2lkdGgtbzticmVhaztjYXNlImxlZnQiOmkudHJhbnNsYXRlWT1oLGkudHJhbnNsYXRlWD10LndpZHRoK28saS5ncmlkSGVpZ2h0PWkuc3ZnSGVpZ2h0LWwtMTIsaS5ncmlkV2lkdGg9aS5zdmdXaWR0aC10LndpZHRoLW87YnJlYWs7Y2FzZSJyaWdodCI6aS50cmFuc2xhdGVZPWgsaS50cmFuc2xhdGVYPW8saS5ncmlkSGVpZ2h0PWkuc3ZnSGVpZ2h0LWwtMTIsaS5ncmlkV2lkdGg9aS5zdmdXaWR0aC10LndpZHRoLW8tNTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiTGVnZW5kIHBvc2l0aW9uIG5vdCBzdXBwb3J0ZWQiKX10aGlzLnNldEdyaWRYUG9zRm9yRHVhbFlBeGlzKG4scyksbmV3IEgodGhpcy5jdHgpLnNldFlBeGlzWFBvc2l0aW9uKHMsbil9fSx7a2V5OiJzZXRHcmlkQ29vcmRzRm9yTm9uQXhpc0NoYXJ0cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53LGk9ZS5nbG9iYWxzLHM9MDtlLmNvbmZpZy5sZWdlbmQuc2hvdyYmIWUuY29uZmlnLmxlZ2VuZC5mbG9hdGluZyYmKHM9MjApO3ZhciBhPTEwLG49MDtpZigicGllIj09PWUuY29uZmlnLmNoYXJ0LnR5cGV8fCJkb251dCI9PT1lLmNvbmZpZy5jaGFydC50eXBlPyhhKz1lLmNvbmZpZy5wbG90T3B0aW9ucy5waWUub2Zmc2V0WSxuKz1lLmNvbmZpZy5wbG90T3B0aW9ucy5waWUub2Zmc2V0WCk6InJhZGlhbEJhciI9PT1lLmNvbmZpZy5jaGFydC50eXBlJiYoYSs9ZS5jb25maWcucGxvdE9wdGlvbnMucmFkaWFsQmFyLm9mZnNldFksbis9ZS5jb25maWcucGxvdE9wdGlvbnMucmFkaWFsQmFyLm9mZnNldFgpLCFlLmNvbmZpZy5sZWdlbmQuc2hvdylyZXR1cm4gaS5ncmlkSGVpZ2h0PWkuc3ZnSGVpZ2h0LTM1LGkuZ3JpZFdpZHRoPWkuZ3JpZEhlaWdodCxpLnRyYW5zbGF0ZVk9YS0xMCx2b2lkKGkudHJhbnNsYXRlWD1uKyhpLnN2Z1dpZHRoLWkuZ3JpZFdpZHRoKS8yKTtzd2l0Y2goZS5jb25maWcubGVnZW5kLnBvc2l0aW9uKXtjYXNlImJvdHRvbSI6aS5ncmlkSGVpZ2h0PWkuc3ZnSGVpZ2h0LXQuaGVpZ2h0LTM1LGkuZ3JpZFdpZHRoPWkuZ3JpZEhlaWdodCxpLnRyYW5zbGF0ZVk9YS0yMCxpLnRyYW5zbGF0ZVg9bisoaS5zdmdXaWR0aC1pLmdyaWRXaWR0aCkvMjticmVhaztjYXNlInRvcCI6aS5ncmlkSGVpZ2h0PWkuc3ZnSGVpZ2h0LXQuaGVpZ2h0LTM1LGkuZ3JpZFdpZHRoPWkuZ3JpZEhlaWdodCxpLnRyYW5zbGF0ZVk9dC5oZWlnaHQrYSsxMCxpLnRyYW5zbGF0ZVg9bisoaS5zdmdXaWR0aC1pLmdyaWRXaWR0aCkvMjticmVhaztjYXNlImxlZnQiOmkuZ3JpZFdpZHRoPWkuc3ZnV2lkdGgtdC53aWR0aC1zLGkuZ3JpZEhlaWdodD1pLmdyaWRXaWR0aCxpLnRyYW5zbGF0ZVk9YSxpLnRyYW5zbGF0ZVg9bit0LndpZHRoK3M7YnJlYWs7Y2FzZSJyaWdodCI6aS5ncmlkV2lkdGg9aS5zdmdXaWR0aC10LndpZHRoLXMtNSxpLmdyaWRIZWlnaHQ9aS5ncmlkV2lkdGgsaS50cmFuc2xhdGVZPWEsaS50cmFuc2xhdGVYPW4rMTA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkxlZ2VuZCBwb3NpdGlvbiBub3Qgc3VwcG9ydGVkIil9fX0se2tleToic2V0R3JpZFhQb3NGb3JEdWFsWUF4aXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53O2kuY29uZmlnLnlheGlzLm1hcChmdW5jdGlvbihzLGEpey0xPT09aS5nbG9iYWxzLmlnbm9yZVlBeGlzSW5kZXhlcy5pbmRleE9mKGEpJiYhaS5jb25maWcueWF4aXNbYV0uZmxvYXRpbmcmJmkuY29uZmlnLnlheGlzW2FdLnNob3cmJnMub3Bwb3NpdGUmJihpLmdsb2JhbHMudHJhbnNsYXRlWD1pLmdsb2JhbHMudHJhbnNsYXRlWC0oZVthXS53aWR0aCt0W2FdLndpZHRoKS1wYXJzZUludChpLmNvbmZpZy55YXhpc1thXS5sYWJlbHMuc3R5bGUuZm9udFNpemUpLzEuMi0xMil9KX19LHtrZXk6ImFkZGl0aW9uYWxQYWRkaW5nWExhYmVscyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxpPXRoaXMudztpZigiY2F0ZWdvcnkiPT09aS5jb25maWcueGF4aXMudHlwZSYmaS5nbG9iYWxzLmlzQmFySG9yaXpvbnRhbHx8Im51bWVyaWMiPT09aS5jb25maWcueGF4aXMudHlwZXx8ImRhdGV0aW1lIj09PWkuY29uZmlnLnhheGlzLnR5cGUpe3ZhciBzPWkuZ2xvYmFscy5pc1hOdW1lcmljO2kuY29uZmlnLnlheGlzLmZvckVhY2goZnVuY3Rpb24oYSxuKXt2YXIgcjsoIWEuc2hvd3x8YS5mbG9hdGluZ3x8LTEhPT1pLmdsb2JhbHMuY29sbGFwc2VkU2VyaWVzSW5kaWNlcy5pbmRleE9mKG4pfHxzfHxhLm9wcG9zaXRlJiZpLmdsb2JhbHMuaXNCYXJIb3Jpem9udGFsKSYmKChzJiZpLmdsb2JhbHMuaXNNdWx0aXBsZVlBeGlzJiYtMSE9PWkuZ2xvYmFscy5jb2xsYXBzZWRTZXJpZXNJbmRpY2VzLmluZGV4T2Yobil8fGkuZ2xvYmFscy5pc0Jhckhvcml6b250YWwmJmEub3Bwb3NpdGUpJiYocj10LGkuY29uZmlnLmdyaWQucGFkZGluZy5sZWZ0PHIud2lkdGgmJihlLnhQYWRMZWZ0PXIud2lkdGgvMisxKSksKCFpLmdsb2JhbHMuaXNCYXJIb3Jpem9udGFsJiZhLm9wcG9zaXRlJiYtMSE9PWkuZ2xvYmFscy5jb2xsYXBzZWRTZXJpZXNJbmRpY2VzLmluZGV4T2Yobil8fHMmJiFpLmdsb2JhbHMuaXNNdWx0aXBsZVlBeGlzKSYmZnVuY3Rpb24odCl7ZS50aW1lc2NhbGVMYWJlbHM/ZS50aW1lc2NhbGVMYWJlbHNbZS50aW1lc2NhbGVMYWJlbHMubGVuZ3RoLTFdLnBvc2l0aW9uK3Qud2lkdGg+aS5nbG9iYWxzLmdyaWRXaWR0aD9pLmdsb2JhbHMuc2tpcExhc3RUaW1lbGluZWxhYmVsPSEwOmkuZ2xvYmFscy5za2lwTGFzdFRpbWVsaW5lbGFiZWw9ITE6ImRhdGV0aW1lIj09PWkuY29uZmlnLnhheGlzLnR5cGU/aS5jb25maWcuZ3JpZC5wYWRkaW5nLnJpZ2h0PHQud2lkdGgmJihpLmdsb2JhbHMuc2tpcExhc3RUaW1lbGluZWxhYmVsPSEwKToiZGF0ZXRpbWUiIT09aS5jb25maWcueGF4aXMudHlwZSYmaS5jb25maWcuZ3JpZC5wYWRkaW5nLnJpZ2h0PHQud2lkdGgmJihlLnhQYWRSaWdodD10LndpZHRoLzIrMSl9KHQpKX0pfX19LHtrZXk6InRpdGxlU3VidGl0bGVPZmZzZXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53LGU9dC5nbG9iYWxzLGk9dGhpcy5pc1NwYXJrbGluZXx8IXQuZ2xvYmFscy5heGlzQ2hhcnRzPzA6MTA7dm9pZCAwIT09dC5jb25maWcudGl0bGUudGV4dD9pKz10LmNvbmZpZy50aXRsZS5tYXJnaW46aSs9dGhpcy5pc1NwYXJrbGluZXx8IXQuZ2xvYmFscy5heGlzQ2hhcnRzPzA6NSx2b2lkIDAhPT10LmNvbmZpZy5zdWJ0aXRsZS50ZXh0P2krPXQuY29uZmlnLnN1YnRpdGxlLm1hcmdpbjppKz10aGlzLmlzU3BhcmtsaW5lfHwhdC5nbG9iYWxzLmF4aXNDaGFydHM/MDo1LHQuY29uZmlnLmxlZ2VuZC5zaG93JiYiYm90dG9tIj09PXQuY29uZmlnLmxlZ2VuZC5wb3NpdGlvbiYmIXQuY29uZmlnLmxlZ2VuZC5mbG9hdGluZyYmKHQuY29uZmlnLnNlcmllcy5sZW5ndGg+MXx8IXQuZ2xvYmFscy5heGlzQ2hhcnRzfHx0LmNvbmZpZy5sZWdlbmQuc2hvd0ZvclNpbmdsZVNlcmllcykmJihpKz0xMCk7dmFyIHM9dGhpcy5nZXRUaXRsZVN1YnRpdGxlQ29vcmRzKCJ0aXRsZSIpLGE9dGhpcy5nZXRUaXRsZVN1YnRpdGxlQ29vcmRzKCJzdWJ0aXRsZSIpO2UuZ3JpZEhlaWdodD1lLmdyaWRIZWlnaHQtcy5oZWlnaHQtYS5oZWlnaHQtaSxlLnRyYW5zbGF0ZVk9ZS50cmFuc2xhdGVZK3MuaGVpZ2h0K2EuaGVpZ2h0K2l9fSx7a2V5OiJnZXRUb3RhbFlBeGlzV2lkdGgiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53LGU9MCxpPTEwLHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuZ2xvYmFscy5pZ25vcmVZQXhpc0luZGV4ZXMuaW5kZXhPZihlKT4tMX07cmV0dXJuIHQuZ2xvYmFscy55TGFiZWxzQ29vcmRzLm1hcChmdW5jdGlvbihhLG4pe3ZhciByPXQuY29uZmlnLnlheGlzW25dLmZsb2F0aW5nO2Eud2lkdGg+MCYmIXI/KGU9ZSthLndpZHRoK2kscyhuKSYmKGU9ZS1hLndpZHRoLWkpKTplKz1yfHwhdC5jb25maWcueWF4aXNbbl0uc2hvdz8wOjV9KSx0Lmdsb2JhbHMueVRpdGxlQ29vcmRzLm1hcChmdW5jdGlvbihhLG4pe3ZhciByPXQuY29uZmlnLnlheGlzW25dLmZsb2F0aW5nO2k9cGFyc2VJbnQodC5jb25maWcueWF4aXNbbl0udGl0bGUuc3R5bGUuZm9udFNpemUpLGEud2lkdGg+MCYmIXI/KGU9ZSthLndpZHRoK2kscyhuKSYmKGU9ZS1hLndpZHRoLWkpKTplKz1yfHwhdC5jb25maWcueWF4aXNbbl0uc2hvdz8wOjV9KSxlfX0se2tleToiZ2V0eEF4aXNUaW1lU2NhbGVMYWJlbHNDb29yZHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLnc7dGhpcy50aW1lc2NhbGVMYWJlbHM9ZS5nbG9iYWxzLnRpbWVsaW5lTGFiZWxzLnNsaWNlKCksZS5nbG9iYWxzLmlzQmFySG9yaXpvbnRhbCYmImRhdGV0aW1lIj09PWUuY29uZmlnLnhheGlzLnR5cGUmJih0aGlzLnRpbWVzY2FsZUxhYmVscz1lLmdsb2JhbHMuaW52ZXJ0ZWRUaW1lbGluZUxhYmVscy5zbGljZSgpKTt2YXIgaT10aGlzLnRpbWVzY2FsZUxhYmVscy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWV9KSxzPWkucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PXQ/KGNvbnNvbGUuZXJyb3IoIllvdSBoYXZlIHBvc3NpYmx5IHN1cHBsaWVkIGludmFsaWQgRGF0ZSBmb3JtYXQuIFBsZWFzZSBzdXBwbHkgYSB2YWxpZCBKYXZhU2NyaXB0IERhdGUiKSwwKTp0Lmxlbmd0aD5lLmxlbmd0aD90OmV9LDApO3JldHVybiAxLjA1Kih0PW5ldyBwKHRoaXMuY3R4KS5nZXRUZXh0UmVjdHMocyxlLmNvbmZpZy54YXhpcy5sYWJlbHMuc3R5bGUuZm9udFNpemUpKS53aWR0aCppLmxlbmd0aD5lLmdsb2JhbHMuZ3JpZFdpZHRoJiYwIT09ZS5jb25maWcueGF4aXMubGFiZWxzLnJvdGF0ZSYmKGUuZ2xvYmFscy5vdmVybGFwcGluZ1hMYWJlbHM9ITApLHR9fSx7a2V5OiJnZXR4QXhpc0xhYmVsc0Nvb3JkcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMudyxpPWUuZ2xvYmFscy5sYWJlbHMuc2xpY2UoKTtpZihlLmdsb2JhbHMudGltZWxpbmVMYWJlbHMubGVuZ3RoPjApe3ZhciBzPXRoaXMuZ2V0eEF4aXNUaW1lU2NhbGVMYWJlbHNDb29yZHMoKTt0PXt3aWR0aDpzLndpZHRoLGhlaWdodDpzLmhlaWdodH19ZWxzZXt2YXIgYT0ibGVmdCIhPT1lLmNvbmZpZy5sZWdlbmQucG9zaXRpb258fCJyaWdodCIhPT1lLmNvbmZpZy5sZWdlbmQucG9zaXRpb258fGUuY29uZmlnLmxlZ2VuZC5mbG9hdGluZz8wOnRoaXMubGdSZWN0LndpZHRoLG49ZS5nbG9iYWxzLnhMYWJlbEZvcm1hdHRlcixyPWkucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubGVuZ3RoPmUubGVuZ3RoP3Q6ZX0sMCk7ZS5nbG9iYWxzLmlzQmFySG9yaXpvbnRhbCYmKHI9ZS5nbG9iYWxzLnlBeGlzU2NhbGVbMF0ucmVzdWx0LnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0Lmxlbmd0aD5lLmxlbmd0aD90OmV9LDApKTt2YXIgbz1yO3I9bmV3IE4odGhpcy5jdHgpLnhMYWJlbEZvcm1hdChuLHIsbyk7dmFyIGw9bmV3IHAodGhpcy5jdHgpLGg9bC5nZXRUZXh0UmVjdHMocixlLmNvbmZpZy54YXhpcy5sYWJlbHMuc3R5bGUuZm9udFNpemUpOyh0PXt3aWR0aDpoLndpZHRoLGhlaWdodDpoLmhlaWdodH0pLndpZHRoKmkubGVuZ3RoPmUuZ2xvYmFscy5zdmdXaWR0aC1hLXRoaXMueUF4aXNXaWR0aCYmMCE9PWUuY29uZmlnLnhheGlzLmxhYmVscy5yb3RhdGU/ZS5nbG9iYWxzLmlzQmFySG9yaXpvbnRhbHx8KGUuZ2xvYmFscy5yb3RhdGVYTGFiZWxzPSEwLGg9bC5nZXRUZXh0UmVjdHMocixlLmNvbmZpZy54YXhpcy5sYWJlbHMuc3R5bGUuZm9udFNpemUsZS5jb25maWcueGF4aXMubGFiZWxzLnN0eWxlLmZvbnRGYW1pbHksInJvdGF0ZSgiLmNvbmNhdChlLmNvbmZpZy54YXhpcy5sYWJlbHMucm90YXRlLCIgMCAwKSIpLCExKSx0LmhlaWdodD1oLmhlaWdodC8xLjY2KTplLmdsb2JhbHMucm90YXRlWExhYmVscz0hMX1yZXR1cm4gZS5jb25maWcueGF4aXMubGFiZWxzLnNob3d8fCh0PXt3aWR0aDowLGhlaWdodDowfSkse3dpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0fX19LHtrZXk6ImdldHlBeGlzTGFiZWxzQ29vcmRzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLncsaT1bXSxzPTEwO3JldHVybiBlLmNvbmZpZy55YXhpcy5tYXAoZnVuY3Rpb24oYSxuKXtpZihhLnNob3cmJmEubGFiZWxzLnNob3cmJmUuZ2xvYmFscy55QXhpc1NjYWxlW25dLnJlc3VsdC5sZW5ndGgpe3ZhciByPWUuZ2xvYmFscy55TGFiZWxGb3JtYXR0ZXJzW25dLG89cihlLmdsb2JhbHMueUF4aXNTY2FsZVtuXS5uaWNlTWF4LHtzZXJpZXNJbmRleDpuLGRhdGFQb2ludEluZGV4Oi0xLHc6ZX0pO2lmKHZvaWQgMCE9PW8mJjAhPT1vLmxlbmd0aHx8KG89ZS5nbG9iYWxzLnlBeGlzU2NhbGVbbl0ubmljZU1heCksZS5nbG9iYWxzLmlzQmFySG9yaXpvbnRhbClzPTAsbz1yKG89ZS5nbG9iYWxzLmxhYmVscy5zbGljZSgpLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0Lmxlbmd0aD5lLmxlbmd0aD90OmV9LDApLHtzZXJpZXNJbmRleDpuLGRhdGFQb2ludEluZGV4Oi0xLHc6ZX0pO3ZhciBsPW5ldyBwKHQuY3R4KS5nZXRUZXh0UmVjdHMobyxhLmxhYmVscy5zdHlsZS5mb250U2l6ZSk7aS5wdXNoKHt3aWR0aDpsLndpZHRoK3MsaGVpZ2h0OmwuaGVpZ2h0fSl9ZWxzZSBpLnB1c2goe3dpZHRoOjAsaGVpZ2h0OjB9KX0pLGl9fSx7a2V5OiJnZXR4QXhpc1RpdGxlQ29vcmRzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudyxlPTAsaT0wO2lmKHZvaWQgMCE9PXQuY29uZmlnLnhheGlzLnRpdGxlLnRleHQpe3ZhciBzPW5ldyBwKHRoaXMuY3R4KS5nZXRUZXh0UmVjdHModC5jb25maWcueGF4aXMudGl0bGUudGV4dCx0LmNvbmZpZy54YXhpcy50aXRsZS5zdHlsZS5mb250U2l6ZSk7ZT1zLndpZHRoLGk9cy5oZWlnaHR9cmV0dXJue3dpZHRoOmUsaGVpZ2h0Oml9fX0se2tleToiZ2V0eUF4aXNUaXRsZUNvb3JkcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy53LGk9W107cmV0dXJuIGUuY29uZmlnLnlheGlzLm1hcChmdW5jdGlvbihlLHMpe2lmKGUuc2hvdyYmdm9pZCAwIT09ZS50aXRsZS50ZXh0KXt2YXIgYT1uZXcgcCh0LmN0eCkuZ2V0VGV4dFJlY3RzKGUudGl0bGUudGV4dCxlLnRpdGxlLnN0eWxlLmZvbnRTaXplLGUudGl0bGUuc3R5bGUuZm9udEZhbWlseSwicm90YXRlKC05MCAwIDApIiwhMSk7aS5wdXNoKHt3aWR0aDphLndpZHRoLGhlaWdodDphLmhlaWdodH0pfWVsc2UgaS5wdXNoKHt3aWR0aDowLGhlaWdodDowfSl9KSxpfX0se2tleToiZ2V0VGl0bGVTdWJ0aXRsZUNvb3JkcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53LGk9MCxzPTAsYT0idGl0bGUiPT09dD9lLmNvbmZpZy50aXRsZS5mbG9hdGluZzplLmNvbmZpZy5zdWJ0aXRsZS5mbG9hdGluZyxuPWUuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3IoIi5hcGV4Y2hhcnRzLSIuY29uY2F0KHQsIi10ZXh0IikpO2lmKG51bGwhPT1uJiYhYSl7dmFyIHI9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpPXIud2lkdGgscz1lLmdsb2JhbHMuYXhpc0NoYXJ0cz9yLmhlaWdodCs1OnIuaGVpZ2h0fXJldHVybnt3aWR0aDppLGhlaWdodDpzfX19LHtrZXk6ImdldExlZ2VuZHNSZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudyxlPXQuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3IoIi5hcGV4Y2hhcnRzLWxlZ2VuZCIpLGk9T2JqZWN0LmFzc2lnbih7fSx1LmdldEJvdW5kaW5nQ2xpZW50UmVjdChlKSk7cmV0dXJuIG51bGwhPT1lJiYhdC5jb25maWcubGVnZW5kLmZsb2F0aW5nJiZ0LmNvbmZpZy5sZWdlbmQuc2hvdz90aGlzLmxnUmVjdD17eDppLngseTppLnksaGVpZ2h0OmkuaGVpZ2h0LHdpZHRoOjA9PT1pLmhlaWdodD8wOmkud2lkdGh9OnRoaXMubGdSZWN0PXt4OjAseTowLGhlaWdodDowLHdpZHRoOjB9LHRoaXMubGdSZWN0fX1dKSx0fSgpLEI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGkpe2UodGhpcyx0KSx0aGlzLmN0eD1pLHRoaXMudz1pLnd9cmV0dXJuIHModCxbe2tleToiZ2V0QWxsU2VyaWVzRWxzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLncuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5hcGV4Y2hhcnRzLXNlcmllcyIpfX0se2tleToiZ2V0U2VyaWVzQnlOYW1lIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy53Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCJbc2VyaWVzTmFtZT0nIi5jb25jYXQodS5lc2NhcGVTdHJpbmcodCksIiddIikpfX0se2tleToiYWRkQ29sbGFwc2VkQ2xhc3NUb1NlcmllcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnc7ZnVuY3Rpb24gcyhpKXtmb3IodmFyIHM9MDtzPGkubGVuZ3RoO3MrKylpW3NdLmluZGV4PT09ZSYmdC5ub2RlLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtc2VyaWVzLWNvbGxhcHNlZCIpfXMoaS5nbG9iYWxzLmNvbGxhcHNlZFNlcmllcykscyhpLmdsb2JhbHMuYW5jaWxsYXJ5Q29sbGFwc2VkU2VyaWVzKX19LHtrZXk6InJlc2V0U2VyaWVzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PSEoYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0pfHxhcmd1bWVudHNbMF0sZT10aGlzLncsaT1lLmdsb2JhbHMuaW5pdGlhbFNlcmllcy5zbGljZSgpO2UuY29uZmlnLnNlcmllcz1pLGUuZ2xvYmFscy5jb2xsYXBzZWRTZXJpZXM9W10sZS5nbG9iYWxzLmFuY2lsbGFyeUNvbGxhcHNlZFNlcmllcz1bXSxlLmdsb2JhbHMuY29sbGFwc2VkU2VyaWVzSW5kaWNlcz1bXSxlLmdsb2JhbHMuYW5jaWxsYXJ5Q29sbGFwc2VkU2VyaWVzSW5kaWNlcz1bXSxlLmdsb2JhbHMucHJldmlvdXNQYXRocz1bXSx0JiZ0aGlzLmN0eC5fdXBkYXRlU2VyaWVzKGksZS5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5keW5hbWljQW5pbWF0aW9uLmVuYWJsZWQpfX0se2tleToidG9nZ2xlU2VyaWVzT25Ib3ZlciIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLncscz1pLmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy1zZXJpZXMiKTtpZigibW91c2Vtb3ZlIj09PXQudHlwZSl7dmFyIGE9cGFyc2VJbnQoZS5nZXRBdHRyaWJ1dGUoInJlbCIpKS0xLG49bnVsbDtuPWkuZ2xvYmFscy5heGlzQ2hhcnRzfHwicmFkaWFsQmFyIj09PWkuY29uZmlnLmNoYXJ0LnR5cGU/aS5nbG9iYWxzLmF4aXNDaGFydHM/aS5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtc2VyaWVzW2RhdGFcXDpyZWFsSW5kZXg9JyIuY29uY2F0KGEsIiddIikpOmkuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3IoIi5hcGV4Y2hhcnRzLXNlcmllc1tyZWw9JyIuY29uY2F0KGErMSwiJ10iKSk6aS5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtc2VyaWVzW3JlbD0nIi5jb25jYXQoYSsxLCInXSBwYXRoIikpO2Zvcih2YXIgcj0wO3I8cy5sZW5ndGg7cisrKXNbcl0uY2xhc3NMaXN0LmFkZCgibGVnZW5kLW1vdXNlb3Zlci1pbmFjdGl2ZSIpO251bGwhPT1uJiYoaS5nbG9iYWxzLmF4aXNDaGFydHN8fG4ucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKCJsZWdlbmQtbW91c2VvdmVyLWluYWN0aXZlIiksbi5jbGFzc0xpc3QucmVtb3ZlKCJsZWdlbmQtbW91c2VvdmVyLWluYWN0aXZlIikpfWVsc2UgaWYoIm1vdXNlb3V0Ij09PXQudHlwZSlmb3IodmFyIG89MDtvPHMubGVuZ3RoO28rKylzW29dLmNsYXNzTGlzdC5yZW1vdmUoImxlZ2VuZC1tb3VzZW92ZXItaW5hY3RpdmUiKX19LHtrZXk6ImhpZ2hsaWdodFJhbmdlSW5TZXJpZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53LHM9aS5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvckFsbCgiLmFwZXhjaGFydHMtaGVhdG1hcC1yZWN0IiksYT1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8cy5sZW5ndGg7dCsrKXNbdF0uY2xhc3NMaXN0LnJlbW92ZSgibGVnZW5kLW1vdXNlb3Zlci1pbmFjdGl2ZSIpfTtpZigibW91c2Vtb3ZlIj09PXQudHlwZSl7dmFyIG49cGFyc2VJbnQoZS5nZXRBdHRyaWJ1dGUoInJlbCIpKS0xO2EoKSxmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8cy5sZW5ndGg7dCsrKXNbdF0uY2xhc3NMaXN0LmFkZCgibGVnZW5kLW1vdXNlb3Zlci1pbmFjdGl2ZSIpfSgpLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8cy5sZW5ndGg7ZSsrKXt2YXIgaT1wYXJzZUludChzW2VdLmdldEF0dHJpYnV0ZSgidmFsIikpO2k+PXQuZnJvbSYmaTw9dC50byYmc1tlXS5jbGFzc0xpc3QucmVtb3ZlKCJsZWdlbmQtbW91c2VvdmVyLWluYWN0aXZlIil9fShpLmNvbmZpZy5wbG90T3B0aW9ucy5oZWF0bWFwLmNvbG9yU2NhbGUucmFuZ2VzW25dKX1lbHNlIm1vdXNlb3V0Ij09PXQudHlwZSYmYSgpfX0se2tleToiZ2V0QWN0aXZlU2VyaWVzSW5kZXgiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53LGU9MDtpZih0Lmdsb2JhbHMuc2VyaWVzLmxlbmd0aD4xKWZvcih2YXIgaT10Lmdsb2JhbHMuc2VyaWVzLm1hcChmdW5jdGlvbihlLGkpe3JldHVybiBlLmxlbmd0aD4wJiYiYmFyIiE9PXQuY29uZmlnLnNlcmllc1tpXS50eXBlJiYiY29sdW1uIiE9PXQuY29uZmlnLnNlcmllc1tpXS50eXBlP2k6LTF9KSxzPTA7czxpLmxlbmd0aDtzKyspaWYoLTEhPT1pW3NdKXtlPWlbc107YnJlYWt9cmV0dXJuIGV9fSx7a2V5OiJnZXRBY3RpdmVDb25maWdTZXJpZXNJbmRleCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLncsZT0wO2lmKHQuY29uZmlnLnNlcmllcy5sZW5ndGg+MSlmb3IodmFyIGk9dC5jb25maWcuc2VyaWVzLm1hcChmdW5jdGlvbih0LGUpe3JldHVybiB0LmRhdGEmJnQuZGF0YS5sZW5ndGg+MD9lOi0xfSkscz0wO3M8aS5sZW5ndGg7cysrKWlmKC0xIT09aVtzXSl7ZT1pW3NdO2JyZWFrfXJldHVybiBlfX0se2tleToiZ2V0UHJldmlvdXNQYXRocyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnc7ZnVuY3Rpb24gZShlLGkscyl7Zm9yKHZhciBhPWVbaV0uY2hpbGROb2RlcyxuPXt0eXBlOnMscGF0aHM6W10scmVhbEluZGV4OmVbaV0uZ2V0QXR0cmlidXRlKCJkYXRhOnJlYWxJbmRleCIpfSxyPTA7cjxhLmxlbmd0aDtyKyspaWYoYVtyXS5oYXNBdHRyaWJ1dGUoInBhdGhUbyIpKXt2YXIgbz1hW3JdLmdldEF0dHJpYnV0ZSgicGF0aFRvIik7bi5wYXRocy5wdXNoKHtkOm99KX10Lmdsb2JhbHMucHJldmlvdXNQYXRocy5wdXNoKG4pfXQuZ2xvYmFscy5wcmV2aW91c1BhdGhzPVtdO3ZhciBpPXQuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5hcGV4Y2hhcnRzLWxpbmUtc2VyaWVzIC5hcGV4Y2hhcnRzLXNlcmllcyIpO2lmKGkubGVuZ3RoPjApZm9yKHZhciBzPWkubGVuZ3RoLTE7cz49MDtzLS0pZShpLHMsImxpbmUiKTt2YXIgYT10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy1hcmVhLXNlcmllcyAuYXBleGNoYXJ0cy1zZXJpZXMiKTtpZihhLmxlbmd0aD4wKWZvcih2YXIgbj1hLmxlbmd0aC0xO24+PTA7bi0tKWUoYSxuLCJhcmVhIik7dmFyIHI9dC5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvckFsbCgiLmFwZXhjaGFydHMtYmFyLXNlcmllcyAuYXBleGNoYXJ0cy1zZXJpZXMiKTtpZihyLmxlbmd0aD4wKWZvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKWUocixvLCJiYXIiKTt2YXIgbD10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy1jYW5kbGVzdGljay1zZXJpZXMgLmFwZXhjaGFydHMtc2VyaWVzIik7aWYobC5sZW5ndGg+MClmb3IodmFyIGg9MDtoPGwubGVuZ3RoO2grKyllKGwsaCwiY2FuZGxlc3RpY2siKTt2YXIgYz10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy1yYWRhci1zZXJpZXMgLmFwZXhjaGFydHMtc2VyaWVzIik7aWYoYy5sZW5ndGg+MClmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyllKGMsZCwicmFkYXIiKTt2YXIgdT10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy1idWJibGUtc2VyaWVzIC5hcGV4Y2hhcnRzLXNlcmllcyIpO2lmKHUubGVuZ3RoPjApZm9yKHZhciBnPTA7Zzx1Lmxlbmd0aDtnKyspe2Zvcih2YXIgZj10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy1idWJibGUtc2VyaWVzIC5hcGV4Y2hhcnRzLXNlcmllc1tkYXRhXFw6cmVhbEluZGV4PSciLmNvbmNhdChnLCInXSBjaXJjbGUiKSkscD1bXSx4PTA7eDxmLmxlbmd0aDt4KyspcC5wdXNoKHt4OmZbeF0uZ2V0QXR0cmlidXRlKCJjeCIpLHk6Zlt4XS5nZXRBdHRyaWJ1dGUoImN5IikscjpmW3hdLmdldEF0dHJpYnV0ZSgiciIpfSk7dC5nbG9iYWxzLnByZXZpb3VzUGF0aHMucHVzaChwKX12YXIgYj10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy1zY2F0dGVyLXNlcmllcyAuYXBleGNoYXJ0cy1zZXJpZXMiKTtpZihiLmxlbmd0aD4wKWZvcih2YXIgbT0wO208Yi5sZW5ndGg7bSsrKXtmb3IodmFyIHY9dC5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvckFsbCgiLmFwZXhjaGFydHMtc2NhdHRlci1zZXJpZXMgLmFwZXhjaGFydHMtc2VyaWVzW2RhdGFcXDpyZWFsSW5kZXg9JyIuY29uY2F0KG0sIiddIGNpcmNsZSIpKSx5PVtdLHc9MDt3PHYubGVuZ3RoO3crKyl5LnB1c2goe3g6dlt3XS5nZXRBdHRyaWJ1dGUoImN4IikseTp2W3ddLmdldEF0dHJpYnV0ZSgiY3kiKSxyOnZbd10uZ2V0QXR0cmlidXRlKCJyIil9KTt0Lmdsb2JhbHMucHJldmlvdXNQYXRocy5wdXNoKHkpfXZhciBrPXQuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5hcGV4Y2hhcnRzLWhlYXRtYXAgLmFwZXhjaGFydHMtc2VyaWVzIik7aWYoay5sZW5ndGg+MClmb3IodmFyIEE9MDtBPGsubGVuZ3RoO0ErKyl7Zm9yKHZhciBTPXQuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5hcGV4Y2hhcnRzLWhlYXRtYXAgLmFwZXhjaGFydHMtc2VyaWVzW2RhdGFcXDpyZWFsSW5kZXg9JyIuY29uY2F0KEEsIiddIHJlY3QiKSksQz1bXSxMPTA7TDxTLmxlbmd0aDtMKyspQy5wdXNoKHtjb2xvcjpTW0xdLmdldEF0dHJpYnV0ZSgiY29sb3IiKX0pO3QuZ2xvYmFscy5wcmV2aW91c1BhdGhzLnB1c2goQyl9dC5nbG9iYWxzLmF4aXNDaGFydHN8fCh0Lmdsb2JhbHMucHJldmlvdXNQYXRocz10Lmdsb2JhbHMuc2VyaWVzKX19LHtrZXk6ImhhbmRsZU5vRGF0YSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLncsZT10LmNvbmZpZy5ub0RhdGEsaT1uZXcgcCh0aGlzLmN0eCkscz10Lmdsb2JhbHMuc3ZnV2lkdGgvMixhPXQuZ2xvYmFscy5zdmdIZWlnaHQvMixuPSJtaWRkbGUiO2lmKHQuZ2xvYmFscy5ub0RhdGE9ITAsdC5nbG9iYWxzLmFuaW1hdGlvbkVuZGVkPSEwLCJsZWZ0Ij09PWUuYWxpZ24/KHM9MTAsbj0ic3RhcnQiKToicmlnaHQiPT09ZS5hbGlnbiYmKHM9dC5nbG9iYWxzLnN2Z1dpZHRoLTEwLG49ImVuZCIpLCJ0b3AiPT09ZS52ZXJ0aWNhbEFsaWduP2E9NTA6ImJvdHRvbSI9PT1lLnZlcnRpY2FsQWxpZ24mJihhPXQuZ2xvYmFscy5zdmdIZWlnaHQtNTApLHMrPWUub2Zmc2V0WCxhPWErcGFyc2VJbnQoZS5zdHlsZS5mb250U2l6ZSkrMix2b2lkIDAhPT1lLnRleHQmJiIiIT09ZS50ZXh0KXt2YXIgcj1pLmRyYXdUZXh0KHt4OnMseTphLHRleHQ6ZS50ZXh0LHRleHRBbmNob3I6bixmb250U2l6ZTplLnN0eWxlLmZvbnRTaXplLGZvbnRGYW1pbHk6ZS5zdHlsZS5mb250RmFtaWx5LGZvcmVDb2xvcjplLnN0eWxlLmNvbG9yLG9wYWNpdHk6MSxjbGFzczoiYXBleGNoYXJ0cy10ZXh0LW5vZGF0YSJ9KTtyLm5vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsImFwZXhjaGFydHMtdGl0bGUtdGV4dCIpLHQuZ2xvYmFscy5kb20uUGFwZXIuYWRkKHIpfX19LHtrZXk6InNldE51bGxTZXJpZXNUb1plcm9WYWx1ZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLncsaT0wO2k8dC5sZW5ndGg7aSsrKWlmKDA9PT10W2ldLmxlbmd0aClmb3IodmFyIHM9MDtzPHRbZS5nbG9iYWxzLm1heFZhbHNJbkFycmF5SW5kZXhdLmxlbmd0aDtzKyspdFtpXS5wdXNoKDApO3JldHVybiB0fX0se2tleToiaGFzQWxsU2VyaWVzRXF1YWxYIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0hMCxlPXRoaXMudyxpPXRoaXMuZmlsdGVyZWRTZXJpZXNYKCkscz0wO3M8aS5sZW5ndGgtMTtzKyspaWYoaVtzXVswXSE9PWlbcysxXVswXSl7dD0hMTticmVha31yZXR1cm4gZS5nbG9iYWxzLmFsbFNlcmllc0hhc0VxdWFsWD10LHR9fSx7a2V5OiJmaWx0ZXJlZFNlcmllc1giLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53Lmdsb2JhbHMuc2VyaWVzWC5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5sZW5ndGg+MD90OltdfSk7cmV0dXJuIHR9fV0pLHR9KCksVj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaSxzKXtlKHRoaXMsdCksdGhpcy5jdHg9aSx0aGlzLnc9aS53LHRoaXMub25MZWdlbmRDbGljaz10aGlzLm9uTGVnZW5kQ2xpY2suYmluZCh0aGlzKSx0aGlzLm9uTGVnZW5kSG92ZXJlZD10aGlzLm9uTGVnZW5kSG92ZXJlZC5iaW5kKHRoaXMpfXJldHVybiBzKHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53LGU9dC5nbG9iYWxzLGk9dC5jb25maWc7aWYoKGkubGVnZW5kLnNob3dGb3JTaW5nbGVTZXJpZXMmJjE9PT1lLnNlcmllcy5sZW5ndGh8fGUuc2VyaWVzLmxlbmd0aD4xfHwhZS5heGlzQ2hhcnRzKSYmaS5sZWdlbmQuc2hvdyl7Zm9yKDtlLmRvbS5lbExlZ2VuZFdyYXAuZmlyc3RDaGlsZDspZS5kb20uZWxMZWdlbmRXcmFwLnJlbW92ZUNoaWxkKGUuZG9tLmVsTGVnZW5kV3JhcC5maXJzdENoaWxkKTt0aGlzLmRyYXdMZWdlbmRzKCksdS5pc0lFMTEoKXx8dGhpcy5hcHBlbmRUb0ZvcmVpZ25PYmplY3QoKSwiYm90dG9tIj09PWkubGVnZW5kLnBvc2l0aW9ufHwidG9wIj09PWkubGVnZW5kLnBvc2l0aW9uP3RoaXMubGVnZW5kQWxpZ25Ib3Jpem9udGFsKCk6InJpZ2h0IiE9PWkubGVnZW5kLnBvc2l0aW9uJiYibGVmdCIhPT1pLmxlZ2VuZC5wb3NpdGlvbnx8dGhpcy5sZWdlbmRBbGlnblZlcnRpY2FsKCl9fX0se2tleToiYXBwZW5kVG9Gb3JlaWduT2JqZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudy5nbG9iYWxzO3QuZG9tLmVsTGVnZW5kRm9yZWlnbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5TVkdOUywiZm9yZWlnbk9iamVjdCIpO3ZhciBlPXQuZG9tLmVsTGVnZW5kRm9yZWlnbjtlLnNldEF0dHJpYnV0ZSgieCIsMCksZS5zZXRBdHRyaWJ1dGUoInkiLDApLGUuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdC5zdmdXaWR0aCksZS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsdC5zdmdIZWlnaHQpLHQuZG9tLmVsTGVnZW5kV3JhcC5zZXRBdHRyaWJ1dGUoInhtbG5zIiwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIpLGUuYXBwZW5kQ2hpbGQodC5kb20uZWxMZWdlbmRXcmFwKSx0LmRvbS5QYXBlci5ub2RlLmluc2VydEJlZm9yZShlLHQuZG9tLmVsR3JhcGhpY2FsLm5vZGUpfX0se2tleToiZHJhd0xlZ2VuZHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53LGU9dC5jb25maWcubGVnZW5kLmZvbnRGYW1pbHksaT10Lmdsb2JhbHMuc2VyaWVzTmFtZXMscz10Lmdsb2JhbHMuY29sb3JzLnNsaWNlKCk7aWYoImhlYXRtYXAiPT09dC5jb25maWcuY2hhcnQudHlwZSl7dmFyIGE9dC5jb25maWcucGxvdE9wdGlvbnMuaGVhdG1hcC5jb2xvclNjYWxlLnJhbmdlcztpPWEubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWU/dC5uYW1lOnQuZnJvbSsiIC0gIit0LnRvfSkscz1hLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5jb2xvcn0pfWZvcih2YXIgbj10Lmdsb2JhbHMubGVnZW5kRm9ybWF0dGVyLHI9dC5jb25maWcubGVnZW5kLmludmVyc2VPcmRlcixvPXI/aS5sZW5ndGgtMTowO3I/bz49MDpvPD1pLmxlbmd0aC0xO3I/by0tOm8rKyl7dmFyIGw9bihpW29dLHtzZXJpZXNJbmRleDpvLHc6dH0pLGg9ITEsYz0hMTtpZih0Lmdsb2JhbHMuY29sbGFwc2VkU2VyaWVzLmxlbmd0aD4wKWZvcih2YXIgZD0wO2Q8dC5nbG9iYWxzLmNvbGxhcHNlZFNlcmllcy5sZW5ndGg7ZCsrKXQuZ2xvYmFscy5jb2xsYXBzZWRTZXJpZXNbZF0uaW5kZXg9PT1vJiYoaD0hMCk7aWYodC5nbG9iYWxzLmFuY2lsbGFyeUNvbGxhcHNlZFNlcmllc0luZGljZXMubGVuZ3RoPjApZm9yKHZhciB1PTA7dTx0Lmdsb2JhbHMuYW5jaWxsYXJ5Q29sbGFwc2VkU2VyaWVzSW5kaWNlcy5sZW5ndGg7dSsrKXQuZ2xvYmFscy5hbmNpbGxhcnlDb2xsYXBzZWRTZXJpZXNJbmRpY2VzW3VdPT09byYmKGM9ITApO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtnLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtbGVnZW5kLW1hcmtlciIpO3ZhciBmPXQuY29uZmlnLmxlZ2VuZC5tYXJrZXJzLm9mZnNldFgseD10LmNvbmZpZy5sZWdlbmQubWFya2Vycy5vZmZzZXRZLGI9dC5jb25maWcubGVnZW5kLm1hcmtlcnMuaGVpZ2h0LG09dC5jb25maWcubGVnZW5kLm1hcmtlcnMud2lkdGgsdj10LmNvbmZpZy5sZWdlbmQubWFya2Vycy5zdHJva2VXaWR0aCx5PXQuY29uZmlnLmxlZ2VuZC5tYXJrZXJzLnN0cm9rZUNvbG9yLGs9dC5jb25maWcubGVnZW5kLm1hcmtlcnMucmFkaXVzLEE9Zy5zdHlsZTtBLmJhY2tncm91bmQ9c1tvXSxBLmNvbG9yPXNbb10sdC5jb25maWcubGVnZW5kLm1hcmtlcnMuZmlsbENvbG9ycyYmdC5jb25maWcubGVnZW5kLm1hcmtlcnMuZmlsbENvbG9yc1tvXSYmKEEuYmFja2dyb3VuZD10LmNvbmZpZy5sZWdlbmQubWFya2Vycy5maWxsQ29sb3JzW29dKSxBLmhlaWdodD1BcnJheS5pc0FycmF5KGIpP3BhcnNlRmxvYXQoYltvXSkrInB4IjpwYXJzZUZsb2F0KGIpKyJweCIsQS53aWR0aD1BcnJheS5pc0FycmF5KG0pP3BhcnNlRmxvYXQobVtvXSkrInB4IjpwYXJzZUZsb2F0KG0pKyJweCIsQS5sZWZ0PUFycmF5LmlzQXJyYXkoZik/ZltvXTpmLEEudG9wPUFycmF5LmlzQXJyYXkoeCk/eFtvXTp4LEEuYm9yZGVyV2lkdGg9QXJyYXkuaXNBcnJheSh2KT92W29dOnYsQS5ib3JkZXJDb2xvcj1BcnJheS5pc0FycmF5KHkpP3lbb106eSxBLmJvcmRlclJhZGl1cz1BcnJheS5pc0FycmF5KGspP3BhcnNlRmxvYXQoa1tvXSkrInB4IjpwYXJzZUZsb2F0KGspKyJweCIsdC5jb25maWcubGVnZW5kLm1hcmtlcnMuY3VzdG9tSFRNTCYmKEFycmF5LmlzQXJyYXkodC5jb25maWcubGVnZW5kLm1hcmtlcnMuY3VzdG9tSFRNTCk/Zy5pbm5lckhUTUw9dC5jb25maWcubGVnZW5kLm1hcmtlcnMuY3VzdG9tSFRNTFtvXSgpOmcuaW5uZXJIVE1MPXQuY29uZmlnLmxlZ2VuZC5tYXJrZXJzLmN1c3RvbUhUTUwoKSkscC5zZXRBdHRycyhnLHtyZWw6bysxLCJkYXRhOmNvbGxhcHNlZCI6aHx8Y30pLChofHxjKSYmZy5jbGFzc0xpc3QuYWRkKCJpbmFjdGl2ZS1sZWdlbmQiKTt2YXIgUz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxDPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtDLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtbGVnZW5kLXRleHQiKSxDLmlubmVySFRNTD1sO3ZhciBMPXQuY29uZmlnLmxlZ2VuZC5sYWJlbHMudXNlU2VyaWVzQ29sb3JzP3QuZ2xvYmFscy5jb2xvcnNbb106dC5jb25maWcubGVnZW5kLmxhYmVscy5jb2xvcnM7THx8KEw9dC5jb25maWcuY2hhcnQuZm9yZUNvbG9yKSxDLnN0eWxlLmNvbG9yPUwsQy5zdHlsZS5mb250U2l6ZT1wYXJzZUZsb2F0KHQuY29uZmlnLmxlZ2VuZC5mb250U2l6ZSkrInB4IixDLnN0eWxlLmZvbnRGYW1pbHk9ZXx8dC5jb25maWcuY2hhcnQuZm9udEZhbWlseSxwLnNldEF0dHJzKEMse3JlbDpvKzEsaTpvLCJkYXRhOmRlZmF1bHQtdGV4dCI6bCwiZGF0YTpjb2xsYXBzZWQiOmh8fGN9KSxTLmFwcGVuZENoaWxkKGcpLFMuYXBwZW5kQ2hpbGQoQyk7dmFyIFA9bmV3IHcodGhpcy5jdHgpO2lmKCF0LmNvbmZpZy5sZWdlbmQuc2hvd0Zvclplcm9TZXJpZXMpMD09PVAuZ2V0U2VyaWVzVG90YWxCeUluZGV4KG8pJiZQLnNlcmllc0hhdmVTYW1lVmFsdWVzKG8pJiYhUC5pc1Nlcmllc051bGwobykmJi0xPT09dC5nbG9iYWxzLmNvbGxhcHNlZFNlcmllc0luZGljZXMuaW5kZXhPZihvKSYmLTE9PT10Lmdsb2JhbHMuYW5jaWxsYXJ5Q29sbGFwc2VkU2VyaWVzSW5kaWNlcy5pbmRleE9mKG8pJiZTLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtaGlkZGVuLXplcm8tc2VyaWVzIik7dC5jb25maWcubGVnZW5kLnNob3dGb3JOdWxsU2VyaWVzfHxQLmlzU2VyaWVzTnVsbChvKSYmLTE9PT10Lmdsb2JhbHMuY29sbGFwc2VkU2VyaWVzSW5kaWNlcy5pbmRleE9mKG8pJiYtMT09PXQuZ2xvYmFscy5hbmNpbGxhcnlDb2xsYXBzZWRTZXJpZXNJbmRpY2VzLmluZGV4T2YobykmJlMuY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy1oaWRkZW4tbnVsbC1zZXJpZXMiKSx0Lmdsb2JhbHMuZG9tLmVsTGVnZW5kV3JhcC5hcHBlbmRDaGlsZChTKSx0Lmdsb2JhbHMuZG9tLmVsTGVnZW5kV3JhcC5jbGFzc0xpc3QuYWRkKHQuY29uZmlnLmxlZ2VuZC5ob3Jpem9udGFsQWxpZ24pLHQuZ2xvYmFscy5kb20uZWxMZWdlbmRXcmFwLmNsYXNzTGlzdC5hZGQoInBvc2l0aW9uLSIrdC5jb25maWcubGVnZW5kLnBvc2l0aW9uKSxTLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtbGVnZW5kLXNlcmllcyIpLFMuc3R5bGUubWFyZ2luPSIiLmNvbmNhdCh0LmNvbmZpZy5sZWdlbmQuaXRlbU1hcmdpbi5ob3Jpem9udGFsLCJweCAiKS5jb25jYXQodC5jb25maWcubGVnZW5kLml0ZW1NYXJnaW4udmVydGljYWwsInB4IiksdC5nbG9iYWxzLmRvbS5lbExlZ2VuZFdyYXAuc3R5bGUud2lkdGg9dC5jb25maWcubGVnZW5kLndpZHRoP3QuY29uZmlnLmxlZ2VuZC53aWR0aCsicHgiOiIiLHQuZ2xvYmFscy5kb20uZWxMZWdlbmRXcmFwLnN0eWxlLmhlaWdodD10LmNvbmZpZy5sZWdlbmQuaGVpZ2h0P3QuY29uZmlnLmxlZ2VuZC5oZWlnaHQrInB4IjoiIixwLnNldEF0dHJzKFMse3JlbDpvKzEsImRhdGE6Y29sbGFwc2VkIjpofHxjfSksKGh8fGMpJiZTLmNsYXNzTGlzdC5hZGQoImluYWN0aXZlLWxlZ2VuZCIpLHQuY29uZmlnLmxlZ2VuZC5vbkl0ZW1DbGljay50b2dnbGVEYXRhU2VyaWVzfHxTLmNsYXNzTGlzdC5hZGQoIm5vLWNsaWNrIil9ImhlYXRtYXAiIT09dC5jb25maWcuY2hhcnQudHlwZSYmdC5jb25maWcubGVnZW5kLm9uSXRlbUNsaWNrLnRvZ2dsZURhdGFTZXJpZXMmJnQuZ2xvYmFscy5kb20uZWxXcmFwLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm9uTGVnZW5kQ2xpY2ssITApLHQuY29uZmlnLmxlZ2VuZC5vbkl0ZW1Ib3Zlci5oaWdobGlnaHREYXRhU2VyaWVzJiYodC5nbG9iYWxzLmRvbS5lbFdyYXAuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLm9uTGVnZW5kSG92ZXJlZCwhMCksdC5nbG9iYWxzLmRvbS5lbFdyYXAuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMub25MZWdlbmRIb3ZlcmVkLCEwKSl9fSx7a2V5OiJnZXRMZWdlbmRCQm94Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudy5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtbGVnZW5kIikuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZT10LndpZHRoO3JldHVybntjbHdoOnQuaGVpZ2h0LGNsd3c6ZX19fSx7a2V5OiJzZXRMZWdlbmRXcmFwWFkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53LHM9aS5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtbGVnZW5kIiksYT1zLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49MCxyPTA7aWYoImJvdHRvbSI9PT1pLmNvbmZpZy5sZWdlbmQucG9zaXRpb24pcis9aS5nbG9iYWxzLnN2Z0hlaWdodC1hLmhlaWdodC8yO2Vsc2UgaWYoInRvcCI9PT1pLmNvbmZpZy5sZWdlbmQucG9zaXRpb24pe3ZhciBvPW5ldyBXKHRoaXMuY3R4KSxsPW8uZ2V0VGl0bGVTdWJ0aXRsZUNvb3JkcygidGl0bGUiKS5oZWlnaHQsaD1vLmdldFRpdGxlU3VidGl0bGVDb29yZHMoInN1YnRpdGxlIikuaGVpZ2h0O3I9cisobD4wP2wtMTA6MCkrKGg+MD9oLTEwOjApfXMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixuPW4rdCtpLmNvbmZpZy5sZWdlbmQub2Zmc2V0WCxyPXIrZStpLmNvbmZpZy5sZWdlbmQub2Zmc2V0WSxzLnN0eWxlLmxlZnQ9bisicHgiLHMuc3R5bGUudG9wPXIrInB4IiwiYm90dG9tIj09PWkuY29uZmlnLmxlZ2VuZC5wb3NpdGlvbj8ocy5zdHlsZS50b3A9ImF1dG8iLHMuc3R5bGUuYm90dG9tPTEwK2kuY29uZmlnLmxlZ2VuZC5vZmZzZXRZKyJweCIpOiJyaWdodCI9PT1pLmNvbmZpZy5sZWdlbmQucG9zaXRpb24mJihzLnN0eWxlLmxlZnQ9ImF1dG8iLHMuc3R5bGUucmlnaHQ9MjUraS5jb25maWcubGVnZW5kLm9mZnNldFgrInB4Iikscy5zdHlsZS53aWR0aCYmKHMuc3R5bGUud2lkdGg9cGFyc2VJbnQoaS5jb25maWcubGVnZW5kLndpZHRoKSsicHgiKSxzLnN0eWxlLmhlaWdodCYmKHMuc3R5bGUuaGVpZ2h0PXBhcnNlSW50KGkuY29uZmlnLmxlZ2VuZC5oZWlnaHQpKyJweCIpfX0se2tleToibGVnZW5kQWxpZ25Ib3Jpem9udGFsIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudzt0Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy1sZWdlbmQiKS5zdHlsZS5yaWdodD0wO3ZhciBlPXRoaXMuZ2V0TGVnZW5kQkJveCgpLGk9bmV3IFcodGhpcy5jdHgpLHM9aS5nZXRUaXRsZVN1YnRpdGxlQ29vcmRzKCJ0aXRsZSIpLGE9aS5nZXRUaXRsZVN1YnRpdGxlQ29vcmRzKCJzdWJ0aXRsZSIpLG49MDsiYm90dG9tIj09PXQuY29uZmlnLmxlZ2VuZC5wb3NpdGlvbj9uPS1lLmNsd2gvMS44OiJ0b3AiPT09dC5jb25maWcubGVnZW5kLnBvc2l0aW9uJiYobj1zLmhlaWdodCthLmhlaWdodCt0LmNvbmZpZy50aXRsZS5tYXJnaW4rdC5jb25maWcuc3VidGl0bGUubWFyZ2luLTE1KSx0aGlzLnNldExlZ2VuZFdyYXBYWSgyMCxuKX19LHtrZXk6ImxlZ2VuZEFsaWduVmVydGljYWwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53LGU9dGhpcy5nZXRMZWdlbmRCQm94KCksaT0wOyJsZWZ0Ij09PXQuY29uZmlnLmxlZ2VuZC5wb3NpdGlvbiYmKGk9MjApLCJyaWdodCI9PT10LmNvbmZpZy5sZWdlbmQucG9zaXRpb24mJihpPXQuZ2xvYmFscy5zdmdXaWR0aC1lLmNsd3ctMTApLHRoaXMuc2V0TGVnZW5kV3JhcFhZKGksMjApfX0se2tleToib25MZWdlbmRIb3ZlcmVkIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLncsaT10LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImFwZXhjaGFydHMtbGVnZW5kLXRleHQiKXx8dC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJhcGV4Y2hhcnRzLWxlZ2VuZC1tYXJrZXIiKTtpZigiaGVhdG1hcCIhPT1lLmNvbmZpZy5jaGFydC50eXBlKSF0LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImluYWN0aXZlLWxlZ2VuZCIpJiZpJiZuZXcgQih0aGlzLmN0eCkudG9nZ2xlU2VyaWVzT25Ib3Zlcih0LHQudGFyZ2V0KTtlbHNlIGlmKGkpe3ZhciBzPXBhcnNlSW50KHQudGFyZ2V0LmdldEF0dHJpYnV0ZSgicmVsIikpLTE7dGhpcy5jdHguZmlyZUV2ZW50KCJsZWdlbmRIb3ZlciIsW3RoaXMuY3R4LHMsdGhpcy53XSksbmV3IEIodGhpcy5jdHgpLmhpZ2hsaWdodFJhbmdlSW5TZXJpZXModCx0LnRhcmdldCl9fX0se2tleToib25MZWdlbmRDbGljayIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJhcGV4Y2hhcnRzLWxlZ2VuZC10ZXh0Iil8fHQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygiYXBleGNoYXJ0cy1sZWdlbmQtbWFya2VyIikpe3ZhciBlPXBhcnNlSW50KHQudGFyZ2V0LmdldEF0dHJpYnV0ZSgicmVsIikpLTEsaT0idHJ1ZSI9PT10LnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGE6Y29sbGFwc2VkIikscz10aGlzLncuY29uZmlnLmNoYXJ0LmV2ZW50cy5sZWdlbmRDbGljazsiZnVuY3Rpb24iPT10eXBlb2YgcyYmcyh0aGlzLmN0eCxlLHRoaXMudyksdGhpcy5jdHguZmlyZUV2ZW50KCJsZWdlbmRDbGljayIsW3RoaXMuY3R4LGUsdGhpcy53XSk7dmFyIGE9dGhpcy53LmNvbmZpZy5sZWdlbmQubWFya2Vycy5vbkNsaWNrOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImFwZXhjaGFydHMtbGVnZW5kLW1hcmtlciIpJiYoYSh0aGlzLmN0eCxlLHRoaXMudyksdGhpcy5jdHguZmlyZUV2ZW50KCJsZWdlbmRNYXJrZXJDbGljayIsW3RoaXMuY3R4LGUsdGhpcy53XSkpLHRoaXMudG9nZ2xlRGF0YVNlcmllcyhlLGkpfX19LHtrZXk6InRvZ2dsZURhdGFTZXJpZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53O2lmKGkuZ2xvYmFscy5heGlzQ2hhcnRzfHwicmFkaWFsQmFyIj09PWkuY29uZmlnLmNoYXJ0LnR5cGUpe2kuZ2xvYmFscy5yZXNpemVkPSEwO3ZhciBzPW51bGwsYT1udWxsO2lmKGkuZ2xvYmFscy5yaXNpbmdTZXJpZXM9W10saS5nbG9iYWxzLmF4aXNDaGFydHM/KHM9aS5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtc2VyaWVzW2RhdGFcXDpyZWFsSW5kZXg9JyIuY29uY2F0KHQsIiddIikpLGE9cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoImRhdGE6cmVhbEluZGV4IikpKToocz1pLmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy1zZXJpZXNbcmVsPSciLmNvbmNhdCh0KzEsIiddIikpLGE9cGFyc2VJbnQocy5nZXRBdHRyaWJ1dGUoInJlbCIpKS0xKSxlKXRoaXMucmlzZUNvbGxhcHNlZFNlcmllcyhpLmdsb2JhbHMuY29sbGFwc2VkU2VyaWVzLGkuZ2xvYmFscy5jb2xsYXBzZWRTZXJpZXNJbmRpY2VzLGEpLHRoaXMucmlzZUNvbGxhcHNlZFNlcmllcyhpLmdsb2JhbHMuYW5jaWxsYXJ5Q29sbGFwc2VkU2VyaWVzLGkuZ2xvYmFscy5hbmNpbGxhcnlDb2xsYXBzZWRTZXJpZXNJbmRpY2VzLGEpO2Vsc2V7aWYoaS5nbG9iYWxzLmF4aXNDaGFydHMpe3ZhciBuPSExO2lmKGkuY29uZmlnLnlheGlzW2FdJiZpLmNvbmZpZy55YXhpc1thXS5zaG93JiZpLmNvbmZpZy55YXhpc1thXS5zaG93QWx3YXlzJiYobj0hMCxpLmdsb2JhbHMuYW5jaWxsYXJ5Q29sbGFwc2VkU2VyaWVzSW5kaWNlcy5pbmRleE9mKGEpPDAmJihpLmdsb2JhbHMuYW5jaWxsYXJ5Q29sbGFwc2VkU2VyaWVzLnB1c2goe2luZGV4OmEsZGF0YTppLmNvbmZpZy5zZXJpZXNbYV0uZGF0YS5zbGljZSgpLHR5cGU6cy5wYXJlbnROb2RlLmNsYXNzTmFtZS5iYXNlVmFsLnNwbGl0KCItIilbMV19KSxpLmdsb2JhbHMuYW5jaWxsYXJ5Q29sbGFwc2VkU2VyaWVzSW5kaWNlcy5wdXNoKGEpKSksIW4pe2kuZ2xvYmFscy5jb2xsYXBzZWRTZXJpZXMucHVzaCh7aW5kZXg6YSxkYXRhOmkuY29uZmlnLnNlcmllc1thXS5kYXRhLnNsaWNlKCksdHlwZTpzLnBhcmVudE5vZGUuY2xhc3NOYW1lLmJhc2VWYWwuc3BsaXQoIi0iKVsxXX0pLGkuZ2xvYmFscy5jb2xsYXBzZWRTZXJpZXNJbmRpY2VzLnB1c2goYSk7dmFyIHI9aS5nbG9iYWxzLnJpc2luZ1Nlcmllcy5pbmRleE9mKGEpO2kuZ2xvYmFscy5yaXNpbmdTZXJpZXMuc3BsaWNlKHIsMSl9aS5jb25maWcuc2VyaWVzW2FdLmRhdGE9W119ZWxzZSBpLmdsb2JhbHMuY29sbGFwc2VkU2VyaWVzLnB1c2goe2luZGV4OmEsZGF0YTppLmNvbmZpZy5zZXJpZXNbYV19KSxpLmdsb2JhbHMuY29sbGFwc2VkU2VyaWVzSW5kaWNlcy5wdXNoKGEpLGkuY29uZmlnLnNlcmllc1thXT0wO2Zvcih2YXIgbz1zLmNoaWxkTm9kZXMsbD0wO2w8by5sZW5ndGg7bCsrKW9bbF0uY2xhc3NMaXN0LmNvbnRhaW5zKCJhcGV4Y2hhcnRzLXNlcmllcy1tYXJrZXJzLXdyYXAiKSYmKG9bbF0uY2xhc3NMaXN0LmNvbnRhaW5zKCJhcGV4Y2hhcnRzLWhpZGUiKT9vW2xdLmNsYXNzTGlzdC5yZW1vdmUoImFwZXhjaGFydHMtaGlkZSIpOm9bbF0uY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy1oaWRlIikpO2kuZ2xvYmFscy5hbGxTZXJpZXNDb2xsYXBzZWQ9aS5nbG9iYWxzLmNvbGxhcHNlZFNlcmllcy5sZW5ndGg9PT1pLmdsb2JhbHMuc2VyaWVzLmxlbmd0aCx0aGlzLmN0eC5fdXBkYXRlU2VyaWVzKGkuY29uZmlnLnNlcmllcyxpLmNvbmZpZy5jaGFydC5hbmltYXRpb25zLmR5bmFtaWNBbmltYXRpb24uZW5hYmxlZCl9fWVsc2V7dmFyIGg9aS5nbG9iYWxzLmRvbS5QYXBlci5zZWxlY3QoIiAuYXBleGNoYXJ0cy1zZXJpZXNbcmVsPSciLmNvbmNhdCh0KzEsIiddIHBhdGgiKSksYz1pLmNvbmZpZy5jaGFydC50eXBlO2lmKCJwaWUiPT09Y3x8ImRvbnV0Ij09PWMpe3ZhciBkPWkuY29uZmlnLnBsb3RPcHRpb25zLnBpZS5kb251dC5sYWJlbHMsdT1uZXcgcCh0aGlzLmN0eCksZz1uZXcgWSh0aGlzLmN0eCk7dS5wYXRoTW91c2VEb3duKGgubWVtYmVyc1swXSxudWxsKSxnLnByaW50RGF0YUxhYmVsc0lubmVyKGgubWVtYmVyc1swXS5ub2RlLGQpfWguZmlyZSgiY2xpY2siKX19fSx7a2V5OiJyaXNlQ29sbGFwc2VkU2VyaWVzIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIHM9dGhpcy53O2lmKHQubGVuZ3RoPjApZm9yKHZhciBhPTA7YTx0Lmxlbmd0aDthKyspdFthXS5pbmRleD09PWkmJihzLmdsb2JhbHMuYXhpc0NoYXJ0cz8ocy5jb25maWcuc2VyaWVzW2ldLmRhdGE9dFthXS5kYXRhLnNsaWNlKCksdC5zcGxpY2UoYSwxKSxlLnNwbGljZShhLDEpLHMuZ2xvYmFscy5yaXNpbmdTZXJpZXMucHVzaChpKSk6KHMuY29uZmlnLnNlcmllc1tpXT10W2FdLmRhdGEsdC5zcGxpY2UoYSwxKSxlLnNwbGljZShhLDEpLHMuZ2xvYmFscy5yaXNpbmdTZXJpZXMucHVzaChpKSksdGhpcy5jdHguX3VwZGF0ZVNlcmllcyhzLmNvbmZpZy5zZXJpZXMscy5jb25maWcuY2hhcnQuYW5pbWF0aW9ucy5keW5hbWljQW5pbWF0aW9uLmVuYWJsZWQpKX19XSksdH0oKSxHPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpLHMsYSl7ZSh0aGlzLHQpLHRoaXMuY3R4PWksdGhpcy53PWkudyx0aGlzLnh5UmF0aW9zPXMsdGhpcy5wb2ludHNDaGFydD0hKCJidWJibGUiIT09dGhpcy53LmNvbmZpZy5jaGFydC50eXBlJiYic2NhdHRlciIhPT10aGlzLncuY29uZmlnLmNoYXJ0LnR5cGUpfHxhLHRoaXMuc2NhdHRlcj1uZXcgUCh0aGlzLmN0eCksdGhpcy5ub05lZ2F0aXZlcz10aGlzLncuZ2xvYmFscy5taW5YPT09TnVtYmVyLk1BWF9WQUxVRSx0aGlzLnlheGlzSW5kZXg9MH1yZXR1cm4gcyh0LFt7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIHM9dGhpcy53LGE9bmV3IHAodGhpcy5jdHgpLG49bmV3IEModGhpcy5jdHgpLG89cy5nbG9iYWxzLmNvbWJvQ2hhcnRzP2U6cy5jb25maWcuY2hhcnQudHlwZSxsPWEuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLSIuY29uY2F0KG8sIi1zZXJpZXMgYXBleGNoYXJ0cy1wbG90LXNlcmllcyIpfSksaD1uZXcgdyh0aGlzLmN0eCxzKTt0PWguZ2V0TG9nU2VyaWVzKHQpO3ZhciBjPXRoaXMueHlSYXRpb3MueVJhdGlvO2M9aC5nZXRMb2dZUmF0aW9zKGMpO2Zvcih2YXIgZD10aGlzLnh5UmF0aW9zLnpSYXRpbyxnPXRoaXMueHlSYXRpb3MueFJhdGlvLGY9dGhpcy54eVJhdGlvcy5iYXNlTGluZVkseD1bXSxiPVtdLG09MCx2PTA7djx0Lmxlbmd0aDt2Kyspe2lmKCJsaW5lIj09PW8mJigiZ3JhZGllbnQiPT09cy5jb25maWcuZmlsbC50eXBlfHwiZ3JhZGllbnQiPT09cy5jb25maWcuZmlsbC50eXBlW3ZdKSYmaC5zZXJpZXNIYXZlU2FtZVZhbHVlcyh2KSl7dmFyIHk9dFt2XS5zbGljZSgpO3lbeS5sZW5ndGgtMV09eVt5Lmxlbmd0aC0xXSsxZS02LHRbdl09eX12YXIgaz1zLmdsb2JhbHMuZ3JpZFdpZHRoL3MuZ2xvYmFscy5kYXRhUG9pbnRzLEE9cy5nbG9iYWxzLmNvbWJvQ2hhcnRzP2lbdl06djtjLmxlbmd0aD4xJiYodGhpcy55YXhpc0luZGV4PUEpLHRoaXMuaXNSZXZlcnNlZD1zLmNvbmZpZy55YXhpc1t0aGlzLnlheGlzSW5kZXhdJiZzLmNvbmZpZy55YXhpc1t0aGlzLnlheGlzSW5kZXhdLnJldmVyc2VkO3ZhciBTPVtdLFA9W10sTT1zLmdsb2JhbHMuZ3JpZEhlaWdodC1mW3RoaXMueWF4aXNJbmRleF0tKHRoaXMuaXNSZXZlcnNlZD9zLmdsb2JhbHMuZ3JpZEhlaWdodDowKSsodGhpcy5pc1JldmVyc2VkPzIqZlt0aGlzLnlheGlzSW5kZXhdOjApLEU9TTtNPnMuZ2xvYmFscy5ncmlkSGVpZ2h0JiYoRT1zLmdsb2JhbHMuZ3JpZEhlaWdodCksbT1rLzI7dmFyIFQ9cy5nbG9iYWxzLnBhZEhvcml6b250YWwrbSxYPTE7cy5nbG9iYWxzLmlzWE51bWVyaWMmJnMuZ2xvYmFscy5zZXJpZXNYLmxlbmd0aD4wJiYoVD0ocy5nbG9iYWxzLnNlcmllc1hbQV1bMF0tcy5nbG9iYWxzLm1pblgpL2cpLFAucHVzaChUKTt2YXIgST12b2lkIDAsWT12b2lkIDAsRj12b2lkIDAsUj12b2lkIDAsRD1bXSxOPVtdLE89YS5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMtc2VyaWVzIixzZXJpZXNOYW1lOnUuZXNjYXBlU3RyaW5nKHMuZ2xvYmFscy5zZXJpZXNOYW1lc1tBXSl9KSxIPWEuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLXNlcmllcy1tYXJrZXJzLXdyYXAifSksVz1hLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy1kYXRhbGFiZWxzIn0pO3RoaXMuY3R4LnNlcmllcy5hZGRDb2xsYXBzZWRDbGFzc1RvU2VyaWVzKE8sQSk7dmFyIEI9dFt2XS5sZW5ndGg9PT1zLmdsb2JhbHMuZGF0YVBvaW50cztPLmF0dHIoeyJkYXRhOmxvbmdlc3RTZXJpZXMiOkIscmVsOnYrMSwiZGF0YTpyZWFsSW5kZXgiOkF9KSx0aGlzLmFwcGVuZFBhdGhGcm9tPSEwO3ZhciBWPVQsRz12b2lkIDAsXz1WLGo9TSxVPTA7aWYoaj10aGlzLmRldGVybWluZUZpcnN0UHJldlkoe2k6dixzZXJpZXM6dCx5UmF0aW86Y1t0aGlzLnlheGlzSW5kZXhdLHplcm9ZOk0scHJldlk6aixwcmV2U2VyaWVzWTpiLGxpbmVZUG9zaXRpb246VX0pLnByZXZZLFMucHVzaChqKSxHPWosbnVsbD09PXRbdl1bMF0pe2Zvcih2YXIgcT0wO3E8dFt2XS5sZW5ndGg7cSsrKWlmKG51bGwhPT10W3ZdW3FdKXtfPWsqcSxqPU0tdFt2XVtxXS9jW3RoaXMueWF4aXNJbmRleF0sST1hLm1vdmUoXyxqKSxZPWEubW92ZShfLEUpO2JyZWFrfX1lbHNlIEk9YS5tb3ZlKF8saiksWT1hLm1vdmUoXyxFKSthLmxpbmUoXyxqKTtpZihGPWEubW92ZSgtMSxNKSthLmxpbmUoLTEsTSksUj1hLm1vdmUoLTEsTSkrYS5saW5lKC0xLE0pLHMuZ2xvYmFscy5wcmV2aW91c1BhdGhzLmxlbmd0aD4wKXt2YXIgWj10aGlzLmNoZWNrUHJldmlvdXNQYXRocyh7cGF0aEZyb21MaW5lOkYscGF0aEZyb21BcmVhOlIscmVhbEluZGV4OkF9KTtGPVoucGF0aEZyb21MaW5lLFI9Wi5wYXRoRnJvbUFyZWF9Zm9yKHZhciAkPXMuZ2xvYmFscy5kYXRhUG9pbnRzPjE/cy5nbG9iYWxzLmRhdGFQb2ludHMtMTpzLmdsb2JhbHMuZGF0YVBvaW50cyxKPTA7SjwkO0orKyl7aWYocy5nbG9iYWxzLmlzWE51bWVyaWMpe3ZhciBRPXMuZ2xvYmFscy5zZXJpZXNYW0FdW0orMV07dm9pZCAwPT09cy5nbG9iYWxzLnNlcmllc1hbQV1bSisxXSYmKFE9cy5nbG9iYWxzLnNlcmllc1hbQV1bJC0xXSksVD0oUS1zLmdsb2JhbHMubWluWCkvZ31lbHNlIFQrPWs7dmFyIEs9dS5pc051bWJlcihzLmdsb2JhbHMubWluWUFycltBXSk/cy5nbG9iYWxzLm1pbllBcnJbQV06cy5nbG9iYWxzLm1pblk7cy5jb25maWcuY2hhcnQuc3RhY2tlZD8oVT12PjAmJnMuZ2xvYmFscy5jb2xsYXBzZWRTZXJpZXMubGVuZ3RoPHMuY29uZmlnLnNlcmllcy5sZW5ndGgtMT9iW3YtMV1bSisxXTpNLFg9dm9pZCAwPT09dFt2XVtKKzFdfHxudWxsPT09dFt2XVtKKzFdP1UtSy9jW3RoaXMueWF4aXNJbmRleF0rMioodGhpcy5pc1JldmVyc2VkP0svY1t0aGlzLnlheGlzSW5kZXhdOjApOlUtdFt2XVtKKzFdL2NbdGhpcy55YXhpc0luZGV4XSsyKih0aGlzLmlzUmV2ZXJzZWQ/dFt2XVtKKzFdL2NbdGhpcy55YXhpc0luZGV4XTowKSk6WD12b2lkIDA9PT10W3ZdW0orMV18fG51bGw9PT10W3ZdW0orMV0/TS1LL2NbdGhpcy55YXhpc0luZGV4XSsyKih0aGlzLmlzUmV2ZXJzZWQ/Sy9jW3RoaXMueWF4aXNJbmRleF06MCk6TS10W3ZdW0orMV0vY1t0aGlzLnlheGlzSW5kZXhdKzIqKHRoaXMuaXNSZXZlcnNlZD90W3ZdW0orMV0vY1t0aGlzLnlheGlzSW5kZXhdOjApLFAucHVzaChUKSxTLnB1c2goWCk7dmFyIHR0PXRoaXMuY3JlYXRlUGF0aHMoe3Nlcmllczp0LGk6dixqOkoseDpULHk6WCx4RGl2aXNpb246ayxwWDpWLHBZOkcsYXJlYUJvdHRvbVk6RSxsaW5lUGF0aDpJLGFyZWFQYXRoOlksbGluZVBhdGhzOkQsYXJlYVBhdGhzOk4sc2VyaWVzSW5kZXg6aX0pO049dHQuYXJlYVBhdGhzLEQ9dHQubGluZVBhdGhzLFY9dHQucFgsRz10dC5wWSxZPXR0LmFyZWFQYXRoLEk9dHQubGluZVBhdGgsdGhpcy5hcHBlbmRQYXRoRnJvbSYmKEYrPWEubGluZShULE0pLFIrPWEubGluZShULE0pKTt2YXIgZXQ9dGhpcy5jYWxjdWxhdGVQb2ludHMoe3Nlcmllczp0LHg6VCx5OlgscmVhbEluZGV4OkEsaTp2LGo6SixwcmV2WTpqLGNhdGVnb3J5QXhpc0NvcnJlY3Rpb246bSx4UmF0aW86Z30pO2lmKHRoaXMucG9pbnRzQ2hhcnQpdGhpcy5zY2F0dGVyLmRyYXcoTyxKLHtyZWFsSW5kZXg6QSxwb2ludHNQb3M6ZXQselJhdGlvOmQsZWxQYXJlbnQ6SH0pO2Vsc2V7dmFyIGl0PW5ldyBMKHRoaXMuY3R4KTtzLmdsb2JhbHMuZGF0YVBvaW50cz4xJiZILm5vZGUuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIik7dmFyIHN0PWl0LnBsb3RDaGFydE1hcmtlcnMoZXQsQSxKKzEpO251bGwhPT1zdCYmSC5hZGQoc3QpfXZhciBhdD0hdFt2XVtKKzFdfHx0W3ZdW0orMV0+dFt2XVtKXT8idG9wIjoiYm90dG9tIixudD1uZXcgeih0aGlzLmN0eCkuZHJhd0RhdGFMYWJlbChldCxBLEorMSxudWxsLGF0KTtudWxsIT09bnQmJlcuYWRkKG50KX1iLnB1c2goUykscy5nbG9iYWxzLnNlcmllc1h2YWx1ZXNbQV09UCxzLmdsb2JhbHMuc2VyaWVzWXZhbHVlc1tBXT1TLHRoaXMucG9pbnRzQ2hhcnR8fHMuZ2xvYmFscy5kZWxheWVkRWxlbWVudHMucHVzaCh7ZWw6SC5ub2RlLGluZGV4OkF9KTt2YXIgcnQ9e2k6dixyZWFsSW5kZXg6QSxhbmltYXRpb25EZWxheTp2LGluaXRpYWxTcGVlZDpzLmNvbmZpZy5jaGFydC5hbmltYXRpb25zLnNwZWVkLGRhdGFDaGFuZ2VTcGVlZDpzLmNvbmZpZy5jaGFydC5hbmltYXRpb25zLmR5bmFtaWNBbmltYXRpb24uc3BlZWQsY2xhc3NOYW1lOiJhcGV4Y2hhcnRzLSIuY29uY2F0KG8pfTtpZigiYXJlYSI9PT1vKWZvcih2YXIgb3Q9bi5maWxsUGF0aCh7c2VyaWVzTnVtYmVyOkF9KSxsdD0wO2x0PE4ubGVuZ3RoO2x0Kyspe3ZhciBodD1hLnJlbmRlclBhdGhzKHIoe30scnQse3BhdGhGcm9tOlIscGF0aFRvOk5bbHRdLHN0cm9rZToibm9uZSIsc3Ryb2tlV2lkdGg6MCxzdHJva2VMaW5lQ2FwOm51bGwsZmlsbDpvdH0pKTtPLmFkZChodCl9aWYocy5jb25maWcuc3Ryb2tlLnNob3cmJiF0aGlzLnBvaW50c0NoYXJ0KXt2YXIgY3Q9bnVsbDtjdD0ibGluZSI9PT1vP24uZmlsbFBhdGgoe3Nlcmllc051bWJlcjpBLGk6dn0pOnMuZ2xvYmFscy5zdHJva2UuY29sb3JzW0FdO2Zvcih2YXIgZHQ9MDtkdDxELmxlbmd0aDtkdCsrKXt2YXIgdXQ9YS5yZW5kZXJQYXRocyhyKHt9LHJ0LHtwYXRoRnJvbTpGLHBhdGhUbzpEW2R0XSxzdHJva2U6Y3Qsc3Ryb2tlV2lkdGg6QXJyYXkuaXNBcnJheShzLmNvbmZpZy5zdHJva2Uud2lkdGgpP3MuY29uZmlnLnN0cm9rZS53aWR0aFtBXTpzLmNvbmZpZy5zdHJva2Uud2lkdGgsc3Ryb2tlTGluZUNhcDpzLmNvbmZpZy5zdHJva2UubGluZUNhcCxmaWxsOiJub25lIn0pKTtPLmFkZCh1dCl9fU8uYWRkKEgpLE8uYWRkKFcpLHgucHVzaChPKX1mb3IodmFyIGd0PXgubGVuZ3RoO2d0PjA7Z3QtLSlsLmFkZCh4W2d0LTFdKTtyZXR1cm4gbH19LHtrZXk6ImNyZWF0ZVBhdGhzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LnNlcmllcyxpPXQuaSxzPXQuaixhPXQueCxuPXQueSxyPXQucFgsbz10LnBZLGw9dC54RGl2aXNpb24saD10LmFyZWFCb3R0b21ZLGM9dC5saW5lUGF0aCxkPXQuYXJlYVBhdGgsdT10LmxpbmVQYXRocyxnPXQuYXJlYVBhdGhzLGY9dC5zZXJpZXNJbmRleCx4PXRoaXMudyxiPW5ldyBwKHRoaXMuY3R4KSxtPXguY29uZmlnLnN0cm9rZS5jdXJ2ZTtpZihBcnJheS5pc0FycmF5KHguY29uZmlnLnN0cm9rZS5jdXJ2ZSkmJihtPUFycmF5LmlzQXJyYXkoZik/eC5jb25maWcuc3Ryb2tlLmN1cnZlW2ZbaV1dOnguY29uZmlnLnN0cm9rZS5jdXJ2ZVtpXSksInNtb290aCI9PT1tKXt2YXIgdj0uMzUqKGEtcik7eC5nbG9iYWxzLmhhc051bGxWYWx1ZXM/KG51bGwhPT1lW2ldW3NdJiYobnVsbCE9PWVbaV1bcysxXT8oYz1iLm1vdmUocixvKStiLmN1cnZlKHIrdixvLGEtdixuLGErMSxuKSxkPWIubW92ZShyKzEsbykrYi5jdXJ2ZShyK3YsbyxhLXYsbixhKzEsbikrYi5saW5lKGEsaCkrYi5saW5lKHIsaCkrInoiKTooYz1iLm1vdmUocixvKSxkPWIubW92ZShyLG8pKyJ6IikpLHUucHVzaChjKSxnLnB1c2goZCkpOihjKz1iLmN1cnZlKHIrdixvLGEtdixuLGEsbiksZCs9Yi5jdXJ2ZShyK3YsbyxhLXYsbixhLG4pKSxyPWEsbz1uLHM9PT1lW2ldLmxlbmd0aC0yJiYoZD1kK2IuY3VydmUocixvLGEsbixhLGgpK2IubW92ZShhLG4pKyJ6Iix4Lmdsb2JhbHMuaGFzTnVsbFZhbHVlc3x8KHUucHVzaChjKSxnLnB1c2goZCkpKX1lbHNlIG51bGw9PT1lW2ldW3MrMV0mJihjKz1iLm1vdmUoYSxuKSxkPWQrYi5saW5lKGEtbCxoKStiLm1vdmUoYSxuKSksbnVsbD09PWVbaV1bc10mJihjKz1iLm1vdmUoYSxuKSxkKz1iLm1vdmUoYSxoKSksInN0ZXBsaW5lIj09PW0/KGM9YytiLmxpbmUoYSxudWxsLCJIIikrYi5saW5lKG51bGwsbiwiViIpLGQ9ZCtiLmxpbmUoYSxudWxsLCJIIikrYi5saW5lKG51bGwsbiwiViIpKToic3RyYWlnaHQiPT09bSYmKGMrPWIubGluZShhLG4pLGQrPWIubGluZShhLG4pKSxzPT09ZVtpXS5sZW5ndGgtMiYmKGQ9ZCtiLmxpbmUoYSxoKStiLm1vdmUoYSxuKSsieiIsdS5wdXNoKGMpLGcucHVzaChkKSk7cmV0dXJue2xpbmVQYXRoczp1LGFyZWFQYXRoczpnLHBYOnIscFk6byxsaW5lUGF0aDpjLGFyZWFQYXRoOmR9fX0se2tleToiY2FsY3VsYXRlUG9pbnRzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LnNlcmllcyxpPXQucmVhbEluZGV4LHM9dC54LGE9dC55LG49dC5pLHI9dC5qLG89dC5wcmV2WSxsPXQuY2F0ZWdvcnlBeGlzQ29ycmVjdGlvbixoPXQueFJhdGlvLGM9dGhpcy53LGQ9W10sZz1bXTtpZigwPT09cil7dmFyIGY9bCtjLmNvbmZpZy5tYXJrZXJzLm9mZnNldFg7Yy5nbG9iYWxzLmlzWE51bWVyaWMmJihmPShjLmdsb2JhbHMuc2VyaWVzWFtpXVswXS1jLmdsb2JhbHMubWluWCkvaCtjLmNvbmZpZy5tYXJrZXJzLm9mZnNldFgpLGQucHVzaChmKSxnLnB1c2godS5pc051bWJlcihlW25dWzBdKT9vK2MuY29uZmlnLm1hcmtlcnMub2Zmc2V0WTpudWxsKSxkLnB1c2gocytjLmNvbmZpZy5tYXJrZXJzLm9mZnNldFgpLGcucHVzaCh1LmlzTnVtYmVyKGVbbl1bcisxXSk/YStjLmNvbmZpZy5tYXJrZXJzLm9mZnNldFk6bnVsbCl9ZWxzZSBkLnB1c2gocytjLmNvbmZpZy5tYXJrZXJzLm9mZnNldFgpLGcucHVzaCh1LmlzTnVtYmVyKGVbbl1bcisxXSk/YStjLmNvbmZpZy5tYXJrZXJzLm9mZnNldFk6bnVsbCk7cmV0dXJue3g6ZCx5Omd9fX0se2tleToiY2hlY2tQcmV2aW91c1BhdGhzIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dC5wYXRoRnJvbUxpbmUsaT10LnBhdGhGcm9tQXJlYSxzPXQucmVhbEluZGV4LGE9dGhpcy53LG49MDtuPGEuZ2xvYmFscy5wcmV2aW91c1BhdGhzLmxlbmd0aDtuKyspe3ZhciByPWEuZ2xvYmFscy5wcmV2aW91c1BhdGhzW25dOygibGluZSI9PT1yLnR5cGV8fCJhcmVhIj09PXIudHlwZSkmJnIucGF0aHMubGVuZ3RoPjAmJnBhcnNlSW50KHIucmVhbEluZGV4KT09PXBhcnNlSW50KHMpJiYoImxpbmUiPT09ci50eXBlPyh0aGlzLmFwcGVuZFBhdGhGcm9tPSExLGU9YS5nbG9iYWxzLnByZXZpb3VzUGF0aHNbbl0ucGF0aHNbMF0uZCk6ImFyZWEiPT09ci50eXBlJiYodGhpcy5hcHBlbmRQYXRoRnJvbT0hMSxpPWEuZ2xvYmFscy5wcmV2aW91c1BhdGhzW25dLnBhdGhzWzBdLmQsYS5jb25maWcuc3Ryb2tlLnNob3cmJihlPWEuZ2xvYmFscy5wcmV2aW91c1BhdGhzW25dLnBhdGhzWzFdLmQpKSl9cmV0dXJue3BhdGhGcm9tTGluZTplLHBhdGhGcm9tQXJlYTppfX19LHtrZXk6ImRldGVybWluZUZpcnN0UHJldlkiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuaSxpPXQuc2VyaWVzLHM9dC55UmF0aW8sYT10Lnplcm9ZLG49dC5wcmV2WSxyPXQucHJldlNlcmllc1ksbz10LmxpbmVZUG9zaXRpb24sbD10aGlzLnc7aWYodm9pZCAwIT09aVtlXVswXSluPWwuY29uZmlnLmNoYXJ0LnN0YWNrZWQ/KG89ZT4wP3JbZS0xXVswXTphKS1pW2VdWzBdL3MrMioodGhpcy5pc1JldmVyc2VkP2lbZV1bMF0vczowKTphLWlbZV1bMF0vcysyKih0aGlzLmlzUmV2ZXJzZWQ/aVtlXVswXS9zOjApO2Vsc2UgaWYobC5jb25maWcuY2hhcnQuc3RhY2tlZCYmZT4wJiZ2b2lkIDA9PT1pW2VdWzBdKWZvcih2YXIgaD1lLTE7aD49MDtoLS0paWYobnVsbCE9PWlbaF1bMF0mJnZvaWQgMCE9PWlbaF1bMF0pe249bz1yW2hdWzBdO2JyZWFrfXJldHVybntwcmV2WTpuLGxpbmVZUG9zaXRpb246b319fV0pLHR9KCksXz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaSl7ZSh0aGlzLHQpLHRoaXMuY3R4PWksdGhpcy53PWkudzt2YXIgcz10aGlzLnc7dGhpcy54YXhpc0xhYmVscz1zLmdsb2JhbHMubGFiZWxzLnNsaWNlKCkscy5nbG9iYWxzLnRpbWVsaW5lTGFiZWxzLmxlbmd0aD4wJiYodGhpcy54YXhpc0xhYmVscz1zLmdsb2JhbHMudGltZWxpbmVMYWJlbHMuc2xpY2UoKSksdGhpcy5kcmF3bkxhYmVscz1bXSwidG9wIj09PXMuY29uZmlnLnhheGlzLnBvc2l0aW9uP3RoaXMub2ZmWT0wOnRoaXMub2ZmWT1zLmdsb2JhbHMuZ3JpZEhlaWdodCsxLHRoaXMub2ZmWT10aGlzLm9mZlkrcy5jb25maWcueGF4aXMuYXhpc0JvcmRlci5vZmZzZXRZLHRoaXMueGF4aXNGb250U2l6ZT1zLmNvbmZpZy54YXhpcy5sYWJlbHMuc3R5bGUuZm9udFNpemUsdGhpcy54YXhpc0ZvbnRGYW1pbHk9cy5jb25maWcueGF4aXMubGFiZWxzLnN0eWxlLmZvbnRGYW1pbHksdGhpcy54YXhpc0ZvcmVDb2xvcnM9cy5jb25maWcueGF4aXMubGFiZWxzLnN0eWxlLmNvbG9ycyx0aGlzLnhheGlzQm9yZGVyV2lkdGg9cy5jb25maWcueGF4aXMuYXhpc0JvcmRlci53aWR0aCx0aGlzLnhheGlzQm9yZGVyV2lkdGguaW5kZXhPZigiJSIpPi0xP3RoaXMueGF4aXNCb3JkZXJXaWR0aD1zLmdsb2JhbHMuZ3JpZFdpZHRoKnBhcnNlSW50KHRoaXMueGF4aXNCb3JkZXJXaWR0aCkvMTAwOnRoaXMueGF4aXNCb3JkZXJXaWR0aD1wYXJzZUludCh0aGlzLnhheGlzQm9yZGVyV2lkdGgpLHRoaXMueGF4aXNCb3JkZXJIZWlnaHQ9cy5jb25maWcueGF4aXMuYXhpc0JvcmRlci5oZWlnaHQsdGhpcy55YXhpcz1zLmNvbmZpZy55YXhpc1swXSx0aGlzLmF4ZXNVdGlscz1uZXcgTyhpKX1yZXR1cm4gcyh0LFt7a2V5OiJkcmF3WGF4aXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLncsaT1uZXcgcCh0aGlzLmN0eCkscz1pLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy14YXhpcyIsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoIi5jb25jYXQoZS5jb25maWcueGF4aXMub2Zmc2V0WCwiLCAiKS5jb25jYXQoZS5jb25maWcueGF4aXMub2Zmc2V0WSwiKSIpfSksYT1pLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy14YXhpcy10ZXh0cy1nIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgiLmNvbmNhdChlLmdsb2JhbHMudHJhbnNsYXRlWEF4aXNYLCIsICIpLmNvbmNhdChlLmdsb2JhbHMudHJhbnNsYXRlWEF4aXNZLCIpIil9KTtzLmFkZChhKTtmb3IodmFyIG49ZS5nbG9iYWxzLnBhZEhvcml6b250YWwscj1bXSxvPTA7bzx0aGlzLnhheGlzTGFiZWxzLmxlbmd0aDtvKyspci5wdXNoKHRoaXMueGF4aXNMYWJlbHNbb10pO249ZS5nbG9iYWxzLmlzWE51bWVyaWM/bisodD1lLmdsb2JhbHMuZ3JpZFdpZHRoLyhyLmxlbmd0aC0xKSkvMitlLmNvbmZpZy54YXhpcy5sYWJlbHMub2Zmc2V0WDpuKyh0PWUuZ2xvYmFscy5ncmlkV2lkdGgvci5sZW5ndGgpK2UuY29uZmlnLnhheGlzLmxhYmVscy5vZmZzZXRYO3ZhciBsPXIubGVuZ3RoO2lmKGUuY29uZmlnLnhheGlzLmxhYmVscy5zaG93KWZvcih2YXIgaD0wO2g8PWwtMTtoKyspe3ZhciBjPW4tdC8yK2UuY29uZmlnLnhheGlzLmxhYmVscy5vZmZzZXRYLGQ9dGhpcy5heGVzVXRpbHMuZ2V0TGFiZWwocixlLmdsb2JhbHMudGltZWxpbmVMYWJlbHMsYyxoLHRoaXMuZHJhd25MYWJlbHMpO3RoaXMuZHJhd25MYWJlbHMucHVzaChkLnRleHQpO3ZhciB1PTI4O2UuZ2xvYmFscy5yb3RhdGVYTGFiZWxzJiYodT0yMik7dmFyIGc9aS5kcmF3VGV4dCh7eDpkLngseTp0aGlzLm9mZlkrZS5jb25maWcueGF4aXMubGFiZWxzLm9mZnNldFkrdSx0ZXh0OiIiLHRleHRBbmNob3I6Im1pZGRsZSIsZm9udFdlaWdodDpkLmlzQm9sZD82MDA6NDAwLGZvbnRTaXplOnRoaXMueGF4aXNGb250U2l6ZSxmb250RmFtaWx5OnRoaXMueGF4aXNGb250RmFtaWx5LGZvcmVDb2xvcjpBcnJheS5pc0FycmF5KHRoaXMueGF4aXNGb3JlQ29sb3JzKT90aGlzLnhheGlzRm9yZUNvbG9yc1toXTp0aGlzLnhheGlzRm9yZUNvbG9ycyxjc3NDbGFzczoiYXBleGNoYXJ0cy14YXhpcy1sYWJlbCAiK2UuY29uZmlnLnhheGlzLmxhYmVscy5zdHlsZS5jc3NDbGFzc30pO2g9PT1sLTEmJmUuZ2xvYmFscy5za2lwTGFzdFRpbWVsaW5lbGFiZWwmJihkLnRleHQ9IiIpLGEuYWRkKGcpLGkuYWRkVHNwYW4oZyxkLnRleHQsdGhpcy54YXhpc0ZvbnRGYW1pbHkpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhlLmdsb2JhbHMuU1ZHTlMsInRpdGxlIik7Zi50ZXh0Q29udGVudD1kLnRleHQsZy5ub2RlLmFwcGVuZENoaWxkKGYpLG4rPXR9aWYodm9pZCAwIT09ZS5jb25maWcueGF4aXMudGl0bGUudGV4dCl7dmFyIHg9aS5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMteGF4aXMtdGl0bGUifSksYj1pLmRyYXdUZXh0KHt4OmUuZ2xvYmFscy5ncmlkV2lkdGgvMitlLmNvbmZpZy54YXhpcy50aXRsZS5vZmZzZXRYLHk6dGhpcy5vZmZZLXBhcnNlSW50KHRoaXMueGF4aXNGb250U2l6ZSkrZS5nbG9iYWxzLnhBeGlzTGFiZWxzSGVpZ2h0K2UuY29uZmlnLnhheGlzLnRpdGxlLm9mZnNldFksdGV4dDplLmNvbmZpZy54YXhpcy50aXRsZS50ZXh0LHRleHRBbmNob3I6Im1pZGRsZSIsZm9udFNpemU6ZS5jb25maWcueGF4aXMudGl0bGUuc3R5bGUuZm9udFNpemUsZm9udEZhbWlseTplLmNvbmZpZy54YXhpcy50aXRsZS5zdHlsZS5mb250RmFtaWx5LGZvcmVDb2xvcjplLmNvbmZpZy54YXhpcy50aXRsZS5zdHlsZS5jb2xvcixjc3NDbGFzczoiYXBleGNoYXJ0cy14YXhpcy10aXRsZS10ZXh0ICIrZS5jb25maWcueGF4aXMudGl0bGUuc3R5bGUuY3NzQ2xhc3N9KTt4LmFkZChiKSxzLmFkZCh4KX1pZihlLmNvbmZpZy54YXhpcy5heGlzQm9yZGVyLnNob3cpe3ZhciBtPTA7ImJhciI9PT1lLmNvbmZpZy5jaGFydC50eXBlJiZlLmdsb2JhbHMuaXNYTnVtZXJpYyYmKG0tPTE1KTt2YXIgdj1pLmRyYXdMaW5lKGUuZ2xvYmFscy5wYWRIb3Jpem9udGFsK20rZS5jb25maWcueGF4aXMuYXhpc0JvcmRlci5vZmZzZXRYLHRoaXMub2ZmWSx0aGlzLnhheGlzQm9yZGVyV2lkdGgsdGhpcy5vZmZZLGUuY29uZmlnLnhheGlzLmF4aXNCb3JkZXIuY29sb3IsMCx0aGlzLnhheGlzQm9yZGVySGVpZ2h0KTtzLmFkZCh2KX1yZXR1cm4gc319LHtrZXk6ImRyYXdYYXhpc0ludmVyc2VkIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxpLHM9dGhpcy53LGE9bmV3IHAodGhpcy5jdHgpLG49cy5jb25maWcueWF4aXNbMF0ub3Bwb3NpdGU/cy5nbG9iYWxzLnRyYW5zbGF0ZVlBeGlzWFt0XTowLHI9YS5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMteWF4aXMgYXBleGNoYXJ0cy14YXhpcy1pbnZlcnNlZCIscmVsOnR9KSxvPWEuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLXlheGlzLXRleHRzLWcgYXBleGNoYXJ0cy14YXhpcy1pbnZlcnNlZC10ZXh0cy1nIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgiK24rIiwgMCkifSk7ci5hZGQobyk7Zm9yKHZhciBsPVtdLGg9MDtoPHRoaXMueGF4aXNMYWJlbHMubGVuZ3RoO2grKylsLnB1c2godGhpcy54YXhpc0xhYmVsc1toXSk7aT0tKGU9cy5nbG9iYWxzLmdyaWRIZWlnaHQvbC5sZW5ndGgpLzIuMjt2YXIgYz1zLmdsb2JhbHMueUxhYmVsRm9ybWF0dGVyc1swXSxkPXMuY29uZmlnLnlheGlzWzBdLmxhYmVscztpZihkLnNob3cpZm9yKHZhciB1PTA7dTw9bC5sZW5ndGgtMTt1Kyspe3ZhciBnPXZvaWQgMD09PWxbdV0/IiI6bFt1XTtnPWMoZyx7c2VyaWVzSW5kZXg6dCxkYXRhUG9pbnRJbmRleDp1LHc6c30pO3ZhciBmPWEuZHJhd1RleHQoe3g6ZC5vZmZzZXRYLTE1LHk6aStlK2Qub2Zmc2V0WSx0ZXh0OmcsdGV4dEFuY2hvcjp0aGlzLnlheGlzLm9wcG9zaXRlPyJzdGFydCI6ImVuZCIsZm9yZUNvbG9yOmQuc3R5bGUuY29sb3I/ZC5zdHlsZS5jb2xvcjpkLnN0eWxlLmNvbG9yc1t1XSxmb250U2l6ZTpkLnN0eWxlLmZvbnRTaXplLGZvbnRGYW1pbHk6ZC5zdHlsZS5mb250RmFtaWx5LGNzc0NsYXNzOiJhcGV4Y2hhcnRzLXlheGlzLWxhYmVsICIrZC5zdHlsZS5jc3NDbGFzc30pO2lmKG8uYWRkKGYpLDAhPT1zLmNvbmZpZy55YXhpc1t0XS5sYWJlbHMucm90YXRlKXt2YXIgeD1hLnJvdGF0ZUFyb3VuZENlbnRlcihmLm5vZGUpO2Yubm9kZS5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsInJvdGF0ZSgiLmNvbmNhdChzLmNvbmZpZy55YXhpc1t0XS5sYWJlbHMucm90YXRlLCIgIikuY29uY2F0KHgueCwiICIpLmNvbmNhdCh4LnksIikiKSl9aSs9ZX1pZih2b2lkIDAhPT1zLmNvbmZpZy55YXhpc1swXS50aXRsZS50ZXh0KXt2YXIgYj1hLmdyb3VwKHtjbGFzczoiYXBleGNoYXJ0cy15YXhpcy10aXRsZSBhcGV4Y2hhcnRzLXhheGlzLXRpdGxlLWludmVyc2VkIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgiK24rIiwgMCkifSksbT1hLmRyYXdUZXh0KHt4OjAseTpzLmdsb2JhbHMuZ3JpZEhlaWdodC8yLHRleHQ6cy5jb25maWcueWF4aXNbMF0udGl0bGUudGV4dCx0ZXh0QW5jaG9yOiJtaWRkbGUiLGZvcmVDb2xvcjpzLmNvbmZpZy55YXhpc1swXS50aXRsZS5zdHlsZS5jb2xvcixmb250U2l6ZTpzLmNvbmZpZy55YXhpc1swXS50aXRsZS5zdHlsZS5mb250U2l6ZSxmb250RmFtaWx5OnMuY29uZmlnLnlheGlzWzBdLnRpdGxlLnN0eWxlLmZvbnRGYW1pbHksY3NzQ2xhc3M6ImFwZXhjaGFydHMteWF4aXMtdGl0bGUtdGV4dCAiK3MuY29uZmlnLnlheGlzWzBdLnRpdGxlLnN0eWxlLmNzc0NsYXNzfSk7Yi5hZGQobSksci5hZGQoYil9aWYocy5jb25maWcueGF4aXMuYXhpc0JvcmRlci5zaG93KXt2YXIgdj1hLmRyYXdMaW5lKHMuZ2xvYmFscy5wYWRIb3Jpem9udGFsK3MuY29uZmlnLnhheGlzLmF4aXNCb3JkZXIub2Zmc2V0WCx0aGlzLm9mZlksdGhpcy54YXhpc0JvcmRlcldpZHRoLHRoaXMub2ZmWSx0aGlzLnlheGlzLmF4aXNCb3JkZXIuY29sb3IsMCx0aGlzLnhheGlzQm9yZGVySGVpZ2h0KTtyLmFkZCh2KSx0aGlzLmF4ZXNVdGlscy5kcmF3WUF4aXNUaWNrcygwLGwubGVuZ3RoLHMuY29uZmlnLnlheGlzWzBdLmF4aXNCb3JkZXIscy5jb25maWcueWF4aXNbMF0uYXhpc1RpY2tzLDAsZSxyKX1yZXR1cm4gcn19LHtrZXk6ImRyYXdYYXhpc1RpY2tzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudyxzPXQ7aWYoISh0PDB8fHQ+aS5nbG9iYWxzLmdyaWRXaWR0aCkpe3ZhciBhPXRoaXMub2ZmWStpLmNvbmZpZy54YXhpcy5heGlzVGlja3Mub2Zmc2V0WSxuPWEraS5jb25maWcueGF4aXMuYXhpc1RpY2tzLmhlaWdodDtpZihpLmNvbmZpZy54YXhpcy5heGlzVGlja3Muc2hvdyl7dmFyIHI9bmV3IHAodGhpcy5jdHgpLmRyYXdMaW5lKHQraS5jb25maWcueGF4aXMuYXhpc1RpY2tzLm9mZnNldFgsYStpLmNvbmZpZy54YXhpcy5vZmZzZXRZLHMraS5jb25maWcueGF4aXMuYXhpc1RpY2tzLm9mZnNldFgsbitpLmNvbmZpZy54YXhpcy5vZmZzZXRZLGkuY29uZmlnLnhheGlzLmF4aXNUaWNrcy5jb2xvcik7ZS5hZGQociksci5ub2RlLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMteGF4aXMtdGljayIpfX19fSx7a2V5OiJnZXRYQXhpc1RpY2tzUG9zaXRpb25zIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudyxlPVtdLGk9dGhpcy54YXhpc0xhYmVscy5sZW5ndGgscz10Lmdsb2JhbHMucGFkSG9yaXpvbnRhbDtpZih0Lmdsb2JhbHMudGltZWxpbmVMYWJlbHMubGVuZ3RoPjApZm9yKHZhciBhPTA7YTxpO2ErKylzPXRoaXMueGF4aXNMYWJlbHNbYV0ucG9zaXRpb24sZS5wdXNoKHMpO2Vsc2UgZm9yKHZhciBuPWkscj0wO3I8bjtyKyspe3ZhciBvPW47dC5nbG9iYWxzLmlzWE51bWVyaWMmJiJiYXIiIT09dC5jb25maWcuY2hhcnQudHlwZSYmKG8tPTEpLHMrPXQuZ2xvYmFscy5ncmlkV2lkdGgvbyxlLnB1c2gocyl9cmV0dXJuIGV9fSx7a2V5OiJ4QXhpc0xhYmVsQ29ycmVjdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53LGU9bmV3IHAodGhpcy5jdHgpLGk9dC5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMteGF4aXMtdGV4dHMtZyIpLHM9dC5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvckFsbCgiLmFwZXhjaGFydHMteGF4aXMtdGV4dHMtZyB0ZXh0IiksYT10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy15YXhpcy1pbnZlcnNlZCB0ZXh0Iiksbj10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy14YXhpcy1pbnZlcnNlZC10ZXh0cy1nIHRleHQiKTtpZih0Lmdsb2JhbHMucm90YXRlWExhYmVsc3x8dC5jb25maWcueGF4aXMubGFiZWxzLnJvdGF0ZUFsd2F5cylmb3IodmFyIHI9MDtyPHMubGVuZ3RoO3IrKyl7dmFyIG89ZS5yb3RhdGVBcm91bmRDZW50ZXIoc1tyXSk7by55PW8ueS0xLG8ueD1vLngrMSxzW3JdLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwicm90YXRlKCIuY29uY2F0KHQuY29uZmlnLnhheGlzLmxhYmVscy5yb3RhdGUsIiAiKS5jb25jYXQoby54LCIgIikuY29uY2F0KG8ueSwiKSIpKSxzW3JdLnNldEF0dHJpYnV0ZSgidGV4dC1hbmNob3IiLCJlbmQiKTtpLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKDAsICIuY29uY2F0KC0xMCwiKSIpKTt2YXIgbD1zW3JdLmNoaWxkTm9kZXM7dC5jb25maWcueGF4aXMubGFiZWxzLnRyaW0mJmUucGxhY2VUZXh0V2l0aEVsbGlwc2lzKGxbMF0sbFswXS50ZXh0Q29udGVudCx0LmNvbmZpZy54YXhpcy5sYWJlbHMubWF4SGVpZ2h0LTQwKX1lbHNlIGZvcih2YXIgaD10Lmdsb2JhbHMuZ3JpZFdpZHRoL3QuZ2xvYmFscy5sYWJlbHMubGVuZ3RoLGM9MDtjPHMubGVuZ3RoO2MrKyl7dmFyIGQ9c1tjXS5jaGlsZE5vZGVzO3QuY29uZmlnLnhheGlzLmxhYmVscy50cmltJiYiZGF0ZXRpbWUiIT09dC5jb25maWcueGF4aXMudHlwZSYmZS5wbGFjZVRleHRXaXRoRWxsaXBzaXMoZFswXSxkWzBdLnRleHRDb250ZW50LGgpfWlmKGEubGVuZ3RoPjApe3ZhciB1PWFbYS5sZW5ndGgtMV0uZ2V0QkJveCgpLGc9YVswXS5nZXRCQm94KCk7dS54PC0yMCYmYVthLmxlbmd0aC0xXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYS5sZW5ndGgtMV0pLGcueCtnLndpZHRoPnQuZ2xvYmFscy5ncmlkV2lkdGgmJmFbMF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhWzBdKTtmb3IodmFyIGY9MDtmPG4ubGVuZ3RoO2YrKyllLnBsYWNlVGV4dFdpdGhFbGxpcHNpcyhuW2ZdLG5bZl0udGV4dENvbnRlbnQsdC5jb25maWcueWF4aXNbMF0ubGFiZWxzLm1heFdpZHRoLTIqcGFyc2VJbnQodC5jb25maWcueWF4aXNbMF0udGl0bGUuc3R5bGUuZm9udFNpemUpLTIwKX19fV0pLHR9KCksaj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaSl7ZSh0aGlzLHQpLHRoaXMuY3R4PWksdGhpcy53PWkud31yZXR1cm4gcyh0LFt7a2V5OiJuaWNlU2NhbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106MCxhPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XToxMCxuPXRoaXMudyxyPXZvaWQgMD09PXRoaXMudy5jb25maWcueWF4aXNbc10ubWF4JiZ2b2lkIDA9PT10aGlzLncuY29uZmlnLnlheGlzW3NdLm1pbnx8dGhpcy53LmNvbmZpZy55YXhpc1tzXS5mb3JjZU5pY2VTY2FsZTtpZih0PT09TnVtYmVyLk1JTl9WQUxVRSYmMD09PWV8fCF1LmlzTnVtYmVyKHQpJiYhdS5pc051bWJlcihlKXx8dD09PU51bWJlci5NSU5fVkFMVUUmJmU9PT0tTnVtYmVyLk1BWF9WQUxVRSlyZXR1cm4gdD0wLGU9YSx0aGlzLmxpbmVhclNjYWxlKHQsZSxhKTt0PmU/KGNvbnNvbGUud2FybigieWF4aXMubWluIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4geWF4aXMubWF4IiksZT10Ky4xKTp0PT09ZSYmKHQ9MD09PXQ/MDp0LS41LGU9MD09PWU/MjplKy41KTt2YXIgbz1bXSxsPU1hdGguYWJzKGUtdCk7bDwxJiZyJiYoImNhbmRsZXN0aWNrIj09PW4uY29uZmlnLmNoYXJ0LnR5cGV8fCJjYW5kbGVzdGljayI9PT1uLmNvbmZpZy5zZXJpZXNbc10udHlwZXx8bi5nbG9iYWxzLmlzUmFuZ2VEYXRhKSYmKGUqPTEuMDEpO3ZhciBoPWErMTtoPDI/aD0yOmg+MiYmKGgtPTIpO3ZhciBjPWwvaCxkPU1hdGguZmxvb3IodS5sb2cxMChjKSksZz1NYXRoLnBvdygxMCxkKSxmPU1hdGgucm91bmQoYy9nKTtmPDEmJihmPTEpO3ZhciBwPWYqZyx4PXAqTWF0aC5mbG9vcih0L3ApLGI9cCpNYXRoLmNlaWwoZS9wKSxtPXg7aWYociYmbD4yKXtmb3IoO28ucHVzaChtKSwhKChtKz1wKT5iKTspO3JldHVybntyZXN1bHQ6byxuaWNlTWluOm9bMF0sbmljZU1heDpvW28ubGVuZ3RoLTFdfX12YXIgdj10OyhvPVtdKS5wdXNoKHYpO2Zvcih2YXIgeT1NYXRoLmFicyhlLXQpL2Esdz0wO3c8PWE7dysrKXYrPXksby5wdXNoKHYpO3JldHVybiBvW28ubGVuZ3RoLTJdPj1lJiZvLnBvcCgpLHtyZXN1bHQ6byxuaWNlTWluOm9bMF0sbmljZU1heDpvW28ubGVuZ3RoLTFdfX19LHtrZXk6ImxpbmVhclNjYWxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXToxMCxzPU1hdGguYWJzKGUtdCkvaTtpPT09TnVtYmVyLk1BWF9WQUxVRSYmKGk9MTAscz0xKTtmb3IodmFyIGE9W10sbj10O2k+PTA7KWEucHVzaChuKSxuKz1zLGktPTE7cmV0dXJue3Jlc3VsdDphLG5pY2VNaW46YVswXSxuaWNlTWF4OmFbYS5sZW5ndGgtMV19fX0se2tleToibG9nYXJpdGhtaWNTY2FsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkscyl7KGU8MHx8ZT09PU51bWJlci5NSU5fVkFMVUUpJiYoZT0uMDEpO2Zvcih2YXIgYT1NYXRoLmxvZyhlKS9NYXRoLmxvZygxMCksbj1NYXRoLmxvZyhpKS9NYXRoLmxvZygxMCkscj1NYXRoLmFicyhpLWUpL3Msbz1bXSxsPWU7cz49MDspby5wdXNoKGwpLGwrPXIscy09MTt2YXIgaD1vLm1hcChmdW5jdGlvbih0LHMpe3Q8PTAmJih0PS4wMSk7dmFyIHI9KG4tYSkvKGktZSksbz1NYXRoLnBvdygxMCxhK3IqKHQtYSkpO3JldHVybiBNYXRoLnJvdW5kKG8vdS5yb3VuZFRvQmFzZShvLDEwKSkqdS5yb3VuZFRvQmFzZShvLDEwKX0pO3JldHVybiAwPT09aFswXSYmKGhbMF09MSkse3Jlc3VsdDpoLG5pY2VNaW46aFswXSxuaWNlTWF4OmhbaC5sZW5ndGgtMV19fX0se2tleToic2V0WVNjYWxlRm9ySW5kZXgiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcz10aGlzLncuZ2xvYmFscyxhPXRoaXMudy5jb25maWcsbj1zLmlzQmFySG9yaXpvbnRhbD9hLnhheGlzOmEueWF4aXNbdF07aWYodm9pZCAwPT09cy55QXhpc1NjYWxlW3RdJiYocy55QXhpc1NjYWxlW3RdPVtdKSxuLmxvZ2FyaXRobWljKXMuYWxsU2VyaWVzQ29sbGFwc2VkPSExLHMueUF4aXNTY2FsZVt0XT10aGlzLmxvZ2FyaXRobWljU2NhbGUodCxlLGksbi50aWNrQW1vdW50P24udGlja0Ftb3VudDpNYXRoLmZsb29yKE1hdGgubG9nMTAoaSkpKTtlbHNlIGlmKGkhPT0tTnVtYmVyLk1BWF9WQUxVRSYmdS5pc051bWJlcihpKSlpZihzLmFsbFNlcmllc0NvbGxhcHNlZD0hMSx2b2lkIDA9PT1uLm1pbiYmdm9pZCAwPT09bi5tYXh8fG4uZm9yY2VOaWNlU2NhbGUpe3ZhciByPU1hdGguYWJzKGktZSk7cy55QXhpc1NjYWxlW3RdPXRoaXMubmljZVNjYWxlKGUsaSxyLHQsbi50aWNrQW1vdW50P24udGlja0Ftb3VudDpyPDUmJnI+MT9yKzE6NSl9ZWxzZSBzLnlBeGlzU2NhbGVbdF09dGhpcy5saW5lYXJTY2FsZShlLGksbi50aWNrQW1vdW50KTtlbHNlIHMueUF4aXNTY2FsZVt0XT10aGlzLmxpbmVhclNjYWxlKDAsNSw1KX19LHtrZXk6InNldE11bHRpcGxlWVNjYWxlcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy53Lmdsb2JhbHMsaT10aGlzLncuY29uZmlnLHM9ZS5taW5ZQXJyLmNvbmNhdChbXSksYT1lLm1heFlBcnIuY29uY2F0KFtdKSxuPVtdO2kueWF4aXMuZm9yRWFjaChmdW5jdGlvbihyLG8pe3ZhciBsPW87aS5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbih0LGkpe3QubmFtZT09PXIuc2VyaWVzTmFtZSYmLTE9PT1lLmNvbGxhcHNlZFNlcmllc0luZGljZXMuaW5kZXhPZihpKSYmKGw9aSxvIT09aT9uLnB1c2goe2luZGV4Omksc2ltaWxhckluZGV4Om8sYWxyZWFkeUV4aXN0czohMH0pOm4ucHVzaCh7aW5kZXg6aX0pKX0pO3ZhciBoPXNbbF0sYz1hW2xdO3Quc2V0WVNjYWxlRm9ySW5kZXgobyxoLGMpfSksdGhpcy5zYW1lU2NhbGVJbk11bHRpcGxlQXhlcyhzLGEsbil9fSx7a2V5OiJzYW1lU2NhbGVJbk11bHRpcGxlQXhlcyIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBzPXRoaXMsYT10aGlzLncuY29uZmlnLG49dGhpcy53Lmdsb2JhbHMscj1bXTtpLmZvckVhY2goZnVuY3Rpb24odCl7dC5hbHJlYWR5RXhpc3RzJiYodm9pZCAwPT09clt0LmluZGV4XSYmKHJbdC5pbmRleF09W10pLHJbdC5pbmRleF0ucHVzaCh0LmluZGV4KSxyW3QuaW5kZXhdLnB1c2godC5zaW1pbGFySW5kZXgpKX0pLG4ueUF4aXNTYW1lU2NhbGVJbmRpY2VzPXIsci5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7ci5mb3JFYWNoKGZ1bmN0aW9uKGkscyl7dmFyIGEsbjtlIT09cyYmKGE9dCxuPWksYS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuLTEhPT1uLmluZGV4T2YodCl9KSkubGVuZ3RoPjAmJihyW2VdPXJbZV0uY29uY2F0KHJbc10pKX0pfSk7dmFyIG89ci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuZmlsdGVyKGZ1bmN0aW9uKGUsaSl7cmV0dXJuIHQuaW5kZXhPZihlKT09PWl9KX0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5zb3J0KCl9KTtyPXIuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiEhdH0pO3ZhciBsPW8uc2xpY2UoKSxoPWwubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KX0pO2w9bC5maWx0ZXIoZnVuY3Rpb24odCxlKXtyZXR1cm4gaC5pbmRleE9mKEpTT04uc3RyaW5naWZ5KHQpKT09PWV9KTt2YXIgYz1bXSxkPVtdO3QuZm9yRWFjaChmdW5jdGlvbih0LGkpe2wuZm9yRWFjaChmdW5jdGlvbihzLGEpe3MuaW5kZXhPZihpKT4tMSYmKHZvaWQgMD09PWNbYV0mJihjW2FdPVtdLGRbYV09W10pLGNbYV0ucHVzaCh7a2V5OmksdmFsdWU6dH0pLGRbYV0ucHVzaCh7a2V5OmksdmFsdWU6ZVtpXX0pKX0pfSk7dmFyIHU9QXJyYXkuYXBwbHkobnVsbCxBcnJheShsLmxlbmd0aCkpLm1hcChOdW1iZXIucHJvdG90eXBlLnZhbHVlT2YsTnVtYmVyLk1JTl9WQUxVRSksZz1BcnJheS5hcHBseShudWxsLEFycmF5KGwubGVuZ3RoKSkubWFwKE51bWJlci5wcm90b3R5cGUudmFsdWVPZiwtTnVtYmVyLk1BWF9WQUxVRSk7Yy5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dC5mb3JFYWNoKGZ1bmN0aW9uKHQsaSl7dVtlXT1NYXRoLm1pbih0LnZhbHVlLHVbZV0pfSl9KSxkLmZvckVhY2goZnVuY3Rpb24odCxlKXt0LmZvckVhY2goZnVuY3Rpb24odCxpKXtnW2VdPU1hdGgubWF4KHQudmFsdWUsZ1tlXSl9KX0pLHQuZm9yRWFjaChmdW5jdGlvbih0LGUpe2QuZm9yRWFjaChmdW5jdGlvbih0LGkpe3ZhciByPXVbaV0sbz1nW2ldO2EuY2hhcnQuc3RhY2tlZCYmKG89MCx0LmZvckVhY2goZnVuY3Rpb24odCxlKXtvKz10LnZhbHVlLHIhPT1OdW1iZXIuTUlOX1ZBTFVFJiYocis9Y1tpXVtlXS52YWx1ZSl9KSksdC5mb3JFYWNoKGZ1bmN0aW9uKGksbCl7dFtsXS5rZXk9PT1lJiYodm9pZCAwIT09YS55YXhpc1tlXS5taW4mJihyPSJmdW5jdGlvbiI9PXR5cGVvZiBhLnlheGlzW2VdLm1pbj9hLnlheGlzW2VdLm1pbihuLm1pblkpOmEueWF4aXNbZV0ubWluKSx2b2lkIDAhPT1hLnlheGlzW2VdLm1heCYmKG89ImZ1bmN0aW9uIj09dHlwZW9mIGEueWF4aXNbZV0ubWF4P2EueWF4aXNbZV0ubWF4KG4ubWF4WSk6YS55YXhpc1tlXS5tYXgpLHMuc2V0WVNjYWxlRm9ySW5kZXgoZSxyLG8pKX0pfSl9KX19LHtrZXk6ImF1dG9TY2FsZVkiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt0fHwodD10aGlzKTt2YXIgcz10Lnc7aWYocy5nbG9iYWxzLmlzTXVsdGlwbGVZQXhpc3x8cy5nbG9iYWxzLmNvbGxhcHNlZFNlcmllcy5sZW5ndGgpcmV0dXJuIGU7dmFyIGE9cy5nbG9iYWxzLnNlcmllc1hbMF0sbj1zLmNvbmZpZy5jaGFydC5zdGFja2VkO3JldHVybiBlLmZvckVhY2goZnVuY3Rpb24odCxyKXtmb3IodmFyIG89MCxsPTA7bDxhLmxlbmd0aDtsKyspaWYoYVtsXT49aS54YXhpcy5taW4pe289bDticmVha312YXIgaCxjLGQ9cy5nbG9iYWxzLm1pbllBcnJbcl0sdT1zLmdsb2JhbHMubWF4WUFycltyXSxnPXMuZ2xvYmFscy5zdGFja2VkU2VyaWVzVG90YWxzO3MuZ2xvYmFscy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihyLGwpe3ZhciBmPXJbb107bj8oZj1nW29dLGg9Yz1mLGcuZm9yRWFjaChmdW5jdGlvbih0LGUpe2FbZV08PWkueGF4aXMubWF4JiZhW2VdPj1pLnhheGlzLm1pbiYmKHQ+YyYmbnVsbCE9PXQmJihjPXQpLHJbZV08aCYmbnVsbCE9PXJbZV0mJihoPXJbZV0pKX0pKTooaD1jPWYsci5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7aWYoYVtlXTw9aS54YXhpcy5tYXgmJmFbZV0+PWkueGF4aXMubWluKXt2YXIgbj10LHI9dDtzLmdsb2JhbHMuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oaSxzKXtudWxsIT09dCYmKG49TWF0aC5taW4oaVtlXSxuKSxyPU1hdGgubWF4KGlbZV0scikpfSkscj5jJiZudWxsIT09ciYmKGM9ciksbjxoJiZudWxsIT09biYmKGg9bil9fSkpLHZvaWQgMD09PWgmJnZvaWQgMD09PWMmJihoPWQsYz11KSwoYyo9YzwwPy45OjEuMSk8MCYmYzx1JiYoYz11KSwoaCo9aDwwPzEuMTouOSk8MCYmaD5kJiYoaD1kKSxlLmxlbmd0aD4xPyhlW2xdLm1pbj12b2lkIDA9PT10Lm1pbj9oOnQubWluLGVbbF0ubWF4PXZvaWQgMD09PXQubWF4P2M6dC5tYXgpOihlWzBdLm1pbj12b2lkIDA9PT10Lm1pbj9oOnQubWluLGVbMF0ubWF4PXZvaWQgMD09PXQubWF4P2M6dC5tYXgpfSl9KSxlfX1dKSx0fSgpLFU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGkpe2UodGhpcyx0KSx0aGlzLmN0eD1pLHRoaXMudz1pLncsdGhpcy5zY2FsZXM9bmV3IGooaSl9cmV0dXJuIHModCxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNldFlSYW5nZSgpLHRoaXMuc2V0WFJhbmdlKCksdGhpcy5zZXRaUmFuZ2UoKX19LHtrZXk6ImdldE1pbllNYXhZIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06TnVtYmVyLk1BWF9WQUxVRSxpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTotTnVtYmVyLk1BWF9WQUxVRSxzPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpudWxsLGE9dGhpcy53Lmdsb2JhbHMsbj0tTnVtYmVyLk1BWF9WQUxVRSxyPU51bWJlci5NSU5fVkFMVUU7bnVsbD09PXMmJihzPXQrMSk7dmFyIG89YS5zZXJpZXMsbD1vLGg9bzsiY2FuZGxlc3RpY2siPT09dGhpcy53LmNvbmZpZy5jaGFydC50eXBlPyhsPWEuc2VyaWVzQ2FuZGxlTCxoPWEuc2VyaWVzQ2FuZGxlSCk6YS5pc1JhbmdlRGF0YSYmKGw9YS5zZXJpZXNSYW5nZVN0YXJ0LGg9YS5zZXJpZXNSYW5nZUVuZCk7Zm9yKHZhciBjPXQ7YzxzO2MrKyl7YS5kYXRhUG9pbnRzPU1hdGgubWF4KGEuZGF0YVBvaW50cyxvW2NdLmxlbmd0aCk7Zm9yKHZhciBkPTA7ZDxhLnNlcmllc1tjXS5sZW5ndGg7ZCsrKXt2YXIgZz1vW2NdW2RdO251bGwhPT1nJiZ1LmlzTnVtYmVyKGcpPyhuPU1hdGgubWF4KG4saFtjXVtkXSksZT1NYXRoLm1pbihlLGxbY11bZF0pLGk9TWF0aC5tYXgoaSxsW2NdW2RdKSwiY2FuZGxlc3RpY2siPT09dGhpcy53LmNvbmZpZy5jaGFydC50eXBlJiYobj1NYXRoLm1heChuLGEuc2VyaWVzQ2FuZGxlT1tjXVtkXSksbj1NYXRoLm1heChuLGEuc2VyaWVzQ2FuZGxlSFtjXVtkXSksbj1NYXRoLm1heChuLGEuc2VyaWVzQ2FuZGxlTFtjXVtkXSksaT1uPU1hdGgubWF4KG4sYS5zZXJpZXNDYW5kbGVDW2NdW2RdKSksdS5pc0Zsb2F0KGcpJiYoZz11Lm5vRXhwb25lbnRzKGcpLGEueVZhbHVlRGVjaW1hbD1NYXRoLm1heChhLnlWYWx1ZURlY2ltYWwsZy50b1N0cmluZygpLnNwbGl0KCIuIilbMV0ubGVuZ3RoKSkscj5sW2NdW2RdJiZsW2NdW2RdPDAmJihyPWxbY11bZF0pKTphLmhhc051bGxWYWx1ZXM9ITB9fXJldHVybnttaW5ZOnIsbWF4WTpuLGxvd2VzdFk6ZSxoaWdoZXN0WTppfX19LHtrZXk6InNldFlSYW5nZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLncuZ2xvYmFscyxlPXRoaXMudy5jb25maWc7dC5tYXhZPS1OdW1iZXIuTUFYX1ZBTFVFLHQubWluWT1OdW1iZXIuTUlOX1ZBTFVFO3ZhciBpPU51bWJlci5NQVhfVkFMVUU7aWYodC5pc011bHRpcGxlWUF4aXMpZm9yKHZhciBzPTA7czx0LnNlcmllcy5sZW5ndGg7cysrKXt2YXIgYT10aGlzLmdldE1pbllNYXhZKHMsaSxudWxsLHMrMSk7dC5taW5ZQXJyLnB1c2goYS5taW5ZKSx0Lm1heFlBcnIucHVzaChhLm1heFkpLGk9YS5sb3dlc3RZfXZhciBuPXRoaXMuZ2V0TWluWU1heFkoMCxpLG51bGwsdC5zZXJpZXMubGVuZ3RoKTtpZih0Lm1pblk9bi5taW5ZLHQubWF4WT1uLm1heFksaT1uLmxvd2VzdFksZS5jaGFydC5zdGFja2VkKXt2YXIgcj1bXSxvPVtdO2lmKHQuc2VyaWVzLmxlbmd0aClmb3IodmFyIGw9MDtsPHQuc2VyaWVzW3QubWF4VmFsc0luQXJyYXlJbmRleF0ubGVuZ3RoO2wrKylmb3IodmFyIGg9MCxjPTAsZD0wO2Q8dC5zZXJpZXMubGVuZ3RoO2QrKyludWxsIT09dC5zZXJpZXNbZF1bbF0mJnUuaXNOdW1iZXIodC5zZXJpZXNbZF1bbF0pJiYodC5zZXJpZXNbZF1bbF0+MD9oPWgrcGFyc2VGbG9hdCh0LnNlcmllc1tkXVtsXSkrMWUtNDpjKz1wYXJzZUZsb2F0KHQuc2VyaWVzW2RdW2xdKSksZD09PXQuc2VyaWVzLmxlbmd0aC0xJiYoci5wdXNoKGgpLG8ucHVzaChjKSk7Zm9yKHZhciBnPTA7ZzxyLmxlbmd0aDtnKyspdC5tYXhZPU1hdGgubWF4KHQubWF4WSxyW2ddKSx0Lm1pblk9TWF0aC5taW4odC5taW5ZLG9bZ10pfWlmKCgibGluZSI9PT1lLmNoYXJ0LnR5cGV8fCJhcmVhIj09PWUuY2hhcnQudHlwZXx8ImNhbmRsZXN0aWNrIj09PWUuY2hhcnQudHlwZSkmJnQubWluWT09PU51bWJlci5NSU5fVkFMVUUmJmkhPT0tTnVtYmVyLk1BWF9WQUxVRSYmaSE9PXQubWF4WSl7dmFyIGY9dC5tYXhZLWk7aT49MCYmaTw9MTAmJihmPTApLHQubWluWT1pLTUqZi8xMDAsdC5tYXhZPXQubWF4WSs1KmYvMTAwfXJldHVybiBlLnlheGlzLm1hcChmdW5jdGlvbihlLGkpe3ZvaWQgMCE9PWUubWF4JiYoIm51bWJlciI9PXR5cGVvZiBlLm1heD90Lm1heFlBcnJbaV09ZS5tYXg6ImZ1bmN0aW9uIj09dHlwZW9mIGUubWF4JiYodC5tYXhZQXJyW2ldPWUubWF4KHQubWF4WSkpLHQubWF4WT10Lm1heFlBcnJbaV0pLHZvaWQgMCE9PWUubWluJiYoIm51bWJlciI9PXR5cGVvZiBlLm1pbj90Lm1pbllBcnJbaV09ZS5taW46ImZ1bmN0aW9uIj09dHlwZW9mIGUubWluJiYodC5taW5ZQXJyW2ldPWUubWluKHQubWluWSkpLHQubWluWT10Lm1pbllBcnJbaV0pfSksdC5pc0Jhckhvcml6b250YWwmJih2b2lkIDAhPT1lLnhheGlzLm1pbiYmIm51bWJlciI9PXR5cGVvZiBlLnhheGlzLm1pbiYmKHQubWluWT1lLnhheGlzLm1pbiksdm9pZCAwIT09ZS54YXhpcy5tYXgmJiJudW1iZXIiPT10eXBlb2YgZS54YXhpcy5tYXgmJih0Lm1heFk9ZS54YXhpcy5tYXgpKSx0LmlzTXVsdGlwbGVZQXhpcz8odGhpcy5zY2FsZXMuc2V0TXVsdGlwbGVZU2NhbGVzKCksdC5taW5ZPWksdC55QXhpc1NjYWxlLmZvckVhY2goZnVuY3Rpb24oZSxpKXt0Lm1pbllBcnJbaV09ZS5uaWNlTWluLHQubWF4WUFycltpXT1lLm5pY2VNYXh9KSk6KHRoaXMuc2NhbGVzLnNldFlTY2FsZUZvckluZGV4KDAsdC5taW5ZLHQubWF4WSksdC5taW5ZPXQueUF4aXNTY2FsZVswXS5uaWNlTWluLHQubWF4WT10LnlBeGlzU2NhbGVbMF0ubmljZU1heCx0Lm1pbllBcnJbMF09dC55QXhpc1NjYWxlWzBdLm5pY2VNaW4sdC5tYXhZQXJyWzBdPXQueUF4aXNTY2FsZVswXS5uaWNlTWF4KSx7bWluWTp0Lm1pblksbWF4WTp0Lm1heFksbWluWUFycjp0Lm1pbllBcnIsbWF4WUFycjp0Lm1heFlBcnJ9fX0se2tleToic2V0WFJhbmdlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy53Lmdsb2JhbHMsaT10aGlzLncuY29uZmlnLHM9Im51bWVyaWMiPT09aS54YXhpcy50eXBlfHwiZGF0ZXRpbWUiPT09aS54YXhpcy50eXBlfHwiY2F0ZWdvcnkiPT09aS54YXhpcy50eXBlJiYhZS5ub0xhYmVsc1Byb3ZpZGVkfHxlLm5vTGFiZWxzUHJvdmlkZWR8fGUuaXNYTnVtZXJpYztpZihlLmlzWE51bWVyaWMpZm9yKHZhciBhPTA7YTxlLnNlcmllcy5sZW5ndGg7YSsrKWlmKGUubGFiZWxzW2FdKWZvcih2YXIgbj0wO248ZS5sYWJlbHNbYV0ubGVuZ3RoO24rKyludWxsIT09ZS5sYWJlbHNbYV1bbl0mJnUuaXNOdW1iZXIoZS5sYWJlbHNbYV1bbl0pJiYoZS5tYXhYPU1hdGgubWF4KGUubWF4WCxlLmxhYmVsc1thXVtuXSksZS5pbml0aWFsbWF4WD1NYXRoLm1heChlLm1heFgsZS5sYWJlbHNbYV1bbl0pLGUubWluWD1NYXRoLm1pbihlLm1pblgsZS5sYWJlbHNbYV1bbl0pLGUuaW5pdGlhbG1pblg9TWF0aC5taW4oZS5taW5YLGUubGFiZWxzW2FdW25dKSk7aWYoZS5ub0xhYmVsc1Byb3ZpZGVkJiYwPT09aS54YXhpcy5jYXRlZ29yaWVzLmxlbmd0aCYmKGUubWF4WD1lLmxhYmVsc1tlLmxhYmVscy5sZW5ndGgtMV0sZS5pbml0aWFsbWF4WD1lLmxhYmVsc1tlLmxhYmVscy5sZW5ndGgtMV0sZS5taW5YPTEsZS5pbml0aWFsbWluWD0xKSwoZS5jb21ib0NoYXJ0c0hhc0JhcnN8fCJjYW5kbGVzdGljayI9PT1pLmNoYXJ0LnR5cGV8fCJiYXIiPT09aS5jaGFydC50eXBlJiZlLmlzWE51bWVyaWMpJiYoImNhdGVnb3J5IiE9PWkueGF4aXMudHlwZXx8ZS5pc1hOdW1lcmljKSl7dmFyIHI9ZS5zdmdXaWR0aC9lLmRhdGFQb2ludHMqKE1hdGguYWJzKGUubWF4WC1lLm1pblgpL2Uuc3ZnV2lkdGgpLG89ZS5taW5YLXIvMjtlLm1pblg9byxlLmluaXRpYWxtaW5YPW87dmFyIGw9ZS5tYXhYK3IvKChlLnNlcmllcy5sZW5ndGgrMSkvZS5zZXJpZXMubGVuZ3RoKTtlLm1heFg9bCxlLmluaXRpYWxtYXhYPWx9IWUuaXNYTnVtZXJpYyYmIWUubm9MYWJlbHNQcm92aWRlZHx8aS54YXhpcy5jb252ZXJ0ZWRDYXRUb051bWVyaWMmJiFlLmRhdGFGb3JtYXRYTnVtZXJpY3x8KHZvaWQgMD09PWkueGF4aXMudGlja0Ftb3VudD8odD1NYXRoLnJvdW5kKGUuc3ZnV2lkdGgvMTUwKSwibnVtZXJpYyI9PT1pLnhheGlzLnR5cGUmJmUuZGF0YVBvaW50czwyMCYmKHQ9ZS5kYXRhUG9pbnRzLTEpLHQ+ZS5kYXRhUG9pbnRzJiYwIT09ZS5kYXRhUG9pbnRzJiYodD1lLmRhdGFQb2ludHMtMSkpOnQ9ImRhdGFQb2ludHMiPT09aS54YXhpcy50aWNrQW1vdW50P2Uuc2VyaWVzW2UubWF4VmFsc0luQXJyYXlJbmRleF0ubGVuZ3RoLTE6aS54YXhpcy50aWNrQW1vdW50LHZvaWQgMCE9PWkueGF4aXMubWF4JiYibnVtYmVyIj09dHlwZW9mIGkueGF4aXMubWF4JiYoZS5tYXhYPWkueGF4aXMubWF4KSx2b2lkIDAhPT1pLnhheGlzLm1pbiYmIm51bWJlciI9PXR5cGVvZiBpLnhheGlzLm1pbiYmKGUubWluWD1pLnhheGlzLm1pbiksdm9pZCAwIT09aS54YXhpcy5yYW5nZSYmKGUubWluWD1lLm1heFgtaS54YXhpcy5yYW5nZSksZS5taW5YIT09TnVtYmVyLk1BWF9WQUxVRSYmZS5tYXhYIT09LU51bWJlci5NQVhfVkFMVUU/ZS54QXhpc1NjYWxlPXRoaXMuc2NhbGVzLmxpbmVhclNjYWxlKGUubWluWCxlLm1heFgsdCk6KGUueEF4aXNTY2FsZT10aGlzLnNjYWxlcy5saW5lYXJTY2FsZSgxLHQsdCksZS5ub0xhYmVsc1Byb3ZpZGVkJiZlLmxhYmVscy5sZW5ndGg+MCYmKGUueEF4aXNTY2FsZT10aGlzLnNjYWxlcy5saW5lYXJTY2FsZSgxLGUubGFiZWxzLmxlbmd0aCx0LTEpLGUuc2VyaWVzWD1lLmxhYmVscy5zbGljZSgpKSkscyYmKGUubGFiZWxzPWUueEF4aXNTY2FsZS5yZXN1bHQuc2xpY2UoKSkpO2lmKGUubWluWD09PWUubWF4WClpZigiZGF0ZXRpbWUiPT09aS54YXhpcy50eXBlKXt2YXIgaD1uZXcgRGF0ZShlLm1pblgpO2guc2V0RGF0ZShoLmdldERhdGUoKS0yKSxlLm1pblg9bmV3IERhdGUoaCkuZ2V0VGltZSgpO3ZhciBjPW5ldyBEYXRlKGUubWF4WCk7Yy5zZXREYXRlKGMuZ2V0RGF0ZSgpKzIpLGUubWF4WD1uZXcgRGF0ZShjKS5nZXRUaW1lKCl9ZWxzZSgibnVtZXJpYyI9PT1pLnhheGlzLnR5cGV8fCJjYXRlZ29yeSI9PT1pLnhheGlzLnR5cGUmJiFlLm5vTGFiZWxzUHJvdmlkZWQpJiYoZS5taW5YPWUubWluWC0yLGUubWF4WD1lLm1heFgrMik7cmV0dXJuIGUuaXNYTnVtZXJpYyYmZS5zZXJpZXNYLmZvckVhY2goZnVuY3Rpb24odCxpKXsxPT09dC5sZW5ndGgmJnQucHVzaChlLnNlcmllc1hbZS5tYXhWYWxzSW5BcnJheUluZGV4XVtlLnNlcmllc1hbZS5tYXhWYWxzSW5BcnJheUluZGV4XS5sZW5ndGgtMV0pLHQuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSx0LmZvckVhY2goZnVuY3Rpb24odCxzKXtpZihzPjApe3ZhciBhPXQtZS5zZXJpZXNYW2ldW3MtMV07ZS5taW5YRGlmZj1NYXRoLm1pbihhLGUubWluWERpZmYpfX0pfSkse21pblg6ZS5taW5YLG1heFg6ZS5tYXhYfX19LHtrZXk6InNldFpSYW5nZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLncuZ2xvYmFscztpZih0LmlzRGF0YVhZWilmb3IodmFyIGU9MDtlPHQuc2VyaWVzLmxlbmd0aDtlKyspaWYodm9pZCAwIT09dC5zZXJpZXNaW2VdKWZvcih2YXIgaT0wO2k8dC5zZXJpZXNaW2VdLmxlbmd0aDtpKyspbnVsbCE9PXQuc2VyaWVzWltlXVtpXSYmdS5pc051bWJlcih0LnNlcmllc1pbZV1baV0pJiYodC5tYXhaPU1hdGgubWF4KHQubWF4Wix0LnNlcmllc1pbZV1baV0pLHQubWluWj1NYXRoLm1pbih0Lm1pblosdC5zZXJpZXNaW2VdW2ldKSl9fV0pLHR9KCkscT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaSl7ZSh0aGlzLHQpLHRoaXMuY3R4PWksdGhpcy53PWkudyx0aGlzLnRpbWVTY2FsZUFycmF5PVtdfXJldHVybiBzKHQsW3trZXk6ImNhbGN1bGF0ZVRpbWVTY2FsZVRpY2tzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMscz10aGlzLnc7aWYocy5nbG9iYWxzLmFsbFNlcmllc0NvbGxhcHNlZClyZXR1cm4gcy5nbG9iYWxzLmxhYmVscz1bXSxzLmdsb2JhbHMudGltZWxpbmVMYWJlbHM9W10sW107dmFyIGE9bmV3IHYodGhpcy5jdHgpLG49KGUtdCkvODY0ZTU7dGhpcy5kZXRlcm1pbmVJbnRlcnZhbChuKSxzLmdsb2JhbHMuZGlzYWJsZVpvb21Jbj0hMSxzLmdsb2JhbHMuZGlzYWJsZVpvb21PdXQ9ITEsbjwuMDA1P3MuZ2xvYmFscy5kaXNhYmxlWm9vbUluPSEwOm4+NWU0JiYocy5nbG9iYWxzLmRpc2FibGVab29tT3V0PSEwKTt2YXIgbz1hLmdldFRpbWVVbml0c2Zyb21UaW1lc3RhbXAodCxlKSxsPXMuZ2xvYmFscy5ncmlkV2lkdGgvbixoPWwvMjQsYz1oLzYwLGQ9TWF0aC5mbG9vcigyNCpuKSx1PU1hdGguZmxvb3IoMjQqbio2MCksZz1NYXRoLmZsb29yKG4pLGY9TWF0aC5mbG9vcihuLzMwKSxwPU1hdGguZmxvb3Iobi8zNjUpLHg9e21pbk1pbnV0ZTpvLm1pbk1pbnV0ZSxtaW5Ib3VyOm8ubWluSG91cixtaW5EYXRlOm8ubWluRGF0ZSxtaW5Nb250aDpvLm1pbk1vbnRoLG1pblllYXI6by5taW5ZZWFyfSxiPXtmaXJzdFZhbDp4LGN1cnJlbnRNaW51dGU6eC5taW5NaW51dGUsY3VycmVudEhvdXI6eC5taW5Ib3VyLGN1cnJlbnRNb250aERhdGU6eC5taW5EYXRlLGN1cnJlbnREYXRlOngubWluRGF0ZSxjdXJyZW50TW9udGg6eC5taW5Nb250aCxjdXJyZW50WWVhcjp4Lm1pblllYXIsZGF5c1dpZHRoT25YQXhpczpsLGhvdXJzV2lkdGhPblhBeGlzOmgsbWludXRlc1dpZHRoT25YQXhpczpjLG51bWJlck9mTWludXRlczp1LG51bWJlck9mSG91cnM6ZCxudW1iZXJPZkRheXM6ZyxudW1iZXJPZk1vbnRoczpmLG51bWJlck9mWWVhcnM6cH07c3dpdGNoKHRoaXMudGlja0ludGVydmFsKXtjYXNlInllYXJzIjp0aGlzLmdlbmVyYXRlWWVhclNjYWxlKGIpO2JyZWFrO2Nhc2UibW9udGhzIjpjYXNlImhhbGZfeWVhciI6dGhpcy5nZW5lcmF0ZU1vbnRoU2NhbGUoYik7YnJlYWs7Y2FzZSJtb250aHNfZGF5cyI6Y2FzZSJtb250aHNfZm9ydG5pZ2h0IjpjYXNlImRheXMiOmNhc2Uid2Vla19kYXlzIjp0aGlzLmdlbmVyYXRlRGF5U2NhbGUoYik7YnJlYWs7Y2FzZSJob3VycyI6dGhpcy5nZW5lcmF0ZUhvdXJTY2FsZShiKTticmVhaztjYXNlIm1pbnV0ZXMiOnRoaXMuZ2VuZXJhdGVNaW51dGVTY2FsZShiKX12YXIgbT10aGlzLnRpbWVTY2FsZUFycmF5Lm1hcChmdW5jdGlvbih0KXt2YXIgZT17cG9zaXRpb246dC5wb3NpdGlvbix1bml0OnQudW5pdCx5ZWFyOnQueWVhcixkYXk6dC5kYXk/dC5kYXk6MSxob3VyOnQuaG91cj90LmhvdXI6MCxtb250aDp0Lm1vbnRoKzF9O3JldHVybiJtb250aCI9PT10LnVuaXQ/cih7fSxlLHtkYXk6MSx2YWx1ZTp0LnZhbHVlKzF9KToiZGF5Ij09PXQudW5pdHx8ImhvdXIiPT09dC51bml0P3Ioe30sZSx7dmFsdWU6dC52YWx1ZX0pOiJtaW51dGUiPT09dC51bml0P3Ioe30sZSx7dmFsdWU6dC52YWx1ZSxtaW51dGU6dC52YWx1ZX0pOnR9KTtyZXR1cm4gbS5maWx0ZXIoZnVuY3Rpb24odCl7dmFyIGU9MSxhPU1hdGguY2VpbChzLmdsb2JhbHMuZ3JpZFdpZHRoLzEyMCksbj10LnZhbHVlO3ZvaWQgMCE9PXMuY29uZmlnLnhheGlzLnRpY2tBbW91bnQmJihhPXMuY29uZmlnLnhheGlzLnRpY2tBbW91bnQpLG0ubGVuZ3RoPmEmJihlPU1hdGguZmxvb3IobS5sZW5ndGgvYSkpO3ZhciByPSExLG89ITE7c3dpdGNoKGkudGlja0ludGVydmFsKXtjYXNlImhhbGZfeWVhciI6ZT03LCJ5ZWFyIj09PXQudW5pdCYmKHI9ITApO2JyZWFrO2Nhc2UibW9udGhzIjplPTEsInllYXIiPT09dC51bml0JiYocj0hMCk7YnJlYWs7Y2FzZSJtb250aHNfZm9ydG5pZ2h0IjplPTE1LCJ5ZWFyIiE9PXQudW5pdCYmIm1vbnRoIiE9PXQudW5pdHx8KHI9ITApLDMwPT09biYmKG89ITApO2JyZWFrO2Nhc2UibW9udGhzX2RheXMiOmU9MTAsIm1vbnRoIj09PXQudW5pdCYmKHI9ITApLDMwPT09biYmKG89ITApO2JyZWFrO2Nhc2Uid2Vla19kYXlzIjplPTgsIm1vbnRoIj09PXQudW5pdCYmKHI9ITApO2JyZWFrO2Nhc2UiZGF5cyI6ZT0xLCJtb250aCI9PT10LnVuaXQmJihyPSEwKTticmVhaztjYXNlImhvdXJzIjoiZGF5Ij09PXQudW5pdCYmKHI9ITApO2JyZWFrO2Nhc2UibWludXRlcyI6biU1IT0wJiYobz0hMCl9aWYoIm1pbnV0ZXMiPT09aS50aWNrSW50ZXJ2YWx8fCJob3VycyI9PT1pLnRpY2tJbnRlcnZhbCl7aWYoIW8pcmV0dXJuITB9ZWxzZSBpZigobiVlPT0wfHxyKSYmIW8pcmV0dXJuITB9KX19LHtrZXk6InJlY2FsY0RpbWVuc2lvbnNCYXNlZE9uRm9ybWF0Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudyxzPXRoaXMuZm9ybWF0RGF0ZXModCksYT10aGlzLnJlbW92ZU92ZXJsYXBwaW5nVFMocyk7ZT9pLmdsb2JhbHMuaW52ZXJ0ZWRUaW1lbGluZUxhYmVscz1hLnNsaWNlKCk6aS5nbG9iYWxzLnRpbWVsaW5lTGFiZWxzPWEuc2xpY2UoKSxuZXcgVyh0aGlzLmN0eCkucGxvdENvb3JkcygpfX0se2tleToiZGV0ZXJtaW5lSW50ZXJ2YWwiLHZhbHVlOmZ1bmN0aW9uKHQpe3N3aXRjaCghMCl7Y2FzZSB0PjE4MjU6dGhpcy50aWNrSW50ZXJ2YWw9InllYXJzIjticmVhaztjYXNlIHQ+ODAwJiZ0PD0xODI1OnRoaXMudGlja0ludGVydmFsPSJoYWxmX3llYXIiO2JyZWFrO2Nhc2UgdD4xODAmJnQ8PTgwMDp0aGlzLnRpY2tJbnRlcnZhbD0ibW9udGhzIjticmVhaztjYXNlIHQ+OTAmJnQ8PTE4MDp0aGlzLnRpY2tJbnRlcnZhbD0ibW9udGhzX2ZvcnRuaWdodCI7YnJlYWs7Y2FzZSB0PjYwJiZ0PD05MDp0aGlzLnRpY2tJbnRlcnZhbD0ibW9udGhzX2RheXMiO2JyZWFrO2Nhc2UgdD4zMCYmdDw9NjA6dGhpcy50aWNrSW50ZXJ2YWw9IndlZWtfZGF5cyI7YnJlYWs7Y2FzZSB0PjImJnQ8PTMwOnRoaXMudGlja0ludGVydmFsPSJkYXlzIjticmVhaztjYXNlIHQ+LjEmJnQ8PTI6dGhpcy50aWNrSW50ZXJ2YWw9ImhvdXJzIjticmVhaztjYXNlIHQ8LjE6dGhpcy50aWNrSW50ZXJ2YWw9Im1pbnV0ZXMiO2JyZWFrO2RlZmF1bHQ6dGhpcy50aWNrSW50ZXJ2YWw9ImRheXMifX19LHtrZXk6ImdlbmVyYXRlWWVhclNjYWxlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LmZpcnN0VmFsLGk9dC5jdXJyZW50TW9udGgscz10LmN1cnJlbnRZZWFyLGE9dC5kYXlzV2lkdGhPblhBeGlzLG49dC5udW1iZXJPZlllYXJzLHI9ZS5taW5ZZWFyLG89MCxsPW5ldyB2KHRoaXMuY3R4KTtpZihlLm1pbkRhdGU+MSYmZS5taW5Nb250aD4wKXt2YXIgaD1sLmRldGVybWluZVJlbWFpbmluZ0RheXNPZlllYXIoZS5taW5ZZWFyLGUubWluTW9udGgsZS5taW5EYXRlKTtvPShsLmRldGVybWluZURheXNPZlllYXIoZS5taW5ZZWFyKS1oKzEpKmEscj1lLm1pblllYXIrMSx0aGlzLnRpbWVTY2FsZUFycmF5LnB1c2goe3Bvc2l0aW9uOm8sdmFsdWU6cix1bml0OiJ5ZWFyIix5ZWFyOnIsbW9udGg6dS5tb250aE1vZChpKzEpfSl9ZWxzZSAxPT09ZS5taW5EYXRlJiYwPT09ZS5taW5Nb250aCYmdGhpcy50aW1lU2NhbGVBcnJheS5wdXNoKHtwb3NpdGlvbjpvLHZhbHVlOnIsdW5pdDoieWVhciIseWVhcjpzLG1vbnRoOnUubW9udGhNb2QoaSsxKX0pO2Zvcih2YXIgYz1yLGQ9byxnPTA7ZzxuO2crKyljKyssZD1sLmRldGVybWluZURheXNPZlllYXIoYy0xKSphK2QsdGhpcy50aW1lU2NhbGVBcnJheS5wdXNoKHtwb3NpdGlvbjpkLHZhbHVlOmMsdW5pdDoieWVhciIseWVhcjpjLG1vbnRoOjF9KX19LHtrZXk6ImdlbmVyYXRlTW9udGhTY2FsZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dC5maXJzdFZhbCxpPXQuY3VycmVudE1vbnRoRGF0ZSxzPXQuY3VycmVudE1vbnRoLGE9dC5jdXJyZW50WWVhcixuPXQuZGF5c1dpZHRoT25YQXhpcyxyPXQubnVtYmVyT2ZNb250aHMsbz1zLGw9MCxoPW5ldyB2KHRoaXMuY3R4KSxjPSJtb250aCIsZD0wO2lmKGUubWluRGF0ZT4xKXtsPShoLmRldGVybWluZURheXNPZk1vbnRocyhzKzEsZS5taW5ZZWFyKS1pKzEpKm4sbz11Lm1vbnRoTW9kKHMrMSk7dmFyIGc9YStkLGY9dS5tb250aE1vZChvKSxwPW87MD09PW8mJihjPSJ5ZWFyIixwPWcsZj0xLGcrPWQrPTEpLHRoaXMudGltZVNjYWxlQXJyYXkucHVzaCh7cG9zaXRpb246bCx2YWx1ZTpwLHVuaXQ6Yyx5ZWFyOmcsbW9udGg6Zn0pfWVsc2UgdGhpcy50aW1lU2NhbGVBcnJheS5wdXNoKHtwb3NpdGlvbjpsLHZhbHVlOm8sdW5pdDpjLHllYXI6YSxtb250aDp1Lm1vbnRoTW9kKHMpfSk7Zm9yKHZhciB4PW8rMSxiPWwsbT0wLHk9MTttPHI7bSsrLHkrKyl7MD09PSh4PXUubW9udGhNb2QoeCkpPyhjPSJ5ZWFyIixkKz0xKTpjPSJtb250aCI7dmFyIHc9YStNYXRoLmZsb29yKHgvMTIpK2Q7Yj1oLmRldGVybWluZURheXNPZk1vbnRocyh4LHcpKm4rYjt2YXIgaz0wPT09eD93Ong7dGhpcy50aW1lU2NhbGVBcnJheS5wdXNoKHtwb3NpdGlvbjpiLHZhbHVlOmssdW5pdDpjLHllYXI6dyxtb250aDowPT09eD8xOnh9KSx4Kyt9fX0se2tleToiZ2VuZXJhdGVEYXlTY2FsZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dC5maXJzdFZhbCxpPXQuY3VycmVudE1vbnRoLHM9dC5jdXJyZW50WWVhcixhPXQuaG91cnNXaWR0aE9uWEF4aXMsbj10Lm51bWJlck9mRGF5cyxyPW5ldyB2KHRoaXMuY3R4KSxvPSJkYXkiLGw9KDI0LWUubWluSG91cikqYSxoPWUubWluRGF0ZSsxLGM9aCxkPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdD5yLmRldGVybWluZURheXNPZk1vbnRocyhlKzEsaSk/KGc9MSxvPSJtb250aCIsYz1lKz0xLGUpOmV9LGc9aCxmPWQoZyxpLHMpO3RoaXMudGltZVNjYWxlQXJyYXkucHVzaCh7cG9zaXRpb246bCx2YWx1ZTpjLHVuaXQ6byx5ZWFyOnMsbW9udGg6dS5tb250aE1vZChmKSxkYXk6Z30pO2Zvcih2YXIgcD1sLHg9MDt4PG47eCsrKXtvPSJkYXkiLGY9ZChnKz0xLGYscytNYXRoLmZsb29yKGYvMTIpKzApO3ZhciBiPXMrTWF0aC5mbG9vcihmLzEyKSswO3A9MjQqYStwO3ZhciBtPTE9PT1nP3UubW9udGhNb2QoZik6Zzt0aGlzLnRpbWVTY2FsZUFycmF5LnB1c2goe3Bvc2l0aW9uOnAsdmFsdWU6bSx1bml0Om8seWVhcjpiLG1vbnRoOnUubW9udGhNb2QoZiksZGF5Om19KX19fSx7a2V5OiJnZW5lcmF0ZUhvdXJTY2FsZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dC5maXJzdFZhbCxpPXQuY3VycmVudERhdGUscz10LmN1cnJlbnRNb250aCxhPXQuY3VycmVudFllYXIsbj10Lm1pbnV0ZXNXaWR0aE9uWEF4aXMscj10Lm51bWJlck9mSG91cnMsbz1uZXcgdih0aGlzLmN0eCksbD0iaG91ciIsaD1mdW5jdGlvbih0LGUpe3JldHVybiB0Pm8uZGV0ZXJtaW5lRGF5c09mTW9udGhzKGUrMSxhKSYmKHg9MSxlKz0xKSx7bW9udGg6ZSxkYXRlOnh9fSxjPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+by5kZXRlcm1pbmVEYXlzT2ZNb250aHMoZSsxLGEpP2UrPTE6ZX0sZD02MC1lLm1pbk1pbnV0ZSxnPWQqbixmPWUubWluSG91cisxLHA9ZisxOzYwPT09ZCYmKGc9MCxwPShmPWUubWluSG91cikrMSk7dmFyIHg9aSxiPWMoeCxzKTt0aGlzLnRpbWVTY2FsZUFycmF5LnB1c2goe3Bvc2l0aW9uOmcsdmFsdWU6Zix1bml0OmwsZGF5OngsaG91cjpwLHllYXI6YSxtb250aDp1Lm1vbnRoTW9kKGIpfSk7Zm9yKHZhciBtPWcseT0wO3k8cjt5Kyspe2lmKGw9ImhvdXIiLHA+PTI0KXA9MCxsPSJkYXkiLGI9aCh4Kz0xLGIpLm1vbnRoLGI9Yyh4LGIpO3ZhciB3PWErTWF0aC5mbG9vcihiLzEyKSswO209MD09PXAmJjA9PT15P2Qqbjo2MCpuK207dmFyIGs9MD09PXA/eDpwO3RoaXMudGltZVNjYWxlQXJyYXkucHVzaCh7cG9zaXRpb246bSx2YWx1ZTprLHVuaXQ6bCxob3VyOnAsZGF5OngseWVhcjp3LG1vbnRoOnUubW9udGhNb2QoYil9KSxwKyt9fX0se2tleToiZ2VuZXJhdGVNaW51dGVTY2FsZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dC5maXJzdFZhbCxpPXQuY3VycmVudE1pbnV0ZSxzPXQuY3VycmVudEhvdXIsYT10LmN1cnJlbnREYXRlLG49dC5jdXJyZW50TW9udGgscj10LmN1cnJlbnRZZWFyLG89dC5taW51dGVzV2lkdGhPblhBeGlzLGw9dC5udW1iZXJPZk1pbnV0ZXMsaD1vLShpLWUubWluTWludXRlKSxjPWUubWluTWludXRlKzEsZD1jKzEsZz1hLGY9bixwPXIseD1zO3RoaXMudGltZVNjYWxlQXJyYXkucHVzaCh7cG9zaXRpb246aCx2YWx1ZTpjLHVuaXQ6Im1pbnV0ZSIsZGF5OmcsaG91cjp4LG1pbnV0ZTpkLHllYXI6cCxtb250aDp1Lm1vbnRoTW9kKGYpfSk7Zm9yKHZhciBiPWgsbT0wO208bDttKyspe2Q+PTYwJiYoZD0wLDI0PT09KHgrPTEpJiYoeD0wKSk7dmFyIHY9citNYXRoLmZsb29yKGYvMTIpKzA7Yj1vK2I7dmFyIHk9ZDt0aGlzLnRpbWVTY2FsZUFycmF5LnB1c2goe3Bvc2l0aW9uOmIsdmFsdWU6eSx1bml0OiJtaW51dGUiLGhvdXI6eCxtaW51dGU6ZCxkYXk6Zyx5ZWFyOnYsbW9udGg6dS5tb250aE1vZChmKX0pLGQrK319fSx7a2V5OiJjcmVhdGVSYXdEYXRlU3RyaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXQueWVhcjtyZXR1cm4gaSs9Ii0iKygiMCIrdC5tb250aC50b1N0cmluZygpKS5zbGljZSgtMiksImRheSI9PT10LnVuaXQ/aSs9ImRheSI9PT10LnVuaXQ/Ii0iKygiMCIrZSkuc2xpY2UoLTIpOiItMDEiOmkrPSItIisoIjAiKyh0LmRheT90LmRheToiMSIpKS5zbGljZSgtMiksImhvdXIiPT09dC51bml0P2krPSJob3VyIj09PXQudW5pdD8iVCIrKCIwIitlKS5zbGljZSgtMik6IlQwMCI6aSs9IlQiKygiMCIrKHQuaG91cj90LmhvdXI6IjAiKSkuc2xpY2UoLTIpLGkrPSJtaW51dGUiPT09dC51bml0PyI6IisoIjAiK2UpLnNsaWNlKC0yKSsiOjAwLjAwMFoiOiI6MDA6MDAuMDAwWiJ9fSx7a2V5OiJmb3JtYXREYXRlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxpPXRoaXMudztyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCl7dmFyIHM9dC52YWx1ZS50b1N0cmluZygpLGE9bmV3IHYoZS5jdHgpLG49ZS5jcmVhdGVSYXdEYXRlU3RyaW5nKHQscykscj1uZXcgRGF0ZShEYXRlLnBhcnNlKG4pKTtpZih2b2lkIDA9PT1pLmNvbmZpZy54YXhpcy5sYWJlbHMuZm9ybWF0KXt2YXIgbz0iZGQgTU1NIixsPWkuY29uZmlnLnhheGlzLmxhYmVscy5kYXRldGltZUZvcm1hdHRlcjsieWVhciI9PT10LnVuaXQmJihvPWwueWVhciksIm1vbnRoIj09PXQudW5pdCYmKG89bC5tb250aCksImRheSI9PT10LnVuaXQmJihvPWwuZGF5KSwiaG91ciI9PT10LnVuaXQmJihvPWwuaG91ciksIm1pbnV0ZSI9PT10LnVuaXQmJihvPWwubWludXRlKSxzPWEuZm9ybWF0RGF0ZShyLG8sITAsITEpfWVsc2Ugcz1hLmZvcm1hdERhdGUocixpLmNvbmZpZy54YXhpcy5sYWJlbHMuZm9ybWF0KTtyZXR1cm57ZGF0ZVN0cmluZzpuLHBvc2l0aW9uOnQucG9zaXRpb24sdmFsdWU6cyx1bml0OnQudW5pdCx5ZWFyOnQueWVhcixtb250aDp0Lm1vbnRofX0pfX0se2tleToicmVtb3ZlT3ZlcmxhcHBpbmdUUyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxpPW5ldyBwKHRoaXMuY3R4KSxzPTAsYT10Lm1hcChmdW5jdGlvbihhLG4pe2lmKG4+MCYmZS53LmNvbmZpZy54YXhpcy5sYWJlbHMuaGlkZU92ZXJsYXBwaW5nTGFiZWxzKXt2YXIgcj1pLmdldFRleHRSZWN0cyh0W3NdLnZhbHVlKS53aWR0aCxvPXRbc10ucG9zaXRpb247cmV0dXJuIGEucG9zaXRpb24+bytyKzEwPyhzPW4sYSk6bnVsbH1yZXR1cm4gYX0pO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dH0pfX1dKSx0fSgpLFo9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGkscyl7ZSh0aGlzLHQpLHRoaXMuY3R4PXMsdGhpcy53PXMudyx0aGlzLmVsPWksdGhpcy5jb3JlVXRpbHM9bmV3IHcodGhpcy5jdHgpLHRoaXMudHdvRFNlcmllcz1bXSx0aGlzLnRocmVlRFNlcmllcz1bXSx0aGlzLnR3b0RTZXJpZXNYPVtdfXJldHVybiBzKHQsW3trZXk6InNldHVwRWxlbWVudHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53Lmdsb2JhbHMsZT10aGlzLncuY29uZmlnLGk9ZS5jaGFydC50eXBlO3QuYXhpc0NoYXJ0cz1bImxpbmUiLCJhcmVhIiwiYmFyIiwicmFuZ2VCYXIiLCJjYW5kbGVzdGljayIsInJhZGFyIiwic2NhdHRlciIsImJ1YmJsZSIsImhlYXRtYXAiXS5pbmRleE9mKGkpPi0xLHQueHlDaGFydHM9WyJsaW5lIiwiYXJlYSIsImJhciIsInJhbmdlQmFyIiwiY2FuZGxlc3RpY2siLCJzY2F0dGVyIiwiYnViYmxlIl0uaW5kZXhPZihpKT4tMSx0LmlzQmFySG9yaXpvbnRhbD0oImJhciI9PT1lLmNoYXJ0LnR5cGV8fCJyYW5nZUJhciI9PT1lLmNoYXJ0LnR5cGUpJiZlLnBsb3RPcHRpb25zLmJhci5ob3Jpem9udGFsLHQuY2hhcnRDbGFzcz0iLmFwZXhjaGFydHMiK3QuY3VpZCx0LmRvbS5iYXNlRWw9dGhpcy5lbCx0LmRvbS5lbFdyYXA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikscC5zZXRBdHRycyh0LmRvbS5lbFdyYXAse2lkOnQuY2hhcnRDbGFzcy5zdWJzdHJpbmcoMSksY2xhc3M6ImFwZXhjaGFydHMtY2FudmFzICIrdC5jaGFydENsYXNzLnN1YnN0cmluZygxKX0pLHRoaXMuZWwuYXBwZW5kQ2hpbGQodC5kb20uZWxXcmFwKSx0LmRvbS5QYXBlcj1uZXcgd2luZG93LlNWRy5Eb2ModC5kb20uZWxXcmFwKSx0LmRvbS5QYXBlci5hdHRyKHtjbGFzczoiYXBleGNoYXJ0cy1zdmciLCJ4bWxuczpkYXRhIjoiQXBleENoYXJ0c05TIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgiLmNvbmNhdChlLmNoYXJ0Lm9mZnNldFgsIiwgIikuY29uY2F0KGUuY2hhcnQub2Zmc2V0WSwiKSIpfSksdC5kb20uUGFwZXIubm9kZS5zdHlsZS5iYWNrZ3JvdW5kPWUuY2hhcnQuYmFja2dyb3VuZCx0aGlzLnNldFNWR0RpbWVuc2lvbnMoKSx0LmRvbS5lbEdyYXBoaWNhbD10LmRvbS5QYXBlci5ncm91cCgpLmF0dHIoe2NsYXNzOiJhcGV4Y2hhcnRzLWlubmVyIGFwZXhjaGFydHMtZ3JhcGhpY2FsIn0pLHQuZG9tLmVsRGVmcz10LmRvbS5QYXBlci5kZWZzKCksdC5kb20uZWxMZWdlbmRXcmFwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHQuZG9tLmVsTGVnZW5kV3JhcC5jbGFzc0xpc3QuYWRkKCJhcGV4Y2hhcnRzLWxlZ2VuZCIpLHQuZG9tLmVsV3JhcC5hcHBlbmRDaGlsZCh0LmRvbS5lbExlZ2VuZFdyYXApLHQuZG9tLlBhcGVyLmFkZCh0LmRvbS5lbEdyYXBoaWNhbCksdC5kb20uZWxHcmFwaGljYWwuYWRkKHQuZG9tLmVsRGVmcyl9fSx7a2V5OiJwbG90Q2hhcnRUeXBlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudyxzPWkuY29uZmlnLGE9aS5nbG9iYWxzLG49e3NlcmllczpbXSxpOltdfSxyPXtzZXJpZXM6W10saTpbXX0sbz17c2VyaWVzOltdLGk6W119LGw9e3NlcmllczpbXSxpOltdfSxoPXtzZXJpZXM6W10saTpbXX07YS5zZXJpZXMubWFwKGZ1bmN0aW9uKGUscyl7dm9pZCAwIT09dFtzXS50eXBlPygiY29sdW1uIj09PXRbc10udHlwZXx8ImJhciI9PT10W3NdLnR5cGU/KGkuY29uZmlnLnBsb3RPcHRpb25zLmJhci5ob3Jpem9udGFsPSExLGwuc2VyaWVzLnB1c2goZSksbC5pLnB1c2gocyksaS5nbG9iYWxzLmNvbHVtblNlcmllcz1sLnNlcmllcyk6ImFyZWEiPT09dFtzXS50eXBlPyhyLnNlcmllcy5wdXNoKGUpLHIuaS5wdXNoKHMpKToibGluZSI9PT10W3NdLnR5cGU/KG4uc2VyaWVzLnB1c2goZSksbi5pLnB1c2gocykpOiJzY2F0dGVyIj09PXRbc10udHlwZT8oby5zZXJpZXMucHVzaChlKSxvLmkucHVzaChzKSk6ImJ1YmJsZSI9PT10W3NdLnR5cGV8fCgiY2FuZGxlc3RpY2siPT09dFtzXS50eXBlPyhoLnNlcmllcy5wdXNoKGUpLGguaS5wdXNoKHMpKTpjb25zb2xlLndhcm4oIllvdSBoYXZlIHNwZWNpZmllZCBhbiB1bnJlY29nbml6ZWQgY2hhcnQgdHlwZS4gQXZhaWxhYmxlIHR5cGVzIGZvciB0aGlzIHByb3BlcnkgYXJlIGxpbmUvYXJlYS9jb2x1bW4vYmFyL3NjYXR0ZXIvYnViYmxlIikpLGEuY29tYm9DaGFydHM9ITApOihuLnNlcmllcy5wdXNoKGUpLG4uaS5wdXNoKHMpKX0pO3ZhciBjPW5ldyBHKHRoaXMuY3R4LGUpLGQ9bmV3IFQodGhpcy5jdHgsZSksdT1uZXcgWSh0aGlzLmN0eCksZz1uZXcgUih0aGlzLmN0eCksZj1uZXcgRCh0aGlzLmN0eCxlKSxwPW5ldyBGKHRoaXMuY3R4KSx4PVtdO2lmKGEuY29tYm9DaGFydHMpe2lmKHIuc2VyaWVzLmxlbmd0aD4wJiZ4LnB1c2goYy5kcmF3KHIuc2VyaWVzLCJhcmVhIixyLmkpKSxsLnNlcmllcy5sZW5ndGg+MClpZihpLmNvbmZpZy5jaGFydC5zdGFja2VkKXt2YXIgYj1uZXcgRSh0aGlzLmN0eCxlKTt4LnB1c2goYi5kcmF3KGwuc2VyaWVzLGwuaSkpfWVsc2V7dmFyIG09bmV3IE0odGhpcy5jdHgsZSk7eC5wdXNoKG0uZHJhdyhsLnNlcmllcyxsLmkpKX1pZihuLnNlcmllcy5sZW5ndGg+MCYmeC5wdXNoKGMuZHJhdyhuLnNlcmllcywibGluZSIsbi5pKSksaC5zZXJpZXMubGVuZ3RoPjAmJngucHVzaChkLmRyYXcoaC5zZXJpZXMsaC5pKSksby5zZXJpZXMubGVuZ3RoPjApe3ZhciB2PW5ldyBHKHRoaXMuY3R4LGUsITApO3gucHVzaCh2LmRyYXcoby5zZXJpZXMsInNjYXR0ZXIiLG8uaSkpfX1lbHNlIHN3aXRjaChzLmNoYXJ0LnR5cGUpe2Nhc2UibGluZSI6eD1jLmRyYXcoYS5zZXJpZXMsImxpbmUiKTticmVhaztjYXNlImFyZWEiOng9Yy5kcmF3KGEuc2VyaWVzLCJhcmVhIik7YnJlYWs7Y2FzZSJiYXIiOmlmKHMuY2hhcnQuc3RhY2tlZCl4PW5ldyBFKHRoaXMuY3R4LGUpLmRyYXcoYS5zZXJpZXMpO2Vsc2UgeD1uZXcgTSh0aGlzLmN0eCxlKS5kcmF3KGEuc2VyaWVzKTticmVhaztjYXNlImNhbmRsZXN0aWNrIjp4PW5ldyBUKHRoaXMuY3R4LGUpLmRyYXcoYS5zZXJpZXMpO2JyZWFrO2Nhc2UicmFuZ2VCYXIiOng9Zi5kcmF3KGEuc2VyaWVzKTticmVhaztjYXNlImhlYXRtYXAiOng9bmV3IEkodGhpcy5jdHgsZSkuZHJhdyhhLnNlcmllcyk7YnJlYWs7Y2FzZSJwaWUiOmNhc2UiZG9udXQiOng9dS5kcmF3KGEuc2VyaWVzKTticmVhaztjYXNlInJhZGlhbEJhciI6eD1nLmRyYXcoYS5zZXJpZXMpO2JyZWFrO2Nhc2UicmFkYXIiOng9cC5kcmF3KGEuc2VyaWVzKTticmVhaztkZWZhdWx0Ong9Yy5kcmF3KGEuc2VyaWVzKX1yZXR1cm4geH19LHtrZXk6InNldFNWR0RpbWVuc2lvbnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53Lmdsb2JhbHMsZT10aGlzLncuY29uZmlnO3Quc3ZnV2lkdGg9ZS5jaGFydC53aWR0aCx0LnN2Z0hlaWdodD1lLmNoYXJ0LmhlaWdodDt2YXIgaT11LmdldERpbWVuc2lvbnModGhpcy5lbCkscz1lLmNoYXJ0LndpZHRoLnRvU3RyaW5nKCkuc3BsaXQoL1swLTldKy9nKS5wb3AoKTtpZigiJSI9PT1zP3UuaXNOdW1iZXIoaVswXSkmJigwPT09aVswXS53aWR0aCYmKGk9dS5nZXREaW1lbnNpb25zKHRoaXMuZWwucGFyZW50Tm9kZSkpLHQuc3ZnV2lkdGg9aVswXSpwYXJzZUludChlLmNoYXJ0LndpZHRoKS8xMDApOiJweCIhPT1zJiYiIiE9PXN8fCh0LnN2Z1dpZHRoPXBhcnNlSW50KGUuY2hhcnQud2lkdGgpKSwiYXV0byIhPT10LnN2Z0hlaWdodCYmIiIhPT10LnN2Z0hlaWdodClpZigiJSI9PT1lLmNoYXJ0LmhlaWdodC50b1N0cmluZygpLnNwbGl0KC9bMC05XSsvZykucG9wKCkpe3ZhciBhPXUuZ2V0RGltZW5zaW9ucyh0aGlzLmVsLnBhcmVudE5vZGUpO3Quc3ZnSGVpZ2h0PWFbMV0qcGFyc2VJbnQoZS5jaGFydC5oZWlnaHQpLzEwMH1lbHNlIHQuc3ZnSGVpZ2h0PXBhcnNlSW50KGUuY2hhcnQuaGVpZ2h0KTtlbHNlIHQuYXhpc0NoYXJ0cz90LnN2Z0hlaWdodD10LnN2Z1dpZHRoLzEuNjE6dC5zdmdIZWlnaHQ9dC5zdmdXaWR0aDt0LnN2Z1dpZHRoPDAmJih0LnN2Z1dpZHRoPTApLHQuc3ZnSGVpZ2h0PDAmJih0LnN2Z0hlaWdodD0wKSxwLnNldEF0dHJzKHQuZG9tLlBhcGVyLm5vZGUse3dpZHRoOnQuc3ZnV2lkdGgsaGVpZ2h0OnQuc3ZnSGVpZ2h0fSk7dmFyIG49ZS5jaGFydC5zcGFya2xpbmUuZW5hYmxlZD8wOnQuYXhpc0NoYXJ0cz9lLmNoYXJ0LnBhcmVudEhlaWdodE9mZnNldDowO3QuZG9tLlBhcGVyLm5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLnN0eWxlLm1pbkhlaWdodD10LnN2Z0hlaWdodCtuKyJweCIsdC5kb20uZWxXcmFwLnN0eWxlLndpZHRoPXQuc3ZnV2lkdGgrInB4Iix0LmRvbS5lbFdyYXAuc3R5bGUuaGVpZ2h0PXQuc3ZnSGVpZ2h0KyJweCJ9fSx7a2V5OiJzaGlmdEdyYXBoUG9zaXRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53Lmdsb2JhbHMsZT10LnRyYW5zbGF0ZVksaT17dHJhbnNmb3JtOiJ0cmFuc2xhdGUoIit0LnRyYW5zbGF0ZVgrIiwgIitlKyIpIn07cC5zZXRBdHRycyh0LmRvbS5lbEdyYXBoaWNhbC5ub2RlLGkpfX0se2tleToicmVzaXplTm9uQXhpc0NoYXJ0cyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLncsZT10Lmdsb2JhbHMsaT0wOyJ0b3AiIT09dC5jb25maWcubGVnZW5kLnBvc2l0aW9uJiYiYm90dG9tIiE9PXQuY29uZmlnLmxlZ2VuZC5wb3NpdGlvbnx8KGk9bmV3IFYodGhpcy5jdHgpLmdldExlZ2VuZEJCb3goKS5jbHdoKzEwKTt2YXIgcz10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy1yYWRpYWxiYXIgLmFwZXhjaGFydHMtdHJhY2tzIiksYT10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy1yYWRpYWxiYXIgLmFwZXhjaGFydHMtZGF0YWxhYmVscy1ncm91cCIpLG49Mip0Lmdsb2JhbHMucmFkaWFsU2l6ZTtpZihzKXt2YXIgcj11LmdldEJvdW5kaW5nQ2xpZW50UmVjdChzKTtpZihuPXIuYm90dG9tLGEpe3ZhciBvPXUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGEpLGw9TWF0aC5tYXgoci5ib3R0b20sby5ib3R0b20pLXIudG9wK28uaGVpZ2h0O249TWF0aC5tYXgoMip0Lmdsb2JhbHMucmFkaWFsU2l6ZSxsKX19dmFyIGg9bitlLnRyYW5zbGF0ZVkraSsyMDtlLmRvbS5lbExlZ2VuZEZvcmVpZ24mJmUuZG9tLmVsTGVnZW5kRm9yZWlnbi5zZXRBdHRyaWJ1dGUoImhlaWdodCIsaCksZS5kb20uZWxXcmFwLnN0eWxlLmhlaWdodD1oKyJweCIscC5zZXRBdHRycyhlLmRvbS5QYXBlci5ub2RlLHtoZWlnaHQ6aH0pLGUuZG9tLlBhcGVyLm5vZGUucGFyZW50Tm9kZS5wYXJlbnROb2RlLnN0eWxlLm1pbkhlaWdodD1oKyJweCJ9fSx7a2V5OiJjb3JlQ2FsY3VsYXRpb25zIix2YWx1ZTpmdW5jdGlvbigpe25ldyBVKHRoaXMuY3R4KS5pbml0KCl9fSx7a2V5OiJyZXNldEdsb2JhbHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMudy5nbG9iYWxzO2Uuc2VyaWVzPVtdLGUuc2VyaWVzQ2FuZGxlTz1bXSxlLnNlcmllc0NhbmRsZUg9W10sZS5zZXJpZXNDYW5kbGVMPVtdLGUuc2VyaWVzQ2FuZGxlQz1bXSxlLnNlcmllc1JhbmdlU3RhcnQ9W10sZS5zZXJpZXNSYW5nZUVuZD1bXSxlLnNlcmllc1BlcmNlbnQ9W10sZS5zZXJpZXNYPVtdLGUuc2VyaWVzWj1bXSxlLnNlcmllc05hbWVzPVtdLGUuc2VyaWVzVG90YWxzPVtdLGUuc3RhY2tlZFNlcmllc1RvdGFscz1bXSxlLmxhYmVscz1bXSxlLnRpbWVsaW5lTGFiZWxzPVtdLGUubm9MYWJlbHNQcm92aWRlZD0hMSxlLnRpbWVzY2FsZVRpY2tzPVtdLGUucmVzaXplVGltZXI9bnVsbCxlLnNlbGVjdGlvblJlc2l6ZVRpbWVyPW51bGwsZS5zZXJpZXNYdmFsdWVzPXQudy5jb25maWcuc2VyaWVzLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bXX0pLGUuc2VyaWVzWXZhbHVlcz10LncuY29uZmlnLnNlcmllcy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW119KSxlLmRlbGF5ZWRFbGVtZW50cz1bXSxlLnBvaW50c0FycmF5PVtdLGUuZGF0YUxhYmVsc1JlY3RzPVtdLGUuaXNYTnVtZXJpYz0hMSxlLmlzRGF0YVhZWj0hMSxlLm1heFk9LU51bWJlci5NQVhfVkFMVUUsZS5taW5ZPU51bWJlci5NSU5fVkFMVUUsZS5taW5ZQXJyPVtdLGUubWF4WUFycj1bXSxlLm1heFg9LU51bWJlci5NQVhfVkFMVUUsZS5taW5YPU51bWJlci5NQVhfVkFMVUUsZS5pbml0aWFsbWF4WD0tTnVtYmVyLk1BWF9WQUxVRSxlLmluaXRpYWxtaW5YPU51bWJlci5NQVhfVkFMVUUsZS5tYXhEYXRlPTAsZS5taW5EYXRlPU51bWJlci5NQVhfVkFMVUUsZS5taW5aPU51bWJlci5NQVhfVkFMVUUsZS5tYXhaPS1OdW1iZXIuTUFYX1ZBTFVFLGUubWluWERpZmY9TnVtYmVyLk1BWF9WQUxVRSxlLnlBeGlzU2NhbGU9W10sZS54QXhpc1NjYWxlPW51bGwsZS54QXhpc1RpY2tzUG9zaXRpb25zPVtdLGUueUxhYmVsc0Nvb3Jkcz1bXSxlLnlUaXRsZUNvb3Jkcz1bXSxlLnhSYW5nZT0wLGUueVJhbmdlPVtdLGUuelJhbmdlPTAsZS5kYXRhUG9pbnRzPTB9fSx7a2V5OiJpc011bHRpcGxlWSIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLncuY29uZmlnLnlheGlzLmNvbnN0cnVjdG9yPT09QXJyYXkmJnRoaXMudy5jb25maWcueWF4aXMubGVuZ3RoPjEpcmV0dXJuIHRoaXMudy5nbG9iYWxzLmlzTXVsdGlwbGVZQXhpcz0hMCwhMH19LHtrZXk6ImV4Y2x1ZGVDb2xsYXBzZWRTZXJpZXNJbllBeGlzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnc7ZS5nbG9iYWxzLmlnbm9yZVlBeGlzSW5kZXhlcz1lLmdsb2JhbHMuY29sbGFwc2VkU2VyaWVzLm1hcChmdW5jdGlvbihlLGkpe2lmKHQudy5nbG9iYWxzLmlzTXVsdGlwbGVZQXhpcylyZXR1cm4gZS5pbmRleH0pfX0se2tleToiaXNNdWx0aUZvcm1hdCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0Zvcm1hdFhZKCl8fHRoaXMuaXNGb3JtYXQyREFycmF5KCl9fSx7a2V5OiJpc0Zvcm1hdFhZIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudy5jb25maWcuc2VyaWVzLnNsaWNlKCksZT1uZXcgQih0aGlzLmN0eCk7aWYodGhpcy5hY3RpdmVTZXJpZXNJbmRleD1lLmdldEFjdGl2ZUNvbmZpZ1Nlcmllc0luZGV4KCksdm9pZCAwIT09dFt0aGlzLmFjdGl2ZVNlcmllc0luZGV4XS5kYXRhJiZ0W3RoaXMuYWN0aXZlU2VyaWVzSW5kZXhdLmRhdGEubGVuZ3RoPjAmJm51bGwhPT10W3RoaXMuYWN0aXZlU2VyaWVzSW5kZXhdLmRhdGFbMF0mJnZvaWQgMCE9PXRbdGhpcy5hY3RpdmVTZXJpZXNJbmRleF0uZGF0YVswXS54JiZudWxsIT09dFt0aGlzLmFjdGl2ZVNlcmllc0luZGV4XS5kYXRhWzBdKXJldHVybiEwfX0se2tleToiaXNGb3JtYXQyREFycmF5Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudy5jb25maWcuc2VyaWVzLnNsaWNlKCksZT1uZXcgQih0aGlzLmN0eCk7aWYodGhpcy5hY3RpdmVTZXJpZXNJbmRleD1lLmdldEFjdGl2ZUNvbmZpZ1Nlcmllc0luZGV4KCksdm9pZCAwIT09dFt0aGlzLmFjdGl2ZVNlcmllc0luZGV4XS5kYXRhJiZ0W3RoaXMuYWN0aXZlU2VyaWVzSW5kZXhdLmRhdGEubGVuZ3RoPjAmJnZvaWQgMCE9PXRbdGhpcy5hY3RpdmVTZXJpZXNJbmRleF0uZGF0YVswXSYmbnVsbCE9PXRbdGhpcy5hY3RpdmVTZXJpZXNJbmRleF0uZGF0YVswXSYmdFt0aGlzLmFjdGl2ZVNlcmllc0luZGV4XS5kYXRhWzBdLmNvbnN0cnVjdG9yPT09QXJyYXkpcmV0dXJuITB9fSx7a2V5OiJoYW5kbGVGb3JtYXQyREFycmF5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10aGlzLncuY29uZmlnLHM9dGhpcy53Lmdsb2JhbHMsYT0wO2E8dFtlXS5kYXRhLmxlbmd0aDthKyspaWYodm9pZCAwIT09dFtlXS5kYXRhW2FdWzFdJiYoQXJyYXkuaXNBcnJheSh0W2VdLmRhdGFbYV1bMV0pJiY0PT09dFtlXS5kYXRhW2FdWzFdLmxlbmd0aD90aGlzLnR3b0RTZXJpZXMucHVzaCh1LnBhcnNlTnVtYmVyKHRbZV0uZGF0YVthXVsxXVszXSkpOnRoaXMudHdvRFNlcmllcy5wdXNoKHUucGFyc2VOdW1iZXIodFtlXS5kYXRhW2FdWzFdKSkscy5kYXRhRm9ybWF0WE51bWVyaWM9ITApLCJkYXRldGltZSI9PT1pLnhheGlzLnR5cGUpe3ZhciBuPW5ldyBEYXRlKHRbZV0uZGF0YVthXVswXSk7bj1uZXcgRGF0ZShuKS5nZXRUaW1lKCksdGhpcy50d29EU2VyaWVzWC5wdXNoKG4pfWVsc2UgdGhpcy50d29EU2VyaWVzWC5wdXNoKHRbZV0uZGF0YVthXVswXSk7Zm9yKHZhciByPTA7cjx0W2VdLmRhdGEubGVuZ3RoO3IrKyl2b2lkIDAhPT10W2VdLmRhdGFbcl1bMl0mJih0aGlzLnRocmVlRFNlcmllcy5wdXNoKHRbZV0uZGF0YVtyXVsyXSkscy5pc0RhdGFYWVo9ITApfX0se2tleToiaGFuZGxlRm9ybWF0WFkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53LmNvbmZpZyxzPXRoaXMudy5nbG9iYWxzLGE9bmV3IHYodGhpcy5jdHgpLG49ZTtzLmNvbGxhcHNlZFNlcmllc0luZGljZXMuaW5kZXhPZihlKT4tMSYmKG49dGhpcy5hY3RpdmVTZXJpZXNJbmRleCk7Zm9yKHZhciByPTA7cjx0W2VdLmRhdGEubGVuZ3RoO3IrKyl2b2lkIDAhPT10W2VdLmRhdGFbcl0ueSYmKEFycmF5LmlzQXJyYXkodFtlXS5kYXRhW3JdLnkpP3RoaXMudHdvRFNlcmllcy5wdXNoKHUucGFyc2VOdW1iZXIodFtlXS5kYXRhW3JdLnlbdFtlXS5kYXRhW3JdLnkubGVuZ3RoLTFdKSk6dGhpcy50d29EU2VyaWVzLnB1c2godS5wYXJzZU51bWJlcih0W2VdLmRhdGFbcl0ueSkpKTtmb3IodmFyIG89MDtvPHRbbl0uZGF0YS5sZW5ndGg7bysrKXt2YXIgbD0ic3RyaW5nIj09dHlwZW9mIHRbbl0uZGF0YVtvXS54LGg9ISFhLmlzVmFsaWREYXRlKHRbbl0uZGF0YVtvXS54LnRvU3RyaW5nKCkpO2x8fGg/bD8iZGF0ZXRpbWUiIT09aS54YXhpcy50eXBlfHxzLmlzUmFuZ2VEYXRhPyh0aGlzLmZhbGxiYWNrVG9DYXRlZ29yeT0hMCx0aGlzLnR3b0RTZXJpZXNYLnB1c2godFtuXS5kYXRhW29dLngpKTp0aGlzLnR3b0RTZXJpZXNYLnB1c2goYS5wYXJzZURhdGUodFtuXS5kYXRhW29dLngpKToiZGF0ZXRpbWUiPT09aS54YXhpcy50eXBlP3RoaXMudHdvRFNlcmllc1gucHVzaChhLnBhcnNlRGF0ZSh0W25dLmRhdGFbb10ueC50b1N0cmluZygpKSk6KHMuZGF0YUZvcm1hdFhOdW1lcmljPSEwLHMuaXNYTnVtZXJpYz0hMCx0aGlzLnR3b0RTZXJpZXNYLnB1c2gocGFyc2VGbG9hdCh0W25dLmRhdGFbb10ueCkpKToocy5pc1hOdW1lcmljPSEwLHMuZGF0YUZvcm1hdFhOdW1lcmljPSEwLHRoaXMudHdvRFNlcmllc1gucHVzaCh0W25dLmRhdGFbb10ueCkpfWlmKHRbZV0uZGF0YVswXSYmdm9pZCAwIT09dFtlXS5kYXRhWzBdLnope2Zvcih2YXIgYz0wO2M8dFtlXS5kYXRhLmxlbmd0aDtjKyspdGhpcy50aHJlZURTZXJpZXMucHVzaCh0W2VdLmRhdGFbY10ueik7cy5pc0RhdGFYWVo9ITB9fX0se2tleToiaGFuZGxlUmFuZ2VEYXRhIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudy5nbG9iYWxzLHM9e307cmV0dXJuIHRoaXMuaXNGb3JtYXQyREFycmF5KCk/cz10aGlzLmhhbmRsZVJhbmdlRGF0YUZvcm1hdCgiYXJyYXkiLHQsZSk6dGhpcy5pc0Zvcm1hdFhZKCkmJihzPXRoaXMuaGFuZGxlUmFuZ2VEYXRhRm9ybWF0KCJ4eSIsdCxlKSksaS5zZXJpZXNSYW5nZVN0YXJ0LnB1c2gocy5zdGFydCksaS5zZXJpZXNSYW5nZUVuZC5wdXNoKHMuZW5kKSxzfX0se2tleToiaGFuZGxlQ2FuZGxlU3RpY2tEYXRhIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudy5nbG9iYWxzLHM9e307cmV0dXJuIHRoaXMuaXNGb3JtYXQyREFycmF5KCk/cz10aGlzLmhhbmRsZUNhbmRsZVN0aWNrRGF0YUZvcm1hdCgiYXJyYXkiLHQsZSk6dGhpcy5pc0Zvcm1hdFhZKCkmJihzPXRoaXMuaGFuZGxlQ2FuZGxlU3RpY2tEYXRhRm9ybWF0KCJ4eSIsdCxlKSksaS5zZXJpZXNDYW5kbGVPLnB1c2gocy5vKSxpLnNlcmllc0NhbmRsZUgucHVzaChzLmgpLGkuc2VyaWVzQ2FuZGxlTC5wdXNoKHMubCksaS5zZXJpZXNDYW5kbGVDLnB1c2gocy5jKSxzfX0se2tleToiaGFuZGxlUmFuZ2VEYXRhRm9ybWF0Iix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIHM9W10sYT1bXSxuPSJQbGVhc2UgcHJvdmlkZSBbU3RhcnQsIEVuZF0gdmFsdWVzIGluIHZhbGlkIGZvcm1hdC4gUmVhZCBtb3JlIGh0dHBzOi8vYXBleGNoYXJ0cy5jb20vZG9jcy9zZXJpZXMvI3JhbmdlY2hhcnRzIixyPW5ldyBCKHRoaXMuY3R4KS5nZXRBY3RpdmVDb25maWdTZXJpZXNJbmRleCgpO2lmKCJhcnJheSI9PT10KXtpZigyIT09ZVtyXS5kYXRhWzBdWzFdLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3Iobik7Zm9yKHZhciBvPTA7bzxlW2ldLmRhdGEubGVuZ3RoO28rKylzLnB1c2goZVtpXS5kYXRhW29dWzFdWzBdKSxhLnB1c2goZVtpXS5kYXRhW29dWzFdWzFdKX1lbHNlIGlmKCJ4eSI9PT10KXtpZigyIT09ZVtyXS5kYXRhWzBdLnkubGVuZ3RoKXRocm93IG5ldyBFcnJvcihuKTtmb3IodmFyIGw9MDtsPGVbaV0uZGF0YS5sZW5ndGg7bCsrKXMucHVzaChlW2ldLmRhdGFbbF0ueVswXSksYS5wdXNoKGVbaV0uZGF0YVtsXS55WzFdKX1yZXR1cm57c3RhcnQ6cyxlbmQ6YX19fSx7a2V5OiJoYW5kbGVDYW5kbGVTdGlja0RhdGFGb3JtYXQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcz1bXSxhPVtdLG49W10scj1bXSxvPSJQbGVhc2UgcHJvdmlkZSBbT3BlbiwgSGlnaCwgTG93IGFuZCBDbG9zZV0gdmFsdWVzIGluIHZhbGlkIGZvcm1hdC4gUmVhZCBtb3JlIGh0dHBzOi8vYXBleGNoYXJ0cy5jb20vZG9jcy9zZXJpZXMvI2NhbmRsZXN0aWNrIjtpZigiYXJyYXkiPT09dCl7aWYoNCE9PWVbaV0uZGF0YVswXVsxXS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKG8pO2Zvcih2YXIgbD0wO2w8ZVtpXS5kYXRhLmxlbmd0aDtsKyspcy5wdXNoKGVbaV0uZGF0YVtsXVsxXVswXSksYS5wdXNoKGVbaV0uZGF0YVtsXVsxXVsxXSksbi5wdXNoKGVbaV0uZGF0YVtsXVsxXVsyXSksci5wdXNoKGVbaV0uZGF0YVtsXVsxXVszXSl9ZWxzZSBpZigieHkiPT09dCl7aWYoNCE9PWVbaV0uZGF0YVswXS55Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3Iobyk7Zm9yKHZhciBoPTA7aDxlW2ldLmRhdGEubGVuZ3RoO2grKylzLnB1c2goZVtpXS5kYXRhW2hdLnlbMF0pLGEucHVzaChlW2ldLmRhdGFbaF0ueVsxXSksbi5wdXNoKGVbaV0uZGF0YVtoXS55WzJdKSxyLnB1c2goZVtpXS5kYXRhW2hdLnlbM10pfXJldHVybntvOnMsaDphLGw6bixjOnJ9fX0se2tleToicGFyc2VEYXRhQXhpc0NoYXJ0cyIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp0aGlzLmN0eCxpPXRoaXMudy5jb25maWcscz10aGlzLncuZ2xvYmFscyxhPW5ldyB2KGUpLG49MDtuPHQubGVuZ3RoO24rKyl7aWYodGhpcy50d29EU2VyaWVzPVtdLHRoaXMudHdvRFNlcmllc1g9W10sdGhpcy50aHJlZURTZXJpZXM9W10sdm9pZCAwPT09dFtuXS5kYXRhKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIkl0IGlzIGEgcG9zc2liaWxpdHkgdGhhdCB5b3UgbWF5IGhhdmUgbm90IGluY2x1ZGVkICdkYXRhJyBwcm9wZXJ0eSBpbiBzZXJpZXMuIik7aWYoInJhbmdlQmFyIiE9PWkuY2hhcnQudHlwZSYmInJhbmdlQXJlYSIhPT1pLmNoYXJ0LnR5cGUmJiJyYW5nZUJhciIhPT10W25dLnR5cGUmJiJyYW5nZUFyZWEiIT09dFtuXS50eXBlfHwocy5pc1JhbmdlRGF0YT0hMCx0aGlzLmhhbmRsZVJhbmdlRGF0YSh0LG4pKSx0aGlzLmlzTXVsdGlGb3JtYXQoKSl0aGlzLmlzRm9ybWF0MkRBcnJheSgpP3RoaXMuaGFuZGxlRm9ybWF0MkRBcnJheSh0LG4pOnRoaXMuaXNGb3JtYXRYWSgpJiZ0aGlzLmhhbmRsZUZvcm1hdFhZKHQsbiksImNhbmRsZXN0aWNrIiE9PWkuY2hhcnQudHlwZSYmImNhbmRsZXN0aWNrIiE9PXRbbl0udHlwZXx8dGhpcy5oYW5kbGVDYW5kbGVTdGlja0RhdGEodCxuKSxzLnNlcmllcy5wdXNoKHRoaXMudHdvRFNlcmllcykscy5sYWJlbHMucHVzaCh0aGlzLnR3b0RTZXJpZXNYKSxzLnNlcmllc1gucHVzaCh0aGlzLnR3b0RTZXJpZXNYKSx0aGlzLmZhbGxiYWNrVG9DYXRlZ29yeXx8KHMuaXNYTnVtZXJpYz0hMCk7ZWxzZXtpZigiZGF0ZXRpbWUiPT09aS54YXhpcy50eXBlKXtzLmlzWE51bWVyaWM9ITA7Zm9yKHZhciByPWkubGFiZWxzLmxlbmd0aD4wP2kubGFiZWxzLnNsaWNlKCk6aS54YXhpcy5jYXRlZ29yaWVzLnNsaWNlKCksbz0wO288ci5sZW5ndGg7bysrKWlmKCJzdHJpbmciPT10eXBlb2YgcltvXSl7aWYoIWEuaXNWYWxpZERhdGUocltvXSkpdGhyb3cgbmV3IEVycm9yKCJZb3UgaGF2ZSBwcm92aWRlZCBpbnZhbGlkIERhdGUgZm9ybWF0LiBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIEphdmFTY3JpcHQgRGF0ZSIpO3RoaXMudHdvRFNlcmllc1gucHVzaChhLnBhcnNlRGF0ZShyW29dKSl9ZWxzZXtpZigxMyE9PVN0cmluZyhyW29dKS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIEphdmFTY3JpcHQgdGltZXN0YW1wIik7dGhpcy50d29EU2VyaWVzWC5wdXNoKHJbb10pfXMuc2VyaWVzWC5wdXNoKHRoaXMudHdvRFNlcmllc1gpfWVsc2UgaWYoIm51bWVyaWMiPT09aS54YXhpcy50eXBlKXtzLmlzWE51bWVyaWM9ITA7dmFyIGw9aS5sYWJlbHMubGVuZ3RoPjA/aS5sYWJlbHMuc2xpY2UoKTppLnhheGlzLmNhdGVnb3JpZXMuc2xpY2UoKTtsLmxlbmd0aD4wJiYodGhpcy50d29EU2VyaWVzWD1sLHMuc2VyaWVzWC5wdXNoKHRoaXMudHdvRFNlcmllc1gpKX1zLmxhYmVscy5wdXNoKHRoaXMudHdvRFNlcmllc1gpO3ZhciBoPXRbbl0uZGF0YS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHUucGFyc2VOdW1iZXIodCl9KTtzLnNlcmllcy5wdXNoKGgpfXMuc2VyaWVzWi5wdXNoKHRoaXMudGhyZWVEU2VyaWVzKSx2b2lkIDAhPT10W25dLm5hbWU/cy5zZXJpZXNOYW1lcy5wdXNoKHRbbl0ubmFtZSk6cy5zZXJpZXNOYW1lcy5wdXNoKCJzZXJpZXMtIitwYXJzZUludChuKzEpKX1yZXR1cm4gdGhpcy53fX0se2tleToicGFyc2VEYXRhTm9uQXhpc0NoYXJ0cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53Lmdsb2JhbHMsaT10aGlzLncuY29uZmlnO2Uuc2VyaWVzPXQuc2xpY2UoKSxlLnNlcmllc05hbWVzPWkubGFiZWxzLnNsaWNlKCk7Zm9yKHZhciBzPTA7czxlLnNlcmllcy5sZW5ndGg7cysrKXZvaWQgMD09PWUuc2VyaWVzTmFtZXNbc10mJmUuc2VyaWVzTmFtZXMucHVzaCgic2VyaWVzLSIrKHMrMSkpO3JldHVybiB0aGlzLnd9fSx7a2V5OiJoYW5kbGVFeHRlcm5hbExhYmVsc0RhdGEiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudy5jb25maWcsaT10aGlzLncuZ2xvYmFscztpZihlLnhheGlzLmNhdGVnb3JpZXMubGVuZ3RoPjApaS5sYWJlbHM9ZS54YXhpcy5jYXRlZ29yaWVzO2Vsc2UgaWYoZS5sYWJlbHMubGVuZ3RoPjApaS5sYWJlbHM9ZS5sYWJlbHMuc2xpY2UoKTtlbHNlIGlmKHRoaXMuZmFsbGJhY2tUb0NhdGVnb3J5KWkubGFiZWxzPWkubGFiZWxzWzBdO2Vsc2V7dmFyIHM9W107aWYoaS5heGlzQ2hhcnRzKXtpZihpLnNlcmllcy5sZW5ndGg+MClmb3IodmFyIGE9MDthPGkuc2VyaWVzW2kubWF4VmFsc0luQXJyYXlJbmRleF0ubGVuZ3RoO2ErKylzLnB1c2goYSsxKTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpLnNlcmllc1gucHVzaChzKTtpLmlzWE51bWVyaWM9ITB9aWYoMD09PXMubGVuZ3RoKXtzPVswLDEwXTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKylpLnNlcmllc1gucHVzaChzKX1pLmxhYmVscz1zLGkubm9MYWJlbHNQcm92aWRlZD0hMH19fSx7a2V5OiJwYXJzZURhdGEiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudyxpPWUuY29uZmlnLHM9ZS5nbG9iYWxzO2lmKHRoaXMuZXhjbHVkZUNvbGxhcHNlZFNlcmllc0luWUF4aXMoKSx0aGlzLmZhbGxiYWNrVG9DYXRlZ29yeT0hMSx0aGlzLnJlc2V0R2xvYmFscygpLHRoaXMuaXNNdWx0aXBsZVkoKSxzLmF4aXNDaGFydHM/dGhpcy5wYXJzZURhdGFBeGlzQ2hhcnRzKHQpOnRoaXMucGFyc2VEYXRhTm9uQXhpc0NoYXJ0cyh0KSx0aGlzLmNvcmVVdGlscy5nZXRMYXJnZXN0U2VyaWVzKCksImJhciI9PT1pLmNoYXJ0LnR5cGUmJmkuY2hhcnQuc3RhY2tlZCl7dmFyIGE9bmV3IEIodGhpcy5jdHgpO3Muc2VyaWVzPWEuc2V0TnVsbFNlcmllc1RvWmVyb1ZhbHVlcyhzLnNlcmllcyl9dGhpcy5jb3JlVXRpbHMuZ2V0U2VyaWVzVG90YWxzKCkscy5heGlzQ2hhcnRzJiZ0aGlzLmNvcmVVdGlscy5nZXRTdGFja2VkU2VyaWVzVG90YWxzKCksdGhpcy5jb3JlVXRpbHMuZ2V0UGVyY2VudFNlcmllcygpLHMuZGF0YUZvcm1hdFhOdW1lcmljfHxzLmlzWE51bWVyaWMmJigibnVtZXJpYyIhPT1pLnhheGlzLnR5cGV8fDAhPT1pLmxhYmVscy5sZW5ndGh8fDAhPT1pLnhheGlzLmNhdGVnb3JpZXMubGVuZ3RoKXx8dGhpcy5oYW5kbGVFeHRlcm5hbExhYmVsc0RhdGEodCl9fSx7a2V5OiJ4eVNldHRpbmdzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PW51bGwsZT10aGlzLnc7aWYoZS5nbG9iYWxzLmF4aXNDaGFydHMpe2lmKCJiYWNrIj09PWUuY29uZmlnLnhheGlzLmNyb3NzaGFpcnMucG9zaXRpb24pbmV3IFgodGhpcy5jdHgpLmRyYXdYQ3Jvc3NoYWlycygpO2lmKCJiYWNrIj09PWUuY29uZmlnLnlheGlzWzBdLmNyb3NzaGFpcnMucG9zaXRpb24pbmV3IFgodGhpcy5jdHgpLmRyYXdZQ3Jvc3NoYWlycygpO2lmKHQ9dGhpcy5jb3JlVXRpbHMuZ2V0Q2FsY3VsYXRlZFJhdGlvcygpLCJkYXRldGltZSI9PT1lLmNvbmZpZy54YXhpcy50eXBlJiZ2b2lkIDA9PT1lLmNvbmZpZy54YXhpcy5sYWJlbHMuZm9ybWF0dGVyKXt2YXIgaSxzPW5ldyBxKHRoaXMuY3R4KTtpc0Zpbml0ZShlLmdsb2JhbHMubWluWCkmJmlzRmluaXRlKGUuZ2xvYmFscy5tYXhYKSYmIWUuZ2xvYmFscy5pc0Jhckhvcml6b250YWw/KGk9cy5jYWxjdWxhdGVUaW1lU2NhbGVUaWNrcyhlLmdsb2JhbHMubWluWCxlLmdsb2JhbHMubWF4WCkscy5yZWNhbGNEaW1lbnNpb25zQmFzZWRPbkZvcm1hdChpLCExKSk6ZS5nbG9iYWxzLmlzQmFySG9yaXpvbnRhbCYmKGk9cy5jYWxjdWxhdGVUaW1lU2NhbGVUaWNrcyhlLmdsb2JhbHMubWluWSxlLmdsb2JhbHMubWF4WSkscy5yZWNhbGNEaW1lbnNpb25zQmFzZWRPbkZvcm1hdChpLCEwKSl9fXJldHVybiB0fX0se2tleToiZHJhd0F4aXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGkscyxhPXRoaXMudy5nbG9iYWxzLG49dGhpcy53LmNvbmZpZyxyPW5ldyBfKHRoaXMuY3R4KSxvPW5ldyBIKHRoaXMuY3R4KTthLmF4aXNDaGFydHMmJiJyYWRhciIhPT10JiYoYS5pc0Jhckhvcml6b250YWw/KHM9by5kcmF3WWF4aXNJbnZlcnNlZCgwKSxpPXIuZHJhd1hheGlzSW52ZXJzZWQoMCksYS5kb20uZWxHcmFwaGljYWwuYWRkKGkpLGEuZG9tLmVsR3JhcGhpY2FsLmFkZChzKSk6KGk9ci5kcmF3WGF4aXMoKSxhLmRvbS5lbEdyYXBoaWNhbC5hZGQoaSksbi55YXhpcy5tYXAoZnVuY3Rpb24odCxlKXstMT09PWEuaWdub3JlWUF4aXNJbmRleGVzLmluZGV4T2YoZSkmJihzPW8uZHJhd1lheGlzKGUpLGEuZG9tLlBhcGVyLmFkZChzKSl9KSkpO24ueWF4aXMubWFwKGZ1bmN0aW9uKHQsZSl7LTE9PT1hLmlnbm9yZVlBeGlzSW5kZXhlcy5pbmRleE9mKGUpJiZvLnlBeGlzVGl0bGVSb3RhdGUoZSx0Lm9wcG9zaXRlKX0pfX0se2tleToic2V0dXBCcnVzaEhhbmRsZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMudztpZihlLmNvbmZpZy5jaGFydC5icnVzaC5lbmFibGVkJiYiZnVuY3Rpb24iIT10eXBlb2YgZS5jb25maWcuY2hhcnQuZXZlbnRzLnNlbGVjdGlvbil7dmFyIGk9ZS5jb25maWcuY2hhcnQuYnJ1c2gudGFyZ2V0c3x8W2UuY29uZmlnLmNoYXJ0LmJydXNoLnRhcmdldF07aS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBpPUFwZXhDaGFydHMuZ2V0Q2hhcnRCeUlEKGUpO2kudy5nbG9iYWxzLmJydXNoU291cmNlPXQuY3R4O3ZhciBzPWZ1bmN0aW9uKCl7dC5jdHguX3VwZGF0ZU9wdGlvbnMoe2NoYXJ0OntzZWxlY3Rpb246e3hheGlzOnttaW46aS53Lmdsb2JhbHMubWluWCxtYXg6aS53Lmdsb2JhbHMubWF4WH19fX0sITEsITEpfTsiZnVuY3Rpb24iIT10eXBlb2YgaS53LmNvbmZpZy5jaGFydC5ldmVudHMuem9vbWVkJiYoaS53LmNvbmZpZy5jaGFydC5ldmVudHMuem9vbWVkPWZ1bmN0aW9uKCl7cygpfSksImZ1bmN0aW9uIiE9dHlwZW9mIGkudy5jb25maWcuY2hhcnQuZXZlbnRzLnNjcm9sbGVkJiYoaS53LmNvbmZpZy5jaGFydC5ldmVudHMuc2Nyb2xsZWQ9ZnVuY3Rpb24oKXtzKCl9KX0pLGUuY29uZmlnLmNoYXJ0LmV2ZW50cy5zZWxlY3Rpb249ZnVuY3Rpb24odCxzKXtpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGk9QXBleENoYXJ0cy5nZXRDaGFydEJ5SUQodCksYT11LmNsb25lKGUuY29uZmlnLnlheGlzKTtlLmNvbmZpZy5jaGFydC5icnVzaC5hdXRvU2NhbGVZYXhpcyYmKGE9bmV3IGooaSkuYXV0b1NjYWxlWShpLGEscykpO2kuX3VwZGF0ZU9wdGlvbnMoe3hheGlzOnttaW46cy54YXhpcy5taW4sbWF4OnMueGF4aXMubWF4fSx5YXhpczphfSwhMSwhMSwhMSwhMSl9KX19fX1dKSx0fSgpO3ZhciAkPXNldFRpbWVvdXQ7ZnVuY3Rpb24gSigpe31mdW5jdGlvbiBRKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldyIpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm5vdCBhIGZ1bmN0aW9uIik7dGhpcy5fc3RhdGU9MCx0aGlzLl9oYW5kbGVkPSExLHRoaXMuX3ZhbHVlPXZvaWQgMCx0aGlzLl9kZWZlcnJlZHM9W10sYXQodCx0aGlzKX1mdW5jdGlvbiBLKHQsZSl7Zm9yKDszPT09dC5fc3RhdGU7KXQ9dC5fdmFsdWU7MCE9PXQuX3N0YXRlPyh0Ll9oYW5kbGVkPSEwLFEuX2ltbWVkaWF0ZUZuKGZ1bmN0aW9uKCl7dmFyIGk9MT09PXQuX3N0YXRlP2Uub25GdWxmaWxsZWQ6ZS5vblJlamVjdGVkO2lmKG51bGwhPT1pKXt2YXIgczt0cnl7cz1pKHQuX3ZhbHVlKX1jYXRjaCh0KXtyZXR1cm4gdm9pZCBldChlLnByb21pc2UsdCl9dHQoZS5wcm9taXNlLHMpfWVsc2UoMT09PXQuX3N0YXRlP3R0OmV0KShlLnByb21pc2UsdC5fdmFsdWUpfSkpOnQuX2RlZmVycmVkcy5wdXNoKGUpfWZ1bmN0aW9uIHR0KHQsZSl7dHJ5e2lmKGU9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkEgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuIik7aWYoZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpKXt2YXIgaT1lLnRoZW47aWYoZSBpbnN0YW5jZW9mIFEpcmV0dXJuIHQuX3N0YXRlPTMsdC5fdmFsdWU9ZSx2b2lkIGl0KHQpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBpKXJldHVybiB2b2lkIGF0KChzPWksYT1lLGZ1bmN0aW9uKCl7cy5hcHBseShhLGFyZ3VtZW50cyl9KSx0KX10Ll9zdGF0ZT0xLHQuX3ZhbHVlPWUsaXQodCl9Y2F0Y2goZSl7ZXQodCxlKX12YXIgcyxhfWZ1bmN0aW9uIGV0KHQsZSl7dC5fc3RhdGU9Mix0Ll92YWx1ZT1lLGl0KHQpfWZ1bmN0aW9uIGl0KHQpezI9PT10Ll9zdGF0ZSYmMD09PXQuX2RlZmVycmVkcy5sZW5ndGgmJlEuX2ltbWVkaWF0ZUZuKGZ1bmN0aW9uKCl7dC5faGFuZGxlZHx8US5fdW5oYW5kbGVkUmVqZWN0aW9uRm4odC5fdmFsdWUpfSk7Zm9yKHZhciBlPTAsaT10Ll9kZWZlcnJlZHMubGVuZ3RoO2U8aTtlKyspSyh0LHQuX2RlZmVycmVkc1tlXSk7dC5fZGVmZXJyZWRzPW51bGx9ZnVuY3Rpb24gc3QodCxlLGkpe3RoaXMub25GdWxmaWxsZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpudWxsLHRoaXMub25SZWplY3RlZD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm51bGwsdGhpcy5wcm9taXNlPWl9ZnVuY3Rpb24gYXQodCxlKXt2YXIgaT0hMTt0cnl7dChmdW5jdGlvbih0KXtpfHwoaT0hMCx0dChlLHQpKX0sZnVuY3Rpb24odCl7aXx8KGk9ITAsZXQoZSx0KSl9KX1jYXRjaCh0KXtpZihpKXJldHVybjtpPSEwLGV0KGUsdCl9fVEucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW4obnVsbCx0KX0sUS5wcm90b3R5cGUudGhlbj1mdW5jdGlvbih0LGUpe3ZhciBpPW5ldyB0aGlzLmNvbnN0cnVjdG9yKEopO3JldHVybiBLKHRoaXMsbmV3IHN0KHQsZSxpKSksaX0sUS5wcm90b3R5cGUuZmluYWxseT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oaSl7cmV0dXJuIGUucmVzb2x2ZSh0KCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gaX0pfSxmdW5jdGlvbihpKXtyZXR1cm4gZS5yZXNvbHZlKHQoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBlLnJlamVjdChpKX0pfSl9LFEuYWxsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUShmdW5jdGlvbihlLGkpe2lmKCF0fHx2b2lkIDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJQcm9taXNlLmFsbCBhY2NlcHRzIGFuIGFycmF5Iik7dmFyIHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCk7aWYoMD09PXMubGVuZ3RoKXJldHVybiBlKFtdKTt2YXIgYT1zLmxlbmd0aDtmdW5jdGlvbiBuKHQscil7dHJ5e2lmKHImJigib2JqZWN0Ij09dHlwZW9mIHJ8fCJmdW5jdGlvbiI9PXR5cGVvZiByKSl7dmFyIG89ci50aGVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBvKXJldHVybiB2b2lkIG8uY2FsbChyLGZ1bmN0aW9uKGUpe24odCxlKX0saSl9c1t0XT1yLDA9PS0tYSYmZShzKX1jYXRjaCh0KXtpKHQpfX1mb3IodmFyIHI9MDtyPHMubGVuZ3RoO3IrKyluKHIsc1tyXSl9KX0sUS5yZXNvbHZlPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQmJnQuY29uc3RydWN0b3I9PT1RP3Q6bmV3IFEoZnVuY3Rpb24oZSl7ZSh0KX0pfSxRLnJlamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFEoZnVuY3Rpb24oZSxpKXtpKHQpfSl9LFEucmFjZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFEoZnVuY3Rpb24oZSxpKXtmb3IodmFyIHM9MCxhPXQubGVuZ3RoO3M8YTtzKyspdFtzXS50aGVuKGUsaSl9KX0sUS5faW1tZWRpYXRlRm49ImZ1bmN0aW9uIj09dHlwZW9mIHNldEltbWVkaWF0ZSYmZnVuY3Rpb24odCl7c2V0SW1tZWRpYXRlKHQpfXx8ZnVuY3Rpb24odCl7JCh0LDApfSxRLl91bmhhbmRsZWRSZWplY3Rpb25Gbj1mdW5jdGlvbih0KXsidW5kZWZpbmVkIiE9dHlwZW9mIGNvbnNvbGUmJmNvbnNvbGUmJmNvbnNvbGUud2FybigiUG9zc2libGUgVW5oYW5kbGVkIFByb21pc2UgUmVqZWN0aW9uOiIsdCl9O3ZhciBudCxydCxvdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaSl7ZSh0aGlzLHQpLHRoaXMuY3R4PWksdGhpcy53PWkud31yZXR1cm4gcyh0LFt7a2V5OiJnZXRTdmdTdHJpbmciLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudy5nbG9iYWxzLmRvbS5QYXBlci5zdmcoKX19LHtrZXk6ImNsZWFudXAiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53LGU9dC5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMteGNyb3NzaGFpcnMiKSxpPXQuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3IoIi5hcGV4Y2hhcnRzLXljcm9zc2hhaXJzIik7ZSYmZS5zZXRBdHRyaWJ1dGUoIngiLC01MDApLGkmJihpLnNldEF0dHJpYnV0ZSgieTEiLC0xMDApLGkuc2V0QXR0cmlidXRlKCJ5MiIsLTEwMCkpfX0se2tleToic3ZnVXJsIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuY2xlYW51cCgpO3ZhciB0PXRoaXMuZ2V0U3ZnU3RyaW5nKCksZT1uZXcgQmxvYihbdF0se3R5cGU6ImltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCJ9KTtyZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChlKX19LHtrZXk6ImRhdGFVUkkiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gbmV3IFEoZnVuY3Rpb24oZSl7dmFyIGk9dC53O3QuY2xlYW51cCgpO3ZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3Mud2lkdGg9aS5nbG9iYWxzLnN2Z1dpZHRoLHMuaGVpZ2h0PXBhcnNlSW50KGkuZ2xvYmFscy5kb20uZWxXcmFwLnN0eWxlLmhlaWdodCk7dmFyIGE9InRyYW5zcGFyZW50Ij09PWkuY29uZmlnLmNoYXJ0LmJhY2tncm91bmQ/IiNmZmYiOmkuY29uZmlnLmNoYXJ0LmJhY2tncm91bmQsbj1zLmdldENvbnRleHQoIjJkIik7bi5maWxsU3R5bGU9YSxuLmZpbGxSZWN0KDAsMCxzLndpZHRoLHMuaGVpZ2h0KTt2YXIgcj13aW5kb3cuVVJMfHx3aW5kb3cud2Via2l0VVJMfHx3aW5kb3csbz1uZXcgSW1hZ2U7by5jcm9zc09yaWdpbj0iYW5vbnltb3VzIjt2YXIgbD10LmdldFN2Z1N0cmluZygpLGg9ImRhdGE6aW1hZ2Uvc3ZnK3htbCwiK2VuY29kZVVSSUNvbXBvbmVudChsKTtvLm9ubG9hZD1mdW5jdGlvbigpe24uZHJhd0ltYWdlKG8sMCwwKSxyLnJldm9rZU9iamVjdFVSTChoKTt2YXIgdD1zLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIik7ZSh0KX0sby5zcmM9aH0pfX0se2tleToiZXhwb3J0VG9TVkciLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy50cmlnZ2VyRG93bmxvYWQodGhpcy5zdmdVcmwoKSwiLnN2ZyIpfX0se2tleToiZXhwb3J0VG9QbmciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmRhdGFVUkkoKS50aGVuKGZ1bmN0aW9uKGUpe3QudHJpZ2dlckRvd25sb2FkKGUsIi5wbmciKX0pfX0se2tleToidHJpZ2dlckRvd25sb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtpLmhyZWY9dCxpLmRvd25sb2FkPXRoaXMudy5nbG9iYWxzLmNoYXJ0SUQrZSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGkpLGkuY2xpY2soKSxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGkpfX1dKSx0fSgpLGx0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy5jdHg9aSx0aGlzLnc9aS53O3ZhciBzPXRoaXMudzt0aGlzLmFuaW09bmV3IGYodGhpcy5jdHgpLHRoaXMueGF4aXNMYWJlbHM9cy5nbG9iYWxzLmxhYmVscy5zbGljZSgpLHRoaXMuYW5pbVg9cy5jb25maWcuZ3JpZC54YXhpcy5saW5lcy5hbmltYXRlJiZzLmNvbmZpZy5jaGFydC5hbmltYXRpb25zLmVuYWJsZWQsdGhpcy5hbmltWT1zLmNvbmZpZy5ncmlkLnlheGlzLmxpbmVzLmFuaW1hdGUmJnMuY29uZmlnLmNoYXJ0LmFuaW1hdGlvbnMuZW5hYmxlZCxzLmdsb2JhbHMudGltZWxpbmVMYWJlbHMubGVuZ3RoPjAmJih0aGlzLnhheGlzTGFiZWxzPXMuZ2xvYmFscy50aW1lbGluZUxhYmVscy5zbGljZSgpKX1yZXR1cm4gcyh0LFt7a2V5OiJkcmF3R3JpZEFyZWEiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGwsZT10aGlzLncsaT1uZXcgcCh0aGlzLmN0eCk7bnVsbD09PXQmJih0PWkuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLWdyaWQifSkpO3ZhciBzPWkuZHJhd0xpbmUoZS5nbG9iYWxzLnBhZEhvcml6b250YWwsMSxlLmdsb2JhbHMucGFkSG9yaXpvbnRhbCxlLmdsb2JhbHMuZ3JpZEhlaWdodCwidHJhbnNwYXJlbnQiKSxhPWkuZHJhd0xpbmUoZS5nbG9iYWxzLnBhZEhvcml6b250YWwsZS5nbG9iYWxzLmdyaWRIZWlnaHQsZS5nbG9iYWxzLmdyaWRXaWR0aCxlLmdsb2JhbHMuZ3JpZEhlaWdodCwidHJhbnNwYXJlbnQiKTtyZXR1cm4gdC5hZGQoYSksdC5hZGQocyksdH19LHtrZXk6ImRyYXdHcmlkIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudyxlPW5ldyBfKHRoaXMuY3R4KSxpPW5ldyBIKHRoaXMuY3R4KSxzPXRoaXMudy5nbG9iYWxzLGE9bnVsbDtpZihzLmF4aXNDaGFydHMpe2lmKHQuY29uZmlnLmdyaWQuc2hvdylhPXRoaXMucmVuZGVyR3JpZCgpLHMuZG9tLmVsR3JhcGhpY2FsLmFkZChhLmVsKSx0aGlzLmRyYXdHcmlkQXJlYShhLmVsKTtlbHNle3ZhciBuPXRoaXMuZHJhd0dyaWRBcmVhKCk7cy5kb20uZWxHcmFwaGljYWwuYWRkKG4pfW51bGwhPT1hJiZlLnhBeGlzTGFiZWxDb3JyZWN0aW9ucyhhLnhBeGlzVGlja1dpZHRoKSxpLnNldFlBeGlzVGV4dEFsaWdubWVudHMoKX19fSx7a2V5OiJjcmVhdGVHcmlkTWFzayIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLncsZT10Lmdsb2JhbHMsaT1uZXcgcCh0aGlzLmN0eCkscz1BcnJheS5pc0FycmF5KHQuY29uZmlnLnN0cm9rZS53aWR0aCk/MDp0LmNvbmZpZy5zdHJva2Uud2lkdGg7aWYoQXJyYXkuaXNBcnJheSh0LmNvbmZpZy5zdHJva2Uud2lkdGgpKXt2YXIgYT0wO3QuY29uZmlnLnN0cm9rZS53aWR0aC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2E9TWF0aC5tYXgoYSx0KX0pLHM9YX1lLmRvbS5lbEdyaWRSZWN0TWFzaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZS5TVkdOUywiY2xpcFBhdGgiKSxlLmRvbS5lbEdyaWRSZWN0TWFzay5zZXRBdHRyaWJ1dGUoImlkIiwiZ3JpZFJlY3RNYXNrIi5jb25jYXQoZS5jdWlkKSksZS5kb20uZWxHcmlkUmVjdE1hcmtlck1hc2s9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGUuU1ZHTlMsImNsaXBQYXRoIiksZS5kb20uZWxHcmlkUmVjdE1hcmtlck1hc2suc2V0QXR0cmlidXRlKCJpZCIsImdyaWRSZWN0TWFya2VyTWFzayIuY29uY2F0KGUuY3VpZCkpLGUuZG9tLmVsR3JpZFJlY3Q9aS5kcmF3UmVjdCgtcy8yLC1zLzIsZS5ncmlkV2lkdGgrcyxlLmdyaWRIZWlnaHQrcywwLCIjZmZmIiksbmV3IHcodGhpcykuZ2V0TGFyZ2VzdE1hcmtlclNpemUoKTt2YXIgbj10Lmdsb2JhbHMubWFya2Vycy5sYXJnZXN0U2l6ZSsxO2UuZG9tLmVsR3JpZFJlY3RNYXJrZXI9aS5kcmF3UmVjdCgtbiwtbixlLmdyaWRXaWR0aCsyKm4sZS5ncmlkSGVpZ2h0KzIqbiwwLCIjZmZmIiksZS5kb20uZWxHcmlkUmVjdE1hc2suYXBwZW5kQ2hpbGQoZS5kb20uZWxHcmlkUmVjdC5ub2RlKSxlLmRvbS5lbEdyaWRSZWN0TWFya2VyTWFzay5hcHBlbmRDaGlsZChlLmRvbS5lbEdyaWRSZWN0TWFya2VyLm5vZGUpO3ZhciByPWUuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCJkZWZzIik7ci5hcHBlbmRDaGlsZChlLmRvbS5lbEdyaWRSZWN0TWFzayksci5hcHBlbmRDaGlsZChlLmRvbS5lbEdyaWRSZWN0TWFya2VyTWFzayl9fSx7a2V5OiJyZW5kZXJHcmlkIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudyxlPW5ldyBwKHRoaXMuY3R4KSxpPXQuY29uZmlnLmdyaWQuc3Ryb2tlRGFzaEFycmF5LHM9ZS5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMtZ3JpZCJ9KSxhPWUuZ3JvdXAoe2NsYXNzOiJhcGV4Y2hhcnRzLWdyaWRsaW5lcy1ob3Jpem9udGFsIn0pLG49ZS5ncm91cCh7Y2xhc3M6ImFwZXhjaGFydHMtZ3JpZGxpbmVzLXZlcnRpY2FsIn0pO3MuYWRkKGEpLHMuYWRkKG4pO2Zvcih2YXIgcixvPTgsbD0wO2w8dC5nbG9iYWxzLnNlcmllcy5sZW5ndGgmJih2b2lkIDAhPT10Lmdsb2JhbHMueUF4aXNTY2FsZVtsXSYmKG89dC5nbG9iYWxzLnlBeGlzU2NhbGVbbF0ucmVzdWx0Lmxlbmd0aC0xKSwhKG8+MikpO2wrKyk7aWYodC5nbG9iYWxzLmlzQmFySG9yaXpvbnRhbCl7aWYocj1vLHQuY29uZmlnLmdyaWQueGF4aXMubGluZXMuc2hvd3x8dC5jb25maWcueGF4aXMuYXhpc1RpY2tzLnNob3cpZm9yKHZhciBoLGM9dC5nbG9iYWxzLnBhZEhvcml6b250YWwsZD10Lmdsb2JhbHMuZ3JpZEhlaWdodCx1PTA7dTxyKzEmJihoPWM9Yyt0Lmdsb2JhbHMuZ3JpZFdpZHRoL3IrLjMsdSE9PXItMSk7dSsrKXtpZih0LmNvbmZpZy5ncmlkLnhheGlzLmxpbmVzLnNob3cpe3ZhciBnPWUuZHJhd0xpbmUoYywwLGgsZCx0LmNvbmZpZy5ncmlkLmJvcmRlckNvbG9yLGkpO2cubm9kZS5jbGFzc0xpc3QuYWRkKCJhcGV4Y2hhcnRzLWdyaWRsaW5lIiksbi5hZGQoZyksdGhpcy5hbmltWCYmdGhpcy5hbmltYXRlTGluZShnLHt4MTowLHgyOjB9LHt4MTpjLHgyOmh9KX1uZXcgXyh0aGlzLmN0eCkuZHJhd1hheGlzVGlja3MoYyxzKX1pZih0LmNvbmZpZy5ncmlkLnlheGlzLmxpbmVzLnNob3cpZm9yKHZhciBmPTAseD0wLGI9dC5nbG9iYWxzLmdyaWRXaWR0aCxtPTA7bTx0Lmdsb2JhbHMuZGF0YVBvaW50cysxO20rKyl7dmFyIHY9ZS5kcmF3TGluZSgwLGYsYix4LHQuY29uZmlnLmdyaWQuYm9yZGVyQ29sb3IsaSk7YS5hZGQodiksdi5ub2RlLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtZ3JpZGxpbmUiKSx0aGlzLmFuaW1ZJiZ0aGlzLmFuaW1hdGVMaW5lKHYse3kxOmYrMjAseTI6eCsyMH0se3kxOmYseTI6eH0pLHg9Zis9dC5nbG9iYWxzLmdyaWRIZWlnaHQvdC5nbG9iYWxzLmRhdGFQb2ludHN9fWVsc2V7aWYocj10aGlzLnhheGlzTGFiZWxzLmxlbmd0aCx0LmNvbmZpZy5ncmlkLnhheGlzLmxpbmVzLnNob3d8fHQuY29uZmlnLnhheGlzLmF4aXNUaWNrcy5zaG93KXt2YXIgeSx3PXQuZ2xvYmFscy5wYWRIb3Jpem9udGFsLGs9dC5nbG9iYWxzLmdyaWRIZWlnaHQ7aWYodC5nbG9iYWxzLnRpbWVsaW5lTGFiZWxzLmxlbmd0aD4wKWZvcih2YXIgQT0wO0E8cjtBKyspe2lmKHc9dGhpcy54YXhpc0xhYmVsc1tBXS5wb3NpdGlvbix5PXRoaXMueGF4aXNMYWJlbHNbQV0ucG9zaXRpb24sdC5jb25maWcuZ3JpZC54YXhpcy5saW5lcy5zaG93JiZ3PjAmJnc8dC5nbG9iYWxzLmdyaWRXaWR0aCl7dmFyIFM9ZS5kcmF3TGluZSh3LDAseSxrLHQuY29uZmlnLmdyaWQuYm9yZGVyQ29sb3IsaSk7Uy5ub2RlLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtZ3JpZGxpbmUiKSxuLmFkZChTKSx0aGlzLmFuaW1YJiZ0aGlzLmFuaW1hdGVMaW5lKFMse3gxOjAseDI6MH0se3gxOncseDI6eX0pfXZhciBDPW5ldyBfKHRoaXMuY3R4KTtBPT09ci0xJiZ0Lmdsb2JhbHMuc2tpcExhc3RUaW1lbGluZWxhYmVsfHxDLmRyYXdYYXhpc1RpY2tzKHcscyl9ZWxzZSBmb3IodmFyIEw9cixQPTA7UDxMO1ArKyl7dmFyIHo9TDtpZih0Lmdsb2JhbHMuaXNYTnVtZXJpYyYmImJhciIhPT10LmNvbmZpZy5jaGFydC50eXBlJiYoei09MSkseT13Kz10Lmdsb2JhbHMuZ3JpZFdpZHRoL3osUD09PXotMSlicmVhaztpZih0LmNvbmZpZy5ncmlkLnhheGlzLmxpbmVzLnNob3cpe3ZhciBNPWUuZHJhd0xpbmUodywwLHksayx0LmNvbmZpZy5ncmlkLmJvcmRlckNvbG9yLGkpO00ubm9kZS5jbGFzc0xpc3QuYWRkKCJhcGV4Y2hhcnRzLWdyaWRsaW5lIiksbi5hZGQoTSksdGhpcy5hbmltWCYmdGhpcy5hbmltYXRlTGluZShNLHt4MTowLHgyOjB9LHt4MTp3LHgyOnl9KX1uZXcgXyh0aGlzLmN0eCkuZHJhd1hheGlzVGlja3ModyxzKX19aWYodC5jb25maWcuZ3JpZC55YXhpcy5saW5lcy5zaG93KWZvcih2YXIgRT0wLFQ9MCxYPXQuZ2xvYmFscy5ncmlkV2lkdGgsST0wO0k8bysxO0krKyl7dmFyIFk9ZS5kcmF3TGluZSgwLEUsWCxULHQuY29uZmlnLmdyaWQuYm9yZGVyQ29sb3IsaSk7YS5hZGQoWSksWS5ub2RlLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtZ3JpZGxpbmUiKSx0aGlzLmFuaW1ZJiZ0aGlzLmFuaW1hdGVMaW5lKFkse3kxOkUrMjAseTI6VCsyMH0se3kxOkUseTI6VH0pLFQ9RSs9dC5nbG9iYWxzLmdyaWRIZWlnaHQvb319cmV0dXJuIHRoaXMuZHJhd0dyaWRCYW5kcyhzLHIsbykse2VsOnMseEF4aXNUaWNrV2lkdGg6dC5nbG9iYWxzLmdyaWRXaWR0aC9yfX19LHtrZXk6ImRyYXdHcmlkQmFuZHMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcz10aGlzLncsYT1uZXcgcCh0aGlzLmN0eCk7aWYodm9pZCAwIT09cy5jb25maWcuZ3JpZC5yb3cuY29sb3JzJiZzLmNvbmZpZy5ncmlkLnJvdy5jb2xvcnMubGVuZ3RoPjApZm9yKHZhciBuPTAscj1zLmdsb2JhbHMuZ3JpZEhlaWdodC9pLG89cy5nbG9iYWxzLmdyaWRXaWR0aCxsPTAsaD0wO2w8aTtsKyssaCsrKXtoPj1zLmNvbmZpZy5ncmlkLnJvdy5jb2xvcnMubGVuZ3RoJiYoaD0wKTt2YXIgYz1zLmNvbmZpZy5ncmlkLnJvdy5jb2xvcnNbaF0sZD1hLmRyYXdSZWN0KDAsbixvLHIsMCxjLHMuY29uZmlnLmdyaWQucm93Lm9wYWNpdHkpO3QuYWRkKGQpLGQubm9kZS5jbGFzc0xpc3QuYWRkKCJhcGV4Y2hhcnRzLWdyaWRSb3ciKSxuKz1zLmdsb2JhbHMuZ3JpZEhlaWdodC9pfWlmKHZvaWQgMCE9PXMuY29uZmlnLmdyaWQuY29sdW1uLmNvbG9ycyYmcy5jb25maWcuZ3JpZC5jb2x1bW4uY29sb3JzLmxlbmd0aD4wKWZvcih2YXIgdT1zLmdsb2JhbHMucGFkSG9yaXpvbnRhbCxnPXMuZ2xvYmFscy5wYWRIb3Jpem9udGFsK3MuZ2xvYmFscy5ncmlkV2lkdGgvZSxmPXMuZ2xvYmFscy5ncmlkSGVpZ2h0LHg9MCxiPTA7eDxlO3grKyxiKyspe2I+PXMuY29uZmlnLmdyaWQuY29sdW1uLmNvbG9ycy5sZW5ndGgmJihiPTApO3ZhciBtPXMuY29uZmlnLmdyaWQuY29sdW1uLmNvbG9yc1tiXSx2PWEuZHJhd1JlY3QodSwwLGcsZiwwLG0scy5jb25maWcuZ3JpZC5jb2x1bW4ub3BhY2l0eSk7di5ub2RlLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtZ3JpZENvbHVtbiIpLHQuYWRkKHYpLHUrPXMuZ2xvYmFscy5ncmlkV2lkdGgvZX19fSx7a2V5OiJhbmltYXRlTGluZSIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBzPXRoaXMudyxhPXMuY29uZmlnLmNoYXJ0LmFuaW1hdGlvbnM7aWYoYSYmIXMuZ2xvYmFscy5yZXNpemVkJiYhcy5nbG9iYWxzLmRhdGFDaGFuZ2VkKXt2YXIgbj1hLnNwZWVkO3RoaXMuYW5pbS5hbmltYXRlTGluZSh0LGUsaSxuKX19fV0pLHR9KCksaHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGkpe2UodGhpcyx0KSx0aGlzLmN0eD1pLHRoaXMudz1pLnd9cmV0dXJuIHModCxbe2tleToiY2hlY2tSZXNwb25zaXZlQ29uZmlnIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLGk9dGhpcy53LHM9aS5jb25maWc7aWYoMCE9PXMucmVzcG9uc2l2ZS5sZW5ndGgpe3ZhciBhPXMucmVzcG9uc2l2ZS5zbGljZSgpO2Euc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LmJyZWFrcG9pbnQ+ZS5icmVha3BvaW50PzE6ZS5icmVha3BvaW50PnQuYnJlYWtwb2ludD8tMTowfSkucmV2ZXJzZSgpO3ZhciBuPW5ldyBrKHt9KSxyPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LHM9YVswXS5icmVha3BvaW50LHI9d2luZG93LmlubmVyV2lkdGg+MD93aW5kb3cuaW5uZXJXaWR0aDpzY3JlZW4ud2lkdGg7aWYocj5zKXt2YXIgbz13LmV4dGVuZEFycmF5UHJvcHMobixpLmdsb2JhbHMuaW5pdGlhbENvbmZpZyk7dD11LmV4dGVuZChvLHQpLHQ9dS5leHRlbmQoaS5jb25maWcsdCksZS5vdmVycmlkZVJlc3BvbnNpdmVPcHRpb25zKHQpfWVsc2UgZm9yKHZhciBsPTA7bDxhLmxlbmd0aDtsKyspcjxhW2xdLmJyZWFrcG9pbnQmJih0PXcuZXh0ZW5kQXJyYXlQcm9wcyhuLGFbbF0ub3B0aW9ucyksdD11LmV4dGVuZChpLmNvbmZpZyx0KSxlLm92ZXJyaWRlUmVzcG9uc2l2ZU9wdGlvbnModCkpfTtpZih0KXt2YXIgbz13LmV4dGVuZEFycmF5UHJvcHMobix0KTtvPXUuZXh0ZW5kKGkuY29uZmlnLG8pLHIobz11LmV4dGVuZChvLHQpKX1lbHNlIHIoe30pfX19LHtrZXk6Im92ZXJyaWRlUmVzcG9uc2l2ZU9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBrKHQpLmluaXQoKTt0aGlzLncuY29uZmlnPWV9fV0pLHR9KCksY3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGkpe2UodGhpcyx0KSx0aGlzLmN0eD1pLHRoaXMudz1pLncsdGhpcy5jb2xvcnM9W119cmV0dXJuIHModCxbe2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNldERlZmF1bHRDb2xvcnMoKX19LHtrZXk6InNldERlZmF1bHRDb2xvcnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53LGU9bmV3IHU7aWYodC5nbG9iYWxzLmRvbS5lbFdyYXAuY2xhc3NMaXN0LmFkZCh0LmNvbmZpZy50aGVtZS5tb2RlKSx2b2lkIDA9PT10LmNvbmZpZy5jb2xvcnM/dC5nbG9iYWxzLmNvbG9ycz10aGlzLnByZWRlZmluZWQoKToodC5nbG9iYWxzLmNvbG9ycz10LmNvbmZpZy5jb2xvcnMsdC5nbG9iYWxzLmF4aXNDaGFydHMmJiJiYXIiIT09dC5jb25maWcuY2hhcnQudHlwZSYmQXJyYXkuaXNBcnJheSh0LmNvbmZpZy5jb2xvcnMpJiZ0LmNvbmZpZy5jb2xvcnMubGVuZ3RoPjAmJnQuY29uZmlnLmNvbG9ycy5sZW5ndGg9PT10LmNvbmZpZy5zZXJpZXMubGVuZ3RoJiYodC5nbG9iYWxzLmNvbG9ycz10LmNvbmZpZy5jb2xvcnMubWFwKGZ1bmN0aW9uKGUsaSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/ZSh7dmFsdWU6dC5nbG9iYWxzLmF4aXNDaGFydHM/dC5nbG9iYWxzLnNlcmllc1tpXVswXT90Lmdsb2JhbHMuc2VyaWVzW2ldWzBdOjA6dC5nbG9iYWxzLnNlcmllc1tpXSxzZXJpZXNJbmRleDppLHc6dH0pOmV9KSkpLHQuY29uZmlnLnRoZW1lLm1vbm9jaHJvbWUuZW5hYmxlZCl7dmFyIGk9W10scz10Lmdsb2JhbHMuc2VyaWVzLmxlbmd0aDt0LmNvbmZpZy5wbG90T3B0aW9ucy5iYXIuZGlzdHJpYnV0ZWQmJiJiYXIiPT09dC5jb25maWcuY2hhcnQudHlwZSYmKHM9dC5nbG9iYWxzLnNlcmllc1swXS5sZW5ndGgqdC5nbG9iYWxzLnNlcmllcy5sZW5ndGgpO2Zvcih2YXIgYT10LmNvbmZpZy50aGVtZS5tb25vY2hyb21lLmNvbG9yLG49MS8ocy90LmNvbmZpZy50aGVtZS5tb25vY2hyb21lLnNoYWRlSW50ZW5zaXR5KSxyPXQuY29uZmlnLnRoZW1lLm1vbm9jaHJvbWUuc2hhZGVUbyxvPTAsbD0wO2w8cztsKyspe3ZhciBoPXZvaWQgMDsiZGFyayI9PT1yPyhoPWUuc2hhZGVDb2xvcigtMSpvLGEpLG8rPW4pOihoPWUuc2hhZGVDb2xvcihvLGEpLG8rPW4pLGkucHVzaChoKX10Lmdsb2JhbHMuY29sb3JzPWkuc2xpY2UoKX12YXIgYz10Lmdsb2JhbHMuY29sb3JzLnNsaWNlKCk7dGhpcy5wdXNoRXh0cmFDb2xvcnModC5nbG9iYWxzLmNvbG9ycyksdm9pZCAwPT09dC5jb25maWcuc3Ryb2tlLmNvbG9ycz90Lmdsb2JhbHMuc3Ryb2tlLmNvbG9ycz1jOnQuZ2xvYmFscy5zdHJva2UuY29sb3JzPXQuY29uZmlnLnN0cm9rZS5jb2xvcnMsdGhpcy5wdXNoRXh0cmFDb2xvcnModC5nbG9iYWxzLnN0cm9rZS5jb2xvcnMpLHZvaWQgMD09PXQuY29uZmlnLmZpbGwuY29sb3JzP3QuZ2xvYmFscy5maWxsLmNvbG9ycz1jOnQuZ2xvYmFscy5maWxsLmNvbG9ycz10LmNvbmZpZy5maWxsLmNvbG9ycyx0aGlzLnB1c2hFeHRyYUNvbG9ycyh0Lmdsb2JhbHMuZmlsbC5jb2xvcnMpLHZvaWQgMD09PXQuY29uZmlnLmRhdGFMYWJlbHMuc3R5bGUuY29sb3JzP3QuZ2xvYmFscy5kYXRhTGFiZWxzLnN0eWxlLmNvbG9ycz1jOnQuZ2xvYmFscy5kYXRhTGFiZWxzLnN0eWxlLmNvbG9ycz10LmNvbmZpZy5kYXRhTGFiZWxzLnN0eWxlLmNvbG9ycyx0aGlzLnB1c2hFeHRyYUNvbG9ycyh0Lmdsb2JhbHMuZGF0YUxhYmVscy5zdHlsZS5jb2xvcnMsNTApLHZvaWQgMD09PXQuY29uZmlnLnBsb3RPcHRpb25zLnJhZGFyLnBvbHlnb25zLmZpbGwuY29sb3JzP3QuZ2xvYmFscy5yYWRhclBvbHlnb25zLmZpbGwuY29sb3JzPVsiZGFyayI9PT10LmNvbmZpZy50aGVtZS5tb2RlPyIjMjAyRDQ4IjoiI2ZmZiJdOnQuZ2xvYmFscy5yYWRhclBvbHlnb25zLmZpbGwuY29sb3JzPXQuY29uZmlnLnBsb3RPcHRpb25zLnJhZGFyLnBvbHlnb25zLmZpbGwuY29sb3JzLHRoaXMucHVzaEV4dHJhQ29sb3JzKHQuZ2xvYmFscy5yYWRhclBvbHlnb25zLmZpbGwuY29sb3JzLDIwKSx2b2lkIDA9PT10LmNvbmZpZy5tYXJrZXJzLmNvbG9ycz90Lmdsb2JhbHMubWFya2Vycy5jb2xvcnM9Yzp0Lmdsb2JhbHMubWFya2Vycy5jb2xvcnM9dC5jb25maWcubWFya2Vycy5jb2xvcnMsdGhpcy5wdXNoRXh0cmFDb2xvcnModC5nbG9iYWxzLm1hcmtlcnMuY29sb3JzKX19LHtrZXk6InB1c2hFeHRyYUNvbG9ycyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCxzPXRoaXMudyxhPWV8fHMuZ2xvYmFscy5zZXJpZXMubGVuZ3RoO2lmKG51bGw9PT1pJiYoaT0iYmFyIj09PXMuY29uZmlnLmNoYXJ0LnR5cGUmJnMuY29uZmlnLnBsb3RPcHRpb25zLmJhci5kaXN0cmlidXRlZHx8ImhlYXRtYXAiPT09cy5jb25maWcuY2hhcnQudHlwZSYmcy5jb25maWcucGxvdE9wdGlvbnMuaGVhdG1hcC5jb2xvclNjYWxlLmludmVyc2UpLGkmJihhPXMuZ2xvYmFscy5zZXJpZXNbMF0ubGVuZ3RoKnMuZ2xvYmFscy5zZXJpZXMubGVuZ3RoKSx0Lmxlbmd0aDxhKWZvcih2YXIgbj1hLXQubGVuZ3RoLHI9MDtyPG47cisrKXQucHVzaCh0W3JdKX19LHtrZXk6InVwZGF0ZVRoZW1lT3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24odCl7dC5jaGFydD10LmNoYXJ0fHx7fSx0LnRvb2x0aXA9dC50b29sdGlwfHx7fTt2YXIgZT10LnRoZW1lLm1vZGV8fCJsaWdodCIsaT10LnRoZW1lLnBhbGV0dGU/dC50aGVtZS5wYWxldHRlOiJkYXJrIj09PWU/InBhbGV0dGU0IjoicGFsZXR0ZTEiLHM9dC5jaGFydC5mb3JlQ29sb3I/dC5jaGFydC5mb3JlQ29sb3I6ImRhcmsiPT09ZT8iI2Y2ZjdmOCI6IiMzNzNkM2YiO3JldHVybiB0LnRvb2x0aXAudGhlbWU9ZSx0LmNoYXJ0LmZvcmVDb2xvcj1zLHQudGhlbWUucGFsZXR0ZT1pLHR9fSx7a2V5OiJwcmVkZWZpbmVkIix2YWx1ZTpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLncuY29uZmlnLnRoZW1lLnBhbGV0dGUpe2Nhc2UicGFsZXR0ZTEiOnRoaXMuY29sb3JzPVsiIzAwOEZGQiIsIiMwMEUzOTYiLCIjRkVCMDE5IiwiI0ZGNDU2MCIsIiM3NzVERDAiXTticmVhaztjYXNlInBhbGV0dGUyIjp0aGlzLmNvbG9ycz1bIiMzZjUxYjUiLCIjMDNhOWY0IiwiIzRjYWY1MCIsIiNmOWNlMWQiLCIjRkY5ODAwIl07YnJlYWs7Y2FzZSJwYWxldHRlMyI6dGhpcy5jb2xvcnM9WyIjMzNiMmRmIiwiIzU0NkU3QSIsIiNkNDUyNmUiLCIjMTNkOGFhIiwiI0E1OTc4QiJdO2JyZWFrO2Nhc2UicGFsZXR0ZTQiOnRoaXMuY29sb3JzPVsiIzRlY2RjNCIsIiNjN2Y0NjQiLCIjODFENEZBIiwiI2ZkNmE2YSIsIiM1NDZFN0EiXTticmVhaztjYXNlInBhbGV0dGU1Ijp0aGlzLmNvbG9ycz1bIiMyYjkwOGYiLCIjZjlhM2E0IiwiIzkwZWU3ZSIsIiNmYTQ0NDMiLCIjNjlkMmU3Il07YnJlYWs7Y2FzZSJwYWxldHRlNiI6dGhpcy5jb2xvcnM9WyIjNDQ5REQxIiwiI0Y4NjYyNCIsIiNFQTM1NDYiLCIjNjYyRTlCIiwiI0M1RDg2RCJdO2JyZWFrO2Nhc2UicGFsZXR0ZTciOnRoaXMuY29sb3JzPVsiI0Q3MjYzRCIsIiMxQjk5OEIiLCIjMkUyOTRFIiwiI0Y0NjAzNiIsIiNFMkMwNDQiXTticmVhaztjYXNlInBhbGV0dGU4Ijp0aGlzLmNvbG9ycz1bIiM2NjJFOUIiLCIjRjg2NjI0IiwiI0Y5QzgwRSIsIiNFQTM1NDYiLCIjNDNCQ0NEIl07YnJlYWs7Y2FzZSJwYWxldHRlOSI6dGhpcy5jb2xvcnM9WyIjNUM0NzQyIiwiI0E1OTc4QiIsIiM4RDVCNEMiLCIjNUEyQTI3IiwiI0M0QkJBRiJdO2JyZWFrO2Nhc2UicGFsZXR0ZTEwIjp0aGlzLmNvbG9ycz1bIiNBMzAwRDYiLCIjN0QwMkVCIiwiIzU2NTNGRSIsIiMyOTgzRkYiLCIjMDBCMUYyIl07YnJlYWs7ZGVmYXVsdDp0aGlzLmNvbG9ycz1bIiMwMDhGRkIiLCIjMDBFMzk2IiwiI0ZFQjAxOSIsIiNGRjQ1NjAiLCIjNzc1REQwIl19cmV0dXJuIHRoaXMuY29sb3JzfX1dKSx0fSgpLGR0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy53PWkudyx0aGlzLnR0Q3R4PWksdGhpcy5jdHg9aS5jdHh9cmV0dXJuIHModCxbe2tleToiZ2V0TmVhcmVzdFZhbHVlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dC5ob3ZlckFyZWEsaT10LmVsR3JpZCxzPXQuY2xpZW50WCxhPXQuY2xpZW50WSxuPXQuaGFzQmFycyxyPXRoaXMudyxvPXIuZ2xvYmFscy5ncmlkV2lkdGgsbD1vLyhyLmdsb2JhbHMuZGF0YVBvaW50cy0xKSxoPWkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7KG4mJnIuZ2xvYmFscy5jb21ib0NoYXJ0c3x8bikmJihsPW8vci5nbG9iYWxzLmRhdGFQb2ludHMpO3ZhciBjPXMtaC5sZWZ0LGQ9YS1oLnRvcDtjPDB8fGQ8MHx8Yz5yLmdsb2JhbHMuZ3JpZFdpZHRofHxkPnIuZ2xvYmFscy5ncmlkSGVpZ2h0PyhlLmNsYXNzTGlzdC5yZW1vdmUoImhvdmVyaW5nLXpvb20iKSxlLmNsYXNzTGlzdC5yZW1vdmUoImhvdmVyaW5nLXBhbiIpKTpyLmdsb2JhbHMuem9vbUVuYWJsZWQ/KGUuY2xhc3NMaXN0LnJlbW92ZSgiaG92ZXJpbmctcGFuIiksZS5jbGFzc0xpc3QuYWRkKCJob3ZlcmluZy16b29tIikpOnIuZ2xvYmFscy5wYW5FbmFibGVkJiYoZS5jbGFzc0xpc3QucmVtb3ZlKCJob3ZlcmluZy16b29tIiksZS5jbGFzc0xpc3QuYWRkKCJob3ZlcmluZy1wYW4iKSk7dmFyIHU9TWF0aC5yb3VuZChjL2wpO24mJih1PU1hdGguY2VpbChjL2wpLHUtPTEpO2Zvcih2YXIgZyxmPW51bGwscD1udWxsLHg9W10sYj0wO2I8ci5nbG9iYWxzLnNlcmllc1h2YWx1ZXMubGVuZ3RoO2IrKyl4LnB1c2goW3IuZ2xvYmFscy5zZXJpZXNYdmFsdWVzW2JdWzBdLTFlLTZdLmNvbmNhdChyLmdsb2JhbHMuc2VyaWVzWHZhbHVlc1tiXSkpO3JldHVybiB4PXgubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdH0pfSksZz1yLmdsb2JhbHMuc2VyaWVzWXZhbHVlcy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0fSl9KSxyLmdsb2JhbHMuaXNYTnVtZXJpYyYmKGY9KHA9dGhpcy5jbG9zZXN0SW5NdWx0aUFycmF5KGMsZCx4LGcpKS5pbmRleCx1PXAuaixudWxsIT09ZiYmKHg9ci5nbG9iYWxzLnNlcmllc1h2YWx1ZXNbZl0sdT0ocD10aGlzLmNsb3Nlc3RJbkFycmF5KGMseCkpLmluZGV4KSksci5nbG9iYWxzLmNhcHR1cmVkU2VyaWVzSW5kZXg9bnVsbD09PWY/LTE6ZixyLmdsb2JhbHMuY2FwdHVyZWREYXRhUG9pbnRJbmRleD1udWxsPT09dT8tMTp1LCghdXx8dTwxKSYmKHU9MCkse2NhcHR1cmVkU2VyaWVzOmYsajp1LGhvdmVyWDpjLGhvdmVyWTpkfX19LHtrZXk6ImNsb3Nlc3RJbk11bHRpQXJyYXkiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLHMpe3ZhciBhPXRoaXMudyxuPTAscj1udWxsLG89LTE7YS5nbG9iYWxzLnNlcmllcy5sZW5ndGg+MT9uPXRoaXMuZ2V0Rmlyc3RBY3RpdmVYQXJyYXkoaSk6cj0wO3ZhciBsPXNbbl1bMF0saD1pW25dWzBdLGM9TWF0aC5hYnModC1oKSxkPU1hdGguYWJzKGUtbCksdT1kK2M7cmV0dXJuIHMubWFwKGZ1bmN0aW9uKGEsbil7YS5tYXAoZnVuY3Rpb24oYSxsKXt2YXIgaD1NYXRoLmFicyhlLXNbbl1bbF0pLGc9TWF0aC5hYnModC1pW25dW2xdKSxmPWcraDtmPHUmJih1PWYsYz1nLGQ9aCxyPW4sbz1sKX0pfSkse2luZGV4OnIsajpvfX19LHtrZXk6ImdldEZpcnN0QWN0aXZlWEFycmF5Iix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxpPW5ldyB3KHRoaXMuY3R4KSxzPXQubWFwKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubGVuZ3RoPjA/ZTotMX0pLGE9MDthPHMubGVuZ3RoO2ErKyl7dmFyIG49aS5nZXRTZXJpZXNUb3RhbEJ5SW5kZXgoYSk7aWYoLTEhPT1zW2FdJiYwIT09biYmIWkuc2VyaWVzSGF2ZVNhbWVWYWx1ZXMoYSkpe2U9c1thXTticmVha319cmV0dXJuIGV9fSx7a2V5OiJjbG9zZXN0SW5BcnJheSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9ZVswXSxzPW51bGwsYT1NYXRoLmFicyh0LWkpLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9TWF0aC5hYnModC1lW25dKTtyPGEmJihhPXIscz1uKX1yZXR1cm57aW5kZXg6c319fSx7a2V5OiJpc1hvdmVybGFwIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bXSxpPXRoaXMudy5nbG9iYWxzLnNlcmllc1guZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10WzBdfSk7aWYoaS5sZW5ndGg+MClmb3IodmFyIHM9MDtzPGkubGVuZ3RoLTE7cysrKXZvaWQgMCE9PWlbc11bdF0mJnZvaWQgMCE9PWlbcysxXVt0XSYmaVtzXVt0XSE9PWlbcysxXVt0XSYmZS5wdXNoKCJ1bkVxdWFsIik7cmV0dXJuIDA9PT1lLmxlbmd0aH19LHtrZXk6ImlzSW5pdGlhbFNlcmllc1NhbWVMZW4iLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PSEwLGU9dGhpcy53Lmdsb2JhbHMuaW5pdGlhbFNlcmllcyxpPTA7aTxlLmxlbmd0aC0xO2krKylpZihlW2ldLmRhdGEubGVuZ3RoIT09ZVtpKzFdLmRhdGEubGVuZ3RoKXt0PSExO2JyZWFrfXJldHVybiB0fX0se2tleToiZ2V0QmFyc0hlaWdodCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIGQodCkucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZS5nZXRCQm94KCkuaGVpZ2h0fSwwKX19LHtrZXk6InRvZ2dsZUFsbFRvb2x0aXBTZXJpZXNHcm91cHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudyxpPXRoaXMudHRDdHg7MD09PWkuYWxsVG9vbHRpcFNlcmllc0dyb3Vwcy5sZW5ndGgmJihpLmFsbFRvb2x0aXBTZXJpZXNHcm91cHM9ZS5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvckFsbCgiLmFwZXhjaGFydHMtdG9vbHRpcC1zZXJpZXMtZ3JvdXAiKSk7Zm9yKHZhciBzPWkuYWxsVG9vbHRpcFNlcmllc0dyb3VwcyxhPTA7YTxzLmxlbmd0aDthKyspImVuYWJsZSI9PT10PyhzW2FdLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpLHNbYV0uc3R5bGUuZGlzcGxheT1lLmNvbmZpZy50b29sdGlwLml0ZW1zLmRpc3BsYXkpOihzW2FdLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpLHNbYV0uc3R5bGUuZGlzcGxheT0ibm9uZSIpfX1dKSx0fSgpLHV0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy53PWkudyx0aGlzLmN0eD1pLmN0eCx0aGlzLnR0Q3R4PWksdGhpcy50b29sdGlwVXRpbD1uZXcgZHQoaSl9cmV0dXJuIHModCxbe2tleToiZHJhd1Nlcmllc1RleHRzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LnNoYXJlZCxpPXZvaWQgMD09PWV8fGUscz10LnR0SXRlbXMsYT10Lmksbj12b2lkIDA9PT1hPzA6YSxyPXQuaixvPXZvaWQgMD09PXI/bnVsbDpyO3ZvaWQgMCE9PXRoaXMudy5jb25maWcudG9vbHRpcC5jdXN0b20/dGhpcy5oYW5kbGVDdXN0b21Ub29sdGlwKHtpOm4sajpvfSk6dGhpcy50b2dnbGVBY3RpdmVJbmFjdGl2ZVNlcmllcyhpKTt2YXIgbD10aGlzLmdldFZhbHVlc1RvUHJpbnQoe2k6bixqOm99KTt0aGlzLnByaW50TGFiZWxzKHtpOm4sajpvLHZhbHVlczpsLHR0SXRlbXM6cyxzaGFyZWQ6aX0pO3ZhciBoPXRoaXMudHRDdHguZ2V0RWxUb29sdGlwKCk7dGhpcy50dEN0eC50b29sdGlwUmVjdC50dFdpZHRoPWguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgsdGhpcy50dEN0eC50b29sdGlwUmVjdC50dEhlaWdodD1oLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodH19LHtrZXk6InByaW50TGFiZWxzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxpPXQuaSxzPXQuaixhPXQudmFsdWVzLG49dC50dEl0ZW1zLHI9dC5zaGFyZWQsbz10aGlzLncsbD1hLnhWYWwsaD1hLnpWYWwsYz1hLnhBeGlzVFRWYWwsZD0iIix1PW8uZ2xvYmFscy5jb2xvcnNbaV07bnVsbCE9PXMmJm8uY29uZmlnLnBsb3RPcHRpb25zLmJhci5kaXN0cmlidXRlZCYmKHU9by5nbG9iYWxzLmNvbG9yc1tzXSk7Zm9yKHZhciBnPTAsZj1vLmdsb2JhbHMuc2VyaWVzLmxlbmd0aC0xO2c8by5nbG9iYWxzLnNlcmllcy5sZW5ndGg7ZysrLGYtLSl7dmFyIHA9dGhpcy5nZXRGb3JtYXR0ZXJzKGkpO2lmKGQ9dGhpcy5nZXRTZXJpZXNOYW1lKHtmbjpwLnlMYlRpdGxlRm9ybWF0dGVyLGluZGV4Omksc2VyaWVzSW5kZXg6aSxqOnN9KSxyKXt2YXIgeD1vLmNvbmZpZy50b29sdGlwLmludmVyc2VPcmRlcj9mOmc7cD10aGlzLmdldEZvcm1hdHRlcnMoeCksZD10aGlzLmdldFNlcmllc05hbWUoe2ZuOnAueUxiVGl0bGVGb3JtYXR0ZXIsaW5kZXg6eCxzZXJpZXNJbmRleDppLGo6c30pLHU9by5nbG9iYWxzLmNvbG9yc1t4XSxlPXAueUxiRm9ybWF0dGVyKG8uZ2xvYmFscy5zZXJpZXNbeF1bc10se3NlcmllczpvLmdsb2JhbHMuc2VyaWVzLHNlcmllc0luZGV4OngsZGF0YVBvaW50SW5kZXg6cyx3Om99KSwodGhpcy50dEN0eC5oYXNCYXJzKCkmJm8uY29uZmlnLmNoYXJ0LnN0YWNrZWQmJjA9PT1vLmdsb2JhbHMuc2VyaWVzW3hdW3NdfHx2b2lkIDA9PT1vLmdsb2JhbHMuc2VyaWVzW3hdW3NdKSYmKGU9dm9pZCAwKX1lbHNlIGU9cC55TGJGb3JtYXR0ZXIoby5nbG9iYWxzLnNlcmllc1tpXVtzXSx7c2VyaWVzOm8uZ2xvYmFscy5zZXJpZXMsc2VyaWVzSW5kZXg6aSxkYXRhUG9pbnRJbmRleDpzLHc6b30pO251bGw9PT1zJiYoZT1wLnlMYkZvcm1hdHRlcihvLmdsb2JhbHMuc2VyaWVzW2ldLG8pKSx0aGlzLkRPTUhhbmRsaW5nKHtpOmksdDpnLHR0SXRlbXM6bix2YWx1ZXM6e3ZhbDplLHhWYWw6bCx4QXhpc1RUVmFsOmMselZhbDpofSxzZXJpZXNOYW1lOmQsc2hhcmVkOnIscENvbG9yOnV9KX19fSx7a2V5OiJnZXRGb3JtYXR0ZXJzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMudyxzPWkuZ2xvYmFscy55TGFiZWxGb3JtYXR0ZXJzW3RdO3JldHVybiB2b2lkIDAhPT1pLmdsb2JhbHMudHRWYWw/QXJyYXkuaXNBcnJheShpLmdsb2JhbHMudHRWYWwpPyhzPWkuZ2xvYmFscy50dFZhbFt0XSYmaS5nbG9iYWxzLnR0VmFsW3RdLmZvcm1hdHRlcixlPWkuZ2xvYmFscy50dFZhbFt0XSYmaS5nbG9iYWxzLnR0VmFsW3RdLnRpdGxlJiZpLmdsb2JhbHMudHRWYWxbdF0udGl0bGUuZm9ybWF0dGVyKToocz1pLmdsb2JhbHMudHRWYWwuZm9ybWF0dGVyLCJmdW5jdGlvbiI9PXR5cGVvZiBpLmdsb2JhbHMudHRWYWwudGl0bGUuZm9ybWF0dGVyJiYoZT1pLmdsb2JhbHMudHRWYWwudGl0bGUuZm9ybWF0dGVyKSk6ZT1pLmNvbmZpZy50b29sdGlwLnkudGl0bGUuZm9ybWF0dGVyLCJmdW5jdGlvbiIhPXR5cGVvZiBzJiYocz1pLmdsb2JhbHMueUxhYmVsRm9ybWF0dGVyc1swXT9pLmdsb2JhbHMueUxhYmVsRm9ybWF0dGVyc1swXTpmdW5jdGlvbih0KXtyZXR1cm4gdH0pLCJmdW5jdGlvbiIhPXR5cGVvZiBlJiYoZT1mdW5jdGlvbih0KXtyZXR1cm4gdH0pLHt5TGJGb3JtYXR0ZXI6cyx5TGJUaXRsZUZvcm1hdHRlcjplfX19LHtrZXk6ImdldFNlcmllc05hbWUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZm4saT10LmluZGV4LHM9dC5zZXJpZXNJbmRleCxhPXQuaixuPXRoaXMudztyZXR1cm4gZShTdHJpbmcobi5nbG9iYWxzLnNlcmllc05hbWVzW2ldKSx7c2VyaWVzOm4uZ2xvYmFscy5zZXJpZXMsc2VyaWVzSW5kZXg6cyxkYXRhUG9pbnRJbmRleDphLHc6bn0pfX0se2tleToiRE9NSGFuZGxpbmciLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuaSxpPXQudCxzPXQudHRJdGVtcyxhPXQudmFsdWVzLG49dC5zZXJpZXNOYW1lLHI9dC5zaGFyZWQsbz10LnBDb2xvcixsPXRoaXMudyxoPXRoaXMudHRDdHgsYz1hLnZhbCxkPWEueFZhbCx1PWEueEF4aXNUVFZhbCxnPWEuelZhbCxmPW51bGw7Zj1zW2ldLmNoaWxkcmVuLGwuY29uZmlnLnRvb2x0aXAuZmlsbFNlcmllc0NvbG9yJiYoc1tpXS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9byxmWzBdLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxoLnNob3dUb29sdGlwVGl0bGUmJihudWxsPT09aC50b29sdGlwVGl0bGUmJihoLnRvb2x0aXBUaXRsZT1sLmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy10b29sdGlwLXRpdGxlIikpLGgudG9vbHRpcFRpdGxlLmlubmVySFRNTD1kKSxoLmJseGF4aXNUb29sdGlwJiYoaC54YXhpc1Rvb2x0aXBUZXh0LmlubmVySFRNTD0iIiE9PXU/dTpkKTt2YXIgcD1zW2ldLnF1ZXJ5U2VsZWN0b3IoIi5hcGV4Y2hhcnRzLXRvb2x0aXAtdGV4dC1sYWJlbCIpO3AmJihwLmlubmVySFRNTD1uP24rIjogIjoiIik7dmFyIHg9c1tpXS5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy10b29sdGlwLXRleHQtdmFsdWUiKTsoeCYmKHguaW5uZXJIVE1MPWMpLGZbMF0mJmZbMF0uY2xhc3NMaXN0LmNvbnRhaW5zKCJhcGV4Y2hhcnRzLXRvb2x0aXAtbWFya2VyIikmJihsLmNvbmZpZy50b29sdGlwLm1hcmtlci5maWxsQ29sb3JzJiZBcnJheS5pc0FycmF5KGwuY29uZmlnLnRvb2x0aXAubWFya2VyLmZpbGxDb2xvcnMpJiYobz1sLmNvbmZpZy50b29sdGlwLm1hcmtlci5maWxsQ29sb3JzW2VdKSxmWzBdLnN0eWxlLmJhY2tncm91bmRDb2xvcj1vKSxsLmNvbmZpZy50b29sdGlwLm1hcmtlci5zaG93fHwoZlswXS5zdHlsZS5kaXNwbGF5PSJub25lIiksbnVsbCE9PWcpJiYoc1tpXS5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy10b29sdGlwLXRleHQtei1sYWJlbCIpLmlubmVySFRNTD1sLmNvbmZpZy50b29sdGlwLnoudGl0bGUsc1tpXS5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy10b29sdGlwLXRleHQtei12YWx1ZSIpLmlubmVySFRNTD1nKTtyJiZmWzBdJiYobnVsbD09Y3x8bC5nbG9iYWxzLmNvbGxhcHNlZFNlcmllc0luZGljZXMuaW5kZXhPZihpKT4tMT9mWzBdLnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheT0ibm9uZSI6ZlswXS5wYXJlbnROb2RlLnN0eWxlLmRpc3BsYXk9bC5jb25maWcudG9vbHRpcC5pdGVtcy5kaXNwbGF5KX19LHtrZXk6InRvZ2dsZUFjdGl2ZUluYWN0aXZlU2VyaWVzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnc7aWYodCl0aGlzLnRvb2x0aXBVdGlsLnRvZ2dsZUFsbFRvb2x0aXBTZXJpZXNHcm91cHMoImVuYWJsZSIpO2Vsc2V7dGhpcy50b29sdGlwVXRpbC50b2dnbGVBbGxUb29sdGlwU2VyaWVzR3JvdXBzKCJkaXNhYmxlIik7dmFyIGk9ZS5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtdG9vbHRpcC1zZXJpZXMtZ3JvdXAiKTtpJiYoaS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKSxpLnN0eWxlLmRpc3BsYXk9ZS5jb25maWcudG9vbHRpcC5pdGVtcy5kaXNwbGF5KX19fSx7a2V5OiJnZXRWYWx1ZXNUb1ByaW50Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LmksaT10Lmoscz10aGlzLncsYT10aGlzLmN0eC5zZXJpZXMuZmlsdGVyZWRTZXJpZXNYKCksbj0iIixyPW51bGwsbz1udWxsLGw9e3NlcmllczpzLmdsb2JhbHMuc2VyaWVzLHNlcmllc0luZGV4OmUsZGF0YVBvaW50SW5kZXg6aSx3OnN9LGg9cy5nbG9iYWxzLnR0WkZvcm1hdHRlcjtudWxsPT09aT9vPXMuZ2xvYmFscy5zZXJpZXNbZV06cy5nbG9iYWxzLmlzWE51bWVyaWM/KG49YVtlXVtpXSwwPT09YVtlXS5sZW5ndGgmJihuPWFbdGhpcy50b29sdGlwVXRpbC5nZXRGaXJzdEFjdGl2ZVhBcnJheShhKV1baV0pKTpuPXZvaWQgMCE9PXMuZ2xvYmFscy5sYWJlbHNbaV0/cy5nbG9iYWxzLmxhYmVsc1tpXToiIjt2YXIgYz1uO3MuZ2xvYmFscy5pc1hOdW1lcmljJiYiZGF0ZXRpbWUiPT09cy5jb25maWcueGF4aXMudHlwZT9uPW5ldyBOKHRoaXMuY3R4KS54TGFiZWxGb3JtYXQocy5nbG9iYWxzLnR0S2V5Rm9ybWF0dGVyLGMsYyk6cy5nbG9iYWxzLmlzQmFySG9yaXpvbnRhbHx8KG49cy5nbG9iYWxzLnhMYWJlbEZvcm1hdHRlcihjLGwpKTtyZXR1cm4gdm9pZCAwIT09cy5jb25maWcudG9vbHRpcC54LmZvcm1hdHRlciYmKG49cy5nbG9iYWxzLnR0S2V5Rm9ybWF0dGVyKGMsbCkpLHMuZ2xvYmFscy5zZXJpZXNaLmxlbmd0aD4wJiZzLmdsb2JhbHMuc2VyaWVzWlswXS5sZW5ndGg+MCYmKHI9aChzLmdsb2JhbHMuc2VyaWVzWltlXVtpXSxzKSkse3ZhbDpvLHhWYWw6bix4QXhpc1RUVmFsOiJmdW5jdGlvbiI9PXR5cGVvZiBzLmNvbmZpZy54YXhpcy50b29sdGlwLmZvcm1hdHRlcj9zLmdsb2JhbHMueGF4aXNUb29sdGlwRm9ybWF0dGVyKGMsbCk6bix6VmFsOnJ9fX0se2tleToiaGFuZGxlQ3VzdG9tVG9vbHRpcCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dC5pLGk9dC5qLHM9dGhpcy53O3RoaXMudHRDdHguZ2V0RWxUb29sdGlwKCkuaW5uZXJIVE1MPXMuY29uZmlnLnRvb2x0aXAuY3VzdG9tKHtjdHg6dGhpcy5jdHgsc2VyaWVzOnMuZ2xvYmFscy5zZXJpZXMsc2VyaWVzSW5kZXg6ZSxkYXRhUG9pbnRJbmRleDppLHc6c30pfX1dKSx0fSgpLGd0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy50dEN0eD1pLHRoaXMuY3R4PWkuY3R4LHRoaXMudz1pLnd9cmV0dXJuIHModCxbe2tleToibW92ZVhDcm9zc2hhaXJzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbCxpPXRoaXMudHRDdHgscz10aGlzLncsYT1pLmdldEVsWENyb3NzaGFpcnMoKSxuPXQtaS54Y3Jvc3NoYWlyc1dpZHRoLzIscj1zLmdsb2JhbHMubGFiZWxzLnNsaWNlKCkubGVuZ3RoO2lmKG51bGwhPT1lJiYobj1zLmdsb2JhbHMuZ3JpZFdpZHRoL3IqZSksInRpY2tXaWR0aCI9PT1zLmNvbmZpZy54YXhpcy5jcm9zc2hhaXJzLndpZHRofHwiYmFyV2lkdGgiPT09cy5jb25maWcueGF4aXMuY3Jvc3NoYWlycy53aWR0aD9uK2kueGNyb3NzaGFpcnNXaWR0aD5zLmdsb2JhbHMuZ3JpZFdpZHRoJiYobj1zLmdsb2JhbHMuZ3JpZFdpZHRoLWkueGNyb3NzaGFpcnNXaWR0aCk6bnVsbCE9PWUmJihuKz1zLmdsb2JhbHMuZ3JpZFdpZHRoL3IvMiksbjwwJiYobj0wKSxuPnMuZ2xvYmFscy5ncmlkV2lkdGgmJihuPXMuZ2xvYmFscy5ncmlkV2lkdGgpLG51bGwhPT1hJiYoYS5zZXRBdHRyaWJ1dGUoIngiLG4pLGEuc2V0QXR0cmlidXRlKCJ4MSIsbiksYS5zZXRBdHRyaWJ1dGUoIngyIixuKSxhLnNldEF0dHJpYnV0ZSgieTIiLHMuZ2xvYmFscy5ncmlkSGVpZ2h0KSxhLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpKSxpLmJseGF4aXNUb29sdGlwKXt2YXIgbz1uOyJ0aWNrV2lkdGgiIT09cy5jb25maWcueGF4aXMuY3Jvc3NoYWlycy53aWR0aCYmImJhcldpZHRoIiE9PXMuY29uZmlnLnhheGlzLmNyb3NzaGFpcnMud2lkdGh8fChvPW4raS54Y3Jvc3NoYWlyc1dpZHRoLzIpLHRoaXMubW92ZVhBeGlzVG9vbHRpcChvKX19fSx7a2V5OiJtb3ZlWUNyb3NzaGFpcnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudHRDdHg7bnVsbCE9PWUueWNyb3NzaGFpcnMmJihwLnNldEF0dHJzKGUueWNyb3NzaGFpcnMse3kxOnQseTI6dH0pLHAuc2V0QXR0cnMoZS55Y3Jvc3NoYWlyc0hpZGRlbix7eTE6dCx5Mjp0fSkpfX0se2tleToibW92ZVhBeGlzVG9vbHRpcCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53LGk9dGhpcy50dEN0eDtpZihudWxsIT09aS54YXhpc1Rvb2x0aXApe2kueGF4aXNUb29sdGlwLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpO3ZhciBzPWkueGF4aXNPZmZZK2UuY29uZmlnLnhheGlzLnRvb2x0aXAub2Zmc2V0WStlLmdsb2JhbHMudHJhbnNsYXRlWSsxK2UuY29uZmlnLnhheGlzLm9mZnNldFk7aWYodC09aS54YXhpc1Rvb2x0aXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgvMiwhaXNOYU4odCkpe3QrPWUuZ2xvYmFscy50cmFuc2xhdGVYO3ZhciBhO2E9bmV3IHAodGhpcy5jdHgpLmdldFRleHRSZWN0cyhpLnhheGlzVG9vbHRpcFRleHQuaW5uZXJIVE1MKSxpLnhheGlzVG9vbHRpcFRleHQuc3R5bGUubWluV2lkdGg9YS53aWR0aCsicHgiLGkueGF4aXNUb29sdGlwLnN0eWxlLmxlZnQ9dCsicHgiLGkueGF4aXNUb29sdGlwLnN0eWxlLnRvcD1zKyJweCJ9fX19LHtrZXk6Im1vdmVZQXhpc1Rvb2x0aXAiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudyxpPXRoaXMudHRDdHg7bnVsbD09PWkueWF4aXNUVEVscyYmKGkueWF4aXNUVEVscz1lLmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy15YXhpc3Rvb2x0aXAiKSk7dmFyIHM9cGFyc2VJbnQoaS55Y3Jvc3NoYWlyc0hpZGRlbi5nZXRBdHRyaWJ1dGUoInkxIikpLGE9ZS5nbG9iYWxzLnRyYW5zbGF0ZVkrcyxuPWkueWF4aXNUVEVsc1t0XS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQscj1lLmdsb2JhbHMudHJhbnNsYXRlWUF4aXNYW3RdLTI7ZS5jb25maWcueWF4aXNbdF0ub3Bwb3NpdGUmJihyLT0yNiksYS09bi8yLC0xPT09ZS5nbG9iYWxzLmlnbm9yZVlBeGlzSW5kZXhlcy5pbmRleE9mKHQpPyhpLnlheGlzVFRFbHNbdF0uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIiksaS55YXhpc1RURWxzW3RdLnN0eWxlLnRvcD1hKyJweCIsaS55YXhpc1RURWxzW3RdLnN0eWxlLmxlZnQ9citlLmNvbmZpZy55YXhpc1t0XS50b29sdGlwLm9mZnNldFgrInB4Iik6aS55YXhpc1RURWxzW3RdLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpfX0se2tleToibW92ZVRvb2x0aXAiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGwscz10aGlzLncsYT10aGlzLnR0Q3R4LG49YS5nZXRFbFRvb2x0aXAoKSxyPWEudG9vbHRpcFJlY3Qsbz1udWxsIT09aT9wYXJzZUludChpKToxLGw9cGFyc2VJbnQodCkrbys1LGg9cGFyc2VJbnQoZSkrby8yO2lmKGw+cy5nbG9iYWxzLmdyaWRXaWR0aC8yJiYobD1sLXIudHRXaWR0aC1vLTE1KSxsPnMuZ2xvYmFscy5ncmlkV2lkdGgtci50dFdpZHRoLTEwJiYobD1zLmdsb2JhbHMuZ3JpZFdpZHRoLXIudHRXaWR0aCksbDwtMjAmJihsPS0yMCkscy5jb25maWcudG9vbHRpcC5mb2xsb3dDdXJzb3Ipe3ZhciBjPWEuZ2V0RWxHcmlkKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aD1hLmUuY2xpZW50WStzLmdsb2JhbHMudHJhbnNsYXRlWS1jLnRvcC1yLnR0SGVpZ2h0LzJ9dmFyIGQ9dGhpcy5wb3NpdGlvbkNoZWNrcyhyLGwsaCk7bD1kLngsaD1kLnksaXNOYU4obCl8fChsKz1zLmdsb2JhbHMudHJhbnNsYXRlWCxuLnN0eWxlLmxlZnQ9bCsicHgiLG4uc3R5bGUudG9wPWgrInB4Iil9fSx7a2V5OiJwb3NpdGlvbkNoZWNrcyIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBzPXRoaXMudztyZXR1cm4gdC50dEhlaWdodCtpPnMuZ2xvYmFscy5ncmlkSGVpZ2h0JiYoaT1zLmdsb2JhbHMuZ3JpZEhlaWdodC10LnR0SGVpZ2h0K3MuZ2xvYmFscy50cmFuc2xhdGVZKSxpPDAmJihpPTApLHt4OmUseTppfX19LHtrZXk6Im1vdmVNYXJrZXJzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudyxzPXRoaXMudHRDdHg7aWYoaS5nbG9iYWxzLm1hcmtlcnMuc2l6ZVt0XT4wKWZvcih2YXIgYT1pLmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIgLmFwZXhjaGFydHMtc2VyaWVzW2RhdGFcXDpyZWFsSW5kZXg9JyIuY29uY2F0KHQsIiddIC5hcGV4Y2hhcnRzLW1hcmtlciIpKSxuPTA7bjxhLmxlbmd0aDtuKyspcGFyc2VJbnQoYVtuXS5nZXRBdHRyaWJ1dGUoInJlbCIpKT09PWUmJihzLm1hcmtlci5yZXNldFBvaW50c1NpemUoKSxzLm1hcmtlci5lbmxhcmdlQ3VycmVudFBvaW50KGUsYVtuXSkpO2Vsc2Ugcy5tYXJrZXIucmVzZXRQb2ludHNTaXplKCksdGhpcy5tb3ZlRHluYW1pY1BvaW50T25Ib3ZlcihlLHQpfX0se2tleToibW92ZUR5bmFtaWNQb2ludE9uSG92ZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGkscyxhPXRoaXMudyxuPXRoaXMudHRDdHgscj1hLmdsb2JhbHMucG9pbnRzQXJyYXksbz1hLmNvbmZpZy5tYXJrZXJzLmhvdmVyLnNpemU7aWYodm9pZCAwPT09byYmKG89YS5nbG9iYWxzLm1hcmtlcnMuc2l6ZVtlXSthLmNvbmZpZy5tYXJrZXJzLmhvdmVyLnNpemVPZmZzZXQpLCFhLmNvbmZpZy5zZXJpZXNbZV0udHlwZXx8ImNvbHVtbiIhPT1hLmNvbmZpZy5zZXJpZXNbZV0udHlwZSl7aT1yW2VdW3RdWzBdLHM9cltlXVt0XVsxXT9yW2VdW3RdWzFdOjA7dmFyIGw9YS5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtc2VyaWVzW2RhdGFcXDpyZWFsSW5kZXg9JyIuY29uY2F0KGUsIiddIC5hcGV4Y2hhcnRzLXNlcmllcy1tYXJrZXJzIGNpcmNsZSIpKTtsJiYobC5zZXRBdHRyaWJ1dGUoInIiLG8pLGwuc2V0QXR0cmlidXRlKCJjeCIsaSksbC5zZXRBdHRyaWJ1dGUoImN5IixzKSksdGhpcy5tb3ZlWENyb3NzaGFpcnMoaSksbi5maXhlZFRvb2x0aXB8fHRoaXMubW92ZVRvb2x0aXAoaSxzLG8pfX19LHtrZXk6Im1vdmVEeW5hbWljUG9pbnRzT25Ib3ZlciIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLnR0Q3R4LHM9aS53LGE9MCxuPTAscj1zLmdsb2JhbHMucG9pbnRzQXJyYXk7ZT1uZXcgQih0aGlzLmN0eCkuZ2V0QWN0aXZlU2VyaWVzSW5kZXgoKTt2YXIgbz1zLmNvbmZpZy5tYXJrZXJzLmhvdmVyLnNpemU7dm9pZCAwPT09byYmKG89cy5nbG9iYWxzLm1hcmtlcnMuc2l6ZVtlXStzLmNvbmZpZy5tYXJrZXJzLmhvdmVyLnNpemVPZmZzZXQpLHJbZV0mJihhPXJbZV1bdF1bMF0sbj1yW2VdW3RdWzFdKTt2YXIgbD1udWxsLGg9aS5nZXRBbGxNYXJrZXJzKCk7aWYobnVsbCE9PShsPW51bGwhPT1oP2g6cy5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvckFsbCgiLmFwZXhjaGFydHMtc2VyaWVzLW1hcmtlcnMgY2lyY2xlIikpKWZvcih2YXIgYz0wO2M8bC5sZW5ndGg7YysrKXt2YXIgZD1yW2NdO2lmKGQmJmQubGVuZ3RoKXt2YXIgdT1yW2NdW3RdWzFdO2xbY10uc2V0QXR0cmlidXRlKCJjeCIsYSk7dmFyIGc9cGFyc2VJbnQobFtjXS5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoImRhdGE6cmVhbEluZGV4IikpO251bGwhPT11PyhsW2ddJiZsW2ddLnNldEF0dHJpYnV0ZSgiciIsbyksbFtnXSYmbFtnXS5zZXRBdHRyaWJ1dGUoImN5Iix1KSk6bFtnXSYmbFtnXS5zZXRBdHRyaWJ1dGUoInIiLDApfX1pZih0aGlzLm1vdmVYQ3Jvc3NoYWlycyhhKSwhaS5maXhlZFRvb2x0aXApe3ZhciBmPW58fHMuZ2xvYmFscy5ncmlkSGVpZ2h0O3RoaXMubW92ZVRvb2x0aXAoYSxmLG8pfX19LHtrZXk6Im1vdmVTdGlja3lUb29sdGlwT3ZlckJhcnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcy53LHM9dGhpcy50dEN0eCxhPWkuZ2xvYmFscy5jb2x1bW5TZXJpZXM/aS5nbG9iYWxzLmNvbHVtblNlcmllcy5sZW5ndGg6aS5nbG9iYWxzLnNlcmllcy5sZW5ndGgsbj1hPj0yJiZhJTI9PTA/TWF0aC5mbG9vcihhLzIpOk1hdGguZmxvb3IoYS8yKSsxLHI9aS5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtYmFyLXNlcmllcyAuYXBleGNoYXJ0cy1zZXJpZXNbcmVsPSciLmNvbmNhdChuLCInXSBwYXRoW2o9JyIpLmNvbmNhdCh0LCInXSwgLmFwZXhjaGFydHMtY2FuZGxlc3RpY2stc2VyaWVzIC5hcGV4Y2hhcnRzLXNlcmllc1tyZWw9JyIpLmNvbmNhdChuLCInXSBwYXRoW2o9JyIpLmNvbmNhdCh0LCInXSwgLmFwZXhjaGFydHMtcmFuZ2ViYXItc2VyaWVzIC5hcGV4Y2hhcnRzLXNlcmllc1tyZWw9JyIpLmNvbmNhdChuLCInXSBwYXRoW2o9JyIpLmNvbmNhdCh0LCInXSIpKSxvPXI/cGFyc2VGbG9hdChyLmdldEF0dHJpYnV0ZSgiY3giKSk6MCxsPXI/cGFyc2VGbG9hdChyLmdldEF0dHJpYnV0ZSgiYmFyV2lkdGgiKSk6MDtpLmdsb2JhbHMuaXNYTnVtZXJpYz9vLT1hJTIhPTA/bC8yOjA6KG89cy54QXhpc1RpY2tzUG9zaXRpb25zW3QtMV0rcy5kYXRhUG9pbnRzRGl2aWRlZFdpZHRoLzIsaXNOYU4obykmJihvPXMueEF4aXNUaWNrc1Bvc2l0aW9uc1t0XS1zLmRhdGFQb2ludHNEaXZpZGVkV2lkdGgvMikpO3ZhciBoPXMuZ2V0RWxHcmlkKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoZT1zLmUuY2xpZW50WS1oLnRvcC1zLnRvb2x0aXBSZWN0LnR0SGVpZ2h0LzIsdGhpcy5tb3ZlWENyb3NzaGFpcnMobyksIXMuZml4ZWRUb29sdGlwKXt2YXIgYz1lfHxpLmdsb2JhbHMuZ3JpZEhlaWdodDt0aGlzLm1vdmVUb29sdGlwKG8sYyl9fX1dKSx0fSgpLGZ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy53PWkudyx0aGlzLnR0Q3R4PWksdGhpcy5jdHg9aS5jdHgsdGhpcy50b29sdGlwUG9zaXRpb249bmV3IGd0KGkpfXJldHVybiBzKHQsW3trZXk6ImRyYXdEeW5hbWljUG9pbnRzIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLncsZT1uZXcgcCh0aGlzLmN0eCksaT1uZXcgTCh0aGlzLmN0eCkscz10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy1zZXJpZXMiKSxhPTA7YTxzLmxlbmd0aDthKyspe3ZhciBuPXBhcnNlSW50KHNbYV0uZ2V0QXR0cmlidXRlKCJkYXRhOnJlYWxJbmRleCIpKSxyPXQuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3IoIi5hcGV4Y2hhcnRzLXNlcmllc1tkYXRhXFw6cmVhbEluZGV4PSciLmNvbmNhdChuLCInXSAuYXBleGNoYXJ0cy1zZXJpZXMtbWFya2Vycy13cmFwIikpO2lmKG51bGwhPT1yKXt2YXIgbz12b2lkIDAsbD0iYXBleGNoYXJ0cy1tYXJrZXIgdyIuY29uY2F0KChNYXRoLnJhbmRvbSgpKzEpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNCkpOyJsaW5lIiE9PXQuY29uZmlnLmNoYXJ0LnR5cGUmJiJhcmVhIiE9PXQuY29uZmlnLmNoYXJ0LnR5cGV8fHQuZ2xvYmFscy5jb21ib0NoYXJ0c3x8dC5jb25maWcudG9vbHRpcC5pbnRlcnNlY3R8fChsKz0iIG5vLXBvaW50ZXItZXZlbnRzIik7dmFyIGg9aS5nZXRNYXJrZXJDb25maWcobCxuKTsobz1lLmRyYXdNYXJrZXIoMCwwLGgpKS5ub2RlLnNldEF0dHJpYnV0ZSgiZGVmYXVsdC1tYXJrZXItc2l6ZSIsMCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuZ2xvYmFscy5TVkdOUywiZyIpO2MuY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy1zZXJpZXMtbWFya2VycyIpLGMuYXBwZW5kQ2hpbGQoby5ub2RlKSxyLmFwcGVuZENoaWxkKGMpfX19fSx7a2V5OiJlbmxhcmdlQ3VycmVudFBvaW50Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpudWxsLHM9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOm51bGwsYT10aGlzLnc7ImJ1YmJsZSIhPT1hLmNvbmZpZy5jaGFydC50eXBlJiZ0aGlzLm5ld1BvaW50U2l6ZSh0LGUpO3ZhciBuPWUuZ2V0QXR0cmlidXRlKCJjeCIpLHI9ZS5nZXRBdHRyaWJ1dGUoImN5Iik7aWYobnVsbCE9PWkmJm51bGwhPT1zJiYobj1pLHI9cyksdGhpcy50b29sdGlwUG9zaXRpb24ubW92ZVhDcm9zc2hhaXJzKG4pLCF0aGlzLmZpeGVkVG9vbHRpcCl7aWYoInJhZGFyIj09PWEuY29uZmlnLmNoYXJ0LnR5cGUpe3ZhciBvPXRoaXMudHRDdHguZ2V0RWxHcmlkKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7bj10aGlzLnR0Q3R4LmUuY2xpZW50WC1vLmxlZnR9dGhpcy50b29sdGlwUG9zaXRpb24ubW92ZVRvb2x0aXAobixyLGEuY29uZmlnLm1hcmtlcnMuaG92ZXIuc2l6ZSl9fX0se2tleToiZW5sYXJnZVBvaW50cyIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMudyxpPXRoaXMudHRDdHgscz10LGE9ZS5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvckFsbCgiLmFwZXhjaGFydHMtc2VyaWVzOm5vdCguYXBleGNoYXJ0cy1zZXJpZXMtY29sbGFwc2VkKSAuYXBleGNoYXJ0cy1tYXJrZXIiKSxuPWUuY29uZmlnLm1hcmtlcnMuaG92ZXIuc2l6ZSxyPTA7cjxhLmxlbmd0aDtyKyspe3ZhciBvPWFbcl0uZ2V0QXR0cmlidXRlKCJyZWwiKSxsPWFbcl0uZ2V0QXR0cmlidXRlKCJpbmRleCIpO2lmKHZvaWQgMD09PW4mJihuPWUuZ2xvYmFscy5tYXJrZXJzLnNpemVbbF0rZS5jb25maWcubWFya2Vycy5ob3Zlci5zaXplT2Zmc2V0KSxzPT09cGFyc2VJbnQobykpe3RoaXMubmV3UG9pbnRTaXplKHMsYVtyXSk7dmFyIGg9YVtyXS5nZXRBdHRyaWJ1dGUoImN4IiksYz1hW3JdLmdldEF0dHJpYnV0ZSgiY3kiKTt0aGlzLnRvb2x0aXBQb3NpdGlvbi5tb3ZlWENyb3NzaGFpcnMoaCksaS5maXhlZFRvb2x0aXB8fHRoaXMudG9vbHRpcFBvc2l0aW9uLm1vdmVUb29sdGlwKGgsYyxuKX1lbHNlIHRoaXMub2xkUG9pbnRTaXplKGFbcl0pfX19LHtrZXk6Im5ld1BvaW50U2l6ZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLncscz1pLmNvbmZpZy5tYXJrZXJzLmhvdmVyLnNpemUsYT1udWxsO2E9MD09PXQ/ZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQ6ZS5wYXJlbnROb2RlLmxhc3RDaGlsZDt2YXIgbj1wYXJzZUludChhLmdldEF0dHJpYnV0ZSgiaW5kZXgiKSk7dm9pZCAwPT09cyYmKHM9aS5nbG9iYWxzLm1hcmtlcnMuc2l6ZVtuXStpLmNvbmZpZy5tYXJrZXJzLmhvdmVyLnNpemVPZmZzZXQpLGEuc2V0QXR0cmlidXRlKCJyIixzKX19LHtrZXk6Im9sZFBvaW50U2l6ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9cGFyc2VJbnQodC5nZXRBdHRyaWJ1dGUoImRlZmF1bHQtbWFya2VyLXNpemUiKSk7dC5zZXRBdHRyaWJ1dGUoInIiLGUpfX0se2tleToicmVzZXRQb2ludHNTaXplIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLncuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5hcGV4Y2hhcnRzLXNlcmllczpub3QoLmFwZXhjaGFydHMtc2VyaWVzLWNvbGxhcHNlZCkgLmFwZXhjaGFydHMtbWFya2VyIiksZT0wO2U8dC5sZW5ndGg7ZSsrKXt2YXIgaT1wYXJzZUludCh0W2VdLmdldEF0dHJpYnV0ZSgiZGVmYXVsdC1tYXJrZXItc2l6ZSIpKTt1LmlzTnVtYmVyKGkpP3RbZV0uc2V0QXR0cmlidXRlKCJyIixpKTp0W2VdLnNldEF0dHJpYnV0ZSgiciIsMCl9fX1dKSx0fSgpLHB0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy53PWkudyx0aGlzLnR0Q3R4PWl9cmV0dXJuIHModCxbe2tleToiZ2V0QXR0ciIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcGFyc2VGbG9hdCh0LnRhcmdldC5nZXRBdHRyaWJ1dGUoZSkpfX0se2tleToiaGFuZGxlSGVhdFRvb2x0aXAiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZSxpPXQub3B0LHM9dC54LGE9dC55LG49dGhpcy50dEN0eCxyPXRoaXMudztpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImFwZXhjaGFydHMtaGVhdG1hcC1yZWN0Iikpe3ZhciBvPXRoaXMuZ2V0QXR0cihlLCJpIiksbD10aGlzLmdldEF0dHIoZSwiaiIpLGg9dGhpcy5nZXRBdHRyKGUsImN4IiksYz10aGlzLmdldEF0dHIoZSwiY3kiKSxkPXRoaXMuZ2V0QXR0cihlLCJ3aWR0aCIpLHU9dGhpcy5nZXRBdHRyKGUsImhlaWdodCIpO2lmKG4udG9vbHRpcExhYmVscy5kcmF3U2VyaWVzVGV4dHMoe3R0SXRlbXM6aS50dEl0ZW1zLGk6byxqOmwsc2hhcmVkOiExfSksci5nbG9iYWxzLmNhcHR1cmVkU2VyaWVzSW5kZXg9byxyLmdsb2JhbHMuY2FwdHVyZWREYXRhUG9pbnRJbmRleD1sLHM9aCtuLnRvb2x0aXBSZWN0LnR0V2lkdGgvMitkLGE9YytuLnRvb2x0aXBSZWN0LnR0SGVpZ2h0LzItdS8yLG4udG9vbHRpcFBvc2l0aW9uLm1vdmVYQ3Jvc3NoYWlycyhoK2QvMikscz5yLmdsb2JhbHMuZ3JpZFdpZHRoLzImJihzPWgtbi50b29sdGlwUmVjdC50dFdpZHRoLzIrZCksbi53LmNvbmZpZy50b29sdGlwLmZvbGxvd0N1cnNvcil7dmFyIGc9bi5nZXRFbEdyaWQoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTthPW4uZS5jbGllbnRZLWcudG9wK3IuZ2xvYmFscy50cmFuc2xhdGVZLzItMTB9fXJldHVybnt4OnMseTphfX19LHtrZXk6ImhhbmRsZU1hcmtlclRvb2x0aXAiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLGkscz10LmUsYT10Lm9wdCxuPXQueCxyPXQueSxvPXRoaXMudyxsPXRoaXMudHRDdHg7aWYocy50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJhcGV4Y2hhcnRzLW1hcmtlciIpKXt2YXIgaD1wYXJzZUludChhLnBhdGhzLmdldEF0dHJpYnV0ZSgiY3giKSksYz1wYXJzZUludChhLnBhdGhzLmdldEF0dHJpYnV0ZSgiY3kiKSksZD1wYXJzZUZsb2F0KGEucGF0aHMuZ2V0QXR0cmlidXRlKCJ2YWwiKSk7aWYoaT1wYXJzZUludChhLnBhdGhzLmdldEF0dHJpYnV0ZSgicmVsIikpLGU9cGFyc2VJbnQoYS5wYXRocy5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoInJlbCIpKS0xLGwuaW50ZXJzZWN0KXt2YXIgZz11LmZpbmRBbmNlc3RvcihhLnBhdGhzLCJhcGV4Y2hhcnRzLXNlcmllcyIpO2cmJihlPXBhcnNlSW50KGcuZ2V0QXR0cmlidXRlKCJkYXRhOnJlYWxJbmRleCIpKSl9aWYobC50b29sdGlwTGFiZWxzLmRyYXdTZXJpZXNUZXh0cyh7dHRJdGVtczphLnR0SXRlbXMsaTplLGo6aSxzaGFyZWQ6IWwuc2hvd09uSW50ZXJzZWN0JiZvLmNvbmZpZy50b29sdGlwLnNoYXJlZH0pLCJtb3VzZXVwIj09PXMudHlwZSYmbC5tYXJrZXJDbGljayhzLGUsaSksby5nbG9iYWxzLmNhcHR1cmVkU2VyaWVzSW5kZXg9ZSxvLmdsb2JhbHMuY2FwdHVyZWREYXRhUG9pbnRJbmRleD1pLG49aCxyPWMrby5nbG9iYWxzLnRyYW5zbGF0ZVktMS40KmwudG9vbHRpcFJlY3QudHRIZWlnaHQsbC53LmNvbmZpZy50b29sdGlwLmZvbGxvd0N1cnNvcil7dmFyIGY9bC5nZXRFbEdyaWQoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyPWwuZS5jbGllbnRZK28uZ2xvYmFscy50cmFuc2xhdGVZLWYudG9wfWQ8MCYmKHI9YyksbC5tYXJrZXIuZW5sYXJnZUN1cnJlbnRQb2ludChpLGEucGF0aHMsbixyKX1yZXR1cm57eDpuLHk6cn19fSx7a2V5OiJoYW5kbGVCYXJUb29sdGlwIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxpLHM9dC5lLGE9dC5vcHQsbj10aGlzLncscj10aGlzLnR0Q3R4LG89ci5nZXRFbFRvb2x0aXAoKSxsPTAsaD0wLGM9MCxkPXRoaXMuZ2V0QmFyVG9vbHRpcFhZKHtlOnMsb3B0OmF9KTtlPWQuaTt2YXIgdT1kLmJhckhlaWdodCxnPWQuajtpZihuLmdsb2JhbHMuY2FwdHVyZWRTZXJpZXNJbmRleD1lLG4uZ2xvYmFscy5jYXB0dXJlZERhdGFQb2ludEluZGV4PWcsbi5nbG9iYWxzLmlzQmFySG9yaXpvbnRhbCYmci5oYXNCYXJzKCl8fCFuLmNvbmZpZy50b29sdGlwLnNoYXJlZD8oaD1kLngsYz1kLnksaT1BcnJheS5pc0FycmF5KG4uY29uZmlnLnN0cm9rZS53aWR0aCk/bi5jb25maWcuc3Ryb2tlLndpZHRoW2VdOm4uY29uZmlnLnN0cm9rZS53aWR0aCxsPWgpOm4uZ2xvYmFscy5jb21ib0NoYXJ0c3x8bi5jb25maWcudG9vbHRpcC5zaGFyZWR8fChsLz0yKSxpc05hTihjKSYmKGM9bi5nbG9iYWxzLnN2Z0hlaWdodC1yLnRvb2x0aXBSZWN0LnR0SGVpZ2h0KSxoK3IudG9vbHRpcFJlY3QudHRXaWR0aD5uLmdsb2JhbHMuZ3JpZFdpZHRoP2gtPXIudG9vbHRpcFJlY3QudHRXaWR0aDpoPDAmJihoKz1yLnRvb2x0aXBSZWN0LnR0V2lkdGgpLHIudy5jb25maWcudG9vbHRpcC5mb2xsb3dDdXJzb3Ipe3ZhciBmPXIuZ2V0RWxHcmlkKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Yz1yLmUuY2xpZW50WS1mLnRvcH1pZihudWxsPT09ci50b29sdGlwJiYoci50b29sdGlwPW4uZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3IoIi5hcGV4Y2hhcnRzLXRvb2x0aXAiKSksbi5jb25maWcudG9vbHRpcC5zaGFyZWR8fChuLmdsb2JhbHMuY29tYm9DaGFydHNIYXNCYXJzP3IudG9vbHRpcFBvc2l0aW9uLm1vdmVYQ3Jvc3NoYWlycyhsK2kvMik6ci50b29sdGlwUG9zaXRpb24ubW92ZVhDcm9zc2hhaXJzKGwpKSwhci5maXhlZFRvb2x0aXAmJighbi5jb25maWcudG9vbHRpcC5zaGFyZWR8fG4uZ2xvYmFscy5pc0Jhckhvcml6b250YWwmJnIuaGFzQmFycygpKSl7eCYmKGg9bi5nbG9iYWxzLmdyaWRXaWR0aC1oKSxvLnN0eWxlLmxlZnQ9aCtuLmdsb2JhbHMudHJhbnNsYXRlWCsicHgiO3ZhciBwPXBhcnNlSW50KGEucGF0aHMucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoImRhdGE6cmVhbEluZGV4IikpLHg9bi5nbG9iYWxzLmlzTXVsdGlwbGVZQXhpcz9uLmNvbmZpZy55YXhpc1twXSYmbi5jb25maWcueWF4aXNbcF0ucmV2ZXJzZWQ6bi5jb25maWcueWF4aXNbMF0ucmV2ZXJzZWQ7IXh8fG4uZ2xvYmFscy5pc0Jhckhvcml6b250YWwmJnIuaGFzQmFycygpfHwoYz1jK3UtMioobi5nbG9iYWxzLnNlcmllc1tlXVtnXTwwP3U6MCkpLHIudG9vbHRpcFJlY3QudHRIZWlnaHQrYz5uLmdsb2JhbHMuZ3JpZEhlaWdodD8oYz1uLmdsb2JhbHMuZ3JpZEhlaWdodC1yLnRvb2x0aXBSZWN0LnR0SGVpZ2h0K24uZ2xvYmFscy50cmFuc2xhdGVZLG8uc3R5bGUudG9wPWMrInB4Iik6by5zdHlsZS50b3A9YytuLmdsb2JhbHMudHJhbnNsYXRlWS1yLnRvb2x0aXBSZWN0LnR0SGVpZ2h0LzIrInB4In19fSx7a2V5OiJnZXRCYXJUb29sdGlwWFkiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZSxpPXQub3B0LHM9dGhpcy53LGE9bnVsbCxuPXRoaXMudHRDdHgscj0wLG89MCxsPTAsaD0wLGM9MCxkPWUudGFyZ2V0LmNsYXNzTGlzdDtpZihkLmNvbnRhaW5zKCJhcGV4Y2hhcnRzLWJhci1hcmVhIil8fGQuY29udGFpbnMoImFwZXhjaGFydHMtY2FuZGxlc3RpY2stYXJlYSIpfHxkLmNvbnRhaW5zKCJhcGV4Y2hhcnRzLXJhbmdlYmFyLWFyZWEiKSl7dmFyIHU9ZS50YXJnZXQsZz11LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGY9aS5lbEdyaWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscD1nLmhlaWdodDtjPWcuaGVpZ2h0O3ZhciB4PWcud2lkdGgsYj1wYXJzZUludCh1LmdldEF0dHJpYnV0ZSgiY3giKSksbT1wYXJzZUludCh1LmdldEF0dHJpYnV0ZSgiY3kiKSk7aD1wYXJzZUZsb2F0KHUuZ2V0QXR0cmlidXRlKCJiYXJXaWR0aCIpKTt2YXIgdj0idG91Y2htb3ZlIj09PWUudHlwZT9lLnRvdWNoZXNbMF0uY2xpZW50WDplLmNsaWVudFg7YT1wYXJzZUludCh1LmdldEF0dHJpYnV0ZSgiaiIpKSxyPXBhcnNlSW50KHUucGFyZW50Tm9kZS5nZXRBdHRyaWJ1dGUoInJlbCIpKS0xLHMuZ2xvYmFscy5jb21ib0NoYXJ0cyYmKHI9cGFyc2VJbnQodS5wYXJlbnROb2RlLmdldEF0dHJpYnV0ZSgiZGF0YTpyZWFsSW5kZXgiKSkpLG4udG9vbHRpcExhYmVscy5kcmF3U2VyaWVzVGV4dHMoe3R0SXRlbXM6aS50dEl0ZW1zLGk6cixqOmEsc2hhcmVkOiFuLnNob3dPbkludGVyc2VjdCYmcy5jb25maWcudG9vbHRpcC5zaGFyZWR9KSxzLmNvbmZpZy50b29sdGlwLmZvbGxvd0N1cnNvcj9zLmdsb2JhbHMuaXNCYXJIb3Jpem9udGFsPyhvPXYtZi5sZWZ0KzE1LGw9bS1uLmRhdGFQb2ludHNEaXZpZGVkSGVpZ2h0K3AvMi1uLnRvb2x0aXBSZWN0LnR0SGVpZ2h0LzIpOihvPXMuZ2xvYmFscy5pc1hOdW1lcmljP2IteC8yOmItbi5kYXRhUG9pbnRzRGl2aWRlZFdpZHRoK3gvMixsPWUuY2xpZW50WS1mLnRvcC1uLnRvb2x0aXBSZWN0LnR0SGVpZ2h0LzItMTUpOnMuZ2xvYmFscy5pc0Jhckhvcml6b250YWw/KChvPWIpPG4ueHlSYXRpb3MuYmFzZUxpbmVJbnZlcnRlZFkmJihvPWItbi50b29sdGlwUmVjdC50dFdpZHRoKSxsPW0tbi5kYXRhUG9pbnRzRGl2aWRlZEhlaWdodCtwLzItbi50b29sdGlwUmVjdC50dEhlaWdodC8yKToobz1zLmdsb2JhbHMuaXNYTnVtZXJpYz9iLXgvMjpiLW4uZGF0YVBvaW50c0RpdmlkZWRXaWR0aCt4LzIsbD1tKX1yZXR1cm57eDpvLHk6bCxiYXJIZWlnaHQ6YyxiYXJXaWR0aDpoLGk6cixqOmF9fX1dKSx0fSgpLHh0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy53PWkudyx0aGlzLnR0Q3R4PWl9cmV0dXJuIHModCxbe2tleToiZHJhd1hheGlzVG9vbHRpcCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLncsZT10aGlzLnR0Q3R4LGk9ImJvdHRvbSI9PT10LmNvbmZpZy54YXhpcy5wb3NpdGlvbjtlLnhheGlzT2ZmWT1pP3QuZ2xvYmFscy5ncmlkSGVpZ2h0KzE6MTt2YXIgcz1pPyJhcGV4Y2hhcnRzLXhheGlzdG9vbHRpcCBhcGV4Y2hhcnRzLXhheGlzdG9vbHRpcC1ib3R0b20iOiJhcGV4Y2hhcnRzLXhheGlzdG9vbHRpcCBhcGV4Y2hhcnRzLXhheGlzdG9vbHRpcC10b3AiLGE9dC5nbG9iYWxzLmRvbS5lbFdyYXA7ZS5ibHhheGlzVG9vbHRpcCYmKG51bGw9PT10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy14YXhpc3Rvb2x0aXAiKSYmKGUueGF4aXNUb29sdGlwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUueGF4aXNUb29sdGlwLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMrIiAiK3QuY29uZmlnLnRvb2x0aXAudGhlbWUpLGEuYXBwZW5kQ2hpbGQoZS54YXhpc1Rvb2x0aXApLGUueGF4aXNUb29sdGlwVGV4dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlLnhheGlzVG9vbHRpcFRleHQuY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy14YXhpc3Rvb2x0aXAtdGV4dCIpLGUueGF4aXNUb29sdGlwVGV4dC5zdHlsZS5mb250RmFtaWx5PXQuY29uZmlnLnhheGlzLnRvb2x0aXAuc3R5bGUuZm9udEZhbWlseXx8dC5jb25maWcuY2hhcnQuZm9udEZhbWlseSxlLnhheGlzVG9vbHRpcFRleHQuc3R5bGUuZm9udFNpemU9dC5jb25maWcueGF4aXMudG9vbHRpcC5zdHlsZS5mb250U2l6ZSxlLnhheGlzVG9vbHRpcC5hcHBlbmRDaGlsZChlLnhheGlzVG9vbHRpcFRleHQpKSl9fSx7a2V5OiJkcmF3WWF4aXNUb29sdGlwIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLncsZT10aGlzLnR0Q3R4LGk9ZnVuY3Rpb24oaSl7dmFyIHM9dC5jb25maWcueWF4aXNbaV0ub3Bwb3NpdGV8fHQuY29uZmlnLnlheGlzW2ldLmNyb3NzaGFpcnMub3Bwb3NpdGU7ZS55YXhpc09mZlg9cz90Lmdsb2JhbHMuZ3JpZFdpZHRoKzE6MTt2YXIgYT0iYXBleGNoYXJ0cy15YXhpc3Rvb2x0aXAgYXBleGNoYXJ0cy15YXhpc3Rvb2x0aXAtIi5jb25jYXQoaSxzPyIgYXBleGNoYXJ0cy15YXhpc3Rvb2x0aXAtcmlnaHQiOiIgYXBleGNoYXJ0cy15YXhpc3Rvb2x0aXAtbGVmdCIpO3QuZ2xvYmFscy55QXhpc1NhbWVTY2FsZUluZGljZXMubWFwKGZ1bmN0aW9uKGUscyl7ZS5tYXAoZnVuY3Rpb24oZSxzKXtzPT09aSYmKGErPXQuY29uZmlnLnlheGlzW3NdLnNob3c/IiAiOiIgYXBleGNoYXJ0cy15YXhpc3Rvb2x0aXAtaGlkZGVuIil9KX0pO3ZhciBuPXQuZ2xvYmFscy5kb20uZWxXcmFwO2UuYmx5YXhpc1Rvb2x0aXAmJihudWxsPT09dC5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMteWF4aXN0b29sdGlwIGFwZXhjaGFydHMteWF4aXN0b29sdGlwLSIuY29uY2F0KGkpKSYmKGUueWF4aXNUb29sdGlwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUueWF4aXNUb29sdGlwLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGErIiAiK3QuY29uZmlnLnRvb2x0aXAudGhlbWUpLG4uYXBwZW5kQ2hpbGQoZS55YXhpc1Rvb2x0aXApLDA9PT1pJiYoZS55YXhpc1Rvb2x0aXBUZXh0PVtdKSxlLnlheGlzVG9vbHRpcFRleHQucHVzaChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSksZS55YXhpc1Rvb2x0aXBUZXh0W2ldLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMteWF4aXN0b29sdGlwLXRleHQiKSxlLnlheGlzVG9vbHRpcC5hcHBlbmRDaGlsZChlLnlheGlzVG9vbHRpcFRleHRbaV0pKSl9LHM9MDtzPHQuY29uZmlnLnlheGlzLmxlbmd0aDtzKyspaShzKX19LHtrZXk6InNldFhDcm9zc2hhaXJXaWR0aCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLncsZT10aGlzLnR0Q3R4LGk9ZS5nZXRFbFhDcm9zc2hhaXJzKCk7aWYoZS54Y3Jvc3NoYWlyc1dpZHRoPXBhcnNlSW50KHQuY29uZmlnLnhheGlzLmNyb3NzaGFpcnMud2lkdGgpLHQuZ2xvYmFscy5jb21ib0NoYXJ0cyl7dmFyIHM9dC5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtYmFyLWFyZWEiKTtpZihudWxsIT09cyYmImJhcldpZHRoIj09PXQuY29uZmlnLnhheGlzLmNyb3NzaGFpcnMud2lkdGgpe3ZhciBhPXBhcnNlRmxvYXQocy5nZXRBdHRyaWJ1dGUoImJhcldpZHRoIikpO2UueGNyb3NzaGFpcnNXaWR0aD1hfWVsc2UgaWYoInRpY2tXaWR0aCI9PT10LmNvbmZpZy54YXhpcy5jcm9zc2hhaXJzLndpZHRoKXt2YXIgbj10Lmdsb2JhbHMubGFiZWxzLmxlbmd0aDtlLnhjcm9zc2hhaXJzV2lkdGg9dC5nbG9iYWxzLmdyaWRXaWR0aC9ufX1lbHNlIGlmKCJ0aWNrV2lkdGgiPT09dC5jb25maWcueGF4aXMuY3Jvc3NoYWlycy53aWR0aCl7dmFyIHI9dC5nbG9iYWxzLmxhYmVscy5sZW5ndGg7ZS54Y3Jvc3NoYWlyc1dpZHRoPXQuZ2xvYmFscy5ncmlkV2lkdGgvcn1lbHNlIGlmKCJiYXJXaWR0aCI9PT10LmNvbmZpZy54YXhpcy5jcm9zc2hhaXJzLndpZHRoKXt2YXIgbz10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy1iYXItYXJlYSIpO2lmKG51bGwhPT1vKXt2YXIgbD1wYXJzZUZsb2F0KG8uZ2V0QXR0cmlidXRlKCJiYXJXaWR0aCIpKTtlLnhjcm9zc2hhaXJzV2lkdGg9bH1lbHNlIGUueGNyb3NzaGFpcnNXaWR0aD0xfXQuZ2xvYmFscy5pc0Jhckhvcml6b250YWwmJihlLnhjcm9zc2hhaXJzV2lkdGg9MCksbnVsbCE9PWkmJmUueGNyb3NzaGFpcnNXaWR0aD4wJiZpLnNldEF0dHJpYnV0ZSgid2lkdGgiLGUueGNyb3NzaGFpcnNXaWR0aCl9fSx7a2V5OiJoYW5kbGVZQ3Jvc3NoYWlyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudyxlPXRoaXMudHRDdHg7ZS55Y3Jvc3NoYWlycz10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy15Y3Jvc3NoYWlycyIpLGUueWNyb3NzaGFpcnNIaWRkZW49dC5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMteWNyb3NzaGFpcnMtaGlkZGVuIil9fSx7a2V5OiJkcmF3WWF4aXNUb29sdGlwVGV4dCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBzPXRoaXMudHRDdHgsYT10aGlzLncsbj1hLmdsb2JhbHMueUxhYmVsRm9ybWF0dGVyc1t0XTtpZihzLmJseWF4aXNUb29sdGlwKXt2YXIgcj1zLmdldEVsR3JpZCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89KGUtci50b3ApKmkueVJhdGlvW3RdLGw9YS5nbG9iYWxzLm1heFlBcnJbdF0tYS5nbG9iYWxzLm1pbllBcnJbdF0saD1hLmdsb2JhbHMubWluWUFyclt0XSsobC1vKTtzLnRvb2x0aXBQb3NpdGlvbi5tb3ZlWUNyb3NzaGFpcnMoZS1yLnRvcCkscy55YXhpc1Rvb2x0aXBUZXh0W3RdLmlubmVySFRNTD1uKGgpLHMudG9vbHRpcFBvc2l0aW9uLm1vdmVZQXhpc1Rvb2x0aXAodCl9fX1dKSx0fSgpLGJ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXtlKHRoaXMsdCksdGhpcy5jdHg9aSx0aGlzLnc9aS53O3ZhciBzPXRoaXMudzt0aGlzLnRDb25maWc9cy5jb25maWcudG9vbHRpcCx0aGlzLnRvb2x0aXBVdGlsPW5ldyBkdCh0aGlzKSx0aGlzLnRvb2x0aXBMYWJlbHM9bmV3IHV0KHRoaXMpLHRoaXMudG9vbHRpcFBvc2l0aW9uPW5ldyBndCh0aGlzKSx0aGlzLm1hcmtlcj1uZXcgZnQodGhpcyksdGhpcy5pbnRlcnNlY3Q9bmV3IHB0KHRoaXMpLHRoaXMuYXhlc1Rvb2x0aXA9bmV3IHh0KHRoaXMpLHRoaXMuc2hvd09uSW50ZXJzZWN0PXRoaXMudENvbmZpZy5pbnRlcnNlY3QsdGhpcy5zaG93VG9vbHRpcFRpdGxlPXRoaXMudENvbmZpZy54LnNob3csdGhpcy5maXhlZFRvb2x0aXA9dGhpcy50Q29uZmlnLmZpeGVkLmVuYWJsZWQsdGhpcy54YXhpc1Rvb2x0aXA9bnVsbCx0aGlzLnlheGlzVFRFbHM9bnVsbCx0aGlzLmlzQmFyU2hhcmVkPSFzLmdsb2JhbHMuaXNCYXJIb3Jpem9udGFsJiZ0aGlzLnRDb25maWcuc2hhcmVkfXJldHVybiBzKHQsW3trZXk6ImdldEVsVG9vbHRpcCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHR8fCh0PXRoaXMpLHQudy5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtdG9vbHRpcCIpfX0se2tleToiZ2V0RWxYQ3Jvc3NoYWlycyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy14Y3Jvc3NoYWlycyIpfX0se2tleToiZ2V0RWxHcmlkIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLncuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3IoIi5hcGV4Y2hhcnRzLWdyaWQiKX19LHtrZXk6ImRyYXdUb29sdGlwIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnc7dGhpcy54eVJhdGlvcz10LHRoaXMuYmx4YXhpc1Rvb2x0aXA9ZS5jb25maWcueGF4aXMudG9vbHRpcC5lbmFibGVkJiZlLmdsb2JhbHMuYXhpc0NoYXJ0cyx0aGlzLmJseWF4aXNUb29sdGlwPWUuY29uZmlnLnlheGlzWzBdLnRvb2x0aXAuZW5hYmxlZCYmZS5nbG9iYWxzLmF4aXNDaGFydHMsdGhpcy5hbGxUb29sdGlwU2VyaWVzR3JvdXBzPVtdLGUuZ2xvYmFscy5heGlzQ2hhcnRzfHwodGhpcy5zaG93VG9vbHRpcFRpdGxlPSExKTt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpZihpLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtdG9vbHRpcCIpLGkuY2xhc3NMaXN0LmFkZCh0aGlzLnRDb25maWcudGhlbWUpLGUuZ2xvYmFscy5kb20uZWxXcmFwLmFwcGVuZENoaWxkKGkpLGUuZ2xvYmFscy5heGlzQ2hhcnRzKXt0aGlzLmF4ZXNUb29sdGlwLmRyYXdYYXhpc1Rvb2x0aXAoKSx0aGlzLmF4ZXNUb29sdGlwLmRyYXdZYXhpc1Rvb2x0aXAoKSx0aGlzLmF4ZXNUb29sdGlwLnNldFhDcm9zc2hhaXJXaWR0aCgpLHRoaXMuYXhlc1Rvb2x0aXAuaGFuZGxlWUNyb3NzaGFpcigpO3ZhciBzPW5ldyBfKHRoaXMuY3R4KTt0aGlzLnhBeGlzVGlja3NQb3NpdGlvbnM9cy5nZXRYQXhpc1RpY2tzUG9zaXRpb25zKCl9aWYoKGUuZ2xvYmFscy5jb21ib0NoYXJ0cyYmIXRoaXMudENvbmZpZy5zaGFyZWR8fHRoaXMudENvbmZpZy5pbnRlcnNlY3QmJiF0aGlzLnRDb25maWcuc2hhcmVkfHwoImJhciI9PT1lLmNvbmZpZy5jaGFydC50eXBlfHwicmFuZ2VCYXIiPT09ZS5jb25maWcuY2hhcnQudHlwZSkmJiF0aGlzLnRDb25maWcuc2hhcmVkKSYmKHRoaXMuc2hvd09uSW50ZXJzZWN0PSEwKSwwIT09ZS5jb25maWcubWFya2Vycy5zaXplJiYwIT09ZS5nbG9iYWxzLm1hcmtlcnMubGFyZ2VzdFNpemV8fHRoaXMubWFya2VyLmRyYXdEeW5hbWljUG9pbnRzKHRoaXMpLGUuZ2xvYmFscy5jb2xsYXBzZWRTZXJpZXMubGVuZ3RoIT09ZS5nbG9iYWxzLnNlcmllcy5sZW5ndGgpe3RoaXMuZGF0YVBvaW50c0RpdmlkZWRIZWlnaHQ9ZS5nbG9iYWxzLmdyaWRIZWlnaHQvZS5nbG9iYWxzLmRhdGFQb2ludHMsdGhpcy5kYXRhUG9pbnRzRGl2aWRlZFdpZHRoPWUuZ2xvYmFscy5ncmlkV2lkdGgvZS5nbG9iYWxzLmRhdGFQb2ludHMsdGhpcy5zaG93VG9vbHRpcFRpdGxlJiYodGhpcy50b29sdGlwVGl0bGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy50b29sdGlwVGl0bGUuY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy10b29sdGlwLXRpdGxlIiksdGhpcy50b29sdGlwVGl0bGUuc3R5bGUuZm9udEZhbWlseT10aGlzLnRDb25maWcuc3R5bGUuZm9udEZhbWlseXx8ZS5jb25maWcuY2hhcnQuZm9udEZhbWlseSx0aGlzLnRvb2x0aXBUaXRsZS5zdHlsZS5mb250U2l6ZT10aGlzLnRDb25maWcuc3R5bGUuZm9udFNpemUsaS5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXBUaXRsZSkpO3ZhciBhPWUuZ2xvYmFscy5zZXJpZXMubGVuZ3RoOyhlLmdsb2JhbHMueHlDaGFydHN8fGUuZ2xvYmFscy5jb21ib0NoYXJ0cykmJnRoaXMudENvbmZpZy5zaGFyZWQmJihhPXRoaXMuc2hvd09uSW50ZXJzZWN0PzE6ZS5nbG9iYWxzLnNlcmllcy5sZW5ndGgpLHRoaXMubGVnZW5kTGFiZWxzPWUuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5hcGV4Y2hhcnRzLWxlZ2VuZC10ZXh0IiksdGhpcy50dEl0ZW1zPXRoaXMuY3JlYXRlVFRFbGVtZW50cyhhKSx0aGlzLmFkZFNWR0V2ZW50cygpfX19LHtrZXk6ImNyZWF0ZVRURWxlbWVudHMiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLncsaT1bXSxzPXRoaXMuZ2V0RWxUb29sdGlwKCksYT0wO2E8dDthKyspe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO24uY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy10b29sdGlwLXNlcmllcy1ncm91cCIpLHRoaXMudENvbmZpZy5zaGFyZWQmJnRoaXMudENvbmZpZy5lbmFibGVkT25TZXJpZXMmJkFycmF5LmlzQXJyYXkodGhpcy50Q29uZmlnLmVuYWJsZWRPblNlcmllcykmJnRoaXMudENvbmZpZy5lbmFibGVkT25TZXJpZXMuaW5kZXhPZihhKTwwJiZuLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtdG9vbHRpcC1zZXJpZXMtZ3JvdXAtaGlkZGVuIik7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3IuY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy10b29sdGlwLW1hcmtlciIpLHIuc3R5bGUuYmFja2dyb3VuZENvbG9yPWUuZ2xvYmFscy5jb2xvcnNbYV0sbi5hcHBlbmRDaGlsZChyKTt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtvLmNsYXNzTGlzdC5hZGQoImFwZXhjaGFydHMtdG9vbHRpcC10ZXh0Iiksby5zdHlsZS5mb250RmFtaWx5PXRoaXMudENvbmZpZy5zdHlsZS5mb250RmFtaWx5fHxlLmNvbmZpZy5jaGFydC5mb250RmFtaWx5LG8uc3R5bGUuZm9udFNpemU9dGhpcy50Q29uZmlnLnN0eWxlLmZvbnRTaXplO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy10b29sdGlwLXktZ3JvdXAiKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7aC5jbGFzc0xpc3QuYWRkKCJhcGV4Y2hhcnRzLXRvb2x0aXAtdGV4dC1sYWJlbCIpLGwuYXBwZW5kQ2hpbGQoaCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2MuY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy10b29sdGlwLXRleHQtdmFsdWUiKSxsLmFwcGVuZENoaWxkKGMpO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy10b29sdGlwLXotZ3JvdXAiKTt2YXIgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7dS5jbGFzc0xpc3QuYWRkKCJhcGV4Y2hhcnRzLXRvb2x0aXAtdGV4dC16LWxhYmVsIiksZC5hcHBlbmRDaGlsZCh1KTt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7Zy5jbGFzc0xpc3QuYWRkKCJhcGV4Y2hhcnRzLXRvb2x0aXAtdGV4dC16LXZhbHVlIiksZC5hcHBlbmRDaGlsZChnKSxvLmFwcGVuZENoaWxkKGwpLG8uYXBwZW5kQ2hpbGQoZCksbi5hcHBlbmRDaGlsZChvKSxzLmFwcGVuZENoaWxkKG4pLGkucHVzaChuKX1yZXR1cm4gaX19LHtrZXk6ImFkZFNWR0V2ZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLncsZT10LmNvbmZpZy5jaGFydC50eXBlLGk9dGhpcy5nZXRFbFRvb2x0aXAoKSxzPSEoImJhciIhPT1lJiYiY2FuZGxlc3RpY2siIT09ZSYmInJhbmdlQmFyIiE9PWUpLGE9dC5nbG9iYWxzLmRvbS5QYXBlci5ub2RlLG49dGhpcy5nZXRFbEdyaWQoKTtuJiYodGhpcy5zZXJpZXNCb3VuZD1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTt2YXIgcixvPVtdLGw9W10saD17aG92ZXJBcmVhOmEsZWxHcmlkOm4sdG9vbHRpcEVsOmksdG9vbHRpcFk6byx0b29sdGlwWDpsLHR0SXRlbXM6dGhpcy50dEl0ZW1zfTtpZih0Lmdsb2JhbHMuYXhpc0NoYXJ0cyYmKCJhcmVhIj09PWV8fCJsaW5lIj09PWV8fCJzY2F0dGVyIj09PWV8fCJidWJibGUiPT09ZT9yPXQuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5hcGV4Y2hhcnRzLXNlcmllc1tkYXRhXFw6bG9uZ2VzdFNlcmllcz0ndHJ1ZSddIC5hcGV4Y2hhcnRzLW1hcmtlciIpOnM/cj10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy1zZXJpZXMgLmFwZXhjaGFydHMtYmFyLWFyZWEsIC5hcGV4Y2hhcnRzLXNlcmllcyAuYXBleGNoYXJ0cy1jYW5kbGVzdGljay1hcmVhLCAuYXBleGNoYXJ0cy1zZXJpZXMgLmFwZXhjaGFydHMtcmFuZ2ViYXItYXJlYSIpOiJoZWF0bWFwIj09PWU/cj10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy1zZXJpZXMgLmFwZXhjaGFydHMtaGVhdG1hcCIpOiJyYWRhciI9PT1lJiYocj10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy1zZXJpZXMgLmFwZXhjaGFydHMtbWFya2VyIikpLHImJnIubGVuZ3RoKSlmb3IodmFyIGM9MDtjPHIubGVuZ3RoO2MrKylvLnB1c2gocltjXS5nZXRBdHRyaWJ1dGUoImN5IikpLGwucHVzaChyW2NdLmdldEF0dHJpYnV0ZSgiY3giKSk7aWYodC5nbG9iYWxzLnh5Q2hhcnRzJiYhdGhpcy5zaG93T25JbnRlcnNlY3R8fHQuZ2xvYmFscy5jb21ib0NoYXJ0cyYmIXRoaXMuc2hvd09uSW50ZXJzZWN0fHxzJiZ0aGlzLmhhc0JhcnMoKSYmdGhpcy50Q29uZmlnLnNoYXJlZCl0aGlzLmFkZFBhdGhzRXZlbnRMaXN0ZW5lcnMoW2FdLGgpO2Vsc2UgaWYocyYmIXQuZ2xvYmFscy5jb21ib0NoYXJ0cyl0aGlzLmFkZEJhcnNFdmVudExpc3RlbmVycyhoKTtlbHNlIGlmKCJidWJibGUiPT09ZXx8InNjYXR0ZXIiPT09ZXx8InJhZGFyIj09PWV8fHRoaXMuc2hvd09uSW50ZXJzZWN0JiYoImFyZWEiPT09ZXx8ImxpbmUiPT09ZSkpdGhpcy5hZGRQb2ludHNFdmVudHNMaXN0ZW5lcnMoaCk7ZWxzZSBpZighdC5nbG9iYWxzLmF4aXNDaGFydHN8fCJoZWF0bWFwIj09PWUpe3ZhciBkPXQuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5hcGV4Y2hhcnRzLXNlcmllcyIpO3RoaXMuYWRkUGF0aHNFdmVudExpc3RlbmVycyhkLGgpfWlmKHRoaXMuc2hvd09uSW50ZXJzZWN0KXt2YXIgdT10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy1saW5lLXNlcmllcyAuYXBleGNoYXJ0cy1tYXJrZXIiKTt1Lmxlbmd0aD4wJiZ0aGlzLmFkZFBhdGhzRXZlbnRMaXN0ZW5lcnModSxoKTt2YXIgZz10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIuYXBleGNoYXJ0cy1hcmVhLXNlcmllcyAuYXBleGNoYXJ0cy1tYXJrZXIiKTtnLmxlbmd0aD4wJiZ0aGlzLmFkZFBhdGhzRXZlbnRMaXN0ZW5lcnMoZyxoKSx0aGlzLmhhc0JhcnMoKSYmIXRoaXMudENvbmZpZy5zaGFyZWQmJnRoaXMuYWRkQmFyc0V2ZW50TGlzdGVuZXJzKGgpfX19LHtrZXk6ImRyYXdGaXhlZFRvb2x0aXBSZWN0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudyxlPXRoaXMuZ2V0RWxUb29sdGlwKCksaT1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHM9aS53aWR0aCsxMCxhPWkuaGVpZ2h0KzEwLG49dGhpcy50Q29uZmlnLmZpeGVkLm9mZnNldFgscj10aGlzLnRDb25maWcuZml4ZWQub2Zmc2V0WTtyZXR1cm4gdGhpcy50Q29uZmlnLmZpeGVkLnBvc2l0aW9uLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigicmlnaHQiKT4tMSYmKG49bit0Lmdsb2JhbHMuc3ZnV2lkdGgtcysxMCksdGhpcy50Q29uZmlnLmZpeGVkLnBvc2l0aW9uLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiYm90dG9tIik+LTEmJihyPXIrdC5nbG9iYWxzLnN2Z0hlaWdodC1hLTEwKSxlLnN0eWxlLmxlZnQ9bisicHgiLGUuc3R5bGUudG9wPXIrInB4Iix7eDpuLHk6cix0dFdpZHRoOnMsdHRIZWlnaHQ6YX19fSx7a2V5OiJhZGRQb2ludHNFdmVudHNMaXN0ZW5lcnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudy5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvckFsbCgiLmFwZXhjaGFydHMtc2VyaWVzLW1hcmtlcnMgLmFwZXhjaGFydHMtbWFya2VyIik7dGhpcy5hZGRQYXRoc0V2ZW50TGlzdGVuZXJzKGUsdCl9fSx7a2V5OiJhZGRCYXJzRXZlbnRMaXN0ZW5lcnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudy5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvckFsbCgiLmFwZXhjaGFydHMtYmFyLWFyZWEsIC5hcGV4Y2hhcnRzLWNhbmRsZXN0aWNrLWFyZWEsIC5hcGV4Y2hhcnRzLXJhbmdlYmFyLWFyZWEiKTt0aGlzLmFkZFBhdGhzRXZlbnRMaXN0ZW5lcnMoZSx0KX19LHtrZXk6ImFkZFBhdGhzRXZlbnRMaXN0ZW5lcnMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXRoaXMscz10aGlzLGE9ZnVuY3Rpb24oYSl7dmFyIG49e3BhdGhzOnRbYV0sdG9vbHRpcEVsOmUudG9vbHRpcEVsLHRvb2x0aXBZOmUudG9vbHRpcFksdG9vbHRpcFg6ZS50b29sdGlwWCxlbEdyaWQ6ZS5lbEdyaWQsaG92ZXJBcmVhOmUuaG92ZXJBcmVhLHR0SXRlbXM6ZS50dEl0ZW1zfTtpLncuZ2xvYmFscy50b29sdGlwT3B0cz1uO1sibW91c2Vtb3ZlIiwibW91c2V1cCIsInRvdWNobW92ZSIsIm1vdXNlb3V0IiwidG91Y2hlbmQiXS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHRbYV0uYWRkRXZlbnRMaXN0ZW5lcihlLHMuc2VyaWVzSG92ZXIuYmluZChzLG4pLHtjYXB0dXJlOiExLHBhc3NpdmU6ITB9KX0pfSxuPTA7bjx0Lmxlbmd0aDtuKyspYShuKX19LHtrZXk6InNlcmllc0hvdmVyIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMscz1bXSxhPXRoaXMudzthLmNvbmZpZy5jaGFydC5ncm91cCYmKHM9dGhpcy5jdHguZ2V0R3JvdXBlZENoYXJ0cygpKSxhLmdsb2JhbHMuYXhpc0NoYXJ0cyYmKGEuZ2xvYmFscy5taW5YPT09LTEvMCYmYS5nbG9iYWxzLm1heFg9PT0xLzB8fDA9PT1hLmdsb2JhbHMuZGF0YVBvaW50cyl8fChzLmxlbmd0aD9zLmZvckVhY2goZnVuY3Rpb24ocyl7dmFyIGE9aS5nZXRFbFRvb2x0aXAocyksbj17cGF0aHM6dC5wYXRocyx0b29sdGlwRWw6YSx0b29sdGlwWTp0LnRvb2x0aXBZLHRvb2x0aXBYOnQudG9vbHRpcFgsZWxHcmlkOnQuZWxHcmlkLGhvdmVyQXJlYTp0LmhvdmVyQXJlYSx0dEl0ZW1zOnMudy5nbG9iYWxzLnRvb2x0aXAudHRJdGVtc307cy53Lmdsb2JhbHMubWluWD09PWkudy5nbG9iYWxzLm1pblgmJnMudy5nbG9iYWxzLm1heFg9PT1pLncuZ2xvYmFscy5tYXhYJiZzLncuZ2xvYmFscy50b29sdGlwLnNlcmllc0hvdmVyQnlDb250ZXh0KHtjaGFydEN0eDpzLHR0Q3R4OnMudy5nbG9iYWxzLnRvb2x0aXAsb3B0Om4sZTplfSl9KTp0aGlzLnNlcmllc0hvdmVyQnlDb250ZXh0KHtjaGFydEN0eDp0aGlzLmN0eCx0dEN0eDp0aGlzLncuZ2xvYmFscy50b29sdGlwLG9wdDp0LGU6ZX0pKX19LHtrZXk6InNlcmllc0hvdmVyQnlDb250ZXh0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LmNoYXJ0Q3R4LGk9dC50dEN0eCxzPXQub3B0LGE9dC5lLG49ZS53LHI9dGhpcy5nZXRFbFRvb2x0aXAoKTsoaS50b29sdGlwUmVjdD17eDowLHk6MCx0dFdpZHRoOnIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgsdHRIZWlnaHQ6ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHR9LGkuZT1hLCFpLmhhc0JhcnMoKXx8bi5nbG9iYWxzLmNvbWJvQ2hhcnRzfHxpLmlzQmFyU2hhcmVkKXx8dGhpcy50Q29uZmlnLm9uRGF0YXNldEhvdmVyLmhpZ2hsaWdodERhdGFTZXJpZXMmJm5ldyBCKGUpLnRvZ2dsZVNlcmllc09uSG92ZXIoYSxhLnRhcmdldC5wYXJlbnROb2RlKTtpLmZpeGVkVG9vbHRpcCYmaS5kcmF3Rml4ZWRUb29sdGlwUmVjdCgpLG4uZ2xvYmFscy5heGlzQ2hhcnRzP2kuYXhpc0NoYXJ0c1Rvb2x0aXBzKHtlOmEsb3B0OnMsdG9vbHRpcFJlY3Q6aS50b29sdGlwUmVjdH0pOmkubm9uQXhpc0NoYXJ0c1Rvb2x0aXBzKHtlOmEsb3B0OnMsdG9vbHRpcFJlY3Q6aS50b29sdGlwUmVjdH0pfX0se2tleToiYXhpc0NoYXJ0c1Rvb2x0aXBzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxpLHMsYT10LmUsbj10Lm9wdCxyPXRoaXMudyxvPW51bGwsbD1uLmVsR3JpZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxoPSJ0b3VjaG1vdmUiPT09YS50eXBlP2EudG91Y2hlc1swXS5jbGllbnRYOmEuY2xpZW50WCxjPSJ0b3VjaG1vdmUiPT09YS50eXBlP2EudG91Y2hlc1swXS5jbGllbnRZOmEuY2xpZW50WTtpZih0aGlzLmNsaWVudFk9Yyx0aGlzLmNsaWVudFg9aCxyLmdsb2JhbHMuY2FwdHVyZWRTZXJpZXNJbmRleD0tMSxyLmdsb2JhbHMuY2FwdHVyZWREYXRhUG9pbnRJbmRleD0tMSxjPGwudG9wfHxjPmwudG9wK2wuaGVpZ2h0KXRoaXMuaGFuZGxlTW91c2VPdXQobik7ZWxzZXtpZihBcnJheS5pc0FycmF5KHRoaXMudENvbmZpZy5lbmFibGVkT25TZXJpZXMpJiYhci5jb25maWcudG9vbHRpcC5zaGFyZWQpe3ZhciBkPXBhcnNlSW50KG4ucGF0aHMuZ2V0QXR0cmlidXRlKCJpbmRleCIpKTtpZih0aGlzLnRDb25maWcuZW5hYmxlZE9uU2VyaWVzLmluZGV4T2YoZCk8MClyZXR1cm4gdm9pZCB0aGlzLmhhbmRsZU1vdXNlT3V0KG4pfXZhciB1PXRoaXMuZ2V0RWxUb29sdGlwKCksZz10aGlzLmdldEVsWENyb3NzaGFpcnMoKSxmPXIuZ2xvYmFscy54eUNoYXJ0c3x8ImJhciI9PT1yLmNvbmZpZy5jaGFydC50eXBlJiYhci5nbG9iYWxzLmlzQmFySG9yaXpvbnRhbCYmdGhpcy5oYXNCYXJzKCkmJnRoaXMudENvbmZpZy5zaGFyZWR8fHIuZ2xvYmFscy5jb21ib0NoYXJ0cyYmdGhpcy5oYXNCYXJzO2lmKHIuZ2xvYmFscy5pc0Jhckhvcml6b250YWwmJnRoaXMuaGFzQmFycygpJiYoZj0hMSksIm1vdXNlbW92ZSI9PT1hLnR5cGV8fCJ0b3VjaG1vdmUiPT09YS50eXBlfHwibW91c2V1cCI9PT1hLnR5cGUpe2lmKG51bGwhPT1nJiZnLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpLG51bGwhPT10aGlzLnljcm9zc2hhaXJzJiZ0aGlzLmJseWF4aXNUb29sdGlwJiZ0aGlzLnljcm9zc2hhaXJzLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpLGYmJiF0aGlzLnNob3dPbkludGVyc2VjdCl7ZT0obz10aGlzLnRvb2x0aXBVdGlsLmdldE5lYXJlc3RWYWx1ZXMoe2NvbnRleHQ6dGhpcyxob3ZlckFyZWE6bi5ob3ZlckFyZWEsZWxHcmlkOm4uZWxHcmlkLGNsaWVudFg6aCxjbGllbnRZOmMsaGFzQmFyczp0aGlzLmhhc0JhcnN9KSkuajt2YXIgcD1vLmNhcHR1cmVkU2VyaWVzO2lmKG8uaG92ZXJYPDB8fG8uaG92ZXJYPnIuZ2xvYmFscy5ncmlkV2lkdGgpcmV0dXJuIHZvaWQgdGhpcy5oYW5kbGVNb3VzZU91dChuKTtpZihudWxsIT09cCl7aWYobnVsbD09PXIuZ2xvYmFscy5zZXJpZXNbcF1bZV0pcmV0dXJuIHZvaWQgdGhpcy5oYW5kbGVNb3VzZU91dChuKTt2b2lkIDAhPT1yLmdsb2JhbHMuc2VyaWVzW3BdW2VdP3RoaXMudENvbmZpZy5zaGFyZWQmJnRoaXMudG9vbHRpcFV0aWwuaXNYb3ZlcmxhcChlKSYmdGhpcy50b29sdGlwVXRpbC5pc0luaXRpYWxTZXJpZXNTYW1lTGVuKCk/dGhpcy5jcmVhdGUoYSx0aGlzLHAsZSxuLnR0SXRlbXMpOnRoaXMuY3JlYXRlKGEsdGhpcyxwLGUsbi50dEl0ZW1zLCExKTp0aGlzLnRvb2x0aXBVdGlsLmlzWG92ZXJsYXAoZSkmJnRoaXMuY3JlYXRlKGEsdGhpcywwLGUsbi50dEl0ZW1zKX1lbHNlIHRoaXMudG9vbHRpcFV0aWwuaXNYb3ZlcmxhcChlKSYmdGhpcy5jcmVhdGUoYSx0aGlzLDAsZSxuLnR0SXRlbXMpfWVsc2UgaWYoImhlYXRtYXAiPT09ci5jb25maWcuY2hhcnQudHlwZSl7dmFyIHg9dGhpcy5pbnRlcnNlY3QuaGFuZGxlSGVhdFRvb2x0aXAoe2U6YSxvcHQ6bix4OmkseTpzfSk7aT14Lngscz14LnksdS5zdHlsZS5sZWZ0PWkrInB4Iix1LnN0eWxlLnRvcD1zKyJweCJ9ZWxzZSB0aGlzLmhhc0JhcnMmJnRoaXMuaW50ZXJzZWN0LmhhbmRsZUJhclRvb2x0aXAoe2U6YSxvcHQ6bn0pLHRoaXMuaGFzTWFya2VycyYmdGhpcy5pbnRlcnNlY3QuaGFuZGxlTWFya2VyVG9vbHRpcCh7ZTphLG9wdDpuLHg6aSx5OnN9KTtpZih0aGlzLmJseWF4aXNUb29sdGlwKWZvcih2YXIgYj0wO2I8ci5jb25maWcueWF4aXMubGVuZ3RoO2IrKyl0aGlzLmF4ZXNUb29sdGlwLmRyYXdZYXhpc1Rvb2x0aXBUZXh0KGIsYyx0aGlzLnh5UmF0aW9zKTtuLnRvb2x0aXBFbC5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKX1lbHNlIm1vdXNlb3V0IiE9PWEudHlwZSYmInRvdWNoZW5kIiE9PWEudHlwZXx8dGhpcy5oYW5kbGVNb3VzZU91dChuKX19fSx7a2V5OiJub25BeGlzQ2hhcnRzVG9vbHRpcHMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZSxpPXQub3B0LHM9dC50b29sdGlwUmVjdCxhPXRoaXMudyxuPWkucGF0aHMuZ2V0QXR0cmlidXRlKCJyZWwiKSxyPXRoaXMuZ2V0RWxUb29sdGlwKCksbz1hLmdsb2JhbHMuZG9tLmVsV3JhcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZigibW91c2Vtb3ZlIj09PWUudHlwZXx8InRvdWNobW92ZSI9PT1lLnR5cGUpe3IuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIiksdGhpcy50b29sdGlwTGFiZWxzLmRyYXdTZXJpZXNUZXh0cyh7dHRJdGVtczppLnR0SXRlbXMsaTpwYXJzZUludChuKS0xLHNoYXJlZDohMX0pO3ZhciBsPWEuZ2xvYmFscy5jbGllbnRYLW8ubGVmdC1zLnR0V2lkdGgvMixoPWEuZ2xvYmFscy5jbGllbnRZLW8udG9wLXMudHRIZWlnaHQtMTA7ci5zdHlsZS5sZWZ0PWwrInB4IixyLnN0eWxlLnRvcD1oKyJweCJ9ZWxzZSJtb3VzZW91dCIhPT1lLnR5cGUmJiJ0b3VjaGVuZCIhPT1lLnR5cGV8fHIuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIil9fSx7a2V5OiJkZWFjdGl2YXRlSG92ZXJGaWx0ZXIiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMudyxlPW5ldyBwKHRoaXMuY3R4KSxpPXQuZ2xvYmFscy5kb20uUGFwZXIuc2VsZWN0KCIuYXBleGNoYXJ0cy1iYXItYXJlYSIpLHM9MDtzPGkubGVuZ3RoO3MrKyllLnBhdGhNb3VzZUxlYXZlKGlbc10pfX0se2tleToiaGFuZGxlTW91c2VPdXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudyxpPXRoaXMuZ2V0RWxYQ3Jvc3NoYWlycygpO2lmKHQudG9vbHRpcEVsLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpLHRoaXMuZGVhY3RpdmF0ZUhvdmVyRmlsdGVyKCksImJ1YmJsZSIhPT1lLmNvbmZpZy5jaGFydC50eXBlJiZ0aGlzLm1hcmtlci5yZXNldFBvaW50c1NpemUoKSxudWxsIT09aSYmaS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSxudWxsIT09dGhpcy55Y3Jvc3NoYWlycyYmdGhpcy55Y3Jvc3NoYWlycy5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSx0aGlzLmJseGF4aXNUb29sdGlwJiZ0aGlzLnhheGlzVG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSx0aGlzLmJseWF4aXNUb29sdGlwKXtudWxsPT09dGhpcy55YXhpc1RURWxzJiYodGhpcy55YXhpc1RURWxzPWUuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5hcGV4Y2hhcnRzLXlheGlzdG9vbHRpcCIpKTtmb3IodmFyIHM9MDtzPHRoaXMueWF4aXNUVEVscy5sZW5ndGg7cysrKXRoaXMueWF4aXNUVEVsc1tzXS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKX1lLmNvbmZpZy5sZWdlbmQudG9vbHRpcEhvdmVyRm9ybWF0dGVyJiZ0aGlzLmxlZ2VuZExhYmVscy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhOmRlZmF1bHQtdGV4dCIpO3QuaW5uZXJIVE1MPWV9KX19LHtrZXk6ImdldEVsTWFya2VycyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yQWxsKCIgLmFwZXhjaGFydHMtc2VyaWVzLW1hcmtlcnMiKX19LHtrZXk6ImdldEFsbE1hcmtlcnMiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudy5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvckFsbCgiLmFwZXhjaGFydHMtc2VyaWVzLW1hcmtlcnMgLmFwZXhjaGFydHMtbWFya2VyIil9fSx7a2V5OiJoYXNNYXJrZXJzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEVsTWFya2VycygpLmxlbmd0aD4wfX0se2tleToiZ2V0RWxCYXJzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLncuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5hcGV4Y2hhcnRzLWJhci1zZXJpZXMsICAuYXBleGNoYXJ0cy1jYW5kbGVzdGljay1zZXJpZXMsIC5hcGV4Y2hhcnRzLXJhbmdlYmFyLXNlcmllcyIpfX0se2tleToiaGFzQmFycyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRFbEJhcnMoKS5sZW5ndGg+MH19LHtrZXk6Im1hcmtlckNsaWNrIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIHM9dGhpcy53OyJmdW5jdGlvbiI9PXR5cGVvZiBzLmNvbmZpZy5jaGFydC5ldmVudHMubWFya2VyQ2xpY2smJnMuY29uZmlnLmNoYXJ0LmV2ZW50cy5tYXJrZXJDbGljayh0LHRoaXMuY3R4LHtzZXJpZXNJbmRleDplLGRhdGFQb2ludEluZGV4OmksdzpzfSksdGhpcy5jdHguZmlyZUV2ZW50KCJtYXJrZXJDbGljayIsW3QsdGhpcy5jdHgse3Nlcmllc0luZGV4OmUsZGF0YVBvaW50SW5kZXg6aSx3OnN9XSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLHMsYSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD41JiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0/YXJndW1lbnRzWzVdOm51bGwscj10aGlzLncsbz1lOyJtb3VzZXVwIj09PXQudHlwZSYmdGhpcy5tYXJrZXJDbGljayh0LGkscyksbnVsbD09PW4mJihuPXRoaXMudENvbmZpZy5zaGFyZWQpO3ZhciBsPXRoaXMuaGFzTWFya2VycygpLGg9dGhpcy5nZXRFbEJhcnMoKTtpZihyLmNvbmZpZy5sZWdlbmQudG9vbHRpcEhvdmVyRm9ybWF0dGVyKXt2YXIgYz1yLmNvbmZpZy5sZWdlbmQudG9vbHRpcEhvdmVyRm9ybWF0dGVyLGQ9QXJyYXkuZnJvbSh0aGlzLmxlZ2VuZExhYmVscyk7ZC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0QXR0cmlidXRlKCJkYXRhOmRlZmF1bHQtdGV4dCIpO3QuaW5uZXJIVE1MPWV9KTtmb3IodmFyIHU9MDt1PGQubGVuZ3RoO3UrKyl7dmFyIGc9ZFt1XSxmPXBhcnNlSW50KGcuZ2V0QXR0cmlidXRlKCJpIikpLHg9Zy5nZXRBdHRyaWJ1dGUoImRhdGE6ZGVmYXVsdC10ZXh0IiksYj1jKHgse3Nlcmllc0luZGV4Om4/ZjppLGRhdGFQb2ludEluZGV4OnMsdzpyfSk7aWYobilnLmlubmVySFRNTD1yLmdsb2JhbHMuY29sbGFwc2VkU2VyaWVzSW5kaWNlcy5pbmRleE9mKGYpPDA/Yjp4O2Vsc2UgaWYoZy5pbm5lckhUTUw9Zj09PWk/Yjp4LGk9PT1mKWJyZWFrfX1pZihuKXtpZihvLnRvb2x0aXBMYWJlbHMuZHJhd1Nlcmllc1RleHRzKHt0dEl0ZW1zOmEsaTppLGo6cyxzaGFyZWQ6IXRoaXMuc2hvd09uSW50ZXJzZWN0JiZ0aGlzLnRDb25maWcuc2hhcmVkfSksbCYmKHIuZ2xvYmFscy5tYXJrZXJzLmxhcmdlc3RTaXplPjA/by5tYXJrZXIuZW5sYXJnZVBvaW50cyhzKTpvLnRvb2x0aXBQb3NpdGlvbi5tb3ZlRHluYW1pY1BvaW50c09uSG92ZXIocykpLHRoaXMuaGFzQmFycygpJiYodGhpcy5iYXJTZXJpZXNIZWlnaHQ9dGhpcy50b29sdGlwVXRpbC5nZXRCYXJzSGVpZ2h0KGgpLHRoaXMuYmFyU2VyaWVzSGVpZ2h0PjApKXt2YXIgbT1uZXcgcCh0aGlzLmN0eCksdj1yLmdsb2JhbHMuZG9tLlBhcGVyLnNlbGVjdCgiLmFwZXhjaGFydHMtYmFyLWFyZWFbaj0nIi5jb25jYXQocywiJ10iKSk7dGhpcy5kZWFjdGl2YXRlSG92ZXJGaWx0ZXIoKSx0aGlzLnRvb2x0aXBQb3NpdGlvbi5tb3ZlU3RpY2t5VG9vbHRpcE92ZXJCYXJzKHMpO2Zvcih2YXIgeT0wO3k8di5sZW5ndGg7eSsrKW0ucGF0aE1vdXNlRW50ZXIodlt5XSl9fWVsc2Ugby50b29sdGlwTGFiZWxzLmRyYXdTZXJpZXNUZXh0cyh7c2hhcmVkOiExLHR0SXRlbXM6YSxpOmksajpzfSksdGhpcy5oYXNCYXJzKCkmJm8udG9vbHRpcFBvc2l0aW9uLm1vdmVTdGlja3lUb29sdGlwT3ZlckJhcnMocyksbCYmby50b29sdGlwUG9zaXRpb24ubW92ZU1hcmtlcnMoaSxzKX19XSksdH0oKSxtdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaSl7ZSh0aGlzLHQpLHRoaXMuY3R4PWksdGhpcy53PWkudyx0aGlzLmV2PXRoaXMudy5jb25maWcuY2hhcnQuZXZlbnRzLHRoaXMubG9jYWxlVmFsdWVzPXRoaXMudy5nbG9iYWxzLmxvY2FsZS50b29sYmFyfXJldHVybiBzKHQsW3trZXk6ImNyZWF0ZVRvb2xiYXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53LGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYoZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiYXBleGNoYXJ0cy10b29sYmFyIiksdC5nbG9iYWxzLmRvbS5lbFdyYXAuYXBwZW5kQ2hpbGQoZSksdGhpcy5lbFpvb209ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbFpvb21Jbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsWm9vbU91dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsUGFuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxTZWxlY3Rpb249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbFpvb21SZXNldD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsTWVudUljb249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbE1lbnU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbEN1c3RvbUljb25zPVtdLHRoaXMudD10LmNvbmZpZy5jaGFydC50b29sYmFyLnRvb2xzLEFycmF5LmlzQXJyYXkodGhpcy50LmN1c3RvbUljb25zKSlmb3IodmFyIGk9MDtpPHRoaXMudC5jdXN0b21JY29ucy5sZW5ndGg7aSsrKXRoaXMuZWxDdXN0b21JY29ucy5wdXNoKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTt0aGlzLmVsTWVudUl0ZW1zPVtdO3ZhciBzPVtdO3RoaXMudC56b29taW4mJnQuY29uZmlnLmNoYXJ0Lnpvb20uZW5hYmxlZCYmcy5wdXNoKHtlbDp0aGlzLmVsWm9vbUluLGljb246InN0cmluZyI9PXR5cGVvZiB0aGlzLnQuem9vbWluP3RoaXMudC56b29taW46JzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+XG4gICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPlxuICAgIDxwYXRoIGQ9Ik0xMyA3aC0ydjRIN3YyaDR2NGgydi00aDR2LTJoLTRWN3ptLTEtNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6Ii8+XG48L3N2Zz5cbicsdGl0bGU6dGhpcy5sb2NhbGVWYWx1ZXMuem9vbUluLGNsYXNzOiJhcGV4Y2hhcnRzLXpvb20taW4taWNvbiJ9KSx0aGlzLnQuem9vbW91dCYmdC5jb25maWcuY2hhcnQuem9vbS5lbmFibGVkJiZzLnB1c2goe2VsOnRoaXMuZWxab29tT3V0LGljb246InN0cmluZyI9PXR5cGVvZiB0aGlzLnQuem9vbW91dD90aGlzLnQuem9vbW91dDonPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij5cbiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+XG4gICAgPHBhdGggZD0iTTcgMTF2MmgxMHYtMkg3em01LTlDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIvPlxuPC9zdmc+XG4nLHRpdGxlOnRoaXMubG9jYWxlVmFsdWVzLnpvb21PdXQsY2xhc3M6ImFwZXhjaGFydHMtem9vbS1vdXQtaWNvbiJ9KSx0aGlzLnQuem9vbSYmdC5jb25maWcuY2hhcnQuem9vbS5lbmFibGVkJiZzLnB1c2goe2VsOnRoaXMuZWxab29tLGljb246InN0cmluZyI9PXR5cGVvZiB0aGlzLnQuem9vbT90aGlzLnQuem9vbTonPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9IiMwMDAwMDAiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij5cbiAgICA8cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHoiLz5cbiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDBWMHoiIGZpbGw9Im5vbmUiLz5cbiAgICA8cGF0aCBkPSJNMTIgMTBoLTJ2Mkg5di0ySDdWOWgyVjdoMXYyaDJ2MXoiLz5cbjwvc3ZnPicsdGl0bGU6dGhpcy5sb2NhbGVWYWx1ZXMuc2VsZWN0aW9uWm9vbSxjbGFzczp0Lmdsb2JhbHMuaXNUb3VjaERldmljZT8iaGlkZGVuIjoiYXBleGNoYXJ0cy16b29tLWljb24ifSksdGhpcy50LnNlbGVjdGlvbiYmdC5jb25maWcuY2hhcnQuc2VsZWN0aW9uLmVuYWJsZWQmJnMucHVzaCh7ZWw6dGhpcy5lbFNlbGVjdGlvbixpY29uOiJzdHJpbmciPT10eXBlb2YgdGhpcy50LnNlbGVjdGlvbj90aGlzLnQuc2VsZWN0aW9uOic8c3ZnIGZpbGw9IiM2RTgxOTIiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPlxuICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz5cbiAgICA8cGF0aCBkPSJNMyA1aDJWM2MtMS4xIDAtMiAuOS0yIDJ6bTAgOGgydi0ySDN2MnptNCA4aDJ2LTJIN3Yyek0zIDloMlY3SDN2MnptMTAtNmgtMnYyaDJWM3ptNiAwdjJoMmMwLTEuMS0uOS0yLTItMnpNNSAyMXYtMkgzYzAgMS4xLjkgMiAyIDJ6bS0yLTRoMnYtMkgzdjJ6TTkgM0g3djJoMlYzem0yIDE4aDJ2LTJoLTJ2MnptOC04aDJ2LTJoLTJ2MnptMCA4YzEuMSAwIDItLjkgMi0yaC0ydjJ6bTAtMTJoMlY3aC0ydjJ6bTAgOGgydi0yaC0ydjJ6bS00IDRoMnYtMmgtMnYyem0wLTE2aDJWM2gtMnYyeiIvPlxuPC9zdmc+Jyx0aXRsZTp0aGlzLmxvY2FsZVZhbHVlcy5zZWxlY3Rpb24sY2xhc3M6dC5nbG9iYWxzLmlzVG91Y2hEZXZpY2U/ImhpZGRlbiI6ImFwZXhjaGFydHMtc2VsZWN0aW9uLWljb24ifSksdGhpcy50LnBhbiYmdC5jb25maWcuY2hhcnQuem9vbS5lbmFibGVkJiZzLnB1c2goe2VsOnRoaXMuZWxQYW4saWNvbjoic3RyaW5nIj09dHlwZW9mIHRoaXMudC5wYW4/dGhpcy50LnBhbjonPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjMDAwMDAwIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+XG4gICAgPGRlZnM+XG4gICAgICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGlkPSJhIi8+XG4gICAgPC9kZWZzPlxuICAgIDxjbGlwUGF0aCBpZD0iYiI+XG4gICAgICAgIDx1c2Ugb3ZlcmZsb3c9InZpc2libGUiIHhsaW5rOmhyZWY9IiNhIi8+XG4gICAgPC9jbGlwUGF0aD5cbiAgICA8cGF0aCBjbGlwLXBhdGg9InVybCgjYikiIGQ9Ik0yMyA1LjVWMjBjMCAyLjItMS44IDQtNCA0aC03LjNjLTEuMDggMC0yLjEtLjQzLTIuODUtMS4xOUwxIDE0LjgzczEuMjYtMS4yMyAxLjMtMS4yNWMuMjItLjE5LjQ5LS4yOS43OS0uMjkuMjIgMCAuNDIuMDYuNi4xNi4wNC4wMSA0LjMxIDIuNDYgNC4zMSAyLjQ2VjRjMC0uODMuNjctMS41IDEuNS0xLjVTMTEgMy4xNyAxMSA0djdoMVYxLjVjMC0uODMuNjctMS41IDEuNS0xLjVTMTUgLjY3IDE1IDEuNVYxMWgxVjIuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNVYxMWgxVjUuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNXoiLz5cbjwvc3ZnPicsdGl0bGU6dGhpcy5sb2NhbGVWYWx1ZXMucGFuLGNsYXNzOnQuZ2xvYmFscy5pc1RvdWNoRGV2aWNlPyJoaWRkZW4iOiJhcGV4Y2hhcnRzLXBhbi1pY29uIn0pLHRoaXMudC5yZXNldCYmdC5jb25maWcuY2hhcnQuem9vbS5lbmFibGVkJiZzLnB1c2goe2VsOnRoaXMuZWxab29tUmVzZXQsaWNvbjoic3RyaW5nIj09dHlwZW9mIHRoaXMudC5yZXNldD90aGlzLnQucmVzZXQ6JzxzdmcgZmlsbD0iIzAwMDAwMCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+XG4gICAgPHBhdGggZD0iTTEwIDIwdi02aDR2Nmg1di04aDNMMTIgMyAyIDEyaDN2OHoiLz5cbiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+XG48L3N2Zz4nLHRpdGxlOnRoaXMubG9jYWxlVmFsdWVzLnJlc2V0LGNsYXNzOiJhcGV4Y2hhcnRzLXJlc2V0LXpvb20taWNvbiJ9KSx0aGlzLnQuZG93bmxvYWQmJnMucHVzaCh7ZWw6dGhpcy5lbE1lbnVJY29uLGljb246InN0cmluZyI9PXR5cGVvZiB0aGlzLnQuZG93bmxvYWQ/dGhpcy50LmRvd25sb2FkOic8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMFYweiIvPjxwYXRoIGQ9Ik0zIDE4aDE4di0ySDN2MnptMC01aDE4di0ySDN2MnptMC03djJoMThWNkgzeiIvPjwvc3ZnPicsdGl0bGU6dGhpcy5sb2NhbGVWYWx1ZXMubWVudSxjbGFzczoiYXBleGNoYXJ0cy1tZW51LWljb24ifSk7Zm9yKHZhciBhPTA7YTx0aGlzLmVsQ3VzdG9tSWNvbnMubGVuZ3RoO2ErKylzLnB1c2goe2VsOnRoaXMuZWxDdXN0b21JY29uc1thXSxpY29uOnRoaXMudC5jdXN0b21JY29uc1thXS5pY29uLHRpdGxlOnRoaXMudC5jdXN0b21JY29uc1thXS50aXRsZSxpbmRleDp0aGlzLnQuY3VzdG9tSWNvbnNbYV0uaW5kZXgsY2xhc3M6ImFwZXhjaGFydHMtdG9vbGJhci1jdXN0b20taWNvbiAiK3RoaXMudC5jdXN0b21JY29uc1thXS5jbGFzc30pO3MuZm9yRWFjaChmdW5jdGlvbih0LGUpe3QuaW5kZXgmJnUubW92ZUluZGV4SW5BcnJheShzLGUsdC5pbmRleCl9KTtmb3IodmFyIG49MDtuPHMubGVuZ3RoO24rKylwLnNldEF0dHJzKHNbbl0uZWwse2NsYXNzOnNbbl0uY2xhc3MsdGl0bGU6c1tuXS50aXRsZX0pLHNbbl0uZWwuaW5uZXJIVE1MPXNbbl0uaWNvbixlLmFwcGVuZENoaWxkKHNbbl0uZWwpO2UuYXBwZW5kQ2hpbGQodGhpcy5lbE1lbnUpLHAuc2V0QXR0cnModGhpcy5lbE1lbnUse2NsYXNzOiJhcGV4Y2hhcnRzLW1lbnUifSk7Zm9yKHZhciByPVt7bmFtZToiZXhwb3J0U1ZHIix0aXRsZTp0aGlzLmxvY2FsZVZhbHVlcy5leHBvcnRUb1NWR30se25hbWU6ImV4cG9ydFBORyIsdGl0bGU6dGhpcy5sb2NhbGVWYWx1ZXMuZXhwb3J0VG9QTkd9XSxvPTA7bzxyLmxlbmd0aDtvKyspdGhpcy5lbE1lbnVJdGVtcy5wdXNoKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSx0aGlzLmVsTWVudUl0ZW1zW29dLmlubmVySFRNTD1yW29dLnRpdGxlLHAuc2V0QXR0cnModGhpcy5lbE1lbnVJdGVtc1tvXSx7Y2xhc3M6ImFwZXhjaGFydHMtbWVudS1pdGVtICIuY29uY2F0KHJbb10ubmFtZSksdGl0bGU6cltvXS50aXRsZX0pLHRoaXMuZWxNZW51LmFwcGVuZENoaWxkKHRoaXMuZWxNZW51SXRlbXNbb10pO3QuZ2xvYmFscy56b29tRW5hYmxlZD90aGlzLmVsWm9vbS5jbGFzc0xpc3QuYWRkKCJzZWxlY3RlZCIpOnQuZ2xvYmFscy5wYW5FbmFibGVkP3RoaXMuZWxQYW4uY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQiKTp0Lmdsb2JhbHMuc2VsZWN0aW9uRW5hYmxlZCYmdGhpcy5lbFNlbGVjdGlvbi5jbGFzc0xpc3QuYWRkKCJzZWxlY3RlZCIpLHRoaXMuYWRkVG9vbGJhckV2ZW50TGlzdGVuZXJzKCl9fSx7a2V5OiJhZGRUb29sYmFyRXZlbnRMaXN0ZW5lcnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmVsWm9vbVJlc2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmhhbmRsZVpvb21SZXNldC5iaW5kKHRoaXMpKSx0aGlzLmVsU2VsZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnRvZ2dsZVNlbGVjdGlvbi5iaW5kKHRoaXMpKSx0aGlzLmVsWm9vbS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy50b2dnbGVab29taW5nLmJpbmQodGhpcykpLHRoaXMuZWxab29tSW4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaGFuZGxlWm9vbUluLmJpbmQodGhpcykpLHRoaXMuZWxab29tT3V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmhhbmRsZVpvb21PdXQuYmluZCh0aGlzKSksdGhpcy5lbFBhbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy50b2dnbGVQYW5uaW5nLmJpbmQodGhpcykpLHRoaXMuZWxNZW51SWNvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy50b2dnbGVNZW51LmJpbmQodGhpcykpLHRoaXMuZWxNZW51SXRlbXMuZm9yRWFjaChmdW5jdGlvbihlKXtlLmNsYXNzTGlzdC5jb250YWlucygiZXhwb3J0U1ZHIik/ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdC5kb3dubG9hZFNWRy5iaW5kKHQpKTplLmNsYXNzTGlzdC5jb250YWlucygiZXhwb3J0UE5HIikmJmUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHQuZG93bmxvYWRQTkcuYmluZCh0KSl9KTtmb3IodmFyIGU9MDtlPHRoaXMudC5jdXN0b21JY29ucy5sZW5ndGg7ZSsrKXRoaXMuZWxDdXN0b21JY29uc1tlXS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy50LmN1c3RvbUljb25zW2VdLmNsaWNrLmJpbmQodGhpcyx0aGlzLmN0eCx0aGlzLmN0eC53KSl9fSx7a2V5OiJ0b2dnbGVTZWxlY3Rpb24iLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy50b2dnbGVPdGhlckNvbnRyb2xzKCksdGhpcy53Lmdsb2JhbHMuc2VsZWN0aW9uRW5hYmxlZD0hdGhpcy53Lmdsb2JhbHMuc2VsZWN0aW9uRW5hYmxlZCx0aGlzLmVsU2VsZWN0aW9uLmNsYXNzTGlzdC5jb250YWlucygic2VsZWN0ZWQiKT90aGlzLmVsU2VsZWN0aW9uLmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIik6dGhpcy5lbFNlbGVjdGlvbi5jbGFzc0xpc3QuYWRkKCJzZWxlY3RlZCIpfX0se2tleToidG9nZ2xlWm9vbWluZyIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZU90aGVyQ29udHJvbHMoKSx0aGlzLncuZ2xvYmFscy56b29tRW5hYmxlZD0hdGhpcy53Lmdsb2JhbHMuem9vbUVuYWJsZWQsdGhpcy5lbFpvb20uY2xhc3NMaXN0LmNvbnRhaW5zKCJzZWxlY3RlZCIpP3RoaXMuZWxab29tLmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIik6dGhpcy5lbFpvb20uY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQiKX19LHtrZXk6ImdldFRvb2xiYXJJY29uc1JlZmVyZW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnc7dGhpcy5lbFpvb218fCh0aGlzLmVsWm9vbT10Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy16b29tLWljb24iKSksdGhpcy5lbFBhbnx8KHRoaXMuZWxQYW49dC5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtcGFuLWljb24iKSksdGhpcy5lbFNlbGVjdGlvbnx8KHRoaXMuZWxTZWxlY3Rpb249dC5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcigiLmFwZXhjaGFydHMtc2VsZWN0aW9uLWljb24iKSl9fSx7a2V5OiJlbmFibGVab29taW5nIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMudG9nZ2xlT3RoZXJDb250cm9scygpLHRoaXMudy5nbG9iYWxzLnpvb21FbmFibGVkPSEwLHRoaXMuZWxab29tJiZ0aGlzLmVsWm9vbS5jbGFzc0xpc3QuYWRkKCJzZWxlY3RlZCIpLHRoaXMuZWxQYW4mJnRoaXMuZWxQYW4uY2xhc3NMaXN0LnJlbW92ZSgic2VsZWN0ZWQiKX19LHtrZXk6ImVuYWJsZVBhbm5pbmciLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy50b2dnbGVPdGhlckNvbnRyb2xzKCksdGhpcy53Lmdsb2JhbHMucGFuRW5hYmxlZD0hMCx0aGlzLmVsUGFuJiZ0aGlzLmVsUGFuLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIiksdGhpcy5lbFpvb20mJnRoaXMuZWxab29tLmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIil9fSx7a2V5OiJ0b2dnbGVQYW5uaW5nIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMudG9nZ2xlT3RoZXJDb250cm9scygpLHRoaXMudy5nbG9iYWxzLnBhbkVuYWJsZWQ9IXRoaXMudy5nbG9iYWxzLnBhbkVuYWJsZWQsdGhpcy5lbFBhbi5jbGFzc0xpc3QuY29udGFpbnMoInNlbGVjdGVkIik/dGhpcy5lbFBhbi5jbGFzc0xpc3QucmVtb3ZlKCJzZWxlY3RlZCIpOnRoaXMuZWxQYW4uY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQiKX19LHtrZXk6InRvZ2dsZU90aGVyQ29udHJvbHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53O3QuZ2xvYmFscy5wYW5FbmFibGVkPSExLHQuZ2xvYmFscy56b29tRW5hYmxlZD0hMSx0Lmdsb2JhbHMuc2VsZWN0aW9uRW5hYmxlZD0hMSx0aGlzLmdldFRvb2xiYXJJY29uc1JlZmVyZW5jZSgpLHRoaXMuZWxQYW4mJnRoaXMuZWxQYW4uY2xhc3NMaXN0LnJlbW92ZSgic2VsZWN0ZWQiKSx0aGlzLmVsU2VsZWN0aW9uJiZ0aGlzLmVsU2VsZWN0aW9uLmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIiksdGhpcy5lbFpvb20mJnRoaXMuZWxab29tLmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIil9fSx7a2V5OiJoYW5kbGVab29tSW4iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53LGU9KHQuZ2xvYmFscy5taW5YK3QuZ2xvYmFscy5tYXhYKS8yLGk9KHQuZ2xvYmFscy5taW5YK2UpLzIscz0odC5nbG9iYWxzLm1heFgrZSkvMjt0Lmdsb2JhbHMuZGlzYWJsZVpvb21Jbnx8dGhpcy56b29tVXBkYXRlT3B0aW9ucyhpLHMpfX0se2tleToiaGFuZGxlWm9vbU91dCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnc7aWYoISgiZGF0ZXRpbWUiPT09dC5jb25maWcueGF4aXMudHlwZSYmbmV3IERhdGUodC5nbG9iYWxzLm1pblgpLmdldFVUQ0Z1bGxZZWFyKCk8MWUzKSl7dmFyIGU9KHQuZ2xvYmFscy5taW5YK3QuZ2xvYmFscy5tYXhYKS8yLGk9dC5nbG9iYWxzLm1pblgtKGUtdC5nbG9iYWxzLm1pblgpLHM9dC5nbG9iYWxzLm1heFgtKGUtdC5nbG9iYWxzLm1heFgpO3QuZ2xvYmFscy5kaXNhYmxlWm9vbU91dHx8dGhpcy56b29tVXBkYXRlT3B0aW9ucyhpLHMpfX19LHtrZXk6Inpvb21VcGRhdGVPcHRpb25zIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudyxzPXttaW46dCxtYXg6ZX0sYT10aGlzLmdldEJlZm9yZVpvb21SYW5nZShzKTthJiYocz1hLnhheGlzKTt2YXIgbj17eGF4aXM6c30scj11LmNsb25lKGkuZ2xvYmFscy5pbml0aWFsQ29uZmlnLnlheGlzKTtpLmNvbmZpZy5jaGFydC56b29tLmF1dG9TY2FsZVlheGlzJiYocj1uZXcgaih0aGlzLmN0eCkuYXV0b1NjYWxlWSh0aGlzLmN0eCxyLHt4YXhpczpzfSkpO2kuY29uZmlnLmNoYXJ0Lmdyb3VwfHwobi55YXhpcz1yKSx0aGlzLncuZ2xvYmFscy56b29tZWQ9ITAsdGhpcy5jdHguX3VwZGF0ZU9wdGlvbnMobiwhMSx0aGlzLncuY29uZmlnLmNoYXJ0LmFuaW1hdGlvbnMuZHluYW1pY0FuaW1hdGlvbi5lbmFibGVkKSx0aGlzLnpvb21DYWxsYmFjayhzLHIpfX0se2tleToiem9vbUNhbGxiYWNrIix2YWx1ZTpmdW5jdGlvbih0LGUpeyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmV2Lnpvb21lZCYmdGhpcy5ldi56b29tZWQodGhpcy5jdHgse3hheGlzOnQseWF4aXM6ZX0pfX0se2tleToiZ2V0QmVmb3JlWm9vbVJhbmdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPW51bGw7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZXYuYmVmb3JlWm9vbSYmKGk9dGhpcy5ldi5iZWZvcmVab29tKHRoaXMse3hheGlzOnQseWF4aXM6ZX0pKSxpfX0se2tleToidG9nZ2xlTWVudSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmVsTWVudS5jbGFzc0xpc3QuY29udGFpbnMoIm9wZW4iKT90aGlzLmVsTWVudS5jbGFzc0xpc3QucmVtb3ZlKCJvcGVuIik6dGhpcy5lbE1lbnUuY2xhc3NMaXN0LmFkZCgib3BlbiIpfX0se2tleToiZG93bmxvYWRQTkciLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG90KHRoaXMuY3R4KTt0LmV4cG9ydFRvUG5nKHRoaXMuY3R4KSx0aGlzLnRvZ2dsZU1lbnUoKX19LHtrZXk6ImRvd25sb2FkU1ZHIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PW5ldyBvdCh0aGlzLmN0eCk7dC5leHBvcnRUb1NWRygpLHRoaXMudG9nZ2xlTWVudSgpfX0se2tleToiaGFuZGxlWm9vbVJlc2V0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuY3R4LmdldFN5bmNlZENoYXJ0cygpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGk9dC53O2kuZ2xvYmFscy5taW5YIT09aS5nbG9iYWxzLmluaXRpYWxtaW5YJiZpLmdsb2JhbHMubWF4WCE9PWkuZ2xvYmFscy5pbml0aWFsbWF4WCYmKHQucmV2ZXJ0RGVmYXVsdEF4aXNNaW5NYXgoKSwiZnVuY3Rpb24iPT10eXBlb2YgaS5jb25maWcuY2hhcnQuZXZlbnRzLnpvb21lZCYmZS56b29tQ2FsbGJhY2soe21pbjppLmNvbmZpZy54YXhpcy5taW4sbWF4OmkuY29uZmlnLnhheGlzLm1heH0pLGkuZ2xvYmFscy56b29tZWQ9ITEsdC5fdXBkYXRlU2VyaWVzKGkuZ2xvYmFscy5pbml0aWFsU2VyaWVzLGkuY29uZmlnLmNoYXJ0LmFuaW1hdGlvbnMuZHluYW1pY0FuaW1hdGlvbi5lbmFibGVkKSl9KX19LHtrZXk6ImRlc3Ryb3kiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5lbFpvb209bnVsbCx0aGlzLmVsWm9vbUluPW51bGwsdGhpcy5lbFpvb21PdXQ9bnVsbCx0aGlzLmVsUGFuPW51bGwsdGhpcy5lbFNlbGVjdGlvbj1udWxsLHRoaXMuZWxab29tUmVzZXQ9bnVsbCx0aGlzLmVsTWVudUljb249bnVsbH19XSksdH0oKSx2dD1mdW5jdGlvbih0KXtmdW5jdGlvbiBpKHQpe3ZhciBzO3JldHVybiBlKHRoaXMsaSksKHM9Yyh0aGlzLGwoaSkuY2FsbCh0aGlzLHQpKSkuY3R4PXQscy53PXQudyxzLmRyYWdnZWQ9ITEscy5ncmFwaGljcz1uZXcgcChzLmN0eCkscy5ldmVudExpc3Q9WyJtb3VzZWRvd24iLCJtb3VzZWxlYXZlIiwibW91c2Vtb3ZlIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsIm1vdXNldXAiLCJ0b3VjaGVuZCJdLHMuY2xpZW50WD0wLHMuY2xpZW50WT0wLHMuc3RhcnRYPTAscy5lbmRYPTAscy5kcmFnWD0wLHMuc3RhcnRZPTAscy5lbmRZPTAscy5kcmFnWT0wLHN9cmV0dXJuIG8oaSxtdCkscyhpLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLGk9dC54eVJhdGlvcyxzPXRoaXMudyxhPXRoaXM7dGhpcy54eVJhdGlvcz1pLHRoaXMuem9vbVJlY3Q9dGhpcy5ncmFwaGljcy5kcmF3UmVjdCgwLDAsMCwwKSx0aGlzLnNlbGVjdGlvblJlY3Q9dGhpcy5ncmFwaGljcy5kcmF3UmVjdCgwLDAsMCwwKSx0aGlzLmdyaWRSZWN0PXMuZ2xvYmFscy5kb20uYmFzZUVsLnF1ZXJ5U2VsZWN0b3IoIi5hcGV4Y2hhcnRzLWdyaWQiKSx0aGlzLnpvb21SZWN0Lm5vZGUuY2xhc3NMaXN0LmFkZCgiYXBleGNoYXJ0cy16b29tLXJlY3QiKSx0aGlzLnNlbGVjdGlvblJlY3Qubm9kZS5jbGFzc0xpc3QuYWRkKCJhcGV4Y2hhcnRzLXNlbGVjdGlvbi1yZWN0Iikscy5nbG9iYWxzLmRvbS5lbEdyYXBoaWNhbC5hZGQodGhpcy56b29tUmVjdCkscy5nbG9iYWxzLmRvbS5lbEdyYXBoaWNhbC5hZGQodGhpcy5zZWxlY3Rpb25SZWN0KSwieCI9PT1zLmNvbmZpZy5jaGFydC5zZWxlY3Rpb24udHlwZT90aGlzLnNsRHJhZ2dhYmxlUmVjdD10aGlzLnNlbGVjdGlvblJlY3QuZHJhZ2dhYmxlKHttaW5YOjAsbWluWTowLG1heFg6cy5nbG9iYWxzLmdyaWRXaWR0aCxtYXhZOnMuZ2xvYmFscy5ncmlkSGVpZ2h0fSkub24oImRyYWdtb3ZlIix0aGlzLnNlbGVjdGlvbkRyYWdnaW5nLmJpbmQodGhpcywiZHJhZ2dpbmciKSk6InkiPT09cy5jb25maWcuY2hhcnQuc2VsZWN0aW9uLnR5cGU/dGhpcy5zbERyYWdnYWJsZVJlY3Q9dGhpcy5zZWxlY3Rpb25SZWN0LmRyYWdnYWJsZSh7bWluWDowLG1heFg6cy5nbG9iYWxzLmdyaWRXaWR0aH0pLm9uKCJkcmFnbW92ZSIsdGhpcy5zZWxlY3Rpb25EcmFnZ2luZy5iaW5kKHRoaXMsImRyYWdnaW5nIikpOnRoaXMuc2xEcmFnZ2FibGVSZWN0PXRoaXMuc2VsZWN0aW9uUmVjdC5kcmFnZ2FibGUoKS5vbigiZHJhZ21vdmUiLHRoaXMuc2VsZWN0aW9uRHJhZ2dpbmcuYmluZCh0aGlzLCJkcmFnZ2luZyIpKSx0aGlzLnByZXNlbGVjdGVkU2VsZWN0aW9uKCksdGhpcy5ob3ZlckFyZWE9cy5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcihzLmdsb2JhbHMuY2hhcnRDbGFzcyksdGhpcy5ob3ZlckFyZWEuY2xhc3NMaXN0LmFkZCgiem9vbWFibGUiKSx0aGlzLmV2ZW50TGlzdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UuaG92ZXJBcmVhLmFkZEV2ZW50TGlzdGVuZXIodCxhLnN2Z01vdXNlRXZlbnRzLmJpbmQoYSxpKSx7Y2FwdHVyZTohMSxwYXNzaXZlOiEwfSl9KX19LHtrZXk6ImRlc3Ryb3kiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5zbERyYWdnYWJsZVJlY3QmJih0aGlzLnNsRHJhZ2dhYmxlUmVjdC5kcmFnZ2FibGUoITEpLHRoaXMuc2xEcmFnZ2FibGVSZWN0Lm9mZigpLHRoaXMuc2VsZWN0aW9uUmVjdC5vZmYoKSksdGhpcy5zZWxlY3Rpb25SZWN0PW51bGwsdGhpcy56b29tUmVjdD1udWxsLHRoaXMuZ3JpZFJlY3Q9bnVsbH19LHtrZXk6InN2Z01vdXNlRXZlbnRzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudyxzPXRoaXMsYT10aGlzLmN0eC50b29sYmFyLG49aS5nbG9iYWxzLnpvb21FbmFibGVkP2kuY29uZmlnLmNoYXJ0Lnpvb20udHlwZTppLmNvbmZpZy5jaGFydC5zZWxlY3Rpb24udHlwZTtpZihlLnNoaWZ0S2V5Pyh0aGlzLnNoaWZ0V2FzUHJlc3NlZD0hMCxhLmVuYWJsZVBhbm5pbmcoKSk6dGhpcy5zaGlmdFdhc1ByZXNzZWQmJihhLmVuYWJsZVpvb21pbmcoKSx0aGlzLnNoaWZ0V2FzUHJlc3NlZD0hMSksIShlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImFwZXhjaGFydHMtc2VsZWN0aW9uLXJlY3QiKXx8ZS50YXJnZXQucGFyZW50Tm9kZS5jbGFzc0xpc3QuY29udGFpbnMoImFwZXhjaGFydHMtdG9vbGJhciIpKSl7aWYocy5jbGllbnRYPSJ0b3VjaG1vdmUiPT09ZS50eXBlfHwidG91Y2hzdGFydCI9PT1lLnR5cGU/ZS50b3VjaGVzWzBdLmNsaWVudFg6InRvdWNoZW5kIj09PWUudHlwZT9lLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg6ZS5jbGllbnRYLHMuY2xpZW50WT0idG91Y2htb3ZlIj09PWUudHlwZXx8InRvdWNoc3RhcnQiPT09ZS50eXBlP2UudG91Y2hlc1swXS5jbGllbnRZOiJ0b3VjaGVuZCI9PT1lLnR5cGU/ZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZOmUuY2xpZW50WSwibW91c2Vkb3duIj09PWUudHlwZSYmMT09PWUud2hpY2gpe3ZhciByPXMuZ3JpZFJlY3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cy5zdGFydFg9cy5jbGllbnRYLXIubGVmdCxzLnN0YXJ0WT1zLmNsaWVudFktci50b3Ascy5kcmFnZ2VkPSExLHMudy5nbG9iYWxzLm1vdXNlZG93bj0hMH1pZigoIm1vdXNlbW92ZSI9PT1lLnR5cGUmJjE9PT1lLndoaWNofHwidG91Y2htb3ZlIj09PWUudHlwZSkmJihzLmRyYWdnZWQ9ITAsaS5nbG9iYWxzLnBhbkVuYWJsZWQ/KGkuZ2xvYmFscy5zZWxlY3Rpb249bnVsbCxzLncuZ2xvYmFscy5tb3VzZWRvd24mJnMucGFuRHJhZ2dpbmcoe2NvbnRleHQ6cyx6b29tdHlwZTpuLHh5UmF0aW9zOnR9KSk6KHMudy5nbG9iYWxzLm1vdXNlZG93biYmaS5nbG9iYWxzLnpvb21FbmFibGVkfHxzLncuZ2xvYmFscy5tb3VzZWRvd24mJmkuZ2xvYmFscy5zZWxlY3Rpb25FbmFibGVkKSYmKHMuc2VsZWN0aW9uPXMuc2VsZWN0aW9uRHJhd2luZyh7Y29udGV4dDpzLHpvb210eXBlOm59KSkpLCJtb3VzZXVwIj09PWUudHlwZXx8InRvdWNoZW5kIj09PWUudHlwZXx8Im1vdXNlbGVhdmUiPT09ZS50eXBlKXt2YXIgbz1zLmdyaWRSZWN0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3Mudy5nbG9iYWxzLm1vdXNlZG93biYmKHMuZW5kWD1zLmNsaWVudFgtby5sZWZ0LHMuZW5kWT1zLmNsaWVudFktby50b3Ascy5kcmFnWD1NYXRoLmFicyhzLmVuZFgtcy5zdGFydFgpLHMuZHJhZ1k9TWF0aC5hYnMocy5lbmRZLXMuc3RhcnRZKSwoaS5nbG9iYWxzLnpvb21FbmFibGVkfHxpLmdsb2JhbHMuc2VsZWN0aW9uRW5hYmxlZCkmJnMuc2VsZWN0aW9uRHJhd24oe2NvbnRleHQ6cyx6b29tdHlwZTpufSkpLGkuZ2xvYmFscy56b29tRW5hYmxlZCYmcy5oaWRlU2VsZWN0aW9uUmVjdCh0aGlzLnNlbGVjdGlvblJlY3QpLHMuZHJhZ2dlZD0hMSxzLncuZ2xvYmFscy5tb3VzZWRvd249ITF9dGhpcy5tYWtlU2VsZWN0aW9uUmVjdERyYWdnYWJsZSgpfX19LHtrZXk6Im1ha2VTZWxlY3Rpb25SZWN0RHJhZ2dhYmxlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudztpZih0aGlzLnNlbGVjdGlvblJlY3Qpe3ZhciBlPXRoaXMuc2VsZWN0aW9uUmVjdC5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Uud2lkdGg+MCYmZS5oZWlnaHQ+MCYmdGhpcy5zbERyYWdnYWJsZVJlY3Quc2VsZWN0aXplKCkucmVzaXplKHtjb25zdHJhaW50OnttaW5YOjAsbWluWTowLG1heFg6dC5nbG9iYWxzLmdyaWRXaWR0aCxtYXhZOnQuZ2xvYmFscy5ncmlkSGVpZ2h0fX0pLm9uKCJyZXNpemluZyIsdGhpcy5zZWxlY3Rpb25EcmFnZ2luZy5iaW5kKHRoaXMsInJlc2l6aW5nIikpfX19LHtrZXk6InByZXNlbGVjdGVkU2VsZWN0aW9uIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMudyxlPXRoaXMueHlSYXRpb3M7aWYoIXQuZ2xvYmFscy56b29tRW5hYmxlZClpZih2b2lkIDAhPT10Lmdsb2JhbHMuc2VsZWN0aW9uJiZudWxsIT09dC5nbG9iYWxzLnNlbGVjdGlvbil0aGlzLmRyYXdTZWxlY3Rpb25SZWN0KHQuZ2xvYmFscy5zZWxlY3Rpb24pO2Vsc2UgaWYodm9pZCAwIT09dC5jb25maWcuY2hhcnQuc2VsZWN0aW9uLnhheGlzLm1pbiYmdm9pZCAwIT09dC5jb25maWcuY2hhcnQuc2VsZWN0aW9uLnhheGlzLm1heCl7dmFyIGk9KHQuY29uZmlnLmNoYXJ0LnNlbGVjdGlvbi54YXhpcy5taW4tdC5nbG9iYWxzLm1pblgpL2UueFJhdGlvLHM9e3g6aSx5OjAsd2lkdGg6dC5nbG9iYWxzLmdyaWRXaWR0aC0odC5nbG9iYWxzLm1heFgtdC5jb25maWcuY2hhcnQuc2VsZWN0aW9uLnhheGlzLm1heCkvZS54UmF0aW8taSxoZWlnaHQ6dC5nbG9iYWxzLmdyaWRIZWlnaHQsdHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxzZWxlY3Rpb25FbmFibGVkOiEwfTt0aGlzLmRyYXdTZWxlY3Rpb25SZWN0KHMpLHRoaXMubWFrZVNlbGVjdGlvblJlY3REcmFnZ2FibGUoKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25maWcuY2hhcnQuZXZlbnRzLnNlbGVjdGlvbiYmdC5jb25maWcuY2hhcnQuZXZlbnRzLnNlbGVjdGlvbih0aGlzLmN0eCx7eGF4aXM6e21pbjp0LmNvbmZpZy5jaGFydC5zZWxlY3Rpb24ueGF4aXMubWluLG1heDp0LmNvbmZpZy5jaGFydC5zZWxlY3Rpb24ueGF4aXMubWF4fSx5YXhpczp7fX0pfX19LHtrZXk6ImRyYXdTZWxlY3Rpb25SZWN0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10LngsaT10Lnkscz10LndpZHRoLGE9dC5oZWlnaHQsbj10LnRyYW5zbGF0ZVgscj10LnRyYW5zbGF0ZVksbz10aGlzLncsbD10aGlzLnpvb21SZWN0LGg9dGhpcy5zZWxlY3Rpb25SZWN0O2lmKHRoaXMuZHJhZ2dlZHx8bnVsbCE9PW8uZ2xvYmFscy5zZWxlY3Rpb24pe3ZhciBjPXt0cmFuc2Zvcm06InRyYW5zbGF0ZSgiK24rIiwgIityKyIpIn07by5nbG9iYWxzLnpvb21FbmFibGVkJiZ0aGlzLmRyYWdnZWQmJihsLmF0dHIoe3g6ZSx5Omksd2lkdGg6cyxoZWlnaHQ6YSxmaWxsOm8uY29uZmlnLmNoYXJ0Lnpvb20uem9vbWVkQXJlYS5maWxsLmNvbG9yLCJmaWxsLW9wYWNpdHkiOm8uY29uZmlnLmNoYXJ0Lnpvb20uem9vbWVkQXJlYS5maWxsLm9wYWNpdHksc3Ryb2tlOm8uY29uZmlnLmNoYXJ0Lnpvb20uem9vbWVkQXJlYS5zdHJva2UuY29sb3IsInN0cm9rZS13aWR0aCI6by5jb25maWcuY2hhcnQuem9vbS56b29tZWRBcmVhLnN0cm9rZS53aWR0aCwic3Ryb2tlLW9wYWNpdHkiOm8uY29uZmlnLmNoYXJ0Lnpvb20uem9vbWVkQXJlYS5zdHJva2Uub3BhY2l0eX0pLHAuc2V0QXR0cnMobC5ub2RlLGMpKSxvLmdsb2JhbHMuc2VsZWN0aW9uRW5hYmxlZCYmKGguYXR0cih7eDplLHk6aSx3aWR0aDpzPjA/czowLGhlaWdodDphPjA/YTowLGZpbGw6by5jb25maWcuY2hhcnQuc2VsZWN0aW9uLmZpbGwuY29sb3IsImZpbGwtb3BhY2l0eSI6by5jb25maWcuY2hhcnQuc2VsZWN0aW9uLmZpbGwub3BhY2l0eSxzdHJva2U6by5jb25maWcuY2hhcnQuc2VsZWN0aW9uLnN0cm9rZS5jb2xvciwic3Ryb2tlLXdpZHRoIjpvLmNvbmZpZy5jaGFydC5zZWxlY3Rpb24uc3Ryb2tlLndpZHRoLCJzdHJva2UtZGFzaGFycmF5IjpvLmNvbmZpZy5jaGFydC5zZWxlY3Rpb24uc3Ryb2tlLmRhc2hBcnJheSwic3Ryb2tlLW9wYWNpdHkiOm8uY29uZmlnLmNoYXJ0LnNlbGVjdGlvbi5zdHJva2Uub3BhY2l0eX0pLHAuc2V0QXR0cnMoaC5ub2RlLGMpKX19fSx7a2V5OiJoaWRlU2VsZWN0aW9uUmVjdCIsdmFsdWU6ZnVuY3Rpb24odCl7dCYmdC5hdHRyKHt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9KX19LHtrZXk6InNlbGVjdGlvbkRyYXdpbmciLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuY29udGV4dCxpPXQuem9vbXR5cGUscz10aGlzLncsYT1lLG49dGhpcy5ncmlkUmVjdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxyPWEuc3RhcnRYLTEsbz1hLnN0YXJ0WSxsPWEuY2xpZW50WC1uLmxlZnQtcixoPWEuY2xpZW50WS1uLnRvcC1vLGM9MCxkPTAsdT17fTtyZXR1cm4gTWF0aC5hYnMobCtyKT5zLmdsb2JhbHMuZ3JpZFdpZHRoP2w9cy5nbG9iYWxzLmdyaWRXaWR0aC1yOmEuY2xpZW50WC1uLmxlZnQ8MCYmKGw9cikscj5hLmNsaWVudFgtbi5sZWZ0JiYoYz0tKGw9TWF0aC5hYnMobCkpKSxvPmEuY2xpZW50WS1uLnRvcCYmKGQ9LShoPU1hdGguYWJzKGgpKSksdT0ieCI9PT1pP3t4OnIseTowLHdpZHRoOmwsaGVpZ2h0OnMuZ2xvYmFscy5ncmlkSGVpZ2h0LHRyYW5zbGF0ZVg6Yyx0cmFuc2xhdGVZOjB9OiJ5Ij09PWk/e3g6MCx5Om8sd2lkdGg6cy5nbG9iYWxzLmdyaWRXaWR0aCxoZWlnaHQ6aCx0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTpkfTp7eDpyLHk6byx3aWR0aDpsLGhlaWdodDpoLHRyYW5zbGF0ZVg6Yyx0cmFuc2xhdGVZOmR9LGEuZHJhd1NlbGVjdGlvblJlY3QodSksYS5zZWxlY3Rpb25EcmFnZ2luZygicmVzaXppbmciKSx1fX0se2tleToic2VsZWN0aW9uRHJhZ2dpbmciLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcyxzPXRoaXMudyxhPXRoaXMueHlSYXRpb3Msbj10aGlzLnNlbGVjdGlvblJlY3Qscj0wOyJyZXNpemluZyI9PT10JiYocj0zMCksImZ1bmN0aW9uIj09dHlwZW9mIHMuY29uZmlnLmNoYXJ0LmV2ZW50cy5zZWxlY3Rpb24mJnMuZ2xvYmFscy5zZWxlY3Rpb25FbmFibGVkJiYoY2xlYXJUaW1lb3V0KHRoaXMudy5nbG9iYWxzLnNlbGVjdGlvblJlc2l6ZVRpbWVyKSx0aGlzLncuZ2xvYmFscy5zZWxlY3Rpb25SZXNpemVUaW1lcj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciB0PWkuZ3JpZFJlY3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZT1uLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj1zLmdsb2JhbHMueEF4aXNTY2FsZS5uaWNlTWluKyhlLmxlZnQtdC5sZWZ0KSphLnhSYXRpbyxvPXMuZ2xvYmFscy54QXhpc1NjYWxlLm5pY2VNaW4rKGUucmlnaHQtdC5sZWZ0KSphLnhSYXRpbyxsPXMuZ2xvYmFscy55QXhpc1NjYWxlWzBdLm5pY2VNaW4rKHQuYm90dG9tLWUuYm90dG9tKSphLnlSYXRpb1swXSxoPXMuZ2xvYmFscy55QXhpc1NjYWxlWzBdLm5pY2VNYXgtKGUudG9wLXQudG9wKSphLnlSYXRpb1swXTtzLmNvbmZpZy5jaGFydC5ldmVudHMuc2VsZWN0aW9uKGkuY3R4LHt4YXhpczp7bWluOnIsbWF4Om99LHlheGlzOnttaW46bCxtYXg6aH19KX0scikpfX0se2tleToic2VsZWN0aW9uRHJhd24iLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuY29udGV4dCxpPXQuem9vbXR5cGUscz10aGlzLncsYT1lLG49dGhpcy54eVJhdGlvcyxyPXRoaXMuY3R4LnRvb2xiYXI7aWYoYS5zdGFydFg+YS5lbmRYKXt2YXIgbz1hLnN0YXJ0WDthLnN0YXJ0WD1hLmVuZFgsYS5lbmRYPW99aWYoYS5zdGFydFk+YS5lbmRZKXt2YXIgbD1hLnN0YXJ0WTthLnN0YXJ0WT1hLmVuZFksYS5lbmRZPWx9dmFyIGg9cy5nbG9iYWxzLnhBeGlzU2NhbGUubmljZU1pbithLnN0YXJ0WCpuLnhSYXRpbyxjPXMuZ2xvYmFscy54QXhpc1NjYWxlLm5pY2VNaW4rYS5lbmRYKm4ueFJhdGlvLGQ9W10sZz1bXTtpZihzLmNvbmZpZy55YXhpcy5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7ZC5wdXNoKE1hdGguZmxvb3Iocy5nbG9iYWxzLnlBeGlzU2NhbGVbZV0ubmljZU1heC1uLnlSYXRpb1tlXSphLnN0YXJ0WSkpLGcucHVzaChNYXRoLmZsb29yKHMuZ2xvYmFscy55QXhpc1NjYWxlW2VdLm5pY2VNYXgtbi55UmF0aW9bZV0qYS5lbmRZKSl9KSxhLmRyYWdnZWQmJihhLmRyYWdYPjEwfHxhLmRyYWdZPjEwKSYmaCE9PWMpaWYocy5nbG9iYWxzLnpvb21FbmFibGVkKXt2YXIgZj11LmNsb25lKHMuZ2xvYmFscy5pbml0aWFsQ29uZmlnLnlheGlzKTtzLmdsb2JhbHMuem9vbWVkfHwocy5nbG9iYWxzLmxhc3RYQXhpcz11LmNsb25lKHMuY29uZmlnLnhheGlzKSxzLmdsb2JhbHMubGFzdFlBeGlzPXUuY2xvbmUocy5jb25maWcueWF4aXMpKTt2YXIgcD17bWluOmgsbWF4OmN9O2lmKCJ4eSIhPT1pJiYieSIhPT1pfHxmLmZvckVhY2goZnVuY3Rpb24odCxlKXtmW2VdLm1pbj1nW2VdLGZbZV0ubWF4PWRbZV19KSxzLmNvbmZpZy5jaGFydC56b29tLmF1dG9TY2FsZVlheGlzKXt2YXIgeD1uZXcgaihhLmN0eCk7Zj14LmF1dG9TY2FsZVkoYS5jdHgsZix7eGF4aXM6cH0pfWlmKHIpe3ZhciBiPXIuZ2V0QmVmb3JlWm9vbVJhbmdlKHAsZik7YiYmKHA9Yi54YXhpcz9iLnhheGlzOnAsZj1iLnlheGlzP2IueWF4ZTpmKX12YXIgbT17eGF4aXM6cH07cy5jb25maWcuY2hhcnQuZ3JvdXB8fChtLnlheGlzPWYpLGEuY3R4Ll91cGRhdGVPcHRpb25zKG0sITEsYS53LmNvbmZpZy5jaGFydC5hbmltYXRpb25zLmR5bmFtaWNBbmltYXRpb24uZW5hYmxlZCksImZ1bmN0aW9uIj09dHlwZW9mIHMuY29uZmlnLmNoYXJ0LmV2ZW50cy56b29tZWQmJnIuem9vbUNhbGxiYWNrKHAsZikscy5nbG9iYWxzLnpvb21lZD0hMH1lbHNlIGlmKHMuZ2xvYmFscy5zZWxlY3Rpb25FbmFibGVkKXt2YXIgdix5PW51bGw7dj17bWluOmgsbWF4OmN9LCJ4eSIhPT1pJiYieSIhPT1pfHwoeT11LmNsb25lKHMuY29uZmlnLnlheGlzKSkuZm9yRWFjaChmdW5jdGlvbih0LGUpe3lbZV0ubWluPWdbZV0seVtlXS5tYXg9ZFtlXX0pLHMuZ2xvYmFscy5zZWxlY3Rpb249YS5zZWxlY3Rpb24sImZ1bmN0aW9uIj09dHlwZW9mIHMuY29uZmlnLmNoYXJ0LmV2ZW50cy5zZWxlY3Rpb24mJnMuY29uZmlnLmNoYXJ0LmV2ZW50cy5zZWxlY3Rpb24oYS5jdHgse3hheGlzOnYseWF4aXM6eX0pfX19LHtrZXk6InBhbkRyYWdnaW5nIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxpPXQuY29udGV4dCxzPXRoaXMudyxhPWk7aWYodm9pZCAwIT09cy5nbG9iYWxzLmxhc3RDbGllbnRQb3NpdGlvbi54KXt2YXIgbj1zLmdsb2JhbHMubGFzdENsaWVudFBvc2l0aW9uLngtYS5jbGllbnRYLHI9cy5nbG9iYWxzLmxhc3RDbGllbnRQb3NpdGlvbi55LWEuY2xpZW50WTtNYXRoLmFicyhuKT5NYXRoLmFicyhyKSYmbj4wP2U9ImxlZnQiOk1hdGguYWJzKG4pPk1hdGguYWJzKHIpJiZuPDA/ZT0icmlnaHQiOk1hdGguYWJzKHIpPk1hdGguYWJzKG4pJiZyPjA/ZT0idXAiOk1hdGguYWJzKHIpPk1hdGguYWJzKG4pJiZyPDAmJihlPSJkb3duIil9cy5nbG9iYWxzLmxhc3RDbGllbnRQb3NpdGlvbj17eDphLmNsaWVudFgseTphLmNsaWVudFl9O3ZhciBvPXMuZ2xvYmFscy5taW5YLGw9cy5nbG9iYWxzLm1heFg7YS5wYW5TY3JvbGxlZChlLG8sbCl9fSx7a2V5OiJwYW5TY3JvbGxlZCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBzPXRoaXMudyxhPXRoaXMueHlSYXRpb3Msbj11LmNsb25lKHMuZ2xvYmFscy5pbml0aWFsQ29uZmlnLnlheGlzKTsibGVmdCI9PT10PyhlPXMuZ2xvYmFscy5taW5YK3MuZ2xvYmFscy5ncmlkV2lkdGgvMTUqYS54UmF0aW8saT1zLmdsb2JhbHMubWF4WCtzLmdsb2JhbHMuZ3JpZFdpZHRoLzE1KmEueFJhdGlvKToicmlnaHQiPT09dCYmKGU9cy5nbG9iYWxzLm1pblgtcy5nbG9iYWxzLmdyaWRXaWR0aC8xNSphLnhSYXRpbyxpPXMuZ2xvYmFscy5tYXhYLXMuZ2xvYmFscy5ncmlkV2lkdGgvMTUqYS54UmF0aW8pLChlPHMuZ2xvYmFscy5pbml0aWFsbWluWHx8aT5zLmdsb2JhbHMuaW5pdGlhbG1heFgpJiYoZT1zLmdsb2JhbHMubWluWCxpPXMuZ2xvYmFscy5tYXhYKTt2YXIgcj17bWluOmUsbWF4Oml9O3MuY29uZmlnLmNoYXJ0Lnpvb20uYXV0b1NjYWxlWWF4aXMmJihuPW5ldyBqKHRoaXMuY3R4KS5hdXRvU2NhbGVZKHRoaXMuY3R4LG4se3hheGlzOnJ9KSk7dmFyIG89e3hheGlzOnttaW46ZSxtYXg6aX19O3MuY29uZmlnLmNoYXJ0Lmdyb3VwfHwoby55YXhpcz1uKSx0aGlzLmN0eC5fdXBkYXRlT3B0aW9ucyhvLCExLCExKSwiZnVuY3Rpb24iPT10eXBlb2Ygcy5jb25maWcuY2hhcnQuZXZlbnRzLnNjcm9sbGVkJiZzLmNvbmZpZy5jaGFydC5ldmVudHMuc2Nyb2xsZWQodGhpcy5jdHgse3hheGlzOnttaW46ZSxtYXg6aX19KX19XSksaX0oKSx5dD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaSl7ZSh0aGlzLHQpLHRoaXMuY3R4PWksdGhpcy53PWkud31yZXR1cm4gcyh0LFt7a2V5OiJkcmF3Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZHJhd1RpdGxlU3VidGl0bGUoInRpdGxlIiksdGhpcy5kcmF3VGl0bGVTdWJ0aXRsZSgic3VidGl0bGUiKX19LHtrZXk6ImRyYXdUaXRsZVN1YnRpdGxlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLncsaT0idGl0bGUiPT09dD9lLmNvbmZpZy50aXRsZTplLmNvbmZpZy5zdWJ0aXRsZSxzPWUuZ2xvYmFscy5zdmdXaWR0aC8yLGE9aS5vZmZzZXRZLG49Im1pZGRsZSI7aWYoImxlZnQiPT09aS5hbGlnbj8ocz0xMCxuPSJzdGFydCIpOiJyaWdodCI9PT1pLmFsaWduJiYocz1lLmdsb2JhbHMuc3ZnV2lkdGgtMTAsbj0iZW5kIikscys9aS5vZmZzZXRYLGE9YStwYXJzZUludChpLnN0eWxlLmZvbnRTaXplKSsyLHZvaWQgMCE9PWkudGV4dCl7dmFyIHI9bmV3IHAodGhpcy5jdHgpLmRyYXdUZXh0KHt4OnMseTphLHRleHQ6aS50ZXh0LHRleHRBbmNob3I6bixmb250U2l6ZTppLnN0eWxlLmZvbnRTaXplLGZvbnRGYW1pbHk6aS5zdHlsZS5mb250RmFtaWx5LGZvcmVDb2xvcjppLnN0eWxlLmNvbG9yLG9wYWNpdHk6MX0pO3Iubm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwiYXBleGNoYXJ0cy0iLmNvbmNhdCh0LCItdGV4dCIpKSxlLmdsb2JhbHMuZG9tLlBhcGVyLmFkZChyKX19fV0pLHR9KCk7bnQ9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnZvaWQgMCxydD1mdW5jdGlvbihlLGkpe3ZhciBzPSh2b2lkIDAhPT10aGlzP3RoaXM6ZSkuU1ZHPWZ1bmN0aW9uKHQpe2lmKHMuc3VwcG9ydGVkKXJldHVybiB0PW5ldyBzLkRvYyh0KSxzLnBhcnNlci5kcmF3fHxzLnByZXBhcmUoKSx0fTtpZihzLm5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIscy54bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iLHMueGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHMuc3ZnanM9Imh0dHA6Ly9zdmdqcy5jb20vc3ZnanMiLHMuc3VwcG9ydGVkPSEwLCFzLnN1cHBvcnRlZClyZXR1cm4hMTtzLmRpZD0xZTMscy5laWQ9ZnVuY3Rpb24odCl7cmV0dXJuIlN2Z2pzIitkKHQpK3MuZGlkKyt9LHMuY3JlYXRlPWZ1bmN0aW9uKHQpe3ZhciBlPWkuY3JlYXRlRWxlbWVudE5TKHRoaXMubnMsdCk7cmV0dXJuIGUuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5laWQodCkpLGV9LHMuZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIHQsZSxpLGE7Zm9yKGU9KHQ9W10uc2xpY2UuY2FsbChhcmd1bWVudHMpKS5wb3AoKSxhPXQubGVuZ3RoLTE7YT49MDthLS0paWYodFthXSlmb3IoaSBpbiBlKXRbYV0ucHJvdG90eXBlW2ldPWVbaV07cy5TZXQmJnMuU2V0LmluaGVyaXQmJnMuU2V0LmluaGVyaXQoKX0scy5pbnZlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQuY3JlYXRlP3QuY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMscy5jcmVhdGUodC5jcmVhdGUpKX07cmV0dXJuIHQuaW5oZXJpdCYmKGUucHJvdG90eXBlPW5ldyB0LmluaGVyaXQpLHQuZXh0ZW5kJiZzLmV4dGVuZChlLHQuZXh0ZW5kKSx0LmNvbnN0cnVjdCYmcy5leHRlbmQodC5wYXJlbnR8fHMuQ29udGFpbmVyLHQuY29uc3RydWN0KSxlfSxzLmFkb3B0PWZ1bmN0aW9uKHQpe3JldHVybiB0P3QuaW5zdGFuY2U/dC5pbnN0YW5jZTooKGk9InN2ZyI9PXQubm9kZU5hbWU/dC5wYXJlbnROb2RlIGluc3RhbmNlb2YgZS5TVkdFbGVtZW50P25ldyBzLk5lc3RlZDpuZXcgcy5Eb2M6ImxpbmVhckdyYWRpZW50Ij09dC5ub2RlTmFtZT9uZXcgcy5HcmFkaWVudCgibGluZWFyIik6InJhZGlhbEdyYWRpZW50Ij09dC5ub2RlTmFtZT9uZXcgcy5HcmFkaWVudCgicmFkaWFsIik6c1tkKHQubm9kZU5hbWUpXT9uZXcoc1tkKHQubm9kZU5hbWUpXSk6bmV3IHMuRWxlbWVudCh0KSkudHlwZT10Lm5vZGVOYW1lLGkubm9kZT10LHQuaW5zdGFuY2U9aSxpIGluc3RhbmNlb2Ygcy5Eb2MmJmkubmFtZXNwYWNlKCkuZGVmcygpLGkuc2V0RGF0YShKU09OLnBhcnNlKHQuZ2V0QXR0cmlidXRlKCJzdmdqczpkYXRhIikpfHx7fSksaSk6bnVsbDt2YXIgaX0scy5wcmVwYXJlPWZ1bmN0aW9uKCl7dmFyIHQ9aS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGU9KHQ/bmV3IHMuRG9jKHQpOnMuYWRvcHQoaS5kb2N1bWVudEVsZW1lbnQpLm5lc3RlZCgpKS5zaXplKDIsMCk7cy5wYXJzZXI9e2JvZHk6dHx8aS5kb2N1bWVudEVsZW1lbnQsZHJhdzplLnN0eWxlKCJvcGFjaXR5OjA7cG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTAwJTt0b3A6LTEwMCU7b3ZlcmZsb3c6aGlkZGVuIikubm9kZSxwb2x5OmUucG9seWxpbmUoKS5ub2RlLHBhdGg6ZS5wYXRoKCkubm9kZSxuYXRpdmU6cy5jcmVhdGUoInN2ZyIpfX0scy5wYXJzZXI9e25hdGl2ZTpzLmNyZWF0ZSgic3ZnIil9LGkuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZnVuY3Rpb24oKXtzLnBhcnNlci5kcmF3fHxzLnByZXBhcmUoKX0sITEpLHMucmVnZXg9e251bWJlckFuZFVuaXQ6L14oWystXT8oXGQrKFwuXGQqKT98XC5cZCspKGVbKy1dP1xkKyk/KShbYS16JV0qKSQvaSxoZXg6L14jPyhbYS1mXGRdezJ9KShbYS1mXGRdezJ9KShbYS1mXGRdezJ9KSQvaSxyZ2I6L3JnYlwoKFxkKyksKFxkKyksKFxkKylcKS8scmVmZXJlbmNlOi8jKFthLXowLTlcLV9dKykvaSx0cmFuc2Zvcm1zOi9cKVxzKiw/XHMqLyx3aGl0ZXNwYWNlOi9ccy9nLGlzSGV4Oi9eI1thLWYwLTldezMsNn0kL2ksaXNSZ2I6L15yZ2JcKC8saXNDc3M6L1teOl0rOlteO10rOz8vLGlzQmxhbms6L14oXHMrKT8kLyxpc051bWJlcjovXlsrLV0/KFxkKyhcLlxkKik/fFwuXGQrKShlWystXT9cZCspPyQvaSxpc1BlcmNlbnQ6L14tP1tcZFwuXSslJC8saXNJbWFnZTovXC4oanBnfGpwZWd8cG5nfGdpZnxzdmcpKFw/W149XSsuKik/L2ksZGVsaW1pdGVyOi9bXHMsXSsvLGh5cGhlbjovKFteZV0pXC0vZ2kscGF0aExldHRlcnM6L1tNTEhWQ1NRVEFaXS9naSxpc1BhdGhMZXR0ZXI6L1tNTEhWQ1NRVEFaXS9pLG51bWJlcnNXaXRoRG90czovKChcZD9cLlxkKyg/OmVbKy1dP1xkKyk/KSgoPzpcLlxkKyg/OmVbKy1dP1xkKyk/KSspKSsvZ2ksZG90czovXC4vZ30scy51dGlscz17bWFwOmZ1bmN0aW9uKHQsZSl7dmFyIGkscz10Lmxlbmd0aCxhPVtdO2ZvcihpPTA7aTxzO2krKylhLnB1c2goZSh0W2ldKSk7cmV0dXJuIGF9LGZpbHRlcjpmdW5jdGlvbih0LGUpe3ZhciBpLHM9dC5sZW5ndGgsYT1bXTtmb3IoaT0wO2k8cztpKyspZSh0W2ldKSYmYS5wdXNoKHRbaV0pO3JldHVybiBhfSxyYWRpYW5zOmZ1bmN0aW9uKHQpe3JldHVybiB0JTM2MCpNYXRoLlBJLzE4MH0sZGVncmVlczpmdW5jdGlvbih0KXtyZXR1cm4gMTgwKnQvTWF0aC5QSSUzNjB9LGZpbHRlclNWR0VsZW1lbnRzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbHRlcih0LGZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgZS5TVkdFbGVtZW50fSl9fSxzLmRlZmF1bHRzPXthdHRyczp7ImZpbGwtb3BhY2l0eSI6MSwic3Ryb2tlLW9wYWNpdHkiOjEsInN0cm9rZS13aWR0aCI6MCwic3Ryb2tlLWxpbmVqb2luIjoibWl0ZXIiLCJzdHJva2UtbGluZWNhcCI6ImJ1dHQiLGZpbGw6IiMwMDAwMDAiLHN0cm9rZToiIzAwMDAwMCIsb3BhY2l0eToxLHg6MCx5OjAsY3g6MCxjeTowLHdpZHRoOjAsaGVpZ2h0OjAscjowLHJ4OjAscnk6MCxvZmZzZXQ6MCwic3RvcC1vcGFjaXR5IjoxLCJzdG9wLWNvbG9yIjoiIzAwMDAwMCIsImZvbnQtc2l6ZSI6MTYsImZvbnQtZmFtaWx5IjoiSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiIsInRleHQtYW5jaG9yIjoic3RhcnQifX0scy5Db2xvcj1mdW5jdGlvbihlKXt2YXIgaSxhOyh0aGlzLnI9MCx0aGlzLmc9MCx0aGlzLmI9MCxlKSYmKCJzdHJpbmciPT10eXBlb2YgZT9zLnJlZ2V4LmlzUmdiLnRlc3QoZSk/KGk9cy5yZWdleC5yZ2IuZXhlYyhlLnJlcGxhY2Uocy5yZWdleC53aGl0ZXNwYWNlLCIiKSksdGhpcy5yPXBhcnNlSW50KGlbMV0pLHRoaXMuZz1wYXJzZUludChpWzJdKSx0aGlzLmI9cGFyc2VJbnQoaVszXSkpOnMucmVnZXguaXNIZXgudGVzdChlKSYmKGk9cy5yZWdleC5oZXguZXhlYyg0PT0oYT1lKS5sZW5ndGg/WyIjIixhLnN1YnN0cmluZygxLDIpLGEuc3Vic3RyaW5nKDEsMiksYS5zdWJzdHJpbmcoMiwzKSxhLnN1YnN0cmluZygyLDMpLGEuc3Vic3RyaW5nKDMsNCksYS5zdWJzdHJpbmcoMyw0KV0uam9pbigiIik6YSksdGhpcy5yPXBhcnNlSW50KGlbMV0sMTYpLHRoaXMuZz1wYXJzZUludChpWzJdLDE2KSx0aGlzLmI9cGFyc2VJbnQoaVszXSwxNikpOiJvYmplY3QiPT09dChlKSYmKHRoaXMucj1lLnIsdGhpcy5nPWUuZyx0aGlzLmI9ZS5iKSl9LHMuZXh0ZW5kKHMuQ29sb3Ise3RvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9IZXgoKX0sdG9IZXg6ZnVuY3Rpb24oKXtyZXR1cm4iIyIrdSh0aGlzLnIpK3UodGhpcy5nKSt1KHRoaXMuYil9LHRvUmdiOmZ1bmN0aW9uKCl7cmV0dXJuInJnYigiK1t0aGlzLnIsdGhpcy5nLHRoaXMuYl0uam9pbigpKyIpIn0sYnJpZ2h0bmVzczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnIvMjU1Ki4zK3RoaXMuZy8yNTUqLjU5K3RoaXMuYi8yNTUqLjExfSxtb3JwaDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZXN0aW5hdGlvbj1uZXcgcy5Db2xvcih0KSx0aGlzfSxhdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZXN0aW5hdGlvbj8odD10PDA/MDp0PjE/MTp0LG5ldyBzLkNvbG9yKHtyOn5+KHRoaXMucisodGhpcy5kZXN0aW5hdGlvbi5yLXRoaXMucikqdCksZzp+fih0aGlzLmcrKHRoaXMuZGVzdGluYXRpb24uZy10aGlzLmcpKnQpLGI6fn4odGhpcy5iKyh0aGlzLmRlc3RpbmF0aW9uLmItdGhpcy5iKSp0KX0pKTp0aGlzfX0pLHMuQ29sb3IudGVzdD1mdW5jdGlvbih0KXtyZXR1cm4gdCs9IiIscy5yZWdleC5pc0hleC50ZXN0KHQpfHxzLnJlZ2V4LmlzUmdiLnRlc3QodCl9LHMuQ29sb3IuaXNSZ2I9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJudW1iZXIiPT10eXBlb2YgdC5yJiYibnVtYmVyIj09dHlwZW9mIHQuZyYmIm51bWJlciI9PXR5cGVvZiB0LmJ9LHMuQ29sb3IuaXNDb2xvcj1mdW5jdGlvbih0KXtyZXR1cm4gcy5Db2xvci5pc1JnYih0KXx8cy5Db2xvci50ZXN0KHQpfSxzLkFycmF5PWZ1bmN0aW9uKHQsZSl7MD09KHQ9KHR8fFtdKS52YWx1ZU9mKCkpLmxlbmd0aCYmZSYmKHQ9ZS52YWx1ZU9mKCkpLHRoaXMudmFsdWU9dGhpcy5wYXJzZSh0KX0scy5leHRlbmQocy5BcnJheSx7bW9ycGg6ZnVuY3Rpb24odCl7aWYodGhpcy5kZXN0aW5hdGlvbj10aGlzLnBhcnNlKHQpLHRoaXMudmFsdWUubGVuZ3RoIT10aGlzLmRlc3RpbmF0aW9uLmxlbmd0aCl7Zm9yKHZhciBlPXRoaXMudmFsdWVbdGhpcy52YWx1ZS5sZW5ndGgtMV0saT10aGlzLmRlc3RpbmF0aW9uW3RoaXMuZGVzdGluYXRpb24ubGVuZ3RoLTFdO3RoaXMudmFsdWUubGVuZ3RoPnRoaXMuZGVzdGluYXRpb24ubGVuZ3RoOyl0aGlzLmRlc3RpbmF0aW9uLnB1c2goaSk7Zm9yKDt0aGlzLnZhbHVlLmxlbmd0aDx0aGlzLmRlc3RpbmF0aW9uLmxlbmd0aDspdGhpcy52YWx1ZS5wdXNoKGUpfXJldHVybiB0aGlzfSxzZXR0bGU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPXRoaXMudmFsdWUubGVuZ3RoLGk9W107dDxlO3QrKyktMT09aS5pbmRleE9mKHRoaXMudmFsdWVbdF0pJiZpLnB1c2godGhpcy52YWx1ZVt0XSk7cmV0dXJuIHRoaXMudmFsdWU9aX0sYXQ6ZnVuY3Rpb24odCl7aWYoIXRoaXMuZGVzdGluYXRpb24pcmV0dXJuIHRoaXM7Zm9yKHZhciBlPTAsaT10aGlzLnZhbHVlLmxlbmd0aCxhPVtdO2U8aTtlKyspYS5wdXNoKHRoaXMudmFsdWVbZV0rKHRoaXMuZGVzdGluYXRpb25bZV0tdGhpcy52YWx1ZVtlXSkqdCk7cmV0dXJuIG5ldyBzLkFycmF5KGEpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlLmpvaW4oIiAiKX0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfSxwYXJzZTpmdW5jdGlvbih0KXtyZXR1cm4gdD10LnZhbHVlT2YoKSxBcnJheS5pc0FycmF5KHQpP3Q6dGhpcy5zcGxpdCh0KX0sc3BsaXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KHMucmVnZXguZGVsaW1pdGVyKS5tYXAocGFyc2VGbG9hdCl9LHJldmVyc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZS5yZXZlcnNlKCksdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgdD1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gdC52YWx1ZT1mdW5jdGlvbiB0KGUpe3ZhciBpPWUuc2xpY2UoMCk7Zm9yKHZhciBzPWkubGVuZ3RoO3MtLTspQXJyYXkuaXNBcnJheShpW3NdKSYmKGlbc109dChpW3NdKSk7cmV0dXJuIGl9KHRoaXMudmFsdWUpLHR9fSkscy5Qb2ludEFycmF5PWZ1bmN0aW9uKHQsZSl7cy5BcnJheS5jYWxsKHRoaXMsdCxlfHxbWzAsMF1dKX0scy5Qb2ludEFycmF5LnByb3RvdHlwZT1uZXcgcy5BcnJheSxzLlBvaW50QXJyYXkucHJvdG90eXBlLmNvbnN0cnVjdG9yPXMuUG9pbnRBcnJheSxzLmV4dGVuZChzLlBvaW50QXJyYXkse3RvU3RyaW5nOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT10aGlzLnZhbHVlLmxlbmd0aCxpPVtdO3Q8ZTt0KyspaS5wdXNoKHRoaXMudmFsdWVbdF0uam9pbigiLCIpKTtyZXR1cm4gaS5qb2luKCIgIil9LHRvTGluZTpmdW5jdGlvbigpe3JldHVybnt4MTp0aGlzLnZhbHVlWzBdWzBdLHkxOnRoaXMudmFsdWVbMF1bMV0seDI6dGhpcy52YWx1ZVsxXVswXSx5Mjp0aGlzLnZhbHVlWzFdWzFdfX0sYXQ6ZnVuY3Rpb24odCl7aWYoIXRoaXMuZGVzdGluYXRpb24pcmV0dXJuIHRoaXM7Zm9yKHZhciBlPTAsaT10aGlzLnZhbHVlLmxlbmd0aCxhPVtdO2U8aTtlKyspYS5wdXNoKFt0aGlzLnZhbHVlW2VdWzBdKyh0aGlzLmRlc3RpbmF0aW9uW2VdWzBdLXRoaXMudmFsdWVbZV1bMF0pKnQsdGhpcy52YWx1ZVtlXVsxXSsodGhpcy5kZXN0aW5hdGlvbltlXVsxXS10aGlzLnZhbHVlW2VdWzFdKSp0XSk7cmV0dXJuIG5ldyBzLlBvaW50QXJyYXkoYSl9LHBhcnNlOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKHQ9dC52YWx1ZU9mKCksQXJyYXkuaXNBcnJheSh0KSl7aWYoQXJyYXkuaXNBcnJheSh0WzBdKSlyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuc2xpY2UoKX0pO2lmKG51bGwhPXRbMF0ueClyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW3QueCx0LnldfSl9ZWxzZSB0PXQudHJpbSgpLnNwbGl0KHMucmVnZXguZGVsaW1pdGVyKS5tYXAocGFyc2VGbG9hdCk7dC5sZW5ndGglMiE9MCYmdC5wb3AoKTtmb3IodmFyIGk9MCxhPXQubGVuZ3RoO2k8YTtpKz0yKWUucHVzaChbdFtpXSx0W2krMV1dKTtyZXR1cm4gZX0sbW92ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuYmJveCgpO2lmKHQtPWkueCxlLT1pLnksIWlzTmFOKHQpJiYhaXNOYU4oZSkpZm9yKHZhciBzPXRoaXMudmFsdWUubGVuZ3RoLTE7cz49MDtzLS0pdGhpcy52YWx1ZVtzXT1bdGhpcy52YWx1ZVtzXVswXSt0LHRoaXMudmFsdWVbc11bMV0rZV07cmV0dXJuIHRoaXN9LHNpemU6ZnVuY3Rpb24odCxlKXt2YXIgaSxzPXRoaXMuYmJveCgpO2ZvcihpPXRoaXMudmFsdWUubGVuZ3RoLTE7aT49MDtpLS0pcy53aWR0aCYmKHRoaXMudmFsdWVbaV1bMF09KHRoaXMudmFsdWVbaV1bMF0tcy54KSp0L3Mud2lkdGgrcy54KSxzLmhlaWdodCYmKHRoaXMudmFsdWVbaV1bMV09KHRoaXMudmFsdWVbaV1bMV0tcy55KSplL3MuaGVpZ2h0K3MueSk7cmV0dXJuIHRoaXN9LGJib3g6ZnVuY3Rpb24oKXtyZXR1cm4gcy5wYXJzZXIuZHJhd3x8cy5wcmVwYXJlKCkscy5wYXJzZXIucG9seS5zZXRBdHRyaWJ1dGUoInBvaW50cyIsdGhpcy50b1N0cmluZygpKSxzLnBhcnNlci5wb2x5LmdldEJCb3goKX19KTtmb3IodmFyIGE9e006ZnVuY3Rpb24odCxlLGkpe3JldHVybiBlLng9aS54PXRbMF0sZS55PWkueT10WzFdLFsiTSIsZS54LGUueV19LEw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS54PXRbMF0sZS55PXRbMV0sWyJMIix0WzBdLHRbMV1dfSxIOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUueD10WzBdLFsiSCIsdFswXV19LFY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS55PXRbMF0sWyJWIix0WzBdXX0sQzpmdW5jdGlvbih0LGUpe3JldHVybiBlLng9dFs0XSxlLnk9dFs1XSxbIkMiLHRbMF0sdFsxXSx0WzJdLHRbM10sdFs0XSx0WzVdXX0sUzpmdW5jdGlvbih0LGUpe3JldHVybiBlLng9dFsyXSxlLnk9dFszXSxbIlMiLHRbMF0sdFsxXSx0WzJdLHRbM11dfSxROmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUueD10WzJdLGUueT10WzNdLFsiUSIsdFswXSx0WzFdLHRbMl0sdFszXV19LFQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS54PXRbMF0sZS55PXRbMV0sWyJUIix0WzBdLHRbMV1dfSxaOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gZS54PWkueCxlLnk9aS55LFsiWiJdfSxBOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUueD10WzVdLGUueT10WzZdLFsiQSIsdFswXSx0WzFdLHRbMl0sdFszXSx0WzRdLHRbNV0sdFs2XV19fSxuPSJtbGh2cXRjc2F6Ii5zcGxpdCgiIikscj0wLG89bi5sZW5ndGg7cjxvOysrcilhW25bcl1dPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLGkscyl7aWYoIkgiPT10KWVbMF09ZVswXStpLng7ZWxzZSBpZigiViI9PXQpZVswXT1lWzBdK2kueTtlbHNlIGlmKCJBIj09dCllWzVdPWVbNV0raS54LGVbNl09ZVs2XStpLnk7ZWxzZSBmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjsrK24pZVtuXT1lW25dKyhuJTI/aS55OmkueCk7cmV0dXJuIGFbdF0oZSxpLHMpfX0obltyXS50b1VwcGVyQ2FzZSgpKTtzLlBhdGhBcnJheT1mdW5jdGlvbih0LGUpe3MuQXJyYXkuY2FsbCh0aGlzLHQsZXx8W1siTSIsMCwwXV0pfSxzLlBhdGhBcnJheS5wcm90b3R5cGU9bmV3IHMuQXJyYXkscy5QYXRoQXJyYXkucHJvdG90eXBlLmNvbnN0cnVjdG9yPXMuUGF0aEFycmF5LHMuZXh0ZW5kKHMuUGF0aEFycmF5LHt0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxpPXQubGVuZ3RoLHM9IiI7ZTxpO2UrKylzKz10W2VdWzBdLG51bGwhPXRbZV1bMV0mJihzKz10W2VdWzFdLG51bGwhPXRbZV1bMl0mJihzKz0iICIscys9dFtlXVsyXSxudWxsIT10W2VdWzNdJiYocys9IiAiLHMrPXRbZV1bM10scys9IiAiLHMrPXRbZV1bNF0sbnVsbCE9dFtlXVs1XSYmKHMrPSIgIixzKz10W2VdWzVdLHMrPSIgIixzKz10W2VdWzZdLG51bGwhPXRbZV1bN10mJihzKz0iICIscys9dFtlXVs3XSkpKSkpO3JldHVybiBzKyIgIn0odGhpcy52YWx1ZSl9LG1vdmU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmJib3goKTtpZih0LT1pLngsZS09aS55LCFpc05hTih0KSYmIWlzTmFOKGUpKWZvcih2YXIgcyxhPXRoaXMudmFsdWUubGVuZ3RoLTE7YT49MDthLS0pIk0iPT0ocz10aGlzLnZhbHVlW2FdWzBdKXx8IkwiPT1zfHwiVCI9PXM/KHRoaXMudmFsdWVbYV1bMV0rPXQsdGhpcy52YWx1ZVthXVsyXSs9ZSk6IkgiPT1zP3RoaXMudmFsdWVbYV1bMV0rPXQ6IlYiPT1zP3RoaXMudmFsdWVbYV1bMV0rPWU6IkMiPT1zfHwiUyI9PXN8fCJRIj09cz8odGhpcy52YWx1ZVthXVsxXSs9dCx0aGlzLnZhbHVlW2FdWzJdKz1lLHRoaXMudmFsdWVbYV1bM10rPXQsdGhpcy52YWx1ZVthXVs0XSs9ZSwiQyI9PXMmJih0aGlzLnZhbHVlW2FdWzVdKz10LHRoaXMudmFsdWVbYV1bNl0rPWUpKToiQSI9PXMmJih0aGlzLnZhbHVlW2FdWzZdKz10LHRoaXMudmFsdWVbYV1bN10rPWUpO3JldHVybiB0aGlzfSxzaXplOmZ1bmN0aW9uKHQsZSl7dmFyIGkscyxhPXRoaXMuYmJveCgpO2ZvcihpPXRoaXMudmFsdWUubGVuZ3RoLTE7aT49MDtpLS0pIk0iPT0ocz10aGlzLnZhbHVlW2ldWzBdKXx8IkwiPT1zfHwiVCI9PXM/KHRoaXMudmFsdWVbaV1bMV09KHRoaXMudmFsdWVbaV1bMV0tYS54KSp0L2Eud2lkdGgrYS54LHRoaXMudmFsdWVbaV1bMl09KHRoaXMudmFsdWVbaV1bMl0tYS55KSplL2EuaGVpZ2h0K2EueSk6IkgiPT1zP3RoaXMudmFsdWVbaV1bMV09KHRoaXMudmFsdWVbaV1bMV0tYS54KSp0L2Eud2lkdGgrYS54OiJWIj09cz90aGlzLnZhbHVlW2ldWzFdPSh0aGlzLnZhbHVlW2ldWzFdLWEueSkqZS9hLmhlaWdodCthLnk6IkMiPT1zfHwiUyI9PXN8fCJRIj09cz8odGhpcy52YWx1ZVtpXVsxXT0odGhpcy52YWx1ZVtpXVsxXS1hLngpKnQvYS53aWR0aCthLngsdGhpcy52YWx1ZVtpXVsyXT0odGhpcy52YWx1ZVtpXVsyXS1hLnkpKmUvYS5oZWlnaHQrYS55LHRoaXMudmFsdWVbaV1bM109KHRoaXMudmFsdWVbaV1bM10tYS54KSp0L2Eud2lkdGgrYS54LHRoaXMudmFsdWVbaV1bNF09KHRoaXMudmFsdWVbaV1bNF0tYS55KSplL2EuaGVpZ2h0K2EueSwiQyI9PXMmJih0aGlzLnZhbHVlW2ldWzVdPSh0aGlzLnZhbHVlW2ldWzVdLWEueCkqdC9hLndpZHRoK2EueCx0aGlzLnZhbHVlW2ldWzZdPSh0aGlzLnZhbHVlW2ldWzZdLWEueSkqZS9hLmhlaWdodCthLnkpKToiQSI9PXMmJih0aGlzLnZhbHVlW2ldWzFdPXRoaXMudmFsdWVbaV1bMV0qdC9hLndpZHRoLHRoaXMudmFsdWVbaV1bMl09dGhpcy52YWx1ZVtpXVsyXSplL2EuaGVpZ2h0LHRoaXMudmFsdWVbaV1bNl09KHRoaXMudmFsdWVbaV1bNl0tYS54KSp0L2Eud2lkdGgrYS54LHRoaXMudmFsdWVbaV1bN109KHRoaXMudmFsdWVbaV1bN10tYS55KSplL2EuaGVpZ2h0K2EueSk7cmV0dXJuIHRoaXN9LGVxdWFsQ29tbWFuZHM6ZnVuY3Rpb24odCl7dmFyIGUsaSxhO2Zvcih0PW5ldyBzLlBhdGhBcnJheSh0KSxhPXRoaXMudmFsdWUubGVuZ3RoPT09dC52YWx1ZS5sZW5ndGgsZT0wLGk9dGhpcy52YWx1ZS5sZW5ndGg7YSYmZTxpO2UrKylhPXRoaXMudmFsdWVbZV1bMF09PT10LnZhbHVlW2VdWzBdO3JldHVybiBhfSxtb3JwaDpmdW5jdGlvbih0KXtyZXR1cm4gdD1uZXcgcy5QYXRoQXJyYXkodCksdGhpcy5lcXVhbENvbW1hbmRzKHQpP3RoaXMuZGVzdGluYXRpb249dDp0aGlzLmRlc3RpbmF0aW9uPW51bGwsdGhpc30sYXQ6ZnVuY3Rpb24odCl7aWYoIXRoaXMuZGVzdGluYXRpb24pcmV0dXJuIHRoaXM7dmFyIGUsaSxhLG4scj10aGlzLnZhbHVlLG89dGhpcy5kZXN0aW5hdGlvbi52YWx1ZSxsPVtdLGg9bmV3IHMuUGF0aEFycmF5O2ZvcihlPTAsaT1yLmxlbmd0aDtlPGk7ZSsrKXtmb3IobFtlXT1bcltlXVswXV0sYT0xLG49cltlXS5sZW5ndGg7YTxuO2ErKylsW2VdW2FdPXJbZV1bYV0rKG9bZV1bYV0tcltlXVthXSkqdDsiQSI9PT1sW2VdWzBdJiYobFtlXVs0XT0rKDAhPWxbZV1bNF0pLGxbZV1bNV09KygwIT1sW2VdWzVdKSl9cmV0dXJuIGgudmFsdWU9bCxofSxwYXJzZTpmdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2Ygcy5QYXRoQXJyYXkpcmV0dXJuIHQudmFsdWVPZigpO3ZhciBlLGk9e006MixMOjIsSDoxLFY6MSxDOjYsUzo0LFE6NCxUOjIsQTo3LFo6MH07dD0ic3RyaW5nIj09dHlwZW9mIHQ/dC5yZXBsYWNlKHMucmVnZXgubnVtYmVyc1dpdGhEb3RzLGgpLnJlcGxhY2Uocy5yZWdleC5wYXRoTGV0dGVycywiICQmICIpLnJlcGxhY2Uocy5yZWdleC5oeXBoZW4sIiQxIC0iKS50cmltKCkuc3BsaXQocy5yZWdleC5kZWxpbWl0ZXIpOnQucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuW10uY29uY2F0LmNhbGwodCxlKX0sW10pO3ZhciBuPVtdLHI9bmV3IHMuUG9pbnQsbz1uZXcgcy5Qb2ludCxsPTAsYz10Lmxlbmd0aDtkb3tzLnJlZ2V4LmlzUGF0aExldHRlci50ZXN0KHRbbF0pPyhlPXRbbF0sKytsKToiTSI9PWU/ZT0iTCI6Im0iPT1lJiYoZT0ibCIpLG4ucHVzaChhW2VdLmNhbGwobnVsbCx0LnNsaWNlKGwsbCs9aVtlLnRvVXBwZXJDYXNlKCldKS5tYXAocGFyc2VGbG9hdCkscixvKSl9d2hpbGUoYz5sKTtyZXR1cm4gbn0sYmJveDpmdW5jdGlvbigpe3JldHVybiBzLnBhcnNlci5kcmF3fHxzLnByZXBhcmUoKSxzLnBhcnNlci5wYXRoLnNldEF0dHJpYnV0ZSgiZCIsdGhpcy50b1N0cmluZygpKSxzLnBhcnNlci5wYXRoLmdldEJCb3goKX19KSxzLk51bWJlcj1zLmludmVudCh7Y3JlYXRlOmZ1bmN0aW9uKHQsZSl7dGhpcy52YWx1ZT0wLHRoaXMudW5pdD1lfHwiIiwibnVtYmVyIj09dHlwZW9mIHQ/dGhpcy52YWx1ZT1pc05hTih0KT8wOmlzRmluaXRlKHQpP3Q6dDwwPy0zLjRlMzg6My40ZTM4OiJzdHJpbmciPT10eXBlb2YgdD8oZT10Lm1hdGNoKHMucmVnZXgubnVtYmVyQW5kVW5pdCkpJiYodGhpcy52YWx1ZT1wYXJzZUZsb2F0KGVbMV0pLCIlIj09ZVs1XT90aGlzLnZhbHVlLz0xMDA6InMiPT1lWzVdJiYodGhpcy52YWx1ZSo9MWUzKSx0aGlzLnVuaXQ9ZVs1XSk6dCBpbnN0YW5jZW9mIHMuTnVtYmVyJiYodGhpcy52YWx1ZT10LnZhbHVlT2YoKSx0aGlzLnVuaXQ9dC51bml0KX0sZXh0ZW5kOnt0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybigiJSI9PXRoaXMudW5pdD9+figxZTgqdGhpcy52YWx1ZSkvMWU2OiJzIj09dGhpcy51bml0P3RoaXMudmFsdWUvMWUzOnRoaXMudmFsdWUpK3RoaXMudW5pdH0sdG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TdHJpbmcoKX0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfSxwbHVzOmZ1bmN0aW9uKHQpe3JldHVybiB0PW5ldyBzLk51bWJlcih0KSxuZXcgcy5OdW1iZXIodGhpcyt0LHRoaXMudW5pdHx8dC51bml0KX0sbWludXM6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bmV3IHMuTnVtYmVyKHQpLG5ldyBzLk51bWJlcih0aGlzLXQsdGhpcy51bml0fHx0LnVuaXQpfSx0aW1lczpmdW5jdGlvbih0KXtyZXR1cm4gdD1uZXcgcy5OdW1iZXIodCksbmV3IHMuTnVtYmVyKHRoaXMqdCx0aGlzLnVuaXR8fHQudW5pdCl9LGRpdmlkZTpmdW5jdGlvbih0KXtyZXR1cm4gdD1uZXcgcy5OdW1iZXIodCksbmV3IHMuTnVtYmVyKHRoaXMvdCx0aGlzLnVuaXR8fHQudW5pdCl9LHRvOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBzLk51bWJlcih0aGlzKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJihlLnVuaXQ9dCksZX0sbW9ycGg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGVzdGluYXRpb249bmV3IHMuTnVtYmVyKHQpLHQucmVsYXRpdmUmJih0aGlzLmRlc3RpbmF0aW9uLnZhbHVlKz10aGlzLnZhbHVlKSx0aGlzfSxhdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZXN0aW5hdGlvbj9uZXcgcy5OdW1iZXIodGhpcy5kZXN0aW5hdGlvbikubWludXModGhpcykudGltZXModCkucGx1cyh0aGlzKTp0aGlzfX19KSxzLkVsZW1lbnQ9cy5pbnZlbnQoe2NyZWF0ZTpmdW5jdGlvbih0KXt0aGlzLl9zdHJva2U9cy5kZWZhdWx0cy5hdHRycy5zdHJva2UsdGhpcy5fZXZlbnQ9bnVsbCx0aGlzLmRvbT17fSwodGhpcy5ub2RlPXQpJiYodGhpcy50eXBlPXQubm9kZU5hbWUsdGhpcy5ub2RlLmluc3RhbmNlPXRoaXMsdGhpcy5fc3Ryb2tlPXQuZ2V0QXR0cmlidXRlKCJzdHJva2UiKXx8dGhpcy5fc3Ryb2tlKX0sZXh0ZW5kOnt4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmF0dHIoIngiLHQpfSx5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmF0dHIoInkiLHQpfSxjeDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLngoKSt0aGlzLndpZHRoKCkvMjp0aGlzLngodC10aGlzLndpZHRoKCkvMil9LGN5OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMueSgpK3RoaXMuaGVpZ2h0KCkvMjp0aGlzLnkodC10aGlzLmhlaWdodCgpLzIpfSxtb3ZlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMueCh0KS55KGUpfSxjZW50ZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jeCh0KS5jeShlKX0sd2lkdGg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXR0cigid2lkdGgiLHQpfSxoZWlnaHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXR0cigiaGVpZ2h0Iix0KX0sc2l6ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWcodGhpcyx0LGUpO3JldHVybiB0aGlzLndpZHRoKG5ldyBzLk51bWJlcihpLndpZHRoKSkuaGVpZ2h0KG5ldyBzLk51bWJlcihpLmhlaWdodCkpfSxjbG9uZTpmdW5jdGlvbih0KXt0aGlzLndyaXRlRGF0YVRvRG9tKCk7dmFyIGU9Yih0aGlzLm5vZGUuY2xvbmVOb2RlKCEwKSk7cmV0dXJuIHQ/dC5hZGQoZSk6dGhpcy5hZnRlcihlKSxlfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKSYmdGhpcy5wYXJlbnQoKS5yZW1vdmVFbGVtZW50KHRoaXMpLHRoaXN9LHJlcGxhY2U6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYWZ0ZXIodCkucmVtb3ZlKCksdH0sYWRkVG86ZnVuY3Rpb24odCl7cmV0dXJuIHQucHV0KHRoaXMpfSxwdXRJbjpmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGQodGhpcyl9LGlkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmF0dHIoImlkIix0KX0saW5zaWRlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5iYm94KCk7cmV0dXJuIHQ+aS54JiZlPmkueSYmdDxpLngraS53aWR0aCYmZTxpLnkraS5oZWlnaHR9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHlsZSgiZGlzcGxheSIsIiIpfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3R5bGUoImRpc3BsYXkiLCJub25lIil9LHZpc2libGU6ZnVuY3Rpb24oKXtyZXR1cm4ibm9uZSIhPXRoaXMuc3R5bGUoImRpc3BsYXkiKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hdHRyKCJpZCIpfSxjbGFzc2VzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5hdHRyKCJjbGFzcyIpO3JldHVybiBudWxsPT10P1tdOnQudHJpbSgpLnNwbGl0KHMucmVnZXguZGVsaW1pdGVyKX0saGFzQ2xhc3M6ZnVuY3Rpb24odCl7cmV0dXJuLTEhPXRoaXMuY2xhc3NlcygpLmluZGV4T2YodCl9LGFkZENsYXNzOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLmhhc0NsYXNzKHQpKXt2YXIgZT10aGlzLmNsYXNzZXMoKTtlLnB1c2godCksdGhpcy5hdHRyKCJjbGFzcyIsZS5qb2luKCIgIikpfXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5oYXNDbGFzcyh0KSYmdGhpcy5hdHRyKCJjbGFzcyIsdGhpcy5jbGFzc2VzKCkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlIT10fSkuam9pbigiICIpKSx0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5oYXNDbGFzcyh0KT90aGlzLnJlbW92ZUNsYXNzKHQpOnRoaXMuYWRkQ2xhc3ModCl9LHJlZmVyZW5jZTpmdW5jdGlvbih0KXtyZXR1cm4gcy5nZXQodGhpcy5hdHRyKHQpKX0scGFyZW50OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXM7aWYoIWkubm9kZS5wYXJlbnROb2RlKXJldHVybiBudWxsO2lmKGk9cy5hZG9wdChpLm5vZGUucGFyZW50Tm9kZSksIXQpcmV0dXJuIGk7Zm9yKDtpJiZpLm5vZGUgaW5zdGFuY2VvZiBlLlNWR0VsZW1lbnQ7KXtpZigic3RyaW5nIj09dHlwZW9mIHQ/aS5tYXRjaGVzKHQpOmkgaW5zdGFuY2VvZiB0KXJldHVybiBpO2lmKCFpLm5vZGUucGFyZW50Tm9kZXx8IiNkb2N1bWVudCI9PWkubm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKXJldHVybiBudWxsO2k9cy5hZG9wdChpLm5vZGUucGFyZW50Tm9kZSl9fSxkb2M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHMuRG9jP3RoaXM6dGhpcy5wYXJlbnQocy5Eb2MpfSxwYXJlbnRzOmZ1bmN0aW9uKHQpe3ZhciBlPVtdLGk9dGhpcztkb3tpZighKGk9aS5wYXJlbnQodCkpfHwhaS5ub2RlKWJyZWFrO2UucHVzaChpKX13aGlsZShpLnBhcmVudCk7cmV0dXJuIGV9LG1hdGNoZXM6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQubWF0Y2hlc3x8dC5tYXRjaGVzU2VsZWN0b3J8fHQubXNNYXRjaGVzU2VsZWN0b3J8fHQubW96TWF0Y2hlc1NlbGVjdG9yfHx0LndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8dC5vTWF0Y2hlc1NlbGVjdG9yKS5jYWxsKHQsZSl9KHRoaXMubm9kZSx0KX0sbmF0aXZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZX0sc3ZnOmZ1bmN0aW9uKHQpe3ZhciBlPWkuY3JlYXRlRWxlbWVudCgic3ZnIik7aWYoISh0JiZ0aGlzIGluc3RhbmNlb2Ygcy5QYXJlbnQpKXJldHVybiBlLmFwcGVuZENoaWxkKHQ9aS5jcmVhdGVFbGVtZW50KCJzdmciKSksdGhpcy53cml0ZURhdGFUb0RvbSgpLHQuYXBwZW5kQ2hpbGQodGhpcy5ub2RlLmNsb25lTm9kZSghMCkpLGUuaW5uZXJIVE1MLnJlcGxhY2UoL148c3ZnPi8sIiIpLnJlcGxhY2UoLzxcL3N2Zz4kLywiIik7ZS5pbm5lckhUTUw9Ijxzdmc+Iit0LnJlcGxhY2UoL1xuLywiIikucmVwbGFjZSgvPChbXHc6LV0rKShbXjxdKz8pXC8+L2csIjwkMSQyPjwvJDE+IikrIjwvc3ZnPiI7Zm9yKHZhciBhPTAsbj1lLmZpcnN0Q2hpbGQuY2hpbGROb2Rlcy5sZW5ndGg7YTxuO2ErKyl0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoZS5maXJzdENoaWxkLmZpcnN0Q2hpbGQpO3JldHVybiB0aGlzfSx3cml0ZURhdGFUb0RvbTpmdW5jdGlvbigpeyh0aGlzLmVhY2h8fHRoaXMubGluZXMpJiYodGhpcy5lYWNoP3RoaXM6dGhpcy5saW5lcygpKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy53cml0ZURhdGFUb0RvbSgpfSk7cmV0dXJuIHRoaXMubm9kZS5yZW1vdmVBdHRyaWJ1dGUoInN2Z2pzOmRhdGEiKSxPYmplY3Qua2V5cyh0aGlzLmRvbSkubGVuZ3RoJiZ0aGlzLm5vZGUuc2V0QXR0cmlidXRlKCJzdmdqczpkYXRhIixKU09OLnN0cmluZ2lmeSh0aGlzLmRvbSkpLHRoaXN9LHNldERhdGE6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZG9tPXQsdGhpc30saXM6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBlfSh0aGlzLHQpfX19KSxzLmVhc2luZz17Ii0iOmZ1bmN0aW9uKHQpe3JldHVybiB0fSwiPD4iOmZ1bmN0aW9uKHQpe3JldHVybi1NYXRoLmNvcyh0Kk1hdGguUEkpLzIrLjV9LCI+IjpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zaW4odCpNYXRoLlBJLzIpfSwiPCI6ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5jb3ModCpNYXRoLlBJLzIpfX0scy5tb3JwaD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxpKXtyZXR1cm4gbmV3IHMuTW9ycGhPYmooZSxpKS5hdCh0KX19LHMuU2l0dWF0aW9uPXMuaW52ZW50KHtjcmVhdGU6ZnVuY3Rpb24odCl7dGhpcy5pbml0PSExLHRoaXMucmV2ZXJzZWQ9ITEsdGhpcy5yZXZlcnNpbmc9ITEsdGhpcy5kdXJhdGlvbj1uZXcgcy5OdW1iZXIodC5kdXJhdGlvbikudmFsdWVPZigpLHRoaXMuZGVsYXk9bmV3IHMuTnVtYmVyKHQuZGVsYXkpLnZhbHVlT2YoKSx0aGlzLnN0YXJ0PStuZXcgRGF0ZSt0aGlzLmRlbGF5LHRoaXMuZmluaXNoPXRoaXMuc3RhcnQrdGhpcy5kdXJhdGlvbix0aGlzLmVhc2U9dC5lYXNlLHRoaXMubG9vcD0wLHRoaXMubG9vcHM9ITEsdGhpcy5hbmltYXRpb25zPXt9LHRoaXMuYXR0cnM9e30sdGhpcy5zdHlsZXM9e30sdGhpcy50cmFuc2Zvcm1zPVtdLHRoaXMub25jZT17fX19KSxzLkZYPXMuaW52ZW50KHtjcmVhdGU6ZnVuY3Rpb24odCl7dGhpcy5fdGFyZ2V0PXQsdGhpcy5zaXR1YXRpb25zPVtdLHRoaXMuYWN0aXZlPSExLHRoaXMuc2l0dWF0aW9uPW51bGwsdGhpcy5wYXVzZWQ9ITEsdGhpcy5sYXN0UG9zPTAsdGhpcy5wb3M9MCx0aGlzLmFic1Bvcz0wLHRoaXMuX3NwZWVkPTF9LGV4dGVuZDp7YW5pbWF0ZTpmdW5jdGlvbihlLGksYSl7Im9iamVjdCI9PT10KGUpJiYoaT1lLmVhc2UsYT1lLmRlbGF5LGU9ZS5kdXJhdGlvbik7dmFyIG49bmV3IHMuU2l0dWF0aW9uKHtkdXJhdGlvbjplfHwxZTMsZGVsYXk6YXx8MCxlYXNlOnMuZWFzaW5nW2l8fCItIl18fGl9KTtyZXR1cm4gdGhpcy5xdWV1ZShuKSx0aGlzfSxkZWxheTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgcy5TaXR1YXRpb24oe2R1cmF0aW9uOnQsZGVsYXk6MCxlYXNlOnMuZWFzaW5nWyItIl19KTtyZXR1cm4gdGhpcy5xdWV1ZShlKX0sdGFyZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0IGluc3RhbmNlb2Ygcy5FbGVtZW50Pyh0aGlzLl90YXJnZXQ9dCx0aGlzKTp0aGlzLl90YXJnZXR9LHRpbWVUb0Fic1BvczpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnNpdHVhdGlvbi5zdGFydCkvKHRoaXMuc2l0dWF0aW9uLmR1cmF0aW9uL3RoaXMuX3NwZWVkKX0sYWJzUG9zVG9UaW1lOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNpdHVhdGlvbi5kdXJhdGlvbi90aGlzLl9zcGVlZCp0K3RoaXMuc2l0dWF0aW9uLnN0YXJ0fSxzdGFydEFuaW1GcmFtZTpmdW5jdGlvbigpe3RoaXMuc3RvcEFuaW1GcmFtZSgpLHRoaXMuYW5pbWF0aW9uRnJhbWU9ZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt0aGlzLnN0ZXAoKX0uYmluZCh0aGlzKSl9LHN0b3BBbmltRnJhbWU6ZnVuY3Rpb24oKXtlLmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRnJhbWUpfSxzdGFydDpmdW5jdGlvbigpe3JldHVybiF0aGlzLmFjdGl2ZSYmdGhpcy5zaXR1YXRpb24mJih0aGlzLmFjdGl2ZT0hMCx0aGlzLnN0YXJ0Q3VycmVudCgpKSx0aGlzfSxzdGFydEN1cnJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaXR1YXRpb24uc3RhcnQ9K25ldyBEYXRlK3RoaXMuc2l0dWF0aW9uLmRlbGF5L3RoaXMuX3NwZWVkLHRoaXMuc2l0dWF0aW9uLmZpbmlzaD10aGlzLnNpdHVhdGlvbi5zdGFydCt0aGlzLnNpdHVhdGlvbi5kdXJhdGlvbi90aGlzLl9zcGVlZCx0aGlzLmluaXRBbmltYXRpb25zKCkuc3RlcCgpfSxxdWV1ZTpmdW5jdGlvbih0KXtyZXR1cm4oImZ1bmN0aW9uIj09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBzLlNpdHVhdGlvbikmJnRoaXMuc2l0dWF0aW9ucy5wdXNoKHQpLHRoaXMuc2l0dWF0aW9ufHwodGhpcy5zaXR1YXRpb249dGhpcy5zaXR1YXRpb25zLnNoaWZ0KCkpLHRoaXN9LGRlcXVldWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdG9wKCksdGhpcy5zaXR1YXRpb249dGhpcy5zaXR1YXRpb25zLnNoaWZ0KCksdGhpcy5zaXR1YXRpb24mJih0aGlzLnNpdHVhdGlvbiBpbnN0YW5jZW9mIHMuU2l0dWF0aW9uP3RoaXMuc3RhcnQoKTp0aGlzLnNpdHVhdGlvbi5jYWxsKHRoaXMpKSx0aGlzfSxpbml0QW5pbWF0aW9uczpmdW5jdGlvbigpe3ZhciB0LGUsaSxhPXRoaXMuc2l0dWF0aW9uO2lmKGEuaW5pdClyZXR1cm4gdGhpcztmb3IodCBpbiBhLmFuaW1hdGlvbnMpZm9yKGk9dGhpcy50YXJnZXQoKVt0XSgpLEFycmF5LmlzQXJyYXkoaSl8fChpPVtpXSksQXJyYXkuaXNBcnJheShhLmFuaW1hdGlvbnNbdF0pfHwoYS5hbmltYXRpb25zW3RdPVthLmFuaW1hdGlvbnNbdF1dKSxlPWkubGVuZ3RoO2UtLTspYS5hbmltYXRpb25zW3RdW2VdaW5zdGFuY2VvZiBzLk51bWJlciYmKGlbZV09bmV3IHMuTnVtYmVyKGlbZV0pKSxhLmFuaW1hdGlvbnNbdF1bZV09aVtlXS5tb3JwaChhLmFuaW1hdGlvbnNbdF1bZV0pO2Zvcih0IGluIGEuYXR0cnMpYS5hdHRyc1t0XT1uZXcgcy5Nb3JwaE9iaih0aGlzLnRhcmdldCgpLmF0dHIodCksYS5hdHRyc1t0XSk7Zm9yKHQgaW4gYS5zdHlsZXMpYS5zdHlsZXNbdF09bmV3IHMuTW9ycGhPYmoodGhpcy50YXJnZXQoKS5zdHlsZSh0KSxhLnN0eWxlc1t0XSk7cmV0dXJuIGEuaW5pdGlhbFRyYW5zZm9ybWF0aW9uPXRoaXMudGFyZ2V0KCkubWF0cml4aWZ5KCksYS5pbml0PSEwLHRoaXN9LGNsZWFyUXVldWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaXR1YXRpb25zPVtdLHRoaXN9LGNsZWFyQ3VycmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNpdHVhdGlvbj1udWxsLHRoaXN9LHN0b3A6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmFjdGl2ZTtyZXR1cm4gdGhpcy5hY3RpdmU9ITEsZSYmdGhpcy5jbGVhclF1ZXVlKCksdCYmdGhpcy5zaXR1YXRpb24mJighaSYmdGhpcy5zdGFydEN1cnJlbnQoKSx0aGlzLmF0RW5kKCkpLHRoaXMuc3RvcEFuaW1GcmFtZSgpLHRoaXMuY2xlYXJDdXJyZW50KCl9LHJlc2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5zaXR1YXRpb24pe3ZhciB0PXRoaXMuc2l0dWF0aW9uO3RoaXMuc3RvcCgpLHRoaXMuc2l0dWF0aW9uPXQsdGhpcy5hdFN0YXJ0KCl9cmV0dXJuIHRoaXN9LGZpbmlzaDpmdW5jdGlvbigpe2Zvcih0aGlzLnN0b3AoITAsITEpO3RoaXMuZGVxdWV1ZSgpLnNpdHVhdGlvbiYmdGhpcy5zdG9wKCEwLCExKTspO3JldHVybiB0aGlzLmNsZWFyUXVldWUoKS5jbGVhckN1cnJlbnQoKSx0aGlzfSxhdFN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXQoMCwhMCl9LGF0RW5kOmZ1bmN0aW9uKCl7cmV0dXJuITA9PT10aGlzLnNpdHVhdGlvbi5sb29wcyYmKHRoaXMuc2l0dWF0aW9uLmxvb3BzPXRoaXMuc2l0dWF0aW9uLmxvb3ArMSksIm51bWJlciI9PXR5cGVvZiB0aGlzLnNpdHVhdGlvbi5sb29wcz90aGlzLmF0KHRoaXMuc2l0dWF0aW9uLmxvb3BzLCEwKTp0aGlzLmF0KDEsITApfSxhdDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuc2l0dWF0aW9uLmR1cmF0aW9uL3RoaXMuX3NwZWVkO3JldHVybiB0aGlzLmFic1Bvcz10LGV8fCh0aGlzLnNpdHVhdGlvbi5yZXZlcnNlZCYmKHRoaXMuYWJzUG9zPTEtdGhpcy5hYnNQb3MpLHRoaXMuYWJzUG9zKz10aGlzLnNpdHVhdGlvbi5sb29wKSx0aGlzLnNpdHVhdGlvbi5zdGFydD0rbmV3IERhdGUtdGhpcy5hYnNQb3MqaSx0aGlzLnNpdHVhdGlvbi5maW5pc2g9dGhpcy5zaXR1YXRpb24uc3RhcnQraSx0aGlzLnN0ZXAoITApfSxzcGVlZDpmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQ/dGhpcy5wYXVzZSgpOnQ/KHRoaXMuX3NwZWVkPXQsdGhpcy5hdCh0aGlzLmFic1BvcywhMCkpOnRoaXMuX3NwZWVkfSxsb29wOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5sYXN0KCk7cmV0dXJuIGkubG9vcHM9bnVsbD09dHx8dCxpLmxvb3A9MCxlJiYoaS5yZXZlcnNpbmc9ITApLHRoaXN9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGF1c2VkPSEwLHRoaXMuc3RvcEFuaW1GcmFtZSgpLHRoaXN9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXVzZWQ/KHRoaXMucGF1c2VkPSExLHRoaXMuYXQodGhpcy5hYnNQb3MsITApKTp0aGlzfSxyZXZlcnNlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubGFzdCgpO3JldHVybiBlLnJldmVyc2VkPXZvaWQgMD09PXQ/IWUucmV2ZXJzZWQ6dCx0aGlzfSxwcm9ncmVzczpmdW5jdGlvbih0KXtyZXR1cm4gdD90aGlzLnNpdHVhdGlvbi5lYXNlKHRoaXMucG9zKTp0aGlzLnBvc30sYWZ0ZXI6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sYXN0KCk7cmV0dXJuIHRoaXMudGFyZ2V0KCkub24oImZpbmlzaGVkLmZ4IixmdW5jdGlvbiBpKHMpe3MuZGV0YWlsLnNpdHVhdGlvbj09ZSYmKHQuY2FsbCh0aGlzLGUpLHRoaXMub2ZmKCJmaW5pc2hlZC5meCIsaSkpfSksdGhpcy5fY2FsbFN0YXJ0KCl9LGR1cmluZzpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmxhc3QoKSxpPWZ1bmN0aW9uKGkpe2kuZGV0YWlsLnNpdHVhdGlvbj09ZSYmdC5jYWxsKHRoaXMsaS5kZXRhaWwucG9zLHMubW9ycGgoaS5kZXRhaWwucG9zKSxpLmRldGFpbC5lYXNlZCxlKX07cmV0dXJuIHRoaXMudGFyZ2V0KCkub2ZmKCJkdXJpbmcuZngiLGkpLm9uKCJkdXJpbmcuZngiLGkpLHRoaXMuYWZ0ZXIoZnVuY3Rpb24oKXt0aGlzLm9mZigiZHVyaW5nLmZ4IixpKX0pLHRoaXMuX2NhbGxTdGFydCgpfSxhZnRlckFsbDpmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbiBlKGkpe3QuY2FsbCh0aGlzKSx0aGlzLm9mZigiYWxsZmluaXNoZWQuZngiLGUpfTtyZXR1cm4gdGhpcy50YXJnZXQoKS5vZmYoImFsbGZpbmlzaGVkLmZ4IixlKS5vbigiYWxsZmluaXNoZWQuZngiLGUpLHRoaXMuX2NhbGxTdGFydCgpfSxkdXJpbmdBbGw6ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oZSl7dC5jYWxsKHRoaXMsZS5kZXRhaWwucG9zLHMubW9ycGgoZS5kZXRhaWwucG9zKSxlLmRldGFpbC5lYXNlZCxlLmRldGFpbC5zaXR1YXRpb24pfTtyZXR1cm4gdGhpcy50YXJnZXQoKS5vZmYoImR1cmluZy5meCIsZSkub24oImR1cmluZy5meCIsZSksdGhpcy5hZnRlckFsbChmdW5jdGlvbigpe3RoaXMub2ZmKCJkdXJpbmcuZngiLGUpfSksdGhpcy5fY2FsbFN0YXJ0KCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaXR1YXRpb25zLmxlbmd0aD90aGlzLnNpdHVhdGlvbnNbdGhpcy5zaXR1YXRpb25zLmxlbmd0aC0xXTp0aGlzLnNpdHVhdGlvbn0sYWRkOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5sYXN0KClbaXx8ImFuaW1hdGlvbnMiXVt0XT1lLHRoaXMuX2NhbGxTdGFydCgpfSxzdGVwOmZ1bmN0aW9uKHQpe3ZhciBlLGksczsodHx8KHRoaXMuYWJzUG9zPXRoaXMudGltZVRvQWJzUG9zKCtuZXcgRGF0ZSkpLCExIT09dGhpcy5zaXR1YXRpb24ubG9vcHMpPyhlPU1hdGgubWF4KHRoaXMuYWJzUG9zLDApLGk9TWF0aC5mbG9vcihlKSwhMD09PXRoaXMuc2l0dWF0aW9uLmxvb3BzfHxpPHRoaXMuc2l0dWF0aW9uLmxvb3BzPyh0aGlzLnBvcz1lLWkscz10aGlzLnNpdHVhdGlvbi5sb29wLHRoaXMuc2l0dWF0aW9uLmxvb3A9aSk6KHRoaXMuYWJzUG9zPXRoaXMuc2l0dWF0aW9uLmxvb3BzLHRoaXMucG9zPTEscz10aGlzLnNpdHVhdGlvbi5sb29wLTEsdGhpcy5zaXR1YXRpb24ubG9vcD10aGlzLnNpdHVhdGlvbi5sb29wcyksdGhpcy5zaXR1YXRpb24ucmV2ZXJzaW5nJiYodGhpcy5zaXR1YXRpb24ucmV2ZXJzZWQ9dGhpcy5zaXR1YXRpb24ucmV2ZXJzZWQhPUJvb2xlYW4oKHRoaXMuc2l0dWF0aW9uLmxvb3AtcyklMikpKToodGhpcy5hYnNQb3M9TWF0aC5taW4odGhpcy5hYnNQb3MsMSksdGhpcy5wb3M9dGhpcy5hYnNQb3MpO3RoaXMucG9zPDAmJih0aGlzLnBvcz0wKSx0aGlzLnNpdHVhdGlvbi5yZXZlcnNlZCYmKHRoaXMucG9zPTEtdGhpcy5wb3MpO3ZhciBhPXRoaXMuc2l0dWF0aW9uLmVhc2UodGhpcy5wb3MpO2Zvcih2YXIgbiBpbiB0aGlzLnNpdHVhdGlvbi5vbmNlKW4+dGhpcy5sYXN0UG9zJiZuPD1hJiYodGhpcy5zaXR1YXRpb24ub25jZVtuXS5jYWxsKHRoaXMudGFyZ2V0KCksdGhpcy5wb3MsYSksZGVsZXRlIHRoaXMuc2l0dWF0aW9uLm9uY2Vbbl0pO3JldHVybiB0aGlzLmFjdGl2ZSYmdGhpcy50YXJnZXQoKS5maXJlKCJkdXJpbmciLHtwb3M6dGhpcy5wb3MsZWFzZWQ6YSxmeDp0aGlzLHNpdHVhdGlvbjp0aGlzLnNpdHVhdGlvbn0pLHRoaXMuc2l0dWF0aW9uPyh0aGlzLmVhY2hBdCgpLDE9PXRoaXMucG9zJiYhdGhpcy5zaXR1YXRpb24ucmV2ZXJzZWR8fHRoaXMuc2l0dWF0aW9uLnJldmVyc2VkJiYwPT10aGlzLnBvcz8odGhpcy5zdG9wQW5pbUZyYW1lKCksdGhpcy50YXJnZXQoKS5maXJlKCJmaW5pc2hlZCIse2Z4OnRoaXMsc2l0dWF0aW9uOnRoaXMuc2l0dWF0aW9ufSksdGhpcy5zaXR1YXRpb25zLmxlbmd0aHx8KHRoaXMudGFyZ2V0KCkuZmlyZSgiYWxsZmluaXNoZWQiKSx0aGlzLnNpdHVhdGlvbnMubGVuZ3RofHwodGhpcy50YXJnZXQoKS5vZmYoIi5meCIpLHRoaXMuYWN0aXZlPSExKSksdGhpcy5hY3RpdmU/dGhpcy5kZXF1ZXVlKCk6dGhpcy5jbGVhckN1cnJlbnQoKSk6IXRoaXMucGF1c2VkJiZ0aGlzLmFjdGl2ZSYmdGhpcy5zdGFydEFuaW1GcmFtZSgpLHRoaXMubGFzdFBvcz1hLHRoaXMpOnRoaXN9LGVhY2hBdDpmdW5jdGlvbigpe3ZhciB0LGUsaSxhPXRoaXMsbj10aGlzLnRhcmdldCgpLHI9dGhpcy5zaXR1YXRpb247Zm9yKHQgaW4gci5hbmltYXRpb25zKWk9W10uY29uY2F0KHIuYW5pbWF0aW9uc1t0XSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmdC5hdD90LmF0KHIuZWFzZShhLnBvcyksYS5wb3MpOnR9KSxuW3RdLmFwcGx5KG4saSk7Zm9yKHQgaW4gci5hdHRycylpPVt0XS5jb25jYXQoci5hdHRyc1t0XSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciIT10eXBlb2YgdCYmdC5hdD90LmF0KHIuZWFzZShhLnBvcyksYS5wb3MpOnR9KSxuLmF0dHIuYXBwbHkobixpKTtmb3IodCBpbiByLnN0eWxlcylpPVt0XS5jb25jYXQoci5zdHlsZXNbdF0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJnQuYXQ/dC5hdChyLmVhc2UoYS5wb3MpLGEucG9zKTp0fSksbi5zdHlsZS5hcHBseShuLGkpO2lmKHIudHJhbnNmb3Jtcy5sZW5ndGgpe2ZvcihpPXIuaW5pdGlhbFRyYW5zZm9ybWF0aW9uLHQ9MCxlPXIudHJhbnNmb3Jtcy5sZW5ndGg7dDxlO3QrKyl7dmFyIG89ci50cmFuc2Zvcm1zW3RdO28gaW5zdGFuY2VvZiBzLk1hdHJpeD9pPW8ucmVsYXRpdmU/aS5tdWx0aXBseSgobmV3IHMuTWF0cml4KS5tb3JwaChvKS5hdChyLmVhc2UodGhpcy5wb3MpKSk6aS5tb3JwaChvKS5hdChyLmVhc2UodGhpcy5wb3MpKTooby5yZWxhdGl2ZXx8by51bmRvKGkuZXh0cmFjdCgpKSxpPWkubXVsdGlwbHkoby5hdChyLmVhc2UodGhpcy5wb3MpKSkpfW4ubWF0cml4KGkpfXJldHVybiB0aGlzfSxvbmNlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcz10aGlzLmxhc3QoKTtyZXR1cm4gaXx8KHQ9cy5lYXNlKHQpKSxzLm9uY2VbdF09ZSx0aGlzfSxfY2FsbFN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnN0YXJ0KCl9LmJpbmQodGhpcyksMCksdGhpc319LHBhcmVudDpzLkVsZW1lbnQsY29uc3RydWN0OnthbmltYXRlOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4odGhpcy5meHx8KHRoaXMuZng9bmV3IHMuRlgodGhpcykpKS5hbmltYXRlKHQsZSxpKX0sZGVsYXk6ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMuZnh8fCh0aGlzLmZ4PW5ldyBzLkZYKHRoaXMpKSkuZGVsYXkodCl9LHN0b3A6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5meCYmdGhpcy5meC5zdG9wKHQsZSksdGhpc30sZmluaXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZngmJnRoaXMuZnguZmluaXNoKCksdGhpc30scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5meCYmdGhpcy5meC5wYXVzZSgpLHRoaXN9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5meCYmdGhpcy5meC5wbGF5KCksdGhpc30sc3BlZWQ6ZnVuY3Rpb24odCl7aWYodGhpcy5meCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5meC5zcGVlZCgpO3RoaXMuZnguc3BlZWQodCl9cmV0dXJuIHRoaXN9fX0pLHMuTW9ycGhPYmo9cy5pbnZlbnQoe2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiBzLkNvbG9yLmlzQ29sb3IoZSk/bmV3IHMuQ29sb3IodCkubW9ycGgoZSk6cy5yZWdleC5kZWxpbWl0ZXIudGVzdCh0KT9zLnJlZ2V4LnBhdGhMZXR0ZXJzLnRlc3QodCk/bmV3IHMuUGF0aEFycmF5KHQpLm1vcnBoKGUpOm5ldyBzLkFycmF5KHQpLm1vcnBoKGUpOnMucmVnZXgubnVtYmVyQW5kVW5pdC50ZXN0KGUpP25ldyBzLk51bWJlcih0KS5tb3JwaChlKToodGhpcy52YWx1ZT10LHZvaWQodGhpcy5kZXN0aW5hdGlvbj1lKSl9LGV4dGVuZDp7YXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZTwxP3RoaXMudmFsdWU6dGhpcy5kZXN0aW5hdGlvbn0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlfX19KSxzLmV4dGVuZChzLkZYLHthdHRyOmZ1bmN0aW9uKGUsaSxzKXtpZigib2JqZWN0Ij09PXQoZSkpZm9yKHZhciBhIGluIGUpdGhpcy5hdHRyKGEsZVthXSk7ZWxzZSB0aGlzLmFkZChlLGksImF0dHJzIik7cmV0dXJuIHRoaXN9LHN0eWxlOmZ1bmN0aW9uKGUsaSl7aWYoIm9iamVjdCI9PT10KGUpKWZvcih2YXIgcyBpbiBlKXRoaXMuc3R5bGUocyxlW3NdKTtlbHNlIHRoaXMuYWRkKGUsaSwic3R5bGVzIik7cmV0dXJuIHRoaXN9LHg6ZnVuY3Rpb24odCxlKXtpZih0aGlzLnRhcmdldCgpaW5zdGFuY2VvZiBzLkcpcmV0dXJuIHRoaXMudHJhbnNmb3JtKHt4OnR9LGUpLHRoaXM7dmFyIGk9bmV3IHMuTnVtYmVyKHQpO3JldHVybiBpLnJlbGF0aXZlPWUsdGhpcy5hZGQoIngiLGkpfSx5OmZ1bmN0aW9uKHQsZSl7aWYodGhpcy50YXJnZXQoKWluc3RhbmNlb2Ygcy5HKXJldHVybiB0aGlzLnRyYW5zZm9ybSh7eTp0fSxlKSx0aGlzO3ZhciBpPW5ldyBzLk51bWJlcih0KTtyZXR1cm4gaS5yZWxhdGl2ZT1lLHRoaXMuYWRkKCJ5IixpKX0sY3g6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYWRkKCJjeCIsbmV3IHMuTnVtYmVyKHQpKX0sY3k6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYWRkKCJjeSIsbmV3IHMuTnVtYmVyKHQpKX0sbW92ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLngodCkueShlKX0sY2VudGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY3godCkuY3koZSl9LHNpemU6ZnVuY3Rpb24odCxlKXt2YXIgaTt0aGlzLnRhcmdldCgpaW5zdGFuY2VvZiBzLlRleHQ/dGhpcy5hdHRyKCJmb250LXNpemUiLHQpOih0JiZlfHwoaT10aGlzLnRhcmdldCgpLmJib3goKSksdHx8KHQ9aS53aWR0aC9pLmhlaWdodCplKSxlfHwoZT1pLmhlaWdodC9pLndpZHRoKnQpLHRoaXMuYWRkKCJ3aWR0aCIsbmV3IHMuTnVtYmVyKHQpKS5hZGQoImhlaWdodCIsbmV3IHMuTnVtYmVyKGUpKSk7cmV0dXJuIHRoaXN9LHdpZHRoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmFkZCgid2lkdGgiLG5ldyBzLk51bWJlcih0KSl9LGhlaWdodDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hZGQoImhlaWdodCIsbmV3IHMuTnVtYmVyKHQpKX0scGxvdDpmdW5jdGlvbih0LGUsaSxzKXtyZXR1cm4gND09YXJndW1lbnRzLmxlbmd0aD90aGlzLnBsb3QoW3QsZSxpLHNdKTp0aGlzLmFkZCgicGxvdCIsbmV3KHRoaXMudGFyZ2V0KCkubW9ycGhBcnJheSkodCkpfSxsZWFkaW5nOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRhcmdldCgpLmxlYWRpbmc/dGhpcy5hZGQoImxlYWRpbmciLG5ldyBzLk51bWJlcih0KSk6dGhpc30sdmlld2JveDpmdW5jdGlvbih0LGUsaSxhKXtyZXR1cm4gdGhpcy50YXJnZXQoKWluc3RhbmNlb2Ygcy5Db250YWluZXImJnRoaXMuYWRkKCJ2aWV3Ym94IixuZXcgcy5WaWV3Qm94KHQsZSxpLGEpKSx0aGlzfSx1cGRhdGU6ZnVuY3Rpb24odCl7aWYodGhpcy50YXJnZXQoKWluc3RhbmNlb2Ygcy5TdG9wKXtpZigibnVtYmVyIj09dHlwZW9mIHR8fHQgaW5zdGFuY2VvZiBzLk51bWJlcilyZXR1cm4gdGhpcy51cGRhdGUoe29mZnNldDphcmd1bWVudHNbMF0sY29sb3I6YXJndW1lbnRzWzFdLG9wYWNpdHk6YXJndW1lbnRzWzJdfSk7bnVsbCE9dC5vcGFjaXR5JiZ0aGlzLmF0dHIoInN0b3Atb3BhY2l0eSIsdC5vcGFjaXR5KSxudWxsIT10LmNvbG9yJiZ0aGlzLmF0dHIoInN0b3AtY29sb3IiLHQuY29sb3IpLG51bGwhPXQub2Zmc2V0JiZ0aGlzLmF0dHIoIm9mZnNldCIsdC5vZmZzZXQpfXJldHVybiB0aGlzfX0pLHMuQm94PXMuaW52ZW50KHtjcmVhdGU6ZnVuY3Rpb24oZSxpLGEsbil7aWYoISgib2JqZWN0IiE9PXQoZSl8fGUgaW5zdGFuY2VvZiBzLkVsZW1lbnQpKXJldHVybiBzLkJveC5jYWxsKHRoaXMsbnVsbCE9ZS5sZWZ0P2UubGVmdDplLngsbnVsbCE9ZS50b3A/ZS50b3A6ZS55LGUud2lkdGgsZS5oZWlnaHQpOzQ9PWFyZ3VtZW50cy5sZW5ndGgmJih0aGlzLng9ZSx0aGlzLnk9aSx0aGlzLndpZHRoPWEsdGhpcy5oZWlnaHQ9biksbSh0aGlzKX0sZXh0ZW5kOnttZXJnZTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgdGhpcy5jb25zdHJ1Y3RvcjtyZXR1cm4gZS54PU1hdGgubWluKHRoaXMueCx0LngpLGUueT1NYXRoLm1pbih0aGlzLnksdC55KSxlLndpZHRoPU1hdGgubWF4KHRoaXMueCt0aGlzLndpZHRoLHQueCt0LndpZHRoKS1lLngsZS5oZWlnaHQ9TWF0aC5tYXgodGhpcy55K3RoaXMuaGVpZ2h0LHQueSt0LmhlaWdodCktZS55LG0oZSl9LHRyYW5zZm9ybTpmdW5jdGlvbih0KXt2YXIgZSxpPTEvMCxhPS0xLzAsbj0xLzAscj0tMS8wO3JldHVybltuZXcgcy5Qb2ludCh0aGlzLngsdGhpcy55KSxuZXcgcy5Qb2ludCh0aGlzLngyLHRoaXMueSksbmV3IHMuUG9pbnQodGhpcy54LHRoaXMueTIpLG5ldyBzLlBvaW50KHRoaXMueDIsdGhpcy55MildLmZvckVhY2goZnVuY3Rpb24oZSl7ZT1lLnRyYW5zZm9ybSh0KSxpPU1hdGgubWluKGksZS54KSxhPU1hdGgubWF4KGEsZS54KSxuPU1hdGgubWluKG4sZS55KSxyPU1hdGgubWF4KHIsZS55KX0pLChlPW5ldyB0aGlzLmNvbnN0cnVjdG9yKS54PWksZS53aWR0aD1hLWksZS55PW4sZS5oZWlnaHQ9ci1uLG0oZSksZX19fSkscy5CQm94PXMuaW52ZW50KHtjcmVhdGU6ZnVuY3Rpb24odCl7aWYocy5Cb3guYXBwbHkodGhpcyxbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpLHQgaW5zdGFuY2VvZiBzLkVsZW1lbnQpe3ZhciBlO3RyeXtpZighaS5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMpe2Zvcih2YXIgYT10Lm5vZGU7YS5wYXJlbnROb2RlOylhPWEucGFyZW50Tm9kZTtpZihhIT1pKXRocm93IG5ldyBFcnJvcigiRWxlbWVudCBub3QgaW4gdGhlIGRvbSIpfWU9dC5ub2RlLmdldEJCb3goKX1jYXRjaChpKXtpZih0IGluc3RhbmNlb2Ygcy5TaGFwZSl7cy5wYXJzZXIuZHJhd3x8cy5wcmVwYXJlKCk7dmFyIG49dC5jbG9uZShzLnBhcnNlci5kcmF3Lmluc3RhbmNlKS5zaG93KCk7ZT1uLm5vZGUuZ2V0QkJveCgpLG4ucmVtb3ZlKCl9ZWxzZSBlPXt4OnQubm9kZS5jbGllbnRMZWZ0LHk6dC5ub2RlLmNsaWVudFRvcCx3aWR0aDp0Lm5vZGUuY2xpZW50V2lkdGgsaGVpZ2h0OnQubm9kZS5jbGllbnRIZWlnaHR9fXMuQm94LmNhbGwodGhpcyxlKX19LGluaGVyaXQ6cy5Cb3gscGFyZW50OnMuRWxlbWVudCxjb25zdHJ1Y3Q6e2Jib3g6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHMuQkJveCh0aGlzKX19fSkscy5CQm94LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1zLkJCb3gscy5leHRlbmQocy5FbGVtZW50LHt0Ym94OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVXNlIG9mIFRCb3ggaXMgZGVwcmVjYXRlZCBhbmQgbWFwcGVkIHRvIFJCb3guIFVzZSAucmJveCgpIGluc3RlYWQuIiksdGhpcy5yYm94KHRoaXMuZG9jKCkpfX0pLHMuUkJveD1zLmludmVudCh7Y3JlYXRlOmZ1bmN0aW9uKHQpe3MuQm94LmFwcGx5KHRoaXMsW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKSx0IGluc3RhbmNlb2Ygcy5FbGVtZW50JiZzLkJveC5jYWxsKHRoaXMsdC5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKX0saW5oZXJpdDpzLkJveCxwYXJlbnQ6cy5FbGVtZW50LGV4dGVuZDp7YWRkT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueCs9ZS5wYWdlWE9mZnNldCx0aGlzLnkrPWUucGFnZVlPZmZzZXQsdGhpc319LGNvbnN0cnVjdDp7cmJveDpmdW5jdGlvbih0KXtyZXR1cm4gdD9uZXcgcy5SQm94KHRoaXMpLnRyYW5zZm9ybSh0LnNjcmVlbkNUTSgpLmludmVyc2UoKSk6bmV3IHMuUkJveCh0aGlzKS5hZGRPZmZzZXQoKX19fSkscy5SQm94LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1zLlJCb3gscy5NYXRyaXg9cy5pbnZlbnQoe2NyZWF0ZTpmdW5jdGlvbihlKXt2YXIgaSxhPXAoWzEsMCwwLDEsMCwwXSk7Zm9yKGU9ZSBpbnN0YW5jZW9mIHMuRWxlbWVudD9lLm1hdHJpeGlmeSgpOiJzdHJpbmciPT10eXBlb2YgZT9wKGUuc3BsaXQocy5yZWdleC5kZWxpbWl0ZXIpLm1hcChwYXJzZUZsb2F0KSk6Nj09YXJndW1lbnRzLmxlbmd0aD9wKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk6QXJyYXkuaXNBcnJheShlKT9wKGUpOiJvYmplY3QiPT09dChlKT9lOmEsaT15Lmxlbmd0aC0xO2k+PTA7LS1pKXRoaXNbeVtpXV09bnVsbCE9ZVt5W2ldXT9lW3lbaV1dOmFbeVtpXV19LGV4dGVuZDp7ZXh0cmFjdDpmdW5jdGlvbigpe3ZhciB0PWYodGhpcywwLDEpLGU9Zih0aGlzLDEsMCksaT0xODAvTWF0aC5QSSpNYXRoLmF0YW4yKHQueSx0LngpLTkwO3JldHVybnt4OnRoaXMuZSx5OnRoaXMuZix0cmFuc2Zvcm1lZFg6KHRoaXMuZSpNYXRoLmNvcyhpKk1hdGguUEkvMTgwKSt0aGlzLmYqTWF0aC5zaW4oaSpNYXRoLlBJLzE4MCkpL01hdGguc3FydCh0aGlzLmEqdGhpcy5hK3RoaXMuYip0aGlzLmIpLHRyYW5zZm9ybWVkWToodGhpcy5mKk1hdGguY29zKGkqTWF0aC5QSS8xODApK3RoaXMuZSpNYXRoLnNpbigtaSpNYXRoLlBJLzE4MCkpL01hdGguc3FydCh0aGlzLmMqdGhpcy5jK3RoaXMuZCp0aGlzLmQpLHNrZXdYOi1pLHNrZXdZOjE4MC9NYXRoLlBJKk1hdGguYXRhbjIoZS55LGUueCksc2NhbGVYOk1hdGguc3FydCh0aGlzLmEqdGhpcy5hK3RoaXMuYip0aGlzLmIpLHNjYWxlWTpNYXRoLnNxcnQodGhpcy5jKnRoaXMuYyt0aGlzLmQqdGhpcy5kKSxyb3RhdGlvbjppLGE6dGhpcy5hLGI6dGhpcy5iLGM6dGhpcy5jLGQ6dGhpcy5kLGU6dGhpcy5lLGY6dGhpcy5mLG1hdHJpeDpuZXcgcy5NYXRyaXgodGhpcyl9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgcy5NYXRyaXgodGhpcyl9LG1vcnBoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRlc3RpbmF0aW9uPW5ldyBzLk1hdHJpeCh0KSx0aGlzfSxhdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZXN0aW5hdGlvbj9uZXcgcy5NYXRyaXgoe2E6dGhpcy5hKyh0aGlzLmRlc3RpbmF0aW9uLmEtdGhpcy5hKSp0LGI6dGhpcy5iKyh0aGlzLmRlc3RpbmF0aW9uLmItdGhpcy5iKSp0LGM6dGhpcy5jKyh0aGlzLmRlc3RpbmF0aW9uLmMtdGhpcy5jKSp0LGQ6dGhpcy5kKyh0aGlzLmRlc3RpbmF0aW9uLmQtdGhpcy5kKSp0LGU6dGhpcy5lKyh0aGlzLmRlc3RpbmF0aW9uLmUtdGhpcy5lKSp0LGY6dGhpcy5mKyh0aGlzLmRlc3RpbmF0aW9uLmYtdGhpcy5mKSp0fSk6dGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBzLk1hdHJpeCh0aGlzLm5hdGl2ZSgpLm11bHRpcGx5KGZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBzLk1hdHJpeHx8KHQ9bmV3IHMuTWF0cml4KHQpKTtyZXR1cm4gdH0odCkubmF0aXZlKCkpKX0saW52ZXJzZTpmdW5jdGlvbigpe3JldHVybiBuZXcgcy5NYXRyaXgodGhpcy5uYXRpdmUoKS5pbnZlcnNlKCkpfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHMuTWF0cml4KHRoaXMubmF0aXZlKCkudHJhbnNsYXRlKHR8fDAsZXx8MCkpfSxzY2FsZTpmdW5jdGlvbih0LGUsaSxhKXtyZXR1cm4gMT09YXJndW1lbnRzLmxlbmd0aD9lPXQ6Mz09YXJndW1lbnRzLmxlbmd0aCYmKGE9aSxpPWUsZT10KSx0aGlzLmFyb3VuZChpLGEsbmV3IHMuTWF0cml4KHQsMCwwLGUsMCwwKSl9LHJvdGF0ZTpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQ9cy51dGlscy5yYWRpYW5zKHQpLHRoaXMuYXJvdW5kKGUsaSxuZXcgcy5NYXRyaXgoTWF0aC5jb3ModCksTWF0aC5zaW4odCksLU1hdGguc2luKHQpLE1hdGguY29zKHQpLDAsMCkpfSxmbGlwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIngiPT10P3RoaXMuc2NhbGUoLTEsMSxlLDApOiJ5Ij09dD90aGlzLnNjYWxlKDEsLTEsMCxlKTp0aGlzLnNjYWxlKC0xLC0xLHQsbnVsbCE9ZT9lOnQpfSxza2V3OmZ1bmN0aW9uKHQsZSxpLGEpe3JldHVybiAxPT1hcmd1bWVudHMubGVuZ3RoP2U9dDozPT1hcmd1bWVudHMubGVuZ3RoJiYoYT1pLGk9ZSxlPXQpLHQ9cy51dGlscy5yYWRpYW5zKHQpLGU9cy51dGlscy5yYWRpYW5zKGUpLHRoaXMuYXJvdW5kKGksYSxuZXcgcy5NYXRyaXgoMSxNYXRoLnRhbihlKSxNYXRoLnRhbih0KSwxLDAsMCkpfSxza2V3WDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMuc2tldyh0LDAsZSxpKX0sc2tld1k6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLnNrZXcoMCx0LGUsaSl9LGFyb3VuZDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMubXVsdGlwbHkobmV3IHMuTWF0cml4KDEsMCwwLDEsdHx8MCxlfHwwKSkubXVsdGlwbHkoaSkubXVsdGlwbHkobmV3IHMuTWF0cml4KDEsMCwwLDEsLXR8fDAsLWV8fDApKX0sbmF0aXZlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXMucGFyc2VyLm5hdGl2ZS5jcmVhdGVTVkdNYXRyaXgoKSxlPXkubGVuZ3RoLTE7ZT49MDtlLS0pdFt5W2VdXT10aGlzW3lbZV1dO3JldHVybiB0fSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJtYXRyaXgoIit2KHRoaXMuYSkrIiwiK3YodGhpcy5iKSsiLCIrdih0aGlzLmMpKyIsIit2KHRoaXMuZCkrIiwiK3YodGhpcy5lKSsiLCIrdih0aGlzLmYpKyIpIn19LHBhcmVudDpzLkVsZW1lbnQsY29uc3RydWN0OntjdG06ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHMuTWF0cml4KHRoaXMubm9kZS5nZXRDVE0oKSl9LHNjcmVlbkNUTTpmdW5jdGlvbigpe2lmKHRoaXMgaW5zdGFuY2VvZiBzLk5lc3RlZCl7dmFyIHQ9dGhpcy5yZWN0KDEsMSksZT10Lm5vZGUuZ2V0U2NyZWVuQ1RNKCk7cmV0dXJuIHQucmVtb3ZlKCksbmV3IHMuTWF0cml4KGUpfXJldHVybiBuZXcgcy5NYXRyaXgodGhpcy5ub2RlLmdldFNjcmVlbkNUTSgpKX19fSkscy5Qb2ludD1zLmludmVudCh7Y3JlYXRlOmZ1bmN0aW9uKGUsaSl7dmFyIHM7cz1BcnJheS5pc0FycmF5KGUpP3t4OmVbMF0seTplWzFdfToib2JqZWN0Ij09PXQoZSk/e3g6ZS54LHk6ZS55fTpudWxsIT1lP3t4OmUseTpudWxsIT1pP2k6ZX06e3g6MCx5OjB9LHRoaXMueD1zLngsdGhpcy55PXMueX0sZXh0ZW5kOntjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgcy5Qb2ludCh0aGlzKX0sbW9ycGg6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5kZXN0aW5hdGlvbj1uZXcgcy5Qb2ludCh0LGUpLHRoaXN9LGF0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRlc3RpbmF0aW9uP25ldyBzLlBvaW50KHt4OnRoaXMueCsodGhpcy5kZXN0aW5hdGlvbi54LXRoaXMueCkqdCx5OnRoaXMueSsodGhpcy5kZXN0aW5hdGlvbi55LXRoaXMueSkqdH0pOnRoaXN9LG5hdGl2ZTpmdW5jdGlvbigpe3ZhciB0PXMucGFyc2VyLm5hdGl2ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiB0Lng9dGhpcy54LHQueT10aGlzLnksdH0sdHJhbnNmb3JtOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcy5Qb2ludCh0aGlzLm5hdGl2ZSgpLm1hdHJpeFRyYW5zZm9ybSh0Lm5hdGl2ZSgpKSl9fX0pLHMuZXh0ZW5kKHMuRWxlbWVudCx7cG9pbnQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHMuUG9pbnQodCxlKS50cmFuc2Zvcm0odGhpcy5zY3JlZW5DVE0oKS5pbnZlcnNlKCkpfX0pLHMuZXh0ZW5kKHMuRWxlbWVudCx7YXR0cjpmdW5jdGlvbihlLGksYSl7aWYobnVsbD09ZSl7Zm9yKGU9e30sYT0oaT10aGlzLm5vZGUuYXR0cmlidXRlcykubGVuZ3RoLTE7YT49MDthLS0pZVtpW2FdLm5vZGVOYW1lXT1zLnJlZ2V4LmlzTnVtYmVyLnRlc3QoaVthXS5ub2RlVmFsdWUpP3BhcnNlRmxvYXQoaVthXS5ub2RlVmFsdWUpOmlbYV0ubm9kZVZhbHVlO3JldHVybiBlfWlmKCJvYmplY3QiPT09dChlKSlmb3IoaSBpbiBlKXRoaXMuYXR0cihpLGVbaV0pO2Vsc2UgaWYobnVsbD09PWkpdGhpcy5ub2RlLnJlbW92ZUF0dHJpYnV0ZShlKTtlbHNle2lmKG51bGw9PWkpcmV0dXJuIG51bGw9PShpPXRoaXMubm9kZS5nZXRBdHRyaWJ1dGUoZSkpP3MuZGVmYXVsdHMuYXR0cnNbZV06cy5yZWdleC5pc051bWJlci50ZXN0KGkpP3BhcnNlRmxvYXQoaSk6aTsic3Ryb2tlLXdpZHRoIj09ZT90aGlzLmF0dHIoInN0cm9rZSIscGFyc2VGbG9hdChpKT4wP3RoaXMuX3N0cm9rZTpudWxsKToic3Ryb2tlIj09ZSYmKHRoaXMuX3N0cm9rZT1pKSwiZmlsbCIhPWUmJiJzdHJva2UiIT1lfHwocy5yZWdleC5pc0ltYWdlLnRlc3QoaSkmJihpPXRoaXMuZG9jKCkuZGVmcygpLmltYWdlKGksMCwwKSksaSBpbnN0YW5jZW9mIHMuSW1hZ2UmJihpPXRoaXMuZG9jKCkuZGVmcygpLnBhdHRlcm4oMCwwLGZ1bmN0aW9uKCl7dGhpcy5hZGQoaSl9KSkpLCJudW1iZXIiPT10eXBlb2YgaT9pPW5ldyBzLk51bWJlcihpKTpzLkNvbG9yLmlzQ29sb3IoaSk/aT1uZXcgcy5Db2xvcihpKTpBcnJheS5pc0FycmF5KGkpJiYoaT1uZXcgcy5BcnJheShpKSksImxlYWRpbmciPT1lP3RoaXMubGVhZGluZyYmdGhpcy5sZWFkaW5nKGkpOiJzdHJpbmciPT10eXBlb2YgYT90aGlzLm5vZGUuc2V0QXR0cmlidXRlTlMoYSxlLGkudG9TdHJpbmcoKSk6dGhpcy5ub2RlLnNldEF0dHJpYnV0ZShlLGkudG9TdHJpbmcoKSksIXRoaXMucmVidWlsZHx8ImZvbnQtc2l6ZSIhPWUmJiJ4IiE9ZXx8dGhpcy5yZWJ1aWxkKGUsaSl9cmV0dXJuIHRoaXN9fSkscy5leHRlbmQocy5FbGVtZW50LHt0cmFuc2Zvcm06ZnVuY3Rpb24oZSxpKXt2YXIgYSxuO2lmKCJvYmplY3QiIT09dChlKSlyZXR1cm4gYT1uZXcgcy5NYXRyaXgodGhpcykuZXh0cmFjdCgpLCJzdHJpbmciPT10eXBlb2YgZT9hW2VdOmE7aWYoYT1uZXcgcy5NYXRyaXgodGhpcyksaT0hIWl8fCEhZS5yZWxhdGl2ZSxudWxsIT1lLmEpYT1pP2EubXVsdGlwbHkobmV3IHMuTWF0cml4KGUpKTpuZXcgcy5NYXRyaXgoZSk7ZWxzZSBpZihudWxsIT1lLnJvdGF0aW9uKXgoZSx0aGlzKSxhPWk/YS5yb3RhdGUoZS5yb3RhdGlvbixlLmN4LGUuY3kpOmEucm90YXRlKGUucm90YXRpb24tYS5leHRyYWN0KCkucm90YXRpb24sZS5jeCxlLmN5KTtlbHNlIGlmKG51bGwhPWUuc2NhbGV8fG51bGwhPWUuc2NhbGVYfHxudWxsIT1lLnNjYWxlWSl7aWYoeChlLHRoaXMpLGUuc2NhbGVYPW51bGwhPWUuc2NhbGU/ZS5zY2FsZTpudWxsIT1lLnNjYWxlWD9lLnNjYWxlWDoxLGUuc2NhbGVZPW51bGwhPWUuc2NhbGU/ZS5zY2FsZTpudWxsIT1lLnNjYWxlWT9lLnNjYWxlWToxLCFpKXt2YXIgcj1hLmV4dHJhY3QoKTtlLnNjYWxlWD0xKmUuc2NhbGVYL3Iuc2NhbGVYLGUuc2NhbGVZPTEqZS5zY2FsZVkvci5zY2FsZVl9YT1hLnNjYWxlKGUuc2NhbGVYLGUuc2NhbGVZLGUuY3gsZS5jeSl9ZWxzZSBpZihudWxsIT1lLnNrZXd8fG51bGwhPWUuc2tld1h8fG51bGwhPWUuc2tld1kpe2lmKHgoZSx0aGlzKSxlLnNrZXdYPW51bGwhPWUuc2tldz9lLnNrZXc6bnVsbCE9ZS5za2V3WD9lLnNrZXdYOjAsZS5za2V3WT1udWxsIT1lLnNrZXc/ZS5za2V3Om51bGwhPWUuc2tld1k/ZS5za2V3WTowLCFpKXtyPWEuZXh0cmFjdCgpO2E9YS5tdWx0aXBseSgobmV3IHMuTWF0cml4KS5za2V3KHIuc2tld1gsci5za2V3WSxlLmN4LGUuY3kpLmludmVyc2UoKSl9YT1hLnNrZXcoZS5za2V3WCxlLnNrZXdZLGUuY3gsZS5jeSl9ZWxzZSBlLmZsaXA/KCJ4Ij09ZS5mbGlwfHwieSI9PWUuZmxpcD9lLm9mZnNldD1udWxsPT1lLm9mZnNldD90aGlzLmJib3goKVsiYyIrZS5mbGlwXTplLm9mZnNldDpudWxsPT1lLm9mZnNldD8obj10aGlzLmJib3goKSxlLmZsaXA9bi5jeCxlLm9mZnNldD1uLmN5KTplLmZsaXA9ZS5vZmZzZXQsYT0obmV3IHMuTWF0cml4KS5mbGlwKGUuZmxpcCxlLm9mZnNldCkpOm51bGw9PWUueCYmbnVsbD09ZS55fHwoaT9hPWEudHJhbnNsYXRlKGUueCxlLnkpOihudWxsIT1lLngmJihhLmU9ZS54KSxudWxsIT1lLnkmJihhLmY9ZS55KSkpO3JldHVybiB0aGlzLmF0dHIoInRyYW5zZm9ybSIsYSl9fSkscy5leHRlbmQocy5GWCx7dHJhbnNmb3JtOmZ1bmN0aW9uKGUsaSl7dmFyIGEsbixyPXRoaXMudGFyZ2V0KCk7cmV0dXJuIm9iamVjdCIhPT10KGUpPyhhPW5ldyBzLk1hdHJpeChyKS5leHRyYWN0KCksInN0cmluZyI9PXR5cGVvZiBlP2FbZV06YSk6KGk9ISFpfHwhIWUucmVsYXRpdmUsbnVsbCE9ZS5hP2E9bmV3IHMuTWF0cml4KGUpOm51bGwhPWUucm90YXRpb24/KHgoZSxyKSxhPW5ldyBzLlJvdGF0ZShlLnJvdGF0aW9uLGUuY3gsZS5jeSkpOm51bGwhPWUuc2NhbGV8fG51bGwhPWUuc2NhbGVYfHxudWxsIT1lLnNjYWxlWT8oeChlLHIpLGUuc2NhbGVYPW51bGwhPWUuc2NhbGU/ZS5zY2FsZTpudWxsIT1lLnNjYWxlWD9lLnNjYWxlWDoxLGUuc2NhbGVZPW51bGwhPWUuc2NhbGU/ZS5zY2FsZTpudWxsIT1lLnNjYWxlWT9lLnNjYWxlWToxLGE9bmV3IHMuU2NhbGUoZS5zY2FsZVgsZS5zY2FsZVksZS5jeCxlLmN5KSk6bnVsbCE9ZS5za2V3WHx8bnVsbCE9ZS5za2V3WT8oeChlLHIpLGUuc2tld1g9bnVsbCE9ZS5za2V3WD9lLnNrZXdYOjAsZS5za2V3WT1udWxsIT1lLnNrZXdZP2Uuc2tld1k6MCxhPW5ldyBzLlNrZXcoZS5za2V3WCxlLnNrZXdZLGUuY3gsZS5jeSkpOmUuZmxpcD8oIngiPT1lLmZsaXB8fCJ5Ij09ZS5mbGlwP2Uub2Zmc2V0PW51bGw9PWUub2Zmc2V0P3IuYmJveCgpWyJjIitlLmZsaXBdOmUub2Zmc2V0Om51bGw9PWUub2Zmc2V0PyhuPXIuYmJveCgpLGUuZmxpcD1uLmN4LGUub2Zmc2V0PW4uY3kpOmUuZmxpcD1lLm9mZnNldCxhPShuZXcgcy5NYXRyaXgpLmZsaXAoZS5mbGlwLGUub2Zmc2V0KSk6bnVsbD09ZS54JiZudWxsPT1lLnl8fChhPW5ldyBzLlRyYW5zbGF0ZShlLngsZS55KSksYT8oYS5yZWxhdGl2ZT1pLHRoaXMubGFzdCgpLnRyYW5zZm9ybXMucHVzaChhKSx0aGlzLl9jYWxsU3RhcnQoKSk6dGhpcyl9fSkscy5leHRlbmQocy5FbGVtZW50LHt1bnRyYW5zZm9ybTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF0dHIoInRyYW5zZm9ybSIsbnVsbCl9LG1hdHJpeGlmeTpmdW5jdGlvbigpe3JldHVybih0aGlzLmF0dHIoInRyYW5zZm9ybSIpfHwiIikuc3BsaXQocy5yZWdleC50cmFuc2Zvcm1zKS5zbGljZSgwLC0xKS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9dC50cmltKCkuc3BsaXQoIigiKTtyZXR1cm5bZVswXSxlWzFdLnNwbGl0KHMucmVnZXguZGVsaW1pdGVyKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlRmxvYXQodCl9KV19KS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4ibWF0cml4Ij09ZVswXT90Lm11bHRpcGx5KHAoZVsxXSkpOnRbZVswXV0uYXBwbHkodCxlWzFdKX0sbmV3IHMuTWF0cml4KX0sdG9QYXJlbnQ6ZnVuY3Rpb24odCl7aWYodGhpcz09dClyZXR1cm4gdGhpczt2YXIgZT10aGlzLnNjcmVlbkNUTSgpLGk9dC5zY3JlZW5DVE0oKS5pbnZlcnNlKCk7cmV0dXJuIHRoaXMuYWRkVG8odCkudW50cmFuc2Zvcm0oKS50cmFuc2Zvcm0oaS5tdWx0aXBseShlKSksdGhpc30sdG9Eb2M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1BhcmVudCh0aGlzLmRvYygpKX19KSxzLlRyYW5zZm9ybWF0aW9uPXMuaW52ZW50KHtjcmVhdGU6ZnVuY3Rpb24oZSxpKXtpZihhcmd1bWVudHMubGVuZ3RoPjEmJiJib29sZWFuIiE9dHlwZW9mIGkpcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY2FsbCh0aGlzLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHM9MCxhPXRoaXMuYXJndW1lbnRzLmxlbmd0aDtzPGE7KytzKXRoaXNbdGhpcy5hcmd1bWVudHNbc11dPWVbc107ZWxzZSBpZigib2JqZWN0Ij09PXQoZSkpZm9yKHM9MCxhPXRoaXMuYXJndW1lbnRzLmxlbmd0aDtzPGE7KytzKXRoaXNbdGhpcy5hcmd1bWVudHNbc11dPWVbdGhpcy5hcmd1bWVudHNbc11dO3RoaXMuaW52ZXJzZWQ9ITEsITA9PT1pJiYodGhpcy5pbnZlcnNlZD0hMCl9LGV4dGVuZDp7YXJndW1lbnRzOltdLG1ldGhvZDoiIixhdDpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wLGE9dGhpcy5hcmd1bWVudHMubGVuZ3RoO2k8YTsrK2kpZS5wdXNoKHRoaXNbdGhpcy5hcmd1bWVudHNbaV1dKTt2YXIgbj10aGlzLl91bmRvfHxuZXcgcy5NYXRyaXg7cmV0dXJuIG49KG5ldyBzLk1hdHJpeCkubW9ycGgocy5NYXRyaXgucHJvdG90eXBlW3RoaXMubWV0aG9kXS5hcHBseShuLGUpKS5hdCh0KSx0aGlzLmludmVyc2VkP24uaW52ZXJzZSgpOm59LHVuZG86ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsaT10aGlzLmFyZ3VtZW50cy5sZW5ndGg7ZTxpOysrZSl0W3RoaXMuYXJndW1lbnRzW2VdXT12b2lkIDA9PT10aGlzW3RoaXMuYXJndW1lbnRzW2VdXT8wOnRbdGhpcy5hcmd1bWVudHNbZV1dO3JldHVybiB0LmN4PXRoaXMuY3gsdC5jeT10aGlzLmN5LHRoaXMuX3VuZG89bmV3KHNbZCh0aGlzLm1ldGhvZCldKSh0LCEwKS5hdCgxKSx0aGlzfX19KSxzLlRyYW5zbGF0ZT1zLmludmVudCh7cGFyZW50OnMuTWF0cml4LGluaGVyaXQ6cy5UcmFuc2Zvcm1hdGlvbixjcmVhdGU6ZnVuY3Rpb24odCxlKXt0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKX0sZXh0ZW5kOnthcmd1bWVudHM6WyJ0cmFuc2Zvcm1lZFgiLCJ0cmFuc2Zvcm1lZFkiXSxtZXRob2Q6InRyYW5zbGF0ZSJ9fSkscy5Sb3RhdGU9cy5pbnZlbnQoe3BhcmVudDpzLk1hdHJpeCxpbmhlcml0OnMuVHJhbnNmb3JtYXRpb24sY3JlYXRlOmZ1bmN0aW9uKHQsZSl7dGhpcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9LGV4dGVuZDp7YXJndW1lbnRzOlsicm90YXRpb24iLCJjeCIsImN5Il0sbWV0aG9kOiJyb3RhdGUiLGF0OmZ1bmN0aW9uKHQpe3ZhciBlPShuZXcgcy5NYXRyaXgpLnJvdGF0ZSgobmV3IHMuTnVtYmVyKS5tb3JwaCh0aGlzLnJvdGF0aW9uLSh0aGlzLl91bmRvP3RoaXMuX3VuZG8ucm90YXRpb246MCkpLmF0KHQpLHRoaXMuY3gsdGhpcy5jeSk7cmV0dXJuIHRoaXMuaW52ZXJzZWQ/ZS5pbnZlcnNlKCk6ZX0sdW5kbzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdW5kbz10LHRoaXN9fX0pLHMuU2NhbGU9cy5pbnZlbnQoe3BhcmVudDpzLk1hdHJpeCxpbmhlcml0OnMuVHJhbnNmb3JtYXRpb24sY3JlYXRlOmZ1bmN0aW9uKHQsZSl7dGhpcy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9LGV4dGVuZDp7YXJndW1lbnRzOlsic2NhbGVYIiwic2NhbGVZIiwiY3giLCJjeSJdLG1ldGhvZDoic2NhbGUifX0pLHMuU2tldz1zLmludmVudCh7cGFyZW50OnMuTWF0cml4LGluaGVyaXQ6cy5UcmFuc2Zvcm1hdGlvbixjcmVhdGU6ZnVuY3Rpb24odCxlKXt0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKX0sZXh0ZW5kOnthcmd1bWVudHM6WyJza2V3WCIsInNrZXdZIiwiY3giLCJjeSJdLG1ldGhvZDoic2tldyJ9fSkscy5leHRlbmQocy5FbGVtZW50LHtzdHlsZTpmdW5jdGlvbihlLGkpe2lmKDA9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMubm9kZS5zdHlsZS5jc3NUZXh0fHwiIjtpZihhcmd1bWVudHMubGVuZ3RoPDIpaWYoIm9iamVjdCI9PT10KGUpKWZvcihpIGluIGUpdGhpcy5zdHlsZShpLGVbaV0pO2Vsc2V7aWYoIXMucmVnZXguaXNDc3MudGVzdChlKSlyZXR1cm4gdGhpcy5ub2RlLnN0eWxlW2MoZSldO2ZvcihlPWUuc3BsaXQoL1xzKjtccyovKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuISF0fSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnNwbGl0KC9ccyo6XHMqLyl9KTtpPWUucG9wKCk7KXRoaXMuc3R5bGUoaVswXSxpWzFdKX1lbHNlIHRoaXMubm9kZS5zdHlsZVtjKGUpXT1udWxsPT09aXx8cy5yZWdleC5pc0JsYW5rLnRlc3QoaSk/IiI6aTtyZXR1cm4gdGhpc319KSxzLlBhcmVudD1zLmludmVudCh7Y3JlYXRlOmZ1bmN0aW9uKHQpe3RoaXMuY29uc3RydWN0b3IuY2FsbCh0aGlzLHQpfSxpbmhlcml0OnMuRWxlbWVudCxleHRlbmQ6e2NoaWxkcmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHMudXRpbHMubWFwKHMudXRpbHMuZmlsdGVyU1ZHRWxlbWVudHModGhpcy5ub2RlLmNoaWxkTm9kZXMpLGZ1bmN0aW9uKHQpe3JldHVybiBzLmFkb3B0KHQpfSl9LGFkZDpmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lP3RoaXMubm9kZS5hcHBlbmRDaGlsZCh0Lm5vZGUpOnQubm9kZSE9dGhpcy5ub2RlLmNoaWxkTm9kZXNbZV0mJnRoaXMubm9kZS5pbnNlcnRCZWZvcmUodC5ub2RlLHRoaXMubm9kZS5jaGlsZE5vZGVzW2VdKSx0aGlzfSxwdXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5hZGQodCxlKSx0fSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW5kZXgodCk+PTB9LGluZGV4OmZ1bmN0aW9uKHQpe3JldHVybltdLnNsaWNlLmNhbGwodGhpcy5ub2RlLmNoaWxkTm9kZXMpLmluZGV4T2YodC5ub2RlKX0sZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiBzLmFkb3B0KHRoaXMubm9kZS5jaGlsZE5vZGVzW3RdKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQodGhpcy5ub2RlLmNoaWxkTm9kZXMubGVuZ3RoLTEpfSxlYWNoOmZ1bmN0aW9uKHQsZSl7dmFyIGksYSxuPXRoaXMuY2hpbGRyZW4oKTtmb3IoaT0wLGE9bi5sZW5ndGg7aTxhO2krKyluW2ldaW5zdGFuY2VvZiBzLkVsZW1lbnQmJnQuYXBwbHkobltpXSxbaSxuXSksZSYmbltpXWluc3RhbmNlb2Ygcy5Db250YWluZXImJm5baV0uZWFjaCh0LGUpO3JldHVybiB0aGlzfSxyZW1vdmVFbGVtZW50OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm5vZGUucmVtb3ZlQ2hpbGQodC5ub2RlKSx0aGlzfSxjbGVhcjpmdW5jdGlvbigpe2Zvcig7dGhpcy5ub2RlLmhhc0NoaWxkTm9kZXMoKTspdGhpcy5ub2RlLnJlbW92ZUNoaWxkKHRoaXMubm9kZS5sYXN0Q2hpbGQpO3JldHVybiBkZWxldGUgdGhpcy5fZGVmcyx0aGlzfSxkZWZzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jKCkuZGVmcygpfX19KSxzLmV4dGVuZChzLlBhcmVudCx7dW5ncm91cDpmdW5jdGlvbih0LGUpe3JldHVybiAwPT09ZXx8dGhpcyBpbnN0YW5jZW9mIHMuRGVmc3x8dGhpcy5ub2RlPT1zLnBhcnNlci5kcmF3P3RoaXM6KHQ9dHx8KHRoaXMgaW5zdGFuY2VvZiBzLkRvYz90aGlzOnRoaXMucGFyZW50KHMuUGFyZW50KSksZT1lfHwxLzAsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBzLkRlZnM/dGhpczp0aGlzIGluc3RhbmNlb2Ygcy5QYXJlbnQ/dGhpcy51bmdyb3VwKHQsZS0xKTp0aGlzLnRvUGFyZW50KHQpfSksdGhpcy5ub2RlLmZpcnN0Q2hpbGR8fHRoaXMucmVtb3ZlKCksdGhpcyl9LGZsYXR0ZW46ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy51bmdyb3VwKHQsZSl9fSkscy5Db250YWluZXI9cy5pbnZlbnQoe2NyZWF0ZTpmdW5jdGlvbih0KXt0aGlzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyx0KX0saW5oZXJpdDpzLlBhcmVudH0pLHMuVmlld0JveD1zLmludmVudCh7Y3JlYXRlOmZ1bmN0aW9uKGUpe3ZhciBpLGEsbixyLG8sbCxoLGM9MSxkPTEsdT0vWystXT8oPzpcZCsoPzpcLlxkKik/fFwuXGQrKSg/OmVbKy1dP1xkKyk/L2dpO2lmKGUgaW5zdGFuY2VvZiBzLkVsZW1lbnQpe2ZvcihsPWUsaD1lLG89KGUuYXR0cigidmlld0JveCIpfHwiIikubWF0Y2godSksZS5iYm94LG49bmV3IHMuTnVtYmVyKGUud2lkdGgoKSkscj1uZXcgcy5OdW1iZXIoZS5oZWlnaHQoKSk7IiUiPT1uLnVuaXQ7KWMqPW4udmFsdWUsbj1uZXcgcy5OdW1iZXIobCBpbnN0YW5jZW9mIHMuRG9jP2wucGFyZW50KCkub2Zmc2V0V2lkdGg6bC5wYXJlbnQoKS53aWR0aCgpKSxsPWwucGFyZW50KCk7Zm9yKDsiJSI9PXIudW5pdDspZCo9ci52YWx1ZSxyPW5ldyBzLk51bWJlcihoIGluc3RhbmNlb2Ygcy5Eb2M/aC5wYXJlbnQoKS5vZmZzZXRIZWlnaHQ6aC5wYXJlbnQoKS5oZWlnaHQoKSksaD1oLnBhcmVudCgpO3RoaXMueD0wLHRoaXMueT0wLHRoaXMud2lkdGg9bipjLHRoaXMuaGVpZ2h0PXIqZCx0aGlzLnpvb209MSxvJiYoaT1wYXJzZUZsb2F0KG9bMF0pLGE9cGFyc2VGbG9hdChvWzFdKSxuPXBhcnNlRmxvYXQob1syXSkscj1wYXJzZUZsb2F0KG9bM10pLHRoaXMuem9vbT10aGlzLndpZHRoL3RoaXMuaGVpZ2h0Pm4vcj90aGlzLmhlaWdodC9yOnRoaXMud2lkdGgvbix0aGlzLng9aSx0aGlzLnk9YSx0aGlzLndpZHRoPW4sdGhpcy5oZWlnaHQ9cil9ZWxzZSBlPSJzdHJpbmciPT10eXBlb2YgZT9lLm1hdGNoKHUpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VGbG9hdCh0KX0pOkFycmF5LmlzQXJyYXkoZSk/ZToib2JqZWN0Ij09PXQoZSk/W2UueCxlLnksZS53aWR0aCxlLmhlaWdodF06ND09YXJndW1lbnRzLmxlbmd0aD9bXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk6WzAsMCwwLDBdLHRoaXMueD1lWzBdLHRoaXMueT1lWzFdLHRoaXMud2lkdGg9ZVsyXSx0aGlzLmhlaWdodD1lWzNdfSxleHRlbmQ6e3RvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueCsiICIrdGhpcy55KyIgIit0aGlzLndpZHRoKyIgIit0aGlzLmhlaWdodH0sbW9ycGg6ZnVuY3Rpb24odCxlLGksYSl7cmV0dXJuIHRoaXMuZGVzdGluYXRpb249bmV3IHMuVmlld0JveCh0LGUsaSxhKSx0aGlzfSxhdDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZXN0aW5hdGlvbj9uZXcgcy5WaWV3Qm94KFt0aGlzLngrKHRoaXMuZGVzdGluYXRpb24ueC10aGlzLngpKnQsdGhpcy55Kyh0aGlzLmRlc3RpbmF0aW9uLnktdGhpcy55KSp0LHRoaXMud2lkdGgrKHRoaXMuZGVzdGluYXRpb24ud2lkdGgtdGhpcy53aWR0aCkqdCx0aGlzLmhlaWdodCsodGhpcy5kZXN0aW5hdGlvbi5oZWlnaHQtdGhpcy5oZWlnaHQpKnRdKTp0aGlzfX0scGFyZW50OnMuQ29udGFpbmVyLGNvbnN0cnVjdDp7dmlld2JveDpmdW5jdGlvbih0LGUsaSxhKXtyZXR1cm4gMD09YXJndW1lbnRzLmxlbmd0aD9uZXcgcy5WaWV3Qm94KHRoaXMpOnRoaXMuYXR0cigidmlld0JveCIsbmV3IHMuVmlld0JveCh0LGUsaSxhKSl9fX0pLFsiY2xpY2siLCJkYmxjbGljayIsIm1vdXNlZG93biIsIm1vdXNldXAiLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsIm1vdXNlbW92ZSIsInRvdWNoc3RhcnQiLCJ0b3VjaG1vdmUiLCJ0b3VjaGxlYXZlIiwidG91Y2hlbmQiLCJ0b3VjaGNhbmNlbCJdLmZvckVhY2goZnVuY3Rpb24odCl7cy5FbGVtZW50LnByb3RvdHlwZVt0XT1mdW5jdGlvbihlKXtyZXR1cm4gcy5vbih0aGlzLm5vZGUsdCxlKSx0aGlzfX0pLHMubGlzdGVuZXJzPVtdLHMuaGFuZGxlck1hcD1bXSxzLmxpc3RlbmVySWQ9MCxzLm9uPWZ1bmN0aW9uKHQsZSxpLGEsbil7dmFyIHI9aS5iaW5kKGF8fHQuaW5zdGFuY2V8fHQpLG89KHMuaGFuZGxlck1hcC5pbmRleE9mKHQpKzF8fHMuaGFuZGxlck1hcC5wdXNoKHQpKS0xLGw9ZS5zcGxpdCgiLiIpWzBdLGg9ZS5zcGxpdCgiLiIpWzFdfHwiKiI7cy5saXN0ZW5lcnNbb109cy5saXN0ZW5lcnNbb118fHt9LHMubGlzdGVuZXJzW29dW2xdPXMubGlzdGVuZXJzW29dW2xdfHx7fSxzLmxpc3RlbmVyc1tvXVtsXVtoXT1zLmxpc3RlbmVyc1tvXVtsXVtoXXx8e30saS5fc3ZnanNMaXN0ZW5lcklkfHwoaS5fc3ZnanNMaXN0ZW5lcklkPSsrcy5saXN0ZW5lcklkKSxzLmxpc3RlbmVyc1tvXVtsXVtoXVtpLl9zdmdqc0xpc3RlbmVySWRdPXIsdC5hZGRFdmVudExpc3RlbmVyKGwscixufHwhMSl9LHMub2ZmPWZ1bmN0aW9uKHQsZSxpKXt2YXIgYT1zLmhhbmRsZXJNYXAuaW5kZXhPZih0KSxuPWUmJmUuc3BsaXQoIi4iKVswXSxyPWUmJmUuc3BsaXQoIi4iKVsxXSxvPSIiO2lmKC0xIT1hKWlmKGkpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoaT1pLl9zdmdqc0xpc3RlbmVySWQpLCFpKXJldHVybjtzLmxpc3RlbmVyc1thXVtuXSYmcy5saXN0ZW5lcnNbYV1bbl1bcnx8IioiXSYmKHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLHMubGlzdGVuZXJzW2FdW25dW3J8fCIqIl1baV0sITEpLGRlbGV0ZSBzLmxpc3RlbmVyc1thXVtuXVtyfHwiKiJdW2ldKX1lbHNlIGlmKHImJm4pe2lmKHMubGlzdGVuZXJzW2FdW25dJiZzLmxpc3RlbmVyc1thXVtuXVtyXSl7Zm9yKGkgaW4gcy5saXN0ZW5lcnNbYV1bbl1bcl0pcy5vZmYodCxbbixyXS5qb2luKCIuIiksaSk7ZGVsZXRlIHMubGlzdGVuZXJzW2FdW25dW3JdfX1lbHNlIGlmKHIpZm9yKGUgaW4gcy5saXN0ZW5lcnNbYV0pZm9yKG8gaW4gcy5saXN0ZW5lcnNbYV1bZV0pcj09PW8mJnMub2ZmKHQsW2Uscl0uam9pbigiLiIpKTtlbHNlIGlmKG4pe2lmKHMubGlzdGVuZXJzW2FdW25dKXtmb3IobyBpbiBzLmxpc3RlbmVyc1thXVtuXSlzLm9mZih0LFtuLG9dLmpvaW4oIi4iKSk7ZGVsZXRlIHMubGlzdGVuZXJzW2FdW25dfX1lbHNle2ZvcihlIGluIHMubGlzdGVuZXJzW2FdKXMub2ZmKHQsZSk7ZGVsZXRlIHMubGlzdGVuZXJzW2FdLGRlbGV0ZSBzLmhhbmRsZXJNYXBbYV19fSxzLmV4dGVuZChzLkVsZW1lbnQse29uOmZ1bmN0aW9uKHQsZSxpLGEpe3JldHVybiBzLm9uKHRoaXMubm9kZSx0LGUsaSxhKSx0aGlzfSxvZmY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcy5vZmYodGhpcy5ub2RlLHQsZSksdGhpc30sZmlyZTpmdW5jdGlvbih0LGkpe3JldHVybiB0IGluc3RhbmNlb2YgZS5FdmVudD90aGlzLm5vZGUuZGlzcGF0Y2hFdmVudCh0KTp0aGlzLm5vZGUuZGlzcGF0Y2hFdmVudCh0PW5ldyBzLkN1c3RvbUV2ZW50KHQse2RldGFpbDppLGNhbmNlbGFibGU6ITB9KSksdGhpcy5fZXZlbnQ9dCx0aGlzfSxldmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudH19KSxzLkRlZnM9cy5pbnZlbnQoe2NyZWF0ZToiZGVmcyIsaW5oZXJpdDpzLkNvbnRhaW5lcn0pLHMuRz1zLmludmVudCh7Y3JlYXRlOiJnIixpbmhlcml0OnMuQ29udGFpbmVyLGV4dGVuZDp7eDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLnRyYW5zZm9ybSgieCIpOnRoaXMudHJhbnNmb3JtKHt4OnQtdGhpcy54KCl9LCEwKX0seTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLnRyYW5zZm9ybSgieSIpOnRoaXMudHJhbnNmb3JtKHt5OnQtdGhpcy55KCl9LCEwKX0sY3g6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5nYm94KCkuY3g6dGhpcy54KHQtdGhpcy5nYm94KCkud2lkdGgvMil9LGN5OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuZ2JveCgpLmN5OnRoaXMueSh0LXRoaXMuZ2JveCgpLmhlaWdodC8yKX0sZ2JveDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYmJveCgpLGU9dGhpcy50cmFuc2Zvcm0oKTtyZXR1cm4gdC54Kz1lLngsdC54Mis9ZS54LHQuY3grPWUueCx0LnkrPWUueSx0LnkyKz1lLnksdC5jeSs9ZS55LHR9fSxjb25zdHJ1Y3Q6e2dyb3VwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHV0KG5ldyBzLkcpfX19KSxzLkRvYz1zLmludmVudCh7Y3JlYXRlOmZ1bmN0aW9uKHQpe3QmJigic3ZnIj09KHQ9InN0cmluZyI9PXR5cGVvZiB0P2kuZ2V0RWxlbWVudEJ5SWQodCk6dCkubm9kZU5hbWU/dGhpcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsdCk6KHRoaXMuY29uc3RydWN0b3IuY2FsbCh0aGlzLHMuY3JlYXRlKCJzdmciKSksdC5hcHBlbmRDaGlsZCh0aGlzLm5vZGUpLHRoaXMuc2l6ZSgiMTAwJSIsIjEwMCUiKSksdGhpcy5uYW1lc3BhY2UoKS5kZWZzKCkpfSxpbmhlcml0OnMuQ29udGFpbmVyLGV4dGVuZDp7bmFtZXNwYWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXR0cih7eG1sbnM6cy5ucyx2ZXJzaW9uOiIxLjEifSkuYXR0cigieG1sbnM6eGxpbmsiLHMueGxpbmsscy54bWxucykuYXR0cigieG1sbnM6c3ZnanMiLHMuc3ZnanMscy54bWxucyl9LGRlZnM6ZnVuY3Rpb24oKXt2YXIgdDt0aGlzLl9kZWZzfHwoKHQ9dGhpcy5ub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkZWZzIilbMF0pP3RoaXMuX2RlZnM9cy5hZG9wdCh0KTp0aGlzLl9kZWZzPW5ldyBzLkRlZnMsdGhpcy5ub2RlLmFwcGVuZENoaWxkKHRoaXMuX2RlZnMubm9kZSkpO3JldHVybiB0aGlzLl9kZWZzfSxwYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLnBhcmVudE5vZGUmJiIjZG9jdW1lbnQiIT10aGlzLm5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZT90aGlzLm5vZGUucGFyZW50Tm9kZTpudWxsfSxzcG9mOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ub2RlLmdldFNjcmVlbkNUTSgpO3JldHVybiB0JiZ0aGlzLnN0eWxlKCJsZWZ0IiwtdC5lJTErInB4Iikuc3R5bGUoInRvcCIsLXQuZiUxKyJweCIpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpJiZ0aGlzLnBhcmVudCgpLnJlbW92ZUNoaWxkKHRoaXMubm9kZSksdGhpc30sY2xlYXI6ZnVuY3Rpb24oKXtmb3IoO3RoaXMubm9kZS5oYXNDaGlsZE5vZGVzKCk7KXRoaXMubm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5vZGUubGFzdENoaWxkKTtyZXR1cm4gZGVsZXRlIHRoaXMuX2RlZnMscy5wYXJzZXIuZHJhdyYmIXMucGFyc2VyLmRyYXcucGFyZW50Tm9kZSYmdGhpcy5ub2RlLmFwcGVuZENoaWxkKHMucGFyc2VyLmRyYXcpLHRoaXN9LGNsb25lOmZ1bmN0aW9uKHQpe3RoaXMud3JpdGVEYXRhVG9Eb20oKTt2YXIgZT10aGlzLm5vZGUsaT1iKGUuY2xvbmVOb2RlKCEwKSk7cmV0dXJuIHQ/KHQubm9kZXx8dCkuYXBwZW5kQ2hpbGQoaS5ub2RlKTplLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGkubm9kZSxlLm5leHRTaWJsaW5nKSxpfX19KSxzLmV4dGVuZChzLkVsZW1lbnQse3NpYmxpbmdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuY2hpbGRyZW4oKX0scG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5pbmRleCh0aGlzKX0sbmV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNpYmxpbmdzKClbdGhpcy5wb3NpdGlvbigpKzFdfSxwcmV2aW91czpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNpYmxpbmdzKClbdGhpcy5wb3NpdGlvbigpLTFdfSxmb3J3YXJkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wb3NpdGlvbigpKzEsZT10aGlzLnBhcmVudCgpO3JldHVybiBlLnJlbW92ZUVsZW1lbnQodGhpcykuYWRkKHRoaXMsdCksZSBpbnN0YW5jZW9mIHMuRG9jJiZlLm5vZGUuYXBwZW5kQ2hpbGQoZS5kZWZzKCkubm9kZSksdGhpc30sYmFja3dhcmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBvc2l0aW9uKCk7cmV0dXJuIHQ+MCYmdGhpcy5wYXJlbnQoKS5yZW1vdmVFbGVtZW50KHRoaXMpLmFkZCh0aGlzLHQtMSksdGhpc30sZnJvbnQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBhcmVudCgpO3JldHVybiB0Lm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5ub2RlKSx0IGluc3RhbmNlb2Ygcy5Eb2MmJnQubm9kZS5hcHBlbmRDaGlsZCh0LmRlZnMoKS5ub2RlKSx0aGlzfSxiYWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9zaXRpb24oKT4wJiZ0aGlzLnBhcmVudCgpLnJlbW92ZUVsZW1lbnQodGhpcykuYWRkKHRoaXMsMCksdGhpc30sYmVmb3JlOmZ1bmN0aW9uKHQpe3QucmVtb3ZlKCk7dmFyIGU9dGhpcy5wb3NpdGlvbigpO3JldHVybiB0aGlzLnBhcmVudCgpLmFkZCh0LGUpLHRoaXN9LGFmdGVyOmZ1bmN0aW9uKHQpe3QucmVtb3ZlKCk7dmFyIGU9dGhpcy5wb3NpdGlvbigpO3JldHVybiB0aGlzLnBhcmVudCgpLmFkZCh0LGUrMSksdGhpc319KSxzLk1hc2s9cy5pbnZlbnQoe2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuY29uc3RydWN0b3IuY2FsbCh0aGlzLHMuY3JlYXRlKCJtYXNrIikpLHRoaXMudGFyZ2V0cz1bXX0saW5oZXJpdDpzLkNvbnRhaW5lcixleHRlbmQ6e3JlbW92ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnRhcmdldHMubGVuZ3RoLTE7dD49MDt0LS0pdGhpcy50YXJnZXRzW3RdJiZ0aGlzLnRhcmdldHNbdF0udW5tYXNrKCk7cmV0dXJuIHRoaXMudGFyZ2V0cz1bXSxzLkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMpLHRoaXN9fSxjb25zdHJ1Y3Q6e21hc2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWZzKCkucHV0KG5ldyBzLk1hc2spfX19KSxzLmV4dGVuZChzLkVsZW1lbnQse21hc2tXaXRoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1hc2tlcj10IGluc3RhbmNlb2Ygcy5NYXNrP3Q6dGhpcy5wYXJlbnQoKS5tYXNrKCkuYWRkKHQpLHRoaXMubWFza2VyLnRhcmdldHMucHVzaCh0aGlzKSx0aGlzLmF0dHIoIm1hc2siLCd1cmwoIiMnK3RoaXMubWFza2VyLmF0dHIoImlkIikrJyIpJyl9LHVubWFzazpmdW5jdGlvbigpe3JldHVybiBkZWxldGUgdGhpcy5tYXNrZXIsdGhpcy5hdHRyKCJtYXNrIixudWxsKX19KSxzLkNsaXBQYXRoPXMuaW52ZW50KHtjcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxzLmNyZWF0ZSgiY2xpcFBhdGgiKSksdGhpcy50YXJnZXRzPVtdfSxpbmhlcml0OnMuQ29udGFpbmVyLGV4dGVuZDp7cmVtb3ZlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMudGFyZ2V0cy5sZW5ndGgtMTt0Pj0wO3QtLSl0aGlzLnRhcmdldHNbdF0mJnRoaXMudGFyZ2V0c1t0XS51bmNsaXAoKTtyZXR1cm4gdGhpcy50YXJnZXRzPVtdLHRoaXMucGFyZW50KCkucmVtb3ZlRWxlbWVudCh0aGlzKSx0aGlzfX0sY29uc3RydWN0OntjbGlwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVmcygpLnB1dChuZXcgcy5DbGlwUGF0aCl9fX0pLHMuZXh0ZW5kKHMuRWxlbWVudCx7Y2xpcFdpdGg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xpcHBlcj10IGluc3RhbmNlb2Ygcy5DbGlwUGF0aD90OnRoaXMucGFyZW50KCkuY2xpcCgpLmFkZCh0KSx0aGlzLmNsaXBwZXIudGFyZ2V0cy5wdXNoKHRoaXMpLHRoaXMuYXR0cigiY2xpcC1wYXRoIiwndXJsKCIjJyt0aGlzLmNsaXBwZXIuYXR0cigiaWQiKSsnIiknKX0sdW5jbGlwOmZ1bmN0aW9uKCl7cmV0dXJuIGRlbGV0ZSB0aGlzLmNsaXBwZXIsdGhpcy5hdHRyKCJjbGlwLXBhdGgiLG51bGwpfX0pLHMuR3JhZGllbnQ9cy5pbnZlbnQoe2NyZWF0ZTpmdW5jdGlvbih0KXt0aGlzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxzLmNyZWF0ZSh0KyJHcmFkaWVudCIpKSx0aGlzLnR5cGU9dH0saW5oZXJpdDpzLkNvbnRhaW5lcixleHRlbmQ6e2F0OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5wdXQobmV3IHMuU3RvcCkudXBkYXRlKHQsZSxpKX0sdXBkYXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsZWFyKCksImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuY2FsbCh0aGlzLHRoaXMpLHRoaXN9LGZpbGw6ZnVuY3Rpb24oKXtyZXR1cm4idXJsKCMiK3RoaXMuaWQoKSsiKSJ9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCgpfSxhdHRyOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4idHJhbnNmb3JtIj09dCYmKHQ9ImdyYWRpZW50VHJhbnNmb3JtIikscy5Db250YWluZXIucHJvdG90eXBlLmF0dHIuY2FsbCh0aGlzLHQsZSxpKX19LGNvbnN0cnVjdDp7Z3JhZGllbnQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5kZWZzKCkuZ3JhZGllbnQodCxlKX19fSkscy5leHRlbmQocy5HcmFkaWVudCxzLkZYLHtmcm9tOmZ1bmN0aW9uKHQsZSl7cmV0dXJuInJhZGlhbCI9PSh0aGlzLl90YXJnZXR8fHRoaXMpLnR5cGU/dGhpcy5hdHRyKHtmeDpuZXcgcy5OdW1iZXIodCksZnk6bmV3IHMuTnVtYmVyKGUpfSk6dGhpcy5hdHRyKHt4MTpuZXcgcy5OdW1iZXIodCkseTE6bmV3IHMuTnVtYmVyKGUpfSl9LHRvOmZ1bmN0aW9uKHQsZSl7cmV0dXJuInJhZGlhbCI9PSh0aGlzLl90YXJnZXR8fHRoaXMpLnR5cGU/dGhpcy5hdHRyKHtjeDpuZXcgcy5OdW1iZXIodCksY3k6bmV3IHMuTnVtYmVyKGUpfSk6dGhpcy5hdHRyKHt4MjpuZXcgcy5OdW1iZXIodCkseTI6bmV3IHMuTnVtYmVyKGUpfSl9fSkscy5leHRlbmQocy5EZWZzLHtncmFkaWVudDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnB1dChuZXcgcy5HcmFkaWVudCh0KSkudXBkYXRlKGUpfX0pLHMuU3RvcD1zLmludmVudCh7Y3JlYXRlOiJzdG9wIixpbmhlcml0OnMuRWxlbWVudCxleHRlbmQ6e3VwZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4oIm51bWJlciI9PXR5cGVvZiB0fHx0IGluc3RhbmNlb2Ygcy5OdW1iZXIpJiYodD17b2Zmc2V0OmFyZ3VtZW50c1swXSxjb2xvcjphcmd1bWVudHNbMV0sb3BhY2l0eTphcmd1bWVudHNbMl19KSxudWxsIT10Lm9wYWNpdHkmJnRoaXMuYXR0cigic3RvcC1vcGFjaXR5Iix0Lm9wYWNpdHkpLG51bGwhPXQuY29sb3ImJnRoaXMuYXR0cigic3RvcC1jb2xvciIsdC5jb2xvciksbnVsbCE9dC5vZmZzZXQmJnRoaXMuYXR0cigib2Zmc2V0IixuZXcgcy5OdW1iZXIodC5vZmZzZXQpKSx0aGlzfX19KSxzLlBhdHRlcm49cy5pbnZlbnQoe2NyZWF0ZToicGF0dGVybiIsaW5oZXJpdDpzLkNvbnRhaW5lcixleHRlbmQ6e2ZpbGw6ZnVuY3Rpb24oKXtyZXR1cm4idXJsKCMiK3RoaXMuaWQoKSsiKSJ9LHVwZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbGVhcigpLCJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LmNhbGwodGhpcyx0aGlzKSx0aGlzfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwoKX0sYXR0cjpmdW5jdGlvbih0LGUsaSl7cmV0dXJuInRyYW5zZm9ybSI9PXQmJih0PSJwYXR0ZXJuVHJhbnNmb3JtIikscy5Db250YWluZXIucHJvdG90eXBlLmF0dHIuY2FsbCh0aGlzLHQsZSxpKX19LGNvbnN0cnVjdDp7cGF0dGVybjpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMuZGVmcygpLnBhdHRlcm4odCxlLGkpfX19KSxzLmV4dGVuZChzLkRlZnMse3BhdHRlcm46ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLnB1dChuZXcgcy5QYXR0ZXJuKS51cGRhdGUoaSkuYXR0cih7eDowLHk6MCx3aWR0aDp0LGhlaWdodDplLHBhdHRlcm5Vbml0czoidXNlclNwYWNlT25Vc2UifSl9fSkscy5TaGFwZT1zLmludmVudCh7Y3JlYXRlOmZ1bmN0aW9uKHQpe3RoaXMuY29uc3RydWN0b3IuY2FsbCh0aGlzLHQpfSxpbmhlcml0OnMuRWxlbWVudH0pLHMuQmFyZT1zLmludmVudCh7Y3JlYXRlOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMscy5jcmVhdGUodCkpLGUpZm9yKHZhciBpIGluIGUucHJvdG90eXBlKSJmdW5jdGlvbiI9PXR5cGVvZiBlLnByb3RvdHlwZVtpXSYmKHRoaXNbaV09ZS5wcm90b3R5cGVbaV0pfSxpbmhlcml0OnMuRWxlbWVudCxleHRlbmQ6e3dvcmRzOmZ1bmN0aW9uKHQpe2Zvcig7dGhpcy5ub2RlLmhhc0NoaWxkTm9kZXMoKTspdGhpcy5ub2RlLnJlbW92ZUNoaWxkKHRoaXMubm9kZS5sYXN0Q2hpbGQpO3JldHVybiB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoaS5jcmVhdGVUZXh0Tm9kZSh0KSksdGhpc319fSkscy5leHRlbmQocy5QYXJlbnQse2VsZW1lbnQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wdXQobmV3IHMuQmFyZSh0LGUpKX19KSxzLlN5bWJvbD1zLmludmVudCh7Y3JlYXRlOiJzeW1ib2wiLGluaGVyaXQ6cy5Db250YWluZXIsY29uc3RydWN0OntzeW1ib2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXQobmV3IHMuU3ltYm9sKX19fSkscy5Vc2U9cy5pbnZlbnQoe2NyZWF0ZToidXNlIixpbmhlcml0OnMuU2hhcGUsZXh0ZW5kOntlbGVtZW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYXR0cigiaHJlZiIsKGV8fCIiKSsiIyIrdCxzLnhsaW5rKX19LGNvbnN0cnVjdDp7dXNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucHV0KG5ldyBzLlVzZSkuZWxlbWVudCh0LGUpfX19KSxzLlJlY3Q9cy5pbnZlbnQoe2NyZWF0ZToicmVjdCIsaW5oZXJpdDpzLlNoYXBlLGNvbnN0cnVjdDp7cmVjdDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnB1dChuZXcgcy5SZWN0KS5zaXplKHQsZSl9fX0pLHMuQ2lyY2xlPXMuaW52ZW50KHtjcmVhdGU6ImNpcmNsZSIsaW5oZXJpdDpzLlNoYXBlLGNvbnN0cnVjdDp7Y2lyY2xlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1dChuZXcgcy5DaXJjbGUpLnJ4KG5ldyBzLk51bWJlcih0KS5kaXZpZGUoMikpLm1vdmUoMCwwKX19fSkscy5leHRlbmQocy5DaXJjbGUscy5GWCx7cng6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXR0cigiciIsdCl9LHJ5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJ4KHQpfX0pLHMuRWxsaXBzZT1zLmludmVudCh7Y3JlYXRlOiJlbGxpcHNlIixpbmhlcml0OnMuU2hhcGUsY29uc3RydWN0OntlbGxpcHNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucHV0KG5ldyBzLkVsbGlwc2UpLnNpemUodCxlKS5tb3ZlKDAsMCl9fX0pLHMuZXh0ZW5kKHMuRWxsaXBzZSxzLlJlY3Qscy5GWCx7cng6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXR0cigicngiLHQpfSxyeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hdHRyKCJyeSIsdCl9fSkscy5leHRlbmQocy5DaXJjbGUscy5FbGxpcHNlLHt4OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuY3goKS10aGlzLnJ4KCk6dGhpcy5jeCh0K3RoaXMucngoKSl9LHk6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5jeSgpLXRoaXMucnkoKTp0aGlzLmN5KHQrdGhpcy5yeSgpKX0sY3g6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5hdHRyKCJjeCIpOnRoaXMuYXR0cigiY3giLHQpfSxjeTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLmF0dHIoImN5Iik6dGhpcy5hdHRyKCJjeSIsdCl9LHdpZHRoOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PzIqdGhpcy5yeCgpOnRoaXMucngobmV3IHMuTnVtYmVyKHQpLmRpdmlkZSgyKSl9LGhlaWdodDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8yKnRoaXMucnkoKTp0aGlzLnJ5KG5ldyBzLk51bWJlcih0KS5kaXZpZGUoMikpfSxzaXplOmZ1bmN0aW9uKHQsZSl7dmFyIGk9Zyh0aGlzLHQsZSk7cmV0dXJuIHRoaXMucngobmV3IHMuTnVtYmVyKGkud2lkdGgpLmRpdmlkZSgyKSkucnkobmV3IHMuTnVtYmVyKGkuaGVpZ2h0KS5kaXZpZGUoMikpfX0pLHMuTGluZT1zLmludmVudCh7Y3JlYXRlOiJsaW5lIixpbmhlcml0OnMuU2hhcGUsZXh0ZW5kOnthcnJheTpmdW5jdGlvbigpe3JldHVybiBuZXcgcy5Qb2ludEFycmF5KFtbdGhpcy5hdHRyKCJ4MSIpLHRoaXMuYXR0cigieTEiKV0sW3RoaXMuYXR0cigieDIiKSx0aGlzLmF0dHIoInkyIildXSl9LHBsb3Q6ZnVuY3Rpb24odCxlLGksYSl7cmV0dXJuIG51bGw9PXQ/dGhpcy5hcnJheSgpOih0PXZvaWQgMCE9PWU/e3gxOnQseTE6ZSx4MjppLHkyOmF9Om5ldyBzLlBvaW50QXJyYXkodCkudG9MaW5lKCksdGhpcy5hdHRyKHQpKX0sbW92ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmF0dHIodGhpcy5hcnJheSgpLm1vdmUodCxlKS50b0xpbmUoKSl9LHNpemU6ZnVuY3Rpb24odCxlKXt2YXIgaT1nKHRoaXMsdCxlKTtyZXR1cm4gdGhpcy5hdHRyKHRoaXMuYXJyYXkoKS5zaXplKGkud2lkdGgsaS5oZWlnaHQpLnRvTGluZSgpKX19LGNvbnN0cnVjdDp7bGluZTpmdW5jdGlvbih0LGUsaSxhKXtyZXR1cm4gcy5MaW5lLnByb3RvdHlwZS5wbG90LmFwcGx5KHRoaXMucHV0KG5ldyBzLkxpbmUpLG51bGwhPXQ/W3QsZSxpLGFdOlswLDAsMCwwXSl9fX0pLHMuUG9seWxpbmU9cy5pbnZlbnQoe2NyZWF0ZToicG9seWxpbmUiLGluaGVyaXQ6cy5TaGFwZSxjb25zdHJ1Y3Q6e3BvbHlsaW5lOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1dChuZXcgcy5Qb2x5bGluZSkucGxvdCh0fHxuZXcgcy5Qb2ludEFycmF5KX19fSkscy5Qb2x5Z29uPXMuaW52ZW50KHtjcmVhdGU6InBvbHlnb24iLGluaGVyaXQ6cy5TaGFwZSxjb25zdHJ1Y3Q6e3BvbHlnb246ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHV0KG5ldyBzLlBvbHlnb24pLnBsb3QodHx8bmV3IHMuUG9pbnRBcnJheSl9fX0pLHMuZXh0ZW5kKHMuUG9seWxpbmUscy5Qb2x5Z29uLHthcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnJheXx8KHRoaXMuX2FycmF5PW5ldyBzLlBvaW50QXJyYXkodGhpcy5hdHRyKCJwb2ludHMiKSkpfSxwbG90OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuYXJyYXkoKTp0aGlzLmNsZWFyKCkuYXR0cigicG9pbnRzIiwic3RyaW5nIj09dHlwZW9mIHQ/dDp0aGlzLl9hcnJheT1uZXcgcy5Qb2ludEFycmF5KHQpKX0sY2xlYXI6ZnVuY3Rpb24oKXtyZXR1cm4gZGVsZXRlIHRoaXMuX2FycmF5LHRoaXN9LG1vdmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5hdHRyKCJwb2ludHMiLHRoaXMuYXJyYXkoKS5tb3ZlKHQsZSkpfSxzaXplOmZ1bmN0aW9uKHQsZSl7dmFyIGk9Zyh0aGlzLHQsZSk7cmV0dXJuIHRoaXMuYXR0cigicG9pbnRzIix0aGlzLmFycmF5KCkuc2l6ZShpLndpZHRoLGkuaGVpZ2h0KSl9fSkscy5leHRlbmQocy5MaW5lLHMuUG9seWxpbmUscy5Qb2x5Z29uLHttb3JwaEFycmF5OnMuUG9pbnRBcnJheSx4OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuYmJveCgpLng6dGhpcy5tb3ZlKHQsdGhpcy5iYm94KCkueSl9LHk6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5iYm94KCkueTp0aGlzLm1vdmUodGhpcy5iYm94KCkueCx0KX0sd2lkdGg6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5iYm94KCk7cmV0dXJuIG51bGw9PXQ/ZS53aWR0aDp0aGlzLnNpemUodCxlLmhlaWdodCl9LGhlaWdodDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmJib3goKTtyZXR1cm4gbnVsbD09dD9lLmhlaWdodDp0aGlzLnNpemUoZS53aWR0aCx0KX19KSxzLlBhdGg9cy5pbnZlbnQoe2NyZWF0ZToicGF0aCIsaW5oZXJpdDpzLlNoYXBlLGV4dGVuZDp7bW9ycGhBcnJheTpzLlBhdGhBcnJheSxhcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnJheXx8KHRoaXMuX2FycmF5PW5ldyBzLlBhdGhBcnJheSh0aGlzLmF0dHIoImQiKSkpfSxwbG90OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuYXJyYXkoKTp0aGlzLmNsZWFyKCkuYXR0cigiZCIsInN0cmluZyI9PXR5cGVvZiB0P3Q6dGhpcy5fYXJyYXk9bmV3IHMuUGF0aEFycmF5KHQpKX0sY2xlYXI6ZnVuY3Rpb24oKXtyZXR1cm4gZGVsZXRlIHRoaXMuX2FycmF5LHRoaXN9LG1vdmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5hdHRyKCJkIix0aGlzLmFycmF5KCkubW92ZSh0LGUpKX0seDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLmJib3goKS54OnRoaXMubW92ZSh0LHRoaXMuYmJveCgpLnkpfSx5OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuYmJveCgpLnk6dGhpcy5tb3ZlKHRoaXMuYmJveCgpLngsdCl9LHNpemU6ZnVuY3Rpb24odCxlKXt2YXIgaT1nKHRoaXMsdCxlKTtyZXR1cm4gdGhpcy5hdHRyKCJkIix0aGlzLmFycmF5KCkuc2l6ZShpLndpZHRoLGkuaGVpZ2h0KSl9LHdpZHRoOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuYmJveCgpLndpZHRoOnRoaXMuc2l6ZSh0LHRoaXMuYmJveCgpLmhlaWdodCl9LGhlaWdodDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLmJib3goKS5oZWlnaHQ6dGhpcy5zaXplKHRoaXMuYmJveCgpLndpZHRoLHQpfX0sY29uc3RydWN0OntwYXRoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1dChuZXcgcy5QYXRoKS5wbG90KHR8fG5ldyBzLlBhdGhBcnJheSl9fX0pLHMuSW1hZ2U9cy5pbnZlbnQoe2NyZWF0ZToiaW1hZ2UiLGluaGVyaXQ6cy5TaGFwZSxleHRlbmQ6e2xvYWQ6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIHRoaXM7dmFyIGk9dGhpcyxhPW5ldyBlLkltYWdlO3JldHVybiBzLm9uKGEsImxvYWQiLGZ1bmN0aW9uKCl7cy5vZmYoYSk7dmFyIGU9aS5wYXJlbnQocy5QYXR0ZXJuKTtudWxsIT09ZSYmKDA9PWkud2lkdGgoKSYmMD09aS5oZWlnaHQoKSYmaS5zaXplKGEud2lkdGgsYS5oZWlnaHQpLGUmJjA9PWUud2lkdGgoKSYmMD09ZS5oZWlnaHQoKSYmZS5zaXplKGkud2lkdGgoKSxpLmhlaWdodCgpKSwiZnVuY3Rpb24iPT10eXBlb2YgaS5fbG9hZGVkJiZpLl9sb2FkZWQuY2FsbChpLHt3aWR0aDphLndpZHRoLGhlaWdodDphLmhlaWdodCxyYXRpbzphLndpZHRoL2EuaGVpZ2h0LHVybDp0fSkpfSkscy5vbihhLCJlcnJvciIsZnVuY3Rpb24odCl7cy5vZmYoYSksImZ1bmN0aW9uIj09dHlwZW9mIGkuX2Vycm9yJiZpLl9lcnJvci5jYWxsKGksdCl9KSx0aGlzLmF0dHIoImhyZWYiLGEuc3JjPXRoaXMuc3JjPXQscy54bGluayl9LGxvYWRlZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbG9hZGVkPXQsdGhpc30sZXJyb3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2Vycm9yPXQsdGhpc319LGNvbnN0cnVjdDp7aW1hZ2U6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLnB1dChuZXcgcy5JbWFnZSkubG9hZCh0KS5zaXplKGV8fDAsaXx8ZXx8MCl9fX0pLHMuVGV4dD1zLmludmVudCh7Y3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMscy5jcmVhdGUoInRleHQiKSksdGhpcy5kb20ubGVhZGluZz1uZXcgcy5OdW1iZXIoMS4zKSx0aGlzLl9yZWJ1aWxkPSEwLHRoaXMuX2J1aWxkPSExLHRoaXMuYXR0cigiZm9udC1mYW1pbHkiLHMuZGVmYXVsdHMuYXR0cnNbImZvbnQtZmFtaWx5Il0pfSxpbmhlcml0OnMuU2hhcGUsZXh0ZW5kOnt4OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuYXR0cigieCIpOnRoaXMuYXR0cigieCIsdCl9LHk6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5hdHRyKCJ5IiksaT0ibnVtYmVyIj09dHlwZW9mIGU/ZS10aGlzLmJib3goKS55OjA7cmV0dXJuIG51bGw9PXQ/Im51bWJlciI9PXR5cGVvZiBlP2UtaTplOnRoaXMuYXR0cigieSIsIm51bWJlciI9PXR5cGVvZiB0LnZhbHVlT2YoKT90K2k6dCl9LGN4OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuYmJveCgpLmN4OnRoaXMueCh0LXRoaXMuYmJveCgpLndpZHRoLzIpfSxjeTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLmJib3goKS5jeTp0aGlzLnkodC10aGlzLmJib3goKS5oZWlnaHQvMil9LHRleHQ6ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCl7dD0iIjtmb3IodmFyIGU9dGhpcy5ub2RlLmNoaWxkTm9kZXMsaT0wLGE9ZS5sZW5ndGg7aTxhOysraSkwIT1pJiYzIT1lW2ldLm5vZGVUeXBlJiYxPT1zLmFkb3B0KGVbaV0pLmRvbS5uZXdMaW5lZCYmKHQrPSJcbiIpLHQrPWVbaV0udGV4dENvbnRlbnQ7cmV0dXJuIHR9aWYodGhpcy5jbGVhcigpLmJ1aWxkKCEwKSwiZnVuY3Rpb24iPT10eXBlb2YgdCl0LmNhbGwodGhpcyx0aGlzKTtlbHNle2k9MDtmb3IodmFyIG49KHQ9dC5zcGxpdCgiXG4iKSkubGVuZ3RoO2k8bjtpKyspdGhpcy50c3Bhbih0W2ldKS5uZXdMaW5lKCl9cmV0dXJuIHRoaXMuYnVpbGQoITEpLnJlYnVpbGQoKX0sc2l6ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hdHRyKCJmb250LXNpemUiLHQpLnJlYnVpbGQoKX0sbGVhZGluZzpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLmRvbS5sZWFkaW5nOih0aGlzLmRvbS5sZWFkaW5nPW5ldyBzLk51bWJlcih0KSx0aGlzLnJlYnVpbGQoKSl9LGxpbmVzOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMudGV4dFBhdGgmJnRoaXMudGV4dFBhdGgoKXx8dGhpcykubm9kZSxlPXMudXRpbHMubWFwKHMudXRpbHMuZmlsdGVyU1ZHRWxlbWVudHModC5jaGlsZE5vZGVzKSxmdW5jdGlvbih0KXtyZXR1cm4gcy5hZG9wdCh0KX0pO3JldHVybiBuZXcgcy5TZXQoZSl9LHJlYnVpbGQ6ZnVuY3Rpb24odCl7aWYoImJvb2xlYW4iPT10eXBlb2YgdCYmKHRoaXMuX3JlYnVpbGQ9dCksdGhpcy5fcmVidWlsZCl7dmFyIGU9dGhpcyxpPTAsYT10aGlzLmRvbS5sZWFkaW5nKm5ldyBzLk51bWJlcih0aGlzLmF0dHIoImZvbnQtc2l6ZSIpKTt0aGlzLmxpbmVzKCkuZWFjaChmdW5jdGlvbigpe3RoaXMuZG9tLm5ld0xpbmVkJiYoZS50ZXh0UGF0aCgpfHx0aGlzLmF0dHIoIngiLGUuYXR0cigieCIpKSwiXG4iPT10aGlzLnRleHQoKT9pKz1hOih0aGlzLmF0dHIoImR5IixhK2kpLGk9MCkpfSksdGhpcy5maXJlKCJyZWJ1aWxkIil9cmV0dXJuIHRoaXN9LGJ1aWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9idWlsZD0hIXQsdGhpc30sc2V0RGF0YTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kb209dCx0aGlzLmRvbS5sZWFkaW5nPW5ldyBzLk51bWJlcih0LmxlYWRpbmd8fDEuMyksdGhpc319LGNvbnN0cnVjdDp7dGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wdXQobmV3IHMuVGV4dCkudGV4dCh0KX0scGxhaW46ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHV0KG5ldyBzLlRleHQpLnBsYWluKHQpfX19KSxzLlRzcGFuPXMuaW52ZW50KHtjcmVhdGU6InRzcGFuIixpbmhlcml0OnMuU2hhcGUsZXh0ZW5kOnt0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMubm9kZS50ZXh0Q29udGVudCsodGhpcy5kb20ubmV3TGluZWQ/IlxuIjoiIik6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbCh0aGlzLHRoaXMpOnRoaXMucGxhaW4odCksdGhpcyl9LGR4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmF0dHIoImR4Iix0KX0sZHk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXR0cigiZHkiLHQpfSxuZXdMaW5lOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wYXJlbnQocy5UZXh0KTtyZXR1cm4gdGhpcy5kb20ubmV3TGluZWQ9ITAsdGhpcy5keSh0LmRvbS5sZWFkaW5nKnQuYXR0cigiZm9udC1zaXplIikpLmF0dHIoIngiLHQueCgpKX19fSkscy5leHRlbmQocy5UZXh0LHMuVHNwYW4se3BsYWluOmZ1bmN0aW9uKHQpe3JldHVybiExPT09dGhpcy5fYnVpbGQmJnRoaXMuY2xlYXIoKSx0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoaS5jcmVhdGVUZXh0Tm9kZSh0KSksdGhpc30sdHNwYW46ZnVuY3Rpb24odCl7dmFyIGU9KHRoaXMudGV4dFBhdGgmJnRoaXMudGV4dFBhdGgoKXx8dGhpcykubm9kZSxpPW5ldyBzLlRzcGFuO3JldHVybiExPT09dGhpcy5fYnVpbGQmJnRoaXMuY2xlYXIoKSxlLmFwcGVuZENoaWxkKGkubm9kZSksaS50ZXh0KHQpfSxjbGVhcjpmdW5jdGlvbigpe2Zvcih2YXIgdD0odGhpcy50ZXh0UGF0aCYmdGhpcy50ZXh0UGF0aCgpfHx0aGlzKS5ub2RlO3QuaGFzQ2hpbGROb2RlcygpOyl0LnJlbW92ZUNoaWxkKHQubGFzdENoaWxkKTtyZXR1cm4gdGhpc30sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5nZXRDb21wdXRlZFRleHRMZW5ndGgoKX19KSxzLlRleHRQYXRoPXMuaW52ZW50KHtjcmVhdGU6InRleHRQYXRoIixpbmhlcml0OnMuUGFyZW50LHBhcmVudDpzLlRleHQsY29uc3RydWN0Onttb3JwaEFycmF5OnMuUGF0aEFycmF5LHBhdGg6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBzLlRleHRQYXRoLGk9dGhpcy5kb2MoKS5kZWZzKCkucGF0aCh0KTt0aGlzLm5vZGUuaGFzQ2hpbGROb2RlcygpOyllLm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5ub2RlLmZpcnN0Q2hpbGQpO3JldHVybiB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoZS5ub2RlKSxlLmF0dHIoImhyZWYiLCIjIitpLHMueGxpbmspLHRoaXN9LGFycmF5OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50cmFjaygpO3JldHVybiB0P3QuYXJyYXkoKTpudWxsfSxwbG90OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudHJhY2soKSxpPW51bGw7cmV0dXJuIGUmJihpPWUucGxvdCh0KSksbnVsbD09dD9pOnRoaXN9LHRyYWNrOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50ZXh0UGF0aCgpO2lmKHQpcmV0dXJuIHQucmVmZXJlbmNlKCJocmVmIil9LHRleHRQYXRoOmZ1bmN0aW9uKCl7aWYodGhpcy5ub2RlLmZpcnN0Q2hpbGQmJiJ0ZXh0UGF0aCI9PXRoaXMubm9kZS5maXJzdENoaWxkLm5vZGVOYW1lKXJldHVybiBzLmFkb3B0KHRoaXMubm9kZS5maXJzdENoaWxkKX19fSkscy5OZXN0ZWQ9cy5pbnZlbnQoe2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuY29uc3RydWN0b3IuY2FsbCh0aGlzLHMuY3JlYXRlKCJzdmciKSksdGhpcy5zdHlsZSgib3ZlcmZsb3ciLCJ2aXNpYmxlIil9LGluaGVyaXQ6cy5Db250YWluZXIsY29uc3RydWN0OntuZXN0ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXQobmV3IHMuTmVzdGVkKX19fSkscy5BPXMuaW52ZW50KHtjcmVhdGU6ImEiLGluaGVyaXQ6cy5Db250YWluZXIsZXh0ZW5kOnt0bzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hdHRyKCJocmVmIix0LHMueGxpbmspfSxzaG93OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmF0dHIoInNob3ciLHQscy54bGluayl9LHRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hdHRyKCJ0YXJnZXQiLHQpfX0sY29uc3RydWN0OntsaW5rOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1dChuZXcgcy5BKS50byh0KX19fSkscy5leHRlbmQocy5FbGVtZW50LHtsaW5rVG86ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHMuQTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90LmNhbGwoZSxlKTplLnRvKHQpLHRoaXMucGFyZW50KCkucHV0KGUpLnB1dCh0aGlzKX19KSxzLk1hcmtlcj1zLmludmVudCh7Y3JlYXRlOiJtYXJrZXIiLGluaGVyaXQ6cy5Db250YWluZXIsZXh0ZW5kOnt3aWR0aDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hdHRyKCJtYXJrZXJXaWR0aCIsdCl9LGhlaWdodDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hdHRyKCJtYXJrZXJIZWlnaHQiLHQpfSxyZWY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5hdHRyKCJyZWZYIix0KS5hdHRyKCJyZWZZIixlKX0sdXBkYXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsZWFyKCksImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuY2FsbCh0aGlzLHRoaXMpLHRoaXN9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInVybCgjIit0aGlzLmlkKCkrIikifX0sY29uc3RydWN0OnttYXJrZXI6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmRlZnMoKS5tYXJrZXIodCxlLGkpfX19KSxzLmV4dGVuZChzLkRlZnMse21hcmtlcjpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMucHV0KG5ldyBzLk1hcmtlcikuc2l6ZSh0LGUpLnJlZih0LzIsZS8yKS52aWV3Ym94KDAsMCx0LGUpLmF0dHIoIm9yaWVudCIsImF1dG8iKS51cGRhdGUoaSl9fSkscy5leHRlbmQocy5MaW5lLHMuUG9seWxpbmUscy5Qb2x5Z29uLHMuUGF0aCx7bWFya2VyOmZ1bmN0aW9uKHQsZSxpLGEpe3ZhciBuPVsibWFya2VyIl07cmV0dXJuImFsbCIhPXQmJm4ucHVzaCh0KSxuPW4uam9pbigiLSIpLHQ9YXJndW1lbnRzWzFdaW5zdGFuY2VvZiBzLk1hcmtlcj9hcmd1bWVudHNbMV06dGhpcy5kb2MoKS5tYXJrZXIoZSxpLGEpLHRoaXMuYXR0cihuLHQpfX0pO3ZhciBsPXtzdHJva2U6WyJjb2xvciIsIndpZHRoIiwib3BhY2l0eSIsImxpbmVjYXAiLCJsaW5lam9pbiIsIm1pdGVybGltaXQiLCJkYXNoYXJyYXkiLCJkYXNob2Zmc2V0Il0sZmlsbDpbImNvbG9yIiwib3BhY2l0eSIsInJ1bGUiXSxwcmVmaXg6ZnVuY3Rpb24odCxlKXtyZXR1cm4iY29sb3IiPT1lP3Q6dCsiLSIrZX19O2Z1bmN0aW9uIGgodCxlLGksYSl7cmV0dXJuIGkrYS5yZXBsYWNlKHMucmVnZXguZG90cywiIC4iKX1mdW5jdGlvbiBjKHQpe3JldHVybiB0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvLSguKS9nLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUudG9VcHBlckNhc2UoKX0pfWZ1bmN0aW9uIGQodCl7cmV0dXJuIHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKX1mdW5jdGlvbiB1KHQpe3ZhciBlPXQudG9TdHJpbmcoMTYpO3JldHVybiAxPT1lLmxlbmd0aD8iMCIrZTplfWZ1bmN0aW9uIGcodCxlLGkpe2lmKG51bGw9PWV8fG51bGw9PWkpe3ZhciBzPXQuYmJveCgpO251bGw9PWU/ZT1zLndpZHRoL3MuaGVpZ2h0Kmk6bnVsbD09aSYmKGk9cy5oZWlnaHQvcy53aWR0aCplKX1yZXR1cm57d2lkdGg6ZSxoZWlnaHQ6aX19ZnVuY3Rpb24gZih0LGUsaSl7cmV0dXJue3g6ZSp0LmEraSp0LmMrMCx5OmUqdC5iK2kqdC5kKzB9fWZ1bmN0aW9uIHAodCl7cmV0dXJue2E6dFswXSxiOnRbMV0sYzp0WzJdLGQ6dFszXSxlOnRbNF0sZjp0WzVdfX1mdW5jdGlvbiB4KHQsZSl7dC5jeD1udWxsPT10LmN4P2UuYmJveCgpLmN4OnQuY3gsdC5jeT1udWxsPT10LmN5P2UuYmJveCgpLmN5OnQuY3l9ZnVuY3Rpb24gYih0KXtmb3IodmFyIGk9dC5jaGlsZE5vZGVzLmxlbmd0aC0xO2k+PTA7aS0tKXQuY2hpbGROb2Rlc1tpXWluc3RhbmNlb2YgZS5TVkdFbGVtZW50JiZiKHQuY2hpbGROb2Rlc1tpXSk7cmV0dXJuIHMuYWRvcHQodCkuaWQocy5laWQodC5ub2RlTmFtZSkpfWZ1bmN0aW9uIG0odCl7cmV0dXJuIG51bGw9PXQueCYmKHQueD0wLHQueT0wLHQud2lkdGg9MCx0LmhlaWdodD0wKSx0Lnc9dC53aWR0aCx0Lmg9dC5oZWlnaHQsdC54Mj10LngrdC53aWR0aCx0LnkyPXQueSt0LmhlaWdodCx0LmN4PXQueCt0LndpZHRoLzIsdC5jeT10LnkrdC5oZWlnaHQvMix0fWZ1bmN0aW9uIHYodCl7cmV0dXJuIE1hdGguYWJzKHQpPjFlLTM3P3Q6MH1bImZpbGwiLCJzdHJva2UiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlLGk9e307aVt0XT1mdW5jdGlvbihpKXtpZih2b2lkIDA9PT1pKXJldHVybiB0aGlzO2lmKCJzdHJpbmciPT10eXBlb2YgaXx8cy5Db2xvci5pc1JnYihpKXx8aSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuZmlsbCl0aGlzLmF0dHIodCxpKTtlbHNlIGZvcihlPWxbdF0ubGVuZ3RoLTE7ZT49MDtlLS0pbnVsbCE9aVtsW3RdW2VdXSYmdGhpcy5hdHRyKGwucHJlZml4KHQsbFt0XVtlXSksaVtsW3RdW2VdXSk7cmV0dXJuIHRoaXN9LHMuZXh0ZW5kKHMuRWxlbWVudCxzLkZYLGkpfSkscy5leHRlbmQocy5FbGVtZW50LHMuRlgse3JvdGF0ZTpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMudHJhbnNmb3JtKHtyb3RhdGlvbjp0LGN4OmUsY3k6aX0pfSxza2V3OmZ1bmN0aW9uKHQsZSxpLHMpe3JldHVybiAxPT1hcmd1bWVudHMubGVuZ3RofHwzPT1hcmd1bWVudHMubGVuZ3RoP3RoaXMudHJhbnNmb3JtKHtza2V3OnQsY3g6ZSxjeTppfSk6dGhpcy50cmFuc2Zvcm0oe3NrZXdYOnQsc2tld1k6ZSxjeDppLGN5OnN9KX0sc2NhbGU6ZnVuY3Rpb24odCxlLGkscyl7cmV0dXJuIDE9PWFyZ3VtZW50cy5sZW5ndGh8fDM9PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy50cmFuc2Zvcm0oe3NjYWxlOnQsY3g6ZSxjeTppfSk6dGhpcy50cmFuc2Zvcm0oe3NjYWxlWDp0LHNjYWxlWTplLGN4OmksY3k6c30pfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0oe3g6dCx5OmV9KX0sZmxpcDpmdW5jdGlvbih0LGUpe3JldHVybiBlPSJudW1iZXIiPT10eXBlb2YgdD90OmUsdGhpcy50cmFuc2Zvcm0oe2ZsaXA6dHx8ImJvdGgiLG9mZnNldDplfSl9LG1hdHJpeDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hdHRyKCJ0cmFuc2Zvcm0iLG5ldyBzLk1hdHJpeCg2PT1hcmd1bWVudHMubGVuZ3RoP1tdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTp0KSl9LG9wYWNpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYXR0cigib3BhY2l0eSIsdCl9LGR4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLngobmV3IHMuTnVtYmVyKHQpLnBsdXModGhpcyBpbnN0YW5jZW9mIHMuRlg/MDp0aGlzLngoKSksITApfSxkeTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy55KG5ldyBzLk51bWJlcih0KS5wbHVzKHRoaXMgaW5zdGFuY2VvZiBzLkZYPzA6dGhpcy55KCkpLCEwKX0sZG1vdmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5keCh0KS5keShlKX19KSxzLmV4dGVuZChzLlJlY3Qscy5FbGxpcHNlLHMuQ2lyY2xlLHMuR3JhZGllbnQscy5GWCx7cmFkaXVzOmZ1bmN0aW9uKHQsZSl7dmFyIGk9KHRoaXMuX3RhcmdldHx8dGhpcykudHlwZTtyZXR1cm4icmFkaWFsIj09aXx8ImNpcmNsZSI9PWk/dGhpcy5hdHRyKCJyIixuZXcgcy5OdW1iZXIodCkpOnRoaXMucngodCkucnkobnVsbD09ZT90OmUpfX0pLHMuZXh0ZW5kKHMuUGF0aCx7bGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5nZXRUb3RhbExlbmd0aCgpfSxwb2ludEF0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm5vZGUuZ2V0UG9pbnRBdExlbmd0aCh0KX19KSxzLmV4dGVuZChzLlBhcmVudCxzLlRleHQscy5Uc3BhbixzLkZYLHtmb250OmZ1bmN0aW9uKGUsaSl7aWYoIm9iamVjdCI9PT10KGUpKWZvcihpIGluIGUpdGhpcy5mb250KGksZVtpXSk7cmV0dXJuImxlYWRpbmciPT1lP3RoaXMubGVhZGluZyhpKToiYW5jaG9yIj09ZT90aGlzLmF0dHIoInRleHQtYW5jaG9yIixpKToic2l6ZSI9PWV8fCJmYW1pbHkiPT1lfHwid2VpZ2h0Ij09ZXx8InN0cmV0Y2giPT1lfHwidmFyaWFudCI9PWV8fCJzdHlsZSI9PWU/dGhpcy5hdHRyKCJmb250LSIrZSxpKTp0aGlzLmF0dHIoZSxpKX19KSxzLlNldD1zLmludmVudCh7Y3JlYXRlOmZ1bmN0aW9uKHQpe0FycmF5LmlzQXJyYXkodCk/dGhpcy5tZW1iZXJzPXQ6dGhpcy5jbGVhcigpfSxleHRlbmQ6e2FkZDpmdW5jdGlvbigpe3ZhciB0LGUsaT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7Zm9yKHQ9MCxlPWkubGVuZ3RoO3Q8ZTt0KyspdGhpcy5tZW1iZXJzLnB1c2goaVt0XSk7cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmluZGV4KHQpO3JldHVybiBlPi0xJiZ0aGlzLm1lbWJlcnMuc3BsaWNlKGUsMSksdGhpc30sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxpPXRoaXMubWVtYmVycy5sZW5ndGg7ZTxpO2UrKyl0LmFwcGx5KHRoaXMubWVtYmVyc1tlXSxbZSx0aGlzLm1lbWJlcnNdKTtyZXR1cm4gdGhpc30sY2xlYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW1iZXJzPVtdLHRoaXN9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lbWJlcnMubGVuZ3RofSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW5kZXgodCk+PTB9LGluZGV4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1lbWJlcnMuaW5kZXhPZih0KX0sZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1lbWJlcnNbdF19LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KHRoaXMubWVtYmVycy5sZW5ndGgtMSl9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW1iZXJzfSxiYm94OmZ1bmN0aW9uKCl7aWYoMD09dGhpcy5tZW1iZXJzLmxlbmd0aClyZXR1cm4gbmV3IHMuUkJveDt2YXIgdD10aGlzLm1lbWJlcnNbMF0ucmJveCh0aGlzLm1lbWJlcnNbMF0uZG9jKCkpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0PXQubWVyZ2UodGhpcy5yYm94KHRoaXMuZG9jKCkpKX0pLHR9fSxjb25zdHJ1Y3Q6e3NldDpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHMuU2V0KHQpfX19KSxzLkZYLlNldD1zLmludmVudCh7Y3JlYXRlOmZ1bmN0aW9uKHQpe3RoaXMuc2V0PXR9fSkscy5TZXQuaW5oZXJpdD1mdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBzLlNoYXBlLnByb3RvdHlwZSkiZnVuY3Rpb24iPT10eXBlb2Ygcy5TaGFwZS5wcm90b3R5cGVbZV0mJiJmdW5jdGlvbiIhPXR5cGVvZiBzLlNldC5wcm90b3R5cGVbZV0mJnQucHVzaChlKTtmb3IodmFyIGUgaW4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3MuU2V0LnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe2Zvcih2YXIgZT0wLGk9dGhpcy5tZW1iZXJzLmxlbmd0aDtlPGk7ZSsrKXRoaXMubWVtYmVyc1tlXSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMubWVtYmVyc1tlXVt0XSYmdGhpcy5tZW1iZXJzW2VdW3RdLmFwcGx5KHRoaXMubWVtYmVyc1tlXSxhcmd1bWVudHMpO3JldHVybiJhbmltYXRlIj09dD90aGlzLmZ4fHwodGhpcy5meD1uZXcgcy5GWC5TZXQodGhpcykpOnRoaXN9fSksdD1bXSxzLkZYLnByb3RvdHlwZSkiZnVuY3Rpb24iPT10eXBlb2Ygcy5GWC5wcm90b3R5cGVbZV0mJiJmdW5jdGlvbiIhPXR5cGVvZiBzLkZYLlNldC5wcm90b3R5cGVbZV0mJnQucHVzaChlKTt0LmZvckVhY2goZnVuY3Rpb24odCl7cy5GWC5TZXQucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTAsaT10aGlzLnNldC5tZW1iZXJzLmxlbmd0aDtlPGk7ZSsrKXRoaXMuc2V0Lm1lbWJlcnNbZV0uZnhbdF0uYXBwbHkodGhpcy5zZXQubWVtYmVyc1tlXS5meCxhcmd1bWVudHMpO3JldHVybiB0aGlzfX0pfSxzLmV4dGVuZChzLkVsZW1lbnQse2RhdGE6ZnVuY3Rpb24oZSxpLHMpe2lmKCJvYmplY3QiPT09dChlKSlmb3IoaSBpbiBlKXRoaXMuZGF0YShpLGVbaV0pO2Vsc2UgaWYoYXJndW1lbnRzLmxlbmd0aDwyKXRyeXtyZXR1cm4gSlNPTi5wYXJzZSh0aGlzLmF0dHIoImRhdGEtIitlKSl9Y2F0Y2godCl7cmV0dXJuIHRoaXMuYXR0cigiZGF0YS0iK2UpfWVsc2UgdGhpcy5hdHRyKCJkYXRhLSIrZSxudWxsPT09aT9udWxsOiEwPT09c3x8InN0cmluZyI9PXR5cGVvZiBpfHwibnVtYmVyIj09dHlwZW9mIGk/aTpKU09OLnN0cmluZ2lmeShpKSk7cmV0dXJuIHRoaXN9fSkscy5leHRlbmQocy5FbGVtZW50LHtyZW1lbWJlcjpmdW5jdGlvbihlLGkpe2lmKCJvYmplY3QiPT09dChhcmd1bWVudHNbMF0pKWZvcih2YXIgaSBpbiBlKXRoaXMucmVtZW1iZXIoaSxlW2ldKTtlbHNle2lmKDE9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMubWVtb3J5KClbZV07dGhpcy5tZW1vcnkoKVtlXT1pfXJldHVybiB0aGlzfSxmb3JnZXQ6ZnVuY3Rpb24oKXtpZigwPT1hcmd1bWVudHMubGVuZ3RoKXRoaXMuX21lbW9yeT17fTtlbHNlIGZvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLTE7dD49MDt0LS0pZGVsZXRlIHRoaXMubWVtb3J5KClbYXJndW1lbnRzW3RdXTtyZXR1cm4gdGhpc30sbWVtb3J5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21lbW9yeXx8KHRoaXMuX21lbW9yeT17fSl9fSkscy5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9aS5nZXRFbGVtZW50QnlJZChmdW5jdGlvbih0KXt2YXIgZT0odHx8IiIpLnRvU3RyaW5nKCkubWF0Y2gocy5yZWdleC5yZWZlcmVuY2UpO2lmKGUpcmV0dXJuIGVbMV19KHQpfHx0KTtyZXR1cm4gcy5hZG9wdChlKX0scy5zZWxlY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmV3IHMuU2V0KHMudXRpbHMubWFwKChlfHxpKS5xdWVyeVNlbGVjdG9yQWxsKHQpLGZ1bmN0aW9uKHQpe3JldHVybiBzLmFkb3B0KHQpfSkpfSxzLmV4dGVuZChzLlBhcmVudCx7c2VsZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBzLnNlbGVjdCh0LHRoaXMubm9kZSl9fSk7dmFyIHk9ImFiY2RlZiIuc3BsaXQoIiIpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlLkN1c3RvbUV2ZW50KXt2YXIgdz1mdW5jdGlvbih0LGUpe2U9ZXx8e2J1YmJsZXM6ITEsY2FuY2VsYWJsZTohMSxkZXRhaWw6dm9pZCAwfTt2YXIgcz1pLmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpO3JldHVybiBzLmluaXRDdXN0b21FdmVudCh0LGUuYnViYmxlcyxlLmNhbmNlbGFibGUsZS5kZXRhaWwpLHN9O3cucHJvdG90eXBlPWUuRXZlbnQucHJvdG90eXBlLHMuQ3VzdG9tRXZlbnQ9d31lbHNlIHMuQ3VzdG9tRXZlbnQ9ZS5DdXN0b21FdmVudDtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHZhciBpPTAscz1bIm1veiIsIndlYmtpdCJdLGE9MDthPHMubGVuZ3RoJiYhZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7KythKXQucmVxdWVzdEFuaW1hdGlvbkZyYW1lPXRbc1thXSsiUmVxdWVzdEFuaW1hdGlvbkZyYW1lIl0sdC5jYW5jZWxBbmltYXRpb25GcmFtZT10W3NbYV0rIkNhbmNlbEFuaW1hdGlvbkZyYW1lIl18fHRbc1thXSsiQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lIl07dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZ1bmN0aW9uKGUpe3ZhciBzPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGE9TWF0aC5tYXgoMCwxNi0ocy1pKSksbj10LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKHMrYSl9LGEpO3JldHVybiBpPXMrYSxufSx0LmNhbmNlbEFuaW1hdGlvbkZyYW1lPXQuY2FuY2VsQW5pbWF0aW9uRnJhbWV8fHQuY2xlYXJUaW1lb3V0fShlKSxzfSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5jdGlvbigpe3JldHVybiBydChudCxudC5kb2N1bWVudCl9KToib2JqZWN0Ij09PSgidW5kZWZpbmVkIj09dHlwZW9mIGV4cG9ydHM/InVuZGVmaW5lZCI6dChleHBvcnRzKSkmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPW50LmRvY3VtZW50P3J0KG50LG50LmRvY3VtZW50KTpmdW5jdGlvbih0KXtyZXR1cm4gcnQodCx0LmRvY3VtZW50KX06bnQuU1ZHPXJ0KG50LG50LmRvY3VtZW50KSxmdW5jdGlvbigpe1NWRy5GaWx0ZXI9U1ZHLmludmVudCh7Y3JlYXRlOiJmaWx0ZXIiLGluaGVyaXQ6U1ZHLlBhcmVudCxleHRlbmQ6e3NvdXJjZToiU291cmNlR3JhcGhpYyIsc291cmNlQWxwaGE6IlNvdXJjZUFscGhhIixiYWNrZ3JvdW5kOiJCYWNrZ3JvdW5kSW1hZ2UiLGJhY2tncm91bmRBbHBoYToiQmFja2dyb3VuZEFscGhhIixmaWxsOiJGaWxsUGFpbnQiLHN0cm9rZToiU3Ryb2tlUGFpbnQiLGF1dG9TZXRJbjohMCxwdXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5hZGQodCxlKSwhdC5hdHRyKCJpbiIpJiZ0aGlzLmF1dG9TZXRJbiYmdC5hdHRyKCJpbiIsdGhpcy5zb3VyY2UpLHQuYXR0cigicmVzdWx0Iil8fHQuYXR0cigicmVzdWx0Iix0KSx0fSxibGVuZDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMucHV0KG5ldyBTVkcuQmxlbmRFZmZlY3QodCxlLGkpKX0sY29sb3JNYXRyaXg6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wdXQobmV3IFNWRy5Db2xvck1hdHJpeEVmZmVjdCh0LGUpKX0sY29udm9sdmVNYXRyaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHV0KG5ldyBTVkcuQ29udm9sdmVNYXRyaXhFZmZlY3QodCkpfSxjb21wb25lbnRUcmFuc2ZlcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wdXQobmV3IFNWRy5Db21wb25lbnRUcmFuc2ZlckVmZmVjdCh0KSl9LGNvbXBvc2l0ZTpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRoaXMucHV0KG5ldyBTVkcuQ29tcG9zaXRlRWZmZWN0KHQsZSxpKSl9LGZsb29kOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucHV0KG5ldyBTVkcuRmxvb2RFZmZlY3QodCxlKSl9LG9mZnNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnB1dChuZXcgU1ZHLk9mZnNldEVmZmVjdCh0LGUpKX0saW1hZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHV0KG5ldyBTVkcuSW1hZ2VFZmZlY3QodCkpfSxtZXJnZTpmdW5jdGlvbigpe3ZhciB0PVt2b2lkIDBdO2Zvcih2YXIgZSBpbiBhcmd1bWVudHMpdC5wdXNoKGFyZ3VtZW50c1tlXSk7cmV0dXJuIHRoaXMucHV0KG5ldyhTVkcuTWVyZ2VFZmZlY3QuYmluZC5hcHBseShTVkcuTWVyZ2VFZmZlY3QsdCkpKX0sZ2F1c3NpYW5CbHVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucHV0KG5ldyBTVkcuR2F1c3NpYW5CbHVyRWZmZWN0KHQsZSkpfSxtb3JwaG9sb2d5OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucHV0KG5ldyBTVkcuTW9ycGhvbG9neUVmZmVjdCh0LGUpKX0sZGlmZnVzZUxpZ2h0aW5nOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5wdXQobmV3IFNWRy5EaWZmdXNlTGlnaHRpbmdFZmZlY3QodCxlLGkpKX0sZGlzcGxhY2VtZW50TWFwOmZ1bmN0aW9uKHQsZSxpLHMsYSl7cmV0dXJuIHRoaXMucHV0KG5ldyBTVkcuRGlzcGxhY2VtZW50TWFwRWZmZWN0KHQsZSxpLHMsYSkpfSxzcGVjdWxhckxpZ2h0aW5nOmZ1bmN0aW9uKHQsZSxpLHMpe3JldHVybiB0aGlzLnB1dChuZXcgU1ZHLlNwZWN1bGFyTGlnaHRpbmdFZmZlY3QodCxlLGkscykpfSx0aWxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHV0KG5ldyBTVkcuVGlsZUVmZmVjdCl9LHR1cmJ1bGVuY2U6ZnVuY3Rpb24odCxlLGkscyxhKXtyZXR1cm4gdGhpcy5wdXQobmV3IFNWRy5UdXJidWxlbmNlRWZmZWN0KHQsZSxpLHMsYSkpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJ1cmwoIyIrdGhpcy5hdHRyKCJpZCIpKyIpIn19fSksU1ZHLmV4dGVuZChTVkcuRGVmcyx7ZmlsdGVyOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucHV0KG5ldyBTVkcuRmlsdGVyKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5jYWxsKGUsZSksZX19KSxTVkcuZXh0ZW5kKFNWRy5Db250YWluZXIse2ZpbHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZWZzKCkuZmlsdGVyKHQpfX0pLFNWRy5leHRlbmQoU1ZHLkVsZW1lbnQsU1ZHLkcsU1ZHLk5lc3RlZCx7ZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbHRlcmVyPXQgaW5zdGFuY2VvZiBTVkcuRWxlbWVudD90OnRoaXMuZG9jKCkuZmlsdGVyKHQpLHRoaXMuZG9jKCkmJnRoaXMuZmlsdGVyZXIuZG9jKCkhPT10aGlzLmRvYygpJiZ0aGlzLmRvYygpLmRlZnMoKS5hZGQodGhpcy5maWx0ZXJlciksdGhpcy5hdHRyKCJmaWx0ZXIiLHRoaXMuZmlsdGVyZXIpLHRoaXMuZmlsdGVyZXJ9LHVuZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbHRlcmVyJiYhMD09PXQmJnRoaXMuZmlsdGVyZXIucmVtb3ZlKCksZGVsZXRlIHRoaXMuZmlsdGVyZXIsdGhpcy5hdHRyKCJmaWx0ZXIiLG51bGwpfX0pLFNWRy5FZmZlY3Q9U1ZHLmludmVudCh7Y3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpfSxpbmhlcml0OlNWRy5FbGVtZW50LGV4dGVuZDp7aW46ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5wYXJlbnQoKSYmdGhpcy5wYXJlbnQoKS5zZWxlY3QoJ1tyZXN1bHQ9IicrdGhpcy5hdHRyKCJpbiIpKyciXScpLmdldCgwKXx8dGhpcy5hdHRyKCJpbiIpOnRoaXMuYXR0cigiaW4iLHQpfSxyZXN1bHQ6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5hdHRyKCJyZXN1bHQiKTp0aGlzLmF0dHIoInJlc3VsdCIsdCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVzdWx0KCl9fX0pLFNWRy5QYXJlbnRFZmZlY3Q9U1ZHLmludmVudCh7Y3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpfSxpbmhlcml0OlNWRy5QYXJlbnQsZXh0ZW5kOntpbjpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLnBhcmVudCgpJiZ0aGlzLnBhcmVudCgpLnNlbGVjdCgnW3Jlc3VsdD0iJyt0aGlzLmF0dHIoImluIikrJyJdJykuZ2V0KDApfHx0aGlzLmF0dHIoImluIik6dGhpcy5hdHRyKCJpbiIsdCl9LHJlc3VsdDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLmF0dHIoInJlc3VsdCIpOnRoaXMuYXR0cigicmVzdWx0Iix0KX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXN1bHQoKX19fSk7dmFyIHQ9e2JsZW5kOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucGFyZW50KCkmJnRoaXMucGFyZW50KCkuYmxlbmQodGhpcyx0LGUpfSxjb2xvck1hdHJpeDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnBhcmVudCgpJiZ0aGlzLnBhcmVudCgpLmNvbG9yTWF0cml4KHQsZSkuaW4odGhpcyl9LGNvbnZvbHZlTWF0cml4OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnBhcmVudCgpJiZ0aGlzLnBhcmVudCgpLmNvbnZvbHZlTWF0cml4KHQpLmluKHRoaXMpfSxjb21wb25lbnRUcmFuc2ZlcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wYXJlbnQoKSYmdGhpcy5wYXJlbnQoKS5jb21wb25lbnRUcmFuc2Zlcih0KS5pbih0aGlzKX0sY29tcG9zaXRlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucGFyZW50KCkmJnRoaXMucGFyZW50KCkuY29tcG9zaXRlKHRoaXMsdCxlKX0sZmxvb2Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wYXJlbnQoKSYmdGhpcy5wYXJlbnQoKS5mbG9vZCh0LGUpfSxvZmZzZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wYXJlbnQoKSYmdGhpcy5wYXJlbnQoKS5vZmZzZXQodCxlKS5pbih0aGlzKX0saW1hZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucGFyZW50KCkmJnRoaXMucGFyZW50KCkuaW1hZ2UodCl9LG1lcmdlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkmJnRoaXMucGFyZW50KCkubWVyZ2UuYXBwbHkodGhpcy5wYXJlbnQoKSxbdGhpc10uY29uY2F0KGFyZ3VtZW50cykpfSxnYXVzc2lhbkJsdXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5wYXJlbnQoKSYmdGhpcy5wYXJlbnQoKS5nYXVzc2lhbkJsdXIodCxlKS5pbih0aGlzKX0sbW9ycGhvbG9neTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnBhcmVudCgpJiZ0aGlzLnBhcmVudCgpLm1vcnBob2xvZ3kodCxlKS5pbih0aGlzKX0sZGlmZnVzZUxpZ2h0aW5nOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdGhpcy5wYXJlbnQoKSYmdGhpcy5wYXJlbnQoKS5kaWZmdXNlTGlnaHRpbmcodCxlLGkpLmluKHRoaXMpfSxkaXNwbGFjZW1lbnRNYXA6ZnVuY3Rpb24odCxlLGkscyl7cmV0dXJuIHRoaXMucGFyZW50KCkmJnRoaXMucGFyZW50KCkuZGlzcGxhY2VtZW50TWFwKHRoaXMsdCxlLGkscyl9LHNwZWN1bGFyTGlnaHRpbmc6ZnVuY3Rpb24odCxlLGkscyl7cmV0dXJuIHRoaXMucGFyZW50KCkmJnRoaXMucGFyZW50KCkuc3BlY3VsYXJMaWdodGluZyh0LGUsaSxzKS5pbih0aGlzKX0sdGlsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpJiZ0aGlzLnBhcmVudCgpLnRpbGUoKS5pbih0aGlzKX0sdHVyYnVsZW5jZTpmdW5jdGlvbih0LGUsaSxzLGEpe3JldHVybiB0aGlzLnBhcmVudCgpJiZ0aGlzLnBhcmVudCgpLnR1cmJ1bGVuY2UodCxlLGkscyxhKS5pbih0aGlzKX19O1NWRy5leHRlbmQoU1ZHLkVmZmVjdCx0KSxTVkcuZXh0ZW5kKFNWRy5QYXJlbnRFZmZlY3QsdCksU1ZHLkNoaWxkRWZmZWN0PVNWRy5pbnZlbnQoe2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuY29uc3RydWN0b3IuY2FsbCh0aGlzKX0saW5oZXJpdDpTVkcuRWxlbWVudCxleHRlbmQ6e2luOmZ1bmN0aW9uKHQpe3RoaXMuYXR0cigiaW4iLHQpfX19KTt2YXIgZT17YmxlbmQ6ZnVuY3Rpb24odCxlLGkpe3RoaXMuYXR0cih7aW46dCxpbjI6ZSxtb2RlOml8fCJub3JtYWwifSl9LGNvbG9yTWF0cml4OmZ1bmN0aW9uKHQsZSl7Im1hdHJpeCI9PXQmJihlPWEoZSkpLHRoaXMuYXR0cih7dHlwZTp0LHZhbHVlczp2b2lkIDA9PT1lP251bGw6ZX0pfSxjb252b2x2ZU1hdHJpeDpmdW5jdGlvbih0KXt0PWEodCksdGhpcy5hdHRyKHtvcmRlcjpNYXRoLnNxcnQodC5zcGxpdCgiICIpLmxlbmd0aCksa2VybmVsTWF0cml4OnR9KX0sY29tcG9zaXRlOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLmF0dHIoe2luOnQsaW4yOmUsb3BlcmF0b3I6aX0pfSxmbG9vZDpmdW5jdGlvbih0LGUpe3RoaXMuYXR0cigiZmxvb2QtY29sb3IiLHQpLG51bGwhPWUmJnRoaXMuYXR0cigiZmxvb2Qtb3BhY2l0eSIsZSl9LG9mZnNldDpmdW5jdGlvbih0LGUpe3RoaXMuYXR0cih7ZHg6dCxkeTplfSl9LGltYWdlOmZ1bmN0aW9uKHQpe3RoaXMuYXR0cigiaHJlZiIsdCxTVkcueGxpbmspfSxkaXNwbGFjZW1lbnRNYXA6ZnVuY3Rpb24odCxlLGkscyxhKXt0aGlzLmF0dHIoe2luOnQsaW4yOmUsc2NhbGU6aSx4Q2hhbm5lbFNlbGVjdG9yOnMseUNoYW5uZWxTZWxlY3RvcjphfSl9LGdhdXNzaWFuQmx1cjpmdW5jdGlvbih0LGUpe251bGwhPXR8fG51bGwhPWU/dGhpcy5hdHRyKCJzdGREZXZpYXRpb24iLGZ1bmN0aW9uKHQpe2lmKCFBcnJheS5pc0FycmF5KHQpKXJldHVybiB0O2Zvcih2YXIgZT0wLGk9dC5sZW5ndGgscz1bXTtlPGk7ZSsrKXMucHVzaCh0W2VdKTtyZXR1cm4gcy5qb2luKCIgIil9KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKTp0aGlzLmF0dHIoInN0ZERldmlhdGlvbiIsIjAgMCIpfSxtb3JwaG9sb2d5OmZ1bmN0aW9uKHQsZSl7dGhpcy5hdHRyKHtvcGVyYXRvcjp0LHJhZGl1czplfSl9LHRpbGU6ZnVuY3Rpb24oKXt9LHR1cmJ1bGVuY2U6ZnVuY3Rpb24odCxlLGkscyxhKXt0aGlzLmF0dHIoe251bU9jdGF2ZXM6ZSxzZWVkOmksc3RpdGNoVGlsZXM6cyxiYXNlRnJlcXVlbmN5OnQsdHlwZTphfSl9fSxpPXttZXJnZTpmdW5jdGlvbigpe3ZhciB0O2lmKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgU1ZHLlNldCl7dmFyIGU9dGhpczthcmd1bWVudHNbMF0uZWFjaChmdW5jdGlvbih0KXt0aGlzIGluc3RhbmNlb2YgU1ZHLk1lcmdlTm9kZT9lLnB1dCh0aGlzKToodGhpcyBpbnN0YW5jZW9mIFNWRy5FZmZlY3R8fHRoaXMgaW5zdGFuY2VvZiBTVkcuUGFyZW50RWZmZWN0KSYmZS5wdXQobmV3IFNWRy5NZXJnZU5vZGUodGhpcykpfSl9ZWxzZXt0PUFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzBdKT9hcmd1bWVudHNbMF06YXJndW1lbnRzO2Zvcih2YXIgaT0wO2k8dC5sZW5ndGg7aSsrKXRbaV1pbnN0YW5jZW9mIFNWRy5NZXJnZU5vZGU/dGhpcy5wdXQodFtpXSk6dGhpcy5wdXQobmV3IFNWRy5NZXJnZU5vZGUodFtpXSkpfX0sY29tcG9uZW50VHJhbnNmZXI6ZnVuY3Rpb24odCl7aWYodGhpcy5yZ2I9bmV3IFNWRy5TZXQsWyJyIiwiZyIsImIiLCJhIl0uZm9yRWFjaChmdW5jdGlvbih0KXt0aGlzW3RdPW5ldyhTVkdbIkZ1bmMiK3QudG9VcHBlckNhc2UoKV0pKCJpZGVudGl0eSIpLHRoaXMucmdiLmFkZCh0aGlzW3RdKSx0aGlzLm5vZGUuYXBwZW5kQ2hpbGQodGhpc1t0XS5ub2RlKX0uYmluZCh0aGlzKSksdClmb3IodmFyIGUgaW4gdC5yZ2ImJihbInIiLCJnIiwiYiJdLmZvckVhY2goZnVuY3Rpb24oZSl7dGhpc1tlXS5hdHRyKHQucmdiKX0uYmluZCh0aGlzKSksZGVsZXRlIHQucmdiKSx0KXRoaXNbZV0uYXR0cih0W2VdKX0sZGlmZnVzZUxpZ2h0aW5nOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLmF0dHIoe3N1cmZhY2VTY2FsZTp0LGRpZmZ1c2VDb25zdGFudDplLGtlcm5lbFVuaXRMZW5ndGg6aX0pfSxzcGVjdWxhckxpZ2h0aW5nOmZ1bmN0aW9uKHQsZSxpLHMpe3RoaXMuYXR0cih7c3VyZmFjZVNjYWxlOnQsZGlmZnVzZUNvbnN0YW50OmUsc3BlY3VsYXJFeHBvbmVudDppLGtlcm5lbFVuaXRMZW5ndGg6c30pfX0scz17ZGlzdGFudExpZ2h0OmZ1bmN0aW9uKHQsZSl7dGhpcy5hdHRyKHthemltdXRoOnQsZWxldmF0aW9uOmV9KX0scG9pbnRMaWdodDpmdW5jdGlvbih0LGUsaSl7dGhpcy5hdHRyKHt4OnQseTplLHo6aX0pfSxzcG90TGlnaHQ6ZnVuY3Rpb24odCxlLGkscyxhLG4pe3RoaXMuYXR0cih7eDp0LHk6ZSx6OmkscG9pbnRzQXRYOnMscG9pbnRzQXRZOmEscG9pbnRzQXRaOm59KX0sbWVyZ2VOb2RlOmZ1bmN0aW9uKHQpe3RoaXMuYXR0cigiaW4iLHQpfX07ZnVuY3Rpb24gYSh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKHQ9bmV3IFNWRy5BcnJheSh0KSksdC50b1N0cmluZygpLnJlcGxhY2UoL15ccysvLCIiKS5yZXBsYWNlKC9ccyskLywiIikucmVwbGFjZSgvXHMrL2csIiAiKX1mdW5jdGlvbiBuKCl7dmFyIHQ9ZnVuY3Rpb24oKXt9O2Zvcih2YXIgZSBpbiJmdW5jdGlvbiI9PXR5cGVvZiBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXSYmKHQ9YXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV0sQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKGFyZ3VtZW50cyxhcmd1bWVudHMubGVuZ3RoLTEsMSkpLGFyZ3VtZW50cylmb3IodmFyIGkgaW4gYXJndW1lbnRzW2VdKXQoYXJndW1lbnRzW2VdW2ldLGksYXJndW1lbnRzW2VdKX1bInIiLCJnIiwiYiIsImEiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3NbIkZ1bmMiK3QudG9VcHBlckNhc2UoKV09ZnVuY3Rpb24odCl7c3dpdGNoKHRoaXMuYXR0cigidHlwZSIsdCksdCl7Y2FzZSJ0YWJsZSI6dGhpcy5hdHRyKCJ0YWJsZVZhbHVlcyIsYXJndW1lbnRzWzFdKTticmVhaztjYXNlImxpbmVhciI6dGhpcy5hdHRyKCJzbG9wZSIsYXJndW1lbnRzWzFdKSx0aGlzLmF0dHIoImludGVyY2VwdCIsYXJndW1lbnRzWzJdKTticmVhaztjYXNlImdhbW1hIjp0aGlzLmF0dHIoImFtcGxpdHVkZSIsYXJndW1lbnRzWzFdKSx0aGlzLmF0dHIoImV4cG9uZW50Iixhcmd1bWVudHNbMl0pLHRoaXMuYXR0cigib2Zmc2V0Iixhcmd1bWVudHNbMl0pfX19KSxuKGUsZnVuY3Rpb24odCxlKXt2YXIgaT1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSk7U1ZHW2krIkVmZmVjdCJdPVNWRy5pbnZlbnQoe2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuY29uc3RydWN0b3IuY2FsbCh0aGlzLFNWRy5jcmVhdGUoImZlIitpKSksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5yZXN1bHQodGhpcy5hdHRyKCJpZCIpKyJPdXQiKX0saW5oZXJpdDpTVkcuRWZmZWN0LGV4dGVuZDp7fX0pfSksbihpLGZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpO1NWR1tpKyJFZmZlY3QiXT1TVkcuaW52ZW50KHtjcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxTVkcuY3JlYXRlKCJmZSIraSkpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucmVzdWx0KHRoaXMuYXR0cigiaWQiKSsiT3V0Iil9LGluaGVyaXQ6U1ZHLlBhcmVudEVmZmVjdCxleHRlbmQ6e319KX0pLG4ocyxmdW5jdGlvbih0LGUpe3ZhciBpPWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKTtTVkdbaV09U1ZHLmludmVudCh7Y3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMsU1ZHLmNyZWF0ZSgiZmUiK2kpKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saW5oZXJpdDpTVkcuQ2hpbGRFZmZlY3QsZXh0ZW5kOnt9fSl9KSxTVkcuZXh0ZW5kKFNWRy5NZXJnZUVmZmVjdCx7aW46ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBTVkcuTWVyZ2VOb2RlP3RoaXMuYWRkKHQsMCk6dGhpcy5hZGQobmV3IFNWRy5NZXJnZU5vZGUodCksMCksdGhpc319KSxTVkcuZXh0ZW5kKFNWRy5Db21wb3NpdGVFZmZlY3QsU1ZHLkJsZW5kRWZmZWN0LFNWRy5EaXNwbGFjZW1lbnRNYXBFZmZlY3Qse2luMjpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLnBhcmVudCgpJiZ0aGlzLnBhcmVudCgpLnNlbGVjdCgnW3Jlc3VsdD0iJyt0aGlzLmF0dHIoImluMiIpKyciXScpLmdldCgwKXx8dGhpcy5hdHRyKCJpbjIiKTp0aGlzLmF0dHIoImluMiIsdCl9fSksU1ZHLmZpbHRlcj17c2VwaWF0b25lOlsuMzQzLC42NjksLjExOSwwLDAsLjI0OSwuNjI2LC4xMywwLDAsLjE3MiwuMzM0LC4xMTEsMCwwLDAsMCwwLDEsMF19fS5jYWxsKHZvaWQgMCksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsYSxuLHIsbyxsLGgpe2Zvcih2YXIgYz10LnNsaWNlKGEsbnx8aCksZD1yLnNsaWNlKG8sbHx8aCksdT0wLGc9e3BvczpbMCwwXSxzdGFydDpbMCwwXX0sZj17cG9zOlswLDBdLHN0YXJ0OlswLDBdfTs7KXtpZihjW3VdPWUuY2FsbChnLGNbdV0pLGRbdV09ZS5jYWxsKGYsZFt1XSksY1t1XVswXSE9ZFt1XVswXXx8Ik0iPT1jW3VdWzBdfHwiQSI9PWNbdV1bMF0mJihjW3VdWzRdIT1kW3VdWzRdfHxjW3VdWzVdIT1kW3VdWzVdKT8oQXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShjLFt1LDFdLmNvbmNhdChzLmNhbGwoZyxjW3VdKSkpLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuYXBwbHkoZCxbdSwxXS5jb25jYXQocy5jYWxsKGYsZFt1XSkpKSk6KGNbdV09aS5jYWxsKGcsY1t1XSksZFt1XT1pLmNhbGwoZixkW3VdKSksKyt1PT1jLmxlbmd0aCYmdT09ZC5sZW5ndGgpYnJlYWs7dT09Yy5sZW5ndGgmJmMucHVzaChbIkMiLGcucG9zWzBdLGcucG9zWzFdLGcucG9zWzBdLGcucG9zWzFdLGcucG9zWzBdLGcucG9zWzFdXSksdT09ZC5sZW5ndGgmJmQucHVzaChbIkMiLGYucG9zWzBdLGYucG9zWzFdLGYucG9zWzBdLGYucG9zWzFdLGYucG9zWzBdLGYucG9zWzFdXSl9cmV0dXJue3N0YXJ0OmMsZGVzdDpkfX1mdW5jdGlvbiBlKHQpe3N3aXRjaCh0WzBdKXtjYXNlInoiOmNhc2UiWiI6dFswXT0iTCIsdFsxXT10aGlzLnN0YXJ0WzBdLHRbMl09dGhpcy5zdGFydFsxXTticmVhaztjYXNlIkgiOnRbMF09IkwiLHRbMl09dGhpcy5wb3NbMV07YnJlYWs7Y2FzZSJWIjp0WzBdPSJMIix0WzJdPXRbMV0sdFsxXT10aGlzLnBvc1swXTticmVhaztjYXNlIlQiOnRbMF09IlEiLHRbM109dFsxXSx0WzRdPXRbMl0sdFsxXT10aGlzLnJlZmxlY3Rpb25bMV0sdFsyXT10aGlzLnJlZmxlY3Rpb25bMF07YnJlYWs7Y2FzZSJTIjp0WzBdPSJDIix0WzZdPXRbNF0sdFs1XT10WzNdLHRbNF09dFsyXSx0WzNdPXRbMV0sdFsyXT10aGlzLnJlZmxlY3Rpb25bMV0sdFsxXT10aGlzLnJlZmxlY3Rpb25bMF19cmV0dXJuIHR9ZnVuY3Rpb24gaSh0KXt2YXIgZT10Lmxlbmd0aDtyZXR1cm4gdGhpcy5wb3M9W3RbZS0yXSx0W2UtMV1dLC0xIT0iU0NRVCIuaW5kZXhPZih0WzBdKSYmKHRoaXMucmVmbGVjdGlvbj1bMip0aGlzLnBvc1swXS10W2UtNF0sMip0aGlzLnBvc1sxXS10W2UtM11dKSx0fWZ1bmN0aW9uIHModCl7dmFyIGU9W3RdO3N3aXRjaCh0WzBdKXtjYXNlIk0iOnJldHVybiB0aGlzLnBvcz10aGlzLnN0YXJ0PVt0WzFdLHRbMl1dLGU7Y2FzZSJMIjp0WzVdPXRbM109dFsxXSx0WzZdPXRbNF09dFsyXSx0WzFdPXRoaXMucG9zWzBdLHRbMl09dGhpcy5wb3NbMV07YnJlYWs7Y2FzZSJRIjp0WzZdPXRbNF0sdFs1XT10WzNdLHRbNF09MSp0WzRdLzMrMip0WzJdLzMsdFszXT0xKnRbM10vMysyKnRbMV0vMyx0WzJdPTEqdGhpcy5wb3NbMV0vMysyKnRbMl0vMyx0WzFdPTEqdGhpcy5wb3NbMF0vMysyKnRbMV0vMzticmVhaztjYXNlIkEiOnQ9KGU9ZnVuY3Rpb24odCxlKXt2YXIgaSxzLGEsbixyLG8sbCxoLGMsZCx1LGcsZixwLHgsYixtLHYseSx3LGssQSxTLEMsTCxQLHo9TWF0aC5hYnMoZVsxXSksTT1NYXRoLmFicyhlWzJdKSxFPWVbM10lMzYwLFQ9ZVs0XSxYPWVbNV0sST1lWzZdLFk9ZVs3XSxGPW5ldyBTVkcuUG9pbnQodCksUj1uZXcgU1ZHLlBvaW50KEksWSksRD1bXTtpZigwPT09enx8MD09PU18fEYueD09PVIueCYmRi55PT09Ui55KXJldHVybltbIkMiLEYueCxGLnksUi54LFIueSxSLngsUi55XV07aT1uZXcgU1ZHLlBvaW50KChGLngtUi54KS8yLChGLnktUi55KS8yKS50cmFuc2Zvcm0oKG5ldyBTVkcuTWF0cml4KS5yb3RhdGUoRSkpLChzPWkueCppLngvKHoqeikraS55KmkueS8oTSpNKSk+MSYmKHM9TWF0aC5zcXJ0KHMpLHoqPXMsTSo9cyk7YT0obmV3IFNWRy5NYXRyaXgpLnJvdGF0ZShFKS5zY2FsZSgxL3osMS9NKS5yb3RhdGUoLUUpLEY9Ri50cmFuc2Zvcm0oYSksUj1SLnRyYW5zZm9ybShhKSxuPVtSLngtRi54LFIueS1GLnldLG89blswXSpuWzBdK25bMV0qblsxXSxyPU1hdGguc3FydChvKSxuWzBdLz1yLG5bMV0vPXIsbD1vPDQ/TWF0aC5zcXJ0KDEtby80KTowLFQ9PT1YJiYobCo9LTEpO2g9bmV3IFNWRy5Qb2ludCgoUi54K0YueCkvMitsKi1uWzFdLChSLnkrRi55KS8yK2wqblswXSksYz1uZXcgU1ZHLlBvaW50KEYueC1oLngsRi55LWgueSksZD1uZXcgU1ZHLlBvaW50KFIueC1oLngsUi55LWgueSksdT1NYXRoLmFjb3MoYy54L01hdGguc3FydChjLngqYy54K2MueSpjLnkpKSxjLnk8MCYmKHUqPS0xKTtnPU1hdGguYWNvcyhkLngvTWF0aC5zcXJ0KGQueCpkLngrZC55KmQueSkpLGQueTwwJiYoZyo9LTEpO1gmJnU+ZyYmKGcrPTIqTWF0aC5QSSk7IVgmJnU8ZyYmKGctPTIqTWF0aC5QSSk7Zm9yKHA9TWF0aC5jZWlsKDIqTWF0aC5hYnModS1nKS9NYXRoLlBJKSxiPVtdLG09dSxmPShnLXUpL3AseD00Kk1hdGgudGFuKGYvNCkvMyxrPTA7azw9cDtrKyspeT1NYXRoLmNvcyhtKSx2PU1hdGguc2luKG0pLHc9bmV3IFNWRy5Qb2ludChoLngreSxoLnkrdiksYltrXT1bbmV3IFNWRy5Qb2ludCh3LngreCp2LHcueS14KnkpLHcsbmV3IFNWRy5Qb2ludCh3LngteCp2LHcueSt4KnkpXSxtKz1mO2ZvcihiWzBdWzBdPWJbMF1bMV0uY2xvbmUoKSxiW2IubGVuZ3RoLTFdWzJdPWJbYi5sZW5ndGgtMV1bMV0uY2xvbmUoKSxhPShuZXcgU1ZHLk1hdHJpeCkucm90YXRlKEUpLnNjYWxlKHosTSkucm90YXRlKC1FKSxrPTAsQT1iLmxlbmd0aDtrPEE7aysrKWJba11bMF09YltrXVswXS50cmFuc2Zvcm0oYSksYltrXVsxXT1iW2tdWzFdLnRyYW5zZm9ybShhKSxiW2tdWzJdPWJba11bMl0udHJhbnNmb3JtKGEpO2ZvcihrPTEsQT1iLmxlbmd0aDtrPEE7aysrKXc9YltrLTFdWzJdLFM9dy54LEM9dy55LHc9YltrXVswXSxMPXcueCxQPXcueSx3PWJba11bMV0sST13LngsWT13LnksRC5wdXNoKFsiQyIsUyxDLEwsUCxJLFldKTtyZXR1cm4gRH0odGhpcy5wb3MsdCkpWzBdfXJldHVybiB0WzBdPSJDIix0aGlzLnBvcz1bdFs1XSx0WzZdXSx0aGlzLnJlZmxlY3Rpb249WzIqdFs1XS10WzNdLDIqdFs2XS10WzRdXSxlfWZ1bmN0aW9uIGEodCxlKXtpZighMT09PWUpcmV0dXJuITE7Zm9yKHZhciBpPWUscz10Lmxlbmd0aDtpPHM7KytpKWlmKCJNIj09dFtpXVswXSlyZXR1cm4gaTtyZXR1cm4hMX1TVkcuZXh0ZW5kKFNWRy5QYXRoQXJyYXkse21vcnBoOmZ1bmN0aW9uKGUpe2Zvcih2YXIgaT10aGlzLnZhbHVlLHM9dGhpcy5wYXJzZShlKSxuPTAscj0wLG89ITEsbD0hMTshMSE9PW58fCExIT09cjspe3ZhciBoO289YShpLCExIT09biYmbisxKSxsPWEocywhMSE9PXImJnIrMSksITE9PT1uJiYobj0wPT0oaD1uZXcgU1ZHLlBhdGhBcnJheShjLnN0YXJ0KS5iYm94KCkpLmhlaWdodHx8MD09aC53aWR0aD9pLnB1c2goaVswXSktMTppLnB1c2goWyJNIixoLngraC53aWR0aC8yLGgueStoLmhlaWdodC8yXSktMSksITE9PT1yJiYocj0wPT0oaD1uZXcgU1ZHLlBhdGhBcnJheShjLmRlc3QpLmJib3goKSkuaGVpZ2h0fHwwPT1oLndpZHRoP3MucHVzaChzWzBdKS0xOnMucHVzaChbIk0iLGgueCtoLndpZHRoLzIsaC55K2guaGVpZ2h0LzJdKS0xKTt2YXIgYz10KGksbixvLHMscixsKTtpPWkuc2xpY2UoMCxuKS5jb25jYXQoYy5zdGFydCwhMT09PW8/W106aS5zbGljZShvKSkscz1zLnNsaWNlKDAscikuY29uY2F0KGMuZGVzdCwhMT09PWw/W106cy5zbGljZShsKSksbj0hMSE9PW8mJm4rYy5zdGFydC5sZW5ndGgscj0hMSE9PWwmJnIrYy5kZXN0Lmxlbmd0aH1yZXR1cm4gdGhpcy52YWx1ZT1pLHRoaXMuZGVzdGluYXRpb249bmV3IFNWRy5QYXRoQXJyYXksdGhpcy5kZXN0aW5hdGlvbi52YWx1ZT1zLHRoaXN9fSl9KCksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3QucmVtZW1iZXIoIl9kcmFnZ2FibGUiLHRoaXMpLHRoaXMuZWw9dH10LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpczt0aGlzLmNvbnN0cmFpbnQ9dCx0aGlzLnZhbHVlPWUsdGhpcy5lbC5vbigibW91c2Vkb3duLmRyYWciLGZ1bmN0aW9uKHQpe2kuc3RhcnQodCl9KSx0aGlzLmVsLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLGZ1bmN0aW9uKHQpe2kuc3RhcnQodCl9KX0sdC5wcm90b3R5cGUudHJhbnNmb3JtUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT0odD10fHx3aW5kb3cuZXZlbnQpLmNoYW5nZWRUb3VjaGVzJiZ0LmNoYW5nZWRUb3VjaGVzWzBdfHx0O3JldHVybiB0aGlzLnAueD1pLmNsaWVudFgtKGV8fDApLHRoaXMucC55PWkuY2xpZW50WSx0aGlzLnAubWF0cml4VHJhbnNmb3JtKHRoaXMubSl9LHQucHJvdG90eXBlLmdldEJCb3g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsLmJib3goKTtyZXR1cm4gdGhpcy5lbCBpbnN0YW5jZW9mIFNWRy5OZXN0ZWQmJih0PXRoaXMuZWwucmJveCgpKSwodGhpcy5lbCBpbnN0YW5jZW9mIFNWRy5HfHx0aGlzLmVsIGluc3RhbmNlb2YgU1ZHLlVzZXx8dGhpcy5lbCBpbnN0YW5jZW9mIFNWRy5OZXN0ZWQpJiYodC54PXRoaXMuZWwueCgpLHQueT10aGlzLmVsLnkoKSksdH0sdC5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24odCl7aWYoImNsaWNrIiE9dC50eXBlJiYibW91c2Vkb3duIiE9dC50eXBlJiYibW91c2Vtb3ZlIiE9dC50eXBlfHwxPT0odC53aGljaHx8dC5idXR0b25zKSl7dmFyIGU9dGhpcztpZih0aGlzLmVsLmZpcmUoImJlZm9yZWRyYWciLHtldmVudDp0LGhhbmRsZXI6dGhpc30pLCF0aGlzLmVsLmV2ZW50KCkuZGVmYXVsdFByZXZlbnRlZCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5wYXJlbnQ9dGhpcy5wYXJlbnR8fHRoaXMuZWwucGFyZW50KFNWRy5OZXN0ZWQpfHx0aGlzLmVsLnBhcmVudChTVkcuRG9jKSx0aGlzLnA9dGhpcy5wYXJlbnQubm9kZS5jcmVhdGVTVkdQb2ludCgpLHRoaXMubT10aGlzLmVsLm5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpO3ZhciBpLHM9dGhpcy5nZXRCQm94KCk7aWYodGhpcy5lbCBpbnN0YW5jZW9mIFNWRy5UZXh0KXN3aXRjaChpPXRoaXMuZWwubm9kZS5nZXRDb21wdXRlZFRleHRMZW5ndGgoKSx0aGlzLmVsLmF0dHIoInRleHQtYW5jaG9yIikpe2Nhc2UibWlkZGxlIjppLz0yO2JyZWFrO2Nhc2Uic3RhcnQiOmk9MH10aGlzLnN0YXJ0UG9pbnRzPXtwb2ludDp0aGlzLnRyYW5zZm9ybVBvaW50KHQsaSksYm94OnMsdHJhbnNmb3JtOnRoaXMuZWwudHJhbnNmb3JtKCl9LFNWRy5vbih3aW5kb3csIm1vdXNlbW92ZS5kcmFnIixmdW5jdGlvbih0KXtlLmRyYWcodCl9KSxTVkcub24od2luZG93LCJ0b3VjaG1vdmUuZHJhZyIsZnVuY3Rpb24odCl7ZS5kcmFnKHQpfSksU1ZHLm9uKHdpbmRvdywibW91c2V1cC5kcmFnIixmdW5jdGlvbih0KXtlLmVuZCh0KX0pLFNWRy5vbih3aW5kb3csInRvdWNoZW5kLmRyYWciLGZ1bmN0aW9uKHQpe2UuZW5kKHQpfSksdGhpcy5lbC5maXJlKCJkcmFnc3RhcnQiLHtldmVudDp0LHA6dGhpcy5zdGFydFBvaW50cy5wb2ludCxtOnRoaXMubSxoYW5kbGVyOnRoaXN9KX19fSx0LnByb3RvdHlwZS5kcmFnPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0QkJveCgpLGk9dGhpcy50cmFuc2Zvcm1Qb2ludCh0KSxzPXRoaXMuc3RhcnRQb2ludHMuYm94LngraS54LXRoaXMuc3RhcnRQb2ludHMucG9pbnQueCxhPXRoaXMuc3RhcnRQb2ludHMuYm94LnkraS55LXRoaXMuc3RhcnRQb2ludHMucG9pbnQueSxuPXRoaXMuY29uc3RyYWludCxyPWkueC10aGlzLnN0YXJ0UG9pbnRzLnBvaW50Lngsbz1pLnktdGhpcy5zdGFydFBvaW50cy5wb2ludC55O2lmKHRoaXMuZWwuZmlyZSgiZHJhZ21vdmUiLHtldmVudDp0LHA6aSxtOnRoaXMubSxoYW5kbGVyOnRoaXN9KSx0aGlzLmVsLmV2ZW50KCkuZGVmYXVsdFByZXZlbnRlZClyZXR1cm4gaTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbil7dmFyIGw9bi5jYWxsKHRoaXMuZWwscyxhLHRoaXMubSk7ImJvb2xlYW4iPT10eXBlb2YgbCYmKGw9e3g6bCx5Omx9KSwhMD09PWwueD90aGlzLmVsLngocyk6ITEhPT1sLngmJnRoaXMuZWwueChsLngpLCEwPT09bC55P3RoaXMuZWwueShhKTohMSE9PWwueSYmdGhpcy5lbC55KGwueSl9ZWxzZSJvYmplY3QiPT10eXBlb2YgbiYmKG51bGwhPW4ubWluWCYmczxuLm1pblg/cj0ocz1uLm1pblgpLXRoaXMuc3RhcnRQb2ludHMuYm94Lng6bnVsbCE9bi5tYXhYJiZzPm4ubWF4WC1lLndpZHRoJiYocj0ocz1uLm1heFgtZS53aWR0aCktdGhpcy5zdGFydFBvaW50cy5ib3gueCksbnVsbCE9bi5taW5ZJiZhPG4ubWluWT9vPShhPW4ubWluWSktdGhpcy5zdGFydFBvaW50cy5ib3gueTpudWxsIT1uLm1heFkmJmE+bi5tYXhZLWUuaGVpZ2h0JiYobz0oYT1uLm1heFktZS5oZWlnaHQpLXRoaXMuc3RhcnRQb2ludHMuYm94LnkpLG51bGwhPW4uc25hcFRvR3JpZCYmKHMtPXMlbi5zbmFwVG9HcmlkLGEtPWElbi5zbmFwVG9HcmlkLHItPXIlbi5zbmFwVG9HcmlkLG8tPW8lbi5zbmFwVG9HcmlkKSx0aGlzLmVsIGluc3RhbmNlb2YgU1ZHLkc/dGhpcy5lbC5tYXRyaXgodGhpcy5zdGFydFBvaW50cy50cmFuc2Zvcm0pLnRyYW5zZm9ybSh7eDpyLHk6b30sITApOnRoaXMuZWwubW92ZShzLGEpKTtyZXR1cm4gaX0sdC5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZHJhZyh0KTt0aGlzLmVsLmZpcmUoImRyYWdlbmQiLHtldmVudDp0LHA6ZSxtOnRoaXMubSxoYW5kbGVyOnRoaXN9KSxTVkcub2ZmKHdpbmRvdywibW91c2Vtb3ZlLmRyYWciKSxTVkcub2ZmKHdpbmRvdywidG91Y2htb3ZlLmRyYWciKSxTVkcub2ZmKHdpbmRvdywibW91c2V1cC5kcmFnIiksU1ZHLm9mZih3aW5kb3csInRvdWNoZW5kLmRyYWciKX0sU1ZHLmV4dGVuZChTVkcuRWxlbWVudCx7ZHJhZ2dhYmxlOmZ1bmN0aW9uKGUsaSl7ImZ1bmN0aW9uIiE9dHlwZW9mIGUmJiJvYmplY3QiIT10eXBlb2YgZXx8KGk9ZSxlPSEwKTt2YXIgcz10aGlzLnJlbWVtYmVyKCJfZHJhZ2dhYmxlIil8fG5ldyB0KHRoaXMpO3JldHVybihlPXZvaWQgMD09PWV8fGUpP3MuaW5pdChpfHx7fSxlKToodGhpcy5vZmYoIm1vdXNlZG93bi5kcmFnIiksdGhpcy5vZmYoInRvdWNoc3RhcnQuZHJhZyIpKSx0aGlzfX0pfS5jYWxsKHZvaWQgMCksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuZWw9dCx0LnJlbWVtYmVyKCJfc2VsZWN0SGFuZGxlciIsdGhpcyksdGhpcy5wb2ludFNlbGVjdGlvbj17aXNTZWxlY3RlZDohMX0sdGhpcy5yZWN0U2VsZWN0aW9uPXtpc1NlbGVjdGVkOiExfX10LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5lbC5iYm94KCk7Zm9yKHZhciBzIGluIHRoaXMub3B0aW9ucz17fSx0aGlzLmVsLnNlbGVjdGl6ZS5kZWZhdWx0cyl0aGlzLm9wdGlvbnNbc109dGhpcy5lbC5zZWxlY3RpemUuZGVmYXVsdHNbc10sdm9pZCAwIT09ZVtzXSYmKHRoaXMub3B0aW9uc1tzXT1lW3NdKTt0aGlzLnBhcmVudD10aGlzLmVsLnBhcmVudCgpLHRoaXMubmVzdGVkPXRoaXMubmVzdGVkfHx0aGlzLnBhcmVudC5ncm91cCgpLHRoaXMubmVzdGVkLm1hdHJpeChuZXcgU1ZHLk1hdHJpeCh0aGlzLmVsKS50cmFuc2xhdGUoaS54LGkueSkpLHRoaXMub3B0aW9ucy5kZWVwU2VsZWN0JiYtMSE9PVsibGluZSIsInBvbHlsaW5lIiwicG9seWdvbiJdLmluZGV4T2YodGhpcy5lbC50eXBlKT90aGlzLnNlbGVjdFBvaW50cyh0KTp0aGlzLnNlbGVjdFJlY3QodCksdGhpcy5vYnNlcnZlKCksdGhpcy5jbGVhbnVwKCl9LHQucHJvdG90eXBlLnNlbGVjdFBvaW50cz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wb2ludFNlbGVjdGlvbi5pc1NlbGVjdGVkPXQsdGhpcy5wb2ludFNlbGVjdGlvbi5zZXQ/dGhpczoodGhpcy5wb2ludFNlbGVjdGlvbi5zZXQ9dGhpcy5wYXJlbnQuc2V0KCksdGhpcy5kcmF3Q2lyY2xlcygpLHRoaXMpfSx0LnByb3RvdHlwZS5nZXRQb2ludEFycmF5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbC5iYm94KCk7cmV0dXJuIHRoaXMuZWwuYXJyYXkoKS52YWx1ZU9mKCkubWFwKGZ1bmN0aW9uKGUpe3JldHVybltlWzBdLXQueCxlWzFdLXQueV19KX0sdC5wcm90b3R5cGUuZHJhd0NpcmNsZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPXRoaXMuZ2V0UG9pbnRBcnJheSgpLGk9MCxzPWUubGVuZ3RoO2k8czsrK2kpe3ZhciBhPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihpKXsoaT1pfHx3aW5kb3cuZXZlbnQpLnByZXZlbnREZWZhdWx0P2kucHJldmVudERlZmF1bHQoKTppLnJldHVyblZhbHVlPSExLGkuc3RvcFByb3BhZ2F0aW9uKCk7dmFyIHM9aS5wYWdlWHx8aS50b3VjaGVzWzBdLnBhZ2VYLGE9aS5wYWdlWXx8aS50b3VjaGVzWzBdLnBhZ2VZO3QuZWwuZmlyZSgicG9pbnQiLHt4OnMseTphLGk6ZSxldmVudDppfSl9fShpKTt0aGlzLnBvaW50U2VsZWN0aW9uLnNldC5hZGQodGhpcy5uZXN0ZWQuY2lyY2xlKHRoaXMub3B0aW9ucy5yYWRpdXMpLmNlbnRlcihlW2ldWzBdLGVbaV1bMV0pLmFkZENsYXNzKHRoaXMub3B0aW9ucy5jbGFzc1BvaW50cykuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmNsYXNzUG9pbnRzKyJfcG9pbnQiKS5vbigidG91Y2hzdGFydCIsYSkub24oIm1vdXNlZG93biIsYSkpfX0sdC5wcm90b3R5cGUudXBkYXRlUG9pbnRTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFBvaW50QXJyYXkoKTt0aGlzLnBvaW50U2VsZWN0aW9uLnNldC5lYWNoKGZ1bmN0aW9uKGUpe3RoaXMuY3goKT09PXRbZV1bMF0mJnRoaXMuY3koKT09PXRbZV1bMV18fHRoaXMuY2VudGVyKHRbZV1bMF0sdFtlXVsxXSl9KX0sdC5wcm90b3R5cGUudXBkYXRlUmVjdFNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZWwuYmJveCgpO3RoaXMucmVjdFNlbGVjdGlvbi5zZXQuZ2V0KDApLmF0dHIoe3dpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0fSksdGhpcy5vcHRpb25zLnBvaW50cyYmKHRoaXMucmVjdFNlbGVjdGlvbi5zZXQuZ2V0KDIpLmNlbnRlcih0LndpZHRoLDApLHRoaXMucmVjdFNlbGVjdGlvbi5zZXQuZ2V0KDMpLmNlbnRlcih0LndpZHRoLHQuaGVpZ2h0KSx0aGlzLnJlY3RTZWxlY3Rpb24uc2V0LmdldCg0KS5jZW50ZXIoMCx0LmhlaWdodCksdGhpcy5yZWN0U2VsZWN0aW9uLnNldC5nZXQoNSkuY2VudGVyKHQud2lkdGgvMiwwKSx0aGlzLnJlY3RTZWxlY3Rpb24uc2V0LmdldCg2KS5jZW50ZXIodC53aWR0aCx0LmhlaWdodC8yKSx0aGlzLnJlY3RTZWxlY3Rpb24uc2V0LmdldCg3KS5jZW50ZXIodC53aWR0aC8yLHQuaGVpZ2h0KSx0aGlzLnJlY3RTZWxlY3Rpb24uc2V0LmdldCg4KS5jZW50ZXIoMCx0LmhlaWdodC8yKSksdGhpcy5vcHRpb25zLnJvdGF0aW9uUG9pbnQmJih0aGlzLm9wdGlvbnMucG9pbnRzP3RoaXMucmVjdFNlbGVjdGlvbi5zZXQuZ2V0KDkpLmNlbnRlcih0LndpZHRoLzIsMjApOnRoaXMucmVjdFNlbGVjdGlvbi5zZXQuZ2V0KDEpLmNlbnRlcih0LndpZHRoLzIsMjApKX0sdC5wcm90b3R5cGUuc2VsZWN0UmVjdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLGk9dGhpcy5lbC5iYm94KCk7ZnVuY3Rpb24gcyh0KXtyZXR1cm4gZnVuY3Rpb24oaSl7KGk9aXx8d2luZG93LmV2ZW50KS5wcmV2ZW50RGVmYXVsdD9pLnByZXZlbnREZWZhdWx0KCk6aS5yZXR1cm5WYWx1ZT0hMSxpLnN0b3BQcm9wYWdhdGlvbigpO3ZhciBzPWkucGFnZVh8fGkudG91Y2hlc1swXS5wYWdlWCxhPWkucGFnZVl8fGkudG91Y2hlc1swXS5wYWdlWTtlLmVsLmZpcmUodCx7eDpzLHk6YSxldmVudDppfSl9fWlmKHRoaXMucmVjdFNlbGVjdGlvbi5pc1NlbGVjdGVkPXQsdGhpcy5yZWN0U2VsZWN0aW9uLnNldD10aGlzLnJlY3RTZWxlY3Rpb24uc2V0fHx0aGlzLnBhcmVudC5zZXQoKSx0aGlzLnJlY3RTZWxlY3Rpb24uc2V0LmdldCgwKXx8dGhpcy5yZWN0U2VsZWN0aW9uLnNldC5hZGQodGhpcy5uZXN0ZWQucmVjdChpLndpZHRoLGkuaGVpZ2h0KS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuY2xhc3NSZWN0KSksdGhpcy5vcHRpb25zLnBvaW50cyYmIXRoaXMucmVjdFNlbGVjdGlvbi5zZXQuZ2V0KDEpKXt2YXIgYT0idG91Y2hzdGFydCIsbj0ibW91c2Vkb3duIjt0aGlzLnJlY3RTZWxlY3Rpb24uc2V0LmFkZCh0aGlzLm5lc3RlZC5jaXJjbGUodGhpcy5vcHRpb25zLnJhZGl1cykuY2VudGVyKDAsMCkuYXR0cigiY2xhc3MiLHRoaXMub3B0aW9ucy5jbGFzc1BvaW50cysiX2x0Iikub24obixzKCJsdCIpKS5vbihhLHMoImx0IikpKSx0aGlzLnJlY3RTZWxlY3Rpb24uc2V0LmFkZCh0aGlzLm5lc3RlZC5jaXJjbGUodGhpcy5vcHRpb25zLnJhZGl1cykuY2VudGVyKGkud2lkdGgsMCkuYXR0cigiY2xhc3MiLHRoaXMub3B0aW9ucy5jbGFzc1BvaW50cysiX3J0Iikub24obixzKCJydCIpKS5vbihhLHMoInJ0IikpKSx0aGlzLnJlY3RTZWxlY3Rpb24uc2V0LmFkZCh0aGlzLm5lc3RlZC5jaXJjbGUodGhpcy5vcHRpb25zLnJhZGl1cykuY2VudGVyKGkud2lkdGgsaS5oZWlnaHQpLmF0dHIoImNsYXNzIix0aGlzLm9wdGlvbnMuY2xhc3NQb2ludHMrIl9yYiIpLm9uKG4scygicmIiKSkub24oYSxzKCJyYiIpKSksdGhpcy5yZWN0U2VsZWN0aW9uLnNldC5hZGQodGhpcy5uZXN0ZWQuY2lyY2xlKHRoaXMub3B0aW9ucy5yYWRpdXMpLmNlbnRlcigwLGkuaGVpZ2h0KS5hdHRyKCJjbGFzcyIsdGhpcy5vcHRpb25zLmNsYXNzUG9pbnRzKyJfbGIiKS5vbihuLHMoImxiIikpLm9uKGEscygibGIiKSkpLHRoaXMucmVjdFNlbGVjdGlvbi5zZXQuYWRkKHRoaXMubmVzdGVkLmNpcmNsZSh0aGlzLm9wdGlvbnMucmFkaXVzKS5jZW50ZXIoaS53aWR0aC8yLDApLmF0dHIoImNsYXNzIix0aGlzLm9wdGlvbnMuY2xhc3NQb2ludHMrIl90Iikub24obixzKCJ0IikpLm9uKGEscygidCIpKSksdGhpcy5yZWN0U2VsZWN0aW9uLnNldC5hZGQodGhpcy5uZXN0ZWQuY2lyY2xlKHRoaXMub3B0aW9ucy5yYWRpdXMpLmNlbnRlcihpLndpZHRoLGkuaGVpZ2h0LzIpLmF0dHIoImNsYXNzIix0aGlzLm9wdGlvbnMuY2xhc3NQb2ludHMrIl9yIikub24obixzKCJyIikpLm9uKGEscygiciIpKSksdGhpcy5yZWN0U2VsZWN0aW9uLnNldC5hZGQodGhpcy5uZXN0ZWQuY2lyY2xlKHRoaXMub3B0aW9ucy5yYWRpdXMpLmNlbnRlcihpLndpZHRoLzIsaS5oZWlnaHQpLmF0dHIoImNsYXNzIix0aGlzLm9wdGlvbnMuY2xhc3NQb2ludHMrIl9iIikub24obixzKCJiIikpLm9uKGEscygiYiIpKSksdGhpcy5yZWN0U2VsZWN0aW9uLnNldC5hZGQodGhpcy5uZXN0ZWQuY2lyY2xlKHRoaXMub3B0aW9ucy5yYWRpdXMpLmNlbnRlcigwLGkuaGVpZ2h0LzIpLmF0dHIoImNsYXNzIix0aGlzLm9wdGlvbnMuY2xhc3NQb2ludHMrIl9sIikub24obixzKCJsIikpLm9uKGEscygibCIpKSksdGhpcy5yZWN0U2VsZWN0aW9uLnNldC5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5hZGRDbGFzcyhlLm9wdGlvbnMuY2xhc3NQb2ludHMpfSl9aWYodGhpcy5vcHRpb25zLnJvdGF0aW9uUG9pbnQmJih0aGlzLm9wdGlvbnMucG9pbnRzJiYhdGhpcy5yZWN0U2VsZWN0aW9uLnNldC5nZXQoOSl8fCF0aGlzLm9wdGlvbnMucG9pbnRzJiYhdGhpcy5yZWN0U2VsZWN0aW9uLnNldC5nZXQoMSkpKXt2YXIgcj1mdW5jdGlvbih0KXsodD10fHx3aW5kb3cuZXZlbnQpLnByZXZlbnREZWZhdWx0P3QucHJldmVudERlZmF1bHQoKTp0LnJldHVyblZhbHVlPSExLHQuc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGk9dC5wYWdlWHx8dC50b3VjaGVzWzBdLnBhZ2VYLHM9dC5wYWdlWXx8dC50b3VjaGVzWzBdLnBhZ2VZO2UuZWwuZmlyZSgicm90Iix7eDppLHk6cyxldmVudDp0fSl9O3RoaXMucmVjdFNlbGVjdGlvbi5zZXQuYWRkKHRoaXMubmVzdGVkLmNpcmNsZSh0aGlzLm9wdGlvbnMucmFkaXVzKS5jZW50ZXIoaS53aWR0aC8yLDIwKS5hdHRyKCJjbGFzcyIsdGhpcy5vcHRpb25zLmNsYXNzUG9pbnRzKyJfcm90Iikub24oInRvdWNoc3RhcnQiLHIpLm9uKCJtb3VzZWRvd24iLHIpKX19LHQucHJvdG90eXBlLmhhbmRsZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsLmJib3goKTt0aGlzLm5lc3RlZC5tYXRyaXgobmV3IFNWRy5NYXRyaXgodGhpcy5lbCkudHJhbnNsYXRlKHQueCx0LnkpKSx0aGlzLnJlY3RTZWxlY3Rpb24uaXNTZWxlY3RlZCYmdGhpcy51cGRhdGVSZWN0U2VsZWN0aW9uKCksdGhpcy5wb2ludFNlbGVjdGlvbi5pc1NlbGVjdGVkJiZ0aGlzLnVwZGF0ZVBvaW50U2VsZWN0aW9uKCl9LHQucHJvdG90eXBlLm9ic2VydmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKE11dGF0aW9uT2JzZXJ2ZXIpaWYodGhpcy5yZWN0U2VsZWN0aW9uLmlzU2VsZWN0ZWR8fHRoaXMucG9pbnRTZWxlY3Rpb24uaXNTZWxlY3RlZCl0aGlzLm9ic2VydmVySW5zdD10aGlzLm9ic2VydmVySW5zdHx8bmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXt0LmhhbmRsZXIoKX0pLHRoaXMub2JzZXJ2ZXJJbnN0Lm9ic2VydmUodGhpcy5lbC5ub2RlLHthdHRyaWJ1dGVzOiEwfSk7ZWxzZSB0cnl7dGhpcy5vYnNlcnZlckluc3QuZGlzY29ubmVjdCgpLGRlbGV0ZSB0aGlzLm9ic2VydmVySW5zdH1jYXRjaCh0KXt9ZWxzZSB0aGlzLmVsLm9mZigiRE9NQXR0ck1vZGlmaWVkLnNlbGVjdCIpLCh0aGlzLnJlY3RTZWxlY3Rpb24uaXNTZWxlY3RlZHx8dGhpcy5wb2ludFNlbGVjdGlvbi5pc1NlbGVjdGVkKSYmdGhpcy5lbC5vbigiRE9NQXR0ck1vZGlmaWVkLnNlbGVjdCIsZnVuY3Rpb24oKXt0LmhhbmRsZXIoKX0pfSx0LnByb3RvdHlwZS5jbGVhbnVwPWZ1bmN0aW9uKCl7IXRoaXMucmVjdFNlbGVjdGlvbi5pc1NlbGVjdGVkJiZ0aGlzLnJlY3RTZWxlY3Rpb24uc2V0JiYodGhpcy5yZWN0U2VsZWN0aW9uLnNldC5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmUoKX0pLHRoaXMucmVjdFNlbGVjdGlvbi5zZXQuY2xlYXIoKSxkZWxldGUgdGhpcy5yZWN0U2VsZWN0aW9uLnNldCksIXRoaXMucG9pbnRTZWxlY3Rpb24uaXNTZWxlY3RlZCYmdGhpcy5wb2ludFNlbGVjdGlvbi5zZXQmJih0aGlzLnBvaW50U2VsZWN0aW9uLnNldC5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmUoKX0pLHRoaXMucG9pbnRTZWxlY3Rpb24uc2V0LmNsZWFyKCksZGVsZXRlIHRoaXMucG9pbnRTZWxlY3Rpb24uc2V0KSx0aGlzLnBvaW50U2VsZWN0aW9uLmlzU2VsZWN0ZWR8fHRoaXMucmVjdFNlbGVjdGlvbi5pc1NlbGVjdGVkfHwodGhpcy5uZXN0ZWQucmVtb3ZlKCksZGVsZXRlIHRoaXMubmVzdGVkKX0sU1ZHLmV4dGVuZChTVkcuRWxlbWVudCx7c2VsZWN0aXplOmZ1bmN0aW9uKGUsaSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiYoaT1lLGU9ITApLCh0aGlzLnJlbWVtYmVyKCJfc2VsZWN0SGFuZGxlciIpfHxuZXcgdCh0aGlzKSkuaW5pdCh2b2lkIDA9PT1lfHxlLGl8fHt9KSx0aGlzfX0pLFNWRy5FbGVtZW50LnByb3RvdHlwZS5zZWxlY3RpemUuZGVmYXVsdHM9e3BvaW50czohMCxjbGFzc1JlY3Q6InN2Z19zZWxlY3RfYm91bmRpbmdSZWN0IixjbGFzc1BvaW50czoic3ZnX3NlbGVjdF9wb2ludHMiLHJhZGl1czo3LHJvdGF0aW9uUG9pbnQ6ITAsZGVlcFNlbGVjdDohMX19KCksZnVuY3Rpb24oKXsoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3QucmVtZW1iZXIoIl9yZXNpemVIYW5kbGVyIix0aGlzKSx0aGlzLmVsPXQsdGhpcy5wYXJhbWV0ZXJzPXt9LHRoaXMubGFzdFVwZGF0ZUNhbGw9bnVsbCx0aGlzLnA9dC5kb2MoKS5ub2RlLmNyZWF0ZVNWR1BvaW50KCl9dC5wcm90b3R5cGUudHJhbnNmb3JtUG9pbnQ9ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLnAueD10LSh0aGlzLm9mZnNldC54LXdpbmRvdy5wYWdlWE9mZnNldCksdGhpcy5wLnk9ZS0odGhpcy5vZmZzZXQueS13aW5kb3cucGFnZVlPZmZzZXQpLHRoaXMucC5tYXRyaXhUcmFuc2Zvcm0oaXx8dGhpcy5tKX0sdC5wcm90b3R5cGUuX2V4dHJhY3RQb3NpdGlvbj1mdW5jdGlvbih0KXtyZXR1cm57eDpudWxsIT10LmNsaWVudFg/dC5jbGllbnRYOnQudG91Y2hlc1swXS5jbGllbnRYLHk6bnVsbCE9dC5jbGllbnRZP3QuY2xpZW50WTp0LnRvdWNoZXNbMF0uY2xpZW50WX19LHQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih0aGlzLnN0b3AoKSwic3RvcCIhPT10KXtmb3IodmFyIGkgaW4gdGhpcy5vcHRpb25zPXt9LHRoaXMuZWwucmVzaXplLmRlZmF1bHRzKXRoaXMub3B0aW9uc1tpXT10aGlzLmVsLnJlc2l6ZS5kZWZhdWx0c1tpXSx2b2lkIDAhPT10W2ldJiYodGhpcy5vcHRpb25zW2ldPXRbaV0pO3RoaXMuZWwub24oImx0LnJlc2l6ZSIsZnVuY3Rpb24odCl7ZS5yZXNpemUodHx8d2luZG93LmV2ZW50KX0pLHRoaXMuZWwub24oInJ0LnJlc2l6ZSIsZnVuY3Rpb24odCl7ZS5yZXNpemUodHx8d2luZG93LmV2ZW50KX0pLHRoaXMuZWwub24oInJiLnJlc2l6ZSIsZnVuY3Rpb24odCl7ZS5yZXNpemUodHx8d2luZG93LmV2ZW50KX0pLHRoaXMuZWwub24oImxiLnJlc2l6ZSIsZnVuY3Rpb24odCl7ZS5yZXNpemUodHx8d2luZG93LmV2ZW50KX0pLHRoaXMuZWwub24oInQucmVzaXplIixmdW5jdGlvbih0KXtlLnJlc2l6ZSh0fHx3aW5kb3cuZXZlbnQpfSksdGhpcy5lbC5vbigici5yZXNpemUiLGZ1bmN0aW9uKHQpe2UucmVzaXplKHR8fHdpbmRvdy5ldmVudCl9KSx0aGlzLmVsLm9uKCJiLnJlc2l6ZSIsZnVuY3Rpb24odCl7ZS5yZXNpemUodHx8d2luZG93LmV2ZW50KX0pLHRoaXMuZWwub24oImwucmVzaXplIixmdW5jdGlvbih0KXtlLnJlc2l6ZSh0fHx3aW5kb3cuZXZlbnQpfSksdGhpcy5lbC5vbigicm90LnJlc2l6ZSIsZnVuY3Rpb24odCl7ZS5yZXNpemUodHx8d2luZG93LmV2ZW50KX0pLHRoaXMuZWwub24oInBvaW50LnJlc2l6ZSIsZnVuY3Rpb24odCl7ZS5yZXNpemUodHx8d2luZG93LmV2ZW50KX0pLHRoaXMudXBkYXRlKCl9fSx0LnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWwub2ZmKCJsdC5yZXNpemUiKSx0aGlzLmVsLm9mZigicnQucmVzaXplIiksdGhpcy5lbC5vZmYoInJiLnJlc2l6ZSIpLHRoaXMuZWwub2ZmKCJsYi5yZXNpemUiKSx0aGlzLmVsLm9mZigidC5yZXNpemUiKSx0aGlzLmVsLm9mZigici5yZXNpemUiKSx0aGlzLmVsLm9mZigiYi5yZXNpemUiKSx0aGlzLmVsLm9mZigibC5yZXNpemUiKSx0aGlzLmVsLm9mZigicm90LnJlc2l6ZSIpLHRoaXMuZWwub2ZmKCJwb2ludC5yZXNpemUiKSx0aGlzfSx0LnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLm09dGhpcy5lbC5ub2RlLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSx0aGlzLm9mZnNldD17eDp3aW5kb3cucGFnZVhPZmZzZXQseTp3aW5kb3cucGFnZVlPZmZzZXR9O3ZhciBpPXRoaXMuX2V4dHJhY3RQb3NpdGlvbih0LmRldGFpbC5ldmVudCk7aWYodGhpcy5wYXJhbWV0ZXJzPXt0eXBlOnRoaXMuZWwudHlwZSxwOnRoaXMudHJhbnNmb3JtUG9pbnQoaS54LGkueSkseDp0LmRldGFpbC54LHk6dC5kZXRhaWwueSxib3g6dGhpcy5lbC5iYm94KCkscm90YXRpb246dGhpcy5lbC50cmFuc2Zvcm0oKS5yb3RhdGlvbn0sInRleHQiPT09dGhpcy5lbC50eXBlJiYodGhpcy5wYXJhbWV0ZXJzLmZvbnRTaXplPXRoaXMuZWwuYXR0cigpWyJmb250LXNpemUiXSksdm9pZCAwIT09dC5kZXRhaWwuaSl7dmFyIHM9dGhpcy5lbC5hcnJheSgpLnZhbHVlT2YoKTt0aGlzLnBhcmFtZXRlcnMuaT10LmRldGFpbC5pLHRoaXMucGFyYW1ldGVycy5wb2ludENvb3Jkcz1bc1t0LmRldGFpbC5pXVswXSxzW3QuZGV0YWlsLmldWzFdXX1zd2l0Y2godC50eXBlKXtjYXNlImx0Ijp0aGlzLmNhbGM9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnNuYXBUb0dyaWQodCxlKTtpZih0aGlzLnBhcmFtZXRlcnMuYm94LndpZHRoLWlbMF0+MCYmdGhpcy5wYXJhbWV0ZXJzLmJveC5oZWlnaHQtaVsxXT4wKXtpZigidGV4dCI9PT10aGlzLnBhcmFtZXRlcnMudHlwZSlyZXR1cm4gdGhpcy5lbC5tb3ZlKHRoaXMucGFyYW1ldGVycy5ib3gueCtpWzBdLHRoaXMucGFyYW1ldGVycy5ib3gueSksdm9pZCB0aGlzLmVsLmF0dHIoImZvbnQtc2l6ZSIsdGhpcy5wYXJhbWV0ZXJzLmZvbnRTaXplLWlbMF0pO2k9dGhpcy5jaGVja0FzcGVjdFJhdGlvKGkpLHRoaXMuZWwubW92ZSh0aGlzLnBhcmFtZXRlcnMuYm94LngraVswXSx0aGlzLnBhcmFtZXRlcnMuYm94LnkraVsxXSkuc2l6ZSh0aGlzLnBhcmFtZXRlcnMuYm94LndpZHRoLWlbMF0sdGhpcy5wYXJhbWV0ZXJzLmJveC5oZWlnaHQtaVsxXSl9fTticmVhaztjYXNlInJ0Ijp0aGlzLmNhbGM9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnNuYXBUb0dyaWQodCxlLDIpO2lmKHRoaXMucGFyYW1ldGVycy5ib3gud2lkdGgraVswXT4wJiZ0aGlzLnBhcmFtZXRlcnMuYm94LmhlaWdodC1pWzFdPjApe2lmKCJ0ZXh0Ij09PXRoaXMucGFyYW1ldGVycy50eXBlKXJldHVybiB0aGlzLmVsLm1vdmUodGhpcy5wYXJhbWV0ZXJzLmJveC54LWlbMF0sdGhpcy5wYXJhbWV0ZXJzLmJveC55KSx2b2lkIHRoaXMuZWwuYXR0cigiZm9udC1zaXplIix0aGlzLnBhcmFtZXRlcnMuZm9udFNpemUraVswXSk7aT10aGlzLmNoZWNrQXNwZWN0UmF0aW8oaSwhMCksdGhpcy5lbC5tb3ZlKHRoaXMucGFyYW1ldGVycy5ib3gueCx0aGlzLnBhcmFtZXRlcnMuYm94LnkraVsxXSkuc2l6ZSh0aGlzLnBhcmFtZXRlcnMuYm94LndpZHRoK2lbMF0sdGhpcy5wYXJhbWV0ZXJzLmJveC5oZWlnaHQtaVsxXSl9fTticmVhaztjYXNlInJiIjp0aGlzLmNhbGM9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnNuYXBUb0dyaWQodCxlLDApO2lmKHRoaXMucGFyYW1ldGVycy5ib3gud2lkdGgraVswXT4wJiZ0aGlzLnBhcmFtZXRlcnMuYm94LmhlaWdodCtpWzFdPjApe2lmKCJ0ZXh0Ij09PXRoaXMucGFyYW1ldGVycy50eXBlKXJldHVybiB0aGlzLmVsLm1vdmUodGhpcy5wYXJhbWV0ZXJzLmJveC54LWlbMF0sdGhpcy5wYXJhbWV0ZXJzLmJveC55KSx2b2lkIHRoaXMuZWwuYXR0cigiZm9udC1zaXplIix0aGlzLnBhcmFtZXRlcnMuZm9udFNpemUraVswXSk7aT10aGlzLmNoZWNrQXNwZWN0UmF0aW8oaSksdGhpcy5lbC5tb3ZlKHRoaXMucGFyYW1ldGVycy5ib3gueCx0aGlzLnBhcmFtZXRlcnMuYm94LnkpLnNpemUodGhpcy5wYXJhbWV0ZXJzLmJveC53aWR0aCtpWzBdLHRoaXMucGFyYW1ldGVycy5ib3guaGVpZ2h0K2lbMV0pfX07YnJlYWs7Y2FzZSJsYiI6dGhpcy5jYWxjPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5zbmFwVG9HcmlkKHQsZSwxKTtpZih0aGlzLnBhcmFtZXRlcnMuYm94LndpZHRoLWlbMF0+MCYmdGhpcy5wYXJhbWV0ZXJzLmJveC5oZWlnaHQraVsxXT4wKXtpZigidGV4dCI9PT10aGlzLnBhcmFtZXRlcnMudHlwZSlyZXR1cm4gdGhpcy5lbC5tb3ZlKHRoaXMucGFyYW1ldGVycy5ib3gueCtpWzBdLHRoaXMucGFyYW1ldGVycy5ib3gueSksdm9pZCB0aGlzLmVsLmF0dHIoImZvbnQtc2l6ZSIsdGhpcy5wYXJhbWV0ZXJzLmZvbnRTaXplLWlbMF0pO2k9dGhpcy5jaGVja0FzcGVjdFJhdGlvKGksITApLHRoaXMuZWwubW92ZSh0aGlzLnBhcmFtZXRlcnMuYm94LngraVswXSx0aGlzLnBhcmFtZXRlcnMuYm94LnkpLnNpemUodGhpcy5wYXJhbWV0ZXJzLmJveC53aWR0aC1pWzBdLHRoaXMucGFyYW1ldGVycy5ib3guaGVpZ2h0K2lbMV0pfX07YnJlYWs7Y2FzZSJ0Ijp0aGlzLmNhbGM9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnNuYXBUb0dyaWQodCxlLDIpO2lmKHRoaXMucGFyYW1ldGVycy5ib3guaGVpZ2h0LWlbMV0+MCl7aWYoInRleHQiPT09dGhpcy5wYXJhbWV0ZXJzLnR5cGUpcmV0dXJuO3RoaXMuZWwubW92ZSh0aGlzLnBhcmFtZXRlcnMuYm94LngsdGhpcy5wYXJhbWV0ZXJzLmJveC55K2lbMV0pLmhlaWdodCh0aGlzLnBhcmFtZXRlcnMuYm94LmhlaWdodC1pWzFdKX19O2JyZWFrO2Nhc2UiciI6dGhpcy5jYWxjPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5zbmFwVG9HcmlkKHQsZSwwKTtpZih0aGlzLnBhcmFtZXRlcnMuYm94LndpZHRoK2lbMF0+MCl7aWYoInRleHQiPT09dGhpcy5wYXJhbWV0ZXJzLnR5cGUpcmV0dXJuO3RoaXMuZWwubW92ZSh0aGlzLnBhcmFtZXRlcnMuYm94LngsdGhpcy5wYXJhbWV0ZXJzLmJveC55KS53aWR0aCh0aGlzLnBhcmFtZXRlcnMuYm94LndpZHRoK2lbMF0pfX07YnJlYWs7Y2FzZSJiIjp0aGlzLmNhbGM9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnNuYXBUb0dyaWQodCxlLDApO2lmKHRoaXMucGFyYW1ldGVycy5ib3guaGVpZ2h0K2lbMV0+MCl7aWYoInRleHQiPT09dGhpcy5wYXJhbWV0ZXJzLnR5cGUpcmV0dXJuO3RoaXMuZWwubW92ZSh0aGlzLnBhcmFtZXRlcnMuYm94LngsdGhpcy5wYXJhbWV0ZXJzLmJveC55KS5oZWlnaHQodGhpcy5wYXJhbWV0ZXJzLmJveC5oZWlnaHQraVsxXSl9fTticmVhaztjYXNlImwiOnRoaXMuY2FsYz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuc25hcFRvR3JpZCh0LGUsMSk7aWYodGhpcy5wYXJhbWV0ZXJzLmJveC53aWR0aC1pWzBdPjApe2lmKCJ0ZXh0Ij09PXRoaXMucGFyYW1ldGVycy50eXBlKXJldHVybjt0aGlzLmVsLm1vdmUodGhpcy5wYXJhbWV0ZXJzLmJveC54K2lbMF0sdGhpcy5wYXJhbWV0ZXJzLmJveC55KS53aWR0aCh0aGlzLnBhcmFtZXRlcnMuYm94LndpZHRoLWlbMF0pfX07YnJlYWs7Y2FzZSJyb3QiOnRoaXMuY2FsYz1mdW5jdGlvbih0LGUpe3ZhciBpPXQrdGhpcy5wYXJhbWV0ZXJzLnAueCxzPWUrdGhpcy5wYXJhbWV0ZXJzLnAueSxhPU1hdGguYXRhbjIodGhpcy5wYXJhbWV0ZXJzLnAueS10aGlzLnBhcmFtZXRlcnMuYm94LnktdGhpcy5wYXJhbWV0ZXJzLmJveC5oZWlnaHQvMix0aGlzLnBhcmFtZXRlcnMucC54LXRoaXMucGFyYW1ldGVycy5ib3gueC10aGlzLnBhcmFtZXRlcnMuYm94LndpZHRoLzIpLG49TWF0aC5hdGFuMihzLXRoaXMucGFyYW1ldGVycy5ib3gueS10aGlzLnBhcmFtZXRlcnMuYm94LmhlaWdodC8yLGktdGhpcy5wYXJhbWV0ZXJzLmJveC54LXRoaXMucGFyYW1ldGVycy5ib3gud2lkdGgvMikscj10aGlzLnBhcmFtZXRlcnMucm90YXRpb24rMTgwKihuLWEpL01hdGguUEkrdGhpcy5vcHRpb25zLnNuYXBUb0FuZ2xlLzI7dGhpcy5lbC5jZW50ZXIodGhpcy5wYXJhbWV0ZXJzLmJveC5jeCx0aGlzLnBhcmFtZXRlcnMuYm94LmN5KS5yb3RhdGUoci1yJXRoaXMub3B0aW9ucy5zbmFwVG9BbmdsZSx0aGlzLnBhcmFtZXRlcnMuYm94LmN4LHRoaXMucGFyYW1ldGVycy5ib3guY3kpfTticmVhaztjYXNlInBvaW50Ijp0aGlzLmNhbGM9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnNuYXBUb0dyaWQodCxlLHRoaXMucGFyYW1ldGVycy5wb2ludENvb3Jkc1swXSx0aGlzLnBhcmFtZXRlcnMucG9pbnRDb29yZHNbMV0pLHM9dGhpcy5lbC5hcnJheSgpLnZhbHVlT2YoKTtzW3RoaXMucGFyYW1ldGVycy5pXVswXT10aGlzLnBhcmFtZXRlcnMucG9pbnRDb29yZHNbMF0raVswXSxzW3RoaXMucGFyYW1ldGVycy5pXVsxXT10aGlzLnBhcmFtZXRlcnMucG9pbnRDb29yZHNbMV0raVsxXSx0aGlzLmVsLnBsb3Qocyl9fXRoaXMuZWwuZmlyZSgicmVzaXplc3RhcnQiLHtkeDp0aGlzLnBhcmFtZXRlcnMueCxkeTp0aGlzLnBhcmFtZXRlcnMueSxldmVudDp0fSksU1ZHLm9uKHdpbmRvdywidG91Y2htb3ZlLnJlc2l6ZSIsZnVuY3Rpb24odCl7ZS51cGRhdGUodHx8d2luZG93LmV2ZW50KX0pLFNWRy5vbih3aW5kb3csInRvdWNoZW5kLnJlc2l6ZSIsZnVuY3Rpb24oKXtlLmRvbmUoKX0pLFNWRy5vbih3aW5kb3csIm1vdXNlbW92ZS5yZXNpemUiLGZ1bmN0aW9uKHQpe2UudXBkYXRlKHR8fHdpbmRvdy5ldmVudCl9KSxTVkcub24od2luZG93LCJtb3VzZXVwLnJlc2l6ZSIsZnVuY3Rpb24oKXtlLmRvbmUoKX0pfSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9dGhpcy5fZXh0cmFjdFBvc2l0aW9uKHQpLGk9dGhpcy50cmFuc2Zvcm1Qb2ludChlLngsZS55KSxzPWkueC10aGlzLnBhcmFtZXRlcnMucC54LGE9aS55LXRoaXMucGFyYW1ldGVycy5wLnk7dGhpcy5sYXN0VXBkYXRlQ2FsbD1bcyxhXSx0aGlzLmNhbGMocyxhKSx0aGlzLmVsLmZpcmUoInJlc2l6aW5nIix7ZHg6cyxkeTphLGV2ZW50OnR9KX1lbHNlIHRoaXMubGFzdFVwZGF0ZUNhbGwmJnRoaXMuY2FsYyh0aGlzLmxhc3RVcGRhdGVDYWxsWzBdLHRoaXMubGFzdFVwZGF0ZUNhbGxbMV0pfSx0LnByb3RvdHlwZS5kb25lPWZ1bmN0aW9uKCl7dGhpcy5sYXN0VXBkYXRlQ2FsbD1udWxsLFNWRy5vZmYod2luZG93LCJtb3VzZW1vdmUucmVzaXplIiksU1ZHLm9mZih3aW5kb3csIm1vdXNldXAucmVzaXplIiksU1ZHLm9mZih3aW5kb3csInRvdWNobW92ZS5yZXNpemUiKSxTVkcub2ZmKHdpbmRvdywidG91Y2hlbmQucmVzaXplIiksdGhpcy5lbC5maXJlKCJyZXNpemVkb25lIil9LHQucHJvdG90eXBlLnNuYXBUb0dyaWQ9ZnVuY3Rpb24odCxlLGkscyl7dmFyIGE7cmV0dXJuIHZvaWQgMCE9PXM/YT1bKGkrdCkldGhpcy5vcHRpb25zLnNuYXBUb0dyaWQsKHMrZSkldGhpcy5vcHRpb25zLnNuYXBUb0dyaWRdOihpPW51bGw9PWk/MzppLGE9Wyh0aGlzLnBhcmFtZXRlcnMuYm94LngrdCsoMSZpPzA6dGhpcy5wYXJhbWV0ZXJzLmJveC53aWR0aCkpJXRoaXMub3B0aW9ucy5zbmFwVG9HcmlkLCh0aGlzLnBhcmFtZXRlcnMuYm94LnkrZSsoMiZpPzA6dGhpcy5wYXJhbWV0ZXJzLmJveC5oZWlnaHQpKSV0aGlzLm9wdGlvbnMuc25hcFRvR3JpZF0pLHQ8MCYmKGFbMF0tPXRoaXMub3B0aW9ucy5zbmFwVG9HcmlkKSxlPDAmJihhWzFdLT10aGlzLm9wdGlvbnMuc25hcFRvR3JpZCksdC09TWF0aC5hYnMoYVswXSk8dGhpcy5vcHRpb25zLnNuYXBUb0dyaWQvMj9hWzBdOmFbMF0tKHQ8MD8tdGhpcy5vcHRpb25zLnNuYXBUb0dyaWQ6dGhpcy5vcHRpb25zLnNuYXBUb0dyaWQpLGUtPU1hdGguYWJzKGFbMV0pPHRoaXMub3B0aW9ucy5zbmFwVG9HcmlkLzI/YVsxXTphWzFdLShlPDA/LXRoaXMub3B0aW9ucy5zbmFwVG9HcmlkOnRoaXMub3B0aW9ucy5zbmFwVG9HcmlkKSx0aGlzLmNvbnN0cmFpbnRUb0JveCh0LGUsaSxzKX0sdC5wcm90b3R5cGUuY29uc3RyYWludFRvQm94PWZ1bmN0aW9uKHQsZSxpLHMpe3ZhciBhLG4scj10aGlzLm9wdGlvbnMuY29uc3RyYWludHx8e307cmV0dXJuIHZvaWQgMCE9PXM/KGE9aSxuPXMpOihhPXRoaXMucGFyYW1ldGVycy5ib3gueCsoMSZpPzA6dGhpcy5wYXJhbWV0ZXJzLmJveC53aWR0aCksbj10aGlzLnBhcmFtZXRlcnMuYm94LnkrKDImaT8wOnRoaXMucGFyYW1ldGVycy5ib3guaGVpZ2h0KSksdm9pZCAwIT09ci5taW5YJiZhK3Q8ci5taW5YJiYodD1yLm1pblgtYSksdm9pZCAwIT09ci5tYXhYJiZhK3Q+ci5tYXhYJiYodD1yLm1heFgtYSksdm9pZCAwIT09ci5taW5ZJiZuK2U8ci5taW5ZJiYoZT1yLm1pblktbiksdm9pZCAwIT09ci5tYXhZJiZuK2U+ci5tYXhZJiYoZT1yLm1heFktbiksW3QsZV19LHQucHJvdG90eXBlLmNoZWNrQXNwZWN0UmF0aW89ZnVuY3Rpb24odCxlKXtpZighdGhpcy5vcHRpb25zLnNhdmVBc3BlY3RSYXRpbylyZXR1cm4gdDt2YXIgaT10LnNsaWNlKCkscz10aGlzLnBhcmFtZXRlcnMuYm94LndpZHRoL3RoaXMucGFyYW1ldGVycy5ib3guaGVpZ2h0LGE9dGhpcy5wYXJhbWV0ZXJzLmJveC53aWR0aCt0WzBdLG49dGhpcy5wYXJhbWV0ZXJzLmJveC5oZWlnaHQtdFsxXSxyPWEvbjtyZXR1cm4gcjxzPyhpWzFdPWEvcy10aGlzLnBhcmFtZXRlcnMuYm94LmhlaWdodCxlJiYoaVsxXT0taVsxXSkpOnI+cyYmKGlbMF09dGhpcy5wYXJhbWV0ZXJzLmJveC53aWR0aC1uKnMsZSYmKGlbMF09LWlbMF0pKSxpfSxTVkcuZXh0ZW5kKFNWRy5FbGVtZW50LHtyZXNpemU6ZnVuY3Rpb24oZSl7cmV0dXJuKHRoaXMucmVtZW1iZXIoIl9yZXNpemVIYW5kbGVyIil8fG5ldyB0KHRoaXMpKS5pbml0KGV8fHt9KSx0aGlzfX0pLFNWRy5FbGVtZW50LnByb3RvdHlwZS5yZXNpemUuZGVmYXVsdHM9e3NuYXBUb0FuZ2xlOi4xLHNuYXBUb0dyaWQ6MSxjb25zdHJhaW50Ont9LHNhdmVBc3BlY3RSYXRpbzohMX19KS5jYWxsKHRoaXMpfSgpO3JldHVybiBmdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPXt9KTt2YXIgaT1lLmluc2VydEF0O2lmKHQmJiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBzPWRvY3VtZW50LmhlYWR8fGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0sYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2EudHlwZT0idGV4dC9jc3MiLCJ0b3AiPT09aSYmcy5maXJzdENoaWxkP3MuaW5zZXJ0QmVmb3JlKGEscy5maXJzdENoaWxkKTpzLmFwcGVuZENoaWxkKGEpLGEuc3R5bGVTaGVldD9hLnN0eWxlU2hlZXQuY3NzVGV4dD10OmEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodCkpfX0oJy5hcGV4Y2hhcnRzLWNhbnZhcyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC8qIGNhbm5vdCBnaXZlIG92ZXJmbG93OiBoaWRkZW4gYXMgaXQgd2lsbCBjcm9wIHRvb2x0aXBzIHdoaWNoIG92ZXJmbG93IG91dHNpZGUgY2hhcnQgYXJlYSAqL1xufVxuXG4vKiBzY3JvbGxiYXIgaXMgbm90IHZpc2libGUgYnkgZGVmYXVsdCBmb3IgbGVnZW5kLCBoZW5jZSBmb3JjaW5nIHRoZSB2aXNpYmlsaXR5ICovXG4uYXBleGNoYXJ0cy1jYW52YXMgOjotd2Via2l0LXNjcm9sbGJhciB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgd2lkdGg6IDZweDtcbn1cbi5hcGV4Y2hhcnRzLWNhbnZhcyA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMCwwLC41KTtcbiAgYm94LXNoYWRvdzogMCAwIDFweCByZ2JhKDI1NSwyNTUsMjU1LC41KTtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpO1xufVxuLmFwZXhjaGFydHMtY2FudmFzLmRhcmsge1xuICBiYWNrZ3JvdW5kOiAjMzQzRjU3O1xufVxuXG4uYXBleGNoYXJ0cy1pbm5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmxlZ2VuZC1tb3VzZW92ZXItaW5hY3RpdmUge1xuICB0cmFuc2l0aW9uOiAwLjE1cyBlYXNlIGFsbDtcbiAgb3BhY2l0eTogMC4yMDtcbn1cblxuLmFwZXhjaGFydHMtc2VyaWVzLWNvbGxhcHNlZCB7XG4gIG9wYWNpdHk6IDA7XG59XG5cbi5hcGV4Y2hhcnRzLWdyaWRsaW5lLCAuYXBleGNoYXJ0cy10ZXh0IHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5hcGV4Y2hhcnRzLXRvb2x0aXAge1xuICBib3JkZXItcmFkaXVzOiA1cHg7XG4gIGJveC1zaGFkb3c6IDJweCAycHggNnB4IC00cHggIzk5OTtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxlZnQ6IDYycHg7XG4gIG9wYWNpdHk6IDA7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMjBweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgei1pbmRleDogMTI7XG4gIHRyYW5zaXRpb246IDAuMTVzIGVhc2UgYWxsO1xufVxuLmFwZXhjaGFydHMtdG9vbHRpcC5saWdodCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNlM2UzZTM7XG4gIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45Nik7XG59XG4uYXBleGNoYXJ0cy10b29sdGlwLmRhcmsge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZDogcmdiYSgzMCwzMCwzMCwgMC44KTtcbn1cbi5hcGV4Y2hhcnRzLXRvb2x0aXAgKiB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xufVxuXG4uYXBleGNoYXJ0cy10b29sdGlwIC5hcGV4Y2hhcnRzLW1hcmtlcixcbi5hcGV4Y2hhcnRzLWFyZWEtc2VyaWVzIC5hcGV4Y2hhcnRzLWFyZWEsXG4uYXBleGNoYXJ0cy1saW5lIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5hcGV4Y2hhcnRzLXRvb2x0aXAuYWN0aXZlIHtcbiAgb3BhY2l0eTogMTtcbiAgdHJhbnNpdGlvbjogMC4xNXMgZWFzZSBhbGw7XG59XG5cbi5hcGV4Y2hhcnRzLXRvb2x0aXAtdGl0bGUge1xuICBwYWRkaW5nOiA2cHg7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgbWFyZ2luLWJvdHRvbTogNHB4O1xufVxuLmFwZXhjaGFydHMtdG9vbHRpcC5saWdodCAuYXBleGNoYXJ0cy10b29sdGlwLXRpdGxlIHtcbiAgYmFja2dyb3VuZDogI0VDRUZGMTtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG59XG4uYXBleGNoYXJ0cy10b29sdGlwLmRhcmsgLmFwZXhjaGFydHMtdG9vbHRpcC10aXRsZSB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC43KTtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICMzMzM7XG59XG5cbi5hcGV4Y2hhcnRzLXRvb2x0aXAtdGV4dC12YWx1ZSxcbi5hcGV4Y2hhcnRzLXRvb2x0aXAtdGV4dC16LXZhbHVlIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LXdlaWdodDogNjAwO1xuICBtYXJnaW4tbGVmdDogNXB4O1xufVxuXG4uYXBleGNoYXJ0cy10b29sdGlwLXRleHQtei1sYWJlbDplbXB0eSxcbi5hcGV4Y2hhcnRzLXRvb2x0aXAtdGV4dC16LXZhbHVlOmVtcHR5IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLmFwZXhjaGFydHMtdG9vbHRpcC10ZXh0LXZhbHVlLFxuLmFwZXhjaGFydHMtdG9vbHRpcC10ZXh0LXotdmFsdWUge1xuICBmb250LXdlaWdodDogNjAwO1xufVxuXG4uYXBleGNoYXJ0cy10b29sdGlwLW1hcmtlciB7XG4gIHdpZHRoOiAxMnB4O1xuICBoZWlnaHQ6IDEycHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAwcHg7XG4gIG1hcmdpbi1yaWdodDogMTBweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xufVxuXG4uYXBleGNoYXJ0cy10b29sdGlwLXNlcmllcy1ncm91cCB7XG4gIHBhZGRpbmc6IDAgMTBweDtcbiAgZGlzcGxheTogbm9uZTtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAganVzdGlmeS1jb250ZW50OiBsZWZ0O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uYXBleGNoYXJ0cy10b29sdGlwLXNlcmllcy1ncm91cC5hY3RpdmUgLmFwZXhjaGFydHMtdG9vbHRpcC1tYXJrZXIge1xuICBvcGFjaXR5OiAxO1xufVxuLmFwZXhjaGFydHMtdG9vbHRpcC1zZXJpZXMtZ3JvdXAuYWN0aXZlLCAuYXBleGNoYXJ0cy10b29sdGlwLXNlcmllcy1ncm91cDpsYXN0LWNoaWxkIHtcbiAgcGFkZGluZy1ib3R0b206IDRweDtcbn1cbi5hcGV4Y2hhcnRzLXRvb2x0aXAtc2VyaWVzLWdyb3VwLWhpZGRlbiB7XG4gIG9wYWNpdHk6IDA7XG4gIGhlaWdodDogMDtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbn1cbi5hcGV4Y2hhcnRzLXRvb2x0aXAteS1ncm91cCB7XG4gIHBhZGRpbmc6IDZweCAwIDVweDtcbn1cbi5hcGV4Y2hhcnRzLXRvb2x0aXAtY2FuZGxlc3RpY2sge1xuICBwYWRkaW5nOiA0cHggOHB4O1xufVxuLmFwZXhjaGFydHMtdG9vbHRpcC1jYW5kbGVzdGljayA+IGRpdiB7XG4gIG1hcmdpbjogNHB4IDA7XG59XG4uYXBleGNoYXJ0cy10b29sdGlwLWNhbmRsZXN0aWNrIHNwYW4udmFsdWUge1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmFwZXhjaGFydHMtdG9vbHRpcC1yYW5nZWJhciB7XG4gIHBhZGRpbmc6IDVweCA4cHg7XG59XG5cbi5hcGV4Y2hhcnRzLXRvb2x0aXAtcmFuZ2ViYXIgLmNhdGVnb3J5IHtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgY29sb3I6ICM3Nzc7XG59XG5cbi5hcGV4Y2hhcnRzLXRvb2x0aXAtcmFuZ2ViYXIgLnNlcmllcy1uYW1lIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tYm90dG9tOiA1cHg7XG59XG5cbi5hcGV4Y2hhcnRzLXhheGlzdG9vbHRpcCB7XG4gIG9wYWNpdHk6IDA7XG4gIHBhZGRpbmc6IDlweCAxMHB4O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgY29sb3I6ICMzNzNkM2Y7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMTA7XG4gIGJhY2tncm91bmQ6ICNFQ0VGRjE7XG4gIGJvcmRlcjogMXB4IHNvbGlkICM5MEE0QUU7XG4gIHRyYW5zaXRpb246IDAuMTVzIGVhc2UgYWxsO1xufVxuXG4uYXBleGNoYXJ0cy14YXhpc3Rvb2x0aXAuZGFyayB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC43KTtcbiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjUpO1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLmFwZXhjaGFydHMteGF4aXN0b29sdGlwOmFmdGVyLCAuYXBleGNoYXJ0cy14YXhpc3Rvb2x0aXA6YmVmb3JlIHtcbiAgbGVmdDogNTAlO1xuICBib3JkZXI6IHNvbGlkIHRyYW5zcGFyZW50O1xuICBjb250ZW50OiAiICI7XG4gIGhlaWdodDogMDtcbiAgd2lkdGg6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5hcGV4Y2hhcnRzLXhheGlzdG9vbHRpcDphZnRlciB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgyMzYsIDIzOSwgMjQxLCAwKTtcbiAgYm9yZGVyLXdpZHRoOiA2cHg7XG4gIG1hcmdpbi1sZWZ0OiAtNnB4O1xufVxuLmFwZXhjaGFydHMteGF4aXN0b29sdGlwOmJlZm9yZSB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgxNDQsIDE2NCwgMTc0LCAwKTtcbiAgYm9yZGVyLXdpZHRoOiA3cHg7XG4gIG1hcmdpbi1sZWZ0OiAtN3B4O1xufVxuXG4uYXBleGNoYXJ0cy14YXhpc3Rvb2x0aXAtYm90dG9tOmFmdGVyLCAuYXBleGNoYXJ0cy14YXhpc3Rvb2x0aXAtYm90dG9tOmJlZm9yZSB7XG4gIGJvdHRvbTogMTAwJTtcbn1cblxuLmFwZXhjaGFydHMteGF4aXN0b29sdGlwLXRvcDphZnRlciwgLmFwZXhjaGFydHMteGF4aXN0b29sdGlwLXRvcDpiZWZvcmUge1xuICB0b3A6IDEwMCU7XG59XG5cbi5hcGV4Y2hhcnRzLXhheGlzdG9vbHRpcC1ib3R0b206YWZ0ZXIge1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjRUNFRkYxO1xufVxuLmFwZXhjaGFydHMteGF4aXN0b29sdGlwLWJvdHRvbTpiZWZvcmUge1xuICBib3JkZXItYm90dG9tLWNvbG9yOiAjOTBBNEFFO1xufVxuXG4uYXBleGNoYXJ0cy14YXhpc3Rvb2x0aXAtYm90dG9tLmRhcms6YWZ0ZXIge1xuICBib3JkZXItYm90dG9tLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG59XG4uYXBleGNoYXJ0cy14YXhpc3Rvb2x0aXAtYm90dG9tLmRhcms6YmVmb3JlIHtcbiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xufVxuXG4uYXBleGNoYXJ0cy14YXhpc3Rvb2x0aXAtdG9wOmFmdGVyIHtcbiAgYm9yZGVyLXRvcC1jb2xvcjojRUNFRkYxXG59XG4uYXBleGNoYXJ0cy14YXhpc3Rvb2x0aXAtdG9wOmJlZm9yZSB7XG4gIGJvcmRlci10b3AtY29sb3I6ICM5MEE0QUU7XG59XG4uYXBleGNoYXJ0cy14YXhpc3Rvb2x0aXAtdG9wLmRhcms6YWZ0ZXIge1xuICBib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwgMCwgMCwgMC41KTtcbn1cbi5hcGV4Y2hhcnRzLXhheGlzdG9vbHRpcC10b3AuZGFyazpiZWZvcmUge1xuICBib3JkZXItdG9wLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG59XG5cblxuLmFwZXhjaGFydHMteGF4aXN0b29sdGlwLmFjdGl2ZSB7XG4gIG9wYWNpdHk6IDE7XG4gIHRyYW5zaXRpb246IDAuMTVzIGVhc2UgYWxsO1xufVxuXG4uYXBleGNoYXJ0cy15YXhpc3Rvb2x0aXAge1xuICBvcGFjaXR5OiAwO1xuICBwYWRkaW5nOiA0cHggMTBweDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIGNvbG9yOiAjMzczZDNmO1xuICBmb250LXNpemU6IDEzcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDEwO1xuICBiYWNrZ3JvdW5kOiAjRUNFRkYxO1xuICBib3JkZXI6IDFweCBzb2xpZCAjOTBBNEFFO1xufVxuXG4uYXBleGNoYXJ0cy15YXhpc3Rvb2x0aXAuZGFyayB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC43KTtcbiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjUpO1xuICBjb2xvcjogI2ZmZjtcbn1cblxuLmFwZXhjaGFydHMteWF4aXN0b29sdGlwOmFmdGVyLCAuYXBleGNoYXJ0cy15YXhpc3Rvb2x0aXA6YmVmb3JlIHtcbiAgdG9wOiA1MCU7XG4gIGJvcmRlcjogc29saWQgdHJhbnNwYXJlbnQ7XG4gIGNvbnRlbnQ6ICIgIjtcbiAgaGVpZ2h0OiAwO1xuICB3aWR0aDogMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi5hcGV4Y2hhcnRzLXlheGlzdG9vbHRpcDphZnRlciB7XG4gIGJvcmRlci1jb2xvcjogcmdiYSgyMzYsIDIzOSwgMjQxLCAwKTtcbiAgYm9yZGVyLXdpZHRoOiA2cHg7XG4gIG1hcmdpbi10b3A6IC02cHg7XG59XG4uYXBleGNoYXJ0cy15YXhpc3Rvb2x0aXA6YmVmb3JlIHtcbiAgYm9yZGVyLWNvbG9yOiByZ2JhKDE0NCwgMTY0LCAxNzQsIDApO1xuICBib3JkZXItd2lkdGg6IDdweDtcbiAgbWFyZ2luLXRvcDogLTdweDtcbn1cblxuLmFwZXhjaGFydHMteWF4aXN0b29sdGlwLWxlZnQ6YWZ0ZXIsIC5hcGV4Y2hhcnRzLXlheGlzdG9vbHRpcC1sZWZ0OmJlZm9yZSB7XG4gIGxlZnQ6IDEwMCU7XG59XG5cbi5hcGV4Y2hhcnRzLXlheGlzdG9vbHRpcC1yaWdodDphZnRlciwgLmFwZXhjaGFydHMteWF4aXN0b29sdGlwLXJpZ2h0OmJlZm9yZSB7XG4gIHJpZ2h0OiAxMDAlO1xufVxuXG4uYXBleGNoYXJ0cy15YXhpc3Rvb2x0aXAtbGVmdDphZnRlciB7XG4gIGJvcmRlci1sZWZ0LWNvbG9yOiAjRUNFRkYxO1xufVxuLmFwZXhjaGFydHMteWF4aXN0b29sdGlwLWxlZnQ6YmVmb3JlIHtcbiAgYm9yZGVyLWxlZnQtY29sb3I6ICM5MEE0QUU7XG59XG4uYXBleGNoYXJ0cy15YXhpc3Rvb2x0aXAtbGVmdC5kYXJrOmFmdGVyIHtcbiAgYm9yZGVyLWxlZnQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbn1cbi5hcGV4Y2hhcnRzLXlheGlzdG9vbHRpcC1sZWZ0LmRhcms6YmVmb3JlIHtcbiAgYm9yZGVyLWxlZnQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbn1cblxuLmFwZXhjaGFydHMteWF4aXN0b29sdGlwLXJpZ2h0OmFmdGVyIHtcbiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjRUNFRkYxO1xufVxuLmFwZXhjaGFydHMteWF4aXN0b29sdGlwLXJpZ2h0OmJlZm9yZSB7XG4gIGJvcmRlci1yaWdodC1jb2xvcjogIzkwQTRBRTtcbn1cbi5hcGV4Y2hhcnRzLXlheGlzdG9vbHRpcC1yaWdodC5kYXJrOmFmdGVyIHtcbiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG59XG4uYXBleGNoYXJ0cy15YXhpc3Rvb2x0aXAtcmlnaHQuZGFyazpiZWZvcmUge1xuICBib3JkZXItcmlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbn1cblxuLmFwZXhjaGFydHMteWF4aXN0b29sdGlwLmFjdGl2ZSB7XG4gIG9wYWNpdHk6IDE7XG59XG4uYXBleGNoYXJ0cy15YXhpc3Rvb2x0aXAtaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLmFwZXhjaGFydHMteGNyb3NzaGFpcnMsIC5hcGV4Y2hhcnRzLXljcm9zc2hhaXJzIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zaXRpb246IDAuMTVzIGVhc2UgYWxsO1xufVxuXG4uYXBleGNoYXJ0cy14Y3Jvc3NoYWlycy5hY3RpdmUsIC5hcGV4Y2hhcnRzLXljcm9zc2hhaXJzLmFjdGl2ZSB7XG4gIG9wYWNpdHk6IDE7XG4gIHRyYW5zaXRpb246IDAuMTVzIGVhc2UgYWxsO1xufVxuXG4uYXBleGNoYXJ0cy15Y3Jvc3NoYWlycy1oaWRkZW4ge1xuICBvcGFjaXR5OiAwO1xufVxuXG4uYXBleGNoYXJ0cy16b29tLXJlY3Qge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cbi5hcGV4Y2hhcnRzLXNlbGVjdGlvbi1yZWN0IHtcbiAgY3Vyc29yOiBtb3ZlO1xufVxuXG4uc3ZnX3NlbGVjdF9wb2ludHMsIC5zdmdfc2VsZWN0X3BvaW50c19yb3Qge1xuICBvcGFjaXR5OiAwO1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG4uc3ZnX3NlbGVjdF9wb2ludHNfbCwgLnN2Z19zZWxlY3RfcG9pbnRzX3Ige1xuICBjdXJzb3I6IGV3LXJlc2l6ZTtcbiAgb3BhY2l0eTogMTtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgZmlsbDogIzg4ODtcbn1cbi5hcGV4Y2hhcnRzLWNhbnZhcy56b29tYWJsZSAuaG92ZXJpbmctem9vbSB7XG4gIGN1cnNvcjogY3Jvc3NoYWlyXG59XG4uYXBleGNoYXJ0cy1jYW52YXMuem9vbWFibGUgLmhvdmVyaW5nLXBhbiB7XG4gIGN1cnNvcjogbW92ZVxufVxuXG4uYXBleGNoYXJ0cy14YXhpcyxcbi5hcGV4Y2hhcnRzLXlheGlzIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5hcGV4Y2hhcnRzLXpvb20taWNvbixcbi5hcGV4Y2hhcnRzLXpvb20taW4taWNvbixcbi5hcGV4Y2hhcnRzLXpvb20tb3V0LWljb24sXG4uYXBleGNoYXJ0cy1yZXNldC16b29tLWljb24sXG4uYXBleGNoYXJ0cy1wYW4taWNvbixcbi5hcGV4Y2hhcnRzLXNlbGVjdGlvbi1pY29uLFxuLmFwZXhjaGFydHMtbWVudS1pY29uLFxuLmFwZXhjaGFydHMtdG9vbGJhci1jdXN0b20taWNvbiB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDI0cHg7XG4gIGNvbG9yOiAjNkU4MTkyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cblxuLmFwZXhjaGFydHMtem9vbS1pY29uIHN2Zyxcbi5hcGV4Y2hhcnRzLXpvb20taW4taWNvbiBzdmcsXG4uYXBleGNoYXJ0cy16b29tLW91dC1pY29uIHN2Zyxcbi5hcGV4Y2hhcnRzLXJlc2V0LXpvb20taWNvbiBzdmcsXG4uYXBleGNoYXJ0cy1tZW51LWljb24gc3ZnIHtcbiAgZmlsbDogIzZFODE5Mjtcbn1cbi5hcGV4Y2hhcnRzLXNlbGVjdGlvbi1pY29uIHN2ZyB7XG4gIGZpbGw6ICM0NDQ7XG4gIHRyYW5zZm9ybTogc2NhbGUoMC43Nilcbn1cblxuLmRhcmsgLmFwZXhjaGFydHMtem9vbS1pY29uIHN2Zyxcbi5kYXJrIC5hcGV4Y2hhcnRzLXpvb20taW4taWNvbiBzdmcsXG4uZGFyayAuYXBleGNoYXJ0cy16b29tLW91dC1pY29uIHN2Zyxcbi5kYXJrIC5hcGV4Y2hhcnRzLXJlc2V0LXpvb20taWNvbiBzdmcsXG4uZGFyayAuYXBleGNoYXJ0cy1wYW4taWNvbiBzdmcsXG4uZGFyayAuYXBleGNoYXJ0cy1zZWxlY3Rpb24taWNvbiBzdmcsXG4uZGFyayAuYXBleGNoYXJ0cy1tZW51LWljb24gc3ZnLFxuLmRhcmsgLmFwZXhjaGFydHMtdG9vbGJhci1jdXN0b20taWNvbiBzdmd7XG4gIGZpbGw6ICNmM2Y0ZjU7XG59XG5cbi5hcGV4Y2hhcnRzLWNhbnZhcyAuYXBleGNoYXJ0cy16b29tLWljb24uc2VsZWN0ZWQgc3ZnLFxuLmFwZXhjaGFydHMtY2FudmFzIC5hcGV4Y2hhcnRzLXNlbGVjdGlvbi1pY29uLnNlbGVjdGVkIHN2Zyxcbi5hcGV4Y2hhcnRzLWNhbnZhcyAuYXBleGNoYXJ0cy1yZXNldC16b29tLWljb24uc2VsZWN0ZWQgc3ZnIHtcbiAgZmlsbDogIzAwOEZGQjtcbn1cbi5saWdodCAuYXBleGNoYXJ0cy1zZWxlY3Rpb24taWNvbjpub3QoLnNlbGVjdGVkKTpob3ZlciBzdmcsXG4ubGlnaHQgLmFwZXhjaGFydHMtem9vbS1pY29uOm5vdCguc2VsZWN0ZWQpOmhvdmVyIHN2Zyxcbi5saWdodCAuYXBleGNoYXJ0cy16b29tLWluLWljb246aG92ZXIgc3ZnLFxuLmxpZ2h0IC5hcGV4Y2hhcnRzLXpvb20tb3V0LWljb246aG92ZXIgc3ZnLFxuLmxpZ2h0IC5hcGV4Y2hhcnRzLXJlc2V0LXpvb20taWNvbjpob3ZlciBzdmcsXG4ubGlnaHQgLmFwZXhjaGFydHMtbWVudS1pY29uOmhvdmVyIHN2ZyB7XG4gIGZpbGw6ICMzMzM7XG59XG5cbi5hcGV4Y2hhcnRzLXNlbGVjdGlvbi1pY29uLCAuYXBleGNoYXJ0cy1tZW51LWljb24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4uYXBleGNoYXJ0cy1yZXNldC16b29tLWljb24ge1xuICBtYXJnaW4tbGVmdDogNXB4O1xufVxuLmFwZXhjaGFydHMtem9vbS1pY29uLCAuYXBleGNoYXJ0cy1yZXNldC16b29tLWljb24sIC5hcGV4Y2hhcnRzLW1lbnUtaWNvbiB7XG4gIHRyYW5zZm9ybTogc2NhbGUoMC44NSk7XG59XG5cbi5hcGV4Y2hhcnRzLXpvb20taW4taWNvbiwgLmFwZXhjaGFydHMtem9vbS1vdXQtaWNvbiB7XG4gIHRyYW5zZm9ybTogc2NhbGUoMC43KVxufVxuXG4uYXBleGNoYXJ0cy16b29tLW91dC1pY29uIHtcbiAgbWFyZ2luLXJpZ2h0OiAzcHg7XG59XG5cbi5hcGV4Y2hhcnRzLXBhbi1pY29uIHtcbiAgdHJhbnNmb3JtOiBzY2FsZSgwLjYyKTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBsZWZ0OiAxcHg7XG4gIHRvcDogMHB4O1xufVxuLmFwZXhjaGFydHMtcGFuLWljb24gc3ZnIHtcbiAgZmlsbDogI2ZmZjtcbiAgc3Ryb2tlOiAjNkU4MTkyO1xuICBzdHJva2Utd2lkdGg6IDI7XG59XG4uYXBleGNoYXJ0cy1wYW4taWNvbi5zZWxlY3RlZCBzdmcge1xuICBzdHJva2U6ICMwMDhGRkI7XG59XG4uYXBleGNoYXJ0cy1wYW4taWNvbjpub3QoLnNlbGVjdGVkKTpob3ZlciBzdmcge1xuICBzdHJva2U6ICMzMzM7XG59XG5cbi5hcGV4Y2hhcnRzLXRvb2xiYXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDExO1xuICB0b3A6IDBweDtcbiAgcmlnaHQ6IDNweDtcbiAgbWF4LXdpZHRoOiAxNzZweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgcGFkZGluZzogMHB4IDZweCAycHggNnB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5hcGV4Y2hhcnRzLXRvb2xiYXIgc3ZnIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5hcGV4Y2hhcnRzLW1lbnUge1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMTAwJTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBwYWRkaW5nOiAzcHg7XG4gIHJpZ2h0OiAxMHB4O1xuICBvcGFjaXR5OiAwO1xuICBtaW4td2lkdGg6IDExMHB4O1xuICB0cmFuc2l0aW9uOiAwLjE1cyBlYXNlIGFsbDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5hcGV4Y2hhcnRzLW1lbnUub3BlbiB7XG4gIG9wYWNpdHk6IDE7XG4gIHBvaW50ZXItZXZlbnRzOiBhbGw7XG4gIHRyYW5zaXRpb246IDAuMTVzIGVhc2UgYWxsO1xufVxuXG4uYXBleGNoYXJ0cy1tZW51LWl0ZW0ge1xuICBwYWRkaW5nOiA2cHggN3B4O1xuICBmb250LXNpemU6IDEycHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cbi5saWdodCAuYXBleGNoYXJ0cy1tZW51LWl0ZW06aG92ZXIge1xuICBiYWNrZ3JvdW5kOiAjZWVlO1xufVxuLmRhcmsgLmFwZXhjaGFydHMtbWVudSB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC43KTtcbiAgY29sb3I6ICNmZmY7XG59XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5hcGV4Y2hhcnRzLXRvb2xiYXIge1xuICAgIC8qb3BhY2l0eTogMDsqL1xuICB9XG5cbiAgLmFwZXhjaGFydHMtY2FudmFzOmhvdmVyIC5hcGV4Y2hhcnRzLXRvb2xiYXIge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbn1cblxuLmFwZXhjaGFydHMtZGF0YWxhYmVsLmhpZGRlbiB7XG4gIG9wYWNpdHk6IDA7XG59XG5cbi5hcGV4Y2hhcnRzLXBpZS1sYWJlbCxcbi5hcGV4Y2hhcnRzLWRhdGFsYWJlbCwgLmFwZXhjaGFydHMtZGF0YWxhYmVsLWxhYmVsLCAuYXBleGNoYXJ0cy1kYXRhbGFiZWwtdmFsdWUge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4uYXBleGNoYXJ0cy1waWUtbGFiZWwtZGVsYXkge1xuICBvcGFjaXR5OiAwO1xuICBhbmltYXRpb24tbmFtZTogb3BhcXVlO1xuICBhbmltYXRpb24tZHVyYXRpb246IDAuM3M7XG4gIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzO1xuICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlO1xufVxuXG4uYXBleGNoYXJ0cy1jYW52YXMgLmhpZGRlbiB7XG4gIG9wYWNpdHk6IDA7XG59XG5cbi5hcGV4Y2hhcnRzLWhpZGUgLmFwZXhjaGFydHMtc2VyaWVzLXBvaW50cyB7XG4gIG9wYWNpdHk6IDA7XG59XG5cbi5hcGV4Y2hhcnRzLWFyZWEtc2VyaWVzIC5hcGV4Y2hhcnRzLXNlcmllcy1tYXJrZXJzIC5hcGV4Y2hhcnRzLW1hcmtlci5uby1wb2ludGVyLWV2ZW50cyxcbi5hcGV4Y2hhcnRzLWxpbmUtc2VyaWVzIC5hcGV4Y2hhcnRzLXNlcmllcy1tYXJrZXJzIC5hcGV4Y2hhcnRzLW1hcmtlci5uby1wb2ludGVyLWV2ZW50cywgLmFwZXhjaGFydHMtcmFkYXItc2VyaWVzIHBhdGgsIC5hcGV4Y2hhcnRzLXJhZGFyLXNlcmllcyBwb2x5Z29uIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi8qIG1hcmtlcnMgKi9cblxuLmFwZXhjaGFydHMtbWFya2VyIHtcbiAgdHJhbnNpdGlvbjogMC4xNXMgZWFzZSBhbGw7XG59XG5cbkBrZXlmcmFtZXMgb3BhcXVlIHtcbiAgMCUge1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cbiAgMTAwJSB7XG4gICAgb3BhY2l0eTogMTtcbiAgfVxufVxuXG4vKiBMZWdlbmQgc3R5bGVzICovXG5cbi5hcGV4Y2hhcnRzLWxlZ2VuZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIG92ZXJmbG93OiBhdXRvO1xuICBwYWRkaW5nOiAwIDEwcHg7XG59XG5cbi5hcGV4Y2hhcnRzLWxlZ2VuZC5wb3NpdGlvbi1ib3R0b20sIC5hcGV4Y2hhcnRzLWxlZ2VuZC5wb3NpdGlvbi10b3Age1xuICBmbGV4LXdyYXA6IHdyYXBcbn1cbi5hcGV4Y2hhcnRzLWxlZ2VuZC5wb3NpdGlvbi1yaWdodCwgLmFwZXhjaGFydHMtbGVnZW5kLnBvc2l0aW9uLWxlZnQge1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBib3R0b206IDA7XG59XG5cbi5hcGV4Y2hhcnRzLWxlZ2VuZC5wb3NpdGlvbi1ib3R0b20ubGVmdCwgLmFwZXhjaGFydHMtbGVnZW5kLnBvc2l0aW9uLXRvcC5sZWZ0LCAuYXBleGNoYXJ0cy1sZWdlbmQucG9zaXRpb24tcmlnaHQsIC5hcGV4Y2hhcnRzLWxlZ2VuZC5wb3NpdGlvbi1sZWZ0IHtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xufVxuXG4uYXBleGNoYXJ0cy1sZWdlbmQucG9zaXRpb24tYm90dG9tLmNlbnRlciwgLmFwZXhjaGFydHMtbGVnZW5kLnBvc2l0aW9uLXRvcC5jZW50ZXIge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuLmFwZXhjaGFydHMtbGVnZW5kLnBvc2l0aW9uLWJvdHRvbS5yaWdodCwgLmFwZXhjaGFydHMtbGVnZW5kLnBvc2l0aW9uLXRvcC5yaWdodCB7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG59XG5cbi5hcGV4Y2hhcnRzLWxlZ2VuZC1zZXJpZXMge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG59XG5cbi5hcGV4Y2hhcnRzLWxlZ2VuZC5wb3NpdGlvbi1ib3R0b20gLmFwZXhjaGFydHMtbGVnZW5kLXNlcmllcywgLmFwZXhjaGFydHMtbGVnZW5kLnBvc2l0aW9uLXRvcCAuYXBleGNoYXJ0cy1sZWdlbmQtc2VyaWVze1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uYXBleGNoYXJ0cy1sZWdlbmQtdGV4dCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZm9udC1zaXplOiAxNHB4O1xufVxuXG4uYXBleGNoYXJ0cy1sZWdlbmQtdGV4dCAqLCAuYXBleGNoYXJ0cy1sZWdlbmQtbWFya2VyICoge1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmFwZXhjaGFydHMtbGVnZW5kLW1hcmtlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIG1hcmdpbi1yaWdodDogM3B4O1xufVxuXG4uYXBleGNoYXJ0cy1sZWdlbmQucmlnaHQgLmFwZXhjaGFydHMtbGVnZW5kLXNlcmllcywgLmFwZXhjaGFydHMtbGVnZW5kLmxlZnQgLmFwZXhjaGFydHMtbGVnZW5kLXNlcmllc3tcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uYXBleGNoYXJ0cy1sZWdlbmQtc2VyaWVzLm5vLWNsaWNrIHtcbiAgY3Vyc29yOiBhdXRvO1xufVxuXG4uYXBleGNoYXJ0cy1sZWdlbmQgLmFwZXhjaGFydHMtaGlkZGVuLXplcm8tc2VyaWVzLCAuYXBleGNoYXJ0cy1sZWdlbmQgLmFwZXhjaGFydHMtaGlkZGVuLW51bGwtc2VyaWVzIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4uaW5hY3RpdmUtbGVnZW5kIHtcbiAgb3BhY2l0eTogMC40NTtcbn1cblxuLyogUmVzaXplIGdlbmVyYXRlZCBzdHlsZXMgKi9cbkBrZXlmcmFtZXMgcmVzaXplYW5pbSB7XG4gIGZyb20ge1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cbiAgdG8ge1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cbn1cblxuLnJlc2l6ZS10cmlnZ2VycyB7XG4gIGFuaW1hdGlvbjogMW1zIHJlc2l6ZWFuaW07XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3BhY2l0eTogMDtcbn1cblxuLnJlc2l6ZS10cmlnZ2VycywgLnJlc2l6ZS10cmlnZ2VycyA+IGRpdiwgLmNvbnRyYWN0LXRyaWdnZXI6YmVmb3JlIHtcbiAgY29udGVudDogIiAiO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIGhlaWdodDogMTAwJTtcbiAgd2lkdGg6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5yZXNpemUtdHJpZ2dlcnMgPiBkaXYge1xuICBiYWNrZ3JvdW5kOiAjZWVlO1xuICBvdmVyZmxvdzogYXV0bztcbn1cblxuLmNvbnRyYWN0LXRyaWdnZXI6YmVmb3JlIHtcbiAgd2lkdGg6IDIwMCU7XG4gIGhlaWdodDogMjAwJTtcbn1cbicpLCJkb2N1bWVudCJpbiBzZWxmJiYoImNsYXNzTGlzdCJpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJfIikmJighZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TfHwiY2xhc3NMaXN0ImluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpfHxmdW5jdGlvbih0KXtpZigiRWxlbWVudCJpbiB0KXt2YXIgZT10LkVsZW1lbnQucHJvdG90eXBlLGk9T2JqZWN0LHM9U3RyaW5nLnByb3RvdHlwZS50cmltfHxmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0sYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsaT10aGlzLmxlbmd0aDtlPGk7ZSsrKWlmKGUgaW4gdGhpcyYmdGhpc1tlXT09PXQpcmV0dXJuIGU7cmV0dXJuLTF9LG49ZnVuY3Rpb24odCxlKXt0aGlzLm5hbWU9dCx0aGlzLmNvZGU9RE9NRXhjZXB0aW9uW3RdLHRoaXMubWVzc2FnZT1lfSxyPWZ1bmN0aW9uKHQsZSl7aWYoIiI9PT1lKXRocm93IG5ldyBuKCJTWU5UQVhfRVJSIiwiVGhlIHRva2VuIG11c3Qgbm90IGJlIGVtcHR5LiIpO2lmKC9ccy8udGVzdChlKSl0aHJvdyBuZXcgbigiSU5WQUxJRF9DSEFSQUNURVJfRVJSIiwiVGhlIHRva2VuIG11c3Qgbm90IGNvbnRhaW4gc3BhY2UgY2hhcmFjdGVycy4iKTtyZXR1cm4gYS5jYWxsKHQsZSl9LG89ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXMuY2FsbCh0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpLGk9ZT9lLnNwbGl0KC9ccysvKTpbXSxhPTAsbj1pLmxlbmd0aDthPG47YSsrKXRoaXMucHVzaChpW2FdKTt0aGlzLl91cGRhdGVDbGFzc05hbWU9ZnVuY3Rpb24oKXt0LnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMudG9TdHJpbmcoKSl9fSxsPW8ucHJvdG90eXBlPVtdLGg9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8odGhpcyl9O2lmKG4ucHJvdG90eXBlPUVycm9yLnByb3RvdHlwZSxsLml0ZW09ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbdF18fG51bGx9LGwuY29udGFpbnM9ZnVuY3Rpb24odCl7cmV0dXJufnIodGhpcyx0KyIiKX0sbC5hZGQ9ZnVuY3Rpb24oKXt2YXIgdCxlPWFyZ3VtZW50cyxpPTAscz1lLmxlbmd0aCxhPSExO2Rve3Q9ZVtpXSsiIix+cih0aGlzLHQpfHwodGhpcy5wdXNoKHQpLGE9ITApfXdoaWxlKCsraTxzKTthJiZ0aGlzLl91cGRhdGVDbGFzc05hbWUoKX0sbC5yZW1vdmU9ZnVuY3Rpb24oKXt2YXIgdCxlLGk9YXJndW1lbnRzLHM9MCxhPWkubGVuZ3RoLG49ITE7ZG97Zm9yKHQ9aVtzXSsiIixlPXIodGhpcyx0KTt+ZTspdGhpcy5zcGxpY2UoZSwxKSxuPSEwLGU9cih0aGlzLHQpfXdoaWxlKCsrczxhKTtuJiZ0aGlzLl91cGRhdGVDbGFzc05hbWUoKX0sbC50b2dnbGU9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmNvbnRhaW5zKHQpLHM9aT8hMCE9PWUmJiJyZW1vdmUiOiExIT09ZSYmImFkZCI7cmV0dXJuIHMmJnRoaXNbc10odCksITA9PT1lfHwhMT09PWU/ZTohaX0sbC5yZXBsYWNlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9cih0KyIiKTt+aSYmKHRoaXMuc3BsaWNlKGksMSxlKSx0aGlzLl91cGRhdGVDbGFzc05hbWUoKSl9LGwudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qb2luKCIgIil9LGkuZGVmaW5lUHJvcGVydHkpe3ZhciBjPXtnZXQ6aCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH07dHJ5e2kuZGVmaW5lUHJvcGVydHkoZSwiY2xhc3NMaXN0IixjKX1jYXRjaCh0KXt2b2lkIDAhPT10Lm51bWJlciYmLTIxNDY4MjMyNTIhPT10Lm51bWJlcnx8KGMuZW51bWVyYWJsZT0hMSxpLmRlZmluZVByb3BlcnR5KGUsImNsYXNzTGlzdCIsYykpfX1lbHNlIGkucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18mJmUuX19kZWZpbmVHZXR0ZXJfXygiY2xhc3NMaXN0IixoKX19KHNlbGYpLGZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiXyIpO2lmKHQuY2xhc3NMaXN0LmFkZCgiYzEiLCJjMiIpLCF0LmNsYXNzTGlzdC5jb250YWlucygiYzIiKSl7dmFyIGU9ZnVuY3Rpb24odCl7dmFyIGU9RE9NVG9rZW5MaXN0LnByb3RvdHlwZVt0XTtET01Ub2tlbkxpc3QucHJvdG90eXBlW3RdPWZ1bmN0aW9uKHQpe3ZhciBpLHM9YXJndW1lbnRzLmxlbmd0aDtmb3IoaT0wO2k8cztpKyspdD1hcmd1bWVudHNbaV0sZS5jYWxsKHRoaXMsdCl9fTtlKCJhZGQiKSxlKCJyZW1vdmUiKX1pZih0LmNsYXNzTGlzdC50b2dnbGUoImMzIiwhMSksdC5jbGFzc0xpc3QuY29udGFpbnMoImMzIikpe3ZhciBpPURPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlO0RPTVRva2VuTGlzdC5wcm90b3R5cGUudG9nZ2xlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDEgaW4gYXJndW1lbnRzJiYhdGhpcy5jb250YWlucyh0KT09IWU/ZTppLmNhbGwodGhpcyx0KX19InJlcGxhY2UiaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiXyIpLmNsYXNzTGlzdHx8KERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVwbGFjZT1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudG9TdHJpbmcoKS5zcGxpdCgiICIpLHM9aS5pbmRleE9mKHQrIiIpO35zJiYoaT1pLnNsaWNlKHMpLHRoaXMucmVtb3ZlLmFwcGx5KHRoaXMsaSksdGhpcy5hZGQoZSksdGhpcy5hZGQuYXBwbHkodGhpcyxpLnNsaWNlKDEpKSl9KSx0PW51bGx9KCkpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgZT10Ll9fcmVzaXplVHJpZ2dlcnNfXyxpPWUuZmlyc3RFbGVtZW50Q2hpbGQscz1lLmxhc3RFbGVtZW50Q2hpbGQsYT1pLmZpcnN0RWxlbWVudENoaWxkO3Muc2Nyb2xsTGVmdD1zLnNjcm9sbFdpZHRoLHMuc2Nyb2xsVG9wPXMuc2Nyb2xsSGVpZ2h0LGEuc3R5bGUud2lkdGg9aS5vZmZzZXRXaWR0aCsxKyJweCIsYS5zdHlsZS5oZWlnaHQ9aS5vZmZzZXRIZWlnaHQrMSsicHgiLGkuc2Nyb2xsTGVmdD1pLnNjcm9sbFdpZHRoLGkuc2Nyb2xsVG9wPWkuc2Nyb2xsSGVpZ2h0fWZ1bmN0aW9uIGUoZSl7dmFyIGk9dGhpczt0KHRoaXMpLHRoaXMuX19yZXNpemVSQUZfXyYmbih0aGlzLl9fcmVzaXplUkFGX18pLHRoaXMuX19yZXNpemVSQUZfXz1hKGZ1bmN0aW9uKCl7KGZ1bmN0aW9uKHQpe3JldHVybiB0Lm9mZnNldFdpZHRoIT10Ll9fcmVzaXplTGFzdF9fLndpZHRofHx0Lm9mZnNldEhlaWdodCE9dC5fX3Jlc2l6ZUxhc3RfXy5oZWlnaHR9KShpKSYmKGkuX19yZXNpemVMYXN0X18ud2lkdGg9aS5vZmZzZXRXaWR0aCxpLl9fcmVzaXplTGFzdF9fLmhlaWdodD1pLm9mZnNldEhlaWdodCxpLl9fcmVzaXplTGlzdGVuZXJzX18uZm9yRWFjaChmdW5jdGlvbih0KXt0LmNhbGwoZSl9KSl9KX12YXIgaSxzLGE9KGk9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZXx8ZnVuY3Rpb24odCl7cmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHQsMjApfSxmdW5jdGlvbih0KXtyZXR1cm4gaSh0KX0pLG49KHM9d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96Q2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93LmNsZWFyVGltZW91dCxmdW5jdGlvbih0KXtyZXR1cm4gcyh0KX0pLHI9ITEsbz0iYW5pbWF0aW9uc3RhcnQiLGw9IldlYmtpdCBNb3ogTyBtcyIuc3BsaXQoIiAiKSxoPSJ3ZWJraXRBbmltYXRpb25TdGFydCBhbmltYXRpb25zdGFydCBvQW5pbWF0aW9uU3RhcnQgTVNBbmltYXRpb25TdGFydCIuc3BsaXQoIiAiKSxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImZha2VlbGVtZW50Iik7aWYodm9pZCAwIT09Yy5zdHlsZS5hbmltYXRpb25OYW1lJiYocj0hMCksITE9PT1yKWZvcih2YXIgZD0wO2Q8bC5sZW5ndGg7ZCsrKWlmKHZvaWQgMCE9PWMuc3R5bGVbbFtkXSsiQW5pbWF0aW9uTmFtZSJdKXtvPWhbZF07YnJlYWt9d2luZG93LmFkZFJlc2l6ZUxpc3RlbmVyPWZ1bmN0aW9uKGkscyl7aS5fX3Jlc2l6ZVRyaWdnZXJzX198fCgic3RhdGljIj09Z2V0Q29tcHV0ZWRTdHlsZShpKS5wb3NpdGlvbiYmKGkuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaS5fX3Jlc2l6ZUxhc3RfXz17fSxpLl9fcmVzaXplTGlzdGVuZXJzX189W10sKGkuX19yZXNpemVUcmlnZ2Vyc19fPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5jbGFzc05hbWU9InJlc2l6ZS10cmlnZ2VycyIsaS5fX3Jlc2l6ZVRyaWdnZXJzX18uaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPSJleHBhbmQtdHJpZ2dlciI+PGRpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJjb250cmFjdC10cmlnZ2VyIj48L2Rpdj4nLGkuYXBwZW5kQ2hpbGQoaS5fX3Jlc2l6ZVRyaWdnZXJzX18pLHQoaSksaS5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGUsITApLG8mJmkuX19yZXNpemVUcmlnZ2Vyc19fLmFkZEV2ZW50TGlzdGVuZXIobyxmdW5jdGlvbihlKXsicmVzaXplYW5pbSI9PWUuYW5pbWF0aW9uTmFtZSYmdChpKX0pKSxpLl9fcmVzaXplTGlzdGVuZXJzX18ucHVzaChzKX0sd2luZG93LnJlbW92ZVJlc2l6ZUxpc3RlbmVyPWZ1bmN0aW9uKHQsaSl7dCYmKHQuX19yZXNpemVMaXN0ZW5lcnNfXy5zcGxpY2UodC5fX3Jlc2l6ZUxpc3RlbmVyc19fLmluZGV4T2YoaSksMSksdC5fX3Jlc2l6ZUxpc3RlbmVyc19fLmxlbmd0aHx8KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixlKSx0Ll9fcmVzaXplVHJpZ2dlcnNfXz0hdC5yZW1vdmVDaGlsZCh0Ll9fcmVzaXplVHJpZ2dlcnNfXykpKX19KCksd2luZG93LkFwZXg9e30sZnVuY3Rpb24oKXtmdW5jdGlvbiBpKHQscyl7ZSh0aGlzLGkpLHRoaXMub3B0cz1zLHRoaXMuY3R4PXRoaXMsdGhpcy53PW5ldyBTKHMpLmluaXQoKSx0aGlzLmVsPXQsdGhpcy53Lmdsb2JhbHMuY3VpZD0oTWF0aC5yYW5kb20oKSsxKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDQpLHRoaXMudy5nbG9iYWxzLmNoYXJ0SUQ9dGhpcy53LmNvbmZpZy5jaGFydC5pZD90aGlzLncuY29uZmlnLmNoYXJ0LmlkOnRoaXMudy5nbG9iYWxzLmN1aWQsdGhpcy5ldmVudExpc3Q9WyJtb3VzZWRvd24iLCJtb3VzZW1vdmUiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIiwibW91c2V1cCIsInRvdWNoZW5kIl0sdGhpcy5pbml0TW9kdWxlcygpLHRoaXMuY3JlYXRlPXUuYmluZCh0aGlzLmNyZWF0ZSx0aGlzKSx0aGlzLmRvY3VtZW50RXZlbnQ9dS5iaW5kKHRoaXMuZG9jdW1lbnRFdmVudCx0aGlzKSx0aGlzLndpbmRvd1Jlc2l6ZUhhbmRsZXI9dGhpcy53aW5kb3dSZXNpemUuYmluZCh0aGlzKX1yZXR1cm4gcyhpLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gbmV3IFEoZnVuY3Rpb24oZSxpKXtpZihudWxsIT09dC5lbCl7dm9pZCAwPT09QXBleC5fY2hhcnRJbnN0YW5jZXMmJihBcGV4Ll9jaGFydEluc3RhbmNlcz1bXSksdC53LmNvbmZpZy5jaGFydC5pZCYmQXBleC5fY2hhcnRJbnN0YW5jZXMucHVzaCh7aWQ6dC53Lmdsb2JhbHMuY2hhcnRJRCxncm91cDp0LncuY29uZmlnLmNoYXJ0Lmdyb3VwLGNoYXJ0OnR9KSx0LnNldExvY2FsZSh0LncuY29uZmlnLmNoYXJ0LmRlZmF1bHRMb2NhbGUpO3ZhciBzPXQudy5jb25maWcuY2hhcnQuZXZlbnRzLmJlZm9yZU1vdW50OyJmdW5jdGlvbiI9PXR5cGVvZiBzJiZzKHQsdC53KSx0LmZpcmVFdmVudCgiYmVmb3JlTW91bnQiLFt0LHQud10pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHQud2luZG93UmVzaXplSGFuZGxlciksd2luZG93LmFkZFJlc2l6ZUxpc3RlbmVyKHQuZWwucGFyZW50Tm9kZSx0LnBhcmVudFJlc2l6ZUNhbGxiYWNrLmJpbmQodCkpO3ZhciBhPXQuY3JlYXRlKHQudy5jb25maWcuc2VyaWVzLHt9KTtpZighYSlyZXR1cm4gZSh0KTt0Lm1vdW50KGEpLnRoZW4oZnVuY3Rpb24oKXtlKGEpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LncuY29uZmlnLmNoYXJ0LmV2ZW50cy5tb3VudGVkJiZ0LncuY29uZmlnLmNoYXJ0LmV2ZW50cy5tb3VudGVkKHQsdC53KSx0LmZpcmVFdmVudCgibW91bnRlZCIsW3QsdC53XSl9KS5jYXRjaChmdW5jdGlvbih0KXtpKHQpfSl9ZWxzZSBpKG5ldyBFcnJvcigiRWxlbWVudCBub3QgZm91bmQiKSl9KX19LHtrZXk6ImluaXRNb2R1bGVzIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYW5pbWF0aW9ucz1uZXcgZih0aGlzKSx0aGlzLmNvcmU9bmV3IFoodGhpcy5lbCx0aGlzKSx0aGlzLmdyaWQ9bmV3IGx0KHRoaXMpLHRoaXMuY29yZVV0aWxzPW5ldyB3KHRoaXMpLHRoaXMuY29uZmlnPW5ldyBrKHt9KSx0aGlzLmNyb3NzaGFpcnM9bmV3IFgodGhpcyksdGhpcy5vcHRpb25zPW5ldyBiLHRoaXMucmVzcG9uc2l2ZT1uZXcgaHQodGhpcyksdGhpcy5zZXJpZXM9bmV3IEIodGhpcyksdGhpcy50aGVtZT1uZXcgY3QodGhpcyksdGhpcy5mb3JtYXR0ZXJzPW5ldyBOKHRoaXMpLHRoaXMudGl0bGVTdWJ0aXRsZT1uZXcgeXQodGhpcyksdGhpcy5sZWdlbmQ9bmV3IFYodGhpcyksdGhpcy50b29sYmFyPW5ldyBtdCh0aGlzKSx0aGlzLmRpbWVuc2lvbnM9bmV3IFcodGhpcyksdGhpcy56b29tUGFuU2VsZWN0aW9uPW5ldyB2dCh0aGlzKSx0aGlzLncuZ2xvYmFscy50b29sdGlwPW5ldyBidCh0aGlzKX19LHtrZXk6ImFkZEV2ZW50TGlzdGVuZXIiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53O2kuZ2xvYmFscy5ldmVudHMuaGFzT3duUHJvcGVydHkodCk/aS5nbG9iYWxzLmV2ZW50c1t0XS5wdXNoKGUpOmkuZ2xvYmFscy5ldmVudHNbdF09W2VdfX0se2tleToicmVtb3ZlRXZlbnRMaXN0ZW5lciIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnc7aWYoaS5nbG9iYWxzLmV2ZW50cy5oYXNPd25Qcm9wZXJ0eSh0KSl7dmFyIHM9aS5nbG9iYWxzLmV2ZW50c1t0XS5pbmRleE9mKGUpOy0xIT09cyYmaS5nbG9iYWxzLmV2ZW50c1t0XS5zcGxpY2UocywxKX19fSx7a2V5OiJmaXJlRXZlbnQiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy53O2lmKGkuZ2xvYmFscy5ldmVudHMuaGFzT3duUHJvcGVydHkodCkpe2UmJmUubGVuZ3RofHwoZT1bXSk7Zm9yKHZhciBzPWkuZ2xvYmFscy5ldmVudHNbdF0sYT1zLmxlbmd0aCxuPTA7bjxhO24rKylzW25dLmFwcGx5KG51bGwsZSl9fX0se2tleToiY3JlYXRlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudzt0aGlzLmluaXRNb2R1bGVzKCk7dmFyIHM9dGhpcy53Lmdsb2JhbHM7aWYocy5ub0RhdGE9ITEscy5hbmltYXRpb25FbmRlZD0hMSx0aGlzLnJlc3BvbnNpdmUuY2hlY2tSZXNwb25zaXZlQ29uZmlnKGUpLG51bGw9PT10aGlzLmVsKXJldHVybiBzLmFuaW1hdGlvbkVuZGVkPSEwLG51bGw7aWYodGhpcy5jb3JlLnNldHVwRWxlbWVudHMoKSwwPT09cy5zdmdXaWR0aClyZXR1cm4gcy5hbmltYXRpb25FbmRlZD0hMCxudWxsO3ZhciBhPXcuY2hlY2tDb21ib1Nlcmllcyh0KTtzLmNvbWJvQ2hhcnRzPWEuY29tYm9DaGFydHMscy5jb21ib0NoYXJ0c0hhc0JhcnM9YS5jb21ib0NoYXJ0c0hhc0JhcnMsKDA9PT10Lmxlbmd0aHx8MT09PXQubGVuZ3RoJiZ0WzBdLmRhdGEmJjA9PT10WzBdLmRhdGEubGVuZ3RoKSYmdGhpcy5zZXJpZXMuaGFuZGxlTm9EYXRhKCksdGhpcy5zZXR1cEV2ZW50SGFuZGxlcnMoKSx0aGlzLmNvcmUucGFyc2VEYXRhKHQpLHRoaXMudGhlbWUuaW5pdCgpLG5ldyBMKHRoaXMpLnNldEdsb2JhbE1hcmtlclNpemUoKSx0aGlzLmZvcm1hdHRlcnMuc2V0TGFiZWxGb3JtYXR0ZXJzKCksdGhpcy50aXRsZVN1YnRpdGxlLmRyYXcoKSxzLm5vRGF0YSYmcy5jb2xsYXBzZWRTZXJpZXMubGVuZ3RoIT09cy5zZXJpZXMubGVuZ3RofHx0aGlzLmxlZ2VuZC5pbml0KCksdGhpcy5zZXJpZXMuaGFzQWxsU2VyaWVzRXF1YWxYKCkscy5heGlzQ2hhcnRzJiYodGhpcy5jb3JlLmNvcmVDYWxjdWxhdGlvbnMoKSwiY2F0ZWdvcnkiIT09aS5jb25maWcueGF4aXMudHlwZSYmdGhpcy5mb3JtYXR0ZXJzLnNldExhYmVsRm9ybWF0dGVycygpKSx0aGlzLmZvcm1hdHRlcnMuaGVhdG1hcExhYmVsRm9ybWF0dGVycygpLHRoaXMuZGltZW5zaW9ucy5wbG90Q29vcmRzKCk7dmFyIG49dGhpcy5jb3JlLnh5U2V0dGluZ3MoKTt0aGlzLmdyaWQuY3JlYXRlR3JpZE1hc2soKTt2YXIgcj10aGlzLmNvcmUucGxvdENoYXJ0VHlwZSh0LG4pO3RoaXMuY29yZS5zaGlmdEdyYXBoUG9zaXRpb24oKTt2YXIgbz17cGxvdDp7bGVmdDppLmdsb2JhbHMudHJhbnNsYXRlWCx0b3A6aS5nbG9iYWxzLnRyYW5zbGF0ZVksd2lkdGg6aS5nbG9iYWxzLmdyaWRXaWR0aCxoZWlnaHQ6aS5nbG9iYWxzLmdyaWRIZWlnaHR9fTtyZXR1cm57ZWxHcmFwaDpyLHh5UmF0aW9zOm4sZWxJbm5lcjppLmdsb2JhbHMuZG9tLmVsR3JhcGhpY2FsLGRpbWVuc2lvbnM6b319fSx7a2V5OiJtb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06bnVsbCxlPXRoaXMsaT1lLnc7cmV0dXJuIG5ldyBRKGZ1bmN0aW9uKHMsYSl7aWYobnVsbD09PWUuZWwpcmV0dXJuIGEobmV3IEVycm9yKCJOb3QgZW5vdWdoIGRhdGEgdG8gZGlzcGxheSBvciB0YXJnZXQgZWxlbWVudCBub3QgZm91bmQiKSk7aWYoKG51bGw9PT10fHxpLmdsb2JhbHMuYWxsU2VyaWVzQ29sbGFwc2VkKSYmZS5zZXJpZXMuaGFuZGxlTm9EYXRhKCksZS5hbm5vdGF0aW9ucz1uZXcgbShlKSxlLmNvcmUuZHJhd0F4aXMoaS5jb25maWcuY2hhcnQudHlwZSx0Lnh5UmF0aW9zKSxlLmdyaWQ9bmV3IGx0KGUpLCJiYWNrIj09PWkuY29uZmlnLmdyaWQucG9zaXRpb24mJmUuZ3JpZC5kcmF3R3JpZCgpLCJiYWNrIj09PWkuY29uZmlnLmFubm90YXRpb25zLnBvc2l0aW9uJiZlLmFubm90YXRpb25zLmRyYXdBbm5vdGF0aW9ucygpLHQuZWxHcmFwaCBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgbj0wO248dC5lbEdyYXBoLmxlbmd0aDtuKyspaS5nbG9iYWxzLmRvbS5lbEdyYXBoaWNhbC5hZGQodC5lbEdyYXBoW25dKTtlbHNlIGkuZ2xvYmFscy5kb20uZWxHcmFwaGljYWwuYWRkKHQuZWxHcmFwaCk7aWYoImZyb250Ij09PWkuY29uZmlnLmdyaWQucG9zaXRpb24mJmUuZ3JpZC5kcmF3R3JpZCgpLCJmcm9udCI9PT1pLmNvbmZpZy54YXhpcy5jcm9zc2hhaXJzLnBvc2l0aW9uJiZlLmNyb3NzaGFpcnMuZHJhd1hDcm9zc2hhaXJzKCksImZyb250Ij09PWkuY29uZmlnLnlheGlzWzBdLmNyb3NzaGFpcnMucG9zaXRpb24mJmUuY3Jvc3NoYWlycy5kcmF3WUNyb3NzaGFpcnMoKSwiZnJvbnQiPT09aS5jb25maWcuYW5ub3RhdGlvbnMucG9zaXRpb24mJmUuYW5ub3RhdGlvbnMuZHJhd0Fubm90YXRpb25zKCksIWkuZ2xvYmFscy5ub0RhdGEpe2lmKGkuY29uZmlnLnRvb2x0aXAuZW5hYmxlZCYmIWkuZ2xvYmFscy5ub0RhdGEmJmUudy5nbG9iYWxzLnRvb2x0aXAuZHJhd1Rvb2x0aXAodC54eVJhdGlvcyksaS5nbG9iYWxzLmF4aXNDaGFydHMmJmkuZ2xvYmFscy5pc1hOdW1lcmljKShpLmNvbmZpZy5jaGFydC56b29tLmVuYWJsZWR8fGkuY29uZmlnLmNoYXJ0LnNlbGVjdGlvbiYmaS5jb25maWcuY2hhcnQuc2VsZWN0aW9uLmVuYWJsZWR8fGkuY29uZmlnLmNoYXJ0LnBhbiYmaS5jb25maWcuY2hhcnQucGFuLmVuYWJsZWQpJiZlLnpvb21QYW5TZWxlY3Rpb24uaW5pdCh7eHlSYXRpb3M6dC54eVJhdGlvc30pO2Vsc2V7dmFyIHI9aS5jb25maWcuY2hhcnQudG9vbGJhci50b29scztyLnpvb209ITEsci56b29taW49ITEsci56b29tb3V0PSExLHIuc2VsZWN0aW9uPSExLHIucGFuPSExLHIucmVzZXQ9ITF9aS5jb25maWcuY2hhcnQudG9vbGJhci5zaG93JiYhaS5nbG9iYWxzLmFsbFNlcmllc0NvbGxhcHNlZCYmZS50b29sYmFyLmNyZWF0ZVRvb2xiYXIoKX1pLmdsb2JhbHMubWVtb3J5Lm1ldGhvZHNUb0V4ZWMubGVuZ3RoPjAmJmkuZ2xvYmFscy5tZW1vcnkubWV0aG9kc1RvRXhlYy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QubWV0aG9kKHQucGFyYW1zLCExLHQuY29udGV4dCl9KSxpLmdsb2JhbHMuYXhpc0NoYXJ0c3x8aS5nbG9iYWxzLm5vRGF0YXx8ZS5jb3JlLnJlc2l6ZU5vbkF4aXNDaGFydHMoKSxzKGUpfSl9fSx7a2V5OiJjbGVhclByZXZpb3VzUGF0aHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53O3QuZ2xvYmFscy5wcmV2aW91c1BhdGhzPVtdLHQuZ2xvYmFscy5hbGxTZXJpZXNDb2xsYXBzZWQ9ITEsdC5nbG9iYWxzLmNvbGxhcHNlZFNlcmllcz1bXSx0Lmdsb2JhbHMuY29sbGFwc2VkU2VyaWVzSW5kaWNlcz1bXX19LHtrZXk6InVwZGF0ZU9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0saT0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdLHM9IShhcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSl8fGFyZ3VtZW50c1szXSxhPSEoYXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0pfHxhcmd1bWVudHNbNF0sbj10aGlzLnc7cmV0dXJuIHQuc2VyaWVzJiYodGhpcy5yZXNldFNlcmllcyghMSksdC5zZXJpZXMubGVuZ3RoJiZ0LnNlcmllc1swXS5kYXRhJiYodC5zZXJpZXM9dC5zZXJpZXMubWFwKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIoe30sbi5jb25maWcuc2VyaWVzW2VdLHtuYW1lOnQubmFtZT90Lm5hbWU6bi5jb25maWcuc2VyaWVzW2VdJiZuLmNvbmZpZy5zZXJpZXNbZV0ubmFtZSx0eXBlOnQudHlwZT90LnR5cGU6bi5jb25maWcuc2VyaWVzW2VdJiZuLmNvbmZpZy5zZXJpZXNbZV0udHlwZSxkYXRhOnQuZGF0YT90LmRhdGE6bi5jb25maWcuc2VyaWVzW2VdJiZuLmNvbmZpZy5zZXJpZXNbZV0uZGF0YX0pfSkpLHRoaXMucmV2ZXJ0RGVmYXVsdEF4aXNNaW5NYXgoKSksdC54YXhpcyYmKCh0LnhheGlzLm1pbnx8dC54YXhpcy5tYXgpJiZ0aGlzLmZvcmNlWEF4aXNVcGRhdGUodCksdC54YXhpcy5jYXRlZ29yaWVzJiZ0LnhheGlzLmNhdGVnb3JpZXMubGVuZ3RoJiZuLmNvbmZpZy54YXhpcy5jb252ZXJ0ZWRDYXRUb051bWVyaWMmJih0PXkuY29udmVydENhdFRvTnVtZXJpYyh0KSkpLG4uZ2xvYmFscy5jb2xsYXBzZWRTZXJpZXNJbmRpY2VzLmxlbmd0aD4wJiZ0aGlzLmNsZWFyUHJldmlvdXNQYXRocygpLHQudGhlbWUmJih0PXRoaXMudGhlbWUudXBkYXRlVGhlbWVPcHRpb25zKHQpKSx0aGlzLl91cGRhdGVPcHRpb25zKHQsZSxpLHMsYSl9fSx7a2V5OiJfdXBkYXRlT3B0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxzPSEoYXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0pfHxhcmd1bWVudHNbMl0sYT0hKGFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdKXx8YXJndW1lbnRzWzNdLG49YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0mJmFyZ3VtZW50c1s0XSxyPVt0aGlzXTthJiYocj10aGlzLmdldFN5bmNlZENoYXJ0cygpKSx0aGlzLncuZ2xvYmFscy5pc0V4ZWNDYWxsZWQmJihyPVt0aGlzXSx0aGlzLncuZ2xvYmFscy5pc0V4ZWNDYWxsZWQ9ITEpLHIuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgcj1hLnc7cmV0dXJuIHIuZ2xvYmFscy5zaG91bGRBbmltYXRlPXMsaXx8KHIuZ2xvYmFscy5yZXNpemVkPSEwLHIuZ2xvYmFscy5kYXRhQ2hhbmdlZD0hMCxzJiZhLnNlcmllcy5nZXRQcmV2aW91c1BhdGhzKCkpLGUmJiJvYmplY3QiPT09dChlKSYmKGEuY29uZmlnPW5ldyBrKGUpLGU9dy5leHRlbmRBcnJheVByb3BzKGEuY29uZmlnLGUpLHIuY29uZmlnPXUuZXh0ZW5kKHIuY29uZmlnLGUpLG4mJihyLmdsb2JhbHMubGFzdFhBeGlzPVtdLHIuZ2xvYmFscy5sYXN0WUF4aXM9W10sci5nbG9iYWxzLmluaXRpYWxDb25maWc9dS5leHRlbmQoe30sci5jb25maWcpLHIuZ2xvYmFscy5pbml0aWFsU2VyaWVzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoci5jb25maWcuc2VyaWVzKSkpKSxhLnVwZGF0ZShlKX0pfX0se2tleToidXBkYXRlU2VyaWVzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpbXSxlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV0saT0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdO3JldHVybiB0aGlzLnJlc2V0U2VyaWVzKCExKSx0aGlzLnJldmVydERlZmF1bHRBeGlzTWluTWF4KCksdGhpcy5fdXBkYXRlU2VyaWVzKHQsZSxpKX19LHtrZXk6ImFwcGVuZFNlcmllcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXSxpPSEoYXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0pfHxhcmd1bWVudHNbMl0scz10aGlzLncuY29uZmlnLnNlcmllcy5zbGljZSgpO3JldHVybiBzLnB1c2godCksdGhpcy5yZXNldFNlcmllcyghMSksdGhpcy5yZXZlcnREZWZhdWx0QXhpc01pbk1heCgpLHRoaXMuX3VwZGF0ZVNlcmllcyhzLGUsaSl9fSx7a2V5OiJfdXBkYXRlU2VyaWVzIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpLHM9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSxhPXRoaXMudztyZXR1cm4gdGhpcy53Lmdsb2JhbHMuc2hvdWxkQW5pbWF0ZT1lLGEuZ2xvYmFscy5kYXRhQ2hhbmdlZD0hMCxhLmdsb2JhbHMuYWxsU2VyaWVzQ29sbGFwc2VkJiYoYS5nbG9iYWxzLmFsbFNlcmllc0NvbGxhcHNlZD0hMSksZSYmdGhpcy5zZXJpZXMuZ2V0UHJldmlvdXNQYXRocygpLGEuZ2xvYmFscy5heGlzQ2hhcnRzPygwPT09KGk9dC5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm4gcih7fSxhLmNvbmZpZy5zZXJpZXNbZV0se25hbWU6dC5uYW1lP3QubmFtZTphLmNvbmZpZy5zZXJpZXNbZV0mJmEuY29uZmlnLnNlcmllc1tlXS5uYW1lLHR5cGU6dC50eXBlP3QudHlwZTphLmNvbmZpZy5zZXJpZXNbZV0mJmEuY29uZmlnLnNlcmllc1tlXS50eXBlLGRhdGE6dC5kYXRhP3QuZGF0YTphLmNvbmZpZy5zZXJpZXNbZV0mJmEuY29uZmlnLnNlcmllc1tlXS5kYXRhfSl9KSkubGVuZ3RoJiYoaT1be2RhdGE6W119XSksYS5jb25maWcuc2VyaWVzPWkpOmEuY29uZmlnLnNlcmllcz10LnNsaWNlKCkscyYmKGEuZ2xvYmFscy5pbml0aWFsQ29uZmlnLnNlcmllcz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGEuY29uZmlnLnNlcmllcykpLGEuZ2xvYmFscy5pbml0aWFsU2VyaWVzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYS5jb25maWcuc2VyaWVzKSkpLHRoaXMudXBkYXRlKCl9fSx7a2V5OiJnZXRTeW5jZWRDaGFydHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRHcm91cGVkQ2hhcnRzKCksZT1bdGhpc107cmV0dXJuIHQubGVuZ3RoJiYoZT1bXSx0LmZvckVhY2goZnVuY3Rpb24odCl7ZS5wdXNoKHQpfSkpLGV9fSx7a2V5OiJnZXRHcm91cGVkQ2hhcnRzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIEFwZXguX2NoYXJ0SW5zdGFuY2VzLmZpbHRlcihmdW5jdGlvbih0KXtpZih0Lmdyb3VwKXJldHVybiEwfSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB0LncuY29uZmlnLmNoYXJ0Lmdyb3VwPT09ZS5ncm91cD9lLmNoYXJ0OnR9KX19LHtrZXk6ImFwcGVuZERhdGEiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV0saT10aGlzO2kudy5nbG9iYWxzLmRhdGFDaGFuZ2VkPSEwLGkuc2VyaWVzLmdldFByZXZpb3VzUGF0aHMoKTtmb3IodmFyIHM9aS53LmNvbmZpZy5zZXJpZXMuc2xpY2UoKSxhPTA7YTxzLmxlbmd0aDthKyspaWYodm9pZCAwIT09dFthXSlmb3IodmFyIG49MDtuPHRbYV0uZGF0YS5sZW5ndGg7bisrKXNbYV0uZGF0YS5wdXNoKHRbYV0uZGF0YVtuXSk7cmV0dXJuIGkudy5jb25maWcuc2VyaWVzPXMsZSYmKGkudy5nbG9iYWxzLmluaXRpYWxTZXJpZXM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpLncuY29uZmlnLnNlcmllcykpKSx0aGlzLnVwZGF0ZSgpfX0se2tleToidXBkYXRlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiBuZXcgUShmdW5jdGlvbihpLHMpe2UuY2xlYXIoKTt2YXIgYT1lLmNyZWF0ZShlLncuY29uZmlnLnNlcmllcyx0KTtpZighYSlyZXR1cm4gaShlKTtlLm1vdW50KGEpLnRoZW4oZnVuY3Rpb24oKXsiZnVuY3Rpb24iPT10eXBlb2YgZS53LmNvbmZpZy5jaGFydC5ldmVudHMudXBkYXRlZCYmZS53LmNvbmZpZy5jaGFydC5ldmVudHMudXBkYXRlZChlLGUudyksZS5maXJlRXZlbnQoInVwZGF0ZWQiLFtlLGUud10pLGUudy5nbG9iYWxzLmlzRGlydHk9ITAsaShlKX0pLmNhdGNoKGZ1bmN0aW9uKHQpe3ModCl9KX0pfX0se2tleToiZm9yY2VYQXhpc1VwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53O3ZvaWQgMCE9PXQueGF4aXMubWluJiYoZS5jb25maWcueGF4aXMubWluPXQueGF4aXMubWluLGUuZ2xvYmFscy5sYXN0WEF4aXMubWluPXQueGF4aXMubWluKSx2b2lkIDAhPT10LnhheGlzLm1heCYmKGUuY29uZmlnLnhheGlzLm1heD10LnhheGlzLm1heCxlLmdsb2JhbHMubGFzdFhBeGlzLm1heD10LnhheGlzLm1heCl9fSx7a2V5OiJyZXZlcnREZWZhdWx0QXhpc01pbk1heCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnc7dC5jb25maWcueGF4aXMubWluPXQuZ2xvYmFscy5sYXN0WEF4aXMubWluLHQuY29uZmlnLnhheGlzLm1heD10Lmdsb2JhbHMubGFzdFhBeGlzLm1heCx0LmNvbmZpZy55YXhpcy5tYXAoZnVuY3Rpb24oZSxpKXt0Lmdsb2JhbHMuem9vbWVkJiZ2b2lkIDAhPT10Lmdsb2JhbHMubGFzdFlBeGlzW2ldJiYoZS5taW49dC5nbG9iYWxzLmxhc3RZQXhpc1tpXS5taW4sZS5tYXg9dC5nbG9iYWxzLmxhc3RZQXhpc1tpXS5tYXgpfSl9fSx7a2V5OiJjbGVhciIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnpvb21QYW5TZWxlY3Rpb24mJnRoaXMuem9vbVBhblNlbGVjdGlvbi5kZXN0cm95KCksdGhpcy50b29sYmFyJiZ0aGlzLnRvb2xiYXIuZGVzdHJveSgpLHRoaXMuYW5pbWF0aW9ucz1udWxsLHRoaXMuYW5ub3RhdGlvbnM9bnVsbCx0aGlzLmNvcmU9bnVsbCx0aGlzLmdyaWQ9bnVsbCx0aGlzLnNlcmllcz1udWxsLHRoaXMucmVzcG9uc2l2ZT1udWxsLHRoaXMudGhlbWU9bnVsbCx0aGlzLmZvcm1hdHRlcnM9bnVsbCx0aGlzLnRpdGxlU3VidGl0bGU9bnVsbCx0aGlzLmxlZ2VuZD1udWxsLHRoaXMuZGltZW5zaW9ucz1udWxsLHRoaXMub3B0aW9ucz1udWxsLHRoaXMuY3Jvc3NoYWlycz1udWxsLHRoaXMuem9vbVBhblNlbGVjdGlvbj1udWxsLHRoaXMudG9vbGJhcj1udWxsLHRoaXMudy5nbG9iYWxzLnRvb2x0aXA9bnVsbCx0aGlzLmNsZWFyRG9tRWxlbWVudHMoKX19LHtrZXk6ImtpbGxTVkciLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUShmdW5jdGlvbihlLGkpe3QuZWFjaChmdW5jdGlvbih0LGUpe3RoaXMucmVtb3ZlQ2xhc3MoIioiKSx0aGlzLm9mZigpLHRoaXMuc3RvcCgpfSwhMCksdC51bmdyb3VwKCksdC5jbGVhcigpLGUoImRvbmUiKX0pfX0se2tleToiY2xlYXJEb21FbGVtZW50cyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuZXZlbnRMaXN0LmZvckVhY2goZnVuY3Rpb24oZSl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQuZG9jdW1lbnRFdmVudCl9KTt2YXIgZT10aGlzLncuZ2xvYmFscy5kb207aWYobnVsbCE9PXRoaXMuZWwpZm9yKDt0aGlzLmVsLmZpcnN0Q2hpbGQ7KXRoaXMuZWwucmVtb3ZlQ2hpbGQodGhpcy5lbC5maXJzdENoaWxkKTt0aGlzLmtpbGxTVkcoZS5QYXBlciksZS5QYXBlci5yZW1vdmUoKSxlLmVsV3JhcD1udWxsLGUuZWxHcmFwaGljYWw9bnVsbCxlLmVsTGVnZW5kV3JhcD1udWxsLGUuYmFzZUVsPW51bGwsZS5lbEdyaWRSZWN0PW51bGwsZS5lbEdyaWRSZWN0TWFzaz1udWxsLGUuZWxHcmlkUmVjdE1hcmtlck1hc2s9bnVsbCxlLmVsRGVmcz1udWxsfX0se2tleToiZGVzdHJveSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCk7dmFyIHQ9dGhpcy53LmNvbmZpZy5jaGFydC5pZDt0JiZBcGV4Ll9jaGFydEluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGUsaSl7ZS5pZD09PXQmJkFwZXguX2NoYXJ0SW5zdGFuY2VzLnNwbGljZShpLDEpfSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy53aW5kb3dSZXNpemVIYW5kbGVyKSx3aW5kb3cucmVtb3ZlUmVzaXplTGlzdGVuZXIodGhpcy5lbC5wYXJlbnROb2RlLHRoaXMucGFyZW50UmVzaXplQ2FsbGJhY2suYmluZCh0aGlzKSl9fSx7a2V5OiJ0b2dnbGVTZXJpZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc2VyaWVzLmdldFNlcmllc0J5TmFtZSh0KSxpPXBhcnNlSW50KGUuZ2V0QXR0cmlidXRlKCJkYXRhOnJlYWxJbmRleCIpKSxzPWUuY2xhc3NMaXN0LmNvbnRhaW5zKCJhcGV4Y2hhcnRzLXNlcmllcy1jb2xsYXBzZWQiKTt0aGlzLmxlZ2VuZC50b2dnbGVEYXRhU2VyaWVzKGkscyl9fSx7a2V5OiJyZXNldFNlcmllcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0hKGFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdKXx8YXJndW1lbnRzWzBdO3RoaXMuc2VyaWVzLnJlc2V0U2VyaWVzKHQpfX0se2tleToic2V0dXBFdmVudEhhbmRsZXJzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLncsaT10aGlzLHM9ZS5nbG9iYWxzLmRvbS5iYXNlRWwucXVlcnlTZWxlY3RvcihlLmdsb2JhbHMuY2hhcnRDbGFzcyk7dGhpcy5ldmVudExpc3RIYW5kbGVycz1bXSx0aGlzLmV2ZW50TGlzdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3MuYWRkRXZlbnRMaXN0ZW5lcih0LGZ1bmN0aW9uKHQpe3ZhciBzPU9iamVjdC5hc3NpZ24oe30sZSx7c2VyaWVzSW5kZXg6ZS5nbG9iYWxzLmNhcHR1cmVkU2VyaWVzSW5kZXgsZGF0YVBvaW50SW5kZXg6ZS5nbG9iYWxzLmNhcHR1cmVkRGF0YVBvaW50SW5kZXh9KTsibW91c2Vtb3ZlIj09PXQudHlwZXx8InRvdWNobW92ZSI9PT10LnR5cGU/ImZ1bmN0aW9uIj09dHlwZW9mIGUuY29uZmlnLmNoYXJ0LmV2ZW50cy5tb3VzZU1vdmUmJmUuY29uZmlnLmNoYXJ0LmV2ZW50cy5tb3VzZU1vdmUodCxpLHMpOigibW91c2V1cCI9PT10LnR5cGUmJjE9PT10LndoaWNofHwidG91Y2hlbmQiPT09dC50eXBlKSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbmZpZy5jaGFydC5ldmVudHMuY2xpY2smJmUuY29uZmlnLmNoYXJ0LmV2ZW50cy5jbGljayh0LGkscyksaS5maXJlRXZlbnQoImNsaWNrIixbdCxpLHNdKSl9LHtjYXB0dXJlOiExLHBhc3NpdmU6ITB9KX0pLHRoaXMuZXZlbnRMaXN0LmZvckVhY2goZnVuY3Rpb24oZSl7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlLHQuZG9jdW1lbnRFdmVudCl9KSx0aGlzLmNvcmUuc2V0dXBCcnVzaEhhbmRsZXIoKX19LHtrZXk6ImRvY3VtZW50RXZlbnQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudztlLmdsb2JhbHMuY2xpZW50WD0idG91Y2htb3ZlIj09PXQudHlwZT90LnRvdWNoZXNbMF0uY2xpZW50WDp0LmNsaWVudFgsZS5nbG9iYWxzLmNsaWVudFk9InRvdWNobW92ZSI9PT10LnR5cGU/dC50b3VjaGVzWzBdLmNsaWVudFk6dC5jbGllbnRZfX0se2tleToiYWRkWGF4aXNBbm5vdGF0aW9uIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnZvaWQgMCxzPXRoaXM7aSYmKHM9aSkscy5hbm5vdGF0aW9ucy5hZGRYYXhpc0Fubm90YXRpb25FeHRlcm5hbCh0LGUscyl9fSx7a2V5OiJhZGRZYXhpc0Fubm90YXRpb24iLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV0saT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dm9pZCAwLHM9dGhpcztpJiYocz1pKSxzLmFubm90YXRpb25zLmFkZFlheGlzQW5ub3RhdGlvbkV4dGVybmFsKHQsZSxzKX19LHtrZXk6ImFkZFBvaW50QW5ub3RhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXSxpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp2b2lkIDAscz10aGlzO2kmJihzPWkpLHMuYW5ub3RhdGlvbnMuYWRkUG9pbnRBbm5vdGF0aW9uRXh0ZXJuYWwodCxlLHMpfX0se2tleToiY2xlYXJBbm5vdGF0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dm9pZCAwLGU9dGhpczt0JiYoZT10KSxlLmFubm90YXRpb25zLmNsZWFyQW5ub3RhdGlvbnMoZSl9fSx7a2V5OiJhZGRUZXh0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnZvaWQgMCxzPXRoaXM7aSYmKHM9aSkscy5hbm5vdGF0aW9ucy5hZGRUZXh0KHQsZSxzKX19LHtrZXk6ImdldENoYXJ0QXJlYSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53Lmdsb2JhbHMuZG9tLmJhc2VFbC5xdWVyeVNlbGVjdG9yKCIuYXBleGNoYXJ0cy1pbm5lciIpfX0se2tleToiZ2V0U2VyaWVzVG90YWxYUmFuZ2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY29yZVV0aWxzLmdldFNlcmllc1RvdGFsc1hSYW5nZSh0LGUpfX0se2tleToiZ2V0SGlnaGVzdFZhbHVlSW5TZXJpZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjA7cmV0dXJuIG5ldyBVKHRoaXMuY3R4KS5nZXRNaW5ZTWF4WSh0KS5oaWdoZXN0WX19LHtrZXk6ImdldExvd2VzdFZhbHVlSW5TZXJpZXMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjA7cmV0dXJuIG5ldyBVKHRoaXMuY3R4KS5nZXRNaW5ZTWF4WSh0KS5sb3dlc3RZfX0se2tleToiZ2V0U2VyaWVzVG90YWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudy5nbG9iYWxzLnNlcmllc1RvdGFsc319LHtrZXk6InNldExvY2FsZSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5zZXRDdXJyZW50TG9jYWxlVmFsdWVzKHQpfX0se2tleToidG9nZ2xlRGF0YVBvaW50U2VsZWN0aW9uIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMudyxzPW51bGw7aS5nbG9iYWxzLmF4aXNDaGFydHM/cz1pLmdsb2JhbHMuZG9tLlBhcGVyLnNlbGVjdCgiLmFwZXhjaGFydHMtc2VyaWVzW2RhdGFcXDpyZWFsSW5kZXg9JyIuY29uY2F0KHQsIiddIHBhdGhbaj0nIikuY29uY2F0KGUsIiddLCAuYXBleGNoYXJ0cy1zZXJpZXNbZGF0YVxcOnJlYWxJbmRleD0nIikuY29uY2F0KHQsIiddIGNpcmNsZVtqPSciKS5jb25jYXQoZSwiJ10sIC5hcGV4Y2hhcnRzLXNlcmllc1tkYXRhXFw6cmVhbEluZGV4PSciKS5jb25jYXQodCwiJ10gcmVjdFtqPSciKS5jb25jYXQoZSwiJ10iKSkubWVtYmVyc1swXToocz1pLmdsb2JhbHMuZG9tLlBhcGVyLnNlbGVjdCgiLmFwZXhjaGFydHMtc2VyaWVzW2RhdGFcXDpyZWFsSW5kZXg9JyIuY29uY2F0KHQsIiddIikpLm1lbWJlcnNbMF0sKCJwaWUiPT09aS5jb25maWcuY2hhcnQudHlwZXx8ImRvbnV0Ij09PWkuY29uZmlnLmNoYXJ0LnR5cGUpJiZuZXcgWSh0aGlzLmN0eCkucGllQ2xpY2tlZCh0KSk7cz9uZXcgcCh0aGlzLmN0eCkucGF0aE1vdXNlRG93bihzLG51bGwpOmNvbnNvbGUud2FybigidG9nZ2xlRGF0YVBvaW50U2VsZWN0aW9uOiBFbGVtZW50IG5vdCBmb3VuZCIpO3JldHVybiBzLm5vZGU/cy5ub2RlOm51bGx9fSx7a2V5OiJzZXRDdXJyZW50TG9jYWxlVmFsdWVzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLncuY29uZmlnLmNoYXJ0LmxvY2FsZXM7d2luZG93LkFwZXguY2hhcnQmJndpbmRvdy5BcGV4LmNoYXJ0LmxvY2FsZXMmJndpbmRvdy5BcGV4LmNoYXJ0LmxvY2FsZXMubGVuZ3RoPjAmJihlPXRoaXMudy5jb25maWcuY2hhcnQubG9jYWxlcy5jb25jYXQod2luZG93LkFwZXguY2hhcnQubG9jYWxlcykpO3ZhciBpPWUuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5hbWU9PT10fSlbMF07aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBsb2NhbGUgbmFtZSBwcm92aWRlZC4gUGxlYXNlIG1ha2Ugc3VyZSB5b3Ugc2V0IHRoZSBjb3JyZWN0IGxvY2FsZSBuYW1lIGluIG9wdGlvbnMiKTt2YXIgcz11LmV4dGVuZCh4LGkpO3RoaXMudy5nbG9iYWxzLmxvY2FsZT1zLm9wdGlvbnN9fSx7a2V5OiJkYXRhVVJJIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgb3QodGhpcy5jdHgpLmRhdGFVUkkoKX19LHtrZXk6InBhcGVyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLncuZ2xvYmFscy5kb20uUGFwZXJ9fSx7a2V5OiJwYXJlbnRSZXNpemVDYWxsYmFjayIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLncuZ2xvYmFscy5hbmltYXRpb25FbmRlZCYmdGhpcy53aW5kb3dSZXNpemUoKX19LHtrZXk6IndpbmRvd1Jlc2l6ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2NsZWFyVGltZW91dCh0aGlzLncuZ2xvYmFscy5yZXNpemVUaW1lciksdGhpcy53Lmdsb2JhbHMucmVzaXplVGltZXI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LncuZ2xvYmFscy5yZXNpemVkPSEwLHQudy5nbG9iYWxzLmRhdGFDaGFuZ2VkPSExLHQudXBkYXRlKCl9LDE1MCl9fV0sW3trZXk6ImluaXRPbkxvYWQiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLWFwZXhjaGFydHNdIiksZT0wO2U8dC5sZW5ndGg7ZSsrKXtuZXcgaSh0W2VdLEpTT04ucGFyc2UodFtlXS5nZXRBdHRyaWJ1dGUoImRhdGEtb3B0aW9ucyIpKSkucmVuZGVyKCl9fX0se2tleToiZXhlYyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldENoYXJ0QnlJRCh0KTtpZihpKXtpLncuZ2xvYmFscy5pc0V4ZWNDYWxsZWQ9ITA7Zm9yKHZhciBzPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkocz4yP3MtMjowKSxuPTI7bjxzO24rKylhW24tMl09YXJndW1lbnRzW25dO3N3aXRjaChlKXtjYXNlInVwZGF0ZU9wdGlvbnMiOnJldHVybiBpLnVwZGF0ZU9wdGlvbnMuYXBwbHkoaSxhKTtjYXNlInVwZGF0ZVNlcmllcyI6cmV0dXJuIGkudXBkYXRlU2VyaWVzLmFwcGx5KGksYSk7Y2FzZSJhcHBlbmREYXRhIjpyZXR1cm4gaS5hcHBlbmREYXRhLmFwcGx5KGksYSk7Y2FzZSJhcHBlbmRTZXJpZXMiOnJldHVybiBpLmFwcGVuZFNlcmllcy5hcHBseShpLGEpO2Nhc2UidG9nZ2xlU2VyaWVzIjpyZXR1cm4gaS50b2dnbGVTZXJpZXMuYXBwbHkoaSxhKTtjYXNlInJlc2V0U2VyaWVzIjpyZXR1cm4gaS5yZXNldFNlcmllcy5hcHBseShpLGEpO2Nhc2UidG9nZ2xlRGF0YVBvaW50U2VsZWN0aW9uIjpyZXR1cm4gaS50b2dnbGVEYXRhUG9pbnRTZWxlY3Rpb24uYXBwbHkoaSxhKTtjYXNlImRhdGFVUkkiOnJldHVybiBpLmRhdGFVUkkuYXBwbHkoaSxhKTtjYXNlImFkZFhheGlzQW5ub3RhdGlvbiI6cmV0dXJuIGkuYWRkWGF4aXNBbm5vdGF0aW9uLmFwcGx5KGksYSk7Y2FzZSJhZGRZYXhpc0Fubm90YXRpb24iOnJldHVybiBpLmFkZFlheGlzQW5ub3RhdGlvbi5hcHBseShpLGEpO2Nhc2UiYWRkUG9pbnRBbm5vdGF0aW9uIjpyZXR1cm4gaS5hZGRQb2ludEFubm90YXRpb24uYXBwbHkoaSxhKTtjYXNlImFkZFRleHQiOnJldHVybiBpLmFkZFRleHQuYXBwbHkoaSxhKTtjYXNlImNsZWFyQW5ub3RhdGlvbnMiOnJldHVybiBpLmNsZWFyQW5ub3RhdGlvbnMuYXBwbHkoaSxhKTtjYXNlInBhcGVyIjpyZXR1cm4gaS5wYXBlci5hcHBseShpLGEpO2Nhc2UiZGVzdHJveSI6cmV0dXJuIGkuZGVzdHJveSgpfX19fSx7a2V5OiJtZXJnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdS5leHRlbmQodCxlKX19LHtrZXk6ImdldENoYXJ0QnlJRCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIEFwZXguX2NoYXJ0SW5zdGFuY2VzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS5pZD09PXR9KVswXS5jaGFydH19XSksaX0oKX0pOw=="},{"meta":{"name":"sweetalert.min.js","url":"https://cdn.bootcdn.net/ajax/libs/sweetalert/2.1.2/sweetalert.min.js","ts":1654514782945,"mimetype":"text/javascript"},"source":"IWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuc3dhbD1lKCk6dC5zd2FsPWUoKX0odGhpcyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG8pe2lmKG5bb10pcmV0dXJuIG5bb10uZXhwb3J0czt2YXIgcj1uW29dPXtpOm8sbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gdFtvXS5jYWxsKHIuZXhwb3J0cyxyLHIuZXhwb3J0cyxlKSxyLmw9ITAsci5leHBvcnRzfXZhciBuPXt9O3JldHVybiBlLm09dCxlLmM9bixlLmQ9ZnVuY3Rpb24odCxuLG8pe2Uubyh0LG4pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6b30pfSxlLm49ZnVuY3Rpb24odCl7dmFyIG49dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIGUuZChuLCJhIixuKSxufSxlLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LGUucD0iIixlKGUucz04KX0oW2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPSJzd2FsLWJ1dHRvbiI7ZS5DTEFTU19OQU1FUz17TU9EQUw6InN3YWwtbW9kYWwiLE9WRVJMQVk6InN3YWwtb3ZlcmxheSIsU0hPV19NT0RBTDoic3dhbC1vdmVybGF5LS1zaG93LW1vZGFsIixNT0RBTF9USVRMRToic3dhbC10aXRsZSIsTU9EQUxfVEVYVDoic3dhbC10ZXh0IixJQ09OOiJzd2FsLWljb24iLElDT05fQ1VTVE9NOiJzd2FsLWljb24tLWN1c3RvbSIsQ09OVEVOVDoic3dhbC1jb250ZW50IixGT09URVI6InN3YWwtZm9vdGVyIixCVVRUT05fQ09OVEFJTkVSOiJzd2FsLWJ1dHRvbi1jb250YWluZXIiLEJVVFRPTjpvLENPTkZJUk1fQlVUVE9OOm8rIi0tY29uZmlybSIsQ0FOQ0VMX0JVVFRPTjpvKyItLWNhbmNlbCIsREFOR0VSX0JVVFRPTjpvKyItLWRhbmdlciIsQlVUVE9OX0xPQURJTkc6bysiLS1sb2FkaW5nIixCVVRUT05fTE9BREVSOm8rIl9fbG9hZGVyIn0sZS5kZWZhdWx0PWUuQ0xBU1NfTkFNRVN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZ2V0Tm9kZT1mdW5jdGlvbih0KXt2YXIgZT0iLiIrdDtyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKX0sZS5zdHJpbmdUb05vZGU9ZnVuY3Rpb24odCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGUuaW5uZXJIVE1MPXQudHJpbSgpLGUuZmlyc3RDaGlsZH0sZS5pbnNlcnRBZnRlcj1mdW5jdGlvbih0LGUpe3ZhciBuPWUubmV4dFNpYmxpbmc7ZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LG4pfSxlLnJlbW92ZU5vZGU9ZnVuY3Rpb24odCl7dC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHQpfSxlLnRocm93RXJyPWZ1bmN0aW9uKHQpe3Rocm93IHQ9dC5yZXBsYWNlKC8gKyg/PSApL2csIiIpLCJTd2VldEFsZXJ0OiAiKyh0PXQudHJpbSgpKX0sZS5pc1BsYWluT2JqZWN0PWZ1bmN0aW9uKHQpe2lmKCJbb2JqZWN0IE9iamVjdF0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKXJldHVybiExO3ZhciBlPU9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtyZXR1cm4gbnVsbD09PWV8fGU9PT1PYmplY3QucHJvdG90eXBlfSxlLm9yZGluYWxTdWZmaXhPZj1mdW5jdGlvbih0KXt2YXIgZT10JTEwLG49dCUxMDA7cmV0dXJuIDE9PT1lJiYxMSE9PW4/dCsic3QiOjI9PT1lJiYxMiE9PW4/dCsibmQiOjM9PT1lJiYxMyE9PW4/dCsicmQiOnQrInRoIn19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyh0KXtmb3IodmFyIG4gaW4gdCllLmhhc093blByb3BlcnR5KG4pfHwoZVtuXT10W25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbyhuKDI1KSk7dmFyIHI9bigyNik7ZS5vdmVybGF5TWFya3VwPXIuZGVmYXVsdCxvKG4oMjcpKSxvKG4oMjgpKSxvKG4oMjkpKTt2YXIgaT1uKDApLGE9aS5kZWZhdWx0Lk1PREFMX1RJVExFLHM9aS5kZWZhdWx0Lk1PREFMX1RFWFQsYz1pLmRlZmF1bHQuSUNPTixsPWkuZGVmYXVsdC5GT09URVI7ZS5pY29uTWFya3VwPSdcbiAgPGRpdiBjbGFzcz0iJytjKyciPjwvZGl2PicsZS50aXRsZU1hcmt1cD0nXG4gIDxkaXYgY2xhc3M9IicrYSsnIj48L2Rpdj5cbicsZS50ZXh0TWFya3VwPSdcbiAgPGRpdiBjbGFzcz0iJytzKyciPjwvZGl2PicsZS5mb290ZXJNYXJrdXA9J1xuICA8ZGl2IGNsYXNzPSInK2wrJyI+PC9kaXY+XG4nfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEpO2UuQ09ORklSTV9LRVk9ImNvbmZpcm0iLGUuQ0FOQ0VMX0tFWT0iY2FuY2VsIjt2YXIgcj17dmlzaWJsZTohMCx0ZXh0Om51bGwsdmFsdWU6bnVsbCxjbGFzc05hbWU6IiIsY2xvc2VNb2RhbDohMH0saT1PYmplY3QuYXNzaWduKHt9LHIse3Zpc2libGU6ITEsdGV4dDoiQ2FuY2VsIix2YWx1ZTpudWxsfSksYT1PYmplY3QuYXNzaWduKHt9LHIse3RleHQ6Ik9LIix2YWx1ZTohMH0pO2UuZGVmYXVsdEJ1dHRvbkxpc3Q9e2NhbmNlbDppLGNvbmZpcm06YX07dmFyIHM9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UgZS5DT05GSVJNX0tFWTpyZXR1cm4gYTtjYXNlIGUuQ0FOQ0VMX0tFWTpyZXR1cm4gaTtkZWZhdWx0OnZhciBuPXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKTtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSxyLHt0ZXh0Om4sdmFsdWU6dH0pfX0sYz1mdW5jdGlvbih0LGUpe3ZhciBuPXModCk7cmV0dXJuITA9PT1lP09iamVjdC5hc3NpZ24oe30sbix7dmlzaWJsZTohMH0pOiJzdHJpbmciPT10eXBlb2YgZT9PYmplY3QuYXNzaWduKHt9LG4se3Zpc2libGU6ITAsdGV4dDplfSk6by5pc1BsYWluT2JqZWN0KGUpP09iamVjdC5hc3NpZ24oe3Zpc2libGU6ITB9LG4sZSk6T2JqZWN0LmFzc2lnbih7fSxuLHt2aXNpYmxlOiExfSl9LGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXt9LG49MCxvPU9iamVjdC5rZXlzKHQpO248by5sZW5ndGg7bisrKXt2YXIgcj1vW25dLGE9dFtyXSxzPWMocixhKTtlW3JdPXN9cmV0dXJuIGUuY2FuY2VsfHwoZS5jYW5jZWw9aSksZX0sdT1mdW5jdGlvbih0KXt2YXIgbj17fTtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMTpuW2UuQ0FOQ0VMX0tFWV09T2JqZWN0LmFzc2lnbih7fSxpLHt2aXNpYmxlOiExfSk7YnJlYWs7Y2FzZSAyOm5bZS5DQU5DRUxfS0VZXT1jKGUuQ0FOQ0VMX0tFWSx0WzBdKSxuW2UuQ09ORklSTV9LRVldPWMoZS5DT05GSVJNX0tFWSx0WzFdKTticmVhaztkZWZhdWx0Om8udGhyb3dFcnIoIkludmFsaWQgbnVtYmVyIG9mICdidXR0b25zJyBpbiBhcnJheSAoIit0Lmxlbmd0aCsiKS5cbiAgICAgIElmIHlvdSB3YW50IG1vcmUgdGhhbiAyIGJ1dHRvbnMsIHlvdSBuZWVkIHRvIHVzZSBhbiBvYmplY3QhIil9cmV0dXJuIG59O2UuZ2V0QnV0dG9uTGlzdE9wdHM9ZnVuY3Rpb24odCl7dmFyIG49ZS5kZWZhdWx0QnV0dG9uTGlzdDtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bltlLkNPTkZJUk1fS0VZXT1jKGUuQ09ORklSTV9LRVksdCk6QXJyYXkuaXNBcnJheSh0KT9uPXUodCk6by5pc1BsYWluT2JqZWN0KHQpP249bCh0KTohMD09PXQ/bj11KFshMCwhMF0pOiExPT09dD9uPXUoWyExLCExXSk6dm9pZCAwPT09dCYmKG49ZS5kZWZhdWx0QnV0dG9uTGlzdCksbn19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMSkscj1uKDIpLGk9bigwKSxhPWkuZGVmYXVsdC5NT0RBTCxzPWkuZGVmYXVsdC5PVkVSTEFZLGM9bigzMCksbD1uKDMxKSx1PW4oMzIpLGY9bigzMyk7ZS5pbmplY3RFbEludG9Nb2RhbD1mdW5jdGlvbih0KXt2YXIgZT1vLmdldE5vZGUoYSksbj1vLnN0cmluZ1RvTm9kZSh0KTtyZXR1cm4gZS5hcHBlbmRDaGlsZChuKSxufTt2YXIgZD1mdW5jdGlvbih0KXt0LmNsYXNzTmFtZT1hLHQudGV4dENvbnRlbnQ9IiJ9LHA9ZnVuY3Rpb24odCxlKXtkKHQpO3ZhciBuPWUuY2xhc3NOYW1lO24mJnQuY2xhc3NMaXN0LmFkZChuKX07ZS5pbml0TW9kYWxDb250ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPW8uZ2V0Tm9kZShhKTtwKGUsdCksYy5kZWZhdWx0KHQuaWNvbiksbC5pbml0VGl0bGUodC50aXRsZSksbC5pbml0VGV4dCh0LnRleHQpLGYuZGVmYXVsdCh0LmNvbnRlbnQpLHUuZGVmYXVsdCh0LmJ1dHRvbnMsdC5kYW5nZXJNb2RlKX07dmFyIG09ZnVuY3Rpb24oKXt2YXIgdD1vLmdldE5vZGUocyksZT1vLnN0cmluZ1RvTm9kZShyLm1vZGFsTWFya3VwKTt0LmFwcGVuZENoaWxkKGUpfTtlLmRlZmF1bHQ9bX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigzKSxyPXtpc09wZW46ITEscHJvbWlzZTpudWxsLGFjdGlvbnM6e30sdGltZXI6bnVsbH0saT1PYmplY3QuYXNzaWduKHt9LHIpO2UucmVzZXRTdGF0ZT1mdW5jdGlvbigpe2k9T2JqZWN0LmFzc2lnbih7fSxyKX0sZS5zZXRBY3Rpb25WYWx1ZT1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIGEoby5DT05GSVJNX0tFWSx0KTtmb3IodmFyIGUgaW4gdClhKGUsdFtlXSl9O3ZhciBhPWZ1bmN0aW9uKHQsZSl7aS5hY3Rpb25zW3RdfHwoaS5hY3Rpb25zW3RdPXt9KSxPYmplY3QuYXNzaWduKGkuYWN0aW9uc1t0XSx7dmFsdWU6ZX0pfTtlLnNldEFjdGlvbk9wdGlvbnNGb3I9ZnVuY3Rpb24odCxlKXt2YXIgbj0odm9pZCAwPT09ZT97fTplKS5jbG9zZU1vZGFsLG89dm9pZCAwPT09bnx8bjtPYmplY3QuYXNzaWduKGkuYWN0aW9uc1t0XSx7Y2xvc2VNb2RhbDpvfSl9LGUuZGVmYXVsdD1pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEpLHI9bigzKSxpPW4oMCksYT1pLmRlZmF1bHQuT1ZFUkxBWSxzPWkuZGVmYXVsdC5TSE9XX01PREFMLGM9aS5kZWZhdWx0LkJVVFRPTixsPWkuZGVmYXVsdC5CVVRUT05fTE9BRElORyx1PW4oNSk7ZS5vcGVuTW9kYWw9ZnVuY3Rpb24oKXtvLmdldE5vZGUoYSkuY2xhc3NMaXN0LmFkZChzKSx1LmRlZmF1bHQuaXNPcGVuPSEwfTt2YXIgZj1mdW5jdGlvbigpe28uZ2V0Tm9kZShhKS5jbGFzc0xpc3QucmVtb3ZlKHMpLHUuZGVmYXVsdC5pc09wZW49ITF9O2Uub25BY3Rpb249ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ci5DQU5DRUxfS0VZKTt2YXIgZT11LmRlZmF1bHQuYWN0aW9uc1t0XSxuPWUudmFsdWU7aWYoITE9PT1lLmNsb3NlTW9kYWwpe3ZhciBpPWMrIi0tIit0O28uZ2V0Tm9kZShpKS5jbGFzc0xpc3QuYWRkKGwpfWVsc2UgZigpO3UuZGVmYXVsdC5wcm9taXNlLnJlc29sdmUobil9LGUuZ2V0U3RhdGU9ZnVuY3Rpb24oKXt2YXIgdD1PYmplY3QuYXNzaWduKHt9LHUuZGVmYXVsdCk7cmV0dXJuIGRlbGV0ZSB0LnByb21pc2UsZGVsZXRlIHQudGltZXIsdH0sZS5zdG9wTG9hZGluZz1mdW5jdGlvbigpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuIitjKSxlPTA7ZTx0Lmxlbmd0aDtlKyspe3RbZV0uY2xhc3NMaXN0LnJlbW92ZShsKX19fSxmdW5jdGlvbih0LGUpe3ZhciBuO249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7bj1ufHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfHwoMCxldmFsKSgidGhpcyIpfWNhdGNoKHQpeyJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYobj13aW5kb3cpfXQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe3QuZXhwb3J0cz1lLnN3ZWV0QWxlcnQ9big5KX0pLmNhbGwoZSxuKDcpKX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt0LmV4cG9ydHM9ZS5zd2FsPW4oMTApfSkuY2FsbChlLG4oNykpfSxmdW5jdGlvbih0LGUsbil7InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJm4oMTEpLG4oMTYpO3ZhciBvPW4oMjMpLmRlZmF1bHQ7dC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1uKDEyKTsic3RyaW5nIj09dHlwZW9mIG8mJihvPVtbdC5pLG8sIiJdXSk7dmFyIHI9e2luc2VydEF0OiJ0b3AifTtyLnRyYW5zZm9ybT12b2lkIDA7bigxNCkobyxyKTtvLmxvY2FscyYmKHQuZXhwb3J0cz1vLmxvY2Fscyl9LGZ1bmN0aW9uKHQsZSxuKXtlPXQuZXhwb3J0cz1uKDEzKSh2b2lkIDApLGUucHVzaChbdC5pLCcuc3dhbC1pY29uLS1lcnJvcntib3JkZXItY29sb3I6I2YyNzQ3NDstd2Via2l0LWFuaW1hdGlvbjphbmltYXRlRXJyb3JJY29uIC41czthbmltYXRpb246YW5pbWF0ZUVycm9ySWNvbiAuNXN9LnN3YWwtaWNvbi0tZXJyb3JfX3gtbWFya3twb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrOy13ZWJraXQtYW5pbWF0aW9uOmFuaW1hdGVYTWFyayAuNXM7YW5pbWF0aW9uOmFuaW1hdGVYTWFyayAuNXN9LnN3YWwtaWNvbi0tZXJyb3JfX2xpbmV7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjVweDt3aWR0aDo0N3B4O2JhY2tncm91bmQtY29sb3I6I2YyNzQ3NDtkaXNwbGF5OmJsb2NrO3RvcDozN3B4O2JvcmRlci1yYWRpdXM6MnB4fS5zd2FsLWljb24tLWVycm9yX19saW5lLS1sZWZ0ey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7bGVmdDoxN3B4fS5zd2FsLWljb24tLWVycm9yX19saW5lLS1yaWdodHstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7cmlnaHQ6MTZweH1ALXdlYmtpdC1rZXlmcmFtZXMgYW5pbWF0ZUVycm9ySWNvbnswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGVYKDEwMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZVgoMTAwZGVnKTtvcGFjaXR5OjB9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlWCgwZGVnKTt0cmFuc2Zvcm06cm90YXRlWCgwZGVnKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgYW5pbWF0ZUVycm9ySWNvbnswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGVYKDEwMGRlZyk7dHJhbnNmb3JtOnJvdGF0ZVgoMTAwZGVnKTtvcGFjaXR5OjB9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlWCgwZGVnKTt0cmFuc2Zvcm06cm90YXRlWCgwZGVnKTtvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyBhbmltYXRlWE1hcmt7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjQpO3RyYW5zZm9ybTpzY2FsZSguNCk7bWFyZ2luLXRvcDoyNnB4O29wYWNpdHk6MH01MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjQpO3RyYW5zZm9ybTpzY2FsZSguNCk7bWFyZ2luLXRvcDoyNnB4O29wYWNpdHk6MH04MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4xNSk7dHJhbnNmb3JtOnNjYWxlKDEuMTUpO21hcmdpbi10b3A6LTZweH10b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSk7bWFyZ2luLXRvcDowO29wYWNpdHk6MX19QGtleWZyYW1lcyBhbmltYXRlWE1hcmt7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjQpO3RyYW5zZm9ybTpzY2FsZSguNCk7bWFyZ2luLXRvcDoyNnB4O29wYWNpdHk6MH01MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjQpO3RyYW5zZm9ybTpzY2FsZSguNCk7bWFyZ2luLXRvcDoyNnB4O29wYWNpdHk6MH04MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4xNSk7dHJhbnNmb3JtOnNjYWxlKDEuMTUpO21hcmdpbi10b3A6LTZweH10b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSk7bWFyZ2luLXRvcDowO29wYWNpdHk6MX19LnN3YWwtaWNvbi0td2FybmluZ3tib3JkZXItY29sb3I6I2Y4YmI4Njstd2Via2l0LWFuaW1hdGlvbjpwdWxzZVdhcm5pbmcgLjc1cyBpbmZpbml0ZSBhbHRlcm5hdGU7YW5pbWF0aW9uOnB1bHNlV2FybmluZyAuNzVzIGluZmluaXRlIGFsdGVybmF0ZX0uc3dhbC1pY29uLS13YXJuaW5nX19ib2R5e3dpZHRoOjVweDtoZWlnaHQ6NDdweDt0b3A6MTBweDtib3JkZXItcmFkaXVzOjJweDttYXJnaW4tbGVmdDotMnB4fS5zd2FsLWljb24tLXdhcm5pbmdfX2JvZHksLnN3YWwtaWNvbi0td2FybmluZ19fZG90e3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NTAlO2JhY2tncm91bmQtY29sb3I6I2Y4YmI4Nn0uc3dhbC1pY29uLS13YXJuaW5nX19kb3R7d2lkdGg6N3B4O2hlaWdodDo3cHg7Ym9yZGVyLXJhZGl1czo1MCU7bWFyZ2luLWxlZnQ6LTRweDtib3R0b206LTExcHh9QC13ZWJraXQta2V5ZnJhbWVzIHB1bHNlV2FybmluZ3swJXtib3JkZXItY29sb3I6I2Y4ZDQ4Nn10b3tib3JkZXItY29sb3I6I2Y4YmI4Nn19QGtleWZyYW1lcyBwdWxzZVdhcm5pbmd7MCV7Ym9yZGVyLWNvbG9yOiNmOGQ0ODZ9dG97Ym9yZGVyLWNvbG9yOiNmOGJiODZ9fS5zd2FsLWljb24tLXN1Y2Nlc3N7Ym9yZGVyLWNvbG9yOiNhNWRjODZ9LnN3YWwtaWNvbi0tc3VjY2VzczphZnRlciwuc3dhbC1pY29uLS1zdWNjZXNzOmJlZm9yZXtjb250ZW50OiIiO2JvcmRlci1yYWRpdXM6NTAlO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjYwcHg7aGVpZ2h0OjEyMHB4O2JhY2tncm91bmQ6I2ZmZjstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5zd2FsLWljb24tLXN1Y2Nlc3M6YmVmb3Jle2JvcmRlci1yYWRpdXM6MTIwcHggMCAwIDEyMHB4O3RvcDotN3B4O2xlZnQ6LTMzcHg7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjo2MHB4IDYwcHg7dHJhbnNmb3JtLW9yaWdpbjo2MHB4IDYwcHh9LnN3YWwtaWNvbi0tc3VjY2VzczphZnRlcntib3JkZXItcmFkaXVzOjAgMTIwcHggMTIwcHggMDt0b3A6LTExcHg7bGVmdDozMHB4Oy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46MCA2MHB4O3RyYW5zZm9ybS1vcmlnaW46MCA2MHB4Oy13ZWJraXQtYW5pbWF0aW9uOnJvdGF0ZVBsYWNlaG9sZGVyIDQuMjVzIGVhc2UtaW47YW5pbWF0aW9uOnJvdGF0ZVBsYWNlaG9sZGVyIDQuMjVzIGVhc2UtaW59LnN3YWwtaWNvbi0tc3VjY2Vzc19fcmluZ3t3aWR0aDo4MHB4O2hlaWdodDo4MHB4O2JvcmRlcjo0cHggc29saWQgaHNsYSg5OCw1NSUsNjklLC4yKTtib3JkZXItcmFkaXVzOjUwJTtib3gtc2l6aW5nOmNvbnRlbnQtYm94O3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTRweDt0b3A6LTRweDt6LWluZGV4OjJ9LnN3YWwtaWNvbi0tc3VjY2Vzc19faGlkZS1jb3JuZXJze3dpZHRoOjVweDtoZWlnaHQ6OTBweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7cGFkZGluZzoxcHg7cG9zaXRpb246YWJzb2x1dGU7bGVmdDoyOHB4O3RvcDo4cHg7ei1pbmRleDoxOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0uc3dhbC1pY29uLS1zdWNjZXNzX19saW5le2hlaWdodDo1cHg7YmFja2dyb3VuZC1jb2xvcjojYTVkYzg2O2Rpc3BsYXk6YmxvY2s7Ym9yZGVyLXJhZGl1czoycHg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoyfS5zd2FsLWljb24tLXN1Y2Nlc3NfX2xpbmUtLXRpcHt3aWR0aDoyNXB4O2xlZnQ6MTRweDt0b3A6NDZweDstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpOy13ZWJraXQtYW5pbWF0aW9uOmFuaW1hdGVTdWNjZXNzVGlwIC43NXM7YW5pbWF0aW9uOmFuaW1hdGVTdWNjZXNzVGlwIC43NXN9LnN3YWwtaWNvbi0tc3VjY2Vzc19fbGluZS0tbG9uZ3t3aWR0aDo0N3B4O3JpZ2h0OjhweDt0b3A6MzhweDstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7LXdlYmtpdC1hbmltYXRpb246YW5pbWF0ZVN1Y2Nlc3NMb25nIC43NXM7YW5pbWF0aW9uOmFuaW1hdGVTdWNjZXNzTG9uZyAuNzVzfUAtd2Via2l0LWtleWZyYW1lcyByb3RhdGVQbGFjZWhvbGRlcnswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9NSV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTEyJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX19QGtleWZyYW1lcyByb3RhdGVQbGFjZWhvbGRlcnswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9NSV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfTEyJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDA1ZGVnKX19QC13ZWJraXQta2V5ZnJhbWVzIGFuaW1hdGVTdWNjZXNzVGlwezAle3dpZHRoOjA7bGVmdDoxcHg7dG9wOjE5cHh9NTQle3dpZHRoOjA7bGVmdDoxcHg7dG9wOjE5cHh9NzAle3dpZHRoOjUwcHg7bGVmdDotOHB4O3RvcDozN3B4fTg0JXt3aWR0aDoxN3B4O2xlZnQ6MjFweDt0b3A6NDhweH10b3t3aWR0aDoyNXB4O2xlZnQ6MTRweDt0b3A6NDVweH19QGtleWZyYW1lcyBhbmltYXRlU3VjY2Vzc1RpcHswJXt3aWR0aDowO2xlZnQ6MXB4O3RvcDoxOXB4fTU0JXt3aWR0aDowO2xlZnQ6MXB4O3RvcDoxOXB4fTcwJXt3aWR0aDo1MHB4O2xlZnQ6LThweDt0b3A6MzdweH04NCV7d2lkdGg6MTdweDtsZWZ0OjIxcHg7dG9wOjQ4cHh9dG97d2lkdGg6MjVweDtsZWZ0OjE0cHg7dG9wOjQ1cHh9fUAtd2Via2l0LWtleWZyYW1lcyBhbmltYXRlU3VjY2Vzc0xvbmd7MCV7d2lkdGg6MDtyaWdodDo0NnB4O3RvcDo1NHB4fTY1JXt3aWR0aDowO3JpZ2h0OjQ2cHg7dG9wOjU0cHh9ODQle3dpZHRoOjU1cHg7cmlnaHQ6MDt0b3A6MzVweH10b3t3aWR0aDo0N3B4O3JpZ2h0OjhweDt0b3A6MzhweH19QGtleWZyYW1lcyBhbmltYXRlU3VjY2Vzc0xvbmd7MCV7d2lkdGg6MDtyaWdodDo0NnB4O3RvcDo1NHB4fTY1JXt3aWR0aDowO3JpZ2h0OjQ2cHg7dG9wOjU0cHh9ODQle3dpZHRoOjU1cHg7cmlnaHQ6MDt0b3A6MzVweH10b3t3aWR0aDo0N3B4O3JpZ2h0OjhweDt0b3A6MzhweH19LnN3YWwtaWNvbi0taW5mb3tib3JkZXItY29sb3I6I2M5ZGFlMX0uc3dhbC1pY29uLS1pbmZvOmJlZm9yZXt3aWR0aDo1cHg7aGVpZ2h0OjI5cHg7Ym90dG9tOjE3cHg7Ym9yZGVyLXJhZGl1czoycHg7bWFyZ2luLWxlZnQ6LTJweH0uc3dhbC1pY29uLS1pbmZvOmFmdGVyLC5zd2FsLWljb24tLWluZm86YmVmb3Jle2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo1MCU7YmFja2dyb3VuZC1jb2xvcjojYzlkYWUxfS5zd2FsLWljb24tLWluZm86YWZ0ZXJ7d2lkdGg6N3B4O2hlaWdodDo3cHg7Ym9yZGVyLXJhZGl1czo1MCU7bWFyZ2luLWxlZnQ6LTNweDt0b3A6MTlweH0uc3dhbC1pY29ue3dpZHRoOjgwcHg7aGVpZ2h0OjgwcHg7Ym9yZGVyLXdpZHRoOjRweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXJhZGl1czo1MCU7cGFkZGluZzowO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Y29udGVudC1ib3g7bWFyZ2luOjIwcHggYXV0b30uc3dhbC1pY29uOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MzJweH0uc3dhbC1pY29uLS1jdXN0b217d2lkdGg6YXV0bztoZWlnaHQ6YXV0bzttYXgtd2lkdGg6MTAwJTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjB9LnN3YWwtaWNvbiBpbWd7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5zd2FsLXRpdGxle2NvbG9yOnJnYmEoMCwwLDAsLjY1KTtmb250LXdlaWdodDo2MDA7dGV4dC10cmFuc2Zvcm06bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MTNweCAxNnB4O2ZvbnQtc2l6ZToyN3B4O2xpbmUtaGVpZ2h0Om5vcm1hbDt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOjB9LnN3YWwtdGl0bGU6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDoyNnB4fS5zd2FsLXRpdGxlOm5vdCg6Zmlyc3QtY2hpbGQpe3BhZGRpbmctYm90dG9tOjB9LnN3YWwtdGl0bGU6bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tYm90dG9tOjEzcHh9LnN3YWwtdGV4dHtmb250LXNpemU6MTZweDtwb3NpdGlvbjpyZWxhdGl2ZTtmbG9hdDpub25lO2xpbmUtaGVpZ2h0Om5vcm1hbDt2ZXJ0aWNhbC1hbGlnbjp0b3A7dGV4dC1hbGlnbjpsZWZ0O2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjowO3BhZGRpbmc6MCAxMHB4O2ZvbnQtd2VpZ2h0OjQwMDtjb2xvcjpyZ2JhKDAsMCwwLC42NCk7bWF4LXdpZHRoOmNhbGMoMTAwJSAtIDIwcHgpO292ZXJmbG93LXdyYXA6YnJlYWstd29yZDtib3gtc2l6aW5nOmJvcmRlci1ib3h9LnN3YWwtdGV4dDpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjQ1cHh9LnN3YWwtdGV4dDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206NDVweH0uc3dhbC1mb290ZXJ7dGV4dC1hbGlnbjpyaWdodDtwYWRkaW5nLXRvcDoxM3B4O21hcmdpbi10b3A6MTNweDtwYWRkaW5nOjEzcHggMTZweDtib3JkZXItcmFkaXVzOmluaGVyaXQ7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjB9LnN3YWwtYnV0dG9uLWNvbnRhaW5lcnttYXJnaW46NXB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlfS5zd2FsLWJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiM3Y2QxZjk7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTtib3gtc2hhZG93Om5vbmU7Ym9yZGVyLXJhZGl1czo1cHg7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmc6MTBweCAyNHB4O21hcmdpbjowO2N1cnNvcjpwb2ludGVyfS5zd2FsLWJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNzhjYmYyfS5zd2FsLWJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojNzBiY2UwfS5zd2FsLWJ1dHRvbjpmb2N1c3tvdXRsaW5lOm5vbmU7Ym94LXNoYWRvdzowIDAgMCAxcHggI2ZmZiwwIDAgMCAzcHggcmdiYSg0MywxMTQsMTY1LC4yOSl9LnN3YWwtYnV0dG9uW2Rpc2FibGVkXXtvcGFjaXR5Oi41O2N1cnNvcjpkZWZhdWx0fS5zd2FsLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uc3dhbC1idXR0b24tLWNhbmNlbHtjb2xvcjojNTU1O2JhY2tncm91bmQtY29sb3I6I2VmZWZlZn0uc3dhbC1idXR0b24tLWNhbmNlbDpub3QoW2Rpc2FibGVkXSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZThlOGU4fS5zd2FsLWJ1dHRvbi0tY2FuY2VsOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNkN2Q3ZDd9LnN3YWwtYnV0dG9uLS1jYW5jZWw6Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAxcHggI2ZmZiwwIDAgMCAzcHggcmdiYSgxMTYsMTM2LDE1MCwuMjkpfS5zd2FsLWJ1dHRvbi0tZGFuZ2Vye2JhY2tncm91bmQtY29sb3I6I2U2NDk0Mn0uc3dhbC1idXR0b24tLWRhbmdlcjpub3QoW2Rpc2FibGVkXSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZGY0NzQwfS5zd2FsLWJ1dHRvbi0tZGFuZ2VyOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNjZjQyM2J9LnN3YWwtYnV0dG9uLS1kYW5nZXI6Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAxcHggI2ZmZiwwIDAgMCAzcHggcmdiYSgxNjUsNDMsNDMsLjI5KX0uc3dhbC1jb250ZW50e3BhZGRpbmc6MCAyMHB4O21hcmdpbi10b3A6MjBweDtmb250LXNpemU6bWVkaXVtfS5zd2FsLWNvbnRlbnQ6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjIwcHh9LnN3YWwtY29udGVudF9faW5wdXQsLnN3YWwtY29udGVudF9fdGV4dGFyZWF7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToxNHB4O2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xNCk7cGFkZGluZzoxMHB4IDEzcHg7Ym9yZGVyLXJhZGl1czoycHg7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjJzfS5zd2FsLWNvbnRlbnRfX2lucHV0OmZvY3VzLC5zd2FsLWNvbnRlbnRfX3RleHRhcmVhOmZvY3Vze291dGxpbmU6bm9uZTtib3JkZXItY29sb3I6IzZkYjhmZn0uc3dhbC1jb250ZW50X190ZXh0YXJlYXtyZXNpemU6dmVydGljYWx9LnN3YWwtYnV0dG9uLS1sb2FkaW5ne2NvbG9yOnRyYW5zcGFyZW50fS5zd2FsLWJ1dHRvbi0tbG9hZGluZ34uc3dhbC1idXR0b25fX2xvYWRlcntvcGFjaXR5OjF9LnN3YWwtYnV0dG9uX19sb2FkZXJ7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OmF1dG87d2lkdGg6NDNweDt6LWluZGV4OjI7bGVmdDo1MCU7dG9wOjUwJTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKTt0ZXh0LWFsaWduOmNlbnRlcjtwb2ludGVyLWV2ZW50czpub25lO29wYWNpdHk6MH0uc3dhbC1idXR0b25fX2xvYWRlciBkaXZ7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxvYXQ6bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aWR0aDo5cHg7aGVpZ2h0OjlweDtwYWRkaW5nOjA7Ym9yZGVyOm5vbmU7bWFyZ2luOjJweDtvcGFjaXR5Oi40O2JvcmRlci1yYWRpdXM6N3B4O2JhY2tncm91bmQtY29sb3I6aHNsYSgwLDAlLDEwMCUsLjkpO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMnM7LXdlYmtpdC1hbmltYXRpb246c3dhbC1sb2FkaW5nLWFuaW0gMXMgaW5maW5pdGU7YW5pbWF0aW9uOnN3YWwtbG9hZGluZy1hbmltIDFzIGluZmluaXRlfS5zd2FsLWJ1dHRvbl9fbG9hZGVyIGRpdjpudGgtY2hpbGQoM24rMil7LXdlYmtpdC1hbmltYXRpb24tZGVsYXk6LjE1czthbmltYXRpb24tZGVsYXk6LjE1c30uc3dhbC1idXR0b25fX2xvYWRlciBkaXY6bnRoLWNoaWxkKDNuKzMpey13ZWJraXQtYW5pbWF0aW9uLWRlbGF5Oi4zczthbmltYXRpb24tZGVsYXk6LjNzfUAtd2Via2l0LWtleWZyYW1lcyBzd2FsLWxvYWRpbmctYW5pbXswJXtvcGFjaXR5Oi40fTIwJXtvcGFjaXR5Oi40fTUwJXtvcGFjaXR5OjF9dG97b3BhY2l0eTouNH19QGtleWZyYW1lcyBzd2FsLWxvYWRpbmctYW5pbXswJXtvcGFjaXR5Oi40fTIwJXtvcGFjaXR5Oi40fTUwJXtvcGFjaXR5OjF9dG97b3BhY2l0eTouNH19LnN3YWwtb3ZlcmxheXtwb3NpdGlvbjpmaXhlZDt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MDtvdmVyZmxvdy15OmF1dG87YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40KTt6LWluZGV4OjEwMDAwO3BvaW50ZXItZXZlbnRzOm5vbmU7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAuM3N9LnN3YWwtb3ZlcmxheTpiZWZvcmV7Y29udGVudDoiICI7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO2hlaWdodDoxMDAlfS5zd2FsLW92ZXJsYXktLXNob3ctbW9kYWx7b3BhY2l0eToxO3BvaW50ZXItZXZlbnRzOmF1dG99LnN3YWwtb3ZlcmxheS0tc2hvdy1tb2RhbCAuc3dhbC1tb2RhbHtvcGFjaXR5OjE7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1hbmltYXRpb246c2hvd1N3ZWV0QWxlcnQgLjNzO2FuaW1hdGlvbjpzaG93U3dlZXRBbGVydCAuM3M7d2lsbC1jaGFuZ2U6dHJhbnNmb3JtfS5zd2FsLW1vZGFse3dpZHRoOjQ3OHB4O29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lO2JhY2tncm91bmQtY29sb3I6I2ZmZjt0ZXh0LWFsaWduOmNlbnRlcjtib3JkZXItcmFkaXVzOjVweDtwb3NpdGlvbjpzdGF0aWM7bWFyZ2luOjIwcHggYXV0bztkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjo1MCUgNTAlO3RyYW5zZm9ybS1vcmlnaW46NTAlIDUwJTt6LWluZGV4OjEwMDAxO3RyYW5zaXRpb246b3BhY2l0eSAuMnMsLXdlYmtpdC10cmFuc2Zvcm0gLjNzO3RyYW5zaXRpb246dHJhbnNmb3JtIC4zcyxvcGFjaXR5IC4yczt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuM3Msb3BhY2l0eSAuMnMsLXdlYmtpdC10cmFuc2Zvcm0gLjNzfUBtZWRpYSAobWF4LXdpZHRoOjUwMHB4KXsuc3dhbC1tb2RhbHt3aWR0aDpjYWxjKDEwMCUgLSAyMHB4KX19QC13ZWJraXQta2V5ZnJhbWVzIHNob3dTd2VldEFsZXJ0ezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX0xJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguNSk7dHJhbnNmb3JtOnNjYWxlKC41KX00NSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4wNSk7dHJhbnNmb3JtOnNjYWxlKDEuMDUpfTgwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguOTUpO3RyYW5zZm9ybTpzY2FsZSguOTUpfXRvey13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX19QGtleWZyYW1lcyBzaG93U3dlZXRBbGVydHswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9MSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjUpO3RyYW5zZm9ybTpzY2FsZSguNSl9NDUley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEuMDUpO3RyYW5zZm9ybTpzY2FsZSgxLjA1KX04MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjk1KTt0cmFuc2Zvcm06c2NhbGUoLjk1KX10b3std2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9fScsIiJdKX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKHQsZSl7dmFyIG49dFsxXXx8IiIscj10WzNdO2lmKCFyKXJldHVybiBuO2lmKGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBidG9hKXt2YXIgaT1vKHIpO3JldHVybltuXS5jb25jYXQoci5zb3VyY2VzLm1hcChmdW5jdGlvbih0KXtyZXR1cm4iLyojIHNvdXJjZVVSTD0iK3Iuc291cmNlUm9vdCt0KyIgKi8ifSkpLmNvbmNhdChbaV0pLmpvaW4oIlxuIil9cmV0dXJuW25dLmpvaW4oIlxuIil9ZnVuY3Rpb24gbyh0KXtyZXR1cm4iLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LCIrYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkodCkpKSkrIiAqLyJ9dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKGUpe3ZhciBvPW4oZSx0KTtyZXR1cm4gZVsyXT8iQG1lZGlhICIrZVsyXSsieyIrbysifSI6b30pLmpvaW4oIiIpfSxlLmk9ZnVuY3Rpb24odCxuKXsic3RyaW5nIj09dHlwZW9mIHQmJih0PVtbbnVsbCx0LCIiXV0pO2Zvcih2YXIgbz17fSxyPTA7cjx0aGlzLmxlbmd0aDtyKyspe3ZhciBpPXRoaXNbcl1bMF07Im51bWJlciI9PXR5cGVvZiBpJiYob1tpXT0hMCl9Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE9dFtyXTsibnVtYmVyIj09dHlwZW9mIGFbMF0mJm9bYVswXV18fChuJiYhYVsyXT9hWzJdPW46biYmKGFbMl09IigiK2FbMl0rIikgYW5kICgiK24rIikiKSxlLnB1c2goYSkpfX0sZX19LGZ1bmN0aW9uKHQsZSxuKXtmdW5jdGlvbiBvKHQsZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBvPXRbbl0scj1tW28uaWRdO2lmKHIpe3IucmVmcysrO2Zvcih2YXIgaT0wO2k8ci5wYXJ0cy5sZW5ndGg7aSsrKXIucGFydHNbaV0oby5wYXJ0c1tpXSk7Zm9yKDtpPG8ucGFydHMubGVuZ3RoO2krKylyLnBhcnRzLnB1c2godShvLnBhcnRzW2ldLGUpKX1lbHNle2Zvcih2YXIgYT1bXSxpPTA7aTxvLnBhcnRzLmxlbmd0aDtpKyspYS5wdXNoKHUoby5wYXJ0c1tpXSxlKSk7bVtvLmlkXT17aWQ6by5pZCxyZWZzOjEscGFydHM6YX19fX1mdW5jdGlvbiByKHQsZSl7Zm9yKHZhciBuPVtdLG89e30scj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgaT10W3JdLGE9ZS5iYXNlP2lbMF0rZS5iYXNlOmlbMF0scz1pWzFdLGM9aVsyXSxsPWlbM10sdT17Y3NzOnMsbWVkaWE6Yyxzb3VyY2VNYXA6bH07b1thXT9vW2FdLnBhcnRzLnB1c2godSk6bi5wdXNoKG9bYV09e2lkOmEscGFydHM6W3VdfSl9cmV0dXJuIG59ZnVuY3Rpb24gaSh0LGUpe3ZhciBuPXYodC5pbnNlcnRJbnRvKTtpZighbil0aHJvdyBuZXcgRXJyb3IoIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0SW50bycgcGFyYW1ldGVyIGlzIGludmFsaWQuIik7dmFyIG89d1t3Lmxlbmd0aC0xXTtpZigidG9wIj09PXQuaW5zZXJ0QXQpbz9vLm5leHRTaWJsaW5nP24uaW5zZXJ0QmVmb3JlKGUsby5uZXh0U2libGluZyk6bi5hcHBlbmRDaGlsZChlKTpuLmluc2VydEJlZm9yZShlLG4uZmlyc3RDaGlsZCksdy5wdXNoKGUpO2Vsc2V7aWYoImJvdHRvbSIhPT10Lmluc2VydEF0KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyICdpbnNlcnRBdCcuIE11c3QgYmUgJ3RvcCcgb3IgJ2JvdHRvbScuIik7bi5hcHBlbmRDaGlsZChlKX19ZnVuY3Rpb24gYSh0KXtpZihudWxsPT09dC5wYXJlbnROb2RlKXJldHVybiExO3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KTt2YXIgZT13LmluZGV4T2YodCk7ZT49MCYmdy5zcGxpY2UoZSwxKX1mdW5jdGlvbiBzKHQpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7cmV0dXJuIHQuYXR0cnMudHlwZT0idGV4dC9jc3MiLGwoZSx0LmF0dHJzKSxpKHQsZSksZX1mdW5jdGlvbiBjKHQpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTtyZXR1cm4gdC5hdHRycy50eXBlPSJ0ZXh0L2NzcyIsdC5hdHRycy5yZWw9InN0eWxlc2hlZXQiLGwoZSx0LmF0dHJzKSxpKHQsZSksZX1mdW5jdGlvbiBsKHQsZSl7T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbihuKXt0LnNldEF0dHJpYnV0ZShuLGVbbl0pfSl9ZnVuY3Rpb24gdSh0LGUpe3ZhciBuLG8scixpO2lmKGUudHJhbnNmb3JtJiZ0LmNzcyl7aWYoIShpPWUudHJhbnNmb3JtKHQuY3NzKSkpcmV0dXJuIGZ1bmN0aW9uKCl7fTt0LmNzcz1pfWlmKGUuc2luZ2xldG9uKXt2YXIgbD1oKys7bj1nfHwoZz1zKGUpKSxvPWYuYmluZChudWxsLG4sbCwhMSkscj1mLmJpbmQobnVsbCxuLGwsITApfWVsc2UgdC5zb3VyY2VNYXAmJiJmdW5jdGlvbiI9PXR5cGVvZiBVUkwmJiJmdW5jdGlvbiI9PXR5cGVvZiBVUkwuY3JlYXRlT2JqZWN0VVJMJiYiZnVuY3Rpb24iPT10eXBlb2YgVVJMLnJldm9rZU9iamVjdFVSTCYmImZ1bmN0aW9uIj09dHlwZW9mIEJsb2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBidG9hPyhuPWMoZSksbz1wLmJpbmQobnVsbCxuLGUpLHI9ZnVuY3Rpb24oKXthKG4pLG4uaHJlZiYmVVJMLnJldm9rZU9iamVjdFVSTChuLmhyZWYpfSk6KG49cyhlKSxvPWQuYmluZChudWxsLG4pLHI9ZnVuY3Rpb24oKXthKG4pfSk7cmV0dXJuIG8odCksZnVuY3Rpb24oZSl7aWYoZSl7aWYoZS5jc3M9PT10LmNzcyYmZS5tZWRpYT09PXQubWVkaWEmJmUuc291cmNlTWFwPT09dC5zb3VyY2VNYXApcmV0dXJuO28odD1lKX1lbHNlIHIoKX19ZnVuY3Rpb24gZih0LGUsbixvKXt2YXIgcj1uPyIiOm8uY3NzO2lmKHQuc3R5bGVTaGVldCl0LnN0eWxlU2hlZXQuY3NzVGV4dD14KGUscik7ZWxzZXt2YXIgaT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShyKSxhPXQuY2hpbGROb2RlczthW2VdJiZ0LnJlbW92ZUNoaWxkKGFbZV0pLGEubGVuZ3RoP3QuaW5zZXJ0QmVmb3JlKGksYVtlXSk6dC5hcHBlbmRDaGlsZChpKX19ZnVuY3Rpb24gZCh0LGUpe3ZhciBuPWUuY3NzLG89ZS5tZWRpYTtpZihvJiZ0LnNldEF0dHJpYnV0ZSgibWVkaWEiLG8pLHQuc3R5bGVTaGVldCl0LnN0eWxlU2hlZXQuY3NzVGV4dD1uO2Vsc2V7Zm9yKDt0LmZpcnN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5maXJzdENoaWxkKTt0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pKX19ZnVuY3Rpb24gcCh0LGUsbil7dmFyIG89bi5jc3Mscj1uLnNvdXJjZU1hcCxpPXZvaWQgMD09PWUuY29udmVydFRvQWJzb2x1dGVVcmxzJiZyOyhlLmNvbnZlcnRUb0Fic29sdXRlVXJsc3x8aSkmJihvPXkobykpLHImJihvKz0iXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LCIrYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkocikpKSkrIiAqLyIpO3ZhciBhPW5ldyBCbG9iKFtvXSx7dHlwZToidGV4dC9jc3MifSkscz10LmhyZWY7dC5ocmVmPVVSTC5jcmVhdGVPYmplY3RVUkwoYSkscyYmVVJMLnJldm9rZU9iamVjdFVSTChzKX12YXIgbT17fSxiPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSksZX19KGZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdyYmZG9jdW1lbnQmJmRvY3VtZW50LmFsbCYmIXdpbmRvdy5hdG9ifSksdj1mdW5jdGlvbih0KXt2YXIgZT17fTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHZvaWQgMD09PWVbbl0mJihlW25dPXQuY2FsbCh0aGlzLG4pKSxlW25dfX0oZnVuY3Rpb24odCl7cmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCl9KSxnPW51bGwsaD0wLHc9W10seT1uKDE1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIERFQlVHJiZERUJVRyYmIm9iamVjdCIhPXR5cGVvZiBkb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBzdHlsZS1sb2FkZXIgY2Fubm90IGJlIHVzZWQgaW4gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudCIpO2U9ZXx8e30sZS5hdHRycz0ib2JqZWN0Ij09dHlwZW9mIGUuYXR0cnM/ZS5hdHRyczp7fSxlLnNpbmdsZXRvbnx8KGUuc2luZ2xldG9uPWIoKSksZS5pbnNlcnRJbnRvfHwoZS5pbnNlcnRJbnRvPSJoZWFkIiksZS5pbnNlcnRBdHx8KGUuaW5zZXJ0QXQ9ImJvdHRvbSIpO3ZhciBuPXIodCxlKTtyZXR1cm4gbyhuLGUpLGZ1bmN0aW9uKHQpe2Zvcih2YXIgaT1bXSxhPTA7YTxuLmxlbmd0aDthKyspe3ZhciBzPW5bYV0sYz1tW3MuaWRdO2MucmVmcy0tLGkucHVzaChjKX1pZih0KXtvKHIodCxlKSxlKX1mb3IodmFyIGE9MDthPGkubGVuZ3RoO2ErKyl7dmFyIGM9aVthXTtpZigwPT09Yy5yZWZzKXtmb3IodmFyIGw9MDtsPGMucGFydHMubGVuZ3RoO2wrKyljLnBhcnRzW2xdKCk7ZGVsZXRlIG1bYy5pZF19fX19O3ZhciB4PWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIHRbZV09bix0LmZpbHRlcihCb29sZWFuKS5qb2luKCJcbiIpfX0oKX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5sb2NhdGlvbjtpZighZSl0aHJvdyBuZXcgRXJyb3IoImZpeFVybHMgcmVxdWlyZXMgd2luZG93LmxvY2F0aW9uIik7aWYoIXR8fCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gdDt2YXIgbj1lLnByb3RvY29sKyIvLyIrZS5ob3N0LG89bitlLnBhdGhuYW1lLnJlcGxhY2UoL1wvW15cL10qJC8sIi8iKTtyZXR1cm4gdC5yZXBsYWNlKC91cmxccypcKCgoPzpbXikoXXxcKCg/OlteKShdK3xcKFteKShdKlwpKSpcKSkqKVwpL2dpLGZ1bmN0aW9uKHQsZSl7dmFyIHI9ZS50cmltKCkucmVwbGFjZSgvXiIoLiopIiQvLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9KS5yZXBsYWNlKC9eJyguKiknJC8sZnVuY3Rpb24odCxlKXtyZXR1cm4gZX0pO2lmKC9eKCN8ZGF0YTp8aHR0cDpcL1wvfGh0dHBzOlwvXC98ZmlsZTpcL1wvXC8pL2kudGVzdChyKSlyZXR1cm4gdDt2YXIgaTtyZXR1cm4gaT0wPT09ci5pbmRleE9mKCIvLyIpP3I6MD09PXIuaW5kZXhPZigiLyIpP24rcjpvK3IucmVwbGFjZSgvXlwuXC8vLCIiKSwidXJsKCIrSlNPTi5zdHJpbmdpZnkoaSkrIikifSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIG89bigxNyk7InVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fHdpbmRvdy5Qcm9taXNlfHwod2luZG93LlByb21pc2U9byksbigyMSksU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlc3x8KFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCxlKXsidXNlIHN0cmljdCI7cmV0dXJuIm51bWJlciIhPXR5cGVvZiBlJiYoZT0wKSwhKGUrdC5sZW5ndGg+dGhpcy5sZW5ndGgpJiYtMSE9PXRoaXMuaW5kZXhPZih0LGUpfSksQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCJpbmNsdWRlcyIse3ZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dGhpcyl0aHJvdyBuZXcgVHlwZUVycm9yKCcidGhpcyIgaXMgbnVsbCBvciBub3QgZGVmaW5lZCcpO3ZhciBuPU9iamVjdCh0aGlzKSxvPW4ubGVuZ3RoPj4+MDtpZigwPT09bylyZXR1cm4hMTtmb3IodmFyIHI9MHxlLGk9TWF0aC5tYXgocj49MD9yOm8tTWF0aC5hYnMociksMCk7aTxvOyl7aWYoZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fCJudW1iZXIiPT10eXBlb2YgdCYmIm51bWJlciI9PXR5cGVvZiBlJiZpc05hTih0KSYmaXNOYU4oZSl9KG5baV0sdCkpcmV0dXJuITA7aSsrfXJldHVybiExfX0pLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZmdW5jdGlvbih0KXt0LmZvckVhY2goZnVuY3Rpb24odCl7dC5oYXNPd25Qcm9wZXJ0eSgicmVtb3ZlIil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJyZW1vdmUiLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3RoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX19KX0pfShbRWxlbWVudC5wcm90b3R5cGUsQ2hhcmFjdGVyRGF0YS5wcm90b3R5cGUsRG9jdW1lbnRUeXBlLnByb3RvdHlwZV0pfSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpeyFmdW5jdGlvbihuKXtmdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIHIodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0LmFwcGx5KGUsYXJndW1lbnRzKX19ZnVuY3Rpb24gaSh0KXtpZigib2JqZWN0IiE9dHlwZW9mIHRoaXMpdGhyb3cgbmV3IFR5cGVFcnJvcigiUHJvbWlzZXMgbXVzdCBiZSBjb25zdHJ1Y3RlZCB2aWEgbmV3Iik7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigibm90IGEgZnVuY3Rpb24iKTt0aGlzLl9zdGF0ZT0wLHRoaXMuX2hhbmRsZWQ9ITEsdGhpcy5fdmFsdWU9dm9pZCAwLHRoaXMuX2RlZmVycmVkcz1bXSxmKHQsdGhpcyl9ZnVuY3Rpb24gYSh0LGUpe2Zvcig7Mz09PXQuX3N0YXRlOyl0PXQuX3ZhbHVlO2lmKDA9PT10Ll9zdGF0ZSlyZXR1cm4gdm9pZCB0Ll9kZWZlcnJlZHMucHVzaChlKTt0Ll9oYW5kbGVkPSEwLGkuX2ltbWVkaWF0ZUZuKGZ1bmN0aW9uKCl7dmFyIG49MT09PXQuX3N0YXRlP2Uub25GdWxmaWxsZWQ6ZS5vblJlamVjdGVkO2lmKG51bGw9PT1uKXJldHVybiB2b2lkKDE9PT10Ll9zdGF0ZT9zOmMpKGUucHJvbWlzZSx0Ll92YWx1ZSk7dmFyIG87dHJ5e289bih0Ll92YWx1ZSl9Y2F0Y2godCl7cmV0dXJuIHZvaWQgYyhlLnByb21pc2UsdCl9cyhlLnByb21pc2Usbyl9KX1mdW5jdGlvbiBzKHQsZSl7dHJ5e2lmKGU9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkEgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuIik7aWYoZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpKXt2YXIgbj1lLnRoZW47aWYoZSBpbnN0YW5jZW9mIGkpcmV0dXJuIHQuX3N0YXRlPTMsdC5fdmFsdWU9ZSx2b2lkIGwodCk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pcmV0dXJuIHZvaWQgZihyKG4sZSksdCl9dC5fc3RhdGU9MSx0Ll92YWx1ZT1lLGwodCl9Y2F0Y2goZSl7Yyh0LGUpfX1mdW5jdGlvbiBjKHQsZSl7dC5fc3RhdGU9Mix0Ll92YWx1ZT1lLGwodCl9ZnVuY3Rpb24gbCh0KXsyPT09dC5fc3RhdGUmJjA9PT10Ll9kZWZlcnJlZHMubGVuZ3RoJiZpLl9pbW1lZGlhdGVGbihmdW5jdGlvbigpe3QuX2hhbmRsZWR8fGkuX3VuaGFuZGxlZFJlamVjdGlvbkZuKHQuX3ZhbHVlKX0pO2Zvcih2YXIgZT0wLG49dC5fZGVmZXJyZWRzLmxlbmd0aDtlPG47ZSsrKWEodCx0Ll9kZWZlcnJlZHNbZV0pO3QuX2RlZmVycmVkcz1udWxsfWZ1bmN0aW9uIHUodCxlLG4pe3RoaXMub25GdWxmaWxsZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpudWxsLHRoaXMub25SZWplY3RlZD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm51bGwsdGhpcy5wcm9taXNlPW59ZnVuY3Rpb24gZih0LGUpe3ZhciBuPSExO3RyeXt0KGZ1bmN0aW9uKHQpe258fChuPSEwLHMoZSx0KSl9LGZ1bmN0aW9uKHQpe258fChuPSEwLGMoZSx0KSl9KX1jYXRjaCh0KXtpZihuKXJldHVybjtuPSEwLGMoZSx0KX19dmFyIGQ9c2V0VGltZW91dDtpLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKG51bGwsdCl9LGkucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihvKTtyZXR1cm4gYSh0aGlzLG5ldyB1KHQsZSxuKSksbn0saS5hbGw9ZnVuY3Rpb24odCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCk7cmV0dXJuIG5ldyBpKGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gbyhpLGEpe3RyeXtpZihhJiYoIm9iamVjdCI9PXR5cGVvZiBhfHwiZnVuY3Rpb24iPT10eXBlb2YgYSkpe3ZhciBzPWEudGhlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgcylyZXR1cm4gdm9pZCBzLmNhbGwoYSxmdW5jdGlvbih0KXtvKGksdCl9LG4pfWVbaV09YSwwPT0tLXImJnQoZSl9Y2F0Y2godCl7bih0KX19aWYoMD09PWUubGVuZ3RoKXJldHVybiB0KFtdKTtmb3IodmFyIHI9ZS5sZW5ndGgsaT0wO2k8ZS5sZW5ndGg7aSsrKW8oaSxlW2ldKX0pfSxpLnJlc29sdmU9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdCYmdC5jb25zdHJ1Y3Rvcj09PWk/dDpuZXcgaShmdW5jdGlvbihlKXtlKHQpfSl9LGkucmVqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaShmdW5jdGlvbihlLG4pe24odCl9KX0saS5yYWNlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaShmdW5jdGlvbihlLG4pe2Zvcih2YXIgbz0wLHI9dC5sZW5ndGg7bzxyO28rKyl0W29dLnRoZW4oZSxuKX0pfSxpLl9pbW1lZGlhdGVGbj0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZnVuY3Rpb24odCl7ZSh0KX18fGZ1bmN0aW9uKHQpe2QodCwwKX0saS5fdW5oYW5kbGVkUmVqZWN0aW9uRm49ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBjb25zb2xlJiZjb25zb2xlJiZjb25zb2xlLndhcm4oIlBvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjoiLHQpfSxpLl9zZXRJbW1lZGlhdGVGbj1mdW5jdGlvbih0KXtpLl9pbW1lZGlhdGVGbj10fSxpLl9zZXRVbmhhbmRsZWRSZWplY3Rpb25Gbj1mdW5jdGlvbih0KXtpLl91bmhhbmRsZWRSZWplY3Rpb25Gbj10fSx2b2lkIDAhPT10JiZ0LmV4cG9ydHM/dC5leHBvcnRzPWk6bi5Qcm9taXNlfHwobi5Qcm9taXNlPWkpfSh0aGlzKX0pLmNhbGwoZSxuKDE4KS5zZXRJbW1lZGlhdGUpfSxmdW5jdGlvbih0LGUsbil7ZnVuY3Rpb24gbyh0LGUpe3RoaXMuX2lkPXQsdGhpcy5fY2xlYXJGbj1lfXZhciByPUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtlLnNldFRpbWVvdXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG8oci5jYWxsKHNldFRpbWVvdXQsd2luZG93LGFyZ3VtZW50cyksY2xlYXJUaW1lb3V0KX0sZS5zZXRJbnRlcnZhbD1mdW5jdGlvbigpe3JldHVybiBuZXcgbyhyLmNhbGwoc2V0SW50ZXJ2YWwsd2luZG93LGFyZ3VtZW50cyksY2xlYXJJbnRlcnZhbCl9LGUuY2xlYXJUaW1lb3V0PWUuY2xlYXJJbnRlcnZhbD1mdW5jdGlvbih0KXt0JiZ0LmNsb3NlKCl9LG8ucHJvdG90eXBlLnVucmVmPW8ucHJvdG90eXBlLnJlZj1mdW5jdGlvbigpe30sby5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckZuLmNhbGwod2luZG93LHRoaXMuX2lkKX0sZS5lbnJvbGw9ZnVuY3Rpb24odCxlKXtjbGVhclRpbWVvdXQodC5faWRsZVRpbWVvdXRJZCksdC5faWRsZVRpbWVvdXQ9ZX0sZS51bmVucm9sbD1mdW5jdGlvbih0KXtjbGVhclRpbWVvdXQodC5faWRsZVRpbWVvdXRJZCksdC5faWRsZVRpbWVvdXQ9LTF9LGUuX3VucmVmQWN0aXZlPWUuYWN0aXZlPWZ1bmN0aW9uKHQpe2NsZWFyVGltZW91dCh0Ll9pZGxlVGltZW91dElkKTt2YXIgZT10Ll9pZGxlVGltZW91dDtlPj0wJiYodC5faWRsZVRpbWVvdXRJZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5fb25UaW1lb3V0JiZ0Ll9vblRpbWVvdXQoKX0sZSkpfSxuKDE5KSxlLnNldEltbWVkaWF0ZT1zZXRJbW1lZGlhdGUsZS5jbGVhckltbWVkaWF0ZT1jbGVhckltbWVkaWF0ZX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbih0LGUpeyFmdW5jdGlvbih0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1uZXcgRnVuY3Rpb24oIiIrdCkpO2Zvcih2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXT1hcmd1bWVudHNbbisxXTt2YXIgbz17Y2FsbGJhY2s6dCxhcmdzOmV9O3JldHVybiBsW2NdPW8scyhjKSxjKyt9ZnVuY3Rpb24gcih0KXtkZWxldGUgbFt0XX1mdW5jdGlvbiBpKHQpe3ZhciBlPXQuY2FsbGJhY2ssbz10LmFyZ3M7c3dpdGNoKG8ubGVuZ3RoKXtjYXNlIDA6ZSgpO2JyZWFrO2Nhc2UgMTplKG9bMF0pO2JyZWFrO2Nhc2UgMjplKG9bMF0sb1sxXSk7YnJlYWs7Y2FzZSAzOmUob1swXSxvWzFdLG9bMl0pO2JyZWFrO2RlZmF1bHQ6ZS5hcHBseShuLG8pfX1mdW5jdGlvbiBhKHQpe2lmKHUpc2V0VGltZW91dChhLDAsdCk7ZWxzZXt2YXIgZT1sW3RdO2lmKGUpe3U9ITA7dHJ5e2koZSl9ZmluYWxseXtyKHQpLHU9ITF9fX19aWYoIXQuc2V0SW1tZWRpYXRlKXt2YXIgcyxjPTEsbD17fSx1PSExLGY9dC5kb2N1bWVudCxkPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO2Q9ZCYmZC5zZXRUaW1lb3V0P2Q6dCwiW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKHQucHJvY2Vzcyk/ZnVuY3Rpb24oKXtzPWZ1bmN0aW9uKHQpe2UubmV4dFRpY2soZnVuY3Rpb24oKXthKHQpfSl9fSgpOmZ1bmN0aW9uKCl7aWYodC5wb3N0TWVzc2FnZSYmIXQuaW1wb3J0U2NyaXB0cyl7dmFyIGU9ITAsbj10Lm9ubWVzc2FnZTtyZXR1cm4gdC5vbm1lc3NhZ2U9ZnVuY3Rpb24oKXtlPSExfSx0LnBvc3RNZXNzYWdlKCIiLCIqIiksdC5vbm1lc3NhZ2U9bixlfX0oKT9mdW5jdGlvbigpe3ZhciBlPSJzZXRJbW1lZGlhdGUkIitNYXRoLnJhbmRvbSgpKyIkIixuPWZ1bmN0aW9uKG4pe24uc291cmNlPT09dCYmInN0cmluZyI9PXR5cGVvZiBuLmRhdGEmJjA9PT1uLmRhdGEuaW5kZXhPZihlKSYmYSgrbi5kYXRhLnNsaWNlKGUubGVuZ3RoKSl9O3QuYWRkRXZlbnRMaXN0ZW5lcj90LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4sITEpOnQuYXR0YWNoRXZlbnQoIm9ubWVzc2FnZSIsbikscz1mdW5jdGlvbihuKXt0LnBvc3RNZXNzYWdlKGUrbiwiKiIpfX0oKTp0Lk1lc3NhZ2VDaGFubmVsP2Z1bmN0aW9uKCl7dmFyIHQ9bmV3IE1lc3NhZ2VDaGFubmVsO3QucG9ydDEub25tZXNzYWdlPWZ1bmN0aW9uKHQpe2EodC5kYXRhKX0scz1mdW5jdGlvbihlKXt0LnBvcnQyLnBvc3RNZXNzYWdlKGUpfX0oKTpmJiYib25yZWFkeXN0YXRlY2hhbmdlImluIGYuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik/ZnVuY3Rpb24oKXt2YXIgdD1mLmRvY3VtZW50RWxlbWVudDtzPWZ1bmN0aW9uKGUpe3ZhciBuPWYuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXthKGUpLG4ub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsdC5yZW1vdmVDaGlsZChuKSxuPW51bGx9LHQuYXBwZW5kQ2hpbGQobil9fSgpOmZ1bmN0aW9uKCl7cz1mdW5jdGlvbih0KXtzZXRUaW1lb3V0KGEsMCx0KX19KCksZC5zZXRJbW1lZGlhdGU9byxkLmNsZWFySW1tZWRpYXRlPXJ9fSgidW5kZWZpbmVkIj09dHlwZW9mIHNlbGY/dm9pZCAwPT09dD90aGlzOnQ6c2VsZil9KS5jYWxsKGUsbig3KSxuKDIwKSl9LGZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gbigpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIG8oKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIHIodCl7aWYodT09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQodCwwKTtpZigodT09PW58fCF1KSYmc2V0VGltZW91dClyZXR1cm4gdT1zZXRUaW1lb3V0LHNldFRpbWVvdXQodCwwKTt0cnl7cmV0dXJuIHUodCwwKX1jYXRjaChlKXt0cnl7cmV0dXJuIHUuY2FsbChudWxsLHQsMCl9Y2F0Y2goZSl7cmV0dXJuIHUuY2FsbCh0aGlzLHQsMCl9fX1mdW5jdGlvbiBpKHQpe2lmKGY9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dCh0KTtpZigoZj09PW98fCFmKSYmY2xlYXJUaW1lb3V0KXJldHVybiBmPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQodCk7dHJ5e3JldHVybiBmKHQpfWNhdGNoKGUpe3RyeXtyZXR1cm4gZi5jYWxsKG51bGwsdCl9Y2F0Y2goZSl7cmV0dXJuIGYuY2FsbCh0aGlzLHQpfX19ZnVuY3Rpb24gYSgpe2ImJnAmJihiPSExLHAubGVuZ3RoP209cC5jb25jYXQobSk6dj0tMSxtLmxlbmd0aCYmcygpKX1mdW5jdGlvbiBzKCl7aWYoIWIpe3ZhciB0PXIoYSk7Yj0hMDtmb3IodmFyIGU9bS5sZW5ndGg7ZTspe2ZvcihwPW0sbT1bXTsrK3Y8ZTspcCYmcFt2XS5ydW4oKTt2PS0xLGU9bS5sZW5ndGh9cD1udWxsLGI9ITEsaSh0KX19ZnVuY3Rpb24gYyh0LGUpe3RoaXMuZnVuPXQsdGhpcy5hcnJheT1lfWZ1bmN0aW9uIGwoKXt9dmFyIHUsZixkPXQuZXhwb3J0cz17fTshZnVuY3Rpb24oKXt0cnl7dT0iZnVuY3Rpb24iPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0Om59Y2F0Y2godCl7dT1ufXRyeXtmPSJmdW5jdGlvbiI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0Om99Y2F0Y2godCl7Zj1vfX0oKTt2YXIgcCxtPVtdLGI9ITEsdj0tMTtkLm5leHRUaWNrPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbi0xXT1hcmd1bWVudHNbbl07bS5wdXNoKG5ldyBjKHQsZSkpLDEhPT1tLmxlbmd0aHx8Ynx8cihzKX0sYy5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sZC50aXRsZT0iYnJvd3NlciIsZC5icm93c2VyPSEwLGQuZW52PXt9LGQuYXJndj1bXSxkLnZlcnNpb249IiIsZC52ZXJzaW9ucz17fSxkLm9uPWwsZC5hZGRMaXN0ZW5lcj1sLGQub25jZT1sLGQub2ZmPWwsZC5yZW1vdmVMaXN0ZW5lcj1sLGQucmVtb3ZlQWxsTGlzdGVuZXJzPWwsZC5lbWl0PWwsZC5wcmVwZW5kTGlzdGVuZXI9bCxkLnByZXBlbmRPbmNlTGlzdGVuZXI9bCxkLmxpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm5bXX0sZC5iaW5kaW5nPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sZC5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGQuY2hkaXI9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0sZC51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuKDIyKS5wb2x5ZmlsbCgpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8odCxlKXtpZih2b2lkIDA9PT10fHxudWxsPT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCBmaXJzdCBhcmd1bWVudCB0byBvYmplY3QiKTtmb3IodmFyIG49T2JqZWN0KHQpLG89MTtvPGFyZ3VtZW50cy5sZW5ndGg7bysrKXt2YXIgcj1hcmd1bWVudHNbb107aWYodm9pZCAwIT09ciYmbnVsbCE9PXIpZm9yKHZhciBpPU9iamVjdC5rZXlzKE9iamVjdChyKSksYT0wLHM9aS5sZW5ndGg7YTxzO2ErKyl7dmFyIGM9aVthXSxsPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixjKTt2b2lkIDAhPT1sJiZsLmVudW1lcmFibGUmJihuW2NdPXJbY10pfX1yZXR1cm4gbn1mdW5jdGlvbiByKCl7T2JqZWN0LmFzc2lnbnx8T2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdCwiYXNzaWduIix7ZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6b30pfXQuZXhwb3J0cz17YXNzaWduOm8scG9seWZpbGw6cn19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMjQpLHI9big2KSxpPW4oNSksYT1uKDM2KSxzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXt2YXIgbj1hLmdldE9wdHMuYXBwbHkodm9pZCAwLHQpO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LGUpe2kuZGVmYXVsdC5wcm9taXNlPXtyZXNvbHZlOnQscmVqZWN0OmV9LG8uZGVmYXVsdChuKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5vcGVuTW9kYWwoKX0pfSl9fTtzLmNsb3NlPXIub25BY3Rpb24scy5nZXRTdGF0ZT1yLmdldFN0YXRlLHMuc2V0QWN0aW9uVmFsdWU9aS5zZXRBY3Rpb25WYWx1ZSxzLnN0b3BMb2FkaW5nPXIuc3RvcExvYWRpbmcscy5zZXREZWZhdWx0cz1hLnNldERlZmF1bHRzLGUuZGVmYXVsdD1zfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEpLHI9bigwKSxpPXIuZGVmYXVsdC5NT0RBTCxhPW4oNCkscz1uKDM0KSxjPW4oMzUpLGw9bigxKTtlLmluaXQ9ZnVuY3Rpb24odCl7by5nZXROb2RlKGkpfHwoZG9jdW1lbnQuYm9keXx8bC50aHJvd0VycigiWW91IGNhbiBvbmx5IHVzZSBTd2VldEFsZXJ0IEFGVEVSIHRoZSBET00gaGFzIGxvYWRlZCEiKSxzLmRlZmF1bHQoKSxhLmRlZmF1bHQoKSksYS5pbml0TW9kYWxDb250ZW50KHQpLGMuZGVmYXVsdCh0KX0sZS5kZWZhdWx0PWUuaW5pdH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigwKSxyPW8uZGVmYXVsdC5NT0RBTDtlLm1vZGFsTWFya3VwPSdcbiAgPGRpdiBjbGFzcz0iJytyKyciIHJvbGU9ImRpYWxvZyIgYXJpYS1tb2RhbD0idHJ1ZSI+PC9kaXY+JyxlLmRlZmF1bHQ9ZS5tb2RhbE1hcmt1cH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigwKSxyPW8uZGVmYXVsdC5PVkVSTEFZLGk9JzxkaXYgXG4gICAgY2xhc3M9IicrcisnIlxuICAgIHRhYkluZGV4PSItMSI+XG4gIDwvZGl2Pic7ZS5kZWZhdWx0PWl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMCkscj1vLmRlZmF1bHQuSUNPTjtlLmVycm9ySWNvbk1hcmt1cD1mdW5jdGlvbigpe3ZhciB0PXIrIi0tZXJyb3IiLGU9dCsiX19saW5lIjtyZXR1cm4nXG4gICAgPGRpdiBjbGFzcz0iJyt0KydfX3gtbWFyayI+XG4gICAgICA8c3BhbiBjbGFzcz0iJytlKyIgIitlKyctLWxlZnQiPjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPSInK2UrIiAiK2UrJy0tcmlnaHQiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgJ30sZS53YXJuaW5nSWNvbk1hcmt1cD1mdW5jdGlvbigpe3ZhciB0PXIrIi0td2FybmluZyI7cmV0dXJuJ1xuICAgIDxzcGFuIGNsYXNzPSInK3QrJ19fYm9keSI+XG4gICAgICA8c3BhbiBjbGFzcz0iJyt0KydfX2RvdCI+PC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgJ30sZS5zdWNjZXNzSWNvbk1hcmt1cD1mdW5jdGlvbigpe3ZhciB0PXIrIi0tc3VjY2VzcyI7cmV0dXJuJ1xuICAgIDxzcGFuIGNsYXNzPSInK3QrIl9fbGluZSAiK3QrJ19fbGluZS0tbG9uZyI+PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPSInK3QrIl9fbGluZSAiK3QrJ19fbGluZS0tdGlwIj48L3NwYW4+XG5cbiAgICA8ZGl2IGNsYXNzPSInK3QrJ19fcmluZyI+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz0iJyt0KydfX2hpZGUtY29ybmVycyI+PC9kaXY+XG4gICd9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDApLHI9by5kZWZhdWx0LkNPTlRFTlQ7ZS5jb250ZW50TWFya3VwPSdcbiAgPGRpdiBjbGFzcz0iJytyKyciPlxuXG4gIDwvZGl2PlxuJ30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigwKSxyPW8uZGVmYXVsdC5CVVRUT05fQ09OVEFJTkVSLGk9by5kZWZhdWx0LkJVVFRPTixhPW8uZGVmYXVsdC5CVVRUT05fTE9BREVSO2UuYnV0dG9uTWFya3VwPSdcbiAgPGRpdiBjbGFzcz0iJytyKyciPlxuXG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9IicraSsnIlxuICAgID48L2J1dHRvbj5cblxuICAgIDxkaXYgY2xhc3M9IicrYSsnIj5cbiAgICAgIDxkaXY+PC9kaXY+XG4gICAgICA8ZGl2PjwvZGl2PlxuICAgICAgPGRpdj48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cbid9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oNCkscj1uKDIpLGk9bigwKSxhPWkuZGVmYXVsdC5JQ09OLHM9aS5kZWZhdWx0LklDT05fQ1VTVE9NLGM9WyJlcnJvciIsIndhcm5pbmciLCJzdWNjZXNzIiwiaW5mbyJdLGw9e2Vycm9yOnIuZXJyb3JJY29uTWFya3VwKCksd2FybmluZzpyLndhcm5pbmdJY29uTWFya3VwKCksc3VjY2VzczpyLnN1Y2Nlc3NJY29uTWFya3VwKCl9LHU9ZnVuY3Rpb24odCxlKXt2YXIgbj1hKyItLSIrdDtlLmNsYXNzTGlzdC5hZGQobik7dmFyIG89bFt0XTtvJiYoZS5pbm5lckhUTUw9byl9LGY9ZnVuY3Rpb24odCxlKXtlLmNsYXNzTGlzdC5hZGQocyk7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIik7bi5zcmM9dCxlLmFwcGVuZENoaWxkKG4pfSxkPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPW8uaW5qZWN0RWxJbnRvTW9kYWwoci5pY29uTWFya3VwKTtjLmluY2x1ZGVzKHQpP3UodCxlKTpmKHQsZSl9fTtlLmRlZmF1bHQ9ZH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigyKSxyPW4oNCksaT1mdW5jdGlvbih0KXtuYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKCJBcHBsZVdlYktpdCIpJiYodC5zdHlsZS5kaXNwbGF5PSJub25lIix0Lm9mZnNldEhlaWdodCx0LnN0eWxlLmRpc3BsYXk9IiIpfTtlLmluaXRUaXRsZT1mdW5jdGlvbih0KXtpZih0KXt2YXIgZT1yLmluamVjdEVsSW50b01vZGFsKG8udGl0bGVNYXJrdXApO2UudGV4dENvbnRlbnQ9dCxpKGUpfX0sZS5pbml0VGV4dD1mdW5jdGlvbih0KXtpZih0KXt2YXIgZT1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7dC5zcGxpdCgiXG4iKS5mb3JFYWNoKGZ1bmN0aW9uKHQsbixvKXtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpKSxuPG8ubGVuZ3RoLTEmJmUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKSl9KTt2YXIgbj1yLmluamVjdEVsSW50b01vZGFsKG8udGV4dE1hcmt1cCk7bi5hcHBlbmRDaGlsZChlKSxpKG4pfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvPW4oMSkscj1uKDQpLGk9bigwKSxhPWkuZGVmYXVsdC5CVVRUT04scz1pLmRlZmF1bHQuREFOR0VSX0JVVFRPTixjPW4oMyksbD1uKDIpLHU9big2KSxmPW4oNSksZD1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS50ZXh0LGk9ZS52YWx1ZSxkPWUuY2xhc3NOYW1lLHA9ZS5jbG9zZU1vZGFsLG09by5zdHJpbmdUb05vZGUobC5idXR0b25NYXJrdXApLGI9bS5xdWVyeVNlbGVjdG9yKCIuIithKSx2PWErIi0tIit0O2lmKGIuY2xhc3NMaXN0LmFkZCh2KSxkKXsoQXJyYXkuaXNBcnJheShkKT9kOmQuc3BsaXQoIiAiKSkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0Lmxlbmd0aD4wfSkuZm9yRWFjaChmdW5jdGlvbih0KXtiLmNsYXNzTGlzdC5hZGQodCl9KX1uJiZ0PT09Yy5DT05GSVJNX0tFWSYmYi5jbGFzc0xpc3QuYWRkKHMpLGIudGV4dENvbnRlbnQ9cjt2YXIgZz17fTtyZXR1cm4gZ1t0XT1pLGYuc2V0QWN0aW9uVmFsdWUoZyksZi5zZXRBY3Rpb25PcHRpb25zRm9yKHQse2Nsb3NlTW9kYWw6cH0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHUub25BY3Rpb24odCl9KSxtfSxwPWZ1bmN0aW9uKHQsZSl7dmFyIG49ci5pbmplY3RFbEludG9Nb2RhbChsLmZvb3Rlck1hcmt1cCk7Zm9yKHZhciBvIGluIHQpe3ZhciBpPXRbb10sYT1kKG8saSxlKTtpLnZpc2libGUmJm4uYXBwZW5kQ2hpbGQoYSl9MD09PW4uY2hpbGRyZW4ubGVuZ3RoJiZuLnJlbW92ZSgpfTtlLmRlZmF1bHQ9cH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigzKSxyPW4oNCksaT1uKDIpLGE9big1KSxzPW4oNiksYz1uKDApLGw9Yy5kZWZhdWx0LkNPTlRFTlQsdT1mdW5jdGlvbih0KXt0LmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldCxuPWUudmFsdWU7YS5zZXRBY3Rpb25WYWx1ZShuKX0pLHQuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLGZ1bmN0aW9uKHQpe2lmKCJFbnRlciI9PT10LmtleSlyZXR1cm4gcy5vbkFjdGlvbihvLkNPTkZJUk1fS0VZKX0pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmZvY3VzKCksYS5zZXRBY3Rpb25WYWx1ZSgiIil9LDApfSxmPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpLHI9bCsiX18iK2U7by5jbGFzc0xpc3QuYWRkKHIpO2Zvcih2YXIgaSBpbiBuKXt2YXIgYT1uW2ldO29baV09YX0iaW5wdXQiPT09ZSYmdShvKSx0LmFwcGVuZENoaWxkKG8pfSxkPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPXIuaW5qZWN0RWxJbnRvTW9kYWwoaS5jb250ZW50TWFya3VwKSxuPXQuZWxlbWVudCxvPXQuYXR0cmlidXRlczsic3RyaW5nIj09dHlwZW9mIG4/ZihlLG4sbyk6ZS5hcHBlbmRDaGlsZChuKX19O2UuZGVmYXVsdD1kfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEpLHI9bigyKSxpPWZ1bmN0aW9uKCl7dmFyIHQ9by5zdHJpbmdUb05vZGUoci5vdmVybGF5TWFya3VwKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpfTtlLmRlZmF1bHQ9aX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89big1KSxyPW4oNiksaT1uKDEpLGE9bigzKSxzPW4oMCksYz1zLmRlZmF1bHQuTU9EQUwsbD1zLmRlZmF1bHQuQlVUVE9OLHU9cy5kZWZhdWx0Lk9WRVJMQVksZj1mdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksdigpfSxkPWZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSxnKCl9LHA9ZnVuY3Rpb24odCl7aWYoby5kZWZhdWx0LmlzT3Blbilzd2l0Y2godC5rZXkpe2Nhc2UiRXNjYXBlIjpyZXR1cm4gci5vbkFjdGlvbihhLkNBTkNFTF9LRVkpfX0sbT1mdW5jdGlvbih0KXtpZihvLmRlZmF1bHQuaXNPcGVuKXN3aXRjaCh0LmtleSl7Y2FzZSJUYWIiOnJldHVybiBmKHQpfX0sYj1mdW5jdGlvbih0KXtpZihvLmRlZmF1bHQuaXNPcGVuKXJldHVybiJUYWIiPT09dC5rZXkmJnQuc2hpZnRLZXk/ZCh0KTp2b2lkIDB9LHY9ZnVuY3Rpb24oKXt2YXIgdD1pLmdldE5vZGUobCk7dCYmKHQudGFiSW5kZXg9MCx0LmZvY3VzKCkpfSxnPWZ1bmN0aW9uKCl7dmFyIHQ9aS5nZXROb2RlKGMpLGU9dC5xdWVyeVNlbGVjdG9yQWxsKCIuIitsKSxuPWUubGVuZ3RoLTEsbz1lW25dO28mJm8uZm9jdXMoKX0saD1mdW5jdGlvbih0KXt0W3QubGVuZ3RoLTFdLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLG0pfSx3PWZ1bmN0aW9uKHQpe3RbMF0uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsYil9LHk9ZnVuY3Rpb24oKXt2YXIgdD1pLmdldE5vZGUoYyksZT10LnF1ZXJ5U2VsZWN0b3JBbGwoIi4iK2wpO2UubGVuZ3RoJiYoaChlKSx3KGUpKX0seD1mdW5jdGlvbih0KXtpZihpLmdldE5vZGUodSk9PT10LnRhcmdldClyZXR1cm4gci5vbkFjdGlvbihhLkNBTkNFTF9LRVkpfSxfPWZ1bmN0aW9uKHQpe3ZhciBlPWkuZ2V0Tm9kZSh1KTtlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIix4KSx0JiZlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix4KX0saz1mdW5jdGlvbih0KXtvLmRlZmF1bHQudGltZXImJmNsZWFyVGltZW91dChvLmRlZmF1bHQudGltZXIpLHQmJihvLmRlZmF1bHQudGltZXI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gci5vbkFjdGlvbihhLkNBTkNFTF9LRVkpfSx0KSl9LE89ZnVuY3Rpb24odCl7dC5jbG9zZU9uRXNjP2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIixwKTpkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXl1cCIscCksdC5kYW5nZXJNb2RlP3YoKTpnKCkseSgpLF8odC5jbG9zZU9uQ2xpY2tPdXRzaWRlKSxrKHQudGltZXIpfTtlLmRlZmF1bHQ9T30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG89bigxKSxyPW4oMyksaT1uKDM3KSxhPW4oMzgpLHM9e3RpdGxlOm51bGwsdGV4dDpudWxsLGljb246bnVsbCxidXR0b25zOnIuZGVmYXVsdEJ1dHRvbkxpc3QsY29udGVudDpudWxsLGNsYXNzTmFtZTpudWxsLGNsb3NlT25DbGlja091dHNpZGU6ITAsY2xvc2VPbkVzYzohMCxkYW5nZXJNb2RlOiExLHRpbWVyOm51bGx9LGM9T2JqZWN0LmFzc2lnbih7fSxzKTtlLnNldERlZmF1bHRzPWZ1bmN0aW9uKHQpe2M9T2JqZWN0LmFzc2lnbih7fSxzLHQpfTt2YXIgbD1mdW5jdGlvbih0KXt2YXIgZT10JiZ0LmJ1dHRvbixuPXQmJnQuYnV0dG9ucztyZXR1cm4gdm9pZCAwIT09ZSYmdm9pZCAwIT09biYmby50aHJvd0VycigiQ2Fubm90IHNldCBib3RoICdidXR0b24nIGFuZCAnYnV0dG9ucycgb3B0aW9ucyEiKSx2b2lkIDAhPT1lP3tjb25maXJtOmV9Om59LHU9ZnVuY3Rpb24odCl7cmV0dXJuIG8ub3JkaW5hbFN1ZmZpeE9mKHQrMSl9LGY9ZnVuY3Rpb24odCxlKXtvLnRocm93RXJyKHUoZSkrIiBhcmd1bWVudCAoJyIrdCsiJykgaXMgaW52YWxpZCIpfSxkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dCsxLHI9ZVtuXTtvLmlzUGxhaW5PYmplY3Qocil8fHZvaWQgMD09PXJ8fG8udGhyb3dFcnIoIkV4cGVjdGVkICIrdShuKSsiIGFyZ3VtZW50ICgnIityKyInKSB0byBiZSBhIHBsYWluIG9iamVjdCIpfSxwPWZ1bmN0aW9uKHQsZSl7dmFyIG49dCsxLHI9ZVtuXTt2b2lkIDAhPT1yJiZvLnRocm93RXJyKCJVbmV4cGVjdGVkICIrdShuKSsiIGFyZ3VtZW50ICgiK3IrIikiKX0sbT1mdW5jdGlvbih0LGUsbixyKXt2YXIgaT10eXBlb2YgZSxhPSJzdHJpbmciPT09aSxzPWUgaW5zdGFuY2VvZiBFbGVtZW50O2lmKGEpe2lmKDA9PT1uKXJldHVybnt0ZXh0OmV9O2lmKDE9PT1uKXJldHVybnt0ZXh0OmUsdGl0bGU6clswXX07aWYoMj09PW4pcmV0dXJuIGQobixyKSx7aWNvbjplfTtmKGUsbil9ZWxzZXtpZihzJiYwPT09bilyZXR1cm4gZChuLHIpLHtjb250ZW50OmV9O2lmKG8uaXNQbGFpbk9iamVjdChlKSlyZXR1cm4gcChuLHIpLGU7ZihlLG4pfX07ZS5nZXRPcHRzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3ZhciBuPXt9O3QuZm9yRWFjaChmdW5jdGlvbihlLG8pe3ZhciByPW0oMCxlLG8sdCk7T2JqZWN0LmFzc2lnbihuLHIpfSk7dmFyIG89bChuKTtuLmJ1dHRvbnM9ci5nZXRCdXR0b25MaXN0T3B0cyhvKSxkZWxldGUgbi5idXR0b24sbi5jb250ZW50PWkuZ2V0Q29udGVudE9wdHMobi5jb250ZW50KTt2YXIgdT1PYmplY3QuYXNzaWduKHt9LHMsYyxuKTtyZXR1cm4gT2JqZWN0LmtleXModSkuZm9yRWFjaChmdW5jdGlvbih0KXthLkRFUFJFQ0FURURfT1BUU1t0XSYmYS5sb2dEZXByZWNhdGlvbih0KX0pLHV9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDEpLHI9e2VsZW1lbnQ6ImlucHV0IixhdHRyaWJ1dGVzOntwbGFjZWhvbGRlcjoiIn19O2UuZ2V0Q29udGVudE9wdHM9ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIG8uaXNQbGFpbk9iamVjdCh0KT9PYmplY3QuYXNzaWduKGUsdCk6dCBpbnN0YW5jZW9mIEVsZW1lbnQ/e2VsZW1lbnQ6dH06ImlucHV0Ij09PXQ/cjpudWxsfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5sb2dEZXByZWNhdGlvbj1mdW5jdGlvbih0KXt2YXIgbj1lLkRFUFJFQ0FURURfT1BUU1t0XSxvPW4ub25seVJlbmFtZSxyPW4ucmVwbGFjZW1lbnQsaT1uLnN1Yk9wdGlvbixhPW4ubGluayxzPW8/InJlbmFtZWQiOiJkZXByZWNhdGVkIixjPSdTd2VldEFsZXJ0IHdhcm5pbmc6ICInK3QrJyIgb3B0aW9uIGhhcyBiZWVuICcrcysiLiI7aWYocil7Yys9IiBQbGVhc2UgdXNlIisoaT8nICInK2krJyIgaW4gJzoiICIpKyciJytyKyciIGluc3RlYWQuJ312YXIgbD0iaHR0cHM6Ly9zd2VldGFsZXJ0LmpzLm9yZyI7Yys9YT8iIE1vcmUgZGV0YWlsczogIitsK2E6IiBNb3JlIGRldGFpbHM6ICIrbCsiL2d1aWRlcy8jdXBncmFkaW5nLWZyb20tMXgiLGNvbnNvbGUud2FybihjKX0sZS5ERVBSRUNBVEVEX09QVFM9e3R5cGU6e3JlcGxhY2VtZW50OiJpY29uIixsaW5rOiIvZG9jcy8jaWNvbiJ9LGltYWdlVXJsOntyZXBsYWNlbWVudDoiaWNvbiIsbGluazoiL2RvY3MvI2ljb24ifSxjdXN0b21DbGFzczp7cmVwbGFjZW1lbnQ6ImNsYXNzTmFtZSIsb25seVJlbmFtZTohMCxsaW5rOiIvZG9jcy8jY2xhc3NuYW1lIn0saW1hZ2VTaXplOnt9LHNob3dDYW5jZWxCdXR0b246e3JlcGxhY2VtZW50OiJidXR0b25zIixsaW5rOiIvZG9jcy8jYnV0dG9ucyJ9LHNob3dDb25maXJtQnV0dG9uOntyZXBsYWNlbWVudDoiYnV0dG9uIixsaW5rOiIvZG9jcy8jYnV0dG9uIn0sY29uZmlybUJ1dHRvblRleHQ6e3JlcGxhY2VtZW50OiJidXR0b24iLGxpbms6Ii9kb2NzLyNidXR0b24ifSxjb25maXJtQnV0dG9uQ29sb3I6e30sY2FuY2VsQnV0dG9uVGV4dDp7cmVwbGFjZW1lbnQ6ImJ1dHRvbnMiLGxpbms6Ii9kb2NzLyNidXR0b25zIn0sY2xvc2VPbkNvbmZpcm06e3JlcGxhY2VtZW50OiJidXR0b24iLHN1Yk9wdGlvbjoiY2xvc2VNb2RhbCIsbGluazoiL2RvY3MvI2J1dHRvbiJ9LGNsb3NlT25DYW5jZWw6e3JlcGxhY2VtZW50OiJidXR0b25zIixzdWJPcHRpb246ImNsb3NlTW9kYWwiLGxpbms6Ii9kb2NzLyNidXR0b25zIn0sc2hvd0xvYWRlck9uQ29uZmlybTp7cmVwbGFjZW1lbnQ6ImJ1dHRvbnMifSxhbmltYXRpb246e30saW5wdXRUeXBlOntyZXBsYWNlbWVudDoiY29udGVudCIsbGluazoiL2RvY3MvI2NvbnRlbnQifSxpbnB1dFZhbHVlOntyZXBsYWNlbWVudDoiY29udGVudCIsbGluazoiL2RvY3MvI2NvbnRlbnQifSxpbnB1dFBsYWNlaG9sZGVyOntyZXBsYWNlbWVudDoiY29udGVudCIsbGluazoiL2RvY3MvI2NvbnRlbnQifSxodG1sOntyZXBsYWNlbWVudDoiY29udGVudCIsbGluazoiL2RvY3MvI2NvbnRlbnQifSxhbGxvd0VzY2FwZUtleTp7cmVwbGFjZW1lbnQ6ImNsb3NlT25Fc2MiLG9ubHlSZW5hbWU6ITAsbGluazoiL2RvY3MvI2Nsb3Nlb25lc2MifSxhbGxvd0NsaWNrT3V0c2lkZTp7cmVwbGFjZW1lbnQ6ImNsb3NlT25DbGlja091dHNpZGUiLG9ubHlSZW5hbWU6ITAsbGluazoiL2RvY3MvI2Nsb3Nlb25jbGlja291dHNpZGUifX19XSl9KTs="}]},{"name":"下载公司文件","options":{"check_for_updates":false,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_prototypes":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_excludes":[],"orig_includes":[],"orig_matches":["http://oa.snibe.com:8080/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":["http://oa.snibe.com:8080/*"]},"run_at":null,"tab_types":null},"storage":{"ts":1624620458075,"data":{}},"enabled":true,"position":13,"uuid":"96625a5d-d98d-4b1b-908f-0306eaaa144b","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDkuIvovb3lhazlj7jmlofku7YKLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vdGFtcGVybW9ua2V5Lm5ldC8KLy8gQHZlcnNpb24gICAgICAxLjAKLy8gQGRlc2NyaXB0aW9uICDkuIvovb3lhazlj7jmlofku7YKLy8gQGF1dGhvciAgICAgICB3b29kCi8vIEBtYXRjaCAgICAgICAgaHR0cDovL29hLnNuaWJlLmNvbTo4MDgwLyoKLy8gQGdyYW50ICAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2Rvd25sb2FkIikuc3R5bGUuZGlzcGxheSA9ICcnOwp9KSgpOw=="},{"name":"🔥持续更新🔥 CSDN广告完全过滤、人性化脚本优化:🆕 不用再登录了!让你体验令人惊喜的崭新CSDN。","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["www.csdn.net"],"orig_excludes":[],"orig_includes":["*://*.csdn.net/*"],"orig_matches":[],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"sandbox":null,"tab_types":null,"unwrap":null},"storage":{"ts":1638014034695,"data":{}},"enabled":true,"position":14,"file_url":"https://greasyfork.org/scripts/378351-%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0-csdn%E5%B9%BF%E5%91%8A%E5%AE%8C%E5%85%A8%E8%BF%87%E6%BB%A4-%E4%BA%BA%E6%80%A7%E5%8C%96%E8%84%9A%E6%9C%AC%E4%BC%98%E5%8C%96-%E4%B8%8D%E7%94%A8%E5%86%8D%E7%99%BB%E5%BD%95%E4%BA%86-%E8%AE%A9%E4%BD%A0%E4%BD%93%E9%AA%8C%E4%BB%A4%E4%BA%BA%E6%83%8A%E5%96%9C%E7%9A%84%E5%B4%AD%E6%96%B0csdn/code/%F0%9F%94%A5%E6%8C%81%E7%BB%AD%E6%9B%B4%E6%96%B0%F0%9F%94%A5%20CSDN%E5%B9%BF%E5%91%8A%E5%AE%8C%E5%85%A8%E8%BF%87%E6%BB%A4%E3%80%81%E4%BA%BA%E6%80%A7%E5%8C%96%E8%84%9A%E6%9C%AC%E4%BC%98%E5%8C%96%EF%BC%9A%F0%9F%86%95%20%E4%B8%8D%E7%94%A8%E5%86%8D%E7%99%BB%E5%BD%95%E4%BA%86%EF%BC%81%E8%AE%A9%E4%BD%A0%E4%BD%93%E9%AA%8C%E4%BB%A4%E4%BA%BA%E6%83%8A%E5%96%9C%E7%9A%84%E5%B4%AD%E6%96%B0CSDN%E3%80%82.user.js","uuid":"d7da4824-3388-4ccc-ae59-c8a77dbe38a0","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDwn5Sl5oyB57ut5pu05paw8J+UpSBDU0RO5bm/5ZGK5a6M5YWo6L+H5ruk44CB5Lq65oCn5YyW6ISa5pys5LyY5YyW77ya8J+GlSDkuI3nlKjlho3nmbvlvZXkuobvvIHorqnkvaDkvZPpqozku6Tkurrmg4rllpznmoTltK3mlrBDU0RO44CCCi8vIEBuYW1lc3BhY2UgICAgaHR0cHM6Ly9naXRodWIuY29tL2FkbGVyZWQKLy8gQHZlcnNpb24gICAgICA0LjEuMgovLyBAZGVzY3JpcHRpb24gIOKaoe+4j+WFqOaWsDQuMOeJiOacrO+8geaLpeacieaVsOmhueeLrOWutuWKn+iDveeahOacgOW8ukNTRE7ohJrmnKzvvIzkuI3mnI3mr5TkuIDmr5TimqHvuI988J+VtuaXoOmcgOeZu+W9lUNTRE7vvIzojrflvpfmr5TkvJrlkZjmm7TkvbPnmoTkvZPpqox88J+WpeiHquWumuS5ieiDjOaZr+Wbvu+8jOWIhui+qOeOh+iHqumAgumFje+8jOWIhuWxj+S4jeeUqOa7muWKqHzwn5K+6LaF57qn6aKE5LyY5YyWfPCflJbni6zlrrbotoXnuqflhY3kvJrlkZh88J+Pt+eLrOWutuWOn+WIm+aWh+eroOWFjeeZu+W9leWxleW8gHzwn5SM54us5a625o6o6I2Q5YaF5a656Ieq55Sx5byA5YWzfPCfk6Dni6zlrrblhY3nmbvlvZXlpI3liLZ88J+Ul+eLrOWutumYsuWklumTvumHjeWumuWQkXzwn5Od54us5a626K665Z2b5pyq55m75b2V6Ieq5Yqo5bGV5byA5paH56ug44CB6K+E6K66fPCfjLXlhajpnaLlh4DljJZ88J+TiOayiea1uOmYheivu3zwn6e05YeA5YyW5Ymq6LS05p2/fPCfk5XkvZzogIXkv6Hmga/mlofnq6Dpobbpg6jlsZXnpLoKLy8gQGF1dGhvciAgICAgICBBZGxlcgovLyBAY29ubmVjdCAgICAgIHd3dy5jc2RuLm5ldAovLyBAaW5jbHVkZSAgICAgICo6Ly8qLmNzZG4ubmV0LyoKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2xmMjYtY2RuLXRvcy5ieXRlY2RudHAuY29tL2Nkbi9leHBpcmUtMS1NL2pxdWVyeS1jb29raWUvMS40LjEvanF1ZXJ5LmNvb2tpZS5taW4uanMKLy8gQHJlcXVpcmUgICAgICBodHRwczovL2xmMjYtY2RuLXRvcy5ieXRlY2RudHAuY29tL2Nkbi9leHBpcmUtMS1NL25wcm9ncmVzcy8wLjIuMC9ucHJvZ3Jlc3MubWluLmpzCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9sZjI2LWNkbi10b3MuYnl0ZWNkbnRwLmNvbS9jZG4vZXhwaXJlLTEtTS9jbGlwYm9hcmQuanMvMi4wLjEwL2NsaXBib2FyZC5taW4uanMKLy8gQHN1cHBvcnRVUkwgICBodHRwczovL2dpdGh1Yi5jb20vYWRsZXJlZC9DU0ROR3JlZW5lci9pc3N1ZXMvbmV3P2Fzc2lnbmVlcz1hZGxlcmVkJmxhYmVscz1oZWxwK3dhbnRlZCZ0ZW1wbGF0ZT1JU1NVRV9URU1QTEFURS5tZCZ0aXRsZT0KLy8gQGNvbnRyaWJ1dGlvblVSTCBodHRwczovL2RvYy5zdGFja292ZXJmbG93Lndpa2kvd2ViLyMvMjE/cGFnZV9pZD0xMzgKLy8gQGdyYW50ICAgICAgICBHTV9hZGRTdHlsZQovLyBAZ3JhbnQgICAgICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGFudGlmZWF0dXJlICB0cmFja2luZyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT4+PiDor7TmmI7vvJrmiJHku6zku4XkvJrlnKhDU0RO6aG16Z2i5pS26ZuG5oKo5L2/55SoQ1NETkdyZWVuZXLnmoTmg4XlhrXvvIzluK7liqnmiJHku6zkuobop6NDU0ROR3JlZW5lcueahOeUqOaIt+aVsOmHj+OAgui/meS4quaTjeS9nOS7heS8muaUtumbhuaCqOeahElQ5Zyw5Z2A5L+h5oGv77yM5LiN5YyF5ZCr5oKo6byg5qCH44CB6ZSu55uY54K55Ye75Zyo5YaF55qE5omA5pyJ5pON5L2c77yM5rKh5pyJ5Lu75L2V5a6J5YWo6aOO6Zmp77yM5LiN5Lya5Lqn55Sf5oCn6IO95o2f6ICX44CC5Li65LqG5L+d5oqk5oKo55qE55+l5oOF5p2D5Lul5Y+K5L2/55So5L2T6aqM77yM54m55ZGK55+l5LqO5oKo44CC5Luj56CB5byA5rqQ5Y+v5a6h6K6h77yMQ1NETkdyZWVuZXLogIHniYzohJrmnKzvvIzmnInlj6PnmobnopHjgILor7fmgqjmlL7lv4Plronoo4XjgIIgPDw8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gQG5vdGUgICAgICAgICAyMy0wMi0wMyA0LjEuMiDkv67lpI3kuobml6Dms5XnmbvlvZXnmoTpl67popjvvIjor4TorrrkuI3nmbvlvZXml6Dms5XliqDovb3mmoLml6Dop6PlhrPmlrnmoYjvvIzmiJHku6zlnKjmjIHnu63liqrlipvkuK3vvIkKLy8gQG5vdGUgICAgICAgICAyMi0wNS0zMCA0LjEuMSDlip/og73kv67lpI3vvIzlub/lkYrlsY/olL0KLy8gQG5vdGUgICAgICAgICAyMi0wMS0xOCA0LjEuMCDku6PnoIHmipjlj6DpgILphY0KLy8gQG5vdGUgICAgICAgICAyMi0wMS0wNSA0LjAuOSDmm7TmlrDlub/lkYoKLy8gQG5vdGUgICAgICAgICAyMS0xMi0xMiA0LjAuOCDlsY/olL3lrabnlJ/orqTor4EKLy8gQG5vdGUgICAgICAgICAyMS0xMC0yMSA0LjAuNyDlsY/olL3nuqLljIXpm6gKLy8gQG5vdGUgICAgICAgICAyMS0wOS0yNCA0LjAuNiDkv67lpI3nmbvlvZXlvLnnqpfml6Dms5XlvbvlupXljrvpmaTnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMS0wOS0yMCA0LjAuNSDlop7liqDoh6rlrprkuYnog4zmma/lip/og70KLy8gQG5vdGUgICAgICAgICAyMS0wOS0xMyA0LjAuNCDlop7liqDkuIDkuKrmsqHmnInmlLbpkrHnmoTlub/lkYrvvIjlnKjorr7nva7ph4zvvIzkuI3lvbHlk43kvZPpqozvvIkKLy8gQG5vdGUgICAgICAgICAyMS0wOS0wMSA0LjAuMyDlop7liqDnlKjmiLfkvb/nlKjmg4XlhrXnu5/orqHmqKHlnZcKLy8gQG5vdGUgICAgICAgICAyMS0wOC0yNSA0LjAuMiDkv67lpI3lj7Pkvqfnva7pobbmoI/mjInpkq7mtojlpLHnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMS0wOC0yMSA0LjAuMSDljrvpmaTlj7Pkvqfmgqzmta7moI/vvIzkvJjljJbohJrmnKwKLy8gQG5vdGUgICAgICAgICAyMS0wOC0yMCA0LjAuMCDlhajmlrA0LjDlj5HluIPvvIFVSee+juWMlu+8jOS7o+eggeS8mOWMlu+8jOWFvOWuuUZpcmVmb3jvvIzmm7TlpJrmjpLniYjmqKHlvI8KLy8gQG5vdGUgICAgICAgICAyMS0wOC0yMCAzLjUuNyDkv67lpI3ml6Dms5XlrozmlbTlpI3liLbjgIHkv53lrZhjc2Ru55qE572R6aG15Lya6Lez6L2s6aaW6aG155qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMjEtMDgtMTkgMy41LjYg6Ieq5Yqo6ZqQ6JeP5bqV5qCP5Yqf6IO95pS55Li65aeL57uI6ZqQ6JeP5bqV5qCPCi8vIEBub3RlICAgICAgICAgMjEtMDgtMTggMy41LjUg5L+u5aSN5peg5rOV6YCJ5oup5aSN5Yi255qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMjEtMDYtMTcgMy41LjQg5Y676Zmk5Y+z5L6n57qi5YyF5oKs5rWu56qXCi8vIEBub3RlICAgICAgICAgMjEtMDQtMTggMy41LjMg5aKe5Yqg5pi+56S65bCP5bqX55qE6K6+5a6aCi8vIEBub3RlICAgICAgICAgMjEtMDMtMTMgMy41LjIg5Y675Li76aG15bm/5ZGK77yM5Y675paH56ug6aG16Z2i5o6o6I2Q5YaF5a65VGl0bGUKLy8gQG5vdGUgICAgICAgICAyMS0wMy0wMSAzLjUuMSDkv67mlLnmlofmoYgKLy8gQG5vdGUgICAgICAgICAyMS0wMi0wNiAzLjUuMCDkv67lpI3kuIrkvKDotYTmupDnlYzpnaLmoIfnrb7pgInmi6nmtojlpLHnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMS0wMS0xNyAzLjQuOSDliKDpmaTmlofnq6DpobXlkozorrrlnZvlub/lkYrvvIzmmoLml7blgZznlKjlj7PkvqfmoI/mu5rliqjlip/og73vvIhDU0RO6ZmQ5Yi277yJCi8vIEBub3RlICAgICAgICAgMjEtMDEtMTUgMy40Ljgg5L+d5a2Y5oyJ6ZKu5LyY5YyW77yM5L+u5aSN5pi+56S65Yib5L2c5Lit5b+D5oyJ6ZKu5Yqf6IO95aSx5pWI55qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMjEtMDEtMTUgMy40Ljcg5pS56L+b6ISa5pys57uG6IqC77yM5aKe5Yqg5bm/5ZGK5bGP6JS96IO95Yqb77yM5L+u5aSN57u/5YyW5oyJ6ZKu6ZSZ5L2N55qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMjAtMTItMjUgMy40LjYg5Li76aG16YOo5YiG5bWM5YWl5byP5bm/5ZGK5Yig6ZmkCi8vIEBub3RlICAgICAgICAgMjAtMTItMTggMy40LjUg5L+u5aSN57u/5YyW6K6+5a6a5oyJ6ZKu5o6S54mI5LiN5q2j56Gu55qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMjAtMTItMTUgMy40LjQg5L+u5aSN5LqG5p+Q5Lqb5a2Q6aG15pi+56S65LiN5q2j5bi455qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMjAtMTAtMjMgMy40LjMg6YCC5bqU5paw54mIQ1NETu+8jOWOu+mZpOS4u+mhteWSjOeZu+W9lemhteW5v+WRiu+8jOS7peWPiueZu+W9leaPkOekuu+8jOW5tuenu+mZpOW6lemDqOS/oeaBrwovLyBAbm90ZSAgICAgICAgIDIwLTEwLTIwIDMuNC4yIOWIoOmZpOWPs+S+p+W5v+WRigovLyBAbm90ZSAgICAgICAgIDIwLTA5LTI2IDMuNC4xIOS/ruaUueaOkueJiOiuvuWumu+8jOS/ruWkjeeZu+W9leahhuW8ueWHuueahOmXrumimAovLyBAbm90ZSAgICAgICAgIDIwLTA5LTI0IDMuNC4wIOe0p+aApeS/ruWkjeeUseS6jkNTRE7liY3nq6/moLflvI/kv67mlLnlr7zoh7Torr7lrprlvIDlhbPkuKLlpLHnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMC0wOC0yNyAzLjMuOSDntKfmgKXkv67lpI3nlLHkuo5DU0RO5YmN56uv5qC35byP5L+u5pS55a+86Ie06ISa5pys5aSx5pWI55qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMjAtMDgtMjYgMy4zLjgg5ZCI5rOV6ISa5pys5o+Q56S6Ci8vIEBub3RlICAgICAgICAgMjAtMDctMjAgMy4zLjcg5L+u5aSN6I+c5Y2V5qCP5Zyo5Yib5L2c5Lit5b+D5pi+56S65byC5bi455qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMjAtMDctMTggMy4zLjYg5bel5YW3566x5oyJ6ZKu5LyY5YyWCi8vIEBub3RlICAgICAgICAgMjAtMDctMDUgMy4zLjUg6K+E6K665aSN5Yi25Yqf6IO95Lqk5LqS5LyY5YyWCi8vIEBub3RlICAgICAgICAgMjAtMDctMDQgMy4zLjQg5L+u5aSN5Y+z5L6n5qCP5raI5aSx55qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMjAtMDctMDMgMy4zLjMg5paw5aKe5aSN5Yi26K+E6K665Yqf6IO977yB5Yig6Zmk6aG26YOo5bm/5ZGKCi8vIEBub3RlICAgICAgICAgMjAtMDYtMjggMy4zLjIg5o+Q56S65L+u5pS5Ci8vIEBub3RlICAgICAgICAgMjAtMDYtMjcgMy4zLjEg5by556qX5o+Q56S66YC76L6R5L+u5pS55Li65LuF5o+Q56S65LiA5qyh44CCCi8vIEBub3RlICAgICAgICAgMjAtMDYtMjcgMy4zLjAg572R56uZ5qCH6aKY5paw5raI5oGv5o+Q6YaS5Y676ZmkCi8vIEBub3RlICAgICAgICAgMjAtMDYtMjYgMy4yLjkg5oGi5aSNR3JlYXN5Rm9ya+W5s+WPsOiEmuacrOaUr+aMgQovLyBAbm90ZSAgICAgICAgIDIwLTA2LTIxIDMuMi4wIOiEmuacrOi/geenu+mAmuefpQovLyBAbm90ZSAgICAgICAgIDIwLTA2LTIxIDMuMS45IOWinuWKoOiHquWKqOmakOiXj+W6leagj+WKn+iDvQovLyBAbm90ZSAgICAgICAgIDIwLTA2LTIxIDMuMS44IOWinuWKoOiHquWKqOmakOiXj+mhtuagj+WKn+iDve+8jOS/ruWkjemAiemhueeql+WPo+iiq+eCuei1numVv+adoeaMoeS9j+eahEJ1Z++8jOmAiemhueeql+WPo+W4g+WxgOS/ruaUuQovLyBAbm90ZSAgICAgICAgIDIwLTA2LTIwIDMuMS43IOiuvue9rueql+WPo+Wkp+Wwj+WbuuWumu+8jOWinuWKoOaJk+i1j+WFpeWPowovLyBAbm90ZSAgICAgICAgIDIwLTA2LTE5IDMuMS42IOaYvuekuuaOqOiNkOWGheWuueaMiemSruWbnuW9ku+8jOaWsOW4g+WxgOe0p+aApeS/ruWkjQovLyBAbm90ZSAgICAgICAgIDIwLTA2LTE4IDMuMS41IOiHquWumuS5ieWKn+iDveabtOaWsAovLyBAbm90ZSAgICAgICAgIDIwLTA2LTE2IDMuMS40IOaUr+aMgeWkp+mDqOWIhuWKn+iDveaooeWdl+WMluaYvuekugovLyBAbm90ZSAgICAgICAgIDIwLTA2LTE0IDMuMS4zIOe7v+WMluiuvuWumuS8mOWMlgovLyBAbm90ZSAgICAgICAgIDIwLTA2LTE0IDMuMS4yIElTU1VF5qih5p2/6LCD5pW0U3VwcG9ydCBVUkwKLy8gQG5vdGUgICAgICAgICAyMC0wNi0xNCAzLjEuMSDlop7liqDmkJzljZrkuLvmlofnq6DmqKHlnZcKLy8gQG5vdGUgICAgICAgICAyMC0wNi0xMyAzLjEuMCDkv67lpI3orr7nva7ov4fmnJ/nmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMC0wNi0xMiAzLjAuOSDmoIfpopjlm57mu5oKLy8gQG5vdGUgICAgICAgICAyMC0wNi0xMiAzLjAuOCDkuLvpobXlub/lkYrliKDpmaTvvIznu7/ljJborr7nva7ku4XmmL7npLrlnKjmlofnq6DpobXpnaLvvIzliKDpmaTpobXohJrvvIzpobbpg6jkvJjljJbvvIzoi6XlubLnu4boioLkvJjljJYKLy8gQG5vdGUgICAgICAgICAyMC0wNi0xMSAzLjAuNyDlop7liqDlrpjmlrlRUeS6pOa1gee+pO+8jOWinuWKoOWFs+mXreW8uuWItueZveiJsuS4u+mimOWKn+iDvQovLyBAbm90ZSAgICAgICAgIDIwLTA2LTExIDMuMC42IOeUqOaIt+WQjeeJh+WKn+iDveS8mOWMlgovLyBAbm90ZSAgICAgICAgIDIwLTA2LTExIDMuMC41IOS8mOWMluWKoOi9vemAn+W6pgovLyBAbm90ZSAgICAgICAgIDIwLTA2LTEwIDMuMC40IOS/ruWkjeiuvue9rueVjOmdoumBruaMoeeahOmXrumimO+8jOaYvuekuuWNmuS4u+WktOWDjwovLyBAbm90ZSAgICAgICAgIDIwLTA2LTA5IDMuMC4zIOm7mOiupOiuvuWumuS/ruaUuQovLyBAbm90ZSAgICAgICAgIDIwLTA2LTA5IDMuMC4yIOS/ruWkjeaOqOiNkOWGheWuueaMiemSruWIt+aWsOS4jeeUn+aViOeahOmXrumimO+8jOWinuWKoOW3peWFt+euseaPkOekuuahhgovLyBAbm90ZSAgICAgICAgIDIwLTA2LTA4IDMuMC4xIOiuvue9ruS4reW/g+aOqOWHuu+8geWinuWKoOa1j+iniOaViOaenOmAiemhuSAmJiBHcmVlbiBCb29rIEljb24gVXBkYXRlCi8vIEBub3RlICAgICAgICAgMjAtMDYtMDggMy4wLjAg6K6+572u5Lit5b+D5o6o5Ye677yB5aKe5Yqg5rWP6KeI5pWI5p6c6YCJ6aG5Ci8vIEBub3RlICAgICAgICAgMjAtMDYtMDcgMi40LjIg6K6+572u6Kej6ICm77yM5LiL5Liq54mI5pys5pCe6YWN572u5Lit5b+DCi8vIEBub3RlICAgICAgICAgMjAtMDYtMDYgMi40LjEg5L+u5aSN5paH56ug5YaF5a655raI5aSx55qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMjAtMDYtMDQgMi40LjAg5L+u5aSN5o6o6I2Q5oyJ6ZKu6ZSZ5L2N55qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMjAtMDYtMDQgMi4zLjkg56qE5bGP6YCC6YWN5LyY5YyWCi8vIEBub3RlICAgICAgICAgMjAtMDYtMDQgMi4zLjgg6buR5aSc5qih5byP5Ye6546w6Zeu6aKY77yM57Sn5oCl5Zue5qGj5YiwIDIuMy42Ci8vIEBub3RlICAgICAgICAgMjAtMDYtMDMgMi4zLjcg5oSf6LCiIEBBbGV4TFdUIOWinuWKoOm7keaal+aooeW8jwovLyBAbm90ZSAgICAgICAgIDIwLTA2LTAyIDIuMy42IEFkc0J5R29vZ2xlIOWIoOmZpAovLyBAbm90ZSAgICAgICAgIDIwLTA1LTI1IDIuMy41IOaEn+iwoiBAUnlhbklQTyDkv67lpI0gQ2Fubm90IHJlYWQgcHJvcGVydHkgJ3JlcGxhY2UnIG9mIHVuZGVmaW5lZCDmiqXplJnnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAyMC0wNS0yNCAyLjMuNCDkv67lpI3lhY3nmbvlvZXlpI3liLblip/og70KLy8gQG5vdGUgICAgICAgICAyMC0wNS0yMiAyLjMuMyBMb2dv5LiO6IOM5pmv5ZCM5q2lCi8vIEBub3RlICAgICAgICAgMjAtMDUtMjIgMi4zLjIg5rex5bqm5Yig6Zmk6IOM5pmvCi8vIEBub3RlICAgICAgICAgMjAtMDUtMjAgMi4zLjEg6YCa6L+HcmVxdWlyZeS9v+eUqE5Qcm9ncmVzcwovLyBAbm90ZSAgICAgICAgIDIwLTA1LTIwIDIuMy4wIOaYvuekuuaOqOiNkOWGheWuueaMiemSruagt+W8j+WGhee9ru+8jOWJlOmZpENETgovLyBAbm90ZSAgICAgICAgIDIwLTA1LTE3IDIuMi45IOi/m+W6puadoeagt+W8j+abtOaWsO+8jOaXtumXtOW7tuaXtuS8mOWMlgovLyBAbm90ZSAgICAgICAgIDIwLTA1LTE3IDIuMi44IOabtOaWsOiEmuacrOaPj+i/sO+8jOWxleW8gOivhOiuuueahOaJgOacieWbnuWkje+8jOWIoOmZpOWIm+S9nOS4reW/g+aMiemSru+8jOWKoOi9vei/m+W6puadoQovLyBAbm90ZSAgICAgICAgIDIwLTA1LTE3IDIuMi43IOabtOaWsOiEmuacrOaPj+i/sAovLyBAbm90ZSAgICAgICAgIDIwLTA1LTE2IDIuMi42IOS/ruWkjeesrOS4gOasoeeCueWHu+aYvuekuuaOqOiNkOWGheWuueaXoOWPjeW6lOeahOmXrumimAovLyBAbm90ZSAgICAgICAgIDIwLTA1LTE2IDIuMi41IOWIoOmZpOaKouaymeWPkeinkuagh++8jOS/ruaUueaYvuekuuaOqOiNkOWGheWuueaMiemSruagt+W8jwovLyBAbm90ZSAgICAgICAgIDIwLTA1LTE2IDIuMi40IOaEn+iwouadpeiHqkdpdEh1YueahOaci+WPi+KAnEhlcm9uWmhhbmfigJ3nmoRJc3N1ZeW7uuiuru+8jOWIoOmZpOaJgOacieWNmuWuouiKsemHjOiDoeWTqOeahOiDjOaZr++8jOS4u+mhteWIhuexu+S4reW5v+WRiua4hemZpO+8jENTU+agt+W8j+aOp+WItuWuveW6pumAgumFjeS7o+eggeS8mOWMlgovLyBAbm90ZSAgICAgICAgIDIwLTA1LTE2IDIuMi4zIOaEn+iwouadpeiHqkdpdEh1YueahOaci+WPi+KAnFJldGlyZWRXb3JsZOKAneeahOS7o+eggei0oeeMru+8jOS9v+eUqENTU+adpeaOp+WItuagt+W8j++8jOiAjOS4jeaYr0pT77yM5aKe5aSn54G15rS75oCn44CCCi8vIEBub3RlICAgICAgICAgMjAtMDUtMTMgMi4yLjIg5bGP6JS95oKo55qE57yp5pS+5LiN5pivMTAwJeeahOaPkOekugovLyBAbm90ZSAgICAgICAgIDIwLTA0LTI5IDIuMi4xIOaEn+iwouWkp+WutueahOaUr+aMge+8jOWinuWKoOebruW9leaYvuekuu+8jOiHquWKqOWIpOaWreaYr+WQpuWtmOWcqOebruW9leiwg+aVtOmhtemdouWuveW6pu+8jOWxj+iUveaWsOWinuW5v+WRiu+8jOasoui/juWkp+WutuS9k+mqjOW5tuaPkOWHuuaEj+inge+8gQovLyBAbm90ZSAgICAgICAgIDIwLTA0LTE1IDIuMi4wIOS4gOS6m+W5v+WRiuiiq+WFtuS7luaPkuS7tuWxj+iUveWvvOiHtOeahOW8guW4uOaXoOinhuS5iwovLyBAbm90ZSAgICAgICAgIDIwLTAzLTMwIDIuMS45IOW5suaOieKAnOiusOW9leS9oOeahOWIm+S9nOWOhueoi+KAne+8jOW5suaOieacqueZu+W9leaDheWGteS4i+eahOinkuagh+aPkOmGkgovLyBAbm90ZSAgICAgICAgIDIwLTAzLTEzIDIuMS44IOeqhOWxj+mAgumFjeWKoOW8ugovLyBAbm90ZSAgICAgICAgIDIwLTAzLTEzIDIuMS43IOabtOaWsOeugOS7iwovLyBAbm90ZSAgICAgICAgIDIwLTAzLTEyIDIuMS42IOWuveW6puiHqumAguW6lO+8iOaEn+iwouadpeiHqkdpdEh1YueahOaci+WPi0xlb25HN+eahOW7uuiuru+8ie+8geS/ruWkjeWJqui0tOadv+WHgOWMluaXoOaViOeahOmXrumimOOAggovLyBAbm90ZSAgICAgICAgIDIwLTAzLTA0IDIuMS41IOmAgumFjUFkR3VhcmQKLy8gQG5vdGUgICAgICAgICAyMC0wMi0yNyAyLjEuNCDkvJjljJblhY3nmbvlvZXlpI3liLYKLy8gQG5vdGUgICAgICAgICAyMC0wMi0yNSAyLjEuMyDlhY3nmbvlvZXlpI3liLbmm7TmlrDvvIznjrDlt7Llj6/nlKgKLy8gQG5vdGUgICAgICAgICAyMC0wMi0yNCAyLjEuMiBCeSBHaXRodWJASmFsaW5XYW5nIOabtOaUueWOu+mZpOWJqui0tOadv+WKq+aMgeeahOaWueW8j++8jOS9v+W+l+WOn+aWh+agvOW8j+WcqOWkjeWItuaXtuiDveWkn+S/neeVmQovLyBAbm90ZSAgICAgICAgIDIwLTAyLTIyIDIuMS4xIOe0p+aApeS/ruWkjeeUseS6jiBDU0ROIOS/ruaUueWJjeerr+e7k+aehOWvvOiHtOeahOaWh+eroOmUmeS9jQovLyBAbm90ZSAgICAgICAgIDIwLTAyLTExIDIuMS4wIOiLpeW5suWKqOeUu+S8mOWMlu+8jOinhuinieS9k+mqjOabtOa1geeVhQovLyBAbm90ZSAgICAgICAgIDIwLTAyLTA2IDIuMC45IOatpuaxieWKoOayue+8geS/ruaUueaOqOiNkOWGheWuueWIh+aNouW8gOWFs+S9jee9ru+8jOWHj+Wwkei/neWSjOaEnwovLyBAbm90ZSAgICAgICAgIDIwLTAxLTE3IDIuMC44IOWOu+mZpOWPs+S+p+W5v+WRigovLyBAbm90ZSAgICAgICAgIDIwLTAxLTE3IDIuMC43IOaEn+iwouadpeiHqkdpdEh1YueahOaci+WPi+KAnGdsZWFuc+KAneeahOW7uuiuru+8jOWOu+aOiemhteWktOW5v+WRigovLyBAbm90ZSAgICAgICAgIDE5LTEyLTEyIDIuMC42IOaEn+iwouadpeiHqkdpdEh1YueahOaci+WPi+KAnHlleHVlc29uZ+KAneeahOW7uuiuru+8jOWwhuS9nOiAheS/oeaBr+WcqOaWh+eroOmhtumDqOWxleekugovLyBAbm90ZSAgICAgICAgIDE5LTEwLTMwIDIuMC41IOe+juWMlumakOiXj+aMiemSru+8jOWinuWKoOeCueWHu+WKqOeUuwovLyBAbm90ZSAgICAgICAgIDE5LTEwLTMwIDIuMC40IOWIoOmZpENTRE7lrpjmlrnlnKjkuLvpobXmjqjpgIHnmoTmlofnq6DvvIjlpKflpJrmmK/lub/lkYrvvIkKLy8gQG5vdGUgICAgICAgICAxOS0xMC0zMCAyLjAuMyDmt7vliqDmm7TlpJrlsY/olL3ohJrmnKwKLy8gQG5vdGUgICAgICAgICAxOS0xMC0zMCAyLjAuMCDnpZ3oh6rlt7HnlJ/ml6Xlv6vkuZB+5a6M5YWo6YeN5YaZQ1NETkdyZWVuZXLvvIznu5/kuIDkvb/nlKhKUXVlcnnvvIzmlYjnjofmm7Tpq5gKLy8gQG5vdGUgICAgICAgICAxOS0xMC0yNyAxLjUuMiDliKDpmaTliIbkuqvmtbfmiqXmj5DnpLomJuaEn+iwokdpdEh1YueahOaci+WPi+KAnENITi1TVFVERU5U4oCd55qE5Y+N6aaI77yM5Y676Zmk5bqV6YOo6K++56iL5o6o6I2QCi8vIEBub3RlICAgICAgICAgMTktMTAtMjcgMS41LjEg5oSf6LCi5p2l6IeqR2l0SHVi55qE5pyL5Y+L4oCcQ0hOLVNUVURFTlTigJ3nmoTnu4boh7TlpI3njrDlj43ppojvvIzljrvpmaTkuoblupXpg6jnmoTor77nqIvmjqjojZDlub/lkYoKLy8gQG5vdGUgICAgICAgICAxOS0xMC0wNCAxLjUuMCDnp7vpmaTkuoblupXpg6jkuLvpopjkv6Hmga/lkozmiZPotY8KLy8gQG5vdGUgICAgICAgICAxOS0wOS0xMCAxLjQuOSDmhJ/osKLmnaXoh6pHaXRIdWLnmoTmnIvlj4vigJxwcm9ncmFtbWVyWmXigJ3nmoTnu4boh7TlpI3njrDlj43ppojvvIzkv67lpI3kuobor4TorrrljLrngrnlh7vmn6XnnIvlm57lpI3lkI7vvIzlt7Lnu4/lsZXlvIDnmoTor4TorrrkvJrmlLbotbfnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAxOS0wOS0wNCAxLjQuOCDmhJ/osKLmnaXoh6pHaXRIdWLnmoTmnIvlj4vigJxkd2RjdGjigJ3nmoTnu4boh7TlpI3njrDlj43ppojvvIznjrDlnKjmn6XnnIvljp/liJvmlofnq6DkuI3kvJrml6DpmZDlvLnnmbvlvZXnqpflj6PkuobvvIzkuJTliqDlvLrkuoboh6rliqjlsZXlvIDlip/og70KLy8gQG5vdGUgICAgICAgICAxOS0wOC0yMCAxLjQuNyDmhJ/osKLmsrnlj4nnlKjmiLfigJxTdXByZW1lU2ly4oCd55qE5Y+N6aaI77yM5L+u5aSN5LqG5Y+z5L6n5oKs5rWu5qCP6YGu5oyh5paH56ug55qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMTktMDgtMTQgMS40LjYg5peg6K+t44CC5Yia5pu05paw55qE5YWN55m75b2V5aSN5Yi277yM5Y+I5pS55LqG44CC5L+u5aSN77yBCi8vIEBub3RlICAgICAgICAgMTktMDgtMTMgMS40LjUg5pu05paw5LqG54us5a625Yqf6IO977ya5YWN55m75b2V5aSN5Yi2Ci8vIEBub3RlICAgICAgICAgMTktMDgtMTMgMS40LjQg5oSf6LCi5p2l6IeqR2l0SHVi55qE5pyL5Y+L4oCcaWFtc3VueGluZ+KAneeahOWPjemmiO+8jOS/ruWkjeS6humhtumDqOS4jei0tOi+ueeahOmXrumimAovLyBAbm90ZSAgICAgICAgIDE5LTA4LTAxIDEuNC4zIOaEn+iwouayueWPieeUqOaIt+KAnGRkZGR54oCd55qE5Y+N6aaI77yM5Y676Zmk5LqG5pu05aSa5o6o5bm/5bm/5ZGKCi8vIEBub3RlICAgICAgICAgMTktMDctMzAgMS40LjIg5oSf6LCi5rK55Y+J55So5oi34oCc5ZGo5LmJ5p2w4oCd55qE5Y+N6aaI77yM5aKe5Yqg5LqG6ZiyQ1NETuWklumTvumHjeWumuWQkeeahOWKn+iDve+8iENTRE7oh63mtYHmsJPvvIkKLy8gQG5vdGUgICAgICAgICAxOS0wNy0yMCAxLjQuMSDkv67lpI3kuobmjqjojZDlhoXlrrnlvIDlhbPot6jmlofnq6Dml6DmlYjpl67popjvvIjlv5jkuobphY3nva5Db29raWXkvZznlKjln5/vvIkKLy8gQG5vdGUgICAgICAgICAxOS0wNy0xOSAxLjQuMCAxLiDmnoTmnrblpKfmm7TmlrAgMi4g5oSf6LCi5p2l6IeqR2l0SHVi55qE5pyL5Y+LImx1a2VtaW4i55qE5Y+N6aaI77yM5Yqg5YWl5LqG5LiL5pa55o6o6I2Q5YaF5a655piv5ZCm6ZqQ6JeP5byA5YWz77yI5a6e55So77yJCi8vIEBub3RlICAgICAgICAgMTktMDctMTMgMS4zLjAg5oSf6LCi5p2l6IeqR2l0SHVi55qE5pyL5Y+L4oCcSG9sYXBsYWNl4oCd55qE5Y+N6aaI77yM5L+u5aSN5LqG5paH56ug5peg5rOV6Ieq5Yqo5bGV5byA55qE6Zeu6aKY77yIQ1NETuaAu+aUuei/meS4qu+8jOS7pOS6uuWktOeWvO+8iQovLyBAbm90ZSAgICAgICAgIDE5LTA2LTA4IDEuMi42IOaEn+iwouayueWPieeUqOaIt+KAnERlc2t5QWtp4oCd55qE5Y+N6aaI77yM5L+u5aSN5LqG5paH56ug5peg5rOV6Ieq5Yqo5bGV5byA55qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMTktMDYtMDcgMS4yLjQg5L+u5aSN5LqG55m75b2V5ZCO6K+E6K665peg5rOV5q2j5bi45omT5byA55qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMTktMDYtMDcgMS4yLjMg5oSf6LCi5rK55Y+J55So5oi3IuawuOi/nOeahOauv+S4iyLnmoTlj43ppojvvIzlnKjkuIDkuIrljYjnmoTliqrlipvmlLvlhYvkuIvvvIznu4jkuo7lrp7njrDkuobmnKrnmbvlvZXlsZXlvIDor4TorrrnmoTor63lj6UKLy8gQG5vdGUgICAgICAgICAxOS0wNi0wNSAxLjIuMCDkv67lpI3kuobor4Torrrml6Dms5Xoh6rliqjlsZXlvIDnmoRCVUcKLy8gQG5vdGUgICAgICAgICAxOS0wNi0wNCAxLjEuOSDkv67lpI3kuobml6Dms5Xoh6rliqjlsZXlvIDnmoRCVUfvvIjoh6rpl63kuobvvIkKLy8gQG5vdGUgICAgICAgICAxOS0wNi0wNCAxLjEuNiBDU0RO5aSq5Z2P5LqG77yM5oqK4oCc5raI5oGv4oCd5oyJ6ZKu55qEQ2xhc3Porr7nva7miJDkuobigJxHaXRDaGF04oCd77yM5omA5Lul5L+u5aSN5LqG4oCc5raI5oGv4oCd5oyJ6ZKu5raI5aSx55qE6Zeu6aKYCi8vIEBub3RlICAgICAgICAgMTktMDYtMDQgMS4xLjUgMS4g5LyY5YyW5LqG6K665Z2b5L2T6aqMIDIu576O5YyW44CB5LyY5YyW5Luj56CB57uT5p6ECi8vIEBub3RlICAgICAgICAgMTktMDYtMDQgMS4xLjQg5oSf6LCi5p2l6IeqR2l0SHVi55qE5pyL5Y+L4oCcaWFtc3VueGluZ+KAneeahOWPjemmiO+8jOWinuWKoOS6huiuuuWdm+W5v+WRiuWMuemFjeinhOWImQovLyBAbm90ZSAgICAgICAgIDE5LTA2LTAzIDEuMS4zIOaEn+iwouadpeiHqkdpdEh1YueahOaci+WPi+KAnHdhbmd3ZWkxMzXigJ3nmoTlj43ppojvvIzljrvpmaTkuobor4TorrrljLrkuIrmlrnnmoTlub/lkYoKLy8gQG5vdGUgICAgICAgICAxOS0wNS0yNyAxLjEuMiDmhJ/osKLmsrnlj4nnlKjmiLfigJzlpI/kvJ/mnbDigJ3nmoTlj43ppojvvIzkv67lpI3kuoblr4zmlofmnKznvJbovpHlmajml6Dms5Xkvb/nlKjnmoTpl67popgKLy8gQG5vdGUgICAgICAgICAxOS0wNS0yNSAxLjEuMCAxLiDkv67lpI3kuobkuLvpobXlub/lkYrnmoTpl67popggMi4g6K665Z2b6Ieq5Yqo5bGV5byAIDMuIOiuuuWdm+W5v+WRiua2iOmZpAovLyBAbm90ZSAgICAgICAgIDE5LTA1LTI1IDEuMC45IOaEn+iwouayueWPieeUqOaIt+KAnOa4o+a4o+S4jeWHhuivtOivneKAneeahOWPjemmiO+8jOS/ruWkjeS6huaUtuiXj+aMiemSrua2iOWkseeahOmXrumimAovLyBAbm90ZSAgICAgICAgIDE5LTAzLTAxIDEuMC4zIOa3u+WKoOmhtemdoumAieaLqeaAp+i/h+a7pOinhOWImQovLyBAbm90ZSAgICAgICAgIDE5LTAzLTAxIDEuMC4yIOWinuWKoOS6huWHgOWMluWJqui0tOadv+WKn+iDvQovLyBAbm90ZSAgICAgICAgIDE5LTAzLTAxIDEuMC4xIOS/ruWkjeS6huaOkueJiOmXrumimCwg5LyY5YyW5LqG5Luj56CB57uT5p6ECi8vIEBub3RlICAgICAgICAgMTktMDItMjYgMS4wLjAg5Yid54mI5Y+R5biDCi8vID09L1VzZXJTY3JpcHQ9PQp2YXIgdmVyc2lvbiA9ICI0LjEuMiI7CnZhciBjdXJyZW50VVJMID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CmlmIChjdXJyZW50VVJMLmluZGV4T2YoIj8iKSAhPT0gLTEpIHsKICAgIGN1cnJlbnRVUkwgPSBjdXJyZW50VVJMLnN1YnN0cmluZygwLCBjdXJyZW50VVJMLmluZGV4T2YoIj8iKSk7Cn0KdmFyIGxpc3Q7CnZhciB3aW5kb3dUb3AgPSAwOwp2YXIgc3RhcnRUaW1lTWlsbGkgPSBEYXRlLm5vdygpOwp2YXIgc3RvcFRpbWVNaWxsaSA9IDA7Ci8vIOmFjee9ruaOp+WItuexuwpjbGFzcyBDb25maWcgewogICAgZ2V0KGtleSwgdmFsdWUpIHsKICAgICAgICB2YXIgY29va2llID0gJC5jb29raWUoa2V5KTsKICAgICAgICBpZiAoY29va2llID09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KGtleSwgdmFsdWUpOwogICAgICAgICAgICBjb25zb2xlLmRlYnVnKCJSZW5ldyBrZXk6ICIgKyBrZXkgKyAiIDogIiArIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgICBjb25zb2xlLmRlYnVnKCJSZWFkIGtleTogIiArIGtleSArICIgOiAiICsgY29va2llKTsKICAgICAgICBpZiAoY29va2llID09PSAidHJ1ZSIpIHsgcmV0dXJuIHRydWU7IH0KICAgICAgICBpZiAoY29va2llID09PSAiZmFsc2UiKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgIHJldHVybiBjb29raWU7CiAgICB9CgogICAgZ2V0UyhrZXksIHZhbHVlKSB7CiAgICAgICAgdmFyIGNvb2tpZSA9ICQuY29va2llKGtleSk7CiAgICAgICAgaWYgKGNvb2tpZSA9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbmV3IENvbmZpZygpLnNldChrZXksIHZhbHVlKTsKICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygiUmVuZXcga2V5OiAiICsga2V5ICsgIiA6ICIgKyB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgY29uc29sZS5kZWJ1ZygiUmVhZCBrZXk6ICIgKyBrZXkgKyAiIDogIiArIGNvb2tpZSk7CiAgICAgICAgcmV0dXJuIGNvb2tpZTsKICAgIH0KCiAgICBzZXQoc2V0S2V5LCBzZXRWYWx1ZSkgewogICAgICAgICQuY29va2llKHNldEtleSwgc2V0VmFsdWUsIHsKICAgICAgICAgICAgcGF0aDogJy8nLAogICAgICAgICAgICBleHBpcmVzOiAzNjUKICAgICAgICB9KTsKICAgICAgICBjb25zb2xlLmRlYnVnKCJLZXkgc2V0OiAiICsgc2V0S2V5ICsgIiA6ICIgKyBzZXRWYWx1ZSk7CiAgICB9CgogICAgbGlzdGVuQnV0dG9uKGVsZW1lbnQsIGxpc3RlbktleSwgdHJ1ZUFjdGlvbiwgZmFsc2VBY3Rpb24pIHsKICAgICAgICAkKGVsZW1lbnQpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbGV0IHN0YXR1cyA9IG5ldyBDb25maWcoKS5nZXQobGlzdGVuS2V5LCB0cnVlKTsKICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygiU3RhdHVzOiAiICsgc3RhdHVzKTsKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gInRydWUiIHx8IHN0YXR1cykgewogICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygiS2V5IHNldDogIiArIGxpc3RlbktleSArICIgOjogIiArIGZhbHNlKTsKICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKS5zZXQobGlzdGVuS2V5LCBmYWxzZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCJLZXkgc2V0OiAiICsgbGlzdGVuS2V5ICsgIiA6OiAiICsgdHJ1ZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KGxpc3RlbktleSwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBsaXN0ZW5CdXR0b25BbmRBY3Rpb24oZWxlbWVudCwgbGlzdGVuS2V5LCB0cnVlQWN0aW9uLCBmYWxzZUFjdGlvbikgewogICAgICAgICQoZWxlbWVudCkuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICBsZXQgc3RhdHVzID0gbmV3IENvbmZpZygpLmdldChsaXN0ZW5LZXksIHRydWUpOwogICAgICAgICAgICBjb25zb2xlLmRlYnVnKCJTdGF0dXM6ICIgKyBzdGF0dXMpOwogICAgICAgICAgICBpZiAoc3RhdHVzID09PSAidHJ1ZSIgfHwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCJLZXkgc2V0OiAiICsgbGlzdGVuS2V5ICsgIiA6OiAiICsgZmFsc2UpOwogICAgICAgICAgICAgICAgbmV3IENvbmZpZygpLnNldChsaXN0ZW5LZXksIGZhbHNlKTsKICAgICAgICAgICAgICAgIGZhbHNlQWN0aW9uKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCJLZXkgc2V0OiAiICsgbGlzdGVuS2V5ICsgIiA6OiAiICsgdHJ1ZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KGxpc3RlbktleSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB0cnVlQWN0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KfQp2YXIgY29uZmlnID0gbmV3IENvbmZpZygpOwp2YXIgcHJvZ3Jlc3MgPSAwOwpjbGFzcyBQcm9ncmVzcyB7CiAgICBpbml0KCkgewogICAgICAgIHByb2dyZXNzID0gMDsKICAgICAgICBOUHJvZ3Jlc3Muc3RhcnQoKTsKICAgICAgICAkKCIjZ3JlZW5lclByb2dyZXNzIikudGV4dCgi57u/5YyW5LitLi4uIik7CiAgICAgICAgJCgiLnRvb2xiYXItc2VhcmNoIikuaGlkZSgpOwogICAgfQoKICAgIHNldFByb2dyZXNzKHApIHsKICAgICAgICBwcm9ncmVzcyA9IHA7CiAgICAgICAgJCgiI2dyZWVuZXJQcm9ncmVzcyIpLnRleHQocHJvZ3Jlc3MgKyAiJSIpOwogICAgICAgIE5Qcm9ncmVzcy5zZXQocHJvZ3Jlc3MgLyAxMDApOwogICAgICAgIGNvbnNvbGUubG9nKHByb2dyZXNzICsgIiUiKTsKICAgIH0KCiAgICBpbmNQcm9ncmVzcyhwKSB7CiAgICAgICAgcHJvZ3Jlc3MgPSBwcm9ncmVzcyArIHA7CiAgICAgICAgcHJvZ3Jlc3MgPSBwcm9ncmVzcyA+IDEwMCA/IDEwMCA6IHByb2dyZXNzOwogICAgICAgICQoIiNncmVlbmVyUHJvZ3Jlc3MiKS50ZXh0KHByb2dyZXNzICsgIiUiKTsKICAgICAgICBOUHJvZ3Jlc3Muc2V0KHByb2dyZXNzIC8gMTAwKTsKICAgICAgICBjb25zb2xlLmxvZyhwcm9ncmVzcyArICIlIik7CiAgICB9CgogICAgZG9uZSgpIHsKICAgICAgICBwcm9ncmVzcyA9IDEwMDsKICAgICAgICBOUHJvZ3Jlc3MuZG9uZSgpOwogICAgICAgICQoIiNncmVlbmVyUHJvZ3Jlc3MiKS5odG1sKHByb3RlY3Rfc3ZnICsgJyBDU0ROR3JlZW5lciDmraPlnKjlrojmiqTmgqjnmoTmtY/op4jkvZPpqownKTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCIjZ3JlZW5lclByb2dyZXNzIikuZmFkZU91dCg1MDApOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCgiLnRvb2xiYXItc2VhcmNoIikuZmFkZUluKDUwMCk7CiAgICAgICAgICAgICAgICBpZiAoIWlzRmlyZWZveCgpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8g5o+Q56S6CiAgICAgICAgICAgICAgICAgICAgbGV0IHRpcHNDb29raWUgPSBjb25maWcuZ2V0KCJzaG93VGlwIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRpcHNDb29raWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpcHMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNldCgic2hvd1RpcCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICB9LCAxNTAwKTsKICAgIH0KfQp2YXIgcHJvZ3Jlc3NvciA9IG5ldyBQcm9ncmVzcygpOwoKLy8g6Ieq5a6a5LmJIENTUwovLyDov5vluqbmnaEKJCgnaGVhZCcpLmFwcGVuZCgiPHN0eWxlPiNucHJvZ3Jlc3N7cG9pbnRlci1ldmVudHM6bm9uZX0jbnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZDojZjQ0NDQ0O3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAzMTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MnB4fSNucHJvZ3Jlc3MgLnBlZ3tkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7d2lkdGg6MTAwcHg7aGVpZ2h0OjEwMCU7Ym94LXNoYWRvdzowIDAgMTBweCAjZjQ0NDQ0LDAgMCA1cHggI2Y0NDQ0NDtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDNkZWcpIHRyYW5zbGF0ZSgwLC00cHgpOy1tcy10cmFuc2Zvcm06cm90YXRlKDNkZWcpIHRyYW5zbGF0ZSgwLC00cHgpO3RyYW5zZm9ybTpyb3RhdGUoM2RlZykgdHJhbnNsYXRlKDAsLTRweCl9I25wcm9ncmVzcyAuc3Bpbm5lcntkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAzMTt0b3A6MTVweDtyaWdodDoxNXB4fSNucHJvZ3Jlc3MgLnNwaW5uZXItaWNvbnt3aWR0aDoxOHB4O2hlaWdodDoxOHB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtib3JkZXI6c29saWQgMnB4IHRyYW5zcGFyZW50O2JvcmRlci10b3AtY29sb3I6I2Y0NDQ0NDtib3JkZXItbGVmdC1jb2xvcjojZjQ0NDQ0O2JvcmRlci1yYWRpdXM6NTAlOy13ZWJraXQtYW5pbWF0aW9uOm5wcm9ncmVzcy1zcGlubmVyIC40cyBsaW5lYXIgaW5maW5pdGU7YW5pbWF0aW9uOm5wcm9ncmVzcy1zcGlubmVyIC40cyBsaW5lYXIgaW5maW5pdGV9Lm5wcm9ncmVzcy1jdXN0b20tcGFyZW50e292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubnByb2dyZXNzLWN1c3RvbS1wYXJlbnQgI25wcm9ncmVzcyAuYmFyLC5ucHJvZ3Jlc3MtY3VzdG9tLXBhcmVudCAjbnByb2dyZXNzIC5zcGlubmVye3Bvc2l0aW9uOmFic29sdXRlfUAtd2Via2l0LWtleWZyYW1lcyBucHJvZ3Jlc3Mtc3Bpbm5lcnswJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBucHJvZ3Jlc3Mtc3Bpbm5lcnswJXt0cmFuc2Zvcm06cm90YXRlKDApfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX08L3N0eWxlPiIpOwovLyDorr7nva7nqpflj6MKJCgnaGVhZCcpLmFwcGVuZCgiPHN0eWxlPi5ibGFja19vdmVybGF5e3RvcDowJTtsZWZ0OjAlO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZC1jb2xvcjojMDAwO3otaW5kZXg6MTAwMTstbW96LW9wYWNpdHk6MC44O29wYWNpdHk6LjEwO2ZpbHRlcjphbHBoYShvcGFjaXR5PTg4KX0uYmxhY2tfb3ZlcmxheSwud2hpdGVfY29udGVudHtkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGV9LndoaXRlX2NvbnRlbnR7ei1pbmRleDo5OTk5IWltcG9ydGFudDt0b3A6MjUlO2xlZnQ6MjUlO3dpZHRoOjY1MHB4O2hlaWdodDo2MCU7cGFkZGluZzoyMHB4O2JvcmRlcjowcHg7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDAuOSk7ei1pbmRleDoxMDAyO292ZXJmbG93OmF1dG99PC9zdHlsZT4iKTsKLy8g5o+Q56S65p2hCiQoJ2hlYWQnKS5hcHBlbmQoIjxzdHlsZT4udHJpcHNjb257cGFkZGluZzoxMHB4fTwvc3R5bGU+Iik7Ci8vIOaMiemSru+8iOaXp++8iQokKCdoZWFkJykuYXBwZW5kKCI8c3R5bGU+I3RvZ2dsZS1idXR0b257ZGlzcGxheTpub25lfS5idXR0b24tbGFiZWx7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6ODJweDtiYWNrZ3JvdW5kLWNvbG9yOiNjY2M7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlci1yYWRpdXM6MzBweDtjdXJzb3I6cG9pbnRlcn0uY2lyY2xle3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDozMHB4O2hlaWdodDozMHB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQtY29sb3I6I2ZmZn0uYnV0dG9uLWxhYmVsIC50ZXh0e2xpbmUtaGVpZ2h0OjMwcHg7Zm9udC1zaXplOjE4cHg7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9Lm9ue2NvbG9yOiNmZmY7ZGlzcGxheTpub25lO3RleHQtaW5kZW50OjEwcHh9Lm9mZntjb2xvcjojZmZmO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3RleHQtaW5kZW50OjUzcHh9LmJ1dHRvbi1sYWJlbCAuY2lyY2xle2xlZnQ6MDt0cmFuc2l0aW9uOmFsbCAuM3N9I3RvZ2dsZS1idXR0b246Y2hlY2tlZCtsYWJlbC5idXR0b24tbGFiZWwgLmNpcmNsZXtsZWZ0OjUwcHh9I3RvZ2dsZS1idXR0b246Y2hlY2tlZCtsYWJlbC5idXR0b24tbGFiZWwgLm9ue2Rpc3BsYXk6aW5saW5lLWJsb2NrfSN0b2dnbGUtYnV0dG9uOmNoZWNrZWQrbGFiZWwuYnV0dG9uLWxhYmVsIC5vZmZ7ZGlzcGxheTpub25lfSN0b2dnbGUtYnV0dG9uOmNoZWNrZWQrbGFiZWwuYnV0dG9uLWxhYmVse2JhY2tncm91bmQtY29sb3I6Izc4ZDY5MH08L3N0eWxlPiIpOwovLyDkv53lrZjmjInpkq4KJCgnaGVhZCcpLmFwcGVuZCgiPHN0eWxlPi5zYXZlQnV0dG9ue2JhY2tncm91bmQtY29sb3I6IzE5YTRlZDtib3JkZXI6bm9uZTtjb2xvcjojZmZmO3BhZGRpbmc6NXB4IDE1cHg7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOjE0cHg7Y3Vyc29yOnBvaW50ZXJ9PC9zdHlsZT4iKTsKLy8gU3RhciDmoLflvI8KJCgnaGVhZCcpLmFwcGVuZCgiPHN0eWxlPi5naXZlTWVPbmVTdGFyOmhvdmVye2NvbG9yOiNGRjY5QjQ7fTwvc3R5bGU+Iik7Ci8vIOiuvue9rueql+WPo+aWh+Wtl+aViOaenAppZiAoaXNGaXJlZm94KCkpIHsKICAgICQoJ2hlYWQnKS5hcHBlbmQoIjxzdHlsZT4uY29uZmlnQ29udGFpbmVyIGxhYmVse2ZvbnQtc2l6ZToxNXB4fS5jb25maWdDb250YWluZXIgcHtmb250LXNpemU6MTVweH0uZ2l2ZU1lT25lU3Rhcntmb250LXNpemU6MTVweH0uY29uZmlnQ29udGFpbmVyIC50aXRsZXtmb250LXNpemU6MjBweH0uY29uZmlnQ29udGFpbmVyIC5ib2xke2ZvbnQtd2VpZ2h0OmJvbGQ7bWFyZ2luLWJvdHRvbTo1cHh9PC9zdHlsZT4iKTsKfSBlbHNlIHsKICAgICQoJ2hlYWQnKS5hcHBlbmQoIjxzdHlsZT4uY29uZmlnQ29udGFpbmVyIGxhYmVse2ZvbnQtc2l6ZTo1cHh9LmNvbmZpZ0NvbnRhaW5lciBwe2ZvbnQtc2l6ZToxMHB4fS5naXZlTWVPbmVTdGFye2ZvbnQtc2l6ZToxNXB4fS5jb25maWdDb250YWluZXIgLnRpdGxle2ZvbnQtc2l6ZToyMHB4fS5jb25maWdDb250YWluZXIgLmJvbGR7Zm9udC13ZWlnaHQ6Ym9sZDttYXJnaW4tYm90dG9tOjVweH08L3N0eWxlPiIpOwp9Ci8vIFNWRwovL3ZhciBzYXZlX3N2ZyA9ICc8c3ZnIHQ9IjE1OTUwODI2NTAxNzMiIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTA3NSAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcC1pZD0iMjA3OCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIxNDAiPjxwYXRoIGQ9Ik03NTMuNzYzOTAyIDY4NS44MzAyNDRhNDguOTUyMTk1IDQ4Ljk1MjE5NSAwIDAgMSA0OS4xNTItNDguNzAyNDM5YzgxLjQyMDQ4OCAwIDE0MS4xNjIxNDYtNjUuMzg2MTQ2IDE0MS4xNjIxNDctMTQ2LjA1NzM2NiAwLTQzLjUwNzUxMi0xMy4wMzcyNjgtODIuNDE5NTEyLTQzLjQ1NzU2MS0xMDkuMjQzMzE3YTE0Mi4zNjA5NzYgMTQyLjM2MDk3NiAwIDAgMC0yMC4yODAxOTUtMTQuOTM1NDE1IDE1OC4wNDU2NTkgMTU4LjA0NTY1OSAwIDAgMC0xMS4yMzkwMjUtNi4yNDM5MDJsLTIuNzQ3MzE3LTEuMjk4NzMyYTE1NS44NDc4MDUgMTU1Ljg0NzgwNSAwIDAgMC05LjE5MTAyNC0zLjk5NjA5N2MtMS4zNDg2ODMtMC41NDk0NjMtMi42OTczNjYtMC45OTkwMjQtNC4wOTYtMS40OTg1MzdhMTUyLjM1MTIyIDE1Mi4zNTEyMiAwIDAgMC04LjQ5MTcwNy0yLjg0NzIxOWMtMS45NDgwOTgtMC41OTk0MTUtMy44OTYxOTUtMC45OTkwMjQtNS44NDQyOTMtMS40OTg1MzctMi40OTc1NjEtMC41OTk0MTUtNC45NDUxNzEtMS4yNDg3OC03LjQ5MjY4My0xLjc0ODI5My0yLjU5NzQ2My0wLjQ5OTUxMi01LjM0NDc4LTAuODk5MTIyLTguMDQyMTQ2LTEuMjQ4NzgtMS45NDgwOTgtMC4yNDk3NTYtMy44NDYyNDQtMC41OTk0MTUtNS44NDQyOTMtMC43OTkyMmExNTMuMTUwNDM5IDE1My4xNTA0MzkgMCAwIDAtMTQuNDM1OTAzLTAuNzQ5MjY4Yy0xLjQ5ODUzNyAwLTIuOTk3MDczIDAuMTk5ODA1LTQuNTQ1NTYxIDAuMjQ5NzU2YTI2NS4zOTA4MjkgMjY1LjM5MDgyOSAwIDAgMC01LjU5NDUzNi0yNC41MjYwNDljLTAuNDk5NTEyLTEuOTk4MDQ5LTEuMjk4NzMyLTMuODQ2MjQ0LTEuODk4MTQ2LTUuODQ0MjkyYTI2Ny40Mzg4MjkgMjY3LjQzODgyOSAwIDAgMC01Ljk0NDE5Ni0xNy45ODI0MzljLTAuNjQ5MzY2LTEuNzk4MjQ0LTEuNDk4NTM3LTMuNDk2NTg1LTIuMTk3ODUzLTUuMjk0ODNhMjgzLjEyMzUxMiAyODMuMTIzNTEyIDAgMCAwLTcuNzQyNDM5LTE3LjczMjY4M0w3NzIuNzQ1MzY2IDI2OS43MzY1ODVhMjgyLjk3MzY1OSAyODIuOTczNjU5IDAgMCAwLTkuNzkwNDM5LTE3LjgzMjU4NUM3MTQuMzAyNDM5IDE3MS41ODI0MzkgNjI1Ljg4ODc4IDEyNC44NzgwNDkgNTI0LjQ4NzgwNSAxMjQuODc4MDQ5Yy0xMDEuNDAwOTc2IDAtMTg5LjkxNDUzNyA0Ni42NTQ0MzktMjM4LjUxNzA3MyAxMjYuOTc2LTMuNDk2NTg1IDUuNzk0MzQxLTYuNjkzNDYzIDExLjc4ODQ4OC05Ljc5MDQzOSAxNy44MzI1ODVsLTIuMTk3ODU0IDQuMDk2YTI4My41MjMxMjIgMjgzLjUyMzEyMiAwIDAgMC03Ljc0MjQzOSAxNy43MzI2ODNsLTIuMTk3ODU0IDUuMjQ0ODc4Yy0yLjI0NzgwNSA1Ljg5NDI0NC00LjE0NTk1MSAxMS45ODgyOTMtNS45OTQxNDYgMTguMDMyMzktMC41NDk0NjMgMS45OTgwNDktMS4yOTg3MzIgMy44NDYyNDQtMS44NDgxOTUgNS44NDQyOTNhMjY2LjczOTUxMiAyNjYuNzM5NTEyIDAgMCAwLTUuNTk0NTM3IDI0LjQ3NjA5OGMtMS40OTg1MzcgMC0yLjk5NzA3My0wLjE5OTgwNS00LjU0NTU2MS0wLjE5OTgwNS00Ljg5NTIyIDAtOS42OTA1MzcgMC4yOTk3MDctMTQuNDg1ODUzIDAuNzQ5MjY4LTEuOTk4MDQ5IDAuMTk5ODA1LTMuODQ2MjQ0IDAuNDk5NTEyLTUuNzk0MzQyIDAuNzk5MjItMi42OTczNjYgMC4zNDk2NTktNS40NDQ2ODMgMC42OTkzMTctOC4wOTIwOTcgMS4yNDg3OC0yLjQ5NzU2MSAwLjQ5OTUxMi00Ljk5NTEyMiAxLjE0ODg3OC03LjQ5MjY4MyAxLjc0ODI5My0xLjg5ODE0NiAwLjQ5OTUxMi0zLjg0NjI0NCAwLjg5OTEyMi01Ljc5NDM0MiAxLjQ5ODUzNmExNTMuNjQ5OTUxIDE1My42NDk5NTEgMCAwIDAtOC40OTE3MDcgMi43OTcyNjlsLTQuMDk2IDEuNDk4NTM2YTE2NC4yODk1NjEgMTY0LjI4OTU2MSAwIDAgMC05LjI0MDk3NiAzLjk5NjA5OGwtMi42OTczNjYgMS4zNDg2ODNhMTQ1LjU1Nzg1NCAxNDUuNTU3ODU0IDAgMCAwLTMxLjQ2OTI2OCAyMS4xNzkzMTdDMTE3Ljg4NDg3OCA0MDguNjAwOTc2IDEwNC44OTc1NjEgNDQ3LjU2MjkyNyAxMDQuODk3NTYxIDQ5MS4wNzA0MzljMCA4MC42NzEyMiA1OS43NDE2NTkgMTQ2LjA1NzM2NiAxNDEuMTYyMTQ2IDE0Ni4wNTczNjZhNDguOTUyMTk1IDQ4Ljk1MjE5NSAwIDAgMSA0OS4xNTIgNDguNzAyNDM5IDQ4Ljk1MjE5NSA0OC45NTIxOTUgMCAwIDEtNDkuMTUyIDQ4LjcwMjQzOWMtMTM1LjcxNzQ2MyAwLTI0NS43MTAwNDktMTA4Ljk5MzU2MS0yNDUuNzEwMDQ4LTI0My40NjIyNDQgMC0xMDkuNjkyODc4IDczLjIyODQ4OC0yMDIuNDAyMzQxIDE3My44MzAyNDMtMjMyLjg3MjU4NUEzNzUuODMyOTc2IDM3NS44MzI5NzYgMCAwIDEgNTI0LjQ4NzgwNSAyMC4zMzAxNDZhMzc1Ljg4MjkyNyAzNzUuODgyOTI3IDAgMCAxIDM1MC4zMDc5MDIgMjM3Ljg2NzcwOGMxMDAuNjAxNzU2IDMwLjQ3MDI0NCAxNzMuODMwMjQ0IDEyMy4xNzk3MDcgMTczLjgzMDI0NCAyMzIuODcyNTg1IDAgMTM0LjQ2ODY4My0xMDkuOTkyNTg1IDI0My40NjIyNDQtMjQ1LjcxMDA0OSAyNDMuNDYyMjQ0YTQ4Ljk1MjE5NSA0OC45NTIxOTUgMCAwIDEtNDkuMTAyMDQ4LTQ4LjcwMjQzOXoiIHAtaWQ9IjIwNzkiPjwvcGF0aD48cGF0aCBkPSJNNDg3Ljk3MzQ2MyAzODYuMTIyOTI3YTQ5LjEwMjA0OSA0OS4xMDIwNDkgMCAwIDEgNzIuOTI4NzgxIDAuMDk5OTAybDE0Ny4zNTYwOTcgMTYyLjA0MTc1NmM2Ljk5MzE3MSA3Ljc0MjQzOSAxMS40ODg3OCAxOS40MzEwMjQgMTIuNTM3NzU3IDMwLjEyMDU4NmwwLjI0OTc1NiAxMi45MzczNjZjMCAxOS40ODA5NzYtMjAuNDggMzkuNjYxMjY4LTM5LjIxMTcwOCAzOS42NjEyNjhoLTEwNC44OTc1NjF2MjYyLjk5MzE3MWE1Mi40NDg3OCA1Mi40NDg3OCAwIDEgMS0xMDQuODk3NTYxIDB2LTI2Mi45OTMxNzFoLTEwNC44OTc1NjFjLTEzLjg4NjQzOSAwLTM5LjIxMTcwNy0yMS43Mjg3OC0zOS4yMTE3MDctMzkuNjYxMjY4di0xMi45ODczMTdjMC0xMi40ODc4MDUgNC43OTUzMTctMjEuMjc5MjIgMTIuNjM3NjU5LTI5LjkyMDc4MWwxNDcuMzU2MDk3LTE2Mi4yOTE1MTJ6IiBwLWlkPSIyMDgwIj48L3BhdGg+PC9zdmc+JzsKdmFyIHN0YXJfc3ZnXzEgPSAnPHN2ZyB0PSIxNTk1MDgzNjMxNjg1IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwNTEgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjIxNzMiIHdpZHRoPSIxNDAiIGhlaWdodD0iMTQwIj48cGF0aCBkPSJNNTI1LjgzNzgzOCA4NTIuNDEwODExTDE5OS4yNjQ4NjUgMTAwMS44NTk0NTlsNDEuNTEzNTEzLTM1Ny4wMTYyMTZMMCAzODEuOTI0MzI0bDM1MS40ODEwODEtNjkuMTg5MTg5TDUyNS44Mzc4MzggMGwxNzQuMzU2NzU3IDMxMi43MzUxMzVMMTA1MS42NzU2NzYgMzgxLjkyNDMyNGwtMjQwLjc3ODM3OSAyNjIuOTE4OTE5IDQxLjUxMzUxNCAzNTcuMDE2MjE2eiIgZmlsbD0iI0ZGRDU2NiIgcC1pZD0iMjE3NCI+PC9wYXRoPjwvc3ZnPic7CnZhciBzdGFyX3N2Z18yID0gJyA8c3ZnIHQ9IjE1OTUwODM3MTUzMTIiIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcC1pZD0iNzg0OCIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIxNDAiPjxwYXRoIGQ9Ik0xMDE0LjAwMTM0NyA4NjYuMDkwMjM2TDgxMC4yMzU2OSA2NjIuMzI0NTc5bDE0NS40OTc2NDMtODQuMTI2NTk5YzExLjM3Nzc3OC02LjU1MDg0MiAxNy45Mjg2Mi0xOC45NjI5NjMgMTYuODk0Mjc2LTMyLjA2NDY0Ny0xLjAzNDM0My0xMy4xMDE2ODQtOS4zMDkwOTEtMjQuNDc5NDYxLTIxLjM3NjQzMS0yOS4zMDYzOTdsLTY0OC4xODg1NTItMjU4LjU4NTg1OWMtMTIuNzU2OTAyLTUuMTcxNzE3LTI3LjIzNzcxLTIuMDY4Njg3LTM2Ljg5MTU4MiA3LjU4NTE4Ni05LjY1Mzg3MiA5LjY1Mzg3Mi0xMi43NTY5MDIgMjQuMTM0NjgtNy41ODUxODUgMzYuODkxNTgybDI1OC41ODU4NTggNjQ4LjUzMzMzM2M0LjgyNjkzNiAxMi4wNjczNCAxNi4yMDQ3MTQgMjAuNjg2ODY5IDI5LjMwNjM5NyAyMS4zNzY0MzEgMTMuMTAxNjg0IDEuMDM0MzQzIDI1LjUxMzgwNS01LjUxNjQ5OCAzMi4wNjQ2NDctMTYuODk0Mjc2bDg0LjEyNjU5OS0xNDUuNDk3NjQzIDIwMy43NjU2NTcgMjAzLjc2NTY1N2M2LjU1MDg0MiA2LjU1MDg0MiAxNS4xNzAzNyA5Ljk5ODY1MyAyNC4xMzQ2OCA5Ljk5ODY1MyA4Ljk2NDMxIDAgMTcuOTI4NjItMy40NDc4MTEgMjQuMTM0NjgtOS45OTg2NTNsOTkuMjk2OTctOTkuMjk2OTdjMTMuNDQ2NDY1LTEzLjQ0NjQ2NSAxMy40NDY0NjUtMzUuMTY3Njc3IDAtNDguNjE0MTQxek0xNTAuMzI0NTc5IDEwMi4wNTUyMTljLTEzLjQ0NjQ2NS0xMy40NDY0NjUtMzUuMTY3Njc3LTEzLjQ0NjQ2NS00OC4yNjkzNiAwLTEzLjQ0NjQ2NSAxMy40NDY0NjUtMTMuNDQ2NDY1IDM1LjE2NzY3NyAwIDQ4LjI2OTM2bDc2LjE5NjYzMyA3Ni4xOTY2MzNjNi41NTA4NDIgNi41NTA4NDIgMTUuNTE1MTUyIDkuOTk4NjUzIDI0LjEzNDY4IDkuOTk4NjUzczE3LjU4MzgzOC0zLjQ0NzgxMSAyNC4xMzQ2OC05Ljk5ODY1M2MxMy40NDY0NjUtMTMuNDQ2NDY1IDEzLjQ0NjQ2NS0zNS4xNjc2NzcgMC00OC4yNjkzNkwxNTAuMzI0NTc5IDEwMi4wNTUyMTl6TTE3Ni4xODMxNjUgMzM4LjU3NTA4NGMwLTE4Ljk2Mjk2My0xNS4xNzAzNy0zNC4xMzMzMzMtMzQuMTMzMzMzLTM0LjEzMzMzM0gzNC4xMzMzMzNjLTE4Ljk2Mjk2MyAwLTM0LjEzMzMzMyAxNS4xNzAzNy0zNC4xMzMzMzMgMzQuMTMzMzMzczE1LjE3MDM3IDM0LjEzMzMzMyAzNC4xMzMzMzMgMzQuMTMzMzM0aDEwNy41NzE3MThjMTguOTYyOTYzIDAgMzQuNDc4MTE0LTE1LjE3MDM3IDM0LjQ3ODExNC0zNC4xMzMzMzR6TTE2Mi4zOTE5MTkgNDQ0LjQyMjg5NmwtNzYuMTk2NjMzIDc1Ljg1MTg1MWMtMTMuNDQ2NDY1IDEzLjQ0NjQ2NS0xMy40NDY0NjUgMzUuMTY3Njc3IDAgNDguMjY5MzYxIDYuNTUwODQyIDYuNTUwODQyIDE1LjUxNTE1MiA5Ljk5ODY1MyAyNC4xMzQ2OCA5Ljk5ODY1M3MxNy41ODM4MzgtMy40NDc4MTEgMjQuMTM0NjgtOS45OTg2NTNsNzYuMTk2NjMzLTc2LjE5NjYzM2MxMy40NDY0NjUtMTMuNDQ2NDY1IDEzLjQ0NjQ2NS0zNS4xNjc2NzcgMC00OC4yNjkzNjEtMTMuNDQ2NDY1LTEzLjEwMTY4NC0zNS4xNjc2NzctMTMuMTAxNjg0LTQ4LjI2OTM2IDAuMzQ0Nzgyek0zMzguNTc1MDg0IDE3Ni4xODMxNjVjMTguOTYyOTYzIDAgMzQuMTMzMzMzLTE1LjE3MDM3IDM0LjEzMzMzNC0zNC4xMzMzMzNWMzQuMTMzMzMzYzAtMTguOTYyOTYzLTE1LjE3MDM3LTM0LjEzMzMzMy0zNC4xMzMzMzQtMzQuMTMzMzMzcy0zNC4xMzMzMzMgMTUuMTcwMzctMzQuMTMzMzMzIDM0LjEzMzMzM3YxMDcuNTcxNzE4YzAgMTguOTYyOTYzIDE1LjE3MDM3IDM0LjQ3ODExNCAzNC4xMzMzMzMgMzQuNDc4MTE0ek00NjguNTU3NTc2IDIyMC42NTk5MzNjOC42MTk1MjkgMCAxNy41ODM4MzgtMy40NDc4MTEgMjQuMTM0NjgtOS45OTg2NTRMNTY4Ljg4ODg4OSAxMzQuNDY0NjQ2YzEzLjQ0NjQ2NS0xMy40NDY0NjUgMTMuNDQ2NDY1LTM1LjE2NzY3NyAwLTQ4LjI2OTM2LTEzLjQ0NjQ2NS0xMy40NDY0NjUtMzUuMTY3Njc3LTEzLjQ0NjQ2NS00OC4yNjkzNiAwbC03Ni4xOTY2MzMgNzYuMTk2NjMzYy0xMy40NDY0NjUgMTMuNDQ2NDY1LTEzLjQ0NjQ2NSAzNS4xNjc2NzcgMCA0OC4yNjkzNiA2LjU1MDg0MiA2LjU1MDg0MiAxNS41MTUxNTIgOS45OTg2NTMgMjQuMTM0NjggOS45OTg2NTR6IiBmaWxsPSIjMmMyYzJjIiBwLWlkPSI3ODQ5Ij48L3BhdGg+PC9zdmc+JzsKdmFyIHN0YXJfc3ZnXzMgPSAnIDxzdmcgdD0iMTU5NTA4MzkyNTQzOCIgY2xhc3M9Imljb24iIHZpZXdCb3g9IjAgMCAxMjA0IDEwMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBwLWlkPSI0ODA5IiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjE0MCI+PHBhdGggZD0iTTEwODguODY0MzQ4IDYxOC4xMzcwMWExNTU1LjAwOTM4NCAxNTU1LjAwOTM4NCAwIDAgMS0xNTAuMjczMDA0IDE2Ny4xMzczMDhjLTUyLjg4MTY0MiA1MS4xOTUyMTItMTA3LjkzMTU1MiAxMDEuMTg1ODMtMTYzLjY0Mzk4OSAxNDcuMjYxNTIxLTMzLjg0OTA2OSAyNy41MjQ5NTUtNjAuMjI5NjYxIDQ4LjY2NTU2Ni03Ni4xOTA1MjEgNjAuMjI5NjYxYTE2Mi45ODE0NjIgMTYyLjk4MTQ2MiAwIDAgMS0xOTEuODkxNjk5IDBjLTE1LjUzOTI1My0xMi4wNDU5MzItNDIuMTYwNzYzLTMyLjY0NDQ3Ni03Ni4xOTA1MjEtNjAuODMxOTU3YTI2MzguNDgwNzU0IDI2MzguNDgwNzU0IDAgMCAxLTE2NC4zNjY3NDUtMTQ3LjI2MTUyMSAxNTc5LjEwMTI0OSAxNTc5LjEwMTI0OSAwIDAgMS0xNTAuMjczMDA0LTE2NS44MTIyNTdBNDY4LjEwNDkyNCA0NjguMTA0OTI0IDAgMCAxIDAuMTUyOTk4IDM0NC43NTQ1NzkgMzE1LjU0MzE5MyAzMTUuNTQzMTkzIDAgMCAxIDEwOS4wNDgyMjUgOTYuMzY3NDU3YTM5OS40NDMxMTEgMzk5LjQ0MzExMSAwIDAgMSA0OTMuODgzMjE5LTIwLjQ3ODA4NCAzOTguNjYwMTI1IDM5OC42NjAxMjUgMCAwIDEgNDkzLjg4MzIxOSAyMC40NzgwODRBMzE1LjQ4Mjk2NCAzMTUuNDgyOTY0IDAgMCAxIDEyMDQuNzQ2MjE1IDM0My4zMDkwNjdhNDY2Ljg0MDEwMSA0NjYuODQwMTAxIDAgMCAxLTExNS43MDExNzggMjc0LjY0NzI1NHoiIGZpbGw9IiNGRTRCODMiIHAtaWQ9IjQ4MTAiPjwvcGF0aD48L3N2Zz4nOwp2YXIgc3Rhcl9zdmdfNCA9ICcgPHN2ZyB0PSIxNTk1MDg0MDg5MTE1IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjgwMDgiIHdpZHRoPSIxNDAiIGhlaWdodD0iMTQwIj48cGF0aCBkPSJNNTEyIDQ2LjU0NTQ1NUMyNTYgNDYuNTQ1NDU1IDQ2LjU0NTQ1NSAyNTYgNDYuNTQ1NDU1IDUxMnMyMDkuNDU0NTQ1IDQ2NS40NTQ1NDUgNDY1LjQ1NDU0NSA0NjUuNDU0NTQ1IDQ2NS40NTQ1NDUtMjA5LjQ1NDU0NSA0NjUuNDU0NTQ1LTQ2NS40NTQ1NDVTNzY4IDQ2LjU0NTQ1NSA1MTIgNDYuNTQ1NDU1eiBtMCA4MzcuODE4MTgxYy0yMDQuOCAwLTM3Mi4zNjM2MzYtMTY3LjU2MzYzNi0zNzIuMzYzNjM2LTM3Mi4zNjM2MzZzMTY3LjU2MzYzNi0zNzIuMzYzNjM2IDM3Mi4zNjM2MzYtMzcyLjM2MzYzNiAzNzIuMzYzNjM2IDE2Ny41NjM2MzYgMzcyLjM2MzYzNiAzNzIuMzYzNjM2LTE2Ny41NjM2MzYgMzcyLjM2MzYzNi0zNzIuMzYzNjM2IDM3Mi4zNjM2MzZ6IiBmaWxsPSIjMDBDNUM1IiBwLWlkPSI4MDA5Ij48L3BhdGg+PHBhdGggZD0iTTY1Ni4yOTA5MDkgNTg2LjQ3MjcyN2MtNzkuMTI3MjczIDY5LjgxODE4Mi0yMDkuNDU0NTQ1IDY5LjgxODE4Mi0yODguNTgxODE4IDAtMTguNjE4MTgyLTEzLjk2MzYzNi00MS44OTA5MDktMTMuOTYzNjM2LTYwLjUwOTA5MSA0LjY1NDU0Ni0xMy45NjM2MzYgMTMuOTYzNjM2LTEzLjk2MzYzNiA0MS44OTA5MDkgNC42NTQ1NDUgNjAuNTA5MDkxIDU1Ljg1NDU0NSA1MS4yIDEyNS42NzI3MjcgNzQuNDcyNzI3IDIwMC4xNDU0NTUgNzQuNDcyNzI3czE0NC4yOTA5MDktMjcuOTI3MjczIDIwMC4xNDU0NTUtNzQuNDcyNzI3YzE4LjYxODE4Mi0xMy45NjM2MzYgMTguNjE4MTgyLTQxLjg5MDkwOSA0LjY1NDU0NS02MC41MDkwOTFzLTQxLjg5MDkwOS0xOC42MTgxODItNjAuNTA5MDkxLTQuNjU0NTQ2ek0zNTguNCA0NjAuOGMyNy45MjcyNzMgMCA1MS4yLTIzLjI3MjcyNyA1MS4yLTUxLjJzLTIzLjI3MjcyNy01NS44NTQ1NDUtNTEuMi01NS44NTQ1NDVjLTI3LjkyNzI3MyAwLTUxLjIgMjMuMjcyNzI3LTUxLjIgNTEuMnMyMy4yNzI3MjcgNTUuODU0NTQ1IDUxLjIgNTUuODU0NTQ1ek02NjUuNiA0NjAuOGMyNy45MjcyNzMgMCA1MS4yLTIzLjI3MjcyNyA1MS4yLTUxLjJzLTIzLjI3MjcyNy01MS4yLTUxLjItNTEuMi01MS4yIDIzLjI3MjcyNy01MS4yIDUxLjIgMjMuMjcyNzI3IDUxLjIgNTEuMiA1MS4yeiIgZmlsbD0iIzAwQzVDNSIgcC1pZD0iODAxMCI+PC9wYXRoPjwvc3ZnPic7CnZhciBzdGFyX3N2ZyA9IHN0YXJfc3ZnXzEgKyBzdGFyX3N2Z18yICsgc3Rhcl9zdmdfMyArIHN0YXJfc3ZnXzQ7CnZhciBkb25hdGVfc3ZnID0gJzxzdmcgdD0iMTU5Mjk4MjUwODI1OCIgY2xhc3M9Imljb24iIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBwLWlkPSI0MjA3IiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiPjxwYXRoIGQ9Ik02NjQuNDggMjM0LjQzMmEzMiAzMiAwIDAgMC00NS4yNDgtMC44bC03Ni4yNTYgNzMuNi03My4zNDQtNzMuMjE2YTMyIDMyIDAgMSAwLTQ1LjI0OCA0NS4zMTJsNzIuMzg0IDcyLjI1NmgtNDkuMjhhMzIgMzIgMCAwIDAgMCA2NGg2My43NzZ2MzJoLTYzLjc3NmEzMiAzMiAwIDAgMCAwIDY0aDYzLjc3NnY2NS42NjRhMzIgMzIgMCAxIDAgNjQgMHYtNjUuNjY0aDY0LjI4OGEzMiAzMiAwIDEgMCAwLTY0aC02NC4yODh2LTMyaDY0LjI4OGEzMiAzMiAwIDEgMCAwLTY0aC01MC4zNjhsNzQuNDY0LTcxLjg3MmEzMi4wMzIgMzIuMDMyIDAgMCAwIDAuODMyLTQ1LjI4eiBtMjc1LjIgNTAzLjU1MmE5MDE3LjU2OCA5MDE3LjU2OCAwIDAgMC0xNDEuNjY0LTU2LjczNiAzNjguNTEyIDM2OC41MTIgMCAwIDAgOTcuNTY4LTI0OC42MDhjMC0yMDIuOTEyLTE2NS4xMi0zNjgtMzY4LjA2NC0zNjhzLTM2OCAxNjUuMDg4LTM2OCAzNjhjMCAxNi4yMjQgMS4wMjQgMzIuMzUyIDMuMDcyIDQ3Ljk2OCAyLjMwNCAxNy41MDQgMTguNDk2IDI5LjY2NCAzNS45MDQgMjcuNTg0YTMyIDMyIDAgMCAwIDI3LjU4NC0zNS45MDQgMzA0LjUxMiAzMDQuNTEyIDAgMCAxLTIuNTYtMzkuNjQ4YzAtMTY3LjYxNiAxMzYuMzg0LTMwNCAzMDQtMzA0IDE2Ny42NDggMCAzMDQuMDY0IDEzNi4zODQgMzA0LjA2NCAzMDRhMzAwLjU0NCAzMDAuNTQ0IDAgMCAxLTk2LjEyOCAyMjEuNDcyYy0wLjc2OCAwLjczNi0xLjA4OCAxLjc2LTEuODI0IDIuNTI4LTQyLjg0OC0xNS45MzYtNzkuMzI4LTI4LjQ4LTkzLjc2LTMwLjY1Ni0yNC44OTYtMy45MDQtNDguNjcyIDcuNjE2LTYzLjEwNCAyOC44OTYtMTIuMDMyIDE3Ljc5Mi0xNS4wNzIgMzguODE2LTguMDk2IDU2LjI1NiA0LjI4OCAxMC42NTYgMjAuNTEyIDMyLjg5NiAzOS43NzYgNTcuMjgtNDYuNDMyLTAuMDY0LTExNy4zMTItNi4zMzYtMTkyLjgzMi0zNS40ODgtMzEuMjY0LTEyLjA2NC02OS40NC01Mi42NC0xMDMuMTM2LTg4LjQxNi00Ny45NjgtNTAuOTc2LTkzLjI4LTk5LjEwNC0xNDIuNTYtOTkuMTA0LTE4LjMzNiAwLTM1Ljc0NCA2Ljg0OC01MC4zMzYgMTkuNzc2LTE4LjI0IDE2LjIyNC0zNS4xMzYgNDguMzItMTIgMTA5LjI0OCA0Mi42MjQgMTEyLjE2IDIwOC41NDQgMjg1LjEyIDM0MS43MjggMjg1LjEyaDQ3OC4xNDRhMzIgMzIgMCAwIDAgMzItMzJ2LTE2MGEzMS44NCAzMS44NCAwIDAgMC0xOS43NzYtMjkuNTY4eiBtLTQ0LjE2IDE1Ny42aC00NDUuMTJsLTEuMDI0IDMydi0zMmMtOTcuNiAwLTI0Ny4wNzItMTUyLjEyOC0yODEuOTItMjQzLjg3Mi0xMC4xMTItMjYuNjU2LTYuNzItMzcuNDA4LTUuMzQ0LTM4LjYyNCA0LjEyOC0zLjY0OCA2LjUyOC0zLjY0OCA3Ljg0LTMuNjQ4IDIxLjYzMiAwIDY0LjYwOCA0NS42MzIgOTUuOTY4IDc4Ljk0NCA0MC4yMjQgNDIuNzUyIDgxLjg1NiA4Ni45NDQgMTI2LjY1NiAxMDQuMjU2IDg1LjIxNiAzMi44OTYgMTY0Ljg5NiAzOS44MDggMjE2LjczNiAzOS44MDggNDEuMzc2IDAgNjcuNTg0LTQuMzUyIDY4LjY3Mi00LjU0NGEzMiAzMiAwIDAgMCAxOS4xMzYtNTIuMTZjLTI3LjAwOC0zMi4wOTYtNTguNTkyLTcxLjgwOC02Ny4yOTYtODUuMzQ0IDAuMjg4LTAuNTc2IDAuNTEyLTEuMDI0IDAuMzUyLTEuMTUyIDIyLjg0OCAzLjQ4OCAxNjIuNDMyIDU3Ljk1MiAyNjUuMjggOTkuODR2MTA2LjQ5NnoiIHAtaWQ9IjQyMDgiPjwvcGF0aD48L3N2Zz4nOwp2YXIgc2V0X3N2ZyA9ICc8c3ZnIHQ9IjE1OTI5ODI5NzAzNzUiIGNsYXNzPSJpY29uIiB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgcC1pZD0iMTAxMTIiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZD0iTTI1NiAxMDIuNGg1MTJsMjU2IDI1Ni01MTIgNTYzLjJMMCAzNTguNHoiIGZpbGw9IiMyNkNENjMiIHAtaWQ9IjEwMTEzIj48L3BhdGg+PHBhdGggZD0iTTI1NiAxMDIuNGwyNTYgMjU2SDB6TTc2OCAxMDIuNGwyNTYgMjU2SDUxMnpNNTEyIDkyMS42bDIwNC44LTU2My4ySDMwNy4yeiIgZmlsbD0iIzE0QTM0NSIgcC1pZD0iMTAxMTQiPjwvcGF0aD48L3N2Zz4nOwp2YXIgc2F2ZV9zdmcgPSAnPHN2ZyB0PSIxNjI5NDQ4NTg4MzUxIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9Ijc4NDkiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48cGF0aCBkPSJNNTEyIDBDMjI5LjIgMCAwIDIyOS4yIDAgNTEyczIyOS4yIDUxMiA1MTIgNTEyIDUxMi0yMjkuMiA1MTItNTEyUzc5NC44IDAgNTEyIDB6IG0wIDk0NS4yQzI3My4xIDk0NS4yIDc4LjggNzUwLjkgNzguOCA1MTJTMjczLjEgNzguOCA1MTIgNzguOCA5NDUuMiAyNzMuMSA5NDUuMiA1MTIgNzUwLjkgOTQ1LjIgNTEyIDk0NS4yeiIgcC1pZD0iNzg1MCIgZmlsbD0iI2ZmZmZmZiI+PC9wYXRoPjxwYXRoIGQ9Ik02ODAuOSAzNTkuNEw0NjEgNTgyLjMgMzQxLjYgNDczLjZjLTE2LTE0LjYtNDEtMTMuNC01NS42IDIuNi0xNC43IDE2LjEtMTMuNSA0MSAyLjYgNTUuNkw0MzYgNjY2LjFjNy41IDYuOCAxNyAxMC4yIDI2LjUgMTAuMiAxMC4yIDAgMjAuMy0zLjkgMjgtMTEuN0w3MzcgNDE0LjdjMTUuMy0xNS41IDE1LjEtNDAuNC0wLjQtNTUuNy0xNS41LTE1LjItNDAuNS0xNS4xLTU1LjcgMC40eiIgcC1pZD0iNzg1MSIgZmlsbD0iI2ZmZmZmZiI+PC9wYXRoPjwvc3ZnPic7CnZhciBzZXR0aW5nc19zdmcgPSAnPHN2ZyB0PSIxNjI5NDMzMzYwNDYyIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjI4NzAiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48cGF0aCBkPSJNMTAwNi40MzggMTcuNTQ4Yy0wLjAzMiAwLTQzMC40My0xMTIuOTY2LTc4MC40NSAyMzcuMDIyLTI4OC45OSAyODkuMDA4LTMzLjUyMiA1NzYuOTY2LTMzLjUyMiA1NzYuOTY2czI4Ny45NTggMjU1LjQ4NCA1NzYuOTUyLTMzLjU1QzExMTkuNDM2IDQ0OC4wMTIgMTAwNi40NjggMTcuNjEyIDEwMDYuNDM4IDE3LjU0OHoiIGZpbGw9IiM5RUQzNkEiIHAtaWQ9IjI4NzEiPjwvcGF0aD48cGF0aCBkPSJNMTAwNi40MzggMTcuNTQ4bC00Mi42NzQtOC4yMTZjMC4wMzIgMC4wNjIgMTEyLjk5OCA0MzguNjc4LTIzNi45OSA3ODguNjUyLTk2LjM0NCA5Ni40MDYtMTkyLjU5OCAxMzIuMjA4LTI3OC4xMDQgMTM3LjE0NCA5NS40MSA1LjUgMjA4LTI0LjM2OCAzMjAuNzQ4LTEzNy4xNDRDMTExOS40MzYgNDQ4LjAxMiAxMDA2LjQ2OCAxNy42MTIgMTAwNi40MzggMTcuNTQ4eiIgZmlsbD0iI0ZGRkZGRiIgb3BhY2l0eT0iLjIiIHAtaWQ9IjI4NzIiPjwvcGF0aD48cGF0aCBkPSJNNjAwLjQwNiA0MjMuNjEyYy04LjMwOC04LjM0LTIxLjgzNi04LjM0LTMwLjE0OCAwTDYuNCA5ODcuNDI2Yy04LjMyNiA4LjM3Mi04LjMyNiAyMS44NjggMCAzMC4xOCA4LjMyNiA4LjMwOCAyMS44MjIgOC4zMDggMzAuMTYyIDBMNjAwLjQwNiA0NTMuNzZjOC4zNC04LjM0MiA4LjM0LTIxLjgzOCAwLTMwLjE0OHoiIGZpbGw9IiM4QUMwNTQiIHAtaWQ9IjI4NzMiPjwvcGF0aD48L3N2Zz4nOwp2YXIgcHJvdGVjdF9zdmcgPSAnPHN2ZyB0PSIxNjI5NTYwNTM4ODA1IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjMyMTIiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48cGF0aCBkPSJNODAwLjMgMjA1LjFMNTM0LjggMTE2Yy0xNi01LjQtMzMuMy01LjMtNDkuMiAwLjJsLTI2NC41IDkyLjNjLTI5LjMgMTAtNDkgMzcuNS00OS4xIDY4LjRsMS43IDI2NS40YzAuNyA4MSAzMS4xIDE1OC45IDg1LjYgMjE4LjkgMjUgMjcuNyA1Ni45IDUxLjUgOTcuOCA3Mi43bDE0NCA3NC42YzkgNC43IDE5LjcgNC42IDI4LjctMC4yTDY3Mi41IDgzMmM0MC40LTIxLjYgNzIuMi00NS43IDk2LjktNzMuOCA1My42LTYwLjYgODMtMTM4LjkgODIuNi0yMTkuOGwtMS43LTI2NS42Yy0wLjUtMzAuOS0yMC41LTU4LjEtNTAtNjcuN3oiIGZpbGw9IiMwN0MxNjAiIHAtaWQ9IjMyMTMiPjwvcGF0aD48cGF0aCBkPSJNNDc0LjEgNjUyYy03LjEgMC0xMy44LTIuOC0xOC45LTcuOGwtMTUxLTE1MS4xYy0xMC40LTEwLjQtMTAuNC0yNy40IDAtMzcuOHMyNy40LTEwLjQgMzcuOCAwbDEzMi4xIDEzMi4yIDIwNy43LTIwNy43YzEwLjQtMTAuNCAyNy40LTEwLjQgMzcuOCAwIDEwLjQgMTAuNCAxMC40IDI3LjQgMCAzNy44TDQ5MyA2NDQuMmMtNSA1LTExLjggNy44LTE4LjkgNy44eiIgZmlsbD0iI0ZGRkZGRiIgcC1pZD0iMzIxNCI+PC9wYXRoPjwvc3ZnPic7CgovLyBqcXVlcnkuc2hvd3RpcHMuanMKKGZ1bmN0aW9uKGpRdWVyeSkgewoJalF1ZXJ5LmZuLnNob3dUaXBzID0gZnVuY3Rpb24ob3B0aW9ucyxlbGVtKXsKCQl2YXIgY29uZmlnID0gewoJCQlza2luOiJ0cmlwcyIsCgkJCWNvbnRlbnQ6JCh0aGlzKS5hdHRyKCJ0aXBzIil8fCLlvLnlh7rnsbvlnovnmoTmsJTms6Hmj5DnpLrvvIEiLCAgLy/msJTms6Hmj5DnpLrlhoXlrrnph4zpnaLlj6/ku6XmmK9IVE1M77yM6buY6K6k5pi+56S66Ieq5a6a5LmJ55qE5o+Q56S65YaF5a65CgkJCXdpZHRoOiJhdXRvIiwgIC8v6buY6K6k5Li6YXV0b++8jOWPr+S7peWGmeWFt+S9k+WwuuWvuOWmgu+8mjIwMAoJCQlhbGlnblRvOlsicmlnaHQiLCJjZW50ZXIiXSwgIC8v566t5aS05pa55ZCRCgkJCWNvbG9yOlsicmdiKDI0NywgMjA2LCA1NykiLCIjRkZGRUY0Il0sICAvL+i/memHjOaYr+aPkOekuuWxgueahOmjjuagvO+8jOesrOS4gOS4quWPguaVsOS4uuaPkOekuui+ueahhuminOiJsu+8jOesrOS6jOS4quWPguaVsOS4uuaPkOekuuiDjOaZr+minOiJsgoJCQl0eXBlOiJodG1sIiwgICAvL+aYvuekuuWGheWuueexu+WeiwoJCQl0cmlnZ2VyOiJjbGljayIsICAgIC8v6buY6K6k5Li654K55Ye75pi+56S677yMc2hvd+S4uuWIneWni+WMluWwseaYvuekuu+8jGhvdmVy5Li657uP6L+H5pi+56S677yMZm9jdXPnhKbngrnmmL7npLrvvIxtb3VzZei3n+maj+m8oOagh+aYvuekuumakOiXjwoJCQlzcGFjaW5nOjEwLCAgLy/pu5jorqTkuLrnrq3lpLTot53nprvlr7nosaHnmoTlsLrlr7gKCQkJY3VzdG9taWQ6IiIsICAvL+iHquWumuS5iUlECgkJCWlzY2xvc2U6ZmFsc2UsICAgLy/mmK/lkKbmmL7npLrlhbPpl63mjInpkq4KCQkJc3VjY2VzcyA6IG51bGwgICAgLy/miJDlip/lkI7nmoTlm57osIPlh73mlbAKCQl9OwoJCXZhciBvcHRzID0galF1ZXJ5LmV4dGVuZChjb25maWcsIG9wdGlvbnMpOwoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJdmFyIHRoYXQgPSBqUXVlcnkodGhpcyksdGlwQm94LHRpcElkLHNlbGZILHNlbGZXLGNvbklkLGRvY1csIHNwYSA9IG9wdHMuc3BhY2luZywgc2tpbj1vcHRzLnNraW47CgkJCXZhciBNYXRocmFuZG9tID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOTk5OTk5OSk7CiAgICAgICAgICAgIHZhciBwbXIgPSAob3B0cy5jdXN0b21pZD09IiIpID8gTWF0aHJhbmRvbSA6b3B0cy5jdXN0b21pZC5yZXBsYWNlKC9bIy5dLywgIiIpOwoJCQl2YXIgcG9pbnRlcj1vcHRzLmFsaWduVG8ubGVuZ3RoPT09MSA/ICcnK29wdHMuYWxpZ25Ub1swXSsnJyA6ICcnK29wdHMuYWxpZ25Ub1swXSsnLScrb3B0cy5hbGlnblRvWzFdKycnOwoKCQkJaWYodHlwZW9mIGVsZW0gPT0gJ3N0cmluZycpIHsKCQkJCWlmKGVsZW0gPT0ic2hvdyIpewoJCQkJCWpRdWVyeSgnI3RpcCcrcG1yKS5zaG93KCk7ICBqUXVlcnkoIiNjb24iK3BtcikuaHRtbChvcHRzLmNvbnRlbnQpOwoJCQkJCXNob3dQb3NpdGlvbihwb2ludGVyLGpRdWVyeSgnI3RpcCcrcG1yKSk7CgkJCQkJfTsKCQkJCWlmKGVsZW0gPT0iaGlkZSIpe2pRdWVyeSgnI3RpcCcrcG1yKS5oaWRlKCl9OwoJCQl9OwoJCQlpZih0eXBlb2YgZWxlbSA9PSAnJyB8fCB0eXBlb2YgZWxlbSA9PSB1bmRlZmluZWQpe3JldHVybiB0cnVlfTsKCQkJaWYoalF1ZXJ5KCcjdGlwJytwbXIpLmxlbmd0aD09MSl7cmV0dXJuIGZhbHNlO30KCQkJdGlwQm94PWpRdWVyeSgnPGRpdiBjbGFzcz0iJytza2luKycgJytza2luKyctJytwb2ludGVyKyciIGlkPSJ0aXAnK3BtcisnIj48aT48L2k+PGVtPjwvZW0+PGRpdiBjbGFzcz0iJytza2luKydjb24iIGlkPSJjb24nK3BtcisnIj48L2Rpdj48L2Rpdj4nKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTsKCQkJdGlwSWQgPSBqUXVlcnkoIiN0aXAiK3Btcik7CgkJCWNvbklkID0galF1ZXJ5KCIjY29uIitwbXIpOwoKCQkJdmFyIGVkZ2Vjb2xvcj0nYm9yZGVyLScrb3B0cy5hbGlnblRvWzBdKyctY29sb3InLCB0Zmk9dGlwSWQuZmluZCgiaSIpLCB0ZmVtPXRpcElkLmZpbmQoImVtIiksIHRmaWVtPXRpcElkLmZpbmQoImksZW0iKTsKCQkJdGlwSWQuY3NzKHsncG9zaXRpb24nOidhYnNvbHV0ZScsYm9yZGVyOicxcHggc29saWQnLCdib3JkZXItY29sb3InOm9wdHMuY29sb3JbMF0sJ2JhY2tncm91bmQtY29sb3InOm9wdHMuY29sb3JbMV19KTsKCQkJaWYob3B0cy5hbGlnblRvWzFdPT0nY2VudGVyJyl7IHZhciBvZmZwb3M9NTAscGVyY2VuPSIlIjsgfWVsc2V7IHZhciBvZmZwb3M9NSxwZXJjZW49InB4IjsgfTsKCQkJdGZpZW0uY3NzKHt3aWR0aDowLGhlaWdodDowLGNvbnRlbnQ6JycsJ3Bvc2l0aW9uJzonYWJzb2x1dGUnfSkKCQkJdGZpLmNzcyh7Ym9yZGVyOic4cHggc29saWQgdHJhbnNwYXJlbnQnLCd6LWluZGV4Jzo1fSk7CgkJCXRmZW0uY3NzKHtib3JkZXI6JzdweCBzb2xpZCB0cmFuc3BhcmVudCcsJ3otaW5kZXgnOjEwfSk7CgkJCXN3aXRjaCAocG9pbnRlcikgewoJCQkJY2FzZSAndG9wLWNlbnRlcic6CgkJCQljYXNlICdib3R0b20tY2VudGVyJzoKCQkJCWNhc2UgJ3RvcC1sZWZ0JzoKCQkJCWNhc2UgJ2JvdHRvbS1sZWZ0JzoKCQkJCQl2YXIgcG9pPSJsZWZ0IjsKCQkJCQlpZihwb2ludGVyPT0ndG9wLWNlbnRlcicgfHwgcG9pbnRlcj09J2JvdHRvbS1jZW50ZXInKXsKCQkJCQkJdGZpLmNzcyh7Im1hcmdpbi1sZWZ0IjoiLThweCJ9KTsKCQkJCQkJdGZlbS5jc3MoeyJtYXJnaW4tbGVmdCI6Ii03cHgifSk7CgkJCQkJfQoJCQkJICAgIGJyZWFrOwoJCQkJY2FzZSAnbGVmdC1jZW50ZXInOgoJCQkJY2FzZSAncmlnaHQtY2VudGVyJzoKCQkJCWNhc2UgJ2xlZnQtdG9wJzoKCQkJCWNhc2UgJ3JpZ2h0LXRvcCc6CgkJCQkJdmFyIHBvaT0idG9wIjsKCQkJCQlpZihwb2ludGVyPT0nbGVmdC1jZW50ZXInIHx8IHBvaW50ZXI9PSdyaWdodC1jZW50ZXInKXsKCQkJCQkJdGZpLmNzcyh7Im1hcmdpbi10b3AiOiItOHB4In0pOwoJCQkJCQl0ZmVtLmNzcyh7Im1hcmdpbi10b3AiOiItN3B4In0pOwoJCQkJCX0KCQkJCSAgICBicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJdmFyIHBvaT0icmlnaHQiOwoJCQkJICAgIGJyZWFrOwoJCQl9OwoKCQkJaWYocG9pbnRlcj09J2ZvbGxvdycpewoJCQkJdGZpLmNzcyh7J2JvcmRlci1ib3R0b20tY29sb3InOm9wdHMuY29sb3JbMF0sbGVmdDonJytvZmZwb3MrcGVyY2VuKycnLGJvdHRvbTonMTAwJSd9KTsKCQkJCXRmZW0uY3NzKHsnYm9yZGVyLWJvdHRvbS1jb2xvcic6b3B0cy5jb2xvclsxXSxsZWZ0OicnKyhvZmZwb3MrKG9wdHMuYWxpZ25Ub1sxXT09J2NlbnRlcic/MDoxKSkrcGVyY2VuKycnLGJvdHRvbTonMTAwJSd9KTsKCQkJfWVsc2V7CgkJCQl0ZmkuY3NzKGVkZ2Vjb2xvcixvcHRzLmNvbG9yWzBdKS5jc3MocG9pLCcnK29mZnBvcytwZXJjZW4rJycpOwoJCQkJdGZlbS5jc3MoZWRnZWNvbG9yLG9wdHMuY29sb3JbMV0pLmNzcyhwb2ksJycrKG9mZnBvcysob3B0cy5hbGlnblRvWzFdPT0nY2VudGVyJz8wOjEpKStwZXJjZW4rJycpOwoJCQkJdGZpZW0uY3NzKG9wdHMuYWxpZ25Ub1swXSwnMTAwJScpOwoJCQl9OwoKCQkJc3dpdGNoIChvcHRzLnR5cGUpIHsKCQkJCWNhc2UgJ2h0bWwnOmNvbklkLmh0bWwob3B0cy5jb250ZW50KTsgYnJlYWs7CgkJCQljYXNlICdpZCcgIDoKCQkJCSAgICB2YXIgdGVtcGlkPWpRdWVyeShvcHRzLmNvbnRlbnQpICx3cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgkJCQkJaWYodGVtcGlkLmNzcygiZGlzcGxheSIpID09ICJub25lIil7ICB0ZW1waWQuY3NzKHtkaXNwbGF5OiJibG9jayJ9KTsgfQoJCQkJCWNvbklkLmFwcGVuZCh0ZW1waWQpOwoJCQkJICAgIGJyZWFrOwoJCQl9OwoJCQlpZihvcHRzLmlzY2xvc2UpewoJCQkJalF1ZXJ5KCc8c3BhbiBjbGFzcz0iJytza2luKydjbG9zZSIgaWQ9ImNsb3NlJytwbXIrJyI+JnRpbWVzOzwvc3Bhbj4nKS5hcHBlbmRUbyh0aXBJZCk7CgkJCQl0aXBJZC5maW5kKCIjY2xvc2UiK3BtcisiIikub24oImNsaWNrIixmdW5jdGlvbigpe3RpcElkLmhpZGUoKTt9KTsKCQkJfQoKCQkJaWYodHlwZW9mIG9wdHMud2lkdGggPT09ICdzdHJpbmcnKXsKCQkJCWRvY1cgPSBwYXJzZUludChkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoKihvcHRzLndpZHRoLnJlcGxhY2UoJyUnLCcnKS8xMDApKTsKCQkJCSh0eXBlb2Ygb3B0cy53aWR0aCA9PSAnYXV0bycgfHwgdHlwZW9mIG9wdHMud2lkdGggPT0gJycpID8gdGlwQm94LmNzcyh7d2lkdGg6J2F1dG8nfSkgOiB0aXBCb3guY3NzKHt3aWR0aDpkb2NXfSk7CgkJCQl0aXBCb3guaGVpZ2h0KCk7CgkJCX1lbHNlewoJCQkJdGlwQm94LndpZHRoKG9wdHMud2lkdGgpLmhlaWdodCgpOwoJCQl9CiAgICAgICAgICAgIGZ1bmN0aW9uIHNob3dQb3NpdGlvbihwb2ludGVyLGNlbGwpewoJCQkJdmFyIHNlbGZIID0gdGhhdC5vdXRlckhlaWdodCh0cnVlKSwgc2VsZlcgPSB0aGF0Lm91dGVyV2lkdGgodHJ1ZSk7CgkJCQl2YXIgcG9zdD10aGF0Lm9mZnNldCgpLnRvcCwgcG9zbD10aGF0Lm9mZnNldCgpLmxlZnQ7CgkJCQl2YXIgdGlwQ2VsbD0oY2VsbD09IiIgfHwgY2VsbD09dW5kZWZpbmVkKSA/IHRpcElkIDogY2VsbDsKCQkJICAgIHZhciB0aXBIPXRpcENlbGwub3V0ZXJIZWlnaHQodHJ1ZSksIHRpcFc9dGlwQ2VsbC5vdXRlcldpZHRoKHRydWUpOwoKCQkJCXN3aXRjaCAocG9pbnRlcikgewoJCQkJCWNhc2UgJ3RvcC1sZWZ0JzogdGlwQ2VsbC5jc3Moe3RvcDpwb3N0LXRpcEgtc3BhLGxlZnQ6cG9zbH0pOyBicmVhazsKCQkJCQljYXNlICd0b3AtY2VudGVyJzogdGlwQ2VsbC5jc3Moe3RvcDpwb3N0LXRpcEgtc3BhLGxlZnQ6cG9zbC0odGlwVy8yKSsoc2VsZlcvMil9KTsgYnJlYWs7CgkJCQkJY2FzZSAndG9wLXJpZ2h0JzogdGlwQ2VsbC5jc3Moe3RvcDpwb3N0LXRpcEgtc3BhLGxlZnQ6cG9zbC0odGlwVy1zZWxmVyl9KTsgYnJlYWs7CgkJCQkJY2FzZSAnYm90dG9tLWxlZnQnOiB0aXBDZWxsLmNzcyh7dG9wOnBvc3Qrc2VsZkgrc3BhLGxlZnQ6cG9zbH0pOyBicmVhazsKCQkJCQljYXNlICdib3R0b20tY2VudGVyJzogdGlwQ2VsbC5jc3Moe3RvcDpwb3N0K3NlbGZIK3NwYSxsZWZ0OnBvc2wtKHRpcFcvMikrKHNlbGZXLzIpfSk7IGJyZWFrOwoJCQkJCWNhc2UgJ2JvdHRvbS1yaWdodCc6IHRpcENlbGwuY3NzKHt0b3A6cG9zdCtzZWxmSCtzcGEsbGVmdDpwb3NsLSh0aXBXLXNlbGZXKX0pOyBicmVhazsKCQkJCQljYXNlICdsZWZ0LXRvcCc6IHRpcENlbGwuY3NzKHt0b3A6cG9zdCxsZWZ0OnBvc2wtdGlwVy1zcGF9KTsgYnJlYWs7CgkJCQkJY2FzZSAnbGVmdC1jZW50ZXInOiB0aXBDZWxsLmNzcyh7dG9wOnBvc3QtKHRpcEgvMikrKHNlbGZILzIpLGxlZnQ6cG9zbC10aXBXLXNwYX0pOyBicmVhazsKCQkJCQljYXNlICdyaWdodC10b3AnOiB0aXBDZWxsLmNzcyh7dG9wOnBvc3QsbGVmdDpwb3NsK3NlbGZXK3NwYX0pOyBicmVhazsKCQkJCQljYXNlICdyaWdodC1jZW50ZXInOiB0aXBDZWxsLmNzcyh7dG9wOnBvc3QtKHRpcEgvMikrKHNlbGZILzIpLGxlZnQ6cG9zbCtzZWxmVytzcGF9KTsgYnJlYWs7CgkJCQkJY2FzZSAnZm9sbG93JzogdGhhdC5tb3VzZW1vdmUoZnVuY3Rpb24oZSkgeyB0aXBDZWxsLmNzcyh7dG9wOmUucGFnZVkgKyAzMCxsZWZ0OmUucGFnZVggLSA2fSk7IH0pOyBicmVhazsKCQkJCX07CgkJCX0KCQkJdGlwQm94LmhpZGUoKTsKCQkJc3dpdGNoIChvcHRzLnRyaWdnZXIpewoJCQkJY2FzZSAnc2hvdyc6c2hvd1Bvc2l0aW9uKHBvaW50ZXIpO3RpcEJveC5zaG93KCk7YnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdjbGljayc6dGhhdC5jbGljayhmdW5jdGlvbigpe3Nob3dQb3NpdGlvbihwb2ludGVyKTt0aXBCb3guc2hvdygpO30pO2JyZWFrOwoJCQkJY2FzZSAnaG92ZXInOnRoYXQuaG92ZXIoZnVuY3Rpb24oKXtzaG93UG9zaXRpb24ocG9pbnRlcik7dGlwQm94LnNob3coKTsgdGlwQm94Lm9uKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7alF1ZXJ5KHRoaXMpLnNob3coKX0pLm9uKCJtb3VzZW91dCIsZnVuY3Rpb24oKXtqUXVlcnkodGhpcykuaGlkZSgpfSl9LGZ1bmN0aW9uKCl7dGlwQm94LmhpZGUoKTt9KTticmVhazsKCQkJCWNhc2UgJ2ZvY3VzJzp0aGF0LmZvY3VzKGZ1bmN0aW9uKCl7c2hvd1Bvc2l0aW9uKHBvaW50ZXIpO3RpcEJveC5zaG93KCk7fSk7ICB0aGF0LmJsdXIoZnVuY3Rpb24oKXt0aXBCb3guaGlkZSgpO30pO2JyZWFrOwoJCQkJY2FzZSAnbW91c2UnOnRoYXQuaG92ZXIoZnVuY3Rpb24oKXtzaG93UG9zaXRpb24ocG9pbnRlcik7dGlwQm94LnNob3coKTt9LGZ1bmN0aW9uKCl7dGlwQm94LmhpZGUoKTt9KTticmVhazsKCQkJfTsKCQkJc2V0VGltZW91dChmdW5jdGlvbigpe29wdHMuc3VjY2VzcyAmJiBvcHRzLnN1Y2Nlc3MoKTt9LCAxKTsKCQl9KTsKCX0KfSkoalF1ZXJ5KTsKCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbCgiQ1NETkdyZWVuZXIgViIgKyB2ZXJzaW9uKTsKICAgIGlmIChpc0ZpcmVmb3goKSkgewogICAgICAgIGNvbnNvbGUubG9nKCLmgqjmraPlnKjkvb/nlKjngavni5DmtY/op4jlmajvvIzlsIbkvb/nlKjlhbzlrrnmqKHlvI/ov5DooYwgQ1NETkdyZWVuZXLjgIIiKTsKICAgIH0KICAgIHByb2dyZXNzb3IuaW5pdCgpOwoKICAgIC8vIOe7v+WMluiuvuWumuaMiemSrueCueWHu+S6i+S7tgogICAgbGV0IGpzcyA9ICIiOwogICAganNzICs9ICI8c2NyaXB0PmZ1bmN0aW9uIHNob3dDb25maWcoKSB7IjsKICAgIGpzcyArPSAiJCh3aW5kb3cpLnNjcm9sbFRvcCgwKTsiOwogICAganNzICs9ICIkKCcud2hpdGVfY29udGVudCcpLmZhZGVJbig1MDApOyI7CiAgICBqc3MgKz0gIiQoJ2JvZHknKS5jc3MoJ292ZXJmbG93JywgJ2hpZGRlbicpOyI7CiAgICBqc3MgKz0gIiQoJ2JvZHknKS5jc3MoJ2ZpbHRlcicsJ2JsdXIoM3B4KScpOyI7CiAgICBqc3MgKz0gIiQoJ2JvZHknKS5jc3MoJ3BvaW50ZXItZXZlbnRzJywnbm9uZScpIjsKICAgIGpzcyArPSAifTwvc2NyaXB0PiI7CiAgICAkKCJib2R5IikuYXBwZW5kKGpzcyk7CgogICAgLy8g5L+d5a2Y5oyJ6ZKu54K55Ye75LqL5Lu2CiAgICBsZXQgc2F2ZUpzcyA9ICIiOwogICAgc2F2ZUpzcyArPSAiPHNjcmlwdD5mdW5jdGlvbiBzYXZlQW5kUmVsb2FkKCkgeyI7CiAgICBzYXZlSnNzICs9ICIkKCcjY29uZmlnQ29udGVudCcpLmZhZGVPdXQoMjAwKTsiOwogICAgc2F2ZUpzcyArPSAic2V0VGltZW91dChmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9LDIwMCkiOwogICAgc2F2ZUpzcyArPSAifTwvc2NyaXB0PiI7CiAgICAkKCJib2R5IikuYXBwZW5kKHNhdmVKc3MpOwoKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGJsb2NrVVJMID0gY3VycmVudFVSTC5zcGxpdCgiLyIpLmxlbmd0aDsKICAgICAgICB2YXIgbWFpbiA9IC8od3d3XC5jc2RuXC5uZXRcLykkLzsKICAgICAgICB2YXIgbWFpbk5hdiA9IC9uYXYvOwogICAgICAgIHZhciBhcnRpY2xlID0gL2FydGljbGUvOwogICAgICAgIHZhciBiYnMgPSAvYmJzXC5jc2RuXC5uZXQvOwogICAgICAgIHZhciBibG9nID0gL2Jsb2dcLmNzZG5cLm5ldC87CiAgICAgICAgdmFyIGJsb2cyID0gL1wvYXJ0aWNsZVwvbGlzdFwvLzsKICAgICAgICB2YXIgZG93bmxvYWQgPSAvZG93bmxvYWRcLmNzZG5cLm5ldC87CiAgICAgICAgdmFyIGxvZ2luID0gL3Bhc3Nwb3J0XC5jc2RuXC5uZXQvOwogICAgICAgIHZhciB6b25lID0gL21lXC5jc2RuXC5uZXQvOwogICAgICAgIHZhciBvdGhlciA9IC8od3d3XC5jc2RuXC5uZXRcLykvOwogICAgICAgIHZhciBtcCA9IC9tcFwuY3NkblwubmV0LzsKICAgICAgICB2YXIgYXJ0aWNsZV9tb250aCA9IC9hcnRpY2xlXC9tb250aC87CgogICAgICAgIC8vIOaVsOe7hOWIneWni+WMlgogICAgICAgIGxpc3QgPSBbXTsKICAgICAgICAvLyDlpLTpg6jliIYKICAgICAgICAvLyBBUFAKICAgICAgICAvLyBwdXQoIi5hcHAtYXBwIik7CiAgICAgICAgLy8gVklQCiAgICAgICAgcHV0KCIudmlwLWNhaXNlIik7CiAgICAgICAgLy8g6K6w5b2V5L2g55qE5oiQ6ZW/5Y6G56iL77yI6K6w5Liq5q+b77yJCiAgICAgICAgcHV0KCIjd3JpdGVHdWlkZSIpOwogICAgICAgIC8vIOaWsOmAmuefpeWwj+WchueCue+8iOacqueZu+W9leaJjea2iOaOie+8iQogICAgICAgIGlmICgkKCIudXNlcmluZm8gYSIpLnRleHQoKSA9PT0gJ+eZu+W9lS/ms6jlhownKSB7CiAgICAgICAgICAgIHB1dCgiI21zZy1jaXJjbGUiKTsKICAgICAgICB9CiAgICAgICAgLy8g6aG26YOo6LC35q2M5bm/5ZGKCiAgICAgICAgcHV0KCIuYWRzYnlnb29nbGUiKTsKICAgICAgICAvLyDmgqzmta7lnKjpobbmoI/mjInpkq7kuIrlh7rnjrDnmoTkuoznu7TnoIEKICAgICAgICBwdXQoIi5hcHBDb250cm9sIik7CiAgICAgICAgLy8g6aG26YOo5bm/5ZGKCiAgICAgICAgcHV0KCIuYWR2ZXJ0LWJnIik7CgogICAgICAgIGlmIChtYWluLnRlc3QoY3VycmVudFVSTCkgfHwgbWFpbk5hdi50ZXN0KGN1cnJlbnRVUkwpKSB7CiAgICAgICAgICAgIGwoIuato+WcqOS8mOWMluS4u+mhteS9k+mqjC4uLiIpOwogICAgICAgICAgICAvLyDluLjop4QKICAgICAgICAgICAgLy8g5aS06YOo5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLmJhbm5lci1hZC1ib3giKTsKICAgICAgICAgICAgLy8g5bWM5YWl5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiI2twX2JveF8yMTEiKTsKICAgICAgICAgICAgLy8g5Y+z5L6n5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLnNsaWRlLW91dGVyIik7CiAgICAgICAgICAgIC8vIOWPs+S+p+ivpuaDhQogICAgICAgICAgICBwdXQoIi5wZXJzaW9uX2FydGljbGUiKTsKICAgICAgICAgICAgLy8g5Y+z5L6n5o6o6I2QCiAgICAgICAgICAgICQoIi5mZWVkX2NvbXBhbnkiKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8g5bm/5ZGK6L2u5pKtCiAgICAgICAgICAgIHB1dCgiLmVsLWNhcm91c2VsX19jb250YWluZXIiKTsKICAgICAgICAgICAgLy8g6aG26YOo5qiq5bmFCiAgICAgICAgICAgIHB1dCgiLnRvb2xiYXItYWR2ZXJ0Iik7CiAgICAgICAgICAgIC8vIOmhtuagj1ZJUOmAiemhuQogICAgICAgICAgICAkKCcudG9vbGJhci1zdWJNZW51LWJveCcpLmZpbmQoIltocmVmPSdodHRwczovL21hbGwuY3Nkbi5uZXQvdmlwJ10iKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8gQ1NETuW3peWFt+W5v+WRigogICAgICAgICAgICBwdXQoIiNmbG9vci1hZF82NCIpOwogICAgICAgICAgICBjbGVhbigxMCk7CiAgICAgICAgICAgIC8vIGNvbW1vbig1LCAxMCk7CiAgICAgICAgICAgIC8vIOWNmuWuouWPiuS4u+mhteS8mOWMlgogICAgICAgICAgICBjb21tb24oOSwgMTApOwogICAgICAgICAgICBsb29wKDMpOwogICAgICAgICAgICBsb29wKDEpOwogICAgICAgIH0gZWxzZSBpZiAoKGJsb2cudGVzdChjdXJyZW50VVJMKSAmJiBibG9ja1VSTCA9PT0gNCkgfHwgYmxvZzIudGVzdChjdXJyZW50VVJMKSkgewogICAgICAgICAgICBsKCLmraPlnKjkvJjljJbkuKrkurrljZrlrqLkuLvpobXkvZPpqowuLi4iKTsKICAgICAgICAgICAgLy8g5bi46KeECiAgICAgICAgICAgIC8vIOWktOmDqOW5v+WRigogICAgICAgICAgICBwdXQoIi5iYW5uZXItYWQtYm94Iik7CiAgICAgICAgICAgIC8vIOWPs+S+p+W5v+WRigogICAgICAgICAgICBwdXQoIi5zbGlkZS1vdXRlciIpOwogICAgICAgICAgICAvLyDlj7Pkvqfor6bmg4UKICAgICAgICAgICAgcHV0KCIucGVyc2lvbl9hcnRpY2xlIik7CiAgICAgICAgICAgIC8vIOW3puS+p+W5v+WRigogICAgICAgICAgICBwdXQoIi5tYjgiKTsKICAgICAgICAgICAgcHV0KCIja3BfYm94XzUwMyIpOwogICAgICAgICAgICBwdXQoIiNrcF9ib3hfMjE0Iik7CiAgICAgICAgICAgIGNsZWFuKDEwKTsKICAgICAgICAgICAgLy8gY29tbW9uKDUsIDEwKTsKICAgICAgICAgICAgbG9vcCgzKTsKICAgICAgICAgICAgbG9vcCgxKTsKICAgICAgICB9IGVsc2UgaWYgKGFydGljbGUudGVzdChjdXJyZW50VVJMKSAmJiAhbXAudGVzdChjdXJyZW50VVJMKSAmJiAhYXJ0aWNsZV9tb250aC50ZXN0KGN1cnJlbnRVUkwpKSB7CiAgICAgICAgICAgIGwoIuato+WcqOS8mOWMlumYheivu+S9k+mqjC4uLiIpOwogICAgICAgICAgICAvLyDnu7/ljJborr7lrpoKICAgICAgICAgICAgaWYgKGlzRmlyZWZveCgpKSB7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoIi50b29sYmFyLWNvbnRhaW5lci1taWRkbGUiKS5wcmVwZW5kKCI8ZGl2IGlkPSdncmVlbmVyUHJvZ3Jlc3MnIHN0eWxlPSd0ZXh0LWFsaWduOnJpZ2h0Jz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbE9mMCA9ICc8ZGl2IGNsYXNzPSJ0b29sYmFyLWJ0biBjc2RuLXRvb2xiYXItZmwiPjxhIGlkPSJncmVlbmVyU2V0dGluZ3MiIHRpdGxlPSLngrnlh7vmiZPlvIAgQ1NETkdyZWVuZXIg57u/5YyW6K6+5a6aIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIG9uY2xpY2s9InNob3dDb25maWcoKTsiPicgKyBzZXR0aW5nc19zdmcgKyAnPC9hPjwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgJCgiLnRvb2xiYXItYnRucyIpLnByZXBlbmQoaHRtbE9mMCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmlyZWZveCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaPkOekugogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGlwc0Nvb2tpZSA9IGNvbmZpZy5nZXQoInNob3dUaXAiLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpcHNDb29raWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUaXBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNldCgic2hvd1RpcCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCAzMDAwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQoIi50b29sYmFyLWNvbnRhaW5lci1taWRkbGUiKS5wcmVwZW5kKCI8ZGl2IGlkPSdncmVlbmVyUHJvZ3Jlc3MnIHN0eWxlPSd0ZXh0LWFsaWduOnJpZ2h0Jz48L2Rpdj4iKTsKICAgICAgICAgICAgICAgIGxldCBodG1sT2YwID0gJzxkaXYgY2xhc3M9InRvb2xiYXItYnRuIGNzZG4tdG9vbGJhci1mbCI+PGEgaWQ9ImdyZWVuZXJTZXR0aW5ncyIgdGl0bGU9IueCueWHu+aJk+W8gCBDU0ROR3JlZW5lciDnu7/ljJborr7lrpoiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgb25jbGljaz0ic2hvd0NvbmZpZygpOyI+JyArIHNldHRpbmdzX3N2ZyArICc8L2E+PC9kaXY+JzsKICAgICAgICAgICAgICAgICQoIi50b29sYmFyLWJ0bnMiKS5wcmVwZW5kKGh0bWxPZjApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIOW4uOinhAogICAgICAgICAgICAvLyDlj7Pkvqflub/lkYrvvIzmlL7liLDnrKzkuIDkuKrmuIXpmaQKICAgICAgICAgICAgLy8gcHV0KCIucmVjb21tZW5kLXJpZ2h0Iik7CiAgICAgICAgICAgIHB1dCgiI2FkZEFkQm94Iik7CiAgICAgICAgICAgIC8vIHB1dCgiLmFzaWRlLWJveC5raW5kX3BlcnNvbi5kLWZsZXguZmxleC1jb2x1bW4iKTsKICAgICAgICAgICAgcHV0KCIucmVjb21tZW5kLXRvcC1hZGJveCIpOwogICAgICAgICAgICAvLyBwdXQoIi5yZWNvbW1lbmQtbGlzdC1ib3guZC1mbGV4LmZsZXgtY29sdW1uLmFzaWRlLWJveCIpOwogICAgICAgICAgICAvLyDlt6bkvqflub/lkYoKICAgICAgICAgICAgLy8gcHV0KCIjY29udGFpbmVyIik7CiAgICAgICAgICAgIC8vIOW/q+adpeWGmeWNmuWuouWQpwogICAgICAgICAgICBwdXQoIi5ibG9nX3RpcF9ib3giKTsKICAgICAgICAgICAgLy8g5o6o6I2Q5YWz5rOo55So5oi3CiAgICAgICAgICAgIHB1dCgiLmJsb2ctZXhwZXJ0LXJlY29tbWVuZC1ib3giKTsKICAgICAgICAgICAgLy8g5Y+z5LiL6KeSVklQCiAgICAgICAgICAgIHB1dCgiLm1lYXUtZ290b3AtYm94Iik7CiAgICAgICAgICAgIC8vIOW5v+WRigogICAgICAgICAgICBwdXQoIi5tZWRpYXZfYWQiKTsKICAgICAgICAgICAgcHV0KCIucHVsbGxvZy1ib3giKTsKICAgICAgICAgICAgcHV0KCIucmVjb21tZW5kLWFkLWJveCIpOwogICAgICAgICAgICBwdXQoIi5ib3gtc2hhZG93Iik7CiAgICAgICAgICAgIHB1dCgiLnR5cGVfaG90X3dvcmQiKTsKICAgICAgICAgICAgcHV0KCIuZm91cnRoX2NvbHVtbiIpOwogICAgICAgICAgICAvLyDpq5jliIbovqjnjofml7blj7Pkvqfmlofnq6DmjqjojZAKICAgICAgICAgICAgLy8gcHV0KCIucmlnaHQtaXRlbSIpOwogICAgICAgICAgICAvLyDlub/lkYoKICAgICAgICAgICAgcHV0KCIjYXNpZGVGb290ZXIiKTsKICAgICAgICAgICAgcHV0KCIjYWQtZGl2Iik7CiAgICAgICAgICAgIHB1dCgiIzQ3OSIpOwogICAgICAgICAgICBwdXQoIiM0ODAiKTsKICAgICAgICAgICAgLy8g5omT6LWPCiAgICAgICAgICAgIHB1dCgiLnBvc3RUaW1lIik7CiAgICAgICAgICAgIC8vIOivvueoi+aOqOiNkAogICAgICAgICAgICBwdXQoIi50MCIpOwogICAgICAgICAgICAvLyDliIbkuqvmtbfmiqUKICAgICAgICAgICAgcHV0KCIuc2hhcmVTdWdnZXN0Iik7CiAgICAgICAgICAgIC8vIOW6lemDqOS4u+mimAogICAgICAgICAgICBwdXQoIi50ZW1wbGF0ZS1ib3giKTsKICAgICAgICAgICAgLy8g6K+E6K665Yy65bm/5ZGKCiAgICAgICAgICAgIHB1dCgiZGl2I2RtcF9hZF81OCIpOwogICAgICAgICAgICAvLyDmiZPotY8KICAgICAgICAgICAgcHV0KCIucmV3YXJkLXVzZXItYm94Iik7CiAgICAgICAgICAgIC8vIOWPs+S+p+aJk+i1j+aMiemSrgogICAgICAgICAgICBwdXQoIi50by1yZXdhcmQiKTsKICAgICAgICAgICAgLy8g5o6o6I2Q5YaF5a655bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLnJlY29tbWVuZC1yZWNvbW1lbmQtYm94Iik7CiAgICAgICAgICAgIC8vIOWPs+S+p+W5v+WRigogICAgICAgICAgICBwdXQoIi5pbmRleFN1cGVyaXNlIik7CiAgICAgICAgICAgIC8vIOaKouaymeWPkeinkuaghwogICAgICAgICAgICBwdXQoIi5jb21tZW50LXNvZmEtZmxhZyIpOwogICAgICAgICAgICAvLyDpobVqaW8KICAgICAgICAgICAgcHV0KCIuYm90dG9tLXB1Yi1mb290ZXIiKTsKICAgICAgICAgICAgLy8g55m75b2V5p+l55yL5pyq6K+75raI5oGvCiAgICAgICAgICAgIHB1dCgiLnRvb2xiYXItbm90aWNlLWJ1YmJsZSIpOwogICAgICAgICAgICAvLyDlj7Pkvqflub/lkYoKICAgICAgICAgICAgcHV0KCIucmVjb21tZW5kLXRvcC1hZGJveCIpOwogICAgICAgICAgICAvLyDlj7Pkvqflm5vkuKrlub/lkYoKICAgICAgICAgICAgcHV0KCIucHJvZ3JhbW1lcjFCb3giKTsKICAgICAgICAgICAgcHV0KCIucHJvZ3JhbW1lcjJCb3giKTsKICAgICAgICAgICAgcHV0KCIucHJvZ3JhbW1lcjNCb3giKTsKICAgICAgICAgICAgcHV0KCIucHJvZ3JhbW1lcjRCb3giKTsKICAgICAgICAgICAgLy8g54K56LWe5rCU5rOhCiAgICAgICAgICAgIHB1dCgiLnRyaXBsZXQtcHJvbXB0Iik7CiAgICAgICAgICAgIC8vIOmhtumDqOaoquW5hQogICAgICAgICAgICBwdXQoIi50b29sYmFyLWFkdmVydCIpOwogICAgICAgICAgICAvLyDlupXpg6jkv6Hmga8KICAgICAgICAgICAgcHV0KCIuYmxvZy1mb290ZXItYm90dG9tIik7CiAgICAgICAgICAgIC8vIOWPs+S+p+agj+W5v+WRigogICAgICAgICAgICBwdXQoIiM2NTI3Iik7CiAgICAgICAgICAgIHB1dCgiI3JlY29tbWVuZEFkQm94Iik7CiAgICAgICAgICAgIC8vIOaOqOiNkOWGheWuuVRpdGxlCiAgICAgICAgICAgIHB1dCgiLnJlY29tbWVuZC10aXQtbW9kIik7CiAgICAgICAgICAgIC8vIOe6ouWMheaPkOmGkgogICAgICAgICAgICBwdXQoIi5jc2RuLXJlZHBhY2stbG90dGVyeS1idG4tYm94Iik7CiAgICAgICAgICAgIC8vIOWtpueUn+iupOivgQogICAgICAgICAgICBwdXQoIi5jc2RuLWhpZ2hzY2hvb2wtd2luZG93Iik7CiAgICAgICAgICAgIC8vIOWPs+S+p+aCrOa1ruagj+mZpOe9rumhtuS7peWklueahOaMiemSrgogICAgICAgICAgICBwdXQoIi5vcHRpb24tYm94W2RhdGEtdHlwZT0nZ3VpZGUnXSwub3B0aW9uLWJveFtkYXRhLXR5cGU9J2NzJ10sLmNzZG4tY29tbW9uLWxvZ28tYWR2ZXJ0Iik7CiAgICAgICAgICAgIGNsZWFuKDEwKTsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgLy8g5bGV5byA6K+E6K6655qE5omA5pyJ5Zue5aSNCiAgICAgICAgICAgICAgICQoJy5idG4tcmVhZC1yZXBseScpLmNsaWNrKCk7CiAgICAgICAgICAgIH0sIDE1MDApOwogICAgICAgICAgICAvLyDkuLvliqjliqDlhaXlj7PkvqfmoI8KICAgICAgICAgICAgaWYgKCQoIi5yZWNvbW1lbmQtcmlnaHQiKS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICQoIiNtYWluQm94IikuYWZ0ZXIoJzxkaXYgY2xhc3M9InJlY29tbWVuZC1yaWdodCAgYWxpZ24taXRlbXMtc3RyZXRjaCBjbGVhcmZpeCIgaWQ9InJpZ2h0QXNpZGUiPjxhc2lkZSBjbGFzcz0icmVjb21tZW5kLXJpZ2h0X2FzaWRlIj48ZGl2IGlkPSJyZWNvbW1lbmQtcmlnaHQiIHN0eWxlPSJoZWlnaHQ6IDEwMCU7IHBvc2l0aW9uOiBmaXhlZDsgdG9wOiA1MnB4OyBvdmVyZmxvdzogc2Nyb2xsOyI+PC9kaXY+PC9hc2lkZT48L2Rpdj4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyDkuIrmoI/mjInpkq7liKDpmaQKICAgICAgICAgICAgJCgiLnRvb2xiYXItbWVudXMgPiBsaSA+IGE6Y29udGFpbnMoJ+S4k+agj+ivvueoiycpIikucGFyZW50KCkucmVtb3ZlKCk7CiAgICAgICAgICAgICQoIi50b29sYmFyLW1lbnVzID4gbGkgPiBhOmNvbnRhaW5zKCfmj5Lku7YnKSIpLnBhcmVudCgpLnJlbW92ZSgpOwogICAgICAgICAgICAkKCIudG9vbGJhci1tZW51cyA+IGxpID4gYTpjb250YWlucygn6K6k6K+BJykiKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8g5L+u5aSN5peg5rOV6YCJ5oup5aSN5Yi2CiAgICAgICAgICAgICQoImNvZGUiKS5jc3MoInVzZXItc2VsZWN0IiwiYXV0byIpOwogICAgICAgICAgICAkKCIjY29udGVudF92aWV3cyIpLmNzcygidXNlci1zZWxlY3QiLCJhdXRvIik7CiAgICAgICAgICAgICQoInByZSIpLmNzcygidXNlci1zZWxlY3QiLCJhdXRvIik7NwogICAgICAgICAgICAvLyDlm77niYfmt7fmloflrZfml7bvvIzml6Dms5XlrozmlbTlpI3liLbvvIzlm77niYfkuI3kvJrooqvlpI3liLbkuIvmnaUgaHR0cHM6Ly9naXRodWIuY29tL2FkbGVyZWQvQ1NETkdyZWVuZXIvaXNzdWVzLzg3CiAgICAgICAgICAgIC8vbGV0IGVsID0gJCgibWFpbiAuYmxvZy1jb250ZW50LWJveCIpWzBdOwogICAgICAgICAgICAvL2xldCBlbENsb25lID0gZWwuY2xvbmVOb2RlKHRydWUpOwogICAgICAgICAgICAvL2VsLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVsQ2xvbmUsIGVsKTsKICAgICAgICAgICAgLy8g5L+d5a2YY3NkbueahOe9kemhteWGjeasoeaJk+W8gOS8muiHquWKqOi3s+i9rOWIsOmmlumhtSBodHRwczovL2dpdGh1Yi5jb20vYWRsZXJlZC9DU0ROR3JlZW5lci9pc3N1ZXMvOTcKICAgICAgICAgICAgJCgiW29uZXJyb3JdIikucmVtb3ZlKCk7CiAgICAgICAgICAgIC8vIENTRE7ph43lrprlkJHlpJbpk77kuI3og73lnKjmlrDnmoTnqpflj6Pot7PovawgaHR0cHM6Ly9naXRodWIuY29tL2FkbGVyZWQvQ1NETkdyZWVuZXIvaXNzdWVzLzgwCiAgICAgICAgICAgICQoIiNhcnRpY2xlX2NvbnRlbnQgYVtocmVmXSIpLmF0dHIoInRhcmdldCIsICJfYmxhbmsiKTsKICAgICAgICAgICAgLy8g5pCc57Si5qGG5LyY5YyWCiAgICAgICAgICAgIC8vJCgiI3Rvb2xiYXItc2VhcmNoLWlucHV0IikuY3NzKCJ3aWR0aCIsICJjYWxjKDEwMCUgLSA0MDBweCkiKTsKICAgICAgICAgICAgLy8g5Y+W5raI5Luj56CB5oqY5Y+gCiAgICAgICAgICAgICQoIi5sb29rLW1vcmUtcHJlQ29kZSIpLmNsaWNrKCk7CiAgICAgICAgICAgIC8vIOivoumXruaOqOiNkOaYr+WQpuacieaEj+S5ieeahOmXruWNt+iwg+afpQogICAgICAgICAgICAkKCIjcmVjb21tZW5kTnBzIikucmVtb3ZlKCk7CiAgICAgICAgICAgIC8vIOe7v+WMluiuvue9rgogICAgICAgICAgICBjb21tb24oNiwgMSk7CiAgICAgICAgICAgIC8vIOWxj+W5lemAgumFjQogICAgICAgICAgICBjb21tb24oNCwgMSk7CiAgICAgICAgICAgIC8vIOivhOiuugogICAgICAgICAgICBjb21tb24oMSwgMzApOwogICAgICAgICAgICAvLyDlhbblroMKICAgICAgICAgICAgY29tbW9uKDIsIDIwKTsKICAgICAgICAgICAgLy8g6aG26YOo5pi+56S65L2c6ICF5L+h5oGvCiAgICAgICAgICAgIGNvbW1vbig4LCAxKTsKICAgICAgICAgICAgLy8g5Y2a5a6i5Y+K5Li76aG15LyY5YyWCiAgICAgICAgICAgIGNvbW1vbig5LCAxMCk7CiAgICAgICAgICAgIC8vIOW+queOr+e6v+eoi+W8gOWniwogICAgICAgICAgICBsb29wKDIpOwogICAgICAgICAgICBsb29wKDMpOwogICAgICAgIH0gZWxzZSBpZiAoYmJzLnRlc3QoY3VycmVudFVSTCkpIHsKICAgICAgICAgICAgbCgi5q2j5Zyo5LyY5YyW6K665Z2b5L2T6aqMLi4uIik7CiAgICAgICAgICAgIC8vIOW4uOinhAogICAgICAgICAgICAvLyDor4TorrrltYzlhaXlsI/lub/lkYoKICAgICAgICAgICAgcHV0KCIucG9zdF9yZWNvbW1lbmQiKTsKICAgICAgICAgICAgLy8g5bqV6YOo5o6o6I2QCiAgICAgICAgICAgIHB1dCgiI3Bvc3RfZmVlZF93cmFwIik7CiAgICAgICAgICAgIC8vIOW6lemDqOebuOWFs+aWh+eroOmHjOmdoueahOW5v+WRigogICAgICAgICAgICBwdXQoIi5iYnNfZmVlZF9hZF9ib3giKTsKICAgICAgICAgICAgcHV0KCIucmVjb21tZW5kLWFkLWJveCIpOwogICAgICAgICAgICAvLyDlupXpg6jnm7jlhbPmloflrZfph4zpnaLnmoTng63or43mj5DnpLoKICAgICAgICAgICAgcHV0KCIudHlwZV9ob3Rfd29yZCIpOwogICAgICAgICAgICAvLyDlupXpg6jok53oibJmbGV45bGe5oCn55qE5bm/5ZGK5qCPK+eZu+W9leazqOWGjOahhgogICAgICAgICAgICBwdXQoIi5wdWxsbG9nLWJveCIpOwogICAgICAgICAgICAvLyDnjJzkvaDllpzmrKIKICAgICAgICAgICAgcHV0KCIucGVyc29uYWxpemVkLXJlY29tbWVuZC1ib3giKTsKICAgICAgICAgICAgLy8g5Y+R5biW5YeP5Y2K5o+Q56S6CiAgICAgICAgICAgIHB1dCgiLnRvdGFzdC1ib3giKTsKICAgICAgICAgICAgLy8g6aG26YOo5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLnJlY29tbWVuZC1yaWdodCIpOwogICAgICAgICAgICAvLyDpobbpg6jlub/lkYoKICAgICAgICAgICAgcHV0KCIuYWRfdG9wIik7CiAgICAgICAgICAgIC8vIOWPs+S+p+W5v+WRigogICAgICAgICAgICBwdXQoIi5hZF8xIik7CiAgICAgICAgICAgIGNsZWFuKDEwKTsKICAgICAgICAgICAgLy8g5bGV5byACiAgICAgICAgICAgIGNvbW1vbigzLCA1MCk7CiAgICAgICAgICAgIC8vIGNvbW1vbig1LCAxMCk7CiAgICAgICAgICAgIGxvb3AoMyk7CiAgICAgICAgfSBlbHNlIGlmIChkb3dubG9hZC50ZXN0KGN1cnJlbnRVUkwpKSB7CiAgICAgICAgICAgIGwoIuato+WcqOS8mOWMluS4i+i9vemhteS9k+mqjC4uLiIpOwogICAgICAgICAgICAvLyDluLjop4QKICAgICAgICAgICAgcHV0KCIuZml4ZWRfZGwiKTsKICAgICAgICAgICAgcHV0KCJpbmRleFN1cGVyaXNlIik7CiAgICAgICAgICAgIC8vIOWPs+S+p+aOqOiNkAogICAgICAgICAgICBwdXQoIi5jb250ZW50X3JlY29tIik7CiAgICAgICAgICAgIGNsZWFuKDEwKTsKICAgICAgICAgICAgLy8gY29tbW9uKDUsIDEwKTsKICAgICAgICAgICAgbG9vcCgzKTsKICAgICAgICB9IGVsc2UgaWYgKGxvZ2luLnRlc3QoY3VycmVudFVSTCkpIHsKICAgICAgICAgICAgbCgi5q2j5Zyo5LyY5YyW55m75b2V6aG15L2T6aqMLi4uIik7CiAgICAgICAgICAgIC8vIOW4uOinhAogICAgICAgICAgICAvLyDnmbvlvZXnlYzpnaLlpKflm77lub/lkYoKICAgICAgICAgICAgcHV0KCIubWFpbi10dSIpOwogICAgICAgICAgICBjbGVhbigxMCk7CiAgICAgICAgICAgIC8vIGNvbW1vbig1LCAxMCk7CiAgICAgICAgICAgIGxvb3AoMyk7CiAgICAgICAgfSBlbHNlIGlmICh6b25lLnRlc3QoY3VycmVudFVSTCkpIHsKICAgICAgICAgICAgbCgi5q2j5Zyo5LyY5YyW5Liq5Lq656m66Ze05L2T6aqMLi4uIik7CiAgICAgICAgICAgIC8vIOW4uOinhAogICAgICAgICAgICBjbGVhbigxMCk7CiAgICAgICAgICAgIGNvbW1vbig3LCAxMCk7CiAgICAgICAgICAgIC8vIGNvbW1vbig1LCAxMCk7CiAgICAgICAgICAgIGxvb3AoMyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbCgi5ZOm6LGB77yM5aW95YGP6Zeo55qE6aG16Z2i77yM5oiR5p2l6K+V552A5LyY5YyW5LiA5LiL5ZOmLi4uIik7CiAgICAgICAgICAgIC8vIOW4uOinhAogICAgICAgICAgICAvLyDlsZXlvIDlhajmlocKICAgICAgICAgICAgJCgnLnJlYWRtb3JlX2J0bicpLmNsaWNrKCk7CiAgICAgICAgICAgIC8vICoqKiBpbmRleCAqKioKICAgICAgICAgICAgLy8g5aS06YOo5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLmJhbm5lci1hZC1ib3giKTsKICAgICAgICAgICAgLy8g5bWM5YWl5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiI2twX2JveF8yMTEiKTsKICAgICAgICAgICAgLy8g5Y+z5L6n5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLnNsaWRlLW91dGVyIik7CiAgICAgICAgICAgIC8vIOWPs+S+p+ivpuaDhQogICAgICAgICAgICBwdXQoIi5wZXJzaW9uX2FydGljbGUiKTsKICAgICAgICAgICAgLy8g5Y+z5L6n5o6o6I2QCiAgICAgICAgICAgICQoIi5mZWVkX2NvbXBhbnkiKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8gKioqIGFydGljbGUgKioqCiAgICAgICAgICAgIC8vIOW4uOinhAogICAgICAgICAgICAvLyDlj7Pkvqflub/lkYrvvIzmlL7liLDnrKzkuIDkuKrmuIXpmaQKICAgICAgICAgICAgcHV0KCIjYWRkQWRCb3giKTsKICAgICAgICAgICAgcHV0KCIucmVjb21tZW5kLXRvcC1hZGJveCIpOwogICAgICAgICAgICAvLyDlv6vmnaXlhpnljZrlrqLlkKcKICAgICAgICAgICAgcHV0KCIuYmxvZ190aXBfYm94Iik7CiAgICAgICAgICAgIC8vIOaOqOiNkOWFs+azqOeUqOaItwogICAgICAgICAgICBwdXQoIi5ibG9nLWV4cGVydC1yZWNvbW1lbmQtYm94Iik7CiAgICAgICAgICAgIC8vIOWPs+S4i+inklZJUAogICAgICAgICAgICBwdXQoIi5tZWF1LWdvdG9wLWJveCIpOwogICAgICAgICAgICAvLyDlub/lkYoKICAgICAgICAgICAgcHV0KCIubWVkaWF2X2FkIik7CiAgICAgICAgICAgIHB1dCgiLnB1bGxsb2ctYm94Iik7CiAgICAgICAgICAgIHB1dCgiLnJlY29tbWVuZC1hZC1ib3giKTsKICAgICAgICAgICAgLy9wdXQoIi5ib3gtc2hhZG93Iik7IOafkOS6m+mhtemdouW8guW4uO+8jOS+i+WmgmNsb3VkLmNzZG4ubmV0CiAgICAgICAgICAgIHB1dCgiLnR5cGVfaG90X3dvcmQiKTsKICAgICAgICAgICAgcHV0KCIuZm91cnRoX2NvbHVtbiIpOwogICAgICAgICAgICAvLyBjbG91ZC5jc2RuLm5ldCDlpLTpg6jlub/lkYoKICAgICAgICAgICAgcHV0KCIja3BfYm94XzExOCIpOwogICAgICAgICAgICAvLyDlub/lkYoKICAgICAgICAgICAgcHV0KCIjYXNpZGVGb290ZXIiKTsKICAgICAgICAgICAgcHV0KCIjYWQtZGl2Iik7CiAgICAgICAgICAgIHB1dCgiIzQ3OSIpOwogICAgICAgICAgICBwdXQoIiM0ODAiKTsKICAgICAgICAgICAgLy8g5omT6LWPCiAgICAgICAgICAgIHB1dCgiLnBvc3RUaW1lIik7CiAgICAgICAgICAgIC8vIOivvueoi+aOqOiNkAogICAgICAgICAgICBwdXQoIi50MCIpOwogICAgICAgICAgICAvLyDliIbkuqvmtbfmiqUKICAgICAgICAgICAgcHV0KCIuc2hhcmVTdWdnZXN0Iik7CiAgICAgICAgICAgIC8vIOW6lemDqOS4u+mimAogICAgICAgICAgICBwdXQoIi50ZW1wbGF0ZS1ib3giKTsKICAgICAgICAgICAgLy8g6K+E6K665Yy65bm/5ZGKCiAgICAgICAgICAgIHB1dCgiZGl2I2RtcF9hZF81OCIpOwogICAgICAgICAgICAvLyDmiZPotY8KICAgICAgICAgICAgcHV0KCIucmV3YXJkLXVzZXItYm94Iik7CiAgICAgICAgICAgIC8vIOWPs+S+p+aJk+i1j+aMiemSrgogICAgICAgICAgICBwdXQoIi50by1yZXdhcmQiKTsKICAgICAgICAgICAgLy8g5o6o6I2Q5YaF5a655bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLnJlY29tbWVuZC1yZWNvbW1lbmQtYm94Iik7CiAgICAgICAgICAgIC8vIOWPs+S+p+W5v+WRigogICAgICAgICAgICBwdXQoIi5pbmRleFN1cGVyaXNlIik7CiAgICAgICAgICAgIC8vIOaKouaymeWPkeinkuaghwogICAgICAgICAgICBwdXQoIi5jb21tZW50LXNvZmEtZmxhZyIpOwogICAgICAgICAgICAvLyDpobVqaW8KICAgICAgICAgICAgcHV0KCIuYm90dG9tLXB1Yi1mb290ZXIiKTsKICAgICAgICAgICAgLy8g55m75b2V5p+l55yL5pyq6K+75raI5oGvCiAgICAgICAgICAgIHB1dCgiLnRvb2xiYXItbm90aWNlLWJ1YmJsZSIpOwogICAgICAgICAgICAvLyDlj7Pkvqflub/lkYoKICAgICAgICAgICAgcHV0KCIucmVjb21tZW5kLXRvcC1hZGJveCIpOwogICAgICAgICAgICAvLyDlrabpmaLlvLnlh7rlub/lkYoKICAgICAgICAgICAgJCgiLmZvdWNlX2Nsb3NlX2J0biIpLmNsaWNrKCk7CiAgICAgICAgICAgIC8vIOWFtuWugwogICAgICAgICAgICAvLyDlpLTpg6jlub/lkYoKICAgICAgICAgICAgcHV0KCIuYmFubmVyLWFkLWJveCIpOwogICAgICAgICAgICAvLyDlj7Pkvqflub/lkYoKICAgICAgICAgICAgcHV0KCIuc2xpZGUtb3V0ZXIiKTsKICAgICAgICAgICAgLy8g5Y+z5L6n6K+m5oOFCiAgICAgICAgICAgIHB1dCgiLnBlcnNpb25fYXJ0aWNsZSIpOwogICAgICAgICAgICAvLyDlt6bkvqflub/lkYoKICAgICAgICAgICAgcHV0KCIja3BfYm94XzUwMyIpOwogICAgICAgICAgICBwdXQoIiNrcF9ib3hfMjE0Iik7CiAgICAgICAgICAgIC8vICoqKiBiYnMgKioqCiAgICAgICAgICAgIC8vIOivhOiuuuW1jOWFpeWwj+W5v+WRigogICAgICAgICAgICBwdXQoIi5wb3N0X3JlY29tbWVuZCIpOwogICAgICAgICAgICAvLyDlupXpg6jmjqjojZAKICAgICAgICAgICAgcHV0KCIjcG9zdF9mZWVkX3dyYXAiKTsKICAgICAgICAgICAgLy8g5bqV6YOo55u45YWz5paH56ug6YeM6Z2i55qE5bm/5ZGKCiAgICAgICAgICAgIHB1dCgiLmJic19mZWVkX2FkX2JveCIpOwogICAgICAgICAgICBwdXQoIi5yZWNvbW1lbmQtYWQtYm94Iik7CiAgICAgICAgICAgIC8vIOW6lemDqOebuOWFs+aWh+Wtl+mHjOmdoueahOeDreivjeaPkOekugogICAgICAgICAgICBwdXQoIi50eXBlX2hvdF93b3JkIik7CiAgICAgICAgICAgIC8vIOW6lemDqOiTneiJsmZsZXjlsZ7mgKfnmoTlub/lkYrmoI8r55m75b2V5rOo5YaM5qGGCiAgICAgICAgICAgIHB1dCgiLnB1bGxsb2ctYm94Iik7CiAgICAgICAgICAgIC8vIOeMnOS9oOWWnOasogogICAgICAgICAgICBwdXQoIi5wZXJzb25hbGl6ZWQtcmVjb21tZW5kLWJveCIpOwogICAgICAgICAgICAvLyDlj5HluJblh4/ljYrmj5DnpLoKICAgICAgICAgICAgcHV0KCIudG90YXN0LWJveCIpOwogICAgICAgICAgICAvLyDpobbpg6jlub/lkYoKICAgICAgICAgICAgcHV0KCIucmVjb21tZW5kLXJpZ2h0Iik7CiAgICAgICAgICAgIC8vIOmhtumDqOW5v+WRigogICAgICAgICAgICBwdXQoIi5hZF90b3AiKTsKICAgICAgICAgICAgLy8gKioqIGRvd25sb2FkICoqKgogICAgICAgICAgICBwdXQoIi5maXhlZF9kbCIpOwogICAgICAgICAgICBwdXQoImluZGV4U3VwZXJpc2UiKTsKICAgICAgICAgICAgLy8g5Y+z5L6n5o6o6I2QCiAgICAgICAgICAgIHB1dCgiLmNvbnRlbnRfcmVjb20iKTsKICAgICAgICAgICAgY2xlYW4oMTApOwogICAgICAgIH0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICBwcm9ncmVzc29yLmRvbmUoKTsKICAgICAgICB9LCAwKTsKICAgICAgICBzdG9wVGltZU1pbGxpID0gRGF0ZS5ub3coKTsKICAgICAgICBsKCLkvJjljJblrozmr5UhIOiAl+aXtiAiICsgKHN0b3BUaW1lTWlsbGkgLSBzdGFydFRpbWVNaWxsaSkgKyAibXMiKTsKICAgICAgICAvLyDlu7bov5/ltYzlhaXnlKjmiLfkvb/nlKjohJrmnKzmg4XlhrVKU++8jOS4jeW9seWTjeaAp+iDvQogICAgICAgICQoImhlYWQiKS5hcHBlbmQoJzxzY3JpcHQgY2hhcnNldD0iVVRGLTgiIGlkPSJMQV9DT0xMRUNUIiBzcmM9Ii8vc2RrLjUxLmxhL2pzLXNkay1wcm8ubWluLmpzIj48L3NjcmlwdD4nKTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkKCJoZWFkIikuYXBwZW5kKCc8c2NyaXB0PkxBLmluaXQoe2lkOiAiSlFURGlPVloycFJqR2ExSyIsY2s6ICJKUVREaU9WWjJwUmpHYTFLIn0pPC9zY3JpcHQ+Jyk7CiAgICAgICAgfSwgMjAwMCk7CiAgICB9LCAwKTsKfSkoKTsKCmZ1bmN0aW9uIGwobG9nKSB7CiAgICBjb25zb2xlLmxvZygiW0NTRE5HcmVlbmVyXSAiICsgbG9nKTsKfQoKZnVuY3Rpb24gZShlcnJvcikgewogICAgY29uc29sZS5lcnJvcigiW0NTRE5HcmVlbmVyXSAiICsgZXJyb3IpOwp9CgpmdW5jdGlvbiBjbGVhcigpIHsKICAgIGxpc3QgPSBbXTsKfQoKZnVuY3Rpb24gcHV0KHRhZykgewogICAgbGlzdC5wdXNoKHRhZyk7Cn0KCmZ1bmN0aW9uIGNsZWFuKHRpbWVzKSB7CiAgICB2YXIgbG9vcCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAtLXRpbWVzOwogICAgICAgIGlmICh0aW1lcyA8PSAwKSB7CiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwobG9vcCk7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbGlzdC5sZW5ndGg7IGsrKykgewogICAgICAgICAgICAkKGxpc3Rba10pLnJlbW92ZSgpOwogICAgICAgIH0KICAgIH0sIDEwMCk7CiAgICBwcm9ncmVzc29yLmluY1Byb2dyZXNzKDEwKTsKfQoKZnVuY3Rpb24gbG9vcChudW0pIHsKICAgIHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAobnVtID09PSAxKSB7CiAgICAgICAgICAgIC8vIOS4u+mhteS4remXtOeahOW5v+WRigogICAgICAgICAgICAkKCIuSl9hZHYiKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8g5Li76aG15pyJ5paw55qE5YaF5a655qiq5p2hCiAgICAgICAgICAgICQoIi5mZWVkLWZpeC1ib3giKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8g5Li76aG15bm/5ZGKIGlmcmFtZQogICAgICAgICAgICBpZiAoY3VycmVudFVSTCA9PSAiaHR0cHM6Ly93d3cuY3Nkbi5uZXQvIikgewogICAgICAgICAgICAgICAgJCgiaWZyYW1lIikucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8g5Yig6ZmkIENTRE4g5a6Y5pa55Zyo5Li76aG155qE5paH56ug77yI5aSn5aSa5piv5bm/5ZGK77yJCiAgICAgICAgICAgICQoImxpLmNsZWFyZml4IikuZWFjaChmdW5jdGlvbihpbmRleCwgZWxlKSB7CiAgICAgICAgICAgICAgICB2YXIgYmFubmVkID0gL2NzZG48XC9hPi87CiAgICAgICAgICAgICAgICB2YXIgYU1hcmsgPSAkKGVsZSkuZmluZCgiLm5hbWUiKS5odG1sKCk7CiAgICAgICAgICAgICAgICBpZiAoYmFubmVkLnRlc3QoYU1hcmspKSB7CiAgICAgICAgICAgICAgICAgICAgJChlbGUpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8g5Li76aG15bm/5ZGKCiAgICAgICAgICAgICQoImxpIikuZWFjaChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgbGV0IHNlbGYgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlID0gc2VsZi5hdHRyKCdkYXRhLXR5cGUnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ2FkJykgewogICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyDkuLvpobXlub/lkYoKICAgICAgICAgICAgJCgibGkgPiBkaXYgPiBkaXYgPiBoMiA+IGFbaHJlZio9J2h0dHBzOi8vZWR1LmNzZG4ubmV0J10iKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgJCgibGkgPiBkaXYgPiBkaXYgPiBoMiA+IGFbaHJlZio9J2h0dHBzOi8vbWFya2V0aW5nLmNzZG4ubmV0J10iKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8g5a6Y5pa56ISa5pys5qiq5bmFCiAgICAgICAgICAgICQoIi50b29sYmFyLWFkdmVydCIpLnJlbW92ZSgpOwogICAgICAgIH0gZWxzZSBpZiAobnVtID09PSAyKSB7CiAgICAgICAgICAgIC8vIOivhOiuuuafpeeci+abtOWkmuWxleW8gOebkeWQrAogICAgICAgICAgICAkKCJkaXYuY29tbWVudC1saXN0LWJveCIpLmNzcygibWF4LWhlaWdodCIsICJub25lIik7CiAgICAgICAgICAgIC8vIOWxj+iUveaCqOeahOe8qeaUvuS4jeaYrzEwMCXnmoTmj5DnpLoKICAgICAgICAgICAgJCgnLmxlZnRQb3AnKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8g5a6Y5pa56ISa5pys5qiq5bmFCiAgICAgICAgICAgICQoIi50b29sYmFyLWFkdmVydCIpLnJlbW92ZSgpOwogICAgICAgIH0gZWxzZSBpZiAobnVtID09IDMpIHsKICAgICAgICAgICAgLy8g5b6q546v5Yig6Zmk55m75b2V5o+Q56S65qGGCiAgICAgICAgICAgIC8vJCgiLnBhc3Nwb3J0LWxvZ2luLWNvbnRhaW5lciIpLnJlbW92ZSgpOwogICAgICAgICAgICAvLyDnuqLljIXpm6gKICAgICAgICAgICAgJCgiI2NzZG4tcmVkcGFjayIpLnJlbW92ZSgpOwogICAgICAgIH0KICAgIH0sIDUwMCk7Cn0KCmZ1bmN0aW9uIGNvbW1vbihudW0sIHRpbWVzKSB7CiAgICB2YXIgbG9vcCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAtLXRpbWVzOwogICAgICAgIGlmICh0aW1lcyA8PSAwKSB7CiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwobG9vcCk7CiAgICAgICAgfQogICAgICAgIGlmIChudW0gPT09IDEpIHsKICAgICAgICAgICAgLy8g5p+l55yL5pu05aSaCiAgICAgICAgICAgICQoIi5idG4tcmVhZG1vcmUiKS5yZW1vdmVDbGFzcygibm8tbG9naW4iKTsKICAgICAgICAgICAgJCgiLmJ0bi1yZWFkbW9yZSIpLmFkZENsYXNzKCJmYW5zLXJlYWQtbW9yZSIpOwogICAgICAgICAgICAkKCIuYnRuLXJlYWRtb3JlIikucmVtb3ZlQXR0cigiaHJlZiIpOwogICAgICAgICAgICAkKCIuYnRuLXJlYWRtb3JlIikucmVtb3ZlQXR0cigidGFyZ2V0Iik7CiAgICAgICAgICAgICQoIi5idG4tcmVhZG1vcmUiKS5yZW1vdmVBdHRyKCJyZWwiKTsKICAgICAgICAgICAgJCgiLmJ0bi1yZWFkbW9yZSIpLmNsaWNrKCk7CiAgICAgICAgICAgIC8vIOW3sueZu+W9leeUqOaIt+WxleW8gOivhOiuugogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bk1vcmVDb21tZW50IikuY2xpY2soKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgICAgICAgLy8g5Yig6Zmk5p+l55yL5pu05aSa5oyJ6ZKuCiAgICAgICAgICAgICQoIiNidG5Nb3JlQ29tbWVudCIpLnBhcmVudCgiZGl2Lm9wdC1ib3giKS5yZW1vdmUoKTsKICAgICAgICAgICAgLy8g5bGV5byA5YaF5a65CiAgICAgICAgICAgICQoImRpdi5jb21tZW50LWxpc3QtYm94IikuY3NzKCJtYXgtaGVpZ2h0IiwgIm5vbmUiKTsKICAgICAgICAgICAgLy8g5pS55Zue6IOM5pmv6aKc6ImyCiAgICAgICAgICAgICQoIi5sb2dpbi1tYXJrIikucmVtb3ZlKCk7CiAgICAgICAgICAgIC8vIOWIoOmZpOeZu+W9leahhgogICAgICAgICAgICAkKCIubG9naW4tYm94IikucmVtb3ZlKCk7CiAgICAgICAgfSBlbHNlIGlmIChudW0gPT09IDIpIHsKICAgICAgICAgICAgLy8g5oyh5L2P6K+E6K6655qE4oCc5Ye65aS05o6o6I2Q4oCdCiAgICAgICAgICAgIGlmICgkKCIucmVjb21tZW5kLWJveCIpLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICQoIi5yZWNvbW1lbmQtYm94IilbMF0ucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8g5Y676Zmk5o6o5bm/5bm/5ZGKCiAgICAgICAgICAgICQoImxpW2RhdGEtdHlwZT0nYWQnXSIpLnJlbW92ZSgpOwogICAgICAgICAgICAvLyDlhY3nmbvlvZXlpI3liLYKICAgICAgICAgICAgJCgiLmhsanMtYnV0dG9uIikucmVtb3ZlQ2xhc3MoInNpZ25pbiIpOwogICAgICAgICAgICAkKCIuaGxqcy1idXR0b24iKS5hZGRDbGFzcygiezJ9Iik7CiAgICAgICAgICAgICQoIi5obGpzLWJ1dHRvbiIpLmF0dHIoImRhdGEtdGl0bGUiLCAi5YWN55m75b2V5aSN5Yi2Iik7CiAgICAgICAgICAgICQoIi5obGpzLWJ1dHRvbiIpLmF0dHIoIm9uY2xpY2siLCAiaGxqcy5jb3B5Q29kZShldmVudCk7c2V0VGltZW91dChmdW5jdGlvbigpeyQoJy5obGpzLWJ1dHRvbicpLmF0dHIoJ2RhdGEtdGl0bGUnLCAn5YWN55m75b2V5aSN5Yi2Jyk7fSwzNTAwKTsiKTsKICAgICAgICAgICAgLy8g5Y676Zmk5Ymq6LS05p2/5Yqr5oyBCiAgICAgICAgICAgICQoImNvZGUiKS5hdHRyKCJvbmNsaWNrIiwgIm1kY3AuY29weUNvZGUoZXZlbnQpIik7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAvLyDlpI3liLbml7bkv53nlZnljp/mlofmoLzlvI/vvIzlj4LogIMgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9lbi9zY3JpcHRzLzM5MDUwMi1jc2RucmVtb3ZlY29weXJpZ2h0L2NvZGUKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICJhcnRpY2xlVHlwZSIsIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMCwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGNzZG4uY29weXJpZ2h0LmluaXQoIiIsICIiLCAiIik7CiAgICAgICAgICAgIC8vIOmhteWktOW5v+WRigogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiY29sdW1uLWFkdmVydC1ib3giKVswXS5zdHlsZS5kaXNwbGF5PSJub25lIjsKICAgICAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgICAgICAgLy8g6Ieq5Yqo5qOA5rWL5piv5ZCm5pyJ55uu5b2V77yM5aaC5p6c5rKh5pyJ5YiZ5Yig6Zmk5Y+z6L655qCP77yM5paH56ug5bGF5LitCiAgICAgICAgICAgIGlmICgkKCIucmVjb21tZW5kLXJpZ2h0X2FzaWRlIikuaHRtbCgpICYmICQoIi5yZWNvbW1lbmQtcmlnaHRfYXNpZGUiKS5odG1sKCkucmVwbGFjZSgvW1xyXG5dL2csICIiKS5yZXBsYWNlKC8oXHMpL2csICIiKSA9PT0gIiIpIHsKICAgICAgICAgICAgICAgICQoIiNyaWdodEFzaWRlIikucmVtb3ZlKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoJCgiLnJlY29tbWVuZC1yaWdodF9hc2lkZSIpLmh0bWwoKSAmJiAkKCIjcmVjb21tZW5kLXJpZ2h0IikuaHRtbCgpLnJlcGxhY2UoL1tcclxuXS9nLCAiIikucmVwbGFjZSgvKFxzKS9nLCAiIikgPT09ICIiKSB7CiAgICAgICAgICAgICAgICAkKCIjcmlnaHRBc2lkZSIpLnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIOeZu+W9leaMiemSruaWh+Wtl+WkquWkmu+8jOS/ruaUuQogICAgICAgICAgICAkKCJhIikuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmF0dHIoJ2hyZWYnKSA9PT0gJ2h0dHBzOi8vcGFzc3BvcnQuY3Nkbi5uZXQvYWNjb3VudC9sb2dpbicpIHsKICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmh0bWwoJ+eZu+WFpScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8g6aG25qCP5bm/5ZGKCiAgICAgICAgICAgICQoImxpIikuZWFjaChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgbGV0IHNlbGYgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgbGV0IGRhdGFUeXBlID0gc2VsZi5hdHRyKCdkYXRhLXN1Yi1tZW51LXR5cGUnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZSA9PT0gJ3ZpcCcpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IGRhdGFUaXRsZSA9IHNlbGYuYXR0cigndGl0bGUnKTsKICAgICAgICAgICAgICAgIGlmIChkYXRhVGl0bGUgPT09ICfpq5jku7flgLzmupDnoIHor77nqIvliIbkuqsnIHx8IGRhdGFUaXRsZSA9PT0gJ+ezu+e7n+WtpuS5oMK36Zeu562Uwrfmr5TotZsnIHx8IGRhdGFUaXRsZSA9PT0gJ+eugOWNlemrmOaViOS8mOaDoOeahOS6keacjeWKoScpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8g6aG25qCPVklQ6YCJ6aG5CiAgICAgICAgICAgICQoJy50b29sYmFyLXN1Yk1lbnUtYm94JykuZmluZCgiW2hyZWY9J2h0dHBzOi8vbWFsbC5jc2RuLm5ldC92aXAnXSIpLnBhcmVudCgpLnJlbW92ZSgpOwogICAgICAgIH0gZWxzZSBpZiAobnVtID09IDMpIHsKICAgICAgICAgICAgLy/orrrlnZvoh6rliqjlsZXlvIAKICAgICAgICAgICAgJCgiLmpzX3Nob3dfdG9waWMiKS5jbGljaygpOwogICAgICAgIH0gZWxzZSBpZiAobnVtID09IDQpIHsKICAgICAgICAgICAgLyoqIOmFjee9ruaOp+WItiAqKi8KICAgICAgICAgICAgbGV0IGNvbmZpZyA9IG5ldyBDb25maWcoKTsKICAgICAgICAgICAgbGV0IHNtQ29va2llID0gY29uZmlnLmdldCgic2NyLXNtIiwgdHJ1ZSk7CiAgICAgICAgICAgIGxldCBtZENvb2tpZSA9IGNvbmZpZy5nZXQoInNjci1tZCIsIGZhbHNlKTsKICAgICAgICAgICAgbGV0IGxnQ29va2llID0gY29uZmlnLmdldCgic2NyLWxnIiwgZmFsc2UpOwogICAgICAgICAgICBsZXQgZm9Db29raWUgPSBjb25maWcuZ2V0KCJzY3ItZm8iLCBmYWxzZSkKCiAgICAgICAgICAgICQoIiNzY3Itc20iKS5wcm9wKCJjaGVja2VkIiwgc21Db29raWUpOwogICAgICAgICAgICAkKCIjc2NyLW1kIikucHJvcCgiY2hlY2tlZCIsIG1kQ29va2llKTsKICAgICAgICAgICAgJCgiI3Njci1sZyIpLnByb3AoImNoZWNrZWQiLCBsZ0Nvb2tpZSk7CiAgICAgICAgICAgICQoIiNzY3ItZm8iKS5wcm9wKCJjaGVja2VkIiwgZm9Db29raWUpOwoKICAgICAgICAgICAgaWYgKHNtQ29va2llKSB7CiAgICAgICAgICAgICAgICAvLyBTbWFsbCBTY3JlZW4gTW9kZQogICAgICAgICAgICAgICAgJCgiLm1haW5fZmF0aGVyIikucmVtb3ZlQ2xhc3MoImp1c3RpZnktY29udGVudC1jZW50ZXIiKTsKICAgICAgICAgICAgICAgIEdNX2FkZFN0eWxlKGAKICAgICAgICAgICAgICAgIG1haW57CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGF1dG8haW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgIGZsb2F0OiBub25lIWltcG9ydGFudDsKICAgICAgICAgICAgICAgICAgICBtYXgtd2lkdGg6IDkwdnc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtYWluIGFydGljbGUgaW1newogICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICAgICAgICAgICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgICAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGApOwogICAgICAgICAgICAgICAgJCgiI21haW5Cb3giKS5jc3MoIndpZHRoIiwgIjEwMCUiKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChtZENvb2tpZSkgewogICAgICAgICAgICAgICAgLy8gTWlkZGxlIFNjcmVlbiBNb2RlCiAgICAgICAgICAgICAgICAkKCIubWFpbl9mYXRoZXIiKS5yZW1vdmVDbGFzcygianVzdGlmeS1jb250ZW50LWNlbnRlciIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxnQ29va2llKSB7CiAgICAgICAgICAgICAgICAvLyBMYXJnZSBTY3JlZW4gTW9kZQogICAgICAgICAgICAgICAgJCgiLmNvbnRhaW5lciIpLmNzcygibWFyZ2luIiwgIjAgYXV0byIpCiAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9Db29raWUpIHsKICAgICAgICAgICAgICAgIC8vIEZvY3VzIG1vZGUKICAgICAgICAgICAgICAgICQoIi5yZWNvbW1lbmQtcmlnaHQiKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICQoIi5jb250YWluZXIiKS5jc3MoIndpZHRoIiwgIjEwMCUiKTsKICAgICAgICAgICAgICAgICQoIi5jb250YWluZXIgPiBtYWluIikuY3NzKCJ3aWR0aCIsICIxMDAlIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIOWxj+W5leWwuuWvuOWNlemAieebkeWQrAogICAgICAgICAgICAkKCIjc2NyLXNtIikuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbmV3IENvbmZpZygpLnNldCgic2NyLXNtIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3ItbWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3ItbGciLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3ItZm8iLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkKCIjc2NyLW1kIikuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbmV3IENvbmZpZygpLnNldCgic2NyLW1kIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3Itc20iLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3ItbGciLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3ItZm8iLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkKCIjc2NyLWxnIikuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbmV3IENvbmZpZygpLnNldCgic2NyLWxnIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3Itc20iLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3ItbWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3ItZm8iLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkKCIjc2NyLWZvIikuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbmV3IENvbmZpZygpLnNldCgic2NyLWZvIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3Itc20iLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3ItbWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBuZXcgQ29uZmlnKCkuc2V0KCJzY3ItbGciLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyDliKTmlq3mmK/lkKbkuLrnmbvlvZXnirbmgIEKICAgICAgICAgICAgJCgiYSIpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5hdHRyKCdocmVmJykgPT09ICdodHRwczovL3Bhc3Nwb3J0LmNzZG4ubmV0L2FjY291bnQvbG9naW4nKSB7CiAgICAgICAgICAgICAgICAgICAgLy8g5pyq55m75b2V5Yig6Zmk5peg55So5oyJ6ZKuCiAgICAgICAgICAgICAgICAgICAgJCgiYTpjb250YWlucygn5Lya5ZGY5Lit5b+DJykiKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAkKCJhOmNvbnRhaW5zKCfmlLbol48nKSIpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICQoImE6Y29udGFpbnMoJ+WKqOaAgScpIikucGFyZW50KCkucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgJCgiYTpjb250YWlucygn5Yib5L2cJykiKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAkKCIudG9vbGJhci1idG4tY29sbGVjdCIpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICQoIi5idG4td3JpdGUtbmV3IikucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAobnVtID09IDUpIHsKICAgICAgICAgICAgLy8g5pS55Zue6IOM5pmv6aKc6ImyCiAgICAgICAgICAgICQoIi5sb2dpbi1tYXJrIikucmVtb3ZlKCk7CiAgICAgICAgICAgIC8vIOWIoOmZpOeZu+W9leahhgogICAgICAgICAgICAkKCIubG9naW4tYm94IikucmVtb3ZlKCk7CiAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gNikgewogICAgICAgICAgICBsZXQgZGlkID0gZmFsc2U7CiAgICAgICAgICAgIGxldCBjb25maWdIVE1MID0gJyc7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxkaXYgY2xhc3M9ImNvbmZpZ0NvbnRhaW5lciI+PHA+PGEgY2xhc3M9InRpdGxlIiBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYWRsZXJlZC9DU0ROR3JlZW5lciIgdGFyZ2V0PSJfYmxhbmsiPkNTRE5HcmVlbmVyPC9hPiA8c3VwPlYnICsgdmVyc2lvbiArICcgJyArIHNldHRpbmdzX3N2ZyArICc8L3N1cD48L3A+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPHA+PGEgaHJlZj0iLy9zaGFuZy5xcS5jb20vd3BhL3F1bndwYT9pZGtleT1kN2FkNmVhZDNmNTc3MjJlN2YwMGE0MjgxYWU3NWRiYWMyMTMyYzVhOGNmMzIxOTkyZDU3MzA5MDM3ZmNhZjYzIiB0YXJnZXQ9Il9ibGFuayI+5a6Y5pa5IFFRIOS6pOa1gee+pO+8mjEwNDIzNzA0NTM8L2E+PC9wPjxicj4nOwoKICAgICAgICAgICAgLy8g6K6+5a6a77ya5o6o6I2Q5YaF5a655oyJ6ZKuCiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxwIGNsYXNzPSJib2xkIj7moLnmja7lsY/luZXlsLrlr7jvvIzpgILphY3niYjlvI88L3A+PHA+5bu66K6u6YCQ5Liq5bCd6K+V5ZCO6YCJ5oup6YCC5ZCI5L2g55qE54mI5byP77yM5bGP5bmV6L+H5bCP5oiW6ICF54mI5byP6YCJ5oup5LiN5q2j56Gu5Y+z5L6n5qCP5Y+v6IO95rKh5pyJ56m66Ze05pi+56S677yM5a+86Ie05L6n5qCP5a6a5Yi25peg5pWI77yI6K+35bCd6K+V6LCD6IqC5rWP6KeI5Zmo57yp5pS+77yM5b+r5o236ZSuIEN0cmwr6byg5qCH5rua6L2u77yJ44CCPC9wPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxsYWJlbD48aW5wdXQgbmFtZT0iZGlzcGxheU1vZGUiIHR5cGU9InJhZGlvIiB2YWx1ZT0iIiBpZD0ic2NyLXNtIiAvPiDlubPpk7rmqKHlvI8o5LyY5YyW54mIKSA8L2xhYmVsPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxsYWJlbD48aW5wdXQgbmFtZT0iZGlzcGxheU1vZGUiIHR5cGU9InJhZGlvIiB2YWx1ZT0iIiBpZD0ic2NyLW1kIiAvPiDpgILlupTmqKHlvI8gPC9sYWJlbD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8bGFiZWw+PGlucHV0IG5hbWU9ImRpc3BsYXlNb2RlIiB0eXBlPSJyYWRpbyIgdmFsdWU9IiIgaWQ9InNjci1sZyIgLz4g5bGF5Lit5qih5byPIDwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGxhYmVsPjxpbnB1dCBuYW1lPSJkaXNwbGF5TW9kZSIgdHlwZT0icmFkaW8iIHZhbHVlPSIiIGlkPSJzY3ItZm8iIC8+IOayiea1uOaooeW8jyjml6DkvqfmoI8pPC9sYWJlbD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8aHIgc3R5bGU9ImhlaWdodDoxcHg7Ym9yZGVyOm5vbmU7Ym9yZGVyLXRvcDoxcHggc29saWQgI2NjY2NjYzttYXJnaW46IDVweCAwcHggNXB4IDBweDsiIC8+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPHAgY2xhc3M9ImJvbGQiPumAmueUqOiuvuWumjwvcD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8cD7oh6rlrprkuYnog4zmma/lm77vvJogPGlucHV0IHR5cGU9InRleHQiIGlkPSJiYWNrZ3JvdW5kSW1nVXJsIiBwbGFjZWhvbGRlcj0i5Zu+54mH5omA5Zyo572R5Z2A5oiWQmFzZTY0IiBzdHlsZT0iYm9yZGVyLXJhZGl1czogMnB4O2JvcmRlcjogMXB4IHNvbGlkICNmMGYwZjA7cGFkZGluZzo1cHg7d2lkdGg6MTAwJTttYXJnaW4tYm90dG9tOjVweDsiPiA8aW5wdXQgc3R5bGU9Im1hcmdpbi1ib3R0b206NXB4OyIgYWNjZXB0PSJpbWFnZS8qIiBpZD0idXBsb2FkX2JnIiB0eXBlPSJmaWxlIj48L3A+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idG9nZ2xlLXJlY29tbWVuZC1idXR0b24iPiA8bGFiZWwgZm9yPSJ0b2dnbGUtcmVjb21tZW5kLWJ1dHRvbiIgY2xhc3M9Im1vZGVMYWJlbCI+5pi+56S65o6o6I2Q5YaF5a65PC9sYWJlbD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8YnI+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idG9nZ2xlLXNob3AtYnV0dG9uIj4gPGxhYmVsIGZvcj0idG9nZ2xlLXNob3AtYnV0dG9uIiBjbGFzcz0ibW9kZUxhYmVsIj7mmL7npLrlsI/lupc8L2xhYmVsPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxicj4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUtd2hpdGV0aGVtZS1idXR0b24iPiA8bGFiZWwgZm9yPSJ0b2dnbGUtd2hpdGV0aGVtZS1idXR0b24iIGNsYXNzPSJtb2RlTGFiZWwiPueZveiJsuS4u+mimCZEYXJrIFJlYWRlcuWFvOWuueaooeW8jzxicj48c3BhbiBzdHlsZT0iY29sb3I6ICM4MDgwODA7Ij4jIOmAiemhueS9nOeUqO+8muW8gOWQr+WQjuWPr+mAmui/h0RhcmsgUmVhZGVy5o+S5Lu254G15rS75o6n5Yi255m96Imy5LiO6buR5pqX5qih5byP77yMPGEgc3R5bGU9ImNvbG9yOiBncmVlbjsiIGhyZWY9Imh0dHBzOi8vY2hyb21lLnp6em1oLmNuL2luZm8/dG9rZW49ZWltYWRwYmNiZm5tYmtvcG9vamZla2hua2hkYmllZWgiIHRhcmdldD0iX2JsYW5rIj7mj5Lku7bkuIvovb3lnLDlnYDngrnmiJE8L2E+PC9zcGFuPjwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGJyPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRvZ2dsZS1hdXRvc2l6ZS1idXR0b24iPiA8bGFiZWwgZm9yPSJ0b2dnbGUtYXV0b3NpemUtYnV0dG9uIiBjbGFzcz0ibW9kZUxhYmVsIj7lrr3luqboh6rliqjpgILlupQ8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjODA4MDgwOyI+IyDpgInpobnkvZznlKjvvJrlvIDlkK/mraTpgInpobnlj6/ku6XlnKjpobXpnaLlrr3luqbnvKnlsI/ml7boh6rliqjliIfmjaLoh7PlsI/lsY/mqKHlvI88L3NwYW4+PC9sYWJlbD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8YnI+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idG9nZ2xlLWF1dG9oaWRldG9vbGJhci1idXR0b24iPiA8bGFiZWwgZm9yPSJ0b2dnbGUtYXV0b2hpZGV0b29sYmFyLWJ1dHRvbiIgY2xhc3M9Im1vZGVMYWJlbCI+5ZCR5LiL5rua5Yqo6Ieq5Yqo6ZqQ6JeP6aG25qCPPC9sYWJlbD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8YnI+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idG9nZ2xlLWF1dG9oaWRlYm90dG9tYmFyLWJ1dHRvbiI+IDxsYWJlbCBmb3I9InRvZ2dsZS1hdXRvaGlkZWJvdHRvbWJhci1idXR0b24iIGNsYXNzPSJtb2RlTGFiZWwiPuWni+e7iOmakOiXj+W6leagjzwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGJyPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRvZ2dsZS13cml0ZWJsb2ctYnV0dG9uIj4gPGxhYmVsIGZvcj0idG9nZ2xlLXdyaXRlYmxvZy1idXR0b24iIGNsYXNzPSJtb2RlTGFiZWwiPuaYvuekuuWIm+S9nOS4reW/g+aMiemSrjwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGJyPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxociBzdHlsZT0iaGVpZ2h0OjFweDtib3JkZXI6bm9uZTtib3JkZXItdG9wOjFweCBzb2xpZCAjY2NjY2NjO21hcmdpbjogNXB4IDBweCA1cHggMHB4OyIgLz4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8cCBjbGFzcz0iYm9sZCI+PGI+5Y+z5L6n5qCP5a6a5Yi2PC9iPjwvcD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUtYXV0aG9yY2FyZC1idXR0b24iPiA8bGFiZWwgZm9yPSJ0b2dnbGUtYXV0aG9yY2FyZC1idXR0b24iIGNsYXNzPSJtb2RlTGFiZWwiPuaYvuekuuS9nOiAheWQjeeJhzwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGJyPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRvZ2dsZS1zZWFyY2hibG9nLWJ1dHRvbiI+IDxsYWJlbCBmb3I9InRvZ2dsZS1zZWFyY2hibG9nLWJ1dHRvbiIgY2xhc3M9Im1vZGVMYWJlbCI+5pi+56S65pCc5Y2a5Li75paH56ugPC9sYWJlbD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8YnI+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idG9nZ2xlLW5ld2FydGljbGUtYnV0dG9uIj4gPGxhYmVsIGZvcj0idG9nZ2xlLW5ld2FydGljbGUtYnV0dG9uIiBjbGFzcz0ibW9kZUxhYmVsIj7mmL7npLrmnIDmlrDmlofnq6A8L2xhYmVsPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxicj4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUtaG90YXJ0aWNsZS1idXR0b24iPiA8bGFiZWwgZm9yPSJ0b2dnbGUtaG90YXJ0aWNsZS1idXR0b24iIGNsYXNzPSJtb2RlTGFiZWwiPuaYvuekuueDremXqOaWh+eroDwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGJyPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRvZ2dsZS1uZXdjb21tZW50cy1idXR0b24iPiA8bGFiZWwgZm9yPSJ0b2dnbGUtbmV3Y29tbWVudHMtYnV0dG9uIiBjbGFzcz0ibW9kZUxhYmVsIj7mmL7npLrmnIDmlrDor4Torro8L2xhYmVsPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxicj4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUta2luZHBlcnNvbi1idXR0b24iPiA8bGFiZWwgZm9yPSJ0b2dnbGUta2luZHBlcnNvbi1idXR0b24iIGNsYXNzPSJtb2RlTGFiZWwiPuaYvuekuuWIhuexu+S4k+agjzwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGJyPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRvZ2dsZS1yZWNvbW1lbmRhcnRpY2xlLWJ1dHRvbiI+IDxsYWJlbCBmb3I9InRvZ2dsZS1yZWNvbW1lbmRhcnRpY2xlLWJ1dHRvbiIgY2xhc3M9Im1vZGVMYWJlbCI+5pi+56S65o6o6I2Q5paH56ugPC9sYWJlbD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8YnI+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0idG9nZ2xlLWFyY2hpdmUtYnV0dG9uIj4gPGxhYmVsIGZvcj0idG9nZ2xlLWFyY2hpdmUtYnV0dG9uIiBjbGFzcz0ibW9kZUxhYmVsIj7mmL7npLrlvZLmoaM8L2xhYmVsPic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxicj4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ0b2dnbGUtY29udGVudC1idXR0b24iPiA8bGFiZWwgZm9yPSJ0b2dnbGUtY29udGVudC1idXR0b24iIGNsYXNzPSJtb2RlTGFiZWwiPuaYvuekuuebruW9lTwvbGFiZWw+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGJyPjxicj4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8ZGl2PjxoNj7msqHmnInmlLbpkrHnmoTlub/lkYo8L2g2PjxwPuaIkeWutummmea4r0NOMiAxME3kuLvmnLrkuIDkuKrmnIgyOe+8iOS5n+acieWbveWGhemrmOmYsuS4u+acuu+8ie+8jOmrmOmYskNETuWbveWGheWkluiKgueCuemDveacie+8iOmmmea4r+iKgueCueWFjeWkh+ahiO+8ie+8jOmdnuW4uOmAguWQiOWwj+ermemVv+S7peWPiumVv+acn+iiq+aUu+WHu+eahOe9keermeWTpiA6KTwvcD48YSBocmVmPSJodHRwczovL3d3dy50c3l2cHMuY29tL2FmZi9IRUhUUEdZTCIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgc3JjPSJodHRwczovL2Z0cC5zdGFja292ZXJmbG93Lndpa2kvYm9sby9hZC5wbmciIHN0eWxlPSJtYXgtd2lkdGg6IDUwMHB4OyI+PC9hPjwvZGl2Pjxicj4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8ZGl2PjxoNj7msqHmnInmlLbpkrHnmoTlub/lkYogMjwvaDY+PHA+77yI5L2c6ICF5pys5Lq65bu66K6+55qE56S+5Yy6772ePC9wPjxwPuekvuWMuuS4reiBmumbhuS6huWQjOihjOS4mueahOWkp+S9rOWwj+eZve+8jOasoui/juWwj+S8meS8tOS7rOS4gOi1t+aRuOmxvO+8gTwvcD48YSBocmVmPSJodHRwczovL2Zpc2hwaS5jbiIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgc3JjPSJodHRwczovL3MyLmxvbGkubmV0LzIwMjIvMDEvMDUvMUhwQlpVcmFNY1I4aXN0LnBuZyIgc3R5bGU9IndpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ii8+PC9hPjwvZGl2Pic7CiAgICAgICAgICAgIGNvbmZpZ0hUTUwgKz0gJzxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hZGxlcmVkL0NTRE5HcmVlbmVyIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9ImdpdmVNZU9uZVN0YXIiPicgKyBzdGFyX3N2ZyArICcgPGI+54K55oiRfjwvYj4g5Yqo5Yqo5bCP5omL5ZyoIEdpdEh1YiDngrnkuKogU3RhciDlkozlhbPms6jvvIzmlK/mjIHmiJHnu6fnu63nu7TmiqTohJrmnKwgOik8L2E+PGJyPjxicj4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8cD7nibnliKvmj5DnpLrvvJpDU0ROR3JlZW5lciDohJrmnKzkuI3mj5Dkvpvku7vkvZXkvJrlkZjmlofnq6DnoLTop6PjgIHkvJrlkZjotYTmupDkuIvovb3lip/og73vvIzku4XpgILnlKjkuo7liY3nq6/kvJjljJbvvIzor7flnKhDU0RO5a6Y5pa55rig6YGT6LSt5LmwQ1NETuS8muWRmOS9k+mqjOS7mOi0ueWKn+iDveOAgjwvcD4nOwogICAgICAgICAgICBjb25maWdIVE1MICs9ICc8aHIgc3R5bGU9ImhlaWdodDoxcHg7Ym9yZGVyOm5vbmU7Ym9yZGVyLXRvcDoxcHggc29saWQgI2NjY2NjYzttYXJnaW46IDVweCAwcHggNXB4IDBweDsiIC8+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPGJyPic7CgogICAgICAgICAgICAvLyBjb25maWdIVE1MICs9ICc8YSBocmVmPSJodHRwczovL2RvYy5zdGFja292ZXJmbG93Lndpa2kvd2ViLyMvMjE/cGFnZV9pZD0xMzgiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0ibWFyZ2luLXRvcDogNXB4OyBkaXNwbGF5OiBibG9jazsiPicgKyBkb25hdGVfc3ZnICsgJyDmiJHmmK/ogIHmnb/vvIzmipXluIHmiZPotY88L2E+JzsKICAgICAgICAgICAgY29uZmlnSFRNTCArPSAnPC9kaXY+PC9kaXY+PGRpdiBpZD0iZmFkZSIgY2xhc3M9ImJsYWNrX292ZXJsYXkiPjwvZGl2Pic7CiAgICAgICAgICAgIGxldCBzYXZlQnV0dG9uID0gJzxidXR0b24gY2xhc3M9InNhdmVCdXR0b24iIHN0eWxlPSJwb3NpdGlvbjogc3RpY2t5O3RvcDogNXB4O2xlZnQ6IGNhbGMoMTAwJSAtIDgwcHgpOyIgb25jbGljaz0ic2F2ZUFuZFJlbG9hZCgpOyI+JyArIHNhdmVfc3ZnICsgJyDlupTnlKg8L2J1dHRvbj4nOwogICAgICAgICAgICAvLyDnu7/ljJblmajorr7lrpoKICAgICAgICAgICAgJCgiYm9keSIpLmFmdGVyKCc8ZGl2IGlkPSJjb25maWdDb250ZW50IiBjbGFzcz0id2hpdGVfY29udGVudCI+JyArIHNhdmVCdXR0b24gKyBjb25maWdIVE1MKTsKCiAgICAgICAgICAgIC8qKiDphY3nva7mjqfliLYgKiovCiAgICAgICAgICAgIC8vIOaOqOiNkOWGheWuuQogICAgICAgICAgICAkKCIuYmxvZy1jb250ZW50LWJveCIpLmFwcGVuZCgiPGJyPjxkaXYgY2xhc3M9J2Jsb2ctY29udGVudC1ib3gnIGlkPSdyZWNvbW1lbmRTd2l0Y2gnIHN0eWxlPSd0ZXh0LWFsaWduOiByaWdodDsnPjwvZGl2PiIpOwogICAgICAgICAgICAkKCIjcmVjb21tZW5kU3dpdGNoOmxhc3QiKS5hcHBlbmQoJzxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9InRvZ2dsZS1idXR0b24iPiA8bGFiZWwgZm9yPSJ0b2dnbGUtYnV0dG9uIiBjbGFzcz0iYnV0dG9uLWxhYmVsIj4gPHNwYW4gY2xhc3M9ImNpcmNsZSI+PC9zcGFuPiA8c3BhbiBjbGFzcz0idGV4dCBvbiI+Jm5ic3A7PC9zcGFuPiA8c3BhbiBjbGFzcz0idGV4dCBvZmYiPiZuYnNwOzwvc3Bhbj4gPC9sYWJlbD4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8cCBzdHlsZT0ibWFyZ2luLXRvcDogNXB4OyBmb250LXNpemU6IDEzcHg7Ij7mmL7npLrmjqjojZDlhoXlrrk8L3A+Jyk7CiAgICAgICAgICAgIGxldCByZWNvbW1lbmRDb29raWUgPSBjb25maWcuZ2V0KCJyZWNvbW1lbmQiLCBmYWxzZSk7CiAgICAgICAgICAgIGlmICghcmVjb21tZW5kQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIucmVjb21tZW5kLWJveCIpLmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVjb21tZW5kQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLXJlY29tbWVuZC1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtcmVjb21tZW5kLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS1yZWNvbW1lbmQtYnV0dG9uIiwgInJlY29tbWVuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHskKCIucmVjb21tZW5kLWJveCIpLnNsaWRlRG93bigyMDApO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHskKCIucmVjb21tZW5kLWJveCIpLnNsaWRlVXAoMjAwKTt9KTsKICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbkFuZEFjdGlvbigiI3RvZ2dsZS1idXR0b24iLCAicmVjb21tZW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHskKCIucmVjb21tZW5kLWJveCIpLnNsaWRlRG93bigyMDApO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHskKCIucmVjb21tZW5kLWJveCIpLnNsaWRlVXAoMjAwKTt9KTsKCiAgICAgICAgICAgIC8vIOaYvuekuuWwj+W6lwogICAgICAgICAgICBsZXQgc2hvcENvb2tpZSA9IGNvbmZpZy5nZXQoJ3Nob3AnLGZhbHNlKTsKICAgICAgICAgICAgaWYoIXNob3BDb29raWUpewogICAgICAgICAgICAgICAgJCgiI2NzZG4tc2hvcC13aW5kb3ciKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAkKCIjY3Nkbi1zaG9wLXdpbmRvdy10b3AiKS5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNob3BDb29raWUpIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtc2hvcC1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLXNob3AtYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25maWcubGlzdGVuQnV0dG9uKCIjdG9nZ2xlLXNob3AtYnV0dG9uIiwgInNob3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSk7CgogICAgICAgICAgICAvLyDmmL7npLrkvZzogIXlkI3niYcKICAgICAgICAgICAgbGV0IGF1dGhvckNhcmRDb29raWUgPSBjb25maWcuZ2V0KCJhdXRob3JDYXJkIiwgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChhdXRob3JDYXJkQ29va2llKSB7CiAgICAgICAgICAgICAgICAvLyDljZrkuLvkv6Hmga8KICAgICAgICAgICAgICAgICQoJyNyZWNvbW1lbmQtcmlnaHQnKS5hcHBlbmQoJCgnI2FzaWRlUHJvZmlsZScpLnByb3AoIm91dGVySFRNTCIpKTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI2FzaWRlUHJvZmlsZScpLmF0dHIoInN0eWxlIiwgIm1hcmdpbi10b3A6IDhweDsgd2lkdGg6IDMwMHB4OyIpOwogICAgICAgICAgICAgICAgfSwgNTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXV0aG9yQ2FyZENvb2tpZSkgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1hdXRob3JjYXJkLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtYXV0aG9yY2FyZC1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbmZpZy5saXN0ZW5CdXR0b24oIiN0b2dnbGUtYXV0aG9yY2FyZC1idXR0b24iLCAiYXV0aG9yQ2FyZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSk7CgogICAgICAgICAgICAvLyDlvLrliLbnmb3oibLkuLvpopgKICAgICAgICAgICAgbGV0IHdoaXRlVGhlbWVDb29raWUgPSBjb25maWcuZ2V0KCJ3aGl0ZVRoZW1lIiwgZmFsc2UpOwogICAgICAgICAgICBpZiAod2hpdGVUaGVtZUNvb2tpZSkgewogICAgICAgICAgICAgICAgLy8g6IOM5pmv5Yig6ZmkCiAgICAgICAgICAgICAgICAkKCcubWFpbl9mYXRoZXInKS5hdHRyKCdzdHlsZScsICdiYWNrZ3JvdW5kLWltYWdlOiBub25lICFpbXBvcnRhbnQ7IGJhY2tncm91bmQtY29sb3I6ICNmNWY2Zjc7IGJhY2tncm91bmQ6ICNmNWY2Zjc7Jyk7CiAgICAgICAgICAgICAgICAkKCdbaHJlZl49Imh0dHBzOi8vY3NkbmltZy5jbi9yZWxlYXNlL3Bob2VuaXgvdGVtcGxhdGUvdGhlbWVzX3NraW4vIl0nKS5hdHRyKCdocmVmJywgJ2h0dHBzOi8vY3NkbmltZy5jbi9yZWxlYXNlL3Bob2VuaXgvdGVtcGxhdGUvdGhlbWVzX3NraW4vc2tpbi10ZWNobm9sb2d5L3NraW4tdGVjaG5vbG9neS02MzM2NTQ5NTU3Lm1pbi5jc3MnKTsKICAgICAgICAgICAgICAgICQoJyNjc2RuLXRvb2xiYXInKS5yZW1vdmVDbGFzcygnY3Nkbi10b29sYmFyLXNraW4tYmxhY2snKTsKICAgICAgICAgICAgICAgICQoJy5jc2RuLWxvZ28nKS5hdHRyKCdzcmMnLCAnLy9jc2RuaW1nLmNuL2Nkbi9jb250ZW50LXRvb2xiYXIvY3Nkbi1sb2dvLnBuZz92PTIwMjAwNDE2LjEnKTsKICAgICAgICAgICAgICAgICQoJ2h0bWwnKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnI2Y1ZjZmNycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh3aGl0ZVRoZW1lQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLXdoaXRldGhlbWUtYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS13aGl0ZXRoZW1lLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS13aGl0ZXRoZW1lLWJ1dHRvbiIsICJ3aGl0ZVRoZW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9KTsKCiAgICAgICAgICAgIC8vIOiDjOaZr+WbvgogICAgICAgICAgICBsZXQgYmFja2dyb3VuZEltYWdlID0gR01fZ2V0VmFsdWUoImJhY2tncm91bmRJbWFnZSIsICIiKTsKICAgICAgICAgICAgaWYgKGJhY2tncm91bmRJbWFnZSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICQoIiNiYWNrZ3JvdW5kSW1nVXJsIikudmFsKGJhY2tncm91bmRJbWFnZSk7CiAgICAgICAgICAgICAgICAkKCIubWFpbl9mYXRoZXIiKS5hdHRyKCdzdHlsZScsICdiYWNrZ3JvdW5kLWltYWdlOnVybCgnICsgYmFja2dyb3VuZEltYWdlICsgJyk7YmFja2dyb3VuZC1hdHRhY2htZW50OmZpeGVkO2JhY2tncm91bmQtc2l6ZToxMDAlOycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICQoJyNiYWNrZ3JvdW5kSW1nVXJsJykub24oJ2lucHV0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgiYmFja2dyb3VuZEltYWdlIiwgJCgiI2JhY2tncm91bmRJbWdVcmwiKS52YWwoKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkKCcjYmFja2dyb3VuZEltZ1VybCcpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJiYWNrZ3JvdW5kSW1hZ2UiLCAkKCIjYmFja2dyb3VuZEltZ1VybCIpLnZhbCgpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICQoIiN1cGxvYWRfYmciKS5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBsZXQgZmlsZSA9ICQoIiN1cGxvYWRfYmciKVswXS5maWxlc1swXTsKICAgICAgICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwogICAgICAgICAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGJhc2U2NCA9IGUudGFyZ2V0LnJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAkKCcjYmFja2dyb3VuZEltZ1VybCcpLnZhbChiYXNlNjQpOwogICAgICAgICAgICAgICAgICAgICQoJyNiYWNrZ3JvdW5kSW1nVXJsJykuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyDmkJzljZrkuLvmlofnq6AKICAgICAgICAgICAgbGV0IHNlYXJjaEJsb2dDb29raWUgPSBjb25maWcuZ2V0KCJzZWFyY2hCbG9nIiwgZmFsc2UpOwogICAgICAgICAgICBpZihzZWFyY2hCbG9nQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCcjcmVjb21tZW5kLXJpZ2h0JykuYXBwZW5kKCQoJyNhc2lkZVNlYXJjaEFydGljbGUnKS5wcm9wKCJvdXRlckhUTUwiKSk7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoJyNhc2lkZVNlYXJjaEFydGljbGUnKS5hdHRyKCJzdHlsZSIsICJtYXJnaW4tdG9wOiA4cHg7IHdpZHRoOiAzMDBweDsiKTsKICAgICAgICAgICAgICAgICAgICB2YXIgaSA9ICQoIiNzZWFyY2gtYmxvZy13b3JkcyIpCiAgICAgICAgICAgICAgICAgICAgICAsIG4gPSAkKCIuYnRuLXNlYXJjaC1ibG9nIik7CiAgICAgICAgICAgICAgICAgICAgaS5rZXl1cChmdW5jdGlvbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5rZXlDb2RlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMTMgPT0gbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBlbmNvZGVVUklDb21wb25lbnQoaS52YWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gIi8vc28uY3Nkbi5uZXQvc28vc2VhcmNoL3MuZG8/cT0iICsgZSArICImdD1ibG9nJnU9IiArIHVzZXJuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBuLm9uKCJjbGljayIsIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlbmNvZGVVUklDb21wb25lbnQoaS52YWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICIvL3NvLmNzZG4ubmV0L3NvL3NlYXJjaC9zLmRvP3E9IiArIG4gKyAiJnQ9YmxvZyZ1PSIgKyB1c2VybmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGUpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCA1MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzZWFyY2hCbG9nQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLXNlYXJjaGJsb2ctYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1zZWFyY2hibG9nLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS1zZWFyY2hibG9nLWJ1dHRvbiIsICJzZWFyY2hCbG9nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9KTsKCiAgICAgICAgICAgIC8vIOacgOaWsOaWh+eroAogICAgICAgICAgICBsZXQgbmV3QXJ0aWNsZUNvb2tpZSA9IGNvbmZpZy5nZXQoIm5ld0FydGljbGUiLCBmYWxzZSk7CiAgICAgICAgICAgIGlmIChuZXdBcnRpY2xlQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCcjcmVjb21tZW5kLXJpZ2h0JykuYXBwZW5kKCQoJyNhc2lkZU5ld0FydGljbGUnKS5wcm9wKCJvdXRlckhUTUwiKSk7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoJyNhc2lkZU5ld0FydGljbGUnKS5hdHRyKCJzdHlsZSIsICJtYXJnaW4tdG9wOiA4cHg7IHdpZHRoOiAzMDBweDsiKTsKICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXdBcnRpY2xlQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLW5ld2FydGljbGUtYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1uZXdhcnRpY2xlLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS1uZXdhcnRpY2xlLWJ1dHRvbiIsICJuZXdBcnRpY2xlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9KTsKCiAgICAgICAgICAgIC8vIOeDremXqOaWh+eroAogICAgICAgICAgICBsZXQgaG90QXJ0aWNsZUNvb2tpZSA9IGNvbmZpZy5nZXQoImhvdEFydGljbGUiLCBmYWxzZSk7CiAgICAgICAgICAgIGlmIChob3RBcnRpY2xlQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCcjcmVjb21tZW5kLXJpZ2h0JykuYXBwZW5kKCQoIiNhc2lkZUhvdEFydGljbGUiKS5wcm9wKCJvdXRlckhUTUwiKSk7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoJyNhc2lkZUhvdEFydGljbGUnKS5hdHRyKCJzdHlsZSIsICJtYXJnaW4tdG9wOiA4cHg7IHdpZHRoOiAzMDBweDsiKTsKICAgICAgICAgICAgICAgICAgICAkKCcjYXNpZGVIb3RBcnRpY2xlIGltZycpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGhvdEFydGljbGVDb29raWUpIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtaG90YXJ0aWNsZS1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLWhvdGFydGljbGUtYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25maWcubGlzdGVuQnV0dG9uKCIjdG9nZ2xlLWhvdGFydGljbGUtYnV0dG9uIiwgImhvdEFydGljbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30pOwoKICAgICAgICAgICAgLy8g5pyA5paw6K+E6K66CiAgICAgICAgICAgIGxldCBuZXdDb21tZW50c0Nvb2tpZSA9IGNvbmZpZy5nZXQoIm5ld0NvbW1lbnRzIiwgZmFsc2UpOwogICAgICAgICAgICBpZiAobmV3Q29tbWVudHNDb29raWUpIHsKICAgICAgICAgICAgICAgICQoJyNyZWNvbW1lbmQtcmlnaHQnKS5hcHBlbmQoJCgiI2FzaWRlTmV3Q29tbWVudHMiKS5wcm9wKCJvdXRlckhUTUwiKSk7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoJyNhc2lkZU5ld0NvbW1lbnRzJykuYXR0cigic3R5bGUiLCAibWFyZ2luLXRvcDogOHB4OyB3aWR0aDogMzAwcHg7Iik7CiAgICAgICAgICAgICAgICAgICAgJCgiLmNvbW1lbnQuZWxsaXBzaXMiKS5hdHRyKCJzdHlsZSIsICJtYXgtaGVpZ2h0OiBub25lOyIpOwogICAgICAgICAgICAgICAgICAgICQoIi50aXRsZS50ZXh0LXRydW5jYXRlIikuYXR0cigic3R5bGUiLCAicGFkZGluZzogMCIpOwogICAgICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5ld0NvbW1lbnRzQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLW5ld2NvbW1lbnRzLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtbmV3Y29tbWVudHMtYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25maWcubGlzdGVuQnV0dG9uKCIjdG9nZ2xlLW5ld2NvbW1lbnRzLWJ1dHRvbiIsICJuZXdDb21tZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSk7CgogICAgICAgICAgICAvLyDliIbnsbvkuJPmoI8KICAgICAgICAgICAgbGV0IGtpbmRQZXJzb25Db29raWUgPSBjb25maWcuZ2V0KCJraW5kUGVyc29uIiwgZmFsc2UpOwogICAgICAgICAgICBpZiAoIWtpbmRQZXJzb25Db29raWUpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI2FzaWRlQ2F0ZWdvcnknKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAkKCcua2luZF9wZXJzb24nKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgnI3JlY29tbWVuZC1yaWdodCcpLmFwcGVuZCgkKCIjYXNpZGVDYXRlZ29yeSIpLnByb3AoIm91dGVySFRNTCIpKTsKICAgICAgICAgICAgICAgIGlmICgkKCIjYXNpZGVDYXRlZ29yeSIpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAkKCcua2luZF9wZXJzb24nKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJCgnLmtpbmRfcGVyc29uJykuYXR0cigic3R5bGUiLCAibWFyZ2luLXRvcDogOHB4OyB3aWR0aDogMzAwcHg7IGhlaWdodDoyNTVweDsiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI2FzaWRlQ2F0ZWdvcnknKS5hdHRyKCJzdHlsZSIsICJtYXJnaW4tdG9wOiA4cHg7IHdpZHRoOiAzMDBweDsgZGlzcGxheTpibG9jayAhaW1wb3J0YW50OyIpOwogICAgICAgICAgICAgICAgICAgICQoImEuZmxleGlibGUtYnRuIikuY2xpY2soZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucGFyZW50cygnZGl2LmFzaWRlLWJveCcpLnJlbW92ZUNsYXNzKCdmbGV4aWJsZS1ib3gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCJwLnRleHQtY2VudGVyIikucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGtpbmRQZXJzb25Db29raWUpIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUta2luZHBlcnNvbi1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLWtpbmRwZXJzb24tYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25maWcubGlzdGVuQnV0dG9uKCIjdG9nZ2xlLWtpbmRwZXJzb24tYnV0dG9uIiwgImtpbmRQZXJzb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30pOwoKICAgICAgICAgICAgLy8g55uu5b2VCiAgICAgICAgICAgIGxldCBjb250ZW50Q29va2llID0gY29uZmlnLmdldCgiY29udGVudCIsIHRydWUpOwogICAgICAgICAgICBpZiAoIWNvbnRlbnRDb29raWUpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnLmFsaWduLWl0ZW1zLXN0cmV0Y2guZ3JvdXBfaXRlbScpLnBhcmVudCgpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNvbnRlbnRDb29raWUpIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtY29udGVudC1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLWNvbnRlbnQtYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25maWcubGlzdGVuQnV0dG9uKCIjdG9nZ2xlLWNvbnRlbnQtYnV0dG9uIiwgImNvbnRlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30pOwoKICAgICAgICAgICAgLy8g5o6o6I2Q5paH56ugCiAgICAgICAgICAgIGxldCByZWNvbW1lbmRBcnRpY2xlQ29va2llID0gY29uZmlnLmdldCgicmVjb21tZW5kQXJ0aWNsZSIsIGZhbHNlKTsKICAgICAgICAgICAgaWYgKCFyZWNvbW1lbmRBcnRpY2xlQ29va2llKSB7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICQoJy5yZWNvbW1lbmQtbGlzdC1ib3gnKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAkKCcucmVjb21tZW5kLWxpc3QtYm94JykuYXR0cigic3R5bGUiLCAibWFyZ2luLXRvcDogOHB4OyB3aWR0aDogMzAwcHg7IGhlaWdodDoyNTVweDsiKTsKICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZWNvbW1lbmRBcnRpY2xlQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLXJlY29tbWVuZGFydGljbGUtYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1yZWNvbW1lbmRhcnRpY2xlLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS1yZWNvbW1lbmRhcnRpY2xlLWJ1dHRvbiIsICJyZWNvbW1lbmRBcnRpY2xlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9KTsKCiAgICAgICAgICAgIC8vIOW9kuahowogICAgICAgICAgICBsZXQgYXJjaGl2ZUNvb2tpZSA9IGNvbmZpZy5nZXQoImFyY2hpdmUiLCBmYWxzZSk7CiAgICAgICAgICAgIGlmICghYXJjaGl2ZUNvb2tpZSkgewogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjYXNpZGVBcmNoaXZlJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQoJyNyZWNvbW1lbmQtcmlnaHQnKS5hcHBlbmQoJCgiI2FzaWRlQXJjaGl2ZSIpLnByb3AoIm91dGVySFRNTCIpKTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI2FzaWRlQXJjaGl2ZScpLmF0dHIoInN0eWxlIiwgIm1hcmdpbi10b3A6IDhweDsgd2lkdGg6IDMwMHB4OyBkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnQ7Iik7CiAgICAgICAgICAgICAgICB9LCA1MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcmNoaXZlQ29va2llKSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLWFyY2hpdmUtYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1hcmNoaXZlLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS1hcmNoaXZlLWJ1dHRvbiIsICJhcmNoaXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9KTsKCiAgICAgICAgICAgIC8vIOiHquWKqOmdoOW3puW5s+mTugogICAgICAgICAgICBsZXQgYXV0b1NpemVDb29raWUgPSBjb25maWcuZ2V0KCJhdXRvU2l6ZSIsIGZhbHNlKTsKICAgICAgICAgICAgaWYgKGF1dG9TaXplQ29va2llKSB7CiAgICAgICAgICAgICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgLy8g5paH56ug5a695bqm6Ieq6YCC5bqUCiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgMTEwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyDliKDpmaTljp/mnInlk43lupTlvI/moLflvI8KICAgICAgICAgICAgICAgICAgICAgICAgJCgiLm1haW5fZmF0aGVyIikucmVtb3ZlQ2xhc3MoImp1c3RpZnktY29udGVudC1jZW50ZXIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgiYXJ0aWNsZSIpLndpZHRoKHdpbmRvdy5pbm5lcldpZHRoIC0gMTUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgR01fYWRkU3R5bGUoYAogICAgICAgICAgICAgICAgICAgICAgICBtYWluewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGF1dG8haW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQ6IG5vbmUhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4LXdpZHRoOiA5MHZ3OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gYXJ0aWNsZSBpbWd7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDAgYXV0bzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC1maXQ6IGNvdmVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGApOwogICAgICAgICAgICAgICAgICAgICAgICBkaWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWQgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoImFydGljbGUiKS5yZW1vdmVBdHRyKCJzdHlsZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCA1MDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhdXRvU2l6ZUNvb2tpZSkgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1hdXRvc2l6ZS1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLWF1dG9zaXplLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS1hdXRvc2l6ZS1idXR0b24iLCAiYXV0b1NpemUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30pOwoKICAgICAgICAgICAgLy8g6Ieq5Yqo6ZqQ6JeP6aG25qCPCiAgICAgICAgICAgIGxldCBhdXRvSGlkZVRvb2xiYXJDb29raWUgPSBjb25maWcuZ2V0KCJhdXRvSGlkZVRvb2xiYXIiLCB0cnVlKTsKICAgICAgICAgICAgaWYgKGF1dG9IaWRlVG9vbGJhckNvb2tpZSkgewogICAgICAgICAgICAgICAgJCh3aW5kb3cpLnNjcm9sbChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA+IDEwMCkgewogICAgICAgICAgICAgICAgCSAgICBsZXQgc2Nyb2xsUyA9ICQodGhpcykuc2Nyb2xsVG9wKCk7CiAgICAgICAgICAgICAgICAJICAgIGlmIChzY3JvbGxTID49IHdpbmRvd1RvcCkgewogICAgICAgICAgICAgICAgCSAgICAJJCgnI2NzZG4tdG9vbGJhcicpLnNsaWRlVXAoMTAwKTsKICAgICAgICAgICAgICAgIAkgICAgCXdpbmRvd1RvcCA9IHNjcm9sbFM7CiAgICAgICAgICAgICAgICAJICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAJICAgIAkkKCcjY3Nkbi10b29sYmFyJykuc2xpZGVEb3duKDEwMCk7CiAgICAgICAgICAgICAgICAJICAgIAl3aW5kb3dUb3AgPSBzY3JvbGxTOwogICAgICAgICAgICAgICAgCSAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGF1dG9IaWRlVG9vbGJhckNvb2tpZSkgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1hdXRvaGlkZXRvb2xiYXItYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1hdXRvaGlkZXRvb2xiYXItYnV0dG9uIikucHJvcCgiY2hlY2tlZCIsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25maWcubGlzdGVuQnV0dG9uKCIjdG9nZ2xlLWF1dG9oaWRldG9vbGJhci1idXR0b24iLCAiYXV0b0hpZGVUb29sYmFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9KTsKCiAgICAgICAgICAgIC8vIOiHquWKqOmakOiXj+W6leagjwogICAgICAgICAgICBsZXQgYXV0b0hpZGVCb3R0b21CYXJDb29raWUgPSBjb25maWcuZ2V0KCJhdXRvSGlkZUJvdHRvbUJhciIsIHRydWUpOwogICAgICAgICAgICBpZiAoYXV0b0hpZGVCb3R0b21CYXJDb29raWUpIHsKICAgICAgICAgICAgICAgICQoIiN0b29sQmFyQm94IC5sZWZ0LXRvb2xib3giKS5jc3MoewogICAgICAgICAgICAgICAgCXBvc2l0aW9uOiAicmVsYXRpdmUiLAogICAgICAgICAgICAgICAgCWxlZnQ6ICIwcHgiLAogICAgICAgICAgICAgICAgCWJvdHRvbTogIjAiLAogICAgICAgICAgICAgICAgCXdpZHRoOiAkKCIjdG9vbEJhckJveCIpLndpZHRoKCkgKyAicHgiCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICQod2luZG93KS5zY3JvbGwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAJJCgiI3Rvb2xCYXJCb3ggLmxlZnQtdG9vbGJveCIpLmNzcyh7CiAgICAgICAgICAgICAgICAJCXBvc2l0aW9uOiAicmVsYXRpdmUiLAogICAgICAgICAgICAgICAgCQlsZWZ0OiAiMHB4IiwKICAgICAgICAgICAgICAgIAkJYm90dG9tOiAiMCIsCiAgICAgICAgICAgICAgICAJCXdpZHRoOiAkKCIjdG9vbEJhckJveCIpLndpZHRoKCkgKyAicHgiCiAgICAgICAgICAgICAgICAJfSkKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhdXRvSGlkZUJvdHRvbUJhckNvb2tpZSkgewogICAgICAgICAgICAgICAgJCgiI3RvZ2dsZS1hdXRvaGlkZWJvdHRvbWJhci1idXR0b24iKS5wcm9wKCJjaGVja2VkIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkKCIjdG9nZ2xlLWF1dG9oaWRlYm90dG9tYmFyLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS1hdXRvaGlkZWJvdHRvbWJhci1idXR0b24iLCAiYXV0b0hpZGVCb3R0b21CYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkge2xvY2F0aW9uLnJlbG9hZCgpO30pOwoKICAgICAgICAgICAgLy8g5Yib5L2c5Lit5b+D5oyJ6ZKuCiAgICAgICAgICAgIGxldCB3cml0ZUJsb2dDb29raWUgPSBjb25maWcuZ2V0KCJ3cml0ZUJsb2ciLCB0cnVlKTsKICAgICAgICAgICAgaWYgKCF3cml0ZUJsb2dDb29raWUpIHsKICAgICAgICAgICAgICAgICQoIi50b29sYmFyLWJ0bi13cml0ZSIpLnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh3cml0ZUJsb2dDb29raWUpIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtd3JpdGVibG9nLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCB0cnVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICQoIiN0b2dnbGUtd3JpdGVibG9nLWJ1dHRvbiIpLnByb3AoImNoZWNrZWQiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uZmlnLmxpc3RlbkJ1dHRvbigiI3RvZ2dsZS13cml0ZWJsb2ctYnV0dG9uIiwgIndyaXRlQmxvZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtsb2NhdGlvbi5yZWxvYWQoKTt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7bG9jYXRpb24ucmVsb2FkKCk7fSk7CgogICAgICAgICAgICAvLyDlj7Pkvqfmu5rliqjmnaEKICAgICAgICAgICAgLyoqIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbGV0IHJpZ2h0U2lkZUhlaWdodCA9IDA7CiAgICAgICAgICAgICAgICBsZXQgcGFnZUhlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTsKICAgICAgICAgICAgICAgIHJpZ2h0U2lkZUhlaWdodCArPSBnZXRIZWlnaHQoJCgnLmFsaWduLWl0ZW1zLXN0cmV0Y2guZ3JvdXBfaXRlbScpLnBhcmVudCgpKTsKICAgICAgICAgICAgICAgIHJpZ2h0U2lkZUhlaWdodCArPSBnZXRIZWlnaHQoJCgiI2FzaWRlUHJvZmlsZSIpKTsKICAgICAgICAgICAgICAgIHJpZ2h0U2lkZUhlaWdodCArPSBnZXRIZWlnaHQoJCgiI2FzaWRlU2VhcmNoQXJ0aWNsZSIpKTsKICAgICAgICAgICAgICAgIHJpZ2h0U2lkZUhlaWdodCArPSBnZXRIZWlnaHQoJCgiI2FzaWRlTmV3QXJ0aWNsZSIpKTsKICAgICAgICAgICAgICAgIHJpZ2h0U2lkZUhlaWdodCArPSBnZXRIZWlnaHQoJCgiI2FzaWRlSG90QXJ0aWNsZSIpKTsKICAgICAgICAgICAgICAgIHJpZ2h0U2lkZUhlaWdodCArPSBnZXRIZWlnaHQoJCgiI2FzaWRlTmV3Q29tbWVudHMiKSk7CiAgICAgICAgICAgICAgICByaWdodFNpZGVIZWlnaHQgKz0gZ2V0SGVpZ2h0KCQoIiNhc2lkZUNhdGVnb3J5IikpOwogICAgICAgICAgICAgICAgcmlnaHRTaWRlSGVpZ2h0ICs9IGdldEhlaWdodCgkKCIjYXNpZGVBcmNoaXZlIikpOwogICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygiUmlnaHQgc2lkZSB0b3RhbCBoZWlnaHQ6ICIgKyByaWdodFNpZGVIZWlnaHQpOwogICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygiUGFnZSBoZWlnaHQ6ICIgKyBwYWdlSGVpZ2h0KTsKICAgICAgICAgICAgICAgIGlmIChyaWdodFNpZGVIZWlnaHQgPiBwYWdlSGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI3JlY29tbWVuZC1yaWdodCcpLmNzcygib3ZlcmZsb3ciLCAic2Nyb2xsIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIDE1MDApOyAqLwogICAgICAgIH0gZWxzZSBpZiAobnVtID09PSA3KSB7CiAgICAgICAgICAgICQoIi5tZV9yIilbMV0ucmVtb3ZlKCk7CiAgICAgICAgfSBlbHNlIGlmIChudW0gPT09IDgpIHsKICAgICAgICAgICAgLyogJCgiLmFydGljbGUtYmFyLXRvcCIpLmFwcGVuZCgiPGJyPiIpOwogICAgICAgICAgICAkKCIuYXJ0aWNsZS1iYXItdG9wIikuYXBwZW5kKCQoIi5hc2lkZS1ib3gtZm9vdGVyQ2xhc3NpZnkiKS5jaGlsZHJlbigiZGQiKS5odG1sKCkpOwogICAgICAgICAgICAkKCJkbCIpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJCh0aGlzKS5jaGlsZHJlbigiZHQiKTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9ICQodGhpcykuY2hpbGRyZW4oImRkIikuY2hpbGRyZW4oInNwYW4iKTsKICAgICAgICAgICAgICAgIGlmIChrZXkuaHRtbCgpLmluZGV4T2YoIuWOn+WImyIpICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAga2V5ID0gJCh0aGlzKS5jaGlsZHJlbigiZHQiKS5jaGlsZHJlbigiYSIpCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAkKHRoaXMpLmNoaWxkcmVuKCJkZCIpLmNoaWxkcmVuKCJhIikuY2hpbGRyZW4oInNwYW4iKTsKICAgICAgICAgICAgICAgICAgICBhZGRJbmZvKGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBpZiAodmFsdWUuaHRtbCgpICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGFkZEluZm8oa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gKTsKICAgICAgICAgICAgZnVuY3Rpb24gYWRkSW5mbyhrZXksIHZhbHVlKSB7CiAgICAgICAgICAgICAgICB2YXIgYmluZCA9IGtleS5odG1sKCkgKyAiJm5ic3A7IiArIHZhbHVlLmh0bWwoKSArICImbmJzcDsmbmJzcDsiOwogICAgICAgICAgICAgICAgJCgiLmFydGljbGUtYmFyLXRvcCIpLmFwcGVuZChiaW5kICsgIiAiKTsKICAgICAgICAgICAgfSAqLwogICAgICAgICAgICAkKCIuYmxvZ19jb250YWluZXJfYXNpZGUiKS5yZW1vdmUoKTsKCiAgICAgICAgICAgIC8vIOagh+mimOa2iOaBr+aPkOmGkuWOu+mZpAogICAgICAgICAgICBsZXQgdGl0bGUgPSBkb2N1bWVudC50aXRsZS5yZXBsYWNlKC9eXCguKj9cKS9nLCAiIik7CiAgICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gdGl0bGU7CiAgICAgICAgICAgIC8vIOivhOiuuuWkjeWItuaMiemSrgogICAgICAgICAgICAkKCcuY29tbWVudC1ib3gnKS5wcmVwZW5kKCc8YnV0dG9uIGNsYXNzPSJjb21tZW50LWhpZGRlbi10ZXh0IiBzdHlsZT0iZGlzcGxheTpub25lIj5DT1BZIEJVVFRPTjwvYnV0dG9uPicpOwogICAgICAgICAgICAkKCcubmV3LW9wdC1ib3gubmV3LW9wdC1ib3gtYmcnKS5wcmVwZW5kKCc8YSBjbGFzcz0iYnRuIGJ0bi1yZXBvcnQgYnRuLWNvcHkiIG9uY2xpY2s9ImphdmFzY3JpcHQ6JChcJy5jb21tZW50LWhpZGRlbi10ZXh0XCcpLmF0dHIoXCdkYXRhLWNsaXBib2FyZC10ZXh0XCcsJCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5maW5kKFwnLm5ldy1jb21tZW50XCcpLnRleHQoKSkiPuWkjeWItuivhOiuujwvYT48c3BhbiBjbGFzcz0iYnRuLWJhciI+PC9zcGFuPicpOwogICAgICAgICAgICAkKCcuYnRuLWNvcHknKS5jbGljayhmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkSlMoJy5jb21tZW50LWhpZGRlbi10ZXh0Jyk7CiAgICAgICAgICAgICAgICBjbGlwYm9hcmQub24oJ3N1Y2Nlc3MnLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdBY3Rpb246JywgZS5hY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnVGV4dDonLCBlLnRleHQpOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnVHJpZ2dlcjonLCBlLnRyaWdnZXIpOwogICAgICAgICAgICAgICAgICAgIGUuY2xlYXJTZWxlY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAkKCcuYnRuLWNvcHknKS5odG1sKCfmiJDlip8nKTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKCcuYnRuLWNvcHknKS5odG1sKCflpI3liLbor4TorronKTsKICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY2xpcGJvYXJkLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBY3Rpb246JywgZS5hY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RyaWdnZXI6JywgZS50cmlnZ2VyKTsKICAgICAgICAgICAgICAgICAgICAkKCcuYnRuLWNvcHknKS5odG1sKCflpLHotKXvvIzor7fmiYvliqjlpI3liLYnKTsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKCcuYnRuLWNvcHknKS5odG1sKCflpI3liLbor4TorronKTsKICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgJCgiLmNvbW1lbnQtaGlkZGVuLXRleHQiKS5jbGljaygpOwogICAgICAgICAgICAgICAgY2xpcGJvYXJkLmRlc3Ryb3koKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmIChudW0gPT09IDkpIHsKICAgICAgICAgICAgLy8g5Yig6ZmkQ1NETiBMT0dP5oKs5rWu5ZCO55qE5LqM57u056CBCiAgICAgICAgICAgICQoIi50b29sYmFyLXN1Yk1lbnUgPiBpbWciKS5wYXJlbnQoKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICB9LCAxMDApOwogICAgcHJvZ3Jlc3Nvci5pbmNQcm9ncmVzcygxMCk7Cn0KCmZ1bmN0aW9uIHNob3dUaXBzKCkgewoJdmFyIGNvbmZpZyA9IHsKCQljb250ZW50OiAi5qyi6L+O5L2/55SoIENTRE5HcmVlbmVy77yM57u/5YyW6K6+5a6a5oyJ6ZKu5Zyo6L+Z6YeM77yBPGJyPjxhIG9uY2xpY2s9J2phdmFzY3JpcHQ6JChcIi50cmlwc1wiKS5yZW1vdmUoKTsnPuWlveeahO+8jOS7peWQjuS4jeWGjeaPkOekuuaIkTwvYT4iLAoJCXR5cGU6ICJodG1sIiwKCQlhbGlnblRvOiBbImJvdHRvbSIsICJyaWdodCJdLAoJCXRyaWdnZXI6ICJzaG93IiwKCQlpc2Nsb3NlOiBmYWxzZSwKCQljb2xvcjogWyIjQjJFMjgxIiwgIiNCMkUyODEiXQoJfTsKCSQoIiNncmVlbmVyU2V0dGluZ3MiKS5zaG93VGlwcyhjb25maWcpOwp9CgpmdW5jdGlvbiBnZXRIZWlnaHQoZWxlbWVudCkgewogICAgbGV0IG91dGVySGVpZ2h0ID0gZWxlbWVudC5vdXRlckhlaWdodCgpOwogICAgaWYgKG91dGVySGVpZ2h0ID09PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gb3V0ZXJIZWlnaHQ7Cn0KCmZ1bmN0aW9uIGlzRmlyZWZveCgpIHsKICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSA+IDA7Cn0KCg==","requires":[{"meta":{"name":"jquery.cookie.min.js","url":"https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery-cookie/1.4.1/jquery.cookie.min.js","ts":1675445462228,"mimetype":"text/javascript"},"source":"LyohIGpxdWVyeS5jb29raWUgdjEuNC4xIHwgTUlUICovCiFmdW5jdGlvbihhKXsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImpxdWVyeSJdLGEpOiJvYmplY3QiPT10eXBlb2YgZXhwb3J0cz9hKHJlcXVpcmUoImpxdWVyeSIpKTphKGpRdWVyeSl9KGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7cmV0dXJuIGgucmF3P2E6ZW5jb2RlVVJJQ29tcG9uZW50KGEpfWZ1bmN0aW9uIGMoYSl7cmV0dXJuIGgucmF3P2E6ZGVjb2RlVVJJQ29tcG9uZW50KGEpfWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGIoaC5qc29uP0pTT04uc3RyaW5naWZ5KGEpOlN0cmluZyhhKSl9ZnVuY3Rpb24gZShhKXswPT09YS5pbmRleE9mKCciJykmJihhPWEuc2xpY2UoMSwtMSkucmVwbGFjZSgvXFwiL2csJyInKS5yZXBsYWNlKC9cXFxcL2csIlxcIikpO3RyeXtyZXR1cm4gYT1kZWNvZGVVUklDb21wb25lbnQoYS5yZXBsYWNlKGcsIiAiKSksaC5qc29uP0pTT04ucGFyc2UoYSk6YX1jYXRjaChiKXt9fWZ1bmN0aW9uIGYoYixjKXt2YXIgZD1oLnJhdz9iOmUoYik7cmV0dXJuIGEuaXNGdW5jdGlvbihjKT9jKGQpOmR9dmFyIGc9L1wrL2csaD1hLmNvb2tpZT1mdW5jdGlvbihlLGcsaSl7aWYodm9pZCAwIT09ZyYmIWEuaXNGdW5jdGlvbihnKSl7aWYoaT1hLmV4dGVuZCh7fSxoLmRlZmF1bHRzLGkpLCJudW1iZXIiPT10eXBlb2YgaS5leHBpcmVzKXt2YXIgaj1pLmV4cGlyZXMsaz1pLmV4cGlyZXM9bmV3IERhdGU7ay5zZXRUaW1lKCtrKzg2NGU1KmopfXJldHVybiBkb2N1bWVudC5jb29raWU9W2IoZSksIj0iLGQoZyksaS5leHBpcmVzPyI7IGV4cGlyZXM9IitpLmV4cGlyZXMudG9VVENTdHJpbmcoKToiIixpLnBhdGg/IjsgcGF0aD0iK2kucGF0aDoiIixpLmRvbWFpbj8iOyBkb21haW49IitpLmRvbWFpbjoiIixpLnNlY3VyZT8iOyBzZWN1cmUiOiIiXS5qb2luKCIiKX1mb3IodmFyIGw9ZT92b2lkIDA6e30sbT1kb2N1bWVudC5jb29raWU/ZG9jdW1lbnQuY29va2llLnNwbGl0KCI7ICIpOltdLG49MCxvPW0ubGVuZ3RoO28+bjtuKyspe3ZhciBwPW1bbl0uc3BsaXQoIj0iKSxxPWMocC5zaGlmdCgpKSxyPXAuam9pbigiPSIpO2lmKGUmJmU9PT1xKXtsPWYocixnKTticmVha31lfHx2b2lkIDA9PT0ocj1mKHIpKXx8KGxbcV09cil9cmV0dXJuIGx9O2guZGVmYXVsdHM9e30sYS5yZW1vdmVDb29raWU9ZnVuY3Rpb24oYixjKXtyZXR1cm4gdm9pZCAwPT09YS5jb29raWUoYik/ITE6KGEuY29va2llKGIsIiIsYS5leHRlbmQoe30sYyx7ZXhwaXJlczotMX0pKSwhYS5jb29raWUoYikpfX0pOw=="},{"meta":{"name":"nprogress.min.js","url":"https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/nprogress/0.2.0/nprogress.min.js","ts":1675445462230,"mimetype":"text/javascript"},"source":"IWZ1bmN0aW9uKG4sZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWUoKTpuLk5Qcm9ncmVzcz1lKCl9KHRoaXMsZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sZSx0KXtyZXR1cm4gZT5uP2U6bj50P3Q6bn1mdW5jdGlvbiBlKG4pe3JldHVybiAxMDAqKC0xK24pfWZ1bmN0aW9uIHQobix0LHIpe3ZhciBpO3JldHVybiBpPSJ0cmFuc2xhdGUzZCI9PT1jLnBvc2l0aW9uVXNpbmc/e3RyYW5zZm9ybToidHJhbnNsYXRlM2QoIitlKG4pKyIlLDAsMCkifToidHJhbnNsYXRlIj09PWMucG9zaXRpb25Vc2luZz97dHJhbnNmb3JtOiJ0cmFuc2xhdGUoIitlKG4pKyIlLDApIn06eyJtYXJnaW4tbGVmdCI6ZShuKSsiJSJ9LGkudHJhbnNpdGlvbj0iYWxsICIrdCsibXMgIityLGl9ZnVuY3Rpb24gcihuLGUpe3ZhciB0PSJzdHJpbmciPT10eXBlb2Ygbj9uOm8obik7cmV0dXJuIHQuaW5kZXhPZigiICIrZSsiICIpPj0wfWZ1bmN0aW9uIGkobixlKXt2YXIgdD1vKG4pLGk9dCtlO3IodCxlKXx8KG4uY2xhc3NOYW1lPWkuc3Vic3RyaW5nKDEpKX1mdW5jdGlvbiBzKG4sZSl7dmFyIHQsaT1vKG4pO3IobixlKSYmKHQ9aS5yZXBsYWNlKCIgIitlKyIgIiwiICIpLG4uY2xhc3NOYW1lPXQuc3Vic3RyaW5nKDEsdC5sZW5ndGgtMSkpfWZ1bmN0aW9uIG8obil7cmV0dXJuKCIgIisobi5jbGFzc05hbWV8fCIiKSsiICIpLnJlcGxhY2UoL1xzKy9naSwiICIpfWZ1bmN0aW9uIGEobil7biYmbi5wYXJlbnROb2RlJiZuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobil9dmFyIHU9e307dS52ZXJzaW9uPSIwLjIuMCI7dmFyIGM9dS5zZXR0aW5ncz17bWluaW11bTouMDgsZWFzaW5nOiJlYXNlIixwb3NpdGlvblVzaW5nOiIiLHNwZWVkOjIwMCx0cmlja2xlOiEwLHRyaWNrbGVSYXRlOi4wMix0cmlja2xlU3BlZWQ6ODAwLHNob3dTcGlubmVyOiEwLGJhclNlbGVjdG9yOidbcm9sZT0iYmFyIl0nLHNwaW5uZXJTZWxlY3RvcjonW3JvbGU9InNwaW5uZXIiXScscGFyZW50OiJib2R5Iix0ZW1wbGF0ZTonPGRpdiBjbGFzcz0iYmFyIiByb2xlPSJiYXIiPjxkaXYgY2xhc3M9InBlZyI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ic3Bpbm5lciIgcm9sZT0ic3Bpbm5lciI+PGRpdiBjbGFzcz0ic3Bpbm5lci1pY29uIj48L2Rpdj48L2Rpdj4nfTt1LmNvbmZpZ3VyZT1mdW5jdGlvbihuKXt2YXIgZSx0O2ZvcihlIGluIG4pdD1uW2VdLHZvaWQgMCE9PXQmJm4uaGFzT3duUHJvcGVydHkoZSkmJihjW2VdPXQpO3JldHVybiB0aGlzfSx1LnN0YXR1cz1udWxsLHUuc2V0PWZ1bmN0aW9uKGUpe3ZhciByPXUuaXNTdGFydGVkKCk7ZT1uKGUsYy5taW5pbXVtLDEpLHUuc3RhdHVzPTE9PT1lP251bGw6ZTt2YXIgaT11LnJlbmRlcighcikscz1pLnF1ZXJ5U2VsZWN0b3IoYy5iYXJTZWxlY3Rvciksbz1jLnNwZWVkLGE9Yy5lYXNpbmc7cmV0dXJuIGkub2Zmc2V0V2lkdGgsbChmdW5jdGlvbihuKXsiIj09PWMucG9zaXRpb25Vc2luZyYmKGMucG9zaXRpb25Vc2luZz11LmdldFBvc2l0aW9uaW5nQ1NTKCkpLGYocyx0KGUsbyxhKSksMT09PWU/KGYoaSx7dHJhbnNpdGlvbjoibm9uZSIsb3BhY2l0eToxfSksaS5vZmZzZXRXaWR0aCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZihpLHt0cmFuc2l0aW9uOiJhbGwgIitvKyJtcyBsaW5lYXIiLG9wYWNpdHk6MH0pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt1LnJlbW92ZSgpLG4oKX0sbyl9LG8pKTpzZXRUaW1lb3V0KG4sbyl9KSx0aGlzfSx1LmlzU3RhcnRlZD1mdW5jdGlvbigpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdS5zdGF0dXN9LHUuc3RhcnQ9ZnVuY3Rpb24oKXt1LnN0YXR1c3x8dS5zZXQoMCk7dmFyIG49ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dS5zdGF0dXMmJih1LnRyaWNrbGUoKSxuKCkpfSxjLnRyaWNrbGVTcGVlZCl9O3JldHVybiBjLnRyaWNrbGUmJm4oKSx0aGlzfSx1LmRvbmU9ZnVuY3Rpb24obil7cmV0dXJuIG58fHUuc3RhdHVzP3UuaW5jKC4zKy41Kk1hdGgucmFuZG9tKCkpLnNldCgxKTp0aGlzfSx1LmluYz1mdW5jdGlvbihlKXt2YXIgdD11LnN0YXR1cztyZXR1cm4gdD8oIm51bWJlciIhPXR5cGVvZiBlJiYoZT0oMS10KSpuKE1hdGgucmFuZG9tKCkqdCwuMSwuOTUpKSx0PW4odCtlLDAsLjk5NCksdS5zZXQodCkpOnUuc3RhcnQoKX0sdS50cmlja2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHUuaW5jKE1hdGgucmFuZG9tKCkqYy50cmlja2xlUmF0ZSl9LGZ1bmN0aW9uKCl7dmFyIG49MCxlPTA7dS5wcm9taXNlPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYicmVzb2x2ZWQiIT09dC5zdGF0ZSgpPygwPT09ZSYmdS5zdGFydCgpLG4rKyxlKyssdC5hbHdheXMoZnVuY3Rpb24oKXtlLS0sMD09PWU/KG49MCx1LmRvbmUoKSk6dS5zZXQoKG4tZSkvbil9KSx0aGlzKTp0aGlzfX0oKSx1LnJlbmRlcj1mdW5jdGlvbihuKXtpZih1LmlzUmVuZGVyZWQoKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5wcm9ncmVzcyIpO2koZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCJucHJvZ3Jlc3MtYnVzeSIpO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuaWQ9Im5wcm9ncmVzcyIsdC5pbm5lckhUTUw9Yy50ZW1wbGF0ZTt2YXIgcixzPXQucXVlcnlTZWxlY3RvcihjLmJhclNlbGVjdG9yKSxvPW4/Ii0xMDAiOmUodS5zdGF0dXN8fDApLGw9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihjLnBhcmVudCk7cmV0dXJuIGYocyx7dHJhbnNpdGlvbjoiYWxsIDAgbGluZWFyIix0cmFuc2Zvcm06InRyYW5zbGF0ZTNkKCIrbysiJSwwLDApIn0pLGMuc2hvd1NwaW5uZXJ8fChyPXQucXVlcnlTZWxlY3RvcihjLnNwaW5uZXJTZWxlY3RvciksciYmYShyKSksbCE9ZG9jdW1lbnQuYm9keSYmaShsLCJucHJvZ3Jlc3MtY3VzdG9tLXBhcmVudCIpLGwuYXBwZW5kQ2hpbGQodCksdH0sdS5yZW1vdmU9ZnVuY3Rpb24oKXtzKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwibnByb2dyZXNzLWJ1c3kiKSxzKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYy5wYXJlbnQpLCJucHJvZ3Jlc3MtY3VzdG9tLXBhcmVudCIpO3ZhciBuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJucHJvZ3Jlc3MiKTtuJiZhKG4pfSx1LmlzUmVuZGVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJucHJvZ3Jlc3MiKX0sdS5nZXRQb3NpdGlvbmluZ0NTUz1mdW5jdGlvbigpe3ZhciBuPWRvY3VtZW50LmJvZHkuc3R5bGUsZT0iV2Via2l0VHJhbnNmb3JtImluIG4/IldlYmtpdCI6Ik1velRyYW5zZm9ybSJpbiBuPyJNb3oiOiJtc1RyYW5zZm9ybSJpbiBuPyJtcyI6Ik9UcmFuc2Zvcm0iaW4gbj8iTyI6IiI7cmV0dXJuIGUrIlBlcnNwZWN0aXZlImluIG4/InRyYW5zbGF0ZTNkIjplKyJUcmFuc2Zvcm0iaW4gbj8idHJhbnNsYXRlIjoibWFyZ2luIn07dmFyIGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIHQ9ZS5zaGlmdCgpO3QmJnQobil9dmFyIGU9W107cmV0dXJuIGZ1bmN0aW9uKHQpe2UucHVzaCh0KSwxPT1lLmxlbmd0aCYmbigpfX0oKSxmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbi5yZXBsYWNlKC9eLW1zLS8sIm1zLSIpLnJlcGxhY2UoLy0oW1xkYS16XSkvZ2ksZnVuY3Rpb24obixlKXtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpfSl9ZnVuY3Rpb24gZShuKXt2YXIgZT1kb2N1bWVudC5ib2R5LnN0eWxlO2lmKG4gaW4gZSlyZXR1cm4gbjtmb3IodmFyIHQscj1pLmxlbmd0aCxzPW4uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrbi5zbGljZSgxKTtyLS07KWlmKHQ9aVtyXStzLHQgaW4gZSlyZXR1cm4gdDtyZXR1cm4gbn1mdW5jdGlvbiB0KHQpe3JldHVybiB0PW4odCksc1t0XXx8KHNbdF09ZSh0KSl9ZnVuY3Rpb24gcihuLGUscil7ZT10KGUpLG4uc3R5bGVbZV09cn12YXIgaT1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdLHM9e307cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHQsaSxzPWFyZ3VtZW50cztpZigyPT1zLmxlbmd0aClmb3IodCBpbiBlKWk9ZVt0XSx2b2lkIDAhPT1pJiZlLmhhc093blByb3BlcnR5KHQpJiZyKG4sdCxpKTtlbHNlIHIobixzWzFdLHNbMl0pfX0oKTtyZXR1cm4gdX0pOw=="},{"meta":{"name":"clipboard.min.js","url":"https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/clipboard.js/2.0.10/clipboard.min.js","ts":1675445462229,"mimetype":"text/javascript"},"source":"LyohCiAqIGNsaXBib2FyZC5qcyB2Mi4wLjEwCiAqIGh0dHBzOi8vY2xpcGJvYXJkanMuY29tLwogKgogKiBMaWNlbnNlZCBNSVQgwqkgWmVubyBSb2NoYQogKi8KIWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuQ2xpcGJvYXJkSlM9ZSgpOnQuQ2xpcGJvYXJkSlM9ZSgpfSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIG49ezY4NjpmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uZChlLHtkZWZhdWx0OmZ1bmN0aW9uKCl7cmV0dXJuIG99fSk7dmFyIGU9bigyNzkpLGk9bi5uKGUpLGU9bigzNzApLHU9bi5uKGUpLGU9big4MTcpLGM9bi5uKGUpO2Z1bmN0aW9uIGEodCl7dHJ5e3JldHVybiBkb2N1bWVudC5leGVjQ29tbWFuZCh0KX1jYXRjaCh0KXtyZXR1cm59fXZhciBmPWZ1bmN0aW9uKHQpe3Q9YygpKHQpO3JldHVybiBhKCJjdXQiKSx0fTt2YXIgbD1mdW5jdGlvbih0KXt2YXIgZSxuLG8scj0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e2NvbnRhaW5lcjpkb2N1bWVudC5ib2R5fSxpPSIiO3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8oZT10LG49InJ0bCI9PT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkaXIiKSwobz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpKS5zdHlsZS5mb250U2l6ZT0iMTJwdCIsby5zdHlsZS5ib3JkZXI9IjAiLG8uc3R5bGUucGFkZGluZz0iMCIsby5zdHlsZS5tYXJnaW49IjAiLG8uc3R5bGUucG9zaXRpb249ImFic29sdXRlIixvLnN0eWxlW24/InJpZ2h0IjoibGVmdCJdPSItOTk5OXB4IixuPXdpbmRvdy5wYWdlWU9mZnNldHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCxvLnN0eWxlLnRvcD0iIi5jb25jYXQobiwicHgiKSxvLnNldEF0dHJpYnV0ZSgicmVhZG9ubHkiLCIiKSxvLnZhbHVlPWUsbz1vLHIuY29udGFpbmVyLmFwcGVuZENoaWxkKG8pLGk9YygpKG8pLGEoImNvcHkiKSxvLnJlbW92ZSgpKTooaT1jKCkodCksYSgiY29weSIpKSxpfTtmdW5jdGlvbiByKHQpe3JldHVybihyPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSkodCl9dmFyIHM9ZnVuY3Rpb24oKXt2YXIgdD0wPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sZT10LmFjdGlvbixuPXZvaWQgMD09PWU/ImNvcHkiOmUsbz10LmNvbnRhaW5lcixlPXQudGFyZ2V0LHQ9dC50ZXh0O2lmKCJjb3B5IiE9PW4mJiJjdXQiIT09bil0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgImFjdGlvbiIgdmFsdWUsIHVzZSBlaXRoZXIgImNvcHkiIG9yICJjdXQiJyk7aWYodm9pZCAwIT09ZSl7aWYoIWV8fCJvYmplY3QiIT09cihlKXx8MSE9PWUubm9kZVR5cGUpdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkICJ0YXJnZXQiIHZhbHVlLCB1c2UgYSB2YWxpZCBFbGVtZW50Jyk7aWYoImNvcHkiPT09biYmZS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkICJ0YXJnZXQiIGF0dHJpYnV0ZS4gUGxlYXNlIHVzZSAicmVhZG9ubHkiIGluc3RlYWQgb2YgImRpc2FibGVkIiBhdHRyaWJ1dGUnKTtpZigiY3V0Ij09PW4mJihlLmhhc0F0dHJpYnV0ZSgicmVhZG9ubHkiKXx8ZS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpKXRocm93IG5ldyBFcnJvcignSW52YWxpZCAidGFyZ2V0IiBhdHRyaWJ1dGUuIFlvdSBjYW5cJ3QgY3V0IHRleHQgZnJvbSBlbGVtZW50cyB3aXRoICJyZWFkb25seSIgb3IgImRpc2FibGVkIiBhdHRyaWJ1dGVzJyl9cmV0dXJuIHQ/bCh0LHtjb250YWluZXI6b30pOmU/ImN1dCI9PT1uP2YoZSk6bChlLHtjb250YWluZXI6b30pOnZvaWQgMH07ZnVuY3Rpb24gcCh0KXtyZXR1cm4ocD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIGQodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8ua2V5LG8pfX1mdW5jdGlvbiB5KHQsZSl7cmV0dXJuKHk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIGgobil7dmFyIG89ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFSZWZsZWN0LmNvbnN0cnVjdClyZXR1cm4hMTtpZihSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSxbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQsZT1tKG4pO3JldHVybiB0PW8/KHQ9bSh0aGlzKS5jb25zdHJ1Y3RvcixSZWZsZWN0LmNvbnN0cnVjdChlLGFyZ3VtZW50cyx0KSk6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10aGlzLCEodD10KXx8Im9iamVjdCIhPT1wKHQpJiYiZnVuY3Rpb24iIT10eXBlb2YgdD9mdW5jdGlvbih0KXtpZih2b2lkIDAhPT10KXJldHVybiB0O3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIil9KGUpOnR9fWZ1bmN0aW9uIG0odCl7cmV0dXJuKG09T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KX0pKHQpfWZ1bmN0aW9uIHYodCxlKXt0PSJkYXRhLWNsaXBib2FyZC0iLmNvbmNhdCh0KTtpZihlLmhhc0F0dHJpYnV0ZSh0KSlyZXR1cm4gZS5nZXRBdHRyaWJ1dGUodCl9dmFyIG89ZnVuY3Rpb24oKXshZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmeSh0LGUpfShyLGkoKSk7dmFyIHQsZSxuLG89aChyKTtmdW5jdGlvbiByKHQsZSl7dmFyIG47cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzKSwobj1vLmNhbGwodGhpcykpLnJlc29sdmVPcHRpb25zKGUpLG4ubGlzdGVuQ2xpY2sodCksbn1yZXR1cm4gdD1yLG49W3trZXk6ImNvcHkiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7Y29udGFpbmVyOmRvY3VtZW50LmJvZHl9O3JldHVybiBsKHQsZSl9fSx7a2V5OiJjdXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBmKHQpfX0se2tleToiaXNTdXBwb3J0ZWQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOlsiY29weSIsImN1dCJdLHQ9InN0cmluZyI9PXR5cGVvZiB0P1t0XTp0LGU9ISFkb2N1bWVudC5xdWVyeUNvbW1hbmRTdXBwb3J0ZWQ7cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtlPWUmJiEhZG9jdW1lbnQucXVlcnlDb21tYW5kU3VwcG9ydGVkKHQpfSksZX19XSwoZT1be2tleToicmVzb2x2ZU9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3RoaXMuYWN0aW9uPSJmdW5jdGlvbiI9PXR5cGVvZiB0LmFjdGlvbj90LmFjdGlvbjp0aGlzLmRlZmF1bHRBY3Rpb24sdGhpcy50YXJnZXQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQudGFyZ2V0P3QudGFyZ2V0OnRoaXMuZGVmYXVsdFRhcmdldCx0aGlzLnRleHQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQudGV4dD90LnRleHQ6dGhpcy5kZWZhdWx0VGV4dCx0aGlzLmNvbnRhaW5lcj0ib2JqZWN0Ij09PXAodC5jb250YWluZXIpP3QuY29udGFpbmVyOmRvY3VtZW50LmJvZHl9fSx7a2V5OiJsaXN0ZW5DbGljayIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLmxpc3RlbmVyPXUoKSh0LCJjbGljayIsZnVuY3Rpb24odCl7cmV0dXJuIGUub25DbGljayh0KX0pfX0se2tleToib25DbGljayIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dC5kZWxlZ2F0ZVRhcmdldHx8dC5jdXJyZW50VGFyZ2V0LG49dGhpcy5hY3Rpb24oZSl8fCJjb3B5Iix0PXMoe2FjdGlvbjpuLGNvbnRhaW5lcjp0aGlzLmNvbnRhaW5lcix0YXJnZXQ6dGhpcy50YXJnZXQoZSksdGV4dDp0aGlzLnRleHQoZSl9KTt0aGlzLmVtaXQodD8ic3VjY2VzcyI6ImVycm9yIix7YWN0aW9uOm4sdGV4dDp0LHRyaWdnZXI6ZSxjbGVhclNlbGVjdGlvbjpmdW5jdGlvbigpe2UmJmUuZm9jdXMoKSxkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKSx3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCl9fSl9fSx7a2V5OiJkZWZhdWx0QWN0aW9uIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdigiYWN0aW9uIix0KX19LHtrZXk6ImRlZmF1bHRUYXJnZXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3Q9digidGFyZ2V0Iix0KTtpZih0KXJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpfX0se2tleToiZGVmYXVsdFRleHQiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB2KCJ0ZXh0Iix0KX19LHtrZXk6ImRlc3Ryb3kiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5saXN0ZW5lci5kZXN0cm95KCl9fV0pJiZkKHQucHJvdG90eXBlLGUpLG4mJmQodCxuKSxyfSgpfSw4Mjg6ZnVuY3Rpb24odCl7dmFyIGU7InVuZGVmaW5lZCI9PXR5cGVvZiBFbGVtZW50fHxFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzfHwoKGU9RWxlbWVudC5wcm90b3R5cGUpLm1hdGNoZXM9ZS5tYXRjaGVzU2VsZWN0b3J8fGUubW96TWF0Y2hlc1NlbGVjdG9yfHxlLm1zTWF0Y2hlc1NlbGVjdG9yfHxlLm9NYXRjaGVzU2VsZWN0b3J8fGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yKSx0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IoO3QmJjkhPT10Lm5vZGVUeXBlOyl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQubWF0Y2hlcyYmdC5tYXRjaGVzKGUpKXJldHVybiB0O3Q9dC5wYXJlbnROb2RlfX19LDQzODpmdW5jdGlvbih0LGUsbil7dmFyIHU9big4MjgpO2Z1bmN0aW9uIGkodCxlLG4sbyxyKXt2YXIgaT1mdW5jdGlvbihlLG4sdCxvKXtyZXR1cm4gZnVuY3Rpb24odCl7dC5kZWxlZ2F0ZVRhcmdldD11KHQudGFyZ2V0LG4pLHQuZGVsZWdhdGVUYXJnZXQmJm8uY2FsbChlLHQpfX0uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIobixpLHIpLHtkZXN0cm95OmZ1bmN0aW9uKCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKG4saSxyKX19fXQuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixvLHIpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LmFkZEV2ZW50TGlzdGVuZXI/aS5hcHBseShudWxsLGFyZ3VtZW50cyk6ImZ1bmN0aW9uIj09dHlwZW9mIG4/aS5iaW5kKG51bGwsZG9jdW1lbnQpLmFwcGx5KG51bGwsYXJndW1lbnRzKTooInN0cmluZyI9PXR5cGVvZiB0JiYodD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpKSxBcnJheS5wcm90b3R5cGUubWFwLmNhbGwodCxmdW5jdGlvbih0KXtyZXR1cm4gaSh0LGUsbixvLHIpfSkpfX0sODc5OmZ1bmN0aW9uKHQsbil7bi5ub2RlPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10JiZ0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJjE9PT10Lm5vZGVUeXBlfSxuLm5vZGVMaXN0PWZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KTtyZXR1cm4gdm9pZCAwIT09dCYmKCJbb2JqZWN0IE5vZGVMaXN0XSI9PT1lfHwiW29iamVjdCBIVE1MQ29sbGVjdGlvbl0iPT09ZSkmJiJsZW5ndGgiaW4gdCYmKDA9PT10Lmxlbmd0aHx8bi5ub2RlKHRbMF0pKX0sbi5zdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHx0IGluc3RhbmNlb2YgU3RyaW5nfSxuLmZuPWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9fSwzNzA6ZnVuY3Rpb24odCxlLG4pe3ZhciBmPW4oODc5KSxsPW4oNDM4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2lmKCF0JiYhZSYmIW4pdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50cyIpO2lmKCFmLnN0cmluZyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIFN0cmluZyIpO2lmKCFmLmZuKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoaXJkIGFyZ3VtZW50IG11c3QgYmUgYSBGdW5jdGlvbiIpO2lmKGYubm9kZSh0KSlyZXR1cm4gYz1lLGE9biwodT10KS5hZGRFdmVudExpc3RlbmVyKGMsYSkse2Rlc3Ryb3k6ZnVuY3Rpb24oKXt1LnJlbW92ZUV2ZW50TGlzdGVuZXIoYyxhKX19O2lmKGYubm9kZUxpc3QodCkpcmV0dXJuIG89dCxyPWUsaT1uLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwobyxmdW5jdGlvbih0KXt0LmFkZEV2ZW50TGlzdGVuZXIocixpKX0pLHtkZXN0cm95OmZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChvLGZ1bmN0aW9uKHQpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihyLGkpfSl9fTtpZihmLnN0cmluZyh0KSlyZXR1cm4gdD10LGU9ZSxuPW4sbChkb2N1bWVudC5ib2R5LHQsZSxuKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgU3RyaW5nLCBIVE1MRWxlbWVudCwgSFRNTENvbGxlY3Rpb24sIG9yIE5vZGVMaXN0Iik7dmFyIG8scixpLHUsYyxhfX0sODE3OmZ1bmN0aW9uKHQpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxuPSJTRUxFQ1QiPT09dC5ub2RlTmFtZT8odC5mb2N1cygpLHQudmFsdWUpOiJJTlBVVCI9PT10Lm5vZGVOYW1lfHwiVEVYVEFSRUEiPT09dC5ub2RlTmFtZT8oKGU9dC5oYXNBdHRyaWJ1dGUoInJlYWRvbmx5IikpfHx0LnNldEF0dHJpYnV0ZSgicmVhZG9ubHkiLCIiKSx0LnNlbGVjdCgpLHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCx0LnZhbHVlLmxlbmd0aCksZXx8dC5yZW1vdmVBdHRyaWJ1dGUoInJlYWRvbmx5IiksdC52YWx1ZSk6KHQuaGFzQXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiKSYmdC5mb2N1cygpLG49d2luZG93LmdldFNlbGVjdGlvbigpLChlPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCkpLnNlbGVjdE5vZGVDb250ZW50cyh0KSxuLnJlbW92ZUFsbFJhbmdlcygpLG4uYWRkUmFuZ2UoZSksbi50b1N0cmluZygpKTtyZXR1cm4gbn19LDI3OTpmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7fWUucHJvdG90eXBlPXtvbjpmdW5jdGlvbih0LGUsbil7dmFyIG89dGhpcy5lfHwodGhpcy5lPXt9KTtyZXR1cm4ob1t0XXx8KG9bdF09W10pKS5wdXNoKHtmbjplLGN0eDpufSksdGhpc30sb25jZTpmdW5jdGlvbih0LGUsbil7dmFyIG89dGhpcztmdW5jdGlvbiByKCl7by5vZmYodCxyKSxlLmFwcGx5KG4sYXJndW1lbnRzKX1yZXR1cm4gci5fPWUsdGhpcy5vbih0LHIsbil9LGVtaXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLG49KCh0aGlzLmV8fCh0aGlzLmU9e30pKVt0XXx8W10pLnNsaWNlKCksbz0wLHI9bi5sZW5ndGg7bzxyO28rKyluW29dLmZuLmFwcGx5KG5bb10uY3R4LGUpO3JldHVybiB0aGlzfSxvZmY6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmV8fCh0aGlzLmU9e30pLG89blt0XSxyPVtdO2lmKG8mJmUpZm9yKHZhciBpPTAsdT1vLmxlbmd0aDtpPHU7aSsrKW9baV0uZm4hPT1lJiZvW2ldLmZuLl8hPT1lJiZyLnB1c2gob1tpXSk7cmV0dXJuIHIubGVuZ3RoP25bdF09cjpkZWxldGUgblt0XSx0aGlzfX0sdC5leHBvcnRzPWUsdC5leHBvcnRzLlRpbnlFbWl0dGVyPWV9fSxyPXt9LG8ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gby5kKGUse2E6ZX0pLGV9LG8uZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKW8ubyhlLG4pJiYhby5vKHQsbikmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4se2VudW1lcmFibGU6ITAsZ2V0OmVbbl19KX0sby5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxvKDY4NikuZGVmYXVsdDtmdW5jdGlvbiBvKHQpe2lmKHJbdF0pcmV0dXJuIHJbdF0uZXhwb3J0czt2YXIgZT1yW3RdPXtleHBvcnRzOnt9fTtyZXR1cm4gblt0XShlLGUuZXhwb3J0cyxvKSxlLmV4cG9ydHN9dmFyIG4scn0pOw=="}]},{"name":"Pixiv Plus","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_prototypes":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["i.pximg.net","i-f.pximg.net","i-cf.pximg.net"],"orig_excludes":[],"orig_includes":["http*://www.pixiv.net*"],"orig_matches":["http://www.pixiv.net/"],"orig_noframes":true,"orig_run_at":"document-end","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"tab_types":null},"storage":{"ts":1644145116838,"data":{}},"enabled":true,"position":15,"file_url":"https://greasyfork.org/scripts/34153-pixiv-plus/code/Pixiv%20Plus.user.js","uuid":"967b8695-714b-41d1-abdb-5fee3df2e030","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFBpeGl2IFBsdXMKLy8gQG5hbWU6emgtQ04gIFBpeGl2IOWinuW8ugovLyBAbmFtZTp6aC1UVyAgUGl4aXYg5aKe5by3Ci8vIEBuYW1lc3BhY2UgICBodHRwczovL2dpdGh1Yi5jb20vQWhhb2NoYW4vVGFtcGVybW9ua2V5Ci8vIEB2ZXJzaW9uICAgICAwLjguMwovLyBAaWNvbiAgICAgICAgaHR0cDovL3d3dy5waXhpdi5uZXQvZmF2aWNvbi5pY28KLy8gQGRlc2NyaXB0aW9uIEZvY3VzIG9uIGltbWVyc2l2ZSBleHBlcmllbmNlLCAxLiBCbG9jayBhZHMsIGRpcmVjdGx5IGFjY2VzcyBwb3B1bGFyIHBpY3R1cmVzIDIuIFVzZSB1c2VyIHRvIGVudGVyIHRoZSB3YXkgdG8gc2VhcmNoIDMuIFNlYXJjaCBwaWQgYW5kIHVpZCA0LiBEaXNwbGF5IG9yaWdpbmFsIGltYWdlIGFuZCBzaXplLCBwaWN0dXJlIHJlbmFtZSwgZG93bmxvYWQgb3JpZ2luYWwgaW1hZ2UgfCBnaWYgbWFwIHwgWmlwfG11bHRpcGxlIG1hcCB6aXAgNS4gZGlzcGxheSBhcnRpc3QgaWQsIGFydGlzdCBiYWNrZ3JvdW5kIGltYWdlIDYuIGF1dG8gbG9hZCBjb21tZW50IDcuIGR5bmFtaWMgbWFya3VwIHdvcmsgdHlwZSA4LiByZW1vdmUgcmVkaXJlY3Rpb24gOS4gc2luZ2xlIHBhZ2Ugc29ydCAxMC4gY29udHJvbCBwYW5lbCBzZWxlY3QgZGVzaXJlZCBmdW5jdGlvbiBnaXRodWI6IGh0dHBzOi8gL2dpdGh1Yi5jb20vQWhhb2NoYW4vVGFtcGVybW9ua2V5LCB3ZWxjb21lIHRvIHN0YXIgYW5kIGZvcmsuCi8vIEBkZXNjcmlwdGlvbjpqYSAgICDmsqHlhaXlnovkvZPpqJPjgavnhKbngrnjgpLlvZPjgabjgovjgIExLuS6uuawl+OBruWGmeecn+OBq+ebtOaOpeOCouOCr+OCu+OCueOBmeOCi+W6g+WRiuOCkuODluODreODg+OCr+OBmeOCizIu5qSc57Si44GZ44KL5pa55rOV44KS5YWl5Yqb44GZ44KL44Gf44KB44Gr44Om44O844K244O844KS5L2/55So44GZ44KLMy7mpJzntKJwaWTjgah1aWQgNC7lhYPjga7nlLvlg4/jgajjgrXjgqTjgrrjgpLooajnpLrjgZnjgosgWmlwIHwgbXVsdGlwbGUgbWFwIHppcCA1LuOCouODvOODhuOCo+OCueODiElE44CB44Ki44O844OG44Kj44K544OI44Gu6IOM5pmv55S75YOP44KS6KGo56S644GX44G+44GZ44CCNi7oh6rli5Xjg63jg7zjg4njgrPjg6Hjg7Pjg4jjgpLov73liqDjgZfjgb7jgZnjgII3LuWLleeahOODnuODvOOCr+OCouODg+ODl+S9nOalreOCv+OCpOODl+OCkuaMh+WumuOBl+OBvuOBmeOAgjgu44Oq44OA44Kk44Os44Kv44OI44KS5YmK6Zmk44GX44G+44GZ44CCOS7jgrfjg7PjgrDjg6vjg5rjg7zjgrjjgr3jg7zjg4gxMC7jgrPjg7Pjg4jjg63jg7zjg6vjg5Hjg43jg6vjgpLpgbjmip7jgZfjgb7jgZnjgIJnaXRodWLvvJpodHRwc++8mi8gL2dpdGh1Yi5jb20vQWhhb2NoYW4vVGFtcGVybW9ua2V544CB44K544K/44O844Go44OV44Kp44O844Kv44G444KI44GG44GT44Gd44CCCi8vIEBkZXNjcmlwdGlvbjp6aC1DTiDkuJPms6jmsonmtbjlvI/kvZPpqozvvIwxLuWxj+iUveW5v+WRiiznm7TmjqXorr/pl67ng63pl6jlm77niYcgMi7kvb/nlKh1c2Vyc+WFpeOCiueahOaWueW8j+aQnOe0oiAzLuaQnOe0onBpZOWSjHVpZCA0LuaYvuekuuWOn+WbvuWPiuWwuuWvuO+8jOWbvueJh+mHjeWRveWQje+8jOS4i+i9veWOn+WbvnxnaWblm7585Yqo5Zu+5binemlwfOWkmuWbvnppcCA1LuaYvuekuueUu+W4iGlk44CB55S75biI6IOM5pmv5Zu+IDYu6Ieq5Yqo5Yqg6L296K+E6K66IDcu5a+55Yqo5oCB5qCH6K6w5L2c5ZOB57G75Z6LIDgu5Y676Zmk6YeN5a6a5ZCRIDku5Y2V6aG15o6S5bqPIDEwLuaOp+WItumdouadv+mAieaLqeaDs+imgeeahOWKn+iDvSBnaXRodWI6aHR0cHM6Ly9naXRodWIuY29tL0FoYW9jaGFuL1RhbXBlcm1vbmtlee+8jOasoui/jnN0YXLlkoxmb3Jr44CCCi8vIEBkZXNjcmlwdGlvbjp6aC1UVyDlsIjms6jmsonmtbjlvI/pq5TpqZfvvIwxLuWxj+iUveW7o+WRiiznm7TmjqXoqKrllY/nhrHploDlnJbniYcyLuS9v+eUqHVzZXJz5YWl44KK55qE5pa55byP5pCc57SiMy7mkJzntKJwaWTlkox1aWQgNC7poa/npLrljp/lnJblj4rlsLrlr7jvvIzlnJbniYfph43lkb3lkI3vvIzkuIvovInljp/lnJZ8Z2lm5ZyWfOWLleWcluW5gHppcHzlpJrlnJZ6aXAgNS7poa/npLrnlavluKtpZOOAgeeVq+W4q+iDjOaZr+WcljYu6Ieq5YuV5Yqg6LyJ6KmV6KuWNy7lsI3li5XmhYvmqJnoqJjkvZzlk4HpoZ7lnos4LuWOu+mZpOmHjeWumuWQkTku5Zau6aCB5o6S5bqPMTAu5o6n5Yi26Z2i5p2/6YG45pOH5oOz6KaB55qE5Yqf6IO9Z2l0aHViOmh0dHBzOi8gL2dpdGh1Yi5jb20vQWhhb2NoYW4vVGFtcGVybW9ua2V577yM5q2h6L+Oc3RhcuWSjGZvcmvjgIIKLy8gQGF1dGhvciAgICAgIEFoYW9jaGFuCi8vIEBpbmNsdWRlICAgICBodHRwKjovL3d3dy5waXhpdi5uZXQqCi8vIEBtYXRjaCAgICAgICBodHRwOi8vd3d3LnBpeGl2Lm5ldC8KLy8gQGNvbm5lY3QgICAgIGkucHhpbWcubmV0Ci8vIEBjb25uZWN0ICAgICBpLWYucHhpbWcubmV0Ci8vIEBjb25uZWN0ICAgICBpLWNmLnB4aW1nLm5ldAovLyBAbGljZW5zZSAgICAgR1BMLTMuMAovLyBAc3VwcG9ydFVSTCAgaHR0cHM6Ly9naXRodWIuY29tL0FoYW9jaGFuL1RhbXBlcm1vbmtleQovLyBAZ3JhbnQgICAgICAgdW5zYWZlV2luZG93Ci8vIEBncmFudCAgICAgICBHTS54bWxIdHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgR00uc2V0Q2xpcGJvYXJkCi8vIEBncmFudCAgICAgICBHTS5zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgR00uZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgIEdNX2FkZFN0eWxlCi8vIEBncmFudCAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgR01fc2V0Q2xpcGJvYXJkCi8vIEBncmFudCAgICAgICBHTV9zZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgR01fZ2V0VmFsdWUKLy8gQHJlcXVpcmUgICAgIGh0dHBzOi8vY2RuLmJvb3RjZG4ubmV0L2FqYXgvbGlicy9qcXVlcnkvMi4yLjQvanF1ZXJ5Lm1pbi5qcwovLyBAcmVxdWlyZSAgICAgaHR0cHM6Ly9jZG4uYm9vdGNzcy5jb20vanN6aXAvMy4xLjQvanN6aXAubWluLmpzCi8vIEByZXF1aXJlICAgICBodHRwczovL2Nkbi5ib290Y3NzLmNvbS9GaWxlU2F2ZXIuanMvMS4zLjIvRmlsZVNhdmVyLm1pbi5qcwovLyBAcmVxdWlyZSAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzI5NjMtZ2lmLWpzL2NvZGUvZ2lmanMuanM/dmVyc2lvbj04NTk2Ci8vIEByZXF1aXJlICAgICBodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMzc1MzU5LWdtNC1wb2x5ZmlsbC0xLTAtMS9jb2RlL2dtNC1wb2x5ZmlsbC0xMDEuanM/dmVyc2lvbj02NTIyMzgKLy8gQHJ1bi1hdCAgICAgIGRvY3VtZW50LWVuZAovLyBAbm9mcmFtZXMKLy8gPT0vVXNlclNjcmlwdD09CmpRdWVyeShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgLy8g5Yqg6L295L6d6LWWCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IGpRdWVyeeaPkuS7tiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICQuZm4uZXh0ZW5kKHsKICAgICAgICBmaXRXaW5kb3c6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5jc3MoJ3dpZHRoJywgJ2F1dG8nKS5jc3MoJ2hlaWdodCcsICdhdXRvJykKICAgICAgICAgICAgICAgIC5jc3MoJ21heC13aWR0aCcsICcnKS5jc3MoJ21heC1oZWlnaHQnLCAkKHdpbmRvdykuaGVpZ2h0KCkpOwogICAgICAgIH0sCiAgICAgICAgcmVwbGFjZVRhZ05hbWU6IGZ1bmN0aW9uIChyZXBsYWNlV2l0aCkgewogICAgICAgICAgICB2YXIgdGFncyA9IFtdLAogICAgICAgICAgICAgICAgaSA9IHRoaXMubGVuZ3RoOwogICAgICAgICAgICB3aGlsZSAoaS0tKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocmVwbGFjZVdpdGgpLAogICAgICAgICAgICAgICAgICAgIHRoaXNpID0gdGhpc1tpXSwKICAgICAgICAgICAgICAgICAgICB0aGlzaWEgPSB0aGlzaS5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IHRoaXNpYS5sZW5ndGggLSAxOyBhID49IDA7IGEtLSkgewogICAgICAgICAgICAgICAgICAgIHZhciBhdHRyaWIgPSB0aGlzaWFbYV07CiAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmliLm5hbWUsIGF0dHJpYi52YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZXdFbGVtZW50LmlubmVySFRNTCA9IHRoaXNpLmlubmVySFRNTDsKICAgICAgICAgICAgICAgICQodGhpc2kpLmFmdGVyKG5ld0VsZW1lbnQpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgdGFnc1tpXSA9IG5ld0VsZW1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQodGFncyk7CiAgICAgICAgfSwKICAgICAgICBnZXRCYWNrZ3JvdW5kVXJsOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGxldCBpbWdVcmxzID0gW107CiAgICAgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsZSkgewogICAgICAgICAgICAgICAgbGV0IGJnVXJsID0gJCh0aGlzKS5jc3MoJ2JhY2tncm91bmQtaW1hZ2UnKSB8fCBlbGUuc3R5bGUuYmFja2dyb3VuZEltYWdlIHx8ICd1cmwoIiIpJzsKICAgICAgICAgICAgICAgIGxldCBtYXRjaEFyciA9IGJnVXJsLm1hdGNoKC91cmxcKChbJyJdKSguKj8pXDFcKS8pOwogICAgICAgICAgICAgICAgYmdVcmwgPSBtYXRjaEFyciAmJiBtYXRjaEFyci5sZW5ndGggPj0gMiA/IG1hdGNoQXJyWzJdIDogJyc7CiAgICAgICAgICAgICAgICBpbWdVcmxzLnB1c2goYmdVcmwpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGltZ1VybHMubGVuZ3RoID09PSAxID8gaW1nVXJsc1swXSA6IGltZ1VybHM7CiAgICAgICAgfQogICAgfSk7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSDlhajlsYDlj4LmlbAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBsZXQgZ2xvYmFsRGF0YSwgcHJlbG9hZERhdGE7CiAgICBsZXQgaW5pdERhdGEgPSBmdW5jdGlvbigpIHsKICAgICAgICAkLmFqYXgoeyB1cmw6IGxvY2F0aW9uLmhyZWYsIGFzeW5jOiBmYWxzZSwKICAgICAgICAgICAgc3VjY2VzczogcmVzcG9uc2UgPT4gewogICAgICAgICAgICAgICAgbGV0IGh0bWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnaHRtbCcgKTsKICAgICAgICAgICAgICAgIGh0bWwuaW5uZXJIVE1MID0gcmVzcG9uc2U7CiAgICAgICAgICAgICAgICBnbG9iYWxEYXRhID0gSlNPTi5wYXJzZSgkKGh0bWwpLmZpbmQoJ21ldGFbbmFtZT0iZ2xvYmFsLWRhdGEiXScpLmF0dHIoJ2NvbnRlbnQnKSB8fCAne30nKTsKICAgICAgICAgICAgICAgIHByZWxvYWREYXRhID0gSlNPTi5wYXJzZSgkKGh0bWwpLmZpbmQoJ21ldGFbbmFtZT0icHJlbG9hZC1kYXRhIl0nKS5hdHRyKCdjb250ZW50JykgfHwgJ3t9Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CiAgICBsZXQgZ2V0UHJlbG9hZERhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYoIXByZWxvYWREYXRhKSB7IGluaXREYXRhKCk7IH0KICAgICAgICByZXR1cm4gcHJlbG9hZERhdGE7CiAgICB9OwogICAgbGV0IGdldEdsb2JhbERhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYoIWdsb2JhbERhdGEpIHsgaW5pdERhdGEoKTsgfQogICAgICAgIHJldHVybiBnbG9iYWxEYXRhOwogICAgfTsKICAgIGxldCBsYW5nID0gKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2xhbmcnKSB8fCAnZW4nKS50b0xvd2VyQ2FzZSgpLAogICAgICAgIGlsbHVzdEpzb24gPSB7fTsKCiAgICBsZXQgaWxsdXN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIDEuIOWIpOaWreaYr+WQpuW3suacieS9nOWTgWlkKOWFvOWuueaMieW3puWPs+aWueWQkemUrue/u+mhteeahOaDheWGtSkKICAgICAgICBsZXQgcHJlSWxsdXN0SWQgPSAkKCdib2R5JykuYXR0cignYWhhb19pbGx1c3RfaWQnKTsKICAgICAgICBsZXQgcGFyYW1SZWdleCA9IGxvY2F0aW9uLmhyZWYubWF0Y2goL2FydHdvcmtzXC8oXGQqKSQvKTsKICAgICAgICBsZXQgdXJsSWxsdXN0SWQgPSAhIXBhcmFtUmVnZXggJiYgcGFyYW1SZWdleC5sZW5ndGggPiAwID8gcGFyYW1SZWdleFsxXSA6ICcnOwogICAgICAgIC8vIDIuIOWmguaenGlsbHVzdF9pZOayoeWPmCwg5YiZ5LiN5pu05pawanNvbgogICAgICAgIGlmIChwYXJzZUludChwcmVJbGx1c3RJZCkgPT09IHBhcnNlSW50KHVybElsbHVzdElkKSkgewogICAgICAgICAgICByZXR1cm4gaWxsdXN0SnNvbjsKICAgICAgICB9CiAgICAgICAgLy8gMy4g5aaC5p6caWxsdXN0X2lk5Y+Y5YyWLCDliJnmjIHkuYXljJZpbGx1c3RfaWQsIOS4lOWQjOatpeabtOaWsGpzb24KICAgICAgICBpZiAoISF1cmxJbGx1c3RJZCkgewogICAgICAgICAgICAkKCdib2R5JykuYXR0cignYWhhb19pbGx1c3RfaWQnLCB1cmxJbGx1c3RJZCk7CiAgICAgICAgICAgICQuYWpheCh7CiAgICAgICAgICAgICAgICB1cmw6ICcvYWpheC9pbGx1c3QvJyArIHVybElsbHVzdElkLAogICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJywKICAgICAgICAgICAgICAgIGFzeW5jOiBmYWxzZSwKICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHJlc3BvbnNlID0+IGlsbHVzdEpzb24gPSByZXNwb25zZS5ib2R5CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaWxsdXN0SnNvbjsKICAgIH07CiAgICBsZXQgZ2V0VWlkID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmKCFwcmVsb2FkRGF0YSB8fCAhcHJlbG9hZERhdGEudXNlciB8fCAhT2JqZWN0LmtleXMocHJlbG9hZERhdGEudXNlcilbMF0pIHsKICAgICAgICAgICAgaW5pdERhdGEoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHByZWxvYWREYXRhICYmIHByZWxvYWREYXRhLnVzZXIgJiYgT2JqZWN0LmtleXMocHJlbG9hZERhdGEudXNlcilbMF07CiAgICB9OwogICAgbGV0IG9ic2VydmVyRmFjdG9yeSA9IGZ1bmN0aW9uIChvcHRpb24pIHsKICAgICAgICBsZXQgb3B0aW9uczsKICAgICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICBvcHRpb25zID0gewogICAgICAgICAgICAgICAgY2FsbGJhY2s6IG9wdGlvbiwKICAgICAgICAgICAgICAgIG5vZGU6IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0sCiAgICAgICAgICAgICAgICBvcHRpb246IHtjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWV9CiAgICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbm9kZTogZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXSwKICAgICAgICAgICAgICAgIG9wdGlvbjoge2NoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX0KICAgICAgICAgICAgfSwgb3B0aW9uKTsKICAgICAgICB9CiAgICAgICAgbGV0IE11dGF0aW9uT2JzZXJ2ZXIgPSB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCB3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlciB8fCB3aW5kb3cuTW96TXV0YXRpb25PYnNlcnZlciwKICAgICAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zLCBvYnNlcnZlcikgPT4gewogICAgICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFjay5jYWxsKHRoaXMsIG11dGF0aW9ucywgb2JzZXJ2ZXIpOwogICAgICAgICAgICAgICAgLy8gR00uZ2V0VmFsdWUoJ01PJywgdHJ1ZSkudGhlbihmdW5jdGlvbiAodikgeyBpZighdikgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShvcHRpb25zLm5vZGUsIG9wdGlvbnMub3B0aW9uKTsKICAgICAgICByZXR1cm4gb2JzZXJ2ZXI7CiAgICB9OwogICAgbGV0IGlzTG9naW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgbGV0IHN0YXR1cyA9IDA7CiAgICAgICAgJC5hamF4KHt1cmw6ICdodHRwczovL3d3dy5waXhpdi5uZXQvc2V0dGluZ191c2VyLnBocCcsIGFzeW5jOiBmYWxzZX0pCiAgICAgICAgICAgIC5kb25lKChkYXRhLCBzdGF0dXNUZXh0LCB4aHIpID0+IHN0YXR1cyA9IHhoci5zdGF0dXMpOwogICAgICAgIHJldHVybiBzdGF0dXMgPT09IDIwMDsKICAgIH07CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSDphY3nva7kv6Hmga8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBsZXQgR01rZXlzID0gewogICAgICAgIE1POiAnTU8nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTXV0YXRpb25PYnNlcnZlciDnmoTlvIDlhbMKICAgICAgICBzZWxlY3RvclNoYXJlQnRuOiAnc2VsZWN0b3JTaGFyZUJ0bicsICAgICAgIC8vIOS4i+i9veaMiemSrueahHNlbGVjdG9yCiAgICAgICAgc2VsZWN0b3JSaWdodENvbHVtbjogJ3NlbGVjdG9yUmlnaHRDb2x1bW4nLCAvLyDkvZzlk4HpobXpnaLnmoTkvZzogIXkv6Hmga9zZWxlY3RvcgoKICAgICAgICBzd2l0Y2hJbWdTaXplOiAgJ3N3aXRjaC1pbWctc2l6ZScsICAgICAgICAgICAgICAvLyDmmK/lkKbmmL7npLrlm77niYflpKflsI/nmoTlvIDlhbMKICAgICAgICBzd2l0Y2hJbWdQcmVsb2FkOiAnc3dpdGNoLWltZy1wcmVsb2FkJywgICAgICAgICAvLyDmmK/lkKbpooTkuIvovb3nmoTlvIDlhbMKICAgICAgICBzd2l0Y2hDb21tZW50OiAnc3dpdGNoLWNvbW1lbnQnLCAgICAgICAgICAgICAgICAvLyDmmK/lkKboh6rliqjliqDovb3or4TorrrnmoTlvIDlhbMKICAgICAgICBzd2l0Y2hPcmRlckJ5UG9wdWxhcjogJ3N3aXRjaC1vcmRlci1ieS1wb3B1bGFyJywvLyDmmK/lkKbmjInmlLbol4/mlbDmjpLluo/nmoTlvIDlhbMo5Y2V6aG15o6S5bqPKQoKICAgICAgICBkb3dubG9hZE5hbWU6ICdkb3dubG9hZC1uYW1lJywgIC8vIOS4i+i9veWQjXBhdHRlcm4KICAgIH07CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBpMThuIOWbvemZheWMliA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBsZXQgaTE4bkxpYiA9IHsKICAgICAgICBqYTogewogICAgICAgICAgICBmYXZvcml0ZXM6ICd1c2Vyc+WFpeOCiicsCiAgICAgICAgfSwKICAgICAgICBlbjogewogICAgICAgICAgICBmYXZvcml0ZXM6ICdmYXZvcml0ZXMnLAogICAgICAgICAgICBpbGxlZ2FsOiAnaWxsZWdhbCcsCiAgICAgICAgICAgIGRvd25sb2FkOiAnZG93bmxvYWQnLAogICAgICAgICAgICBkb3dubG9hZF93YWl0OiAncGxlYXNlIHdhaXQgZG93bmxvYWQgY29tcGxldGVkJywKICAgICAgICAgICAgY29weV90b19jbGlwYm9hcmQ6ICdjb3B5IHRvIENsaXBib2FyZCcsCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICdiYWNrZ3JvdW5kJywKICAgICAgICAgICAgYmFja2dyb3VuZF9ub3RfZm91bmQ6ICduby1iYWNrZ3JvdW5kJywKICAgICAgICAgICAgbG9naW5XYXJuaW5nOiAnUGl4aXYgUGx1cyBTY3JpcHQgV2FybmluZyEgUGxlYXNlIGxvZ2luIHRvIFBpeGl2IGZvciBhIGJldHRlciBleHBlcmllbmNlISBGYWlsdXJlIHRvIGxvZ2luIG1heSByZXN1bHQgaW4gdW5wcmVkaWN0YWJsZSBidWdzIScsCiAgICAgICAgICAgIGlsbHVzdF90eXBlX3NpbmdsZTogJ1tzaW5nbGUgcGljXScsCiAgICAgICAgICAgIGlsbHVzdF90eXBlX211bHRpcGxlOiAnW211bHRpcGxlIHBpY10nLAogICAgICAgICAgICBpbGx1c3RfdHlwZV9naWY6ICdbZ2lmIHBpY10nLAogICAgICAgICAgICBzb3J0X2J5X3BvcHVsYXJpdHk6ICdTb3J0X2J5X3BvcHVsYXJpdHkoc2luZ2xlIHBhZ2UpJwogICAgICAgIH0sCiAgICAgICAga286IHt9LAogICAgICAgIHpoOiB7CiAgICAgICAgICAgIGZhdm9yaXRlczogJ+aUtuiXj+S6uuaVsCcsCiAgICAgICAgICAgIGlsbGVnYWw6ICfkuI3lkIjms5UnLAogICAgICAgICAgICBkb3dubG9hZDogJ+S4i+i9vScsCiAgICAgICAgICAgIGRvd25sb2FkX3dhaXQ6ICfor7fnrYnlvoXkuIvovb3lrozmiJAnLAogICAgICAgICAgICBjb3B5X3RvX2NsaXBib2FyZDogJ+W3suWkjeWItuWIsOWJqui0tOadvycsCiAgICAgICAgICAgIGJhY2tncm91bmQ6ICfog4zmma/lm74nLAogICAgICAgICAgICBiYWNrZ3JvdW5kX25vdF9mb3VuZDogJ+aXoOiDjOaZr+WbvicsCiAgICAgICAgICAgIGxvZ2luV2FybmluZzogJ1BpeGl25aKe5by6IOiEmuacrOitpuWRiiEg6K+355m75b2VUGl4aXbojrflvpfmm7Tlpb3nmoTkvZPpqowhIOacqueZu+W9leWPr+iDveS6p+eUn+S4jeWPr+mihOaWmeeahGJ1ZyEnLAogICAgICAgICAgICBpbGx1c3RfdHlwZV9zaW5nbGU6ICdb5Y2V5Zu+XScsCiAgICAgICAgICAgIGlsbHVzdF90eXBlX211bHRpcGxlOiAnW+WkmuWbvl0nLAogICAgICAgICAgICBpbGx1c3RfdHlwZV9naWY6ICdbZ2lm5Zu+XScsCiAgICAgICAgICAgIHNvcnRfYnlfcG9wdWxhcml0eTogJ+aMieaUtuiXj+aVsOaQnOe0oijljZXpobUpJwogICAgICAgIH0sCiAgICAgICAgJ3poLWNuJzoge30sCiAgICAgICAgJ3poLXR3JzogewogICAgICAgICAgICBmYXZvcml0ZXM6ICfmlLbol4/kurrmlbgnLAogICAgICAgICAgICBpbGxlZ2FsOiAn5LiN5ZCI5rOVJywKICAgICAgICAgICAgZG93bmxvYWQ6ICfkuIvovIknLAogICAgICAgICAgICBkb3dubG9hZF93YWl0OiAn6KuL562J5b6F5LiL6LyJ5a6M5oiQJywKICAgICAgICAgICAgY29weV90b19jbGlwYm9hcmQ6ICflt7Llvqnoo73liLDliarosrzmnb8nLAogICAgICAgICAgICBiYWNrZ3JvdW5kOiAn6IOM5pmv5ZyWJywKICAgICAgICAgICAgYmFja2dyb3VuZF9ub3RfZm91bmQ6ICfnhKHog4zmma/lnJYnLAogICAgICAgICAgICBsb2dpbldhcm5pbmc6ICdQaXhpduWinuW8tyDohbPmnKzorablkYohIOiri+eZu+mMhFBpeGl2542y5b6X5pu05aW955qE6auU6amXISDmnKrnmbvpjITlj6/og73nlKLnlJ/kuI3lj6/poJDmlpnnmoRidWchJywKICAgICAgICAgICAgaWxsdXN0X3R5cGVfc2luZ2xlOiAnW+WWruWcll0nLAogICAgICAgICAgICBpbGx1c3RfdHlwZV9tdWx0aXBsZTogJ1vlpJrlnJZdJywKICAgICAgICAgICAgaWxsdXN0X3R5cGVfZ2lmOiAnW2dpZuWcll0nLAogICAgICAgICAgICBzb3J0X2J5X3BvcHVsYXJpdHk6ICfmjInmlLbol4/mlbjmkJzntKIo5Zau6aCBKScKICAgICAgICB9CiAgICB9OwogICAgaTE4bkxpYlsnemgtY24nXSA9ICQuZXh0ZW5kKHt9LCBpMThuTGliLnpoKTsKICAgIC8vIFRPRE8g5b6F57+76K+RCiAgICBpMThuTGliLmphID0gJC5leHRlbmQoe30sIGkxOG5MaWIuZW4sIGkxOG5MaWIuamEpOwogICAgaTE4bkxpYi5rbyA9ICQuZXh0ZW5kKHt9LCBpMThuTGliLmVuLCBpMThuTGliLmtvKTsKICAgIGxldCBpMThuID0ga2V5ID0+IGkxOG5MaWJbbGFuZ11ba2V5XSB8fCBgaTE4blske2xhbmd9XVske2tleX1dIG5vdCBmb3VuZGA7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSB1cmwg6aG16Z2i5Yik5patID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgbGV0IGlzQXJ0d29ya1BhZ2UgPSAoKSA9PiAvLithcnR3b3Jrc1wvXGQrLiovLnRlc3QobG9jYXRpb24uaHJlZik7CgogICAgbGV0IGlzTWVtYmVySW5kZXhQYWdlID0gKCkgPT4gLy4rXC91c2Vyc1wvXGQrLiovLnRlc3QobG9jYXRpb24uaHJlZik7CiAgICBsZXQgaXNNZW1iZXJJbGx1c3RQYWdlID0gKCkgPT4gLy4rXC9tZW1iZXJfaWxsdXN0XC5waHBcP2lkPVxkKy8udGVzdChsb2NhdGlvbi5ocmVmKTsKICAgIGxldCBpc01lbWJlckJvb2ttYXJrUGFnZSA9ICgpID0+IC8uK1wvYm9va21hcmtcLnBocFw/aWQ9XGQrLy50ZXN0KGxvY2F0aW9uLmhyZWYpOwogICAgbGV0IGlzTWVtYmVyRnJpZW5kUGFnZSA9ICgpID0+IC8uK1wvbXlwaXhpdl9hbGxcLnBocFw/aWQ9XGQrLy50ZXN0KGxvY2F0aW9uLmhyZWYpOwogICAgbGV0IGlzTWVtYmVyRHluYW1pY1BhZ2UgPSAoKSA9PiAvLitcL3N0YWNjLisvLnRlc3QobG9jYXRpb24uaHJlZik7CiAgICBsZXQgaXNNZW1iZXJQYWdlID0gKCkgPT4gaXNNZW1iZXJJbmRleFBhZ2UoKSB8fCBpc01lbWJlcklsbHVzdFBhZ2UoKSB8fCBpc01lbWJlckJvb2ttYXJrUGFnZSgpIHx8IGlzTWVtYmVyRnJpZW5kUGFnZSgpLAogICAgICAgIGlzU2VhcmNoUGFnZSA9ICgpID0+IC8uK1wvc2VhcmNoXC5waHAuKi8udGVzdChsb2NhdGlvbi5ocmVmKSB8fCAvLitcL3RhZ3NcLy4qXC9hcnR3b3Jrcy4qLy50ZXN0KGxvY2F0aW9uLmhyZWYpOwoKICAgIC8vIOWIpOaWreaYr+WQpueZu+W9lQogICAgaWYgKCFpc0xvZ2luKCkpIHsKICAgICAgICBhbGVydChpMThuKCdsb2dpbldhcm5pbmcnKSk7CiAgICB9CgogICAgLy8gMS4g5bGP6JS95bm/5ZGKLCDlhajlsYDov5vooYxjc3PlpITnkIYKICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gMS4g5Yig6Zmk6Z2Z5oCB5re75Yqg55qE5bm/5ZGKCiAgICAgICAgJCgnLmFkJykucmVtb3ZlKCk7CiAgICAgICAgJCgnLl9wcmVtaXVtLWxlYWQtdGFnLXNlYXJjaC1iYXInKS5oaWRlKCk7CiAgICAgICAgJCgnLnBvcHVsYXItaW50cm9kdWN0aW9uLW92ZXJsYXknKS5oaWRlKCk7Ly8g56e76Zmk54Ot6Zeo5Zu+54mH6YGu572p5bGCCiAgICAgICAgJCgnLmFkLWZvb3RlcicpLnJlbW92ZSgpOy8v56e76Zmk6aG16ISa5bm/5ZGKCgogICAgICAgIC8vIDIuIOWIoOmZpOWKqOaAgea3u+WKoOeahOW5v+WRigogICAgICAgIGxldCBhZFNlbGVjdG9ycyA9IFsnaWZyYW1lJywgJy5fcHJlbWl1bS1sZWFkLXByb21vdGlvbi1iYW5uZXInLAogICAgICAgICAgICAnYVtocmVmPSIvcHJlbWl1bS9sZWFkL2xwP2c9YW5jaG9yJmk9cG9wdWxhcl93b3Jrc19saXN0JnA9cG9wdWxhciZwYWdlPXZpc2l0b3IiXScgLy8gaHR0cHM6Ly93d3cucGl4aXYubmV0L3RhZ3MvJUU2JTlEJUIxJUU2JTk2JUI5L2FydHdvcmtzP3NfbW9kZT1zX3RhZyDng63pl6jkvZzlk4EKICAgICAgICBdOwoKICAgICAgICBvYnNlcnZlckZhY3RvcnkoZnVuY3Rpb24gKG11dGF0aW9ucywgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgbXV0YXRpb25zLmZvckVhY2goZnVuY3Rpb24gKG11dGF0aW9uKSB7CiAgICAgICAgICAgICAgICBpZiAobXV0YXRpb24udHlwZSAhPT0gJ2NoaWxkTGlzdCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgJHBhcmVudCA9ICQobXV0YXRpb24udGFyZ2V0KS5wYXJlbnQoKTsKICAgICAgICAgICAgICAgIC8vIDIuMS4g6ZqQ6JeP5bm/5ZGKCiAgICAgICAgICAgICAgICBsZXQgJGFkID0gJHBhcmVudC5maW5kKGFkU2VsZWN0b3JzLmpvaW4oJywnKSk7CiAgICAgICAgICAgICAgICAkYWQuaGlkZSgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0pKCk7CgogICAgLy8gMi8zLiDmkJzntKLlop7lvLoKICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgb2JzZXJ2ZXJGYWN0b3J5KGZ1bmN0aW9uIChtdXRhdGlvbnMsIG9ic2VydmVyKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGxldCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXTsKICAgICAgICAgICAgICAgIC8vIDEuIOWIpOaWreaYr+WQpuaUueWPmOiKgueCuSwg5oiW6ICF5piv5ZCm5pyJW2Zvcm1d6IqC54K5CiAgICAgICAgICAgICAgICBsZXQgJGZvcm0gPSAkKCcjanMtbW91bnQtcG9pbnQtaGVhZGVyIGZvcm06bm90KFthY3Rpb25dKSwgI3Jvb3QgZGl2W3N0eWxlPSJwb3NpdGlvbjogc3RhdGljOyB6LWluZGV4OiBhdXRvOyJdIGZvcm06bm90KFthY3Rpb25dKScpOwogICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgIT09ICdjaGlsZExpc3QnIHx8ICEkZm9ybS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCLmkJzntKLlop7lvLog5Yid5aeL5YyWIik7CgogICAgICAgICAgICAgICAgLy8gMi4g5L+u5pS554i257qnZ3JpZOW4g+WxgAogICAgICAgICAgICAgICAgJGZvcm0ucGFyZW50KCkucGFyZW50KCkuY3NzKCdncmlkLXRlbXBsYXRlLWNvbHVtbnMnLCAnMmZyIDJmciAyZnIgbWlubWF4KGF1dG8sIDUyOHB4KSAxZnIgMmZyJyk7CgogICAgICAgICAgICAgICAgLy8gMy4g5pCc57SiVUlE5ZKMUElECiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKCRmb3JtKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGluaXRTZWFyY2ggPSBmdW5jdGlvbiAob3B0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcHRpb25zID0gJC5leHRlbmQoeyRmb3JtOiBudWxsLCBwbGFjZWhvbGRlcjogJycsIHVybDogJyd9LCBvcHRpb24pOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW9wdGlvbnMuJGZvcm0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfmkJzntKJVSUTlkoxQSUQg5Yid5aeL5YyW5aSx6LSlLCBmb3Jt5YWD57Sg6I635Y+W5aSx6LSlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIOWIneWni+WMluihqOWNlVVJCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCAkcGFyZW50ID0gb3B0aW9ucy4kZm9ybS5wYXJlbnQoKS5jbG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgJGZvcm0gPSAkcGFyZW50LmZpbmQoJ2Zvcm0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm0uY2hpbGRyZW4oJ2RpdicpLmVxKDEpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAkZm9ybS5hdHRyKCdjbGFzcycsICdhaGFvLXNlYXJjaCcpOwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLiRmb3JtLnBhcmVudCgpLmJlZm9yZSgkcGFyZW50KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCAkaW5wdXQgPSAkZm9ybS5maW5kKCdpbnB1dFt0eXBlPSJ0ZXh0Il06Zmlyc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGlucHV0LmF0dHIoJ3BsYWNlaG9sZGVyJywgb3B0aW9ucy5wbGFjZWhvbGRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICRpbnB1dC52YWwoJycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4g57uR5a6ac3VibWl05LqL5Lu2CiAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtLnN1Ym1pdChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZCA9ICRpbnB1dC52YWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuMS4gSUQg5b+F6aG75Li657qv5pWw5a2XCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIS9eWzAtOV0rJC8udGVzdChpZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBvcHRpb25zLnBsYWNlaG9sZGVyICsgaTE4bignaWxsZWdhbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0KGxhYmVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLjIuIOaWsOeql+WPo+aJk+W8gHVybAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IG9wdGlvbi51cmwgKyBpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLjMuIOa4heepumlucHV0562J5b6F5LiL5qyh6L6T5YWlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpbml0U2VhcmNoKHskZm9ybTogJGZvcm0sIHBsYWNlaG9sZGVyOiAnVUlEJywgdXJsOiAnaHR0cHM6Ly93d3cucGl4aXYubmV0L3VzZXJzLyd9KTsKICAgICAgICAgICAgICAgICAgICBpbml0U2VhcmNoKHskZm9ybTogJGZvcm0sIHBsYWNlaG9sZGVyOiAnUElEJywgdXJsOiAnaHR0cHM6Ly93d3cucGl4aXYubmV0L2FydHdvcmtzLyd9KTsKICAgICAgICAgICAgICAgIH0pKCRmb3JtKTsKCiAgICAgICAgICAgICAgICAvLyA0LiDmkJzntKLmnaHku7YKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoJGZvcm0pIHsKICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBpMThuKCdmYXZvcml0ZXMnKTsgLy8gdXNlcnPlhaXjgooKICAgICAgICAgICAgICAgICAgICBsZXQgJGlucHV0ID0gJGZvcm0uZmluZCgnaW5wdXRbdHlwZT0idGV4dCJdOmZpcnN0Jyk7CiAgICAgICAgICAgICAgICAgICAgbGV0ICRzZWxlY3QgPSAkKGAKICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJzZWxlY3QtYWhhby1mYXZvcml0ZXMiPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIzMDAwMHVzZXJz5YWl44KKIj4zMDAwMHVzZXJz5YWl44KKPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjIwMDAwdXNlcnPlhaXjgooiPjIwMDAwdXNlcnPlhaXjgoo8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTAwMDB1c2Vyc+WFpeOCiiI+MTAwMDB1c2Vyc+WFpeOCijwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI1MDAwdXNlcnPlhaXjgooiID4gNTAwMHVzZXJz5YWl44KKPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEwMDB1c2Vyc+WFpeOCiiIgPiAxMDAwdXNlcnPlhaXjgoo8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNTAwdXNlcnPlhaXjgooiICA+ICA1MDB1c2Vyc+WFpeOCijwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIzMDB1c2Vyc+WFpeOCiiIgID4gIDMwMHVzZXJz5YWl44KKPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEwMHVzZXJz5YWl44KKIiAgPiAgMTAwdXNlcnPlhaXjgoo8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNTB1c2Vyc+WFpeOCiiIgICA+ICAgNTB1c2Vyc+WFpeOCijwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PmApOwogICAgICAgICAgICAgICAgICAgICRzZWxlY3Qub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsgaWYgKCEhJGlucHV0LnZhbCgpKSB7ICRmb3JtLnN1Ym1pdCgpOyB9fSk7CiAgICAgICAgICAgICAgICAgICAgJGZvcm0ucGFyZW50KCkuYWZ0ZXIoJHNlbGVjdCk7CiAgICAgICAgICAgICAgICAgICAgJGZvcm0uc3VibWl0KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEhJHNlbGVjdC52YWwoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi40LjEuIOWOu+mZpOaXp+eahOaQnOe0oumAiemhuQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlucHV0LnZhbCgoaW5kZXgsIHZhbCkgPT4gdmFsLnJlcGxhY2UoL1xkKnVzZXJz5YWl44KKL2csICcnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQudmFsKChpbmRleCwgdmFsKSA9PiB2YWwucmVwbGFjZSgvXGQqJC9nLCAnJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi40LjIuIOWOu+mZpOWkmuS9meepuuagvAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlucHV0LnZhbCgoaW5kZXgsIHZhbCkgPT4gdmFsLnJlcGxhY2UoL1xzXHMqL2csICcnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW5wdXQudmFsKChpbmRleCwgdmFsKSA9PiB2YWwgKyAnICcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi40LjMuIOa3u+WKoOaWsOeahOaQnOe0oumAiemhuQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlucHV0LnZhbCgoaW5kZXgsIHZhbCkgPT4gYCR7dmFsfSR7JHNlbGVjdC52YWwoKX1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gJGlucHV0LnZhbCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZighIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gYGh0dHBzOi8vd3d3LnBpeGl2Lm5ldC90YWdzLyR7dmFsdWV9L2FydHdvcmtzP3NfbW9kZT1zX3RhZ2A7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKCRmb3JtKTsKCiAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSkoKTsKCiAgICAvLyA0LiDljZXlvKDlm77niYfmm7/mjaLkuLrljp/lm77moLzlvI8uIOi/veWKoOS4i+i9veaMiemSriwg5LiL6L29Z2lm5Zu+44CBZ2lm55qE5bin5Y6L57yp5YyF44CB5aSa5Zu+CiAgICAoYXN5bmMgZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghaXNBcnR3b3JrUGFnZSgpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gMS4g5Yid5aeL5YyW5pa55rOVCiAgICAgICAgbGV0IGluaXREb3dubG9hZEJ0biA9IGZ1bmN0aW9uIChvcHRpb24pIHsKICAgICAgICAgICAgLy8g5LiL6L295oyJ6ZKuLCDlpI3liLbliIbkuqvmjInpkq7lubbml4vovawxODDluqYKICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSAkLmV4dGVuZCh7ICRzaGFyZUJ1dHRvbkNvbnRhaW5lcjogdW5kZWZpbmVkLCBpZDogJycsIHRleHQ6ICcnLCBjbGlja0Z1bjogKCkgPT4ge30gfSwgb3B0aW9uKTsKICAgICAgICAgICAgbGV0ICRkb3dubG9hZEJ1dHRvbkNvbnRhaW5lciA9IG9wdGlvbnMuJHNoYXJlQnV0dG9uQ29udGFpbmVyLmNsb25lKCk7CiAgICAgICAgICAgICRkb3dubG9hZEJ1dHRvbkNvbnRhaW5lci5hZGRDbGFzcygnYWhhby1kb3dubG9hZC1idG4nKQogICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgb3B0aW9ucy5pZCkKICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhvcHRpb25zLiRzaGFyZUJ1dHRvbkNvbnRhaW5lci5hdHRyKCdjbGFzcycpKQogICAgICAgICAgICAgICAgLmNzcygnbWFyZ2luLXJpZ2h0JywgJzEwcHgnKQogICAgICAgICAgICAgICAgLmNzcygncG9zaXRpb24nLCAncmVsYXRpdmUnKQogICAgICAgICAgICAgICAgLmNzcygnYm9yZGVyJywgJzFweCBzb2xpZCcpCiAgICAgICAgICAgICAgICAuY3NzKCdwYWRkaW5nJywgJzFweCAxMHB4JykKICAgICAgICAgICAgICAgIC5hcHBlbmQoYDxwIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUiPiR7b3B0aW9ucy50ZXh0fTwvcD5gKTsKICAgICAgICAgICAgJGRvd25sb2FkQnV0dG9uQ29udGFpbmVyLmZpbmQoJ2J1dHRvbicpLmNzcygndHJhbnNmb3JtJywgJ3JvdGF0ZSgxODBkZWcpJykKICAgICAgICAgICAgICAgIC5vbignY2xpY2snLCBvcHRpb25zLmNsaWNrRnVuKTsKICAgICAgICAgICAgb3B0aW9ucy4kc2hhcmVCdXR0b25Db250YWluZXIuYWZ0ZXIoJGRvd25sb2FkQnV0dG9uQ29udGFpbmVyKTsKICAgICAgICAgICAgcmV0dXJuICRkb3dubG9hZEJ1dHRvbkNvbnRhaW5lcjsKICAgICAgICB9OwogICAgICAgIGxldCBhZGRJbWdTaXplID0gYXN5bmMgZnVuY3Rpb24gKG9wdGlvbikgewogICAgICAgICAgICAvLyDku44gJGltZyDojrflj5blm77niYflpKflsI8sIGFmdGVyIOWIsCAkaW1nCiAgICAgICAgICAgIGxldCBvcHRpb25zID0gJC5leHRlbmQoewogICAgICAgICAgICAgICAgJGltZzogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsCiAgICAgICAgICAgIH0sIG9wdGlvbik7CiAgICAgICAgICAgIGxldCAkaW1nID0gb3B0aW9ucy4kaW1nLCBwb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb247CiAgICAgICAgICAgIGlmICgkaW1nLmxlbmd0aCAhPT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEdNLmdldFZhbHVlKEdNa2V5cy5zd2l0Y2hJbWdTaXplLCB0cnVlKS50aGVuKG9wZW4gPT4gewogICAgICAgICAgICAgICAgaWYgKCEhb3BlbikgewogICAgICAgICAgICAgICAgICAgIC8vIDEuIOaJvuWIsCDmmL7npLrlm77niYflpKflsI8g55qEIHNwYW4sIOayoeacieWImea3u+WKoAogICAgICAgICAgICAgICAgICAgIGxldCAkc3BhbiA9ICRpbWcubmV4dCgnc3BhbicpOwogICAgICAgICAgICAgICAgICAgIGlmICgkc3Bhbi5sZW5ndGggPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyDmt7vliqDliY0g5Y676Zmk5aSx5Y675L6d6LWW55qEIHNwYW4KICAgICAgICAgICAgICAgICAgICAgICAgJCgnYm9keScpLmZpbmQoJy5haGFvLWltZy1zaXplJykuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpLCAkcHJldiA9ICR0aGlzLnByZXYoJ2NhbnZhcywgaW1nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHByZXYubGVuZ3RoIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRpbWcuYWZ0ZXIoYDxzcGFuIGNsYXNzPSJhaGFvLWltZy1zaXplIiBzdHlsZT0icG9zaXRpb246ICR7cG9zaXRpb259OyByaWdodDogMDsgdG9wOiAyOHB4OwogICAgICAgICAgICAgICAgICAgIGNvbG9yOiAjZmZmZmZmOyBmb250LXNpemU6IHgtbGFyZ2U7IGZvbnQtd2VpZ2h0OiBib2xkOyAtd2Via2l0LXRleHQtc3Ryb2tlOiAxLjBweCAjMDAwMDAwOyI+PC9zcGFuPmApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyAyLiDmoLnmja7moIfnrb7ojrflj5blm77niYflpKflsI8sIOebruWJjeWPquaciSBjYW52YXMg5ZKMIGltZyDkuKTnp40KICAgICAgICAgICAgICAgICAgICBpZiAoJGltZy5wcm9wKCd0YWdOYW1lJykgPT09ICdJTUcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbWcgPSBuZXcgSW1hZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaW1nLnNyYyA9ICRpbWcuYXR0cignc3JjJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3Bhbi50ZXh0KGAke3RoaXMud2lkdGh9eCR7dGhpcy5oZWlnaHR9YCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gJGltZy5hdHRyKCd3aWR0aCcpIHx8ICRpbWcuY3NzKCd3aWR0aCcpLnJlcGxhY2UoJ3B4JywgJycpIHx8ICRpbWcuY3NzKCdtYXgtd2lkdGgnKS5yZXBsYWNlKCdweCcsICcnKSB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gJGltZy5hdHRyKCdoZWlnaHQnKSB8fCAkaW1nLmNzcygnaGVpZ2h0JykucmVwbGFjZSgncHgnLCAnJykgfHwgJGltZy5jc3MoJ21heC1oZWlnaHQnKS5yZXBsYWNlKCdweCcsICcnKSB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICAkc3Bhbi50ZXh0KGAke3dpZHRofXgke2hlaWdodH1gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgbGV0IG1pbWVUeXBlID0gc3VmZml4ID0+IHsKICAgICAgICAgICAgbGV0IGxpYiA9IHtwbmc6ICJpbWFnZS9wbmciLCBqcGc6ICJpbWFnZS9qcGVnIiwgZ2lmOiAiaW1hZ2UvZ2lmIn07CiAgICAgICAgICAgIHJldHVybiBsaWJbc3VmZml4XSB8fCBgbWltZVR5cGVbJHtzdWZmaXh9XSBub3QgZm91bmRgOwogICAgICAgIH07CiAgICAgICAgbGV0IGdldERvd25sb2FkTmFtZSA9IChuYW1lKSA9PiB7CiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJ3twaWR9JywgaWxsdXN0KCkuaWxsdXN0SWQpOwogICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCd7dWlkfScsIGlsbHVzdCgpLnVzZXJJZCk7CiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJ3twbmFtZX0nLCBpbGx1c3QoKS5pbGx1c3RUaXRsZSk7CiAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJ3t1bmFtZX0nLCBpbGx1c3QoKS51c2VyTmFtZSk7CiAgICAgICAgICAgIHJldHVybiBuYW1lOwogICAgICAgIH07CiAgICAgICAgbGV0IGlzTW9yZU1vZGUgPSAoKSA9PiBpbGx1c3QoKS5wYWdlQ291bnQgPiAxLAogICAgICAgICAgICBpc0dpZk1vZGUgPSAoKSA9PiBpbGx1c3QoKS5pbGx1c3RUeXBlID09PSAyLAogICAgICAgICAgICBpc1NpbmdsZU1vZGUgPSAoKSA9PiAoaWxsdXN0KCkuaWxsdXN0VHlwZSA9PT0gMCB8fCBpbGx1c3QoKS5pbGx1c3RUeXBlID09PSAxKSAmJiBpbGx1c3QoKS5wYWdlQ291bnQgPT09IDE7CiAgICAgICAgbGV0IHNlbGVjdG9yU2hhcmVCdG4gPSBhd2FpdCBHTS5nZXRWYWx1ZShHTWtleXMuc2VsZWN0b3JTaGFyZUJ0biwgJy5VWG12eicpOyAvLyBzZWN0aW9uIOS4i+eahCBkaXYKCiAgICAgICAgLy8g54Ot5L+u5aSN5LiL6L295oyJ6ZKu55qEY2xhc3NOYW1lCiAgICAgICAgb2JzZXJ2ZXJGYWN0b3J5KGZ1bmN0aW9uIChtdXRhdGlvbnMsIG9ic2VydmVyKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGxldCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXSwgJHRhcmdldCA9ICQobXV0YXRpb24udGFyZ2V0KTsKICAgICAgICAgICAgICAgIGlmKCR0YXJnZXQucHJvcCgndGFnTmFtZScpLnRvTG93ZXJDYXNlKCkgIT09ICdzZWN0aW9uJykgY29udGludWU7CiAgICAgICAgICAgICAgICBsZXQgJHNlY3Rpb24gPSAkdGFyZ2V0LmZpbmQoJ3NlY3Rpb24nKTsKICAgICAgICAgICAgICAgIGlmKCRzZWN0aW9uLmxlbmd0aCA8PSAwKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSAkc2VjdGlvbi5lcSgwKS5jaGlsZHJlbignZGl2JykuZXEoMSkuYXR0cignY2xhc3MnKS5zcGxpdCgnICcpWzFdOwogICAgICAgICAgICAgICAgR00uc2V0VmFsdWUoR01rZXlzLnNlbGVjdG9yU2hhcmVCdG4sIGAuJHtjbGFzc05hbWV9YCk7CiAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAvLyDmmL7npLrljZXlm77jgIHlpJrlm77ljp/lm74KICAgICAgICBvYnNlcnZlckZhY3RvcnkoewogICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKG11dGF0aW9ucywgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBsZXQgbXV0YXRpb24gPSBtdXRhdGlvbnNbaV0sICR0YXJnZXQgPSAkKG11dGF0aW9uLnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VJbWcgPSBmdW5jdGlvbiAoJHRhcmdldCwgYXR0ciwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9sZFZhbHVlID0gJHRhcmdldC5hdHRyKGF0dHIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3IFJlZ0V4cChgaHR0cHM/Oi8vaSgtZnwtY2YpP1wucHhpbWdcLm5ldC4qXC8ke2lsbHVzdCgpLmlkfV8uKmApLnRlc3Qob2xkVmFsdWUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmV3IFJlZ0V4cChgaHR0cHM/Oi8vaSgtZnwtY2YpP1wucHhpbWdcLm5ldC9pbWctb3JpZ2luYWwuKmApLnRlc3Qob2xkVmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0LmF0dHIoYXR0ciwgdmFsdWUpLmNzcygnZmlsdGVyJywgJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQuZml0V2luZG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAvLyAxLiDljZXlm77jgIHlpJrlm74gRE9NIOe7k+aehOmDveS4uiA8YSBocmVmPSIiPjxpbWcvPjwvYT4KICAgICAgICAgICAgICAgICAgICBsZXQgJGxpbmsgPSAkdGFyZ2V0LmZpbmQoJ2ltZ1tzcmNzZXRdJyk7CiAgICAgICAgICAgICAgICAgICAgJGxpbmsuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCAkdGhpcyA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBocmVmID0gJHRoaXMucGFyZW50KCdhJykuYXR0cignaHJlZicpOwogICAgICAgICAgICAgICAgICAgICAgICBpZighIWhyZWYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VJbWcoJHRoaXMsICdzcmMnLCBocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VJbWcoJHRoaXMsICdzcmNzZXQnLCBocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEltZ1NpemUoeyRpbWc6ICR0aGlzfSk7IC8vIOaYvuekuuWbvueJh+Wkp+WwjwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vIDIuIOenu+mZpOmprOi1m+WFi+mBrue9qSwgaHR0cHM6Ly93d3cucGl4aXYubmV0L21lbWJlcl9pbGx1c3QucGhwP21vZGU9bWVkaXVtJmlsbHVzdF9pZD01MDM1ODYzOAogICAgICAgICAgICAgICAgICAgIC8vICQoJy5lMnA4cnhjMicpLmhpZGUoKTsgLy8g5oeS5b6X6YCC6YWN5LqGLCDoh6rooYzljrvkuKrkurrotYTmlpnorr7nva4gaHR0cHM6Ly93d3cucGl4aXYubmV0L3NldHRpbmdfdXNlci5waHAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgb3B0aW9uOiB7YXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnc3JjJywgJ3NyY3NldCcsICdocmVmJ119CiAgICAgICAgfSk7CiAgICAgICAgLy8g5LiL6L295Yqo5Zu+5binemlwLCBnaWblm74KICAgICAgICBvYnNlcnZlckZhY3RvcnkoZnVuY3Rpb24gKG11dGF0aW9ucywgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG11dGF0aW9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgbGV0IG11dGF0aW9uID0gbXV0YXRpb25zW2ldLCAkdGFyZ2V0ID0gJChtdXRhdGlvbi50YXJnZXQpOwoKICAgICAgICAgICAgICAgIC8vIDEuIOWNleWbvuOAgeWkmuWbvuOAgWdpZuWbvuS4ieenjeaooeW8jwogICAgICAgICAgICAgICAgbGV0ICRzaGFyZUJ0biA9ICR0YXJnZXQuZmluZChzZWxlY3RvclNoYXJlQnRuKSwgJGNhbnZhcyA9ICR0YXJnZXQuZmluZCgnY2FudmFzJyk7CiAgICAgICAgICAgICAgICAvLyAyLiDmmL7npLrlm77niYflpKflsI8KICAgICAgICAgICAgICAgIGFkZEltZ1NpemUoeyRpbWc6ICRjYW52YXN9KQogICAgICAgICAgICAgICAgaWYgKCFpc0dpZk1vZGUoKSB8fCBtdXRhdGlvbi50eXBlICE9PSAnY2hpbGRMaXN0JyB8fAogICAgICAgICAgICAgICAgICAgICRzaGFyZUJ0bi5sZW5ndGggPD0gMCB8fAogICAgICAgICAgICAgICAgICAgICR0YXJnZXQuZmluZCgnI2FoYW8tZG93bmxvYWQtemlwJykubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5LiL6L29Z2lm5Zu+Jyk7CgoKCiAgICAgICAgICAgICAgICAvLyAzLiDliJ3lp4vljJYg5LiL6L295oyJ6ZKuCiAgICAgICAgICAgICAgICBsZXQgJHppcEJ0biA9IGluaXREb3dubG9hZEJ0bih7CiAgICAgICAgICAgICAgICAgICAgJHNoYXJlQnV0dG9uQ29udGFpbmVyOiAkc2hhcmVCdG4sCiAgICAgICAgICAgICAgICAgICAgaWQ6ICdhaGFvLWRvd25sb2FkLXppcCcsCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ3ppcCcsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGxldCAkZ2lmQnRuID0gaW5pdERvd25sb2FkQnRuKHsKICAgICAgICAgICAgICAgICAgICAkc2hhcmVCdXR0b25Db250YWluZXI6ICRzaGFyZUJ0biwKICAgICAgICAgICAgICAgICAgICBpZDogJ2FoYW8tZG93bmxvYWQtZ2lmJywKICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnZ2lmJywKICAgICAgICAgICAgICAgICAgICBjbGlja0Z1bjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyDku44gcGl4aXYg5a6Y5pa5IGFwaSDojrflj5YgZ2lmIOeahOaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgICAkLmFqYXgoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBgL2FqYXgvaWxsdXN0LyR7aWxsdXN0KCkuaWxsdXN0SWR9L3Vnb2lyYV9tZXRhYCwgZGF0YVR5cGU6ICdqc29uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHJlc3BvbnNlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiDliJ3lp4vljJYgZ2lmIOS4i+i9veaMiemSriDngrnlh7vkuovku7YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHSUZfd29ya2VyX1VSTCDmnaXoh6ogaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzI5NjMtZ2lmLWpzL2NvZGUvZ2lmanMuanM/dmVyc2lvbj04NTk2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdpZlVybCwgZ2lmRnJhbWVzID0gW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZkZhY3RvcnkgPSBuZXcgR0lGKHt3b3JrZXJzOiAxLCBxdWFsaXR5OiAxMCwgd29ya2VyU2NyaXB0OiBHSUZfd29ya2VyX1VSTH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBmcmFtZUlkeCA9IDAsIGZyYW1lcyA9IHJlc3BvbnNlLmJvZHkuZnJhbWVzLCBmcmFtZXNMZW4gPSBmcmFtZXMubGVuZ3RoOyBmcmFtZUlkeCA8IGZyYW1lc0xlbjsgZnJhbWVJZHgrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZnJhbWUgPSBmcmFtZXNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBpbGx1c3QoKS51cmxzLm9yaWdpbmFsLnJlcGxhY2UoJ3Vnb2lyYTAuJywgYHVnb2lyYSR7ZnJhbWVJZHh9LmApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTS54bWxIdHRwUmVxdWVzdCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLCB1cmw6IHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtyZWZlcmVyOiAnaHR0cHM6Ly93d3cucGl4aXYubmV0Lyd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVNaW1lVHlwZTogJ3RleHQvcGxhaW47IGNoYXJzZXQ9eC11c2VyLWRlZmluZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbiAoeGhyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4g6L2s5Li6YmxvYuexu+WeiwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByID0geGhyLnJlc3BvbnNlVGV4dCwgZGF0YSA9IG5ldyBVaW50OEFycmF5KHIubGVuZ3RoKSwgaSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCByLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2ldID0gci5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdWZmaXggPSB1cmwuc3BsaXQoJy4nKS5zcGxpY2UoLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBibG9iID0gbmV3IEJsb2IoW2RhdGFdLCB7dHlwZTogbWltZVR5cGUoc3VmZml4KX0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzLiDljovlhaVnaWZGcmFtZXPmlbDnu4TkuK0sIOaJi+WKqOWQjOatpXN5bmMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLndpZHRoID0gaWxsdXN0KCkud2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLmhlaWdodCA9IGlsbHVzdCgpLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZGcmFtZXNbZnJhbWVJZHhdID0ge2ZyYW1lOiBpbWcsIG9wdGlvbjoge2RlbGF5OiBmcmFtZS5kZWxheX19OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ2lmRnJhbWVzKS5sZW5ndGggPj0gZnJhbWVzTGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goZ2lmRnJhbWVzLCAoaSwgZikgPT4gZ2lmRmFjdG9yeS5hZGRGcmFtZShmLmZyYW1lLCBmLm9wdGlvbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lmRmFjdG9yeS5yZW5kZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZGYWN0b3J5Lm9uKCdwcm9ncmVzcycsIGZ1bmN0aW9uIChwY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGdpZkJ0bi5maW5kKCdwJykudGV4dChgZ2lmICR7cGFyc2VJbnQocGN0ICogMTAwKX0lYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lmRmFjdG9yeS5vbignZmluaXNoZWQnLCBmdW5jdGlvbiAoYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTS5nZXRWYWx1ZShHTWtleXMuZG93bmxvYWROYW1lLCBge3BpZH1gKS50aGVuKG5hbWUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0ICRhID0gJChgPGEgaHJlZj0iJHtnaWZVcmx9IiBkb3dubG9hZD0iJHtnZXREb3dubG9hZE5hbWUobmFtZSl9Ij48L2E+YCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ2lmQnRuLmZpbmQoJ2J1dHRvbicpLndyYXAoJGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGdpZkJ0bi5maW5kKCdidXR0b24nKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdpZlVybCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ0dpZuacquWKoOi9veWujOavlSwg6K+356iN562J54mH5Yi7IScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkYmxvY2sg56aB5q2i55u05o6l5omT5byAIGJsb2IgdXJsLCBodHRwczovL2dpdGh1Yi5jb20vam5vcmRiZXJnL2dpZi5qcy9pc3N1ZXMvNzEjaXNzdWVjb21tZW50LTM2NzI2MDI4NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aW5kb3cub3BlbihnaWZVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyA0LiDmjqfliLbmmK/lkKbpooTkuIvovb0sIOmBv+WFjeWkmuS4qumhtemdouWvvOiHtOeIhuWGheWtmCwg55u05o6l5LiL6L29IHppcAogICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICB1cmw6IGAvYWpheC9pbGx1c3QvJHtpbGx1c3QoKS5pbGx1c3RJZH0vdWdvaXJhX21ldGFgLCBkYXRhVHlwZTogJ2pzb24nLAogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHJlc3BvbnNlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgR00uZ2V0VmFsdWUoR01rZXlzLmRvd25sb2FkTmFtZSwgYHtwaWR9YCkudGhlbihuYW1lID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCAkYSA9ICQoYDxhIGhyZWY9IiR7cmVzcG9uc2UuYm9keS5vcmlnaW5hbFNyY30iIGRvd25sb2FkPSIke2dldERvd25sb2FkTmFtZShuYW1lKX0iPjwvYT5gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6aXBCdG4uZmluZCgnYnV0dG9uJykud3JhcCgkYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgR00uZ2V0VmFsdWUoR01rZXlzLnN3aXRjaEltZ1ByZWxvYWQsIHRydWUpLnRoZW4ob3BlbiA9PiB7IGlmKG9wZW4pIHsgJGdpZkJ0bi5maW5kKCdidXR0b24nKS5jbGljaygpOyB9IH0pOwoKICAgICAgICAgICAgICAgIC8vIDUuIOWPlua2iOebkeWQrAogICAgICAgICAgICAgICAgR00uZ2V0VmFsdWUoR01rZXlzLk1PLCB0cnVlKS50aGVuKGZ1bmN0aW9uICh2KSB7IGlmKCF2KSBvYnNlcnZlci5kaXNjb25uZWN0KCk7IH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgLy8g5LiL6L295aSa5Zu+emlwCiAgICAgICAgb2JzZXJ2ZXJGYWN0b3J5KGZ1bmN0aW9uIChtdXRhdGlvbnMsIG9ic2VydmVyKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGxldCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXSwgJHRhcmdldCA9ICQobXV0YXRpb24udGFyZ2V0KTsKCiAgICAgICAgICAgICAgICAvLyAxLiDljZXlm77jgIHlpJrlm77jgIFnaWblm77kuInnp43mqKHlvI8KICAgICAgICAgICAgICAgIGxldCAkc2hhcmVCdG4gPSAkdGFyZ2V0LmZpbmQoc2VsZWN0b3JTaGFyZUJ0bik7CiAgICAgICAgICAgICAgICBpZiAoIWlzTW9yZU1vZGUoKSB8fCBtdXRhdGlvbi50eXBlICE9PSAnY2hpbGRMaXN0JyB8fCAhJHNoYXJlQnRuLmxlbmd0aCB8fCAhISR0YXJnZXQuZmluZCgnI2FoYW8tZG93bmxvYWQtemlwJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCfkuIvovb3lpJrlm74nKTsKCiAgICAgICAgICAgICAgICAvLyAyLiDmn6XnnIvlhajpg6jlm77niYcKICAgICAgICAgICAgICAgICRzaGFyZUJ0bi5wYXJlbnQoJ3NlY3Rpb24nKS5uZXh0KCdidXR0b24nKS5jbGljaygpOwoKICAgICAgICAgICAgICAgIC8vIDMuIOWIneWni+WMliDlm77niYfmlbDph48sIOWbvueJh3VybAogICAgICAgICAgICAgICAgbGV0IHppcCA9IG5ldyBKU1ppcCgpOwogICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkZWQgPSAwOyAgICAgICAgICAgLy8g5LiL6L295a6M5oiQ5pWw6YePCiAgICAgICAgICAgICAgICBsZXQgbnVtID0gaWxsdXN0KCkucGFnZUNvdW50OyAvLyDkuIvovb3nm67moIfmlbDph48KICAgICAgICAgICAgICAgIGxldCB1cmwgPSBpbGx1c3QoKS51cmxzLm9yaWdpbmFsOwogICAgICAgICAgICAgICAgbGV0IGltZ1VybHMgPSBBcnJheShwYXJzZUludChudW0pKS5maWxsKCkKICAgICAgICAgICAgICAgICAgICAubWFwKCh2YWx1ZSwgaW5kZXgpID0+IHVybC5yZXBsYWNlKC9fcFxkXC4vLCBgX3Ake2luZGV4fS5gKSk7CgogICAgICAgICAgICAgICAgLy8gNC4g5Yid5aeL5YyWIOS4i+i9veaMiemSriwg5aSN5Yi25YiG5Lqr5oyJ6ZKu5bm25peL6L2sMTgw5bqmCiAgICAgICAgICAgICAgICBsZXQgJHppcEJ0biA9IGluaXREb3dubG9hZEJ0bih7CiAgICAgICAgICAgICAgICAgICAgJHNoYXJlQnV0dG9uQ29udGFpbmVyOiAkc2hhcmVCdG4sCiAgICAgICAgICAgICAgICAgICAgaWQ6ICdhaGFvLWRvd25sb2FkLXppcCcsCiAgICAgICAgICAgICAgICAgICAgdGV4dDogYCR7aTE4bignZG93bmxvYWQnKX1gLAogICAgICAgICAgICAgICAgICAgIGNsaWNrRnVuOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuMS4g5LiL6L295Zu+54mHLCBodHRwczovL3dpa2kuZ3JlYXNlc3BvdC5uZXQvR00ueG1sSHR0cFJlcXVlc3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYoJCh0aGlzKS5hdHRyKCdzdGFydCcpICE9PSAndHJ1ZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cignc3RhcnQnLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChpbWdVcmxzLCBmdW5jdGlvbiAoaW5kZXgsIHVybCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdNLnhtbEh0dHBSZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywgdXJsOiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtyZWZlcmVyOiAnaHR0cHM6Ly93d3cucGl4aXYubmV0Lyd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZU1pbWVUeXBlOiAndGV4dC9wbGFpbjsgY2hhcnNldD14LXVzZXItZGVmaW5lZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24gKHhocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNC4xLiDovazkuLpibG9i57G75Z6LCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgciA9IHhoci5yZXNwb25zZVRleHQsIGRhdGEgPSBuZXcgVWludDhBcnJheShyLmxlbmd0aCksIGkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCByLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaV0gPSByLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1ZmZpeCA9IHVybC5zcGxpdCgnLicpLnNwbGljZSgtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwge3R5cGU6IG1pbWVUeXBlKHN1ZmZpeCl9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0LjIuIOWOi+e8qeWbvueJhwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR00uZ2V0VmFsdWUoR01rZXlzLmRvd25sb2FkTmFtZSwgYHtwaWR9YCkudGhlbihuYW1lID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXAuZmlsZShgJHtnZXREb3dubG9hZE5hbWUobmFtZSl9XyR7aW5kZXh9LiR7c3VmZml4fWAsIGJsb2IsIHtiaW5hcnk6IHRydWV9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0LjMuIOaJi+WKqHN5bmMsIOmBv+WFjeS4i+i9veS4jeWujOWFqOeahOaDheWGtQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRlZCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHppcEJ0bi5maW5kKCdwJykuaHRtbChgJHtpMThuKCdkb3dubG9hZCcpfSR7ZG93bmxvYWRlZH0vJHtudW19YCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvLyAzLjIuIOaJi+WKqHN5bmMsIOmBv+WFjeS4i+i9veS4jeWujOWFqAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG93bmxvYWRlZCA8IG51bSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoaTE4bignZG93bmxvYWRfd2FpdCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyAzLjMuIOS9v+eUqGpzemlwLmpz5ZKMRmlsZVNhdmVyLmpz5Y6L57yp5bm25LiL6L295Zu+54mHCiAgICAgICAgICAgICAgICAgICAgICAgIEdNLmdldFZhbHVlKEdNa2V5cy5kb3dubG9hZE5hbWUsIGB7cGlkfWApLnRoZW4obmFtZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXAuZ2VuZXJhdGVBc3luYyh7dHlwZTogJ2Jsb2InLCBiYXNlNjQ6IHRydWV9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGNvbnRlbnQgPT4gc2F2ZUFzKGNvbnRlbnQsIGdldERvd25sb2FkTmFtZShuYW1lKSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyA0LiDmjqfliLbmmK/lkKbpooTkuIvovb0sIOmBv+WFjeWkmuS4qumhtemdouWvvOiHtOeIhuWGheWtmAogICAgICAgICAgICAgICAgR00uZ2V0VmFsdWUoR01rZXlzLnN3aXRjaEltZ1ByZWxvYWQsIHRydWUpLnRoZW4ob3BlbiA9PiB7IGlmKG9wZW4pIHsgJHppcEJ0bi5maW5kKCdidXR0b24nKS5jbGljaygpOyB9IH0pOwoKICAgICAgICAgICAgICAgIC8vIDUuIOWPlua2iOebkeWQrAogICAgICAgICAgICAgICAgR00uZ2V0VmFsdWUoR01rZXlzLk1PLCB0cnVlKS50aGVuKGZ1bmN0aW9uICh2KSB7IGlmKCF2KSBvYnNlcnZlci5kaXNjb25uZWN0KCk7IH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9KSgpOwoKICAgIC8vIDUuIOWcqOeUu+W4iOmhtemdouWSjOS9nOWTgemhtemdouaYvuekuueUu+W4iGlk44CB55S75biI6IOM5pmv5Zu+LCDnlKjmiLflpLTlg4/lhYHorrjlj7PplK7kv53lrZgKICAgIG9ic2VydmVyRmFjdG9yeShmdW5jdGlvbiAobXV0YXRpb25zLCBvYnNlcnZlcikgewogICAgICAgIGlmICghaXNNZW1iZXJJbmRleFBhZ2UoKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgbGV0IG11dGF0aW9uID0gbXV0YXRpb25zW2ldOwogICAgICAgICAgICAvLyAxLiDliKTmlq3mmK/lkKbmlLnlj5joioLngrksIOaIluiAheaYr+WQpuaciVtzZWN0aW9uXeiKgueCuQogICAgICAgICAgICBsZXQgJHRhcmdldCA9ICQobXV0YXRpb24udGFyZ2V0KSwgZXh0ZXJuYWxMaW5rc0NvbnRhaW5lciA9ICdfMkFPdGZsOSc7IC8vIOWkmuS4quWPjea3t+a3hmV4dGVybmFsTGlua3NDb250YWluZXIKICAgICAgICAgICAgbGV0ICRyb3cgPSAkKGB1bC4ke2V4dGVybmFsTGlua3NDb250YWluZXJ9YCkucGFyZW50KCk7CiAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlICE9PSAnY2hpbGRMaXN0JyB8fCAkcm93Lmxlbmd0aCA8PSAwIHx8ICQoJ2JvZHknKS5maW5kKCcjdWlkJykubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gMS4g5re75Yqg5paw55qE5LiA6KGM55qEZGl2CiAgICAgICAgICAgIGxldCAkYWhhb1JvdyA9ICRyb3cuY2xvbmUoKSwgJHVsID0gJGFoYW9Sb3cuY2hpbGRyZW4oJ3VsJyk7CiAgICAgICAgICAgICRhaGFvUm93LmNoaWxkcmVuKCc6bm90KHVsKScpLnJlbW92ZSgpOwogICAgICAgICAgICAkdWwuZW1wdHkoKTsKICAgICAgICAgICAgJHJvdy5iZWZvcmUoJGFoYW9Sb3cpOwoKICAgICAgICAgICAgLy8gMi4g5pi+56S655S75biIaWQsIOeCueWHu+iHquWKqOWkjeWItuWIsOWJqui0tOadvwogICAgICAgICAgICBsZXQgdWlkID0gZ2V0VWlkKCk7CiAgICAgICAgICAgIGxldCAkdWlkID0gJChgPGxpIGlkPSJ1aWQiPjxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogMjBweDtmb250LXdlaWdodDogNzAwO2NvbG9yOiAjMzMzO21hcmdpbi1yaWdodDogOHB4O2xpbmUtaGVpZ2h0OiAxIj5VSUQ6JHt1aWR9PC9kaXY+PC9saT5gKQogICAgICAgICAgICAgICAgLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLmh0bWwoYDxzcGFuPlVJRCR7aTE4bignY29weV90b19jbGlwYm9hcmQnKX08L3NwYW4+YCk7CiAgICAgICAgICAgICAgICAgICAgR00uc2V0Q2xpcGJvYXJkKHVpZCk7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmh0bWwoYDxzcGFuPlVJRCR7dWlkfTwvc3Bhbj5gKTsKICAgICAgICAgICAgICAgICAgICB9LCAyMDAwKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkdWwuYXBwZW5kKCR1aWQpOwoKICAgICAgICAgICAgLy8gMy4g5pi+56S655S75biI6IOM5pmv5Zu+CiAgICAgICAgICAgIGxldCBiYWNrZ3JvdW5kID0gcHJlbG9hZERhdGEudXNlclt1aWRdLmJhY2tncm91bmQ7CiAgICAgICAgICAgIGxldCB1cmwgPSAoYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLnVybCkgfHwgJyc7CiAgICAgICAgICAgIGxldCAkYmdsaSA9ICQoJzxsaT48ZGl2IHN0eWxlPSJmb250LXNpemU6IDIwcHg7Zm9udC13ZWlnaHQ6IDcwMDtjb2xvcjogIzMzMzttYXJnaW4tcmlnaHQ6IDhweDtsaW5lLWhlaWdodDogMSI+PC9kaXY+PC9saT4nKSwKICAgICAgICAgICAgICAgICRiZyA9ICRiZ2xpLmZpbmQoJ2RpdicpOwogICAgICAgICAgICBpZiAoISF1cmwgJiYgdXJsICE9PSAnbm9uZScpIHsKICAgICAgICAgICAgICAgICRiZy5hcHBlbmQoYDxpbWcgc3JjPSIke3VybH0iIHdpZHRoPSIzMHB4Ij48YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iJHt1cmx9Ij4ke2kxOG4oJ2JhY2tncm91bmQnKX08L2E+YCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkYmcuYXBwZW5kKGA8c3Bhbj4ke2kxOG4oJ2JhY2tncm91bmRfbm90X2ZvdW5kJyl9PC9zcGFuPmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR1bC5hcHBlbmQoJGJnbGkpOwoKICAgICAgICAgICAgLy8gNC4g5Y+W5raI55uR5ZCsCiAgICAgICAgICAgIEdNLmdldFZhbHVlKEdNa2V5cy5NTywgdHJ1ZSkudGhlbihmdW5jdGlvbiAodikgeyBpZighdikgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyB9KTsKICAgICAgICB9CiAgICB9KTsgLy8g55S75biI6aG16Z2iVUkKICAgIG9ic2VydmVyRmFjdG9yeShmdW5jdGlvbiAobXV0YXRpb25zLCBvYnNlcnZlcikgewogICAgICAgIGlmICghaXNBcnR3b3JrUGFnZSgpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtdXRhdGlvbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgbGV0IG11dGF0aW9uID0gbXV0YXRpb25zW2ldOwogICAgICAgICAgICAvLyAxLiDliKTmlq3mmK/lkKbmlLnlj5joioLngrksIOaIluiAheaYr+WQpuaciVtzZWN0aW9uXeiKgueCuQogICAgICAgICAgICBsZXQgJGFzaWRlID0gJChtdXRhdGlvbi50YXJnZXQpLnBhcmVudCgpLmZpbmQoJ21haW4nKS5uZXh0KCdhc2lkZScpOwogICAgICAgICAgICBpZiAobXV0YXRpb24udHlwZSAhPT0gJ2NoaWxkTGlzdCcgfHwgJGFzaWRlLmxlbmd0aCA8PSAwKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGV0ICRyb3cgPSAkYXNpZGUuZmluZCgnc2VjdGlvbjpmaXJzdCcpLmZpbmQoJ2gyJyk7CiAgICAgICAgICAgIGlmICgkcm93Lmxlbmd0aCA8PSAwIHx8ICRhc2lkZS5maW5kKCcjYWhhby1iYWNrZ3JvdW5kJykubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIDIuIOaYvuekuueUu+W4iOiDjOaZr+WbvgogICAgICAgICAgICBsZXQgdWlkID0gZ2V0VWlkKCk7CiAgICAgICAgICAgIGxldCBiYWNrZ3JvdW5kID0gcHJlbG9hZERhdGEudXNlclt1aWRdLmJhY2tncm91bmQ7CiAgICAgICAgICAgIGxldCB1cmwgPSAoYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLnVybCkgfHwgJyc7CiAgICAgICAgICAgIGxldCAkYmdEaXYgPSAkcm93LmNsb25lKCkuYXR0cignaWQnLCAnYWhhby1iYWNrZ3JvdW5kJyk7CiAgICAgICAgICAgICRiZ0Rpdi5jaGlsZHJlbignYScpLnJlbW92ZSgpOwogICAgICAgICAgICAkYmdEaXYuY2hpbGRyZW4oJ2RpdicpLmNoaWxkcmVuKCdkaXYnKS5yZW1vdmUoKTsKICAgICAgICAgICAgJGJnRGl2LnByZXBlbmQoYDxpbWcgc3JjPSIke3VybH0iIHdpZHRoPSIxMCUiLz5gKTsKICAgICAgICAgICAgJGJnRGl2LmZpbmQoJ2RpdiBhJykuYXR0cignaHJlZicsICEhdXJsID8gdXJsIDogJ2phdmFzY3JpcHQ6dm9pZCgwKScpLmF0dHIoJ3RhcmdldCcsICdfYmxhbmsnKQogICAgICAgICAgICAgICAgLnRleHQoISF1cmwgPyBpMThuKCdiYWNrZ3JvdW5kJykgOiBpMThuKCdiYWNrZ3JvdW5kX25vdF9mb3VuZCcpKTsKICAgICAgICAgICAgJHJvdy5hZnRlcigkYmdEaXYpOwoKICAgICAgICAgICAgLy8gMy4g5pi+56S655S75biIaWQsIOeCueWHu+iHquWKqOWkjeWItuWIsOWJqui0tOadvwogICAgICAgICAgICBsZXQgJHVpZCA9ICRyb3cuY2xvbmUoKTsKICAgICAgICAgICAgJHVpZC5jaGlsZHJlbignYScpLnJlbW92ZSgpOwogICAgICAgICAgICAkdWlkLmNoaWxkcmVuKCdkaXYnKS5jaGlsZHJlbignZGl2JykucmVtb3ZlKCk7CiAgICAgICAgICAgICR1aWQuZmluZCgnYScpLmF0dHIoJ2hyZWYnLCAnamF2YXNjcmlwdDp2b2lkKDApJykuYXR0cignaWQnLCAnYWhhby11aWQnKS50ZXh0KCdVSUQ6ICcgKyB1aWQpOwogICAgICAgICAgICAkdWlkLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGxldCAkdGhpcyA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAkdGhpcy5maW5kKCdhJykudGV4dCgnVUlEJyArIGkxOG4oJ2NvcHlfdG9fY2xpcGJvYXJkJykpOwogICAgICAgICAgICAgICAgR00uc2V0Q2xpcGJvYXJkKHVpZCk7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy5maW5kKCdhJykudGV4dCgnVUlEOiAnICsgdWlkKTsKICAgICAgICAgICAgICAgIH0sIDIwMDApOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJGJnRGl2LmFmdGVyKCR1aWQpOwoKICAgICAgICAgICAgLy8gNC4g5Y+W5raI55uR5ZCsCiAgICAgICAgICAgIEdNLmdldFZhbHVlKEdNa2V5cy5NTywgdHJ1ZSkudGhlbihmdW5jdGlvbiAodikgeyBpZighdikgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyB9KTsKICAgICAgICB9CiAgICB9KTsgLy8g5L2c5ZOB6aG16Z2iVUkKICAgIC8vIOino+mZpCDnlKjmiLflpLTlg48g55qEYmFja2dyb3VuZCDpmZDliLYsIOaWueS+v+S/neWtmOeUqOaIt+WktOWDjwogICAgb2JzZXJ2ZXJGYWN0b3J5KGZ1bmN0aW9uIChtdXRhdGlvbnMsIG9ic2VydmVyKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG11dGF0aW9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBsZXQgbXV0YXRpb24gPSBtdXRhdGlvbnNbaV07CiAgICAgICAgICAgIC8vIDEuIOWIpOaWreaYr+WQpuaUueWPmOiKgueCuQogICAgICAgICAgICBpZiAobXV0YXRpb24udHlwZSAhPT0gJ2NoaWxkTGlzdCcpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAyLiDlsIbkvZzogIXlpLTlg4/nlLEgYmFja2dyb3VuZCDovazkuLogPGltZz4KICAgICAgICAgICAgbGV0ICR0YXJnZXQgPSAkKG11dGF0aW9uLnRhcmdldCk7CiAgICAgICAgICAgICR0YXJnZXQuZmluZCgnZGl2W3JvbGU9ImltZyJdJykuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgbGV0IHRhZ05hbWUgPSAkdGhpcy5wcm9wKCd0YWdOYW1lJyk7CgogICAgICAgICAgICAgICAgbGV0IGltZ1VybCA9ICR0aGlzLmdldEJhY2tncm91bmRVcmwoKTsKICAgICAgICAgICAgICAgIGlmICghaW1nVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxldCAkdXNlckltZyA9ICQoJzxpbWcgY2xhc3M9ImFoYW8tdXNlci1pbWciIHNyYz0iIi8+JykuYXR0cignc3JjJywgaW1nVXJsKTsKICAgICAgICAgICAgICAgICR1c2VySW1nLmNzcygnd2lkdGgnLCAkdGhpcy5jc3MoJ3dpZHRoJykpCiAgICAgICAgICAgICAgICAgICAgLmNzcygnaGVpZ2h0JywgJHRoaXMuY3NzKCdoZWlnaHQnKSk7CgogICAgICAgICAgICAgICAgLy8gaWYodGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYScpIHsKICAgICAgICAgICAgICAgIC8vICAgICAkdGhpcy5odG1sKCR1c2VySW1nKTsKICAgICAgICAgICAgICAgIC8vICAgICAkdGhpcy5jc3MoJ2JhY2tncm91bmQtaW1hZ2UnLCAnJyk7CiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgLy8gfQoKICAgICAgICAgICAgICAgIGlmICh0YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkaXYnKSB7CiAgICAgICAgICAgICAgICAgICAgJHVzZXJJbWcuYXR0cignY2xhc3MnLCAkdGhpcy5hdHRyKCdjbGFzcycpKTsKICAgICAgICAgICAgICAgICAgICAkdXNlckltZy5odG1sKCR0aGlzLmh0bWwoKSk7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMucmVwbGFjZVdpdGgoKCkgPT4gJHVzZXJJbWcpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyAzLiDlsIbor4TorrrlpLTlg4/nlLEgYmFja2dyb3VuZCDovazkuLogPGltZz4KICAgICAgICAgICAgJHRhcmdldC5maW5kKCdhW2RhdGEtdXNlcl9pZF1bZGF0YS1zcmNdJykuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpLCAkZGl2ID0gJHRoaXMuZmluZCgnZGl2JyksCiAgICAgICAgICAgICAgICAgICAgJGltZyA9ICQoJzxpbWcvPicpOwogICAgICAgICAgICAgICAgJGltZy5hdHRyKCdzcmMnLCAkdGhpcy5hdHRyKCdkYXRhLXNyYycpKTsKICAgICAgICAgICAgICAgIGlmICghISRkaXYubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgJGltZy5hdHRyKCdjbGFzcycsICRkaXYuYXR0cignY2xhc3MnKSkKICAgICAgICAgICAgICAgICAgICAgICAgLmNzcygnd2lkdGgnLCAkZGl2LmNzcygnd2lkdGgnKSkKICAgICAgICAgICAgICAgICAgICAgICAgLmNzcygnaGVpZ2h0JywgJGRpdi5jc3MoJ2hlaWdodCcpKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy5odG1sKCRpbWcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyA2LiDoh6rliqjliqDovb3or4TorroKICAgIEdNLmdldFZhbHVlKEdNa2V5cy5zd2l0Y2hDb21tZW50LCB0cnVlKS50aGVuKG9wZW4gPT4gewogICAgICAgIGlmKCFvcGVuIHx8ICFpc0FydHdvcmtQYWdlKCkpewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBtb3JlQ29tbWVudFNlbGVjdG9yID0gJy5fMUhvbTBxTic7CiAgICAgICAgbGV0IG1vcmVSZXBsYXlTZWxlY3RvciA9ICcuXzI4elIxTVEnOwogICAgICAgIG9ic2VydmVyRmFjdG9yeShmdW5jdGlvbiAobXV0YXRpb25zLCBvYnNlcnZlcikgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbXV0YXRpb25zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBsZXQgbXV0YXRpb24gPSBtdXRhdGlvbnNbaV07CiAgICAgICAgICAgICAgICAvLyAxLiDliKTmlq3mmK/lkKbmlLnlj5joioLngrkKICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlICE9PSAnY2hpbGRMaXN0JykgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gMi4g5qih5ouf54K55Ye75Yqg6L295oyJ6ZKuCiAgICAgICAgICAgICAgICBsZXQgJG1vcmVDb21tZW50QnRuID0gJChtdXRhdGlvbi50YXJnZXQpLmZpbmQobW9yZUNvbW1lbnRTZWxlY3Rvcik7CiAgICAgICAgICAgICAgICAkbW9yZUNvbW1lbnRCdG4uY2xpY2soKTsKCiAgICAgICAgICAgICAgICBsZXQgJG1vcmVSZXBsYXlCdG4gPSAkKG11dGF0aW9uLnRhcmdldCkuZmluZChtb3JlUmVwbGF5U2VsZWN0b3IpOwogICAgICAgICAgICAgICAgJG1vcmVSZXBsYXlCdG4uY2xpY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSk7CgogICAgLy8gNy4g5a+55Li76aG15Yqo5oCB5Lit55qE5Zu+54mH5qCH6K6w5L2c5ZOB57G75Z6LCiAgICAoZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghaXNNZW1iZXJEeW5hbWljUGFnZSgpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGxldCBpbGx1c3RUaXRsZVNlbGVjdG9yID0gJy5zdGFjY19yZWZfaWxsdXN0X3RpdGxlJzsKICAgICAgICBvYnNlcnZlckZhY3RvcnkoZnVuY3Rpb24gKG11dGF0aW9ucywgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG11dGF0aW9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgbGV0IG11dGF0aW9uID0gbXV0YXRpb25zW2ldOwogICAgICAgICAgICAgICAgLy8gMS4g5Yik5pat5piv5ZCm5pS55Y+Y6IqC54K5CiAgICAgICAgICAgICAgICBsZXQgJHRpdGxlID0gJChtdXRhdGlvbi50YXJnZXQpLmZpbmQoaWxsdXN0VGl0bGVTZWxlY3Rvcik7CiAgICAgICAgICAgICAgICBpZiAobXV0YXRpb24udHlwZSAhPT0gJ2NoaWxkTGlzdCcgfHwgISR0aXRsZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdGl0bGUuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0ICRhID0gJCh0aGlzKS5maW5kKCdhJyk7CiAgICAgICAgICAgICAgICAgICAgLy8gMS4g5bey57uP5re75Yqg6L+H5qCH6K6w55qE5bCx5LiN5YaN5re75YqgCiAgICAgICAgICAgICAgICAgICAgaWYgKCEhJGEuYXR0cignYWhhby1pbGx1c3QtaWQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIDIuIOiOt+WPlnBpZCwg6K6+572u5qCH6K6w6YG/5YWN5LqM5qyh55Sf5oiQCiAgICAgICAgICAgICAgICAgICAgbGV0IGlsbHVzdElkID0gbmV3IFVSTChsb2NhdGlvbi5vcmlnaW4gKyAnLycgKyAkYS5hdHRyKCdocmVmJykpLnNlYXJjaFBhcmFtcy5nZXQoJ2lsbHVzdF9pZCcpOwogICAgICAgICAgICAgICAgICAgICRhLmF0dHIoJ2FoYW8taWxsdXN0LWlkJywgaWxsdXN0SWQpOwogICAgICAgICAgICAgICAgICAgIC8vIDMuIOiwg+eUqOWumOaWuWFwaSwg5Yik5pat5L2c5ZOB57G75Z6LCiAgICAgICAgICAgICAgICAgICAgJC5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnL2FqYXgvaWxsdXN0LycgKyBpbGx1c3RJZCwgZGF0YVR5cGU6ICdqc29uJywKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogcmVzcG9uc2UgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlsbHVzdFR5cGUgPSBwYXJzZUludChyZXNwb25zZS5ib2R5LmlsbHVzdFR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzTXVsdGlQaWMgPSBwYXJzZUludChyZXNwb25zZS5ib2R5LnBhZ2VDb3VudCkgPiAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpbGx1c3RUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGEuYWZ0ZXIoJzxwPicgKyAoaXNNdWx0aVBpYyA/IGkxOG4oJ2lsbHVzdF90eXBlX211bHRpcGxlJykgOiBpMThuKCdpbGx1c3RfdHlwZV9zaW5nbGUnKSkgKyAnPC9wPicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRhLmFmdGVyKCc8cD4nICsgaTE4bignaWxsdXN0X3R5cGVfZ2lmJykgKyAnPC9wPicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSkoKTsKCiAgICAvLyA4LiDlr7lqdW1wLnBocOWPlua2iOmHjeWumuWQkQogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICBsZXQganVtcFNlbGVjdG9yID0gJ2FbaHJlZio9Imp1bXAucGhwIl0nOwoKICAgICAgICBvYnNlcnZlckZhY3RvcnkoZnVuY3Rpb24gKG11dGF0aW9ucywgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG11dGF0aW9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgbGV0IG11dGF0aW9uID0gbXV0YXRpb25zW2ldOwogICAgICAgICAgICAgICAgLy8gMS4g5Yik5pat5piv5ZCm5pS55Y+Y6IqC54K5CiAgICAgICAgICAgICAgICBpZiAobXV0YXRpb24udHlwZSAhPT0gJ2NoaWxkTGlzdCcpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIDIuIOS/ruaUuWhyZWYKICAgICAgICAgICAgICAgIGxldCAkanVtcCA9ICQobXV0YXRpb24udGFyZ2V0KS5maW5kKGp1bXBTZWxlY3Rvcik7CiAgICAgICAgICAgICAgICAkanVtcC5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpLCB1cmwgPSAkdGhpcy5hdHRyKCdocmVmJykubWF0Y2goL2p1bXBcLnBocFw/KHVybD0pPyguKikkLylbMl07CiAgICAgICAgICAgICAgICAgICAgJHRoaXMuYXR0cignaHJlZicsIGRlY29kZVVSSUNvbXBvbmVudCh1cmwpKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9KSgpOwoKICAgIC8vIDkuIOWNlemhteaOkuW6jwogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoIWlzU2VhcmNoUGFnZSgpIHx8IHRydWUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyA5LjEuIOeUn+aIkOaMieaUtuiXj+aVsOaOkuW6j+eahOaMiemSrgogICAgICAgIG9ic2VydmVyRmFjdG9yeShmdW5jdGlvbiAobXV0YXRpb25zLCBvYnNlcnZlcikgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbXV0YXRpb25zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBsZXQgbXV0YXRpb24gPSBtdXRhdGlvbnNbaV07CiAgICAgICAgICAgICAgICAvLyAxLiDliKTmlq3mmK/lkKbmlLnlj5joioLngrkKICAgICAgICAgICAgICAgIGxldCAkc2VjdGlvbiA9ICQoJ3NlY3Rpb24nKTsKICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlICE9PSAnY2hpbGRMaXN0JyB8fCAkc2VjdGlvbi5sZW5ndGggPD0gMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0ICRkaXYgPSAkc2VjdGlvbi5wcmV2KCkuZmluZCgnZGl2JykuZXEoMCk7CgogICAgICAgICAgICAgICAgLy8gMi4g5re75Yqg5oyJ5pS26JeP5pWw5o6S5bqP55qE5oyJ6ZKuCiAgICAgICAgICAgICAgICBsZXQgJHNvcnQgPSAkKGA8c3BhbiBjbGFzcz0ic2MtTHpMdkwiPiR7aTE4bignc29ydF9ieV9wb3B1bGFyaXR5Jyl9PC9zcGFuPmApOwogICAgICAgICAgICAgICAgJHNvcnQub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9ICEkKHRoaXMpLmhhc0NsYXNzKCdiTlB6UVgnKTsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgR00uc2V0VmFsdWUoR01rZXlzLnN3aXRjaE9yZGVyQnlQb3B1bGFyLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzb3J0LmF0dHIoJ2NsYXNzJywgJ3NjLUx6THZMIGJOUHpRWCcpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzb3J0LmF0dHIoJ2NsYXNzJywgJ3NjLUx6THZMIGxmQU1CYycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgJGRpdi5wcmVwZW5kKCRzb3J0KTsKICAgICAgICAgICAgICAgIEdNLmdldFZhbHVlKEdNa2V5cy5zd2l0Y2hPcmRlckJ5UG9wdWxhciwgdHJ1ZSkudGhlbih2YWx1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzb3J0LmF0dHIoJ2NsYXNzJywgJ3NjLUx6THZMIGJOUHpRWCcpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzb3J0LmF0dHIoJ2NsYXNzJywgJ3NjLUx6THZMIGxmQU1CYycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIDkuMi4g5oyJ5pS26JeP5pWw5o6S5bqPIC8vIFRPRE8g6aG16Z2i5rKh5pyJ5bGV56S65pS26JeP5pWwLCDlhbPpl63ljZXpobXmjpLluo8KICAgICAgICBvYnNlcnZlckZhY3RvcnkoZnVuY3Rpb24gKG11dGF0aW9ucywgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG11dGF0aW9ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgbGV0IG11dGF0aW9uID0gbXV0YXRpb25zW2ldOwogICAgICAgICAgICAgICAgLy8gMS4g5Yik5pat5piv5ZCm5pS55Y+Y6IqC54K5CiAgICAgICAgICAgICAgICBsZXQgJGRpdiA9ICQobXV0YXRpb24udGFyZ2V0KTsKICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlICE9PSAnY2hpbGRMaXN0JyB8fCAkZGl2LmZpbmQoJy5jb3VudC1saXN0JykubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIDIuIOiOt+WPluaJgOacieeahGl0ZW0sIOaOkuW6j+W5tuWhq+WFhQogICAgICAgICAgICAgICAgR00uZ2V0VmFsdWUoR01rZXlzLnN3aXRjaE9yZGVyQnlQb3B1bGFyLCB0cnVlKS50aGVuKHZhbHVlID0+IHsKICAgICAgICAgICAgICAgICAgICBpZighdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsZXQgJGNvbnRhaW5lciA9ICQoJ3NlY3Rpb24janMtcmVhY3Qtc2VhcmNoLW1pZCcpLmZpbmQoJ2RpdjpmaXJzdCcpOwogICAgICAgICAgICAgICAgICAgIGxldCAkbGlzdCA9ICRjb250YWluZXIuY2hpbGRyZW4oKTsKICAgICAgICAgICAgICAgICAgICBsZXQgZ2V0Q291bnQgPSAkID0+IHBhcnNlSW50KCQuZmluZCgndWwuY291bnQtbGlzdCBhJykudGV4dCgpKSB8fCAwOwogICAgICAgICAgICAgICAgICAgICRsaXN0LnNvcnQoKGEsIGIpID0+IGdldENvdW50KCQoYikpIC0gZ2V0Q291bnQoJChhKSkpOwogICAgICAgICAgICAgICAgICAgICRjb250YWluZXIuaHRtbCgkbGlzdCk7CgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm47IC8vIOacrOasoeWPmOabtOWPquaOkuW6j+S4gOasoQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9KSgpOwoKICAgIC8vIDEwLiDlhbzlrrnmqKHlvI/mo4DmtYvmmK/lkKZQSkFY5bm25Yi35paw6aG16Z2iLCBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDU4NTAzMS82MzM1OTI2CiAgICAoZnVuY3Rpb24oaGlzdG9yeSl7CiAgICAgICAgbGV0IHB1c2hTdGF0ZSA9IGhpc3RvcnkucHVzaFN0YXRlOwogICAgICAgIGhpc3RvcnkucHVzaFN0YXRlID0gZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBoaXN0b3J5Lm9ucHVzaHN0YXRlID09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAgIGhpc3Rvcnkub25wdXNoc3RhdGUoe3N0YXRlOiBzdGF0ZX0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEdNLmdldFZhbHVlKEdNa2V5cy5NTywgdHJ1ZSkudGhlbihmdW5jdGlvbiAoZW5hYmxlTU8pIHsKICAgICAgICAgICAgICAgIGlmKGVuYWJsZU1PKSB7IHJldHVybjsgfQogICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gcHVzaFN0YXRlLmFwcGx5KGhpc3RvcnksIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgIH0pKHdpbmRvdy5oaXN0b3J5KTsKCiAgICAvLyAxMS4g5o6n5Yi26Z2i5p2/CiAgICAoZnVuY3Rpb24gKCkgewogICAgICAgIGlmKCEvLitzZXR0aW5nX3VzZXJcLnBocC4qLy50ZXN0KGxvY2F0aW9uLmhyZWYpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGxldCAkdGFibGUgPSAkKGA8dGFibGUgc3R5bGU9IndpZHRoOiA3MDBweDsiPgogICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICA8dHI+PHRoIHdpZHRoPSIxODUiPlBpeGl25aKe5by66YWN572uPC90aD48dGQgd2lkdGg9IjUwMCI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iJHtHTWtleXMuTU99Ij7lhbzlrrlQSkFYKOaOqOiNkCk8L2xhYmVsPjxici8+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iJHtHTWtleXMuc3dpdGNoQ29tbWVudH0iPuiHquWKqOWKoOi9veivhOiuujwvbGFiZWw+PGJyLz4KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSIke0dNa2V5cy5zd2l0Y2hJbWdTaXplfSI+5pi+56S65Zu+54mH5bC65a+45aSn5bCPPC9sYWJlbD48YnIvPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IiR7R01rZXlzLnN3aXRjaEltZ1ByZWxvYWR9Ij7pooTkuIvovb1HaWbjgIFaaXAo6ICX5rWB6YePKTwvbGFiZWw+PGJyLz4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPuS4i+i9veaWh+S7tuWQjTogPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IiR7R01rZXlzLmRvd25sb2FkTmFtZX0iIHBsYWNlaG9sZGVyPSJ7cGlkfS17dWlkfS17cG5hbWV9LXt1bmFtZX0iPjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGE+5L+d5a2YPC9hPgogICAgICAgICAgICAgICAgICAgIDxhIG9uY2xpY2s9ImFsZXJ0KCd7cGlkfeaYr+S9nOWTgWlkLS0tLS0tLS17dWlkfeaYr+eUu+W4iGlkXFxue3BuYW1lfeaYr+S9nOWTgeWQjS0tLS0tLS0te3VuYW1lfeaYr+eUu+W4iOWQjVxcbuazqOaEjywg5aSa5Zu+5oOF5Ya15LiLLCDkvJroh6rliqjloavlhYVpbmRleOe0ouW8lee8luWPt1xcbuebruWJjeWPquaUr+aMgUdJRuWSjOWkmuWbvueahOmHjeWRveWQjScpOyI+6K+05piOPC9hPgogICAgICAgICAgICAgICAgPC90ZD48L3RyPgogICAgICAgICAgICA8L3Rib2R5PgogICAgICAgIDwvdGFibGU+YCk7CiAgICAgICAgJCgnLnNldHRpbmdDb250ZW50IHRhYmxlOmZpcnN0JykuYWZ0ZXIoJHRhYmxlKTsKCiAgICAgICAgJHRhYmxlLmZpbmQoJ2lucHV0W3R5cGU9ImNoZWNrYm94Il0nKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbGV0ICRjaGVja2JveCA9ICQodGhpcyksIG5hbWUgPSAkY2hlY2tib3guYXR0cignbmFtZScpOwogICAgICAgICAgICBHTS5nZXRWYWx1ZShuYW1lLCB0cnVlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkgeyAkY2hlY2tib3gucHJvcCgnY2hlY2tlZCcsIHZhbHVlKTsgfSk7CiAgICAgICAgICAgICRjaGVja2JveC5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgbGV0IGNoZWNrZWQgPSAkY2hlY2tib3gucHJvcCgnY2hlY2tlZCcpOwogICAgICAgICAgICAgICAgJGNoZWNrYm94LnByb3AoY2hlY2tlZCwgY2hlY2tlZCk7CiAgICAgICAgICAgICAgICBHTS5zZXRWYWx1ZShuYW1lLCBjaGVja2VkKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgJHRhYmxlLmZpbmQoJ2lucHV0W3R5cGU9InRleHQiXScpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICBsZXQgJGlucHV0ID0gJCh0aGlzKSwgbmFtZSA9ICRpbnB1dC5hdHRyKCduYW1lJyk7CiAgICAgICAgICAgIEdNLmdldFZhbHVlKG5hbWUpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7ICRpbnB1dC52YWwodmFsdWUpOyB9KTsKICAgICAgICAgICAgJGlucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBHTS5zZXRWYWx1ZShuYW1lLCAkaW5wdXQudmFsKCkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0pKCk7CgogICAgLy9UT0RPIOWinuW8uuaWsOmhtemdomZhbmJveCBodHRwczovL3d3dy5waXhpdi5uZXQvZmFuYm94L2NyZWF0b3IvMjI5MjY2NjE/dXRtX2NhbXBhaWduPXd3d19wcm9maWxlJnV0bV9tZWRpdW09c2l0ZV9mbG93JnV0bV9zb3VyY2U9cGl4aXYKICAgIC8vVE9ETyDml6Xor63ljJYKICAgIC8vVE9ETyDmkJzntKLmoYZ1aea3t+S5sSBodHRwczovL3d3dy5waXhpdi5uZXQvbWVtYmVyX2lsbHVzdC5waHA/bW9kZT1tZWRpdW0maWxsdXN0X2lkPTg5OTY1Nwp9KTsK","requires":[{"meta":{"name":"jquery.min.js","url":"https://cdn.bootcdn.net/ajax/libs/jquery/2.2.4/jquery.min.js","ts":1648813516481,"mimetype":"text/javascript"},"source":"LyohIGpRdWVyeSB2Mi4yLjQgfCAoYykgalF1ZXJ5IEZvdW5kYXRpb24gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9YS5kb2N1bWVudCxlPWMuc2xpY2UsZj1jLmNvbmNhdCxnPWMucHVzaCxoPWMuaW5kZXhPZixpPXt9LGo9aS50b1N0cmluZyxrPWkuaGFzT3duUHJvcGVydHksbD17fSxtPSIyLjIuNCIsbj1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbi5mbi5pbml0KGEsYil9LG89L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLHA9L14tbXMtLyxxPS8tKFtcZGEtel0pL2dpLHI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTtuLmZuPW4ucHJvdG90eXBlPXtqcXVlcnk6bSxjb25zdHJ1Y3RvcjpuLHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTplLmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1uLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEpe3JldHVybiBuLmVhY2godGhpcyxhKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhuLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5sZW5ndGgsYz0rYSsoMD5hP2I6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGM+PTAmJmI+Yz9bdGhpc1tjXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6Zyxzb3J0OmMuc29ydCxzcGxpY2U6Yy5zcGxpY2V9LG4uZXh0ZW5kPW4uZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZSxmLGc9YXJndW1lbnRzWzBdfHx7fSxoPTEsaT1hcmd1bWVudHMubGVuZ3RoLGo9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksIm9iamVjdCI9PXR5cGVvZiBnfHxuLmlzRnVuY3Rpb24oZyl8fChnPXt9KSxoPT09aSYmKGc9dGhpcyxoLS0pO2k+aDtoKyspaWYobnVsbCE9KGE9YXJndW1lbnRzW2hdKSlmb3IoYiBpbiBhKWM9Z1tiXSxkPWFbYl0sZyE9PWQmJihqJiZkJiYobi5pc1BsYWluT2JqZWN0KGQpfHwoZT1uLmlzQXJyYXkoZCkpKT8oZT8oZT0hMSxmPWMmJm4uaXNBcnJheShjKT9jOltdKTpmPWMmJm4uaXNQbGFpbk9iamVjdChjKT9jOnt9LGdbYl09bi5leHRlbmQoaixmLGQpKTp2b2lkIDAhPT1kJiYoZ1tiXT1kKSk7cmV0dXJuIGd9LG4uZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhtK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKGEpfSxub29wOmZ1bmN0aW9uKCl7fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiJmdW5jdGlvbiI9PT1uLnR5cGUoYSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09PWEud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7dmFyIGI9YSYmYS50b1N0cmluZygpO3JldHVybiFuLmlzQXJyYXkoYSkmJmItcGFyc2VGbG9hdChiKSsxPj0wfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiO2lmKCJvYmplY3QiIT09bi50eXBlKGEpfHxhLm5vZGVUeXBlfHxuLmlzV2luZG93KGEpKXJldHVybiExO2lmKGEuY29uc3RydWN0b3ImJiFrLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIWsuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZXx8e30sImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMTtmb3IoYiBpbiBhKTtyZXR1cm4gdm9pZCAwPT09Ynx8ay5jYWxsKGEsYil9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7dmFyIGI7Zm9yKGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aVtqLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihhKXt2YXIgYixjPWV2YWw7YT1uLnRyaW0oYSksYSYmKDE9PT1hLmluZGV4T2YoInVzZSBzdHJpY3QiKT8oYj1kLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGIudGV4dD1hLGQuaGVhZC5hcHBlbmRDaGlsZChiKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpKTpjKGEpKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UocCwibXMtIikucmVwbGFjZShxLHIpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTA7aWYocyhhKSl7Zm9yKGM9YS5sZW5ndGg7Yz5kO2QrKylpZihiLmNhbGwoYVtkXSxkLGFbZF0pPT09ITEpYnJlYWt9ZWxzZSBmb3IoZCBpbiBhKWlmKGIuY2FsbChhW2RdLGQsYVtkXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShvLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihzKE9iamVjdChhKSk/bi5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zy5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsPT1iPy0xOmguY2FsbChiLGEsYyl9LG1lcmdlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPStiLmxlbmd0aCxkPTAsZT1hLmxlbmd0aDtjPmQ7ZCsrKWFbZSsrXT1iW2RdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGc9MCxoPVtdO2lmKHMoYSkpZm9yKGQ9YS5sZW5ndGg7ZD5nO2crKyllPWIoYVtnXSxnLGMpLG51bGwhPWUmJmgucHVzaChlKTtlbHNlIGZvcihnIGluIGEpZT1iKGFbZ10sZyxjKSxudWxsIT1lJiZoLnB1c2goZSk7cmV0dXJuIGYuYXBwbHkoW10saCl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihjPWFbYl0sYj1hLGE9Yyksbi5pc0Z1bmN0aW9uKGEpPyhkPWUuY2FsbChhcmd1bWVudHMsMiksZj1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsZC5jb25jYXQoZS5jYWxsKGFyZ3VtZW50cykpKX0sZi5ndWlkPWEuZ3VpZD1hLmd1aWR8fG4uZ3VpZCsrLGYpOnZvaWQgMH0sbm93OkRhdGUubm93LHN1cHBvcnQ6bH0pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihuLmZuW1N5bWJvbC5pdGVyYXRvcl09Y1tTeW1ib2wuaXRlcmF0b3JdKSxuLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7aVsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KTtmdW5jdGlvbiBzKGEpe3ZhciBiPSEhYSYmImxlbmd0aCJpbiBhJiZhLmxlbmd0aCxjPW4udHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iPT09Y3x8bi5pc1dpbmRvdyhhKT8hMToiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYX12YXIgdD1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1PSJzaXp6bGUiKzEqbmV3IERhdGUsdj1hLmRvY3VtZW50LHc9MCx4PTAseT1nYSgpLHo9Z2EoKSxBPWdhKCksQj1mdW5jdGlvbihhLGIpe3JldHVybiBhPT09YiYmKGw9ITApLDB9LEM9MTw8MzEsRD17fS5oYXNPd25Qcm9wZXJ0eSxFPVtdLEY9RS5wb3AsRz1FLnB1c2gsSD1FLnB1c2gsST1FLnNsaWNlLEo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspaWYoYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LEs9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixMPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixNPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsTj0iXFxbIitMKyIqKCIrTSsiKSg/OiIrTCsiKihbKl4kfCF+XT89KSIrTCsiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiK00rIikpfCkiK0wrIipcXF0iLE89IjooIitNKyIpKD86XFwoKCgnKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcIil8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IitOKyIpKil8LiopXFwpfCkiLFA9bmV3IFJlZ0V4cChMKyIrIiwiZyIpLFE9bmV3IFJlZ0V4cCgiXiIrTCsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitMKyIrJCIsImciKSxSPW5ldyBSZWdFeHAoIl4iK0wrIiosIitMKyIqIiksUz1uZXcgUmVnRXhwKCJeIitMKyIqKFs+K35dfCIrTCsiKSIrTCsiKiIpLFQ9bmV3IFJlZ0V4cCgiPSIrTCsiKihbXlxcXSdcIl0qPykiK0wrIipcXF0iLCJnIiksVT1uZXcgUmVnRXhwKE8pLFY9bmV3IFJlZ0V4cCgiXiIrTSsiJCIpLFc9e0lEOm5ldyBSZWdFeHAoIl4jKCIrTSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitNKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitNKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrTiksUFNFVURPOm5ldyBSZWdFeHAoIl4iK08pLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTCsiKig/OihbKy1dfCkiK0wrIiooXFxkKyl8KSkiK0wrIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0srIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitMKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK0wrIiooKD86LVxcZCk/XFxkKikiK0wrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFg9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxZPS9eaFxkJC9pLFo9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLCQ9L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxfPS9bK35dLyxhYT0vJ3xcXC9nLGJhPW5ldyBSZWdFeHAoIlxcXFwoW1xcZGEtZl17MSw2fSIrTCsiP3woIitMKyIpfC4pIiwiaWciKSxjYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9IjB4IitiLTY1NTM2O3JldHVybiBkIT09ZHx8Yz9iOjA+ZD9TdHJpbmcuZnJvbUNoYXJDb2RlKGQrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUoZD4+MTB8NTUyOTYsMTAyMyZkfDU2MzIwKX0sZGE9ZnVuY3Rpb24oKXttKCl9O3RyeXtILmFwcGx5KEU9SS5jYWxsKHYuY2hpbGROb2Rlcyksdi5jaGlsZE5vZGVzKSxFW3YuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKGVhKXtIPXthcHBseTpFLmxlbmd0aD9mdW5jdGlvbihhLGIpe0cuYXBwbHkoYSxJLmNhbGwoYikpfTpmdW5jdGlvbihhLGIpe3ZhciBjPWEubGVuZ3RoLGQ9MDt3aGlsZShhW2MrK109YltkKytdKTthLmxlbmd0aD1jLTF9fX1mdW5jdGlvbiBmYShhLGIsZCxlKXt2YXIgZixoLGosayxsLG8scixzLHc9YiYmYi5vd25lckRvY3VtZW50LHg9Yj9iLm5vZGVUeXBlOjk7aWYoZD1kfHxbXSwic3RyaW5nIiE9dHlwZW9mIGF8fCFhfHwxIT09eCYmOSE9PXgmJjExIT09eClyZXR1cm4gZDtpZighZSYmKChiP2Iub3duZXJEb2N1bWVudHx8Yjp2KSE9PW4mJm0oYiksYj1ifHxuLHApKXtpZigxMSE9PXgmJihvPSQuZXhlYyhhKSkpaWYoZj1vWzFdKXtpZig5PT09eCl7aWYoIShqPWIuZ2V0RWxlbWVudEJ5SWQoZikpKXJldHVybiBkO2lmKGouaWQ9PT1mKXJldHVybiBkLnB1c2goaiksZH1lbHNlIGlmKHcmJihqPXcuZ2V0RWxlbWVudEJ5SWQoZikpJiZ0KGIsaikmJmouaWQ9PT1mKXJldHVybiBkLnB1c2goaiksZH1lbHNle2lmKG9bMl0pcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChmPW9bM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gSC5hcHBseShkLGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShmKSksZH1pZihjLnFzYSYmIUFbYSsiICJdJiYoIXF8fCFxLnRlc3QoYSkpKXtpZigxIT09eCl3PWIscz1hO2Vsc2UgaWYoIm9iamVjdCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpeyhrPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9rPWsucmVwbGFjZShhYSwiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIsaz11KSxyPWcoYSksaD1yLmxlbmd0aCxsPVYudGVzdChrKT8iIyIrazoiW2lkPSciK2srIiddIjt3aGlsZShoLS0pcltoXT1sKyIgIitxYShyW2hdKTtzPXIuam9pbigiLCIpLHc9Xy50ZXN0KGEpJiZvYShiLnBhcmVudE5vZGUpfHxifWlmKHMpdHJ5e3JldHVybiBILmFwcGx5KGQsdy5xdWVyeVNlbGVjdG9yQWxsKHMpKSxkfWNhdGNoKHkpe31maW5hbGx5e2s9PT11JiZiLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBpKGEucmVwbGFjZShRLCIkMSIpLGIsZCxlKX1mdW5jdGlvbiBnYSgpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrIiAiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYysiICJdPWV9cmV0dXJuIGJ9ZnVuY3Rpb24gaGEoYSl7cmV0dXJuIGFbdV09ITAsYX1mdW5jdGlvbiBpYShhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4hIWEoYil9Y2F0Y2goYyl7cmV0dXJuITF9ZmluYWxseXtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGx9fWZ1bmN0aW9uIGphKGEsYil7dmFyIGM9YS5zcGxpdCgifCIpLGU9Yy5sZW5ndGg7d2hpbGUoZS0tKWQuYXR0ckhhbmRsZVtjW2VdXT1ifWZ1bmN0aW9uIGthKGEsYil7dmFyIGM9YiYmYSxkPWMmJjE9PT1hLm5vZGVUeXBlJiYxPT09Yi5ub2RlVHlwZSYmKH5iLnNvdXJjZUluZGV4fHxDKS0ofmEuc291cmNlSW5kZXh8fEMpO2lmKGQpcmV0dXJuIGQ7aWYoYyl3aGlsZShjPWMubmV4dFNpYmxpbmcpaWYoYz09PWIpcmV0dXJuLTE7cmV0dXJuIGE/MTotMX1mdW5jdGlvbiBsYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1jJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBtYShhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09Y3x8ImJ1dHRvbiI9PT1jKSYmYi50eXBlPT09YX19ZnVuY3Rpb24gbmEoYSl7cmV0dXJuIGhhKGZ1bmN0aW9uKGIpe3JldHVybiBiPStiLGhhKGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hKFtdLGMubGVuZ3RoLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWNbZT1mW2ddXSYmKGNbZV09IShkW2VdPWNbZV0pKX0pfSl9ZnVuY3Rpb24gb2EoYSl7cmV0dXJuIGEmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmYX1jPWZhLnN1cHBvcnQ9e30sZj1mYS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj1hJiYoYS5vd25lckRvY3VtZW50fHxhKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGI/IkhUTUwiIT09Yi5ub2RlTmFtZTohMX0sbT1mYS5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlLGc9YT9hLm93bmVyRG9jdW1lbnR8fGE6djtyZXR1cm4gZyE9PW4mJjk9PT1nLm5vZGVUeXBlJiZnLmRvY3VtZW50RWxlbWVudD8obj1nLG89bi5kb2N1bWVudEVsZW1lbnQscD0hZihuKSwoZT1uLmRlZmF1bHRWaWV3KSYmZS50b3AhPT1lJiYoZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixkYSwhMSk6ZS5hdHRhY2hFdmVudCYmZS5hdHRhY2hFdmVudCgib251bmxvYWQiLGRhKSksYy5hdHRyaWJ1dGVzPWlhKGZ1bmN0aW9uKGEpe3JldHVybiBhLmNsYXNzTmFtZT0iaSIsIWEuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLGMuZ2V0RWxlbWVudHNCeVRhZ05hbWU9aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQobi5jcmVhdGVDb21tZW50KCIiKSksIWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxjLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9Wi50ZXN0KG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksYy5nZXRCeUlkPWlhKGZ1bmN0aW9uKGEpe3JldHVybiBvLmFwcGVuZENoaWxkKGEpLmlkPXUsIW4uZ2V0RWxlbWVudHNCeU5hbWV8fCFuLmdldEVsZW1lbnRzQnlOYW1lKHUpLmxlbmd0aH0pLGMuZ2V0QnlJZD8oZC5maW5kLklEPWZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRCeUlkJiZwKXt2YXIgYz1iLmdldEVsZW1lbnRCeUlkKGEpO3JldHVybiBjP1tjXTpbXX19LGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShiYSxjYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaWQiKT09PWJ9fSk6KGRlbGV0ZSBkLmZpbmQuSUQsZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGJhLGNhKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUmJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYyYmYy52YWx1ZT09PWJ9fSksZC5maW5kLlRBRz1jLmdldEVsZW1lbnRzQnlUYWdOYW1lP2Z1bmN0aW9uKGEsYil7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSk6Yy5xc2E/Yi5xdWVyeVNlbGVjdG9yQWxsKGEpOnZvaWQgMH06ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9MCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSk7aWYoIioiPT09YSl7d2hpbGUoYz1mW2UrK10pMT09PWMubm9kZVR5cGUmJmQucHVzaChjKTtyZXR1cm4gZH1yZXR1cm4gZn0sZC5maW5kLkNMQVNTPWMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oYSxiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmcD9iLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoYSk6dm9pZCAwfSxyPVtdLHE9W10sKGMucXNhPVoudGVzdChuLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKGlhKGZ1bmN0aW9uKGEpe28uYXBwZW5kQ2hpbGQoYSkuaW5uZXJIVE1MPSI8YSBpZD0nIit1KyInPjwvYT48c2VsZWN0IGlkPSciK3UrIi1cclxcJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmcS5wdXNoKCJbKl4kXT0iK0wrIiooPzonJ3xcIlwiKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8cS5wdXNoKCJcXFsiK0wrIiooPzp2YWx1ZXwiK0srIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49Iit1KyItXSIpLmxlbmd0aHx8cS5wdXNoKCJ+PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHEucHVzaCgiOmNoZWNrZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIit1KyIrKiIpLmxlbmd0aHx8cS5wdXNoKCIuIy4rWyt+XSIpfSksaWEoZnVuY3Rpb24oYSl7dmFyIGI9bi5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Iuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmcS5wdXNoKCJuYW1lIitMKyIqWypeJHwhfl0/PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fHEucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxxLnB1c2goIiwuKjoiKX0pKSwoYy5tYXRjaGVzU2VsZWN0b3I9Wi50ZXN0KHM9by5tYXRjaGVzfHxvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8by5tb3pNYXRjaGVzU2VsZWN0b3J8fG8ub01hdGNoZXNTZWxlY3Rvcnx8by5tc01hdGNoZXNTZWxlY3RvcikpJiZpYShmdW5jdGlvbihhKXtjLmRpc2Nvbm5lY3RlZE1hdGNoPXMuY2FsbChhLCJkaXYiKSxzLmNhbGwoYSwiW3MhPScnXTp4Iiksci5wdXNoKCIhPSIsTyl9KSxxPXEubGVuZ3RoJiZuZXcgUmVnRXhwKHEuam9pbigifCIpKSxyPXIubGVuZ3RoJiZuZXcgUmVnRXhwKHIuam9pbigifCIpKSxiPVoudGVzdChvLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSx0PWJ8fFoudGVzdChvLmNvbnRhaW5zKT9mdW5jdGlvbihhLGIpe3ZhciBjPTk9PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEsZD1iJiZiLnBhcmVudE5vZGU7cmV0dXJuIGE9PT1kfHwhKCFkfHwxIT09ZC5ub2RlVHlwZXx8IShjLmNvbnRhaW5zP2MuY29udGFpbnMoZCk6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkKSkpfTpmdW5jdGlvbihhLGIpe2lmKGIpd2hpbGUoYj1iLnBhcmVudE5vZGUpaWYoYj09PWEpcmV0dXJuITA7cmV0dXJuITF9LEI9Yj9mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGQ9IWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIGQ/ZDooZD0oYS5vd25lckRvY3VtZW50fHxhKT09PShiLm93bmVyRG9jdW1lbnR8fGIpP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYik6MSwxJmR8fCFjLnNvcnREZXRhY2hlZCYmYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKT09PWQ/YT09PW58fGEub3duZXJEb2N1bWVudD09PXYmJnQodixhKT8tMTpiPT09bnx8Yi5vd25lckRvY3VtZW50PT09diYmdCh2LGIpPzE6az9KKGssYSktSihrLGIpOjA6NCZkPy0xOjEpfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGMsZD0wLGU9YS5wYXJlbnROb2RlLGY9Yi5wYXJlbnROb2RlLGc9W2FdLGg9W2JdO2lmKCFlfHwhZilyZXR1cm4gYT09PW4/LTE6Yj09PW4/MTplPy0xOmY/MTprP0ooayxhKS1KKGssYik6MDtpZihlPT09ZilyZXR1cm4ga2EoYSxiKTtjPWE7d2hpbGUoYz1jLnBhcmVudE5vZGUpZy51bnNoaWZ0KGMpO2M9Yjt3aGlsZShjPWMucGFyZW50Tm9kZSloLnVuc2hpZnQoYyk7d2hpbGUoZ1tkXT09PWhbZF0pZCsrO3JldHVybiBkP2thKGdbZF0saFtkXSk6Z1tkXT09PXY/LTE6aFtkXT09PXY/MTowfSxuKTpufSxmYS5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGZhKGEsbnVsbCxudWxsLGIpfSxmYS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksYj1iLnJlcGxhY2UoVCwiPSckMSddIiksYy5tYXRjaGVzU2VsZWN0b3ImJnAmJiFBW2IrIiAiXSYmKCFyfHwhci50ZXN0KGIpKSYmKCFxfHwhcS50ZXN0KGIpKSl0cnl7dmFyIGQ9cy5jYWxsKGEsYik7aWYoZHx8Yy5kaXNjb25uZWN0ZWRNYXRjaHx8YS5kb2N1bWVudCYmMTEhPT1hLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiBkfWNhdGNoKGUpe31yZXR1cm4gZmEoYixuLG51bGwsW2FdKS5sZW5ndGg+MH0sZmEuY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksdChhLGIpfSxmYS5hdHRyPWZ1bmN0aW9uKGEsYil7KGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpO3ZhciBlPWQuYXR0ckhhbmRsZVtiLnRvTG93ZXJDYXNlKCldLGY9ZSYmRC5jYWxsKGQuYXR0ckhhbmRsZSxiLnRvTG93ZXJDYXNlKCkpP2UoYSxiLCFwKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PWY/ZjpjLmF0dHJpYnV0ZXN8fCFwP2EuZ2V0QXR0cmlidXRlKGIpOihmPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmYuc3BlY2lmaWVkP2YudmFsdWU6bnVsbH0sZmEuZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2EpfSxmYS51bmlxdWVTb3J0PWZ1bmN0aW9uKGEpe3ZhciBiLGQ9W10sZT0wLGY9MDtpZihsPSFjLmRldGVjdER1cGxpY2F0ZXMsaz0hYy5zb3J0U3RhYmxlJiZhLnNsaWNlKDApLGEuc29ydChCKSxsKXt3aGlsZShiPWFbZisrXSliPT09YVtmXSYmKGU9ZC5wdXNoKGYpKTt3aGlsZShlLS0pYS5zcGxpY2UoZFtlXSwxKX1yZXR1cm4gaz1udWxsLGF9LGU9ZmEuZ2V0VGV4dD1mdW5jdGlvbihhKXt2YXIgYixjPSIiLGQ9MCxmPWEubm9kZVR5cGU7aWYoZil7aWYoMT09PWZ8fDk9PT1mfHwxMT09PWYpe2lmKCJzdHJpbmciPT10eXBlb2YgYS50ZXh0Q29udGVudClyZXR1cm4gYS50ZXh0Q29udGVudDtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpYys9ZShhKX1lbHNlIGlmKDM9PT1mfHw0PT09ZilyZXR1cm4gYS5ub2RlVmFsdWV9ZWxzZSB3aGlsZShiPWFbZCsrXSljKz1lKGIpO3JldHVybiBjfSxkPWZhLnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmhhLG1hdGNoOlcsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0ucmVwbGFjZShiYSxjYSksYVszXT0oYVszXXx8YVs0XXx8YVs1XXx8IiIpLnJlcGxhY2UoYmEsY2EpLCJ+PSI9PT1hWzJdJiYoYVszXT0iICIrYVszXSsiICIpLGEuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09YVsxXS5zbGljZSgwLDMpPyhhWzNdfHxmYS5lcnJvcihhWzBdKSxhWzRdPSsoYVs0XT9hWzVdKyhhWzZdfHwxKToyKigiZXZlbiI9PT1hWzNdfHwib2RkIj09PWFbM10pKSxhWzVdPSsoYVs3XSthWzhdfHwib2RkIj09PWFbM10pKTphWzNdJiZmYS5lcnJvcihhWzBdKSxhfSxQU0VVRE86ZnVuY3Rpb24oYSl7dmFyIGIsYz0hYVs2XSYmYVsyXTtyZXR1cm4gVy5DSElMRC50ZXN0KGFbMF0pP251bGw6KGFbM10/YVsyXT1hWzRdfHxhWzVdfHwiIjpjJiZVLnRlc3QoYykmJihiPWcoYywhMCkpJiYoYj1jLmluZGV4T2YoIikiLGMubGVuZ3RoLWIpLWMubGVuZ3RoKSYmKGFbMF09YVswXS5zbGljZSgwLGIpLGFbMl09Yy5zbGljZSgwLGIpKSxhLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGJhLGNhKS50b0xvd2VyQ2FzZSgpO3JldHVybiIqIj09PWE/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJ9fSxDTEFTUzpmdW5jdGlvbihhKXt2YXIgYj15W2ErIiAiXTtyZXR1cm4gYnx8KGI9bmV3IFJlZ0V4cCgiKF58IitMKyIpIithKyIoIitMKyJ8JCkiKSkmJnkoYSxmdW5jdGlvbihhKXtyZXR1cm4gYi50ZXN0KCJzdHJpbmciPT10eXBlb2YgYS5jbGFzc05hbWUmJmEuY2xhc3NOYW1lfHwidW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0QXR0cmlidXRlJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihkKXt2YXIgZT1mYS5hdHRyKGQsYSk7cmV0dXJuIG51bGw9PWU/IiE9Ij09PWI6Yj8oZSs9IiIsIj0iPT09Yj9lPT09YzoiIT0iPT09Yj9lIT09YzoiXj0iPT09Yj9jJiYwPT09ZS5pbmRleE9mKGMpOiIqPSI9PT1iP2MmJmUuaW5kZXhPZihjKT4tMToiJD0iPT09Yj9jJiZlLnNsaWNlKC1jLmxlbmd0aCk9PT1jOiJ+PSI9PT1iPygiICIrZS5yZXBsYWNlKFAsIiAiKSsiICIpLmluZGV4T2YoYyk+LTE6Inw9Ij09PWI/ZT09PWN8fGUuc2xpY2UoMCxjLmxlbmd0aCsxKT09PWMrIi0iOiExKTohMH19LENISUxEOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9Im50aCIhPT1hLnNsaWNlKDAsMyksZz0ibGFzdCIhPT1hLnNsaWNlKC00KSxoPSJvZi10eXBlIj09PWI7cmV0dXJuIDE9PT1kJiYwPT09ZT9mdW5jdGlvbihhKXtyZXR1cm4hIWEucGFyZW50Tm9kZX06ZnVuY3Rpb24oYixjLGkpe3ZhciBqLGssbCxtLG4sbyxwPWYhPT1nPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIscT1iLnBhcmVudE5vZGUscj1oJiZiLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkscz0haSYmIWgsdD0hMTtpZihxKXtpZihmKXt3aGlsZShwKXttPWI7d2hpbGUobT1tW3BdKWlmKGg/bS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bS5ub2RlVHlwZSlyZXR1cm4hMTtvPXA9Im9ubHkiPT09YSYmIW8mJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYobz1bZz9xLmZpcnN0Q2hpbGQ6cS5sYXN0Q2hpbGRdLGcmJnMpe209cSxsPW1bdV18fChtW3VdPXt9KSxrPWxbbS51bmlxdWVJRF18fChsW20udW5pcXVlSURdPXt9KSxqPWtbYV18fFtdLG49alswXT09PXcmJmpbMV0sdD1uJiZqWzJdLG09biYmcS5jaGlsZE5vZGVzW25dO3doaWxlKG09KytuJiZtJiZtW3BdfHwodD1uPTApfHxvLnBvcCgpKWlmKDE9PT1tLm5vZGVUeXBlJiYrK3QmJm09PT1iKXtrW2FdPVt3LG4sdF07YnJlYWt9fWVsc2UgaWYocyYmKG09YixsPW1bdV18fChtW3VdPXt9KSxrPWxbbS51bmlxdWVJRF18fChsW20udW5pcXVlSURdPXt9KSxqPWtbYV18fFtdLG49alswXT09PXcmJmpbMV0sdD1uKSx0PT09ITEpd2hpbGUobT0rK24mJm0mJm1bcF18fCh0PW49MCl8fG8ucG9wKCkpaWYoKGg/bS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bS5ub2RlVHlwZSkmJisrdCYmKHMmJihsPW1bdV18fChtW3VdPXt9KSxrPWxbbS51bmlxdWVJRF18fChsW20udW5pcXVlSURdPXt9KSxrW2FdPVt3LHRdKSxtPT09YikpYnJlYWs7cmV0dXJuIHQtPWUsdD09PWR8fHQlZD09PTAmJnQvZD49MH19fSxQU0VVRE86ZnVuY3Rpb24oYSxiKXt2YXIgYyxlPWQucHNldWRvc1thXXx8ZC5zZXRGaWx0ZXJzW2EudG9Mb3dlckNhc2UoKV18fGZhLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrYSk7cmV0dXJuIGVbdV0/ZShiKTplLmxlbmd0aD4xPyhjPVthLGEsIiIsYl0sZC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/aGEoZnVuY3Rpb24oYSxjKXt2YXIgZCxmPWUoYSxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSlkPUooYSxmW2ddKSxhW2RdPSEoY1tkXT1mW2ddKX0pOmZ1bmN0aW9uKGEpe3JldHVybiBlKGEsMCxjKX0pOmV9fSxwc2V1ZG9zOntub3Q6aGEoZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxkPWgoYS5yZXBsYWNlKFEsIiQxIikpO3JldHVybiBkW3VdP2hhKGZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmLGc9ZChhLG51bGwsZSxbXSksaD1hLmxlbmd0aDt3aGlsZShoLS0pKGY9Z1toXSkmJihhW2hdPSEoYltoXT1mKSl9KTpmdW5jdGlvbihhLGUsZil7cmV0dXJuIGJbMF09YSxkKGIsbnVsbCxmLGMpLGJbMF09bnVsbCwhYy5wb3AoKX19KSxoYXM6aGEoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBmYShhLGIpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmhhKGZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZShiYSxjYSksZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aGEoZnVuY3Rpb24oYSl7cmV0dXJuIFYudGVzdChhfHwiIil8fGZhLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKGJhLGNhKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGIpe3ZhciBjO2RvIGlmKGM9cD9iLmxhbmc6Yi5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGIuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIGM9Yy50b0xvd2VyQ2FzZSgpLGM9PT1hfHwwPT09Yy5pbmRleE9mKGErIi0iKTt3aGlsZSgoYj1iLnBhcmVudE5vZGUpJiYxPT09Yi5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGIpe3ZhciBjPWEubG9jYXRpb24mJmEubG9jYXRpb24uaGFzaDtyZXR1cm4gYyYmYy5zbGljZSgxKT09PWIuaWR9LHJvb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1vfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW4uYWN0aXZlRWxlbWVudCYmKCFuLmhhc0ZvY3VzfHxuLmhhc0ZvY3VzKCkpJiYhIShhLnR5cGV8fGEuaHJlZnx8fmEudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYhIWEuY2hlY2tlZHx8Im9wdGlvbiI9PT1iJiYhIWEuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGEuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oYSl7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWlmKGEubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiFkLnBzZXVkb3MuZW1wdHkoYSl9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4gWS50ZXN0KGEubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4gWC50ZXN0KGEubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYiYnV0dG9uIj09PWEudHlwZXx8ImJ1dHRvbiI9PT1ifSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWEudHlwZSYmKG51bGw9PShiPWEuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT1iLnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpuYShmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6bmEoZnVuY3Rpb24oYSxiKXtyZXR1cm5bYi0xXX0pLGVxOm5hKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm5bMD5jP2MrYjpjXX0pLGV2ZW46bmEoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxvZGQ6bmEoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MTtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxsdDpuYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzstLWQ+PTA7KWEucHVzaChkKTtyZXR1cm4gYX0pLGd0Om5hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOysrZDxiOylhLnB1c2goZCk7cmV0dXJuIGF9KX19LGQucHNldWRvcy5udGg9ZC5wc2V1ZG9zLmVxO2ZvcihiIGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KWQucHNldWRvc1tiXT1sYShiKTtmb3IoYiBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWQucHNldWRvc1tiXT1tYShiKTtmdW5jdGlvbiBwYSgpe31wYS5wcm90b3R5cGU9ZC5maWx0ZXJzPWQucHNldWRvcyxkLnNldEZpbHRlcnM9bmV3IHBhLGc9ZmEudG9rZW5pemU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPXpbYSsiICJdO2lmKGspcmV0dXJuIGI/MDprLnNsaWNlKDApO2g9YSxpPVtdLGo9ZC5wcmVGaWx0ZXI7d2hpbGUoaCl7YyYmIShlPVIuZXhlYyhoKSl8fChlJiYoaD1oLnNsaWNlKGVbMF0ubGVuZ3RoKXx8aCksaS5wdXNoKGY9W10pKSxjPSExLChlPVMuZXhlYyhoKSkmJihjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTplWzBdLnJlcGxhY2UoUSwiICIpfSksaD1oLnNsaWNlKGMubGVuZ3RoKSk7Zm9yKGcgaW4gZC5maWx0ZXIpIShlPVdbZ10uZXhlYyhoKSl8fGpbZ10mJiEoZT1qW2ddKGUpKXx8KGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmcsbWF0Y2hlczplfSksaD1oLnNsaWNlKGMubGVuZ3RoKSk7aWYoIWMpYnJlYWt9cmV0dXJuIGI/aC5sZW5ndGg6aD9mYS5lcnJvcihhKTp6KGEsaSkuc2xpY2UoMCl9O2Z1bmN0aW9uIHFhKGEpe2Zvcih2YXIgYj0wLGM9YS5sZW5ndGgsZD0iIjtjPmI7YisrKWQrPWFbYl0udmFsdWU7cmV0dXJuIGR9ZnVuY3Rpb24gcmEoYSxiLGMpe3ZhciBkPWIuZGlyLGU9YyYmInBhcmVudE5vZGUiPT09ZCxmPXgrKztyZXR1cm4gYi5maXJzdD9mdW5jdGlvbihiLGMsZil7d2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXJldHVybiBhKGIsYyxmKX06ZnVuY3Rpb24oYixjLGcpe3ZhciBoLGksaixrPVt3LGZdO2lmKGcpe3doaWxlKGI9YltkXSlpZigoMT09PWIubm9kZVR5cGV8fGUpJiZhKGIsYyxnKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSl7aWYoaj1iW3VdfHwoYlt1XT17fSksaT1qW2IudW5pcXVlSURdfHwoaltiLnVuaXF1ZUlEXT17fSksKGg9aVtkXSkmJmhbMF09PT13JiZoWzFdPT09ZilyZXR1cm4ga1syXT1oWzJdO2lmKGlbZF09ayxrWzJdPWEoYixjLGcpKXJldHVybiEwfX19ZnVuY3Rpb24gc2EoYSl7cmV0dXJuIGEubGVuZ3RoPjE/ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEubGVuZ3RoO3doaWxlKGUtLSlpZighYVtlXShiLGMsZCkpcmV0dXJuITE7cmV0dXJuITB9OmFbMF19ZnVuY3Rpb24gdGEoYSxiLGMpe2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZT5kO2QrKylmYShhLGJbZF0sYyk7cmV0dXJuIGN9ZnVuY3Rpb24gdWEoYSxiLGMsZCxlKXtmb3IodmFyIGYsZz1bXSxoPTAsaT1hLmxlbmd0aCxqPW51bGwhPWI7aT5oO2grKykoZj1hW2hdKSYmKGMmJiFjKGYsZCxlKXx8KGcucHVzaChmKSxqJiZiLnB1c2goaCkpKTtyZXR1cm4gZ31mdW5jdGlvbiB2YShhLGIsYyxkLGUsZil7cmV0dXJuIGQmJiFkW3VdJiYoZD12YShkKSksZSYmIWVbdV0mJihlPXZhKGUsZikpLGhhKGZ1bmN0aW9uKGYsZyxoLGkpe3ZhciBqLGssbCxtPVtdLG49W10sbz1nLmxlbmd0aCxwPWZ8fHRhKGJ8fCIqIixoLm5vZGVUeXBlP1toXTpoLFtdKSxxPSFhfHwhZiYmYj9wOnVhKHAsbSxhLGgsaSkscj1jP2V8fChmP2E6b3x8ZCk/W106ZzpxO2lmKGMmJmMocSxyLGgsaSksZCl7aj11YShyLG4pLGQoaixbXSxoLGkpLGs9ai5sZW5ndGg7d2hpbGUoay0tKShsPWpba10pJiYocltuW2tdXT0hKHFbbltrXV09bCkpfWlmKGYpe2lmKGV8fGEpe2lmKGUpe2o9W10saz1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJmoucHVzaChxW2tdPWwpO2UobnVsbCxyPVtdLGosaSl9az1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJihqPWU/SihmLGwpOm1ba10pPi0xJiYoZltqXT0hKGdbal09bCkpfX1lbHNlIHI9dWEocj09PWc/ci5zcGxpY2UobyxyLmxlbmd0aCk6ciksZT9lKG51bGwsZyxyLGkpOkguYXBwbHkoZyxyKX0pfWZ1bmN0aW9uIHdhKGEpe2Zvcih2YXIgYixjLGUsZj1hLmxlbmd0aCxnPWQucmVsYXRpdmVbYVswXS50eXBlXSxoPWd8fGQucmVsYXRpdmVbIiAiXSxpPWc/MTowLGs9cmEoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifSxoLCEwKSxsPXJhKGZ1bmN0aW9uKGEpe3JldHVybiBKKGIsYSk+LTF9LGgsITApLG09W2Z1bmN0aW9uKGEsYyxkKXt2YXIgZT0hZyYmKGR8fGMhPT1qKXx8KChiPWMpLm5vZGVUeXBlP2soYSxjLGQpOmwoYSxjLGQpKTtyZXR1cm4gYj1udWxsLGV9XTtmPmk7aSsrKWlmKGM9ZC5yZWxhdGl2ZVthW2ldLnR5cGVdKW09W3JhKHNhKG0pLGMpXTtlbHNle2lmKGM9ZC5maWx0ZXJbYVtpXS50eXBlXS5hcHBseShudWxsLGFbaV0ubWF0Y2hlcyksY1t1XSl7Zm9yKGU9KytpO2Y+ZTtlKyspaWYoZC5yZWxhdGl2ZVthW2VdLnR5cGVdKWJyZWFrO3JldHVybiB2YShpPjEmJnNhKG0pLGk+MSYmcWEoYS5zbGljZSgwLGktMSkuY29uY2F0KHt2YWx1ZToiICI9PT1hW2ktMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShRLCIkMSIpLGMsZT5pJiZ3YShhLnNsaWNlKGksZSkpLGY+ZSYmd2EoYT1hLnNsaWNlKGUpKSxmPmUmJnFhKGEpKX1tLnB1c2goYyl9cmV0dXJuIHNhKG0pfWZ1bmN0aW9uIHhhKGEsYil7dmFyIGM9Yi5sZW5ndGg+MCxlPWEubGVuZ3RoPjAsZj1mdW5jdGlvbihmLGcsaCxpLGspe3ZhciBsLG8scSxyPTAscz0iMCIsdD1mJiZbXSx1PVtdLHY9aix4PWZ8fGUmJmQuZmluZC5UQUcoIioiLGspLHk9dys9bnVsbD09dj8xOk1hdGgucmFuZG9tKCl8fC4xLHo9eC5sZW5ndGg7Zm9yKGsmJihqPWc9PT1ufHxnfHxrKTtzIT09eiYmbnVsbCE9KGw9eFtzXSk7cysrKXtpZihlJiZsKXtvPTAsZ3x8bC5vd25lckRvY3VtZW50PT09bnx8KG0obCksaD0hcCk7d2hpbGUocT1hW28rK10paWYocShsLGd8fG4saCkpe2kucHVzaChsKTticmVha31rJiYodz15KX1jJiYoKGw9IXEmJmwpJiZyLS0sZiYmdC5wdXNoKGwpKX1pZihyKz1zLGMmJnMhPT1yKXtvPTA7d2hpbGUocT1iW28rK10pcSh0LHUsZyxoKTtpZihmKXtpZihyPjApd2hpbGUocy0tKXRbc118fHVbc118fCh1W3NdPUYuY2FsbChpKSk7dT11YSh1KX1ILmFwcGx5KGksdSksayYmIWYmJnUubGVuZ3RoPjAmJnIrYi5sZW5ndGg+MSYmZmEudW5pcXVlU29ydChpKX1yZXR1cm4gayYmKHc9eSxqPXYpLHR9O3JldHVybiBjP2hhKGYpOmZ9cmV0dXJuIGg9ZmEuY29tcGlsZT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1bXSxmPUFbYSsiICJdO2lmKCFmKXtifHwoYj1nKGEpKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlmPXdhKGJbY10pLGZbdV0/ZC5wdXNoKGYpOmUucHVzaChmKTtmPUEoYSx4YShlLGQpKSxmLnNlbGVjdG9yPWF9cmV0dXJuIGZ9LGk9ZmEuc2VsZWN0PWZ1bmN0aW9uKGEsYixlLGYpe3ZhciBpLGosayxsLG0sbj0iZnVuY3Rpb24iPT10eXBlb2YgYSYmYSxvPSFmJiZnKGE9bi5zZWxlY3Rvcnx8YSk7aWYoZT1lfHxbXSwxPT09by5sZW5ndGgpe2lmKGo9b1swXT1vWzBdLnNsaWNlKDApLGoubGVuZ3RoPjImJiJJRCI9PT0oaz1qWzBdKS50eXBlJiZjLmdldEJ5SWQmJjk9PT1iLm5vZGVUeXBlJiZwJiZkLnJlbGF0aXZlW2pbMV0udHlwZV0pe2lmKGI9KGQuZmluZC5JRChrLm1hdGNoZXNbMF0ucmVwbGFjZShiYSxjYSksYil8fFtdKVswXSwhYilyZXR1cm4gZTtuJiYoYj1iLnBhcmVudE5vZGUpLGE9YS5zbGljZShqLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPVcubmVlZHNDb250ZXh0LnRlc3QoYSk/MDpqLmxlbmd0aDt3aGlsZShpLS0pe2lmKGs9altpXSxkLnJlbGF0aXZlW2w9ay50eXBlXSlicmVhaztpZigobT1kLmZpbmRbbF0pJiYoZj1tKGsubWF0Y2hlc1swXS5yZXBsYWNlKGJhLGNhKSxfLnRlc3QoalswXS50eXBlKSYmb2EoYi5wYXJlbnROb2RlKXx8YikpKXtpZihqLnNwbGljZShpLDEpLGE9Zi5sZW5ndGgmJnFhKGopLCFhKXJldHVybiBILmFwcGx5KGUsZiksZTticmVha319fXJldHVybihufHxoKGEsbykpKGYsYiwhcCxlLCFifHxfLnRlc3QoYSkmJm9hKGIucGFyZW50Tm9kZSl8fGIpLGV9LGMuc29ydFN0YWJsZT11LnNwbGl0KCIiKS5zb3J0KEIpLmpvaW4oIiIpPT09dSxjLmRldGVjdER1cGxpY2F0ZXM9ISFsLG0oKSxjLnNvcnREZXRhY2hlZD1pYShmdW5jdGlvbihhKXtyZXR1cm4gMSZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG4uY3JlYXRlRWxlbWVudCgiZGl2IikpfSksaWEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8amEoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYz92b2lkIDA6YS5nZXRBdHRyaWJ1dGUoYiwidHlwZSI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmaWEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8aW5wdXQvPiIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8amEoInZhbHVlIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGN8fCJpbnB1dCIhPT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/dm9pZCAwOmEuZGVmYXVsdFZhbHVlfSksaWEoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGphKEssZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDphW2JdPT09ITA/Yi50b0xvd2VyQ2FzZSgpOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmQuc3BlY2lmaWVkP2QudmFsdWU6bnVsbH0pLGZhfShhKTtuLmZpbmQ9dCxuLmV4cHI9dC5zZWxlY3RvcnMsbi5leHByWyI6Il09bi5leHByLnBzZXVkb3Msbi51bmlxdWVTb3J0PW4udW5pcXVlPXQudW5pcXVlU29ydCxuLnRleHQ9dC5nZXRUZXh0LG4uaXNYTUxEb2M9dC5pc1hNTCxuLmNvbnRhaW5zPXQuY29udGFpbnM7dmFyIHU9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU9dm9pZCAwIT09Yzt3aGlsZSgoYT1hW2JdKSYmOSE9PWEubm9kZVR5cGUpaWYoMT09PWEubm9kZVR5cGUpe2lmKGUmJm4oYSkuaXMoYykpYnJlYWs7ZC5wdXNoKGEpfXJldHVybiBkfSx2PWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdO2E7YT1hLm5leHRTaWJsaW5nKTE9PT1hLm5vZGVUeXBlJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfSx3PW4uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQseD0vXjwoW1x3LV0rKVxzKlwvPz4oPzo8XC9cMT58KSQvLHk9L14uW146I1xbXC4sXSokLztmdW5jdGlvbiB6KGEsYixjKXtpZihuLmlzRnVuY3Rpb24oYikpcmV0dXJuIG4uZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuISFiLmNhbGwoYSxkLGEpIT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIG4uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBhPT09YiE9PWN9KTtpZigic3RyaW5nIj09dHlwZW9mIGIpe2lmKHkudGVzdChiKSlyZXR1cm4gbi5maWx0ZXIoYixhLGMpO2I9bi5maWx0ZXIoYixhKX1yZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGguY2FsbChiLGEpPi0xIT09Y30pfW4uZmlsdGVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1iWzBdO3JldHVybiBjJiYoYT0iOm5vdCgiK2ErIikiKSwxPT09Yi5sZW5ndGgmJjE9PT1kLm5vZGVUeXBlP24uZmluZC5tYXRjaGVzU2VsZWN0b3IoZCxhKT9bZF06W106bi5maW5kLm1hdGNoZXMoYSxuLmdyZXAoYixmdW5jdGlvbihhKXtyZXR1cm4gMT09PWEubm9kZVR5cGV9KSl9LG4uZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiLGM9dGhpcy5sZW5ndGgsZD1bXSxlPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiB0aGlzLnB1c2hTdGFjayhuKGEpLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7Yz5iO2IrKylpZihuLmNvbnRhaW5zKGVbYl0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKGI9MDtjPmI7YisrKW4uZmluZChhLGVbYl0sZCk7cmV0dXJuIGQ9dGhpcy5wdXNoU3RhY2soYz4xP24udW5pcXVlKGQpOmQpLGQuc2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj90aGlzLnNlbGVjdG9yKyIgIithOmEsZH0sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayh6KHRoaXMsYXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayh6KHRoaXMsYXx8W10sITApKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISF6KHRoaXMsInN0cmluZyI9PXR5cGVvZiBhJiZ3LnRlc3QoYSk/bihhKTphfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBBLEI9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxDPW4uZm4uaW5pdD1mdW5jdGlvbihhLGIsYyl7dmFyIGUsZjtpZighYSlyZXR1cm4gdGhpcztpZihjPWN8fEEsInN0cmluZyI9PXR5cGVvZiBhKXtpZihlPSI8Ij09PWFbMF0mJiI+Ij09PWFbYS5sZW5ndGgtMV0mJmEubGVuZ3RoPj0zP1tudWxsLGEsbnVsbF06Qi5leGVjKGEpLCFlfHwhZVsxXSYmYilyZXR1cm4hYnx8Yi5qcXVlcnk/KGJ8fGMpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihiKS5maW5kKGEpO2lmKGVbMV0pe2lmKGI9YiBpbnN0YW5jZW9mIG4/YlswXTpiLG4ubWVyZ2UodGhpcyxuLnBhcnNlSFRNTChlWzFdLGImJmIubm9kZVR5cGU/Yi5vd25lckRvY3VtZW50fHxiOmQsITApKSx4LnRlc3QoZVsxXSkmJm4uaXNQbGFpbk9iamVjdChiKSlmb3IoZSBpbiBiKW4uaXNGdW5jdGlvbih0aGlzW2VdKT90aGlzW2VdKGJbZV0pOnRoaXMuYXR0cihlLGJbZV0pO3JldHVybiB0aGlzfXJldHVybiBmPWQuZ2V0RWxlbWVudEJ5SWQoZVsyXSksZiYmZi5wYXJlbnROb2RlJiYodGhpcy5sZW5ndGg9MSx0aGlzWzBdPWYpLHRoaXMuY29udGV4dD1kLHRoaXMuc2VsZWN0b3I9YSx0aGlzfXJldHVybiBhLm5vZGVUeXBlPyh0aGlzLmNvbnRleHQ9dGhpc1swXT1hLHRoaXMubGVuZ3RoPTEsdGhpcyk6bi5pc0Z1bmN0aW9uKGEpP3ZvaWQgMCE9PWMucmVhZHk/Yy5yZWFkeShhKTphKG4pOih2b2lkIDAhPT1hLnNlbGVjdG9yJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpLG4ubWFrZUFycmF5KGEsdGhpcykpfTtDLnByb3RvdHlwZT1uLmZuLEE9bihkKTt2YXIgRD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxFPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O24uZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oYSl7dmFyIGI9bihhLHRoaXMpLGM9Yi5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7Yz5hO2ErKylpZihuLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dy50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bihhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbi5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP24udW5pcXVlU29ydChmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP2guY2FsbChuKGEpLHRoaXNbMF0pOmguY2FsbCh0aGlzLGEuanF1ZXJ5P2FbMF06YSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobi51bmlxdWVTb3J0KG4ubWVyZ2UodGhpcy5nZXQoKSxuKGEsYikpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWE/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoYSkpfX0pO2Z1bmN0aW9uIEYoYSxiKXt3aGlsZSgoYT1hW2JdKSYmMSE9PWEubm9kZVR5cGUpO3JldHVybiBhfW4uZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmMTEhPT1iLm5vZGVUeXBlP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHUoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEYoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdShhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiB1KGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB1KGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdShhLCJwcmV2aW91c1NpYmxpbmciLGMpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gdigoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY29udGVudERvY3VtZW50fHxuLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe24uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1uLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW4uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihFW2FdfHxuLnVuaXF1ZVNvcnQoZSksRC50ZXN0KGEpJiZlLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIEc9L1xTKy9nO2Z1bmN0aW9uIEgoYSl7dmFyIGI9e307cmV0dXJuIG4uZWFjaChhLm1hdGNoKEcpfHxbXSxmdW5jdGlvbihhLGMpe2JbY109ITB9KSxifW4uQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9InN0cmluZyI9PXR5cGVvZiBhP0goYSk6bi5leHRlbmQoe30sYSk7dmFyIGIsYyxkLGUsZj1bXSxnPVtdLGg9LTEsaT1mdW5jdGlvbigpe2ZvcihlPWEub25jZSxkPWI9ITA7Zy5sZW5ndGg7aD0tMSl7Yz1nLnNoaWZ0KCk7d2hpbGUoKytoPGYubGVuZ3RoKWZbaF0uYXBwbHkoY1swXSxjWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlJiYoaD1mLmxlbmd0aCxjPSExKX1hLm1lbW9yeXx8KGM9ITEpLGI9ITEsZSYmKGY9Yz9bXToiIil9LGo9e2FkZDpmdW5jdGlvbigpe3JldHVybiBmJiYoYyYmIWImJihoPWYubGVuZ3RoLTEsZy5wdXNoKGMpKSxmdW5jdGlvbiBkKGIpe24uZWFjaChiLGZ1bmN0aW9uKGIsYyl7bi5pc0Z1bmN0aW9uKGMpP2EudW5pcXVlJiZqLmhhcyhjKXx8Zi5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PW4udHlwZShjKSYmZChjKX0pfShhcmd1bWVudHMpLGMmJiFiJiZpKCkpLHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBuLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYil7dmFyIGM7d2hpbGUoKGM9bi5pbkFycmF5KGIsZixjKSk+LTEpZi5zcGxpY2UoYywxKSxoPj1jJiZoLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/bi5pbkFycmF5KGEsZik+LTE6Zi5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gZiYmKGY9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gZT1nPVtdLGY9Yz0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFmfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGU9Zz1bXSxjfHwoZj1jPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWV9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGV8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sZy5wdXNoKGMpLGJ8fGkoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBqLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBqfSxuLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG4uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbi5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBuLkRlZmVycmVkKGZ1bmN0aW9uKGMpe24uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bi5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZuLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5wcm9ncmVzcyhjLm5vdGlmeSkuZG9uZShjLnJlc29sdmUpLmZhaWwoYy5yZWplY3QpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP24uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbi5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1lLmNhbGwoYXJndW1lbnRzKSxkPWMubGVuZ3RoLGY9MSE9PWR8fGEmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2Q6MCxnPTE9PT1mP2E6bi5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihkKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZS5jYWxsKGFyZ3VtZW50cyk6ZCxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGQ+MSlmb3IoaT1uZXcgQXJyYXkoZCksaj1uZXcgQXJyYXkoZCksaz1uZXcgQXJyYXkoZCk7ZD5iO2IrKyljW2JdJiZuLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5wcm9ncmVzcyhoKGIsaixpKSkuZG9uZShoKGIsayxjKSkuZmFpbChnLnJlamVjdCk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEk7bi5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbi5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxuLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9uLnJlYWR5V2FpdCsrOm4ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXsoYT09PSEwPy0tbi5yZWFkeVdhaXQ6bi5pc1JlYWR5KXx8KG4uaXNSZWFkeT0hMCxhIT09ITAmJi0tbi5yZWFkeVdhaXQ+MHx8KEkucmVzb2x2ZVdpdGgoZCxbbl0pLG4uZm4udHJpZ2dlckhhbmRsZXImJihuKGQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG4oZCkub2ZmKCJyZWFkeSIpKSkpfX0pO2Z1bmN0aW9uIEooKXtkLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEopLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsSiksbi5yZWFkeSgpfW4ucmVhZHkucHJvbWlzZT1mdW5jdGlvbihiKXtyZXR1cm4gSXx8KEk9bi5EZWZlcnJlZCgpLCJjb21wbGV0ZSI9PT1kLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PWQucmVhZHlTdGF0ZSYmIWQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsP2Euc2V0VGltZW91dChuLnJlYWR5KTooZC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixKKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLEopKSksSS5wcm9taXNlKGIpfSxuLnJlYWR5LnByb21pc2UoKTt2YXIgSz1mdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgaD0wLGk9YS5sZW5ndGgsaj1udWxsPT1jO2lmKCJvYmplY3QiPT09bi50eXBlKGMpKXtlPSEwO2ZvcihoIGluIGMpSyhhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxuLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwobihhKSxjKX0pKSxiKSlmb3IoO2k+aDtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxMPWZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZXx8OT09PWEubm9kZVR5cGV8fCErYS5ub2RlVHlwZX07ZnVuY3Rpb24gTSgpe3RoaXMuZXhwYW5kbz1uLmV4cGFuZG8rTS51aWQrK31NLnVpZD0xLE0ucHJvdG90eXBlPXtyZWdpc3RlcjpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fHt9O3JldHVybiBhLm5vZGVUeXBlP2FbdGhpcy5leHBhbmRvXT1jOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHRoaXMuZXhwYW5kbyx7dmFsdWU6Yyx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxhW3RoaXMuZXhwYW5kb119LGNhY2hlOmZ1bmN0aW9uKGEpe2lmKCFMKGEpKXJldHVybnt9O3ZhciBiPWFbdGhpcy5leHBhbmRvXTtyZXR1cm4gYnx8KGI9e30sTChhKSYmKGEubm9kZVR5cGU/YVt0aGlzLmV4cGFuZG9dPWI6T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsdGhpcy5leHBhbmRvLHt2YWx1ZTpiLGNvbmZpZ3VyYWJsZTohMH0pKSksYn0sc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPXRoaXMuY2FjaGUoYSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKWVbYl09YztlbHNlIGZvcihkIGluIGIpZVtkXT1iW2RdO3JldHVybiBlfSxnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdm9pZCAwPT09Yj90aGlzLmNhY2hlKGEpOmFbdGhpcy5leHBhbmRvXSYmYVt0aGlzLmV4cGFuZG9dW2JdfSxhY2Nlc3M6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiB2b2lkIDA9PT1ifHxiJiYic3RyaW5nIj09dHlwZW9mIGImJnZvaWQgMD09PWM/KGQ9dGhpcy5nZXQoYSxiKSx2b2lkIDAhPT1kP2Q6dGhpcy5nZXQoYSxuLmNhbWVsQ2FzZShiKSkpOih0aGlzLnNldChhLGIsYyksdm9pZCAwIT09Yz9jOmIpfSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj1hW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09Zil7aWYodm9pZCAwPT09Yil0aGlzLnJlZ2lzdGVyKGEpO2Vsc2V7bi5pc0FycmF5KGIpP2Q9Yi5jb25jYXQoYi5tYXAobi5jYW1lbENhc2UpKTooZT1uLmNhbWVsQ2FzZShiKSxiIGluIGY/ZD1bYixlXTooZD1lLGQ9ZCBpbiBmP1tkXTpkLm1hdGNoKEcpfHxbXSkpLGM9ZC5sZW5ndGg7d2hpbGUoYy0tKWRlbGV0ZSBmW2RbY11dfSh2b2lkIDA9PT1ifHxuLmlzRW1wdHlPYmplY3QoZikpJiYoYS5ub2RlVHlwZT9hW3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSBhW3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbihhKXt2YXIgYj1hW3RoaXMuZXhwYW5kb107cmV0dXJuIHZvaWQgMCE9PWImJiFuLmlzRW1wdHlPYmplY3QoYil9fTt2YXIgTj1uZXcgTSxPPW5ldyBNLFA9L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxRPS9bQS1aXS9nO2Z1bmN0aW9uIFIoYSxiLGMpe3ZhciBkO2lmKHZvaWQgMD09PWMmJjE9PT1hLm5vZGVUeXBlKWlmKGQ9ImRhdGEtIitiLnJlcGxhY2UoUSwiLSQmIikudG9Mb3dlckNhc2UoKSxjPWEuZ2V0QXR0cmlidXRlKGQpLCJzdHJpbmciPT10eXBlb2YgYyl7dHJ5e2M9InRydWUiPT09Yz8hMDoiZmFsc2UiPT09Yz8hMToibnVsbCI9PT1jP251bGw6K2MrIiI9PT1jPytjOlAudGVzdChjKT9uLnBhcnNlSlNPTihjKTpjOwp9Y2F0Y2goZSl7fU8uc2V0KGEsYixjKX1lbHNlIGM9dm9pZCAwO3JldHVybiBjfW4uZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiBPLmhhc0RhdGEoYSl8fE4uaGFzRGF0YShhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIE8uYWNjZXNzKGEsYixjKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe08ucmVtb3ZlKGEsYil9LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gTi5hY2Nlc3MoYSxiLGMpfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIpe04ucmVtb3ZlKGEsYil9fSksbi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZj10aGlzWzBdLGc9ZiYmZi5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PWEpe2lmKHRoaXMubGVuZ3RoJiYoZT1PLmdldChmKSwxPT09Zi5ub2RlVHlwZSYmIU4uZ2V0KGYsImhhc0RhdGFBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW4uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLFIoZixkLGVbZF0pKSk7Ti5zZXQoZiwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIGV9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBhP3RoaXMuZWFjaChmdW5jdGlvbigpe08uc2V0KHRoaXMsYSl9KTpLKHRoaXMsZnVuY3Rpb24oYil7dmFyIGMsZDtpZihmJiZ2b2lkIDA9PT1iKXtpZihjPU8uZ2V0KGYsYSl8fE8uZ2V0KGYsYS5yZXBsYWNlKFEsIi0kJiIpLnRvTG93ZXJDYXNlKCkpLHZvaWQgMCE9PWMpcmV0dXJuIGM7aWYoZD1uLmNhbWVsQ2FzZShhKSxjPU8uZ2V0KGYsZCksdm9pZCAwIT09YylyZXR1cm4gYztpZihjPVIoZixkLHZvaWQgMCksdm9pZCAwIT09YylyZXR1cm4gY31lbHNlIGQ9bi5jYW1lbENhc2UoYSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9Ty5nZXQodGhpcyxkKTtPLnNldCh0aGlzLGQsYiksYS5pbmRleE9mKCItIik+LTEmJnZvaWQgMCE9PWMmJk8uc2V0KHRoaXMsYSxiKX0pfSxudWxsLGIsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtPLnJlbW92ZSh0aGlzLGEpfSl9fSksbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYT8oYj0oYnx8ImZ4IikrInF1ZXVlIixkPU4uZ2V0KGEsYiksYyYmKCFkfHxuLmlzQXJyYXkoYyk/ZD1OLmFjY2VzcyhhLGIsbi5tYWtlQXJyYXkoYykpOmQucHVzaChjKSksZHx8W10pOnZvaWQgMH0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1uLnF1ZXVlKGEsYiksZD1jLmxlbmd0aCxlPWMuc2hpZnQoKSxmPW4uX3F1ZXVlSG9va3MoYSxiKSxnPWZ1bmN0aW9uKCl7bi5kZXF1ZXVlKGEsYil9OyJpbnByb2dyZXNzIj09PWUmJihlPWMuc2hpZnQoKSxkLS0pLGUmJigiZngiPT09YiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIGYuc3RvcCxlLmNhbGwoYSxnLGYpKSwhZCYmZiYmZi5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGEsYil7dmFyIGM9YisicXVldWVIb29rcyI7cmV0dXJuIE4uZ2V0KGEsYyl8fE4uYWNjZXNzKGEsYyx7ZW1wdHk6bi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7Ti5yZW1vdmUoYSxbYisicXVldWUiLGNdKX0pfSl9fSksbi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGEmJihiPWEsYT0iZngiLGMtLSksYXJndW1lbnRzLmxlbmd0aDxjP24ucXVldWUodGhpc1swXSxhKTp2b2lkIDA9PT1iP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9bi5xdWV1ZSh0aGlzLGEsYik7bi5fcXVldWVIb29rcyh0aGlzLGEpLCJmeCI9PT1hJiYiaW5wcm9ncmVzcyIhPT1jWzBdJiZuLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmRlcXVldWUodGhpcyxhKX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnF1ZXVlKGF8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0xLGU9bi5EZWZlcnJlZCgpLGY9dGhpcyxnPXRoaXMubGVuZ3RoLGg9ZnVuY3Rpb24oKXstLWR8fGUucmVzb2x2ZVdpdGgoZixbZl0pfTsic3RyaW5nIiE9dHlwZW9mIGEmJihiPWEsYT12b2lkIDApLGE9YXx8ImZ4Ijt3aGlsZShnLS0pYz1OLmdldChmW2ddLGErInF1ZXVlSG9va3MiKSxjJiZjLmVtcHR5JiYoZCsrLGMuZW1wdHkuYWRkKGgpKTtyZXR1cm4gaCgpLGUucHJvbWlzZShiKX19KTt2YXIgUz0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxUPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIitTKyIpKFthLXolXSopJCIsImkiKSxVPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sVj1mdW5jdGlvbihhLGIpe3JldHVybiBhPWJ8fGEsIm5vbmUiPT09bi5jc3MoYSwiZGlzcGxheSIpfHwhbi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl9O2Z1bmN0aW9uIFcoYSxiLGMsZCl7dmFyIGUsZj0xLGc9MjAsaD1kP2Z1bmN0aW9uKCl7cmV0dXJuIGQuY3VyKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIG4uY3NzKGEsYiwiIil9LGk9aCgpLGo9YyYmY1szXXx8KG4uY3NzTnVtYmVyW2JdPyIiOiJweCIpLGs9KG4uY3NzTnVtYmVyW2JdfHwicHgiIT09aiYmK2kpJiZULmV4ZWMobi5jc3MoYSxiKSk7aWYoayYma1szXSE9PWope2o9anx8a1szXSxjPWN8fFtdLGs9K2l8fDE7ZG8gZj1mfHwiLjUiLGsvPWYsbi5zdHlsZShhLGIsaytqKTt3aGlsZShmIT09KGY9aCgpL2kpJiYxIT09ZiYmLS1nKX1yZXR1cm4gYyYmKGs9K2t8fCtpfHwwLGU9Y1sxXT9rKyhjWzFdKzEpKmNbMl06K2NbMl0sZCYmKGQudW5pdD1qLGQuc3RhcnQ9ayxkLmVuZD1lKSksZX12YXIgWD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxZPS88KFtcdzotXSspLyxaPS9eJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSwkPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07JC5vcHRncm91cD0kLm9wdGlvbiwkLnRib2R5PSQudGZvb3Q9JC5jb2xncm91cD0kLmNhcHRpb249JC50aGVhZCwkLnRoPSQudGQ7ZnVuY3Rpb24gXyhhLGIpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6InVuZGVmaW5lZCIhPXR5cGVvZiBhLnF1ZXJ5U2VsZWN0b3JBbGw/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6W107cmV0dXJuIHZvaWQgMD09PWJ8fGImJm4ubm9kZU5hbWUoYSxiKT9uLm1lcmdlKFthXSxjKTpjfWZ1bmN0aW9uIGFhKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKU4uc2V0KGFbY10sImdsb2JhbEV2YWwiLCFifHxOLmdldChiW2NdLCJnbG9iYWxFdmFsIikpfXZhciBiYT0vPHwmIz9cdys7LztmdW5jdGlvbiBjYShhLGIsYyxkLGUpe2Zvcih2YXIgZixnLGgsaSxqLGssbD1iLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxtPVtdLG89MCxwPWEubGVuZ3RoO3A+bztvKyspaWYoZj1hW29dLGZ8fDA9PT1mKWlmKCJvYmplY3QiPT09bi50eXBlKGYpKW4ubWVyZ2UobSxmLm5vZGVUeXBlP1tmXTpmKTtlbHNlIGlmKGJhLnRlc3QoZikpe2c9Z3x8bC5hcHBlbmRDaGlsZChiLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxoPShZLmV4ZWMoZil8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksaT0kW2hdfHwkLl9kZWZhdWx0LGcuaW5uZXJIVE1MPWlbMV0rbi5odG1sUHJlZmlsdGVyKGYpK2lbMl0saz1pWzBdO3doaWxlKGstLSlnPWcubGFzdENoaWxkO24ubWVyZ2UobSxnLmNoaWxkTm9kZXMpLGc9bC5maXJzdENoaWxkLGcudGV4dENvbnRlbnQ9IiJ9ZWxzZSBtLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShmKSk7bC50ZXh0Q29udGVudD0iIixvPTA7d2hpbGUoZj1tW28rK10paWYoZCYmbi5pbkFycmF5KGYsZCk+LTEpZSYmZS5wdXNoKGYpO2Vsc2UgaWYoaj1uLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxnPV8obC5hcHBlbmRDaGlsZChmKSwic2NyaXB0IiksaiYmYWEoZyksYyl7az0wO3doaWxlKGY9Z1trKytdKVoudGVzdChmLnR5cGV8fCIiKSYmYy5wdXNoKGYpfXJldHVybiBsfSFmdW5jdGlvbigpe3ZhciBhPWQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGI9YS5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxjPWQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtjLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksYy5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksYy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksYi5hcHBlbmRDaGlsZChjKSxsLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYi5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLGwubm9DbG9uZUNoZWNrZWQ9ISFiLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZX0oKTt2YXIgZGE9L15rZXkvLGVhPS9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxmYT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24gZ2EoKXtyZXR1cm4hMH1mdW5jdGlvbiBoYSgpe3JldHVybiExfWZ1bmN0aW9uIGlhKCl7dHJ5e3JldHVybiBkLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1mdW5jdGlvbiBqYShhLGIsYyxkLGUsZil7dmFyIGcsaDtpZigib2JqZWN0Ij09dHlwZW9mIGIpeyJzdHJpbmciIT10eXBlb2YgYyYmKGQ9ZHx8YyxjPXZvaWQgMCk7Zm9yKGggaW4gYilqYShhLGgsYyxkLGJbaF0sZik7cmV0dXJuIGF9aWYobnVsbD09ZCYmbnVsbD09ZT8oZT1jLGQ9Yz12b2lkIDApOm51bGw9PWUmJigic3RyaW5nIj09dHlwZW9mIGM/KGU9ZCxkPXZvaWQgMCk6KGU9ZCxkPWMsYz12b2lkIDApKSxlPT09ITEpZT1oYTtlbHNlIGlmKCFlKXJldHVybiBhO3JldHVybiAxPT09ZiYmKGc9ZSxlPWZ1bmN0aW9uKGEpe3JldHVybiBuKCkub2ZmKGEpLGcuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLmd1aWQ9Zy5ndWlkfHwoZy5ndWlkPW4uZ3VpZCsrKSksYS5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC5hZGQodGhpcyxiLGUsZCxjKX0pfW4uZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG8scCxxLHI9Ti5nZXQoYSk7aWYocil7Yy5oYW5kbGVyJiYoZj1jLGM9Zi5oYW5kbGVyLGU9Zi5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW4uZ3VpZCsrKSwoaT1yLmV2ZW50cyl8fChpPXIuZXZlbnRzPXt9KSwoZz1yLmhhbmRsZSl8fChnPXIuaGFuZGxlPWZ1bmN0aW9uKGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgbiYmbi5ldmVudC50cmlnZ2VyZWQhPT1iLnR5cGU/bi5ldmVudC5kaXNwYXRjaC5hcHBseShhLGFyZ3VtZW50cyk6dm9pZCAwfSksYj0oYnx8IiIpLm1hdGNoKEcpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWg9ZmEuZXhlYyhiW2pdKXx8W10sbz1xPWhbMV0scD0oaFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8mJihsPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30sbz0oZT9sLmRlbGVnYXRlVHlwZTpsLmJpbmRUeXBlKXx8byxsPW4uZXZlbnQuc3BlY2lhbFtvXXx8e30saz1uLmV4dGVuZCh7dHlwZTpvLG9yaWdUeXBlOnEsZGF0YTpkLGhhbmRsZXI6YyxndWlkOmMuZ3VpZCxzZWxlY3RvcjplLG5lZWRzQ29udGV4dDplJiZuLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoZSksbmFtZXNwYWNlOnAuam9pbigiLiIpfSxmKSwobT1pW29dKXx8KG09aVtvXT1bXSxtLmRlbGVnYXRlQ291bnQ9MCxsLnNldHVwJiZsLnNldHVwLmNhbGwoYSxkLHAsZykhPT0hMXx8YS5hZGRFdmVudExpc3RlbmVyJiZhLmFkZEV2ZW50TGlzdGVuZXIobyxnKSksbC5hZGQmJihsLmFkZC5jYWxsKGEsayksay5oYW5kbGVyLmd1aWR8fChrLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP20uc3BsaWNlKG0uZGVsZWdhdGVDb3VudCsrLDAsayk6bS5wdXNoKGspLG4uZXZlbnQuZ2xvYmFsW29dPSEwKX19LHJlbW92ZTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG0sbyxwLHEscj1OLmhhc0RhdGEoYSkmJk4uZ2V0KGEpO2lmKHImJihpPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEcpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9ZmEuZXhlYyhiW2pdKXx8W10sbz1xPWhbMV0scD0oaFsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLG8pe2w9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShkP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxvLG09aVtvXXx8W10saD1oWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitwLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGc9Zj1tLmxlbmd0aDt3aGlsZShmLS0paz1tW2ZdLCFlJiZxIT09ay5vcmlnVHlwZXx8YyYmYy5ndWlkIT09ay5ndWlkfHxoJiYhaC50ZXN0KGsubmFtZXNwYWNlKXx8ZCYmZCE9PWsuc2VsZWN0b3ImJigiKioiIT09ZHx8IWsuc2VsZWN0b3IpfHwobS5zcGxpY2UoZiwxKSxrLnNlbGVjdG9yJiZtLmRlbGVnYXRlQ291bnQtLSxsLnJlbW92ZSYmbC5yZW1vdmUuY2FsbChhLGspKTtnJiYhbS5sZW5ndGgmJihsLnRlYXJkb3duJiZsLnRlYXJkb3duLmNhbGwoYSxwLHIuaGFuZGxlKSE9PSExfHxuLnJlbW92ZUV2ZW50KGEsbyxyLmhhbmRsZSksZGVsZXRlIGlbb10pfWVsc2UgZm9yKG8gaW4gaSluLmV2ZW50LnJlbW92ZShhLG8rYltqXSxjLGQsITApO24uaXNFbXB0eU9iamVjdChpKSYmTi5yZW1vdmUoYSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1uLmV2ZW50LmZpeChhKTt2YXIgYixjLGQsZixnLGg9W10saT1lLmNhbGwoYXJndW1lbnRzKSxqPShOLmdldCh0aGlzLCJldmVudHMiKXx8e30pW2EudHlwZV18fFtdLGs9bi5ldmVudC5zcGVjaWFsW2EudHlwZV18fHt9O2lmKGlbMF09YSxhLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWsucHJlRGlzcGF0Y2h8fGsucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGEpIT09ITEpe2g9bi5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsYSxqKSxiPTA7d2hpbGUoKGY9aFtiKytdKSYmIWEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7YS5jdXJyZW50VGFyZ2V0PWYuZWxlbSxjPTA7d2hpbGUoKGc9Zi5oYW5kbGVyc1tjKytdKSYmIWEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSlhLnJuYW1lc3BhY2UmJiFhLnJuYW1lc3BhY2UudGVzdChnLm5hbWVzcGFjZSl8fChhLmhhbmRsZU9iaj1nLGEuZGF0YT1nLmRhdGEsZD0oKG4uZXZlbnQuc3BlY2lhbFtnLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8Zy5oYW5kbGVyKS5hcHBseShmLmVsZW0saSksdm9pZCAwIT09ZCYmKGEucmVzdWx0PWQpPT09ITEmJihhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBrLnBvc3REaXNwYXRjaCYmay5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGEpLGEucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnPVtdLGg9Yi5kZWxlZ2F0ZUNvdW50LGk9YS50YXJnZXQ7aWYoaCYmaS5ub2RlVHlwZSYmKCJjbGljayIhPT1hLnR5cGV8fGlzTmFOKGEuYnV0dG9uKXx8YS5idXR0b248MSkpZm9yKDtpIT09dGhpcztpPWkucGFyZW50Tm9kZXx8dGhpcylpZigxPT09aS5ub2RlVHlwZSYmKGkuZGlzYWJsZWQhPT0hMHx8ImNsaWNrIiE9PWEudHlwZSkpe2ZvcihkPVtdLGM9MDtoPmM7YysrKWY9YltjXSxlPWYuc2VsZWN0b3IrIiAiLHZvaWQgMD09PWRbZV0mJihkW2VdPWYubmVlZHNDb250ZXh0P24oZSx0aGlzKS5pbmRleChpKT4tMTpuLmZpbmQoZSx0aGlzLG51bGwsW2ldKS5sZW5ndGgpLGRbZV0mJmQucHVzaChmKTtkLmxlbmd0aCYmZy5wdXNoKHtlbGVtOmksaGFuZGxlcnM6ZH0pfXJldHVybiBoPGIubGVuZ3RoJiZnLnB1c2goe2VsZW06dGhpcyxoYW5kbGVyczpiLnNsaWNlKGgpfSksZ30scHJvcHM6ImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGRldGFpbCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihhLGIpe3JldHVybiBudWxsPT1hLndoaWNoJiYoYS53aGljaD1udWxsIT1iLmNoYXJDb2RlP2IuY2hhckNvZGU6Yi5rZXlDb2RlKSxhfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZz1iLmJ1dHRvbjtyZXR1cm4gbnVsbD09YS5wYWdlWCYmbnVsbCE9Yi5jbGllbnRYJiYoYz1hLnRhcmdldC5vd25lckRvY3VtZW50fHxkLGU9Yy5kb2N1bWVudEVsZW1lbnQsZj1jLmJvZHksYS5wYWdlWD1iLmNsaWVudFgrKGUmJmUuc2Nyb2xsTGVmdHx8ZiYmZi5zY3JvbGxMZWZ0fHwwKS0oZSYmZS5jbGllbnRMZWZ0fHxmJiZmLmNsaWVudExlZnR8fDApLGEucGFnZVk9Yi5jbGllbnRZKyhlJiZlLnNjcm9sbFRvcHx8ZiYmZi5zY3JvbGxUb3B8fDApLShlJiZlLmNsaWVudFRvcHx8ZiYmZi5jbGllbnRUb3B8fDApKSxhLndoaWNofHx2b2lkIDA9PT1nfHwoYS53aGljaD0xJmc/MToyJmc/Mzo0Jmc/MjowKSxhfX0sZml4OmZ1bmN0aW9uKGEpe2lmKGFbbi5leHBhbmRvXSlyZXR1cm4gYTt2YXIgYixjLGUsZj1hLnR5cGUsZz1hLGg9dGhpcy5maXhIb29rc1tmXTtofHwodGhpcy5maXhIb29rc1tmXT1oPWVhLnRlc3QoZik/dGhpcy5tb3VzZUhvb2tzOmRhLnRlc3QoZik/dGhpcy5rZXlIb29rczp7fSksZT1oLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KGgucHJvcHMpOnRoaXMucHJvcHMsYT1uZXcgbi5FdmVudChnKSxiPWUubGVuZ3RoO3doaWxlKGItLSljPWVbYl0sYVtjXT1nW2NdO3JldHVybiBhLnRhcmdldHx8KGEudGFyZ2V0PWQpLDM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGguZmlsdGVyP2guZmlsdGVyKGEsZyk6YX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMhPT1pYSgpJiZ0aGlzLmZvY3VzPyh0aGlzLmZvY3VzKCksITEpOnZvaWQgMH0sZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzPT09aWEoKSYmdGhpcy5ibHVyPyh0aGlzLmJsdXIoKSwhMSk6dm9pZCAwfSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4iY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrJiZuLm5vZGVOYW1lKHRoaXMsImlucHV0Iik/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbi5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX19LG4ucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYyl9LG4uRXZlbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIG4uRXZlbnQ/KGEmJmEudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWEsdGhpcy50eXBlPWEudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWEuZGVmYXVsdFByZXZlbnRlZCYmYS5yZXR1cm5WYWx1ZT09PSExP2dhOmhhKTp0aGlzLnR5cGU9YSxiJiZuLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWEmJmEudGltZVN0YW1wfHxuLm5vdygpLHZvaWQodGhpc1tuLmV4cGFuZG9dPSEwKSk6bmV3IG4uRXZlbnQoYSxiKX0sbi5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOm4uRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOmhhLGlzUHJvcGFnYXRpb25TdG9wcGVkOmhhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmhhLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWdhLGEmJiF0aGlzLmlzU2ltdWxhdGVkJiZhLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWdhLGEmJiF0aGlzLmlzU2ltdWxhdGVkJiZhLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1nYSxhJiYhdGhpcy5pc1NpbXVsYXRlZCYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sbi5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihhLGIpe24uZXZlbnQuc3BlY2lhbFthXT17ZGVsZWdhdGVUeXBlOmIsYmluZFR5cGU6YixoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGMsZD10aGlzLGU9YS5yZWxhdGVkVGFyZ2V0LGY9YS5oYW5kbGVPYmo7cmV0dXJuIGUmJihlPT09ZHx8bi5jb250YWlucyhkLGUpKXx8KGEudHlwZT1mLm9yaWdUeXBlLGM9Zi5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YiksY319fSksbi5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBqYSh0aGlzLGEsYixjLGQpfSxvbmU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGphKHRoaXMsYSxiLGMsZCwxKX0sb2ZmOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlO2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXJldHVybiBkPWEuaGFuZGxlT2JqLG4oYS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGQubmFtZXNwYWNlP2Qub3JpZ1R5cGUrIi4iK2QubmFtZXNwYWNlOmQub3JpZ1R5cGUsZC5zZWxlY3RvcixkLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXtmb3IoZSBpbiBhKXRoaXMub2ZmKGUsYixhW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4gYiE9PSExJiYiZnVuY3Rpb24iIT10eXBlb2YgYnx8KGM9YixiPXZvaWQgMCksYz09PSExJiYoYz1oYSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC5yZW1vdmUodGhpcyxhLGMsYil9KX19KTt2YXIga2E9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Oi1dKylbXj5dKilcLz4vZ2ksbGE9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksbWE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksbmE9L150cnVlXC8oLiopLyxvYT0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2c7ZnVuY3Rpb24gcGEoYSxiKXtyZXR1cm4gbi5ub2RlTmFtZShhLCJ0YWJsZSIpJiZuLm5vZGVOYW1lKDExIT09Yi5ub2RlVHlwZT9iOmIuZmlyc3RDaGlsZCwidHIiKT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHxhLmFwcGVuZENoaWxkKGEub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKTphfWZ1bmN0aW9uIHFhKGEpe3JldHVybiBhLnR5cGU9KG51bGwhPT1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24gcmEoYSl7dmFyIGI9bmEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiBzYShhLGIpe3ZhciBjLGQsZSxmLGcsaCxpLGo7aWYoMT09PWIubm9kZVR5cGUpe2lmKE4uaGFzRGF0YShhKSYmKGY9Ti5hY2Nlc3MoYSksZz1OLnNldChiLGYpLGo9Zi5ldmVudHMpKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGUgaW4gailmb3IoYz0wLGQ9altlXS5sZW5ndGg7ZD5jO2MrKyluLmV2ZW50LmFkZChiLGUsaltlXVtjXSl9Ty5oYXNEYXRhKGEpJiYoaD1PLmFjY2VzcyhhKSxpPW4uZXh0ZW5kKHt9LGgpLE8uc2V0KGIsaSkpfX1mdW5jdGlvbiB0YShhLGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsiaW5wdXQiPT09YyYmWC50ZXN0KGEudHlwZSk/Yi5jaGVja2VkPWEuY2hlY2tlZDoiaW5wdXQiIT09YyYmInRleHRhcmVhIiE9PWN8fChiLmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZSl9ZnVuY3Rpb24gdWEoYSxiLGMsZCl7Yj1mLmFwcGx5KFtdLGIpO3ZhciBlLGcsaCxpLGosayxtPTAsbz1hLmxlbmd0aCxwPW8tMSxxPWJbMF0scj1uLmlzRnVuY3Rpb24ocSk7aWYocnx8bz4xJiYic3RyaW5nIj09dHlwZW9mIHEmJiFsLmNoZWNrQ2xvbmUmJm1hLnRlc3QocSkpcmV0dXJuIGEuZWFjaChmdW5jdGlvbihlKXt2YXIgZj1hLmVxKGUpO3ImJihiWzBdPXEuY2FsbCh0aGlzLGUsZi5odG1sKCkpKSx1YShmLGIsYyxkKX0pO2lmKG8mJihlPWNhKGIsYVswXS5vd25lckRvY3VtZW50LCExLGEsZCksZz1lLmZpcnN0Q2hpbGQsMT09PWUuY2hpbGROb2Rlcy5sZW5ndGgmJihlPWcpLGd8fGQpKXtmb3IoaD1uLm1hcChfKGUsInNjcmlwdCIpLHFhKSxpPWgubGVuZ3RoO28+bTttKyspaj1lLG0hPT1wJiYoaj1uLmNsb25lKGosITAsITApLGkmJm4ubWVyZ2UoaCxfKGosInNjcmlwdCIpKSksYy5jYWxsKGFbbV0saixtKTtpZihpKWZvcihrPWhbaC5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxuLm1hcChoLHJhKSxtPTA7aT5tO20rKylqPWhbbV0sWi50ZXN0KGoudHlwZXx8IiIpJiYhTi5hY2Nlc3MoaiwiZ2xvYmFsRXZhbCIpJiZuLmNvbnRhaW5zKGssaikmJihqLnNyYz9uLl9ldmFsVXJsJiZuLl9ldmFsVXJsKGouc3JjKTpuLmdsb2JhbEV2YWwoai50ZXh0Q29udGVudC5yZXBsYWNlKG9hLCIiKSkpfXJldHVybiBhfWZ1bmN0aW9uIHZhKGEsYixjKXtmb3IodmFyIGQsZT1iP24uZmlsdGVyKGIsYSk6YSxmPTA7bnVsbCE9KGQ9ZVtmXSk7ZisrKWN8fDEhPT1kLm5vZGVUeXBlfHxuLmNsZWFuRGF0YShfKGQpKSxkLnBhcmVudE5vZGUmJihjJiZuLmNvbnRhaW5zKGQub3duZXJEb2N1bWVudCxkKSYmYWEoXyhkLCJzY3JpcHQiKSksZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpKTtyZXR1cm4gYX1uLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKGthLCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jbG9uZU5vZGUoITApLGk9bi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSk7aWYoIShsLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxuLmlzWE1MRG9jKGEpKSlmb3IoZz1fKGgpLGY9XyhhKSxkPTAsZT1mLmxlbmd0aDtlPmQ7ZCsrKXRhKGZbZF0sZ1tkXSk7aWYoYilpZihjKWZvcihmPWZ8fF8oYSksZz1nfHxfKGgpLGQ9MCxlPWYubGVuZ3RoO2U+ZDtkKyspc2EoZltkXSxnW2RdKTtlbHNlIHNhKGEsaCk7cmV0dXJuIGc9XyhoLCJzY3JpcHQiKSxnLmxlbmd0aD4wJiZhYShnLCFpJiZfKGEsInNjcmlwdCIpKSxofSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZCxlPW4uZXZlbnQuc3BlY2lhbCxmPTA7dm9pZCAwIT09KGM9YVtmXSk7ZisrKWlmKEwoYykpe2lmKGI9Y1tOLmV4cGFuZG9dKXtpZihiLmV2ZW50cylmb3IoZCBpbiBiLmV2ZW50cyllW2RdP24uZXZlbnQucmVtb3ZlKGMsZCk6bi5yZW1vdmVFdmVudChjLGQsYi5oYW5kbGUpO2NbTi5leHBhbmRvXT12b2lkIDB9Y1tPLmV4cGFuZG9dJiYoY1tPLmV4cGFuZG9dPXZvaWQgMCl9fX0pLG4uZm4uZXh0ZW5kKHtkb21NYW5pcDp1YSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHZhKHRoaXMsYSwhMCl9LHJlbW92ZTpmdW5jdGlvbihhKXtyZXR1cm4gdmEodGhpcyxhKX0sdGV4dDpmdW5jdGlvbihhKXtyZXR1cm4gSyh0aGlzLGZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDA9PT1hP24udGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHwodGhpcy50ZXh0Q29udGVudD1hKX0pfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB1YSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9cGEodGhpcyxhKTtiLmFwcGVuZENoaWxkKGEpfX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHVhKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj1wYSh0aGlzLGEpO2IuaW5zZXJ0QmVmb3JlKGEsYi5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHVhKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHVhKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSl9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhLGI9MDtudWxsIT0oYT10aGlzW2JdKTtiKyspMT09PWEubm9kZVR5cGUmJihuLmNsZWFuRGF0YShfKGEsITEpKSxhLnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1udWxsPT1hPyExOmEsYj1udWxsPT1iP2E6Yix0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBuLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBLKHRoaXMsZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXXx8e30sYz0wLGQ9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09YSYmMT09PWIubm9kZVR5cGUpcmV0dXJuIGIuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmIWxhLnRlc3QoYSkmJiEkWyhZLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXthPW4uaHRtbFByZWZpbHRlcihhKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihuLmNsZWFuRGF0YShfKGIsITEpKSxiLmlubmVySFRNTD1hKTtiPTB9Y2F0Y2goZSl7fX1iJiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIHVhKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMucGFyZW50Tm9kZTtuLmluQXJyYXkodGhpcyxhKTwwJiYobi5jbGVhbkRhdGEoXyh0aGlzKSksYyYmYy5yZXBsYWNlQ2hpbGQoYix0aGlzKSl9LGEpfX0pLG4uZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhKXtmb3IodmFyIGMsZD1bXSxlPW4oYSksZj1lLmxlbmd0aC0xLGg9MDtmPj1oO2grKyljPWg9PT1mP3RoaXM6dGhpcy5jbG9uZSghMCksbihlW2hdKVtiXShjKSxnLmFwcGx5KGQsYy5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGQpfX0pO3ZhciB3YSx4YT17SFRNTDoiYmxvY2siLEJPRFk6ImJsb2NrIn07ZnVuY3Rpb24geWEoYSxiKXt2YXIgYz1uKGIuY3JlYXRlRWxlbWVudChhKSkuYXBwZW5kVG8oYi5ib2R5KSxkPW4uY3NzKGNbMF0sImRpc3BsYXkiKTtyZXR1cm4gYy5kZXRhY2goKSxkfWZ1bmN0aW9uIHphKGEpe3ZhciBiPWQsYz14YVthXTtyZXR1cm4gY3x8KGM9eWEoYSxiKSwibm9uZSIhPT1jJiZjfHwod2E9KHdhfHxuKCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikpLmFwcGVuZFRvKGIuZG9jdW1lbnRFbGVtZW50KSxiPXdhWzBdLmNvbnRlbnREb2N1bWVudCxiLndyaXRlKCksYi5jbG9zZSgpLGM9eWEoYSxiKSx3YS5kZXRhY2goKSkseGFbYV09YyksY312YXIgQWE9L15tYXJnaW4vLEJhPW5ldyBSZWdFeHAoIl4oIitTKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksQ2E9ZnVuY3Rpb24oYil7dmFyIGM9Yi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiBjJiZjLm9wZW5lcnx8KGM9YSksYy5nZXRDb21wdXRlZFN0eWxlKGIpfSxEYT1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGc9e307Zm9yKGYgaW4gYilnW2ZdPWEuc3R5bGVbZl0sYS5zdHlsZVtmXT1iW2ZdO2U9Yy5hcHBseShhLGR8fFtdKTtmb3IoZiBpbiBiKWEuc3R5bGVbZl09Z1tmXTtyZXR1cm4gZX0sRWE9ZC5kb2N1bWVudEVsZW1lbnQ7IWZ1bmN0aW9uKCl7dmFyIGIsYyxlLGYsZz1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGg9ZC5jcmVhdGVFbGVtZW50KCJkaXYiKTtpZihoLnN0eWxlKXtoLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsaC5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLGwuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1oLnN0eWxlLmJhY2tncm91bmRDbGlwLGcuc3R5bGUuY3NzVGV4dD0iYm9yZGVyOjA7d2lkdGg6OHB4O2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweDtwYWRkaW5nOjA7bWFyZ2luLXRvcDoxcHg7cG9zaXRpb246YWJzb2x1dGUiLGcuYXBwZW5kQ2hpbGQoaCk7ZnVuY3Rpb24gaSgpe2guc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt0b3A6MSU7d2lkdGg6NTAlIixoLmlubmVySFRNTD0iIixFYS5hcHBlbmRDaGlsZChnKTt2YXIgZD1hLmdldENvbXB1dGVkU3R5bGUoaCk7Yj0iMSUiIT09ZC50b3AsZj0iMnB4Ij09PWQubWFyZ2luTGVmdCxjPSI0cHgiPT09ZC53aWR0aCxoLnN0eWxlLm1hcmdpblJpZ2h0PSI1MCUiLGU9IjRweCI9PT1kLm1hcmdpblJpZ2h0LEVhLnJlbW92ZUNoaWxkKGcpfW4uZXh0ZW5kKGwse3BpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gaSgpLGJ9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWMmJmkoKSxjfSxwaXhlbE1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWMmJmkoKSxlfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09YyYmaSgpLGZ9LHJlbGlhYmxlTWFyZ2luUmlnaHQ6ZnVuY3Rpb24oKXt2YXIgYixjPWguYXBwZW5kQ2hpbGQoZC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmV0dXJuIGMuc3R5bGUuY3NzVGV4dD1oLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIixjLnN0eWxlLm1hcmdpblJpZ2h0PWMuc3R5bGUud2lkdGg9IjAiLGguc3R5bGUud2lkdGg9IjFweCIsRWEuYXBwZW5kQ2hpbGQoZyksYj0hcGFyc2VGbG9hdChhLmdldENvbXB1dGVkU3R5bGUoYykubWFyZ2luUmlnaHQpLEVhLnJlbW92ZUNoaWxkKGcpLGgucmVtb3ZlQ2hpbGQoYyksYn19KX19KCk7ZnVuY3Rpb24gRmEoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5zdHlsZTtyZXR1cm4gYz1jfHxDYShhKSxnPWM/Yy5nZXRQcm9wZXJ0eVZhbHVlKGIpfHxjW2JdOnZvaWQgMCwiIiE9PWcmJnZvaWQgMCE9PWd8fG4uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1uLnN0eWxlKGEsYikpLGMmJiFsLnBpeGVsTWFyZ2luUmlnaHQoKSYmQmEudGVzdChnKSYmQWEudGVzdChiKSYmKGQ9aC53aWR0aCxlPWgubWluV2lkdGgsZj1oLm1heFdpZHRoLGgubWluV2lkdGg9aC5tYXhXaWR0aD1oLndpZHRoPWcsZz1jLndpZHRoLGgud2lkdGg9ZCxoLm1pbldpZHRoPWUsaC5tYXhXaWR0aD1mKSx2b2lkIDAhPT1nP2crIiI6Z31mdW5jdGlvbiBHYShhLGIpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX12YXIgSGE9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLElhPXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxKYT17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn0sS2E9WyJXZWJraXQiLCJPIiwiTW96IiwibXMiXSxMYT1kLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlO2Z1bmN0aW9uIE1hKGEpe2lmKGEgaW4gTGEpcmV0dXJuIGE7dmFyIGI9YVswXS50b1VwcGVyQ2FzZSgpK2Euc2xpY2UoMSksYz1LYS5sZW5ndGg7d2hpbGUoYy0tKWlmKGE9S2FbY10rYixhIGluIExhKXJldHVybiBhfWZ1bmN0aW9uIE5hKGEsYixjKXt2YXIgZD1ULmV4ZWMoYik7cmV0dXJuIGQ/TWF0aC5tYXgoMCxkWzJdLShjfHwwKSkrKGRbM118fCJweCIpOmJ9ZnVuY3Rpb24gT2EoYSxiLGMsZCxlKXtmb3IodmFyIGY9Yz09PShkPyJib3JkZXIiOiJjb250ZW50Iik/NDoid2lkdGgiPT09Yj8xOjAsZz0wOzQ+ZjtmKz0yKSJtYXJnaW4iPT09YyYmKGcrPW4uY3NzKGEsYytVW2ZdLCEwLGUpKSxkPygiY29udGVudCI9PT1jJiYoZy09bi5jc3MoYSwicGFkZGluZyIrVVtmXSwhMCxlKSksIm1hcmdpbiIhPT1jJiYoZy09bi5jc3MoYSwiYm9yZGVyIitVW2ZdKyJXaWR0aCIsITAsZSkpKTooZys9bi5jc3MoYSwicGFkZGluZyIrVVtmXSwhMCxlKSwicGFkZGluZyIhPT1jJiYoZys9bi5jc3MoYSwiYm9yZGVyIitVW2ZdKyJXaWR0aCIsITAsZSkpKTtyZXR1cm4gZ31mdW5jdGlvbiBQYShhLGIsYyl7dmFyIGQ9ITAsZT0id2lkdGgiPT09Yj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGY9Q2EoYSksZz0iYm9yZGVyLWJveCI9PT1uLmNzcyhhLCJib3hTaXppbmciLCExLGYpO2lmKDA+PWV8fG51bGw9PWUpe2lmKGU9RmEoYSxiLGYpLCgwPmV8fG51bGw9PWUpJiYoZT1hLnN0eWxlW2JdKSxCYS50ZXN0KGUpKXJldHVybiBlO2Q9ZyYmKGwuYm94U2l6aW5nUmVsaWFibGUoKXx8ZT09PWEuc3R5bGVbYl0pLGU9cGFyc2VGbG9hdChlKXx8MH1yZXR1cm4gZStPYShhLGIsY3x8KGc/ImJvcmRlciI6ImNvbnRlbnQiKSxkLGYpKyJweCJ9ZnVuY3Rpb24gUWEoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109Ti5nZXQoZCwib2xkZGlzcGxheSIpLGM9ZC5zdHlsZS5kaXNwbGF5LGI/KGZbZ118fCJub25lIiE9PWN8fChkLnN0eWxlLmRpc3BsYXk9IiIpLCIiPT09ZC5zdHlsZS5kaXNwbGF5JiZWKGQpJiYoZltnXT1OLmFjY2VzcyhkLCJvbGRkaXNwbGF5Iix6YShkLm5vZGVOYW1lKSkpKTooZT1WKGQpLCJub25lIj09PWMmJmV8fE4uc2V0KGQsIm9sZGRpc3BsYXkiLGU/YzpuLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfW4uZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9RmEoYSwib3BhY2l0eSIpO3JldHVybiIiPT09Yz8iMSI6Y319fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7ImZsb2F0IjoiY3NzRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGIsYyxkKXtpZihhJiYzIT09YS5ub2RlVHlwZSYmOCE9PWEubm9kZVR5cGUmJmEuc3R5bGUpe3ZhciBlLGYsZyxoPW4uY2FtZWxDYXNlKGIpLGk9YS5zdHlsZTtyZXR1cm4gYj1uLmNzc1Byb3BzW2hdfHwobi5jc3NQcm9wc1toXT1NYShoKXx8aCksZz1uLmNzc0hvb2tzW2JdfHxuLmNzc0hvb2tzW2hdLHZvaWQgMD09PWM/ZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl06KGY9dHlwZW9mIGMsInN0cmluZyI9PT1mJiYoZT1ULmV4ZWMoYykpJiZlWzFdJiYoYz1XKGEsYixlKSxmPSJudW1iZXIiKSxudWxsIT1jJiZjPT09YyYmKCJudW1iZXIiPT09ZiYmKGMrPWUmJmVbM118fChuLmNzc051bWJlcltoXT8iIjoicHgiKSksbC5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLGcmJiJzZXQiaW4gZyYmdm9pZCAwPT09KGM9Zy5zZXQoYSxjLGQpKXx8KGlbYl09YykpLHZvaWQgMCl9fSxjc3M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGg9bi5jYW1lbENhc2UoYik7cmV0dXJuIGI9bi5jc3NQcm9wc1toXXx8KG4uY3NzUHJvcHNbaF09TWEoaCl8fGgpLGc9bi5jc3NIb29rc1tiXXx8bi5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihlPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWUmJihlPUZhKGEsYixkKSksIm5vcm1hbCI9PT1lJiZiIGluIEphJiYoZT1KYVtiXSksIiI9PT1jfHxjPyhmPXBhcnNlRmxvYXQoZSksYz09PSEwfHxpc0Zpbml0ZShmKT9mfHwwOmUpOmV9fSksbi5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe24uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/SGEudGVzdChuLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9EYShhLElhLGZ1bmN0aW9uKCl7cmV0dXJuIFBhKGEsYixkKX0pOlBhKGEsYixkKTp2b2lkIDB9LHNldDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZj1kJiZDYShhKSxnPWQmJk9hKGEsYixkLCJib3JkZXItYm94Ij09PW4uY3NzKGEsImJveFNpemluZyIsITEsZiksZik7cmV0dXJuIGcmJihlPVQuZXhlYyhjKSkmJiJweCIhPT0oZVszXXx8InB4IikmJihhLnN0eWxlW2JdPWMsYz1uLmNzcyhhLGIpKSxOYShhLGMsZyl9fX0pLG4uY3NzSG9va3MubWFyZ2luTGVmdD1HYShsLnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihhLGIpe3JldHVybiBiPyhwYXJzZUZsb2F0KEZhKGEsIm1hcmdpbkxlZnQiKSl8fGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC1EYShhLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgiOnZvaWQgMH0pLG4uY3NzSG9va3MubWFyZ2luUmlnaHQ9R2EobC5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/RGEoYSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sRmEsW2EsIm1hcmdpblJpZ2h0Il0pOnZvaWQgMH0pLG4uZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1thK2JdPXtleHBhbmQ6ZnVuY3Rpb24oYyl7Zm9yKHZhciBkPTAsZT17fSxmPSJzdHJpbmciPT10eXBlb2YgYz9jLnNwbGl0KCIgIik6W2NdOzQ+ZDtkKyspZVthK1VbZF0rYl09ZltkXXx8ZltkLTJdfHxmWzBdO3JldHVybiBlfX0sQWEudGVzdChhKXx8KG4uY3NzSG9va3NbYStiXS5zZXQ9TmEpfSksbi5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihhLGIpe3JldHVybiBLKHRoaXMsZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj17fSxnPTA7aWYobi5pc0FycmF5KGIpKXtmb3IoZD1DYShhKSxlPWIubGVuZ3RoO2U+ZztnKyspZltiW2ddXT1uLmNzcyhhLGJbZ10sITEsZCk7cmV0dXJuIGZ9cmV0dXJuIHZvaWQgMCE9PWM/bi5zdHlsZShhLGIsYyk6bi5jc3MoYSxiKX0sYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gUWEodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gUWEodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBhP2E/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Vih0aGlzKT9uKHRoaXMpLnNob3coKTpuKHRoaXMpLmhpZGUoKX0pfX0pO2Z1bmN0aW9uIFJhKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBSYS5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfW4uVHdlZW49UmEsUmEucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpSYSxpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHxuLmVhc2luZy5fZGVmYXVsdCx0aGlzLm9wdGlvbnM9Yix0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCksdGhpcy5lbmQ9ZCx0aGlzLnVuaXQ9Znx8KG4uY3NzTnVtYmVyW2NdPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgYT1SYS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gYSYmYS5nZXQ/YS5nZXQodGhpcyk6UmEucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGEpe3ZhciBiLGM9UmEucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz1iPW4uZWFzaW5nW3RoaXMuZWFzaW5nXShhLHRoaXMub3B0aW9ucy5kdXJhdGlvbiphLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPWI9YSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqYit0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxjJiZjLnNldD9jLnNldCh0aGlzKTpSYS5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxSYS5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9UmEucHJvdG90eXBlLFJhLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihhKXt2YXIgYjtyZXR1cm4gMSE9PWEuZWxlbS5ub2RlVHlwZXx8bnVsbCE9YS5lbGVtW2EucHJvcF0mJm51bGw9PWEuZWxlbS5zdHlsZVthLnByb3BdP2EuZWxlbVthLnByb3BdOihiPW4uY3NzKGEuZWxlbSxhLnByb3AsIiIpLGImJiJhdXRvIiE9PWI/YjowKX0sc2V0OmZ1bmN0aW9uKGEpe24uZnguc3RlcFthLnByb3BdP24uZnguc3RlcFthLnByb3BdKGEpOjEhPT1hLmVsZW0ubm9kZVR5cGV8fG51bGw9PWEuZWxlbS5zdHlsZVtuLmNzc1Byb3BzW2EucHJvcF1dJiYhbi5jc3NIb29rc1thLnByb3BdP2EuZWxlbVthLnByb3BdPWEubm93Om4uc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpfX19LFJhLnByb3BIb29rcy5zY3JvbGxUb3A9UmEucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sbi5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxuLmZ4PVJhLnByb3RvdHlwZS5pbml0LG4uZnguc3RlcD17fTt2YXIgU2EsVGEsVWE9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFZhPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gV2EoKXtyZXR1cm4gYS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7U2E9dm9pZCAwfSksU2E9bi5ub3coKX1mdW5jdGlvbiBYYShhLGIpe3ZhciBjLGQ9MCxlPXtoZWlnaHQ6YX07Zm9yKGI9Yj8xOjA7ND5kO2QrPTItYiljPVVbZF0sZVsibWFyZ2luIitjXT1lWyJwYWRkaW5nIitjXT1hO3JldHVybiBiJiYoZS5vcGFjaXR5PWUud2lkdGg9YSksZX1mdW5jdGlvbiBZYShhLGIsYyl7Zm9yKHZhciBkLGU9KF9hLnR3ZWVuZXJzW2JdfHxbXSkuY29uY2F0KF9hLnR3ZWVuZXJzWyIqIl0pLGY9MCxnPWUubGVuZ3RoO2c+ZjtmKyspaWYoZD1lW2ZdLmNhbGwoYyxiLGEpKXJldHVybiBkfWZ1bmN0aW9uIFphKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrLGw9dGhpcyxtPXt9LG89YS5zdHlsZSxwPWEubm9kZVR5cGUmJlYoYSkscT1OLmdldChhLCJmeHNob3ciKTtjLnF1ZXVlfHwoaD1uLl9xdWV1ZUhvb2tzKGEsImZ4IiksbnVsbD09aC51bnF1ZXVlZCYmKGgudW5xdWV1ZWQ9MCxpPWguZW1wdHkuZmlyZSxoLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtoLnVucXVldWVkfHxpKCl9KSxoLnVucXVldWVkKyssbC5hbHdheXMoZnVuY3Rpb24oKXtsLmFsd2F5cyhmdW5jdGlvbigpe2gudW5xdWV1ZWQtLSxuLnF1ZXVlKGEsImZ4IikubGVuZ3RofHxoLmVtcHR5LmZpcmUoKX0pfSkpLDE9PT1hLm5vZGVUeXBlJiYoImhlaWdodCJpbiBifHwid2lkdGgiaW4gYikmJihjLm92ZXJmbG93PVtvLm92ZXJmbG93LG8ub3ZlcmZsb3dYLG8ub3ZlcmZsb3dZXSxqPW4uY3NzKGEsImRpc3BsYXkiKSxrPSJub25lIj09PWo/Ti5nZXQoYSwib2xkZGlzcGxheSIpfHx6YShhLm5vZGVOYW1lKTpqLCJpbmxpbmUiPT09ayYmIm5vbmUiPT09bi5jc3MoYSwiZmxvYXQiKSYmKG8uZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLGMub3ZlcmZsb3cmJihvLm92ZXJmbG93PSJoaWRkZW4iLGwuYWx3YXlzKGZ1bmN0aW9uKCl7by5vdmVyZmxvdz1jLm92ZXJmbG93WzBdLG8ub3ZlcmZsb3dYPWMub3ZlcmZsb3dbMV0sby5vdmVyZmxvd1k9Yy5vdmVyZmxvd1syXX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxVYS5leGVjKGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fCJ0b2dnbGUiPT09ZSxlPT09KHA/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWV8fCFxfHx2b2lkIDA9PT1xW2RdKWNvbnRpbnVlO3A9ITB9bVtkXT1xJiZxW2RdfHxuLnN0eWxlKGEsZCl9ZWxzZSBqPXZvaWQgMDtpZihuLmlzRW1wdHlPYmplY3QobSkpImlubGluZSI9PT0oIm5vbmUiPT09aj96YShhLm5vZGVOYW1lKTpqKSYmKG8uZGlzcGxheT1qKTtlbHNle3E/ImhpZGRlbiJpbiBxJiYocD1xLmhpZGRlbik6cT1OLmFjY2VzcyhhLCJmeHNob3ciLHt9KSxmJiYocS5oaWRkZW49IXApLHA/bihhKS5zaG93KCk6bC5kb25lKGZ1bmN0aW9uKCl7bihhKS5oaWRlKCl9KSxsLmRvbmUoZnVuY3Rpb24oKXt2YXIgYjtOLnJlbW92ZShhLCJmeHNob3ciKTtmb3IoYiBpbiBtKW4uc3R5bGUoYSxiLG1bYl0pfSk7Zm9yKGQgaW4gbSlnPVlhKHA/cVtkXTowLGQsbCksZCBpbiBxfHwocVtkXT1nLnN0YXJ0LHAmJihnLmVuZD1nLnN0YXJ0LGcuc3RhcnQ9IndpZHRoIj09PWR8fCJoZWlnaHQiPT09ZD8xOjApKX19ZnVuY3Rpb24gJGEoYSxiKXt2YXIgYyxkLGUsZixnO2ZvcihjIGluIGEpaWYoZD1uLmNhbWVsQ2FzZShjKSxlPWJbZF0sZj1hW2NdLG4uaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9bi5jc3NIb29rc1tkXSxnJiYiZXhwYW5kImluIGcpe2Y9Zy5leHBhbmQoZiksZGVsZXRlIGFbZF07Zm9yKGMgaW4gZiljIGluIGF8fChhW2NdPWZbY10sYltjXT1lKX1lbHNlIGJbZF09ZX1mdW5jdGlvbiBfYShhLGIsYyl7dmFyIGQsZSxmPTAsZz1fYS5wcmVmaWx0ZXJzLmxlbmd0aCxoPW4uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPVNhfHxXYSgpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpuLmV4dGVuZCh7fSxiKSxvcHRzOm4uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpuLmVhc2luZy5fZGVmYXVsdH0sYyksb3JpZ2luYWxQcm9wZXJ0aWVzOmIsb3JpZ2luYWxPcHRpb25zOmMsc3RhcnRUaW1lOlNhfHxXYSgpLGR1cmF0aW9uOmMuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGIsYyl7dmFyIGQ9bi5Ud2VlbihhLGoub3B0cyxiLGMsai5vcHRzLnNwZWNpYWxFYXNpbmdbYl18fGoub3B0cy5lYXNpbmcpO3JldHVybiBqLnR3ZWVucy5wdXNoKGQpLGR9LHN0b3A6ZnVuY3Rpb24oYil7dmFyIGM9MCxkPWI/ai50d2VlbnMubGVuZ3RoOjA7aWYoZSlyZXR1cm4gdGhpcztmb3IoZT0hMDtkPmM7YysrKWoudHdlZW5zW2NdLnJ1bigxKTtyZXR1cm4gYj8oaC5ub3RpZnlXaXRoKGEsW2osMSwwXSksaC5yZXNvbHZlV2l0aChhLFtqLGJdKSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcigkYShrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9X2EucHJlZmlsdGVyc1tmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIG4uaXNGdW5jdGlvbihkLnN0b3ApJiYobi5fcXVldWVIb29rcyhqLmVsZW0sai5vcHRzLnF1ZXVlKS5zdG9wPW4ucHJveHkoZC5zdG9wLGQpKSxkO3JldHVybiBuLm1hcChrLFlhLGopLG4uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG4uZngudGltZXIobi5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bi5BbmltYXRpb249bi5leHRlbmQoX2Ese3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpO3JldHVybiBXKGMuZWxlbSxhLFQuZXhlYyhiKSxjKSxjfV19LHR3ZWVuZXI6ZnVuY3Rpb24oYSxiKXtuLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEubWF0Y2goRyk7Zm9yKHZhciBjLGQ9MCxlPWEubGVuZ3RoO2U+ZDtkKyspYz1hW2RdLF9hLnR3ZWVuZXJzW2NdPV9hLnR3ZWVuZXJzW2NdfHxbXSxfYS50d2VlbmVyc1tjXS51bnNoaWZ0KGIpfSxwcmVmaWx0ZXJzOltaYV0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9fYS5wcmVmaWx0ZXJzLnVuc2hpZnQoYSk6X2EucHJlZmlsdGVycy5wdXNoKGEpfX0pLG4uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9uLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG4uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbi5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1uLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbi5meC5zcGVlZHM/bi5meC5zcGVlZHNbZC5kdXJhdGlvbl06bi5meC5zcGVlZHMuX2RlZmF1bHQsbnVsbCE9ZC5xdWV1ZSYmZC5xdWV1ZSE9PSEwfHwoZC5xdWV1ZT0iZngiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXtuLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJm4uZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxuLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihWKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uLmlzRW1wdHlPYmplY3QoYSksZj1uLnNwZWVkKGIsYyxkKSxnPWZ1bmN0aW9uKCl7dmFyIGI9X2EodGhpcyxuLmV4dGVuZCh7fSxhKSxmKTsoZXx8Ti5nZXQodGhpcywiZmluaXNoIikpJiZiLnN0b3AoITApfTtyZXR1cm4gZy5maW5pc2g9ZyxlfHxmLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZi5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5zdG9wO2RlbGV0ZSBhLnN0b3AsYihjKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYz1iLGI9YSxhPXZvaWQgMCksYiYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPSEwLGU9bnVsbCE9YSYmYSsicXVldWVIb29rcyIsZj1uLnRpbWVycyxnPU4uZ2V0KHRoaXMpO2lmKGUpZ1tlXSYmZ1tlXS5zdG9wJiZkKGdbZV0pO2Vsc2UgZm9yKGUgaW4gZylnW2VdJiZnW2VdLnN0b3AmJlZhLnRlc3QoZSkmJmQoZ1tlXSk7Zm9yKGU9Zi5sZW5ndGg7ZS0tOylmW2VdLmVsZW0hPT10aGlzfHxudWxsIT1hJiZmW2VdLnF1ZXVlIT09YXx8KGZbZV0uYW5pbS5zdG9wKGMpLGI9ITEsZi5zcGxpY2UoZSwxKSk7IWImJmN8fG4uZGVxdWV1ZSh0aGlzLGEpfSl9LGZpbmlzaDpmdW5jdGlvbihhKXtyZXR1cm4gYSE9PSExJiYoYT1hfHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYixjPU4uZ2V0KHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1uLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbi5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxuLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bi5mbltiXTtuLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoWGEoYiwhMCksYSxkLGUpfX0pLG4uZWFjaCh7c2xpZGVEb3duOlhhKCJzaG93Iiksc2xpZGVVcDpYYSgiaGlkZSIpLHNsaWRlVG9nZ2xlOlhhKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxuLnRpbWVycz1bXSxuLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPTAsYz1uLnRpbWVycztmb3IoU2E9bi5ub3coKTtiPGMubGVuZ3RoO2IrKylhPWNbYl0sYSgpfHxjW2JdIT09YXx8Yy5zcGxpY2UoYi0tLDEpO2MubGVuZ3RofHxuLmZ4LnN0b3AoKSxTYT12b2lkIDB9LG4uZngudGltZXI9ZnVuY3Rpb24oYSl7bi50aW1lcnMucHVzaChhKSxhKCk/bi5meC5zdGFydCgpOm4udGltZXJzLnBvcCgpfSxuLmZ4LmludGVydmFsPTEzLG4uZnguc3RhcnQ9ZnVuY3Rpb24oKXtUYXx8KFRhPWEuc2V0SW50ZXJ2YWwobi5meC50aWNrLG4uZnguaW50ZXJ2YWwpKX0sbi5meC5zdG9wPWZ1bmN0aW9uKCl7YS5jbGVhckludGVydmFsKFRhKSxUYT1udWxsfSxuLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxuLmZuLmRlbGF5PWZ1bmN0aW9uKGIsYyl7cmV0dXJuIGI9bi5meD9uLmZ4LnNwZWVkc1tiXXx8YjpiLGM9Y3x8ImZ4Iix0aGlzLnF1ZXVlKGMsZnVuY3Rpb24oYyxkKXt2YXIgZT1hLnNldFRpbWVvdXQoYyxiKTtkLnN0b3A9ZnVuY3Rpb24oKXthLmNsZWFyVGltZW91dChlKX19KX0sZnVuY3Rpb24oKXt2YXIgYT1kLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYj1kLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGM9Yi5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTthLnR5cGU9ImNoZWNrYm94IixsLmNoZWNrT249IiIhPT1hLnZhbHVlLGwub3B0U2VsZWN0ZWQ9Yy5zZWxlY3RlZCxiLmRpc2FibGVkPSEwLGwub3B0RGlzYWJsZWQ9IWMuZGlzYWJsZWQsYT1kLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYS52YWx1ZT0idCIsYS50eXBlPSJyYWRpbyIsbC5yYWRpb1ZhbHVlPSJ0Ij09PWEudmFsdWV9KCk7dmFyIGFiLGJiPW4uZXhwci5hdHRySGFuZGxlO24uZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEsodGhpcyxuLmF0dHIsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe24ucmVtb3ZlQXR0cih0aGlzLGEpfSl9fSksbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj1hLm5vZGVUeXBlO2lmKDMhPT1mJiY4IT09ZiYmMiE9PWYpcmV0dXJuInVuZGVmaW5lZCI9PXR5cGVvZiBhLmdldEF0dHJpYnV0ZT9uLnByb3AoYSxiLGMpOigxPT09ZiYmbi5pc1hNTERvYyhhKXx8KGI9Yi50b0xvd2VyQ2FzZSgpLGU9bi5hdHRySG9va3NbYl18fChuLmV4cHIubWF0Y2guYm9vbC50ZXN0KGIpP2FiOnZvaWQgMCkpLHZvaWQgMCE9PWM/bnVsbD09PWM/dm9pZCBuLnJlbW92ZUF0dHIoYSxiKTplJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDooYS5zZXRBdHRyaWJ1dGUoYixjKyIiKSxjKTplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOihkPW4uZmluZC5hdHRyKGEsYiksbnVsbD09ZD92b2lkIDA6ZCkpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKCFsLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1iJiZuLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKSxifX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPTAsZj1iJiZiLm1hdGNoKEcpO2lmKGYmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZltlKytdKWQ9bi5wcm9wRml4W2NdfHxjLG4uZXhwci5tYXRjaC5ib29sLnRlc3QoYykmJihhW2RdPSExKSxhLnJlbW92ZUF0dHJpYnV0ZShjKX19KSxhYj17c2V0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYj09PSExP24ucmVtb3ZlQXR0cihhLGMpOmEuc2V0QXR0cmlidXRlKGMsYyksY319LG4uZWFjaChuLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGIpe3ZhciBjPWJiW2JdfHxuLmZpbmQuYXR0cjtiYltiXT1mdW5jdGlvbihhLGIsZCl7dmFyIGUsZjtyZXR1cm4gZHx8KGY9YmJbYl0sYmJbYl09ZSxlPW51bGwhPWMoYSxiLGQpP2IudG9Mb3dlckNhc2UoKTpudWxsLGJiW2JdPWYpLGV9fSk7dmFyIGNiPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksZGI9L14oPzphfGFyZWEpJC9pO24uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEsodGhpcyxuLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW24ucHJvcEZpeFthXXx8YV19KX19KSxuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gMT09PWYmJm4uaXNYTUxEb2MoYSl8fChiPW4ucHJvcEZpeFtiXXx8YixlPW4ucHJvcEhvb2tzW2JdKSwKdm9pZCAwIT09Yz9lJiYic2V0ImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDphW2JdPWM6ZSYmImdldCJpbiBlJiZudWxsIT09KGQ9ZS5nZXQoYSxiKSk/ZDphW2JdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bi5maW5kLmF0dHIoYSwidGFiaW5kZXgiKTtyZXR1cm4gYj9wYXJzZUludChiLDEwKTpjYi50ZXN0KGEubm9kZU5hbWUpfHxkYi50ZXN0KGEubm9kZU5hbWUpJiZhLmhyZWY/MDotMX19fSxwcm9wRml4OnsiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIn19KSxsLm9wdFNlbGVjdGVkfHwobi5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJmIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH0sc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pLG4uZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7bi5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pO3ZhciBlYj0vW1x0XHJcblxmXS9nO2Z1bmN0aW9uIGZiKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifW4uZm4uZXh0ZW5kKHthZGRDbGFzczpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpPTA7aWYobi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLGZiKHRoaXMpKSl9KTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2I9YS5tYXRjaChHKXx8W107d2hpbGUoYz10aGlzW2krK10paWYoZT1mYihjKSxkPTE9PT1jLm5vZGVUeXBlJiYoIiAiK2UrIiAiKS5yZXBsYWNlKGViLCIgIikpe2c9MDt3aGlsZShmPWJbZysrXSlkLmluZGV4T2YoIiAiK2YrIiAiKTwwJiYoZCs9ZisiICIpO2g9bi50cmltKGQpLGUhPT1oJiZjLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGgpfX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaT0wO2lmKG4uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYixmYih0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2I9YS5tYXRjaChHKXx8W107d2hpbGUoYz10aGlzW2krK10paWYoZT1mYihjKSxkPTE9PT1jLm5vZGVUeXBlJiYoIiAiK2UrIiAiKS5yZXBsYWNlKGViLCIgIikpe2c9MDt3aGlsZShmPWJbZysrXSl3aGlsZShkLmluZGV4T2YoIiAiK2YrIiAiKT4tMSlkPWQucmVwbGFjZSgiICIrZisiICIsIiAiKTtoPW4udHJpbShkKSxlIT09aCYmYy5zZXRBdHRyaWJ1dGUoImNsYXNzIixoKX19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYiYmInN0cmluZyI9PT1jP2I/dGhpcy5hZGRDbGFzcyhhKTp0aGlzLnJlbW92ZUNsYXNzKGEpOm4uaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYyl7bih0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLGZiKHRoaXMpLGIpLGIpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsZCxlLGY7aWYoInN0cmluZyI9PT1jKXtkPTAsZT1uKHRoaXMpLGY9YS5tYXRjaChHKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZSB2b2lkIDAhPT1hJiYiYm9vbGVhbiIhPT1jfHwoYj1mYih0aGlzKSxiJiZOLnNldCh0aGlzLCJfX2NsYXNzTmFtZV9fIixiKSx0aGlzLnNldEF0dHJpYnV0ZSYmdGhpcy5zZXRBdHRyaWJ1dGUoImNsYXNzIixifHxhPT09ITE/IiI6Ti5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD0wO2I9IiAiK2ErIiAiO3doaWxlKGM9dGhpc1tkKytdKWlmKDE9PT1jLm5vZGVUeXBlJiYoIiAiK2ZiKGMpKyIgIikucmVwbGFjZShlYiwiICIpLmluZGV4T2YoYik+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIGdiPS9cci9nLGhiPS9bXHgyMFx0XHJcblxmXSsvZztuLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9bi5pc0Z1bmN0aW9uKGEpLHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZTsxPT09dGhpcy5ub2RlVHlwZSYmKGU9ZD9hLmNhbGwodGhpcyxjLG4odGhpcykudmFsKCkpOmEsbnVsbD09ZT9lPSIiOiJudW1iZXIiPT10eXBlb2YgZT9lKz0iIjpuLmlzQXJyYXkoZSkmJihlPW4ubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPW4udmFsSG9va3NbdGhpcy50eXBlXXx8bi52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPW4udmFsSG9va3NbZS50eXBlXXx8bi52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UoZ2IsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLG4uZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bi5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOm4udHJpbShuLnRleHQoYSkpLnJlcGxhY2UoaGIsIiAiKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQ9YS5vcHRpb25zLGU9YS5zZWxlY3RlZEluZGV4LGY9InNlbGVjdC1vbmUiPT09YS50eXBlfHwwPmUsZz1mP251bGw6W10saD1mP2UrMTpkLmxlbmd0aCxpPTA+ZT9oOmY/ZTowO2g+aTtpKyspaWYoYz1kW2ldLChjLnNlbGVjdGVkfHxpPT09ZSkmJihsLm9wdERpc2FibGVkPyFjLmRpc2FibGVkOm51bGw9PT1jLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSkmJighYy5wYXJlbnROb2RlLmRpc2FibGVkfHwhbi5ub2RlTmFtZShjLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZihiPW4oYykudmFsKCksZilyZXR1cm4gYjtnLnB1c2goYil9cmV0dXJuIGd9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT1hLm9wdGlvbnMsZj1uLm1ha2VBcnJheShiKSxnPWUubGVuZ3RoO3doaWxlKGctLSlkPWVbZ10sKGQuc2VsZWN0ZWQ9bi5pbkFycmF5KG4udmFsSG9va3Mub3B0aW9uLmdldChkKSxmKT4tMSkmJihjPSEwKTtyZXR1cm4gY3x8KGEuc2VsZWN0ZWRJbmRleD0tMSksZn19fX0pLG4uZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe24udmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihhLGIpe3JldHVybiBuLmlzQXJyYXkoYik/YS5jaGVja2VkPW4uaW5BcnJheShuKGEpLnZhbCgpLGIpPi0xOnZvaWQgMH19LGwuY2hlY2tPbnx8KG4udmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjphLnZhbHVlfSl9KTt2YXIgaWI9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvO24uZXh0ZW5kKG4uZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24oYixjLGUsZil7dmFyIGcsaCxpLGosbCxtLG8scD1bZXx8ZF0scT1rLmNhbGwoYiwidHlwZSIpP2IudHlwZTpiLHI9ay5jYWxsKGIsIm5hbWVzcGFjZSIpP2IubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYoaD1pPWU9ZXx8ZCwzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJiFpYi50ZXN0KHErbi5ldmVudC50cmlnZ2VyZWQpJiYocS5pbmRleE9mKCIuIik+LTEmJihyPXEuc3BsaXQoIi4iKSxxPXIuc2hpZnQoKSxyLnNvcnQoKSksbD1xLmluZGV4T2YoIjoiKTwwJiYib24iK3EsYj1iW24uZXhwYW5kb10/YjpuZXcgbi5FdmVudChxLCJvYmplY3QiPT10eXBlb2YgYiYmYiksYi5pc1RyaWdnZXI9Zj8yOjMsYi5uYW1lc3BhY2U9ci5qb2luKCIuIiksYi5ybmFtZXNwYWNlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Iuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1lKSxjPW51bGw9PWM/W2JdOm4ubWFrZUFycmF5KGMsW2JdKSxvPW4uZXZlbnQuc3BlY2lhbFtxXXx8e30sZnx8IW8udHJpZ2dlcnx8by50cmlnZ2VyLmFwcGx5KGUsYykhPT0hMSkpe2lmKCFmJiYhby5ub0J1YmJsZSYmIW4uaXNXaW5kb3coZSkpe2ZvcihqPW8uZGVsZWdhdGVUeXBlfHxxLGliLnRlc3QoaitxKXx8KGg9aC5wYXJlbnROb2RlKTtoO2g9aC5wYXJlbnROb2RlKXAucHVzaChoKSxpPWg7aT09PShlLm93bmVyRG9jdW1lbnR8fGQpJiZwLnB1c2goaS5kZWZhdWx0Vmlld3x8aS5wYXJlbnRXaW5kb3d8fGEpfWc9MDt3aGlsZSgoaD1wW2crK10pJiYhYi5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWIudHlwZT1nPjE/ajpvLmJpbmRUeXBlfHxxLG09KE4uZ2V0KGgsImV2ZW50cyIpfHx7fSlbYi50eXBlXSYmTi5nZXQoaCwiaGFuZGxlIiksbSYmbS5hcHBseShoLGMpLG09bCYmaFtsXSxtJiZtLmFwcGx5JiZMKGgpJiYoYi5yZXN1bHQ9bS5hcHBseShoLGMpLGIucmVzdWx0PT09ITEmJmIucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGIudHlwZT1xLGZ8fGIuaXNEZWZhdWx0UHJldmVudGVkKCl8fG8uX2RlZmF1bHQmJm8uX2RlZmF1bHQuYXBwbHkocC5wb3AoKSxjKSE9PSExfHwhTChlKXx8bCYmbi5pc0Z1bmN0aW9uKGVbcV0pJiYhbi5pc1dpbmRvdyhlKSYmKGk9ZVtsXSxpJiYoZVtsXT1udWxsKSxuLmV2ZW50LnRyaWdnZXJlZD1xLGVbcV0oKSxuLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsaSYmKGVbbF09aSkpLGIucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPW4uZXh0ZW5kKG5ldyBuLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMH0pO24uZXZlbnQudHJpZ2dlcihkLG51bGwsYil9fSksbi5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXNbMF07cmV0dXJuIGM/bi5ldmVudC50cmlnZ2VyKGEsYixjLCEwKTp2b2lkIDB9fSksbi5lYWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7bi5mbltiXT1mdW5jdGlvbihhLGMpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihiLG51bGwsYSxjKTp0aGlzLnRyaWdnZXIoYil9fSksbi5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pLGwuZm9jdXNpbj0ib25mb2N1c2luImluIGEsbC5mb2N1c2lufHxuLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7dmFyIGM9ZnVuY3Rpb24oYSl7bi5ldmVudC5zaW11bGF0ZShiLGEudGFyZ2V0LG4uZXZlbnQuZml4KGEpKX07bi5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPU4uYWNjZXNzKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksTi5hY2Nlc3MoZCxiLChlfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1OLmFjY2VzcyhkLGIpLTE7ZT9OLmFjY2VzcyhkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLE4ucmVtb3ZlKGQsYikpfX19KTt2YXIgamI9YS5sb2NhdGlvbixrYj1uLm5vdygpLGxiPS9cPy87bi5wYXJzZUpTT049ZnVuY3Rpb24oYSl7cmV0dXJuIEpTT04ucGFyc2UoYSsiIil9LG4ucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGM7aWYoIWJ8fCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gbnVsbDt0cnl7Yz0obmV3IGEuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKX1jYXRjaChkKXtjPXZvaWQgMH1yZXR1cm4gYyYmIWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHxuLmVycm9yKCJJbnZhbGlkIFhNTDogIitiKSxjfTt2YXIgbWI9LyMuKiQvLG5iPS8oWz8mXSlfPVteJl0qLyxvYj0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLHBiPS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLHFiPS9eKD86R0VUfEhFQUQpJC8scmI9L15cL1wvLyxzYj17fSx0Yj17fSx1Yj0iKi8iLmNvbmNhdCgiKiIpLHZiPWQuY3JlYXRlRWxlbWVudCgiYSIpO3ZiLmhyZWY9amIuaHJlZjtmdW5jdGlvbiB3YihhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWIsYj0iKiIpO3ZhciBkLGU9MCxmPWIudG9Mb3dlckNhc2UoKS5tYXRjaChHKXx8W107aWYobi5pc0Z1bmN0aW9uKGMpKXdoaWxlKGQ9ZltlKytdKSIrIj09PWRbMF0/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24geGIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09dGI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxuLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiB5YihhLGIpe3ZhciBjLGQsZT1uLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGMgaW4gYil2b2lkIDAhPT1iW2NdJiYoKGVbY10/YTpkfHwoZD17fSkpW2NdPWJbY10pO3JldHVybiBkJiZuLmV4dGVuZCghMCxhLGQpLGF9ZnVuY3Rpb24gemIoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWQmJihkPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihkKWZvcihlIGluIGgpaWYoaFtlXSYmaFtlXS50ZXN0KGQpKXtpLnVuc2hpZnQoZSk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGUgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tlKyIgIitpWzBdXSl7Zj1lO2JyZWFrfWd8fChnPWUpfWY9Znx8Z31yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gQWIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1uLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6amIuaHJlZix0eXBlOiJHRVQiLGlzTG9jYWw6cGIudGVzdChqYi5wcm90b2NvbCksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjp1Yix0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDovXGJ4bWxcYi8saHRtbDovXGJodG1sLyxqc29uOi9cYmpzb25cYi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpuLnBhcnNlSlNPTiwidGV4dCB4bWwiOm4ucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe3JldHVybiBiP3liKHliKGEsbi5hamF4U2V0dGluZ3MpLGIpOnliKG4uYWpheFNldHRpbmdzLGEpfSxhamF4UHJlZmlsdGVyOndiKHNiKSxhamF4VHJhbnNwb3J0OndiKHRiKSxhamF4OmZ1bmN0aW9uKGIsYyl7Im9iamVjdCI9PXR5cGVvZiBiJiYoYz1iLGI9dm9pZCAwKSxjPWN8fHt9O3ZhciBlLGYsZyxoLGksaixrLGwsbT1uLmFqYXhTZXR1cCh7fSxjKSxvPW0uY29udGV4dHx8bSxwPW0uY29udGV4dCYmKG8ubm9kZVR5cGV8fG8uanF1ZXJ5KT9uKG8pOm4uZXZlbnQscT1uLkRlZmVycmVkKCkscj1uLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxzPW0uc3RhdHVzQ29kZXx8e30sdD17fSx1PXt9LHY9MCx3PSJjYW5jZWxlZCIseD17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKDI9PT12KXtpZighaCl7aD17fTt3aGlsZShiPW9iLmV4ZWMoZykpaFtiWzFdLnRvTG93ZXJDYXNlKCldPWJbMl19Yj1oW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PWI/bnVsbDpifSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXY/ZzpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO3JldHVybiB2fHwoYT11W2NdPXVbY118fGEsdFthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiB2fHwobS5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoMj52KWZvcihiIGluIGEpc1tiXT1bc1tiXSxhW2JdXTtlbHNlIHguYWx3YXlzKGFbeC5zdGF0dXNdKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YXx8dztyZXR1cm4gZSYmZS5hYm9ydChiKSx6KDAsYiksdGhpc319O2lmKHEucHJvbWlzZSh4KS5jb21wbGV0ZT1yLmFkZCx4LnN1Y2Nlc3M9eC5kb25lLHguZXJyb3I9eC5mYWlsLG0udXJsPSgoYnx8bS51cmx8fGpiLmhyZWYpKyIiKS5yZXBsYWNlKG1iLCIiKS5yZXBsYWNlKHJiLGpiLnByb3RvY29sKyIvLyIpLG0udHlwZT1jLm1ldGhvZHx8Yy50eXBlfHxtLm1ldGhvZHx8bS50eXBlLG0uZGF0YVR5cGVzPW4udHJpbShtLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goRyl8fFsiIl0sbnVsbD09bS5jcm9zc0RvbWFpbil7aj1kLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7ai5ocmVmPW0udXJsLGouaHJlZj1qLmhyZWYsbS5jcm9zc0RvbWFpbj12Yi5wcm90b2NvbCsiLy8iK3ZiLmhvc3QhPWoucHJvdG9jb2wrIi8vIitqLmhvc3R9Y2F0Y2goeSl7bS5jcm9zc0RvbWFpbj0hMH19aWYobS5kYXRhJiZtLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIG0uZGF0YSYmKG0uZGF0YT1uLnBhcmFtKG0uZGF0YSxtLnRyYWRpdGlvbmFsKSkseGIoc2IsbSxjLHgpLDI9PT12KXJldHVybiB4O2s9bi5ldmVudCYmbS5nbG9iYWwsayYmMD09PW4uYWN0aXZlKysmJm4uZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0IiksbS50eXBlPW0udHlwZS50b1VwcGVyQ2FzZSgpLG0uaGFzQ29udGVudD0hcWIudGVzdChtLnR5cGUpLGY9bS51cmwsbS5oYXNDb250ZW50fHwobS5kYXRhJiYoZj1tLnVybCs9KGxiLnRlc3QoZik/IiYiOiI/IikrbS5kYXRhLGRlbGV0ZSBtLmRhdGEpLG0uY2FjaGU9PT0hMSYmKG0udXJsPW5iLnRlc3QoZik/Zi5yZXBsYWNlKG5iLCIkMV89IitrYisrKTpmKyhsYi50ZXN0KGYpPyImIjoiPyIpKyJfPSIra2IrKykpLG0uaWZNb2RpZmllZCYmKG4ubGFzdE1vZGlmaWVkW2ZdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixuLmxhc3RNb2RpZmllZFtmXSksbi5ldGFnW2ZdJiZ4LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLG4uZXRhZ1tmXSkpLChtLmRhdGEmJm0uaGFzQ29udGVudCYmbS5jb250ZW50VHlwZSE9PSExfHxjLmNvbnRlbnRUeXBlKSYmeC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLG0uY29udGVudFR5cGUpLHguc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixtLmRhdGFUeXBlc1swXSYmbS5hY2NlcHRzW20uZGF0YVR5cGVzWzBdXT9tLmFjY2VwdHNbbS5kYXRhVHlwZXNbMF1dKygiKiIhPT1tLmRhdGFUeXBlc1swXT8iLCAiK3ViKyI7IHE9MC4wMSI6IiIpOm0uYWNjZXB0c1siKiJdKTtmb3IobCBpbiBtLmhlYWRlcnMpeC5zZXRSZXF1ZXN0SGVhZGVyKGwsbS5oZWFkZXJzW2xdKTtpZihtLmJlZm9yZVNlbmQmJihtLmJlZm9yZVNlbmQuY2FsbChvLHgsbSk9PT0hMXx8Mj09PXYpKXJldHVybiB4LmFib3J0KCk7dz0iYWJvcnQiO2ZvcihsIGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXhbbF0obVtsXSk7aWYoZT14Yih0YixtLGMseCkpe2lmKHgucmVhZHlTdGF0ZT0xLGsmJnAudHJpZ2dlcigiYWpheFNlbmQiLFt4LG1dKSwyPT09dilyZXR1cm4geDttLmFzeW5jJiZtLnRpbWVvdXQ+MCYmKGk9YS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eC5hYm9ydCgidGltZW91dCIpfSxtLnRpbWVvdXQpKTt0cnl7dj0xLGUuc2VuZCh0LHopfWNhdGNoKHkpe2lmKCEoMj52KSl0aHJvdyB5O3ooLTEseSl9fWVsc2UgeigtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24geihiLGMsZCxoKXt2YXIgaixsLHQsdSx3LHk9YzsyIT09diYmKHY9MixpJiZhLmNsZWFyVGltZW91dChpKSxlPXZvaWQgMCxnPWh8fCIiLHgucmVhZHlTdGF0ZT1iPjA/NDowLGo9Yj49MjAwJiYzMDA+Ynx8MzA0PT09YixkJiYodT16YihtLHgsZCkpLHU9QWIobSx1LHgsaiksaj8obS5pZk1vZGlmaWVkJiYodz14LmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIiksdyYmKG4ubGFzdE1vZGlmaWVkW2ZdPXcpLHc9eC5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpLHcmJihuLmV0YWdbZl09dykpLDIwND09PWJ8fCJIRUFEIj09PW0udHlwZT95PSJub2NvbnRlbnQiOjMwND09PWI/eT0ibm90bW9kaWZpZWQiOih5PXUuc3RhdGUsbD11LmRhdGEsdD11LmVycm9yLGo9IXQpKToodD15LCFiJiZ5fHwoeT0iZXJyb3IiLDA+YiYmKGI9MCkpKSx4LnN0YXR1cz1iLHguc3RhdHVzVGV4dD0oY3x8eSkrIiIsaj9xLnJlc29sdmVXaXRoKG8sW2wseSx4XSk6cS5yZWplY3RXaXRoKG8sW3gseSx0XSkseC5zdGF0dXNDb2RlKHMpLHM9dm9pZCAwLGsmJnAudHJpZ2dlcihqPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW3gsbSxqP2w6dF0pLHIuZmlyZVdpdGgobyxbeCx5XSksayYmKHAudHJpZ2dlcigiYWpheENvbXBsZXRlIixbeCxtXSksLS1uLmFjdGl2ZXx8bi5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIHh9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLmdldChhLGIsYywianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5nZXQoYSx2b2lkIDAsYiwic2NyaXB0Iil9fSksbi5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGEsYil7bltiXT1mdW5jdGlvbihhLGMsZCxlKXtyZXR1cm4gbi5pc0Z1bmN0aW9uKGMpJiYoZT1lfHxkLGQ9YyxjPXZvaWQgMCksbi5hamF4KG4uZXh0ZW5kKHt1cmw6YSx0eXBlOmIsZGF0YVR5cGU6ZSxkYXRhOmMsc3VjY2VzczpkfSxuLmlzUGxhaW5PYmplY3QoYSkmJmEpKX19KSxuLl9ldmFsVXJsPWZ1bmN0aW9uKGEpe3JldHVybiBuLmFqYXgoe3VybDphLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSl9LG4uZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBuLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxiKSl9KToodGhpc1swXSYmKGI9bihhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApLHRoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSksYi5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3doaWxlKGEuZmlyc3RFbGVtZW50Q2hpbGQpYT1hLmZpcnN0RWxlbWVudENoaWxkO3JldHVybiBhfSkuYXBwZW5kKHRoaXMpKSx0aGlzKX0sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiBuLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPW4odGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9bi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7bih0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe24ubm9kZU5hbWUodGhpcywiYm9keSIpfHxuKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KSxuLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIW4uZXhwci5maWx0ZXJzLnZpc2libGUoYSl9LG4uZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIGEub2Zmc2V0V2lkdGg+MHx8YS5vZmZzZXRIZWlnaHQ+MHx8YS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD4wfTt2YXIgQmI9LyUyMC9nLENiPS9cW1xdJC8sRGI9L1xyP1xuL2csRWI9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLEZiPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBHYihhLGIsYyxkKXt2YXIgZTtpZihuLmlzQXJyYXkoYikpbi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxDYi50ZXN0KGEpP2QoYSxlKTpHYihhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09bi50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpR2IoYSsiWyIrZSsiXSIsYltlXSxjLGQpfW4ucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPW4uaXNGdW5jdGlvbihiKT9iKCk6bnVsbD09Yj8iIjpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtpZih2b2lkIDA9PT1iJiYoYj1uLmFqYXhTZXR0aW5ncyYmbi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLG4uaXNBcnJheShhKXx8YS5qcXVlcnkmJiFuLmlzUGxhaW5PYmplY3QoYSkpbi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlHYihjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZShCYiwiKyIpfSxuLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG4ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT1uLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gYT9uLm1ha2VBcnJheShhKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFuKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmRmIudGVzdCh0aGlzLm5vZGVOYW1lKSYmIUViLnRlc3QoYSkmJih0aGlzLmNoZWNrZWR8fCFYLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9bih0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOm4uaXNBcnJheShjKT9uLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoRGIsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKERiLCJcclxuIil9fSkuZ2V0KCl9fSksbi5hamF4U2V0dGluZ3MueGhyPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgYS5YTUxIdHRwUmVxdWVzdH1jYXRjaChiKXt9fTt2YXIgSGI9ezA6MjAwLDEyMjM6MjA0fSxJYj1uLmFqYXhTZXR0aW5ncy54aHIoKTtsLmNvcnM9ISFJYiYmIndpdGhDcmVkZW50aWFscyJpbiBJYixsLmFqYXg9SWI9ISFJYixuLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24oYil7dmFyIGMsZDtyZXR1cm4gbC5jb3JzfHxJYiYmIWIuY3Jvc3NEb21haW4/e3NlbmQ6ZnVuY3Rpb24oZSxmKXt2YXIgZyxoPWIueGhyKCk7aWYoaC5vcGVuKGIudHlwZSxiLnVybCxiLmFzeW5jLGIudXNlcm5hbWUsYi5wYXNzd29yZCksYi54aHJGaWVsZHMpZm9yKGcgaW4gYi54aHJGaWVsZHMpaFtnXT1iLnhockZpZWxkc1tnXTtiLm1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUmJmgub3ZlcnJpZGVNaW1lVHlwZShiLm1pbWVUeXBlKSxiLmNyb3NzRG9tYWlufHxlWyJYLVJlcXVlc3RlZC1XaXRoIl18fChlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7Zm9yKGcgaW4gZSloLnNldFJlcXVlc3RIZWFkZXIoZyxlW2ddKTtjPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe2MmJihjPWQ9aC5vbmxvYWQ9aC5vbmVycm9yPWgub25hYm9ydD1oLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLCJhYm9ydCI9PT1hP2guYWJvcnQoKToiZXJyb3IiPT09YT8ibnVtYmVyIiE9dHlwZW9mIGguc3RhdHVzP2YoMCwiZXJyb3IiKTpmKGguc3RhdHVzLGguc3RhdHVzVGV4dCk6ZihIYltoLnN0YXR1c118fGguc3RhdHVzLGguc3RhdHVzVGV4dCwidGV4dCIhPT0oaC5yZXNwb25zZVR5cGV8fCJ0ZXh0Iil8fCJzdHJpbmciIT10eXBlb2YgaC5yZXNwb25zZVRleHQ/e2JpbmFyeTpoLnJlc3BvbnNlfTp7dGV4dDpoLnJlc3BvbnNlVGV4dH0saC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0saC5vbmxvYWQ9YygpLGQ9aC5vbmVycm9yPWMoImVycm9yIiksdm9pZCAwIT09aC5vbmFib3J0P2gub25hYm9ydD1kOmgub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09PWgucmVhZHlTdGF0ZSYmYS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyYmZCgpfSl9LGM9YygiYWJvcnQiKTt0cnl7aC5zZW5kKGIuaGFzQ29udGVudCYmYi5kYXRhfHxudWxsKX1jYXRjaChpKXtpZihjKXRocm93IGl9fSxhYm9ydDpmdW5jdGlvbigpe2MmJmMoKX19OnZvaWQgMH0pLG4uYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBuLmdsb2JhbEV2YWwoYSksYX19fSksbi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiKX0pLG4uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjO3JldHVybntzZW5kOmZ1bmN0aW9uKGUsZil7Yj1uKCI8c2NyaXB0PiIpLnByb3Aoe2NoYXJzZXQ6YS5zY3JpcHRDaGFyc2V0LHNyYzphLnVybH0pLm9uKCJsb2FkIGVycm9yIixjPWZ1bmN0aW9uKGEpe2IucmVtb3ZlKCksYz1udWxsLGEmJmYoImVycm9yIj09PWEudHlwZT80MDQ6MjAwLGEudHlwZSl9KSxkLmhlYWQuYXBwZW5kQ2hpbGQoYlswXSl9LGFib3J0OmZ1bmN0aW9uKCl7YyYmYygpfX19fSk7dmFyIEpiPVtdLEtiPS8oPSlcPyg/PSZ8JCl8XD9cPy87bi5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBhPUpiLnBvcCgpfHxuLmV4cGFuZG8rIl8iK2tiKys7cmV0dXJuIHRoaXNbYV09ITAsYX19KSxuLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZSxmLGcsaD1iLmpzb25wIT09ITEmJihLYi50ZXN0KGIudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIGIuZGF0YSYmMD09PShiLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJktiLnRlc3QoYi5kYXRhKSYmImRhdGEiKTtyZXR1cm4gaHx8Impzb25wIj09PWIuZGF0YVR5cGVzWzBdPyhlPWIuanNvbnBDYWxsYmFjaz1uLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaD9iW2hdPWJbaF0ucmVwbGFjZShLYiwiJDEiK2UpOmIuanNvbnAhPT0hMSYmKGIudXJsKz0obGIudGVzdChiLnVybCk/IiYiOiI/IikrYi5qc29ucCsiPSIrZSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIGd8fG4uZXJyb3IoZSsiIHdhcyBub3QgY2FsbGVkIiksZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iLGY9YVtlXSxhW2VdPWZ1bmN0aW9uKCl7Zz1hcmd1bWVudHN9LGQuYWx3YXlzKGZ1bmN0aW9uKCl7dm9pZCAwPT09Zj9uKGEpLnJlbW92ZVByb3AoZSk6YVtlXT1mLGJbZV0mJihiLmpzb25wQ2FsbGJhY2s9Yy5qc29ucENhbGxiYWNrLEpiLnB1c2goZSkpLGcmJm4uaXNGdW5jdGlvbihmKSYmZihnWzBdKSxnPWY9dm9pZCAwfSksInNjcmlwdCIpOnZvaWQgMH0pLG4ucGFyc2VIVE1MPWZ1bmN0aW9uKGEsYixjKXtpZighYXx8InN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBudWxsOyJib29sZWFuIj09dHlwZW9mIGImJihjPWIsYj0hMSksYj1ifHxkO3ZhciBlPXguZXhlYyhhKSxmPSFjJiZbXTtyZXR1cm4gZT9bYi5jcmVhdGVFbGVtZW50KGVbMV0pXTooZT1jYShbYV0sYixmKSxmJiZmLmxlbmd0aCYmbihmKS5yZW1vdmUoKSxuLm1lcmdlKFtdLGUuY2hpbGROb2RlcykpfTt2YXIgTGI9bi5mbi5sb2FkO24uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhJiZMYilyZXR1cm4gTGIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD4tMSYmKGQ9bi50cmltKGEuc2xpY2UoaCkpLGE9YS5zbGljZSgwLGgpKSxuLmlzRnVuY3Rpb24oYik/KGM9YixiPXZvaWQgMCk6YiYmIm9iamVjdCI9PXR5cGVvZiBiJiYoZT0iUE9TVCIpLGcubGVuZ3RoPjAmJm4uYWpheCh7dXJsOmEsdHlwZTplfHwiR0VUIixkYXRhVHlwZToiaHRtbCIsZGF0YTpifSkuZG9uZShmdW5jdGlvbihhKXtmPWFyZ3VtZW50cyxnLmh0bWwoZD9uKCI8ZGl2PiIpLmFwcGVuZChuLnBhcnNlSFRNTChhKSkuZmluZChkKTphKX0pLmFsd2F5cyhjJiZmdW5jdGlvbihhLGIpe2cuZWFjaChmdW5jdGlvbigpe2MuYXBwbHkodGhpcyxmfHxbYS5yZXNwb25zZVRleHQsYixhXSl9KX0pLHRoaXN9LG4uZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGEsYil7bi5mbltiXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5vbihiLGEpfX0pLG4uZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGEpe3JldHVybiBuLmdyZXAobi50aW1lcnMsZnVuY3Rpb24oYil7cmV0dXJuIGE9PT1iLmVsZW19KS5sZW5ndGh9O2Z1bmN0aW9uIE1iKGEpe3JldHVybiBuLmlzV2luZG93KGEpP2E6OT09PWEubm9kZVR5cGUmJmEuZGVmYXVsdFZpZXd9bi5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosaz1uLmNzcyhhLCJwb3NpdGlvbiIpLGw9bihhKSxtPXt9OyJzdGF0aWMiPT09ayYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaD1sLm9mZnNldCgpLGY9bi5jc3MoYSwidG9wIiksaT1uLmNzcyhhLCJsZWZ0Iiksaj0oImFic29sdXRlIj09PWt8fCJmaXhlZCI9PT1rKSYmKGYraSkuaW5kZXhPZigiYXV0byIpPi0xLGo/KGQ9bC5wb3NpdGlvbigpLGc9ZC50b3AsZT1kLmxlZnQpOihnPXBhcnNlRmxvYXQoZil8fDAsZT1wYXJzZUZsb2F0KGkpfHwwKSxuLmlzRnVuY3Rpb24oYikmJihiPWIuY2FsbChhLGMsbi5leHRlbmQoe30saCkpKSxudWxsIT1iLnRvcCYmKG0udG9wPWIudG9wLWgudG9wK2cpLG51bGwhPWIubGVmdCYmKG0ubGVmdD1iLmxlZnQtaC5sZWZ0K2UpLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLG0pOmwuY3NzKG0pfX0sbi5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1hP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24ub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYixjLGQ9dGhpc1swXSxlPXt0b3A6MCxsZWZ0OjB9LGY9ZCYmZC5vd25lckRvY3VtZW50O2lmKGYpcmV0dXJuIGI9Zi5kb2N1bWVudEVsZW1lbnQsbi5jb250YWlucyhiLGQpPyhlPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz1NYihmKSx7dG9wOmUudG9wK2MucGFnZVlPZmZzZXQtYi5jbGllbnRUb3AsbGVmdDplLmxlZnQrYy5wYWdlWE9mZnNldC1iLmNsaWVudExlZnR9KTplfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBhLGIsYz10aGlzWzBdLGQ9e3RvcDowLGxlZnQ6MH07cmV0dXJuImZpeGVkIj09PW4uY3NzKGMsInBvc2l0aW9uIik/Yj1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihhPXRoaXMub2Zmc2V0UGFyZW50KCksYj10aGlzLm9mZnNldCgpLG4ubm9kZU5hbWUoYVswXSwiaHRtbCIpfHwoZD1hLm9mZnNldCgpKSxkLnRvcCs9bi5jc3MoYVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxkLmxlZnQrPW4uY3NzKGFbMF0sImJvcmRlckxlZnRXaWR0aCIsITApKSx7dG9wOmIudG9wLWQudG9wLW4uY3NzKGMsIm1hcmdpblRvcCIsITApLGxlZnQ6Yi5sZWZ0LWQubGVmdC1uLmNzcyhjLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnQ7d2hpbGUoYSYmInN0YXRpYyI9PT1uLmNzcyhhLCJwb3NpdGlvbiIpKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF8fEVhfSl9fSksbi5lYWNoKHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0aW9uKGEsYil7dmFyIGM9InBhZ2VZT2Zmc2V0Ij09PWI7bi5mblthXT1mdW5jdGlvbihkKXtyZXR1cm4gSyh0aGlzLGZ1bmN0aW9uKGEsZCxlKXt2YXIgZj1NYihhKTtyZXR1cm4gdm9pZCAwPT09ZT9mP2ZbYl06YVtkXTp2b2lkKGY/Zi5zY3JvbGxUbyhjP2YucGFnZVhPZmZzZXQ6ZSxjP2U6Zi5wYWdlWU9mZnNldCk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgpfX0pLG4uZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihhLGIpe24uY3NzSG9va3NbYl09R2EobC5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGM/KGM9RmEoYSxiKSxCYS50ZXN0KGMpP24oYSkucG9zaXRpb24oKVtiXSsicHgiOmMpOnZvaWQgMH0pfSksbi5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxiKXtuLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bi5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIEsodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG4uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bi5jc3MoYixjLGcpOm4uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbi5mbi5leHRlbmQoe2JpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGEsIioqIik6dGhpcy5vZmYoYixhfHwiKioiLGMpfSxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofX0pLG4uZm4uYW5kU2VsZj1uLmZuLmFkZEJhY2ssImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIG59KTt2YXIgTmI9YS5qUXVlcnksT2I9YS4kO3JldHVybiBuLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oYil7cmV0dXJuIGEuJD09PW4mJihhLiQ9T2IpLGImJmEualF1ZXJ5PT09biYmKGEualF1ZXJ5PU5iKSxufSxifHwoYS5qUXVlcnk9YS4kPW4pLG59KTsK"},{"meta":{"name":"jszip.min.js","url":"https://cdn.bootcss.com/jszip/3.1.4/jszip.min.js","ts":1648813513916,"mimetype":"text/javascript"},"source":"LyohCgpKU1ppcCB2My4xLjMgLSBBIEphdmFzY3JpcHQgY2xhc3MgZm9yIGdlbmVyYXRpbmcgYW5kIHJlYWRpbmcgemlwIGZpbGVzCjxodHRwOi8vc3R1YXJ0ay5jb20vanN6aXA+CgooYykgMjAwOS0yMDE2IFN0dWFydCBLbmlnaHRsZXkgPHN0dWFydCBbYXRdIHN0dWFydGsuY29tPgpEdWFsIGxpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBvciBHUEx2My4gU2VlIGh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vU3R1ay9qc3ppcC9tYXN0ZXIvTElDRU5TRS5tYXJrZG93bi4KCkpTWmlwIHVzZXMgdGhlIGxpYnJhcnkgcGFrbyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgOgpodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bha28vYmxvYi9tYXN0ZXIvTElDRU5TRQoqLwohZnVuY3Rpb24oYSl7aWYoIm9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz1hKCk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXSxhKTtlbHNle3ZhciBiO2I9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGIuSlNaaXA9YSgpfX0oZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24gYShiLGMsZCl7ZnVuY3Rpb24gZShnLGgpe2lmKCFjW2ddKXtpZighYltnXSl7dmFyIGk9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWgmJmkpcmV0dXJuIGkoZywhMCk7aWYoZilyZXR1cm4gZihnLCEwKTt2YXIgaj1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitnKyInIik7dGhyb3cgai5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixqfXZhciBrPWNbZ109e2V4cG9ydHM6e319O2JbZ11bMF0uY2FsbChrLmV4cG9ydHMsZnVuY3Rpb24oYSl7dmFyIGM9YltnXVsxXVthXTtyZXR1cm4gZShjP2M6YSl9LGssay5leHBvcnRzLGEsYixjLGQpfXJldHVybiBjW2ddLmV4cG9ydHN9Zm9yKHZhciBmPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGc9MDtnPGQubGVuZ3RoO2crKyllKGRbZ10pO3JldHVybiBlfSh7MTpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD1hKCIuL3V0aWxzIiksZT1hKCIuL3N1cHBvcnQiKSxmPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSI7Yy5lbmNvZGU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZSxnLGgsaSxqLGs9W10sbD0wLG09YS5sZW5ndGgsbj1tLG89InN0cmluZyIhPT1kLmdldFR5cGVPZihhKTtsPGEubGVuZ3RoOyluPW0tbCxvPyhiPWFbbCsrXSxjPWw8bT9hW2wrK106MCxlPWw8bT9hW2wrK106MCk6KGI9YS5jaGFyQ29kZUF0KGwrKyksYz1sPG0/YS5jaGFyQ29kZUF0KGwrKyk6MCxlPWw8bT9hLmNoYXJDb2RlQXQobCsrKTowKSxnPWI+PjIsaD0oMyZiKTw8NHxjPj40LGk9bj4xPygxNSZjKTw8MnxlPj42OjY0LGo9bj4yPzYzJmU6NjQsay5wdXNoKGYuY2hhckF0KGcpK2YuY2hhckF0KGgpK2YuY2hhckF0KGkpK2YuY2hhckF0KGopKTtyZXR1cm4gay5qb2luKCIiKX0sYy5kZWNvZGU9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGcsaCxpLGosaz0wLGw9MCxtPSJkYXRhOiI7aWYoYS5zdWJzdHIoMCxtLmxlbmd0aCk9PT1tKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBiYXNlNjQgaW5wdXQsIGl0IGxvb2tzIGxpa2UgYSBkYXRhIHVybC4iKTthPWEucmVwbGFjZSgvW15BLVphLXowLTlcK1wvXD1dL2csIiIpO3ZhciBuPTMqYS5sZW5ndGgvNDtpZihhLmNoYXJBdChhLmxlbmd0aC0xKT09PWYuY2hhckF0KDY0KSYmbi0tLGEuY2hhckF0KGEubGVuZ3RoLTIpPT09Zi5jaGFyQXQoNjQpJiZuLS0sbiUxIT09MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYmFzZTY0IGlucHV0LCBiYWQgY29udGVudCBsZW5ndGguIik7dmFyIG87Zm9yKG89ZS51aW50OGFycmF5P25ldyBVaW50OEFycmF5KDB8bik6bmV3IEFycmF5KDB8bik7azxhLmxlbmd0aDspZz1mLmluZGV4T2YoYS5jaGFyQXQoaysrKSksaD1mLmluZGV4T2YoYS5jaGFyQXQoaysrKSksaT1mLmluZGV4T2YoYS5jaGFyQXQoaysrKSksaj1mLmluZGV4T2YoYS5jaGFyQXQoaysrKSksYj1nPDwyfGg+PjQsYz0oMTUmaCk8PDR8aT4+MixkPSgzJmkpPDw2fGosb1tsKytdPWIsNjQhPT1pJiYob1tsKytdPWMpLDY0IT09aiYmKG9bbCsrXT1kKTtyZXR1cm4gb319LHsiLi9zdXBwb3J0IjozMCwiLi91dGlscyI6MzJ9XSwyOltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoYSxiLGMsZCxlKXt0aGlzLmNvbXByZXNzZWRTaXplPWEsdGhpcy51bmNvbXByZXNzZWRTaXplPWIsdGhpcy5jcmMzMj1jLHRoaXMuY29tcHJlc3Npb249ZCx0aGlzLmNvbXByZXNzZWRDb250ZW50PWV9dmFyIGU9YSgiLi9leHRlcm5hbCIpLGY9YSgiLi9zdHJlYW0vRGF0YVdvcmtlciIpLGc9YSgiLi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlIiksaD1hKCIuL3N0cmVhbS9DcmMzMlByb2JlIiksZz1hKCIuL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUiKTtkLnByb3RvdHlwZT17Z2V0Q29udGVudFdvcmtlcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBmKGUuUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29tcHJlc3NlZENvbnRlbnQpKS5waXBlKHRoaXMuY29tcHJlc3Npb24udW5jb21wcmVzc1dvcmtlcigpKS5waXBlKG5ldyBnKCJkYXRhX2xlbmd0aCIpKSxiPXRoaXM7cmV0dXJuIGEub24oImVuZCIsZnVuY3Rpb24oKXtpZih0aGlzLnN0cmVhbUluZm8uZGF0YV9sZW5ndGghPT1iLnVuY29tcHJlc3NlZFNpemUpdGhyb3cgbmV3IEVycm9yKCJCdWcgOiB1bmNvbXByZXNzZWQgZGF0YSBzaXplIG1pc21hdGNoIil9KSxhfSxnZXRDb21wcmVzc2VkV29ya2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBmKGUuUHJvbWlzZS5yZXNvbHZlKHRoaXMuY29tcHJlc3NlZENvbnRlbnQpKS53aXRoU3RyZWFtSW5mbygiY29tcHJlc3NlZFNpemUiLHRoaXMuY29tcHJlc3NlZFNpemUpLndpdGhTdHJlYW1JbmZvKCJ1bmNvbXByZXNzZWRTaXplIix0aGlzLnVuY29tcHJlc3NlZFNpemUpLndpdGhTdHJlYW1JbmZvKCJjcmMzMiIsdGhpcy5jcmMzMikud2l0aFN0cmVhbUluZm8oImNvbXByZXNzaW9uIix0aGlzLmNvbXByZXNzaW9uKX19LGQuY3JlYXRlV29ya2VyRnJvbT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEucGlwZShuZXcgaCkucGlwZShuZXcgZygidW5jb21wcmVzc2VkU2l6ZSIpKS5waXBlKGIuY29tcHJlc3NXb3JrZXIoYykpLnBpcGUobmV3IGcoImNvbXByZXNzZWRTaXplIikpLndpdGhTdHJlYW1JbmZvKCJjb21wcmVzc2lvbiIsYil9LGIuZXhwb3J0cz1kfSx7Ii4vZXh0ZXJuYWwiOjYsIi4vc3RyZWFtL0NyYzMyUHJvYmUiOjI1LCIuL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUiOjI2LCIuL3N0cmVhbS9EYXRhV29ya2VyIjoyN31dLDM6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpO2MuU1RPUkU9e21hZ2ljOiJcMFwwIixjb21wcmVzc1dvcmtlcjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IGQoIlNUT1JFIGNvbXByZXNzaW9uIil9LHVuY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGQoIlNUT1JFIGRlY29tcHJlc3Npb24iKX19LGMuREVGTEFURT1hKCIuL2ZsYXRlIil9LHsiLi9mbGF0ZSI6NywiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6Mjh9XSw0OltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoKXtmb3IodmFyIGEsYj1bXSxjPTA7YzwyNTY7YysrKXthPWM7Zm9yKHZhciBkPTA7ZDw4O2QrKylhPTEmYT8zOTg4MjkyMzg0XmE+Pj4xOmE+Pj4xO2JbY109YX1yZXR1cm4gYn1mdW5jdGlvbiBlKGEsYixjLGQpe3ZhciBlPWgsZj1kK2M7YV49LTE7Zm9yKHZhciBnPWQ7ZzxmO2crKylhPWE+Pj44XmVbMjU1JihhXmJbZ10pXTtyZXR1cm4gYV4tMX1mdW5jdGlvbiBmKGEsYixjLGQpe3ZhciBlPWgsZj1kK2M7YV49LTE7Zm9yKHZhciBnPWQ7ZzxmO2crKylhPWE+Pj44XmVbMjU1JihhXmIuY2hhckNvZGVBdChnKSldO3JldHVybiBhXi0xfXZhciBnPWEoIi4vdXRpbHMiKSxoPWQoKTtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGF8fCFhLmxlbmd0aClyZXR1cm4gMDt2YXIgYz0ic3RyaW5nIiE9PWcuZ2V0VHlwZU9mKGEpO3JldHVybiBjP2UoMHxiLGEsYS5sZW5ndGgsMCk6ZigwfGIsYSxhLmxlbmd0aCwwKX19LHsiLi91dGlscyI6MzJ9XSw1OltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2MuYmFzZTY0PSExLGMuYmluYXJ5PSExLGMuZGlyPSExLGMuY3JlYXRlRm9sZGVycz0hMCxjLmRhdGU9bnVsbCxjLmNvbXByZXNzaW9uPW51bGwsYy5jb21wcmVzc2lvbk9wdGlvbnM9bnVsbCxjLmNvbW1lbnQ9bnVsbCxjLnVuaXhQZXJtaXNzaW9ucz1udWxsLGMuZG9zUGVybWlzc2lvbnM9bnVsbH0se31dLDY6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9bnVsbDtkPSJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZT9Qcm9taXNlOmEoImxpZSIpLGIuZXhwb3J0cz17UHJvbWlzZTpkfX0se2xpZTo1OH1dLDc6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhLGIpe2guY2FsbCh0aGlzLCJGbGF0ZVdvcmtlci8iK2EpLHRoaXMuX3Bha289bnVsbCx0aGlzLl9wYWtvQWN0aW9uPWEsdGhpcy5fcGFrb09wdGlvbnM9Yix0aGlzLm1ldGE9e319dmFyIGU9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5JiYidW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQxNkFycmF5JiYidW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQzMkFycmF5LGY9YSgicGFrbyIpLGc9YSgiLi91dGlscyIpLGg9YSgiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLGk9ZT8idWludDhhcnJheSI6ImFycmF5IjtjLm1hZ2ljPSJcYlwwIixnLmluaGVyaXRzKGQsaCksZC5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKGEpe3RoaXMubWV0YT1hLm1ldGEsbnVsbD09PXRoaXMuX3Bha28mJnRoaXMuX2NyZWF0ZVBha28oKSx0aGlzLl9wYWtvLnB1c2goZy50cmFuc2Zvcm1UbyhpLGEuZGF0YSksITEpfSxkLnByb3RvdHlwZS5mbHVzaD1mdW5jdGlvbigpe2gucHJvdG90eXBlLmZsdXNoLmNhbGwodGhpcyksbnVsbD09PXRoaXMuX3Bha28mJnRoaXMuX2NyZWF0ZVBha28oKSx0aGlzLl9wYWtvLnB1c2goW10sITApfSxkLnByb3RvdHlwZS5jbGVhblVwPWZ1bmN0aW9uKCl7aC5wcm90b3R5cGUuY2xlYW5VcC5jYWxsKHRoaXMpLHRoaXMuX3Bha289bnVsbH0sZC5wcm90b3R5cGUuX2NyZWF0ZVBha289ZnVuY3Rpb24oKXt0aGlzLl9wYWtvPW5ldyBmW3RoaXMuX3Bha29BY3Rpb25dKHtyYXc6ITAsbGV2ZWw6dGhpcy5fcGFrb09wdGlvbnMubGV2ZWx8fC0xfSk7dmFyIGE9dGhpczt0aGlzLl9wYWtvLm9uRGF0YT1mdW5jdGlvbihiKXthLnB1c2goe2RhdGE6YixtZXRhOmEubWV0YX0pfX0sYy5jb21wcmVzc1dvcmtlcj1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IGQoIkRlZmxhdGUiLGEpfSxjLnVuY29tcHJlc3NXb3JrZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGQoIkluZmxhdGUiLHt9KX19LHsiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6MjgsIi4vdXRpbHMiOjMyLHBha286NTl9XSw4OltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoYSxiLGMsZCl7Zi5jYWxsKHRoaXMsIlppcEZpbGVXb3JrZXIiKSx0aGlzLmJ5dGVzV3JpdHRlbj0wLHRoaXMuemlwQ29tbWVudD1iLHRoaXMuemlwUGxhdGZvcm09Yyx0aGlzLmVuY29kZUZpbGVOYW1lPWQsdGhpcy5zdHJlYW1GaWxlcz1hLHRoaXMuYWNjdW11bGF0ZT0hMSx0aGlzLmNvbnRlbnRCdWZmZXI9W10sdGhpcy5kaXJSZWNvcmRzPVtdLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldD0wLHRoaXMuZW50cmllc0NvdW50PTAsdGhpcy5jdXJyZW50RmlsZT1udWxsLHRoaXMuX3NvdXJjZXM9W119dmFyIGU9YSgiLi4vdXRpbHMiKSxmPWEoIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIiksZz1hKCIuLi91dGY4IiksaD1hKCIuLi9jcmMzMiIpLGk9YSgiLi4vc2lnbmF0dXJlIiksaj1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9IiI7Zm9yKGM9MDtjPGI7YysrKWQrPVN0cmluZy5mcm9tQ2hhckNvZGUoMjU1JmEpLGE+Pj49ODtyZXR1cm4gZH0saz1mdW5jdGlvbihhLGIpe3ZhciBjPWE7cmV0dXJuIGF8fChjPWI/MTY4OTM6MzMyMDQpLCg2NTUzNSZjKTw8MTZ9LGw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gNjMmKGF8fDApfSxtPWZ1bmN0aW9uKGEsYixjLGQsZixtKXt2YXIgbixvLHA9YS5maWxlLHE9YS5jb21wcmVzc2lvbixyPW0hPT1nLnV0ZjhlbmNvZGUscz1lLnRyYW5zZm9ybVRvKCJzdHJpbmciLG0ocC5uYW1lKSksdD1lLnRyYW5zZm9ybVRvKCJzdHJpbmciLGcudXRmOGVuY29kZShwLm5hbWUpKSx1PXAuY29tbWVudCx2PWUudHJhbnNmb3JtVG8oInN0cmluZyIsbSh1KSksdz1lLnRyYW5zZm9ybVRvKCJzdHJpbmciLGcudXRmOGVuY29kZSh1KSkseD10Lmxlbmd0aCE9PXAubmFtZS5sZW5ndGgseT13Lmxlbmd0aCE9PXUubGVuZ3RoLHo9IiIsQT0iIixCPSIiLEM9cC5kaXIsRD1wLmRhdGUsRT17Y3JjMzI6MCxjb21wcmVzc2VkU2l6ZTowLHVuY29tcHJlc3NlZFNpemU6MH07YiYmIWN8fChFLmNyYzMyPWEuY3JjMzIsRS5jb21wcmVzc2VkU2l6ZT1hLmNvbXByZXNzZWRTaXplLEUudW5jb21wcmVzc2VkU2l6ZT1hLnVuY29tcHJlc3NlZFNpemUpO3ZhciBGPTA7YiYmKEZ8PTgpLHJ8fCF4JiYheXx8KEZ8PTIwNDgpO3ZhciBHPTAsSD0wO0MmJihHfD0xNiksIlVOSVgiPT09Zj8oSD03OTgsR3w9ayhwLnVuaXhQZXJtaXNzaW9ucyxDKSk6KEg9MjAsR3w9bChwLmRvc1Blcm1pc3Npb25zLEMpKSxuPUQuZ2V0VVRDSG91cnMoKSxuPDw9NixufD1ELmdldFVUQ01pbnV0ZXMoKSxuPDw9NSxufD1ELmdldFVUQ1NlY29uZHMoKS8yLG89RC5nZXRVVENGdWxsWWVhcigpLTE5ODAsbzw8PTQsb3w9RC5nZXRVVENNb250aCgpKzEsbzw8PTUsb3w9RC5nZXRVVENEYXRlKCkseCYmKEE9aigxLDEpK2ooaChzKSw0KSt0LHorPSJ1cCIraihBLmxlbmd0aCwyKStBKSx5JiYoQj1qKDEsMSkraihoKHYpLDQpK3cseis9InVjIitqKEIubGVuZ3RoLDIpK0IpO3ZhciBJPSIiO0krPSJcblwwIixJKz1qKEYsMiksSSs9cS5tYWdpYyxJKz1qKG4sMiksSSs9aihvLDIpLEkrPWooRS5jcmMzMiw0KSxJKz1qKEUuY29tcHJlc3NlZFNpemUsNCksSSs9aihFLnVuY29tcHJlc3NlZFNpemUsNCksSSs9aihzLmxlbmd0aCwyKSxJKz1qKHoubGVuZ3RoLDIpO3ZhciBKPWkuTE9DQUxfRklMRV9IRUFERVIrSStzK3osSz1pLkNFTlRSQUxfRklMRV9IRUFERVIraihILDIpK0kraih2Lmxlbmd0aCwyKSsiXDBcMFwwXDAiK2ooRyw0KStqKGQsNCkrcyt6K3Y7cmV0dXJue2ZpbGVSZWNvcmQ6SixkaXJSZWNvcmQ6S319LG49ZnVuY3Rpb24oYSxiLGMsZCxmKXt2YXIgZz0iIixoPWUudHJhbnNmb3JtVG8oInN0cmluZyIsZihkKSk7cmV0dXJuIGc9aS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQrIlwwXDBcMFwwIitqKGEsMikraihhLDIpK2ooYiw0KStqKGMsNCkraihoLmxlbmd0aCwyKStofSxvPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3JldHVybiBiPWkuREFUQV9ERVNDUklQVE9SK2ooYS5jcmMzMiw0KStqKGEuY29tcHJlc3NlZFNpemUsNCkraihhLnVuY29tcHJlc3NlZFNpemUsNCl9O2UuaW5oZXJpdHMoZCxmKSxkLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEpe3ZhciBiPWEubWV0YS5wZXJjZW50fHwwLGM9dGhpcy5lbnRyaWVzQ291bnQsZD10aGlzLl9zb3VyY2VzLmxlbmd0aDt0aGlzLmFjY3VtdWxhdGU/dGhpcy5jb250ZW50QnVmZmVyLnB1c2goYSk6KHRoaXMuYnl0ZXNXcml0dGVuKz1hLmRhdGEubGVuZ3RoLGYucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLHtkYXRhOmEuZGF0YSxtZXRhOntjdXJyZW50RmlsZTp0aGlzLmN1cnJlbnRGaWxlLHBlcmNlbnQ6Yz8oYisxMDAqKGMtZC0xKSkvYzoxMDB9fSkpfSxkLnByb3RvdHlwZS5vcGVuZWRTb3VyY2U9ZnVuY3Rpb24oYSl7dGhpcy5jdXJyZW50U291cmNlT2Zmc2V0PXRoaXMuYnl0ZXNXcml0dGVuLHRoaXMuY3VycmVudEZpbGU9YS5maWxlLm5hbWU7dmFyIGI9dGhpcy5zdHJlYW1GaWxlcyYmIWEuZmlsZS5kaXI7aWYoYil7dmFyIGM9bShhLGIsITEsdGhpcy5jdXJyZW50U291cmNlT2Zmc2V0LHRoaXMuemlwUGxhdGZvcm0sdGhpcy5lbmNvZGVGaWxlTmFtZSk7dGhpcy5wdXNoKHtkYXRhOmMuZmlsZVJlY29yZCxtZXRhOntwZXJjZW50OjB9fSl9ZWxzZSB0aGlzLmFjY3VtdWxhdGU9ITB9LGQucHJvdG90eXBlLmNsb3NlZFNvdXJjZT1mdW5jdGlvbihhKXt0aGlzLmFjY3VtdWxhdGU9ITE7dmFyIGI9dGhpcy5zdHJlYW1GaWxlcyYmIWEuZmlsZS5kaXIsYz1tKGEsYiwhMCx0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQsdGhpcy56aXBQbGF0Zm9ybSx0aGlzLmVuY29kZUZpbGVOYW1lKTtpZih0aGlzLmRpclJlY29yZHMucHVzaChjLmRpclJlY29yZCksYil0aGlzLnB1c2goe2RhdGE6byhhKSxtZXRhOntwZXJjZW50OjEwMH19KTtlbHNlIGZvcih0aGlzLnB1c2goe2RhdGE6Yy5maWxlUmVjb3JkLG1ldGE6e3BlcmNlbnQ6MH19KTt0aGlzLmNvbnRlbnRCdWZmZXIubGVuZ3RoOyl0aGlzLnB1c2godGhpcy5jb250ZW50QnVmZmVyLnNoaWZ0KCkpO3RoaXMuY3VycmVudEZpbGU9bnVsbH0sZC5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ieXRlc1dyaXR0ZW4sYj0wO2I8dGhpcy5kaXJSZWNvcmRzLmxlbmd0aDtiKyspdGhpcy5wdXNoKHtkYXRhOnRoaXMuZGlyUmVjb3Jkc1tiXSxtZXRhOntwZXJjZW50OjEwMH19KTt2YXIgYz10aGlzLmJ5dGVzV3JpdHRlbi1hLGQ9bih0aGlzLmRpclJlY29yZHMubGVuZ3RoLGMsYSx0aGlzLnppcENvbW1lbnQsdGhpcy5lbmNvZGVGaWxlTmFtZSk7dGhpcy5wdXNoKHtkYXRhOmQsbWV0YTp7cGVyY2VudDoxMDB9fSl9LGQucHJvdG90eXBlLnByZXBhcmVOZXh0U291cmNlPWZ1bmN0aW9uKCl7dGhpcy5wcmV2aW91cz10aGlzLl9zb3VyY2VzLnNoaWZ0KCksdGhpcy5vcGVuZWRTb3VyY2UodGhpcy5wcmV2aW91cy5zdHJlYW1JbmZvKSx0aGlzLmlzUGF1c2VkP3RoaXMucHJldmlvdXMucGF1c2UoKTp0aGlzLnByZXZpb3VzLnJlc3VtZSgpfSxkLnByb3RvdHlwZS5yZWdpc3RlclByZXZpb3VzPWZ1bmN0aW9uKGEpe3RoaXMuX3NvdXJjZXMucHVzaChhKTt2YXIgYj10aGlzO3JldHVybiBhLm9uKCJkYXRhIixmdW5jdGlvbihhKXtiLnByb2Nlc3NDaHVuayhhKX0pLGEub24oImVuZCIsZnVuY3Rpb24oKXtiLmNsb3NlZFNvdXJjZShiLnByZXZpb3VzLnN0cmVhbUluZm8pLGIuX3NvdXJjZXMubGVuZ3RoP2IucHJlcGFyZU5leHRTb3VyY2UoKTpiLmVuZCgpfSksYS5vbigiZXJyb3IiLGZ1bmN0aW9uKGEpe2IuZXJyb3IoYSl9KSx0aGlzfSxkLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIWYucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYoIXRoaXMucHJldmlvdXMmJnRoaXMuX3NvdXJjZXMubGVuZ3RoPyh0aGlzLnByZXBhcmVOZXh0U291cmNlKCksITApOnRoaXMucHJldmlvdXN8fHRoaXMuX3NvdXJjZXMubGVuZ3RofHx0aGlzLmdlbmVyYXRlZEVycm9yP3ZvaWQgMDoodGhpcy5lbmQoKSwhMCkpfSxkLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbihhKXt2YXIgYj10aGlzLl9zb3VyY2VzO2lmKCFmLnByb3RvdHlwZS5lcnJvci5jYWxsKHRoaXMsYSkpcmV0dXJuITE7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspdHJ5e2JbY10uZXJyb3IoYSl9Y2F0Y2goYSl7fXJldHVybiEwfSxkLnByb3RvdHlwZS5sb2NrPWZ1bmN0aW9uKCl7Zi5wcm90b3R5cGUubG9jay5jYWxsKHRoaXMpO2Zvcih2YXIgYT10aGlzLl9zb3VyY2VzLGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLmxvY2soKX0sYi5leHBvcnRzPWR9LHsiLi4vY3JjMzIiOjQsIi4uL3NpZ25hdHVyZSI6MjMsIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi4vdXRmOCI6MzEsIi4uL3V0aWxzIjozMn1dLDk6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi4vY29tcHJlc3Npb25zIiksZT1hKCIuL1ppcEZpbGVXb3JrZXIiKSxmPWZ1bmN0aW9uKGEsYil7dmFyIGM9YXx8YixlPWRbY107aWYoIWUpdGhyb3cgbmV3IEVycm9yKGMrIiBpcyBub3QgYSB2YWxpZCBjb21wcmVzc2lvbiBtZXRob2QgISIpO3JldHVybiBlfTtjLmdlbmVyYXRlV29ya2VyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1uZXcgZShiLnN0cmVhbUZpbGVzLGMsYi5wbGF0Zm9ybSxiLmVuY29kZUZpbGVOYW1lKSxnPTA7dHJ5e2EuZm9yRWFjaChmdW5jdGlvbihhLGMpe2crKzt2YXIgZT1mKGMub3B0aW9ucy5jb21wcmVzc2lvbixiLmNvbXByZXNzaW9uKSxoPWMub3B0aW9ucy5jb21wcmVzc2lvbk9wdGlvbnN8fGIuY29tcHJlc3Npb25PcHRpb25zfHx7fSxpPWMuZGlyLGo9Yy5kYXRlO2MuX2NvbXByZXNzV29ya2VyKGUsaCkud2l0aFN0cmVhbUluZm8oImZpbGUiLHtuYW1lOmEsZGlyOmksZGF0ZTpqLGNvbW1lbnQ6Yy5jb21tZW50fHwiIix1bml4UGVybWlzc2lvbnM6Yy51bml4UGVybWlzc2lvbnMsZG9zUGVybWlzc2lvbnM6Yy5kb3NQZXJtaXNzaW9uc30pLnBpcGUoZCl9KSxkLmVudHJpZXNDb3VudD1nfWNhdGNoKGgpe2QuZXJyb3IoaCl9cmV0dXJuIGR9fSx7Ii4uL2NvbXByZXNzaW9ucyI6MywiLi9aaXBGaWxlV29ya2VyIjo4fV0sMTA6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZCgpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGQpKXJldHVybiBuZXcgZDtpZihhcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVGhlIGNvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVycyBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLiIpO3RoaXMuZmlsZXM9e30sdGhpcy5jb21tZW50PW51bGwsdGhpcy5yb290PSIiLHRoaXMuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgZDtmb3IodmFyIGIgaW4gdGhpcykiZnVuY3Rpb24iIT10eXBlb2YgdGhpc1tiXSYmKGFbYl09dGhpc1tiXSk7cmV0dXJuIGF9fWQucHJvdG90eXBlPWEoIi4vb2JqZWN0IiksZC5wcm90b3R5cGUubG9hZEFzeW5jPWEoIi4vbG9hZCIpLGQuc3VwcG9ydD1hKCIuL3N1cHBvcnQiKSxkLmRlZmF1bHRzPWEoIi4vZGVmYXVsdHMiKSxkLnZlcnNpb249IjMuMS4zIixkLmxvYWRBc3luYz1mdW5jdGlvbihhLGIpe3JldHVybihuZXcgZCkubG9hZEFzeW5jKGEsYil9LGQuZXh0ZXJuYWw9YSgiLi9leHRlcm5hbCIpLGIuZXhwb3J0cz1kfSx7Ii4vZGVmYXVsdHMiOjUsIi4vZXh0ZXJuYWwiOjYsIi4vbG9hZCI6MTEsIi4vb2JqZWN0IjoxNSwiLi9zdXBwb3J0IjozMH1dLDExOltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoYSl7cmV0dXJuIG5ldyBmLlByb21pc2UoZnVuY3Rpb24oYixjKXt2YXIgZD1hLmRlY29tcHJlc3NlZC5nZXRDb250ZW50V29ya2VyKCkucGlwZShuZXcgaSk7ZC5vbigiZXJyb3IiLGZ1bmN0aW9uKGEpe2MoYSl9KS5vbigiZW5kIixmdW5jdGlvbigpe2Quc3RyZWFtSW5mby5jcmMzMiE9PWEuZGVjb21wcmVzc2VkLmNyYzMyP2MobmV3IEVycm9yKCJDb3JydXB0ZWQgemlwIDogQ1JDMzIgbWlzbWF0Y2giKSk6YigpfSkucmVzdW1lKCl9KX12YXIgZT1hKCIuL3V0aWxzIiksZj1hKCIuL2V4dGVybmFsIiksZz1hKCIuL3V0ZjgiKSxlPWEoIi4vdXRpbHMiKSxoPWEoIi4vemlwRW50cmllcyIpLGk9YSgiLi9zdHJlYW0vQ3JjMzJQcm9iZSIpLGo9YSgiLi9ub2RlanNVdGlscyIpO2IuZXhwb3J0cz1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7cmV0dXJuIGI9ZS5leHRlbmQoYnx8e30se2Jhc2U2NDohMSxjaGVja0NSQzMyOiExLG9wdGltaXplZEJpbmFyeVN0cmluZzohMSxjcmVhdGVGb2xkZXJzOiExLGRlY29kZUZpbGVOYW1lOmcudXRmOGRlY29kZX0pLGouaXNOb2RlJiZqLmlzU3RyZWFtKGEpP2YuUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJKU1ppcCBjYW4ndCBhY2NlcHQgYSBzdHJlYW0gd2hlbiBsb2FkaW5nIGEgemlwIGZpbGUuIikpOmUucHJlcGFyZUNvbnRlbnQoInRoZSBsb2FkZWQgemlwIGZpbGUiLGEsITAsYi5vcHRpbWl6ZWRCaW5hcnlTdHJpbmcsYi5iYXNlNjQpLnRoZW4oZnVuY3Rpb24oYSl7dmFyIGM9bmV3IGgoYik7cmV0dXJuIGMubG9hZChhKSxjfSkudGhlbihmdW5jdGlvbihhKXt2YXIgYz1bZi5Qcm9taXNlLnJlc29sdmUoYSldLGU9YS5maWxlcztpZihiLmNoZWNrQ1JDMzIpZm9yKHZhciBnPTA7ZzxlLmxlbmd0aDtnKyspYy5wdXNoKGQoZVtnXSkpO3JldHVybiBmLlByb21pc2UuYWxsKGMpfSkudGhlbihmdW5jdGlvbihhKXtmb3IodmFyIGQ9YS5zaGlmdCgpLGU9ZC5maWxlcyxmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWVbZl07Yy5maWxlKGcuZmlsZU5hbWVTdHIsZy5kZWNvbXByZXNzZWQse2JpbmFyeTohMCxvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6ITAsZGF0ZTpnLmRhdGUsZGlyOmcuZGlyLGNvbW1lbnQ6Zy5maWxlQ29tbWVudFN0ci5sZW5ndGg/Zy5maWxlQ29tbWVudFN0cjpudWxsLHVuaXhQZXJtaXNzaW9uczpnLnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczpnLmRvc1Blcm1pc3Npb25zLGNyZWF0ZUZvbGRlcnM6Yi5jcmVhdGVGb2xkZXJzfSl9cmV0dXJuIGQuemlwQ29tbWVudC5sZW5ndGgmJihjLmNvbW1lbnQ9ZC56aXBDb21tZW50KSxjfSl9fSx7Ii4vZXh0ZXJuYWwiOjYsIi4vbm9kZWpzVXRpbHMiOjE0LCIuL3N0cmVhbS9DcmMzMlByb2JlIjoyNSwiLi91dGY4IjozMSwiLi91dGlscyI6MzIsIi4vemlwRW50cmllcyI6MzN9XSwxMjpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEsYil7Zi5jYWxsKHRoaXMsIk5vZGVqcyBzdHJlYW0gaW5wdXQgYWRhcHRlciBmb3IgIithKSx0aGlzLl91cHN0cmVhbUVuZGVkPSExLHRoaXMuX2JpbmRTdHJlYW0oYil9dmFyIGU9YSgiLi4vdXRpbHMiKSxmPWEoIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIik7ZS5pbmhlcml0cyhkLGYpLGQucHJvdG90eXBlLl9iaW5kU3RyZWFtPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7dGhpcy5fc3RyZWFtPWEsYS5wYXVzZSgpLGEub24oImRhdGEiLGZ1bmN0aW9uKGEpe2IucHVzaCh7ZGF0YTphLG1ldGE6e3BlcmNlbnQ6MH19KX0pLm9uKCJlcnJvciIsZnVuY3Rpb24oYSl7Yi5pc1BhdXNlZD90aGlzLmdlbmVyYXRlZEVycm9yPWE6Yi5lcnJvcihhKX0pLm9uKCJlbmQiLGZ1bmN0aW9uKCl7Yi5pc1BhdXNlZD9iLl91cHN0cmVhbUVuZGVkPSEwOmIuZW5kKCl9KX0sZC5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtyZXR1cm4hIWYucHJvdG90eXBlLnBhdXNlLmNhbGwodGhpcykmJih0aGlzLl9zdHJlYW0ucGF1c2UoKSwhMCl9LGQucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiEhZi5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykmJih0aGlzLl91cHN0cmVhbUVuZGVkP3RoaXMuZW5kKCk6dGhpcy5fc3RyZWFtLnJlc3VtZSgpLCEwKX0sYi5leHBvcnRzPWR9LHsiLi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiOjI4LCIuLi91dGlscyI6MzJ9XSwxMzpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEsYixjKXtlLmNhbGwodGhpcyxiKSx0aGlzLl9oZWxwZXI9YTt2YXIgZD10aGlzO2Eub24oImRhdGEiLGZ1bmN0aW9uKGEsYil7ZC5wdXNoKGEpfHxkLl9oZWxwZXIucGF1c2UoKSxjJiZjKGIpfSkub24oImVycm9yIixmdW5jdGlvbihhKXtkLmVtaXQoImVycm9yIixhKX0pLm9uKCJlbmQiLGZ1bmN0aW9uKCl7ZC5wdXNoKG51bGwpfSl9dmFyIGU9YSgicmVhZGFibGUtc3RyZWFtIikuUmVhZGFibGUsZj1hKCIuLi91dGlscyIpO2YuaW5oZXJpdHMoZCxlKSxkLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbigpe3RoaXMuX2hlbHBlci5yZXN1bWUoKX0sYi5leHBvcnRzPWR9LHsiLi4vdXRpbHMiOjMyLCJyZWFkYWJsZS1zdHJlYW0iOjE2fV0sMTQ6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7Yi5leHBvcnRzPXtpc05vZGU6InVuZGVmaW5lZCIhPXR5cGVvZiBCdWZmZXIsbmV3QnVmZmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBCdWZmZXIoYSxiKX0saXNCdWZmZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihhKX0saXNTdHJlYW06ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGEucmVzdW1lfX19LHt9XSwxNTpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEpe3JldHVybiJbb2JqZWN0IFJlZ0V4cF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpfXZhciBlPWEoIi4vdXRmOCIpLGY9YSgiLi91dGlscyIpLGc9YSgiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLGg9YSgiLi9zdHJlYW0vU3RyZWFtSGVscGVyIiksaT1hKCIuL2RlZmF1bHRzIiksaj1hKCIuL2NvbXByZXNzZWRPYmplY3QiKSxrPWEoIi4vemlwT2JqZWN0IiksbD1hKCIuL2dlbmVyYXRlIiksbT1hKCIuL25vZGVqc1V0aWxzIiksbj1hKCIuL25vZGVqcy9Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIiKSxvPWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPWYuZ2V0VHlwZU9mKGIpLGg9Zi5leHRlbmQoY3x8e30saSk7aC5kYXRlPWguZGF0ZXx8bmV3IERhdGUsbnVsbCE9PWguY29tcHJlc3Npb24mJihoLmNvbXByZXNzaW9uPWguY29tcHJlc3Npb24udG9VcHBlckNhc2UoKSksInN0cmluZyI9PXR5cGVvZiBoLnVuaXhQZXJtaXNzaW9ucyYmKGgudW5peFBlcm1pc3Npb25zPXBhcnNlSW50KGgudW5peFBlcm1pc3Npb25zLDgpKSxoLnVuaXhQZXJtaXNzaW9ucyYmMTYzODQmaC51bml4UGVybWlzc2lvbnMmJihoLmRpcj0hMCksaC5kb3NQZXJtaXNzaW9ucyYmMTYmaC5kb3NQZXJtaXNzaW9ucyYmKGguZGlyPSEwKSxoLmRpciYmKGE9cShhKSksaC5jcmVhdGVGb2xkZXJzJiYoZD1wKGEpKSYmci5jYWxsKHRoaXMsZCwhMCk7dmFyIGw9InN0cmluZyI9PT1lJiZoLmJpbmFyeT09PSExJiZoLmJhc2U2ND09PSExO2MmJiJ1bmRlZmluZWQiIT10eXBlb2YgYy5iaW5hcnl8fChoLmJpbmFyeT0hbCk7dmFyIG89YiBpbnN0YW5jZW9mIGomJjA9PT1iLnVuY29tcHJlc3NlZFNpemU7KG98fGguZGlyfHwhYnx8MD09PWIubGVuZ3RoKSYmKGguYmFzZTY0PSExLGguYmluYXJ5PSEwLGI9IiIsaC5jb21wcmVzc2lvbj0iU1RPUkUiLGU9InN0cmluZyIpO3ZhciBzPW51bGw7cz1iIGluc3RhbmNlb2Yganx8YiBpbnN0YW5jZW9mIGc/YjptLmlzTm9kZSYmbS5pc1N0cmVhbShiKT9uZXcgbihhLGIpOmYucHJlcGFyZUNvbnRlbnQoYSxiLGguYmluYXJ5LGgub3B0aW1pemVkQmluYXJ5U3RyaW5nLGguYmFzZTY0KTt2YXIgdD1uZXcgayhhLHMsaCk7dGhpcy5maWxlc1thXT10fSxwPWZ1bmN0aW9uKGEpeyIvIj09PWEuc2xpY2UoLTEpJiYoYT1hLnN1YnN0cmluZygwLGEubGVuZ3RoLTEpKTt2YXIgYj1hLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuIGI+MD9hLnN1YnN0cmluZygwLGIpOiIifSxxPWZ1bmN0aW9uKGEpe3JldHVybiIvIiE9PWEuc2xpY2UoLTEpJiYoYSs9Ii8iKSxhfSxyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9InVuZGVmaW5lZCIhPXR5cGVvZiBiP2I6aS5jcmVhdGVGb2xkZXJzLGE9cShhKSx0aGlzLmZpbGVzW2FdfHxvLmNhbGwodGhpcyxhLG51bGwse2RpcjohMCxjcmVhdGVGb2xkZXJzOmJ9KSx0aGlzLmZpbGVzW2FdfSxzPXtsb2FkOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLiIpfSxmb3JFYWNoOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZDtmb3IoYiBpbiB0aGlzLmZpbGVzKXRoaXMuZmlsZXMuaGFzT3duUHJvcGVydHkoYikmJihkPXRoaXMuZmlsZXNbYl0sYz1iLnNsaWNlKHRoaXMucm9vdC5sZW5ndGgsYi5sZW5ndGgpLGMmJmIuc2xpY2UoMCx0aGlzLnJvb3QubGVuZ3RoKT09PXRoaXMucm9vdCYmYShjLGQpKX0sZmlsdGVyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oYyxkKXthKGMsZCkmJmIucHVzaChkKX0pLGJ9LGZpbGU6ZnVuY3Rpb24oYSxiLGMpe2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihkKGEpKXt2YXIgZT1hO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihhLGIpe3JldHVybiFiLmRpciYmZS50ZXN0KGEpfSl9dmFyIGY9dGhpcy5maWxlc1t0aGlzLnJvb3QrYV07cmV0dXJuIGYmJiFmLmRpcj9mOm51bGx9cmV0dXJuIGE9dGhpcy5yb290K2Esby5jYWxsKHRoaXMsYSxiLGMpLHRoaXN9LGZvbGRlcjpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdGhpcztpZihkKGEpKXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihiLGMpe3JldHVybiBjLmRpciYmYS50ZXN0KGIpfSk7dmFyIGI9dGhpcy5yb290K2EsYz1yLmNhbGwodGhpcyxiKSxlPXRoaXMuY2xvbmUoKTtyZXR1cm4gZS5yb290PWMubmFtZSxlfSxyZW1vdmU6ZnVuY3Rpb24oYSl7YT10aGlzLnJvb3QrYTt2YXIgYj10aGlzLmZpbGVzW2FdO2lmKGJ8fCgiLyIhPT1hLnNsaWNlKC0xKSYmKGErPSIvIiksYj10aGlzLmZpbGVzW2FdKSxiJiYhYi5kaXIpZGVsZXRlIHRoaXMuZmlsZXNbYV07ZWxzZSBmb3IodmFyIGM9dGhpcy5maWx0ZXIoZnVuY3Rpb24oYixjKXtyZXR1cm4gYy5uYW1lLnNsaWNlKDAsYS5sZW5ndGgpPT09YX0pLGQ9MDtkPGMubGVuZ3RoO2QrKylkZWxldGUgdGhpcy5maWxlc1tjW2RdLm5hbWVdO3JldHVybiB0aGlzfSxnZW5lcmF0ZTpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlRoaXMgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIil9LGdlbmVyYXRlSW50ZXJuYWxTdHJlYW06ZnVuY3Rpb24oYSl7dmFyIGIsYz17fTt0cnl7aWYoYz1mLmV4dGVuZChhfHx7fSx7c3RyZWFtRmlsZXM6ITEsY29tcHJlc3Npb246IlNUT1JFIixjb21wcmVzc2lvbk9wdGlvbnM6bnVsbCx0eXBlOiIiLHBsYXRmb3JtOiJET1MiLGNvbW1lbnQ6bnVsbCxtaW1lVHlwZToiYXBwbGljYXRpb24vemlwIixlbmNvZGVGaWxlTmFtZTplLnV0ZjhlbmNvZGV9KSxjLnR5cGU9Yy50eXBlLnRvTG93ZXJDYXNlKCksYy5jb21wcmVzc2lvbj1jLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCksImJpbmFyeXN0cmluZyI9PT1jLnR5cGUmJihjLnR5cGU9InN0cmluZyIpLCFjLnR5cGUpdGhyb3cgbmV3IEVycm9yKCJObyBvdXRwdXQgdHlwZSBzcGVjaWZpZWQuIik7Zi5jaGVja1N1cHBvcnQoYy50eXBlKSwiZGFyd2luIiE9PWMucGxhdGZvcm0mJiJmcmVlYnNkIiE9PWMucGxhdGZvcm0mJiJsaW51eCIhPT1jLnBsYXRmb3JtJiYic3Vub3MiIT09Yy5wbGF0Zm9ybXx8KGMucGxhdGZvcm09IlVOSVgiKSwid2luMzIiPT09Yy5wbGF0Zm9ybSYmKGMucGxhdGZvcm09IkRPUyIpO3ZhciBkPWMuY29tbWVudHx8dGhpcy5jb21tZW50fHwiIjtiPWwuZ2VuZXJhdGVXb3JrZXIodGhpcyxjLGQpfWNhdGNoKGkpe2I9bmV3IGcoImVycm9yIiksYi5lcnJvcihpKX1yZXR1cm4gbmV3IGgoYixjLnR5cGV8fCJzdHJpbmciLGMubWltZVR5cGUpfSxnZW5lcmF0ZUFzeW5jOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbShhKS5hY2N1bXVsYXRlKGIpfSxnZW5lcmF0ZU5vZGVTdHJlYW06ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1hfHx7fSxhLnR5cGV8fChhLnR5cGU9Im5vZGVidWZmZXIiKSx0aGlzLmdlbmVyYXRlSW50ZXJuYWxTdHJlYW0oYSkudG9Ob2RlanNTdHJlYW0oYil9fTtiLmV4cG9ydHM9c30seyIuL2NvbXByZXNzZWRPYmplY3QiOjIsIi4vZGVmYXVsdHMiOjUsIi4vZ2VuZXJhdGUiOjksIi4vbm9kZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlciI6MTIsIi4vbm9kZWpzVXRpbHMiOjE0LCIuL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi9zdHJlYW0vU3RyZWFtSGVscGVyIjoyOSwiLi91dGY4IjozMSwiLi91dGlscyI6MzIsIi4vemlwT2JqZWN0IjozNX1dLDE2OltmdW5jdGlvbihhLGIsYyl7Yi5leHBvcnRzPWEoInN0cmVhbSIpfSx7c3RyZWFtOnZvaWQgMH1dLDE3OltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoYSl7ZS5jYWxsKHRoaXMsYSk7Zm9yKHZhciBiPTA7Yjx0aGlzLmRhdGEubGVuZ3RoO2IrKylhW2JdPTI1NSZhW2JdfXZhciBlPWEoIi4vRGF0YVJlYWRlciIpLGY9YSgiLi4vdXRpbHMiKTtmLmluaGVyaXRzKGQsZSksZC5wcm90b3R5cGUuYnl0ZUF0PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGFbdGhpcy56ZXJvK2FdfSxkLnByb3RvdHlwZS5sYXN0SW5kZXhPZlNpZ25hdHVyZT1mdW5jdGlvbihhKXtmb3IodmFyIGI9YS5jaGFyQ29kZUF0KDApLGM9YS5jaGFyQ29kZUF0KDEpLGQ9YS5jaGFyQ29kZUF0KDIpLGU9YS5jaGFyQ29kZUF0KDMpLGY9dGhpcy5sZW5ndGgtNDtmPj0wOy0tZilpZih0aGlzLmRhdGFbZl09PT1iJiZ0aGlzLmRhdGFbZisxXT09PWMmJnRoaXMuZGF0YVtmKzJdPT09ZCYmdGhpcy5kYXRhW2YrM109PT1lKXJldHVybiBmLXRoaXMuemVybztyZXR1cm4tMX0sZC5wcm90b3R5cGUucmVhZEFuZENoZWNrU2lnbmF0dXJlPWZ1bmN0aW9uKGEpe3ZhciBiPWEuY2hhckNvZGVBdCgwKSxjPWEuY2hhckNvZGVBdCgxKSxkPWEuY2hhckNvZGVBdCgyKSxlPWEuY2hhckNvZGVBdCgzKSxmPXRoaXMucmVhZERhdGEoNCk7cmV0dXJuIGI9PT1mWzBdJiZjPT09ZlsxXSYmZD09PWZbMl0mJmU9PT1mWzNdfSxkLnByb3RvdHlwZS5yZWFkRGF0YT1mdW5jdGlvbihhKXtpZih0aGlzLmNoZWNrT2Zmc2V0KGEpLDA9PT1hKXJldHVybltdO3ZhciBiPXRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8rdGhpcy5pbmRleCx0aGlzLnplcm8rdGhpcy5pbmRleCthKTtyZXR1cm4gdGhpcy5pbmRleCs9YSxifSxiLmV4cG9ydHM9ZH0seyIuLi91dGlscyI6MzIsIi4vRGF0YVJlYWRlciI6MTh9XSwxODpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEpe3RoaXMuZGF0YT1hLHRoaXMubGVuZ3RoPWEubGVuZ3RoLHRoaXMuaW5kZXg9MCx0aGlzLnplcm89MH12YXIgZT1hKCIuLi91dGlscyIpO2QucHJvdG90eXBlPXtjaGVja09mZnNldDpmdW5jdGlvbihhKXt0aGlzLmNoZWNrSW5kZXgodGhpcy5pbmRleCthKX0sY2hlY2tJbmRleDpmdW5jdGlvbihhKXtpZih0aGlzLmxlbmd0aDx0aGlzLnplcm8rYXx8YTwwKXRocm93IG5ldyBFcnJvcigiRW5kIG9mIGRhdGEgcmVhY2hlZCAoZGF0YSBsZW5ndGggPSAiK3RoaXMubGVuZ3RoKyIsIGFza2VkIGluZGV4ID0gIithKyIpLiBDb3JydXB0ZWQgemlwID8iKX0sc2V0SW5kZXg6ZnVuY3Rpb24oYSl7dGhpcy5jaGVja0luZGV4KGEpLHRoaXMuaW5kZXg9YX0sc2tpcDpmdW5jdGlvbihhKXt0aGlzLnNldEluZGV4KHRoaXMuaW5kZXgrYSl9LGJ5dGVBdDpmdW5jdGlvbihhKXt9LHJlYWRJbnQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz0wO2Zvcih0aGlzLmNoZWNrT2Zmc2V0KGEpLGI9dGhpcy5pbmRleCthLTE7Yj49dGhpcy5pbmRleDtiLS0pYz0oYzw8OCkrdGhpcy5ieXRlQXQoYik7cmV0dXJuIHRoaXMuaW5kZXgrPWEsY30scmVhZFN0cmluZzpmdW5jdGlvbihhKXtyZXR1cm4gZS50cmFuc2Zvcm1Ubygic3RyaW5nIix0aGlzLnJlYWREYXRhKGEpKX0scmVhZERhdGE6ZnVuY3Rpb24oYSl7fSxsYXN0SW5kZXhPZlNpZ25hdHVyZTpmdW5jdGlvbihhKXt9LHJlYWRBbmRDaGVja1NpZ25hdHVyZTpmdW5jdGlvbihhKXt9LHJlYWREYXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yZWFkSW50KDQpO3JldHVybiBuZXcgRGF0ZShEYXRlLlVUQygoYT4+MjUmMTI3KSsxOTgwLChhPj4yMSYxNSktMSxhPj4xNiYzMSxhPj4xMSYzMSxhPj41JjYzLCgzMSZhKTw8MSkpfX0sYi5leHBvcnRzPWR9LHsiLi4vdXRpbHMiOjMyfV0sMTk6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhKXtlLmNhbGwodGhpcyxhKX12YXIgZT1hKCIuL1VpbnQ4QXJyYXlSZWFkZXIiKSxmPWEoIi4uL3V0aWxzIik7Zi5pbmhlcml0cyhkLGUpLGQucHJvdG90eXBlLnJlYWREYXRhPWZ1bmN0aW9uKGEpe3RoaXMuY2hlY2tPZmZzZXQoYSk7dmFyIGI9dGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyt0aGlzLmluZGV4LHRoaXMuemVybyt0aGlzLmluZGV4K2EpO3JldHVybiB0aGlzLmluZGV4Kz1hLGJ9LGIuZXhwb3J0cz1kfSx7Ii4uL3V0aWxzIjozMiwiLi9VaW50OEFycmF5UmVhZGVyIjoyMX1dLDIwOltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoYSl7ZS5jYWxsKHRoaXMsYSl9dmFyIGU9YSgiLi9EYXRhUmVhZGVyIiksZj1hKCIuLi91dGlscyIpO2YuaW5oZXJpdHMoZCxlKSxkLnByb3RvdHlwZS5ieXRlQXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGF0YS5jaGFyQ29kZUF0KHRoaXMuemVybythKX0sZC5wcm90b3R5cGUubGFzdEluZGV4T2ZTaWduYXR1cmU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGF0YS5sYXN0SW5kZXhPZihhKS10aGlzLnplcm99LGQucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLnJlYWREYXRhKDQpO3JldHVybiBhPT09Yn0sZC5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oYSl7dGhpcy5jaGVja09mZnNldChhKTt2YXIgYj10aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvK3RoaXMuaW5kZXgsdGhpcy56ZXJvK3RoaXMuaW5kZXgrYSk7cmV0dXJuIHRoaXMuaW5kZXgrPWEsYn0sYi5leHBvcnRzPWR9LHsiLi4vdXRpbHMiOjMyLCIuL0RhdGFSZWFkZXIiOjE4fV0sMjE6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhKXtlLmNhbGwodGhpcyxhKX12YXIgZT1hKCIuL0FycmF5UmVhZGVyIiksZj1hKCIuLi91dGlscyIpO2YuaW5oZXJpdHMoZCxlKSxkLnByb3RvdHlwZS5yZWFkRGF0YT1mdW5jdGlvbihhKXtpZih0aGlzLmNoZWNrT2Zmc2V0KGEpLDA9PT1hKXJldHVybiBuZXcgVWludDhBcnJheSgwKTt2YXIgYj10aGlzLmRhdGEuc3ViYXJyYXkodGhpcy56ZXJvK3RoaXMuaW5kZXgsdGhpcy56ZXJvK3RoaXMuaW5kZXgrYSk7cmV0dXJuIHRoaXMuaW5kZXgrPWEsYn0sYi5leHBvcnRzPWR9LHsiLi4vdXRpbHMiOjMyLCIuL0FycmF5UmVhZGVyIjoxN31dLDIyOltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3V0aWxzIiksZT1hKCIuLi9zdXBwb3J0IiksZj1hKCIuL0FycmF5UmVhZGVyIiksZz1hKCIuL1N0cmluZ1JlYWRlciIpLGg9YSgiLi9Ob2RlQnVmZmVyUmVhZGVyIiksaT1hKCIuL1VpbnQ4QXJyYXlSZWFkZXIiKTtiLmV4cG9ydHM9ZnVuY3Rpb24oYSl7dmFyIGI9ZC5nZXRUeXBlT2YoYSk7cmV0dXJuIGQuY2hlY2tTdXBwb3J0KGIpLCJzdHJpbmciIT09Ynx8ZS51aW50OGFycmF5PyJub2RlYnVmZmVyIj09PWI/bmV3IGgoYSk6ZS51aW50OGFycmF5P25ldyBpKGQudHJhbnNmb3JtVG8oInVpbnQ4YXJyYXkiLGEpKTpuZXcgZihkLnRyYW5zZm9ybVRvKCJhcnJheSIsYSkpOm5ldyBnKGEpfX0seyIuLi9zdXBwb3J0IjozMCwiLi4vdXRpbHMiOjMyLCIuL0FycmF5UmVhZGVyIjoxNywiLi9Ob2RlQnVmZmVyUmVhZGVyIjoxOSwiLi9TdHJpbmdSZWFkZXIiOjIwLCIuL1VpbnQ4QXJyYXlSZWFkZXIiOjIxfV0sMjM6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7Yy5MT0NBTF9GSUxFX0hFQURFUj0iUEsDBCIsYy5DRU5UUkFMX0ZJTEVfSEVBREVSPSJQSwECIixjLkNFTlRSQUxfRElSRUNUT1JZX0VORD0iUEsFBiIsYy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SPSJQSwYHIixjLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORD0iUEsGBiIsYy5EQVRBX0RFU0NSSVBUT1I9IlBLB1xiIn0se31dLDI0OltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoYSl7ZS5jYWxsKHRoaXMsIkNvbnZlcnRXb3JrZXIgdG8gIithKSx0aGlzLmRlc3RUeXBlPWF9dmFyIGU9YSgiLi9HZW5lcmljV29ya2VyIiksZj1hKCIuLi91dGlscyIpO2YuaW5oZXJpdHMoZCxlKSxkLnByb3RvdHlwZS5wcm9jZXNzQ2h1bms9ZnVuY3Rpb24oYSl7dGhpcy5wdXNoKHtkYXRhOmYudHJhbnNmb3JtVG8odGhpcy5kZXN0VHlwZSxhLmRhdGEpLG1ldGE6YS5tZXRhfSl9LGIuZXhwb3J0cz1kfSx7Ii4uL3V0aWxzIjozMiwiLi9HZW5lcmljV29ya2VyIjoyOH1dLDI1OltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoKXtlLmNhbGwodGhpcywiQ3JjMzJQcm9iZSIpLHRoaXMud2l0aFN0cmVhbUluZm8oImNyYzMyIiwwKX12YXIgZT1hKCIuL0dlbmVyaWNXb3JrZXIiKSxmPWEoIi4uL2NyYzMyIiksZz1hKCIuLi91dGlscyIpO2cuaW5oZXJpdHMoZCxlKSxkLnByb3RvdHlwZS5wcm9jZXNzQ2h1bms9ZnVuY3Rpb24oYSl7dGhpcy5zdHJlYW1JbmZvLmNyYzMyPWYoYS5kYXRhLHRoaXMuc3RyZWFtSW5mby5jcmMzMnx8MCksdGhpcy5wdXNoKGEpfSxiLmV4cG9ydHM9ZH0seyIuLi9jcmMzMiI6NCwiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjY6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhKXtmLmNhbGwodGhpcywiRGF0YUxlbmd0aFByb2JlIGZvciAiK2EpLHRoaXMucHJvcE5hbWU9YSx0aGlzLndpdGhTdHJlYW1JbmZvKGEsMCl9dmFyIGU9YSgiLi4vdXRpbHMiKSxmPWEoIi4vR2VuZXJpY1dvcmtlciIpO2UuaW5oZXJpdHMoZCxmKSxkLnByb3RvdHlwZS5wcm9jZXNzQ2h1bms9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9dGhpcy5zdHJlYW1JbmZvW3RoaXMucHJvcE5hbWVdfHwwO3RoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXT1iK2EuZGF0YS5sZW5ndGh9Zi5wcm90b3R5cGUucHJvY2Vzc0NodW5rLmNhbGwodGhpcyxhKX0sYi5leHBvcnRzPWR9LHsiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjc6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhKXtmLmNhbGwodGhpcywiRGF0YVdvcmtlciIpO3ZhciBiPXRoaXM7dGhpcy5kYXRhSXNSZWFkeT0hMSx0aGlzLmluZGV4PTAsdGhpcy5tYXg9MCx0aGlzLmRhdGE9bnVsbCx0aGlzLnR5cGU9IiIsdGhpcy5fdGlja1NjaGVkdWxlZD0hMSxhLnRoZW4oZnVuY3Rpb24oYSl7Yi5kYXRhSXNSZWFkeT0hMCxiLmRhdGE9YSxiLm1heD1hJiZhLmxlbmd0aHx8MCxiLnR5cGU9ZS5nZXRUeXBlT2YoYSksYi5pc1BhdXNlZHx8Yi5fdGlja0FuZFJlcGVhdCgpfSxmdW5jdGlvbihhKXtiLmVycm9yKGEpfSl9dmFyIGU9YSgiLi4vdXRpbHMiKSxmPWEoIi4vR2VuZXJpY1dvcmtlciIpLGc9MTYzODQ7ZS5pbmhlcml0cyhkLGYpLGQucHJvdG90eXBlLmNsZWFuVXA9ZnVuY3Rpb24oKXtmLnByb3RvdHlwZS5jbGVhblVwLmNhbGwodGhpcyksdGhpcy5kYXRhPW51bGx9LGQucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiEhZi5wcm90b3R5cGUucmVzdW1lLmNhbGwodGhpcykmJighdGhpcy5fdGlja1NjaGVkdWxlZCYmdGhpcy5kYXRhSXNSZWFkeSYmKHRoaXMuX3RpY2tTY2hlZHVsZWQ9ITAsZS5kZWxheSh0aGlzLl90aWNrQW5kUmVwZWF0LFtdLHRoaXMpKSwhMCl9LGQucHJvdG90eXBlLl90aWNrQW5kUmVwZWF0PWZ1bmN0aW9uKCl7dGhpcy5fdGlja1NjaGVkdWxlZD0hMSx0aGlzLmlzUGF1c2VkfHx0aGlzLmlzRmluaXNoZWR8fCh0aGlzLl90aWNrKCksdGhpcy5pc0ZpbmlzaGVkfHwoZS5kZWxheSh0aGlzLl90aWNrQW5kUmVwZWF0LFtdLHRoaXMpLHRoaXMuX3RpY2tTY2hlZHVsZWQ9ITApKX0sZC5wcm90b3R5cGUuX3RpY2s9ZnVuY3Rpb24oKXtpZih0aGlzLmlzUGF1c2VkfHx0aGlzLmlzRmluaXNoZWQpcmV0dXJuITE7dmFyIGE9ZyxiPW51bGwsYz1NYXRoLm1pbih0aGlzLm1heCx0aGlzLmluZGV4K2EpO2lmKHRoaXMuaW5kZXg+PXRoaXMubWF4KXJldHVybiB0aGlzLmVuZCgpO3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2Uic3RyaW5nIjpiPXRoaXMuZGF0YS5zdWJzdHJpbmcodGhpcy5pbmRleCxjKTticmVhaztjYXNlInVpbnQ4YXJyYXkiOmI9dGhpcy5kYXRhLnN1YmFycmF5KHRoaXMuaW5kZXgsYyk7YnJlYWs7Y2FzZSJhcnJheSI6Y2FzZSJub2RlYnVmZmVyIjpiPXRoaXMuZGF0YS5zbGljZSh0aGlzLmluZGV4LGMpfXJldHVybiB0aGlzLmluZGV4PWMsdGhpcy5wdXNoKHtkYXRhOmIsbWV0YTp7cGVyY2VudDp0aGlzLm1heD90aGlzLmluZGV4L3RoaXMubWF4KjEwMDowfX0pfSxiLmV4cG9ydHM9ZH0seyIuLi91dGlscyI6MzIsIi4vR2VuZXJpY1dvcmtlciI6Mjh9XSwyODpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEpe3RoaXMubmFtZT1hfHwiZGVmYXVsdCIsdGhpcy5zdHJlYW1JbmZvPXt9LHRoaXMuZ2VuZXJhdGVkRXJyb3I9bnVsbCx0aGlzLmV4dHJhU3RyZWFtSW5mbz17fSx0aGlzLmlzUGF1c2VkPSEwLHRoaXMuaXNGaW5pc2hlZD0hMSx0aGlzLmlzTG9ja2VkPSExLHRoaXMuX2xpc3RlbmVycz17ZGF0YTpbXSxlbmQ6W10sZXJyb3I6W119LHRoaXMucHJldmlvdXM9bnVsbH1kLnByb3RvdHlwZT17cHVzaDpmdW5jdGlvbihhKXt0aGlzLmVtaXQoImRhdGEiLGEpfSxlbmQ6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRmluaXNoZWQpcmV0dXJuITE7dGhpcy5mbHVzaCgpO3RyeXt0aGlzLmVtaXQoImVuZCIpLHRoaXMuY2xlYW5VcCgpLHRoaXMuaXNGaW5pc2hlZD0hMH1jYXRjaChhKXt0aGlzLmVtaXQoImVycm9yIixhKX1yZXR1cm4hMH0sZXJyb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIXRoaXMuaXNGaW5pc2hlZCYmKHRoaXMuaXNQYXVzZWQ/dGhpcy5nZW5lcmF0ZWRFcnJvcj1hOih0aGlzLmlzRmluaXNoZWQ9ITAsdGhpcy5lbWl0KCJlcnJvciIsYSksdGhpcy5wcmV2aW91cyYmdGhpcy5wcmV2aW91cy5lcnJvcihhKSx0aGlzLmNsZWFuVXAoKSksITApfSxvbjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLl9saXN0ZW5lcnNbYV0ucHVzaChiKSx0aGlzfSxjbGVhblVwOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW1JbmZvPXRoaXMuZ2VuZXJhdGVkRXJyb3I9dGhpcy5leHRyYVN0cmVhbUluZm89bnVsbCx0aGlzLl9saXN0ZW5lcnM9W119LGVtaXQ6ZnVuY3Rpb24oYSxiKXtpZih0aGlzLl9saXN0ZW5lcnNbYV0pZm9yKHZhciBjPTA7Yzx0aGlzLl9saXN0ZW5lcnNbYV0ubGVuZ3RoO2MrKyl0aGlzLl9saXN0ZW5lcnNbYV1bY10uY2FsbCh0aGlzLGIpfSxwaXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlZ2lzdGVyUHJldmlvdXModGhpcyl9LHJlZ2lzdGVyUHJldmlvdXM6ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0xvY2tlZCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBzdHJlYW0gJyIrdGhpcysiJyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuIik7dGhpcy5zdHJlYW1JbmZvPWEuc3RyZWFtSW5mbyx0aGlzLm1lcmdlU3RyZWFtSW5mbygpLHRoaXMucHJldmlvdXM9YTt2YXIgYj10aGlzO3JldHVybiBhLm9uKCJkYXRhIixmdW5jdGlvbihhKXtiLnByb2Nlc3NDaHVuayhhKX0pLGEub24oImVuZCIsZnVuY3Rpb24oKXtiLmVuZCgpfSksYS5vbigiZXJyb3IiLGZ1bmN0aW9uKGEpe2IuZXJyb3IoYSl9KSx0aGlzfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLmlzUGF1c2VkJiYhdGhpcy5pc0ZpbmlzaGVkJiYodGhpcy5pc1BhdXNlZD0hMCx0aGlzLnByZXZpb3VzJiZ0aGlzLnByZXZpb3VzLnBhdXNlKCksITApfSxyZXN1bWU6ZnVuY3Rpb24oKXtpZighdGhpcy5pc1BhdXNlZHx8dGhpcy5pc0ZpbmlzaGVkKXJldHVybiExO3RoaXMuaXNQYXVzZWQ9ITE7dmFyIGE9ITE7cmV0dXJuIHRoaXMuZ2VuZXJhdGVkRXJyb3ImJih0aGlzLmVycm9yKHRoaXMuZ2VuZXJhdGVkRXJyb3IpLGE9ITApLHRoaXMucHJldmlvdXMmJnRoaXMucHJldmlvdXMucmVzdW1lKCksIWF9LGZsdXNoOmZ1bmN0aW9uKCl7fSxwcm9jZXNzQ2h1bms6ZnVuY3Rpb24oYSl7dGhpcy5wdXNoKGEpfSx3aXRoU3RyZWFtSW5mbzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmV4dHJhU3RyZWFtSW5mb1thXT1iLHRoaXMubWVyZ2VTdHJlYW1JbmZvKCksdGhpc30sbWVyZ2VTdHJlYW1JbmZvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIHRoaXMuZXh0cmFTdHJlYW1JbmZvKXRoaXMuZXh0cmFTdHJlYW1JbmZvLmhhc093blByb3BlcnR5KGEpJiYodGhpcy5zdHJlYW1JbmZvW2FdPXRoaXMuZXh0cmFTdHJlYW1JbmZvW2FdKX0sbG9jazpmdW5jdGlvbigpe2lmKHRoaXMuaXNMb2NrZWQpdGhyb3cgbmV3IEVycm9yKCJUaGUgc3RyZWFtICciK3RoaXMrIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLiIpO3RoaXMuaXNMb2NrZWQ9ITAsdGhpcy5wcmV2aW91cyYmdGhpcy5wcmV2aW91cy5sb2NrKCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGE9IldvcmtlciAiK3RoaXMubmFtZTtyZXR1cm4gdGhpcy5wcmV2aW91cz90aGlzLnByZXZpb3VzKyIgLT4gIithOmF9fSxiLmV4cG9ydHM9ZH0se31dLDI5OltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoYSxiLGMsZCl7dmFyIGY9bnVsbDtzd2l0Y2goYSl7Y2FzZSJibG9iIjpyZXR1cm4gaC5uZXdCbG9iKGMsZCk7Y2FzZSJiYXNlNjQiOnJldHVybiBmPWUoYixjKSxrLmVuY29kZShmKTtkZWZhdWx0OnJldHVybiBmPWUoYixjKSxoLnRyYW5zZm9ybVRvKGEsZil9fWZ1bmN0aW9uIGUoYSxiKXt2YXIgYyxkPTAsZT1udWxsLGY9MDtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWYrPWJbY10ubGVuZ3RoO3N3aXRjaChhKXtjYXNlInN0cmluZyI6cmV0dXJuIGIuam9pbigiIik7Y2FzZSJhcnJheSI6cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sYik7Y2FzZSJ1aW50OGFycmF5Ijpmb3IoZT1uZXcgVWludDhBcnJheShmKSxjPTA7YzxiLmxlbmd0aDtjKyspZS5zZXQoYltjXSxkKSxkKz1iW2NdLmxlbmd0aDtyZXR1cm4gZTtjYXNlIm5vZGVidWZmZXIiOnJldHVybiBCdWZmZXIuY29uY2F0KGIpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJjb25jYXQgOiB1bnN1cHBvcnRlZCB0eXBlICciK2ErIiciKX19ZnVuY3Rpb24gZihhLGIpe3JldHVybiBuZXcgbS5Qcm9taXNlKGZ1bmN0aW9uKGMsZSl7dmFyIGY9W10sZz1hLl9pbnRlcm5hbFR5cGUsaD1hLl9vdXRwdXRUeXBlLGk9YS5fbWltZVR5cGU7YS5vbigiZGF0YSIsZnVuY3Rpb24oYSxjKXtmLnB1c2goYSksYiYmYihjKX0pLm9uKCJlcnJvciIsZnVuY3Rpb24oYSl7Zj1bXSxlKGEpfSkub24oImVuZCIsZnVuY3Rpb24oKXt0cnl7dmFyIGE9ZChoLGcsZixpKTtjKGEpfWNhdGNoKGIpe2UoYil9Zj1bXX0pLnJlc3VtZSgpfSl9ZnVuY3Rpb24gZyhhLGIsYyl7dmFyIGQ9Yjtzd2l0Y2goYil7Y2FzZSJibG9iIjpkPSJhcnJheWJ1ZmZlciI7YnJlYWs7Y2FzZSJhcnJheWJ1ZmZlciI6ZD0idWludDhhcnJheSI7YnJlYWs7Y2FzZSJiYXNlNjQiOmQ9InN0cmluZyJ9dHJ5e3RoaXMuX2ludGVybmFsVHlwZT1kLHRoaXMuX291dHB1dFR5cGU9Yix0aGlzLl9taW1lVHlwZT1jLGguY2hlY2tTdXBwb3J0KGQpLHRoaXMuX3dvcmtlcj1hLnBpcGUobmV3IGkoZCkpLGEubG9jaygpfWNhdGNoKGUpe3RoaXMuX3dvcmtlcj1uZXcgaigiZXJyb3IiKSx0aGlzLl93b3JrZXIuZXJyb3IoZSl9fXZhciBoPWEoIi4uL3V0aWxzIiksaT1hKCIuL0NvbnZlcnRXb3JrZXIiKSxqPWEoIi4vR2VuZXJpY1dvcmtlciIpLGs9YSgiLi4vYmFzZTY0IiksbD1hKCIuLi9zdXBwb3J0IiksbT1hKCIuLi9leHRlcm5hbCIpLG49bnVsbDtpZihsLm5vZGVzdHJlYW0pdHJ5e249YSgiLi4vbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIiKX1jYXRjaChvKXt9Zy5wcm90b3R5cGU9e2FjY3VtdWxhdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGYodGhpcyxhKX0sb246ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3JldHVybiJkYXRhIj09PWE/dGhpcy5fd29ya2VyLm9uKGEsZnVuY3Rpb24oYSl7Yi5jYWxsKGMsYS5kYXRhLGEubWV0YSl9KTp0aGlzLl93b3JrZXIub24oYSxmdW5jdGlvbigpe2guZGVsYXkoYixhcmd1bWVudHMsYyl9KSx0aGlzfSxyZXN1bWU6ZnVuY3Rpb24oKXtyZXR1cm4gaC5kZWxheSh0aGlzLl93b3JrZXIucmVzdW1lLFtdLHRoaXMuX3dvcmtlciksdGhpc30scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd29ya2VyLnBhdXNlKCksdGhpc30sdG9Ob2RlanNTdHJlYW06ZnVuY3Rpb24oYSl7aWYoaC5jaGVja1N1cHBvcnQoIm5vZGVzdHJlYW0iKSwibm9kZWJ1ZmZlciIhPT10aGlzLl9vdXRwdXRUeXBlKXRocm93IG5ldyBFcnJvcih0aGlzLl9vdXRwdXRUeXBlKyIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIG1ldGhvZCIpO3JldHVybiBuZXcgbih0aGlzLHtvYmplY3RNb2RlOiJub2RlYnVmZmVyIiE9PXRoaXMuX291dHB1dFR5cGV9LGEpfX0sYi5leHBvcnRzPWd9LHsiLi4vYmFzZTY0IjoxLCIuLi9leHRlcm5hbCI6NiwiLi4vbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIiOjEzLCIuLi9zdXBwb3J0IjozMCwiLi4vdXRpbHMiOjMyLCIuL0NvbnZlcnRXb3JrZXIiOjI0LCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMzA6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7aWYoYy5iYXNlNjQ9ITAsYy5hcnJheT0hMCxjLnN0cmluZz0hMCxjLmFycmF5YnVmZmVyPSJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSxjLm5vZGVidWZmZXI9InVuZGVmaW5lZCIhPXR5cGVvZiBCdWZmZXIsYy51aW50OGFycmF5PSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSwidW5kZWZpbmVkIj09dHlwZW9mIEFycmF5QnVmZmVyKWMuYmxvYj0hMTtlbHNle3ZhciBkPW5ldyBBcnJheUJ1ZmZlcigwKTt0cnl7Yy5ibG9iPTA9PT1uZXcgQmxvYihbZF0se3R5cGU6ImFwcGxpY2F0aW9uL3ppcCJ9KS5zaXplfWNhdGNoKGUpe3RyeXt2YXIgZj13aW5kb3cuQmxvYkJ1aWxkZXJ8fHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlcnx8d2luZG93Lk1vekJsb2JCdWlsZGVyfHx3aW5kb3cuTVNCbG9iQnVpbGRlcixnPW5ldyBmO2cuYXBwZW5kKGQpLGMuYmxvYj0wPT09Zy5nZXRCbG9iKCJhcHBsaWNhdGlvbi96aXAiKS5zaXplfWNhdGNoKGUpe2MuYmxvYj0hMX19fXRyeXtjLm5vZGVzdHJlYW09ISFhKCJyZWFkYWJsZS1zdHJlYW0iKS5SZWFkYWJsZX1jYXRjaChlKXtjLm5vZGVzdHJlYW09ITF9fSx7InJlYWRhYmxlLXN0cmVhbSI6MTZ9XSwzMTpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKCl7aS5jYWxsKHRoaXMsInV0Zi04IGRlY29kZSIpLHRoaXMubGVmdE92ZXI9bnVsbH1mdW5jdGlvbiBlKCl7aS5jYWxsKHRoaXMsInV0Zi04IGVuY29kZSIpfWZvcih2YXIgZj1hKCIuL3V0aWxzIiksZz1hKCIuL3N1cHBvcnQiKSxoPWEoIi4vbm9kZWpzVXRpbHMiKSxpPWEoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKSxqPW5ldyBBcnJheSgyNTYpLGs9MDtrPDI1NjtrKyspaltrXT1rPj0yNTI/NjprPj0yNDg/NTprPj0yNDA/NDprPj0yMjQ/MzprPj0xOTI/MjoxO2pbMjU0XT1qWzI1NF09MTt2YXIgbD1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGg9YS5sZW5ndGgsaT0wO2ZvcihlPTA7ZTxoO2UrKyljPWEuY2hhckNvZGVBdChlKSw1NTI5Nj09PSg2NDUxMiZjKSYmZSsxPGgmJihkPWEuY2hhckNvZGVBdChlKzEpLDU2MzIwPT09KDY0NTEyJmQpJiYoYz02NTUzNisoYy01NTI5Njw8MTApKyhkLTU2MzIwKSxlKyspKSxpKz1jPDEyOD8xOmM8MjA0OD8yOmM8NjU1MzY/Mzo0O2ZvcihiPWcudWludDhhcnJheT9uZXcgVWludDhBcnJheShpKTpuZXcgQXJyYXkoaSksZj0wLGU9MDtmPGk7ZSsrKWM9YS5jaGFyQ29kZUF0KGUpLDU1Mjk2PT09KDY0NTEyJmMpJiZlKzE8aCYmKGQ9YS5jaGFyQ29kZUF0KGUrMSksNTYzMjA9PT0oNjQ1MTImZCkmJihjPTY1NTM2KyhjLTU1Mjk2PDwxMCkrKGQtNTYzMjApLGUrKykpLGM8MTI4P2JbZisrXT1jOmM8MjA0OD8oYltmKytdPTE5MnxjPj4+NixiW2YrK109MTI4fDYzJmMpOmM8NjU1MzY/KGJbZisrXT0yMjR8Yz4+PjEyLGJbZisrXT0xMjh8Yz4+PjYmNjMsYltmKytdPTEyOHw2MyZjKTooYltmKytdPTI0MHxjPj4+MTgsYltmKytdPTEyOHxjPj4+MTImNjMsYltmKytdPTEyOHxjPj4+NiY2MyxiW2YrK109MTI4fDYzJmMpO3JldHVybiBifSxtPWZ1bmN0aW9uKGEsYil7dmFyIGM7Zm9yKGI9Ynx8YS5sZW5ndGgsYj5hLmxlbmd0aCYmKGI9YS5sZW5ndGgpLGM9Yi0xO2M+PTAmJjEyOD09PSgxOTImYVtjXSk7KWMtLTtyZXR1cm4gYzwwP2I6MD09PWM/YjpjK2pbYVtjXV0+Yj9jOmJ9LG49ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZz1hLmxlbmd0aCxoPW5ldyBBcnJheSgyKmcpO2ZvcihjPTAsYj0wO2I8ZzspaWYoZD1hW2IrK10sZDwxMjgpaFtjKytdPWQ7ZWxzZSBpZihlPWpbZF0sZT40KWhbYysrXT02NTUzMyxiKz1lLTE7ZWxzZXtmb3IoZCY9Mj09PWU/MzE6Mz09PWU/MTU6NztlPjEmJmI8ZzspZD1kPDw2fDYzJmFbYisrXSxlLS07ZT4xP2hbYysrXT02NTUzMzpkPDY1NTM2P2hbYysrXT1kOihkLT02NTUzNixoW2MrK109NTUyOTZ8ZD4+MTAmMTAyMyxoW2MrK109NTYzMjB8MTAyMyZkKX1yZXR1cm4gaC5sZW5ndGghPT1jJiYoaC5zdWJhcnJheT9oPWguc3ViYXJyYXkoMCxjKTpoLmxlbmd0aD1jKSxmLmFwcGx5RnJvbUNoYXJDb2RlKGgpfTtjLnV0ZjhlbmNvZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIGcubm9kZWJ1ZmZlcj9oLm5ld0J1ZmZlcihhLCJ1dGYtOCIpOmwoYSl9LGMudXRmOGRlY29kZT1mdW5jdGlvbihhKXtyZXR1cm4gZy5ub2RlYnVmZmVyP2YudHJhbnNmb3JtVG8oIm5vZGVidWZmZXIiLGEpLnRvU3RyaW5nKCJ1dGYtOCIpOihhPWYudHJhbnNmb3JtVG8oZy51aW50OGFycmF5PyJ1aW50OGFycmF5IjoiYXJyYXkiLGEpLG4oYSkpfSxmLmluaGVyaXRzKGQsaSksZC5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKGEpe3ZhciBiPWYudHJhbnNmb3JtVG8oZy51aW50OGFycmF5PyJ1aW50OGFycmF5IjoiYXJyYXkiLGEuZGF0YSk7aWYodGhpcy5sZWZ0T3ZlciYmdGhpcy5sZWZ0T3Zlci5sZW5ndGgpe2lmKGcudWludDhhcnJheSl7dmFyIGQ9YjtiPW5ldyBVaW50OEFycmF5KGQubGVuZ3RoK3RoaXMubGVmdE92ZXIubGVuZ3RoKSxiLnNldCh0aGlzLmxlZnRPdmVyLDApLGIuc2V0KGQsdGhpcy5sZWZ0T3Zlci5sZW5ndGgpfWVsc2UgYj10aGlzLmxlZnRPdmVyLmNvbmNhdChiKTt0aGlzLmxlZnRPdmVyPW51bGx9dmFyIGU9bShiKSxoPWI7ZSE9PWIubGVuZ3RoJiYoZy51aW50OGFycmF5PyhoPWIuc3ViYXJyYXkoMCxlKSx0aGlzLmxlZnRPdmVyPWIuc3ViYXJyYXkoZSxiLmxlbmd0aCkpOihoPWIuc2xpY2UoMCxlKSx0aGlzLmxlZnRPdmVyPWIuc2xpY2UoZSxiLmxlbmd0aCkpKSx0aGlzLnB1c2goe2RhdGE6Yy51dGY4ZGVjb2RlKGgpLG1ldGE6YS5tZXRhfSl9LGQucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7dGhpcy5sZWZ0T3ZlciYmdGhpcy5sZWZ0T3Zlci5sZW5ndGgmJih0aGlzLnB1c2goe2RhdGE6Yy51dGY4ZGVjb2RlKHRoaXMubGVmdE92ZXIpLG1ldGE6e319KSx0aGlzLmxlZnRPdmVyPW51bGwpfSxjLlV0ZjhEZWNvZGVXb3JrZXI9ZCxmLmluaGVyaXRzKGUsaSksZS5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKGEpe3RoaXMucHVzaCh7ZGF0YTpjLnV0ZjhlbmNvZGUoYS5kYXRhKSxtZXRhOmEubWV0YX0pfSxjLlV0ZjhFbmNvZGVXb3JrZXI9ZX0seyIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6MjgsIi4vc3VwcG9ydCI6MzAsIi4vdXRpbHMiOjMyfV0sMzI6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhKXt2YXIgYj1udWxsO3JldHVybiBiPWkudWludDhhcnJheT9uZXcgVWludDhBcnJheShhLmxlbmd0aCk6bmV3IEFycmF5KGEubGVuZ3RoKSxmKGEsYil9ZnVuY3Rpb24gZShhKXtyZXR1cm4gYX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDsrK2MpYltjXT0yNTUmYS5jaGFyQ29kZUF0KGMpO3JldHVybiBifWZ1bmN0aW9uIGcoYSl7dmFyIGI9NjU1MzYsZD1jLmdldFR5cGVPZihhKSxlPSEwO2lmKCJ1aW50OGFycmF5Ij09PWQ/ZT1uLmFwcGx5Q2FuQmVVc2VkLnVpbnQ4YXJyYXk6Im5vZGVidWZmZXIiPT09ZCYmKGU9bi5hcHBseUNhbkJlVXNlZC5ub2RlYnVmZmVyKSxlKWZvcig7Yj4xOyl0cnl7cmV0dXJuIG4uc3RyaW5naWZ5QnlDaHVuayhhLGQsYil9Y2F0Y2goZil7Yj1NYXRoLmZsb29yKGIvMil9cmV0dXJuIG4uc3RyaW5naWZ5QnlDaGFyKGEpfWZ1bmN0aW9uIGgoYSxiKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliW2NdPWFbY107cmV0dXJuIGJ9dmFyIGk9YSgiLi9zdXBwb3J0Iiksaj1hKCIuL2Jhc2U2NCIpLGs9YSgiLi9ub2RlanNVdGlscyIpLGw9YSgiY29yZS1qcy9saWJyYXJ5L2ZuL3NldC1pbW1lZGlhdGUiKSxtPWEoIi4vZXh0ZXJuYWwiKTsKYy5uZXdCbG9iPWZ1bmN0aW9uKGEsYil7Yy5jaGVja1N1cHBvcnQoImJsb2IiKTt0cnl7cmV0dXJuIG5ldyBCbG9iKGEse3R5cGU6Yn0pfWNhdGNoKGQpe3RyeXtmb3IodmFyIGU9d2luZG93LkJsb2JCdWlsZGVyfHx3aW5kb3cuV2ViS2l0QmxvYkJ1aWxkZXJ8fHdpbmRvdy5Nb3pCbG9iQnVpbGRlcnx8d2luZG93Lk1TQmxvYkJ1aWxkZXIsZj1uZXcgZSxnPTA7ZzxhLmxlbmd0aDtnKyspZi5hcHBlbmQoYVtnXSk7cmV0dXJuIGYuZ2V0QmxvYihiKX1jYXRjaChkKXt0aHJvdyBuZXcgRXJyb3IoIkJ1ZyA6IGNhbid0IGNvbnN0cnVjdCB0aGUgQmxvYi4iKX19fTt2YXIgbj17c3RyaW5naWZ5QnlDaHVuazpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT0wLGY9YS5sZW5ndGg7aWYoZjw9YylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGEpO2Zvcig7ZTxmOykiYXJyYXkiPT09Ynx8Im5vZGVidWZmZXIiPT09Yj9kLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGEuc2xpY2UoZSxNYXRoLm1pbihlK2MsZikpKSk6ZC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxhLnN1YmFycmF5KGUsTWF0aC5taW4oZStjLGYpKSkpLGUrPWM7cmV0dXJuIGQuam9pbigiIil9LHN0cmluZ2lmeUJ5Q2hhcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoYVtjXSk7cmV0dXJuIGJ9LGFwcGx5Q2FuQmVVc2VkOnt1aW50OGFycmF5OmZ1bmN0aW9uKCl7dHJ5e3JldHVybiBpLnVpbnQ4YXJyYXkmJjE9PT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkoMSkpLmxlbmd0aH1jYXRjaChhKXtyZXR1cm4hMX19KCksbm9kZWJ1ZmZlcjpmdW5jdGlvbigpe3RyeXtyZXR1cm4gaS5ub2RlYnVmZmVyJiYxPT09U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGsubmV3QnVmZmVyKDEpKS5sZW5ndGh9Y2F0Y2goYSl7cmV0dXJuITF9fSgpfX07Yy5hcHBseUZyb21DaGFyQ29kZT1nO3ZhciBvPXt9O28uc3RyaW5nPXtzdHJpbmc6ZSxhcnJheTpmdW5jdGlvbihhKXtyZXR1cm4gZihhLG5ldyBBcnJheShhLmxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpmdW5jdGlvbihhKXtyZXR1cm4gby5zdHJpbmcudWludDhhcnJheShhKS5idWZmZXJ9LHVpbnQ4YXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIGYoYSxuZXcgVWludDhBcnJheShhLmxlbmd0aCkpfSxub2RlYnVmZmVyOmZ1bmN0aW9uKGEpe3JldHVybiBmKGEsay5uZXdCdWZmZXIoYS5sZW5ndGgpKX19LG8uYXJyYXk9e3N0cmluZzpnLGFycmF5OmUsYXJyYXlidWZmZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KGEpLmJ1ZmZlcn0sdWludDhhcnJheTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYSl9LG5vZGVidWZmZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGsubmV3QnVmZmVyKGEpfX0sby5hcnJheWJ1ZmZlcj17c3RyaW5nOmZ1bmN0aW9uKGEpe3JldHVybiBnKG5ldyBVaW50OEFycmF5KGEpKX0sYXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIGgobmV3IFVpbnQ4QXJyYXkoYSksbmV3IEFycmF5KGEuYnl0ZUxlbmd0aCkpfSxhcnJheWJ1ZmZlcjplLHVpbnQ4YXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KGEpfSxub2RlYnVmZmVyOmZ1bmN0aW9uKGEpe3JldHVybiBrLm5ld0J1ZmZlcihuZXcgVWludDhBcnJheShhKSl9fSxvLnVpbnQ4YXJyYXk9e3N0cmluZzpnLGFycmF5OmZ1bmN0aW9uKGEpe3JldHVybiBoKGEsbmV3IEFycmF5KGEubGVuZ3RoKSl9LGFycmF5YnVmZmVyOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBVaW50OEFycmF5KGEubGVuZ3RoKTtyZXR1cm4gYS5sZW5ndGgmJmIuc2V0KGEsMCksYi5idWZmZXJ9LHVpbnQ4YXJyYXk6ZSxub2RlYnVmZmVyOmZ1bmN0aW9uKGEpe3JldHVybiBrLm5ld0J1ZmZlcihhKX19LG8ubm9kZWJ1ZmZlcj17c3RyaW5nOmcsYXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIGgoYSxuZXcgQXJyYXkoYS5sZW5ndGgpKX0sYXJyYXlidWZmZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIG8ubm9kZWJ1ZmZlci51aW50OGFycmF5KGEpLmJ1ZmZlcn0sdWludDhhcnJheTpmdW5jdGlvbihhKXtyZXR1cm4gaChhLG5ldyBVaW50OEFycmF5KGEubGVuZ3RoKSl9LG5vZGVidWZmZXI6ZX0sYy50cmFuc2Zvcm1Ubz1mdW5jdGlvbihhLGIpe2lmKGJ8fChiPSIiKSwhYSlyZXR1cm4gYjtjLmNoZWNrU3VwcG9ydChhKTt2YXIgZD1jLmdldFR5cGVPZihiKSxlPW9bZF1bYV0oYik7cmV0dXJuIGV9LGMuZ2V0VHlwZU9mPWZ1bmN0aW9uKGEpe3JldHVybiJzdHJpbmciPT10eXBlb2YgYT8ic3RyaW5nIjoiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpPyJhcnJheSI6aS5ub2RlYnVmZmVyJiZrLmlzQnVmZmVyKGEpPyJub2RlYnVmZmVyIjppLnVpbnQ4YXJyYXkmJmEgaW5zdGFuY2VvZiBVaW50OEFycmF5PyJ1aW50OGFycmF5IjppLmFycmF5YnVmZmVyJiZhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ImFycmF5YnVmZmVyIjp2b2lkIDB9LGMuY2hlY2tTdXBwb3J0PWZ1bmN0aW9uKGEpe3ZhciBiPWlbYS50b0xvd2VyQ2FzZSgpXTtpZighYil0aHJvdyBuZXcgRXJyb3IoYSsiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybSIpfSxjLk1BWF9WQUxVRV8xNkJJVFM9NjU1MzUsYy5NQVhfVkFMVUVfMzJCSVRTPS0xLGMucHJldHR5PWZ1bmN0aW9uKGEpe3ZhciBiLGMsZD0iIjtmb3IoYz0wO2M8KGF8fCIiKS5sZW5ndGg7YysrKWI9YS5jaGFyQ29kZUF0KGMpLGQrPSJcXHgiKyhiPDE2PyIwIjoiIikrYi50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtyZXR1cm4gZH0sYy5kZWxheT1mdW5jdGlvbihhLGIsYyl7bChmdW5jdGlvbigpe2EuYXBwbHkoY3x8bnVsbCxifHxbXSl9KX0sYy5pbmhlcml0cz1mdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKCl7fTtjLnByb3RvdHlwZT1iLnByb3RvdHlwZSxhLnByb3RvdHlwZT1uZXcgY30sYy5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGM9e307Zm9yKGE9MDthPGFyZ3VtZW50cy5sZW5ndGg7YSsrKWZvcihiIGluIGFyZ3VtZW50c1thXSlhcmd1bWVudHNbYV0uaGFzT3duUHJvcGVydHkoYikmJiJ1bmRlZmluZWQiPT10eXBlb2YgY1tiXSYmKGNbYl09YXJndW1lbnRzW2FdW2JdKTtyZXR1cm4gY30sYy5wcmVwYXJlQ29udGVudD1mdW5jdGlvbihhLGIsZSxmLGcpe3ZhciBoPW0uUHJvbWlzZS5yZXNvbHZlKGIpLnRoZW4oZnVuY3Rpb24oYSl7dmFyIGI9aS5ibG9iJiYoYSBpbnN0YW5jZW9mIEJsb2J8fFsiW29iamVjdCBGaWxlXSIsIltvYmplY3QgQmxvYl0iXS5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKSkhPT0tMSk7cmV0dXJuIGImJiJ1bmRlZmluZWQiIT10eXBlb2YgRmlsZVJlYWRlcj9uZXcgbS5Qcm9taXNlKGZ1bmN0aW9uKGIsYyl7dmFyIGQ9bmV3IEZpbGVSZWFkZXI7ZC5vbmxvYWQ9ZnVuY3Rpb24oYSl7YihhLnRhcmdldC5yZXN1bHQpfSxkLm9uZXJyb3I9ZnVuY3Rpb24oYSl7YyhhLnRhcmdldC5lcnJvcil9LGQucmVhZEFzQXJyYXlCdWZmZXIoYSl9KTphfSk7cmV0dXJuIGgudGhlbihmdW5jdGlvbihiKXt2YXIgaD1jLmdldFR5cGVPZihiKTtyZXR1cm4gaD8oImFycmF5YnVmZmVyIj09PWg/Yj1jLnRyYW5zZm9ybVRvKCJ1aW50OGFycmF5IixiKToic3RyaW5nIj09PWgmJihnP2I9ai5kZWNvZGUoYik6ZSYmZiE9PSEwJiYoYj1kKGIpKSksYik6bS5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIlRoZSBkYXRhIG9mICciK2ErIicgaXMgaW4gYW4gdW5zdXBwb3J0ZWQgZm9ybWF0ICEiKSl9KX19LHsiLi9iYXNlNjQiOjEsIi4vZXh0ZXJuYWwiOjYsIi4vbm9kZWpzVXRpbHMiOjE0LCIuL3N1cHBvcnQiOjMwLCJjb3JlLWpzL2xpYnJhcnkvZm4vc2V0LWltbWVkaWF0ZSI6MzZ9XSwzMzpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEpe3RoaXMuZmlsZXM9W10sdGhpcy5sb2FkT3B0aW9ucz1hfXZhciBlPWEoIi4vcmVhZGVyL3JlYWRlckZvciIpLGY9YSgiLi91dGlscyIpLGc9YSgiLi9zaWduYXR1cmUiKSxoPWEoIi4vemlwRW50cnkiKSxpPShhKCIuL3V0ZjgiKSxhKCIuL3N1cHBvcnQiKSk7ZC5wcm90b3R5cGU9e2NoZWNrU2lnbmF0dXJlOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmUoYSkpe3RoaXMucmVhZGVyLmluZGV4LT00O3ZhciBiPXRoaXMucmVhZGVyLnJlYWRTdHJpbmcoNCk7dGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwIG9yIGJ1ZzogdW5leHBlY3RlZCBzaWduYXR1cmUgKCIrZi5wcmV0dHkoYikrIiwgZXhwZWN0ZWQgIitmLnByZXR0eShhKSsiKSIpfX0saXNTaWduYXR1cmU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLnJlYWRlci5pbmRleDt0aGlzLnJlYWRlci5zZXRJbmRleChhKTt2YXIgZD10aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpLGU9ZD09PWI7cmV0dXJuIHRoaXMucmVhZGVyLnNldEluZGV4KGMpLGV9LHJlYWRCbG9ja0VuZE9mQ2VudHJhbDpmdW5jdGlvbigpe3RoaXMuZGlza051bWJlcj10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQ9dGhpcy5yZWFkZXIucmVhZEludCgyKSx0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzaz10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuY2VudHJhbERpclJlY29yZHM9dGhpcy5yZWFkZXIucmVhZEludCgyKSx0aGlzLmNlbnRyYWxEaXJTaXplPXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5jZW50cmFsRGlyT2Zmc2V0PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy56aXBDb21tZW50TGVuZ3RoPXRoaXMucmVhZGVyLnJlYWRJbnQoMik7dmFyIGE9dGhpcy5yZWFkZXIucmVhZERhdGEodGhpcy56aXBDb21tZW50TGVuZ3RoKSxiPWkudWludDhhcnJheT8idWludDhhcnJheSI6ImFycmF5IixjPWYudHJhbnNmb3JtVG8oYixhKTt0aGlzLnppcENvbW1lbnQ9dGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShjKX0scmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWw6ZnVuY3Rpb24oKXt0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZT10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMucmVhZGVyLnNraXAoNCksdGhpcy5kaXNrTnVtYmVyPXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD10aGlzLnJlYWRlci5yZWFkSW50KDQpLHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5jZW50cmFsRGlyUmVjb3Jkcz10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMuY2VudHJhbERpclNpemU9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLmNlbnRyYWxEaXJPZmZzZXQ9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLnppcDY0RXh0ZW5zaWJsZURhdGE9e307Zm9yKHZhciBhLGIsYyxkPXRoaXMuemlwNjRFbmRPZkNlbnRyYWxTaXplLTQ0LGU9MDtlPGQ7KWE9dGhpcy5yZWFkZXIucmVhZEludCgyKSxiPXRoaXMucmVhZGVyLnJlYWRJbnQoNCksYz10aGlzLnJlYWRlci5yZWFkRGF0YShiKSx0aGlzLnppcDY0RXh0ZW5zaWJsZURhdGFbYV09e2lkOmEsbGVuZ3RoOmIsdmFsdWU6Y319LHJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsTG9jYXRvcjpmdW5jdGlvbigpe2lmKHRoaXMuZGlza1dpdGhaaXA2NENlbnRyYWxEaXJTdGFydD10aGlzLnJlYWRlci5yZWFkSW50KDQpLHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpcj10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMuZGlza3NDb3VudD10aGlzLnJlYWRlci5yZWFkSW50KDQpLHRoaXMuZGlza3NDb3VudD4xKXRocm93IG5ldyBFcnJvcigiTXVsdGktdm9sdW1lcyB6aXAgYXJlIG5vdCBzdXBwb3J0ZWQiKX0scmVhZExvY2FsRmlsZXM6ZnVuY3Rpb24oKXt2YXIgYSxiO2ZvcihhPTA7YTx0aGlzLmZpbGVzLmxlbmd0aDthKyspYj10aGlzLmZpbGVzW2FdLHRoaXMucmVhZGVyLnNldEluZGV4KGIubG9jYWxIZWFkZXJPZmZzZXQpLHRoaXMuY2hlY2tTaWduYXR1cmUoZy5MT0NBTF9GSUxFX0hFQURFUiksYi5yZWFkTG9jYWxQYXJ0KHRoaXMucmVhZGVyKSxiLmhhbmRsZVVURjgoKSxiLnByb2Nlc3NBdHRyaWJ1dGVzKCl9LHJlYWRDZW50cmFsRGlyOmZ1bmN0aW9uKCl7dmFyIGE7Zm9yKHRoaXMucmVhZGVyLnNldEluZGV4KHRoaXMuY2VudHJhbERpck9mZnNldCk7dGhpcy5yZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlKGcuQ0VOVFJBTF9GSUxFX0hFQURFUik7KWE9bmV3IGgoe3ppcDY0OnRoaXMuemlwNjR9LHRoaXMubG9hZE9wdGlvbnMpLGEucmVhZENlbnRyYWxQYXJ0KHRoaXMucmVhZGVyKSx0aGlzLmZpbGVzLnB1c2goYSk7aWYodGhpcy5jZW50cmFsRGlyUmVjb3JkcyE9PXRoaXMuZmlsZXMubGVuZ3RoJiYwIT09dGhpcy5jZW50cmFsRGlyUmVjb3JkcyYmMD09PXRoaXMuZmlsZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcCBvciBidWc6IGV4cGVjdGVkICIrdGhpcy5jZW50cmFsRGlyUmVjb3JkcysiIHJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdCAiK3RoaXMuZmlsZXMubGVuZ3RoKX0scmVhZEVuZE9mQ2VudHJhbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKGcuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtpZihhPDApe3ZhciBiPSF0aGlzLmlzU2lnbmF0dXJlKDAsZy5MT0NBTF9GSUxFX0hFQURFUik7dGhyb3cgYj9uZXcgRXJyb3IoIkNhbid0IGZpbmQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IDogaXMgdGhpcyBhIHppcCBmaWxlID8gSWYgaXQgaXMsIHNlZSBodHRwczovL3N0dWsuZ2l0aHViLmlvL2pzemlwL2RvY3VtZW50YXRpb24vaG93dG8vcmVhZF96aXAuaHRtbCIpOm5ldyBFcnJvcigiQ29ycnVwdGVkIHppcDogY2FuJ3QgZmluZCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkiKX10aGlzLnJlYWRlci5zZXRJbmRleChhKTt2YXIgYz1hO2lmKHRoaXMuY2hlY2tTaWduYXR1cmUoZy5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpLHRoaXMucmVhZEJsb2NrRW5kT2ZDZW50cmFsKCksdGhpcy5kaXNrTnVtYmVyPT09Zi5NQVhfVkFMVUVfMTZCSVRTfHx0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PT09Zi5NQVhfVkFMVUVfMTZCSVRTfHx0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzaz09PWYuTUFYX1ZBTFVFXzE2QklUU3x8dGhpcy5jZW50cmFsRGlyUmVjb3Jkcz09PWYuTUFYX1ZBTFVFXzE2QklUU3x8dGhpcy5jZW50cmFsRGlyU2l6ZT09PWYuTUFYX1ZBTFVFXzMyQklUU3x8dGhpcy5jZW50cmFsRGlyT2Zmc2V0PT09Zi5NQVhfVkFMVUVfMzJCSVRTKXtpZih0aGlzLnppcDY0PSEwLGE9dGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKSxhPDApdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBjYW4ndCBmaW5kIHRoZSBaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciIpO2lmKHRoaXMucmVhZGVyLnNldEluZGV4KGEpLHRoaXMuY2hlY2tTaWduYXR1cmUoZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKSx0aGlzLnJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsTG9jYXRvcigpLCF0aGlzLmlzU2lnbmF0dXJlKHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpcixnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCkmJih0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXI9dGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpLHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpcjwwKSl0aHJvdyBuZXcgRXJyb3IoIkNvcnJ1cHRlZCB6aXA6IGNhbid0IGZpbmQgdGhlIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSIpO3RoaXMucmVhZGVyLnNldEluZGV4KHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciksdGhpcy5jaGVja1NpZ25hdHVyZShnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCksdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbCgpfXZhciBkPXRoaXMuY2VudHJhbERpck9mZnNldCt0aGlzLmNlbnRyYWxEaXJTaXplO3RoaXMuemlwNjQmJihkKz0yMCxkKz0xMit0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZSk7dmFyIGU9Yy1kO2lmKGU+MCl0aGlzLmlzU2lnbmF0dXJlKGMsZy5DRU5UUkFMX0ZJTEVfSEVBREVSKXx8KHRoaXMucmVhZGVyLnplcm89ZSk7ZWxzZSBpZihlPDApdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBtaXNzaW5nICIrTWF0aC5hYnMoZSkrIiBieXRlcy4iKX0scHJlcGFyZVJlYWRlcjpmdW5jdGlvbihhKXt0aGlzLnJlYWRlcj1lKGEpfSxsb2FkOmZ1bmN0aW9uKGEpe3RoaXMucHJlcGFyZVJlYWRlcihhKSx0aGlzLnJlYWRFbmRPZkNlbnRyYWwoKSx0aGlzLnJlYWRDZW50cmFsRGlyKCksdGhpcy5yZWFkTG9jYWxGaWxlcygpfX0sYi5leHBvcnRzPWR9LHsiLi9yZWFkZXIvcmVhZGVyRm9yIjoyMiwiLi9zaWduYXR1cmUiOjIzLCIuL3N1cHBvcnQiOjMwLCIuL3V0ZjgiOjMxLCIuL3V0aWxzIjozMiwiLi96aXBFbnRyeSI6MzR9XSwzNDpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEsYil7dGhpcy5vcHRpb25zPWEsdGhpcy5sb2FkT3B0aW9ucz1ifXZhciBlPWEoIi4vcmVhZGVyL3JlYWRlckZvciIpLGY9YSgiLi91dGlscyIpLGc9YSgiLi9jb21wcmVzc2VkT2JqZWN0IiksaD1hKCIuL2NyYzMyIiksaT1hKCIuL3V0ZjgiKSxqPWEoIi4vY29tcHJlc3Npb25zIiksaz1hKCIuL3N1cHBvcnQiKSxsPTAsbT0zLG49ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGopaWYoai5oYXNPd25Qcm9wZXJ0eShiKSYmaltiXS5tYWdpYz09PWEpcmV0dXJuIGpbYl07cmV0dXJuIG51bGx9O2QucHJvdG90eXBlPXtpc0VuY3J5cHRlZDpmdW5jdGlvbigpe3JldHVybiAxPT09KDEmdGhpcy5iaXRGbGFnKX0sdXNlVVRGODpmdW5jdGlvbigpe3JldHVybiAyMDQ4PT09KDIwNDgmdGhpcy5iaXRGbGFnKX0scmVhZExvY2FsUGFydDpmdW5jdGlvbihhKXt2YXIgYixjO2lmKGEuc2tpcCgyMiksdGhpcy5maWxlTmFtZUxlbmd0aD1hLnJlYWRJbnQoMiksYz1hLnJlYWRJbnQoMiksdGhpcy5maWxlTmFtZT1hLnJlYWREYXRhKHRoaXMuZmlsZU5hbWVMZW5ndGgpLGEuc2tpcChjKSx0aGlzLmNvbXByZXNzZWRTaXplPT09LTF8fHRoaXMudW5jb21wcmVzc2VkU2l6ZT09PS0xKXRocm93IG5ldyBFcnJvcigiQnVnIG9yIGNvcnJ1cHRlZCB6aXAgOiBkaWRuJ3QgZ2V0IGVub3VnaCBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKGNvbXByZXNzZWRTaXplID09PSAtMSB8fCB1bmNvbXByZXNzZWRTaXplID09PSAtMSkiKTtpZihiPW4odGhpcy5jb21wcmVzc2lvbk1ldGhvZCksbnVsbD09PWIpdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwIDogY29tcHJlc3Npb24gIitmLnByZXR0eSh0aGlzLmNvbXByZXNzaW9uTWV0aG9kKSsiIHVua25vd24gKGlubmVyIGZpbGUgOiAiK2YudHJhbnNmb3JtVG8oInN0cmluZyIsdGhpcy5maWxlTmFtZSkrIikiKTt0aGlzLmRlY29tcHJlc3NlZD1uZXcgZyh0aGlzLmNvbXByZXNzZWRTaXplLHRoaXMudW5jb21wcmVzc2VkU2l6ZSx0aGlzLmNyYzMyLGIsYS5yZWFkRGF0YSh0aGlzLmNvbXByZXNzZWRTaXplKSl9LHJlYWRDZW50cmFsUGFydDpmdW5jdGlvbihhKXt0aGlzLnZlcnNpb25NYWRlQnk9YS5yZWFkSW50KDIpLGEuc2tpcCgyKSx0aGlzLmJpdEZsYWc9YS5yZWFkSW50KDIpLHRoaXMuY29tcHJlc3Npb25NZXRob2Q9YS5yZWFkU3RyaW5nKDIpLHRoaXMuZGF0ZT1hLnJlYWREYXRlKCksdGhpcy5jcmMzMj1hLnJlYWRJbnQoNCksdGhpcy5jb21wcmVzc2VkU2l6ZT1hLnJlYWRJbnQoNCksdGhpcy51bmNvbXByZXNzZWRTaXplPWEucmVhZEludCg0KTt2YXIgYj1hLnJlYWRJbnQoMik7aWYodGhpcy5leHRyYUZpZWxkc0xlbmd0aD1hLnJlYWRJbnQoMiksdGhpcy5maWxlQ29tbWVudExlbmd0aD1hLnJlYWRJbnQoMiksdGhpcy5kaXNrTnVtYmVyU3RhcnQ9YS5yZWFkSW50KDIpLHRoaXMuaW50ZXJuYWxGaWxlQXR0cmlidXRlcz1hLnJlYWRJbnQoMiksdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzPWEucmVhZEludCg0KSx0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0PWEucmVhZEludCg0KSx0aGlzLmlzRW5jcnlwdGVkKCkpdGhyb3cgbmV3IEVycm9yKCJFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkIik7YS5za2lwKGIpLHRoaXMucmVhZEV4dHJhRmllbGRzKGEpLHRoaXMucGFyc2VaSVA2NEV4dHJhRmllbGQoYSksdGhpcy5maWxlQ29tbWVudD1hLnJlYWREYXRhKHRoaXMuZmlsZUNvbW1lbnRMZW5ndGgpfSxwcm9jZXNzQXR0cmlidXRlczpmdW5jdGlvbigpe3RoaXMudW5peFBlcm1pc3Npb25zPW51bGwsdGhpcy5kb3NQZXJtaXNzaW9ucz1udWxsO3ZhciBhPXRoaXMudmVyc2lvbk1hZGVCeT4+ODt0aGlzLmRpcj0hISgxNiZ0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpLGE9PT1sJiYodGhpcy5kb3NQZXJtaXNzaW9ucz02MyZ0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpLGE9PT1tJiYodGhpcy51bml4UGVybWlzc2lvbnM9dGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzPj4xNiY2NTUzNSksdGhpcy5kaXJ8fCIvIiE9PXRoaXMuZmlsZU5hbWVTdHIuc2xpY2UoLTEpfHwodGhpcy5kaXI9ITApfSxwYXJzZVpJUDY0RXh0cmFGaWVsZDpmdW5jdGlvbihhKXtpZih0aGlzLmV4dHJhRmllbGRzWzFdKXt2YXIgYj1lKHRoaXMuZXh0cmFGaWVsZHNbMV0udmFsdWUpO3RoaXMudW5jb21wcmVzc2VkU2l6ZT09PWYuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMudW5jb21wcmVzc2VkU2l6ZT1iLnJlYWRJbnQoOCkpLHRoaXMuY29tcHJlc3NlZFNpemU9PT1mLk1BWF9WQUxVRV8zMkJJVFMmJih0aGlzLmNvbXByZXNzZWRTaXplPWIucmVhZEludCg4KSksdGhpcy5sb2NhbEhlYWRlck9mZnNldD09PWYuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMubG9jYWxIZWFkZXJPZmZzZXQ9Yi5yZWFkSW50KDgpKSx0aGlzLmRpc2tOdW1iZXJTdGFydD09PWYuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMuZGlza051bWJlclN0YXJ0PWIucmVhZEludCg0KSl9fSxyZWFkRXh0cmFGaWVsZHM6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9YS5pbmRleCt0aGlzLmV4dHJhRmllbGRzTGVuZ3RoO2Zvcih0aGlzLmV4dHJhRmllbGRzfHwodGhpcy5leHRyYUZpZWxkcz17fSk7YS5pbmRleDxlOyliPWEucmVhZEludCgyKSxjPWEucmVhZEludCgyKSxkPWEucmVhZERhdGEoYyksdGhpcy5leHRyYUZpZWxkc1tiXT17aWQ6YixsZW5ndGg6Yyx2YWx1ZTpkfX0saGFuZGxlVVRGODpmdW5jdGlvbigpe3ZhciBhPWsudWludDhhcnJheT8idWludDhhcnJheSI6ImFycmF5IjtpZih0aGlzLnVzZVVURjgoKSl0aGlzLmZpbGVOYW1lU3RyPWkudXRmOGRlY29kZSh0aGlzLmZpbGVOYW1lKSx0aGlzLmZpbGVDb21tZW50U3RyPWkudXRmOGRlY29kZSh0aGlzLmZpbGVDb21tZW50KTtlbHNle3ZhciBiPXRoaXMuZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aCgpO2lmKG51bGwhPT1iKXRoaXMuZmlsZU5hbWVTdHI9YjtlbHNle3ZhciBjPWYudHJhbnNmb3JtVG8oYSx0aGlzLmZpbGVOYW1lKTt0aGlzLmZpbGVOYW1lU3RyPXRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoYyl9dmFyIGQ9dGhpcy5maW5kRXh0cmFGaWVsZFVuaWNvZGVDb21tZW50KCk7aWYobnVsbCE9PWQpdGhpcy5maWxlQ29tbWVudFN0cj1kO2Vsc2V7dmFyIGU9Zi50cmFuc2Zvcm1UbyhhLHRoaXMuZmlsZUNvbW1lbnQpO3RoaXMuZmlsZUNvbW1lbnRTdHI9dGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShlKX19fSxmaW5kRXh0cmFGaWVsZFVuaWNvZGVQYXRoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5leHRyYUZpZWxkc1syODc4OV07aWYoYSl7dmFyIGI9ZShhLnZhbHVlKTtyZXR1cm4gMSE9PWIucmVhZEludCgxKT9udWxsOmgodGhpcy5maWxlTmFtZSkhPT1iLnJlYWRJbnQoNCk/bnVsbDppLnV0ZjhkZWNvZGUoYi5yZWFkRGF0YShhLmxlbmd0aC01KSl9cmV0dXJuIG51bGx9LGZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmV4dHJhRmllbGRzWzI1NDYxXTtpZihhKXt2YXIgYj1lKGEudmFsdWUpO3JldHVybiAxIT09Yi5yZWFkSW50KDEpP251bGw6aCh0aGlzLmZpbGVDb21tZW50KSE9PWIucmVhZEludCg0KT9udWxsOmkudXRmOGRlY29kZShiLnJlYWREYXRhKGEubGVuZ3RoLTUpKX1yZXR1cm4gbnVsbH19LGIuZXhwb3J0cz1kfSx7Ii4vY29tcHJlc3NlZE9iamVjdCI6MiwiLi9jb21wcmVzc2lvbnMiOjMsIi4vY3JjMzIiOjQsIi4vcmVhZGVyL3JlYWRlckZvciI6MjIsIi4vc3VwcG9ydCI6MzAsIi4vdXRmOCI6MzEsIi4vdXRpbHMiOjMyfV0sMzU6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7dmFyIGQ9YSgiLi9zdHJlYW0vU3RyZWFtSGVscGVyIiksZT1hKCIuL3N0cmVhbS9EYXRhV29ya2VyIiksZj1hKCIuL3V0ZjgiKSxnPWEoIi4vY29tcHJlc3NlZE9iamVjdCIpLGg9YSgiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLGk9ZnVuY3Rpb24oYSxiLGMpe3RoaXMubmFtZT1hLHRoaXMuZGlyPWMuZGlyLHRoaXMuZGF0ZT1jLmRhdGUsdGhpcy5jb21tZW50PWMuY29tbWVudCx0aGlzLnVuaXhQZXJtaXNzaW9ucz1jLnVuaXhQZXJtaXNzaW9ucyx0aGlzLmRvc1Blcm1pc3Npb25zPWMuZG9zUGVybWlzc2lvbnMsdGhpcy5fZGF0YT1iLHRoaXMuX2RhdGFCaW5hcnk9Yy5iaW5hcnksdGhpcy5vcHRpb25zPXtjb21wcmVzc2lvbjpjLmNvbXByZXNzaW9uLGNvbXByZXNzaW9uT3B0aW9uczpjLmNvbXByZXNzaW9uT3B0aW9uc319O2kucHJvdG90eXBlPXtpbnRlcm5hbFN0cmVhbTpmdW5jdGlvbihhKXt2YXIgYj1hLnRvTG93ZXJDYXNlKCksYz0ic3RyaW5nIj09PWJ8fCJ0ZXh0Ij09PWI7ImJpbmFyeXN0cmluZyIhPT1iJiYidGV4dCIhPT1ifHwoYj0ic3RyaW5nIik7dmFyIGU9dGhpcy5fZGVjb21wcmVzc1dvcmtlcigpLGc9IXRoaXMuX2RhdGFCaW5hcnk7cmV0dXJuIGcmJiFjJiYoZT1lLnBpcGUobmV3IGYuVXRmOEVuY29kZVdvcmtlcikpLCFnJiZjJiYoZT1lLnBpcGUobmV3IGYuVXRmOERlY29kZVdvcmtlcikpLG5ldyBkKGUsYiwiIil9LGFzeW5jOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuaW50ZXJuYWxTdHJlYW0oYSkuYWNjdW11bGF0ZShiKX0sbm9kZVN0cmVhbTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmludGVybmFsU3RyZWFtKGF8fCJub2RlYnVmZmVyIikudG9Ob2RlanNTdHJlYW0oYil9LF9jb21wcmVzc1dvcmtlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXMuX2RhdGEgaW5zdGFuY2VvZiBnJiZ0aGlzLl9kYXRhLmNvbXByZXNzaW9uLm1hZ2ljPT09YS5tYWdpYylyZXR1cm4gdGhpcy5fZGF0YS5nZXRDb21wcmVzc2VkV29ya2VyKCk7dmFyIGM9dGhpcy5fZGVjb21wcmVzc1dvcmtlcigpO3JldHVybiB0aGlzLl9kYXRhQmluYXJ5fHwoYz1jLnBpcGUobmV3IGYuVXRmOEVuY29kZVdvcmtlcikpLGcuY3JlYXRlV29ya2VyRnJvbShjLGEsYil9LF9kZWNvbXByZXNzV29ya2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGEgaW5zdGFuY2VvZiBnP3RoaXMuX2RhdGEuZ2V0Q29udGVudFdvcmtlcigpOnRoaXMuX2RhdGEgaW5zdGFuY2VvZiBoP3RoaXMuX2RhdGE6bmV3IGUodGhpcy5fZGF0YSl9fTtmb3IodmFyIGo9WyJhc1RleHQiLCJhc0JpbmFyeSIsImFzTm9kZUJ1ZmZlciIsImFzVWludDhBcnJheSIsImFzQXJyYXlCdWZmZXIiXSxrPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLiIpfSxsPTA7bDxqLmxlbmd0aDtsKyspaS5wcm90b3R5cGVbaltsXV09aztiLmV4cG9ydHM9aX0seyIuL2NvbXByZXNzZWRPYmplY3QiOjIsIi4vc3RyZWFtL0RhdGFXb3JrZXIiOjI3LCIuL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi9zdHJlYW0vU3RyZWFtSGVscGVyIjoyOSwiLi91dGY4IjozMX1dLDM2OltmdW5jdGlvbihhLGIsYyl7YSgiLi4vbW9kdWxlcy93ZWIuaW1tZWRpYXRlIiksYi5leHBvcnRzPWEoIi4uL21vZHVsZXMvX2NvcmUiKS5zZXRJbW1lZGlhdGV9LHsiLi4vbW9kdWxlcy9fY29yZSI6NDAsIi4uL21vZHVsZXMvd2ViLmltbWVkaWF0ZSI6NTZ9XSwzNzpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz1mdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgYSl0aHJvdyBUeXBlRXJyb3IoYSsiIGlzIG5vdCBhIGZ1bmN0aW9uISIpO3JldHVybiBhfX0se31dLDM4OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi9faXMtb2JqZWN0Iik7Yi5leHBvcnRzPWZ1bmN0aW9uKGEpe2lmKCFkKGEpKXRocm93IFR5cGVFcnJvcihhKyIgaXMgbm90IGFuIG9iamVjdCEiKTtyZXR1cm4gYX19LHsiLi9faXMtb2JqZWN0Ijo1MX1dLDM5OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9e30udG9TdHJpbmc7Yi5leHBvcnRzPWZ1bmN0aW9uKGEpe3JldHVybiBkLmNhbGwoYSkuc2xpY2UoOCwtMSl9fSx7fV0sNDA6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1iLmV4cG9ydHM9e3ZlcnNpb246IjIuMy4wIn07Im51bWJlciI9PXR5cGVvZiBfX2UmJihfX2U9ZCl9LHt9XSw0MTpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4vX2EtZnVuY3Rpb24iKTtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiLGMpe2lmKGQoYSksdm9pZCAwPT09YilyZXR1cm4gYTtzd2l0Y2goYyl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbihjKXtyZXR1cm4gYS5jYWxsKGIsYyl9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24oYyxkKXtyZXR1cm4gYS5jYWxsKGIsYyxkKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihjLGQsZSl7cmV0dXJuIGEuY2FsbChiLGMsZCxlKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYixhcmd1bWVudHMpfX19LHsiLi9fYS1mdW5jdGlvbiI6Mzd9XSw0MjpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz0hYSgiLi9fZmFpbHMiKShmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LHsiLi9fZmFpbHMiOjQ1fV0sNDM6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1hKCIuL19pcy1vYmplY3QiKSxlPWEoIi4vX2dsb2JhbCIpLmRvY3VtZW50LGY9ZChlKSYmZChlLmNyZWF0ZUVsZW1lbnQpO2IuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4gZj9lLmNyZWF0ZUVsZW1lbnQoYSk6e319fSx7Ii4vX2dsb2JhbCI6NDYsIi4vX2lzLW9iamVjdCI6NTF9XSw0NDpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4vX2dsb2JhbCIpLGU9YSgiLi9fY29yZSIpLGY9YSgiLi9fY3R4IiksZz1hKCIuL19oaWRlIiksaD0icHJvdG90eXBlIixpPWZ1bmN0aW9uKGEsYixjKXt2YXIgaixrLGwsbT1hJmkuRixuPWEmaS5HLG89YSZpLlMscD1hJmkuUCxxPWEmaS5CLHI9YSZpLlcscz1uP2U6ZVtiXXx8KGVbYl09e30pLHQ9c1toXSx1PW4/ZDpvP2RbYl06KGRbYl18fHt9KVtoXTtuJiYoYz1iKTtmb3IoaiBpbiBjKWs9IW0mJnUmJnZvaWQgMCE9PXVbal0sayYmaiBpbiBzfHwobD1rP3Vbal06Y1tqXSxzW2pdPW4mJiJmdW5jdGlvbiIhPXR5cGVvZiB1W2pdP2Nbal06cSYmaz9mKGwsZCk6ciYmdVtqXT09bD9mdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbihiLGMsZCl7aWYodGhpcyBpbnN0YW5jZW9mIGEpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyBhO2Nhc2UgMTpyZXR1cm4gbmV3IGEoYik7Y2FzZSAyOnJldHVybiBuZXcgYShiLGMpfXJldHVybiBuZXcgYShiLGMsZCl9cmV0dXJuIGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtyZXR1cm4gYltoXT1hW2hdLGJ9KGwpOnAmJiJmdW5jdGlvbiI9PXR5cGVvZiBsP2YoRnVuY3Rpb24uY2FsbCxsKTpsLHAmJigocy52aXJ0dWFsfHwocy52aXJ0dWFsPXt9KSlbal09bCxhJmkuUiYmdCYmIXRbal0mJmcodCxqLGwpKSl9O2kuRj0xLGkuRz0yLGkuUz00LGkuUD04LGkuQj0xNixpLlc9MzIsaS5VPTY0LGkuUj0xMjgsYi5leHBvcnRzPWl9LHsiLi9fY29yZSI6NDAsIi4vX2N0eCI6NDEsIi4vX2dsb2JhbCI6NDYsIi4vX2hpZGUiOjQ3fV0sNDU6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSl7dHJ5e3JldHVybiEhYSgpfWNhdGNoKGIpe3JldHVybiEwfX19LHt9XSw0NjpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWIuZXhwb3J0cz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lk1hdGg9PU1hdGg/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5NYXRoPT1NYXRoP3NlbGY6RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTsibnVtYmVyIj09dHlwZW9mIF9fZyYmKF9fZz1kKX0se31dLDQ3OltmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSgiLi9fb2JqZWN0LWRwIiksZT1hKCIuL19wcm9wZXJ0eS1kZXNjIik7Yi5leHBvcnRzPWEoIi4vX2Rlc2NyaXB0b3JzIik/ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBkLmYoYSxiLGUoMSxjKSl9OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYVtiXT1jLGF9fSx7Ii4vX2Rlc2NyaXB0b3JzIjo0MiwiLi9fb2JqZWN0LWRwIjo1MiwiLi9fcHJvcGVydHktZGVzYyI6NTN9XSw0ODpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz1hKCIuL19nbG9iYWwiKS5kb2N1bWVudCYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fSx7Ii4vX2dsb2JhbCI6NDZ9XSw0OTpbZnVuY3Rpb24oYSxiLGMpe2IuZXhwb3J0cz0hYSgiLi9fZGVzY3JpcHRvcnMiKSYmIWEoIi4vX2ZhaWxzIikoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KGEoIi4vX2RvbS1jcmVhdGUiKSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LHsiLi9fZGVzY3JpcHRvcnMiOjQyLCIuL19kb20tY3JlYXRlIjo0MywiLi9fZmFpbHMiOjQ1fV0sNTA6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXZvaWQgMD09PWM7c3dpdGNoKGIubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIGQ/YSgpOmEuY2FsbChjKTtjYXNlIDE6cmV0dXJuIGQ/YShiWzBdKTphLmNhbGwoYyxiWzBdKTtjYXNlIDI6cmV0dXJuIGQ/YShiWzBdLGJbMV0pOmEuY2FsbChjLGJbMF0sYlsxXSk7Y2FzZSAzOnJldHVybiBkP2EoYlswXSxiWzFdLGJbMl0pOmEuY2FsbChjLGJbMF0sYlsxXSxiWzJdKTtjYXNlIDQ6cmV0dXJuIGQ/YShiWzBdLGJbMV0sYlsyXSxiWzNdKTphLmNhbGwoYyxiWzBdLGJbMV0sYlsyXSxiWzNdKX1yZXR1cm4gYS5hcHBseShjLGIpfX0se31dLDUxOltmdW5jdGlvbihhLGIsYyl7Yi5leHBvcnRzPWZ1bmN0aW9uKGEpe3JldHVybiJvYmplY3QiPT10eXBlb2YgYT9udWxsIT09YToiZnVuY3Rpb24iPT10eXBlb2YgYX19LHt9XSw1MjpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4vX2FuLW9iamVjdCIpLGU9YSgiLi9faWU4LWRvbS1kZWZpbmUiKSxmPWEoIi4vX3RvLXByaW1pdGl2ZSIpLGc9T2JqZWN0LmRlZmluZVByb3BlcnR5O2MuZj1hKCIuL19kZXNjcmlwdG9ycyIpP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7aWYoZChhKSxiPWYoYiwhMCksZChjKSxlKXRyeXtyZXR1cm4gZyhhLGIsYyl9Y2F0Y2goaCl7fWlmKCJnZXQiaW4gY3x8InNldCJpbiBjKXRocm93IFR5cGVFcnJvcigiQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhIik7cmV0dXJuInZhbHVlImluIGMmJihhW2JdPWMudmFsdWUpLGF9fSx7Ii4vX2FuLW9iamVjdCI6MzgsIi4vX2Rlc2NyaXB0b3JzIjo0MiwiLi9faWU4LWRvbS1kZWZpbmUiOjQ5LCIuL190by1wcmltaXRpdmUiOjU1fV0sNTM6W2Z1bmN0aW9uKGEsYixjKXtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXtyZXR1cm57ZW51bWVyYWJsZTohKDEmYSksY29uZmlndXJhYmxlOiEoMiZhKSx3cml0YWJsZTohKDQmYSksdmFsdWU6Yn19fSx7fV0sNTQ6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZz1hKCIuL19jdHgiKSxoPWEoIi4vX2ludm9rZSIpLGk9YSgiLi9faHRtbCIpLGo9YSgiLi9fZG9tLWNyZWF0ZSIpLGs9YSgiLi9fZ2xvYmFsIiksbD1rLnByb2Nlc3MsbT1rLnNldEltbWVkaWF0ZSxuPWsuY2xlYXJJbW1lZGlhdGUsbz1rLk1lc3NhZ2VDaGFubmVsLHA9MCxxPXt9LHI9Im9ucmVhZHlzdGF0ZWNoYW5nZSIscz1mdW5jdGlvbigpe3ZhciBhPSt0aGlzO2lmKHEuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBiPXFbYV07ZGVsZXRlIHFbYV0sYigpfX0sdD1mdW5jdGlvbihhKXtzLmNhbGwoYS5kYXRhKX07bSYmbnx8KG09ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MTthcmd1bWVudHMubGVuZ3RoPmM7KWIucHVzaChhcmd1bWVudHNbYysrXSk7cmV0dXJuIHFbKytwXT1mdW5jdGlvbigpe2goImZ1bmN0aW9uIj09dHlwZW9mIGE/YTpGdW5jdGlvbihhKSxiKX0sZChwKSxwfSxuPWZ1bmN0aW9uKGEpe2RlbGV0ZSBxW2FdfSwicHJvY2VzcyI9PWEoIi4vX2NvZiIpKGwpP2Q9ZnVuY3Rpb24oYSl7bC5uZXh0VGljayhnKHMsYSwxKSl9Om8/KGU9bmV3IG8sZj1lLnBvcnQyLGUucG9ydDEub25tZXNzYWdlPXQsZD1nKGYucG9zdE1lc3NhZ2UsZiwxKSk6ay5hZGRFdmVudExpc3RlbmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgcG9zdE1lc3NhZ2UmJiFrLmltcG9ydFNjcmlwdHM/KGQ9ZnVuY3Rpb24oYSl7ay5wb3N0TWVzc2FnZShhKyIiLCIqIil9LGsuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdCwhMSkpOmQ9ciBpbiBqKCJzY3JpcHQiKT9mdW5jdGlvbihhKXtpLmFwcGVuZENoaWxkKGooInNjcmlwdCIpKVtyXT1mdW5jdGlvbigpe2kucmVtb3ZlQ2hpbGQodGhpcykscy5jYWxsKGEpfX06ZnVuY3Rpb24oYSl7c2V0VGltZW91dChnKHMsYSwxKSwwKX0pLGIuZXhwb3J0cz17c2V0Om0sY2xlYXI6bn19LHsiLi9fY29mIjozOSwiLi9fY3R4Ijo0MSwiLi9fZG9tLWNyZWF0ZSI6NDMsIi4vX2dsb2JhbCI6NDYsIi4vX2h0bWwiOjQ4LCIuL19pbnZva2UiOjUwfV0sNTU6W2Z1bmN0aW9uKGEsYixjKXt2YXIgZD1hKCIuL19pcy1vYmplY3QiKTtiLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXtpZighZChhKSlyZXR1cm4gYTt2YXIgYyxlO2lmKGImJiJmdW5jdGlvbiI9PXR5cGVvZihjPWEudG9TdHJpbmcpJiYhZChlPWMuY2FsbChhKSkpcmV0dXJuIGU7aWYoImZ1bmN0aW9uIj09dHlwZW9mKGM9YS52YWx1ZU9mKSYmIWQoZT1jLmNhbGwoYSkpKXJldHVybiBlO2lmKCFiJiYiZnVuY3Rpb24iPT10eXBlb2YoYz1hLnRvU3RyaW5nKSYmIWQoZT1jLmNhbGwoYSkpKXJldHVybiBlO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSx7Ii4vX2lzLW9iamVjdCI6NTF9XSw1NjpbZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEoIi4vX2V4cG9ydCIpLGU9YSgiLi9fdGFzayIpO2QoZC5HK2QuQix7c2V0SW1tZWRpYXRlOmUuc2V0LGNsZWFySW1tZWRpYXRlOmUuY2xlYXJ9KX0seyIuL19leHBvcnQiOjQ0LCIuL190YXNrIjo1NH1dLDU3OltmdW5jdGlvbihhLGIsYyl7KGZ1bmN0aW9uKGEpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBjKCl7az0hMDtmb3IodmFyIGEsYixjPWwubGVuZ3RoO2M7KXtmb3IoYj1sLGw9W10sYT0tMTsrK2E8YzspYlthXSgpO2M9bC5sZW5ndGh9az0hMX1mdW5jdGlvbiBkKGEpezEhPT1sLnB1c2goYSl8fGt8fGUoKX12YXIgZSxmPWEuTXV0YXRpb25PYnNlcnZlcnx8YS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO2lmKGYpe3ZhciBnPTAsaD1uZXcgZihjKSxpPWEuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO2gub2JzZXJ2ZShpLHtjaGFyYWN0ZXJEYXRhOiEwfSksZT1mdW5jdGlvbigpe2kuZGF0YT1nPSsrZyUyfX1lbHNlIGlmKGEuc2V0SW1tZWRpYXRlfHwidW5kZWZpbmVkIj09dHlwZW9mIGEuTWVzc2FnZUNoYW5uZWwpZT0iZG9jdW1lbnQiaW4gYSYmIm9ucmVhZHlzdGF0ZWNoYW5nZSJpbiBhLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpP2Z1bmN0aW9uKCl7dmFyIGI9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtiLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2MoKSxiLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGx9LGEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGIpfTpmdW5jdGlvbigpe3NldFRpbWVvdXQoYywwKX07ZWxzZXt2YXIgaj1uZXcgYS5NZXNzYWdlQ2hhbm5lbDtqLnBvcnQxLm9ubWVzc2FnZT1jLGU9ZnVuY3Rpb24oKXtqLnBvcnQyLnBvc3RNZXNzYWdlKDApfX12YXIgayxsPVtdO2IuZXhwb3J0cz1kfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7fV0sNTg6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZCgpe31mdW5jdGlvbiBlKGEpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoInJlc29sdmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO3RoaXMuc3RhdGU9cyx0aGlzLnF1ZXVlPVtdLHRoaXMub3V0Y29tZT12b2lkIDAsYSE9PWQmJmkodGhpcyxhKX1mdW5jdGlvbiBmKGEsYixjKXt0aGlzLnByb21pc2U9YSwiZnVuY3Rpb24iPT10eXBlb2YgYiYmKHRoaXMub25GdWxmaWxsZWQ9Yix0aGlzLmNhbGxGdWxmaWxsZWQ9dGhpcy5vdGhlckNhbGxGdWxmaWxsZWQpLCJmdW5jdGlvbiI9PXR5cGVvZiBjJiYodGhpcy5vblJlamVjdGVkPWMsdGhpcy5jYWxsUmVqZWN0ZWQ9dGhpcy5vdGhlckNhbGxSZWplY3RlZCl9ZnVuY3Rpb24gZyhhLGIsYyl7byhmdW5jdGlvbigpe3ZhciBkO3RyeXtkPWIoYyl9Y2F0Y2goZSl7cmV0dXJuIHAucmVqZWN0KGEsZSl9ZD09PWE/cC5yZWplY3QoYSxuZXcgVHlwZUVycm9yKCJDYW5ub3QgcmVzb2x2ZSBwcm9taXNlIHdpdGggaXRzZWxmIikpOnAucmVzb2x2ZShhLGQpfSl9ZnVuY3Rpb24gaChhKXt2YXIgYj1hJiZhLnRoZW47aWYoYSYmKCJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGEpJiYiZnVuY3Rpb24iPT10eXBlb2YgYilyZXR1cm4gZnVuY3Rpb24oKXtiLmFwcGx5KGEsYXJndW1lbnRzKX19ZnVuY3Rpb24gaShhLGIpe2Z1bmN0aW9uIGMoYil7Znx8KGY9ITAscC5yZWplY3QoYSxiKSl9ZnVuY3Rpb24gZChiKXtmfHwoZj0hMCxwLnJlc29sdmUoYSxiKSl9ZnVuY3Rpb24gZSgpe2IoZCxjKX12YXIgZj0hMSxnPWooZSk7ImVycm9yIj09PWcuc3RhdHVzJiZjKGcudmFsdWUpfWZ1bmN0aW9uIGooYSxiKXt2YXIgYz17fTt0cnl7Yy52YWx1ZT1hKGIpLGMuc3RhdHVzPSJzdWNjZXNzIn1jYXRjaChkKXtjLnN0YXR1cz0iZXJyb3IiLGMudmFsdWU9ZH1yZXR1cm4gY31mdW5jdGlvbiBrKGEpe3JldHVybiBhIGluc3RhbmNlb2YgdGhpcz9hOnAucmVzb2x2ZShuZXcgdGhpcyhkKSxhKX1mdW5jdGlvbiBsKGEpe3ZhciBiPW5ldyB0aGlzKGQpO3JldHVybiBwLnJlamVjdChiLGEpfWZ1bmN0aW9uIG0oYSl7ZnVuY3Rpb24gYihhLGIpe2Z1bmN0aW9uIGQoYSl7Z1tiXT1hLCsraCE9PWV8fGZ8fChmPSEwLHAucmVzb2x2ZShqLGcpKX1jLnJlc29sdmUoYSkudGhlbihkLGZ1bmN0aW9uKGEpe2Z8fChmPSEwLHAucmVqZWN0KGosYSkpfSl9dmFyIGM9dGhpcztpZigiW29iamVjdCBBcnJheV0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpKXJldHVybiB0aGlzLnJlamVjdChuZXcgVHlwZUVycm9yKCJtdXN0IGJlIGFuIGFycmF5IikpO3ZhciBlPWEubGVuZ3RoLGY9ITE7aWYoIWUpcmV0dXJuIHRoaXMucmVzb2x2ZShbXSk7Zm9yKHZhciBnPW5ldyBBcnJheShlKSxoPTAsaT0tMSxqPW5ldyB0aGlzKGQpOysraTxlOyliKGFbaV0saSk7cmV0dXJuIGp9ZnVuY3Rpb24gbihhKXtmdW5jdGlvbiBiKGEpe2MucmVzb2x2ZShhKS50aGVuKGZ1bmN0aW9uKGEpe2Z8fChmPSEwLHAucmVzb2x2ZShoLGEpKX0sZnVuY3Rpb24oYSl7Znx8KGY9ITAscC5yZWplY3QoaCxhKSl9KX12YXIgYz10aGlzO2lmKCJbb2JqZWN0IEFycmF5XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkpcmV0dXJuIHRoaXMucmVqZWN0KG5ldyBUeXBlRXJyb3IoIm11c3QgYmUgYW4gYXJyYXkiKSk7dmFyIGU9YS5sZW5ndGgsZj0hMTtpZighZSlyZXR1cm4gdGhpcy5yZXNvbHZlKFtdKTtmb3IodmFyIGc9LTEsaD1uZXcgdGhpcyhkKTsrK2c8ZTspYihhW2ddKTtyZXR1cm4gaH12YXIgbz1hKCJpbW1lZGlhdGUiKSxwPXt9LHE9WyJSRUpFQ1RFRCJdLHI9WyJGVUxGSUxMRUQiXSxzPVsiUEVORElORyJdO2IuZXhwb3J0cz1lLGUucHJvdG90eXBlWyJjYXRjaCJdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRoZW4obnVsbCxhKX0sZS5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihhLGIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBhJiZ0aGlzLnN0YXRlPT09cnx8ImZ1bmN0aW9uIiE9dHlwZW9mIGImJnRoaXMuc3RhdGU9PT1xKXJldHVybiB0aGlzO3ZhciBjPW5ldyB0aGlzLmNvbnN0cnVjdG9yKGQpO2lmKHRoaXMuc3RhdGUhPT1zKXt2YXIgZT10aGlzLnN0YXRlPT09cj9hOmI7ZyhjLGUsdGhpcy5vdXRjb21lKX1lbHNlIHRoaXMucXVldWUucHVzaChuZXcgZihjLGEsYikpO3JldHVybiBjfSxmLnByb3RvdHlwZS5jYWxsRnVsZmlsbGVkPWZ1bmN0aW9uKGEpe3AucmVzb2x2ZSh0aGlzLnByb21pc2UsYSl9LGYucHJvdG90eXBlLm90aGVyQ2FsbEZ1bGZpbGxlZD1mdW5jdGlvbihhKXtnKHRoaXMucHJvbWlzZSx0aGlzLm9uRnVsZmlsbGVkLGEpfSxmLnByb3RvdHlwZS5jYWxsUmVqZWN0ZWQ9ZnVuY3Rpb24oYSl7cC5yZWplY3QodGhpcy5wcm9taXNlLGEpfSxmLnByb3RvdHlwZS5vdGhlckNhbGxSZWplY3RlZD1mdW5jdGlvbihhKXtnKHRoaXMucHJvbWlzZSx0aGlzLm9uUmVqZWN0ZWQsYSl9LHAucmVzb2x2ZT1mdW5jdGlvbihhLGIpe3ZhciBjPWooaCxiKTtpZigiZXJyb3IiPT09Yy5zdGF0dXMpcmV0dXJuIHAucmVqZWN0KGEsYy52YWx1ZSk7dmFyIGQ9Yy52YWx1ZTtpZihkKWkoYSxkKTtlbHNle2Euc3RhdGU9cixhLm91dGNvbWU9Yjtmb3IodmFyIGU9LTEsZj1hLnF1ZXVlLmxlbmd0aDsrK2U8ZjspYS5xdWV1ZVtlXS5jYWxsRnVsZmlsbGVkKGIpfXJldHVybiBhfSxwLnJlamVjdD1mdW5jdGlvbihhLGIpe2Euc3RhdGU9cSxhLm91dGNvbWU9Yjtmb3IodmFyIGM9LTEsZD1hLnF1ZXVlLmxlbmd0aDsrK2M8ZDspYS5xdWV1ZVtjXS5jYWxsUmVqZWN0ZWQoYik7cmV0dXJuIGF9LGUucmVzb2x2ZT1rLGUucmVqZWN0PWwsZS5hbGw9bSxlLnJhY2U9bn0se2ltbWVkaWF0ZTo1N31dLDU5OltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4vbGliL3V0aWxzL2NvbW1vbiIpLmFzc2lnbixlPWEoIi4vbGliL2RlZmxhdGUiKSxmPWEoIi4vbGliL2luZmxhdGUiKSxnPWEoIi4vbGliL3psaWIvY29uc3RhbnRzIiksaD17fTtkKGgsZSxmLGcpLGIuZXhwb3J0cz1ofSx7Ii4vbGliL2RlZmxhdGUiOjYwLCIuL2xpYi9pbmZsYXRlIjo2MSwiLi9saWIvdXRpbHMvY29tbW9uIjo2MiwiLi9saWIvemxpYi9jb25zdGFudHMiOjY1fV0sNjA6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhKXtpZighKHRoaXMgaW5zdGFuY2VvZiBkKSlyZXR1cm4gbmV3IGQoYSk7dGhpcy5vcHRpb25zPWkuYXNzaWduKHtsZXZlbDpzLG1ldGhvZDp1LGNodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjE1LG1lbUxldmVsOjgsc3RyYXRlZ3k6dCx0bzoiIn0sYXx8e30pO3ZhciBiPXRoaXMub3B0aW9ucztiLnJhdyYmYi53aW5kb3dCaXRzPjA/Yi53aW5kb3dCaXRzPS1iLndpbmRvd0JpdHM6Yi5nemlwJiZiLndpbmRvd0JpdHM+MCYmYi53aW5kb3dCaXRzPDE2JiYoYi53aW5kb3dCaXRzKz0xNiksdGhpcy5lcnI9MCx0aGlzLm1zZz0iIix0aGlzLmVuZGVkPSExLHRoaXMuY2h1bmtzPVtdLHRoaXMuc3RybT1uZXcgbCx0aGlzLnN0cm0uYXZhaWxfb3V0PTA7dmFyIGM9aC5kZWZsYXRlSW5pdDIodGhpcy5zdHJtLGIubGV2ZWwsYi5tZXRob2QsYi53aW5kb3dCaXRzLGIubWVtTGV2ZWwsYi5zdHJhdGVneSk7aWYoYyE9PXApdGhyb3cgbmV3IEVycm9yKGtbY10pO2lmKGIuaGVhZGVyJiZoLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLGIuaGVhZGVyKSxiLmRpY3Rpb25hcnkpe3ZhciBlO2lmKGU9InN0cmluZyI9PXR5cGVvZiBiLmRpY3Rpb25hcnk/ai5zdHJpbmcyYnVmKGIuZGljdGlvbmFyeSk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PW0uY2FsbChiLmRpY3Rpb25hcnkpP25ldyBVaW50OEFycmF5KGIuZGljdGlvbmFyeSk6Yi5kaWN0aW9uYXJ5LGM9aC5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sZSksYyE9PXApdGhyb3cgbmV3IEVycm9yKGtbY10pO3RoaXMuX2RpY3Rfc2V0PSEwfX1mdW5jdGlvbiBlKGEsYil7dmFyIGM9bmV3IGQoYik7aWYoYy5wdXNoKGEsITApLGMuZXJyKXRocm93IGMubXNnfHxrW2MuZXJyXTtyZXR1cm4gYy5yZXN1bHR9ZnVuY3Rpb24gZihhLGIpe3JldHVybiBiPWJ8fHt9LGIucmF3PSEwLGUoYSxiKX1mdW5jdGlvbiBnKGEsYil7cmV0dXJuIGI9Ynx8e30sYi5nemlwPSEwLGUoYSxiKX12YXIgaD1hKCIuL3psaWIvZGVmbGF0ZSIpLGk9YSgiLi91dGlscy9jb21tb24iKSxqPWEoIi4vdXRpbHMvc3RyaW5ncyIpLGs9YSgiLi96bGliL21lc3NhZ2VzIiksbD1hKCIuL3psaWIvenN0cmVhbSIpLG09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxuPTAsbz00LHA9MCxxPTEscj0yLHM9LTEsdD0wLHU9ODtkLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPXRoaXMuc3RybSxmPXRoaXMub3B0aW9ucy5jaHVua1NpemU7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtkPWI9PT1+fmI/YjpiPT09ITA/bzpuLCJzdHJpbmciPT10eXBlb2YgYT9lLmlucHV0PWouc3RyaW5nMmJ1ZihhKToiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09bS5jYWxsKGEpP2UuaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoYSk6ZS5pbnB1dD1hLGUubmV4dF9pbj0wLGUuYXZhaWxfaW49ZS5pbnB1dC5sZW5ndGg7ZG97aWYoMD09PWUuYXZhaWxfb3V0JiYoZS5vdXRwdXQ9bmV3IGkuQnVmOChmKSxlLm5leHRfb3V0PTAsZS5hdmFpbF9vdXQ9ZiksYz1oLmRlZmxhdGUoZSxkKSxjIT09cSYmYyE9PXApcmV0dXJuIHRoaXMub25FbmQoYyksdGhpcy5lbmRlZD0hMCwhMTswIT09ZS5hdmFpbF9vdXQmJigwIT09ZS5hdmFpbF9pbnx8ZCE9PW8mJmQhPT1yKXx8KCJzdHJpbmciPT09dGhpcy5vcHRpb25zLnRvP3RoaXMub25EYXRhKGouYnVmMmJpbnN0cmluZyhpLnNocmlua0J1ZihlLm91dHB1dCxlLm5leHRfb3V0KSkpOnRoaXMub25EYXRhKGkuc2hyaW5rQnVmKGUub3V0cHV0LGUubmV4dF9vdXQpKSl9d2hpbGUoKGUuYXZhaWxfaW4+MHx8MD09PWUuYXZhaWxfb3V0KSYmYyE9PXEpO3JldHVybiBkPT09bz8oYz1oLmRlZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKGMpLHRoaXMuZW5kZWQ9ITAsYz09PXApOmQhPT1yfHwodGhpcy5vbkVuZChwKSxlLmF2YWlsX291dD0wLCEwKX0sZC5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKGEpe3RoaXMuY2h1bmtzLnB1c2goYSl9LGQucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKGEpe2E9PT1wJiYoInN0cmluZyI9PT10aGlzLm9wdGlvbnMudG8/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9aS5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9YSx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfSxjLkRlZmxhdGU9ZCxjLmRlZmxhdGU9ZSxjLmRlZmxhdGVSYXc9ZixjLmd6aXA9Z30seyIuL3V0aWxzL2NvbW1vbiI6NjIsIi4vdXRpbHMvc3RyaW5ncyI6NjMsIi4vemxpYi9kZWZsYXRlIjo2NywiLi96bGliL21lc3NhZ2VzIjo3MiwiLi96bGliL3pzdHJlYW0iOjc0fV0sNjE6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhKXtpZighKHRoaXMgaW5zdGFuY2VvZiBkKSlyZXR1cm4gbmV3IGQoYSk7dGhpcy5vcHRpb25zPWguYXNzaWduKHtjaHVua1NpemU6MTYzODQsd2luZG93Qml0czowLHRvOiIifSxhfHx7fSk7dmFyIGI9dGhpcy5vcHRpb25zO2IucmF3JiZiLndpbmRvd0JpdHM+PTAmJmIud2luZG93Qml0czwxNiYmKGIud2luZG93Qml0cz0tYi53aW5kb3dCaXRzLDA9PT1iLndpbmRvd0JpdHMmJihiLndpbmRvd0JpdHM9LTE1KSksIShiLndpbmRvd0JpdHM+PTAmJmIud2luZG93Qml0czwxNil8fGEmJmEud2luZG93Qml0c3x8KGIud2luZG93Qml0cys9MzIpLGIud2luZG93Qml0cz4xNSYmYi53aW5kb3dCaXRzPDQ4JiYwPT09KDE1JmIud2luZG93Qml0cykmJihiLndpbmRvd0JpdHN8PTE1KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyBsLHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgYz1nLmluZmxhdGVJbml0Mih0aGlzLnN0cm0sYi53aW5kb3dCaXRzKTtpZihjIT09ai5aX09LKXRocm93IG5ldyBFcnJvcihrW2NdKTt0aGlzLmhlYWRlcj1uZXcgbSxnLmluZmxhdGVHZXRIZWFkZXIodGhpcy5zdHJtLHRoaXMuaGVhZGVyKX1mdW5jdGlvbiBlKGEsYil7dmFyIGM9bmV3IGQoYik7aWYoYy5wdXNoKGEsITApLGMuZXJyKXRocm93IGMubXNnfHxrW2MuZXJyXTtyZXR1cm4gYy5yZXN1bHR9ZnVuY3Rpb24gZihhLGIpe3JldHVybiBiPWJ8fHt9LGIucmF3PSEwLGUoYSxiKX12YXIgZz1hKCIuL3psaWIvaW5mbGF0ZSIpLGg9YSgiLi91dGlscy9jb21tb24iKSxpPWEoIi4vdXRpbHMvc3RyaW5ncyIpLGo9YSgiLi96bGliL2NvbnN0YW50cyIpLGs9YSgiLi96bGliL21lc3NhZ2VzIiksbD1hKCIuL3psaWIvenN0cmVhbSIpLG09YSgiLi96bGliL2d6aGVhZGVyIiksbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2QucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixrLGwsbT10aGlzLnN0cm0sbz10aGlzLm9wdGlvbnMuY2h1bmtTaXplLHA9dGhpcy5vcHRpb25zLmRpY3Rpb25hcnkscT0hMTtpZih0aGlzLmVuZGVkKXJldHVybiExO2Q9Yj09PX5+Yj9iOmI9PT0hMD9qLlpfRklOSVNIOmouWl9OT19GTFVTSCwic3RyaW5nIj09dHlwZW9mIGE/bS5pbnB1dD1pLmJpbnN0cmluZzJidWYoYSk6IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PW4uY2FsbChhKT9tLmlucHV0PW5ldyBVaW50OEFycmF5KGEpOm0uaW5wdXQ9YSxtLm5leHRfaW49MCxtLmF2YWlsX2luPW0uaW5wdXQubGVuZ3RoO2Rve2lmKDA9PT1tLmF2YWlsX291dCYmKG0ub3V0cHV0PW5ldyBoLkJ1ZjgobyksbS5uZXh0X291dD0wLG0uYXZhaWxfb3V0PW8pLGM9Zy5pbmZsYXRlKG0sai5aX05PX0ZMVVNIKSxjPT09ai5aX05FRURfRElDVCYmcCYmKGw9InN0cmluZyI9PXR5cGVvZiBwP2kuc3RyaW5nMmJ1ZihwKToiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09bi5jYWxsKHApP25ldyBVaW50OEFycmF5KHApOnAsYz1nLmluZmxhdGVTZXREaWN0aW9uYXJ5KHRoaXMuc3RybSxsKSksYz09PWouWl9CVUZfRVJST1ImJnE9PT0hMCYmKGM9ai5aX09LLHE9ITEpLGMhPT1qLlpfU1RSRUFNX0VORCYmYyE9PWouWl9PSylyZXR1cm4gdGhpcy5vbkVuZChjKSx0aGlzLmVuZGVkPSEwLCExO20ubmV4dF9vdXQmJigwIT09bS5hdmFpbF9vdXQmJmMhPT1qLlpfU1RSRUFNX0VORCYmKDAhPT1tLmF2YWlsX2lufHxkIT09ai5aX0ZJTklTSCYmZCE9PWouWl9TWU5DX0ZMVVNIKXx8KCJzdHJpbmciPT09dGhpcy5vcHRpb25zLnRvPyhlPWkudXRmOGJvcmRlcihtLm91dHB1dCxtLm5leHRfb3V0KSxmPW0ubmV4dF9vdXQtZSxrPWkuYnVmMnN0cmluZyhtLm91dHB1dCxlKSxtLm5leHRfb3V0PWYsbS5hdmFpbF9vdXQ9by1mLGYmJmguYXJyYXlTZXQobS5vdXRwdXQsbS5vdXRwdXQsZSxmLDApLHRoaXMub25EYXRhKGspKTp0aGlzLm9uRGF0YShoLnNocmlua0J1ZihtLm91dHB1dCxtLm5leHRfb3V0KSkpKSwwPT09bS5hdmFpbF9pbiYmMD09PW0uYXZhaWxfb3V0JiYocT0hMCl9d2hpbGUoKG0uYXZhaWxfaW4+MHx8MD09PW0uYXZhaWxfb3V0KSYmYyE9PWouWl9TVFJFQU1fRU5EKTtyZXR1cm4gYz09PWouWl9TVFJFQU1fRU5EJiYoZD1qLlpfRklOSVNIKSxkPT09ai5aX0ZJTklTSD8oYz1nLmluZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKGMpLHRoaXMuZW5kZWQ9ITAsYz09PWouWl9PSyk6ZCE9PWouWl9TWU5DX0ZMVVNIfHwodGhpcy5vbkVuZChqLlpfT0spLG0uYXZhaWxfb3V0PTAsITApfSxkLnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oYSl7dGhpcy5jaHVua3MucHVzaChhKX0sZC5wcm90b3R5cGUub25FbmQ9ZnVuY3Rpb24oYSl7YT09PWouWl9PSyYmKCJzdHJpbmciPT09dGhpcy5vcHRpb25zLnRvP3RoaXMucmVzdWx0PXRoaXMuY2h1bmtzLmpvaW4oIiIpOnRoaXMucmVzdWx0PWguZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcykpLHRoaXMuY2h1bmtzPVtdLHRoaXMuZXJyPWEsdGhpcy5tc2c9dGhpcy5zdHJtLm1zZ30sYy5JbmZsYXRlPWQsYy5pbmZsYXRlPWUsYy5pbmZsYXRlUmF3PWYsYy51bmd6aXA9ZX0seyIuL3V0aWxzL2NvbW1vbiI6NjIsIi4vdXRpbHMvc3RyaW5ncyI6NjMsIi4vemxpYi9jb25zdGFudHMiOjY1LCIuL3psaWIvZ3poZWFkZXIiOjY4LCIuL3psaWIvaW5mbGF0ZSI6NzAsIi4vemxpYi9tZXNzYWdlcyI6NzIsIi4vemxpYi96c3RyZWFtIjo3NH1dLDYyOltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBVaW50MTZBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBJbnQzMkFycmF5O2MuYXNzaWduPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7Yi5sZW5ndGg7KXt2YXIgYz1iLnNoaWZ0KCk7aWYoYyl7aWYoIm9iamVjdCIhPXR5cGVvZiBjKXRocm93IG5ldyBUeXBlRXJyb3IoYysibXVzdCBiZSBub24tb2JqZWN0Iik7Zm9yKHZhciBkIGluIGMpYy5oYXNPd25Qcm9wZXJ0eShkKSYmKGFbZF09Y1tkXSl9fXJldHVybiBhfSxjLnNocmlua0J1Zj1mdW5jdGlvbihhLGIpe3JldHVybiBhLmxlbmd0aD09PWI/YTphLnN1YmFycmF5P2Euc3ViYXJyYXkoMCxiKTooYS5sZW5ndGg9YixhKX07dmFyIGU9e2FycmF5U2V0OmZ1bmN0aW9uKGEsYixjLGQsZSl7aWYoYi5zdWJhcnJheSYmYS5zdWJhcnJheSlyZXR1cm4gdm9pZCBhLnNldChiLnN1YmFycmF5KGMsYytkKSxlKTtmb3IodmFyIGY9MDtmPGQ7ZisrKWFbZStmXT1iW2MrZl19LGZsYXR0ZW5DaHVua3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnO2ZvcihkPTAsYj0wLGM9YS5sZW5ndGg7YjxjO2IrKylkKz1hW2JdLmxlbmd0aDtmb3IoZz1uZXcgVWludDhBcnJheShkKSxlPTAsYj0wLGM9YS5sZW5ndGg7YjxjO2IrKylmPWFbYl0sZy5zZXQoZixlKSxlKz1mLmxlbmd0aDtyZXR1cm4gZ319LGY9e2FycmF5U2V0OmZ1bmN0aW9uKGEsYixjLGQsZSl7Zm9yKHZhciBmPTA7ZjxkO2YrKylhW2UrZl09YltjK2ZdfSxmbGF0dGVuQ2h1bmtzOmZ1bmN0aW9uKGEpe3JldHVybltdLmNvbmNhdC5hcHBseShbXSxhKX19O2Muc2V0VHlwZWQ9ZnVuY3Rpb24oYSl7YT8oYy5CdWY4PVVpbnQ4QXJyYXksYy5CdWYxNj1VaW50MTZBcnJheSxjLkJ1ZjMyPUludDMyQXJyYXksYy5hc3NpZ24oYyxlKSk6KGMuQnVmOD1BcnJheSxjLkJ1ZjE2PUFycmF5LGMuQnVmMzI9QXJyYXksYy5hc3NpZ24oYyxmKSl9LGMuc2V0VHlwZWQoZCl9LHt9XSw2MzpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEsYil7aWYoYjw2NTUzNyYmKGEuc3ViYXJyYXkmJmd8fCFhLnN1YmFycmF5JiZmKSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGUuc2hyaW5rQnVmKGEsYikpO2Zvcih2YXIgYz0iIixkPTA7ZDxiO2QrKyljKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGFbZF0pO3JldHVybiBjfXZhciBlPWEoIi4vY29tbW9uIiksZj0hMCxnPSEwO3RyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsWzBdKX1jYXRjaChoKXtmPSExfXRyeXtTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkoMSkpfWNhdGNoKGgpe2c9ITF9Zm9yKHZhciBpPW5ldyBlLkJ1ZjgoMjU2KSxqPTA7ajwyNTY7aisrKWlbal09aj49MjUyPzY6aj49MjQ4PzU6aj49MjQwPzQ6aj49MjI0PzM6aj49MTkyPzI6MTtpWzI1NF09aVsyNTRdPTEsYy5zdHJpbmcyYnVmPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxmLGcsaD1hLmxlbmd0aCxpPTA7Zm9yKGY9MDtmPGg7ZisrKWM9YS5jaGFyQ29kZUF0KGYpLDU1Mjk2PT09KDY0NTEyJmMpJiZmKzE8aCYmKGQ9YS5jaGFyQ29kZUF0KGYrMSksNTYzMjA9PT0oNjQ1MTImZCkmJihjPTY1NTM2KyhjLTU1Mjk2PDwxMCkrKGQtNTYzMjApLGYrKykpLGkrPWM8MTI4PzE6YzwyMDQ4PzI6Yzw2NTUzNj8zOjQ7Zm9yKGI9bmV3IGUuQnVmOChpKSxnPTAsZj0wO2c8aTtmKyspYz1hLmNoYXJDb2RlQXQoZiksNTUyOTY9PT0oNjQ1MTImYykmJmYrMTxoJiYoZD1hLmNoYXJDb2RlQXQoZisxKSw1NjMyMD09PSg2NDUxMiZkKSYmKGM9NjU1MzYrKGMtNTUyOTY8PDEwKSsoZC01NjMyMCksZisrKSksYzwxMjg/YltnKytdPWM6YzwyMDQ4PyhiW2crK109MTkyfGM+Pj42LGJbZysrXT0xMjh8NjMmYyk6Yzw2NTUzNj8oYltnKytdPTIyNHxjPj4+MTIsYltnKytdPTEyOHxjPj4+NiY2MyxiW2crK109MTI4fDYzJmMpOihiW2crK109MjQwfGM+Pj4xOCxiW2crK109MTI4fGM+Pj4xMiY2MyxiW2crK109MTI4fGM+Pj42JjYzLGJbZysrXT0xMjh8NjMmYyk7cmV0dXJuIGJ9LGMuYnVmMmJpbnN0cmluZz1mdW5jdGlvbihhKXtyZXR1cm4gZChhLGEubGVuZ3RoKX0sYy5iaW5zdHJpbmcyYnVmPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1uZXcgZS5CdWY4KGEubGVuZ3RoKSxjPTAsZD1iLmxlbmd0aDtjPGQ7YysrKWJbY109YS5jaGFyQ29kZUF0KGMpO3JldHVybiBifSxjLmJ1ZjJzdHJpbmc9ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoPWJ8fGEubGVuZ3RoLGo9bmV3IEFycmF5KDIqaCk7Zm9yKGU9MCxjPTA7YzxoOylpZihmPWFbYysrXSxmPDEyOClqW2UrK109ZjtlbHNlIGlmKGc9aVtmXSxnPjQpaltlKytdPTY1NTMzLGMrPWctMTtlbHNle2ZvcihmJj0yPT09Zz8zMTozPT09Zz8xNTo3O2c+MSYmYzxoOylmPWY8PDZ8NjMmYVtjKytdLGctLTtnPjE/altlKytdPTY1NTMzOmY8NjU1MzY/altlKytdPWY6KGYtPTY1NTM2LGpbZSsrXT01NTI5NnxmPj4xMCYxMDIzLGpbZSsrXT01NjMyMHwxMDIzJmYpfXJldHVybiBkKGosZSl9LGMudXRmOGJvcmRlcj1mdW5jdGlvbihhLGIpe3ZhciBjO2ZvcihiPWJ8fGEubGVuZ3RoLGI+YS5sZW5ndGgmJihiPWEubGVuZ3RoKSxjPWItMTtjPj0wJiYxMjg9PT0oMTkyJmFbY10pOyljLS07cmV0dXJuIGM8MD9iOjA9PT1jP2I6YytpW2FbY11dPmI/YzpifX0seyIuL2NvbW1vbiI6NjJ9XSw2NDpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEsYixjLGQpe2Zvcih2YXIgZT02NTUzNSZhfDAsZj1hPj4+MTYmNjU1MzV8MCxnPTA7MCE9PWM7KXtnPWM+MmUzPzJlMzpjLGMtPWc7ZG8gZT1lK2JbZCsrXXwwLGY9ZitlfDA7d2hpbGUoLS1nKTtlJT02NTUyMSxmJT02NTUyMX1yZXR1cm4gZXxmPDwxNnwwfWIuZXhwb3J0cz1kfSx7fV0sNjU6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7Yi5leHBvcnRzPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsClpfREFUQV9FUlJPUjotMyxaX0JVRl9FUlJPUjotNSxaX05PX0NPTVBSRVNTSU9OOjAsWl9CRVNUX1NQRUVEOjEsWl9CRVNUX0NPTVBSRVNTSU9OOjksWl9ERUZBVUxUX0NPTVBSRVNTSU9OOi0xLFpfRklMVEVSRUQ6MSxaX0hVRkZNQU5fT05MWToyLFpfUkxFOjMsWl9GSVhFRDo0LFpfREVGQVVMVF9TVFJBVEVHWTowLFpfQklOQVJZOjAsWl9URVhUOjEsWl9VTktOT1dOOjIsWl9ERUZMQVRFRDo4fX0se31dLDY2OltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoKXtmb3IodmFyIGEsYj1bXSxjPTA7YzwyNTY7YysrKXthPWM7Zm9yKHZhciBkPTA7ZDw4O2QrKylhPTEmYT8zOTg4MjkyMzg0XmE+Pj4xOmE+Pj4xO2JbY109YX1yZXR1cm4gYn1mdW5jdGlvbiBlKGEsYixjLGQpe3ZhciBlPWYsZz1kK2M7YV49LTE7Zm9yKHZhciBoPWQ7aDxnO2grKylhPWE+Pj44XmVbMjU1JihhXmJbaF0pXTtyZXR1cm4gYV4tMX12YXIgZj1kKCk7Yi5leHBvcnRzPWV9LHt9XSw2NzpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEsYil7cmV0dXJuIGEubXNnPUlbYl0sYn1mdW5jdGlvbiBlKGEpe3JldHVybihhPDwxKS0oYT40Pzk6MCl9ZnVuY3Rpb24gZihhKXtmb3IodmFyIGI9YS5sZW5ndGg7LS1iPj0wOylhW2JdPTB9ZnVuY3Rpb24gZyhhKXt2YXIgYj1hLnN0YXRlLGM9Yi5wZW5kaW5nO2M+YS5hdmFpbF9vdXQmJihjPWEuYXZhaWxfb3V0KSwwIT09YyYmKEUuYXJyYXlTZXQoYS5vdXRwdXQsYi5wZW5kaW5nX2J1ZixiLnBlbmRpbmdfb3V0LGMsYS5uZXh0X291dCksYS5uZXh0X291dCs9YyxiLnBlbmRpbmdfb3V0Kz1jLGEudG90YWxfb3V0Kz1jLGEuYXZhaWxfb3V0LT1jLGIucGVuZGluZy09YywwPT09Yi5wZW5kaW5nJiYoYi5wZW5kaW5nX291dD0wKSl9ZnVuY3Rpb24gaChhLGIpe0YuX3RyX2ZsdXNoX2Jsb2NrKGEsYS5ibG9ja19zdGFydD49MD9hLmJsb2NrX3N0YXJ0Oi0xLGEuc3Ryc3RhcnQtYS5ibG9ja19zdGFydCxiKSxhLmJsb2NrX3N0YXJ0PWEuc3Ryc3RhcnQsZyhhLnN0cm0pfWZ1bmN0aW9uIGkoYSxiKXthLnBlbmRpbmdfYnVmW2EucGVuZGluZysrXT1ifWZ1bmN0aW9uIGooYSxiKXthLnBlbmRpbmdfYnVmW2EucGVuZGluZysrXT1iPj4+OCYyNTUsYS5wZW5kaW5nX2J1ZlthLnBlbmRpbmcrK109MjU1JmJ9ZnVuY3Rpb24gayhhLGIsYyxkKXt2YXIgZT1hLmF2YWlsX2luO3JldHVybiBlPmQmJihlPWQpLDA9PT1lPzA6KGEuYXZhaWxfaW4tPWUsRS5hcnJheVNldChiLGEuaW5wdXQsYS5uZXh0X2luLGUsYyksMT09PWEuc3RhdGUud3JhcD9hLmFkbGVyPUcoYS5hZGxlcixiLGUsYyk6Mj09PWEuc3RhdGUud3JhcCYmKGEuYWRsZXI9SChhLmFkbGVyLGIsZSxjKSksYS5uZXh0X2luKz1lLGEudG90YWxfaW4rPWUsZSl9ZnVuY3Rpb24gbChhLGIpe3ZhciBjLGQsZT1hLm1heF9jaGFpbl9sZW5ndGgsZj1hLnN0cnN0YXJ0LGc9YS5wcmV2X2xlbmd0aCxoPWEubmljZV9tYXRjaCxpPWEuc3Ryc3RhcnQ+YS53X3NpemUtbGE/YS5zdHJzdGFydC0oYS53X3NpemUtbGEpOjAsaj1hLndpbmRvdyxrPWEud19tYXNrLGw9YS5wcmV2LG09YS5zdHJzdGFydCtrYSxuPWpbZitnLTFdLG89altmK2ddO2EucHJldl9sZW5ndGg+PWEuZ29vZF9tYXRjaCYmKGU+Pj0yKSxoPmEubG9va2FoZWFkJiYoaD1hLmxvb2thaGVhZCk7ZG8gaWYoYz1iLGpbYytnXT09PW8mJmpbYytnLTFdPT09biYmaltjXT09PWpbZl0mJmpbKytjXT09PWpbZisxXSl7Zis9MixjKys7ZG87d2hpbGUoalsrK2ZdPT09alsrK2NdJiZqWysrZl09PT1qWysrY10mJmpbKytmXT09PWpbKytjXSYmalsrK2ZdPT09alsrK2NdJiZqWysrZl09PT1qWysrY10mJmpbKytmXT09PWpbKytjXSYmalsrK2ZdPT09alsrK2NdJiZqWysrZl09PT1qWysrY10mJmY8bSk7aWYoZD1rYS0obS1mKSxmPW0ta2EsZD5nKXtpZihhLm1hdGNoX3N0YXJ0PWIsZz1kLGQ+PWgpYnJlYWs7bj1qW2YrZy0xXSxvPWpbZitnXX19d2hpbGUoKGI9bFtiJmtdKT5pJiYwIT09LS1lKTtyZXR1cm4gZzw9YS5sb29rYWhlYWQ/ZzphLmxvb2thaGVhZH1mdW5jdGlvbiBtKGEpe3ZhciBiLGMsZCxlLGYsZz1hLndfc2l6ZTtkb3tpZihlPWEud2luZG93X3NpemUtYS5sb29rYWhlYWQtYS5zdHJzdGFydCxhLnN0cnN0YXJ0Pj1nKyhnLWxhKSl7RS5hcnJheVNldChhLndpbmRvdyxhLndpbmRvdyxnLGcsMCksYS5tYXRjaF9zdGFydC09ZyxhLnN0cnN0YXJ0LT1nLGEuYmxvY2tfc3RhcnQtPWcsYz1hLmhhc2hfc2l6ZSxiPWM7ZG8gZD1hLmhlYWRbLS1iXSxhLmhlYWRbYl09ZD49Zz9kLWc6MDt3aGlsZSgtLWMpO2M9ZyxiPWM7ZG8gZD1hLnByZXZbLS1iXSxhLnByZXZbYl09ZD49Zz9kLWc6MDt3aGlsZSgtLWMpO2UrPWd9aWYoMD09PWEuc3RybS5hdmFpbF9pbilicmVhaztpZihjPWsoYS5zdHJtLGEud2luZG93LGEuc3Ryc3RhcnQrYS5sb29rYWhlYWQsZSksYS5sb29rYWhlYWQrPWMsYS5sb29rYWhlYWQrYS5pbnNlcnQ+PWphKWZvcihmPWEuc3Ryc3RhcnQtYS5pbnNlcnQsYS5pbnNfaD1hLndpbmRvd1tmXSxhLmluc19oPShhLmluc19oPDxhLmhhc2hfc2hpZnReYS53aW5kb3dbZisxXSkmYS5oYXNoX21hc2s7YS5pbnNlcnQmJihhLmluc19oPShhLmluc19oPDxhLmhhc2hfc2hpZnReYS53aW5kb3dbZitqYS0xXSkmYS5oYXNoX21hc2ssYS5wcmV2W2YmYS53X21hc2tdPWEuaGVhZFthLmluc19oXSxhLmhlYWRbYS5pbnNfaF09ZixmKyssYS5pbnNlcnQtLSwhKGEubG9va2FoZWFkK2EuaW5zZXJ0PGphKSk7KTt9d2hpbGUoYS5sb29rYWhlYWQ8bGEmJjAhPT1hLnN0cm0uYXZhaWxfaW4pfWZ1bmN0aW9uIG4oYSxiKXt2YXIgYz02NTUzNTtmb3IoYz5hLnBlbmRpbmdfYnVmX3NpemUtNSYmKGM9YS5wZW5kaW5nX2J1Zl9zaXplLTUpOzspe2lmKGEubG9va2FoZWFkPD0xKXtpZihtKGEpLDA9PT1hLmxvb2thaGVhZCYmYj09PUopcmV0dXJuIHVhO2lmKDA9PT1hLmxvb2thaGVhZClicmVha31hLnN0cnN0YXJ0Kz1hLmxvb2thaGVhZCxhLmxvb2thaGVhZD0wO3ZhciBkPWEuYmxvY2tfc3RhcnQrYztpZigoMD09PWEuc3Ryc3RhcnR8fGEuc3Ryc3RhcnQ+PWQpJiYoYS5sb29rYWhlYWQ9YS5zdHJzdGFydC1kLGEuc3Ryc3RhcnQ9ZCxoKGEsITEpLDA9PT1hLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gdWE7aWYoYS5zdHJzdGFydC1hLmJsb2NrX3N0YXJ0Pj1hLndfc2l6ZS1sYSYmKGgoYSwhMSksMD09PWEuc3RybS5hdmFpbF9vdXQpKXJldHVybiB1YX1yZXR1cm4gYS5pbnNlcnQ9MCxiPT09TT8oaChhLCEwKSwwPT09YS5zdHJtLmF2YWlsX291dD93YTp4YSk6YS5zdHJzdGFydD5hLmJsb2NrX3N0YXJ0JiYoaChhLCExKSwwPT09YS5zdHJtLmF2YWlsX291dCk/dWE6dWF9ZnVuY3Rpb24gbyhhLGIpe2Zvcih2YXIgYyxkOzspe2lmKGEubG9va2FoZWFkPGxhKXtpZihtKGEpLGEubG9va2FoZWFkPGxhJiZiPT09SilyZXR1cm4gdWE7aWYoMD09PWEubG9va2FoZWFkKWJyZWFrfWlmKGM9MCxhLmxvb2thaGVhZD49amEmJihhLmluc19oPShhLmluc19oPDxhLmhhc2hfc2hpZnReYS53aW5kb3dbYS5zdHJzdGFydCtqYS0xXSkmYS5oYXNoX21hc2ssYz1hLnByZXZbYS5zdHJzdGFydCZhLndfbWFza109YS5oZWFkW2EuaW5zX2hdLGEuaGVhZFthLmluc19oXT1hLnN0cnN0YXJ0KSwwIT09YyYmYS5zdHJzdGFydC1jPD1hLndfc2l6ZS1sYSYmKGEubWF0Y2hfbGVuZ3RoPWwoYSxjKSksYS5tYXRjaF9sZW5ndGg+PWphKWlmKGQ9Ri5fdHJfdGFsbHkoYSxhLnN0cnN0YXJ0LWEubWF0Y2hfc3RhcnQsYS5tYXRjaF9sZW5ndGgtamEpLGEubG9va2FoZWFkLT1hLm1hdGNoX2xlbmd0aCxhLm1hdGNoX2xlbmd0aDw9YS5tYXhfbGF6eV9tYXRjaCYmYS5sb29rYWhlYWQ+PWphKXthLm1hdGNoX2xlbmd0aC0tO2RvIGEuc3Ryc3RhcnQrKyxhLmluc19oPShhLmluc19oPDxhLmhhc2hfc2hpZnReYS53aW5kb3dbYS5zdHJzdGFydCtqYS0xXSkmYS5oYXNoX21hc2ssYz1hLnByZXZbYS5zdHJzdGFydCZhLndfbWFza109YS5oZWFkW2EuaW5zX2hdLGEuaGVhZFthLmluc19oXT1hLnN0cnN0YXJ0O3doaWxlKDAhPT0tLWEubWF0Y2hfbGVuZ3RoKTthLnN0cnN0YXJ0Kyt9ZWxzZSBhLnN0cnN0YXJ0Kz1hLm1hdGNoX2xlbmd0aCxhLm1hdGNoX2xlbmd0aD0wLGEuaW5zX2g9YS53aW5kb3dbYS5zdHJzdGFydF0sYS5pbnNfaD0oYS5pbnNfaDw8YS5oYXNoX3NoaWZ0XmEud2luZG93W2Euc3Ryc3RhcnQrMV0pJmEuaGFzaF9tYXNrO2Vsc2UgZD1GLl90cl90YWxseShhLDAsYS53aW5kb3dbYS5zdHJzdGFydF0pLGEubG9va2FoZWFkLS0sYS5zdHJzdGFydCsrO2lmKGQmJihoKGEsITEpLDA9PT1hLnN0cm0uYXZhaWxfb3V0KSlyZXR1cm4gdWF9cmV0dXJuIGEuaW5zZXJ0PWEuc3Ryc3RhcnQ8amEtMT9hLnN0cnN0YXJ0OmphLTEsYj09PU0/KGgoYSwhMCksMD09PWEuc3RybS5hdmFpbF9vdXQ/d2E6eGEpOmEubGFzdF9saXQmJihoKGEsITEpLDA9PT1hLnN0cm0uYXZhaWxfb3V0KT91YTp2YX1mdW5jdGlvbiBwKGEsYil7Zm9yKHZhciBjLGQsZTs7KXtpZihhLmxvb2thaGVhZDxsYSl7aWYobShhKSxhLmxvb2thaGVhZDxsYSYmYj09PUopcmV0dXJuIHVhO2lmKDA9PT1hLmxvb2thaGVhZClicmVha31pZihjPTAsYS5sb29rYWhlYWQ+PWphJiYoYS5pbnNfaD0oYS5pbnNfaDw8YS5oYXNoX3NoaWZ0XmEud2luZG93W2Euc3Ryc3RhcnQramEtMV0pJmEuaGFzaF9tYXNrLGM9YS5wcmV2W2Euc3Ryc3RhcnQmYS53X21hc2tdPWEuaGVhZFthLmluc19oXSxhLmhlYWRbYS5pbnNfaF09YS5zdHJzdGFydCksYS5wcmV2X2xlbmd0aD1hLm1hdGNoX2xlbmd0aCxhLnByZXZfbWF0Y2g9YS5tYXRjaF9zdGFydCxhLm1hdGNoX2xlbmd0aD1qYS0xLDAhPT1jJiZhLnByZXZfbGVuZ3RoPGEubWF4X2xhenlfbWF0Y2gmJmEuc3Ryc3RhcnQtYzw9YS53X3NpemUtbGEmJihhLm1hdGNoX2xlbmd0aD1sKGEsYyksYS5tYXRjaF9sZW5ndGg8PTUmJihhLnN0cmF0ZWd5PT09VXx8YS5tYXRjaF9sZW5ndGg9PT1qYSYmYS5zdHJzdGFydC1hLm1hdGNoX3N0YXJ0PjQwOTYpJiYoYS5tYXRjaF9sZW5ndGg9amEtMSkpLGEucHJldl9sZW5ndGg+PWphJiZhLm1hdGNoX2xlbmd0aDw9YS5wcmV2X2xlbmd0aCl7ZT1hLnN0cnN0YXJ0K2EubG9va2FoZWFkLWphLGQ9Ri5fdHJfdGFsbHkoYSxhLnN0cnN0YXJ0LTEtYS5wcmV2X21hdGNoLGEucHJldl9sZW5ndGgtamEpLGEubG9va2FoZWFkLT1hLnByZXZfbGVuZ3RoLTEsYS5wcmV2X2xlbmd0aC09MjtkbysrYS5zdHJzdGFydDw9ZSYmKGEuaW5zX2g9KGEuaW5zX2g8PGEuaGFzaF9zaGlmdF5hLndpbmRvd1thLnN0cnN0YXJ0K2phLTFdKSZhLmhhc2hfbWFzayxjPWEucHJldlthLnN0cnN0YXJ0JmEud19tYXNrXT1hLmhlYWRbYS5pbnNfaF0sYS5oZWFkW2EuaW5zX2hdPWEuc3Ryc3RhcnQpO3doaWxlKDAhPT0tLWEucHJldl9sZW5ndGgpO2lmKGEubWF0Y2hfYXZhaWxhYmxlPTAsYS5tYXRjaF9sZW5ndGg9amEtMSxhLnN0cnN0YXJ0KyssZCYmKGgoYSwhMSksMD09PWEuc3RybS5hdmFpbF9vdXQpKXJldHVybiB1YX1lbHNlIGlmKGEubWF0Y2hfYXZhaWxhYmxlKXtpZihkPUYuX3RyX3RhbGx5KGEsMCxhLndpbmRvd1thLnN0cnN0YXJ0LTFdKSxkJiZoKGEsITEpLGEuc3Ryc3RhcnQrKyxhLmxvb2thaGVhZC0tLDA9PT1hLnN0cm0uYXZhaWxfb3V0KXJldHVybiB1YX1lbHNlIGEubWF0Y2hfYXZhaWxhYmxlPTEsYS5zdHJzdGFydCsrLGEubG9va2FoZWFkLS19cmV0dXJuIGEubWF0Y2hfYXZhaWxhYmxlJiYoZD1GLl90cl90YWxseShhLDAsYS53aW5kb3dbYS5zdHJzdGFydC0xXSksYS5tYXRjaF9hdmFpbGFibGU9MCksYS5pbnNlcnQ9YS5zdHJzdGFydDxqYS0xP2Euc3Ryc3RhcnQ6amEtMSxiPT09TT8oaChhLCEwKSwwPT09YS5zdHJtLmF2YWlsX291dD93YTp4YSk6YS5sYXN0X2xpdCYmKGgoYSwhMSksMD09PWEuc3RybS5hdmFpbF9vdXQpP3VhOnZhfWZ1bmN0aW9uIHEoYSxiKXtmb3IodmFyIGMsZCxlLGYsZz1hLndpbmRvdzs7KXtpZihhLmxvb2thaGVhZDw9a2Epe2lmKG0oYSksYS5sb29rYWhlYWQ8PWthJiZiPT09SilyZXR1cm4gdWE7aWYoMD09PWEubG9va2FoZWFkKWJyZWFrfWlmKGEubWF0Y2hfbGVuZ3RoPTAsYS5sb29rYWhlYWQ+PWphJiZhLnN0cnN0YXJ0PjAmJihlPWEuc3Ryc3RhcnQtMSxkPWdbZV0sZD09PWdbKytlXSYmZD09PWdbKytlXSYmZD09PWdbKytlXSkpe2Y9YS5zdHJzdGFydCtrYTtkbzt3aGlsZShkPT09Z1srK2VdJiZkPT09Z1srK2VdJiZkPT09Z1srK2VdJiZkPT09Z1srK2VdJiZkPT09Z1srK2VdJiZkPT09Z1srK2VdJiZkPT09Z1srK2VdJiZkPT09Z1srK2VdJiZlPGYpO2EubWF0Y2hfbGVuZ3RoPWthLShmLWUpLGEubWF0Y2hfbGVuZ3RoPmEubG9va2FoZWFkJiYoYS5tYXRjaF9sZW5ndGg9YS5sb29rYWhlYWQpfWlmKGEubWF0Y2hfbGVuZ3RoPj1qYT8oYz1GLl90cl90YWxseShhLDEsYS5tYXRjaF9sZW5ndGgtamEpLGEubG9va2FoZWFkLT1hLm1hdGNoX2xlbmd0aCxhLnN0cnN0YXJ0Kz1hLm1hdGNoX2xlbmd0aCxhLm1hdGNoX2xlbmd0aD0wKTooYz1GLl90cl90YWxseShhLDAsYS53aW5kb3dbYS5zdHJzdGFydF0pLGEubG9va2FoZWFkLS0sYS5zdHJzdGFydCsrKSxjJiYoaChhLCExKSwwPT09YS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIHVhfXJldHVybiBhLmluc2VydD0wLGI9PT1NPyhoKGEsITApLDA9PT1hLnN0cm0uYXZhaWxfb3V0P3dhOnhhKTphLmxhc3RfbGl0JiYoaChhLCExKSwwPT09YS5zdHJtLmF2YWlsX291dCk/dWE6dmF9ZnVuY3Rpb24gcihhLGIpe2Zvcih2YXIgYzs7KXtpZigwPT09YS5sb29rYWhlYWQmJihtKGEpLDA9PT1hLmxvb2thaGVhZCkpe2lmKGI9PT1KKXJldHVybiB1YTticmVha31pZihhLm1hdGNoX2xlbmd0aD0wLGM9Ri5fdHJfdGFsbHkoYSwwLGEud2luZG93W2Euc3Ryc3RhcnRdKSxhLmxvb2thaGVhZC0tLGEuc3Ryc3RhcnQrKyxjJiYoaChhLCExKSwwPT09YS5zdHJtLmF2YWlsX291dCkpcmV0dXJuIHVhfXJldHVybiBhLmluc2VydD0wLGI9PT1NPyhoKGEsITApLDA9PT1hLnN0cm0uYXZhaWxfb3V0P3dhOnhhKTphLmxhc3RfbGl0JiYoaChhLCExKSwwPT09YS5zdHJtLmF2YWlsX291dCk/dWE6dmF9ZnVuY3Rpb24gcyhhLGIsYyxkLGUpe3RoaXMuZ29vZF9sZW5ndGg9YSx0aGlzLm1heF9sYXp5PWIsdGhpcy5uaWNlX2xlbmd0aD1jLHRoaXMubWF4X2NoYWluPWQsdGhpcy5mdW5jPWV9ZnVuY3Rpb24gdChhKXthLndpbmRvd19zaXplPTIqYS53X3NpemUsZihhLmhlYWQpLGEubWF4X2xhenlfbWF0Y2g9RFthLmxldmVsXS5tYXhfbGF6eSxhLmdvb2RfbWF0Y2g9RFthLmxldmVsXS5nb29kX2xlbmd0aCxhLm5pY2VfbWF0Y2g9RFthLmxldmVsXS5uaWNlX2xlbmd0aCxhLm1heF9jaGFpbl9sZW5ndGg9RFthLmxldmVsXS5tYXhfY2hhaW4sYS5zdHJzdGFydD0wLGEuYmxvY2tfc3RhcnQ9MCxhLmxvb2thaGVhZD0wLGEuaW5zZXJ0PTAsYS5tYXRjaF9sZW5ndGg9YS5wcmV2X2xlbmd0aD1qYS0xLGEubWF0Y2hfYXZhaWxhYmxlPTAsYS5pbnNfaD0wfWZ1bmN0aW9uIHUoKXt0aGlzLnN0cm09bnVsbCx0aGlzLnN0YXR1cz0wLHRoaXMucGVuZGluZ19idWY9bnVsbCx0aGlzLnBlbmRpbmdfYnVmX3NpemU9MCx0aGlzLnBlbmRpbmdfb3V0PTAsdGhpcy5wZW5kaW5nPTAsdGhpcy53cmFwPTAsdGhpcy5nemhlYWQ9bnVsbCx0aGlzLmd6aW5kZXg9MCx0aGlzLm1ldGhvZD0kLHRoaXMubGFzdF9mbHVzaD0tMSx0aGlzLndfc2l6ZT0wLHRoaXMud19iaXRzPTAsdGhpcy53X21hc2s9MCx0aGlzLndpbmRvdz1udWxsLHRoaXMud2luZG93X3NpemU9MCx0aGlzLnByZXY9bnVsbCx0aGlzLmhlYWQ9bnVsbCx0aGlzLmluc19oPTAsdGhpcy5oYXNoX3NpemU9MCx0aGlzLmhhc2hfYml0cz0wLHRoaXMuaGFzaF9tYXNrPTAsdGhpcy5oYXNoX3NoaWZ0PTAsdGhpcy5ibG9ja19zdGFydD0wLHRoaXMubWF0Y2hfbGVuZ3RoPTAsdGhpcy5wcmV2X21hdGNoPTAsdGhpcy5tYXRjaF9hdmFpbGFibGU9MCx0aGlzLnN0cnN0YXJ0PTAsdGhpcy5tYXRjaF9zdGFydD0wLHRoaXMubG9va2FoZWFkPTAsdGhpcy5wcmV2X2xlbmd0aD0wLHRoaXMubWF4X2NoYWluX2xlbmd0aD0wLHRoaXMubWF4X2xhenlfbWF0Y2g9MCx0aGlzLmxldmVsPTAsdGhpcy5zdHJhdGVneT0wLHRoaXMuZ29vZF9tYXRjaD0wLHRoaXMubmljZV9tYXRjaD0wLHRoaXMuZHluX2x0cmVlPW5ldyBFLkJ1ZjE2KDIqaGEpLHRoaXMuZHluX2R0cmVlPW5ldyBFLkJ1ZjE2KDIqKDIqZmErMSkpLHRoaXMuYmxfdHJlZT1uZXcgRS5CdWYxNigyKigyKmdhKzEpKSxmKHRoaXMuZHluX2x0cmVlKSxmKHRoaXMuZHluX2R0cmVlKSxmKHRoaXMuYmxfdHJlZSksdGhpcy5sX2Rlc2M9bnVsbCx0aGlzLmRfZGVzYz1udWxsLHRoaXMuYmxfZGVzYz1udWxsLHRoaXMuYmxfY291bnQ9bmV3IEUuQnVmMTYoaWErMSksdGhpcy5oZWFwPW5ldyBFLkJ1ZjE2KDIqZWErMSksZih0aGlzLmhlYXApLHRoaXMuaGVhcF9sZW49MCx0aGlzLmhlYXBfbWF4PTAsdGhpcy5kZXB0aD1uZXcgRS5CdWYxNigyKmVhKzEpLGYodGhpcy5kZXB0aCksdGhpcy5sX2J1Zj0wLHRoaXMubGl0X2J1ZnNpemU9MCx0aGlzLmxhc3RfbGl0PTAsdGhpcy5kX2J1Zj0wLHRoaXMub3B0X2xlbj0wLHRoaXMuc3RhdGljX2xlbj0wLHRoaXMubWF0Y2hlcz0wLHRoaXMuaW5zZXJ0PTAsdGhpcy5iaV9idWY9MCx0aGlzLmJpX3ZhbGlkPTB9ZnVuY3Rpb24gdihhKXt2YXIgYjtyZXR1cm4gYSYmYS5zdGF0ZT8oYS50b3RhbF9pbj1hLnRvdGFsX291dD0wLGEuZGF0YV90eXBlPVosYj1hLnN0YXRlLGIucGVuZGluZz0wLGIucGVuZGluZ19vdXQ9MCxiLndyYXA8MCYmKGIud3JhcD0tYi53cmFwKSxiLnN0YXR1cz1iLndyYXA/bmE6c2EsYS5hZGxlcj0yPT09Yi53cmFwPzA6MSxiLmxhc3RfZmx1c2g9SixGLl90cl9pbml0KGIpLE8pOmQoYSxRKX1mdW5jdGlvbiB3KGEpe3ZhciBiPXYoYSk7cmV0dXJuIGI9PT1PJiZ0KGEuc3RhdGUpLGJ9ZnVuY3Rpb24geChhLGIpe3JldHVybiBhJiZhLnN0YXRlPzIhPT1hLnN0YXRlLndyYXA/UTooYS5zdGF0ZS5nemhlYWQ9YixPKTpRfWZ1bmN0aW9uIHkoYSxiLGMsZSxmLGcpe2lmKCFhKXJldHVybiBRO3ZhciBoPTE7aWYoYj09PVQmJihiPTYpLGU8MD8oaD0wLGU9LWUpOmU+MTUmJihoPTIsZS09MTYpLGY8MXx8Zj5ffHxjIT09JHx8ZTw4fHxlPjE1fHxiPDB8fGI+OXx8ZzwwfHxnPlgpcmV0dXJuIGQoYSxRKTs4PT09ZSYmKGU9OSk7dmFyIGk9bmV3IHU7cmV0dXJuIGEuc3RhdGU9aSxpLnN0cm09YSxpLndyYXA9aCxpLmd6aGVhZD1udWxsLGkud19iaXRzPWUsaS53X3NpemU9MTw8aS53X2JpdHMsaS53X21hc2s9aS53X3NpemUtMSxpLmhhc2hfYml0cz1mKzcsaS5oYXNoX3NpemU9MTw8aS5oYXNoX2JpdHMsaS5oYXNoX21hc2s9aS5oYXNoX3NpemUtMSxpLmhhc2hfc2hpZnQ9fn4oKGkuaGFzaF9iaXRzK2phLTEpL2phKSxpLndpbmRvdz1uZXcgRS5CdWY4KDIqaS53X3NpemUpLGkuaGVhZD1uZXcgRS5CdWYxNihpLmhhc2hfc2l6ZSksaS5wcmV2PW5ldyBFLkJ1ZjE2KGkud19zaXplKSxpLmxpdF9idWZzaXplPTE8PGYrNixpLnBlbmRpbmdfYnVmX3NpemU9NCppLmxpdF9idWZzaXplLGkucGVuZGluZ19idWY9bmV3IEUuQnVmOChpLnBlbmRpbmdfYnVmX3NpemUpLGkuZF9idWY9MSppLmxpdF9idWZzaXplLGkubF9idWY9MyppLmxpdF9idWZzaXplLGkubGV2ZWw9YixpLnN0cmF0ZWd5PWcsaS5tZXRob2Q9Yyx3KGEpfWZ1bmN0aW9uIHooYSxiKXtyZXR1cm4geShhLGIsJCxhYSxiYSxZKX1mdW5jdGlvbiBBKGEsYil7dmFyIGMsaCxrLGw7aWYoIWF8fCFhLnN0YXRlfHxiPk58fGI8MClyZXR1cm4gYT9kKGEsUSk6UTtpZihoPWEuc3RhdGUsIWEub3V0cHV0fHwhYS5pbnB1dCYmMCE9PWEuYXZhaWxfaW58fGguc3RhdHVzPT09dGEmJmIhPT1NKXJldHVybiBkKGEsMD09PWEuYXZhaWxfb3V0P1M6USk7aWYoaC5zdHJtPWEsYz1oLmxhc3RfZmx1c2gsaC5sYXN0X2ZsdXNoPWIsaC5zdGF0dXM9PT1uYSlpZigyPT09aC53cmFwKWEuYWRsZXI9MCxpKGgsMzEpLGkoaCwxMzkpLGkoaCw4KSxoLmd6aGVhZD8oaShoLChoLmd6aGVhZC50ZXh0PzE6MCkrKGguZ3poZWFkLmhjcmM/MjowKSsoaC5nemhlYWQuZXh0cmE/NDowKSsoaC5nemhlYWQubmFtZT84OjApKyhoLmd6aGVhZC5jb21tZW50PzE2OjApKSxpKGgsMjU1JmguZ3poZWFkLnRpbWUpLGkoaCxoLmd6aGVhZC50aW1lPj44JjI1NSksaShoLGguZ3poZWFkLnRpbWU+PjE2JjI1NSksaShoLGguZ3poZWFkLnRpbWU+PjI0JjI1NSksaShoLDk9PT1oLmxldmVsPzI6aC5zdHJhdGVneT49Vnx8aC5sZXZlbDwyPzQ6MCksaShoLDI1NSZoLmd6aGVhZC5vcyksaC5nemhlYWQuZXh0cmEmJmguZ3poZWFkLmV4dHJhLmxlbmd0aCYmKGkoaCwyNTUmaC5nemhlYWQuZXh0cmEubGVuZ3RoKSxpKGgsaC5nemhlYWQuZXh0cmEubGVuZ3RoPj44JjI1NSkpLGguZ3poZWFkLmhjcmMmJihhLmFkbGVyPUgoYS5hZGxlcixoLnBlbmRpbmdfYnVmLGgucGVuZGluZywwKSksaC5nemluZGV4PTAsaC5zdGF0dXM9b2EpOihpKGgsMCksaShoLDApLGkoaCwwKSxpKGgsMCksaShoLDApLGkoaCw5PT09aC5sZXZlbD8yOmguc3RyYXRlZ3k+PVZ8fGgubGV2ZWw8Mj80OjApLGkoaCx5YSksaC5zdGF0dXM9c2EpO2Vsc2V7dmFyIG09JCsoaC53X2JpdHMtODw8NCk8PDgsbj0tMTtuPWguc3RyYXRlZ3k+PVZ8fGgubGV2ZWw8Mj8wOmgubGV2ZWw8Nj8xOjY9PT1oLmxldmVsPzI6MyxtfD1uPDw2LDAhPT1oLnN0cnN0YXJ0JiYobXw9bWEpLG0rPTMxLW0lMzEsaC5zdGF0dXM9c2EsaihoLG0pLDAhPT1oLnN0cnN0YXJ0JiYoaihoLGEuYWRsZXI+Pj4xNiksaihoLDY1NTM1JmEuYWRsZXIpKSxhLmFkbGVyPTF9aWYoaC5zdGF0dXM9PT1vYSlpZihoLmd6aGVhZC5leHRyYSl7Zm9yKGs9aC5wZW5kaW5nO2guZ3ppbmRleDwoNjU1MzUmaC5nemhlYWQuZXh0cmEubGVuZ3RoKSYmKGgucGVuZGluZyE9PWgucGVuZGluZ19idWZfc2l6ZXx8KGguZ3poZWFkLmhjcmMmJmgucGVuZGluZz5rJiYoYS5hZGxlcj1IKGEuYWRsZXIsaC5wZW5kaW5nX2J1ZixoLnBlbmRpbmctayxrKSksZyhhKSxrPWgucGVuZGluZyxoLnBlbmRpbmchPT1oLnBlbmRpbmdfYnVmX3NpemUpKTspaShoLDI1NSZoLmd6aGVhZC5leHRyYVtoLmd6aW5kZXhdKSxoLmd6aW5kZXgrKztoLmd6aGVhZC5oY3JjJiZoLnBlbmRpbmc+ayYmKGEuYWRsZXI9SChhLmFkbGVyLGgucGVuZGluZ19idWYsaC5wZW5kaW5nLWssaykpLGguZ3ppbmRleD09PWguZ3poZWFkLmV4dHJhLmxlbmd0aCYmKGguZ3ppbmRleD0wLGguc3RhdHVzPXBhKX1lbHNlIGguc3RhdHVzPXBhO2lmKGguc3RhdHVzPT09cGEpaWYoaC5nemhlYWQubmFtZSl7az1oLnBlbmRpbmc7ZG97aWYoaC5wZW5kaW5nPT09aC5wZW5kaW5nX2J1Zl9zaXplJiYoaC5nemhlYWQuaGNyYyYmaC5wZW5kaW5nPmsmJihhLmFkbGVyPUgoYS5hZGxlcixoLnBlbmRpbmdfYnVmLGgucGVuZGluZy1rLGspKSxnKGEpLGs9aC5wZW5kaW5nLGgucGVuZGluZz09PWgucGVuZGluZ19idWZfc2l6ZSkpe2w9MTticmVha31sPWguZ3ppbmRleDxoLmd6aGVhZC5uYW1lLmxlbmd0aD8yNTUmaC5nemhlYWQubmFtZS5jaGFyQ29kZUF0KGguZ3ppbmRleCsrKTowLGkoaCxsKX13aGlsZSgwIT09bCk7aC5nemhlYWQuaGNyYyYmaC5wZW5kaW5nPmsmJihhLmFkbGVyPUgoYS5hZGxlcixoLnBlbmRpbmdfYnVmLGgucGVuZGluZy1rLGspKSwwPT09bCYmKGguZ3ppbmRleD0wLGguc3RhdHVzPXFhKX1lbHNlIGguc3RhdHVzPXFhO2lmKGguc3RhdHVzPT09cWEpaWYoaC5nemhlYWQuY29tbWVudCl7az1oLnBlbmRpbmc7ZG97aWYoaC5wZW5kaW5nPT09aC5wZW5kaW5nX2J1Zl9zaXplJiYoaC5nemhlYWQuaGNyYyYmaC5wZW5kaW5nPmsmJihhLmFkbGVyPUgoYS5hZGxlcixoLnBlbmRpbmdfYnVmLGgucGVuZGluZy1rLGspKSxnKGEpLGs9aC5wZW5kaW5nLGgucGVuZGluZz09PWgucGVuZGluZ19idWZfc2l6ZSkpe2w9MTticmVha31sPWguZ3ppbmRleDxoLmd6aGVhZC5jb21tZW50Lmxlbmd0aD8yNTUmaC5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KGguZ3ppbmRleCsrKTowLGkoaCxsKX13aGlsZSgwIT09bCk7aC5nemhlYWQuaGNyYyYmaC5wZW5kaW5nPmsmJihhLmFkbGVyPUgoYS5hZGxlcixoLnBlbmRpbmdfYnVmLGgucGVuZGluZy1rLGspKSwwPT09bCYmKGguc3RhdHVzPXJhKX1lbHNlIGguc3RhdHVzPXJhO2lmKGguc3RhdHVzPT09cmEmJihoLmd6aGVhZC5oY3JjPyhoLnBlbmRpbmcrMj5oLnBlbmRpbmdfYnVmX3NpemUmJmcoYSksaC5wZW5kaW5nKzI8PWgucGVuZGluZ19idWZfc2l6ZSYmKGkoaCwyNTUmYS5hZGxlciksaShoLGEuYWRsZXI+PjgmMjU1KSxhLmFkbGVyPTAsaC5zdGF0dXM9c2EpKTpoLnN0YXR1cz1zYSksMCE9PWgucGVuZGluZyl7aWYoZyhhKSwwPT09YS5hdmFpbF9vdXQpcmV0dXJuIGgubGFzdF9mbHVzaD0tMSxPfWVsc2UgaWYoMD09PWEuYXZhaWxfaW4mJmUoYik8PWUoYykmJmIhPT1NKXJldHVybiBkKGEsUyk7aWYoaC5zdGF0dXM9PT10YSYmMCE9PWEuYXZhaWxfaW4pcmV0dXJuIGQoYSxTKTtpZigwIT09YS5hdmFpbF9pbnx8MCE9PWgubG9va2FoZWFkfHxiIT09SiYmaC5zdGF0dXMhPT10YSl7dmFyIG89aC5zdHJhdGVneT09PVY/cihoLGIpOmguc3RyYXRlZ3k9PT1XP3EoaCxiKTpEW2gubGV2ZWxdLmZ1bmMoaCxiKTtpZihvIT09d2EmJm8hPT14YXx8KGguc3RhdHVzPXRhKSxvPT09dWF8fG89PT13YSlyZXR1cm4gMD09PWEuYXZhaWxfb3V0JiYoaC5sYXN0X2ZsdXNoPS0xKSxPO2lmKG89PT12YSYmKGI9PT1LP0YuX3RyX2FsaWduKGgpOmIhPT1OJiYoRi5fdHJfc3RvcmVkX2Jsb2NrKGgsMCwwLCExKSxiPT09TCYmKGYoaC5oZWFkKSwwPT09aC5sb29rYWhlYWQmJihoLnN0cnN0YXJ0PTAsaC5ibG9ja19zdGFydD0wLGguaW5zZXJ0PTApKSksZyhhKSwwPT09YS5hdmFpbF9vdXQpKXJldHVybiBoLmxhc3RfZmx1c2g9LTEsT31yZXR1cm4gYiE9PU0/TzpoLndyYXA8PTA/UDooMj09PWgud3JhcD8oaShoLDI1NSZhLmFkbGVyKSxpKGgsYS5hZGxlcj4+OCYyNTUpLGkoaCxhLmFkbGVyPj4xNiYyNTUpLGkoaCxhLmFkbGVyPj4yNCYyNTUpLGkoaCwyNTUmYS50b3RhbF9pbiksaShoLGEudG90YWxfaW4+PjgmMjU1KSxpKGgsYS50b3RhbF9pbj4+MTYmMjU1KSxpKGgsYS50b3RhbF9pbj4+MjQmMjU1KSk6KGooaCxhLmFkbGVyPj4+MTYpLGooaCw2NTUzNSZhLmFkbGVyKSksZyhhKSxoLndyYXA+MCYmKGgud3JhcD0taC53cmFwKSwwIT09aC5wZW5kaW5nP086UCl9ZnVuY3Rpb24gQihhKXt2YXIgYjtyZXR1cm4gYSYmYS5zdGF0ZT8oYj1hLnN0YXRlLnN0YXR1cyxiIT09bmEmJmIhPT1vYSYmYiE9PXBhJiZiIT09cWEmJmIhPT1yYSYmYiE9PXNhJiZiIT09dGE/ZChhLFEpOihhLnN0YXRlPW51bGwsYj09PXNhP2QoYSxSKTpPKSk6UX1mdW5jdGlvbiBDKGEsYil7dmFyIGMsZCxlLGcsaCxpLGosayxsPWIubGVuZ3RoO2lmKCFhfHwhYS5zdGF0ZSlyZXR1cm4gUTtpZihjPWEuc3RhdGUsZz1jLndyYXAsMj09PWd8fDE9PT1nJiZjLnN0YXR1cyE9PW5hfHxjLmxvb2thaGVhZClyZXR1cm4gUTtmb3IoMT09PWcmJihhLmFkbGVyPUcoYS5hZGxlcixiLGwsMCkpLGMud3JhcD0wLGw+PWMud19zaXplJiYoMD09PWcmJihmKGMuaGVhZCksYy5zdHJzdGFydD0wLGMuYmxvY2tfc3RhcnQ9MCxjLmluc2VydD0wKSxrPW5ldyBFLkJ1ZjgoYy53X3NpemUpLEUuYXJyYXlTZXQoayxiLGwtYy53X3NpemUsYy53X3NpemUsMCksYj1rLGw9Yy53X3NpemUpLGg9YS5hdmFpbF9pbixpPWEubmV4dF9pbixqPWEuaW5wdXQsYS5hdmFpbF9pbj1sLGEubmV4dF9pbj0wLGEuaW5wdXQ9YixtKGMpO2MubG9va2FoZWFkPj1qYTspe2Q9Yy5zdHJzdGFydCxlPWMubG9va2FoZWFkLShqYS0xKTtkbyBjLmluc19oPShjLmluc19oPDxjLmhhc2hfc2hpZnReYy53aW5kb3dbZCtqYS0xXSkmYy5oYXNoX21hc2ssYy5wcmV2W2QmYy53X21hc2tdPWMuaGVhZFtjLmluc19oXSxjLmhlYWRbYy5pbnNfaF09ZCxkKys7d2hpbGUoLS1lKTtjLnN0cnN0YXJ0PWQsYy5sb29rYWhlYWQ9amEtMSxtKGMpfXJldHVybiBjLnN0cnN0YXJ0Kz1jLmxvb2thaGVhZCxjLmJsb2NrX3N0YXJ0PWMuc3Ryc3RhcnQsYy5pbnNlcnQ9Yy5sb29rYWhlYWQsYy5sb29rYWhlYWQ9MCxjLm1hdGNoX2xlbmd0aD1jLnByZXZfbGVuZ3RoPWphLTEsYy5tYXRjaF9hdmFpbGFibGU9MCxhLm5leHRfaW49aSxhLmlucHV0PWosYS5hdmFpbF9pbj1oLGMud3JhcD1nLE99dmFyIEQsRT1hKCIuLi91dGlscy9jb21tb24iKSxGPWEoIi4vdHJlZXMiKSxHPWEoIi4vYWRsZXIzMiIpLEg9YSgiLi9jcmMzMiIpLEk9YSgiLi9tZXNzYWdlcyIpLEo9MCxLPTEsTD0zLE09NCxOPTUsTz0wLFA9MSxRPS0yLFI9LTMsUz0tNSxUPS0xLFU9MSxWPTIsVz0zLFg9NCxZPTAsWj0yLCQ9OCxfPTksYWE9MTUsYmE9OCxjYT0yOSxkYT0yNTYsZWE9ZGErMStjYSxmYT0zMCxnYT0xOSxoYT0yKmVhKzEsaWE9MTUsamE9MyxrYT0yNTgsbGE9a2EramErMSxtYT0zMixuYT00MixvYT02OSxwYT03MyxxYT05MSxyYT0xMDMsc2E9MTEzLHRhPTY2Nix1YT0xLHZhPTIsd2E9Myx4YT00LHlhPTM7RD1bbmV3IHMoMCwwLDAsMCxuKSxuZXcgcyg0LDQsOCw0LG8pLG5ldyBzKDQsNSwxNiw4LG8pLG5ldyBzKDQsNiwzMiwzMixvKSxuZXcgcyg0LDQsMTYsMTYscCksbmV3IHMoOCwxNiwzMiwzMixwKSxuZXcgcyg4LDE2LDEyOCwxMjgscCksbmV3IHMoOCwzMiwxMjgsMjU2LHApLG5ldyBzKDMyLDEyOCwyNTgsMTAyNCxwKSxuZXcgcygzMiwyNTgsMjU4LDQwOTYscCldLGMuZGVmbGF0ZUluaXQ9eixjLmRlZmxhdGVJbml0Mj15LGMuZGVmbGF0ZVJlc2V0PXcsYy5kZWZsYXRlUmVzZXRLZWVwPXYsYy5kZWZsYXRlU2V0SGVhZGVyPXgsYy5kZWZsYXRlPUEsYy5kZWZsYXRlRW5kPUIsYy5kZWZsYXRlU2V0RGljdGlvbmFyeT1DLGMuZGVmbGF0ZUluZm89InBha28gZGVmbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkifSx7Ii4uL3V0aWxzL2NvbW1vbiI6NjIsIi4vYWRsZXIzMiI6NjQsIi4vY3JjMzIiOjY2LCIuL21lc3NhZ2VzIjo3MiwiLi90cmVlcyI6NzN9XSw2ODpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKCl7dGhpcy50ZXh0PTAsdGhpcy50aW1lPTAsdGhpcy54ZmxhZ3M9MCx0aGlzLm9zPTAsdGhpcy5leHRyYT1udWxsLHRoaXMuZXh0cmFfbGVuPTAsdGhpcy5uYW1lPSIiLHRoaXMuY29tbWVudD0iIix0aGlzLmhjcmM9MCx0aGlzLmRvbmU9ITF9Yi5leHBvcnRzPWR9LHt9XSw2OTpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0Ijt2YXIgZD0zMCxlPTEyO2IuZXhwb3J0cz1mdW5jdGlvbihhLGIpe3ZhciBjLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHUsdix3LHgseSx6LEEsQixDO2M9YS5zdGF0ZSxmPWEubmV4dF9pbixCPWEuaW5wdXQsZz1mKyhhLmF2YWlsX2luLTUpLGg9YS5uZXh0X291dCxDPWEub3V0cHV0LGk9aC0oYi1hLmF2YWlsX291dCksaj1oKyhhLmF2YWlsX291dC0yNTcpLGs9Yy5kbWF4LGw9Yy53c2l6ZSxtPWMud2hhdmUsbj1jLnduZXh0LG89Yy53aW5kb3cscD1jLmhvbGQscT1jLmJpdHMscj1jLmxlbmNvZGUscz1jLmRpc3Rjb2RlLHQ9KDE8PGMubGVuYml0cyktMSx1PSgxPDxjLmRpc3RiaXRzKS0xO2E6ZG97cTwxNSYmKHArPUJbZisrXTw8cSxxKz04LHArPUJbZisrXTw8cSxxKz04KSx2PXJbcCZ0XTtiOmZvcig7Oyl7aWYodz12Pj4+MjQscD4+Pj13LHEtPXcsdz12Pj4+MTYmMjU1LDA9PT13KUNbaCsrXT02NTUzNSZ2O2Vsc2V7aWYoISgxNiZ3KSl7aWYoMD09PSg2NCZ3KSl7dj1yWyg2NTUzNSZ2KSsocCYoMTw8dyktMSldO2NvbnRpbnVlIGJ9aWYoMzImdyl7Yy5tb2RlPWU7YnJlYWsgYX1hLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIixjLm1vZGU9ZDticmVhayBhfXg9NjU1MzUmdix3Jj0xNSx3JiYocTx3JiYocCs9QltmKytdPDxxLHErPTgpLHgrPXAmKDE8PHcpLTEscD4+Pj13LHEtPXcpLHE8MTUmJihwKz1CW2YrK108PHEscSs9OCxwKz1CW2YrK108PHEscSs9OCksdj1zW3AmdV07Yzpmb3IoOzspe2lmKHc9dj4+PjI0LHA+Pj49dyxxLT13LHc9dj4+PjE2JjI1NSwhKDE2JncpKXtpZigwPT09KDY0JncpKXt2PXNbKDY1NTM1JnYpKyhwJigxPDx3KS0xKV07Y29udGludWUgY31hLm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixjLm1vZGU9ZDticmVhayBhfWlmKHk9NjU1MzUmdix3Jj0xNSxxPHcmJihwKz1CW2YrK108PHEscSs9OCxxPHcmJihwKz1CW2YrK108PHEscSs9OCkpLHkrPXAmKDE8PHcpLTEseT5rKXthLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLGMubW9kZT1kO2JyZWFrIGF9aWYocD4+Pj13LHEtPXcsdz1oLWkseT53KXtpZih3PXktdyx3Pm0mJmMuc2FuZSl7YS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixjLm1vZGU9ZDticmVhayBhfWlmKHo9MCxBPW8sMD09PW4pe2lmKHorPWwtdyx3PHgpe3gtPXc7ZG8gQ1toKytdPW9beisrXTt3aGlsZSgtLXcpO3o9aC15LEE9Q319ZWxzZSBpZihuPHcpe2lmKHorPWwrbi13LHctPW4sdzx4KXt4LT13O2RvIENbaCsrXT1vW3orK107d2hpbGUoLS13KTtpZih6PTAsbjx4KXt3PW4seC09dztkbyBDW2grK109b1t6KytdO3doaWxlKC0tdyk7ej1oLXksQT1DfX19ZWxzZSBpZih6Kz1uLXcsdzx4KXt4LT13O2RvIENbaCsrXT1vW3orK107d2hpbGUoLS13KTt6PWgteSxBPUN9Zm9yKDt4PjI7KUNbaCsrXT1BW3orK10sQ1toKytdPUFbeisrXSxDW2grK109QVt6KytdLHgtPTM7eCYmKENbaCsrXT1BW3orK10seD4xJiYoQ1toKytdPUFbeisrXSkpfWVsc2V7ej1oLXk7ZG8gQ1toKytdPUNbeisrXSxDW2grK109Q1t6KytdLENbaCsrXT1DW3orK10seC09Mzt3aGlsZSh4PjIpO3gmJihDW2grK109Q1t6KytdLHg+MSYmKENbaCsrXT1DW3orK10pKX1icmVha319YnJlYWt9fXdoaWxlKGY8ZyYmaDxqKTt4PXE+PjMsZi09eCxxLT14PDwzLHAmPSgxPDxxKS0xLGEubmV4dF9pbj1mLGEubmV4dF9vdXQ9aCxhLmF2YWlsX2luPWY8Zz81KyhnLWYpOjUtKGYtZyksYS5hdmFpbF9vdXQ9aDxqPzI1Nysoai1oKToyNTctKGgtaiksYy5ob2xkPXAsYy5iaXRzPXF9fSx7fV0sNzA6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhKXtyZXR1cm4oYT4+PjI0JjI1NSkrKGE+Pj44JjY1MjgwKSsoKDY1MjgwJmEpPDw4KSsoKDI1NSZhKTw8MjQpfWZ1bmN0aW9uIGUoKXt0aGlzLm1vZGU9MCx0aGlzLmxhc3Q9ITEsdGhpcy53cmFwPTAsdGhpcy5oYXZlZGljdD0hMSx0aGlzLmZsYWdzPTAsdGhpcy5kbWF4PTAsdGhpcy5jaGVjaz0wLHRoaXMudG90YWw9MCx0aGlzLmhlYWQ9bnVsbCx0aGlzLndiaXRzPTAsdGhpcy53c2l6ZT0wLHRoaXMud2hhdmU9MCx0aGlzLnduZXh0PTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLmhvbGQ9MCx0aGlzLmJpdHM9MCx0aGlzLmxlbmd0aD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5leHRyYT0wLHRoaXMubGVuY29kZT1udWxsLHRoaXMuZGlzdGNvZGU9bnVsbCx0aGlzLmxlbmJpdHM9MCx0aGlzLmRpc3RiaXRzPTAsdGhpcy5uY29kZT0wLHRoaXMubmxlbj0wLHRoaXMubmRpc3Q9MCx0aGlzLmhhdmU9MCx0aGlzLm5leHQ9bnVsbCx0aGlzLmxlbnM9bmV3IHMuQnVmMTYoMzIwKSx0aGlzLndvcms9bmV3IHMuQnVmMTYoMjg4KSx0aGlzLmxlbmR5bj1udWxsLHRoaXMuZGlzdGR5bj1udWxsLHRoaXMuc2FuZT0wLHRoaXMuYmFjaz0wLHRoaXMud2FzPTB9ZnVuY3Rpb24gZihhKXt2YXIgYjtyZXR1cm4gYSYmYS5zdGF0ZT8oYj1hLnN0YXRlLGEudG90YWxfaW49YS50b3RhbF9vdXQ9Yi50b3RhbD0wLGEubXNnPSIiLGIud3JhcCYmKGEuYWRsZXI9MSZiLndyYXApLGIubW9kZT1MLGIubGFzdD0wLGIuaGF2ZWRpY3Q9MCxiLmRtYXg9MzI3NjgsYi5oZWFkPW51bGwsYi5ob2xkPTAsYi5iaXRzPTAsYi5sZW5jb2RlPWIubGVuZHluPW5ldyBzLkJ1ZjMyKHBhKSxiLmRpc3Rjb2RlPWIuZGlzdGR5bj1uZXcgcy5CdWYzMihxYSksYi5zYW5lPTEsYi5iYWNrPS0xLEQpOkd9ZnVuY3Rpb24gZyhhKXt2YXIgYjtyZXR1cm4gYSYmYS5zdGF0ZT8oYj1hLnN0YXRlLGIud3NpemU9MCxiLndoYXZlPTAsYi53bmV4dD0wLGYoYSkpOkd9ZnVuY3Rpb24gaChhLGIpe3ZhciBjLGQ7cmV0dXJuIGEmJmEuc3RhdGU/KGQ9YS5zdGF0ZSxiPDA/KGM9MCxiPS1iKTooYz0oYj4+NCkrMSxiPDQ4JiYoYiY9MTUpKSxiJiYoYjw4fHxiPjE1KT9HOihudWxsIT09ZC53aW5kb3cmJmQud2JpdHMhPT1iJiYoZC53aW5kb3c9bnVsbCksZC53cmFwPWMsZC53Yml0cz1iLGcoYSkpKTpHfWZ1bmN0aW9uIGkoYSxiKXt2YXIgYyxkO3JldHVybiBhPyhkPW5ldyBlLGEuc3RhdGU9ZCxkLndpbmRvdz1udWxsLGM9aChhLGIpLGMhPT1EJiYoYS5zdGF0ZT1udWxsKSxjKTpHfWZ1bmN0aW9uIGooYSl7cmV0dXJuIGkoYSxzYSl9ZnVuY3Rpb24gayhhKXtpZih0YSl7dmFyIGI7Zm9yKHE9bmV3IHMuQnVmMzIoNTEyKSxyPW5ldyBzLkJ1ZjMyKDMyKSxiPTA7YjwxNDQ7KWEubGVuc1tiKytdPTg7Zm9yKDtiPDI1NjspYS5sZW5zW2IrK109OTtmb3IoO2I8MjgwOylhLmxlbnNbYisrXT03O2Zvcig7YjwyODg7KWEubGVuc1tiKytdPTg7Zm9yKHcoeSxhLmxlbnMsMCwyODgscSwwLGEud29yayx7Yml0czo5fSksYj0wO2I8MzI7KWEubGVuc1tiKytdPTU7dyh6LGEubGVucywwLDMyLHIsMCxhLndvcmsse2JpdHM6NX0pLHRhPSExfWEubGVuY29kZT1xLGEubGVuYml0cz05LGEuZGlzdGNvZGU9cixhLmRpc3RiaXRzPTV9ZnVuY3Rpb24gbChhLGIsYyxkKXt2YXIgZSxmPWEuc3RhdGU7cmV0dXJuIG51bGw9PT1mLndpbmRvdyYmKGYud3NpemU9MTw8Zi53Yml0cyxmLnduZXh0PTAsZi53aGF2ZT0wLGYud2luZG93PW5ldyBzLkJ1ZjgoZi53c2l6ZSkpLGQ+PWYud3NpemU/KHMuYXJyYXlTZXQoZi53aW5kb3csYixjLWYud3NpemUsZi53c2l6ZSwwKSxmLnduZXh0PTAsZi53aGF2ZT1mLndzaXplKTooZT1mLndzaXplLWYud25leHQsZT5kJiYoZT1kKSxzLmFycmF5U2V0KGYud2luZG93LGIsYy1kLGUsZi53bmV4dCksZC09ZSxkPyhzLmFycmF5U2V0KGYud2luZG93LGIsYy1kLGQsMCksZi53bmV4dD1kLGYud2hhdmU9Zi53c2l6ZSk6KGYud25leHQrPWUsZi53bmV4dD09PWYud3NpemUmJihmLnduZXh0PTApLGYud2hhdmU8Zi53c2l6ZSYmKGYud2hhdmUrPWUpKSksMH1mdW5jdGlvbiBtKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosbSxuLG8scCxxLHIscGEscWEscmEsc2EsdGEsdWEsdmEsd2EseGEseWEsemEsQWE9MCxCYT1uZXcgcy5CdWY4KDQpLENhPVsxNiwxNywxOCwwLDgsNyw5LDYsMTAsNSwxMSw0LDEyLDMsMTMsMiwxNCwxLDE1XTtpZighYXx8IWEuc3RhdGV8fCFhLm91dHB1dHx8IWEuaW5wdXQmJjAhPT1hLmF2YWlsX2luKXJldHVybiBHO2M9YS5zdGF0ZSxjLm1vZGU9PT1XJiYoYy5tb2RlPVgpLGg9YS5uZXh0X291dCxmPWEub3V0cHV0LGo9YS5hdmFpbF9vdXQsZz1hLm5leHRfaW4sZT1hLmlucHV0LGk9YS5hdmFpbF9pbixtPWMuaG9sZCxuPWMuYml0cyxvPWkscD1qLHhhPUQ7YTpmb3IoOzspc3dpdGNoKGMubW9kZSl7Y2FzZSBMOmlmKDA9PT1jLndyYXApe2MubW9kZT1YO2JyZWFrfWZvcig7bjwxNjspe2lmKDA9PT1pKWJyZWFrIGE7aS0tLG0rPWVbZysrXTw8bixuKz04fWlmKDImYy53cmFwJiYzNTYxNT09PW0pe2MuY2hlY2s9MCxCYVswXT0yNTUmbSxCYVsxXT1tPj4+OCYyNTUsYy5jaGVjaz11KGMuY2hlY2ssQmEsMiwwKSxtPTAsbj0wLGMubW9kZT1NO2JyZWFrfWlmKGMuZmxhZ3M9MCxjLmhlYWQmJihjLmhlYWQuZG9uZT0hMSksISgxJmMud3JhcCl8fCgoKDI1NSZtKTw8OCkrKG0+PjgpKSUzMSl7YS5tc2c9ImluY29ycmVjdCBoZWFkZXIgY2hlY2siLGMubW9kZT1tYTticmVha31pZigoMTUmbSkhPT1LKXthLm1zZz0idW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiLGMubW9kZT1tYTticmVha31pZihtPj4+PTQsbi09NCx3YT0oMTUmbSkrOCwwPT09Yy53Yml0cyljLndiaXRzPXdhO2Vsc2UgaWYod2E+Yy53Yml0cyl7YS5tc2c9ImludmFsaWQgd2luZG93IHNpemUiLGMubW9kZT1tYTticmVha31jLmRtYXg9MTw8d2EsYS5hZGxlcj1jLmNoZWNrPTEsYy5tb2RlPTUxMiZtP1U6VyxtPTAsbj0wO2JyZWFrO2Nhc2UgTTpmb3IoO248MTY7KXtpZigwPT09aSlicmVhayBhO2ktLSxtKz1lW2crK108PG4sbis9OH1pZihjLmZsYWdzPW0sKDI1NSZjLmZsYWdzKSE9PUspe2EubXNnPSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCIsYy5tb2RlPW1hO2JyZWFrfWlmKDU3MzQ0JmMuZmxhZ3Mpe2EubXNnPSJ1bmtub3duIGhlYWRlciBmbGFncyBzZXQiLGMubW9kZT1tYTticmVha31jLmhlYWQmJihjLmhlYWQudGV4dD1tPj44JjEpLDUxMiZjLmZsYWdzJiYoQmFbMF09MjU1Jm0sQmFbMV09bT4+PjgmMjU1LGMuY2hlY2s9dShjLmNoZWNrLEJhLDIsMCkpLG09MCxuPTAsYy5tb2RlPU47Y2FzZSBOOmZvcig7bjwzMjspe2lmKDA9PT1pKWJyZWFrIGE7aS0tLG0rPWVbZysrXTw8bixuKz04fWMuaGVhZCYmKGMuaGVhZC50aW1lPW0pLDUxMiZjLmZsYWdzJiYoQmFbMF09MjU1Jm0sQmFbMV09bT4+PjgmMjU1LEJhWzJdPW0+Pj4xNiYyNTUsQmFbM109bT4+PjI0JjI1NSxjLmNoZWNrPXUoYy5jaGVjayxCYSw0LDApKSxtPTAsbj0wLGMubW9kZT1PO2Nhc2UgTzpmb3IoO248MTY7KXtpZigwPT09aSlicmVhayBhO2ktLSxtKz1lW2crK108PG4sbis9OH1jLmhlYWQmJihjLmhlYWQueGZsYWdzPTI1NSZtLGMuaGVhZC5vcz1tPj44KSw1MTImYy5mbGFncyYmKEJhWzBdPTI1NSZtLEJhWzFdPW0+Pj44JjI1NSxjLmNoZWNrPXUoYy5jaGVjayxCYSwyLDApKSxtPTAsbj0wLGMubW9kZT1QO2Nhc2UgUDppZigxMDI0JmMuZmxhZ3Mpe2Zvcig7bjwxNjspe2lmKDA9PT1pKWJyZWFrIGE7aS0tLG0rPWVbZysrXTw8bixuKz04fWMubGVuZ3RoPW0sYy5oZWFkJiYoYy5oZWFkLmV4dHJhX2xlbj1tKSw1MTImYy5mbGFncyYmKEJhWzBdPTI1NSZtLEJhWzFdPW0+Pj44JjI1NSxjLmNoZWNrPXUoYy5jaGVjayxCYSwyLDApKSxtPTAsbj0wfWVsc2UgYy5oZWFkJiYoYy5oZWFkLmV4dHJhPW51bGwpO2MubW9kZT1RO2Nhc2UgUTppZigxMDI0JmMuZmxhZ3MmJihxPWMubGVuZ3RoLHE+aSYmKHE9aSkscSYmKGMuaGVhZCYmKHdhPWMuaGVhZC5leHRyYV9sZW4tYy5sZW5ndGgsYy5oZWFkLmV4dHJhfHwoYy5oZWFkLmV4dHJhPW5ldyBBcnJheShjLmhlYWQuZXh0cmFfbGVuKSkscy5hcnJheVNldChjLmhlYWQuZXh0cmEsZSxnLHEsd2EpKSw1MTImYy5mbGFncyYmKGMuY2hlY2s9dShjLmNoZWNrLGUscSxnKSksaS09cSxnKz1xLGMubGVuZ3RoLT1xKSxjLmxlbmd0aCkpYnJlYWsgYTtjLmxlbmd0aD0wLGMubW9kZT1SO2Nhc2UgUjppZigyMDQ4JmMuZmxhZ3Mpe2lmKDA9PT1pKWJyZWFrIGE7cT0wO2RvIHdhPWVbZytxKytdLGMuaGVhZCYmd2EmJmMubGVuZ3RoPDY1NTM2JiYoYy5oZWFkLm5hbWUrPVN0cmluZy5mcm9tQ2hhckNvZGUod2EpKTt3aGlsZSh3YSYmcTxpKTtpZig1MTImYy5mbGFncyYmKGMuY2hlY2s9dShjLmNoZWNrLGUscSxnKSksaS09cSxnKz1xLHdhKWJyZWFrIGF9ZWxzZSBjLmhlYWQmJihjLmhlYWQubmFtZT1udWxsKTtjLmxlbmd0aD0wLGMubW9kZT1TO2Nhc2UgUzppZig0MDk2JmMuZmxhZ3Mpe2lmKDA9PT1pKWJyZWFrIGE7cT0wO2RvIHdhPWVbZytxKytdLGMuaGVhZCYmd2EmJmMubGVuZ3RoPDY1NTM2JiYoYy5oZWFkLmNvbW1lbnQrPVN0cmluZy5mcm9tQ2hhckNvZGUod2EpKTt3aGlsZSh3YSYmcTxpKTtpZig1MTImYy5mbGFncyYmKGMuY2hlY2s9dShjLmNoZWNrLGUscSxnKSksaS09cSxnKz1xLHdhKWJyZWFrIGF9ZWxzZSBjLmhlYWQmJihjLmhlYWQuY29tbWVudD1udWxsKTtjLm1vZGU9VDtjYXNlIFQ6aWYoNTEyJmMuZmxhZ3Mpe2Zvcig7bjwxNjspe2lmKDA9PT1pKWJyZWFrIGE7aS0tLG0rPWVbZysrXTw8bixuKz04fWlmKG0hPT0oNjU1MzUmYy5jaGVjaykpe2EubXNnPSJoZWFkZXIgY3JjIG1pc21hdGNoIixjLm1vZGU9bWE7YnJlYWt9bT0wLG49MH1jLmhlYWQmJihjLmhlYWQuaGNyYz1jLmZsYWdzPj45JjEsYy5oZWFkLmRvbmU9ITApLGEuYWRsZXI9Yy5jaGVjaz0wLGMubW9kZT1XO2JyZWFrO2Nhc2UgVTpmb3IoO248MzI7KXtpZigwPT09aSlicmVhayBhO2ktLSxtKz1lW2crK108PG4sbis9OH1hLmFkbGVyPWMuY2hlY2s9ZChtKSxtPTAsbj0wLGMubW9kZT1WO2Nhc2UgVjppZigwPT09Yy5oYXZlZGljdClyZXR1cm4gYS5uZXh0X291dD1oLGEuYXZhaWxfb3V0PWosYS5uZXh0X2luPWcsYS5hdmFpbF9pbj1pLGMuaG9sZD1tLGMuYml0cz1uLEY7YS5hZGxlcj1jLmNoZWNrPTEsYy5tb2RlPVc7Y2FzZSBXOmlmKGI9PT1CfHxiPT09QylicmVhayBhO2Nhc2UgWDppZihjLmxhc3Qpe20+Pj49NyZuLG4tPTcmbixjLm1vZGU9amE7YnJlYWt9Zm9yKDtuPDM7KXtpZigwPT09aSlicmVhayBhO2ktLSxtKz1lW2crK108PG4sbis9OH1zd2l0Y2goYy5sYXN0PTEmbSxtPj4+PTEsbi09MSwzJm0pe2Nhc2UgMDpjLm1vZGU9WTticmVhaztjYXNlIDE6aWYoayhjKSxjLm1vZGU9Y2EsYj09PUMpe20+Pj49MixuLT0yO2JyZWFrIGF9YnJlYWs7Y2FzZSAyOmMubW9kZT1fO2JyZWFrO2Nhc2UgMzphLm1zZz0iaW52YWxpZCBibG9jayB0eXBlIixjLm1vZGU9bWF9bT4+Pj0yLG4tPTI7YnJlYWs7Y2FzZSBZOmZvcihtPj4+PTcmbixuLT03Jm47bjwzMjspe2lmKDA9PT1pKWJyZWFrIGE7aS0tLG0rPWVbZysrXTw8bixuKz04fWlmKCg2NTUzNSZtKSE9PShtPj4+MTZeNjU1MzUpKXthLm1zZz0iaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyIsYy5tb2RlPW1hO2JyZWFrfWlmKGMubGVuZ3RoPTY1NTM1Jm0sbT0wLG49MCxjLm1vZGU9WixiPT09QylicmVhayBhO2Nhc2UgWjpjLm1vZGU9JDtjYXNlICQ6aWYocT1jLmxlbmd0aCl7aWYocT5pJiYocT1pKSxxPmomJihxPWopLDA9PT1xKWJyZWFrIGE7cy5hcnJheVNldChmLGUsZyxxLGgpLGktPXEsZys9cSxqLT1xLGgrPXEsYy5sZW5ndGgtPXE7YnJlYWt9Yy5tb2RlPVc7YnJlYWs7Y2FzZSBfOmZvcig7bjwxNDspe2lmKDA9PT1pKWJyZWFrIGE7aS0tLG0rPWVbZysrXTw8bixuKz04fWlmKGMubmxlbj0oMzEmbSkrMjU3LG0+Pj49NSxuLT01LGMubmRpc3Q9KDMxJm0pKzEsbT4+Pj01LG4tPTUsYy5uY29kZT0oMTUmbSkrNCxtPj4+PTQsbi09NCxjLm5sZW4+Mjg2fHxjLm5kaXN0PjMwKXthLm1zZz0idG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiLGMubW9kZT1tYTticmVha31jLmhhdmU9MCxjLm1vZGU9YWE7Y2FzZSBhYTpmb3IoO2MuaGF2ZTxjLm5jb2RlOyl7Zm9yKDtuPDM7KXtpZigwPT09aSlicmVhayBhO2ktLSxtKz1lW2crK108PG4sbis9OH1jLmxlbnNbQ2FbYy5oYXZlKytdXT03Jm0sbT4+Pj0zLG4tPTN9Zm9yKDtjLmhhdmU8MTk7KWMubGVuc1tDYVtjLmhhdmUrK11dPTA7aWYoYy5sZW5jb2RlPWMubGVuZHluLGMubGVuYml0cz03LHlhPXtiaXRzOmMubGVuYml0c30seGE9dyh4LGMubGVucywwLDE5LGMubGVuY29kZSwwLGMud29yayx5YSksYy5sZW5iaXRzPXlhLmJpdHMseGEpe2EubXNnPSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiLGMubW9kZT1tYTticmVha31jLmhhdmU9MCxjLm1vZGU9YmE7Y2FzZSBiYTpmb3IoO2MuaGF2ZTxjLm5sZW4rYy5uZGlzdDspe2Zvcig7QWE9Yy5sZW5jb2RlW20mKDE8PGMubGVuYml0cyktMV0scWE9QWE+Pj4yNCxyYT1BYT4+PjE2JjI1NSxzYT02NTUzNSZBYSwhKHFhPD1uKTspe2lmKDA9PT1pKWJyZWFrIGE7aS0tLG0rPWVbZysrXTw8bixuKz04fWlmKHNhPDE2KW0+Pj49cWEsbi09cWEsYy5sZW5zW2MuaGF2ZSsrXT1zYTtlbHNle2lmKDE2PT09c2Epe2Zvcih6YT1xYSsyO248emE7KXtpZigwPT09aSlicmVhayBhO2ktLSxtKz1lW2crK108PG4sbis9OH1pZihtPj4+PXFhLG4tPXFhLDA9PT1jLmhhdmUpe2EubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IixjLm1vZGU9bWE7YnJlYWt9d2E9Yy5sZW5zW2MuaGF2ZS0xXSxxPTMrKDMmbSksbT4+Pj0yLG4tPTJ9ZWxzZSBpZigxNz09PXNhKXtmb3IoemE9cWErMztuPHphOyl7aWYoMD09PWkpYnJlYWsgYTtpLS0sbSs9ZVtnKytdPDxuLG4rPTh9bT4+Pj1xYSxuLT1xYSx3YT0wLHE9MysoNyZtKSxtPj4+PTMsbi09M31lbHNle2Zvcih6YT1xYSs3O248emE7KXtpZigwPT09aSlicmVhayBhO2ktLSxtKz1lW2crK108PG4sbis9OH1tPj4+PXFhLG4tPXFhLHdhPTAscT0xMSsoMTI3Jm0pLG0+Pj49NyxuLT03fWlmKGMuaGF2ZStxPmMubmxlbitjLm5kaXN0KXthLm1zZz0iaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCIsYy5tb2RlPW1hO2JyZWFrfWZvcig7cS0tOyljLmxlbnNbYy5oYXZlKytdPXdhfX1pZihjLm1vZGU9PT1tYSlicmVhaztpZigwPT09Yy5sZW5zWzI1Nl0pe2EubXNnPSJpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2siLGMubW9kZT1tYTticmVha31pZihjLmxlbmJpdHM9OSx5YT17Yml0czpjLmxlbmJpdHN9LHhhPXcoeSxjLmxlbnMsMCxjLm5sZW4sYy5sZW5jb2RlLDAsYy53b3JrLHlhKSxjLmxlbmJpdHM9eWEuYml0cyx4YSl7YS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCIsYy5tb2RlPW1hO2JyZWFrfWlmKGMuZGlzdGJpdHM9NixjLmRpc3Rjb2RlPWMuZGlzdGR5bix5YT17Yml0czpjLmRpc3RiaXRzfSx4YT13KHosYy5sZW5zLGMubmxlbixjLm5kaXN0LGMuZGlzdGNvZGUsMCxjLndvcmsseWEpLGMuZGlzdGJpdHM9eWEuYml0cyx4YSl7YS5tc2c9ImludmFsaWQgZGlzdGFuY2VzIHNldCIsYy5tb2RlPW1hO2JyZWFrfWlmKGMubW9kZT1jYSxiPT09QylicmVhayBhO2Nhc2UgY2E6Yy5tb2RlPWRhO2Nhc2UgZGE6aWYoaT49NiYmaj49MjU4KXthLm5leHRfb3V0PWgsYS5hdmFpbF9vdXQ9aixhLm5leHRfaW49ZyxhLmF2YWlsX2luPWksYy5ob2xkPW0sYy5iaXRzPW4sdihhLHApLGg9YS5uZXh0X291dCxmPWEub3V0cHV0LGo9YS5hdmFpbF9vdXQsZz1hLm5leHRfaW4sZT1hLmlucHV0LGk9YS5hdmFpbF9pbixtPWMuaG9sZCxuPWMuYml0cyxjLm1vZGU9PT1XJiYoYy5iYWNrPS0xKTticmVha31mb3IoYy5iYWNrPTA7QWE9Yy5sZW5jb2RlW20mKDE8PGMubGVuYml0cyktMV0scWE9QWE+Pj4yNCxyYT1BYT4+PjE2JjI1NSxzYT02NTUzNSZBYSwhKHFhPD1uKTspe2lmKDA9PT1pKWJyZWFrIGE7aS0tLG0rPWVbZysrXTw8bixuKz04fWlmKHJhJiYwPT09KDI0MCZyYSkpe2Zvcih0YT1xYSx1YT1yYSx2YT1zYTtBYT1jLmxlbmNvZGVbdmErKChtJigxPDx0YSt1YSktMSk+PnRhKV0scWE9QWE+Pj4yNCxyYT1BYT4+PjE2JjI1NSxzYT02NTUzNSZBYSwhKHRhK3FhPD1uKTspe2lmKDA9PT1pKWJyZWFrIGE7aS0tLG0rPWVbZysrXTw8bixuKz04fW0+Pj49dGEsbi09dGEsYy5iYWNrKz10YX1pZihtPj4+PXFhLG4tPXFhLGMuYmFjays9cWEsYy5sZW5ndGg9c2EsMD09PXJhKXtjLm1vZGU9aWE7YnJlYWt9aWYoMzImcmEpe2MuYmFjaz0tMSxjLm1vZGU9VzticmVha31pZig2NCZyYSl7YS5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsYy5tb2RlPW1hO2JyZWFrfWMuZXh0cmE9MTUmcmEsYy5tb2RlPWVhO2Nhc2UgZWE6aWYoYy5leHRyYSl7Zm9yKHphPWMuZXh0cmE7bjx6YTspe2lmKDA9PT1pKWJyZWFrIGE7aS0tLG0rPWVbZysrXTw8bixuKz04fWMubGVuZ3RoKz1tJigxPDxjLmV4dHJhKS0xLG0+Pj49Yy5leHRyYSxuLT1jLmV4dHJhLGMuYmFjays9Yy5leHRyYX1jLndhcz1jLmxlbmd0aCxjLm1vZGU9ZmE7Y2FzZSBmYTpmb3IoO0FhPWMuZGlzdGNvZGVbbSYoMTw8Yy5kaXN0Yml0cyktMV0scWE9QWE+Pj4yNCxyYT1BYT4+PjE2JjI1NSxzYT02NTUzNSZBYSwhKHFhPD1uKTspe2lmKDA9PT1pKWJyZWFrIGE7aS0tLG0rPWVbZysrXTw8bixuKz04fWlmKDA9PT0oMjQwJnJhKSl7Zm9yKHRhPXFhLHVhPXJhLHZhPXNhO0FhPWMuZGlzdGNvZGVbdmErKChtJigxPDx0YSt1YSktMSk+PnRhKV0scWE9QWE+Pj4yNCxyYT1BYT4+PjE2JjI1NSxzYT02NTUzNSZBYSwhKHRhK3FhPD1uKTspe2lmKDA9PT1pKWJyZWFrIGE7aS0tLG0rPWVbZysrXTw8bixuKz04fW0+Pj49dGEsbi09dGEsYy5iYWNrKz10YX1pZihtPj4+PXFhLG4tPXFhLGMuYmFjays9cWEsNjQmcmEpe2EubXNnPSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiLGMubW9kZT1tYTticmVha31jLm9mZnNldD1zYSxjLmV4dHJhPTE1JnJhLGMubW9kZT1nYTtjYXNlIGdhOmlmKGMuZXh0cmEpe2Zvcih6YT1jLmV4dHJhO248emE7KXtpZigwPT09aSlicmVhayBhO2ktLSxtKz1lW2crK108PG4sbis9OH1jLm9mZnNldCs9bSYoMTw8Yy5leHRyYSktMSxtPj4+PWMuZXh0cmEsbi09Yy5leHRyYSxjLmJhY2srPWMuZXh0cmF9aWYoYy5vZmZzZXQ+Yy5kbWF4KXthLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLGMubW9kZT1tYTticmVha31jLm1vZGU9aGE7Y2FzZSBoYTppZigwPT09ailicmVhayBhO2lmKHE9cC1qLGMub2Zmc2V0PnEpe2lmKHE9Yy5vZmZzZXQtcSxxPmMud2hhdmUmJmMuc2FuZSl7YS5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixjLm1vZGU9bWE7YnJlYWt9cT5jLnduZXh0PyhxLT1jLnduZXh0LHI9Yy53c2l6ZS1xKTpyPWMud25leHQtcSxxPmMubGVuZ3RoJiYocT1jLmxlbmd0aCkscGE9Yy53aW5kb3d9ZWxzZSBwYT1mLHI9aC1jLm9mZnNldCxxPWMubGVuZ3RoO3E+aiYmKHE9aiksai09cSxjLmxlbmd0aC09cTtkbyBmW2grK109cGFbcisrXTt3aGlsZSgtLXEpOzA9PT1jLmxlbmd0aCYmKGMubW9kZT1kYSk7YnJlYWs7Y2FzZSBpYTppZigwPT09ailicmVhayBhO2ZbaCsrXT1jLmxlbmd0aCxqLS0sYy5tb2RlPWRhO2JyZWFrO2Nhc2UgamE6aWYoYy53cmFwKXtmb3IoO248MzI7KXtpZigwPT09aSlicmVhayBhO2ktLSxtfD1lW2crK108PG4sbis9OH1pZihwLT1qLGEudG90YWxfb3V0Kz1wLGMudG90YWwrPXAscCYmKGEuYWRsZXI9Yy5jaGVjaz1jLmZsYWdzP3UoYy5jaGVjayxmLHAsaC1wKTp0KGMuY2hlY2ssZixwLGgtcCkpLHA9aiwoYy5mbGFncz9tOmQobSkpIT09Yy5jaGVjayl7YS5tc2c9ImluY29ycmVjdCBkYXRhIGNoZWNrIixjLm1vZGU9bWE7YnJlYWt9bT0wLG49MH1jLm1vZGU9a2E7Y2FzZSBrYTppZihjLndyYXAmJmMuZmxhZ3Mpe2Zvcig7bjwzMjspe2lmKDA9PT1pKWJyZWFrIGE7aS0tLG0rPWVbZysrXTw8bixuKz04fWlmKG0hPT0oNDI5NDk2NzI5NSZjLnRvdGFsKSl7YS5tc2c9ImluY29ycmVjdCBsZW5ndGggY2hlY2siLGMubW9kZT1tYTticmVha31tPTAsbj0wfWMubW9kZT1sYTtjYXNlIGxhOnhhPUU7YnJlYWsgYTtjYXNlIG1hOnhhPUg7YnJlYWsgYTtjYXNlIG5hOnJldHVybiBJO2Nhc2Ugb2E6ZGVmYXVsdDpyZXR1cm4gR31yZXR1cm4gYS5uZXh0X291dD1oLGEuYXZhaWxfb3V0PWosYS5uZXh0X2luPWcsYS5hdmFpbF9pbj1pLGMuaG9sZD1tLGMuYml0cz1uLChjLndzaXplfHxwIT09YS5hdmFpbF9vdXQmJmMubW9kZTxtYSYmKGMubW9kZTxqYXx8YiE9PUEpKSYmbChhLGEub3V0cHV0LGEubmV4dF9vdXQscC1hLmF2YWlsX291dCk/KGMubW9kZT1uYSxJKTooby09YS5hdmFpbF9pbixwLT1hLmF2YWlsX291dCxhLnRvdGFsX2luKz1vLGEudG90YWxfb3V0Kz1wLGMudG90YWwrPXAsYy53cmFwJiZwJiYoYS5hZGxlcj1jLmNoZWNrPWMuZmxhZ3M/dShjLmNoZWNrLGYscCxhLm5leHRfb3V0LXApOnQoYy5jaGVjayxmLHAsYS5uZXh0X291dC1wKSksYS5kYXRhX3R5cGU9Yy5iaXRzKyhjLmxhc3Q/NjQ6MCkrKGMubW9kZT09PVc/MTI4OjApKyhjLm1vZGU9PT1jYXx8Yy5tb2RlPT09Wj8yNTY6MCksKDA9PT1vJiYwPT09cHx8Yj09PUEpJiZ4YT09PUQmJih4YT1KKSx4YSl9ZnVuY3Rpb24gbihhKXtpZighYXx8IWEuc3RhdGUpcmV0dXJuIEc7dmFyIGI9YS5zdGF0ZTtyZXR1cm4gYi53aW5kb3cmJihiLndpbmRvdz1udWxsKSxhLnN0YXRlPW51bGwsRH1mdW5jdGlvbiBvKGEsYil7dmFyIGM7cmV0dXJuIGEmJmEuc3RhdGU/KGM9YS5zdGF0ZSwwPT09KDImYy53cmFwKT9HOihjLmhlYWQ9YixiLmRvbmU9ITEsRCkpOkd9ZnVuY3Rpb24gcChhLGIpe3ZhciBjLGQsZSxmPWIubGVuZ3RoO3JldHVybiBhJiZhLnN0YXRlPyhjPWEuc3RhdGUsMCE9PWMud3JhcCYmYy5tb2RlIT09Vj9HOmMubW9kZT09PVYmJihkPTEsZD10KGQsYixmLDApLGQhPT1jLmNoZWNrKT9IOihlPWwoYSxiLGYsZikpPyhjLm1vZGU9bmEsSSk6KGMuaGF2ZWRpY3Q9MSxEKSk6R312YXIgcSxyLHM9YSgiLi4vdXRpbHMvY29tbW9uIiksdD1hKCIuL2FkbGVyMzIiKSx1PWEoIi4vY3JjMzIiKSx2PWEoIi4vaW5mZmFzdCIpLHc9YSgiLi9pbmZ0cmVlcyIpLHg9MCx5PTEsej0yLEE9NCxCPTUsQz02LEQ9MCxFPTEsRj0yLEc9LTIsSD0tMyxJPS00LEo9LTUsSz04LEw9MSxNPTIsTj0zLE89NCxQPTUsUT02LFI9NyxTPTgsVD05LFU9MTAsVj0xMSxXPTEyLFg9MTMsWT0xNCxaPTE1LCQ9MTYsXz0xNyxhYT0xOCxiYT0xOSxjYT0yMCxkYT0yMSxlYT0yMixmYT0yMyxnYT0yNCxoYT0yNSxpYT0yNixqYT0yNyxrYT0yOCxsYT0yOSxtYT0zMCxuYT0zMSxvYT0zMixwYT04NTIscWE9NTkyLHJhPTE1LHNhPXJhLHRhPSEwO2MuaW5mbGF0ZVJlc2V0PWcsYy5pbmZsYXRlUmVzZXQyPWgsYy5pbmZsYXRlUmVzZXRLZWVwPWYsYy5pbmZsYXRlSW5pdD1qLGMuaW5mbGF0ZUluaXQyPWksYy5pbmZsYXRlPW0sYy5pbmZsYXRlRW5kPW4sYy5pbmZsYXRlR2V0SGVhZGVyPW8sYy5pbmZsYXRlU2V0RGljdGlvbmFyeT1wLGMuaW5mbGF0ZUluZm89InBha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCkifSx7Ii4uL3V0aWxzL2NvbW1vbiI6NjIsIi4vYWRsZXIzMiI6NjQsIi4vY3JjMzIiOjY2LCIuL2luZmZhc3QiOjY5LCIuL2luZnRyZWVzIjo3MX1dLDcxOltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO3ZhciBkPWEoIi4uL3V0aWxzL2NvbW1vbiIpLGU9MTUsZj04NTIsZz01OTIsaD0wLGk9MSxqPTIsaz1bMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdLGw9WzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE3LDE3LDE3LDE3LDE4LDE4LDE4LDE4LDE5LDE5LDE5LDE5LDIwLDIwLDIwLDIwLDIxLDIxLDIxLDIxLDE2LDcyLDc4XSxtPVsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzcsMCwwXSxuPVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF07Yi5leHBvcnRzPWZ1bmN0aW9uKGEsYixjLG8scCxxLHIscyl7dmFyIHQsdSx2LHcseCx5LHosQSxCLEM9cy5iaXRzLEQ9MCxFPTAsRj0wLEc9MCxIPTAsST0wLEo9MCxLPTAsTD0wLE09MCxOPW51bGwsTz0wLFA9bmV3IGQuQnVmMTYoZSsxKSxRPW5ldyBkLkJ1ZjE2KGUrMSksUj1udWxsLFM9MDtmb3IoRD0wO0Q8PWU7RCsrKVBbRF09MDtmb3IoRT0wO0U8bztFKyspUFtiW2MrRV1dKys7Zm9yKEg9QyxHPWU7Rz49MSYmMD09PVBbR107Ry0tKTtpZihIPkcmJihIPUcpLDA9PT1HKXJldHVybiBwW3ErK109MjA5NzE1MjAscFtxKytdPTIwOTcxNTIwLHMuYml0cz0xLDA7Zm9yKEY9MTtGPEcmJjA9PT1QW0ZdO0YrKyk7Zm9yKEg8RiYmKEg9RiksSz0xLEQ9MTtEPD1lO0QrKylpZihLPDw9MSxLLT1QW0RdLEs8MClyZXR1cm4tMTtpZihLPjAmJihhPT09aHx8MSE9PUcpKXJldHVybi0xO2ZvcihRWzFdPTAsRD0xO0Q8ZTtEKyspUVtEKzFdPVFbRF0rUFtEXTtmb3IoRT0wO0U8bztFKyspMCE9PWJbYytFXSYmKHJbUVtiW2MrRV1dKytdPUUpO2lmKGE9PT1oPyhOPVI9cix5PTE5KTphPT09aT8oTj1rLE8tPTI1NyxSPWwsUy09MjU3LHk9MjU2KTooTj1tLFI9bix5PS0xKSxNPTAsRT0wLEQ9Rix4PXEsST1ILEo9MCx2PS0xLEw9MTw8SCx3PUwtMSxhPT09aSYmTD5mfHxhPT09aiYmTD5nKXJldHVybiAxO2Zvcig7Oyl7ej1ELUoscltFXTx5PyhBPTAsQj1yW0VdKTpyW0VdPnk/KEE9UltTK3JbRV1dLEI9TltPK3JbRV1dKTooQT05NixCPTApLHQ9MTw8RC1KLHU9MTw8SSxGPXU7ZG8gdS09dCxwW3grKE0+PkopK3VdPXo8PDI0fEE8PDE2fEJ8MDt3aGlsZSgwIT09dSk7Zm9yKHQ9MTw8RC0xO00mdDspdD4+PTE7aWYoMCE9PXQ/KE0mPXQtMSxNKz10KTpNPTAsRSsrLDA9PT0tLVBbRF0pe2lmKEQ9PT1HKWJyZWFrO0Q9YltjK3JbRV1dfWlmKEQ+SCYmKE0mdykhPT12KXtmb3IoMD09PUomJihKPUgpLHgrPUYsST1ELUosSz0xPDxJO0krSjxHJiYoSy09UFtJK0pdLCEoSzw9MCkpOylJKyssSzw8PTE7aWYoTCs9MTw8SSxhPT09aSYmTD5mfHxhPT09aiYmTD5nKXJldHVybiAxO3Y9TSZ3LHBbdl09SDw8MjR8STw8MTZ8eC1xfDB9fXJldHVybiAwIT09TSYmKHBbeCtNXT1ELUo8PDI0fDY0PDwxNnwwKSxzLmJpdHM9SCwwfX0seyIuLi91dGlscy9jb21tb24iOjYyfV0sNzI6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7Yi5leHBvcnRzPXsyOiJuZWVkIGRpY3Rpb25hcnkiLDE6InN0cmVhbSBlbmQiLDA6IiIsIi0xIjoiZmlsZSBlcnJvciIsIi0yIjoic3RyZWFtIGVycm9yIiwiLTMiOiJkYXRhIGVycm9yIiwiLTQiOiJpbnN1ZmZpY2llbnQgbWVtb3J5IiwiLTUiOiJidWZmZXIgZXJyb3IiLCItNiI6ImluY29tcGF0aWJsZSB2ZXJzaW9uIn19LHt9XSw3MzpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEpe2Zvcih2YXIgYj1hLmxlbmd0aDstLWI+PTA7KWFbYl09MH1mdW5jdGlvbiBlKGEsYixjLGQsZSl7dGhpcy5zdGF0aWNfdHJlZT1hLHRoaXMuZXh0cmFfYml0cz1iLHRoaXMuZXh0cmFfYmFzZT1jLHRoaXMuZWxlbXM9ZCx0aGlzLm1heF9sZW5ndGg9ZSx0aGlzLmhhc19zdHJlZT1hJiZhLmxlbmd0aH1mdW5jdGlvbiBmKGEsYil7dGhpcy5keW5fdHJlZT1hLHRoaXMubWF4X2NvZGU9MCx0aGlzLnN0YXRfZGVzYz1ifWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGE8MjU2P2lhW2FdOmlhWzI1NisoYT4+PjcpXX1mdW5jdGlvbiBoKGEsYil7YS5wZW5kaW5nX2J1ZlthLnBlbmRpbmcrK109MjU1JmIsYS5wZW5kaW5nX2J1ZlthLnBlbmRpbmcrK109Yj4+PjgmMjU1fWZ1bmN0aW9uIGkoYSxiLGMpe2EuYmlfdmFsaWQ+WC1jPyhhLmJpX2J1Znw9Yjw8YS5iaV92YWxpZCY2NTUzNSxoKGEsYS5iaV9idWYpLGEuYmlfYnVmPWI+PlgtYS5iaV92YWxpZCxhLmJpX3ZhbGlkKz1jLVgpOihhLmJpX2J1Znw9Yjw8YS5iaV92YWxpZCY2NTUzNSxhLmJpX3ZhbGlkKz1jKX1mdW5jdGlvbiBqKGEsYixjKXtpKGEsY1syKmJdLGNbMipiKzFdKX1mdW5jdGlvbiBrKGEsYil7dmFyIGM9MDtkbyBjfD0xJmEsYT4+Pj0xLGM8PD0xO3doaWxlKC0tYj4wKTtyZXR1cm4gYz4+PjF9ZnVuY3Rpb24gbChhKXsxNj09PWEuYmlfdmFsaWQ/KGgoYSxhLmJpX2J1ZiksYS5iaV9idWY9MCxhLmJpX3ZhbGlkPTApOmEuYmlfdmFsaWQ+PTgmJihhLnBlbmRpbmdfYnVmW2EucGVuZGluZysrXT0yNTUmYS5iaV9idWYsYS5iaV9idWY+Pj04LGEuYmlfdmFsaWQtPTgpfWZ1bmN0aW9uIG0oYSxiKXt2YXIgYyxkLGUsZixnLGgsaT1iLmR5bl90cmVlLGo9Yi5tYXhfY29kZSxrPWIuc3RhdF9kZXNjLnN0YXRpY190cmVlLGw9Yi5zdGF0X2Rlc2MuaGFzX3N0cmVlLG09Yi5zdGF0X2Rlc2MuZXh0cmFfYml0cyxuPWIuc3RhdF9kZXNjLmV4dHJhX2Jhc2Usbz1iLnN0YXRfZGVzYy5tYXhfbGVuZ3RoLHA9MDtmb3IoZj0wO2Y8PVc7ZisrKWEuYmxfY291bnRbZl09MDtmb3IoaVsyKmEuaGVhcFthLmhlYXBfbWF4XSsxXT0wLGM9YS5oZWFwX21heCsxO2M8VjtjKyspZD1hLmhlYXBbY10sZj1pWzIqaVsyKmQrMV0rMV0rMSxmPm8mJihmPW8scCsrKSxpWzIqZCsxXT1mLGQ+anx8KGEuYmxfY291bnRbZl0rKyxnPTAsZD49biYmKGc9bVtkLW5dKSxoPWlbMipkXSxhLm9wdF9sZW4rPWgqKGYrZyksbCYmKGEuc3RhdGljX2xlbis9aCooa1syKmQrMV0rZykpKTtpZigwIT09cCl7ZG97Zm9yKGY9by0xOzA9PT1hLmJsX2NvdW50W2ZdOylmLS07CmEuYmxfY291bnRbZl0tLSxhLmJsX2NvdW50W2YrMV0rPTIsYS5ibF9jb3VudFtvXS0tLHAtPTJ9d2hpbGUocD4wKTtmb3IoZj1vOzAhPT1mO2YtLSlmb3IoZD1hLmJsX2NvdW50W2ZdOzAhPT1kOyllPWEuaGVhcFstLWNdLGU+anx8KGlbMiplKzFdIT09ZiYmKGEub3B0X2xlbis9KGYtaVsyKmUrMV0pKmlbMiplXSxpWzIqZSsxXT1mKSxkLS0pfX1mdW5jdGlvbiBuKGEsYixjKXt2YXIgZCxlLGY9bmV3IEFycmF5KFcrMSksZz0wO2ZvcihkPTE7ZDw9VztkKyspZltkXT1nPWcrY1tkLTFdPDwxO2ZvcihlPTA7ZTw9YjtlKyspe3ZhciBoPWFbMiplKzFdOzAhPT1oJiYoYVsyKmVdPWsoZltoXSsrLGgpKX19ZnVuY3Rpb24gbygpe3ZhciBhLGIsYyxkLGYsZz1uZXcgQXJyYXkoVysxKTtmb3IoYz0wLGQ9MDtkPFEtMTtkKyspZm9yKGthW2RdPWMsYT0wO2E8MTw8YmFbZF07YSsrKWphW2MrK109ZDtmb3IoamFbYy0xXT1kLGY9MCxkPTA7ZDwxNjtkKyspZm9yKGxhW2RdPWYsYT0wO2E8MTw8Y2FbZF07YSsrKWlhW2YrK109ZDtmb3IoZj4+PTc7ZDxUO2QrKylmb3IobGFbZF09Zjw8NyxhPTA7YTwxPDxjYVtkXS03O2ErKylpYVsyNTYrZisrXT1kO2ZvcihiPTA7Yjw9VztiKyspZ1tiXT0wO2ZvcihhPTA7YTw9MTQzOylnYVsyKmErMV09OCxhKyssZ1s4XSsrO2Zvcig7YTw9MjU1OylnYVsyKmErMV09OSxhKyssZ1s5XSsrO2Zvcig7YTw9Mjc5OylnYVsyKmErMV09NyxhKyssZ1s3XSsrO2Zvcig7YTw9Mjg3OylnYVsyKmErMV09OCxhKyssZ1s4XSsrO2ZvcihuKGdhLFMrMSxnKSxhPTA7YTxUO2ErKyloYVsyKmErMV09NSxoYVsyKmFdPWsoYSw1KTttYT1uZXcgZShnYSxiYSxSKzEsUyxXKSxuYT1uZXcgZShoYSxjYSwwLFQsVyksb2E9bmV3IGUobmV3IEFycmF5KDApLGRhLDAsVSxZKX1mdW5jdGlvbiBwKGEpe3ZhciBiO2ZvcihiPTA7YjxTO2IrKylhLmR5bl9sdHJlZVsyKmJdPTA7Zm9yKGI9MDtiPFQ7YisrKWEuZHluX2R0cmVlWzIqYl09MDtmb3IoYj0wO2I8VTtiKyspYS5ibF90cmVlWzIqYl09MDthLmR5bl9sdHJlZVsyKlpdPTEsYS5vcHRfbGVuPWEuc3RhdGljX2xlbj0wLGEubGFzdF9saXQ9YS5tYXRjaGVzPTB9ZnVuY3Rpb24gcShhKXthLmJpX3ZhbGlkPjg/aChhLGEuYmlfYnVmKTphLmJpX3ZhbGlkPjAmJihhLnBlbmRpbmdfYnVmW2EucGVuZGluZysrXT1hLmJpX2J1ZiksYS5iaV9idWY9MCxhLmJpX3ZhbGlkPTB9ZnVuY3Rpb24gcihhLGIsYyxkKXtxKGEpLGQmJihoKGEsYyksaChhLH5jKSksRy5hcnJheVNldChhLnBlbmRpbmdfYnVmLGEud2luZG93LGIsYyxhLnBlbmRpbmcpLGEucGVuZGluZys9Y31mdW5jdGlvbiBzKGEsYixjLGQpe3ZhciBlPTIqYixmPTIqYztyZXR1cm4gYVtlXTxhW2ZdfHxhW2VdPT09YVtmXSYmZFtiXTw9ZFtjXX1mdW5jdGlvbiB0KGEsYixjKXtmb3IodmFyIGQ9YS5oZWFwW2NdLGU9Yzw8MTtlPD1hLmhlYXBfbGVuJiYoZTxhLmhlYXBfbGVuJiZzKGIsYS5oZWFwW2UrMV0sYS5oZWFwW2VdLGEuZGVwdGgpJiZlKyssIXMoYixkLGEuaGVhcFtlXSxhLmRlcHRoKSk7KWEuaGVhcFtjXT1hLmhlYXBbZV0sYz1lLGU8PD0xO2EuaGVhcFtjXT1kfWZ1bmN0aW9uIHUoYSxiLGMpe3ZhciBkLGUsZixoLGs9MDtpZigwIT09YS5sYXN0X2xpdClkbyBkPWEucGVuZGluZ19idWZbYS5kX2J1ZisyKmtdPDw4fGEucGVuZGluZ19idWZbYS5kX2J1ZisyKmsrMV0sZT1hLnBlbmRpbmdfYnVmW2EubF9idWYra10saysrLDA9PT1kP2ooYSxlLGIpOihmPWphW2VdLGooYSxmK1IrMSxiKSxoPWJhW2ZdLDAhPT1oJiYoZS09a2FbZl0saShhLGUsaCkpLGQtLSxmPWcoZCksaihhLGYsYyksaD1jYVtmXSwwIT09aCYmKGQtPWxhW2ZdLGkoYSxkLGgpKSk7d2hpbGUoazxhLmxhc3RfbGl0KTtqKGEsWixiKX1mdW5jdGlvbiB2KGEsYil7dmFyIGMsZCxlLGY9Yi5keW5fdHJlZSxnPWIuc3RhdF9kZXNjLnN0YXRpY190cmVlLGg9Yi5zdGF0X2Rlc2MuaGFzX3N0cmVlLGk9Yi5zdGF0X2Rlc2MuZWxlbXMsaj0tMTtmb3IoYS5oZWFwX2xlbj0wLGEuaGVhcF9tYXg9VixjPTA7YzxpO2MrKykwIT09ZlsyKmNdPyhhLmhlYXBbKythLmhlYXBfbGVuXT1qPWMsYS5kZXB0aFtjXT0wKTpmWzIqYysxXT0wO2Zvcig7YS5oZWFwX2xlbjwyOyllPWEuaGVhcFsrK2EuaGVhcF9sZW5dPWo8Mj8rK2o6MCxmWzIqZV09MSxhLmRlcHRoW2VdPTAsYS5vcHRfbGVuLS0saCYmKGEuc3RhdGljX2xlbi09Z1syKmUrMV0pO2ZvcihiLm1heF9jb2RlPWosYz1hLmhlYXBfbGVuPj4xO2M+PTE7Yy0tKXQoYSxmLGMpO2U9aTtkbyBjPWEuaGVhcFsxXSxhLmhlYXBbMV09YS5oZWFwW2EuaGVhcF9sZW4tLV0sdChhLGYsMSksZD1hLmhlYXBbMV0sYS5oZWFwWy0tYS5oZWFwX21heF09YyxhLmhlYXBbLS1hLmhlYXBfbWF4XT1kLGZbMiplXT1mWzIqY10rZlsyKmRdLGEuZGVwdGhbZV09KGEuZGVwdGhbY10+PWEuZGVwdGhbZF0/YS5kZXB0aFtjXTphLmRlcHRoW2RdKSsxLGZbMipjKzFdPWZbMipkKzFdPWUsYS5oZWFwWzFdPWUrKyx0KGEsZiwxKTt3aGlsZShhLmhlYXBfbGVuPj0yKTthLmhlYXBbLS1hLmhlYXBfbWF4XT1hLmhlYXBbMV0sbShhLGIpLG4oZixqLGEuYmxfY291bnQpfWZ1bmN0aW9uIHcoYSxiLGMpe3ZhciBkLGUsZj0tMSxnPWJbMV0saD0wLGk9NyxqPTQ7Zm9yKDA9PT1nJiYoaT0xMzgsaj0zKSxiWzIqKGMrMSkrMV09NjU1MzUsZD0wO2Q8PWM7ZCsrKWU9ZyxnPWJbMiooZCsxKSsxXSwrK2g8aSYmZT09PWd8fChoPGo/YS5ibF90cmVlWzIqZV0rPWg6MCE9PWU/KGUhPT1mJiZhLmJsX3RyZWVbMiplXSsrLGEuYmxfdHJlZVsyKiRdKyspOmg8PTEwP2EuYmxfdHJlZVsyKl9dKys6YS5ibF90cmVlWzIqYWFdKyssaD0wLGY9ZSwwPT09Zz8oaT0xMzgsaj0zKTplPT09Zz8oaT02LGo9Myk6KGk9NyxqPTQpKX1mdW5jdGlvbiB4KGEsYixjKXt2YXIgZCxlLGY9LTEsZz1iWzFdLGg9MCxrPTcsbD00O2ZvcigwPT09ZyYmKGs9MTM4LGw9MyksZD0wO2Q8PWM7ZCsrKWlmKGU9ZyxnPWJbMiooZCsxKSsxXSwhKCsraDxrJiZlPT09Zykpe2lmKGg8bCl7ZG8gaihhLGUsYS5ibF90cmVlKTt3aGlsZSgwIT09LS1oKX1lbHNlIDAhPT1lPyhlIT09ZiYmKGooYSxlLGEuYmxfdHJlZSksaC0tKSxqKGEsJCxhLmJsX3RyZWUpLGkoYSxoLTMsMikpOmg8PTEwPyhqKGEsXyxhLmJsX3RyZWUpLGkoYSxoLTMsMykpOihqKGEsYWEsYS5ibF90cmVlKSxpKGEsaC0xMSw3KSk7aD0wLGY9ZSwwPT09Zz8oaz0xMzgsbD0zKTplPT09Zz8oaz02LGw9Myk6KGs9NyxsPTQpfX1mdW5jdGlvbiB5KGEpe3ZhciBiO2Zvcih3KGEsYS5keW5fbHRyZWUsYS5sX2Rlc2MubWF4X2NvZGUpLHcoYSxhLmR5bl9kdHJlZSxhLmRfZGVzYy5tYXhfY29kZSksdihhLGEuYmxfZGVzYyksYj1VLTE7Yj49MyYmMD09PWEuYmxfdHJlZVsyKmVhW2JdKzFdO2ItLSk7cmV0dXJuIGEub3B0X2xlbis9MyooYisxKSs1KzUrNCxifWZ1bmN0aW9uIHooYSxiLGMsZCl7dmFyIGU7Zm9yKGkoYSxiLTI1Nyw1KSxpKGEsYy0xLDUpLGkoYSxkLTQsNCksZT0wO2U8ZDtlKyspaShhLGEuYmxfdHJlZVsyKmVhW2VdKzFdLDMpO3goYSxhLmR5bl9sdHJlZSxiLTEpLHgoYSxhLmR5bl9kdHJlZSxjLTEpfWZ1bmN0aW9uIEEoYSl7dmFyIGIsYz00MDkzNjI0NDQ3O2ZvcihiPTA7Yjw9MzE7YisrLGM+Pj49MSlpZigxJmMmJjAhPT1hLmR5bl9sdHJlZVsyKmJdKXJldHVybiBJO2lmKDAhPT1hLmR5bl9sdHJlZVsxOF18fDAhPT1hLmR5bl9sdHJlZVsyMF18fDAhPT1hLmR5bl9sdHJlZVsyNl0pcmV0dXJuIEo7Zm9yKGI9MzI7YjxSO2IrKylpZigwIT09YS5keW5fbHRyZWVbMipiXSlyZXR1cm4gSjtyZXR1cm4gSX1mdW5jdGlvbiBCKGEpe3BhfHwobygpLHBhPSEwKSxhLmxfZGVzYz1uZXcgZihhLmR5bl9sdHJlZSxtYSksYS5kX2Rlc2M9bmV3IGYoYS5keW5fZHRyZWUsbmEpLGEuYmxfZGVzYz1uZXcgZihhLmJsX3RyZWUsb2EpLGEuYmlfYnVmPTAsYS5iaV92YWxpZD0wLHAoYSl9ZnVuY3Rpb24gQyhhLGIsYyxkKXtpKGEsKEw8PDEpKyhkPzE6MCksMykscihhLGIsYywhMCl9ZnVuY3Rpb24gRChhKXtpKGEsTTw8MSwzKSxqKGEsWixnYSksbChhKX1mdW5jdGlvbiBFKGEsYixjLGQpe3ZhciBlLGYsZz0wO2EubGV2ZWw+MD8oYS5zdHJtLmRhdGFfdHlwZT09PUsmJihhLnN0cm0uZGF0YV90eXBlPUEoYSkpLHYoYSxhLmxfZGVzYyksdihhLGEuZF9kZXNjKSxnPXkoYSksZT1hLm9wdF9sZW4rMys3Pj4+MyxmPWEuc3RhdGljX2xlbiszKzc+Pj4zLGY8PWUmJihlPWYpKTplPWY9Yys1LGMrNDw9ZSYmYiE9PS0xP0MoYSxiLGMsZCk6YS5zdHJhdGVneT09PUh8fGY9PT1lPyhpKGEsKE08PDEpKyhkPzE6MCksMyksdShhLGdhLGhhKSk6KGkoYSwoTjw8MSkrKGQ/MTowKSwzKSx6KGEsYS5sX2Rlc2MubWF4X2NvZGUrMSxhLmRfZGVzYy5tYXhfY29kZSsxLGcrMSksdShhLGEuZHluX2x0cmVlLGEuZHluX2R0cmVlKSkscChhKSxkJiZxKGEpfWZ1bmN0aW9uIEYoYSxiLGMpe3JldHVybiBhLnBlbmRpbmdfYnVmW2EuZF9idWYrMiphLmxhc3RfbGl0XT1iPj4+OCYyNTUsYS5wZW5kaW5nX2J1ZlthLmRfYnVmKzIqYS5sYXN0X2xpdCsxXT0yNTUmYixhLnBlbmRpbmdfYnVmW2EubF9idWYrYS5sYXN0X2xpdF09MjU1JmMsYS5sYXN0X2xpdCsrLDA9PT1iP2EuZHluX2x0cmVlWzIqY10rKzooYS5tYXRjaGVzKyssYi0tLGEuZHluX2x0cmVlWzIqKGphW2NdK1IrMSldKyssYS5keW5fZHRyZWVbMipnKGIpXSsrKSxhLmxhc3RfbGl0PT09YS5saXRfYnVmc2l6ZS0xfXZhciBHPWEoIi4uL3V0aWxzL2NvbW1vbiIpLEg9NCxJPTAsSj0xLEs9MixMPTAsTT0xLE49MixPPTMsUD0yNTgsUT0yOSxSPTI1NixTPVIrMStRLFQ9MzAsVT0xOSxWPTIqUysxLFc9MTUsWD0xNixZPTcsWj0yNTYsJD0xNixfPTE3LGFhPTE4LGJhPVswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdLGNhPVswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzXSxkYT1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10sZWE9WzE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTVdLGZhPTUxMixnYT1uZXcgQXJyYXkoMiooUysyKSk7ZChnYSk7dmFyIGhhPW5ldyBBcnJheSgyKlQpO2QoaGEpO3ZhciBpYT1uZXcgQXJyYXkoZmEpO2QoaWEpO3ZhciBqYT1uZXcgQXJyYXkoUC1PKzEpO2QoamEpO3ZhciBrYT1uZXcgQXJyYXkoUSk7ZChrYSk7dmFyIGxhPW5ldyBBcnJheShUKTtkKGxhKTt2YXIgbWEsbmEsb2EscGE9ITE7Yy5fdHJfaW5pdD1CLGMuX3RyX3N0b3JlZF9ibG9jaz1DLGMuX3RyX2ZsdXNoX2Jsb2NrPUUsYy5fdHJfdGFsbHk9RixjLl90cl9hbGlnbj1EfSx7Ii4uL3V0aWxzL2NvbW1vbiI6NjJ9XSw3NDpbZnVuY3Rpb24oYSxiLGMpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKCl7dGhpcy5pbnB1dD1udWxsLHRoaXMubmV4dF9pbj0wLHRoaXMuYXZhaWxfaW49MCx0aGlzLnRvdGFsX2luPTAsdGhpcy5vdXRwdXQ9bnVsbCx0aGlzLm5leHRfb3V0PTAsdGhpcy5hdmFpbF9vdXQ9MCx0aGlzLnRvdGFsX291dD0wLHRoaXMubXNnPSIiLHRoaXMuc3RhdGU9bnVsbCx0aGlzLmRhdGFfdHlwZT0yLHRoaXMuYWRsZXI9MH1iLmV4cG9ydHM9ZH0se31dfSx7fSxbMTBdKSgxMCl9KTs="},{"meta":{"name":"FileSaver.min.js","url":"https://cdn.bootcss.com/FileSaver.js/1.3.2/FileSaver.min.js","ts":1648813512815,"mimetype":"text/javascript"},"source":"LyohIEBzb3VyY2UgaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0ZpbGVTYXZlci5qcy9ibG9iL21hc3Rlci9GaWxlU2F2ZXIuanMgKi8KdmFyIHNhdmVBcz1zYXZlQXN8fGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtpZih0eXBlb2YgZT09PSJ1bmRlZmluZWQifHx0eXBlb2YgbmF2aWdhdG9yIT09InVuZGVmaW5lZCImJi9NU0lFIFsxLTldXC4vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpe3JldHVybn12YXIgdD1lLmRvY3VtZW50LG49ZnVuY3Rpb24oKXtyZXR1cm4gZS5VUkx8fGUud2Via2l0VVJMfHxlfSxyPXQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiYSIpLG89ImRvd25sb2FkImluIHIsaT1mdW5jdGlvbihlKXt2YXIgdD1uZXcgTW91c2VFdmVudCgiY2xpY2siKTtlLmRpc3BhdGNoRXZlbnQodCl9LGE9L2NvbnN0cnVjdG9yL2kudGVzdChlLkhUTUxFbGVtZW50KSxmPS9DcmlPU1wvW1xkXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksdT1mdW5jdGlvbih0KXsoZS5zZXRJbW1lZGlhdGV8fGUuc2V0VGltZW91dCkoZnVuY3Rpb24oKXt0aHJvdyB0fSwwKX0sZD0iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIixzPTFlMyo0MCxjPWZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKCl7aWYodHlwZW9mIGU9PT0ic3RyaW5nIil7bigpLnJldm9rZU9iamVjdFVSTChlKX1lbHNle2UucmVtb3ZlKCl9fTtzZXRUaW1lb3V0KHQscyl9LGw9ZnVuY3Rpb24oZSx0LG4pe3Q9W10uY29uY2F0KHQpO3ZhciByPXQubGVuZ3RoO3doaWxlKHItLSl7dmFyIG89ZVsib24iK3Rbcl1dO2lmKHR5cGVvZiBvPT09ImZ1bmN0aW9uIil7dHJ5e28uY2FsbChlLG58fGUpfWNhdGNoKGkpe3UoaSl9fX19LHA9ZnVuY3Rpb24oZSl7aWYoL15ccyooPzp0ZXh0XC9cUyp8YXBwbGljYXRpb25cL3htbHxcUypcL1xTKlwreG1sKVxzKjsuKmNoYXJzZXRccyo9XHMqdXRmLTgvaS50ZXN0KGUudHlwZSkpe3JldHVybiBuZXcgQmxvYihbU3RyaW5nLmZyb21DaGFyQ29kZSg2NTI3OSksZV0se3R5cGU6ZS50eXBlfSl9cmV0dXJuIGV9LHY9ZnVuY3Rpb24odCx1LHMpe2lmKCFzKXt0PXAodCl9dmFyIHY9dGhpcyx3PXQudHlwZSxtPXc9PT1kLHksaD1mdW5jdGlvbigpe2wodiwid3JpdGVzdGFydCBwcm9ncmVzcyB3cml0ZSB3cml0ZWVuZCIuc3BsaXQoIiAiKSl9LFM9ZnVuY3Rpb24oKXtpZigoZnx8bSYmYSkmJmUuRmlsZVJlYWRlcil7dmFyIHI9bmV3IEZpbGVSZWFkZXI7ci5vbmxvYWRlbmQ9ZnVuY3Rpb24oKXt2YXIgdD1mP3IucmVzdWx0OnIucmVzdWx0LnJlcGxhY2UoL15kYXRhOlteO10qOy8sImRhdGE6YXR0YWNobWVudC9maWxlOyIpO3ZhciBuPWUub3Blbih0LCJfYmxhbmsiKTtpZighbillLmxvY2F0aW9uLmhyZWY9dDt0PXVuZGVmaW5lZDt2LnJlYWR5U3RhdGU9di5ET05FO2goKX07ci5yZWFkQXNEYXRhVVJMKHQpO3YucmVhZHlTdGF0ZT12LklOSVQ7cmV0dXJufWlmKCF5KXt5PW4oKS5jcmVhdGVPYmplY3RVUkwodCl9aWYobSl7ZS5sb2NhdGlvbi5ocmVmPXl9ZWxzZXt2YXIgbz1lLm9wZW4oeSwiX2JsYW5rIik7aWYoIW8pe2UubG9jYXRpb24uaHJlZj15fX12LnJlYWR5U3RhdGU9di5ET05FO2goKTtjKHkpfTt2LnJlYWR5U3RhdGU9di5JTklUO2lmKG8pe3k9bigpLmNyZWF0ZU9iamVjdFVSTCh0KTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5ocmVmPXk7ci5kb3dubG9hZD11O2kocik7aCgpO2MoeSk7di5yZWFkeVN0YXRlPXYuRE9ORX0pO3JldHVybn1TKCl9LHc9di5wcm90b3R5cGUsbT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG5ldyB2KGUsdHx8ZS5uYW1lfHwiZG93bmxvYWQiLG4pfTtpZih0eXBlb2YgbmF2aWdhdG9yIT09InVuZGVmaW5lZCImJm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3Q9dHx8ZS5uYW1lfHwiZG93bmxvYWQiO2lmKCFuKXtlPXAoZSl9cmV0dXJuIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGUsdCl9fXcuYWJvcnQ9ZnVuY3Rpb24oKXt9O3cucmVhZHlTdGF0ZT13LklOSVQ9MDt3LldSSVRJTkc9MTt3LkRPTkU9Mjt3LmVycm9yPXcub253cml0ZXN0YXJ0PXcub25wcm9ncmVzcz13Lm9ud3JpdGU9dy5vbmFib3J0PXcub25lcnJvcj13Lm9ud3JpdGVlbmQ9bnVsbDtyZXR1cm4gbX0odHlwZW9mIHNlbGYhPT0idW5kZWZpbmVkIiYmc2VsZnx8dHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiJiZ3aW5kb3d8fHRoaXMuY29udGVudCk7aWYodHlwZW9mIG1vZHVsZSE9PSJ1bmRlZmluZWQiJiZtb2R1bGUuZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHMuc2F2ZUFzPXNhdmVBc31lbHNlIGlmKHR5cGVvZiBkZWZpbmUhPT0idW5kZWZpbmVkIiYmZGVmaW5lIT09bnVsbCYmZGVmaW5lLmFtZCE9PW51bGwpe2RlZmluZShbXSxmdW5jdGlvbigpe3JldHVybiBzYXZlQXN9KX0="},{"meta":{"name":"gifjs.js","url":"https://greasyfork.org/scripts/2963-gif-js/code/gifjs.js?version=8596","ts":1648813513929,"mimetype":"text/javascript"},"source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIGdpZi5qcwovLyBAbmFtZXNwYWNlICAgaHR0cDovL21maXNoLnR3YmJzLm9yZy8KLy8gQHZlcnNpb24gICAgIDAuMS42Ci8vIEBncmFudCAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKLyoqCiAqIAogKiBJIGRpZG4ndCBjcmVhdGUgdGhpcywganVzdCBtb2RpZmllZCBpdCB0byBhbGxvdyBpdCBydW5uaW5nIGluIHVzZXJzY3JpcHQuCiAqIEF1dGhlciA6IGh0dHBzOi8vZ2l0aHViLmNvbS9qbm9yZGJlcmcvZ2lmLmpzCiAqCiAqLwoKdmFyIEdJRl93b3JrZXJfVVJMID0gKGZ1bmN0aW9uICgpIHsKICAgIHZhciB3b3JrZXJTY3JpcHQgPSAiKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYixkKXtpZih7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEuY2FjaGUsYikpcmV0dXJuIGEuY2FjaGVbYl07dmFyIGU9YS5yZXNvbHZlKGIpO2lmKCFlKXRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlc29sdmUgbW9kdWxlICcrYik7dmFyIGM9e2lkOmIscmVxdWlyZTphLGZpbGVuYW1lOmIsZXhwb3J0czp7fSxsb2FkZWQ6ITEscGFyZW50OmQsY2hpbGRyZW46W119O2QmJmQuY2hpbGRyZW4ucHVzaChjKTt2YXIgZj1iLnNsaWNlKDAsYi5sYXN0SW5kZXhPZignLycpKzEpO3JldHVybiBhLmNhY2hlW2JdPWMuZXhwb3J0cyxlLmNhbGwoYy5leHBvcnRzLGMsYy5leHBvcnRzLGYsYiksYy5sb2FkZWQ9ITAsYS5jYWNoZVtiXT1jLmV4cG9ydHN9YS5tb2R1bGVzPXt9LGEuY2FjaGU9e30sYS5yZXNvbHZlPWZ1bmN0aW9uKGIpe3JldHVybnt9Lmhhc093blByb3BlcnR5LmNhbGwoYS5tb2R1bGVzLGIpP2EubW9kdWxlc1tiXTp2b2lkIDB9LGEuZGVmaW5lPWZ1bmN0aW9uKGIsYyl7YS5tb2R1bGVzW2JdPWN9LGEuZGVmaW5lKCcvZ2lmLndvcmtlci5jb2ZmZWUnLGZ1bmN0aW9uKGQsZSxmLGcpe3ZhciBiLGM7Yj1hKCcvR0lGRW5jb2Rlci5qcycsZCksYz1mdW5jdGlvbihhKXt2YXIgYyxlLGQsZjtyZXR1cm4gYz1uZXcgYihhLndpZHRoLGEuaGVpZ2h0KSxhLmluZGV4PT09MD9jLndyaXRlSGVhZGVyKCk6Yy5maXJzdEZyYW1lPSExLGMuc2V0VHJhbnNwYXJlbnQoYS50cmFuc3BhcmVudCksYy5zZXRSZXBlYXQoYS5yZXBlYXQpLGMuc2V0RGVsYXkoYS5kZWxheSksYy5zZXRRdWFsaXR5KGEucXVhbGl0eSksYy5hZGRGcmFtZShhLmRhdGEpLGEubGFzdCYmYy5maW5pc2goKSxkPWMuc3RyZWFtKCksYS5kYXRhPWQucGFnZXMsYS5jdXJzb3I9ZC5jdXJzb3IsYS5wYWdlU2l6ZT1kLmNvbnN0cnVjdG9yLnBhZ2VTaXplLGEuY2FuVHJhbnNmZXI/KGY9ZnVuY3Rpb24oYyl7Zm9yKHZhciBiPTAsZD1hLmRhdGEubGVuZ3RoO2I8ZDsrK2IpZT1hLmRhdGFbYl0sYy5wdXNoKGUuYnVmZmVyKTtyZXR1cm4gY30uY2FsbCh0aGlzLFtdKSxzZWxmLnBvc3RNZXNzYWdlKGEsZikpOnNlbGYucG9zdE1lc3NhZ2UoYSl9LHNlbGYub25tZXNzYWdlPWZ1bmN0aW9uKGEpe3JldHVybiBjKGEuZGF0YSl9fSksYS5kZWZpbmUoJy9HSUZFbmNvZGVyLmpzJyxmdW5jdGlvbihlLGgsaSxqKXtmdW5jdGlvbiBjKCl7dGhpcy5wYWdlPS0xLHRoaXMucGFnZXM9W10sdGhpcy5uZXdQYWdlKCl9ZnVuY3Rpb24gYihhLGIpe3RoaXMud2lkdGg9fn5hLHRoaXMuaGVpZ2h0PX5+Yix0aGlzLnRyYW5zcGFyZW50PW51bGwsdGhpcy50cmFuc0luZGV4PTAsdGhpcy5yZXBlYXQ9LTEsdGhpcy5kZWxheT0wLHRoaXMuaW1hZ2U9bnVsbCx0aGlzLnBpeGVscz1udWxsLHRoaXMuaW5kZXhlZFBpeGVscz1udWxsLHRoaXMuY29sb3JEZXB0aD1udWxsLHRoaXMuY29sb3JUYWI9bnVsbCx0aGlzLnVzZWRFbnRyeT1uZXcgQXJyYXksdGhpcy5wYWxTaXplPTcsdGhpcy5kaXNwb3NlPS0xLHRoaXMuZmlyc3RGcmFtZT0hMCx0aGlzLnNhbXBsZT0xMCx0aGlzLm91dD1uZXcgY312YXIgZj1hKCcvVHlwZWROZXVRdWFudC5qcycsZSksZz1hKCcvTFpXRW5jb2Rlci5qcycsZSk7Yy5wYWdlU2l6ZT00MDk2LGMuY2hhck1hcD17fTtmb3IodmFyIGQ9MDtkPDI1NjtkKyspYy5jaGFyTWFwW2RdPVN0cmluZy5mcm9tQ2hhckNvZGUoZCk7Yy5wcm90b3R5cGUubmV3UGFnZT1mdW5jdGlvbigpe3RoaXMucGFnZXNbKyt0aGlzLnBhZ2VdPW5ldyBVaW50OEFycmF5KGMucGFnZVNpemUpLHRoaXMuY3Vyc29yPTB9LGMucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXt2YXIgZD0nJztmb3IodmFyIGE9MDthPHRoaXMucGFnZXMubGVuZ3RoO2ErKylmb3IodmFyIGI9MDtiPGMucGFnZVNpemU7YisrKWQrPWMuY2hhck1hcFt0aGlzLnBhZ2VzW2FdW2JdXTtyZXR1cm4gZH0sYy5wcm90b3R5cGUud3JpdGVCeXRlPWZ1bmN0aW9uKGEpe3RoaXMuY3Vyc29yPj1jLnBhZ2VTaXplJiZ0aGlzLm5ld1BhZ2UoKSx0aGlzLnBhZ2VzW3RoaXMucGFnZV1bdGhpcy5jdXJzb3IrK109YX0sYy5wcm90b3R5cGUud3JpdGVVVEZCeXRlcz1mdW5jdGlvbihiKXtmb3IodmFyIGM9Yi5sZW5ndGgsYT0wO2E8YzthKyspdGhpcy53cml0ZUJ5dGUoYi5jaGFyQ29kZUF0KGEpKX0sYy5wcm90b3R5cGUud3JpdGVCeXRlcz1mdW5jdGlvbihiLGQsZSl7Zm9yKHZhciBjPWV8fGIubGVuZ3RoLGE9ZHx8MDthPGM7YSsrKXRoaXMud3JpdGVCeXRlKGJbYV0pfSxiLnByb3RvdHlwZS5zZXREZWxheT1mdW5jdGlvbihhKXt0aGlzLmRlbGF5PU1hdGgucm91bmQoYS8xMCl9LGIucHJvdG90eXBlLnNldEZyYW1lUmF0ZT1mdW5jdGlvbihhKXt0aGlzLmRlbGF5PU1hdGgucm91bmQoMTAwL2EpfSxiLnByb3RvdHlwZS5zZXREaXNwb3NlPWZ1bmN0aW9uKGEpe2E+PTAmJih0aGlzLmRpc3Bvc2U9YSl9LGIucHJvdG90eXBlLnNldFJlcGVhdD1mdW5jdGlvbihhKXt0aGlzLnJlcGVhdD1hfSxiLnByb3RvdHlwZS5zZXRUcmFuc3BhcmVudD1mdW5jdGlvbihhKXt0aGlzLnRyYW5zcGFyZW50PWF9LGIucHJvdG90eXBlLmFkZEZyYW1lPWZ1bmN0aW9uKGEpe3RoaXMuaW1hZ2U9YSx0aGlzLmdldEltYWdlUGl4ZWxzKCksdGhpcy5hbmFseXplUGl4ZWxzKCksdGhpcy5maXJzdEZyYW1lJiYodGhpcy53cml0ZUxTRCgpLHRoaXMud3JpdGVQYWxldHRlKCksdGhpcy5yZXBlYXQ+PTAmJnRoaXMud3JpdGVOZXRzY2FwZUV4dCgpKSx0aGlzLndyaXRlR3JhcGhpY0N0cmxFeHQoKSx0aGlzLndyaXRlSW1hZ2VEZXNjKCksdGhpcy5maXJzdEZyYW1lfHx0aGlzLndyaXRlUGFsZXR0ZSgpLHRoaXMud3JpdGVQaXhlbHMoKSx0aGlzLmZpcnN0RnJhbWU9ITF9LGIucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbigpe3RoaXMub3V0LndyaXRlQnl0ZSg1OSl9LGIucHJvdG90eXBlLnNldFF1YWxpdHk9ZnVuY3Rpb24oYSl7YTwxJiYoYT0xKSx0aGlzLnNhbXBsZT1hfSxiLnByb3RvdHlwZS53cml0ZUhlYWRlcj1mdW5jdGlvbigpe3RoaXMub3V0LndyaXRlVVRGQnl0ZXMoJ0dJRjg5YScpfSxiLnByb3RvdHlwZS5hbmFseXplUGl4ZWxzPWZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5waXhlbHMubGVuZ3RoLGQ9Zy8zO3RoaXMuaW5kZXhlZFBpeGVscz1uZXcgVWludDhBcnJheShkKTt2YXIgYT1uZXcgZih0aGlzLnBpeGVscyx0aGlzLnNhbXBsZSk7YS5idWlsZENvbG9ybWFwKCksdGhpcy5jb2xvclRhYj1hLmdldENvbG9ybWFwKCk7dmFyIGI9MDtmb3IodmFyIGM9MDtjPGQ7YysrKXt2YXIgZT1hLmxvb2t1cFJHQih0aGlzLnBpeGVsc1tiKytdJjI1NSx0aGlzLnBpeGVsc1tiKytdJjI1NSx0aGlzLnBpeGVsc1tiKytdJjI1NSk7dGhpcy51c2VkRW50cnlbZV09ITAsdGhpcy5pbmRleGVkUGl4ZWxzW2NdPWV9dGhpcy5waXhlbHM9bnVsbCx0aGlzLmNvbG9yRGVwdGg9OCx0aGlzLnBhbFNpemU9Nyx0aGlzLnRyYW5zcGFyZW50IT09bnVsbCYmKHRoaXMudHJhbnNJbmRleD10aGlzLmZpbmRDbG9zZXN0KHRoaXMudHJhbnNwYXJlbnQpKX0sYi5wcm90b3R5cGUuZmluZENsb3Nlc3Q9ZnVuY3Rpb24oZSl7aWYodGhpcy5jb2xvclRhYj09PW51bGwpcmV0dXJuLTE7dmFyIGs9KGUmMTY3MTE2ODApPj4xNixsPShlJjY1MjgwKT4+OCxtPWUmMjU1LGM9MCxkPTE2Nzc3MjE2LGo9dGhpcy5jb2xvclRhYi5sZW5ndGg7Zm9yKHZhciBhPTA7YTxqOyl7dmFyIGY9ay0odGhpcy5jb2xvclRhYlthKytdJjI1NSksZz1sLSh0aGlzLmNvbG9yVGFiW2ErK10mMjU1KSxoPW0tKHRoaXMuY29sb3JUYWJbYV0mMjU1KSxpPWYqZitnKmcraCpoLGI9cGFyc2VJbnQoYS8zKTt0aGlzLnVzZWRFbnRyeVtiXSYmaTxkJiYoZD1pLGM9YiksYSsrfXJldHVybiBjfSxiLnByb3RvdHlwZS5nZXRJbWFnZVBpeGVscz1mdW5jdGlvbigpe3ZhciBhPXRoaXMud2lkdGgsZz10aGlzLmhlaWdodDt0aGlzLnBpeGVscz1uZXcgVWludDhBcnJheShhKmcqMyk7dmFyIGI9dGhpcy5pbWFnZSxjPTA7Zm9yKHZhciBkPTA7ZDxnO2QrKylmb3IodmFyIGU9MDtlPGE7ZSsrKXt2YXIgZj1kKmEqNCtlKjQ7dGhpcy5waXhlbHNbYysrXT1iW2ZdLHRoaXMucGl4ZWxzW2MrK109YltmKzFdLHRoaXMucGl4ZWxzW2MrK109YltmKzJdfX0sYi5wcm90b3R5cGUud3JpdGVHcmFwaGljQ3RybEV4dD1mdW5jdGlvbigpe3RoaXMub3V0LndyaXRlQnl0ZSgzMyksdGhpcy5vdXQud3JpdGVCeXRlKDI0OSksdGhpcy5vdXQud3JpdGVCeXRlKDQpO3ZhciBiLGE7dGhpcy50cmFuc3BhcmVudD09PW51bGw/KGI9MCxhPTApOihiPTEsYT0yKSx0aGlzLmRpc3Bvc2U+PTAmJihhPWRpc3Bvc2UmNyksYTw8PTIsdGhpcy5vdXQud3JpdGVCeXRlKDB8YXwwfGIpLHRoaXMud3JpdGVTaG9ydCh0aGlzLmRlbGF5KSx0aGlzLm91dC53cml0ZUJ5dGUodGhpcy50cmFuc0luZGV4KSx0aGlzLm91dC53cml0ZUJ5dGUoMCl9LGIucHJvdG90eXBlLndyaXRlSW1hZ2VEZXNjPWZ1bmN0aW9uKCl7dGhpcy5vdXQud3JpdGVCeXRlKDQ0KSx0aGlzLndyaXRlU2hvcnQoMCksdGhpcy53cml0ZVNob3J0KDApLHRoaXMud3JpdGVTaG9ydCh0aGlzLndpZHRoKSx0aGlzLndyaXRlU2hvcnQodGhpcy5oZWlnaHQpLHRoaXMuZmlyc3RGcmFtZT90aGlzLm91dC53cml0ZUJ5dGUoMCk6dGhpcy5vdXQud3JpdGVCeXRlKDEyOHx0aGlzLnBhbFNpemUpfSxiLnByb3RvdHlwZS53cml0ZUxTRD1mdW5jdGlvbigpe3RoaXMud3JpdGVTaG9ydCh0aGlzLndpZHRoKSx0aGlzLndyaXRlU2hvcnQodGhpcy5oZWlnaHQpLHRoaXMub3V0LndyaXRlQnl0ZSgyNDB8dGhpcy5wYWxTaXplKSx0aGlzLm91dC53cml0ZUJ5dGUoMCksdGhpcy5vdXQud3JpdGVCeXRlKDApfSxiLnByb3RvdHlwZS53cml0ZU5ldHNjYXBlRXh0PWZ1bmN0aW9uKCl7dGhpcy5vdXQud3JpdGVCeXRlKDMzKSx0aGlzLm91dC53cml0ZUJ5dGUoMjU1KSx0aGlzLm91dC53cml0ZUJ5dGUoMTEpLHRoaXMub3V0LndyaXRlVVRGQnl0ZXMoJ05FVFNDQVBFMi4wJyksdGhpcy5vdXQud3JpdGVCeXRlKDMpLHRoaXMub3V0LndyaXRlQnl0ZSgxKSx0aGlzLndyaXRlU2hvcnQodGhpcy5yZXBlYXQpLHRoaXMub3V0LndyaXRlQnl0ZSgwKX0sYi5wcm90b3R5cGUud3JpdGVQYWxldHRlPWZ1bmN0aW9uKCl7dGhpcy5vdXQud3JpdGVCeXRlcyh0aGlzLmNvbG9yVGFiKTt2YXIgYj03NjgtdGhpcy5jb2xvclRhYi5sZW5ndGg7Zm9yKHZhciBhPTA7YTxiO2ErKyl0aGlzLm91dC53cml0ZUJ5dGUoMCl9LGIucHJvdG90eXBlLndyaXRlU2hvcnQ9ZnVuY3Rpb24oYSl7dGhpcy5vdXQud3JpdGVCeXRlKGEmMjU1KSx0aGlzLm91dC53cml0ZUJ5dGUoYT4+OCYyNTUpfSxiLnByb3RvdHlwZS53cml0ZVBpeGVscz1mdW5jdGlvbigpe3ZhciBhPW5ldyBnKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQsdGhpcy5pbmRleGVkUGl4ZWxzLHRoaXMuY29sb3JEZXB0aCk7YS5lbmNvZGUodGhpcy5vdXQpfSxiLnByb3RvdHlwZS5zdHJlYW09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdXR9LGUuZXhwb3J0cz1ifSksYS5kZWZpbmUoJy9MWldFbmNvZGVyLmpzJyxmdW5jdGlvbihlLGcsaCxpKXtmdW5jdGlvbiBmKHksRCxDLEIpe2Z1bmN0aW9uIHcoYSxiKXtyW2YrK109YSxmPj0yNTQmJnQoYil9ZnVuY3Rpb24geChiKXt1KGEpLGs9aSsyLGo9ITAsbChpLGIpfWZ1bmN0aW9uIHUoYil7Zm9yKHZhciBhPTA7YTxiOysrYSloW2FdPS0xfWZ1bmN0aW9uIEEoeixyKXt2YXIgZyx0LGQsZSx5LHcscztmb3IocT16LGo9ITEsbl9iaXRzPXEsbT1wKG5fYml0cyksaT0xPDx6LTEsbz1pKzEsaz1pKzIsZj0wLGU9digpLHM9MCxnPWE7Zzw2NTUzNjtnKj0yKSsrcztzPTgtcyx3PWEsdSh3KSxsKGkscik7YTp3aGlsZSgodD12KCkpIT1jKXtpZihnPSh0PDxiKStlLGQ9dDw8c15lLGhbZF09PT1nKXtlPW5bZF07Y29udGludWV9aWYoaFtkXT49MCl7eT13LWQsZD09PTAmJih5PTEpO2RvIGlmKChkLT15KTwwJiYoZCs9dyksaFtkXT09PWcpe2U9bltkXTtjb250aW51ZSBhfXdoaWxlKGhbZF0+PTApfWwoZSxyKSxlPXQsazwxPDxiPyhuW2RdPWsrKyxoW2RdPWcpOngocil9bChlLHIpLGwobyxyKX1mdW5jdGlvbiB6KGEpe2Eud3JpdGVCeXRlKHMpLHJlbWFpbmluZz15KkQsY3VyUGl4ZWw9MCxBKHMrMSxhKSxhLndyaXRlQnl0ZSgwKX1mdW5jdGlvbiB0KGEpe2Y+MCYmKGEud3JpdGVCeXRlKGYpLGEud3JpdGVCeXRlcyhyLDAsZiksZj0wKX1mdW5jdGlvbiBwKGEpe3JldHVybigxPDxhKS0xfWZ1bmN0aW9uIHYoKXtpZihyZW1haW5pbmc9PT0wKXJldHVybiBjOy0tcmVtYWluaW5nO3ZhciBhPUNbY3VyUGl4ZWwrK107cmV0dXJuIGEmMjU1fWZ1bmN0aW9uIGwoYSxjKXtnJj1kW2VdLGU+MD9nfD1hPDxlOmc9YSxlKz1uX2JpdHM7d2hpbGUoZT49OCl3KGcmMjU1LGMpLGc+Pj04LGUtPTg7aWYoKGs+bXx8aikmJihqPyhtPXAobl9iaXRzPXEpLGo9ITEpOigrK25fYml0cyxuX2JpdHM9PWI/bT0xPDxiOm09cChuX2JpdHMpKSksYT09byl7d2hpbGUoZT4wKXcoZyYyNTUsYyksZz4+PTgsZS09ODt0KGMpfX12YXIgcz1NYXRoLm1heCgyLEIpLHI9bmV3IFVpbnQ4QXJyYXkoMjU2KSxoPW5ldyBJbnQzMkFycmF5KGEpLG49bmV3IEludDMyQXJyYXkoYSksZyxlPTAsZixrPTAsbSxqPSExLHEsaSxvO3RoaXMuZW5jb2RlPXp9dmFyIGM9LTEsYj0xMixhPTUwMDMsZD1bMCwxLDMsNywxNSwzMSw2MywxMjcsMjU1LDUxMSwxMDIzLDIwNDcsNDA5NSw4MTkxLDE2MzgzLDMyNzY3LDY1NTM1XTtlLmV4cG9ydHM9Zn0pLGEuZGVmaW5lKCcvVHlwZWROZXVRdWFudC5qcycsZnVuY3Rpb24oQSxGLEUsRCl7ZnVuY3Rpb24gQyhBLEIpe2Z1bmN0aW9uIEkoKXtvPVtdLHE9bmV3IEludDMyQXJyYXkoMjU2KSx0PW5ldyBJbnQzMkFycmF5KGEpLHk9bmV3IEludDMyQXJyYXkoYSksej1uZXcgSW50MzJBcnJheShhPj4zKTt2YXIgYyxkO2ZvcihjPTA7YzxhO2MrKylkPShjPDxiKzgpL2Esb1tjXT1uZXcgRmxvYXQ2NEFycmF5KFtkLGQsZCwwXSkseVtjXT1lL2EsdFtjXT0wfWZ1bmN0aW9uIEooKXtmb3IodmFyIGM9MDtjPGE7YysrKW9bY11bMF0+Pj1iLG9bY11bMV0+Pj1iLG9bY11bMl0+Pj1iLG9bY11bM109Y31mdW5jdGlvbiBLKGIsYSxjLGUsZil7b1thXVswXS09Yioob1thXVswXS1jKS9kLG9bYV1bMV0tPWIqKG9bYV1bMV0tZSkvZCxvW2FdWzJdLT1iKihvW2FdWzJdLWYpL2R9ZnVuY3Rpb24gTChqLGUsbixsLGspe3ZhciBoPU1hdGguYWJzKGUtaiksaT1NYXRoLm1pbihlK2osYSksZz1lKzEsZj1lLTEsbT0xLGIsZDt3aGlsZShnPGl8fGY+aClkPXpbbSsrXSxnPGkmJihiPW9bZysrXSxiWzBdLT1kKihiWzBdLW4pL2MsYlsxXS09ZCooYlsxXS1sKS9jLGJbMl0tPWQqKGJbMl0taykvYyksZj5oJiYoYj1vW2YtLV0sYlswXS09ZCooYlswXS1uKS9jLGJbMV0tPWQqKGJbMV0tbCkvYyxiWzJdLT1kKihiWzJdLWspL2MpfWZ1bmN0aW9uIEMocCxzLHEpe3ZhciBoPTIxNDc0ODM2NDcsaz1oLGQ9LTEsbT1kLGMsaixlLG4sbDtmb3IoYz0wO2M8YTtjKyspaj1vW2NdLGU9TWF0aC5hYnMoalswXS1wKStNYXRoLmFicyhqWzFdLXMpK01hdGguYWJzKGpbMl0tcSksZTxoJiYoaD1lLGQ9Yyksbj1lLSh0W2NdPj5pLWIpLG48ayYmKGs9bixtPWMpLGw9eVtjXT4+Zyx5W2NdLT1sLHRbY10rPWw8PGY7cmV0dXJuIHlbZF0rPXgsdFtkXS09cixtfWZ1bmN0aW9uIEQoKXt2YXIgZCxiLGUsYyxoLGcsZj0wLGk9MDtmb3IoZD0wO2Q8YTtkKyspe2ZvcihlPW9bZF0saD1kLGc9ZVsxXSxiPWQrMTtiPGE7YisrKWM9b1tiXSxjWzFdPGcmJihoPWIsZz1jWzFdKTtpZihjPW9baF0sZCE9aCYmKGI9Y1swXSxjWzBdPWVbMF0sZVswXT1iLGI9Y1sxXSxjWzFdPWVbMV0sZVsxXT1iLGI9Y1syXSxjWzJdPWVbMl0sZVsyXT1iLGI9Y1szXSxjWzNdPWVbM10sZVszXT1iKSxnIT1mKXtmb3IocVtmXT1pK2Q+PjEsYj1mKzE7YjxnO2IrKylxW2JdPWQ7Zj1nLGk9ZH19Zm9yKHFbZl09aStuPj4xLGI9ZisxO2I8MjU2O2IrKylxW2JdPW59ZnVuY3Rpb24gRShqLGksayl7dmFyIGIsZCxjLGU9MWUzLGg9LTEsZj1xW2ldLGc9Zi0xO3doaWxlKGY8YXx8Zz49MClmPGEmJihkPW9bZl0sYz1kWzFdLWksYz49ZT9mPWE6KGYrKyxjPDAmJihjPS1jKSxiPWRbMF0taixiPDAmJihiPS1iKSxjKz1iLGM8ZSYmKGI9ZFsyXS1rLGI8MCYmKGI9LWIpLGMrPWIsYzxlJiYoZT1jLGg9ZFszXSkpKSksZz49MCYmKGQ9b1tnXSxjPWktZFsxXSxjPj1lP2c9LTE6KGctLSxjPDAmJihjPS1jKSxiPWRbMF0taixiPDAmJihiPS1iKSxjKz1iLGM8ZSYmKGI9ZFsyXS1rLGI8MCYmKGI9LWIpLGMrPWIsYzxlJiYoZT1jLGg9ZFszXSkpKSk7cmV0dXJuIGh9ZnVuY3Rpb24gRigpe3ZhciBjLGY9QS5sZW5ndGgsRD0zMCsoQi0xKS8zLHk9Zi8oMypCKSxxPX5+KHkvdyksbj1kLG89dSxhPW8+Pmg7Zm9yKGE8PTEmJihhPTApLGM9MDtjPGE7YysrKXpbY109biooKGEqYS1jKmMpKm0vKGEqYSkpO3ZhciBpO2Y8cz8oQj0xLGk9Myk6ZiVsIT09MD9pPTMqbDpmJWshPT0wP2k9MyprOmYlcCE9PTA/aT0zKnA6aT0zKmo7dmFyIHIsdCx4LGUsZz0wO2M9MDt3aGlsZShjPHkpaWYocj0oQVtnXSYyNTUpPDxiLHQ9KEFbZysxXSYyNTUpPDxiLHg9KEFbZysyXSYyNTUpPDxiLGU9QyhyLHQseCksSyhuLGUscix0LHgpLGEhPT0wJiZMKGEsZSxyLHQseCksZys9aSxnPj1mJiYoZy09ZiksYysrLHE9PT0wJiYocT0xKSxjJXE9PT0wKWZvcihuLT1uL0Qsby09by92LGE9bz4+aCxhPD0xJiYoYT0wKSxlPTA7ZTxhO2UrKyl6W2VdPW4qKChhKmEtZSplKSptLyhhKmEpKX1mdW5jdGlvbiBHKCl7SSgpLEYoKSxKKCksRCgpfWZ1bmN0aW9uIEgoKXt2YXIgYj1bXSxnPVtdO2Zvcih2YXIgYz0wO2M8YTtjKyspZ1tvW2NdWzNdXT1jO3ZhciBkPTA7Zm9yKHZhciBlPTA7ZTxhO2UrKyl7dmFyIGY9Z1tlXTtiW2QrK109b1tmXVswXSxiW2QrK109b1tmXVsxXSxiW2QrK109b1tmXVsyXX1yZXR1cm4gYn12YXIgbyxxLHQseSx6O3RoaXMuYnVpbGRDb2xvcm1hcD1HLHRoaXMuZ2V0Q29sb3JtYXA9SCx0aGlzLmxvb2t1cFJHQj1FfXZhciB3PTEwMCxhPTI1NixuPWEtMSxiPTQsaT0xNixlPTE8PGksZj0xMCxCPTE8PGYsZz0xMCx4PWU+Pmcscj1lPDxmLWcsej1hPj4zLGg9Nix0PTE8PGgsdT16KnQsdj0zMCxvPTEwLGQ9MTw8byxxPTgsbT0xPDxxLHk9bytxLGM9MTw8eSxsPTQ5OSxrPTQ5MSxwPTQ4NyxqPTUwMyxzPTMqajtBLmV4cG9ydHM9Q30pLGEoJy9naWYud29ya2VyLmNvZmZlZScpfS5jYWxsKHRoaXMsdGhpcykpIjsKICAgIGZ1bmN0aW9uIGdldFVybCAoYmxvYikgewogICAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlQmxvYiAodGV4dCwgTUlNRSkgewogICAgICAgIHZhciBhRmlsZVBhcnRzID0gW3RleHRdOwogICAgICAgIHZhciBvTXlCbG9iID0gbmV3IEJsb2IoYUZpbGVQYXJ0cywge3R5cGUgOiBNSU1FfSk7CiAgICAgICAgcmV0dXJuIG9NeUJsb2I7CiAgICB9CiAgICB2YXIgd29ya2VyVVJMID0gZ2V0VXJsKGNyZWF0ZUJsb2Iod29ya2VyU2NyaXB0LCAnYXBwbGljYXRpb24veC1qYXZhc2NyaXB0JykpOwogICAgcmV0dXJuIHdvcmtlclVSTDsKfSgpKTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixkKXtpZih7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEuY2FjaGUsYikpcmV0dXJuIGEuY2FjaGVbYl07dmFyIGU9YS5yZXNvbHZlKGIpO2lmKCFlKXRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlc29sdmUgbW9kdWxlICcrYik7dmFyIGM9e2lkOmIscmVxdWlyZTphLGZpbGVuYW1lOmIsZXhwb3J0czp7fSxsb2FkZWQ6ITEscGFyZW50OmQsY2hpbGRyZW46W119O2QmJmQuY2hpbGRyZW4ucHVzaChjKTt2YXIgZj1iLnNsaWNlKDAsYi5sYXN0SW5kZXhPZignLycpKzEpO3JldHVybiBhLmNhY2hlW2JdPWMuZXhwb3J0cyxlLmNhbGwoYy5leHBvcnRzLGMsYy5leHBvcnRzLGYsYiksYy5sb2FkZWQ9ITAsYS5jYWNoZVtiXT1jLmV4cG9ydHN9YS5tb2R1bGVzPXt9LGEuY2FjaGU9e30sYS5yZXNvbHZlPWZ1bmN0aW9uKGIpe3JldHVybnt9Lmhhc093blByb3BlcnR5LmNhbGwoYS5tb2R1bGVzLGIpP2EubW9kdWxlc1tiXTp2b2lkIDB9LGEuZGVmaW5lPWZ1bmN0aW9uKGIsYyl7YS5tb2R1bGVzW2JdPWN9O3ZhciBiPWZ1bmN0aW9uKGEpe3JldHVybiBhPScvJyx7dGl0bGU6J2Jyb3dzZXInLHZlcnNpb246J3YwLjEwLjI2Jyxicm93c2VyOiEwLGVudjp7fSxhcmd2OltdLG5leHRUaWNrOmMuc2V0SW1tZWRpYXRlfHxmdW5jdGlvbihhKXtzZXRUaW1lb3V0KGEsMCl9LGN3ZDpmdW5jdGlvbigpe3JldHVybiBhfSxjaGRpcjpmdW5jdGlvbihiKXthPWJ9fX0oKTthLmRlZmluZSgnL2dpZi5jb2ZmZWUnLGZ1bmN0aW9uKGQsbSxsLGspe2Z1bmN0aW9uIGcoYSxiKXtyZXR1cm57fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYil9ZnVuY3Rpb24gaihkLGIpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjOysrYSlpZihhIGluIGImJmJbYV09PT1kKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGkoYSxiKXtmdW5jdGlvbiBkKCl7dGhpcy5jb25zdHJ1Y3Rvcj1hfWZvcih2YXIgYyBpbiBiKWcoYixjKSYmKGFbY109YltjXSk7cmV0dXJuIGQucHJvdG90eXBlPWIucHJvdG90eXBlLGEucHJvdG90eXBlPW5ldyBkLGEuX19zdXBlcl9fPWIucHJvdG90eXBlLGF9dmFyIGgsYyxmLGIsZTtmPWEoJ2V2ZW50cycsZCkuRXZlbnRFbWl0dGVyLGg9YSgnL2Jyb3dzZXIuY29mZmVlJyxkKSxlPWZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGEoZCl7dmFyIGEsYjt0aGlzLnJ1bm5pbmc9ITEsdGhpcy5vcHRpb25zPXt9LHRoaXMuZnJhbWVzPVtdLHRoaXMuZnJlZVdvcmtlcnM9W10sdGhpcy5hY3RpdmVXb3JrZXJzPVtdLHRoaXMuc2V0T3B0aW9ucyhkKTtmb3IoYSBpbiBjKWI9Y1thXSxudWxsIT10aGlzLm9wdGlvbnNbYV0/dGhpcy5vcHRpb25zW2FdOnRoaXMub3B0aW9uc1thXT1ifXJldHVybiBpKGEsZCksYz17d29ya2VyU2NyaXB0OidnaWYud29ya2VyLmpzJyx3b3JrZXJzOjIscmVwZWF0OjAsYmFja2dyb3VuZDonI2ZmZicscXVhbGl0eToxMCx3aWR0aDpudWxsLGhlaWdodDpudWxsLHRyYW5zcGFyZW50Om51bGx9LGI9e2RlbGF5OjUwMCxjb3B5OiExfSxhLnByb3RvdHlwZS5zZXRPcHRpb249ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vcHRpb25zW2FdPWIsbnVsbCE9dGhpcy5fY2FudmFzJiYoYT09PSd3aWR0aCd8fGE9PT0naGVpZ2h0Jyk/dGhpcy5fY2FudmFzW2FdPWI6dm9pZCAwfSxhLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKGIpe3ZhciBhLGM7cmV0dXJuIGZ1bmN0aW9uKGQpe2ZvcihhIGluIGIpe2lmKCFnKGIsYSkpY29udGludWU7Yz1iW2FdLGQucHVzaCh0aGlzLnNldE9wdGlvbihhLGMpKX1yZXR1cm4gZH0uY2FsbCh0aGlzLFtdKX0sYS5wcm90b3R5cGUuYWRkRnJhbWU9ZnVuY3Rpb24oYSxkKXt2YXIgYyxlO251bGw9PWQmJihkPXt9KSxjPXt9LGMudHJhbnNwYXJlbnQ9dGhpcy5vcHRpb25zLnRyYW5zcGFyZW50O2ZvcihlIGluIGIpY1tlXT1kW2VdfHxiW2VdO2lmKG51bGwhPXRoaXMub3B0aW9ucy53aWR0aHx8dGhpcy5zZXRPcHRpb24oJ3dpZHRoJyxhLndpZHRoKSxudWxsIT10aGlzLm9wdGlvbnMuaGVpZ2h0fHx0aGlzLnNldE9wdGlvbignaGVpZ2h0JyxhLmhlaWdodCksJ3VuZGVmaW5lZCchPT10eXBlb2YgSW1hZ2VEYXRhJiZudWxsIT1JbWFnZURhdGEmJmEgaW5zdGFuY2VvZiBJbWFnZURhdGEpYy5kYXRhPWEuZGF0YTtlbHNlIGlmKCd1bmRlZmluZWQnIT09dHlwZW9mIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCYmbnVsbCE9Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEJiZhIGluc3RhbmNlb2YgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfHwndW5kZWZpbmVkJyE9PXR5cGVvZiBXZWJHTFJlbmRlcmluZ0NvbnRleHQmJm51bGwhPVdlYkdMUmVuZGVyaW5nQ29udGV4dCYmYSBpbnN0YW5jZW9mIFdlYkdMUmVuZGVyaW5nQ29udGV4dClkLmNvcHk/Yy5kYXRhPXRoaXMuZ2V0Q29udGV4dERhdGEoYSk6Yy5jb250ZXh0PWE7ZWxzZSBpZihudWxsIT1hLmNoaWxkTm9kZXMpZC5jb3B5P2MuZGF0YT10aGlzLmdldEltYWdlRGF0YShhKTpjLmltYWdlPWE7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW1hZ2UnKTtyZXR1cm4gdGhpcy5mcmFtZXMucHVzaChjKX0sYS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGQsYTtpZih0aGlzLnJ1bm5pbmcpdGhyb3cgbmV3IEVycm9yKCdBbHJlYWR5IHJ1bm5pbmcnKTtpZighKG51bGwhPXRoaXMub3B0aW9ucy53aWR0aCYmbnVsbCE9dGhpcy5vcHRpb25zLmhlaWdodCkpdGhyb3cgbmV3IEVycm9yKCdXaWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgc2V0IHByaW9yIHRvIHJlbmRlcmluZycpO3RoaXMucnVubmluZz0hMCx0aGlzLm5leHRGcmFtZT0wLHRoaXMuZmluaXNoZWRGcmFtZXM9MCx0aGlzLmltYWdlUGFydHM9ZnVuY3Rpb24oYyl7Zm9yKHZhciBiPWZ1bmN0aW9uKCl7dmFyIGI7Yj1bXTtmb3IodmFyIGE9MDswPD10aGlzLmZyYW1lcy5sZW5ndGg/YTx0aGlzLmZyYW1lcy5sZW5ndGg6YT50aGlzLmZyYW1lcy5sZW5ndGg7MDw9dGhpcy5mcmFtZXMubGVuZ3RoPysrYTotLWEpYi5wdXNoKGEpO3JldHVybiBifS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYT0wLGU9Yi5sZW5ndGg7YTxlOysrYSlkPWJbYV0sYy5wdXNoKG51bGwpO3JldHVybiBjfS5jYWxsKHRoaXMsW10pLGE9dGhpcy5zcGF3bldvcmtlcnMoKTtmb3IodmFyIGM9ZnVuY3Rpb24oKXt2YXIgYztjPVtdO2Zvcih2YXIgYj0wOzA8PWE/YjxhOmI+YTswPD1hPysrYjotLWIpYy5wdXNoKGIpO3JldHVybiBjfS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYj0wLGU9Yy5sZW5ndGg7YjxlOysrYilkPWNbYl0sdGhpcy5yZW5kZXJOZXh0RnJhbWUoKTtyZXR1cm4gdGhpcy5lbWl0KCdzdGFydCcpLHRoaXMuZW1pdCgncHJvZ3Jlc3MnLDApfSxhLnByb3RvdHlwZS5hYm9ydD1mdW5jdGlvbigpe3ZhciBhO3doaWxlKCEwKXtpZihhPXRoaXMuYWN0aXZlV29ya2Vycy5zaGlmdCgpLCEobnVsbCE9YSkpYnJlYWs7Y29uc29sZS5sb2coJ2tpbGxpbmcgYWN0aXZlIHdvcmtlcicpLGEudGVybWluYXRlKCl9cmV0dXJuIHRoaXMucnVubmluZz0hMSx0aGlzLmVtaXQoJ2Fib3J0Jyl9LGEucHJvdG90eXBlLnNwYXduV29ya2Vycz1mdW5jdGlvbigpe3ZhciBhO3JldHVybiBhPU1hdGgubWluKHRoaXMub3B0aW9ucy53b3JrZXJzLHRoaXMuZnJhbWVzLmxlbmd0aCksZnVuY3Rpb24oKXt2YXIgYztjPVtdO2Zvcih2YXIgYj10aGlzLmZyZWVXb3JrZXJzLmxlbmd0aDt0aGlzLmZyZWVXb3JrZXJzLmxlbmd0aDw9YT9iPGE6Yj5hO3RoaXMuZnJlZVdvcmtlcnMubGVuZ3RoPD1hPysrYjotLWIpYy5wdXNoKGIpO3JldHVybiBjfS5hcHBseSh0aGlzLGFyZ3VtZW50cykuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYyl7dmFyIGI7cmV0dXJuIGNvbnNvbGUubG9nKCdzcGF3bmluZyB3b3JrZXIgJytjKSxiPW5ldyBXb3JrZXIoYS5vcHRpb25zLndvcmtlclNjcmlwdCksYi5vbm1lc3NhZ2U9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGMpe3JldHVybiBhLmFjdGl2ZVdvcmtlcnMuc3BsaWNlKGEuYWN0aXZlV29ya2Vycy5pbmRleE9mKGIpLDEpLGEuZnJlZVdvcmtlcnMucHVzaChiKSxhLmZyYW1lRmluaXNoZWQoYy5kYXRhKX19KGEpLGEuZnJlZVdvcmtlcnMucHVzaChiKX19KHRoaXMpKSxhfSxhLnByb3RvdHlwZS5mcmFtZUZpbmlzaGVkPWZ1bmN0aW9uKGEpe3JldHVybiBjb25zb2xlLmxvZygnZnJhbWUgJythLmluZGV4KycgZmluaXNoZWQgLSAnK3RoaXMuYWN0aXZlV29ya2Vycy5sZW5ndGgrJyBhY3RpdmUnKSx0aGlzLmZpbmlzaGVkRnJhbWVzKyssdGhpcy5lbWl0KCdwcm9ncmVzcycsdGhpcy5maW5pc2hlZEZyYW1lcy90aGlzLmZyYW1lcy5sZW5ndGgpLHRoaXMuaW1hZ2VQYXJ0c1thLmluZGV4XT1hLGoobnVsbCx0aGlzLmltYWdlUGFydHMpP3RoaXMucmVuZGVyTmV4dEZyYW1lKCk6dGhpcy5maW5pc2hSZW5kZXJpbmcoKX0sYS5wcm90b3R5cGUuZmluaXNoUmVuZGVyaW5nPWZ1bmN0aW9uKCl7dmFyIGUsYSxrLG0sYixkLGg7Yj0wO2Zvcih2YXIgZj0wLGo9dGhpcy5pbWFnZVBhcnRzLmxlbmd0aDtmPGo7KytmKWE9dGhpcy5pbWFnZVBhcnRzW2ZdLGIrPShhLmRhdGEubGVuZ3RoLTEpKmEucGFnZVNpemUrYS5jdXJzb3I7Yis9YS5wYWdlU2l6ZS1hLmN1cnNvcixjb25zb2xlLmxvZygncmVuZGVyaW5nIGZpbmlzaGVkIC0gZmlsZXNpemUgJytNYXRoLnJvdW5kKGIvMWUzKSsna2InKSxlPW5ldyBVaW50OEFycmF5KGIpLGQ9MDtmb3IodmFyIGc9MCxsPXRoaXMuaW1hZ2VQYXJ0cy5sZW5ndGg7ZzxsOysrZyl7YT10aGlzLmltYWdlUGFydHNbZ107Zm9yKHZhciBjPTAsaT1hLmRhdGEubGVuZ3RoO2M8aTsrK2MpaD1hLmRhdGFbY10saz1jLGUuc2V0KGgsZCksaz09PWEuZGF0YS5sZW5ndGgtMT9kKz1hLmN1cnNvcjpkKz1hLnBhZ2VTaXplfXJldHVybiBtPW5ldyBCbG9iKFtlXSx7dHlwZTonaW1hZ2UvZ2lmJ30pLHRoaXMuZW1pdCgnZmluaXNoZWQnLG0sZSl9LGEucHJvdG90eXBlLnJlbmRlck5leHRGcmFtZT1mdW5jdGlvbigpe3ZhciBjLGEsYjtpZih0aGlzLmZyZWVXb3JrZXJzLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCdObyBmcmVlIHdvcmtlcnMnKTtyZXR1cm4gdGhpcy5uZXh0RnJhbWU+PXRoaXMuZnJhbWVzLmxlbmd0aD92b2lkIDA6KGM9dGhpcy5mcmFtZXNbdGhpcy5uZXh0RnJhbWUrK10sYj10aGlzLmZyZWVXb3JrZXJzLnNoaWZ0KCksYT10aGlzLmdldFRhc2soYyksY29uc29sZS5sb2coJ3N0YXJ0aW5nIGZyYW1lICcrKGEuaW5kZXgrMSkrJyBvZiAnK3RoaXMuZnJhbWVzLmxlbmd0aCksdGhpcy5hY3RpdmVXb3JrZXJzLnB1c2goYiksYi5wb3N0TWVzc2FnZShhKSl9LGEucHJvdG90eXBlLmdldENvbnRleHREYXRhPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEltYWdlRGF0YSgwLDAsdGhpcy5vcHRpb25zLndpZHRoLHRoaXMub3B0aW9ucy5oZWlnaHQpLmRhdGF9LGEucHJvdG90eXBlLmdldEltYWdlRGF0YT1mdW5jdGlvbihiKXt2YXIgYTtyZXR1cm4gbnVsbCE9dGhpcy5fY2FudmFzfHwodGhpcy5fY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLHRoaXMuX2NhbnZhcy53aWR0aD10aGlzLm9wdGlvbnMud2lkdGgsdGhpcy5fY2FudmFzLmhlaWdodD10aGlzLm9wdGlvbnMuaGVpZ2h0KSxhPXRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpLGEuc2V0RmlsbD10aGlzLm9wdGlvbnMuYmFja2dyb3VuZCxhLmZpbGxSZWN0KDAsMCx0aGlzLm9wdGlvbnMud2lkdGgsdGhpcy5vcHRpb25zLmhlaWdodCksYS5kcmF3SW1hZ2UoYiwwLDApLHRoaXMuZ2V0Q29udGV4dERhdGEoYSl9LGEucHJvdG90eXBlLmdldFRhc2s9ZnVuY3Rpb24oYSl7dmFyIGMsYjtpZihjPXRoaXMuZnJhbWVzLmluZGV4T2YoYSksYj17aW5kZXg6YyxsYXN0OmM9PT10aGlzLmZyYW1lcy5sZW5ndGgtMSxkZWxheTphLmRlbGF5LHRyYW5zcGFyZW50OmEudHJhbnNwYXJlbnQsd2lkdGg6dGhpcy5vcHRpb25zLndpZHRoLGhlaWdodDp0aGlzLm9wdGlvbnMuaGVpZ2h0LHF1YWxpdHk6dGhpcy5vcHRpb25zLnF1YWxpdHkscmVwZWF0OnRoaXMub3B0aW9ucy5yZXBlYXQsY2FuVHJhbnNmZXI6aC5uYW1lPT09J2Nocm9tZSd9LG51bGwhPWEuZGF0YSliLmRhdGE9YS5kYXRhO2Vsc2UgaWYobnVsbCE9YS5jb250ZXh0KWIuZGF0YT10aGlzLmdldENvbnRleHREYXRhKGEuY29udGV4dCk7ZWxzZSBpZihudWxsIT1hLmltYWdlKWIuZGF0YT10aGlzLmdldEltYWdlRGF0YShhLmltYWdlKTtlbHNlIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmcmFtZScpO3JldHVybiBifSxhfShmKSxkLmV4cG9ydHM9ZX0pLGEuZGVmaW5lKCcvYnJvd3Nlci5jb2ZmZWUnLGZ1bmN0aW9uKGYsZyxoLGkpe3ZhciBhLGQsZSxjLGI7Yz1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksZT1uYXZpZ2F0b3IucGxhdGZvcm0udG9Mb3dlckNhc2UoKSxiPWMubWF0Y2goLyhvcGVyYXxpZXxmaXJlZm94fGNocm9tZXx2ZXJzaW9uKVtcc1wvOl0oW1x3XGRcLl0rKT8uKj8oc2FmYXJpfHZlcnNpb25bXHNcLzpdKFtcd1xkXC5dKyl8JCkvKXx8W251bGwsJ3Vua25vd24nLDBdLGQ9YlsxXT09PSdpZScmJmRvY3VtZW50LmRvY3VtZW50TW9kZSxhPXtuYW1lOmJbMV09PT0ndmVyc2lvbic/YlszXTpiWzFdLHZlcnNpb246ZHx8cGFyc2VGbG9hdChiWzFdPT09J29wZXJhJyYmYls0XT9iWzRdOmJbMl0pLHBsYXRmb3JtOntuYW1lOmMubWF0Y2goL2lwKD86YWR8b2R8aG9uZSkvKT8naW9zJzooYy5tYXRjaCgvKD86d2Vib3N8YW5kcm9pZCkvKXx8ZS5tYXRjaCgvbWFjfHdpbnxsaW51eC8pfHxbJ290aGVyJ10pWzBdfX0sYVthLm5hbWVdPSEwLGFbYS5uYW1lK3BhcnNlSW50KGEudmVyc2lvbiwxMCldPSEwLGEucGxhdGZvcm1bYS5wbGF0Zm9ybS5uYW1lXT0hMCxmLmV4cG9ydHM9YX0pLGEuZGVmaW5lKCdldmVudHMnLGZ1bmN0aW9uKGYsZSxnLGgpe2IuRXZlbnRFbWl0dGVyfHwoYi5FdmVudEVtaXR0ZXI9ZnVuY3Rpb24oKXt9KTt2YXIgYT1lLkV2ZW50RW1pdHRlcj1iLkV2ZW50RW1pdHRlcixjPXR5cGVvZiBBcnJheS5pc0FycmF5PT09J2Z1bmN0aW9uJz9BcnJheS5pc0FycmF5OmZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSk9PT0nW29iamVjdCBBcnJheV0nfSxkPTEwO2EucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbihhKXt0aGlzLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9e30pLHRoaXMuX2V2ZW50cy5tYXhMaXN0ZW5lcnM9YX0sYS5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihmKXtpZihmPT09J2Vycm9yJyYmKCEodGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHMuZXJyb3IpfHxjKHRoaXMuX2V2ZW50cy5lcnJvcikmJiF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSl0aHJvdyBhcmd1bWVudHNbMV1pbnN0YW5jZW9mIEVycm9yP2FyZ3VtZW50c1sxXTpuZXcgRXJyb3IoIlVuY2F1Z2h0LCB1bnNwZWNpZmllZCAnZXJyb3InIGV2ZW50LiIpO2lmKCF0aGlzLl9ldmVudHMpcmV0dXJuITE7dmFyIGE9dGhpcy5fZXZlbnRzW2ZdO2lmKCFhKXJldHVybiExO2lmKCEodHlwZW9mIGE9PSdmdW5jdGlvbicpKWlmKGMoYSkpe3ZhciBiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxlPWEuc2xpY2UoKTtmb3IodmFyIGQ9MCxnPWUubGVuZ3RoO2Q8ZztkKyspZVtkXS5hcHBseSh0aGlzLGIpO3JldHVybiEwfWVsc2UgcmV0dXJuITE7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTphLmNhbGwodGhpcyk7YnJlYWs7Y2FzZSAyOmEuY2FsbCh0aGlzLGFyZ3VtZW50c1sxXSk7YnJlYWs7Y2FzZSAzOmEuY2FsbCh0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pO2JyZWFrO2RlZmF1bHQ6dmFyIGI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2EuYXBwbHkodGhpcyxiKX1yZXR1cm4hMH0sYS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24oYSxiKXtpZignZnVuY3Rpb24nIT09dHlwZW9mIGIpdGhyb3cgbmV3IEVycm9yKCdhZGRMaXN0ZW5lciBvbmx5IHRha2VzIGluc3RhbmNlcyBvZiBGdW5jdGlvbicpO2lmKHRoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSksdGhpcy5lbWl0KCduZXdMaXN0ZW5lcicsYSxiKSwhdGhpcy5fZXZlbnRzW2FdKXRoaXMuX2V2ZW50c1thXT1iO2Vsc2UgaWYoYyh0aGlzLl9ldmVudHNbYV0pKXtpZighdGhpcy5fZXZlbnRzW2FdLndhcm5lZCl7dmFyIGU7dGhpcy5fZXZlbnRzLm1heExpc3RlbmVycyE9PXVuZGVmaW5lZD9lPXRoaXMuX2V2ZW50cy5tYXhMaXN0ZW5lcnM6ZT1kLGUmJmU+MCYmdGhpcy5fZXZlbnRzW2FdLmxlbmd0aD5lJiYodGhpcy5fZXZlbnRzW2FdLndhcm5lZD0hMCxjb25zb2xlLmVycm9yKCcobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LicsdGhpcy5fZXZlbnRzW2FdLmxlbmd0aCksY29uc29sZS50cmFjZSgpKX10aGlzLl9ldmVudHNbYV0ucHVzaChiKX1lbHNlIHRoaXMuX2V2ZW50c1thXT1bdGhpcy5fZXZlbnRzW2FdLGJdO3JldHVybiB0aGlzfSxhLnByb3RvdHlwZS5vbj1hLnByb3RvdHlwZS5hZGRMaXN0ZW5lcixhLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGIsYyl7dmFyIGE9dGhpcztyZXR1cm4gYS5vbihiLGZ1bmN0aW9uIGQoKXthLnJlbW92ZUxpc3RlbmVyKGIsZCksYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSx0aGlzfSxhLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihhLGQpe2lmKCdmdW5jdGlvbichPT10eXBlb2YgZCl0aHJvdyBuZXcgRXJyb3IoJ3JlbW92ZUxpc3RlbmVyIG9ubHkgdGFrZXMgaW5zdGFuY2VzIG9mIEZ1bmN0aW9uJyk7aWYoISh0aGlzLl9ldmVudHMmJnRoaXMuX2V2ZW50c1thXSkpcmV0dXJuIHRoaXM7dmFyIGI9dGhpcy5fZXZlbnRzW2FdO2lmKGMoYikpe3ZhciBlPWIuaW5kZXhPZihkKTtpZihlPDApcmV0dXJuIHRoaXM7Yi5zcGxpY2UoZSwxKSxiLmxlbmd0aD09MCYmZGVsZXRlIHRoaXMuX2V2ZW50c1thXX1lbHNlIHRoaXMuX2V2ZW50c1thXT09PWQmJmRlbGV0ZSB0aGlzLl9ldmVudHNbYV07cmV0dXJuIHRoaXN9LGEucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihhKXtyZXR1cm4gYSYmdGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHNbYV0mJih0aGlzLl9ldmVudHNbYV09bnVsbCksdGhpc30sYS5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9e30pLHRoaXMuX2V2ZW50c1thXXx8KHRoaXMuX2V2ZW50c1thXT1bXSksYyh0aGlzLl9ldmVudHNbYV0pfHwodGhpcy5fZXZlbnRzW2FdPVt0aGlzLl9ldmVudHNbYV1dKSx0aGlzLl9ldmVudHNbYV19fSksYy5HSUY9YSgnL2dpZi5jb2ZmZWUnKX0uY2FsbCh0aGlzLHRoaXMpKQovLyMgc291cmNlTWFwcGluZ1VSTD1naWYuanMubWFwCi8vIGdpZi5qcyAwLjEuNiAtIGh0dHBzOi8vZ2l0aHViLmNvbS9qbm9yZGJlcmcvZ2lmLmpzCgovKioKICogc291cmNlIGFuZCBzb3VyY2UgbWFwIGZyb20gCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qbm9yZGJlcmcvZ2lmLmpzL3RyZWUvbWFzdGVyL2Rpc3QKICov"},{"meta":{"name":"gm4-polyfill-101.js","url":"https://greasyfork.org/scripts/375359-gm4-polyfill-1-0-1/code/gm4-polyfill-101.js?version=652238","ts":1648813513930,"mimetype":"text/javascript"},"source":"LyogZ200LXBvbHlmaWxsLmpzIHYxLjAuMSAqLwoKLy8gPT1Vc2VyTGlicmFyeT09Ci8vIEBwc2V1ZG9IZWFkZXIKLy8gQHZlcnNpb24gICAgIDEuMC4xCi8vIEBuYW1lICAgICAgICBHTTQgUG9seUZpbGwKLy8gPT0vVXNlckxpYnJhcnk9PQoKLyogICBUaGlzIGhlbHBlciBzY3JpcHQgYnJpZGdlcyBiYWNrd2FyZGx5IGNvbXBhdGliaWxpdHkgYmV0d2VlbiB0aGUgR3JlYXNlbW9ua2V5IDQgQVBJcyBhbmQKICAgZXhpc3RpbmcvbGVnYWN5IEFQSXMuICBTYXkgZm9yIGV4YW1wbGUgeW91ciB1c2VyIHNjcmlwdCBpbmNsdWRlcwogICAKICAgLy8gQGdyYW50IEdNX2dldFZhbHVlCiAgIAogICBBbmQgeW91J2QgbGlrZSB0byBiZSBjb21wYXRpYmxlIHdpdGggYm90aCBHcmVhc2Vtb25rZXkgMyBhbmQgR3JlYXNlbW9ua2V5IDQKICAgKGFuZCBmb3IgdGhhdCBtYXR0ZXIgYWxsIHZlcnNpb25zIG9mIFZpb2xlbnRtb25rZXksIFRhbXBlcm1vbmtleSwgYW5kIGFueSBvdGhlcgogICB1c2VyIHNjcmlwdCBlbmdpbmUpLiAgQWRkOgogICAKICAgLy8gQGdyYW50IEdNLmdldFZhbHVlCiAgIC8vIEByZXF1aXJlICAgICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vU2xvYW5lRm94L2NvZGUvbWFzdGVyL2dtNC1wb2x5ZmlsbC5qcwogICAKICAgRWcsIHRoaXMgd2lsbCBkZWZpbmUgR00uZ2V0VmFsdWUgaW4gb2xkZXIgR00gdmVyc2lvbnMsIHNvIHVwZGF0ZWQgY29kZSB3aWxsIGJlIGJhY2t3YXJkIGNvbXBhdGlibGUKICAgdG8gb2xkZXIgR00gdmVyc2lvbnMuICBJdCB3aWxsIG5vdCBkZWZpbmUgR01fZ2V0VmFsdWUgaW4gbmV3ZXIgR00gdmVyc2lvbnMuCiAgIE1pc3NpbmcgZnVuY3Rpb25zIGZyb20gdGhlIG5ldyBHTSBhcGkgYXJlIGFkZGVkLCBoZW5jZSBHTS5yZWdpc3Rlck1lbnVDb21tYW5kIGFuZCBHTS5hZGRTdHlsZSBhcmUgZGVmaW5lZC4KCiAgIEluY2x1ZGUgYWJvdmUgYW5kIHJlY29kZSB1c2Vyc2NyaXB0IHRvIHRoZSBuZXcgKEdNLWRvdCkgQVBJcywgd2hpY2ggcmV0dXJuIHByb21pc2VzLiAgSWYgeW91ciBzY3JpcHQKICAgaXMgcnVubmluZyBpbiBhbiBlbmdpbmUgdGhhdCBkb2VzIG5vdCBwcm92aWRlIHRoZSBuZXcgYXN5bmNocm9ub3VzIEFQSXMsIHRoaXMKICAgaGVscGVyIHdpbGwgYWRkIHRoZW0sIGJhc2VkIG9uIHRoZSBvbGQgQVBJcy4KICAgCiAgIElmIHlvdSB1c2UgYGF3YWl0YCBhdCB0aGUgdG9wIGxldmVsLCB5b3UnbGwgbmVlZCB0byB3cmFwIHlvdXIgc2NyaXB0IGluIGFuCiAgIGBhc3luY2AgZnVuY3Rpb24gdG8gYmUgY29tcGF0aWJsZSB3aXRoIGFueSB1c2VyIHNjcmlwdCBlbmdpbmUgYmVzaWRlcwogICBHcmVhc2Vtb25rZXkgNC4KICAgCiAgIHZhciBnVmFsdWU7CiAgIGFzeW5jIGZ1bmN0aW9uIGluaXRfZ2xvYmFscygpIHsgZ1ZhbHVlID0gYXdhaXQgR00uZ2V0VmFsdWUoJ3gnKTsgfQogICBhc3luYyBtYWluKCkgeyBhd2FpdCBpbml0X2dsb2JhbHMoKTsgfQogICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIixtYWluKTsKCiovCiAKaWYgKHR5cGVvZiBHTSA9PSAndW5kZWZpbmVkJykKCWV2YWwoInZhciBHTSA9IHt9OyIpOyAgLy8gRGVmaW5lZCBpbiB0aGUgY2xvc3VyZSBnaXZlbiB3aGVuIGxvYWRlZC9pbmplY3RlZCBwcmV2ZW50cyBpbnRyYS1zY3JpcHQgY2xvYmJlcmluZy4gIEV2YWwgbmVlZGVkIGR1ZSB0byBHTSdzIGRlY2xhcmF0aW9uIGFzIGEgY29uc3QgaW4gc2NvcGUgd3JhcHBlciAuCgoKaWYgKHR5cGVvZiBHTV9hZGRTdHlsZSA9PSAndW5kZWZpbmVkJykgewoJdGhpcy5HTV9hZGRTdHlsZSA9IChhQ3NzKSA9PiB7CgkJJ3VzZSBzdHJpY3QnOwoJCWxldCBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsKCQlpZiAoaGVhZCkgewoJCQlsZXQgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwoJCQlzdHlsZS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9jc3MnKTsKCQkJc3R5bGUudGV4dENvbnRlbnQgPSBhQ3NzOwoJCQloZWFkLmFwcGVuZENoaWxkKHN0eWxlKTsKCQkJcmV0dXJuIHN0eWxlOwoJCX0KCQlyZXR1cm4gbnVsbDsKCX07Cn0KR00uYWRkU3R5bGU9dGhpcy5HTV9hZGRTdHlsZTsKCmlmICh0eXBlb2YgR01fZ2V0UmVzb3VyY2VUZXh0ID09ICd1bmRlZmluZWQnKQoJdGhpcy5HTV9nZXRSZXNvdXJjZVRleHQgPSBhc3luYyBhUmVzb3VyY2VOYW1lID0+CgkoIGF3YWl0IGZldGNoKGF3YWl0IEdNLmdldFJlc291cmNlVXJsKGFSZXNvdXJjZU5hbWUpKSApLnRleHQoKTsgCgppZiAodHlwZW9mIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQ9PSJmdW5jdGlvbiIgJiYgL2lzIG5vdCBzdXBwb3J0ZWRbXl17MCwxMDB9JC8udGVzdChHTV9yZWdpc3Rlck1lbnVDb21tYW5kLnRvU3RyaW5nKCkpKQoJR01fcmVnaXN0ZXJNZW51Q29tbWFuZD11bmRlZmluZWQ7CgpHTS5yZWdpc3Rlck1lbnVDb21tYW5kID0gZnVuY3Rpb24gKGNhcHRpb24sIGNvbW1hbmRGdW5jLCBhY2Nlc3NLZXkpIHsKCWxldCBib2R5PWRvY3VtZW50LmJvZHk7CglpZiAoIWJvZHkpIHRocm93ICJHTSByZWdpc3Rlck1lbnVDb21tYW5kIGFpbnQgZ290IG5vIGJvZHkgaW4gZG9jdW1lbnQsIGNhbGwgYWdhaW4gbGF0ZXIuIjsKCWxldCBjb250ZXh0TWVudSA9IGJvZHkuZ2V0QXR0cmlidXRlKCdjb250ZXh0bWVudScpOwoJbGV0IG1lbnUgPSAoY29udGV4dE1lbnUgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZW51IycgKyBjb250ZXh0TWVudSkgOiBudWxsKTsKCWlmICghbWVudSkgewoJCW1lbnUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdtZW51Jyk7CgkJbWVudS5zZXRBdHRyaWJ1dGUoJ2lkJywgJ2dtLXJlZ2lzdGVyZWQtbWVudScpOwoJCW1lbnUuc2V0QXR0cmlidXRlKCd0eXBlJywgJ2NvbnRleHQnKTsKCQlib2R5Lmluc2VydEJlZm9yZShtZW51LGJvZHkuZmlyc3RDaGlsZCk7CgkJYm9keS5zZXRBdHRyaWJ1dGUoJ2NvbnRleHRtZW51JywgJ2dtLXJlZ2lzdGVyZWQtbWVudScpOwoJfQoJbGV0IG1lbnVJdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbWVudWl0ZW0nKTsKCW1lbnVJdGVtLnNldEF0dHJpYnV0ZSgibGFiZWwiLGNhcHRpb24pOwoJbWVudUl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjb21tYW5kRnVuYywgdHJ1ZSk7CgltZW51LmFwcGVuZENoaWxkKG1lbnVJdGVtKTsKCXJldHVybiBtZW51SXRlbTsgICAgLy8gVGhlIHJlYWwgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCByZXR1cm5zIHVuZGVmaW5lZC4gIEhlcmUgdXNlciBjYW4gY2hhbmdlIGVnLCBsYWJlbCBhdHRyaWJ1dGUgb2YgcmV0dXJuZWQgbWVudUl0ZW0uCn07CgppZiAodHlwZW9mIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQgPT0gJ3VuZGVmaW5lZCcpIHRoaXMuR01fcmVnaXN0ZXJNZW51Q29tbWFuZD1HTS5yZWdpc3Rlck1lbnVDb21tYW5kOwoKT2JqZWN0LmVudHJpZXMoewoJJ2xvZyc6IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksCgknaW5mbyc6IHR5cGVvZiBHTV9pbmZvID09ICJ1bmRlZmluZWQiID8gbnVsbCA6IEdNX2luZm8gCn0pLmZvckVhY2goKFtuZXdLZXksIG9sZF0pID0+IHsKCWlmIChvbGQgJiYgKHR5cGVvZiBHTVtuZXdLZXldID09ICd1bmRlZmluZWQnKSkgewoJCUdNW25ld0tleV0gPSBvbGQ7Cgl9Cn0pOwoKT2JqZWN0LmVudHJpZXMoeyAgICAgICAgICAvLyBPYmplY3QuZW50cmllcygpIHJldHVybnMgYSAyLWQgYXJyYXkgb2YgYWxsIHRoZSBnaXZlbiBvYmplY3QncyBuYW1lIHZhbHVlIHBhaXJzLgoJJ0dNX2FkZFN0eWxlJzogJ2FkZFN0eWxlJywKCSdHTV9kZWxldGVWYWx1ZSc6ICdkZWxldGVWYWx1ZScsCgknR01fZ2V0UmVzb3VyY2VVUkwnOiAnZ2V0UmVzb3VyY2VVcmwnLAoJJ0dNX2dldFZhbHVlJzogJ2dldFZhbHVlJywKCSdHTV9saXN0VmFsdWVzJzogJ2xpc3RWYWx1ZXMnLAoJJ0dNX25vdGlmaWNhdGlvbic6ICdub3RpZmljYXRpb24nLAoJJ0dNX29wZW5JblRhYic6ICdvcGVuSW5UYWInLAoJJ0dNX3JlZ2lzdGVyTWVudUNvbW1hbmQnOiAncmVnaXN0ZXJNZW51Q29tbWFuZCcsCgknR01fc2V0Q2xpcGJvYXJkJzogJ3NldENsaXBib2FyZCcsCgknR01fc2V0VmFsdWUnOiAnc2V0VmFsdWUnLAoJJ0dNX3htbGh0dHBSZXF1ZXN0JzogJ3htbEh0dHBSZXF1ZXN0JywKCSdHTV9nZXRSZXNvdXJjZVRleHQnOiAnZ2V0UmVzb3VyY2VUZXh0Jwp9KS5mb3JFYWNoKChbb2xkS2V5LCBuZXdLZXldKSA9PiB7ICAgICAgICAgLy8gRW5hYmxlcyBlZywgImF3YWl0IEdNLmdldFZhbHVlIiB0byBydW4gb2sgb24gcHJlIEdNNC4gQnV0IG5vdCB2aWNlIHZlcnNhLCBpZSwgaXQgZGVmaW5lcyBubyBHTV9nZXRWYWx1ZSBpbiBuZXdlciBHTS4KCWxldCBvbGQgPSB0aGlzW29sZEtleV07CglpZiAob2xkICYmICh0eXBlb2YgR01bbmV3S2V5XSA9PSAndW5kZWZpbmVkJykpIHsKCQlHTVtuZXdLZXldID0gZnVuY3Rpb24oLi4uYXJncykgewoJCQlyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7IHRyeSB7CgkJCQlyZXNvbHZlKG9sZC5hcHBseSh0aGlzLCBhcmdzKSk7CgkJCX0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9CgkJCQkJCQkJCQkJCQkJIH0pOwoJCX07Ly9HTVtuZXdLZXldPWZ1bmMKCX0KfSk7Ly9mb3JFYWNoKCkKCgo="}]},{"name":"健康驿站自动预约脚本","options":{"check_for_updates":false,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_prototypes":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*://hk.sz.gov.cn:8118/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"tab_types":null,"unwrap":null},"storage":{"ts":1654315152286,"data":{}},"enabled":true,"position":16,"uuid":"6334316c-505f-45e2-989f-29044b13a70b","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDlgaXlurfpqb/nq5noh6rliqjpooTnuqbohJrmnKwKLy8gQG5hbWVzcGFjZSAgICAvLwovLyBAdmVyc2lvbiAgICAgIDEuMAovLyBAZGVzY3JpcHRpb24gIOWBpeW6t+mpv+ermeiHquWKqOmihOe6pgovLyBAYXV0aG9yICAgICAgIFdPT0RZVUFOCi8vIEBtYXRjaCAgICAgICAgKjovL2hrLnN6Lmdvdi5jbjo4MTE4LyoKLy8gQGljb24gICAgICAgICBodHRwczovL3d3dy5nb29nbGUuY29tL3MyL2Zhdmljb25zP3N6PTY0JmRvbWFpbj1zei5nb3YuY24KLy8gQGdyYW50ICAgICAgICBHTV9hZGRTdHlsZQovLyA9PS9Vc2VyU2NyaXB0PT0KKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgLy/lnKjpooTorqLnlYzpnaLoh6rliqjmiafooYzngrnlh7sKICAgIGlmKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkaXZTekFyZWEnKSl7CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI2RpdlN6QXJlYSA+IHNlY3Rpb246bnRoLWNoaWxkKDcpID4gZGl2ID4gZGl2Om50aC1jaGlsZCg0KSA+IGRpdiA+IGEiKS5jbGljaygpOwogICAgfTsKICAgIC8v5Zyo55So5oi355WM6Z2i5Y676Zmk6YCa55+l5bm255Sf5oiQ5oyJ6ZKuCiAgICBpZihkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYV9jYW5Cb29rSG90ZWwgPiBkaXYgPiBkaXYgPiBwJykpewogICAgICAgIC8v5Y676Zmk6YCa55+lCiAgICAgICAgbm90aWNlKCk7CiAgICAgICAgLy/nlJ/miJDmjInpkq4KICAgICAgICBidXR0b25nZXJuYXRlKCk7CiAgICB9Owp9KSgpOwoKZnVuY3Rpb24gY291bnRkb3duKCl7CiAgICAvL+WAkuiuoeaXtuWPguaVsAogICAgdmFyIHRhcmdldGRhdGUgPSBuZXcgRGF0ZShwcm9tcHQoJ+ivt+i+k+WFpeebruagh+aXtumXtCcsJzIwMjItMDYtMjdUMTA6MDA6MDAuMDAwJykpOwogICAgdmFyIG1pbnVzYXJlYSA9IDUwMDsKICAgIC8v5YCS6K6h5pe25omn6KGM5L2TCiAgICBsZXQgaW50ZXJ2YWxJRCA9IHNldEludGVydmFsKCgpPT57CiAgICAgICAgbGV0IG5vd3RpbWUgPSBuZXcgRGF0ZSgpOwogICAgICAgIGlmKCBub3d0aW1lID49IHRhcmdldGRhdGUpewogICAgICAgICAgICBiZWdpbmJvb2soKTsKICAgICAgICAgICAgaWYgKChub3d0aW1lIC0gdGFyZ2V0ZGF0ZSkgPiBtaW51c2FyZWEpewogICAgICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSUQpOwogICAgICAgICAgICB9CiAgICAgICAgfWVsc2UgaWYgKCBub3d0aW1lIDwgdGFyZ2V0ZGF0ZSApewogICAgICAgICAgICAvL2NvbnNvbGUubG9nKG1pbnVzKTsKICAgICAgICAgICAgLy9jbGVhckludGVydmFsKGludGVydmFsSUQpOyAvL+atpOWPpeivt+WIoOmZpAogICAgICAgIH1lbHNlewogICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSUQpOwogICAgICAgIH0KICAgIH0sMTAwKQogICAgfQoKZnVuY3Rpb24gYmVnaW5ib29rKCl7CiAgICB3aW5kb3cubG9jYXRpb249Imh0dHBzOi8vaGsuc3ouZ292LmNuOjgxMTgvcGFzc0luZm8vZGV0YWlsIgogICAgLy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYV9jYW5Cb29rSG90ZWwnKS5jbGljaygpOwp9CgpmdW5jdGlvbiBub3RpY2UoKXsKICAgIHZhciBPcmRlck5vdGljZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN3aW5PcmRlck5vdGljZSA+IGRpdiA+IGRpdiA+IGJ1dHRvbicpOwogICAgaWYgKE9yZGVyTm90aWNlKXtPcmRlck5vdGljZS5jbGljaygpO30KfQoKZnVuY3Rpb24gYnV0dG9uZ2VybmF0ZSgpewogICAgLy9DU1Poh6rlrprkuYnmjInpkq7moLflvI/ooagKICAgIEdNX2FkZFN0eWxlKCcuZmxvYXQtYnV0dG9ue2JhY2tncm91bmQ6ICNlYjk0ZDA7cG9zaXRpb246IGZpeGVkOyBib3JkZXItcmFkaXVzOiAyOHB4O3RleHQtc2hhZG93OiAzcHggMnB4IDFweCAjYTBhMWE3O2JveC1zaGFkb3c6IDZweCA1cHggMjRweCAjNjY2NjY2O2NvbG9yOiAjZmFmYWZhO2ZvbnQtc2l6ZTogMjdweDtwYWRkaW5nOiAxOXB4O3RleHQtZGVjb3JhdGlvbjogbm9uZTtoZWlnaHQ6IDQwcHg7d2lkdGg6IDExMHB4O2JvdHRvbTogOTBweDtyaWdodDogNTBweDt9Jyk7CiAgICB2YXIgcnVuYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBydW5idXR0b24uaW5uZXJIVE1MID0gJ+W8gOWni+mihOWumic7CiAgICBydW5idXR0b24uc2V0QXR0cmlidXRlKCdjbGFzcycsJ2Zsb2F0LWJ1dHRvbicpOwogICAgcnVuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixjb3VudGRvd24pOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChydW5idXR0b24pOwp9CgoKCi8qIGZ1bmN0aW9uIGNvdW50ZG93bigpewogICAgLy/lgJLorqHml7blj4LmlbAKICAgIHZhciB0YXJnZXRkYXRlID0gbmV3IERhdGUocHJvbXB0KCfor7fovpPlhaXnm67moIfml7bpl7QnLCcyMDIyLTA2LTI2VDEwOjAwOjAwLjAwMScpKTsKICAgIHZhciBtaW51c2FyZWEgPSA1MDA7CiAgICAvL+WAkuiuoeaXtuaJp+ihjOS9kwogICAgbGV0IGludGVydmFsSUQgPSBzZXRJbnRlcnZhbCgoKT0+ewogICAgICAgIGxldCBub3d0aW1lID0gbmV3IERhdGUoKTsKICAgICAgICBsZXQgbWludXMgPSB0YXJnZXRkYXRlIC0gbm93dGltZTsKICAgICAgICBpZiggMCA+PSBtaW51cyAmJiBtaW51cyA+PSAtbWludXNhcmVhICl7CiAgICAgICAgICAgIGJlZ2luYm9vaygpOwogICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSUQpOwogICAgICAgIH1lbHNlIGlmICggbWludXMgPiAwICl7CiAgICAgICAgICAgIC8vY29uc29sZS5sb2cobWludXMpOwogICAgICAgICAgICAvL2NsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJRCk7IC8v5q2k5Y+l6K+35Yig6ZmkCiAgICAgICAgfWVsc2UgaWYgKCBtaW51cyA8IC1taW51c2FyZWEgKXsKICAgICAgICAgICAgYWxlcnQoJ+i2heaXtu+8jOivt+etieaYjuWkqe+8gScpOwogICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSUQpOwogICAgICAgIH1lbHNlewogICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSUQpOwogICAgICAgIH0KICAgIH0sMTUwKQogICAgfSAqLwoKLyogZnVuY3Rpb24gYm9vaygpewogICAgdmFyIGJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdidXR0b24nKTsKICAgIGJ1dHRvbnNbYnV0dG9ucy5sZW5ndGgtMV0uY2xpY2soKTsKICAgIGJ1dHRvbnNbYnV0dG9ucy5sZW5ndGgtMV0uaW5uZXJIVE1MID0gJ+eCueWHu+WujOaIkCc7CiAgICAvL2FsZXJ0KCfmiafooYzlrozmiJAnKTsKfSAqLwoKCgoKCgo="},{"name":"载入航天办公室图像下载通知去除","options":{"check_for_updates":false,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_prototypes":false,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["http://www.cmse.gov.cn/dmt/tj/tkyxz/*"],"orig_noframes":null,"orig_run_at":"document-idle","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"tab_types":null,"unwrap":null},"storage":{"ts":1654960809496,"data":{}},"enabled":true,"position":17,"uuid":"53af3158-3ac2-4f40-8a1b-feae6004f4e1","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDovb3lhaXoiKrlpKnlip7lhazlrqTlm77lg4/kuIvovb3pgJrnn6XljrvpmaQKLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vdGFtcGVybW9ua2V5Lm5ldC8KLy8gQHZlcnNpb24gICAgICAwLjEKLy8gQGRlc2NyaXB0aW9uICB0cnkgdG8gdGFrZSBvdmVyIHRoZSB3b3JsZCEKLy8gQGF1dGhvciAgICAgICBZb3UKLy8gQG1hdGNoICAgICAgICBodHRwOi8vd3d3LmNtc2UuZ292LmNuL2RtdC90ai90a3l4ei8qCi8vIEBpY29uICAgICAgICAgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zMi9mYXZpY29ucz9zej02NCZkb21haW49Y21zZS5nb3YuY24KLy8gQGdyYW50ICAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKCihmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIGNvdW50ZG93biA9ICgpPT57CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib2siKS5pbm5lckhUTUw9J+WQjOaEjyc7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib2siKS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9ICIjZmZmIjsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvayIpLnJlbW92ZUF0dHJpYnV0ZSgiZGlzYWJsZWQiKTsKfQp9KSgpOw=="},{"name":"蓝奏云网盘增强","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":[],"orig_excludes":[],"orig_includes":[],"orig_matches":["*://lanzou.com/u","*://www.lanzou.com/u","*://www.lanzou.com/account.php*","*://up.woozooo.com/u","*://up.woozooo.com/mydisk.php*","*://pc.woozooo.com/u","*://pc.woozooo.com/mydisk.php*","*://pan.lanzou.com/*","*://*.lanzoub.com/*","*://*.lanzoue.com/*","*://*.lanzouf.com/*","*://*.lanzouh.com/*","*://*.lanzoui.com/*","*://*.lanzouj.com/*","*://*.lanzoul.com/*","*://*.lanzoum.com/*","*://*.lanzouo.com/*","*://*.lanzoup.com/*","*://*.lanzouq.com/*","*://*.lanzout.com/*","*://*.lanzouu.com/*","*://*.lanzouv.com/*","*://*.lanzouw.com/*","*://*.lanzoux.com/*","*://*.lanzouy.com/*"],"orig_noframes":true,"orig_run_at":"document-end","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"sandbox":"JavaScript","tab_types":null,"unwrap":null},"storage":{"ts":1661184632074,"data":{"menu_copy_fileSha":"btrue","menu_customFileSha":"s","menu_directDownload":"btrue","menu_fileSort":"btrue","menu_folderDescdesMenu":"btrue","menu_open_fileSha":"btrue","menu_refreshCorrection":"btrue","menu_rightClickMenu":"btrue"}},"enabled":true,"position":18,"file_url":"https://greasyfork.org/scripts/419224-%E8%93%9D%E5%A5%8F%E4%BA%91%E7%BD%91%E7%9B%98%E5%A2%9E%E5%BC%BA/code/%E8%93%9D%E5%A5%8F%E4%BA%91%E7%BD%91%E7%9B%98%E5%A2%9E%E5%BC%BA.user.js","uuid":"7b173e0d-2066-4cb3-b311-b47e9f7f18fa","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICDok53lpY/kupHnvZHnm5jlop7lvLoKLy8gQHZlcnNpb24gICAgICAxLjUuMAovLyBAYXV0aG9yICAgICAgIFguSS5VCi8vIEBkZXNjcmlwdGlvbiAg5paH5Lu25o6S5bqP44CB5Yi35paw5LiN5Zue5qC555uu5b2V44CB5b+r5o236L+U5Zue5LiK5LiA57qn77yI5Y+z6ZSu572R6aG156m655m95aSE77yJ44CB5ZCO6YCA6L+U5Zue5LiK5LiA57qn44CB5Y+z6ZSu5paH5Lu25pi+56S66I+c5Y2V44CB54K55Ye755u05o6l5LiL6L295paH5Lu244CB54K55Ye756m655m96L+b5YWl55uu5b2V44CB6Ieq5Yqo5pi+56S65pu05aSa5paH5Lu244CB5LiA6ZSu5aSN5Yi25omA5pyJ5YiG5Lqr6ZO+5o6l44CB6Ieq5a6a5LmJ5YiG5Lqr6ZO+5o6l5Z+f5ZCN44CB6Ieq5Yqo5omT5byAL+WkjeWItuWIhuS6q+mTvuaOpeOAgeW4puWvhueggeeahOWIhuS6q+mTvuaOpeiHquWKqOi+k+WvhueggeOAgeaLluWFpeaWh+S7tuiHquWKqOaYvuekuuS4iuS8oOahhuOAgei+k+WFpeWvhueggeWQjuWbnui9puehruiupOOAgeiwg+aVtOaPj+i/sO+8iOivneivtO+8iee8lui+keahhuWIneWni+Wkp+WwjwovLyBAbWF0Y2ggICAgICAgICo6Ly9sYW56b3UuY29tL3UKLy8gQG1hdGNoICAgICAgICAqOi8vd3d3LmxhbnpvdS5jb20vdQovLyBAbWF0Y2ggICAgICAgICo6Ly93d3cubGFuem91LmNvbS9hY2NvdW50LnBocCoKLy8gQG1hdGNoICAgICAgICAqOi8vdXAud29vem9vby5jb20vdQovLyBAbWF0Y2ggICAgICAgICo6Ly91cC53b296b29vLmNvbS9teWRpc2sucGhwKgovLyBAbWF0Y2ggICAgICAgICo6Ly9wYy53b296b29vLmNvbS91Ci8vIEBtYXRjaCAgICAgICAgKjovL3BjLndvb3pvb28uY29tL215ZGlzay5waHAqCi8vIEBtYXRjaCAgICAgICAgKjovL3Bhbi5sYW56b3UuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5sYW56b3ViLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoubGFuem91ZS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmxhbnpvdWYuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5sYW56b3VoLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoubGFuem91aS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmxhbnpvdWouY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5sYW56b3VsLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoubGFuem91bS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmxhbnpvdW8uY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5sYW56b3VwLmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoubGFuem91cS5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmxhbnpvdXQuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5sYW56b3V1LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoubGFuem91di5jb20vKgovLyBAbWF0Y2ggICAgICAgICo6Ly8qLmxhbnpvdXcuY29tLyoKLy8gQG1hdGNoICAgICAgICAqOi8vKi5sYW56b3V4LmNvbS8qCi8vIEBtYXRjaCAgICAgICAgKjovLyoubGFuem91eS5jb20vKgovLyBAaWNvbiAgICAgICAgIGh0dHBzOi8vd3d3LmxhbnpvdS5jb20vZmF2aWNvbi5pY28KLy8gQGdyYW50ICAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAZ3JhbnQgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGdyYW50ICAgICAgICBHTV91bnJlZ2lzdGVyTWVudUNvbW1hbmQKLy8gQGdyYW50ICAgICAgICBHTV9vcGVuSW5UYWIKLy8gQGdyYW50ICAgICAgICBHTV9nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICAgICAgR01fbm90aWZpY2F0aW9uCi8vIEBncmFudCAgICAgICAgR01fc2V0Q2xpcGJvYXJkCi8vIEBncmFudCAgICAgICAgdW5zYWZlV2luZG93Ci8vIEBzYW5kYm94ICAgICAgSmF2YVNjcmlwdAovLyBAbm9mcmFtZXMKLy8gQGxpY2Vuc2UgICAgICBHUEwtMy4wIExpY2Vuc2UKLy8gQHJ1bi1hdCAgICAgICBkb2N1bWVudC1lbmQKLy8gQG5hbWVzcGFjZSAgICBodHRwczovL2dpdGh1Yi5jb20vWElVMi9Vc2VyU2NyaXB0Ci8vIEBzdXBwb3J0VVJMICAgaHR0cHM6Ly9naXRodWIuY29tL1hJVTIvVXNlclNjcmlwdAovLyBAaG9tZXBhZ2VVUkwgIGh0dHBzOi8vZ2l0aHViLmNvbS9YSVUyL1VzZXJTY3JpcHQKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CiAgICB2YXIgbWVudV9BTEwgPSBbCiAgICAgICAgWydtZW51X2N1c3RvbUZpbGVTaGEnLCAn6Ieq5a6a5LmJ5YiG5Lqr6ZO+5o6l5Z+f5ZCNJywgJ+iHquWumuS5ieWIhuS6q+mTvuaOpeWfn+WQjScsICcnXSwKICAgICAgICBbJ21lbnVfb3Blbl9maWxlU2hhJywgJ+iHquWKqOaJk+W8gOWIhuS6q+mTvuaOpScsICfoh6rliqjmiZPlvIDliIbkuqvpk77mjqUnLCB0cnVlXSwKICAgICAgICBbJ21lbnVfY29weV9maWxlU2hhJywgJ+iHquWKqOWkjeWItuWIhuS6q+mTvuaOpScsICfoh6rliqjlpI3liLbliIbkuqvpk77mjqUnLCB0cnVlXSwKICAgICAgICBbJ21lbnVfcmVmcmVzaENvcnJlY3Rpb24nLCAn5Yi35paw5LiN6L+U5Zue5qC555uu5b2VJywgJ+WIt+aWsOS4jei/lOWbnuagueebruW9lScsIHRydWVdLAogICAgICAgIFsnbWVudV9yaWdodENsaWNrTWVudScsICflj7PplK7mlofku7bmmL7npLroj5zljZUnLCAn5Y+z6ZSu5paH5Lu25pi+56S66I+c5Y2VJywgdHJ1ZV0sCiAgICAgICAgWydtZW51X2RpcmVjdERvd25sb2FkJywgJ+eCueWHu+ebtOaOpeS4i+i9veaWh+S7tiAo5YiG5Lqr6ZO+5o6l5YiX6KGo6aG1KScsICfngrnlh7vnm7TmjqXkuIvovb3mlofku7YnLCB0cnVlXSwKICAgICAgICBbJ21lbnVfZm9sZGVyRGVzY2Rlc01lbnUnLCAn6LCD5pW05o+P6L+w77yI6K+d6K+077yJ57yW6L6R5qGG5aSn5bCPJywgJ+iwg+aVtOaPj+i/sO+8iOivneivtO+8iee8lui+keahhuWkp+WwjycsIHRydWVdLAogICAgICAgIFsnbWVudV9maWxlU29ydCcsICfmlofku7bmjpLluo8nLCAn5paH5Lu25o6S5bqPJywgdHJ1ZV0KICAgIF0sIG1lbnVfSUQgPSBbXSwgbGFzdEZvbGRlcklEOwogICAgZm9yIChsZXQgaT0wO2k8bWVudV9BTEwubGVuZ3RoO2krKyl7IC8vIOWmguaenOivu+WPluWIsOeahOWAvOS4uiBudWxsIOWwseWGmeWFpem7mOiupOWAvAogICAgICAgIGlmIChHTV9nZXRWYWx1ZShtZW51X0FMTFtpXVswXSkgPT0gbnVsbCl7R01fc2V0VmFsdWUobWVudV9BTExbaV1bMF0sIG1lbnVfQUxMW2ldWzNdKX07CiAgICB9CiAgICByZWdpc3Rlck1lbnVDb21tYW5kKCk7CgogICAgLy8g5rOo5YaM6ISa5pys6I+c5Y2VCiAgICBmdW5jdGlvbiByZWdpc3Rlck1lbnVDb21tYW5kKCkgewogICAgICAgIGlmIChtZW51X0lELmxlbmd0aCA+IG1lbnVfQUxMLmxlbmd0aCl7IC8vIOWmguaenOiPnOWNlUlE5pWw57uE5aSa5LqO6I+c5Y2V5pWw57uE77yM6K+05piO5LiN5piv6aaW5qyh5re75Yqg6I+c5Y2V77yM6ZyA6KaB5Y246L295omA5pyJ6ISa5pys6I+c5Y2VCiAgICAgICAgICAgIGZvciAobGV0IGk9MDtpPG1lbnVfSUQubGVuZ3RoO2krKyl7CiAgICAgICAgICAgICAgICBHTV91bnJlZ2lzdGVyTWVudUNvbW1hbmQobWVudV9JRFtpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaT0wO2k8bWVudV9BTEwubGVuZ3RoO2krKyl7IC8vIOW+queOr+azqOWGjOiEmuacrOiPnOWNlQogICAgICAgICAgICBtZW51X0FMTFtpXVszXSA9IEdNX2dldFZhbHVlKG1lbnVfQUxMW2ldWzBdKTsKICAgICAgICAgICAgaWYgKG1lbnVfQUxMW2ldWzBdID09ICdtZW51X3JlZnJlc2hDb3JyZWN0aW9uJykgewogICAgICAgICAgICAgICAgbWVudV9JRFtpXSA9IEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoYCR7bWVudV9BTExbaV1bM10/J+KchSc6J+KdjCd9ICR7bWVudV9BTExbaV1bMV19YCwgZnVuY3Rpb24oKXtpZihtZW51X3ZhbHVlKCdtZW51X3JlZnJlc2hDb3JyZWN0aW9uJykpe1VOcmVmcmVzaENvcnJlY3Rpb24oKTt9ZWxzZXtyZWZyZXNoQ29ycmVjdGlvbigpO307bWVudV9zd2l0Y2goYCR7bWVudV9BTExbaV1bM119YCxgJHttZW51X0FMTFtpXVswXX1gLGAke21lbnVfQUxMW2ldWzJdfWApfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWVudV9BTExbaV1bMF0gPT09ICdtZW51X2N1c3RvbUZpbGVTaGEnKSB7CiAgICAgICAgICAgICAgICBtZW51X0lEW2ldID0gR01fcmVnaXN0ZXJNZW51Q29tbWFuZChgI++4j+KDoyAke21lbnVfQUxMW2ldWzFdfWAsIGZ1bmN0aW9uKCl7Y3VzdG9tRmlsZVNoYSgpfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBtZW51X0lEW2ldID0gR01fcmVnaXN0ZXJNZW51Q29tbWFuZChgJHttZW51X0FMTFtpXVszXT8n4pyFJzon4p2MJ30gJHttZW51X0FMTFtpXVsxXX1gLCBmdW5jdGlvbigpe21lbnVfc3dpdGNoKGAke21lbnVfQUxMW2ldWzNdfWAsYCR7bWVudV9BTExbaV1bMF19YCxgJHttZW51X0FMTFtpXVsyXX1gKX0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG1lbnVfSURbbWVudV9JRC5sZW5ndGhdID0gR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgn8J+SrCDlj43ppoggJiDlu7rorq4nLCBmdW5jdGlvbiAoKSB7d2luZG93LkdNX29wZW5JblRhYignaHR0cHM6Ly9naXRodWIuY29tL1hJVTIvVXNlclNjcmlwdCN4aXUydXNlcnNjcmlwdCcsIHthY3RpdmU6IHRydWUsaW5zZXJ0OiB0cnVlLHNldFBhcmVudDogdHJ1ZX0pO3dpbmRvdy5HTV9vcGVuSW5UYWIoJ2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80MTkyMjQvZmVlZGJhY2snLCB7YWN0aXZlOiB0cnVlLGluc2VydDogdHJ1ZSxzZXRQYXJlbnQ6IHRydWV9KTt9KTsKICAgIH0KCiAgICAvLyDoj5zljZXlvIDlhbMKICAgIGZ1bmN0aW9uIG1lbnVfc3dpdGNoKG1lbnVfc3RhdHVzLCBOYW1lLCBUaXBzKSB7CiAgICAgICAgaWYgKG1lbnVfc3RhdHVzID09ICd0cnVlJykgewogICAgICAgICAgICBHTV9zZXRWYWx1ZShgJHtOYW1lfWAsIGZhbHNlKTsKICAgICAgICAgICAgaWYgKE5hbWUgPT0gJ21lbnVfcmVmcmVzaENvcnJlY3Rpb24nKSB7CiAgICAgICAgICAgICAgICBHTV9ub3RpZmljYXRpb24oe3RleHQ6IGDlt7LlhbPpl60gWyR7VGlwc31dIOWKn+iDvWAsIHRpbWVvdXQ6IDM1MDB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIEdNX25vdGlmaWNhdGlvbih7dGV4dDogYOW3suWFs+mXrSBbJHtUaXBzfV0g5Yqf6IO9XG7vvIjngrnlh7vliLfmlrDnvZHpobXlkI7nlJ/mlYjvvIlgLCB0aW1lb3V0OiAzNTAwLCBvbmNsaWNrOiBmdW5jdGlvbigpe2xvY2F0aW9uLnJlbG9hZCgpO319KTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEdNX3NldFZhbHVlKGAke05hbWV9YCwgdHJ1ZSk7CiAgICAgICAgICAgIGlmIChOYW1lID09ICdtZW51X3JlZnJlc2hDb3JyZWN0aW9uJykgewogICAgICAgICAgICAgICAgR01fbm90aWZpY2F0aW9uKHt0ZXh0OiBg5bey5byA5ZCvIFske1RpcHN9XSDlip/og71gLCB0aW1lb3V0OiAzNTAwfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBHTV9ub3RpZmljYXRpb24oe3RleHQ6IGDlt7LlvIDlkK8gWyR7VGlwc31dIOWKn+iDvVxu77yI54K55Ye75Yi35paw572R6aG15ZCO55Sf5pWI77yJYCwgdGltZW91dDogMzUwMCwgb25jbGljazogZnVuY3Rpb24oKXtsb2NhdGlvbi5yZWxvYWQoKTt9fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVnaXN0ZXJNZW51Q29tbWFuZCgpOyAvLyDph43mlrDms6jlhozohJrmnKzoj5zljZUKICAgIH07CgogICAgLy8g6L+U5Zue6I+c5Y2V5YC8CiAgICBmdW5jdGlvbiBtZW51X3ZhbHVlKG1lbnVOYW1lKSB7CiAgICAgICAgZm9yIChsZXQgbWVudSBvZiBtZW51X0FMTCkgewogICAgICAgICAgICBpZiAobWVudVswXSA9PSBtZW51TmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG1lbnVbM10KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCgogICAgaWYgKHdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUgPT09ICcvdScgfHwgd2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZS5pbmRleE9mKCdhY2NvdW50LnBocCcpID4gLTEgfHwgd2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZS5pbmRleE9mKCdteWRpc2sucGhwJykgPiAtMSkgeyAvLyDlkI7lj7DpobUKICAgICAgICBpZiAod2luZG93LnRvcC5sb2NhdGlvbi5ocmVmICE9ICdodHRwczovL3BjLndvb3pvb28uY29tL215ZGlzay5waHAnKSB3aW5kb3cudG9wLmxvY2F0aW9uLmhyZWYgPSAnaHR0cHM6Ly9wYy53b296b29vLmNvbS9teWRpc2sucGhwJzsKICAgICAgICB2YXIgbWFpbmZyYW1lOwogICAgICAgIGlmcmFtZSgpOwogICAgfSBlbHNlIGlmICh3aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lLmluZGV4T2YoJyUnKSA+IC0xKSB7IC8vID4g5bim5a+G56CB55qE5YiG5Lqr6ZO+5o6l6aG16Z2iCiAgICAgICAgc2hhcmVMaW5rV2l0aFBhc3N3b3JkKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5bim5a+G56CB55qE5YiG5Lqr6ZO+5o6l6Ieq5Yqo6L6T5a+G56CBCiAgICB9IGVsc2UgewogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOW7tui/nyAzMDAg5q+r56eS77yI6YG/5YWN572R6aG16L+Y5rKh5Yqg6L295a6M77yJCiAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcHdkbG9hZCwjcGFzc3dkZGl2JykpIHsgLy8gPiDliIbkuqvpk77mjqXovpPlhaXlr4bnoIHpobUKICAgICAgICAgICAgICAgIGVudGVyUGFzc3dvcmQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDoh6rliqjovpPlhaXlr4bnoIHvvIjku4XmlK/mjIHorr/pl64g5bim5a+G56CB55qE5YiG5Lqr6ZO+5o6lIOaXtu+8iQogICAgICAgICAgICAgICAgZW50ZXJUb1Bhc3MoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOi+k+WFpeWvhueggeWQjuWbnui9puehruiupO+8iOmSiOWvueaJi+WKqOi+k+WFpeWvhuegge+8iQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5mb3MnKSkgeyAvLyAgICAgICAgICAgICAgPiDliIbkuqvpk77mjqXmlofku7bliJfooajpobUKICAgICAgICAgICAgICAgIGZpbGVNb3JlUygpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDoh6rliqjmmL7npLrmm7TlpJrmlofku7YKICAgICAgICAgICAgICAgIGRpcmVjdERvd25sb2FkKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDngrnlh7vnm7TmjqXkuIvovb3mlofku7bvvIjliIbkuqvpk77mjqXliJfooajpobXvvIkKICAgICAgICAgICAgfQogICAgICAgIH0sIDMwMCk7CiAgICAgICAgZGlyZWN0RG93bmxvYWRfKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg54K55Ye755u05o6l5LiL6L295paH5Lu277yI5YiG5Lqr6ZO+5o6l5YiX6KGo6aG177yJCiAgICB9CgoKICAgIC8vIOiOt+WPliBpZnJhbWUg5qGG5p62CiAgICBmdW5jdGlvbiBpZnJhbWUoKSB7CiAgICAgICAgbWFpbmZyYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21haW5mcmFtZScpOwogICAgICAgIGlmIChtYWluZnJhbWUpIHsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICDlj6rmnInmib7liLAgaWZyYW1lIOahhuaetuaXtuaJjeS8mue7p+e7rei/kOihjOiEmuacrAogICAgICAgICAgICBtYWluZnJhbWUgPSBtYWluZnJhbWUuY29udGVudFdpbmRvdzsKICAgICAgICAgICAgaWYgKG1lbnVfdmFsdWUoJ21lbnVfcmVmcmVzaENvcnJlY3Rpb24nKSkgcmVmcmVzaENvcnJlY3Rpb24oKTsgLy8g5Yi35paw5LiN6L+U5Zue5qC555uu5b2V77yIRjXvvIkKICAgICAgICAgICAgc2V0VGltZW91dChmb2xkZXJEZXNjZGVzLCA1MDApOyAvLyAgICAgICAgICAg6LCD5pW06K+d6K+057yW6L6R5qGG5Yid5aeL5aSn5bCPCiAgICAgICAgICAgIHNldFRpbWVvdXQoaGlkZVNoYSwgNTAwKTsgLy8gICAgICAgICAgICAgICAgIOmakOiXj+WIhuS6q+mTvuaOpeeql+WPo++8iOi/meagt+iHquWKqOaJk+W8gC/lpI3liLbliIbkuqvpk77mjqXml7bvvIzkuI3kvJrkuIDpl6rogIzov4fvvIkKICAgICAgICAgICAgZm9iaWRkZW5CYWNrKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAg56aB5q2i5rWP6KeI5Zmo6L+U5Zue77yI5bm257uR5a6a5paw55qE6L+U5Zue5LqL5Lu277yJCiAgICAgICAgICAgIEV2ZW50WE1MSHR0cFJlcXVlc3QoKTsgLy8gICAgICAgICAgICAgICAgICAgIOebkeWQrCBYTUxIdHRwUmVxdWVzdCDkuovku7blubbmiafooYwgW+iHquWKqOaYvuekuuabtOWkmuaWh+S7tl0KICAgICAgICAgICAgc2V0VGltZW91dChjbGlja09wZW5EaXJlY3RvcnksIDUwMCk7IC8vICAgICAg54K55Ye756m655m96L+b5YWl55uu5b2VCiAgICAgICAgICAgIHNldFRpbWVvdXQoYmFja1RvVG9wLCAyMDAwKTsgLy8gICAgICAgICAgICAgIOW/q+aNt+i/lOWbnuS4iue6p++8iOWPs+mUrueCueWHuyDnvZHpobXlj7Pkvqcv5LiL5pa5IOepuueZveWkhO+8iQoKICAgICAgICAgICAgZHJhZ0VudGVyKCk7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5ouW5YWl5paH5Lu26Ieq5Yqo5pi+56S65LiK5Lyg5qGGCiAgICAgICAgICAgIHNldFRpbWVvdXQodmlld1RvcCwxMDAwKTsgLy8gICAgICAgICAgICAgICAgIOebkeWQrOW5tuS/ruaUueWPs+mUruiPnOWNlSBb5aSW6ZO+5YiG5Lqr5Zyw5Z2AXSDkuLogW+WkjeWItuW5tuaJk+W8gOWIhuS6q+mTvuaOpV0gLyBb5aSN5Yi25YiG5Lqr6ZO+5o6lXSAvIFvmiZPlvIDliIbkuqvpk77mjqVdIOS5i+S4gAogICAgICAgICAgICBzZXRUaW1lb3V0KGNvcHlBbGxmaWxlU2hhLCA1MDApOyAvLyAgICAgICAgICDkuIDplK7lpI3liLbmiYDmnInliIbkuqvpk77mjqUKCiAgICAgICAgICAgIHNldFRpbWVvdXQoZmlsZXNTb3J0LCAzMDApOyAvLyAgICAgICAgICAgICAgIOaWh+S7tuaOkuW6jwogICAgICAgIH0KICAgIH0KCgogICAgLy8g5bim5a+G56CB55qE5YiG5Lqr6ZO+5o6l6Ieq5Yqo6L6T5a+G56CBCiAgICBmdW5jdGlvbiBzaGFyZUxpbmtXaXRoUGFzc3dvcmQoKSB7CiAgICAgICAgaWYgKGxvY2F0aW9uLnBhdGhuYW1lLmluZGV4T2YoJyVFNSVBRiU4NiVFNyVBMCU4MScpID4gLTEpIHsKICAgICAgICAgICAgbGV0IHNoYXJlTGluayA9IGxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KCclJykKICAgICAgICAgICAgaWYgKHNoYXJlTGluay5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBzaGFyZUxpbmsgPSBsb2NhdGlvbi5vcmlnaW4gKyBzaGFyZUxpbmtbMF0KICAgICAgICAgICAgICAgIGxldCBwYXNzd29yZCA9IGxvY2F0aW9uLnBhdGhuYW1lLnJlcGxhY2UoJyVFNSVBRiU4NiVFNyVBMCU4MScsJzonKS5yZXBsYWNlKC8lKFtBLVpdfFswLTldKXsyfS9pZywgJycpLnNwbGl0KCc6JykKICAgICAgICAgICAgICAgIGlmIChwYXNzd29yZC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVwbGFjZShzaGFyZUxpbmsgKyAnP3Bhc3N3b3JkPScgKyBwYXNzd29yZFtwYXNzd29yZC5sZW5ndGggLSAxXSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCgogICAgLy8g6Ieq5Yqo6L6T5YWl5a+G56CB77yI5LuF5pSv5oyB6K6/6ZeuIOW4puWvhueggeeahOWIhuS6q+mTvuaOpSDml7bvvIkKICAgIGZ1bmN0aW9uIGVudGVyUGFzc3dvcmQoKSB7CiAgICAgICAgaWYgKGxvY2F0aW9uLnNlYXJjaC5pbmRleE9mKCc/cGFzc3dvcmQ9JykgPiAtMSkgewogICAgICAgICAgICBsZXQgcGFzc3dvcmQgPSBsb2NhdGlvbi5zZWFyY2guc3BsaXQoJz0nKQogICAgICAgICAgICBpZiAocGFzc3dvcmQubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B3ZCcpLnZhbHVlID0gcGFzc3dvcmRbcGFzc3dvcmQubGVuZ3RoIC0gMV0KICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ViJykpIHsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ViJykuY2xpY2soKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhc3N3ZGRpdi1idG5bb25jbGlja10nKS5jbGljaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICAvLyDliLfmlrDkuI3ov5Tlm57moLnnm67lvZXvvIhGNe+8iQogICAgZnVuY3Rpb24gcmVmcmVzaENvcnJlY3Rpb24oKSB7CiAgICAgICAgZG9jdW1lbnQub25rZXlkb3duID0gbWFpbmZyYW1lLm9ua2V5ZG93biA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUgPSB3aW5kb3cuZXZlbnQgfHwgZTsKICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRjUnKSB7CiAgICAgICAgICAgICAgICBsZXQgZm9sZGVySUQgPSAvLT9cZCsvLmV4ZWMobWFpbmZyYW1lLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlbW9yZScpLmNoaWxkcmVuWzBdLm9uY2xpY2spCiAgICAgICAgICAgICAgICBpZihmb2xkZXJJRC5sZW5ndGggPiAwKXsKICAgICAgICAgICAgICAgICAgICBtYWluZnJhbWUuZm9sZGVyKGZvbGRlcklEWzBdKTsKICAgICAgICAgICAgICAgICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZS5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCgogICAgLy8g5oGi5aSN5Yi35paw5py65Yi2CiAgICBmdW5jdGlvbiBVTnJlZnJlc2hDb3JyZWN0aW9uKCkgewogICAgICAgIGRvY3VtZW50Lm9ua2V5ZG93biA9IG1haW5mcmFtZS5vbmtleWRvd24gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlID0gd2luZG93LmV2ZW50IHx8IGU7CiAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0Y1JykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIC8vIOeCueWHu+epuueZvei/m+WFpeebruW9lQogICAgZnVuY3Rpb24gY2xpY2tPcGVuRGlyZWN0b3J5KCkgewogICAgICAgIG1haW5mcmFtZS5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ViX2ZvbGRlcl9saXN0Jykub25jbGljayA9IGZ1bmN0aW9uKGUpewogICAgICAgICAgICAvL2NvbnNvbGUubG9nKGUudGFyZ2V0KTsKICAgICAgICAgICAgaWYgKGUudGFyZ2V0LmNsYXNzTmFtZSAmJiBlLnRhcmdldC5jbGFzc05hbWUgPT0gJ2ZfdGInKSB7CiAgICAgICAgICAgICAgICBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKCdzcGFuLmZvbGxpbmsnKS5jbGljaygpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIC8vIOWPs+mUruaWh+S7tuaYvuekuuiPnOWNlQogICAgZnVuY3Rpb24gcmlnaHRDbGlja01lbnUoKSB7CiAgICAgICAgaWYgKCFtZW51X3ZhbHVlKCdtZW51X3JpZ2h0Q2xpY2tNZW51JykpIHJldHVybgogICAgICAgIHJpZ2h0Q2xpY2tNZW51Xygnc3ViX2ZvbGRlcl9saXN0JywgJ2ZvbHMnLCAnZm9sc2UnKSAvLyDmlofku7blpLkKICAgICAgICByaWdodENsaWNrTWVudV8oJ2ZpbGVsaXN0JywgJ2ZzJywgJ2ZzZScpIC8vICAgICAgICAgICAg5paH5Lu2CiAgICB9CgoKICAgIC8vIOWPs+mUruaWh+S7tuaYvuekuuiPnOWNle+8jOWPguaVsO+8muaWh+S7ti/mlofku7blpLnliJfooaggSUTjgIHoj5zljZUgSUTjgIHoj5zljZUgSUTliY3nvIAKICAgIGZ1bmN0aW9uIHJpZ2h0Q2xpY2tNZW51XyhsaXN0X2lkX25hbWUsIG1lbnVfaWRfbmFtZV9wcmVmaXgsIGxpc3RfaWRfbmFtZV9wcmVmaXgpIHsKICAgICAgICBsZXQgbGlzdF8gPSBtYWluZnJhbWUuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobGlzdF9pZF9uYW1lKTsKICAgICAgICBpZiAoIWxpc3RfKSByZXR1cm4gLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOaWh+S7ti/mlofku7blpLnliJfooagKICAgICAgICBsaXN0Xy5vbmNvbnRleHRtZW51ID0gZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICDlsY/olL3mtY/op4jlmajoh6rouqvlj7PplK7oj5zljZUKICAgICAgICAgICAgbGV0IGxlZnQgPSBlLnBhZ2VYIC0gMzA7IC8vICAgICAgICAgICAgICAgICAgICAgIOWPs+mUruiPnOWNleW8ueWHuuS9jee9rgogICAgICAgICAgICBsZXQgbGlzdF9JRCA9IGUudGFyZ2V0LmlkOwogICAgICAgICAgICBpZiAoZS50YXJnZXQubm9kZU5hbWUgPT09ICdGT05UJykgewogICAgICAgICAgICAgICAgbGlzdF9JRCA9IGUudGFyZ2V0LnBhcmVudE5vZGUucGFyZW50Tm9kZS5pZAogICAgICAgICAgICB9IGVsc2UgaWYoZS50YXJnZXQuaWQgPT09ICcnKSB7CiAgICAgICAgICAgICAgICBsaXN0X0lEID0gZS50YXJnZXQucGFyZW50Tm9kZS5pZAogICAgICAgICAgICB9CiAgICAgICAgICAgIGxpc3RfSUQgPSAvXGQrLy5leGVjKGxpc3RfSUQpCiAgICAgICAgICAgIGlmKGxpc3RfSUQubGVuZ3RoID4gMCl7CiAgICAgICAgICAgICAgICBtYWluZnJhbWUuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQobWVudV9pZF9uYW1lX3ByZWZpeCArIGxpc3RfSURbMF0pLnN0eWxlLmNzc1RleHQ9J3Bvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50OyBsZWZ0OiAnICsgbGVmdCArICdweDsnIC8vIOS/ruaUueWPs+mUruiPnOWNleW8ueWHuuS9jee9ru+8iFjvvIkKICAgICAgICAgICAgICAgIG1haW5mcmFtZS5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChsaXN0X2lkX25hbWVfcHJlZml4ICsgbGlzdF9JRFswXSkuZm9jdXMoKTsKICAgICAgICAgICAgICAgIG1haW5mcmFtZS5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChsaXN0X2lkX25hbWVfcHJlZml4ICsgbGlzdF9JRFswXSkuY2xpY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCgogICAgLy8g6Ieq5Yqo5pi+56S65pu05aSa5paH5Lu277yI5ZCO5Y+w6aG177yJCiAgICBmdW5jdGlvbiBmaWxlTW9yZSgpIHsKICAgICAgICBsZXQgZmlsZW1vcmUgPSBtYWluZnJhbWUuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGVtb3JlJyk7IC8vIOWvu+aJviBb5pi+56S65pu05aSa5paH5Lu2XSDmjInpkq4KICAgICAgICBpZiAoZmlsZW1vcmUgJiYgZmlsZW1vcmUuc3R5bGUuZGlzcGxheSA9PT0gJ2Jsb2NrJykgeyAvLyAgICAgICAgIOWIpOaWreaMiemSruaYr+WQpuWtmOWcqOS4lOWPr+ingQogICAgICAgICAgICBpZiAoZmlsZW1vcmUuY2hpbGRyZW5bMF0pIHsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Yik5pat5oyJ6ZKu5YWD57Sg5LiL56ys5LiA5Liq5YWD57Sg5piv5ZCm5a2Y5ZyoCiAgICAgICAgICAgICAgICBmaWxlbW9yZS5jaGlsZHJlblswXS5jbGljaygpOyAvLyAgICAgICAgICAgICAgICAgICAgICAgICDngrnlh7sgW+aYvuekuuabtOWkmuaWh+S7tl0g5oyJ6ZKuCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIC8vIOiHquWKqOaYvuekuuabtOWkmuaWh+S7tu+8iOWIhuS6q+mTvuaOpeWIl+ihqOmhte+8iQogICAgZnVuY3Rpb24gZmlsZU1vcmVTKCkgewogICAgICAgIHdpbmRvd1Njcm9sbChmdW5jdGlvbiAoZGlyZWN0aW9uLCBlKSB7CiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09ICdkb3duJykgeyAvLyDkuIvmu5HmiY3lh4blpIfliqDovb3mm7TlpJoKICAgICAgICAgICAgICAgIGxldCBzY3JvbGxUb3AgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgIGxldCBzY3JvbGxEZWx0YSA9IDUwMDsKICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IDw9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgKyBzY3JvbGxUb3AgKyBzY3JvbGxEZWx0YSkgewogICAgICAgICAgICAgICAgICAgIGxldCBmaWxlbW9yZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlbW9yZScpOyAvLyDlr7vmib4gW+aYvuekuuabtOWkmuaWh+S7tl0g5oyJ6ZKuCiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVtb3JlICYmIGZpbGVtb3JlLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnKSB7IC8vIOWmguaenOato+WcqOWKoOi9ve+8jOWwseS4jeWGjeeCueWHuwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZW1vcmUudGV4dENvbnRlbnQuaW5kZXhPZign5pu05aSaJykgPiAtMSl7IC8vIOmBv+WFjeW3sue7j+WcqOWKoOi9veS6hu+8jOmHjeWkjeeCueWHuwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW1vcmUuY2xpY2soKTsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICDngrnlh7sgW+aYvuekuuabtOWkmuaWh+S7tl0g5oyJ6ZKuCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCgogICAgLy8g54K55Ye755u05o6l5LiL6L295paH5Lu277yI5YiG5Lqr6ZO+5o6l5YiX6KGo6aG177yJCiAgICBmdW5jdGlvbiBkaXJlY3REb3dubG9hZCgpIHsKICAgICAgICBpZiAoIW1lbnVfdmFsdWUoJ21lbnVfZGlyZWN0RG93bmxvYWQnKSkgcmV0dXJuCiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvcycpKSB7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbmZvcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0LnRhZ05hbWUgPT09ICdBJykgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsgLy8g6Zi75q2i6buY6K6k5omT5byA6ZO+5o6l5LqL5Lu2CiAgICAgICAgICAgICAgICAgICAgR01fb3BlbkluVGFiKGUudGFyZ2V0LmhyZWYgKyAnI2Rvd25sb2FkJywge2FjdGl2ZTogZmFsc2UsIGluc2VydDogdHJ1ZSwgc2V0UGFyZW50OiB0cnVlfSk7IC8vIOWQjuWPsOaJk+W8gAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICAvLyDngrnlh7vkuIvovb3mjInpkq4KICAgIGZ1bmN0aW9uIGRpcmVjdERvd25sb2FkXygpIHsKICAgICAgICBpZiAoIW1lbnVfdmFsdWUoJ21lbnVfZGlyZWN0RG93bmxvYWQnKSkgcmV0dXJuCiAgICAgICAgaWYgKGxvY2F0aW9uLmhhc2ggIT0gJyNkb3dubG9hZCcpIHJldHVybgogICAgICAgIGxldCBpZnJhbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpZnJhbWUuaWZyMicpOwogICAgICAgIGlmIChpZnJhbWUpIHsgLy8g5Y+q5pyJ5om+5YiwIGlmcmFtZSDmoYbmnrbml7bmiY3kvJrnu6fnu63ov5DooYzohJrmnKwKICAgICAgICAgICAgaWZyYW1lID0gaWZyYW1lLmNvbnRlbnRXaW5kb3c7CiAgICAgICAgICAgIGxldCB0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBpZiAoaWZyYW1lLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5sb2FkPltocmVmXScpKSB7CiAgICAgICAgICAgICAgICAgICAgLy9pZnJhbWUuZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxvYWQ+YVtocmVmXScpLnRhcmdldCA9ICdfdG9wJwogICAgICAgICAgICAgICAgICAgIC8vaWZyYW1lLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5sb2FkPmFbaHJlZl0nKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgIEdNX29wZW5JblRhYihpZnJhbWUuZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmxvYWQ+YVtocmVmXScpLmhyZWYsIHthY3RpdmU6IGZhbHNlLCBpbnNlcnQ6IHRydWUsIHNldFBhcmVudDogZmFsc2V9KTsgLy8g5ZCO5Y+w5omT5byACiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CiAgICAgICAgICAgICAgICAgICAgLy8g5YWz6Zet6K+l5ZCO5Y+w5qCH562+6aG1CiAgICAgICAgICAgICAgICAgICAgaWYgKEdNX2luZm8uc2NyaXB0SGFuZGxlciA9PT0gJ1Zpb2xlbnRtb25rZXknKSB7IC8vIFZpb2xlbnRtb25rZXkg6ZyA6KaB5bu26L+f5LiA5Lya5YS/CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXt3aW5kb3cudG9wLmNsb3NlKCk7fSwgNTAwKQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy50b3AuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIDEwKTsKICAgICAgICB9CiAgICB9CgoKICAgIC8vIOa7muWKqOadoeS6i+S7tgogICAgZnVuY3Rpb24gd2luZG93U2Nyb2xsKGZuMSkgewogICAgICAgIHZhciBiZWZvcmVTY3JvbGxUb3AgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wLAogICAgICAgICAgICBmbiA9IGZuMSB8fCBmdW5jdGlvbiAoKSB7fTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgLy8g5bu25pe25omn6KGM77yM6YG/5YWN5Yia6L295YWl5Yiw6aG16Z2i5bCx6Kem5Y+R57+76aG15LqL5Lu2CiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdmFyIGFmdGVyU2Nyb2xsVG9wID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwKICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IGFmdGVyU2Nyb2xsVG9wIC0gYmVmb3JlU2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgaWYgKGRlbHRhID09IDApIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIGZuKGRlbHRhID4gMCA/ICdkb3duJyA6ICd1cCcsIGUpOwogICAgICAgICAgICAgICAgYmVmb3JlU2Nyb2xsVG9wID0gYWZ0ZXJTY3JvbGxUb3A7CiAgICAgICAgICAgIH0sIGZhbHNlKTsKICAgICAgICB9LCAxMDAwKQogICAgfQoKCiAgICAvLyDosIPmlbTor53or7TnvJbovpHmoYbliJ3lp4vlpKflsI8KICAgIGZ1bmN0aW9uIGZvbGRlckRlc2NkZXMoKSB7CiAgICAgICAgaWYgKCFtZW51X3ZhbHVlKCdtZW51X2ZvbGRlckRlc2NkZXNNZW51JykpIHJldHVybgogICAgICAgIGxldCBmb2xkZXJkZXNjZGVzID0gbWFpbmZyYW1lLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb2xkZXJfZGVzY2RlcycpOyAvLyAgIOWvu+aJvuivneivtO+8iOaPj+i/sO+8iee8lui+keahhgogICAgICAgIGlmIChmb2xkZXJkZXNjZGVzKSB7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWIpOaWreivneivtO+8iOaPj+i/sO+8ieWFg+e0oOaYr+WQpuWtmOWcqAogICAgICAgICAgICBmb2xkZXJkZXNjZGVzLnN0eWxlLmNzc1RleHQ9J21hcmdpbjogMTVweCAwcHg7IHdpZHRoOiA1NTBweDsgaGVpZ2h0OiAxMjVweDsnCiAgICAgICAgfQogICAgICAgIGxldCBmb2xkZXJkZXNjZGVzMiA9IG1haW5mcmFtZS5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sX2NyZWRlcycpOyAvLyAgICAgIOWvu+aJvuivneivtO+8iOaPj+i/sO+8iee8lui+keahhgogICAgICAgIGlmIChmb2xkZXJkZXNjZGVzMikgeyAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOWIpOaWreivneivtO+8iOaPj+i/sO+8ieWFg+e0oOaYr+WQpuWtmOWcqAogICAgICAgICAgICBmb2xkZXJkZXNjZGVzMi5zdHlsZS5jc3NUZXh0PSdtYXJnaW46IDE1cHggMHB4OyB3aWR0aDogNTUwcHg7IGhlaWdodDogMTI1cHg7JwogICAgICAgIH0KICAgICAgICBsZXQgZm9sZGVyZGVzY2RlczMgPSBtYWluZnJhbWUuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGVfZGVzYycpOyAvLyAgICAgICDlr7vmib7or53or7TvvIjmj4/ov7DvvInnvJbovpHmoYYKICAgICAgICBpZiAoZm9sZGVyZGVzY2RlczMpIHsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDliKTmlq3or53or7TvvIjmj4/ov7DvvInlhYPntKDmmK/lkKblrZjlnKgKICAgICAgICAgICAgZm9sZGVyZGVzY2RlczMuc3R5bGUuY3NzVGV4dD0nbWFyZ2luOiAxNXB4IDBweDsgd2lkdGg6IDU1MHB4OyBoZWlnaHQ6IDEyNXB4OycKICAgICAgICB9CiAgICB9CgoKICAgIC8vIOaLluWFpeaWh+S7tuiHquWKqOaYvuekuuS4iuS8oOahhgogICAgZnVuY3Rpb24gZHJhZ0VudGVyKCkgewogICAgICAgIG1haW5mcmFtZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIGxldCBmX3VwYiA9IG1haW5mcmFtZS5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuZl91cGInKQogICAgICAgICAgICBpZihmX3VwYi5zdHlsZS50b3AgIT0gJy0zNnB4JykgewogICAgICAgICAgICAgICAgZl91cGIuc3R5bGUudG9wID0gJy0zNnB4JzsKICAgICAgICAgICAgICAgIG1haW5mcmFtZS5mX3VwYygpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgZmFsc2UpOwogICAgICAgIG1haW5mcmFtZS5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAvL2Uuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIC8vY29uc29sZS5sb2coZS5kYXRhVHJhbnNmZXIuZmlsZXMpCiAgICAgICAgfSk7CiAgICB9CgoKICAgIC8vIOS4gOmUruWkjeWItuaJgOacieWIhuS6q+mTvuaOpQogICAgZnVuY3Rpb24gY29weUFsbGZpbGVTaGEoKSB7CiAgICAgICAgdmFyIGZfZGF0YSA9ICcnLCB0bWVwX2RhdGEgPSBbXTsKICAgICAgICBsZXQgZl90cCA9IG1haW5mcmFtZS5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl90cCcpOwogICAgICAgIC8vY29uc29sZS5sb2coZl90cCwgbWFpbmZyYW1lLmRvY3VtZW50LmxvY2F0aW9uLmhyZWYpCiAgICAgICAgZl90cC5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyZW5kJywgYDxhIGlkPSJmX2NvcHlBbGwiIGNsYXNzPSJmX3NlbGEiIHN0eWxlPSJmbG9hdDogcmlnaHQ7IHdpZHRoOiBhdXRvOyBmb250LXNpemU6IDEycHggIWltcG9ydGFudDsgZm9udDogaW5oZXJpdDsgcGFkZGluZzogMnB4IDEwcHg7IG1hcmdpbi10b3A6IC0yNXB4OyIgdGl0bGU9IuiOt+WPluaJgOacieWIhuS6q+mTvuaOpemcgOimgeS4gOS6m+aXtumXtO+8iOWPluWGs+S6juacieWkmuWwkeaWh+S7tu+8ieOAgiYjMTA75Zug5Li65YiG5Lqr6ZO+5o6l5rKh5pyJ5pi+56S65Zyo572R6aG15LiK77yM6ZyA6KaB6YCa6L+H572R6aG15o6l5Y+j6I635Y+W77yM5Zug5q2k5Li65LqG6YG/5YWN5aSq6aKR57mB6KKr6ZmQ5Yi277yM5omA5Lul6K6+572u5LqGIDMwMG1zIOmXtOmalOaXtumXtO+8gSI+5LiA6ZSu5aSN5Yi25omA5pyJ5YiG5Lqr6ZO+5o6lPC9hPmApOwogICAgICAgIG1haW5mcmFtZS5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl9jb3B5QWxsJykub25jbGljayA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBmX2RhdGEgPSAnJzsgdG1lcF9kYXRhID0gW107CiAgICAgICAgICAgIG1haW5mcmFtZS5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZl90YicpLmZvckVhY2goZnVuY3Rpb24gKF90aGlzKSB7CiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKF90aGlzLCBfdGhpcy5pZC5pbmRleE9mKCdmb2wnKSA+IC0xKQogICAgICAgICAgICAgICAgaWYgKF90aGlzLmlkLmluZGV4T2YoJ2ZvbCcpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGB0YXNrPTE4JmZvbGRlcl9pZD0ke190aGlzLmlkLnJlcGxhY2UoJ2ZvbCcsJycpfWApCiAgICAgICAgICAgICAgICAgICAgdG1lcF9kYXRhLnB1c2goW2Ake190aGlzLnF1ZXJ5U2VsZWN0b3IoJ3NwYW5baWRePSJmb2xuYW1lIl0nKS50ZXh0Q29udGVudH1gLCBgdGFzaz0xOCZmb2xkZXJfaWQ9JHtfdGhpcy5pZC5yZXBsYWNlKCdmb2wnLCcnKX1gXSkKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhgdGFzaz0yMiZmaWxlX2lkPSR7X3RoaXMuaWQucmVwbGFjZSgnZicsJycpfWApCiAgICAgICAgICAgICAgICAgICAgdG1lcF9kYXRhLnB1c2goW2Ake190aGlzLnF1ZXJ5U2VsZWN0b3IoJ3NwYW5baWRePSJmaWxlbmFtZSJdJykudGV4dENvbnRlbnR9YCwgYHRhc2s9MjImZmlsZV9pZD0ke190aGlzLmlkLnJlcGxhY2UoJ2YnLCcnKX1gXSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0bWVwX2RhdGEpCiAgICAgICAgICAgIGlmICh0bWVwX2RhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgZ2V0VXJsKDApOwogICAgICAgICAgICAgICAgR01fbm90aWZpY2F0aW9uKHt0ZXh0OiAn6I635Y+W5omA5pyJ5YiG5Lqr6ZO+5o6l6ZyA6KaB5LiA5Lqb5pe26Ze077yI5Y+W5Yaz5LqO5pyJ5aSa5bCR5paH5Lu277yJ77yM5Zyo5q2k5pyf6Ze06K+35LiN6KaB5YWz6Zet572R6aG177yBJywgdGltZW91dDogNTAwMH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCgogICAgICAgIGZ1bmN0aW9uIGdldFVybChpKSB7CiAgICAgICAgICAgIC8vY29uc29sZS5sb2coaSkKICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QoewogICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9wYy53b296b29vLmNvbS9kb3VwbG9hZC5waHAnLAogICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICBkYXRhOiB0bWVwX2RhdGFbaV1bMV0sCiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdqc29uJywKICAgICAgICAgICAgICAgIG92ZXJyaWRlTWltZVR5cGU6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JywKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgICAgICAgICAnUmVmZXJlcic6IG1haW5mcmFtZS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmLAogICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04JwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDUwMDAsCiAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ+i/lOWbnuWGheWuue+8micscmVzcG9uc2UucmVzcG9uc2UpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5yZXNwb25zZSAmJiByZXNwb25zZS5yZXNwb25zZS56dCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhyZXNwb25zZS5yZXNwb25zZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5yZXNwb25zZS5pbmZvLmZfaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCfmlofku7YgMScsZl9kYXRhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfZGF0YSArPSBgJHt0bWVwX2RhdGFbaV1bMF19IGAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVudV92YWx1ZSgnbWVudV9jdXN0b21GaWxlU2hhJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZl9kYXRhICs9IGBodHRwczovLyR7bWVudV92YWx1ZSgnbWVudV9jdXN0b21GaWxlU2hhJyl9LyR7cmVzcG9uc2UucmVzcG9uc2UuaW5mby5mX2lkfSBgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZl9kYXRhICs9IGAke3Jlc3BvbnNlLnJlc3BvbnNlLmluZm8uaXNfbmV3ZH0vJHtyZXNwb25zZS5yZXNwb25zZS5pbmZvLmZfaWR9IGAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3BvbnNlLmluZm8ub25vZiA9PSAnMScpIGZfZGF0YSArPSBg5a+G56CBOiR7cmVzcG9uc2UucmVzcG9uc2UuaW5mby5wd2R9YAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfZGF0YSArPSBgXG5gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygn5paH5Lu2IDInLGZfZGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygn55uu5b2VIDEnLGZfZGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX2RhdGEgKz0gYCR7cmVzcG9uc2UucmVzcG9uc2UuaW5mby5uYW1lfSBgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbnVfdmFsdWUoJ21lbnVfY3VzdG9tRmlsZVNoYScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfZGF0YSArPSBgJHtyZXNwb25zZS5yZXNwb25zZS5pbmZvLm5ld191cmwucmVwbGFjZSgvXC9cLy4rXC8vaSwgJy8vJyArIG1lbnVfdmFsdWUoJ21lbnVfY3VzdG9tRmlsZVNoYScpICsgJy8nKX0gYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfZGF0YSArPSBgJHtyZXNwb25zZS5yZXNwb25zZS5pbmZvLm5ld191cmx9IGAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3BvbnNlLmluZm8ub25vZiA9PSAnMScpIGZfZGF0YSArPSBg5a+G56CBOiR7cmVzcG9uc2UucmVzcG9uc2UuaW5mby5wd2R9YAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfZGF0YSArPSBgXG5gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygn55uu5b2VIDInLGZfZGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK2kgPCB0bWVwX2RhdGEubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe2dldFVybChpKTt9LCAzMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhmX2RhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKGZfZGF0YSwgJ3RleHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9ub3RpZmljYXRpb24oe3RleHQ6ICfinIUg5bey5aSN5Yi25omA5pyJ5paH5Lu2L+ebruW9leeahOWIhuS6q+mTvuaOpeWIsOWJquWIh+adv34nLCB0aW1lb3V0OiAyMDAwfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTV9ub3RpZmljYXRpb24oe3RleHQ6ICfinYwg5pu05paw5aSx6LSl77yM6K+36IGU57O75L2c6ICF6Kej5YazLi4uJywgdGltZW91dDogNTAwMH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgfQogICAgfQoKICAgIC8vIOWIhuS6q+mTvuaOpeebuOWFs++8iOeCueWHu+aWh+S7tuaXtu+8iQogICAgZnVuY3Rpb24gZmlsZVNoYSgpIHsKICAgICAgICB2YXIgZl9zaGEgPSBtYWluZnJhbWUuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zfc2hhJyk7IC8vICAgICAgICAgICAgICAgICAgICAgIOWvu+aJvuWIhuS6q+mTvuaOpe+8iOS4i+i9vemTvuaOpe+8ieS/oeaBr+ahhgogICAgICAgIGlmIChmX3NoYSAmJiBmX3NoYS5zdHlsZS5kaXNwbGF5ID09PSAnYmxvY2snKSB7IC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg5Yik5pat5L+h5oGv5qGG5piv5ZCm5a2Y5Zyo5LiU5Y+v6KeBCiAgICAgICAgICAgIGxldCBmX3NoYTEgPSBtYWluZnJhbWUuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zfc2hhMScpOyAvLyAgICAgICAgICAgICAgICDojrflj5bliIbkuqvpk77mjqXvvIjkuIvovb3pk77mjqXvvIkKICAgICAgICAgICAgaWYgKGZfc2hhMSAmJiBmX3NoYTEudGV4dENvbnRlbnQgIT0gJycpIHsgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOehruS/neWIhuS6q+mTvuaOpe+8iOS4i+i9vemTvuaOpe+8ieS4jeaYr+epugogICAgICAgICAgICAgICAgLy8g6Ieq5a6a5LmJ5YiG5Lqr6ZO+5o6l5Z+f5ZCNCiAgICAgICAgICAgICAgICBpZiAobWVudV92YWx1ZSgnbWVudV9jdXN0b21GaWxlU2hhJykpIHtmX3NoYTEuaW5uZXJUZXh0ID0gZl9zaGExLmlubmVyVGV4dC5yZXBsYWNlKC9cL1wvLitcLy9pLCAnLy8nICsgbWVudV92YWx1ZSgnbWVudV9jdXN0b21GaWxlU2hhJykgKyAnLycpO30KICAgICAgICAgICAgICAgIC8vIOaJk+W8gOWIhuS6q+mTvuaOpQogICAgICAgICAgICAgICAgaWYgKG1lbnVfdmFsdWUoJ21lbnVfb3Blbl9maWxlU2hhJykpIHtmX3NoYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO0dNX29wZW5JblRhYihmX3NoYTEudGV4dENvbnRlbnQsIHthY3RpdmU6IHRydWUsaW5zZXJ0OiB0cnVlLHNldFBhcmVudDogdHJ1ZX0pO30KICAgICAgICAgICAgICAgIC8vIOWkjeWItuWIhuS6q+mTvuaOpe+8iOW5tuW3suWkjeWItueahOaPkOekuuS/oeaBr++8iQogICAgICAgICAgICAgICAgaWYgKG1lbnVfdmFsdWUoJ21lbnVfY29weV9maWxlU2hhJykpIHtmX3NoYS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO0dNX3NldENsaXBib2FyZChmX3NoYTEudGV4dENvbnRlbnQsICd0ZXh0Jyk7R01fbm90aWZpY2F0aW9uKHt0ZXh0OiAn5bey5aSN5Yi25YiG5Lqr6ZO+5o6lficsIHRpbWVvdXQ6IDIwMDB9KTt9CiAgICAgICAgICAgICAgICAvLyDnm7TmjqXkuIvovb3mlofku7YKICAgICAgICAgICAgICAgIC8vaWYgKG1lbnVfdmFsdWUoJ21lbnVfZGlyZWN0RG93bmxvYWQnKSkge2Zfc2hhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7R01fb3BlbkluVGFiKGZfc2hhMS50ZXh0Q29udGVudCArICcjZG93bmxvYWQnLCB7YWN0aXZlOiBmYWxzZSxpbnNlcnQ6IHRydWUsc2V0UGFyZW50OiB0cnVlfSk7fQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKCiAgICAvLyDoh6rlrprkuYnliIbkuqvpk77mjqXln5/lkI0KICAgIGZ1bmN0aW9uIGN1c3RvbUZpbGVTaGEoKSB7CiAgICAgICAgbGV0IG5ld0RvbWFpbiA9IHByb21wdCgn6K+36L6T5YWlIFvoh6rlrprkuYnliIbkuqvpk77mjqXln5/lkI1d77yM54K55Ye756Gu5a6a5ZCO56uL5Y2z55Sf5pWIXG7ok53lpY/kupHliIbkuqvpk77mjqXmnKvlsL7nmoQgSUQg5piv5ZSv5LiA55qE77yM6ICM5YmN6Z2i55qE5Z+f5ZCN55So6LCB55qE6YO95LiA5qC3XG7npLrkvovvvJpwYW4ubGFuem91aS5jb20g5oiWIHd3ZS5sYW56b3VpLmNvbSDmiJYgeGl1LmxhbnpvdWkuY29tJywgR01fZ2V0VmFsdWUoJ21lbnVfY3VzdG9tRmlsZVNoYScpKTsKICAgICAgICBpZiAobmV3RG9tYWluID09PSAnJykgewogICAgICAgICAgICBHTV9zZXRWYWx1ZSgnbWVudV9jdXN0b21GaWxlU2hhJywgJycpOwogICAgICAgICAgICByZWdpc3Rlck1lbnVDb21tYW5kKCk7IC8vIOmHjeaWsOazqOWGjOiEmuacrOiPnOWNlQogICAgICAgIH0gZWxzZSBpZiAobmV3RG9tYWluICE9IG51bGwpIHsKICAgICAgICAgICAgR01fc2V0VmFsdWUoJ21lbnVfY3VzdG9tRmlsZVNoYScsIG5ld0RvbWFpbik7CiAgICAgICAgICAgIHJlZ2lzdGVyTWVudUNvbW1hbmQoKTsgLy8g6YeN5paw5rOo5YaM6ISa5pys6I+c5Y2VCiAgICAgICAgfQogICAgfQoKCiAgICAvLyDpmpDol4/liIbkuqvpk77mjqXnqpflj6PvvIjov5nmoLfoh6rliqjmiZPlvIAv5aSN5Yi25YiG5Lqr6ZO+5o6l5pe277yM5LiN5Lya5LiA6Zeq6ICM6L+H77yJCiAgICBmdW5jdGlvbiBoaWRlU2hhKCl7CiAgICAgICAgaWYgKG1lbnVfdmFsdWUoJ21lbnVfb3Blbl9maWxlU2hhJykgfHwgbWVudV92YWx1ZSgnbWVudV9jb3B5X2ZpbGVTaGEnKSkgeyAvLyBb6Ieq5Yqo5aSN5Yi25YiG5Lqr6ZO+5o6lXSDmiJYgW+iHquWKqOaJk+W8gOWIhuS6q+mTvuaOpV0g5Lu75oSP5LiA5Liq5Yqf6IO95byA5ZCv5pe25omN57un57utCiAgICAgICAgICAgIG1haW5mcmFtZS5kb2N1bWVudC5sYXN0RWxlbWVudENoaWxkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJykpLnRleHRDb250ZW50ID0gJyNmX3NoYSB7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O30nOwogICAgICAgIH0KICAgIH0KCgogICAgLy8g56aB5q2i5rWP6KeI5Zmo6L+U5Zue77yI5bm257uR5a6a5paw55qE6L+U5Zue5LqL5Lu277yJCiAgICBmdW5jdGlvbiBmb2JpZGRlbkJhY2soKSB7CiAgICAgICAgaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgZG9jdW1lbnQuVVJMKTsKICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLGJhY2tFdmVudCkKICAgIH0KCgogICAgLy8g5YWB6K645rWP6KeI5Zmo6L+U5ZueCiAgICBmdW5jdGlvbiBlbmFibGVCYWNrKCkgewogICAgICAgIGhpc3RvcnkuZ28oLTEpOwogICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsYmFja0V2ZW50KQogICAgfQoKCiAgICAvLyDmtY/op4jlmajlkI7pgIDkuovku7blh73mlbAKICAgIGZ1bmN0aW9uIGJhY2tFdmVudCgpIHsKICAgICAgICBpZiAobGFzdEZvbGRlcklEKSB7CiAgICAgICAgICAgIG1haW5mcmFtZS5mb2xkZXIobGFzdEZvbGRlcklEKTsKICAgICAgICB9CiAgICAgICAgaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgZG9jdW1lbnQuVVJMKTsKICAgIH0KCgogICAgLy8g6I635Y+W5LiK5Liq5paH5Lu25aS5IElE77yI55So5LqO5rWP6KeI5Zmo5ZCO6YCA5LqL5Lu277yJCiAgICBmdW5jdGlvbiBnZXRMYXN0Rm9sZGVySUQoKSB7CiAgICAgICAgbGFzdEZvbGRlcklEID0gbnVsbAogICAgICAgIGxldCBmX3Rwc3BhbiA9IG1haW5mcmFtZS5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzcGFuLmZfdHBzcGFuJyk7CiAgICAgICAgaWYgKGZfdHBzcGFuLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgbGFzdEZvbGRlcklEID0gLy0/XGQrLy5leGVjKGZfdHBzcGFuW2ZfdHBzcGFuLmxlbmd0aCAtIDJdLmdldEF0dHJpYnV0ZSgnb25jbGljaycpKVswXTsKICAgICAgICB9CiAgICB9CgoKICAgIC8vIOi+k+WFpeWvhueggeWQjuWbnui9puehruiupAogICAgZnVuY3Rpb24gZW50ZXJUb1Bhc3MoKSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3B3ZCcpLm9ua2V5ZG93biA9IGZ1bmN0aW9uKGUpewogICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWInKS5jbGljaygpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KCgogICAgLy8g5b+r5o236L+U5Zue5LiK57qn77yI5Y+z6ZSu54K55Ye7IOe9kemhteWPs+S+py/kuIvmlrkg56m655m95aSE77yJCiAgICBmdW5jdGlvbiBiYWNrVG9Ub3AoKSB7CiAgICAgICAgbWFpbmZyYW1lLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXInKS5vbmNvbnRleHRtZW51ID0gbWFpbmZyYW1lLmRvY3VtZW50LmJvZHkub25jb250ZXh0bWVudSA9IGZ1bmN0aW9uKGUpewogICAgICAgICAgICBpZiAoZS50YXJnZXQgPT0gdGhpcykgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgYmFja0V2ZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgoKICAgIC8vIOebkeWQrCBYTUxIdHRwUmVxdWVzdCDkuovku7blubbmiafooYwKICAgIGZ1bmN0aW9uIEV2ZW50WE1MSHR0cFJlcXVlc3QoKSB7CiAgICAgICAgdmFyIF9zZW5kID0gbWFpbmZyYW1lLlhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5zZW5kCiAgICAgICAgZnVuY3Rpb24gc2VuZFJlcGxhY2VtZW50KGRhdGEpIHsKICAgICAgICAgICAgc2V0VGltZW91dChmaWxlTW9yZSwgMjAwKTsgLy8g6Ieq5Yqo5pi+56S65pu05aSa5paH5Lu2CiAgICAgICAgICAgIHNldFRpbWVvdXQoZmlsZVNoYSwgMjAwKTsgLy8g6Ieq5Yqo5omT5byA5YiG5Lqr6ZO+5o6l77yI54K55Ye75paH5Lu25pe277yJCiAgICAgICAgICAgIHNldFRpbWVvdXQocmlnaHRDbGlja01lbnUsIDUwMCk7IC8vIOWPs+mUruaWh+S7tuaYvuekuuiPnOWNlQogICAgICAgICAgICBzZXRUaW1lb3V0KGdldExhc3RGb2xkZXJJRCwgMjAwKTsgLy8g6I635Y+W5LiK5Liq5paH5Lu25aS5IElE77yI55So5LqO5rWP6KeI5Zmo5ZCO6YCA5LqL5Lu277yJCiAgICAgICAgICAgIHJldHVybiBfc2VuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgICBtYWluZnJhbWUuWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLnNlbmQgPSBzZW5kUmVwbGFjZW1lbnQ7CiAgICB9CgoKICAgIC8vIOebkeWQrOW5tuS/ruaUueWPs+mUruiPnOWNlSBb5aSW6ZO+5YiG5Lqr5Zyw5Z2AXSDkuLogW+WkjeWItuW5tuaJk+W8gOWIhuS6q+mTvuaOpV0gLyBb5aSN5Yi25YiG5Lqr6ZO+5o6lXSAvIFvmiZPlvIDliIbkuqvpk77mjqVdIOS5i+S4gAogICAgZnVuY3Rpb24gdmlld1RvcCgpIHsKICAgICAgICBjb25zdCBjYWxsYmFjayA9IChtdXRhdGlvbnNMaXN0LCBvYnNlcnZlcikgPT4gewogICAgICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9uc0xpc3QpIHsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIG11dGF0aW9uLmFkZGVkTm9kZXMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lm5vZGVUeXBlICE9IDEpIHJldHVybgogICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NOYW1lID09PSAnZl92aWV3JykgewogICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRhcmdldCkKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZfdmlld3RvcCA9IHRhcmdldC5xdWVyeVNlbGVjdG9yKCcuZl92aWV3dG9wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmX3ZpZXd0b3AgJiYgZl92aWV3dG9wLnRleHRDb250ZW50ID09PSAn5aSW6ZO+5YiG5Lqr5Zyw5Z2AJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbnVfdmFsdWUoJ21lbnVfb3Blbl9maWxlU2hhJykgJiYgbWVudV92YWx1ZSgnbWVudV9jb3B5X2ZpbGVTaGEnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfdmlld3RvcC50ZXh0Q29udGVudCA9ICflpI3liLblubbmiZPlvIDliIbkuqvpk77mjqUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZW51X3ZhbHVlKCdtZW51X29wZW5fZmlsZVNoYScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZl92aWV3dG9wLnRleHRDb250ZW50ID0gJ+aJk+W8gOWIhuS6q+mTvuaOpSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lbnVfdmFsdWUoJ21lbnVfY29weV9maWxlU2hhJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX3ZpZXd0b3AudGV4dENvbnRlbnQgPSAn5aSN5Yi25YiG5Lqr6ZO+5o6lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7CiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShtYWluZnJhbWUuZG9jdW1lbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pOwogICAgfQoKICAgIC8vIOaWh+S7tuaOkuW6jwogICAgZnVuY3Rpb24gZmlsZXNTb3J0KCkgewogICAgICAgIGNvbnN0IGZyYW1lID0gbWFpbmZyYW1lOwogICAgICAgIGNvbnN0IGZyYW1lRG9jID0gZnJhbWUuZG9jdW1lbnQ7CgogICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0dXMgPSB7CiAgICAgICAgICAgIGJ5OiAnbmFtZScsCiAgICAgICAgICAgIG9yZGVyOiAnYXNjJywKICAgICAgICB9CgogICAgICAgIGxldCBhbGxCdXR0b25zID0gdW5kZWZpbmVkOwoKICAgICAgICAvLyDmlofku7blkI3mjpLluo8KICAgICAgICBmdW5jdGlvbiBzb3J0QnlOYW1lKG5hbWUxLCBuYW1lMikgewogICAgICAgICAgICBmdW5jdGlvbiBzb3J0KGEsIGIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN0ckEgPSBhLnRvTG9jYWxlTG93ZXJDYXNlKCkuc3BsaXQoJycpOwogICAgICAgICAgICAgICAgY29uc3Qgc3RyQiA9IGIudG9Mb2NhbGVMb3dlckNhc2UoKS5zcGxpdCgnJyk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ckEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyQVtpXSA9PT0gc3RyQltpXSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ckJbaV0gPT09IHVuZGVmaW5lZCkgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5vdENoaW5lc2Uoc3RyQVtpXSkgJiYgbm90Q2hpbmVzZShzdHJCW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyQVtpXSA8IHN0ckJbaV0gPyAtMSA6IDE7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub3RDaGluZXNlKHN0ckFbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vdENoaW5lc2Uoc3RyQltpXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ckFbaV0ubG9jYWxlQ29tcGFyZShzdHJCW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RyQS5sZW5ndGggPT09IHN0ckIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckEubGVuZ3RoIDwgc3RyQi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBub3RDaGluZXNlKGNoYXIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJDb2RlID0gY2hhci5jaGFyQ29kZUF0KDApCiAgICAgICAgICAgICAgICByZXR1cm4gY2hhckNvZGUgPj0gMCAmJiBjaGFyQ29kZSA8PSAxMjgKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc29ydChuYW1lMSwgbmFtZTIpOwogICAgICAgIH0KCiAgICAgICAgLy8g5Yib5bu65o6S5bqP5oyJ6YiVCiAgICAgICAgZnVuY3Rpb24gY3JlYXRlQWxsQnV0dG9ucygpIHsKICAgICAgICAgICAgY29uc3QgdGFiVGl0bGUgPSBmcmFtZURvYy5xdWVyeVNlbGVjdG9yKCcjY29udGFpbmVyID4gZGl2Lm4xID4gZGl2LmZfdGgnKTsKICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRhYlRpdGxlLnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5mX25hbWUnKTsKICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHRhYlRpdGxlLnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5mX3NpemUnKTsKICAgICAgICAgICAgY29uc3QgdGltZSA9IHRhYlRpdGxlLnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5mX3RpbWUnKTsKICAgICAgICAgICAgY29uc3QgZG93biA9IHRhYlRpdGxlLnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5mX2Rvd24nKTsgLy8g5LiL6L296YePCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBuYW1lOiB7CiAgICAgICAgICAgICAgICAgICAgZWw6IGNyZWF0ZUJ1dHRvbihuYW1lLCAnbmFtZScsICfmjIkg5paH5Lu25ZCN56ewIOaOkuW6jycpLAogICAgICAgICAgICAgICAgICAgIG9yZGVyOiAnYXNjJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzaXplOiB7CiAgICAgICAgICAgICAgICAgICAgZWw6IGNyZWF0ZUJ1dHRvbihzaXplLCAnc2l6ZScsICfmjIkg5paH5Lu25aSn5bCPIOaOkuW6jycpLAogICAgICAgICAgICAgICAgICAgIG9yZGVyOiAnYXNjJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0aW1lOiB7CiAgICAgICAgICAgICAgICAgICAgZWw6IGNyZWF0ZUJ1dHRvbih0aW1lLCAndGltZScsICfmjIkg5LiK5Lyg5pe26Ze0IOaOkuW6jycpLAogICAgICAgICAgICAgICAgICAgIG9yZGVyOiAnYXNjJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkb3duOiB7CiAgICAgICAgICAgICAgICAgICAgZWw6IGNyZWF0ZUJ1dHRvbihkb3duLCAnZG93bicsICfmjIkg5LiL6L295qyh5pWwIOaOkuW6jycpLAogICAgICAgICAgICAgICAgICAgIG9yZGVyOiAnYXNjJywKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY3JlYXRlQnV0dG9uKGVsZW1lbnQsIGJ5LCB0aXRsZSkgewogICAgICAgICAgICAvLyBlbGVtZW50Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgJzxhIGNsYXNzPSJjb2xfc29ydF9idG4iIGhyZWY9ImphdmFzY3JpcHQ6IHZvaWQ7IiBzdHlsZT0iZm9udC1zaXplOiAxNnB4OyBmbG9hdDogcmlnaHQ7Ij7ih6c8L2E+Jyk7CiAgICAgICAgICAgIGxldCBidXR0b24gPSBmcmFtZURvYy5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgICAgIGJ1dHRvbi5jbGFzc05hbWUgPSAnY29sX3NvcnRfYnRuJzsKICAgICAgICAgICAgYnV0dG9uLmhyZWYgPSAnamF2YXNjcmlwdDogdm9pZCgwKTsnOwogICAgICAgICAgICBidXR0b24uc3R5bGUuZm9udFNpemUgPSAnMTZweCc7CiAgICAgICAgICAgIGJ1dHRvbi5zdHlsZS5mbG9hdCA9ICdyaWdodCc7CiAgICAgICAgICAgIGlmIChieSA9PSAnbmFtZScpIHtidXR0b24uc3R5bGUuZmxvYXQgPSAnbGVmdCc7fQogICAgICAgICAgICBidXR0b24udGl0bGUgPSB0aXRsZTsKICAgICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ+KHpyc7CiAgICAgICAgICAgIGJ1dHRvbi5vbmNsaWNrID0gKCkgPT4gY2xpY2tTb3J0QnV0dG9uKGJ5LCBidXR0b24pOwogICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGJ1dHRvbik7CiAgICAgICAgICAgIHJldHVybiBidXR0b247CiAgICAgICAgfQoKCiAgICAgICAgZnVuY3Rpb24gZ2V0RmlsZXMoKSB7CiAgICAgICAgICAgIGNvbnN0IGxpc3QgPSBmcmFtZURvYy5xdWVyeVNlbGVjdG9yKCcjZmlsZWxpc3QnKTsKICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBsaXN0LmNoaWxkTm9kZXM7CiAgICAgICAgICAgIGNvbnN0IGZpbGVzSW5mbyA9IFtdOwogICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBmaWxlLnF1ZXJ5U2VsZWN0b3IoJy5mX25hbWUgPiBzcGFuLmFzcGFubGluayA+IC5mX25hbWVfdGl0bGUnKS50ZXh0Q29udGVudDsKICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSBwYXJzZUJ5dGVTaXplKGZpbGUucXVlcnlTZWxlY3RvcignLmZfc2l6ZScpLnRleHRDb250ZW50KTsKICAgICAgICAgICAgICAgIGNvbnN0IHRpbWUgPSBmaWxlLnF1ZXJ5U2VsZWN0b3IoJy5mX3RpbWUnKS50ZXh0Q29udGVudDsKICAgICAgICAgICAgICAgIGNvbnN0IGRvd24gPSBwYXJzZUludChmaWxlLnF1ZXJ5U2VsZWN0b3IoJy5mX2Rvd24nKS50ZXh0Q29udGVudCk7CiAgICAgICAgICAgICAgICBmaWxlc0luZm8ucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgaW5mbzogewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lOiBwYXJzZVRpbWUobm93LCB0aW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgZG93bjogZG93bgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbm9kZTogZmlsZQogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmlsZXNJbmZvOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0Rm9sZGVycygpIHsKICAgICAgICAgICAgY29uc3QgbGlzdCA9IGZyYW1lRG9jLnF1ZXJ5U2VsZWN0b3IoJyNzdWJfZm9sZGVyX2xpc3QnKTsKICAgICAgICAgICAgY29uc3QgZm9sZGVycyA9IGxpc3QuY2hpbGROb2RlczsKICAgICAgICAgICAgY29uc3QgZm9sZGVyc0luZm8gPSBbXTsKICAgICAgICAgICAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykgewogICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGZvbGRlci5xdWVyeVNlbGVjdG9yKCcuZl90YiA+IC5mX25hbWUyID4gc3Bhbi5mb2xsaW5rID4gc3BhbicpLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgZm9sZGVyc0luZm8ucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgaW5mbzogewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbm9kZTogZm9sZGVyCiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmb2xkZXJzSW5mbzsKICAgICAgICB9CiAgICAgICAgLy8g6L2s5o2i5paH5Lu25aSn5bCPCiAgICAgICAgZnVuY3Rpb24gcGFyc2VCeXRlU2l6ZSh0ZXh0KSB7CiAgICAgICAgICAgIGNvbnN0IHVuaXQgPSBbJ0InLCAnSycsICdNJywgJ0cnLCAnVCddOwogICAgICAgICAgICBsZXQgc2l6ZSA9IDA7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHRleHQuaW5kZXhPZih1bml0W2ldKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKHVuaXRbaV0sICcnKSkgKiBNYXRoLnBvdygxMDI0LCBpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2l6ZTsKICAgICAgICB9CiAgICAgICAgLy8g6L2s5o2i5pe26Ze05qC85byPCiAgICAgICAgZnVuY3Rpb24gcGFyc2VUaW1lKG5vdywgdGV4dCkgewogICAgICAgICAgICBmdW5jdGlvbiBwYXJzZURheSh0aW1lKSB7CiAgICAgICAgICAgICAgICBjb25zdCBkYXlzID0gWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ+WJjeWkqScsCiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogLTIsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICfmmKjlpKknLAogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IC0xLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUobm93LmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAtMTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0aW1lLmluZGV4T2YoZGF5c1tpXS5uYW1lKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkpOwogICAgICAgICAgICAgICAgY29uc3QgaG91ckFuZE1pbnV0ZSA9IHRleHQucmVwbGFjZShkYXlzW2luZGV4XS5uYW1lLCAnJykuc3BsaXQoJzonKTsKICAgICAgICAgICAgICAgIGNvbnN0IGhvdXIgPSBwYXJzZUludChob3VyQW5kTWludXRlWzBdKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1pbnV0ZSA9IHBhcnNlSW50KGhvdXJBbmRNaW51dGVbMV0pOwogICAgICAgICAgICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgZGF5c1tpbmRleF0ub2Zmc2V0KTsKICAgICAgICAgICAgICAgIGRhdGUuc2V0SG91cnMoaG91cik7CiAgICAgICAgICAgICAgICBkYXRlLnNldE1pbnV0ZXMobWludXRlKTsKICAgICAgICAgICAgICAgIC8vIOiTneWlj+S6keaYvuekuuavlOi+g+Wlh+aAqu+8jOi2hei/hzI05bCP5pe277yM5pyq5ruhNDjlsI/ml7bvvIzpg73mmK/mmKjlpKnvvIzlubbkuI3ku6Xmr4/lpKkw54K55L2c5Li65YiG55WMCiAgICAgICAgICAgICAgICBpZiAoaG91ciAqIDYwICsgbWludXRlID4gbm93LmdldEhvdXJzKCkgKiA2MCArIG5vdy5nZXRNaW51dGVzKCkpIHsKICAgICAgICAgICAgICAgICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBkYXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0ZXh0LmluZGV4T2YoJ+enkuWJjScpID4gLTEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBub3cuZ2V0VGltZSgpIC0gcGFyc2VJbnQodGV4dC5yZXBsYWNlKCfnp5LliY0nLCAnJykpICogMTAwMDsKICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0LmluZGV4T2YoJ+WIhumSn+WJjScpID4gLTEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBub3cuZ2V0VGltZSgpIC0gcGFyc2VJbnQodGV4dC5yZXBsYWNlKCfliIbpkp/liY0nLCAnJykpICogNjAgKiAxMDAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQuaW5kZXhPZign5bCP5pe25YmNJykgPiAtMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5vdy5nZXRUaW1lKCkgLSBwYXJzZUludCh0ZXh0LnJlcGxhY2UoJ+Wwj+aXtuWJjScsICcnKSkgKiA2MCAqIDYwICogMTAwMDsKICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0LmluZGV4T2YoJ+aYqOWkqScpID4gLTEgfHwgdGV4dC5pbmRleE9mKCfliY3lpKknKSA+IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VEYXkodGV4dCkuZ2V0VGltZSgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQuaW5kZXhPZign5aSp5YmNJykgPiAtMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5vdy5nZXRUaW1lKCkgLSBwYXJzZUludCh0ZXh0LnJlcGxhY2UoJ+WkqeWJjScsICcnKSkgKiAyNCAqIDYwICogNjAgKiAxMDAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQuaW5kZXhPZign5pyI5YmNJykgPiAtMSkgeyAvLyDmiJHkuI3nn6XpgZPmnInmsqHmnInku6XkuIvlh6Dnp43mg4XlhrXvvIzmmoLml7blhYjlhpnkuIoKICAgICAgICAgICAgICAgIHJldHVybiBub3cuZ2V0VGltZSgpIC0gcGFyc2VJbnQodGV4dC5yZXBsYWNlKCfmnIjliY0nLCAnJykpICogMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRleHQuaW5kZXhPZign5bm05YmNJykgPiAtMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5vdy5nZXRUaW1lKCkgLSBwYXJzZUludCh0ZXh0LnJlcGxhY2UoJ+W5tOWJjScsICcnKSkgKiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBEYXRlLnBhcnNlKHRleHQpOwogICAgICAgIH0KCiAgICAgICAgLy8g5o6S5bqPCiAgICAgICAgZnVuY3Rpb24gc29ydEl0ZW1zKGZpbGVzLCBieSwgb3JkZXIpIHsKICAgICAgICAgICAgbGV0IGNvbXBhcmVGdW5jOwogICAgICAgICAgICBpZiAoYnkgPT09ICduYW1lJykgewogICAgICAgICAgICAgICAgY29tcGFyZUZ1bmMgPSAoYSwgYikgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiAob3JkZXIgPT09ICdhc2MnID8gMSA6IC0xKSAqIHNvcnRCeU5hbWUoYS5pbmZvLm5hbWUsIGIuaW5mby5uYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbXBhcmVGdW5jID0gKGEsIGIpID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhLmluZm9bYnldID4gYi5pbmZvW2J5XSA/IDEgOiAtMTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9yZGVyID09PSAnYXNjJyA/IDEgOiAtMSkgKiByZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmlsZXMuc29ydChjb21wYXJlRnVuYyk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzb3J0RmlsZUxpc3QoKSB7CiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gZ2V0RmlsZXMoKTsKICAgICAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHNvcnRJdGVtcyhmaWxlcywgY3VycmVudFN0YXR1cy5ieSwgY3VycmVudFN0YXR1cy5vcmRlcik7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhmaWxlcykKICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVMaXN0ID0gZnJhbWVEb2MucXVlcnlTZWxlY3RvcignI2ZpbGVsaXN0Jyk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZUxpc3QuYXBwZW5kQ2hpbGQoZmlsZXNbaV0ubm9kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNvcnRGb2xkZXJMaXN0KCkgewogICAgICAgICAgICBjb25zdCBmb2xkZXJzID0gZ2V0Rm9sZGVycygpOwogICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhmb2xkZXJzKTsKICAgICAgICAgICAgaWYgKGZvbGRlcnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgLy8g5paH5Lu25aS55Y+q6IO95oyJ5ZCN56ew5o6S5bqPCiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN0YXR1cy5ieSA9PT0gJ25hbWUnKSB7CiAgICAgICAgICAgICAgICAgICAgc29ydEl0ZW1zKGZvbGRlcnMsICduYW1lJywgY3VycmVudFN0YXR1cy5vcmRlcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNvcnRJdGVtcyhmb2xkZXJzLCAnbmFtZScsICdhc2MnKTsgLy8g5YW25LuW5oOF5Ya177yM55qG5oyJ5ZCN56ew5Y2H5bqPCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBmb2xkZXJMaXN0ID0gZnJhbWVEb2MucXVlcnlTZWxlY3RvcignI3N1Yl9mb2xkZXJfbGlzdCcpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb2xkZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgZm9sZGVyTGlzdC5hcHBlbmRDaGlsZChmb2xkZXJzW2ldLm5vZGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBmaWxlTGlzdENhbGxiYWNrKHJlY29yZHMpIHsKICAgICAgICAgICAgaWYgKCFtZW51X3ZhbHVlKCdtZW51X2ZpbGVTb3J0JykpIHJldHVybjsKICAgICAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiByZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAvLyDoh6rlt7Hkv67mlLnnmoTml7blgJnkuI3mjpLluo8KICAgICAgICAgICAgICAgIGlmIChldmVudC5yZW1vdmVkTm9kZXMubGVuZ3RoID4gMCkgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNvcnRGaWxlTGlzdCgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZm9sZGVyTGlzdENhbGxiYWNrKHJlY29yZHMpIHsKICAgICAgICAgICAgaWYgKCFtZW51X3ZhbHVlKCdtZW51X2ZpbGVTb3J0JykpIHJldHVybjsKICAgICAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiByZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAvLyDoh6rlt7Hkv67mlLnnmoTml7blgJnkuI3mjpLluo8KICAgICAgICAgICAgICAgIGlmIChldmVudC5yZW1vdmVkTm9kZXMubGVuZ3RoID4gMCkgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNvcnRGb2xkZXJMaXN0KCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjbGlja1NvcnRCdXR0b24oYnksIGJ1dHRvbikgewogICAgICAgICAgICBpZiAoY3VycmVudFN0YXR1cy5ieSA9PT0gYnkpIHsKICAgICAgICAgICAgICAgIC8vIOW9k+WJjemAiemhue+8jOeCueWHu+aXtu+8jOWPjei9rOaOkuW6jwogICAgICAgICAgICAgICAgY3VycmVudFN0YXR1cy5vcmRlciA9IGJ1dHRvbi50ZXh0Q29udGVudCA9PT0gJ+KshicgPyAnZGVzYycgOiAnYXNjJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIOmdnuW9k+WJjemAiemhue+8jOeCueWHu+aXtu+8jOS7peWbvuagh+aJgOekuueahOmhuuW6j+aOkuW6jwogICAgICAgICAgICAgICAgY3VycmVudFN0YXR1cy5vcmRlciA9IGJ1dHRvbi50ZXh0Q29udGVudCA9PT0gJ+KHpycgPyAnYXNjJyA6ICdkZXNjJzsKICAgICAgICAgICAgICAgIC8vIOS/ruaUuemdnuW9k+WJjemAiemhueaMiemSrueahOWbvuaghwogICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYWxsQnV0dG9ucykgewogICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IGJ5KSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYWxsQnV0dG9ucywga2V5KSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidG5JdGVtID0gYWxsQnV0dG9uc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnRuSXRlbS5lbC50ZXh0Q29udGVudCA9PT0gJ+KshicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0bkl0ZW0uZWwudGV4dENvbnRlbnQgPSAn4oenJzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChidG5JdGVtLmVsLnRleHRDb250ZW50ID09PSAn4qyHJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRuSXRlbS5lbC50ZXh0Q29udGVudCA9ICfih6knOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IGN1cnJlbnRTdGF0dXMub3JkZXIgPT09ICdhc2MnID8gJ+KshicgOiAn4qyHJzsKICAgICAgICAgICAgY3VycmVudFN0YXR1cy5ieSA9IGJ5OwogICAgICAgICAgICBzb3J0RmlsZUxpc3QoKTsKICAgICAgICAgICAgc29ydEZvbGRlckxpc3QoKTsKCiAgICAgICAgfQoKICAgICAgICAvLyBjcmVhdGUgYnV0dG9ucwogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICBpZiAoYWxsQnV0dG9ucyA9PT0gdW5kZWZpbmVkICYmIG1lbnVfdmFsdWUoJ21lbnVfZmlsZVNvcnQnKSkgewogICAgICAgICAgICAgICAgYWxsQnV0dG9ucyA9IGNyZWF0ZUFsbEJ1dHRvbnMoKTsKICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGFsbEJ1dHRvbnMpOwogICAgICAgICAgICAgICAgYWxsQnV0dG9uc1tjdXJyZW50U3RhdHVzLmJ5XS5lbC50ZXh0Q29udGVudCA9IGN1cnJlbnRTdGF0dXMub3JkZXIgPT09ICdhc2MnID8gJ+KshicgOiAn4qyHJzsKICAgICAgICAgICAgfQogICAgICAgIH0sIDUwMCk7CgogICAgICAgIC8vIHNvcnQgZmlsZXMKICAgICAgICBjb25zdCBmaWxlTGlzdCA9IGZyYW1lRG9jLnF1ZXJ5U2VsZWN0b3IoJyNmaWxlbGlzdCcpOwogICAgICAgIGNvbnN0IGZpbGVPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZpbGVMaXN0Q2FsbGJhY2spOwogICAgICAgIGZpbGVPYnNlcnZlci5vYnNlcnZlKGZpbGVMaXN0LCB7IGNoaWxkTGlzdDogdHJ1ZSwgYXR0cmlidXRlczogZmFsc2UgfSk7CgogICAgICAgIC8vIHNvcnQgZm9sZGVycwogICAgICAgIGNvbnN0IGZvbGRlckxpc3QgPSBmcmFtZURvYy5xdWVyeVNlbGVjdG9yKCcjc3ViX2ZvbGRlcl9saXN0Jyk7OwogICAgICAgIGNvbnN0IGZvbGRlck9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZm9sZGVyTGlzdENhbGxiYWNrKTsKICAgICAgICBmb2xkZXJPYnNlcnZlci5vYnNlcnZlKGZvbGRlckxpc3QsIHsgY2hpbGRMaXN0OiB0cnVlLCBhdHRyaWJ1dGVzOiBmYWxzZSB9KTsKCgogICAgfQp9KSgpOw=="},{"name":"秒传链接提取","options":{"check_for_updates":true,"comment":null,"compat_foreach":false,"compat_metadata":false,"compat_powerful_this":null,"compat_wrappedjsobject":false,"compatopts_for_requires":true,"noframes":null,"override":{"merge_connects":true,"merge_excludes":true,"merge_includes":true,"merge_matches":true,"orig_connects":["baidu.com","baidupcs.com","cdn.jsdelivr.net","*"],"orig_excludes":[],"orig_includes":[],"orig_matches":["*://pan.baidu.com/disk/home*","*://pan.baidu.com/disk/main*","*://pan.baidu.com/disk/synchronization*","*://pan.baidu.com/s/*","*://yun.baidu.com/disk/home*","*://yun.baidu.com/disk/main*","*://pan.baidu.com/disk/synchronization*","*://yun.baidu.com/s/*","*://wangpan.baidu.com/disk/home*","*://wangpan.baidu.com/disk/main*","*://pan.baidu.com/disk/synchronization*","*://wangpan.baidu.com/s/*"],"orig_noframes":null,"orig_run_at":"document-body","use_blockers":[],"use_connects":[],"use_excludes":[],"use_includes":[],"use_matches":[]},"run_at":null,"sandbox":null,"tab_types":null,"unwrap":null},"storage":{"ts":1676466395381,"data":{"2.4.2_no_first":"btrue","2.5.3_no_first":"btrue","2.5.7_no_first":"btrue","2.5.8_no_first":"btrue","last_dir":"s","unClose":"bfalse","with_path":"bfalse"}},"enabled":true,"position":19,"file_url":"https://greasyfork.org/scripts/424574-%E7%A7%92%E4%BC%A0%E9%93%BE%E6%8E%A5%E6%8F%90%E5%8F%96/code/%E7%A7%92%E4%BC%A0%E9%93%BE%E6%8E%A5%E6%8F%90%E5%8F%96.user.js","uuid":"a632f873-0a16-44df-a0e9-62410755ecd6","source":"Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgICDnp5LkvKDpk77mjqXmj5Dlj5YKLy8gQHZlcnNpb24gICAgICAgICAyLjYuMAovLyBAYXV0aG9yICAgICAgICAgIG1lbmd6b25lZmlyZQovLyBAZGVzY3JpcHRpb24gICAgIOeUqOS6juaPkOWPluWSjOeUn+aIkOeZvuW6pue9keebmOenkuS8oOmTvuaOpQovLyBAaG9tZXBhZ2UgICAgICAgIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80MjQ1NzQKLy8gQHN1cHBvcnRVUkwgICAgICBodHRwczovL2dpdGh1Yi5jb20vbWVuZ3pvbmVmaXJlL3JhcGlkLXVwbG9hZC11c2Vyc2NyaXB0L2lzc3VlcwovLyBAbWF0Y2ggICAgICAgICAgICo6Ly9wYW4uYmFpZHUuY29tL2Rpc2svaG9tZSoKLy8gQG1hdGNoICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9kaXNrL21haW4qCi8vIEBtYXRjaCAgICAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vZGlzay9zeW5jaHJvbml6YXRpb24qCi8vIEBtYXRjaCAgICAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vcy8qCi8vIEBtYXRjaCAgICAgICAgICAgKjovL3l1bi5iYWlkdS5jb20vZGlzay9ob21lKgovLyBAbWF0Y2ggICAgICAgICAgICo6Ly95dW4uYmFpZHUuY29tL2Rpc2svbWFpbioKLy8gQG1hdGNoICAgICAgICAgICAqOi8vcGFuLmJhaWR1LmNvbS9kaXNrL3N5bmNocm9uaXphdGlvbioKLy8gQG1hdGNoICAgICAgICAgICAqOi8veXVuLmJhaWR1LmNvbS9zLyoKLy8gQG1hdGNoICAgICAgICAgICAqOi8vd2FuZ3Bhbi5iYWlkdS5jb20vZGlzay9ob21lKgovLyBAbWF0Y2ggICAgICAgICAgICo6Ly93YW5ncGFuLmJhaWR1LmNvbS9kaXNrL21haW4qCi8vIEBtYXRjaCAgICAgICAgICAgKjovL3Bhbi5iYWlkdS5jb20vZGlzay9zeW5jaHJvbml6YXRpb24qCi8vIEBtYXRjaCAgICAgICAgICAgKjovL3dhbmdwYW4uYmFpZHUuY29tL3MvKgovLyBAbmFtZTplbiAgICAgICAgIHJhcGlkdXBsb2FkLXVzZXJzY3JpcHQKLy8gQGxpY2Vuc2UgICAgICAgICBHUEx2MwovLyBAaWNvbiAgICAgICAgICAgIGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBWUFBQUFmOC85aEFBQUJCVWxFUVZSNEFaVFRKUkJVVVJUSDRUdER3WHVQZFByZ2JoSFhpa3NmM0NQdWNSTlNjSGQzZDNkM3VPOWJLZXU3Yjc5K2Z1bjhRMTdDTkh5TU1VcWFpUEU0ZkV5WVZqakdOS25Od1E0bHBnVjhsTWFuRWZ3Zm9zTEhFR1BVMU4zWm5BdjRxbFQrTmlRNTZ1UFdTaktCcnp0VVNuSWFCNjZzWTF2Z3hneG9NWEI1TmJzQ0I5cnhjQjVmTjJNNS8xNm5DRnhlUzZZVGV6cHpzQjFQdS9DMk83Lzc4Lzk5ZVlCWUhYaCtncWRIT2JHSUs0R0hnZXZqVkl0MUFnQW5odkU0Y0dlOGV1b0hiaXpnWXVEMlJHZ3g4TzBScHdJUFJtc21KREdxY3JBTmQzcExvL3FWcjAzaFVsY3BmU3dmMC92RDNKd2tQZFBLNS96aGtPeisvZjFGSUR2L1Jjbk9BRWp5d0gvRGhnQURBQUFBQUVsRlRrU3VRbUNDCi8vIEBuYW1lc3BhY2UgICAgICAgbW9lLmNhbmdrdS5tZW5nem9uZWZpcmUKLy8gQGhvbWVwYWdlVVJMICAgICBodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvNDI0NTc0Ci8vIEBjb250cmlidXRpb25VUkwgaHR0cHM6Ly9hZmRpYW4ubmV0L0BtZW5nem9uZWZpcmUKLy8gQGRlc2NyaXB0aW9uOmVuICBpbnB1dCBiZGxpbmsgdG8gZ2V0IGZpbGVzIG9yIGdldCBiZGxpbmsgZm9yIEJhaWR14oSiIFdlYkRpc2suCi8vIEBjb21wYXRpYmxlICAgICAgZmlyZWZveCBWaW9sZW50bW9ua2V5Ci8vIEBjb21wYXRpYmxlICAgICAgZmlyZWZveCBUYW1wZXJtb25rZXkKLy8gQGNvbXBhdGlibGUgICAgICBjaHJvbWUgVmlvbGVudG1vbmtleQovLyBAY29tcGF0aWJsZSAgICAgIGNocm9tZSBUYW1wZXJtb25rZXkKLy8gQGNvbXBhdGlibGUgICAgICBlZGdlIFZpb2xlbnRtb25rZXkKLy8gQGNvbXBhdGlibGUgICAgICBlZGdlIFRhbXBlcm1vbmtleQovLyBAZ3JhbnQgICAgICAgICAgIEdNX3NldFZhbHVlCi8vIEBncmFudCAgICAgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgICAgICBHTV9kZWxldGVWYWx1ZQovLyBAZ3JhbnQgICAgICAgICAgIEdNX3NldENsaXBib2FyZAovLyBAZ3JhbnQgICAgICAgICAgIEdNX2FkZFN0eWxlCi8vIEBncmFudCAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3QKLy8gQGdyYW50ICAgICAgICAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kCi8vIEBncmFudCAgICAgICAgICAgdW5zYWZlV2luZG93Ci8vIEBydW4tYXQgICAgICAgICAgZG9jdW1lbnQtYm9keQovLyBAY29ubmVjdCAgICAgICAgIGJhaWR1LmNvbQovLyBAY29ubmVjdCAgICAgICAgIGJhaWR1cGNzLmNvbQovLyBAY29ubmVjdCAgICAgICAgIGNkbi5qc2RlbGl2ci5uZXQKLy8gQGNvbm5lY3QgICAgICAgICAqCi8vID09L1VzZXJTY3JpcHQ9PQoKLyoqKioqKi8gKCgpID0+IHsgLy8gd2VicGFja0Jvb3RzdHJhcAovKioqKioqLyAJdmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoewoKLyoqKi8gMzIyOgovKioqLyAoKG1vZHVsZSkgPT4gewoKKGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICBpZiAodHJ1ZSkgewogICAgICAgIC8vIE5vZGUvQ29tbW9uSlMKICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKICAgIH0gZWxzZSB7IHZhciBnbG9iOyB9Cn0oZnVuY3Rpb24gKHVuZGVmaW5lZCkgewoKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvKgogICAgICogRmFzdGVzdCBtZDUgaW1wbGVtZW50YXRpb24gYXJvdW5kIChKS00gbWQ1KS4KICAgICAqIENyZWRpdHM6IEpvc2VwaCBNeWVycwogICAgICoKICAgICAqIEBzZWUgaHR0cDovL3d3dy5teWVyc2RhaWx5Lm9yZy9qb3NlcGgvamF2YXNjcmlwdC9tZDUtdGV4dC5odG1sCiAgICAgKiBAc2VlIGh0dHA6Ly9qc3BlcmYuY29tL21kNS1zaG9vdG91dC83CiAgICAgKi8KCiAgICAvKiB0aGlzIGZ1bmN0aW9uIGlzIG11Y2ggZmFzdGVyLAogICAgICBzbyBpZiBwb3NzaWJsZSB3ZSB1c2UgaXQuIFNvbWUgSUVzCiAgICAgIGFyZSB0aGUgb25seSBvbmVzIEkga25vdyBvZiB0aGF0CiAgICAgIG5lZWQgdGhlIGlkaW90aWMgc2Vjb25kIGZ1bmN0aW9uLAogICAgICBnZW5lcmF0ZWQgYnkgYW4gaWYgY2xhdXNlLiAgKi8KICAgIHZhciBhZGQzMiA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgcmV0dXJuIChhICsgYikgJiAweEZGRkZGRkZGOwogICAgfSwKICAgICAgICBoZXhfY2hyID0gWycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ107CgoKICAgIGZ1bmN0aW9uIGNtbihxLCBhLCBiLCB4LCBzLCB0KSB7CiAgICAgICAgYSA9IGFkZDMyKGFkZDMyKGEsIHEpLCBhZGQzMih4LCB0KSk7CiAgICAgICAgcmV0dXJuIGFkZDMyKChhIDw8IHMpIHwgKGEgPj4+ICgzMiAtIHMpKSwgYik7CiAgICB9CgogICAgZnVuY3Rpb24gbWQ1Y3ljbGUoeCwgaykgewogICAgICAgIHZhciBhID0geFswXSwKICAgICAgICAgICAgYiA9IHhbMV0sCiAgICAgICAgICAgIGMgPSB4WzJdLAogICAgICAgICAgICBkID0geFszXTsKCiAgICAgICAgYSArPSAoYiAmIGMgfCB+YiAmIGQpICsga1swXSAtIDY4MDg3NjkzNiB8IDA7CiAgICAgICAgYSAgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiB8IDA7CiAgICAgICAgZCArPSAoYSAmIGIgfCB+YSAmIGMpICsga1sxXSAtIDM4OTU2NDU4NiB8IDA7CiAgICAgICAgZCAgPSAoZCA8PCAxMiB8IGQgPj4+IDIwKSArIGEgfCAwOwogICAgICAgIGMgKz0gKGQgJiBhIHwgfmQgJiBiKSArIGtbMl0gKyA2MDYxMDU4MTkgfCAwOwogICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDsKICAgICAgICBiICs9IChjICYgZCB8IH5jICYgYSkgKyBrWzNdIC0gMTA0NDUyNTMzMCB8IDA7CiAgICAgICAgYiAgPSAoYiA8PCAyMiB8IGIgPj4+IDEwKSArIGMgfCAwOwogICAgICAgIGEgKz0gKGIgJiBjIHwgfmIgJiBkKSArIGtbNF0gLSAxNzY0MTg4OTcgfCAwOwogICAgICAgIGEgID0gKGEgPDwgNyB8IGEgPj4+IDI1KSArIGIgfCAwOwogICAgICAgIGQgKz0gKGEgJiBiIHwgfmEgJiBjKSArIGtbNV0gKyAxMjAwMDgwNDI2IHwgMDsKICAgICAgICBkICA9IChkIDw8IDEyIHwgZCA+Pj4gMjApICsgYSB8IDA7CiAgICAgICAgYyArPSAoZCAmIGEgfCB+ZCAmIGIpICsga1s2XSAtIDE0NzMyMzEzNDEgfCAwOwogICAgICAgIGMgID0gKGMgPDwgMTcgfCBjID4+PiAxNSkgKyBkIHwgMDsKICAgICAgICBiICs9IChjICYgZCB8IH5jICYgYSkgKyBrWzddIC0gNDU3MDU5ODMgfCAwOwogICAgICAgIGIgID0gKGIgPDwgMjIgfCBiID4+PiAxMCkgKyBjIHwgMDsKICAgICAgICBhICs9IChiICYgYyB8IH5iICYgZCkgKyBrWzhdICsgMTc3MDAzNTQxNiB8IDA7CiAgICAgICAgYSAgPSAoYSA8PCA3IHwgYSA+Pj4gMjUpICsgYiB8IDA7CiAgICAgICAgZCArPSAoYSAmIGIgfCB+YSAmIGMpICsga1s5XSAtIDE5NTg0MTQ0MTcgfCAwOwogICAgICAgIGQgID0gKGQgPDwgMTIgfCBkID4+PiAyMCkgKyBhIHwgMDsKICAgICAgICBjICs9IChkICYgYSB8IH5kICYgYikgKyBrWzEwXSAtIDQyMDYzIHwgMDsKICAgICAgICBjICA9IChjIDw8IDE3IHwgYyA+Pj4gMTUpICsgZCB8IDA7CiAgICAgICAgYiArPSAoYyAmIGQgfCB+YyAmIGEpICsga1sxMV0gLSAxOTkwNDA0MTYyIHwgMDsKICAgICAgICBiICA9IChiIDw8IDIyIHwgYiA+Pj4gMTApICsgYyB8IDA7CiAgICAgICAgYSArPSAoYiAmIGMgfCB+YiAmIGQpICsga1sxMl0gKyAxODA0NjAzNjgyIHwgMDsKICAgICAgICBhICA9IChhIDw8IDcgfCBhID4+PiAyNSkgKyBiIHwgMDsKICAgICAgICBkICs9IChhICYgYiB8IH5hICYgYykgKyBrWzEzXSAtIDQwMzQxMTAxIHwgMDsKICAgICAgICBkICA9IChkIDw8IDEyIHwgZCA+Pj4gMjApICsgYSB8IDA7CiAgICAgICAgYyArPSAoZCAmIGEgfCB+ZCAmIGIpICsga1sxNF0gLSAxNTAyMDAyMjkwIHwgMDsKICAgICAgICBjICA9IChjIDw8IDE3IHwgYyA+Pj4gMTUpICsgZCB8IDA7CiAgICAgICAgYiArPSAoYyAmIGQgfCB+YyAmIGEpICsga1sxNV0gKyAxMjM2NTM1MzI5IHwgMDsKICAgICAgICBiICA9IChiIDw8IDIyIHwgYiA+Pj4gMTApICsgYyB8IDA7CgogICAgICAgIGEgKz0gKGIgJiBkIHwgYyAmIH5kKSArIGtbMV0gLSAxNjU3OTY1MTAgfCAwOwogICAgICAgIGEgID0gKGEgPDwgNSB8IGEgPj4+IDI3KSArIGIgfCAwOwogICAgICAgIGQgKz0gKGEgJiBjIHwgYiAmIH5jKSArIGtbNl0gLSAxMDY5NTAxNjMyIHwgMDsKICAgICAgICBkICA9IChkIDw8IDkgfCBkID4+PiAyMykgKyBhIHwgMDsKICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzExXSArIDY0MzcxNzcxMyB8IDA7CiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwOwogICAgICAgIGIgKz0gKGMgJiBhIHwgZCAmIH5hKSArIGtbMF0gLSAzNzM4OTczMDIgfCAwOwogICAgICAgIGIgID0gKGIgPDwgMjAgfCBiID4+PiAxMikgKyBjIHwgMDsKICAgICAgICBhICs9IChiICYgZCB8IGMgJiB+ZCkgKyBrWzVdIC0gNzAxNTU4NjkxIHwgMDsKICAgICAgICBhICA9IChhIDw8IDUgfCBhID4+PiAyNykgKyBiIHwgMDsKICAgICAgICBkICs9IChhICYgYyB8IGIgJiB+YykgKyBrWzEwXSArIDM4MDE2MDgzIHwgMDsKICAgICAgICBkICA9IChkIDw8IDkgfCBkID4+PiAyMykgKyBhIHwgMDsKICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzE1XSAtIDY2MDQ3ODMzNSB8IDA7CiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwOwogICAgICAgIGIgKz0gKGMgJiBhIHwgZCAmIH5hKSArIGtbNF0gLSA0MDU1Mzc4NDggfCAwOwogICAgICAgIGIgID0gKGIgPDwgMjAgfCBiID4+PiAxMikgKyBjIHwgMDsKICAgICAgICBhICs9IChiICYgZCB8IGMgJiB+ZCkgKyBrWzldICsgNTY4NDQ2NDM4IHwgMDsKICAgICAgICBhICA9IChhIDw8IDUgfCBhID4+PiAyNykgKyBiIHwgMDsKICAgICAgICBkICs9IChhICYgYyB8IGIgJiB+YykgKyBrWzE0XSAtIDEwMTk4MDM2OTAgfCAwOwogICAgICAgIGQgID0gKGQgPDwgOSB8IGQgPj4+IDIzKSArIGEgfCAwOwogICAgICAgIGMgKz0gKGQgJiBiIHwgYSAmIH5iKSArIGtbM10gLSAxODczNjM5NjEgfCAwOwogICAgICAgIGMgID0gKGMgPDwgMTQgfCBjID4+PiAxOCkgKyBkIHwgMDsKICAgICAgICBiICs9IChjICYgYSB8IGQgJiB+YSkgKyBrWzhdICsgMTE2MzUzMTUwMSB8IDA7CiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwOwogICAgICAgIGEgKz0gKGIgJiBkIHwgYyAmIH5kKSArIGtbMTNdIC0gMTQ0NDY4MTQ2NyB8IDA7CiAgICAgICAgYSAgPSAoYSA8PCA1IHwgYSA+Pj4gMjcpICsgYiB8IDA7CiAgICAgICAgZCArPSAoYSAmIGMgfCBiICYgfmMpICsga1syXSAtIDUxNDAzNzg0IHwgMDsKICAgICAgICBkICA9IChkIDw8IDkgfCBkID4+PiAyMykgKyBhIHwgMDsKICAgICAgICBjICs9IChkICYgYiB8IGEgJiB+YikgKyBrWzddICsgMTczNTMyODQ3MyB8IDA7CiAgICAgICAgYyAgPSAoYyA8PCAxNCB8IGMgPj4+IDE4KSArIGQgfCAwOwogICAgICAgIGIgKz0gKGMgJiBhIHwgZCAmIH5hKSArIGtbMTJdIC0gMTkyNjYwNzczNCB8IDA7CiAgICAgICAgYiAgPSAoYiA8PCAyMCB8IGIgPj4+IDEyKSArIGMgfCAwOwoKICAgICAgICBhICs9IChiIF4gYyBeIGQpICsga1s1XSAtIDM3ODU1OCB8IDA7CiAgICAgICAgYSAgPSAoYSA8PCA0IHwgYSA+Pj4gMjgpICsgYiB8IDA7CiAgICAgICAgZCArPSAoYSBeIGIgXiBjKSArIGtbOF0gLSAyMDIyNTc0NDYzIHwgMDsKICAgICAgICBkICA9IChkIDw8IDExIHwgZCA+Pj4gMjEpICsgYSB8IDA7CiAgICAgICAgYyArPSAoZCBeIGEgXiBiKSArIGtbMTFdICsgMTgzOTAzMDU2MiB8IDA7CiAgICAgICAgYyAgPSAoYyA8PCAxNiB8IGMgPj4+IDE2KSArIGQgfCAwOwogICAgICAgIGIgKz0gKGMgXiBkIF4gYSkgKyBrWzE0XSAtIDM1MzA5NTU2IHwgMDsKICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDsKICAgICAgICBhICs9IChiIF4gYyBeIGQpICsga1sxXSAtIDE1MzA5OTIwNjAgfCAwOwogICAgICAgIGEgID0gKGEgPDwgNCB8IGEgPj4+IDI4KSArIGIgfCAwOwogICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzRdICsgMTI3Mjg5MzM1MyB8IDA7CiAgICAgICAgZCAgPSAoZCA8PCAxMSB8IGQgPj4+IDIxKSArIGEgfCAwOwogICAgICAgIGMgKz0gKGQgXiBhIF4gYikgKyBrWzddIC0gMTU1NDk3NjMyIHwgMDsKICAgICAgICBjICA9IChjIDw8IDE2IHwgYyA+Pj4gMTYpICsgZCB8IDA7CiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbMTBdIC0gMTA5NDczMDY0MCB8IDA7CiAgICAgICAgYiAgPSAoYiA8PCAyMyB8IGIgPj4+IDkpICsgYyB8IDA7CiAgICAgICAgYSArPSAoYiBeIGMgXiBkKSArIGtbMTNdICsgNjgxMjc5MTc0IHwgMDsKICAgICAgICBhICA9IChhIDw8IDQgfCBhID4+PiAyOCkgKyBiIHwgMDsKICAgICAgICBkICs9IChhIF4gYiBeIGMpICsga1swXSAtIDM1ODUzNzIyMiB8IDA7CiAgICAgICAgZCAgPSAoZCA8PCAxMSB8IGQgPj4+IDIxKSArIGEgfCAwOwogICAgICAgIGMgKz0gKGQgXiBhIF4gYikgKyBrWzNdIC0gNzIyNTIxOTc5IHwgMDsKICAgICAgICBjICA9IChjIDw8IDE2IHwgYyA+Pj4gMTYpICsgZCB8IDA7CiAgICAgICAgYiArPSAoYyBeIGQgXiBhKSArIGtbNl0gKyA3NjAyOTE4OSB8IDA7CiAgICAgICAgYiAgPSAoYiA8PCAyMyB8IGIgPj4+IDkpICsgYyB8IDA7CiAgICAgICAgYSArPSAoYiBeIGMgXiBkKSArIGtbOV0gLSA2NDAzNjQ0ODcgfCAwOwogICAgICAgIGEgID0gKGEgPDwgNCB8IGEgPj4+IDI4KSArIGIgfCAwOwogICAgICAgIGQgKz0gKGEgXiBiIF4gYykgKyBrWzEyXSAtIDQyMTgxNTgzNSB8IDA7CiAgICAgICAgZCAgPSAoZCA8PCAxMSB8IGQgPj4+IDIxKSArIGEgfCAwOwogICAgICAgIGMgKz0gKGQgXiBhIF4gYikgKyBrWzE1XSArIDUzMDc0MjUyMCB8IDA7CiAgICAgICAgYyAgPSAoYyA8PCAxNiB8IGMgPj4+IDE2KSArIGQgfCAwOwogICAgICAgIGIgKz0gKGMgXiBkIF4gYSkgKyBrWzJdIC0gOTk1MzM4NjUxIHwgMDsKICAgICAgICBiICA9IChiIDw8IDIzIHwgYiA+Pj4gOSkgKyBjIHwgMDsKCiAgICAgICAgYSArPSAoYyBeIChiIHwgfmQpKSArIGtbMF0gLSAxOTg2MzA4NDQgfCAwOwogICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwOwogICAgICAgIGQgKz0gKGIgXiAoYSB8IH5jKSkgKyBrWzddICsgMTEyNjg5MTQxNSB8IDA7CiAgICAgICAgZCAgPSAoZCA8PCAxMCB8IGQgPj4+IDIyKSArIGEgfCAwOwogICAgICAgIGMgKz0gKGEgXiAoZCB8IH5iKSkgKyBrWzE0XSAtIDE0MTYzNTQ5MDUgfCAwOwogICAgICAgIGMgID0gKGMgPDwgMTUgfCBjID4+PiAxNykgKyBkIHwgMDsKICAgICAgICBiICs9IChkIF4gKGMgfCB+YSkpICsga1s1XSAtIDU3NDM0MDU1IHwgMDsKICAgICAgICBiICA9IChiIDw8IDIxIHxiID4+PiAxMSkgKyBjIHwgMDsKICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1sxMl0gKyAxNzAwNDg1NTcxIHwgMDsKICAgICAgICBhICA9IChhIDw8IDYgfCBhID4+PiAyNikgKyBiIHwgMDsKICAgICAgICBkICs9IChiIF4gKGEgfCB+YykpICsga1szXSAtIDE4OTQ5ODY2MDYgfCAwOwogICAgICAgIGQgID0gKGQgPDwgMTAgfCBkID4+PiAyMikgKyBhIHwgMDsKICAgICAgICBjICs9IChhIF4gKGQgfCB+YikpICsga1sxMF0gLSAxMDUxNTIzIHwgMDsKICAgICAgICBjICA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCB8IDA7CiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbMV0gLSAyMDU0OTIyNzk5IHwgMDsKICAgICAgICBiICA9IChiIDw8IDIxIHxiID4+PiAxMSkgKyBjIHwgMDsKICAgICAgICBhICs9IChjIF4gKGIgfCB+ZCkpICsga1s4XSArIDE4NzMzMTMzNTkgfCAwOwogICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwOwogICAgICAgIGQgKz0gKGIgXiAoYSB8IH5jKSkgKyBrWzE1XSAtIDMwNjExNzQ0IHwgMDsKICAgICAgICBkICA9IChkIDw8IDEwIHwgZCA+Pj4gMjIpICsgYSB8IDA7CiAgICAgICAgYyArPSAoYSBeIChkIHwgfmIpKSArIGtbNl0gLSAxNTYwMTk4MzgwIHwgMDsKICAgICAgICBjICA9IChjIDw8IDE1IHwgYyA+Pj4gMTcpICsgZCB8IDA7CiAgICAgICAgYiArPSAoZCBeIChjIHwgfmEpKSArIGtbMTNdICsgMTMwOTE1MTY0OSB8IDA7CiAgICAgICAgYiAgPSAoYiA8PCAyMSB8YiA+Pj4gMTEpICsgYyB8IDA7CiAgICAgICAgYSArPSAoYyBeIChiIHwgfmQpKSArIGtbNF0gLSAxNDU1MjMwNzAgfCAwOwogICAgICAgIGEgID0gKGEgPDwgNiB8IGEgPj4+IDI2KSArIGIgfCAwOwogICAgICAgIGQgKz0gKGIgXiAoYSB8IH5jKSkgKyBrWzExXSAtIDExMjAyMTAzNzkgfCAwOwogICAgICAgIGQgID0gKGQgPDwgMTAgfCBkID4+PiAyMikgKyBhIHwgMDsKICAgICAgICBjICs9IChhIF4gKGQgfCB+YikpICsga1syXSArIDcxODc4NzI1OSB8IDA7CiAgICAgICAgYyAgPSAoYyA8PCAxNSB8IGMgPj4+IDE3KSArIGQgfCAwOwogICAgICAgIGIgKz0gKGQgXiAoYyB8IH5hKSkgKyBrWzldIC0gMzQzNDg1NTUxIHwgMDsKICAgICAgICBiICA9IChiIDw8IDIxIHwgYiA+Pj4gMTEpICsgYyB8IDA7CgogICAgICAgIHhbMF0gPSBhICsgeFswXSB8IDA7CiAgICAgICAgeFsxXSA9IGIgKyB4WzFdIHwgMDsKICAgICAgICB4WzJdID0gYyArIHhbMl0gfCAwOwogICAgICAgIHhbM10gPSBkICsgeFszXSB8IDA7CiAgICB9CgogICAgZnVuY3Rpb24gbWQ1YmxrKHMpIHsKICAgICAgICB2YXIgbWQ1YmxrcyA9IFtdLAogICAgICAgICAgICBpOyAvKiBBbmR5IEtpbmcgc2FpZCBkbyBpdCB0aGlzIHdheS4gKi8KCiAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDQpIHsKICAgICAgICAgICAgbWQ1Ymxrc1tpID4+IDJdID0gcy5jaGFyQ29kZUF0KGkpICsgKHMuY2hhckNvZGVBdChpICsgMSkgPDwgOCkgKyAocy5jaGFyQ29kZUF0KGkgKyAyKSA8PCAxNikgKyAocy5jaGFyQ29kZUF0KGkgKyAzKSA8PCAyNCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtZDVibGtzOwogICAgfQoKICAgIGZ1bmN0aW9uIG1kNWJsa19hcnJheShhKSB7CiAgICAgICAgdmFyIG1kNWJsa3MgPSBbXSwKICAgICAgICAgICAgaTsgLyogQW5keSBLaW5nIHNhaWQgZG8gaXQgdGhpcyB3YXkuICovCgogICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSArPSA0KSB7CiAgICAgICAgICAgIG1kNWJsa3NbaSA+PiAyXSA9IGFbaV0gKyAoYVtpICsgMV0gPDwgOCkgKyAoYVtpICsgMl0gPDwgMTYpICsgKGFbaSArIDNdIDw8IDI0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1kNWJsa3M7CiAgICB9CgogICAgZnVuY3Rpb24gbWQ1MShzKSB7CiAgICAgICAgdmFyIG4gPSBzLmxlbmd0aCwKICAgICAgICAgICAgc3RhdGUgPSBbMTczMjU4NDE5MywgLTI3MTczMzg3OSwgLTE3MzI1ODQxOTQsIDI3MTczMzg3OF0sCiAgICAgICAgICAgIGksCiAgICAgICAgICAgIGxlbmd0aCwKICAgICAgICAgICAgdGFpbCwKICAgICAgICAgICAgdG1wLAogICAgICAgICAgICBsbywKICAgICAgICAgICAgaGk7CgogICAgICAgIGZvciAoaSA9IDY0OyBpIDw9IG47IGkgKz0gNjQpIHsKICAgICAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIG1kNWJsayhzLnN1YnN0cmluZyhpIC0gNjQsIGkpKSk7CiAgICAgICAgfQogICAgICAgIHMgPSBzLnN1YnN0cmluZyhpIC0gNjQpOwogICAgICAgIGxlbmd0aCA9IHMubGVuZ3RoOwogICAgICAgIHRhaWwgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBzLmNoYXJDb2RlQXQoaSkgPDwgKChpICUgNCkgPDwgMyk7CiAgICAgICAgfQogICAgICAgIHRhaWxbaSA+PiAyXSB8PSAweDgwIDw8ICgoaSAlIDQpIDw8IDMpOwogICAgICAgIGlmIChpID4gNTUpIHsKICAgICAgICAgICAgbWQ1Y3ljbGUoc3RhdGUsIHRhaWwpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgdGFpbFtpXSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEJld2FyZSB0aGF0IHRoZSBmaW5hbCBsZW5ndGggbWlnaHQgbm90IGZpdCBpbiAzMiBiaXRzIHNvIHdlIHRha2UgY2FyZSBvZiB0aGF0CiAgICAgICAgdG1wID0gbiAqIDg7CiAgICAgICAgdG1wID0gdG1wLnRvU3RyaW5nKDE2KS5tYXRjaCgvKC4qPykoLnswLDh9KSQvKTsKICAgICAgICBsbyA9IHBhcnNlSW50KHRtcFsyXSwgMTYpOwogICAgICAgIGhpID0gcGFyc2VJbnQodG1wWzFdLCAxNikgfHwgMDsKCiAgICAgICAgdGFpbFsxNF0gPSBsbzsKICAgICAgICB0YWlsWzE1XSA9IGhpOwoKICAgICAgICBtZDVjeWNsZShzdGF0ZSwgdGFpbCk7CiAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgfQoKICAgIGZ1bmN0aW9uIG1kNTFfYXJyYXkoYSkgewogICAgICAgIHZhciBuID0gYS5sZW5ndGgsCiAgICAgICAgICAgIHN0YXRlID0gWzE3MzI1ODQxOTMsIC0yNzE3MzM4NzksIC0xNzMyNTg0MTk0LCAyNzE3MzM4NzhdLAogICAgICAgICAgICBpLAogICAgICAgICAgICBsZW5ndGgsCiAgICAgICAgICAgIHRhaWwsCiAgICAgICAgICAgIHRtcCwKICAgICAgICAgICAgbG8sCiAgICAgICAgICAgIGhpOwoKICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBuOyBpICs9IDY0KSB7CiAgICAgICAgICAgIG1kNWN5Y2xlKHN0YXRlLCBtZDVibGtfYXJyYXkoYS5zdWJhcnJheShpIC0gNjQsIGkpKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBOb3Qgc3VyZSBpZiBpdCBpcyBhIGJ1ZywgaG93ZXZlciBJRTEwIHdpbGwgYWx3YXlzIHByb2R1Y2UgYSBzdWIgYXJyYXkgb2YgbGVuZ3RoIDEKICAgICAgICAvLyBjb250YWluaW5nIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBhcmVudCBhcnJheSBpZiB0aGUgc3ViIGFycmF5IHNwZWNpZmllZCBzdGFydHMKICAgICAgICAvLyBiZXlvbmQgdGhlIGxlbmd0aCBvZiB0aGUgcGFyZW50IGFycmF5IC0gd2VpcmQuCiAgICAgICAgLy8gaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy83NzE0NTIvdHlwZWQtYXJyYXktc3ViYXJyYXktaXNzdWUKICAgICAgICBhID0gKGkgLSA2NCkgPCBuID8gYS5zdWJhcnJheShpIC0gNjQpIDogbmV3IFVpbnQ4QXJyYXkoMCk7CgogICAgICAgIGxlbmd0aCA9IGEubGVuZ3RoOwogICAgICAgIHRhaWwgPSBbMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF07CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgIHRhaWxbaSA+PiAyXSB8PSBhW2ldIDw8ICgoaSAlIDQpIDw8IDMpOwogICAgICAgIH0KCiAgICAgICAgdGFpbFtpID4+IDJdIHw9IDB4ODAgPDwgKChpICUgNCkgPDwgMyk7CiAgICAgICAgaWYgKGkgPiA1NSkgewogICAgICAgICAgICBtZDVjeWNsZShzdGF0ZSwgdGFpbCk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICB0YWlsW2ldID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQmV3YXJlIHRoYXQgdGhlIGZpbmFsIGxlbmd0aCBtaWdodCBub3QgZml0IGluIDMyIGJpdHMgc28gd2UgdGFrZSBjYXJlIG9mIHRoYXQKICAgICAgICB0bXAgPSBuICogODsKICAgICAgICB0bXAgPSB0bXAudG9TdHJpbmcoMTYpLm1hdGNoKC8oLio/KSguezAsOH0pJC8pOwogICAgICAgIGxvID0gcGFyc2VJbnQodG1wWzJdLCAxNik7CiAgICAgICAgaGkgPSBwYXJzZUludCh0bXBbMV0sIDE2KSB8fCAwOwoKICAgICAgICB0YWlsWzE0XSA9IGxvOwogICAgICAgIHRhaWxbMTVdID0gaGk7CgogICAgICAgIG1kNWN5Y2xlKHN0YXRlLCB0YWlsKTsKCiAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgfQoKICAgIGZ1bmN0aW9uIHJoZXgobikgewogICAgICAgIHZhciBzID0gJycsCiAgICAgICAgICAgIGo7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGogKz0gMSkgewogICAgICAgICAgICBzICs9IGhleF9jaHJbKG4gPj4gKGogKiA4ICsgNCkpICYgMHgwRl0gKyBoZXhfY2hyWyhuID4+IChqICogOCkpICYgMHgwRl07CiAgICAgICAgfQogICAgICAgIHJldHVybiBzOwogICAgfQoKICAgIGZ1bmN0aW9uIGhleCh4KSB7CiAgICAgICAgdmFyIGk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgeFtpXSA9IHJoZXgoeFtpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB4LmpvaW4oJycpOwogICAgfQoKICAgIC8vIEluIHNvbWUgY2FzZXMgdGhlIGZhc3QgYWRkMzIgZnVuY3Rpb24gY2Fubm90IGJlIHVzZWQuLgogICAgaWYgKGhleChtZDUxKCdoZWxsbycpKSAhPT0gJzVkNDE0MDJhYmM0YjJhNzZiOTcxOWQ5MTEwMTdjNTkyJykgewogICAgICAgIGFkZDMyID0gZnVuY3Rpb24gKHgsIHkpIHsKICAgICAgICAgICAgdmFyIGxzdyA9ICh4ICYgMHhGRkZGKSArICh5ICYgMHhGRkZGKSwKICAgICAgICAgICAgICAgIG1zdyA9ICh4ID4+IDE2KSArICh5ID4+IDE2KSArIChsc3cgPj4gMTYpOwogICAgICAgICAgICByZXR1cm4gKG1zdyA8PCAxNikgfCAobHN3ICYgMHhGRkZGKTsKICAgICAgICB9OwogICAgfQoKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIC8qKgogICAgICogQXJyYXlCdWZmZXIgc2xpY2UgcG9seWZpbGwuCiAgICAgKgogICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHRhdWJlcnQvbm9kZS1hcnJheWJ1ZmZlci1zbGljZQogICAgICovCgogICAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgIUFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSkgewogICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIGNsYW1wKHZhbCwgbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB2YWwgPSAodmFsIHwgMCkgfHwgMDsKCiAgICAgICAgICAgICAgICBpZiAodmFsIDwgMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh2YWwgKyBsZW5ndGgsIDApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih2YWwsIGxlbmd0aCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIChmcm9tLCB0bykgewogICAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuYnl0ZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IGNsYW1wKGZyb20sIGxlbmd0aCksCiAgICAgICAgICAgICAgICAgICAgZW5kID0gbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIG51bSwKICAgICAgICAgICAgICAgICAgICB0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXksCiAgICAgICAgICAgICAgICAgICAgc291cmNlQXJyYXk7CgogICAgICAgICAgICAgICAgaWYgKHRvICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBlbmQgPSBjbGFtcCh0bywgbGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYmVnaW4gPiBlbmQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG51bSA9IGVuZCAtIGJlZ2luOwogICAgICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IEFycmF5QnVmZmVyKG51bSk7CiAgICAgICAgICAgICAgICB0YXJnZXRBcnJheSA9IG5ldyBVaW50OEFycmF5KHRhcmdldCk7CgogICAgICAgICAgICAgICAgc291cmNlQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLCBiZWdpbiwgbnVtKTsKICAgICAgICAgICAgICAgIHRhcmdldEFycmF5LnNldChzb3VyY2VBcnJheSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICAgICAgfTsKICAgICAgICB9KSgpOwogICAgfQoKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIC8qKgogICAgICogSGVscGVycy4KICAgICAqLwoKICAgIGZ1bmN0aW9uIHRvVXRmOChzdHIpIHsKICAgICAgICBpZiAoL1tcdTAwODAtXHVGRkZGXS8udGVzdChzdHIpKSB7CiAgICAgICAgICAgIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzdHI7CiAgICB9CgogICAgZnVuY3Rpb24gdXRmOFN0cjJBcnJheUJ1ZmZlcihzdHIsIHJldHVyblVJbnQ4QXJyYXkpIHsKICAgICAgICB2YXIgbGVuZ3RoID0gc3RyLmxlbmd0aCwKICAgICAgICAgICBidWZmID0gbmV3IEFycmF5QnVmZmVyKGxlbmd0aCksCiAgICAgICAgICAgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYnVmZiksCiAgICAgICAgICAgaTsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgIGFycltpXSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJldHVyblVJbnQ4QXJyYXkgPyBhcnIgOiBidWZmOwogICAgfQoKICAgIGZ1bmN0aW9uIGFycmF5QnVmZmVyMlV0ZjhTdHIoYnVmZikgewogICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KGJ1ZmYpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb25jYXRlbmF0ZUFycmF5QnVmZmVycyhmaXJzdCwgc2Vjb25kLCByZXR1cm5VSW50OEFycmF5KSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGZpcnN0LmJ5dGVMZW5ndGggKyBzZWNvbmQuYnl0ZUxlbmd0aCk7CgogICAgICAgIHJlc3VsdC5zZXQobmV3IFVpbnQ4QXJyYXkoZmlyc3QpKTsKICAgICAgICByZXN1bHQuc2V0KG5ldyBVaW50OEFycmF5KHNlY29uZCksIGZpcnN0LmJ5dGVMZW5ndGgpOwoKICAgICAgICByZXR1cm4gcmV0dXJuVUludDhBcnJheSA/IHJlc3VsdCA6IHJlc3VsdC5idWZmZXI7CiAgICB9CgogICAgZnVuY3Rpb24gaGV4VG9CaW5hcnlTdHJpbmcoaGV4KSB7CiAgICAgICAgdmFyIGJ5dGVzID0gW10sCiAgICAgICAgICAgIGxlbmd0aCA9IGhleC5sZW5ndGgsCiAgICAgICAgICAgIHg7CgogICAgICAgIGZvciAoeCA9IDA7IHggPCBsZW5ndGggLSAxOyB4ICs9IDIpIHsKICAgICAgICAgICAgYnl0ZXMucHVzaChwYXJzZUludChoZXguc3Vic3RyKHgsIDIpLCAxNikpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBieXRlcyk7CiAgICB9CgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLyoqCiAgICAgKiBTcGFya01ENSBPT1AgaW1wbGVtZW50YXRpb24uCiAgICAgKgogICAgICogVXNlIHRoaXMgY2xhc3MgdG8gcGVyZm9ybSBhbiBpbmNyZW1lbnRhbCBtZDUsIG90aGVyd2lzZSB1c2UgdGhlCiAgICAgKiBzdGF0aWMgbWV0aG9kcyBpbnN0ZWFkLgogICAgICovCgogICAgZnVuY3Rpb24gU3BhcmtNRDUoKSB7CiAgICAgICAgLy8gY2FsbCByZXNldCB0byBpbml0IHRoZSBpbnN0YW5jZQogICAgICAgIHRoaXMucmVzZXQoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEFwcGVuZHMgYSBzdHJpbmcuCiAgICAgKiBBIGNvbnZlcnNpb24gd2lsbCBiZSBhcHBsaWVkIGlmIGFuIHV0Zjggc3RyaW5nIGlzIGRldGVjdGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIHN0cmluZyB0byBiZSBhcHBlbmRlZAogICAgICoKICAgICAqIEByZXR1cm4ge1NwYXJrTUQ1fSBUaGUgaW5zdGFuY2UgaXRzZWxmCiAgICAgKi8KICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAoc3RyKSB7CiAgICAgICAgLy8gQ29udmVydHMgdGhlIHN0cmluZyB0byB1dGY4IGJ5dGVzIGlmIG5lY2Vzc2FyeQogICAgICAgIC8vIFRoZW4gYXBwZW5kIGFzIGJpbmFyeQogICAgICAgIHRoaXMuYXBwZW5kQmluYXJ5KHRvVXRmOChzdHIpKTsKCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8qKgogICAgICogQXBwZW5kcyBhIGJpbmFyeSBzdHJpbmcuCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbnRlbnRzIFRoZSBiaW5hcnkgc3RyaW5nIHRvIGJlIGFwcGVuZGVkCiAgICAgKgogICAgICogQHJldHVybiB7U3BhcmtNRDV9IFRoZSBpbnN0YW5jZSBpdHNlbGYKICAgICAqLwogICAgU3BhcmtNRDUucHJvdG90eXBlLmFwcGVuZEJpbmFyeSA9IGZ1bmN0aW9uIChjb250ZW50cykgewogICAgICAgIHRoaXMuX2J1ZmYgKz0gY29udGVudHM7CiAgICAgICAgdGhpcy5fbGVuZ3RoICs9IGNvbnRlbnRzLmxlbmd0aDsKCiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuX2J1ZmYubGVuZ3RoLAogICAgICAgICAgICBpOwoKICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBsZW5ndGg7IGkgKz0gNjQpIHsKICAgICAgICAgICAgbWQ1Y3ljbGUodGhpcy5faGFzaCwgbWQ1YmxrKHRoaXMuX2J1ZmYuc3Vic3RyaW5nKGkgLSA2NCwgaSkpKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2J1ZmYgPSB0aGlzLl9idWZmLnN1YnN0cmluZyhpIC0gNjQpOwoKICAgICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgLyoqCiAgICAgKiBGaW5pc2hlcyB0aGUgaW5jcmVtZW50YWwgY29tcHV0YXRpb24sIHJlc2V0aW5nIHRoZSBpbnRlcm5hbCBzdGF0ZSBhbmQKICAgICAqIHJldHVybmluZyB0aGUgcmVzdWx0LgogICAgICoKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcmF3IFRydWUgdG8gZ2V0IHRoZSByYXcgc3RyaW5nLCBmYWxzZSB0byBnZXQgdGhlIGhleCBzdHJpbmcKICAgICAqCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHQKICAgICAqLwogICAgU3BhcmtNRDUucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uIChyYXcpIHsKICAgICAgICB2YXIgYnVmZiA9IHRoaXMuX2J1ZmYsCiAgICAgICAgICAgIGxlbmd0aCA9IGJ1ZmYubGVuZ3RoLAogICAgICAgICAgICBpLAogICAgICAgICAgICB0YWlsID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdLAogICAgICAgICAgICByZXQ7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICB0YWlsW2kgPj4gMl0gfD0gYnVmZi5jaGFyQ29kZUF0KGkpIDw8ICgoaSAlIDQpIDw8IDMpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fZmluaXNoKHRhaWwsIGxlbmd0aCk7CiAgICAgICAgcmV0ID0gaGV4KHRoaXMuX2hhc2gpOwoKICAgICAgICBpZiAocmF3KSB7CiAgICAgICAgICAgIHJldCA9IGhleFRvQmluYXJ5U3RyaW5nKHJldCk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLnJlc2V0KCk7CgogICAgICAgIHJldHVybiByZXQ7CiAgICB9OwoKICAgIC8qKgogICAgICogUmVzZXRzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcHV0YXRpb24uCiAgICAgKgogICAgICogQHJldHVybiB7U3BhcmtNRDV9IFRoZSBpbnN0YW5jZSBpdHNlbGYKICAgICAqLwogICAgU3BhcmtNRDUucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuX2J1ZmYgPSAnJzsKICAgICAgICB0aGlzLl9sZW5ndGggPSAwOwogICAgICAgIHRoaXMuX2hhc2ggPSBbMTczMjU4NDE5MywgLTI3MTczMzg3OSwgLTE3MzI1ODQxOTQsIDI3MTczMzg3OF07CgogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKCiAgICAvKioKICAgICAqIEdldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBjb21wdXRhdGlvbi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBzdGF0ZQogICAgICovCiAgICBTcGFya01ENS5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgYnVmZjogdGhpcy5fYnVmZiwKICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLl9sZW5ndGgsCiAgICAgICAgICAgIGhhc2g6IHRoaXMuX2hhc2guc2xpY2UoKQogICAgICAgIH07CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSBUaGUgc3RhdGUKICAgICAqCiAgICAgKiBAcmV0dXJuIHtTcGFya01ENX0gVGhlIGluc3RhbmNlIGl0c2VsZgogICAgICovCiAgICBTcGFya01ENS5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgICB0aGlzLl9idWZmID0gc3RhdGUuYnVmZjsKICAgICAgICB0aGlzLl9sZW5ndGggPSBzdGF0ZS5sZW5ndGg7CiAgICAgICAgdGhpcy5faGFzaCA9IHN0YXRlLmhhc2g7CgogICAgICAgIHJldHVybiB0aGlzOwogICAgfTsKCiAgICAvKioKICAgICAqIFJlbGVhc2VzIG1lbW9yeSB1c2VkIGJ5IHRoZSBpbmNyZW1lbnRhbCBidWZmZXIgYW5kIG90aGVyIGFkZGl0aW9uYWwKICAgICAqIHJlc291cmNlcy4gSWYgeW91IHBsYW4gdG8gdXNlIHRoZSBpbnN0YW5jZSBhZ2FpbiwgdXNlIHJlc2V0IGluc3RlYWQuCiAgICAgKi8KICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgewogICAgICAgIGRlbGV0ZSB0aGlzLl9oYXNoOwogICAgICAgIGRlbGV0ZSB0aGlzLl9idWZmOwogICAgICAgIGRlbGV0ZSB0aGlzLl9sZW5ndGg7CiAgICB9OwoKICAgIC8qKgogICAgICogRmluaXNoIHRoZSBmaW5hbCBjYWxjdWxhdGlvbiBiYXNlZCBvbiB0aGUgdGFpbC4KICAgICAqCiAgICAgKiBAcGFyYW0ge0FycmF5fSAgdGFpbCAgIFRoZSB0YWlsICh3aWxsIGJlIG1vZGlmaWVkKQogICAgICogQHBhcmFtIHtOdW1iZXJ9IGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSByZW1haW5pbmcgYnVmZmVyCiAgICAgKi8KICAgIFNwYXJrTUQ1LnByb3RvdHlwZS5fZmluaXNoID0gZnVuY3Rpb24gKHRhaWwsIGxlbmd0aCkgewogICAgICAgIHZhciBpID0gbGVuZ3RoLAogICAgICAgICAgICB0bXAsCiAgICAgICAgICAgIGxvLAogICAgICAgICAgICBoaTsKCiAgICAgICAgdGFpbFtpID4+IDJdIHw9IDB4ODAgPDwgKChpICUgNCkgPDwgMyk7CiAgICAgICAgaWYgKGkgPiA1NSkgewogICAgICAgICAgICBtZDVjeWNsZSh0aGlzLl9oYXNoLCB0YWlsKTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDEpIHsKICAgICAgICAgICAgICAgIHRhaWxbaV0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBEbyB0aGUgZmluYWwgY29tcHV0YXRpb24gYmFzZWQgb24gdGhlIHRhaWwgYW5kIGxlbmd0aAogICAgICAgIC8vIEJld2FyZSB0aGF0IHRoZSBmaW5hbCBsZW5ndGggbWF5IG5vdCBmaXQgaW4gMzIgYml0cyBzbyB3ZSB0YWtlIGNhcmUgb2YgdGhhdAogICAgICAgIHRtcCA9IHRoaXMuX2xlbmd0aCAqIDg7CiAgICAgICAgdG1wID0gdG1wLnRvU3RyaW5nKDE2KS5tYXRjaCgvKC4qPykoLnswLDh9KSQvKTsKICAgICAgICBsbyA9IHBhcnNlSW50KHRtcFsyXSwgMTYpOwogICAgICAgIGhpID0gcGFyc2VJbnQodG1wWzFdLCAxNikgfHwgMDsKCiAgICAgICAgdGFpbFsxNF0gPSBsbzsKICAgICAgICB0YWlsWzE1XSA9IGhpOwogICAgICAgIG1kNWN5Y2xlKHRoaXMuX2hhc2gsIHRhaWwpOwogICAgfTsKCiAgICAvKioKICAgICAqIFBlcmZvcm1zIHRoZSBtZDUgaGFzaCBvbiBhIHN0cmluZy4KICAgICAqIEEgY29udmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgaWYgdXRmOCBzdHJpbmcgaXMgZGV0ZWN0ZWQuCiAgICAgKgogICAgICogQHBhcmFtIHtTdHJpbmd9ICBzdHIgVGhlIHN0cmluZwogICAgICogQHBhcmFtIHtCb29sZWFufSBbcmF3XSBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nCiAgICAgKgogICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0CiAgICAgKi8KICAgIFNwYXJrTUQ1Lmhhc2ggPSBmdW5jdGlvbiAoc3RyLCByYXcpIHsKICAgICAgICAvLyBDb252ZXJ0cyB0aGUgc3RyaW5nIHRvIHV0ZjggYnl0ZXMgaWYgbmVjZXNzYXJ5CiAgICAgICAgLy8gVGhlbiBjb21wdXRlIGl0IHVzaW5nIHRoZSBiaW5hcnkgZnVuY3Rpb24KICAgICAgICByZXR1cm4gU3BhcmtNRDUuaGFzaEJpbmFyeSh0b1V0Zjgoc3RyKSwgcmF3KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBQZXJmb3JtcyB0aGUgbWQ1IGhhc2ggb24gYSBiaW5hcnkgc3RyaW5nLgogICAgICoKICAgICAqIEBwYXJhbSB7U3RyaW5nfSAgY29udGVudCBUaGUgYmluYXJ5IHN0cmluZwogICAgICogQHBhcmFtIHtCb29sZWFufSBbcmF3XSAgICAgVHJ1ZSB0byBnZXQgdGhlIHJhdyBzdHJpbmcsIGZhbHNlIHRvIGdldCB0aGUgaGV4IHN0cmluZwogICAgICoKICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHJlc3VsdAogICAgICovCiAgICBTcGFya01ENS5oYXNoQmluYXJ5ID0gZnVuY3Rpb24gKGNvbnRlbnQsIHJhdykgewogICAgICAgIHZhciBoYXNoID0gbWQ1MShjb250ZW50KSwKICAgICAgICAgICAgcmV0ID0gaGV4KGhhc2gpOwoKICAgICAgICByZXR1cm4gcmF3ID8gaGV4VG9CaW5hcnlTdHJpbmcocmV0KSA6IHJldDsKICAgIH07CgogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLyoqCiAgICAgKiBTcGFya01ENSBPT1AgaW1wbGVtZW50YXRpb24gZm9yIGFycmF5IGJ1ZmZlcnMuCiAgICAgKgogICAgICogVXNlIHRoaXMgY2xhc3MgdG8gcGVyZm9ybSBhbiBpbmNyZW1lbnRhbCBtZDUgT05MWSBmb3IgYXJyYXkgYnVmZmVycy4KICAgICAqLwogICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gY2FsbCByZXNldCB0byBpbml0IHRoZSBpbnN0YW5jZQogICAgICAgIHRoaXMucmVzZXQoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBBcHBlbmRzIGFuIGFycmF5IGJ1ZmZlci4KICAgICAqCiAgICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBhcnIgVGhlIGFycmF5IHRvIGJlIGFwcGVuZGVkCiAgICAgKgogICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGYKICAgICAqLwogICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIChhcnIpIHsKICAgICAgICB2YXIgYnVmZiA9IGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKHRoaXMuX2J1ZmYuYnVmZmVyLCBhcnIsIHRydWUpLAogICAgICAgICAgICBsZW5ndGggPSBidWZmLmxlbmd0aCwKICAgICAgICAgICAgaTsKCiAgICAgICAgdGhpcy5fbGVuZ3RoICs9IGFyci5ieXRlTGVuZ3RoOwoKICAgICAgICBmb3IgKGkgPSA2NDsgaSA8PSBsZW5ndGg7IGkgKz0gNjQpIHsKICAgICAgICAgICAgbWQ1Y3ljbGUodGhpcy5faGFzaCwgbWQ1YmxrX2FycmF5KGJ1ZmYuc3ViYXJyYXkoaSAtIDY0LCBpKSkpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fYnVmZiA9IChpIC0gNjQpIDwgbGVuZ3RoID8gbmV3IFVpbnQ4QXJyYXkoYnVmZi5idWZmZXIuc2xpY2UoaSAtIDY0KSkgOiBuZXcgVWludDhBcnJheSgwKTsKCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8qKgogICAgICogRmluaXNoZXMgdGhlIGluY3JlbWVudGFsIGNvbXB1dGF0aW9uLCByZXNldGluZyB0aGUgaW50ZXJuYWwgc3RhdGUgYW5kCiAgICAgKiByZXR1cm5pbmcgdGhlIHJlc3VsdC4KICAgICAqCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJhdyBUcnVlIHRvIGdldCB0aGUgcmF3IHN0cmluZywgZmFsc2UgdG8gZ2V0IHRoZSBoZXggc3RyaW5nCiAgICAgKgogICAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcmVzdWx0CiAgICAgKi8KICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAocmF3KSB7CiAgICAgICAgdmFyIGJ1ZmYgPSB0aGlzLl9idWZmLAogICAgICAgICAgICBsZW5ndGggPSBidWZmLmxlbmd0aCwKICAgICAgICAgICAgdGFpbCA9IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSwKICAgICAgICAgICAgaSwKICAgICAgICAgICAgcmV0OwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgICAgdGFpbFtpID4+IDJdIHw9IGJ1ZmZbaV0gPDwgKChpICUgNCkgPDwgMyk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl9maW5pc2godGFpbCwgbGVuZ3RoKTsKICAgICAgICByZXQgPSBoZXgodGhpcy5faGFzaCk7CgogICAgICAgIGlmIChyYXcpIHsKICAgICAgICAgICAgcmV0ID0gaGV4VG9CaW5hcnlTdHJpbmcocmV0KTsKICAgICAgICB9CgogICAgICAgIHRoaXMucmVzZXQoKTsKCiAgICAgICAgcmV0dXJuIHJldDsKICAgIH07CgogICAgLyoqCiAgICAgKiBSZXNldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBjb21wdXRhdGlvbi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtTcGFya01ENS5BcnJheUJ1ZmZlcn0gVGhlIGluc3RhbmNlIGl0c2VsZgogICAgICovCiAgICBTcGFya01ENS5BcnJheUJ1ZmZlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5fYnVmZiA9IG5ldyBVaW50OEFycmF5KDApOwogICAgICAgIHRoaXMuX2xlbmd0aCA9IDA7CiAgICAgICAgdGhpcy5faGFzaCA9IFsxNzMyNTg0MTkzLCAtMjcxNzMzODc5LCAtMTczMjU4NDE5NCwgMjcxNzMzODc4XTsKCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIC8qKgogICAgICogR2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGNvbXB1dGF0aW9uLgogICAgICoKICAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIHN0YXRlCiAgICAgKi8KICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgc3RhdGUgPSBTcGFya01ENS5wcm90b3R5cGUuZ2V0U3RhdGUuY2FsbCh0aGlzKTsKCiAgICAgICAgLy8gQ29udmVydCBidWZmZXIgdG8gYSBzdHJpbmcKICAgICAgICBzdGF0ZS5idWZmID0gYXJyYXlCdWZmZXIyVXRmOFN0cihzdGF0ZS5idWZmKTsKCiAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgfTsKCiAgICAvKioKICAgICAqIEdldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBjb21wdXRhdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgVGhlIHN0YXRlCiAgICAgKgogICAgICogQHJldHVybiB7U3BhcmtNRDUuQXJyYXlCdWZmZXJ9IFRoZSBpbnN0YW5jZSBpdHNlbGYKICAgICAqLwogICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHN0YXRlKSB7CiAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gYnVmZmVyCiAgICAgICAgc3RhdGUuYnVmZiA9IHV0ZjhTdHIyQXJyYXlCdWZmZXIoc3RhdGUuYnVmZiwgdHJ1ZSk7CgogICAgICAgIHJldHVybiBTcGFya01ENS5wcm90b3R5cGUuc2V0U3RhdGUuY2FsbCh0aGlzLCBzdGF0ZSk7CiAgICB9OwoKICAgIFNwYXJrTUQ1LkFycmF5QnVmZmVyLnByb3RvdHlwZS5kZXN0cm95ID0gU3BhcmtNRDUucHJvdG90eXBlLmRlc3Ryb3k7CgogICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIucHJvdG90eXBlLl9maW5pc2ggPSBTcGFya01ENS5wcm90b3R5cGUuX2ZpbmlzaDsKCiAgICAvKioKICAgICAqIFBlcmZvcm1zIHRoZSBtZDUgaGFzaCBvbiBhbiBhcnJheSBidWZmZXIuCiAgICAgKgogICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyIFRoZSBhcnJheSBidWZmZXIKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gICAgIFtyYXddIFRydWUgdG8gZ2V0IHRoZSByYXcgc3RyaW5nLCBmYWxzZSB0byBnZXQgdGhlIGhleCBvbmUKICAgICAqCiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSByZXN1bHQKICAgICAqLwogICAgU3BhcmtNRDUuQXJyYXlCdWZmZXIuaGFzaCA9IGZ1bmN0aW9uIChhcnIsIHJhdykgewogICAgICAgIHZhciBoYXNoID0gbWQ1MV9hcnJheShuZXcgVWludDhBcnJheShhcnIpKSwKICAgICAgICAgICAgcmV0ID0gaGV4KGhhc2gpOwoKICAgICAgICByZXR1cm4gcmF3ID8gaGV4VG9CaW5hcnlTdHJpbmcocmV0KSA6IHJldDsKICAgIH07CgogICAgcmV0dXJuIFNwYXJrTUQ1Owp9KSk7CgoKLyoqKi8gfSksCgovKioqLyA0NTU6Ci8qKiovIChmdW5jdGlvbihtb2R1bGUpIHsKCi8qIQoqIHN3ZWV0YWxlcnQyIHYxMS43LjEKKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiovCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7CiAgIHRydWUgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6CiAgMDsKfSkodGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBUaGlzIG1vZHVsZSBjb250YWlucyBgV2Vha01hcGBzIGZvciBlYWNoIGVmZmVjdGl2ZWx5LSJwcml2YXRlICBwcm9wZXJ0eSIgdGhhdCBhIGBTd2FsYCBoYXMuCiAgICogRm9yIGV4YW1wbGUsIHRvIHNldCB0aGUgcHJpdmF0ZSBwcm9wZXJ0eSAiZm9vIiBvZiBgdGhpc2AgdG8gImJhciIsIHlvdSBjYW4gYHByaXZhdGVQcm9wcy5mb28uc2V0KHRoaXMsICdiYXInKWAKICAgKiBUaGlzIGlzIHRoZSBhcHByb2FjaCB0aGF0IEJhYmVsIHdpbGwgcHJvYmFibHkgdGFrZSB0byBpbXBsZW1lbnQgcHJpdmF0ZSBtZXRob2RzL2ZpZWxkcwogICAqICAgaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJpdmF0ZS1tZXRob2RzCiAgICogICBodHRwczovL2dpdGh1Yi5jb20vYmFiZWwvYmFiZWwvcHVsbC83NTU1CiAgICogT25jZSB3ZSBoYXZlIHRoZSBjaGFuZ2VzIGZyb20gdGhhdCBQUiBpbiBCYWJlbCwgYW5kIG91ciBjb3JlIGNsYXNzIGZpdHMgcmVhc29uYWJsZSBpbiAqb25lIG1vZHVsZSoKICAgKiAgIHRoZW4gd2UgY2FuIHVzZSB0aGF0IGxhbmd1YWdlIGZlYXR1cmUuCiAgICovCgogIHZhciBwcml2YXRlUHJvcHMgPSB7CiAgICBhd2FpdGluZ1Byb21pc2U6IG5ldyBXZWFrTWFwKCksCiAgICBwcm9taXNlOiBuZXcgV2Vha01hcCgpLAogICAgaW5uZXJQYXJhbXM6IG5ldyBXZWFrTWFwKCksCiAgICBkb21DYWNoZTogbmV3IFdlYWtNYXAoKQogIH07CgogIGNvbnN0IHN3YWxQcmVmaXggPSAnc3dhbDItJzsKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmdbXX0gaXRlbXMKICAgKiBAcmV0dXJucyB7b2JqZWN0fQogICAqLwogIGNvbnN0IHByZWZpeCA9IGl0ZW1zID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IHt9OwogICAgZm9yIChjb25zdCBpIGluIGl0ZW1zKSB7CiAgICAgIHJlc3VsdFtpdGVtc1tpXV0gPSBzd2FsUHJlZml4ICsgaXRlbXNbaV07CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH07CiAgY29uc3Qgc3dhbENsYXNzZXMgPSBwcmVmaXgoWydjb250YWluZXInLCAnc2hvd24nLCAnaGVpZ2h0LWF1dG8nLCAnaW9zZml4JywgJ3BvcHVwJywgJ21vZGFsJywgJ25vLWJhY2tkcm9wJywgJ25vLXRyYW5zaXRpb24nLCAndG9hc3QnLCAndG9hc3Qtc2hvd24nLCAnc2hvdycsICdoaWRlJywgJ2Nsb3NlJywgJ3RpdGxlJywgJ2h0bWwtY29udGFpbmVyJywgJ2FjdGlvbnMnLCAnY29uZmlybScsICdkZW55JywgJ2NhbmNlbCcsICdkZWZhdWx0LW91dGxpbmUnLCAnZm9vdGVyJywgJ2ljb24nLCAnaWNvbi1jb250ZW50JywgJ2ltYWdlJywgJ2lucHV0JywgJ2ZpbGUnLCAncmFuZ2UnLCAnc2VsZWN0JywgJ3JhZGlvJywgJ2NoZWNrYm94JywgJ2xhYmVsJywgJ3RleHRhcmVhJywgJ2lucHV0ZXJyb3InLCAnaW5wdXQtbGFiZWwnLCAndmFsaWRhdGlvbi1tZXNzYWdlJywgJ3Byb2dyZXNzLXN0ZXBzJywgJ2FjdGl2ZS1wcm9ncmVzcy1zdGVwJywgJ3Byb2dyZXNzLXN0ZXAnLCAncHJvZ3Jlc3Mtc3RlcC1saW5lJywgJ2xvYWRlcicsICdsb2FkaW5nJywgJ3N0eWxlZCcsICd0b3AnLCAndG9wLXN0YXJ0JywgJ3RvcC1lbmQnLCAndG9wLWxlZnQnLCAndG9wLXJpZ2h0JywgJ2NlbnRlcicsICdjZW50ZXItc3RhcnQnLCAnY2VudGVyLWVuZCcsICdjZW50ZXItbGVmdCcsICdjZW50ZXItcmlnaHQnLCAnYm90dG9tJywgJ2JvdHRvbS1zdGFydCcsICdib3R0b20tZW5kJywgJ2JvdHRvbS1sZWZ0JywgJ2JvdHRvbS1yaWdodCcsICdncm93LXJvdycsICdncm93LWNvbHVtbicsICdncm93LWZ1bGxzY3JlZW4nLCAncnRsJywgJ3RpbWVyLXByb2dyZXNzLWJhcicsICd0aW1lci1wcm9ncmVzcy1iYXItY29udGFpbmVyJywgJ3Njcm9sbGJhci1tZWFzdXJlJywgJ2ljb24tc3VjY2VzcycsICdpY29uLXdhcm5pbmcnLCAnaWNvbi1pbmZvJywgJ2ljb24tcXVlc3Rpb24nLCAnaWNvbi1lcnJvciddKTsKICBjb25zdCBpY29uVHlwZXMgPSBwcmVmaXgoWydzdWNjZXNzJywgJ3dhcm5pbmcnLCAnaW5mbycsICdxdWVzdGlvbicsICdlcnJvciddKTsKCiAgY29uc3QgY29uc29sZVByZWZpeCA9ICdTd2VldEFsZXJ0MjonOwoKICAvKioKICAgKiBGaWx0ZXIgdGhlIHVuaXF1ZSB2YWx1ZXMgaW50byBhIG5ldyBhcnJheQogICAqCiAgICogQHBhcmFtIHtBcnJheX0gYXJyCiAgICogQHJldHVybnMge0FycmF5fQogICAqLwogIGNvbnN0IHVuaXF1ZUFycmF5ID0gYXJyID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKHJlc3VsdC5pbmRleE9mKGFycltpXSkgPT09IC0xKSB7CiAgICAgICAgcmVzdWx0LnB1c2goYXJyW2ldKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9OwoKICAvKioKICAgKiBDYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIgb2YgYSBzdHJpbmcKICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIKICAgKiBAcmV0dXJucyB7c3RyaW5nfQogICAqLwogIGNvbnN0IGNhcGl0YWxpemVGaXJzdExldHRlciA9IHN0ciA9PiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7CgogIC8qKgogICAqIFN0YW5kYXJkaXplIGNvbnNvbGUgd2FybmluZ3MKICAgKgogICAqIEBwYXJhbSB7c3RyaW5nIHwgQXJyYXl9IG1lc3NhZ2UKICAgKi8KICBjb25zdCB3YXJuID0gbWVzc2FnZSA9PiB7CiAgICBjb25zb2xlLndhcm4oYCR7Y29uc29sZVByZWZpeH0gJHt0eXBlb2YgbWVzc2FnZSA9PT0gJ29iamVjdCcgPyBtZXNzYWdlLmpvaW4oJyAnKSA6IG1lc3NhZ2V9YCk7CiAgfTsKCiAgLyoqCiAgICogU3RhbmRhcmRpemUgY29uc29sZSBlcnJvcnMKICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlCiAgICovCiAgY29uc3QgZXJyb3IgPSBtZXNzYWdlID0+IHsKICAgIGNvbnNvbGUuZXJyb3IoYCR7Y29uc29sZVByZWZpeH0gJHttZXNzYWdlfWApOwogIH07CgogIC8qKgogICAqIFByaXZhdGUgZ2xvYmFsIHN0YXRlIGZvciBgd2Fybk9uY2VgCiAgICoKICAgKiBAdHlwZSB7QXJyYXl9CiAgICogQHByaXZhdGUKICAgKi8KICBjb25zdCBwcmV2aW91c1dhcm5PbmNlTWVzc2FnZXMgPSBbXTsKCiAgLyoqCiAgICogU2hvdyBhIGNvbnNvbGUgd2FybmluZywgYnV0IG9ubHkgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBzaG93bgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UKICAgKi8KICBjb25zdCB3YXJuT25jZSA9IG1lc3NhZ2UgPT4gewogICAgaWYgKCFwcmV2aW91c1dhcm5PbmNlTWVzc2FnZXMuaW5jbHVkZXMobWVzc2FnZSkpIHsKICAgICAgcHJldmlvdXNXYXJuT25jZU1lc3NhZ2VzLnB1c2gobWVzc2FnZSk7CiAgICAgIHdhcm4obWVzc2FnZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogU2hvdyBhIG9uZS10aW1lIGNvbnNvbGUgd2FybmluZyBhYm91dCBkZXByZWNhdGVkIHBhcmFtcy9tZXRob2RzCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gZGVwcmVjYXRlZFBhcmFtCiAgICogQHBhcmFtIHtzdHJpbmd9IHVzZUluc3RlYWQKICAgKi8KICBjb25zdCB3YXJuQWJvdXREZXByZWNhdGlvbiA9IChkZXByZWNhdGVkUGFyYW0sIHVzZUluc3RlYWQpID0+IHsKICAgIHdhcm5PbmNlKGAiJHtkZXByZWNhdGVkUGFyYW19IiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHVzZSAiJHt1c2VJbnN0ZWFkfSIgaW5zdGVhZC5gKTsKICB9OwoKICAvKioKICAgKiBJZiBgYXJnYCBpcyBhIGZ1bmN0aW9uLCBjYWxsIGl0ICh3aXRoIG5vIGFyZ3VtZW50cyBvciBjb250ZXh0KSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCiAgICogT3RoZXJ3aXNlLCBqdXN0IHBhc3MgdGhlIHZhbHVlIHRocm91Z2gKICAgKgogICAqIEBwYXJhbSB7RnVuY3Rpb24gfCBhbnl9IGFyZwogICAqIEByZXR1cm5zIHthbnl9CiAgICovCiAgY29uc3QgY2FsbElmRnVuY3Rpb24gPSBhcmcgPT4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJyA/IGFyZygpIDogYXJnOwoKICAvKioKICAgKiBAcGFyYW0ge2FueX0gYXJnCiAgICogQHJldHVybnMge2Jvb2xlYW59CiAgICovCiAgY29uc3QgaGFzVG9Qcm9taXNlRm4gPSBhcmcgPT4gYXJnICYmIHR5cGVvZiBhcmcudG9Qcm9taXNlID09PSAnZnVuY3Rpb24nOwoKICAvKioKICAgKiBAcGFyYW0ge2FueX0gYXJnCiAgICogQHJldHVybnMge1Byb21pc2V9CiAgICovCiAgY29uc3QgYXNQcm9taXNlID0gYXJnID0+IGhhc1RvUHJvbWlzZUZuKGFyZykgPyBhcmcudG9Qcm9taXNlKCkgOiBQcm9taXNlLnJlc29sdmUoYXJnKTsKCiAgLyoqCiAgICogQHBhcmFtIHthbnl9IGFyZwogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwogIGNvbnN0IGlzUHJvbWlzZSA9IGFyZyA9PiBhcmcgJiYgUHJvbWlzZS5yZXNvbHZlKGFyZykgPT09IGFyZzsKCiAgLyoqCiAgICogR2V0cyB0aGUgcG9wdXAgY29udGFpbmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBiYWNrZHJvcCBhbmQgdGhlIHBvcHVwIGl0c2VsZi4KICAgKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCiAgY29uc3QgZ2V0Q29udGFpbmVyID0gKCkgPT4gZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yKGAuJHtzd2FsQ2xhc3Nlcy5jb250YWluZXJ9YCk7CgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclN0cmluZwogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCiAgY29uc3QgZWxlbWVudEJ5U2VsZWN0b3IgPSBzZWxlY3RvclN0cmluZyA9PiB7CiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXIoKTsKICAgIHJldHVybiBjb250YWluZXIgPyBjb250YWluZXIucXVlcnlTZWxlY3RvcihzZWxlY3RvclN0cmluZykgOiBudWxsOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfQogICAqLwogIGNvbnN0IGVsZW1lbnRCeUNsYXNzID0gY2xhc3NOYW1lID0+IHsKICAgIHJldHVybiBlbGVtZW50QnlTZWxlY3RvcihgLiR7Y2xhc3NOYW1lfWApOwogIH07CgogIC8qKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCiAgY29uc3QgZ2V0UG9wdXAgPSAoKSA9PiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlcy5wb3B1cCk7CgogIC8qKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCiAgY29uc3QgZ2V0SWNvbiA9ICgpID0+IGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLmljb24pOwoKICAvKioKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfQogICAqLwogIGNvbnN0IGdldEljb25Db250ZW50ID0gKCkgPT4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXNbJ2ljb24tY29udGVudCddKTsKCiAgLyoqCiAgICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH0KICAgKi8KICBjb25zdCBnZXRUaXRsZSA9ICgpID0+IGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLnRpdGxlKTsKCiAgLyoqCiAgICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH0KICAgKi8KICBjb25zdCBnZXRIdG1sQ29udGFpbmVyID0gKCkgPT4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXNbJ2h0bWwtY29udGFpbmVyJ10pOwoKICAvKioKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfQogICAqLwogIGNvbnN0IGdldEltYWdlID0gKCkgPT4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXMuaW1hZ2UpOwoKICAvKioKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfQogICAqLwogIGNvbnN0IGdldFByb2dyZXNzU3RlcHMgPSAoKSA9PiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlc1sncHJvZ3Jlc3Mtc3RlcHMnXSk7CgogIC8qKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCiAgY29uc3QgZ2V0VmFsaWRhdGlvbk1lc3NhZ2UgPSAoKSA9PiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlc1sndmFsaWRhdGlvbi1tZXNzYWdlJ10pOwoKICAvKioKICAgKiBAcmV0dXJucyB7SFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsfQogICAqLwogIGNvbnN0IGdldENvbmZpcm1CdXR0b24gPSAoKSA9PiAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fSAqL2VsZW1lbnRCeVNlbGVjdG9yKGAuJHtzd2FsQ2xhc3Nlcy5hY3Rpb25zfSAuJHtzd2FsQ2xhc3Nlcy5jb25maXJtfWApOwoKICAvKioKICAgKiBAcmV0dXJucyB7SFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsfQogICAqLwogIGNvbnN0IGdldENhbmNlbEJ1dHRvbiA9ICgpID0+IC8qKiBAdHlwZSB7SFRNTEJ1dHRvbkVsZW1lbnR9ICovZWxlbWVudEJ5U2VsZWN0b3IoYC4ke3N3YWxDbGFzc2VzLmFjdGlvbnN9IC4ke3N3YWxDbGFzc2VzLmNhbmNlbH1gKTsKCiAgLyoqCiAgICogQHJldHVybnMge0hUTUxCdXR0b25FbGVtZW50IHwgbnVsbH0KICAgKi8KICBjb25zdCBnZXREZW55QnV0dG9uID0gKCkgPT4gLyoqIEB0eXBlIHtIVE1MQnV0dG9uRWxlbWVudH0gKi9lbGVtZW50QnlTZWxlY3RvcihgLiR7c3dhbENsYXNzZXMuYWN0aW9uc30gLiR7c3dhbENsYXNzZXMuZGVueX1gKTsKCiAgLyoqCiAgICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH0KICAgKi8KICBjb25zdCBnZXRJbnB1dExhYmVsID0gKCkgPT4gZWxlbWVudEJ5Q2xhc3Moc3dhbENsYXNzZXNbJ2lucHV0LWxhYmVsJ10pOwoKICAvKioKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfQogICAqLwogIGNvbnN0IGdldExvYWRlciA9ICgpID0+IGVsZW1lbnRCeVNlbGVjdG9yKGAuJHtzd2FsQ2xhc3Nlcy5sb2FkZXJ9YCk7CgogIC8qKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCiAgY29uc3QgZ2V0QWN0aW9ucyA9ICgpID0+IGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLmFjdGlvbnMpOwoKICAvKioKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfQogICAqLwogIGNvbnN0IGdldEZvb3RlciA9ICgpID0+IGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzLmZvb3Rlcik7CgogIC8qKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCiAgY29uc3QgZ2V0VGltZXJQcm9ncmVzc0JhciA9ICgpID0+IGVsZW1lbnRCeUNsYXNzKHN3YWxDbGFzc2VzWyd0aW1lci1wcm9ncmVzcy1iYXInXSk7CgogIC8qKgogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9CiAgICovCiAgY29uc3QgZ2V0Q2xvc2VCdXR0b24gPSAoKSA9PiBlbGVtZW50QnlDbGFzcyhzd2FsQ2xhc3Nlcy5jbG9zZSk7CgogIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qa3VwL2ZvY3VzYWJsZS9ibG9iL21hc3Rlci9pbmRleC5qcwogIGNvbnN0IGZvY3VzYWJsZSA9IGAKICBhW2hyZWZdLAogIGFyZWFbaHJlZl0sCiAgaW5wdXQ6bm90KFtkaXNhYmxlZF0pLAogIHNlbGVjdDpub3QoW2Rpc2FibGVkXSksCiAgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLAogIGJ1dHRvbjpub3QoW2Rpc2FibGVkXSksCiAgaWZyYW1lLAogIG9iamVjdCwKICBlbWJlZCwKICBbdGFiaW5kZXg9IjAiXSwKICBbY29udGVudGVkaXRhYmxlXSwKICBhdWRpb1tjb250cm9sc10sCiAgdmlkZW9bY29udHJvbHNdLAogIHN1bW1hcnkKYDsKICAvKioKICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnRbXX0KICAgKi8KICBjb25zdCBnZXRGb2N1c2FibGVFbGVtZW50cyA9ICgpID0+IHsKICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzV2l0aFRhYmluZGV4ID0gQXJyYXkuZnJvbShnZXRQb3B1cCgpLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0YWJpbmRleF06bm90KFt0YWJpbmRleD0iLTEiXSk6bm90KFt0YWJpbmRleD0iMCJdKScpKQogICAgLy8gc29ydCBhY2NvcmRpbmcgdG8gdGFiaW5kZXgKICAgIC5zb3J0KChhLCBiKSA9PiB7CiAgICAgIGNvbnN0IHRhYmluZGV4QSA9IHBhcnNlSW50KGEuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpKTsKICAgICAgY29uc3QgdGFiaW5kZXhCID0gcGFyc2VJbnQoYi5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JykpOwogICAgICBpZiAodGFiaW5kZXhBID4gdGFiaW5kZXhCKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0gZWxzZSBpZiAodGFiaW5kZXhBIDwgdGFiaW5kZXhCKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIHJldHVybiAwOwogICAgfSk7CiAgICBjb25zdCBvdGhlckZvY3VzYWJsZUVsZW1lbnRzID0gQXJyYXkuZnJvbShnZXRQb3B1cCgpLnF1ZXJ5U2VsZWN0b3JBbGwoZm9jdXNhYmxlKSkuZmlsdGVyKGVsID0+IGVsLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSAhPT0gJy0xJyk7CiAgICByZXR1cm4gdW5pcXVlQXJyYXkoZm9jdXNhYmxlRWxlbWVudHNXaXRoVGFiaW5kZXguY29uY2F0KG90aGVyRm9jdXNhYmxlRWxlbWVudHMpKS5maWx0ZXIoZWwgPT4gaXNWaXNpYmxlJDEoZWwpKTsKICB9OwoKICAvKioKICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgKi8KICBjb25zdCBpc01vZGFsID0gKCkgPT4gewogICAgcmV0dXJuIGhhc0NsYXNzKGRvY3VtZW50LmJvZHksIHN3YWxDbGFzc2VzLnNob3duKSAmJiAhaGFzQ2xhc3MoZG9jdW1lbnQuYm9keSwgc3dhbENsYXNzZXNbJ3RvYXN0LXNob3duJ10pICYmICFoYXNDbGFzcyhkb2N1bWVudC5ib2R5LCBzd2FsQ2xhc3Nlc1snbm8tYmFja2Ryb3AnXSk7CiAgfTsKCiAgLyoqCiAgICogQHJldHVybnMge2Jvb2xlYW59CiAgICovCiAgY29uc3QgaXNUb2FzdCA9ICgpID0+IHsKICAgIHJldHVybiBnZXRQb3B1cCgpICYmIGhhc0NsYXNzKGdldFBvcHVwKCksIHN3YWxDbGFzc2VzLnRvYXN0KTsKICB9OwoKICAvKioKICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgKi8KICBjb25zdCBpc0xvYWRpbmcgPSAoKSA9PiB7CiAgICByZXR1cm4gZ2V0UG9wdXAoKS5oYXNBdHRyaWJ1dGUoJ2RhdGEtbG9hZGluZycpOwogIH07CgogIC8vIFJlbWVtYmVyIHN0YXRlIGluIGNhc2VzIHdoZXJlIG9wZW5pbmcgYW5kIGhhbmRsaW5nIGEgbW9kYWwgd2lsbCBmaWRkbGUgd2l0aCBpdC4KICBjb25zdCBzdGF0ZXMgPSB7CiAgICBwcmV2aW91c0JvZHlQYWRkaW5nOiBudWxsCiAgfTsKCiAgLyoqCiAgICogU2VjdXJlbHkgc2V0IGlubmVySFRNTCBvZiBhbiBlbGVtZW50CiAgICogaHR0cHM6Ly9naXRodWIuY29tL3N3ZWV0YWxlcnQyL3N3ZWV0YWxlcnQyL2lzc3Vlcy8xOTI2CiAgICoKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtCiAgICogQHBhcmFtIHtzdHJpbmd9IGh0bWwKICAgKi8KICBjb25zdCBzZXRJbm5lckh0bWwgPSAoZWxlbSwgaHRtbCkgPT4gewogICAgZWxlbS50ZXh0Q29udGVudCA9ICcnOwogICAgaWYgKGh0bWwpIHsKICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOwogICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsIGB0ZXh0L2h0bWxgKTsKICAgICAgQXJyYXkuZnJvbShwYXJzZWQucXVlcnlTZWxlY3RvcignaGVhZCcpLmNoaWxkTm9kZXMpLmZvckVhY2goY2hpbGQgPT4gewogICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQoY2hpbGQpOwogICAgICB9KTsKICAgICAgQXJyYXkuZnJvbShwYXJzZWQucXVlcnlTZWxlY3RvcignYm9keScpLmNoaWxkTm9kZXMpLmZvckVhY2goY2hpbGQgPT4gewogICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgfHwgY2hpbGQgaW5zdGFuY2VvZiBIVE1MQXVkaW9FbGVtZW50KSB7CiAgICAgICAgICBlbGVtLmFwcGVuZENoaWxkKGNoaWxkLmNsb25lTm9kZSh0cnVlKSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi9pc3N1ZXMvMjUwNwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbGVtLmFwcGVuZENoaWxkKGNoaWxkKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0KICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lCiAgICogQHJldHVybnMge2Jvb2xlYW59CiAgICovCiAgY29uc3QgaGFzQ2xhc3MgPSAoZWxlbSwgY2xhc3NOYW1lKSA9PiB7CiAgICBpZiAoIWNsYXNzTmFtZSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjb25zdCBjbGFzc0xpc3QgPSBjbGFzc05hbWUuc3BsaXQoL1xzKy8pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc0xpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFlbGVtLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc0xpc3RbaV0pKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgY29uc3QgcmVtb3ZlQ3VzdG9tQ2xhc3NlcyA9IChlbGVtLCBwYXJhbXMpID0+IHsKICAgIEFycmF5LmZyb20oZWxlbS5jbGFzc0xpc3QpLmZvckVhY2goY2xhc3NOYW1lID0+IHsKICAgICAgaWYgKCFPYmplY3QudmFsdWVzKHN3YWxDbGFzc2VzKS5pbmNsdWRlcyhjbGFzc05hbWUpICYmICFPYmplY3QudmFsdWVzKGljb25UeXBlcykuaW5jbHVkZXMoY2xhc3NOYW1lKSAmJiAhT2JqZWN0LnZhbHVlcyhwYXJhbXMuc2hvd0NsYXNzKS5pbmNsdWRlcyhjbGFzc05hbWUpKSB7CiAgICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7CiAgICAgIH0KICAgIH0pOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0KICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lCiAgICovCiAgY29uc3QgYXBwbHlDdXN0b21DbGFzcyA9IChlbGVtLCBwYXJhbXMsIGNsYXNzTmFtZSkgPT4gewogICAgcmVtb3ZlQ3VzdG9tQ2xhc3NlcyhlbGVtLCBwYXJhbXMpOwogICAgaWYgKHBhcmFtcy5jdXN0b21DbGFzcyAmJiBwYXJhbXMuY3VzdG9tQ2xhc3NbY2xhc3NOYW1lXSkgewogICAgICBpZiAodHlwZW9mIHBhcmFtcy5jdXN0b21DbGFzc1tjbGFzc05hbWVdICE9PSAnc3RyaW5nJyAmJiAhcGFyYW1zLmN1c3RvbUNsYXNzW2NsYXNzTmFtZV0uZm9yRWFjaCkgewogICAgICAgIHdhcm4oYEludmFsaWQgdHlwZSBvZiBjdXN0b21DbGFzcy4ke2NsYXNzTmFtZX0hIEV4cGVjdGVkIHN0cmluZyBvciBpdGVyYWJsZSBvYmplY3QsIGdvdCAiJHt0eXBlb2YgcGFyYW1zLmN1c3RvbUNsYXNzW2NsYXNzTmFtZV19ImApOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBhZGRDbGFzcyhlbGVtLCBwYXJhbXMuY3VzdG9tQ2xhc3NbY2xhc3NOYW1lXSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wdXAKICAgKiBAcGFyYW0ge2ltcG9ydCgnLi9yZW5kZXJlcnMvcmVuZGVySW5wdXQnKS5JbnB1dENsYXNzfSBpbnB1dENsYXNzCiAgICogQHJldHVybnMge0hUTUxJbnB1dEVsZW1lbnQgfCBudWxsfQogICAqLwogIGNvbnN0IGdldElucHV0JDEgPSAocG9wdXAsIGlucHV0Q2xhc3MpID0+IHsKICAgIGlmICghaW5wdXRDbGFzcykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHN3aXRjaCAoaW5wdXRDbGFzcykgewogICAgICBjYXNlICdzZWxlY3QnOgogICAgICBjYXNlICd0ZXh0YXJlYSc6CiAgICAgIGNhc2UgJ2ZpbGUnOgogICAgICAgIHJldHVybiBwb3B1cC5xdWVyeVNlbGVjdG9yKGAuJHtzd2FsQ2xhc3Nlcy5wb3B1cH0gPiAuJHtzd2FsQ2xhc3Nlc1tpbnB1dENsYXNzXX1gKTsKICAgICAgY2FzZSAnY2hlY2tib3gnOgogICAgICAgIHJldHVybiBwb3B1cC5xdWVyeVNlbGVjdG9yKGAuJHtzd2FsQ2xhc3Nlcy5wb3B1cH0gPiAuJHtzd2FsQ2xhc3Nlcy5jaGVja2JveH0gaW5wdXRgKTsKICAgICAgY2FzZSAncmFkaW8nOgogICAgICAgIHJldHVybiBwb3B1cC5xdWVyeVNlbGVjdG9yKGAuJHtzd2FsQ2xhc3Nlcy5wb3B1cH0gPiAuJHtzd2FsQ2xhc3Nlcy5yYWRpb30gaW5wdXQ6Y2hlY2tlZGApIHx8IHBvcHVwLnF1ZXJ5U2VsZWN0b3IoYC4ke3N3YWxDbGFzc2VzLnBvcHVwfSA+IC4ke3N3YWxDbGFzc2VzLnJhZGlvfSBpbnB1dDpmaXJzdC1jaGlsZGApOwogICAgICBjYXNlICdyYW5nZSc6CiAgICAgICAgcmV0dXJuIHBvcHVwLnF1ZXJ5U2VsZWN0b3IoYC4ke3N3YWxDbGFzc2VzLnBvcHVwfSA+IC4ke3N3YWxDbGFzc2VzLnJhbmdlfSBpbnB1dGApOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBwb3B1cC5xdWVyeVNlbGVjdG9yKGAuJHtzd2FsQ2xhc3Nlcy5wb3B1cH0gPiAuJHtzd2FsQ2xhc3Nlcy5pbnB1dH1gKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50IHwgSFRNTFNlbGVjdEVsZW1lbnR9IGlucHV0CiAgICovCiAgY29uc3QgZm9jdXNJbnB1dCA9IGlucHV0ID0+IHsKICAgIGlucHV0LmZvY3VzKCk7CgogICAgLy8gcGxhY2UgY3Vyc29yIGF0IGVuZCBvZiB0ZXh0IGluIHRleHQgaW5wdXQKICAgIGlmIChpbnB1dC50eXBlICE9PSAnZmlsZScpIHsKICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjM0NTkxNQogICAgICBjb25zdCB2YWwgPSBpbnB1dC52YWx1ZTsKICAgICAgaW5wdXQudmFsdWUgPSAnJzsKICAgICAgaW5wdXQudmFsdWUgPSB2YWw7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudCB8IEhUTUxFbGVtZW50W10gfCBudWxsfSB0YXJnZXQKICAgKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdIHwgcmVhZG9ubHkgc3RyaW5nW119IGNsYXNzTGlzdAogICAqIEBwYXJhbSB7Ym9vbGVhbn0gY29uZGl0aW9uCiAgICovCiAgY29uc3QgdG9nZ2xlQ2xhc3MgPSAodGFyZ2V0LCBjbGFzc0xpc3QsIGNvbmRpdGlvbikgPT4gewogICAgaWYgKCF0YXJnZXQgfHwgIWNsYXNzTGlzdCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodHlwZW9mIGNsYXNzTGlzdCA9PT0gJ3N0cmluZycpIHsKICAgICAgY2xhc3NMaXN0ID0gY2xhc3NMaXN0LnNwbGl0KC9ccysvKS5maWx0ZXIoQm9vbGVhbik7CiAgICB9CiAgICBjbGFzc0xpc3QuZm9yRWFjaChjbGFzc05hbWUgPT4gewogICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7CiAgICAgICAgdGFyZ2V0LmZvckVhY2goZWxlbSA9PiB7CiAgICAgICAgICBjb25kaXRpb24gPyBlbGVtLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKSA6IGVsZW0uY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbmRpdGlvbiA/IHRhcmdldC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSkgOiB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpOwogICAgICB9CiAgICB9KTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50IHwgSFRNTEVsZW1lbnRbXSB8IG51bGx9IHRhcmdldAogICAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW10gfCByZWFkb25seSBzdHJpbmdbXX0gY2xhc3NMaXN0CiAgICovCiAgY29uc3QgYWRkQ2xhc3MgPSAodGFyZ2V0LCBjbGFzc0xpc3QpID0+IHsKICAgIHRvZ2dsZUNsYXNzKHRhcmdldCwgY2xhc3NMaXN0LCB0cnVlKTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50IHwgSFRNTEVsZW1lbnRbXSB8IG51bGx9IHRhcmdldAogICAqIEBwYXJhbSB7c3RyaW5nIHwgc3RyaW5nW10gfCByZWFkb25seSBzdHJpbmdbXX0gY2xhc3NMaXN0CiAgICovCiAgY29uc3QgcmVtb3ZlQ2xhc3MgPSAodGFyZ2V0LCBjbGFzc0xpc3QpID0+IHsKICAgIHRvZ2dsZUNsYXNzKHRhcmdldCwgY2xhc3NMaXN0LCBmYWxzZSk7CiAgfTsKCiAgLyoqCiAgICogR2V0IGRpcmVjdCBjaGlsZCBvZiBhbiBlbGVtZW50IGJ5IGNsYXNzIG5hbWUKICAgKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0KICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lCiAgICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgdW5kZWZpbmVkfQogICAqLwogIGNvbnN0IGdldERpcmVjdENoaWxkQnlDbGFzcyA9IChlbGVtLCBjbGFzc05hbWUpID0+IHsKICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShlbGVtLmNoaWxkcmVuKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTsKICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgaGFzQ2xhc3MoY2hpbGQsIGNsYXNzTmFtZSkpIHsKICAgICAgICByZXR1cm4gY2hpbGQ7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5CiAgICogQHBhcmFtIHsqfSB2YWx1ZQogICAqLwogIGNvbnN0IGFwcGx5TnVtZXJpY2FsU3R5bGUgPSAoZWxlbSwgcHJvcGVydHksIHZhbHVlKSA9PiB7CiAgICBpZiAodmFsdWUgPT09IGAke3BhcnNlSW50KHZhbHVlKX1gKSB7CiAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpOwogICAgfQogICAgaWYgKHZhbHVlIHx8IHBhcnNlSW50KHZhbHVlKSA9PT0gMCkgewogICAgICBlbGVtLnN0eWxlW3Byb3BlcnR5XSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyBgJHt2YWx1ZX1weGAgOiB2YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGVsZW0uc3R5bGUucmVtb3ZlUHJvcGVydHkocHJvcGVydHkpOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0KICAgKiBAcGFyYW0ge3N0cmluZ30gZGlzcGxheQogICAqLwogIGNvbnN0IHNob3cgPSBmdW5jdGlvbiAoZWxlbSkgewogICAgbGV0IGRpc3BsYXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICdmbGV4JzsKICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9IGRpc3BsYXk7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbQogICAqLwogIGNvbnN0IGhpZGUgPSBlbGVtID0+IHsKICAgIGVsZW0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwYXJlbnQKICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IKICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkKICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUKICAgKi8KICBjb25zdCBzZXRTdHlsZSA9IChwYXJlbnQsIHNlbGVjdG9yLCBwcm9wZXJ0eSwgdmFsdWUpID0+IHsKICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovCiAgICBjb25zdCBlbCA9IHBhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCkgewogICAgICBlbC5zdHlsZVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtCiAgICogQHBhcmFtIHthbnl9IGNvbmRpdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwbGF5CiAgICovCiAgY29uc3QgdG9nZ2xlID0gZnVuY3Rpb24gKGVsZW0sIGNvbmRpdGlvbikgewogICAgbGV0IGRpc3BsYXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICdmbGV4JzsKICAgIGNvbmRpdGlvbiA/IHNob3coZWxlbSwgZGlzcGxheSkgOiBoaWRlKGVsZW0pOwogIH07CgogIC8qKgogICAqIGJvcnJvd2VkIGZyb20ganF1ZXJ5ICQoZWxlbSkuaXMoJzp2aXNpYmxlJykgaW1wbGVtZW50YXRpb24KICAgKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0KICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgKi8KICBjb25zdCBpc1Zpc2libGUkMSA9IGVsZW0gPT4gISEoZWxlbSAmJiAoZWxlbS5vZmZzZXRXaWR0aCB8fCBlbGVtLm9mZnNldEhlaWdodCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKSk7CgogIC8qKgogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwogIGNvbnN0IGFsbEJ1dHRvbnNBcmVIaWRkZW4gPSAoKSA9PiAhaXNWaXNpYmxlJDEoZ2V0Q29uZmlybUJ1dHRvbigpKSAmJiAhaXNWaXNpYmxlJDEoZ2V0RGVueUJ1dHRvbigpKSAmJiAhaXNWaXNpYmxlJDEoZ2V0Q2FuY2VsQnV0dG9uKCkpOwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtCiAgICogQHJldHVybnMge2Jvb2xlYW59CiAgICovCiAgY29uc3QgaXNTY3JvbGxhYmxlID0gZWxlbSA9PiAhIShlbGVtLnNjcm9sbEhlaWdodCA+IGVsZW0uY2xpZW50SGVpZ2h0KTsKCiAgLyoqCiAgICogYm9ycm93ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDYzNTIxMTkKICAgKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0KICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgKi8KICBjb25zdCBoYXNDc3NBbmltYXRpb24gPSBlbGVtID0+IHsKICAgIGNvbnN0IHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSk7CiAgICBjb25zdCBhbmltRHVyYXRpb24gPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2FuaW1hdGlvbi1kdXJhdGlvbicpIHx8ICcwJyk7CiAgICBjb25zdCB0cmFuc0R1cmF0aW9uID0gcGFyc2VGbG9hdChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd0cmFuc2l0aW9uLWR1cmF0aW9uJykgfHwgJzAnKTsKICAgIHJldHVybiBhbmltRHVyYXRpb24gPiAwIHx8IHRyYW5zRHVyYXRpb24gPiAwOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lcgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVzZXQKICAgKi8KICBjb25zdCBhbmltYXRlVGltZXJQcm9ncmVzc0JhciA9IGZ1bmN0aW9uICh0aW1lcikgewogICAgbGV0IHJlc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTsKICAgIGNvbnN0IHRpbWVyUHJvZ3Jlc3NCYXIgPSBnZXRUaW1lclByb2dyZXNzQmFyKCk7CiAgICBpZiAoaXNWaXNpYmxlJDEodGltZXJQcm9ncmVzc0JhcikpIHsKICAgICAgaWYgKHJlc2V0KSB7CiAgICAgICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnOwogICAgICAgIHRpbWVyUHJvZ3Jlc3NCYXIuc3R5bGUud2lkdGggPSAnMTAwJSc7CiAgICAgIH0KICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS50cmFuc2l0aW9uID0gYHdpZHRoICR7dGltZXIgLyAxMDAwfXMgbGluZWFyYDsKICAgICAgICB0aW1lclByb2dyZXNzQmFyLnN0eWxlLndpZHRoID0gJzAlJzsKICAgICAgfSwgMTApOwogICAgfQogIH07CiAgY29uc3Qgc3RvcFRpbWVyUHJvZ3Jlc3NCYXIgPSAoKSA9PiB7CiAgICBjb25zdCB0aW1lclByb2dyZXNzQmFyID0gZ2V0VGltZXJQcm9ncmVzc0JhcigpOwogICAgY29uc3QgdGltZXJQcm9ncmVzc0JhcldpZHRoID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGltZXJQcm9ncmVzc0Jhcikud2lkdGgpOwogICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgndHJhbnNpdGlvbicpOwogICAgdGltZXJQcm9ncmVzc0Jhci5zdHlsZS53aWR0aCA9ICcxMDAlJzsKICAgIGNvbnN0IHRpbWVyUHJvZ3Jlc3NCYXJGdWxsV2lkdGggPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aW1lclByb2dyZXNzQmFyKS53aWR0aCk7CiAgICBjb25zdCB0aW1lclByb2dyZXNzQmFyUGVyY2VudCA9IHRpbWVyUHJvZ3Jlc3NCYXJXaWR0aCAvIHRpbWVyUHJvZ3Jlc3NCYXJGdWxsV2lkdGggKiAxMDA7CiAgICB0aW1lclByb2dyZXNzQmFyLnN0eWxlLndpZHRoID0gYCR7dGltZXJQcm9ncmVzc0JhclBlcmNlbnR9JWA7CiAgfTsKCiAgY29uc3QgUkVTVE9SRV9GT0NVU19USU1FT1VUID0gMTAwOwoKICAvKiogQHR5cGUge0dsb2JhbFN0YXRlfSAqLwogIGNvbnN0IGdsb2JhbFN0YXRlID0ge307CiAgY29uc3QgZm9jdXNQcmV2aW91c0FjdGl2ZUVsZW1lbnQgPSAoKSA9PiB7CiAgICBpZiAoZ2xvYmFsU3RhdGUucHJldmlvdXNBY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHsKICAgICAgZ2xvYmFsU3RhdGUucHJldmlvdXNBY3RpdmVFbGVtZW50LmZvY3VzKCk7CiAgICAgIGdsb2JhbFN0YXRlLnByZXZpb3VzQWN0aXZlRWxlbWVudCA9IG51bGw7CiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmJvZHkpIHsKICAgICAgZG9jdW1lbnQuYm9keS5mb2N1cygpOwogICAgfQogIH07CgogIC8qKgogICAqIFJlc3RvcmUgcHJldmlvdXMgYWN0aXZlIChmb2N1c2VkKSBlbGVtZW50CiAgICoKICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJldHVybkZvY3VzCiAgICogQHJldHVybnMge1Byb21pc2V9CiAgICovCiAgY29uc3QgcmVzdG9yZUFjdGl2ZUVsZW1lbnQgPSByZXR1cm5Gb2N1cyA9PiB7CiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7CiAgICAgIGlmICghcmV0dXJuRm9jdXMpIHsKICAgICAgICByZXR1cm4gcmVzb2x2ZSgpOwogICAgICB9CiAgICAgIGNvbnN0IHggPSB3aW5kb3cuc2Nyb2xsWDsKICAgICAgY29uc3QgeSA9IHdpbmRvdy5zY3JvbGxZOwogICAgICBnbG9iYWxTdGF0ZS5yZXN0b3JlRm9jdXNUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgZm9jdXNQcmV2aW91c0FjdGl2ZUVsZW1lbnQoKTsKICAgICAgICByZXNvbHZlKCk7CiAgICAgIH0sIFJFU1RPUkVfRk9DVVNfVElNRU9VVCk7IC8vIGlzc3Vlcy85MDAKCiAgICAgIHdpbmRvdy5zY3JvbGxUbyh4LCB5KTsKICAgIH0pOwogIH07CgogIC8qKgogICAqIERldGVjdCBOb2RlIGVudgogICAqCiAgICogQHJldHVybnMge2Jvb2xlYW59CiAgICovCiAgY29uc3QgaXNOb2RlRW52ID0gKCkgPT4gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJzsKCiAgY29uc3Qgc3dlZXRIVE1MID0gYAogPGRpdiBhcmlhLWxhYmVsbGVkYnk9IiR7c3dhbENsYXNzZXMudGl0bGV9IiBhcmlhLWRlc2NyaWJlZGJ5PSIke3N3YWxDbGFzc2VzWydodG1sLWNvbnRhaW5lciddfSIgY2xhc3M9IiR7c3dhbENsYXNzZXMucG9wdXB9IiB0YWJpbmRleD0iLTEiPgogICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IiR7c3dhbENsYXNzZXMuY2xvc2V9Ij48L2J1dHRvbj4KICAgPHVsIGNsYXNzPSIke3N3YWxDbGFzc2VzWydwcm9ncmVzcy1zdGVwcyddfSI+PC91bD4KICAgPGRpdiBjbGFzcz0iJHtzd2FsQ2xhc3Nlcy5pY29ufSI+PC9kaXY+CiAgIDxpbWcgY2xhc3M9IiR7c3dhbENsYXNzZXMuaW1hZ2V9IiAvPgogICA8aDIgY2xhc3M9IiR7c3dhbENsYXNzZXMudGl0bGV9IiBpZD0iJHtzd2FsQ2xhc3Nlcy50aXRsZX0iPjwvaDI+CiAgIDxkaXYgY2xhc3M9IiR7c3dhbENsYXNzZXNbJ2h0bWwtY29udGFpbmVyJ119IiBpZD0iJHtzd2FsQ2xhc3Nlc1snaHRtbC1jb250YWluZXInXX0iPjwvZGl2PgogICA8aW5wdXQgY2xhc3M9IiR7c3dhbENsYXNzZXMuaW5wdXR9IiAvPgogICA8aW5wdXQgdHlwZT0iZmlsZSIgY2xhc3M9IiR7c3dhbENsYXNzZXMuZmlsZX0iIC8+CiAgIDxkaXYgY2xhc3M9IiR7c3dhbENsYXNzZXMucmFuZ2V9Ij4KICAgICA8aW5wdXQgdHlwZT0icmFuZ2UiIC8+CiAgICAgPG91dHB1dD48L291dHB1dD4KICAgPC9kaXY+CiAgIDxzZWxlY3QgY2xhc3M9IiR7c3dhbENsYXNzZXMuc2VsZWN0fSI+PC9zZWxlY3Q+CiAgIDxkaXYgY2xhc3M9IiR7c3dhbENsYXNzZXMucmFkaW99Ij48L2Rpdj4KICAgPGxhYmVsIGZvcj0iJHtzd2FsQ2xhc3Nlcy5jaGVja2JveH0iIGNsYXNzPSIke3N3YWxDbGFzc2VzLmNoZWNrYm94fSI+CiAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPgogICAgIDxzcGFuIGNsYXNzPSIke3N3YWxDbGFzc2VzLmxhYmVsfSI+PC9zcGFuPgogICA8L2xhYmVsPgogICA8dGV4dGFyZWEgY2xhc3M9IiR7c3dhbENsYXNzZXMudGV4dGFyZWF9Ij48L3RleHRhcmVhPgogICA8ZGl2IGNsYXNzPSIke3N3YWxDbGFzc2VzWyd2YWxpZGF0aW9uLW1lc3NhZ2UnXX0iIGlkPSIke3N3YWxDbGFzc2VzWyd2YWxpZGF0aW9uLW1lc3NhZ2UnXX0iPjwvZGl2PgogICA8ZGl2IGNsYXNzPSIke3N3YWxDbGFzc2VzLmFjdGlvbnN9Ij4KICAgICA8ZGl2IGNsYXNzPSIke3N3YWxDbGFzc2VzLmxvYWRlcn0iPjwvZGl2PgogICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJHtzd2FsQ2xhc3Nlcy5jb25maXJtfSI+PC9idXR0b24+CiAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSIke3N3YWxDbGFzc2VzLmRlbnl9Ij48L2J1dHRvbj4KICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IiR7c3dhbENsYXNzZXMuY2FuY2VsfSI+PC9idXR0b24+CiAgIDwvZGl2PgogICA8ZGl2IGNsYXNzPSIke3N3YWxDbGFzc2VzLmZvb3Rlcn0iPjwvZGl2PgogICA8ZGl2IGNsYXNzPSIke3N3YWxDbGFzc2VzWyd0aW1lci1wcm9ncmVzcy1iYXItY29udGFpbmVyJ119Ij4KICAgICA8ZGl2IGNsYXNzPSIke3N3YWxDbGFzc2VzWyd0aW1lci1wcm9ncmVzcy1iYXInXX0iPjwvZGl2PgogICA8L2Rpdj4KIDwvZGl2PgpgLnJlcGxhY2UoLyhefFxuKVxzKi9nLCAnJyk7CgogIC8qKgogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwogIGNvbnN0IHJlc2V0T2xkQ29udGFpbmVyID0gKCkgPT4gewogICAgY29uc3Qgb2xkQ29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7CiAgICBpZiAoIW9sZENvbnRhaW5lcikgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBvbGRDb250YWluZXIucmVtb3ZlKCk7CiAgICByZW1vdmVDbGFzcyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBkb2N1bWVudC5ib2R5XSwgW3N3YWxDbGFzc2VzWyduby1iYWNrZHJvcCddLCBzd2FsQ2xhc3Nlc1sndG9hc3Qtc2hvd24nXSwgc3dhbENsYXNzZXNbJ2hhcy1jb2x1bW4nXV0pOwogICAgcmV0dXJuIHRydWU7CiAgfTsKICBjb25zdCByZXNldFZhbGlkYXRpb25NZXNzYWdlJDEgPSAoKSA9PiB7CiAgICBnbG9iYWxTdGF0ZS5jdXJyZW50SW5zdGFuY2UucmVzZXRWYWxpZGF0aW9uTWVzc2FnZSgpOwogIH07CiAgY29uc3QgYWRkSW5wdXRDaGFuZ2VMaXN0ZW5lcnMgPSAoKSA9PiB7CiAgICBjb25zdCBwb3B1cCA9IGdldFBvcHVwKCk7CiAgICBjb25zdCBpbnB1dCA9IGdldERpcmVjdENoaWxkQnlDbGFzcyhwb3B1cCwgc3dhbENsYXNzZXMuaW5wdXQpOwogICAgY29uc3QgZmlsZSA9IGdldERpcmVjdENoaWxkQnlDbGFzcyhwb3B1cCwgc3dhbENsYXNzZXMuZmlsZSk7CiAgICAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovCiAgICBjb25zdCByYW5nZSA9IHBvcHVwLnF1ZXJ5U2VsZWN0b3IoYC4ke3N3YWxDbGFzc2VzLnJhbmdlfSBpbnB1dGApOwogICAgLyoqIEB0eXBlIHtIVE1MT3V0cHV0RWxlbWVudH0gKi8KICAgIGNvbnN0IHJhbmdlT3V0cHV0ID0gcG9wdXAucXVlcnlTZWxlY3RvcihgLiR7c3dhbENsYXNzZXMucmFuZ2V9IG91dHB1dGApOwogICAgY29uc3Qgc2VsZWN0ID0gZ2V0RGlyZWN0Q2hpbGRCeUNsYXNzKHBvcHVwLCBzd2FsQ2xhc3Nlcy5zZWxlY3QpOwogICAgLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLwogICAgY29uc3QgY2hlY2tib3ggPSBwb3B1cC5xdWVyeVNlbGVjdG9yKGAuJHtzd2FsQ2xhc3Nlcy5jaGVja2JveH0gaW5wdXRgKTsKICAgIGNvbnN0IHRleHRhcmVhID0gZ2V0RGlyZWN0Q2hpbGRCeUNsYXNzKHBvcHVwLCBzd2FsQ2xhc3Nlcy50ZXh0YXJlYSk7CiAgICBpbnB1dC5vbmlucHV0ID0gcmVzZXRWYWxpZGF0aW9uTWVzc2FnZSQxOwogICAgZmlsZS5vbmNoYW5nZSA9IHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UkMTsKICAgIHNlbGVjdC5vbmNoYW5nZSA9IHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UkMTsKICAgIGNoZWNrYm94Lm9uY2hhbmdlID0gcmVzZXRWYWxpZGF0aW9uTWVzc2FnZSQxOwogICAgdGV4dGFyZWEub25pbnB1dCA9IHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UkMTsKICAgIHJhbmdlLm9uaW5wdXQgPSAoKSA9PiB7CiAgICAgIHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UkMSgpOwogICAgICByYW5nZU91dHB1dC52YWx1ZSA9IHJhbmdlLnZhbHVlOwogICAgfTsKICAgIHJhbmdlLm9uY2hhbmdlID0gKCkgPT4gewogICAgICByZXNldFZhbGlkYXRpb25NZXNzYWdlJDEoKTsKICAgICAgcmFuZ2VPdXRwdXQudmFsdWUgPSByYW5nZS52YWx1ZTsKICAgIH07CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmcgfCBIVE1MRWxlbWVudH0gdGFyZ2V0CiAgICogQHJldHVybnMge0hUTUxFbGVtZW50fQogICAqLwogIGNvbnN0IGdldFRhcmdldCA9IHRhcmdldCA9PiB0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJyA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KSA6IHRhcmdldDsKCiAgLyoqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgY29uc3Qgc2V0dXBBY2Nlc3NpYmlsaXR5ID0gcGFyYW1zID0+IHsKICAgIGNvbnN0IHBvcHVwID0gZ2V0UG9wdXAoKTsKICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgncm9sZScsIHBhcmFtcy50b2FzdCA/ICdhbGVydCcgOiAnZGlhbG9nJyk7CiAgICBwb3B1cC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIHBhcmFtcy50b2FzdCA/ICdwb2xpdGUnIDogJ2Fzc2VydGl2ZScpOwogICAgaWYgKCFwYXJhbXMudG9hc3QpIHsKICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgJ3RydWUnKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0YXJnZXRFbGVtZW50CiAgICovCiAgY29uc3Qgc2V0dXBSVEwgPSB0YXJnZXRFbGVtZW50ID0+IHsKICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXRFbGVtZW50KS5kaXJlY3Rpb24gPT09ICdydGwnKSB7CiAgICAgIGFkZENsYXNzKGdldENvbnRhaW5lcigpLCBzd2FsQ2xhc3Nlcy5ydGwpOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwogIGNvbnN0IGluaXQgPSBwYXJhbXMgPT4gewogICAgLy8gQ2xlYW4gdXAgdGhlIG9sZCBwb3B1cCBjb250YWluZXIgaWYgaXQgZXhpc3RzCiAgICBjb25zdCBvbGRDb250YWluZXJFeGlzdGVkID0gcmVzZXRPbGRDb250YWluZXIoKTsKCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmIChpc05vZGVFbnYoKSkgewogICAgICBlcnJvcignU3dlZXRBbGVydDIgcmVxdWlyZXMgZG9jdW1lbnQgdG8gaW5pdGlhbGl6ZScpOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSBzd2FsQ2xhc3Nlcy5jb250YWluZXI7CiAgICBpZiAob2xkQ29udGFpbmVyRXhpc3RlZCkgewogICAgICBhZGRDbGFzcyhjb250YWluZXIsIHN3YWxDbGFzc2VzWyduby10cmFuc2l0aW9uJ10pOwogICAgfQogICAgc2V0SW5uZXJIdG1sKGNvbnRhaW5lciwgc3dlZXRIVE1MKTsKICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBnZXRUYXJnZXQocGFyYW1zLnRhcmdldCk7CiAgICB0YXJnZXRFbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7CiAgICBzZXR1cEFjY2Vzc2liaWxpdHkocGFyYW1zKTsKICAgIHNldHVwUlRMKHRhcmdldEVsZW1lbnQpOwogICAgYWRkSW5wdXRDaGFuZ2VMaXN0ZW5lcnMoKTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50IHwgb2JqZWN0IHwgc3RyaW5nfSBwYXJhbQogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRhcmdldAogICAqLwogIGNvbnN0IHBhcnNlSHRtbFRvQ29udGFpbmVyID0gKHBhcmFtLCB0YXJnZXQpID0+IHsKICAgIC8vIERPTSBlbGVtZW50CiAgICBpZiAocGFyYW0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgewogICAgICB0YXJnZXQuYXBwZW5kQ2hpbGQocGFyYW0pOwogICAgfQoKICAgIC8vIE9iamVjdAogICAgZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JykgewogICAgICBoYW5kbGVPYmplY3QocGFyYW0sIHRhcmdldCk7CiAgICB9CgogICAgLy8gUGxhaW4gc3RyaW5nCiAgICBlbHNlIGlmIChwYXJhbSkgewogICAgICBzZXRJbm5lckh0bWwodGFyZ2V0LCBwYXJhbSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdGFyZ2V0CiAgICovCiAgY29uc3QgaGFuZGxlT2JqZWN0ID0gKHBhcmFtLCB0YXJnZXQpID0+IHsKICAgIC8vIEpRdWVyeSBlbGVtZW50KHMpCiAgICBpZiAocGFyYW0uanF1ZXJ5KSB7CiAgICAgIGhhbmRsZUpxdWVyeUVsZW0odGFyZ2V0LCBwYXJhbSk7CiAgICB9CgogICAgLy8gRm9yIG90aGVyIG9iamVjdHMgdXNlIHRoZWlyIHN0cmluZyByZXByZXNlbnRhdGlvbgogICAgZWxzZSB7CiAgICAgIHNldElubmVySHRtbCh0YXJnZXQsIHBhcmFtLnRvU3RyaW5nKCkpOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRhcmdldAogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW0KICAgKi8KICBjb25zdCBoYW5kbGVKcXVlcnlFbGVtID0gKHRhcmdldCwgZWxlbSkgPT4gewogICAgdGFyZ2V0LnRleHRDb250ZW50ID0gJyc7CiAgICBpZiAoMCBpbiBlbGVtKSB7CiAgICAgIGZvciAobGV0IGkgPSAwOyAoaSBpbiBlbGVtKTsgaSsrKSB7CiAgICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKGVsZW1baV0uY2xvbmVOb2RlKHRydWUpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKGVsZW0uY2xvbmVOb2RlKHRydWUpKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcmV0dXJucyB7J3dlYmtpdEFuaW1hdGlvbkVuZCcgfCAnYW5pbWF0aW9uZW5kJyB8IGZhbHNlfQogICAqLwogIGNvbnN0IGFuaW1hdGlvbkVuZEV2ZW50ID0gKCgpID0+IHsKICAgIC8vIFByZXZlbnQgcnVuIGluIE5vZGUgZW52CiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi8KICAgIGlmIChpc05vZGVFbnYoKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjb25zdCB0ZXN0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGNvbnN0IHRyYW5zRW5kRXZlbnROYW1lcyA9IHsKICAgICAgV2Via2l0QW5pbWF0aW9uOiAnd2Via2l0QW5pbWF0aW9uRW5kJywKICAgICAgLy8gQ2hyb21lLCBTYWZhcmkgYW5kIE9wZXJhCiAgICAgIGFuaW1hdGlvbjogJ2FuaW1hdGlvbmVuZCcgLy8gU3RhbmRhcmQgc3ludGF4CiAgICB9OwoKICAgIGZvciAoY29uc3QgaSBpbiB0cmFuc0VuZEV2ZW50TmFtZXMpIHsKICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0cmFuc0VuZEV2ZW50TmFtZXMsIGkpICYmIHR5cGVvZiB0ZXN0RWwuc3R5bGVbaV0gIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgcmV0dXJuIHRyYW5zRW5kRXZlbnROYW1lc1tpXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0pKCk7CgogIC8qKgogICAqIE1lYXN1cmUgc2Nyb2xsYmFyIHdpZHRoIGZvciBwYWRkaW5nIGJvZHkgZHVyaW5nIG1vZGFsIHNob3cvaGlkZQogICAqIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9qcy9zcmMvbW9kYWwuanMKICAgKgogICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICovCiAgY29uc3QgbWVhc3VyZVNjcm9sbGJhciA9ICgpID0+IHsKICAgIGNvbnN0IHNjcm9sbERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgc2Nyb2xsRGl2LmNsYXNzTmFtZSA9IHN3YWxDbGFzc2VzWydzY3JvbGxiYXItbWVhc3VyZSddOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JvbGxEaXYpOwogICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBzY3JvbGxEaXYuY2xpZW50V2lkdGg7CiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNjcm9sbERpdik7CiAgICByZXR1cm4gc2Nyb2xsYmFyV2lkdGg7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KICBjb25zdCByZW5kZXJBY3Rpb25zID0gKGluc3RhbmNlLCBwYXJhbXMpID0+IHsKICAgIGNvbnN0IGFjdGlvbnMgPSBnZXRBY3Rpb25zKCk7CiAgICBjb25zdCBsb2FkZXIgPSBnZXRMb2FkZXIoKTsKCiAgICAvLyBBY3Rpb25zIChidXR0b25zKSB3cmFwcGVyCiAgICBpZiAoIXBhcmFtcy5zaG93Q29uZmlybUJ1dHRvbiAmJiAhcGFyYW1zLnNob3dEZW55QnV0dG9uICYmICFwYXJhbXMuc2hvd0NhbmNlbEJ1dHRvbikgewogICAgICBoaWRlKGFjdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgc2hvdyhhY3Rpb25zKTsKICAgIH0KCiAgICAvLyBDdXN0b20gY2xhc3MKICAgIGFwcGx5Q3VzdG9tQ2xhc3MoYWN0aW9ucywgcGFyYW1zLCAnYWN0aW9ucycpOwoKICAgIC8vIFJlbmRlciBhbGwgdGhlIGJ1dHRvbnMKICAgIHJlbmRlckJ1dHRvbnMoYWN0aW9ucywgbG9hZGVyLCBwYXJhbXMpOwoKICAgIC8vIExvYWRlcgogICAgc2V0SW5uZXJIdG1sKGxvYWRlciwgcGFyYW1zLmxvYWRlckh0bWwpOwogICAgYXBwbHlDdXN0b21DbGFzcyhsb2FkZXIsIHBhcmFtcywgJ2xvYWRlcicpOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGFjdGlvbnMKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBsb2FkZXIKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KICBmdW5jdGlvbiByZW5kZXJCdXR0b25zKGFjdGlvbnMsIGxvYWRlciwgcGFyYW1zKSB7CiAgICBjb25zdCBjb25maXJtQnV0dG9uID0gZ2V0Q29uZmlybUJ1dHRvbigpOwogICAgY29uc3QgZGVueUJ1dHRvbiA9IGdldERlbnlCdXR0b24oKTsKICAgIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IGdldENhbmNlbEJ1dHRvbigpOwoKICAgIC8vIFJlbmRlciBidXR0b25zCiAgICByZW5kZXJCdXR0b24oY29uZmlybUJ1dHRvbiwgJ2NvbmZpcm0nLCBwYXJhbXMpOwogICAgcmVuZGVyQnV0dG9uKGRlbnlCdXR0b24sICdkZW55JywgcGFyYW1zKTsKICAgIHJlbmRlckJ1dHRvbihjYW5jZWxCdXR0b24sICdjYW5jZWwnLCBwYXJhbXMpOwogICAgaGFuZGxlQnV0dG9uc1N0eWxpbmcoY29uZmlybUJ1dHRvbiwgZGVueUJ1dHRvbiwgY2FuY2VsQnV0dG9uLCBwYXJhbXMpOwogICAgaWYgKHBhcmFtcy5yZXZlcnNlQnV0dG9ucykgewogICAgICBpZiAocGFyYW1zLnRvYXN0KSB7CiAgICAgICAgYWN0aW9ucy5pbnNlcnRCZWZvcmUoY2FuY2VsQnV0dG9uLCBjb25maXJtQnV0dG9uKTsKICAgICAgICBhY3Rpb25zLmluc2VydEJlZm9yZShkZW55QnV0dG9uLCBjb25maXJtQnV0dG9uKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBhY3Rpb25zLmluc2VydEJlZm9yZShjYW5jZWxCdXR0b24sIGxvYWRlcik7CiAgICAgICAgYWN0aW9ucy5pbnNlcnRCZWZvcmUoZGVueUJ1dHRvbiwgbG9hZGVyKTsKICAgICAgICBhY3Rpb25zLmluc2VydEJlZm9yZShjb25maXJtQnV0dG9uLCBsb2FkZXIpOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb25maXJtQnV0dG9uCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZGVueUJ1dHRvbgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNhbmNlbEJ1dHRvbgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwogIGZ1bmN0aW9uIGhhbmRsZUJ1dHRvbnNTdHlsaW5nKGNvbmZpcm1CdXR0b24sIGRlbnlCdXR0b24sIGNhbmNlbEJ1dHRvbiwgcGFyYW1zKSB7CiAgICBpZiAoIXBhcmFtcy5idXR0b25zU3R5bGluZykgewogICAgICByZW1vdmVDbGFzcyhbY29uZmlybUJ1dHRvbiwgZGVueUJ1dHRvbiwgY2FuY2VsQnV0dG9uXSwgc3dhbENsYXNzZXMuc3R5bGVkKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgYWRkQ2xhc3MoW2NvbmZpcm1CdXR0b24sIGRlbnlCdXR0b24sIGNhbmNlbEJ1dHRvbl0sIHN3YWxDbGFzc2VzLnN0eWxlZCk7CgogICAgLy8gQnV0dG9ucyBiYWNrZ3JvdW5kIGNvbG9ycwogICAgaWYgKHBhcmFtcy5jb25maXJtQnV0dG9uQ29sb3IpIHsKICAgICAgY29uZmlybUJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBwYXJhbXMuY29uZmlybUJ1dHRvbkNvbG9yOwogICAgICBhZGRDbGFzcyhjb25maXJtQnV0dG9uLCBzd2FsQ2xhc3Nlc1snZGVmYXVsdC1vdXRsaW5lJ10pOwogICAgfQogICAgaWYgKHBhcmFtcy5kZW55QnV0dG9uQ29sb3IpIHsKICAgICAgZGVueUJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBwYXJhbXMuZGVueUJ1dHRvbkNvbG9yOwogICAgICBhZGRDbGFzcyhkZW55QnV0dG9uLCBzd2FsQ2xhc3Nlc1snZGVmYXVsdC1vdXRsaW5lJ10pOwogICAgfQogICAgaWYgKHBhcmFtcy5jYW5jZWxCdXR0b25Db2xvcikgewogICAgICBjYW5jZWxCdXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcGFyYW1zLmNhbmNlbEJ1dHRvbkNvbG9yOwogICAgICBhZGRDbGFzcyhjYW5jZWxCdXR0b24sIHN3YWxDbGFzc2VzWydkZWZhdWx0LW91dGxpbmUnXSk7CiAgICB9CiAgfQoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBidXR0b24KICAgKiBAcGFyYW0geydjb25maXJtJyB8ICdkZW55JyB8ICdjYW5jZWwnfSBidXR0b25UeXBlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgZnVuY3Rpb24gcmVuZGVyQnV0dG9uKGJ1dHRvbiwgYnV0dG9uVHlwZSwgcGFyYW1zKSB7CiAgICB0b2dnbGUoYnV0dG9uLCBwYXJhbXNbYHNob3cke2NhcGl0YWxpemVGaXJzdExldHRlcihidXR0b25UeXBlKX1CdXR0b25gXSwgJ2lubGluZS1ibG9jaycpOwogICAgc2V0SW5uZXJIdG1sKGJ1dHRvbiwgcGFyYW1zW2Ake2J1dHRvblR5cGV9QnV0dG9uVGV4dGBdKTsgLy8gU2V0IGNhcHRpb24gdGV4dAogICAgYnV0dG9uLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHBhcmFtc1tgJHtidXR0b25UeXBlfUJ1dHRvbkFyaWFMYWJlbGBdKTsgLy8gQVJJQSBsYWJlbAoKICAgIC8vIEFkZCBidXR0b25zIGN1c3RvbSBjbGFzc2VzCiAgICBidXR0b24uY2xhc3NOYW1lID0gc3dhbENsYXNzZXNbYnV0dG9uVHlwZV07CiAgICBhcHBseUN1c3RvbUNsYXNzKGJ1dHRvbiwgcGFyYW1zLCBgJHtidXR0b25UeXBlfUJ1dHRvbmApOwogICAgYWRkQ2xhc3MoYnV0dG9uLCBwYXJhbXNbYCR7YnV0dG9uVHlwZX1CdXR0b25DbGFzc2BdKTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgY29uc3QgcmVuZGVyQ2xvc2VCdXR0b24gPSAoaW5zdGFuY2UsIHBhcmFtcykgPT4gewogICAgY29uc3QgY2xvc2VCdXR0b24gPSBnZXRDbG9zZUJ1dHRvbigpOwogICAgc2V0SW5uZXJIdG1sKGNsb3NlQnV0dG9uLCBwYXJhbXMuY2xvc2VCdXR0b25IdG1sKTsKCiAgICAvLyBDdXN0b20gY2xhc3MKICAgIGFwcGx5Q3VzdG9tQ2xhc3MoY2xvc2VCdXR0b24sIHBhcmFtcywgJ2Nsb3NlQnV0dG9uJyk7CiAgICB0b2dnbGUoY2xvc2VCdXR0b24sIHBhcmFtcy5zaG93Q2xvc2VCdXR0b24pOwogICAgY2xvc2VCdXR0b24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgcGFyYW1zLmNsb3NlQnV0dG9uQXJpYUxhYmVsKTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwogIGNvbnN0IHJlbmRlckNvbnRhaW5lciA9IChpbnN0YW5jZSwgcGFyYW1zKSA9PiB7CiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXIoKTsKICAgIGlmICghY29udGFpbmVyKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGhhbmRsZUJhY2tkcm9wUGFyYW0oY29udGFpbmVyLCBwYXJhbXMuYmFja2Ryb3ApOwogICAgaGFuZGxlUG9zaXRpb25QYXJhbShjb250YWluZXIsIHBhcmFtcy5wb3NpdGlvbik7CiAgICBoYW5kbGVHcm93UGFyYW0oY29udGFpbmVyLCBwYXJhbXMuZ3Jvdyk7CgogICAgLy8gQ3VzdG9tIGNsYXNzCiAgICBhcHBseUN1c3RvbUNsYXNzKGNvbnRhaW5lciwgcGFyYW1zLCAnY29udGFpbmVyJyk7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc1snYmFja2Ryb3AnXX0gYmFja2Ryb3AKICAgKi8KICBmdW5jdGlvbiBoYW5kbGVCYWNrZHJvcFBhcmFtKGNvbnRhaW5lciwgYmFja2Ryb3ApIHsKICAgIGlmICh0eXBlb2YgYmFja2Ryb3AgPT09ICdzdHJpbmcnKSB7CiAgICAgIGNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kID0gYmFja2Ryb3A7CiAgICB9IGVsc2UgaWYgKCFiYWNrZHJvcCkgewogICAgICBhZGRDbGFzcyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBkb2N1bWVudC5ib2R5XSwgc3dhbENsYXNzZXNbJ25vLWJhY2tkcm9wJ10pOwogICAgfQogIH0KCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc1sncG9zaXRpb24nXX0gcG9zaXRpb24KICAgKi8KICBmdW5jdGlvbiBoYW5kbGVQb3NpdGlvblBhcmFtKGNvbnRhaW5lciwgcG9zaXRpb24pIHsKICAgIGlmIChwb3NpdGlvbiBpbiBzd2FsQ2xhc3NlcykgewogICAgICBhZGRDbGFzcyhjb250YWluZXIsIHN3YWxDbGFzc2VzW3Bvc2l0aW9uXSk7CiAgICB9IGVsc2UgewogICAgICB3YXJuKCdUaGUgInBvc2l0aW9uIiBwYXJhbWV0ZXIgaXMgbm90IHZhbGlkLCBkZWZhdWx0aW5nIHRvICJjZW50ZXIiJyk7CiAgICAgIGFkZENsYXNzKGNvbnRhaW5lciwgc3dhbENsYXNzZXMuY2VudGVyKTsKICAgIH0KICB9CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lcgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnNbJ2dyb3cnXX0gZ3JvdwogICAqLwogIGZ1bmN0aW9uIGhhbmRsZUdyb3dQYXJhbShjb250YWluZXIsIGdyb3cpIHsKICAgIGlmIChncm93ICYmIHR5cGVvZiBncm93ID09PSAnc3RyaW5nJykgewogICAgICBjb25zdCBncm93Q2xhc3MgPSBgZ3Jvdy0ke2dyb3d9YDsKICAgICAgaWYgKGdyb3dDbGFzcyBpbiBzd2FsQ2xhc3NlcykgewogICAgICAgIGFkZENsYXNzKGNvbnRhaW5lciwgc3dhbENsYXNzZXNbZ3Jvd0NsYXNzXSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vLyA8cmVmZXJlbmNlIHBhdGg9Ii4uLy4uLy4uLy4uL3N3ZWV0YWxlcnQyLmQudHMiLz4KCiAgLyoqIEB0eXBlIHtJbnB1dENsYXNzW119ICovCiAgY29uc3QgaW5wdXRDbGFzc2VzID0gWydpbnB1dCcsICdmaWxlJywgJ3JhbmdlJywgJ3NlbGVjdCcsICdyYWRpbycsICdjaGVja2JveCcsICd0ZXh0YXJlYSddOwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwogIGNvbnN0IHJlbmRlcklucHV0ID0gKGluc3RhbmNlLCBwYXJhbXMpID0+IHsKICAgIGNvbnN0IHBvcHVwID0gZ2V0UG9wdXAoKTsKICAgIGNvbnN0IGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSk7CiAgICBjb25zdCByZXJlbmRlciA9ICFpbm5lclBhcmFtcyB8fCBwYXJhbXMuaW5wdXQgIT09IGlubmVyUGFyYW1zLmlucHV0OwogICAgaW5wdXRDbGFzc2VzLmZvckVhY2goaW5wdXRDbGFzcyA9PiB7CiAgICAgIGNvbnN0IGlucHV0Q29udGFpbmVyID0gZ2V0RGlyZWN0Q2hpbGRCeUNsYXNzKHBvcHVwLCBzd2FsQ2xhc3Nlc1tpbnB1dENsYXNzXSk7CgogICAgICAvLyBzZXQgYXR0cmlidXRlcwogICAgICBzZXRBdHRyaWJ1dGVzKGlucHV0Q2xhc3MsIHBhcmFtcy5pbnB1dEF0dHJpYnV0ZXMpOwoKICAgICAgLy8gc2V0IGNsYXNzCiAgICAgIGlucHV0Q29udGFpbmVyLmNsYXNzTmFtZSA9IHN3YWxDbGFzc2VzW2lucHV0Q2xhc3NdOwogICAgICBpZiAocmVyZW5kZXIpIHsKICAgICAgICBoaWRlKGlucHV0Q29udGFpbmVyKTsKICAgICAgfQogICAgfSk7CiAgICBpZiAocGFyYW1zLmlucHV0KSB7CiAgICAgIGlmIChyZXJlbmRlcikgewogICAgICAgIHNob3dJbnB1dChwYXJhbXMpOwogICAgICB9CiAgICAgIC8vIHNldCBjdXN0b20gY2xhc3MKICAgICAgc2V0Q3VzdG9tQ2xhc3MocGFyYW1zKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KICBjb25zdCBzaG93SW5wdXQgPSBwYXJhbXMgPT4gewogICAgaWYgKCFyZW5kZXJJbnB1dFR5cGVbcGFyYW1zLmlucHV0XSkgewogICAgICBlcnJvcihgVW5leHBlY3RlZCB0eXBlIG9mIGlucHV0ISBFeHBlY3RlZCAidGV4dCIsICJlbWFpbCIsICJwYXNzd29yZCIsICJudW1iZXIiLCAidGVsIiwgInNlbGVjdCIsICJyYWRpbyIsICJjaGVja2JveCIsICJ0ZXh0YXJlYSIsICJmaWxlIiBvciAidXJsIiwgZ290ICIke3BhcmFtcy5pbnB1dH0iYCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGlucHV0Q29udGFpbmVyID0gZ2V0SW5wdXRDb250YWluZXIocGFyYW1zLmlucHV0KTsKICAgIGNvbnN0IGlucHV0ID0gcmVuZGVySW5wdXRUeXBlW3BhcmFtcy5pbnB1dF0oaW5wdXRDb250YWluZXIsIHBhcmFtcyk7CiAgICBzaG93KGlucHV0Q29udGFpbmVyKTsKCiAgICAvLyBpbnB1dCBhdXRvZm9jdXMKICAgIGlmIChwYXJhbXMuaW5wdXRBdXRvRm9jdXMpIHsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgZm9jdXNJbnB1dChpbnB1dCk7CiAgICAgIH0pOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudH0gaW5wdXQKICAgKi8KICBjb25zdCByZW1vdmVBdHRyaWJ1dGVzID0gaW5wdXQgPT4gewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IGF0dHJOYW1lID0gaW5wdXQuYXR0cmlidXRlc1tpXS5uYW1lOwogICAgICBpZiAoIVsndHlwZScsICd2YWx1ZScsICdzdHlsZSddLmluY2x1ZGVzKGF0dHJOYW1lKSkgewogICAgICAgIGlucHV0LnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0lucHV0Q2xhc3N9IGlucHV0Q2xhc3MKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zWydpbnB1dEF0dHJpYnV0ZXMnXX0gaW5wdXRBdHRyaWJ1dGVzCiAgICovCiAgY29uc3Qgc2V0QXR0cmlidXRlcyA9IChpbnB1dENsYXNzLCBpbnB1dEF0dHJpYnV0ZXMpID0+IHsKICAgIGNvbnN0IGlucHV0ID0gZ2V0SW5wdXQkMShnZXRQb3B1cCgpLCBpbnB1dENsYXNzKTsKICAgIGlmICghaW5wdXQpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgcmVtb3ZlQXR0cmlidXRlcyhpbnB1dCk7CiAgICBmb3IgKGNvbnN0IGF0dHIgaW4gaW5wdXRBdHRyaWJ1dGVzKSB7CiAgICAgIGlucHV0LnNldEF0dHJpYnV0ZShhdHRyLCBpbnB1dEF0dHJpYnV0ZXNbYXR0cl0pOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwogIGNvbnN0IHNldEN1c3RvbUNsYXNzID0gcGFyYW1zID0+IHsKICAgIGNvbnN0IGlucHV0Q29udGFpbmVyID0gZ2V0SW5wdXRDb250YWluZXIocGFyYW1zLmlucHV0KTsKICAgIGlmICh0eXBlb2YgcGFyYW1zLmN1c3RvbUNsYXNzID09PSAnb2JqZWN0JykgewogICAgICBhZGRDbGFzcyhpbnB1dENvbnRhaW5lciwgcGFyYW1zLmN1c3RvbUNsYXNzLmlucHV0KTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50fSBpbnB1dAogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwogIGNvbnN0IHNldElucHV0UGxhY2Vob2xkZXIgPSAoaW5wdXQsIHBhcmFtcykgPT4gewogICAgaWYgKCFpbnB1dC5wbGFjZWhvbGRlciB8fCBwYXJhbXMuaW5wdXRQbGFjZWhvbGRlcikgewogICAgICBpbnB1dC5wbGFjZWhvbGRlciA9IHBhcmFtcy5pbnB1dFBsYWNlaG9sZGVyOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SW5wdXR9IGlucHV0CiAgICogQHBhcmFtIHtJbnB1dH0gcHJlcGVuZFRvCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgY29uc3Qgc2V0SW5wdXRMYWJlbCA9IChpbnB1dCwgcHJlcGVuZFRvLCBwYXJhbXMpID0+IHsKICAgIGlmIChwYXJhbXMuaW5wdXRMYWJlbCkgewogICAgICBpbnB1dC5pZCA9IHN3YWxDbGFzc2VzLmlucHV0OwogICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7CiAgICAgIGNvbnN0IGxhYmVsQ2xhc3MgPSBzd2FsQ2xhc3Nlc1snaW5wdXQtbGFiZWwnXTsKICAgICAgbGFiZWwuc2V0QXR0cmlidXRlKCdmb3InLCBpbnB1dC5pZCk7CiAgICAgIGxhYmVsLmNsYXNzTmFtZSA9IGxhYmVsQ2xhc3M7CiAgICAgIGlmICh0eXBlb2YgcGFyYW1zLmN1c3RvbUNsYXNzID09PSAnb2JqZWN0JykgewogICAgICAgIGFkZENsYXNzKGxhYmVsLCBwYXJhbXMuY3VzdG9tQ2xhc3MuaW5wdXRMYWJlbCk7CiAgICAgIH0KICAgICAgbGFiZWwuaW5uZXJUZXh0ID0gcGFyYW1zLmlucHV0TGFiZWw7CiAgICAgIHByZXBlbmRUby5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgbGFiZWwpOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnNbJ2lucHV0J119IGlucHV0VHlwZQogICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0KICAgKi8KICBjb25zdCBnZXRJbnB1dENvbnRhaW5lciA9IGlucHV0VHlwZSA9PiB7CiAgICByZXR1cm4gZ2V0RGlyZWN0Q2hpbGRCeUNsYXNzKGdldFBvcHVwKCksIHN3YWxDbGFzc2VzW2lucHV0VHlwZV0gfHwgc3dhbENsYXNzZXMuaW5wdXQpOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudCB8IEhUTUxPdXRwdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudH0gaW5wdXQKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zWydpbnB1dFZhbHVlJ119IGlucHV0VmFsdWUKICAgKi8KICBjb25zdCBjaGVja0FuZFNldElucHV0VmFsdWUgPSAoaW5wdXQsIGlucHV0VmFsdWUpID0+IHsKICAgIGlmIChbJ3N0cmluZycsICdudW1iZXInXS5pbmNsdWRlcyh0eXBlb2YgaW5wdXRWYWx1ZSkpIHsKICAgICAgaW5wdXQudmFsdWUgPSBgJHtpbnB1dFZhbHVlfWA7CiAgICB9IGVsc2UgaWYgKCFpc1Byb21pc2UoaW5wdXRWYWx1ZSkpIHsKICAgICAgd2FybihgVW5leHBlY3RlZCB0eXBlIG9mIGlucHV0VmFsdWUhIEV4cGVjdGVkICJzdHJpbmciLCAibnVtYmVyIiBvciAiUHJvbWlzZSIsIGdvdCAiJHt0eXBlb2YgaW5wdXRWYWx1ZX0iYCk7CiAgICB9CiAgfTsKCiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCAoaW5wdXQ6IElucHV0IHwgSFRNTEVsZW1lbnQsIHBhcmFtczogU3dlZXRBbGVydE9wdGlvbnMpID0+IElucHV0Pn0gKi8KICBjb25zdCByZW5kZXJJbnB1dFR5cGUgPSB7fTsKCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MSW5wdXRFbGVtZW50fSBpbnB1dAogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqIEByZXR1cm5zIHtIVE1MSW5wdXRFbGVtZW50fQogICAqLwogIHJlbmRlcklucHV0VHlwZS50ZXh0ID0gcmVuZGVySW5wdXRUeXBlLmVtYWlsID0gcmVuZGVySW5wdXRUeXBlLnBhc3N3b3JkID0gcmVuZGVySW5wdXRUeXBlLm51bWJlciA9IHJlbmRlcklucHV0VHlwZS50ZWwgPSByZW5kZXJJbnB1dFR5cGUudXJsID0gKGlucHV0LCBwYXJhbXMpID0+IHsKICAgIGNoZWNrQW5kU2V0SW5wdXRWYWx1ZShpbnB1dCwgcGFyYW1zLmlucHV0VmFsdWUpOwogICAgc2V0SW5wdXRMYWJlbChpbnB1dCwgaW5wdXQsIHBhcmFtcyk7CiAgICBzZXRJbnB1dFBsYWNlaG9sZGVyKGlucHV0LCBwYXJhbXMpOwogICAgaW5wdXQudHlwZSA9IHBhcmFtcy5pbnB1dDsKICAgIHJldHVybiBpbnB1dDsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxJbnB1dEVsZW1lbnR9IGlucHV0CiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICogQHJldHVybnMge0hUTUxJbnB1dEVsZW1lbnR9CiAgICovCiAgcmVuZGVySW5wdXRUeXBlLmZpbGUgPSAoaW5wdXQsIHBhcmFtcykgPT4gewogICAgc2V0SW5wdXRMYWJlbChpbnB1dCwgaW5wdXQsIHBhcmFtcyk7CiAgICBzZXRJbnB1dFBsYWNlaG9sZGVyKGlucHV0LCBwYXJhbXMpOwogICAgcmV0dXJuIGlucHV0OwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTElucHV0RWxlbWVudH0gcmFuZ2UKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKiBAcmV0dXJucyB7SFRNTElucHV0RWxlbWVudH0KICAgKi8KICByZW5kZXJJbnB1dFR5cGUucmFuZ2UgPSAocmFuZ2UsIHBhcmFtcykgPT4gewogICAgY29uc3QgcmFuZ2VJbnB1dCA9IHJhbmdlLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7CiAgICBjb25zdCByYW5nZU91dHB1dCA9IHJhbmdlLnF1ZXJ5U2VsZWN0b3IoJ291dHB1dCcpOwogICAgY2hlY2tBbmRTZXRJbnB1dFZhbHVlKHJhbmdlSW5wdXQsIHBhcmFtcy5pbnB1dFZhbHVlKTsKICAgIHJhbmdlSW5wdXQudHlwZSA9IHBhcmFtcy5pbnB1dDsKICAgIGNoZWNrQW5kU2V0SW5wdXRWYWx1ZShyYW5nZU91dHB1dCwgcGFyYW1zLmlucHV0VmFsdWUpOwogICAgc2V0SW5wdXRMYWJlbChyYW5nZUlucHV0LCByYW5nZSwgcGFyYW1zKTsKICAgIHJldHVybiByYW5nZTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxTZWxlY3RFbGVtZW50fSBzZWxlY3QKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKiBAcmV0dXJucyB7SFRNTFNlbGVjdEVsZW1lbnR9CiAgICovCiAgcmVuZGVySW5wdXRUeXBlLnNlbGVjdCA9IChzZWxlY3QsIHBhcmFtcykgPT4gewogICAgc2VsZWN0LnRleHRDb250ZW50ID0gJyc7CiAgICBpZiAocGFyYW1zLmlucHV0UGxhY2Vob2xkZXIpIHsKICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsKICAgICAgc2V0SW5uZXJIdG1sKHBsYWNlaG9sZGVyLCBwYXJhbXMuaW5wdXRQbGFjZWhvbGRlcik7CiAgICAgIHBsYWNlaG9sZGVyLnZhbHVlID0gJyc7CiAgICAgIHBsYWNlaG9sZGVyLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgcGxhY2Vob2xkZXIuc2VsZWN0ZWQgPSB0cnVlOwogICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXIpOwogICAgfQogICAgc2V0SW5wdXRMYWJlbChzZWxlY3QsIHNlbGVjdCwgcGFyYW1zKTsKICAgIHJldHVybiBzZWxlY3Q7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MSW5wdXRFbGVtZW50fSByYWRpbwogICAqIEByZXR1cm5zIHtIVE1MSW5wdXRFbGVtZW50fQogICAqLwogIHJlbmRlcklucHV0VHlwZS5yYWRpbyA9IHJhZGlvID0+IHsKICAgIHJhZGlvLnRleHRDb250ZW50ID0gJyc7CiAgICByZXR1cm4gcmFkaW87CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MTGFiZWxFbGVtZW50fSBjaGVja2JveENvbnRhaW5lcgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqIEByZXR1cm5zIHtIVE1MSW5wdXRFbGVtZW50fQogICAqLwogIHJlbmRlcklucHV0VHlwZS5jaGVja2JveCA9IChjaGVja2JveENvbnRhaW5lciwgcGFyYW1zKSA9PiB7CiAgICBjb25zdCBjaGVja2JveCA9IGdldElucHV0JDEoZ2V0UG9wdXAoKSwgJ2NoZWNrYm94Jyk7CiAgICBjaGVja2JveC52YWx1ZSA9ICcxJzsKICAgIGNoZWNrYm94LmlkID0gc3dhbENsYXNzZXMuY2hlY2tib3g7CiAgICBjaGVja2JveC5jaGVja2VkID0gQm9vbGVhbihwYXJhbXMuaW5wdXRWYWx1ZSk7CiAgICBjb25zdCBsYWJlbCA9IGNoZWNrYm94Q29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKTsKICAgIHNldElubmVySHRtbChsYWJlbCwgcGFyYW1zLmlucHV0UGxhY2Vob2xkZXIpOwogICAgcmV0dXJuIGNoZWNrYm94OwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTFRleHRBcmVhRWxlbWVudH0gdGV4dGFyZWEKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKiBAcmV0dXJucyB7SFRNTFRleHRBcmVhRWxlbWVudH0KICAgKi8KICByZW5kZXJJbnB1dFR5cGUudGV4dGFyZWEgPSAodGV4dGFyZWEsIHBhcmFtcykgPT4gewogICAgY2hlY2tBbmRTZXRJbnB1dFZhbHVlKHRleHRhcmVhLCBwYXJhbXMuaW5wdXRWYWx1ZSk7CiAgICBzZXRJbnB1dFBsYWNlaG9sZGVyKHRleHRhcmVhLCBwYXJhbXMpOwogICAgc2V0SW5wdXRMYWJlbCh0ZXh0YXJlYSwgdGV4dGFyZWEsIHBhcmFtcyk7CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbAogICAgICogQHJldHVybnMge251bWJlcn0KICAgICAqLwogICAgY29uc3QgZ2V0TWFyZ2luID0gZWwgPT4gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLm1hcmdpbkxlZnQpICsgcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLm1hcmdpblJpZ2h0KTsKCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvaXNzdWVzLzIyOTEKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvaXNzdWVzLzE2OTkKICAgICAgaWYgKCdNdXRhdGlvbk9ic2VydmVyJyBpbiB3aW5kb3cpIHsKICAgICAgICBjb25zdCBpbml0aWFsUG9wdXBXaWR0aCA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGdldFBvcHVwKCkpLndpZHRoKTsKICAgICAgICBjb25zdCB0ZXh0YXJlYVJlc2l6ZUhhbmRsZXIgPSAoKSA9PiB7CiAgICAgICAgICBjb25zdCB0ZXh0YXJlYVdpZHRoID0gdGV4dGFyZWEub2Zmc2V0V2lkdGggKyBnZXRNYXJnaW4odGV4dGFyZWEpOwogICAgICAgICAgaWYgKHRleHRhcmVhV2lkdGggPiBpbml0aWFsUG9wdXBXaWR0aCkgewogICAgICAgICAgICBnZXRQb3B1cCgpLnN0eWxlLndpZHRoID0gYCR7dGV4dGFyZWFXaWR0aH1weGA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnZXRQb3B1cCgpLnN0eWxlLndpZHRoID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKHRleHRhcmVhUmVzaXplSGFuZGxlcikub2JzZXJ2ZSh0ZXh0YXJlYSwgewogICAgICAgICAgYXR0cmlidXRlczogdHJ1ZSwKICAgICAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydzdHlsZSddCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHRleHRhcmVhOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgY29uc3QgcmVuZGVyQ29udGVudCA9IChpbnN0YW5jZSwgcGFyYW1zKSA9PiB7CiAgICBjb25zdCBodG1sQ29udGFpbmVyID0gZ2V0SHRtbENvbnRhaW5lcigpOwogICAgYXBwbHlDdXN0b21DbGFzcyhodG1sQ29udGFpbmVyLCBwYXJhbXMsICdodG1sQ29udGFpbmVyJyk7CgogICAgLy8gQ29udGVudCBhcyBIVE1MCiAgICBpZiAocGFyYW1zLmh0bWwpIHsKICAgICAgcGFyc2VIdG1sVG9Db250YWluZXIocGFyYW1zLmh0bWwsIGh0bWxDb250YWluZXIpOwogICAgICBzaG93KGh0bWxDb250YWluZXIsICdibG9jaycpOwogICAgfQoKICAgIC8vIENvbnRlbnQgYXMgcGxhaW4gdGV4dAogICAgZWxzZSBpZiAocGFyYW1zLnRleHQpIHsKICAgICAgaHRtbENvbnRhaW5lci50ZXh0Q29udGVudCA9IHBhcmFtcy50ZXh0OwogICAgICBzaG93KGh0bWxDb250YWluZXIsICdibG9jaycpOwogICAgfQoKICAgIC8vIE5vIGNvbnRlbnQKICAgIGVsc2UgewogICAgICBoaWRlKGh0bWxDb250YWluZXIpOwogICAgfQogICAgcmVuZGVySW5wdXQoaW5zdGFuY2UsIHBhcmFtcyk7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KICBjb25zdCByZW5kZXJGb290ZXIgPSAoaW5zdGFuY2UsIHBhcmFtcykgPT4gewogICAgY29uc3QgZm9vdGVyID0gZ2V0Rm9vdGVyKCk7CiAgICB0b2dnbGUoZm9vdGVyLCBwYXJhbXMuZm9vdGVyKTsKICAgIGlmIChwYXJhbXMuZm9vdGVyKSB7CiAgICAgIHBhcnNlSHRtbFRvQ29udGFpbmVyKHBhcmFtcy5mb290ZXIsIGZvb3Rlcik7CiAgICB9CgogICAgLy8gQ3VzdG9tIGNsYXNzCiAgICBhcHBseUN1c3RvbUNsYXNzKGZvb3RlciwgcGFyYW1zLCAnZm9vdGVyJyk7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KICBjb25zdCByZW5kZXJJY29uID0gKGluc3RhbmNlLCBwYXJhbXMpID0+IHsKICAgIGNvbnN0IGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSk7CiAgICBjb25zdCBpY29uID0gZ2V0SWNvbigpOwoKICAgIC8vIGlmIHRoZSBnaXZlbiBpY29uIGFscmVhZHkgcmVuZGVyZWQsIGFwcGx5IHRoZSBzdHlsaW5nIHdpdGhvdXQgcmUtcmVuZGVyaW5nIHRoZSBpY29uCiAgICBpZiAoaW5uZXJQYXJhbXMgJiYgcGFyYW1zLmljb24gPT09IGlubmVyUGFyYW1zLmljb24pIHsKICAgICAgLy8gQ3VzdG9tIG9yIGRlZmF1bHQgY29udGVudAogICAgICBzZXRDb250ZW50KGljb24sIHBhcmFtcyk7CiAgICAgIGFwcGx5U3R5bGVzKGljb24sIHBhcmFtcyk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghcGFyYW1zLmljb24gJiYgIXBhcmFtcy5pY29uSHRtbCkgewogICAgICBoaWRlKGljb24pOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAocGFyYW1zLmljb24gJiYgT2JqZWN0LmtleXMoaWNvblR5cGVzKS5pbmRleE9mKHBhcmFtcy5pY29uKSA9PT0gLTEpIHsKICAgICAgZXJyb3IoYFVua25vd24gaWNvbiEgRXhwZWN0ZWQgInN1Y2Nlc3MiLCAiZXJyb3IiLCAid2FybmluZyIsICJpbmZvIiBvciAicXVlc3Rpb24iLCBnb3QgIiR7cGFyYW1zLmljb259ImApOwogICAgICBoaWRlKGljb24pOwogICAgICByZXR1cm47CiAgICB9CiAgICBzaG93KGljb24pOwoKICAgIC8vIEN1c3RvbSBvciBkZWZhdWx0IGNvbnRlbnQKICAgIHNldENvbnRlbnQoaWNvbiwgcGFyYW1zKTsKICAgIGFwcGx5U3R5bGVzKGljb24sIHBhcmFtcyk7CgogICAgLy8gQW5pbWF0ZSBpY29uCiAgICBhZGRDbGFzcyhpY29uLCBwYXJhbXMuc2hvd0NsYXNzLmljb24pOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGljb24KICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KICBjb25zdCBhcHBseVN0eWxlcyA9IChpY29uLCBwYXJhbXMpID0+IHsKICAgIGZvciAoY29uc3QgaWNvblR5cGUgaW4gaWNvblR5cGVzKSB7CiAgICAgIGlmIChwYXJhbXMuaWNvbiAhPT0gaWNvblR5cGUpIHsKICAgICAgICByZW1vdmVDbGFzcyhpY29uLCBpY29uVHlwZXNbaWNvblR5cGVdKTsKICAgICAgfQogICAgfQogICAgYWRkQ2xhc3MoaWNvbiwgaWNvblR5cGVzW3BhcmFtcy5pY29uXSk7CgogICAgLy8gSWNvbiBjb2xvcgogICAgc2V0Q29sb3IoaWNvbiwgcGFyYW1zKTsKCiAgICAvLyBTdWNjZXNzIGljb24gYmFja2dyb3VuZCBjb2xvcgogICAgYWRqdXN0U3VjY2Vzc0ljb25CYWNrZ3JvdW5kQ29sb3IoKTsKCiAgICAvLyBDdXN0b20gY2xhc3MKICAgIGFwcGx5Q3VzdG9tQ2xhc3MoaWNvbiwgcGFyYW1zLCAnaWNvbicpOwogIH07CgogIC8vIEFkanVzdCBzdWNjZXNzIGljb24gYmFja2dyb3VuZCBjb2xvciB0byBtYXRjaCB0aGUgcG9wdXAgYmFja2dyb3VuZCBjb2xvcgogIGNvbnN0IGFkanVzdFN1Y2Nlc3NJY29uQmFja2dyb3VuZENvbG9yID0gKCkgPT4gewogICAgY29uc3QgcG9wdXAgPSBnZXRQb3B1cCgpOwogICAgY29uc3QgcG9wdXBCYWNrZ3JvdW5kQ29sb3IgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwb3B1cCkuZ2V0UHJvcGVydHlWYWx1ZSgnYmFja2dyb3VuZC1jb2xvcicpOwogICAgLyoqIEB0eXBlIHtOb2RlTGlzdE9mPEhUTUxFbGVtZW50Pn0gKi8KICAgIGNvbnN0IHN1Y2Nlc3NJY29uUGFydHMgPSBwb3B1cC5xdWVyeVNlbGVjdG9yQWxsKCdbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV0sIC5zd2FsMi1zdWNjZXNzLWZpeCcpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWNjZXNzSWNvblBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHN1Y2Nlc3NJY29uUGFydHNbaV0uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcG9wdXBCYWNrZ3JvdW5kQ29sb3I7CiAgICB9CiAgfTsKICBjb25zdCBzdWNjZXNzSWNvbkh0bWwgPSBgCiAgPGRpdiBjbGFzcz0ic3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lLWxlZnQiPjwvZGl2PgogIDxzcGFuIGNsYXNzPSJzd2FsMi1zdWNjZXNzLWxpbmUtdGlwIj48L3NwYW4+IDxzcGFuIGNsYXNzPSJzd2FsMi1zdWNjZXNzLWxpbmUtbG9uZyI+PC9zcGFuPgogIDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtcmluZyI+PC9kaXY+IDxkaXYgY2xhc3M9InN3YWwyLXN1Y2Nlc3MtZml4Ij48L2Rpdj4KICA8ZGl2IGNsYXNzPSJzd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmUtcmlnaHQiPjwvZGl2PgpgOwogIGNvbnN0IGVycm9ySWNvbkh0bWwgPSBgCiAgPHNwYW4gY2xhc3M9InN3YWwyLXgtbWFyayI+CiAgICA8c3BhbiBjbGFzcz0ic3dhbDIteC1tYXJrLWxpbmUtbGVmdCI+PC9zcGFuPgogICAgPHNwYW4gY2xhc3M9InN3YWwyLXgtbWFyay1saW5lLXJpZ2h0Ij48L3NwYW4+CiAgPC9zcGFuPgpgOwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBpY29uCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgY29uc3Qgc2V0Q29udGVudCA9IChpY29uLCBwYXJhbXMpID0+IHsKICAgIGxldCBvbGRDb250ZW50ID0gaWNvbi5pbm5lckhUTUw7CiAgICBsZXQgbmV3Q29udGVudDsKICAgIGlmIChwYXJhbXMuaWNvbkh0bWwpIHsKICAgICAgbmV3Q29udGVudCA9IGljb25Db250ZW50KHBhcmFtcy5pY29uSHRtbCk7CiAgICB9IGVsc2UgaWYgKHBhcmFtcy5pY29uID09PSAnc3VjY2VzcycpIHsKICAgICAgbmV3Q29udGVudCA9IHN1Y2Nlc3NJY29uSHRtbDsKICAgICAgb2xkQ29udGVudCA9IG9sZENvbnRlbnQucmVwbGFjZSgvIHN0eWxlPSIuKj8iL2csICcnKTsgLy8gdW5kbyBhZGp1c3RTdWNjZXNzSWNvbkJhY2tncm91bmRDb2xvcigpCiAgICB9IGVsc2UgaWYgKHBhcmFtcy5pY29uID09PSAnZXJyb3InKSB7CiAgICAgIG5ld0NvbnRlbnQgPSBlcnJvckljb25IdG1sOwogICAgfSBlbHNlIHsKICAgICAgY29uc3QgZGVmYXVsdEljb25IdG1sID0gewogICAgICAgIHF1ZXN0aW9uOiAnPycsCiAgICAgICAgd2FybmluZzogJyEnLAogICAgICAgIGluZm86ICdpJwogICAgICB9OwogICAgICBuZXdDb250ZW50ID0gaWNvbkNvbnRlbnQoZGVmYXVsdEljb25IdG1sW3BhcmFtcy5pY29uXSk7CiAgICB9CiAgICBpZiAob2xkQ29udGVudC50cmltKCkgIT09IG5ld0NvbnRlbnQudHJpbSgpKSB7CiAgICAgIHNldElubmVySHRtbChpY29uLCBuZXdDb250ZW50KTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBpY29uCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgY29uc3Qgc2V0Q29sb3IgPSAoaWNvbiwgcGFyYW1zKSA9PiB7CiAgICBpZiAoIXBhcmFtcy5pY29uQ29sb3IpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWNvbi5zdHlsZS5jb2xvciA9IHBhcmFtcy5pY29uQ29sb3I7CiAgICBpY29uLnN0eWxlLmJvcmRlckNvbG9yID0gcGFyYW1zLmljb25Db2xvcjsKICAgIGZvciAoY29uc3Qgc2VsIG9mIFsnLnN3YWwyLXN1Y2Nlc3MtbGluZS10aXAnLCAnLnN3YWwyLXN1Y2Nlc3MtbGluZS1sb25nJywgJy5zd2FsMi14LW1hcmstbGluZS1sZWZ0JywgJy5zd2FsMi14LW1hcmstbGluZS1yaWdodCddKSB7CiAgICAgIHNldFN0eWxlKGljb24sIHNlbCwgJ2JhY2tncm91bmRDb2xvcicsIHBhcmFtcy5pY29uQ29sb3IpOwogICAgfQogICAgc2V0U3R5bGUoaWNvbiwgJy5zd2FsMi1zdWNjZXNzLXJpbmcnLCAnYm9yZGVyQ29sb3InLCBwYXJhbXMuaWNvbkNvbG9yKTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudAogICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICovCiAgY29uc3QgaWNvbkNvbnRlbnQgPSBjb250ZW50ID0+IGA8ZGl2IGNsYXNzPSIke3N3YWxDbGFzc2VzWydpY29uLWNvbnRlbnQnXX0iPiR7Y29udGVudH08L2Rpdj5gOwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwogIGNvbnN0IHJlbmRlckltYWdlID0gKGluc3RhbmNlLCBwYXJhbXMpID0+IHsKICAgIGNvbnN0IGltYWdlID0gZ2V0SW1hZ2UoKTsKICAgIGlmICghcGFyYW1zLmltYWdlVXJsKSB7CiAgICAgIGhpZGUoaW1hZ2UpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzaG93KGltYWdlLCAnJyk7CgogICAgLy8gU3JjLCBhbHQKICAgIGltYWdlLnNldEF0dHJpYnV0ZSgnc3JjJywgcGFyYW1zLmltYWdlVXJsKTsKICAgIGltYWdlLnNldEF0dHJpYnV0ZSgnYWx0JywgcGFyYW1zLmltYWdlQWx0KTsKCiAgICAvLyBXaWR0aCwgaGVpZ2h0CiAgICBhcHBseU51bWVyaWNhbFN0eWxlKGltYWdlLCAnd2lkdGgnLCBwYXJhbXMuaW1hZ2VXaWR0aCk7CiAgICBhcHBseU51bWVyaWNhbFN0eWxlKGltYWdlLCAnaGVpZ2h0JywgcGFyYW1zLmltYWdlSGVpZ2h0KTsKCiAgICAvLyBDbGFzcwogICAgaW1hZ2UuY2xhc3NOYW1lID0gc3dhbENsYXNzZXMuaW1hZ2U7CiAgICBhcHBseUN1c3RvbUNsYXNzKGltYWdlLCBwYXJhbXMsICdpbWFnZScpOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgY29uc3QgcmVuZGVyUG9wdXAgPSAoaW5zdGFuY2UsIHBhcmFtcykgPT4gewogICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7CiAgICBjb25zdCBwb3B1cCA9IGdldFBvcHVwKCk7CgogICAgLy8gV2lkdGgKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi9pc3N1ZXMvMjE3MAogICAgaWYgKHBhcmFtcy50b2FzdCkgewogICAgICBhcHBseU51bWVyaWNhbFN0eWxlKGNvbnRhaW5lciwgJ3dpZHRoJywgcGFyYW1zLndpZHRoKTsKICAgICAgcG9wdXAuc3R5bGUud2lkdGggPSAnMTAwJSc7CiAgICAgIHBvcHVwLmluc2VydEJlZm9yZShnZXRMb2FkZXIoKSwgZ2V0SWNvbigpKTsKICAgIH0gZWxzZSB7CiAgICAgIGFwcGx5TnVtZXJpY2FsU3R5bGUocG9wdXAsICd3aWR0aCcsIHBhcmFtcy53aWR0aCk7CiAgICB9CgogICAgLy8gUGFkZGluZwogICAgYXBwbHlOdW1lcmljYWxTdHlsZShwb3B1cCwgJ3BhZGRpbmcnLCBwYXJhbXMucGFkZGluZyk7CgogICAgLy8gQ29sb3IKICAgIGlmIChwYXJhbXMuY29sb3IpIHsKICAgICAgcG9wdXAuc3R5bGUuY29sb3IgPSBwYXJhbXMuY29sb3I7CiAgICB9CgogICAgLy8gQmFja2dyb3VuZAogICAgaWYgKHBhcmFtcy5iYWNrZ3JvdW5kKSB7CiAgICAgIHBvcHVwLnN0eWxlLmJhY2tncm91bmQgPSBwYXJhbXMuYmFja2dyb3VuZDsKICAgIH0KICAgIGhpZGUoZ2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSk7CgogICAgLy8gQ2xhc3NlcwogICAgYWRkQ2xhc3NlcyQxKHBvcHVwLCBwYXJhbXMpOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBvcHVwCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgY29uc3QgYWRkQ2xhc3NlcyQxID0gKHBvcHVwLCBwYXJhbXMpID0+IHsKICAgIC8vIERlZmF1bHQgQ2xhc3MgKyBzaG93Q2xhc3Mgd2hlbiB1cGRhdGluZyBTd2FsLnVwZGF0ZSh7fSkKICAgIHBvcHVwLmNsYXNzTmFtZSA9IGAke3N3YWxDbGFzc2VzLnBvcHVwfSAke2lzVmlzaWJsZSQxKHBvcHVwKSA/IHBhcmFtcy5zaG93Q2xhc3MucG9wdXAgOiAnJ31gOwogICAgaWYgKHBhcmFtcy50b2FzdCkgewogICAgICBhZGRDbGFzcyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBkb2N1bWVudC5ib2R5XSwgc3dhbENsYXNzZXNbJ3RvYXN0LXNob3duJ10pOwogICAgICBhZGRDbGFzcyhwb3B1cCwgc3dhbENsYXNzZXMudG9hc3QpOwogICAgfSBlbHNlIHsKICAgICAgYWRkQ2xhc3MocG9wdXAsIHN3YWxDbGFzc2VzLm1vZGFsKTsKICAgIH0KCiAgICAvLyBDdXN0b20gY2xhc3MKICAgIGFwcGx5Q3VzdG9tQ2xhc3MocG9wdXAsIHBhcmFtcywgJ3BvcHVwJyk7CiAgICBpZiAodHlwZW9mIHBhcmFtcy5jdXN0b21DbGFzcyA9PT0gJ3N0cmluZycpIHsKICAgICAgYWRkQ2xhc3MocG9wdXAsIHBhcmFtcy5jdXN0b21DbGFzcyk7CiAgICB9CgogICAgLy8gSWNvbiBjbGFzcyAoIzE4NDIpCiAgICBpZiAocGFyYW1zLmljb24pIHsKICAgICAgYWRkQ2xhc3MocG9wdXAsIHN3YWxDbGFzc2VzW2BpY29uLSR7cGFyYW1zLmljb259YF0pOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgY29uc3QgcmVuZGVyUHJvZ3Jlc3NTdGVwcyA9IChpbnN0YW5jZSwgcGFyYW1zKSA9PiB7CiAgICBjb25zdCBwcm9ncmVzc1N0ZXBzQ29udGFpbmVyID0gZ2V0UHJvZ3Jlc3NTdGVwcygpOwogICAgaWYgKCFwYXJhbXMucHJvZ3Jlc3NTdGVwcyB8fCBwYXJhbXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGggPT09IDApIHsKICAgICAgaGlkZShwcm9ncmVzc1N0ZXBzQ29udGFpbmVyKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgc2hvdyhwcm9ncmVzc1N0ZXBzQ29udGFpbmVyKTsKICAgIHByb2dyZXNzU3RlcHNDb250YWluZXIudGV4dENvbnRlbnQgPSAnJzsKICAgIGlmIChwYXJhbXMuY3VycmVudFByb2dyZXNzU3RlcCA+PSBwYXJhbXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGgpIHsKICAgICAgd2FybignSW52YWxpZCBjdXJyZW50UHJvZ3Jlc3NTdGVwIHBhcmFtZXRlciwgaXQgc2hvdWxkIGJlIGxlc3MgdGhhbiBwcm9ncmVzc1N0ZXBzLmxlbmd0aCAnICsgJyhjdXJyZW50UHJvZ3Jlc3NTdGVwIGxpa2UgSlMgYXJyYXlzIHN0YXJ0cyBmcm9tIDApJyk7CiAgICB9CiAgICBwYXJhbXMucHJvZ3Jlc3NTdGVwcy5mb3JFYWNoKChzdGVwLCBpbmRleCkgPT4gewogICAgICBjb25zdCBzdGVwRWwgPSBjcmVhdGVTdGVwRWxlbWVudChzdGVwKTsKICAgICAgcHJvZ3Jlc3NTdGVwc0NvbnRhaW5lci5hcHBlbmRDaGlsZChzdGVwRWwpOwogICAgICBpZiAoaW5kZXggPT09IHBhcmFtcy5jdXJyZW50UHJvZ3Jlc3NTdGVwKSB7CiAgICAgICAgYWRkQ2xhc3Moc3RlcEVsLCBzd2FsQ2xhc3Nlc1snYWN0aXZlLXByb2dyZXNzLXN0ZXAnXSk7CiAgICAgIH0KICAgICAgaWYgKGluZGV4ICE9PSBwYXJhbXMucHJvZ3Jlc3NTdGVwcy5sZW5ndGggLSAxKSB7CiAgICAgICAgY29uc3QgbGluZUVsID0gY3JlYXRlTGluZUVsZW1lbnQocGFyYW1zKTsKICAgICAgICBwcm9ncmVzc1N0ZXBzQ29udGFpbmVyLmFwcGVuZENoaWxkKGxpbmVFbCk7CiAgICAgIH0KICAgIH0pOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBzdGVwCiAgICogQHJldHVybnMge0hUTUxMSUVsZW1lbnR9CiAgICovCiAgY29uc3QgY3JlYXRlU3RlcEVsZW1lbnQgPSBzdGVwID0+IHsKICAgIGNvbnN0IHN0ZXBFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICBhZGRDbGFzcyhzdGVwRWwsIHN3YWxDbGFzc2VzWydwcm9ncmVzcy1zdGVwJ10pOwogICAgc2V0SW5uZXJIdG1sKHN0ZXBFbCwgc3RlcCk7CiAgICByZXR1cm4gc3RlcEVsOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqIEByZXR1cm5zIHtIVE1MTElFbGVtZW50fQogICAqLwogIGNvbnN0IGNyZWF0ZUxpbmVFbGVtZW50ID0gcGFyYW1zID0+IHsKICAgIGNvbnN0IGxpbmVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICBhZGRDbGFzcyhsaW5lRWwsIHN3YWxDbGFzc2VzWydwcm9ncmVzcy1zdGVwLWxpbmUnXSk7CiAgICBpZiAocGFyYW1zLnByb2dyZXNzU3RlcHNEaXN0YW5jZSkgewogICAgICBhcHBseU51bWVyaWNhbFN0eWxlKGxpbmVFbCwgJ3dpZHRoJywgcGFyYW1zLnByb2dyZXNzU3RlcHNEaXN0YW5jZSk7CiAgICB9CiAgICByZXR1cm4gbGluZUVsOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgY29uc3QgcmVuZGVyVGl0bGUgPSAoaW5zdGFuY2UsIHBhcmFtcykgPT4gewogICAgY29uc3QgdGl0bGUgPSBnZXRUaXRsZSgpOwogICAgdG9nZ2xlKHRpdGxlLCBwYXJhbXMudGl0bGUgfHwgcGFyYW1zLnRpdGxlVGV4dCwgJ2Jsb2NrJyk7CiAgICBpZiAocGFyYW1zLnRpdGxlKSB7CiAgICAgIHBhcnNlSHRtbFRvQ29udGFpbmVyKHBhcmFtcy50aXRsZSwgdGl0bGUpOwogICAgfQogICAgaWYgKHBhcmFtcy50aXRsZVRleHQpIHsKICAgICAgdGl0bGUuaW5uZXJUZXh0ID0gcGFyYW1zLnRpdGxlVGV4dDsKICAgIH0KCiAgICAvLyBDdXN0b20gY2xhc3MKICAgIGFwcGx5Q3VzdG9tQ2xhc3ModGl0bGUsIHBhcmFtcywgJ3RpdGxlJyk7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KICBjb25zdCByZW5kZXIgPSAoaW5zdGFuY2UsIHBhcmFtcykgPT4gewogICAgcmVuZGVyUG9wdXAoaW5zdGFuY2UsIHBhcmFtcyk7CiAgICByZW5kZXJDb250YWluZXIoaW5zdGFuY2UsIHBhcmFtcyk7CiAgICByZW5kZXJQcm9ncmVzc1N0ZXBzKGluc3RhbmNlLCBwYXJhbXMpOwogICAgcmVuZGVySWNvbihpbnN0YW5jZSwgcGFyYW1zKTsKICAgIHJlbmRlckltYWdlKGluc3RhbmNlLCBwYXJhbXMpOwogICAgcmVuZGVyVGl0bGUoaW5zdGFuY2UsIHBhcmFtcyk7CiAgICByZW5kZXJDbG9zZUJ1dHRvbihpbnN0YW5jZSwgcGFyYW1zKTsKICAgIHJlbmRlckNvbnRlbnQoaW5zdGFuY2UsIHBhcmFtcyk7CiAgICByZW5kZXJBY3Rpb25zKGluc3RhbmNlLCBwYXJhbXMpOwogICAgcmVuZGVyRm9vdGVyKGluc3RhbmNlLCBwYXJhbXMpOwogICAgaWYgKHR5cGVvZiBwYXJhbXMuZGlkUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHBhcmFtcy5kaWRSZW5kZXIoZ2V0UG9wdXAoKSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogSGlkZXMgbG9hZGVyIGFuZCBzaG93cyBiYWNrIHRoZSBidXR0b24gd2hpY2ggd2FzIGhpZGRlbiBieSAuc2hvd0xvYWRpbmcoKQogICAqLwogIGZ1bmN0aW9uIGhpZGVMb2FkaW5nKCkgewogICAgLy8gZG8gbm90aGluZyBpZiBwb3B1cCBpcyBjbG9zZWQKICAgIGNvbnN0IGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldCh0aGlzKTsKICAgIGlmICghaW5uZXJQYXJhbXMpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZG9tQ2FjaGUgPSBwcml2YXRlUHJvcHMuZG9tQ2FjaGUuZ2V0KHRoaXMpOwogICAgaGlkZShkb21DYWNoZS5sb2FkZXIpOwogICAgaWYgKGlzVG9hc3QoKSkgewogICAgICBpZiAoaW5uZXJQYXJhbXMuaWNvbikgewogICAgICAgIHNob3coZ2V0SWNvbigpKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgc2hvd1JlbGF0ZWRCdXR0b24oZG9tQ2FjaGUpOwogICAgfQogICAgcmVtb3ZlQ2xhc3MoW2RvbUNhY2hlLnBvcHVwLCBkb21DYWNoZS5hY3Rpb25zXSwgc3dhbENsYXNzZXMubG9hZGluZyk7CiAgICBkb21DYWNoZS5wb3B1cC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtYnVzeScpOwogICAgZG9tQ2FjaGUucG9wdXAucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWxvYWRpbmcnKTsKICAgIGRvbUNhY2hlLmNvbmZpcm1CdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKICAgIGRvbUNhY2hlLmRlbnlCdXR0b24uZGlzYWJsZWQgPSBmYWxzZTsKICAgIGRvbUNhY2hlLmNhbmNlbEJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlOwogIH0KICBjb25zdCBzaG93UmVsYXRlZEJ1dHRvbiA9IGRvbUNhY2hlID0+IHsKICAgIGNvbnN0IGJ1dHRvblRvUmVwbGFjZSA9IGRvbUNhY2hlLnBvcHVwLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZG9tQ2FjaGUubG9hZGVyLmdldEF0dHJpYnV0ZSgnZGF0YS1idXR0b24tdG8tcmVwbGFjZScpKTsKICAgIGlmIChidXR0b25Ub1JlcGxhY2UubGVuZ3RoKSB7CiAgICAgIHNob3coYnV0dG9uVG9SZXBsYWNlWzBdLCAnaW5saW5lLWJsb2NrJyk7CiAgICB9IGVsc2UgaWYgKGFsbEJ1dHRvbnNBcmVIaWRkZW4oKSkgewogICAgICBoaWRlKGRvbUNhY2hlLmFjdGlvbnMpOwogICAgfQogIH07CgogIC8qKgogICAqIEdldHMgdGhlIGlucHV0IERPTSBub2RlLCB0aGlzIG1ldGhvZCB3b3JrcyB3aXRoIGlucHV0IHBhcmFtZXRlci4KICAgKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH0KICAgKi8KICBmdW5jdGlvbiBnZXRJbnB1dChpbnN0YW5jZSkgewogICAgY29uc3QgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KGluc3RhbmNlIHx8IHRoaXMpOwogICAgY29uc3QgZG9tQ2FjaGUgPSBwcml2YXRlUHJvcHMuZG9tQ2FjaGUuZ2V0KGluc3RhbmNlIHx8IHRoaXMpOwogICAgaWYgKCFkb21DYWNoZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBnZXRJbnB1dCQxKGRvbUNhY2hlLnBvcHVwLCBpbm5lclBhcmFtcy5pbnB1dCk7CiAgfQoKICAvKgogICAqIEdsb2JhbCBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgU3dlZXRBbGVydDIgcG9wdXAgaXMgc2hvd24KICAgKi8KICBjb25zdCBpc1Zpc2libGUgPSAoKSA9PiB7CiAgICByZXR1cm4gaXNWaXNpYmxlJDEoZ2V0UG9wdXAoKSk7CiAgfTsKCiAgLyoKICAgKiBHbG9iYWwgZnVuY3Rpb24gdG8gY2xpY2sgJ0NvbmZpcm0nIGJ1dHRvbgogICAqLwogIGNvbnN0IGNsaWNrQ29uZmlybSA9ICgpID0+IGdldENvbmZpcm1CdXR0b24oKSAmJiBnZXRDb25maXJtQnV0dG9uKCkuY2xpY2soKTsKCiAgLyoKICAgKiBHbG9iYWwgZnVuY3Rpb24gdG8gY2xpY2sgJ0RlbnknIGJ1dHRvbgogICAqLwogIGNvbnN0IGNsaWNrRGVueSA9ICgpID0+IGdldERlbnlCdXR0b24oKSAmJiBnZXREZW55QnV0dG9uKCkuY2xpY2soKTsKCiAgLyoKICAgKiBHbG9iYWwgZnVuY3Rpb24gdG8gY2xpY2sgJ0NhbmNlbCcgYnV0dG9uCiAgICovCiAgY29uc3QgY2xpY2tDYW5jZWwgPSAoKSA9PiBnZXRDYW5jZWxCdXR0b24oKSAmJiBnZXRDYW5jZWxCdXR0b24oKS5jbGljaygpOwoKICBjb25zdCBEaXNtaXNzUmVhc29uID0gT2JqZWN0LmZyZWV6ZSh7CiAgICBjYW5jZWw6ICdjYW5jZWwnLAogICAgYmFja2Ryb3A6ICdiYWNrZHJvcCcsCiAgICBjbG9zZTogJ2Nsb3NlJywKICAgIGVzYzogJ2VzYycsCiAgICB0aW1lcjogJ3RpbWVyJwogIH0pOwoKICAvKioKICAgKiBAcGFyYW0ge0dsb2JhbFN0YXRlfSBnbG9iYWxTdGF0ZQogICAqLwogIGNvbnN0IHJlbW92ZUtleWRvd25IYW5kbGVyID0gZ2xvYmFsU3RhdGUgPT4gewogICAgaWYgKGdsb2JhbFN0YXRlLmtleWRvd25UYXJnZXQgJiYgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXJBZGRlZCkgewogICAgICBnbG9iYWxTdGF0ZS5rZXlkb3duVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBnbG9iYWxTdGF0ZS5rZXlkb3duSGFuZGxlciwgewogICAgICAgIGNhcHR1cmU6IGdsb2JhbFN0YXRlLmtleWRvd25MaXN0ZW5lckNhcHR1cmUKICAgICAgfSk7CiAgICAgIGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyQWRkZWQgPSBmYWxzZTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7R2xvYmFsU3RhdGV9IGdsb2JhbFN0YXRlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gaW5uZXJQYXJhbXMKICAgKiBAcGFyYW0geyp9IGRpc21pc3NXaXRoCiAgICovCiAgY29uc3QgYWRkS2V5ZG93bkhhbmRsZXIgPSAoaW5zdGFuY2UsIGdsb2JhbFN0YXRlLCBpbm5lclBhcmFtcywgZGlzbWlzc1dpdGgpID0+IHsKICAgIHJlbW92ZUtleWRvd25IYW5kbGVyKGdsb2JhbFN0YXRlKTsKICAgIGlmICghaW5uZXJQYXJhbXMudG9hc3QpIHsKICAgICAgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXIgPSBlID0+IGtleWRvd25IYW5kbGVyKGluc3RhbmNlLCBlLCBkaXNtaXNzV2l0aCk7CiAgICAgIGdsb2JhbFN0YXRlLmtleWRvd25UYXJnZXQgPSBpbm5lclBhcmFtcy5rZXlkb3duTGlzdGVuZXJDYXB0dXJlID8gd2luZG93IDogZ2V0UG9wdXAoKTsKICAgICAgZ2xvYmFsU3RhdGUua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZSA9IGlubmVyUGFyYW1zLmtleWRvd25MaXN0ZW5lckNhcHR1cmU7CiAgICAgIGdsb2JhbFN0YXRlLmtleWRvd25UYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGdsb2JhbFN0YXRlLmtleWRvd25IYW5kbGVyLCB7CiAgICAgICAgY2FwdHVyZTogZ2xvYmFsU3RhdGUua2V5ZG93bkxpc3RlbmVyQ2FwdHVyZQogICAgICB9KTsKICAgICAgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXJBZGRlZCA9IHRydWU7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4CiAgICogQHBhcmFtIHtudW1iZXJ9IGluY3JlbWVudAogICAqLwogIGNvbnN0IHNldEZvY3VzID0gKGluZGV4LCBpbmNyZW1lbnQpID0+IHsKICAgIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gZ2V0Rm9jdXNhYmxlRWxlbWVudHMoKTsKICAgIC8vIHNlYXJjaCBmb3IgdmlzaWJsZSBlbGVtZW50cyBhbmQgc2VsZWN0IHRoZSBuZXh0IHBvc3NpYmxlIG1hdGNoCiAgICBpZiAoZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoKSB7CiAgICAgIGluZGV4ID0gaW5kZXggKyBpbmNyZW1lbnQ7CgogICAgICAvLyByb2xsb3ZlciB0byBmaXJzdCBpdGVtCiAgICAgIGlmIChpbmRleCA9PT0gZm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoKSB7CiAgICAgICAgaW5kZXggPSAwOwoKICAgICAgICAvLyBnbyB0byBsYXN0IGl0ZW0KICAgICAgfSBlbHNlIGlmIChpbmRleCA9PT0gLTEpIHsKICAgICAgICBpbmRleCA9IGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCAtIDE7CiAgICAgIH0KICAgICAgZm9jdXNhYmxlRWxlbWVudHNbaW5kZXhdLmZvY3VzKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIG5vIHZpc2libGUgZm9jdXNhYmxlIGVsZW1lbnRzLCBmb2N1cyB0aGUgcG9wdXAKICAgIGdldFBvcHVwKCkuZm9jdXMoKTsKICB9OwogIGNvbnN0IGFycm93S2V5c05leHRCdXR0b24gPSBbJ0Fycm93UmlnaHQnLCAnQXJyb3dEb3duJ107CiAgY29uc3QgYXJyb3dLZXlzUHJldmlvdXNCdXR0b24gPSBbJ0Fycm93TGVmdCcsICdBcnJvd1VwJ107CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudAogICAqIEBwYXJhbSB7RnVuY3Rpb259IGRpc21pc3NXaXRoCiAgICovCiAgY29uc3Qga2V5ZG93bkhhbmRsZXIgPSAoaW5zdGFuY2UsIGV2ZW50LCBkaXNtaXNzV2l0aCkgPT4gewogICAgY29uc3QgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KGluc3RhbmNlKTsKICAgIGlmICghaW5uZXJQYXJhbXMpIHsKICAgICAgcmV0dXJuOyAvLyBUaGlzIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkCiAgICB9CgogICAgLy8gSWdub3JlIGtleWRvd24gZHVyaW5nIElNRSBjb21wb3NpdGlvbgogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L2tleWRvd25fZXZlbnQjaWdub3Jpbmdfa2V5ZG93bl9kdXJpbmdfaW1lX2NvbXBvc2l0aW9uCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvaXNzdWVzLzcyMAogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3N3ZWV0YWxlcnQyL3N3ZWV0YWxlcnQyL2lzc3Vlcy8yNDA2CiAgICBpZiAoZXZlbnQuaXNDb21wb3NpbmcgfHwgZXZlbnQua2V5Q29kZSA9PT0gMjI5KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChpbm5lclBhcmFtcy5zdG9wS2V5ZG93blByb3BhZ2F0aW9uKSB7CiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgfQoKICAgIC8vIEVOVEVSCiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInKSB7CiAgICAgIGhhbmRsZUVudGVyKGluc3RhbmNlLCBldmVudCwgaW5uZXJQYXJhbXMpOwogICAgfQoKICAgIC8vIFRBQgogICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnVGFiJykgewogICAgICBoYW5kbGVUYWIoZXZlbnQpOwogICAgfQoKICAgIC8vIEFSUk9XUyAtIHN3aXRjaCBmb2N1cyBiZXR3ZWVuIGJ1dHRvbnMKICAgIGVsc2UgaWYgKFsuLi5hcnJvd0tleXNOZXh0QnV0dG9uLCAuLi5hcnJvd0tleXNQcmV2aW91c0J1dHRvbl0uaW5jbHVkZXMoZXZlbnQua2V5KSkgewogICAgICBoYW5kbGVBcnJvd3MoZXZlbnQua2V5KTsKICAgIH0KCiAgICAvLyBFU0MKICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHsKICAgICAgaGFuZGxlRXNjKGV2ZW50LCBpbm5lclBhcmFtcywgZGlzbWlzc1dpdGgpOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudAogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IGlubmVyUGFyYW1zCiAgICovCiAgY29uc3QgaGFuZGxlRW50ZXIgPSAoaW5zdGFuY2UsIGV2ZW50LCBpbm5lclBhcmFtcykgPT4gewogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3N3ZWV0YWxlcnQyL3N3ZWV0YWxlcnQyL2lzc3Vlcy8yMzg2CiAgICBpZiAoIWNhbGxJZkZ1bmN0aW9uKGlubmVyUGFyYW1zLmFsbG93RW50ZXJLZXkpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChldmVudC50YXJnZXQgJiYgaW5zdGFuY2UuZ2V0SW5wdXQoKSAmJiBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC50YXJnZXQub3V0ZXJIVE1MID09PSBpbnN0YW5jZS5nZXRJbnB1dCgpLm91dGVySFRNTCkgewogICAgICBpZiAoWyd0ZXh0YXJlYScsICdmaWxlJ10uaW5jbHVkZXMoaW5uZXJQYXJhbXMuaW5wdXQpKSB7CiAgICAgICAgcmV0dXJuOyAvLyBkbyBub3Qgc3VibWl0CiAgICAgIH0KCiAgICAgIGNsaWNrQ29uZmlybSgpOwogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZXZlbnQKICAgKi8KICBjb25zdCBoYW5kbGVUYWIgPSBldmVudCA9PiB7CiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZXZlbnQudGFyZ2V0OwogICAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSBnZXRGb2N1c2FibGVFbGVtZW50cygpOwogICAgbGV0IGJ0bkluZGV4ID0gLTE7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0YXJnZXRFbGVtZW50ID09PSBmb2N1c2FibGVFbGVtZW50c1tpXSkgewogICAgICAgIGJ0bkluZGV4ID0gaTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIC8vIEN5Y2xlIHRvIHRoZSBuZXh0IGJ1dHRvbgogICAgaWYgKCFldmVudC5zaGlmdEtleSkgewogICAgICBzZXRGb2N1cyhidG5JbmRleCwgMSk7CiAgICB9CgogICAgLy8gQ3ljbGUgdG8gdGhlIHByZXYgYnV0dG9uCiAgICBlbHNlIHsKICAgICAgc2V0Rm9jdXMoYnRuSW5kZXgsIC0xKTsKICAgIH0KICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5CiAgICovCiAgY29uc3QgaGFuZGxlQXJyb3dzID0ga2V5ID0+IHsKICAgIGNvbnN0IGNvbmZpcm1CdXR0b24gPSBnZXRDb25maXJtQnV0dG9uKCk7CiAgICBjb25zdCBkZW55QnV0dG9uID0gZ2V0RGVueUJ1dHRvbigpOwogICAgY29uc3QgY2FuY2VsQnV0dG9uID0gZ2V0Q2FuY2VsQnV0dG9uKCk7CiAgICAvKiogQHR5cGUgSFRNTEVsZW1lbnRbXSAqLwogICAgY29uc3QgYnV0dG9ucyA9IFtjb25maXJtQnV0dG9uLCBkZW55QnV0dG9uLCBjYW5jZWxCdXR0b25dOwogICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiAhYnV0dG9ucy5pbmNsdWRlcyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkgewogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBzaWJsaW5nID0gYXJyb3dLZXlzTmV4dEJ1dHRvbi5pbmNsdWRlcyhrZXkpID8gJ25leHRFbGVtZW50U2libGluZycgOiAncHJldmlvdXNFbGVtZW50U2libGluZyc7CiAgICBsZXQgYnV0dG9uVG9Gb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdldEFjdGlvbnMoKS5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICBidXR0b25Ub0ZvY3VzID0gYnV0dG9uVG9Gb2N1c1tzaWJsaW5nXTsKICAgICAgaWYgKCFidXR0b25Ub0ZvY3VzKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChidXR0b25Ub0ZvY3VzIGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQgJiYgaXNWaXNpYmxlJDEoYnV0dG9uVG9Gb2N1cykpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgaWYgKGJ1dHRvblRvRm9jdXMgaW5zdGFuY2VvZiBIVE1MQnV0dG9uRWxlbWVudCkgewogICAgICBidXR0b25Ub0ZvY3VzLmZvY3VzKCk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudAogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IGlubmVyUGFyYW1zCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZGlzbWlzc1dpdGgKICAgKi8KICBjb25zdCBoYW5kbGVFc2MgPSAoZXZlbnQsIGlubmVyUGFyYW1zLCBkaXNtaXNzV2l0aCkgPT4gewogICAgaWYgKGNhbGxJZkZ1bmN0aW9uKGlubmVyUGFyYW1zLmFsbG93RXNjYXBlS2V5KSkgewogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBkaXNtaXNzV2l0aChEaXNtaXNzUmVhc29uLmVzYyk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogVGhpcyBtb2R1bGUgY29udGFpbnMgYFdlYWtNYXBgcyBmb3IgZWFjaCBlZmZlY3RpdmVseS0icHJpdmF0ZSAgcHJvcGVydHkiIHRoYXQgYSBgU3dhbGAgaGFzLgogICAqIEZvciBleGFtcGxlLCB0byBzZXQgdGhlIHByaXZhdGUgcHJvcGVydHkgImZvbyIgb2YgYHRoaXNgIHRvICJiYXIiLCB5b3UgY2FuIGBwcml2YXRlUHJvcHMuZm9vLnNldCh0aGlzLCAnYmFyJylgCiAgICogVGhpcyBpcyB0aGUgYXBwcm9hY2ggdGhhdCBCYWJlbCB3aWxsIHByb2JhYmx5IHRha2UgdG8gaW1wbGVtZW50IHByaXZhdGUgbWV0aG9kcy9maWVsZHMKICAgKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByaXZhdGUtbWV0aG9kcwogICAqICAgaHR0cHM6Ly9naXRodWIuY29tL2JhYmVsL2JhYmVsL3B1bGwvNzU1NQogICAqIE9uY2Ugd2UgaGF2ZSB0aGUgY2hhbmdlcyBmcm9tIHRoYXQgUFIgaW4gQmFiZWwsIGFuZCBvdXIgY29yZSBjbGFzcyBmaXRzIHJlYXNvbmFibGUgaW4gKm9uZSBtb2R1bGUqCiAgICogICB0aGVuIHdlIGNhbiB1c2UgdGhhdCBsYW5ndWFnZSBmZWF0dXJlLgogICAqLwoKICB2YXIgcHJpdmF0ZU1ldGhvZHMgPSB7CiAgICBzd2FsUHJvbWlzZVJlc29sdmU6IG5ldyBXZWFrTWFwKCksCiAgICBzd2FsUHJvbWlzZVJlamVjdDogbmV3IFdlYWtNYXAoKQogIH07CgogIC8vIEZyb20gaHR0cHM6Ly9kZXZlbG9wZXIucGFjaWVsbG9ncm91cC5jb20vYmxvZy8yMDE4LzA2L3RoZS1jdXJyZW50LXN0YXRlLW9mLW1vZGFsLWRpYWxvZy1hY2Nlc3NpYmlsaXR5LwogIC8vIEFkZGluZyBhcmlhLWhpZGRlbj0idHJ1ZSIgdG8gZWxlbWVudHMgb3V0c2lkZSBvZiB0aGUgYWN0aXZlIG1vZGFsIGRpYWxvZyBlbnN1cmVzIHRoYXQKICAvLyBlbGVtZW50cyBub3Qgd2l0aGluIHRoZSBhY3RpdmUgbW9kYWwgZGlhbG9nIHdpbGwgbm90IGJlIHN1cmZhY2VkIGlmIGEgdXNlciBvcGVucyBhIHNjcmVlbgogIC8vIHJlYWRlcuKAmXMgbGlzdCBvZiBlbGVtZW50cyAoaGVhZGluZ3MsIGZvcm0gY29udHJvbHMsIGxhbmRtYXJrcywgZXRjLikgaW4gdGhlIGRvY3VtZW50LgoKICBjb25zdCBzZXRBcmlhSGlkZGVuID0gKCkgPT4gewogICAgY29uc3QgYm9keUNoaWxkcmVuID0gQXJyYXkuZnJvbShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTsKICAgIGJvZHlDaGlsZHJlbi5mb3JFYWNoKGVsID0+IHsKICAgICAgaWYgKGVsID09PSBnZXRDb250YWluZXIoKSB8fCBlbC5jb250YWlucyhnZXRDb250YWluZXIoKSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGVsLmhhc0F0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKSkgewogICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1wcmV2aW91cy1hcmlhLWhpZGRlbicsIGVsLmdldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKSk7CiAgICAgIH0KICAgICAgZWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICB9KTsKICB9OwogIGNvbnN0IHVuc2V0QXJpYUhpZGRlbiA9ICgpID0+IHsKICAgIGNvbnN0IGJvZHlDaGlsZHJlbiA9IEFycmF5LmZyb20oZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7CiAgICBib2R5Q2hpbGRyZW4uZm9yRWFjaChlbCA9PiB7CiAgICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcHJldmlvdXMtYXJpYS1oaWRkZW4nKSkgewogICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJldmlvdXMtYXJpYS1oaWRkZW4nKSk7CiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXByZXZpb3VzLWFyaWEtaGlkZGVuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpOwogICAgICB9CiAgICB9KTsKICB9OwoKICAvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqLwoKICAvLyBGaXggaU9TIHNjcm9sbGluZyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8zOTYyNjMwMgoKICBjb25zdCBpT1NmaXggPSAoKSA9PiB7CiAgICBjb25zdCBpT1MgPQogICAgLy8gQHRzLWlnbm9yZQogICAgL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgIXdpbmRvdy5NU1N0cmVhbSB8fCBuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdNYWNJbnRlbCcgJiYgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMTsKICAgIGlmIChpT1MgJiYgIWhhc0NsYXNzKGRvY3VtZW50LmJvZHksIHN3YWxDbGFzc2VzLmlvc2ZpeCkpIHsKICAgICAgY29uc3Qgb2Zmc2V0ID0gZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUudG9wID0gYCR7b2Zmc2V0ICogLTF9cHhgOwogICAgICBhZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBzd2FsQ2xhc3Nlcy5pb3NmaXgpOwogICAgICBsb2NrQm9keVNjcm9sbCgpOwogICAgICBhZGRCb3R0b21QYWRkaW5nRm9yVGFsbFBvcHVwcygpOwogICAgfQogIH07CgogIC8qKgogICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi9pc3N1ZXMvMTk0OAogICAqLwogIGNvbnN0IGFkZEJvdHRvbVBhZGRpbmdGb3JUYWxsUG9wdXBzID0gKCkgPT4gewogICAgY29uc3QgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgY29uc3QgaU9TID0gISF1YS5tYXRjaCgvaVBhZC9pKSB8fCAhIXVhLm1hdGNoKC9pUGhvbmUvaSk7CiAgICBjb25zdCB3ZWJraXQgPSAhIXVhLm1hdGNoKC9XZWJLaXQvaSk7CiAgICBjb25zdCBpT1NTYWZhcmkgPSBpT1MgJiYgd2Via2l0ICYmICF1YS5tYXRjaCgvQ3JpT1MvaSk7CiAgICBpZiAoaU9TU2FmYXJpKSB7CiAgICAgIGNvbnN0IGJvdHRvbVBhbmVsSGVpZ2h0ID0gNDQ7CiAgICAgIGlmIChnZXRQb3B1cCgpLnNjcm9sbEhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCAtIGJvdHRvbVBhbmVsSGVpZ2h0KSB7CiAgICAgICAgZ2V0Q29udGFpbmVyKCkuc3R5bGUucGFkZGluZ0JvdHRvbSA9IGAke2JvdHRvbVBhbmVsSGVpZ2h0fXB4YDsKICAgICAgfQogICAgfQogIH07CgogIC8qKgogICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2VldGFsZXJ0Mi9zd2VldGFsZXJ0Mi9pc3N1ZXMvMTI0NgogICAqLwogIGNvbnN0IGxvY2tCb2R5U2Nyb2xsID0gKCkgPT4gewogICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7CiAgICBsZXQgcHJldmVudFRvdWNoTW92ZTsKICAgIC8qKgogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBldmVudAogICAgICovCiAgICBjb250YWluZXIub250b3VjaHN0YXJ0ID0gZXZlbnQgPT4gewogICAgICBwcmV2ZW50VG91Y2hNb3ZlID0gc2hvdWxkUHJldmVudFRvdWNoTW92ZShldmVudCk7CiAgICB9OwogICAgLyoqCiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGV2ZW50CiAgICAgKi8KICAgIGNvbnRhaW5lci5vbnRvdWNobW92ZSA9IGV2ZW50ID0+IHsKICAgICAgaWYgKHByZXZlbnRUb3VjaE1vdmUpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICB9CiAgICB9OwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZXZlbnQKICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgKi8KICBjb25zdCBzaG91bGRQcmV2ZW50VG91Y2hNb3ZlID0gZXZlbnQgPT4gewogICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwogICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7CiAgICBpZiAoaXNTdHlsdXMoZXZlbnQpIHx8IGlzWm9vbShldmVudCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKHRhcmdldCA9PT0gY29udGFpbmVyKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgaWYgKCFpc1Njcm9sbGFibGUoY29udGFpbmVyKSAmJiB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQudGFnTmFtZSAhPT0gJ0lOUFVUJyAmJgogICAgLy8gIzE2MDMKICAgIHRhcmdldC50YWdOYW1lICE9PSAnVEVYVEFSRUEnICYmCiAgICAvLyAjMjI2NgogICAgIShpc1Njcm9sbGFibGUoZ2V0SHRtbENvbnRhaW5lcigpKSAmJgogICAgLy8gIzE5NDQKICAgIGdldEh0bWxDb250YWluZXIoKS5jb250YWlucyh0YXJnZXQpKSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICAvKioKICAgKiBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvaXNzdWVzLzE3ODYKICAgKgogICAqIEBwYXJhbSB7Kn0gZXZlbnQKICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgKi8KICBjb25zdCBpc1N0eWx1cyA9IGV2ZW50ID0+IHsKICAgIHJldHVybiBldmVudC50b3VjaGVzICYmIGV2ZW50LnRvdWNoZXMubGVuZ3RoICYmIGV2ZW50LnRvdWNoZXNbMF0udG91Y2hUeXBlID09PSAnc3R5bHVzJzsKICB9OwoKICAvKioKICAgKiBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvaXNzdWVzLzE4OTEKICAgKgogICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZXZlbnQKICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgKi8KICBjb25zdCBpc1pvb20gPSBldmVudCA9PiB7CiAgICByZXR1cm4gZXZlbnQudG91Y2hlcyAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA+IDE7CiAgfTsKICBjb25zdCB1bmRvSU9TZml4ID0gKCkgPT4gewogICAgaWYgKGhhc0NsYXNzKGRvY3VtZW50LmJvZHksIHN3YWxDbGFzc2VzLmlvc2ZpeCkpIHsKICAgICAgY29uc3Qgb2Zmc2V0ID0gcGFyc2VJbnQoZG9jdW1lbnQuYm9keS5zdHlsZS50b3AsIDEwKTsKICAgICAgcmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgc3dhbENsYXNzZXMuaW9zZml4KTsKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS50b3AgPSAnJzsKICAgICAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSBvZmZzZXQgKiAtMTsKICAgIH0KICB9OwoKICBjb25zdCBmaXhTY3JvbGxiYXIgPSAoKSA9PiB7CiAgICAvLyBmb3IgcXVldWVzLCBkbyBub3QgZG8gdGhpcyBtb3JlIHRoYW4gb25jZQogICAgaWYgKHN0YXRlcy5wcmV2aW91c0JvZHlQYWRkaW5nICE9PSBudWxsKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIC8vIGlmIHRoZSBib2R5IGhhcyBvdmVyZmxvdwogICAgaWYgKGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ID4gd2luZG93LmlubmVySGVpZ2h0KSB7CiAgICAgIC8vIGFkZCBwYWRkaW5nIHNvIHRoZSBjb250ZW50IGRvZXNuJ3Qgc2hpZnQgYWZ0ZXIgcmVtb3ZhbCBvZiBzY3JvbGxiYXIKICAgICAgc3RhdGVzLnByZXZpb3VzQm9keVBhZGRpbmcgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXJpZ2h0JykpOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IGAke3N0YXRlcy5wcmV2aW91c0JvZHlQYWRkaW5nICsgbWVhc3VyZVNjcm9sbGJhcigpfXB4YDsKICAgIH0KICB9OwogIGNvbnN0IHVuZG9TY3JvbGxiYXIgPSAoKSA9PiB7CiAgICBpZiAoc3RhdGVzLnByZXZpb3VzQm9keVBhZGRpbmcgIT09IG51bGwpIHsKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBgJHtzdGF0ZXMucHJldmlvdXNCb2R5UGFkZGluZ31weGA7CiAgICAgIHN0YXRlcy5wcmV2aW91c0JvZHlQYWRkaW5nID0gbnVsbDsKICAgIH0KICB9OwoKICAvKgogICAqIEluc3RhbmNlIG1ldGhvZCB0byBjbG9zZSBzd2VldEFsZXJ0CiAgICovCgogIGZ1bmN0aW9uIHJlbW92ZVBvcHVwQW5kUmVzZXRTdGF0ZShpbnN0YW5jZSwgY29udGFpbmVyLCByZXR1cm5Gb2N1cywgZGlkQ2xvc2UpIHsKICAgIGlmIChpc1RvYXN0KCkpIHsKICAgICAgdHJpZ2dlckRpZENsb3NlQW5kRGlzcG9zZShpbnN0YW5jZSwgZGlkQ2xvc2UpOwogICAgfSBlbHNlIHsKICAgICAgcmVzdG9yZUFjdGl2ZUVsZW1lbnQocmV0dXJuRm9jdXMpLnRoZW4oKCkgPT4gdHJpZ2dlckRpZENsb3NlQW5kRGlzcG9zZShpbnN0YW5jZSwgZGlkQ2xvc2UpKTsKICAgICAgcmVtb3ZlS2V5ZG93bkhhbmRsZXIoZ2xvYmFsU3RhdGUpOwogICAgfQogICAgY29uc3QgaXNTYWZhcmkgPSAvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgLy8gd29ya2Fyb3VuZCBmb3IgIzIwODgKICAgIC8vIGZvciBzb21lIHJlYXNvbiByZW1vdmluZyB0aGUgY29udGFpbmVyIGluIFNhZmFyaSB3aWxsIHNjcm9sbCB0aGUgZG9jdW1lbnQgdG8gYm90dG9tCiAgICBpZiAoaXNTYWZhcmkpIHsKICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTpub25lICFpbXBvcnRhbnQnKTsKICAgICAgY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTsKICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnOwogICAgfSBlbHNlIHsKICAgICAgY29udGFpbmVyLnJlbW92ZSgpOwogICAgfQogICAgaWYgKGlzTW9kYWwoKSkgewogICAgICB1bmRvU2Nyb2xsYmFyKCk7CiAgICAgIHVuZG9JT1NmaXgoKTsKICAgICAgdW5zZXRBcmlhSGlkZGVuKCk7CiAgICB9CiAgICByZW1vdmVCb2R5Q2xhc3NlcygpOwogIH0KICBmdW5jdGlvbiByZW1vdmVCb2R5Q2xhc3NlcygpIHsKICAgIHJlbW92ZUNsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLCBbc3dhbENsYXNzZXMuc2hvd24sIHN3YWxDbGFzc2VzWydoZWlnaHQtYXV0byddLCBzd2FsQ2xhc3Nlc1snbm8tYmFja2Ryb3AnXSwgc3dhbENsYXNzZXNbJ3RvYXN0LXNob3duJ11dKTsKICB9CiAgZnVuY3Rpb24gY2xvc2UocmVzb2x2ZVZhbHVlKSB7CiAgICByZXNvbHZlVmFsdWUgPSBwcmVwYXJlUmVzb2x2ZVZhbHVlKHJlc29sdmVWYWx1ZSk7CiAgICBjb25zdCBzd2FsUHJvbWlzZVJlc29sdmUgPSBwcml2YXRlTWV0aG9kcy5zd2FsUHJvbWlzZVJlc29sdmUuZ2V0KHRoaXMpOwogICAgY29uc3QgZGlkQ2xvc2UgPSB0cmlnZ2VyQ2xvc2VQb3B1cCh0aGlzKTsKICAgIGlmICh0aGlzLmlzQXdhaXRpbmdQcm9taXNlKCkpIHsKICAgICAgLy8gQSBzd2FsIGF3YWl0aW5nIGZvciBhIHByb21pc2UgKGFmdGVyIGEgY2xpY2sgb24gQ29uZmlybSBvciBEZW55KSBjYW5ub3QgYmUgZGlzbWlzc2VkIGFueW1vcmUgIzIzMzUKICAgICAgaWYgKCFyZXNvbHZlVmFsdWUuaXNEaXNtaXNzZWQpIHsKICAgICAgICBoYW5kbGVBd2FpdGluZ1Byb21pc2UodGhpcyk7CiAgICAgICAgc3dhbFByb21pc2VSZXNvbHZlKHJlc29sdmVWYWx1ZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZGlkQ2xvc2UpIHsKICAgICAgLy8gUmVzb2x2ZSBTd2FsIHByb21pc2UKICAgICAgc3dhbFByb21pc2VSZXNvbHZlKHJlc29sdmVWYWx1ZSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIGlzQXdhaXRpbmdQcm9taXNlKCkgewogICAgcmV0dXJuICEhcHJpdmF0ZVByb3BzLmF3YWl0aW5nUHJvbWlzZS5nZXQodGhpcyk7CiAgfQogIGNvbnN0IHRyaWdnZXJDbG9zZVBvcHVwID0gaW5zdGFuY2UgPT4gewogICAgY29uc3QgcG9wdXAgPSBnZXRQb3B1cCgpOwogICAgaWYgKCFwb3B1cCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBjb25zdCBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UpOwogICAgaWYgKCFpbm5lclBhcmFtcyB8fCBoYXNDbGFzcyhwb3B1cCwgaW5uZXJQYXJhbXMuaGlkZUNsYXNzLnBvcHVwKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZW1vdmVDbGFzcyhwb3B1cCwgaW5uZXJQYXJhbXMuc2hvd0NsYXNzLnBvcHVwKTsKICAgIGFkZENsYXNzKHBvcHVwLCBpbm5lclBhcmFtcy5oaWRlQ2xhc3MucG9wdXApOwogICAgY29uc3QgYmFja2Ryb3AgPSBnZXRDb250YWluZXIoKTsKICAgIHJlbW92ZUNsYXNzKGJhY2tkcm9wLCBpbm5lclBhcmFtcy5zaG93Q2xhc3MuYmFja2Ryb3ApOwogICAgYWRkQ2xhc3MoYmFja2Ryb3AsIGlubmVyUGFyYW1zLmhpZGVDbGFzcy5iYWNrZHJvcCk7CiAgICBoYW5kbGVQb3B1cEFuaW1hdGlvbihpbnN0YW5jZSwgcG9wdXAsIGlubmVyUGFyYW1zKTsKICAgIHJldHVybiB0cnVlOwogIH07CiAgZnVuY3Rpb24gcmVqZWN0UHJvbWlzZShlcnJvcikgewogICAgY29uc3QgcmVqZWN0UHJvbWlzZSA9IHByaXZhdGVNZXRob2RzLnN3YWxQcm9taXNlUmVqZWN0LmdldCh0aGlzKTsKICAgIGhhbmRsZUF3YWl0aW5nUHJvbWlzZSh0aGlzKTsKICAgIGlmIChyZWplY3RQcm9taXNlKSB7CiAgICAgIC8vIFJlamVjdCBTd2FsIHByb21pc2UKICAgICAgcmVqZWN0UHJvbWlzZShlcnJvcik7CiAgICB9CiAgfQogIGNvbnN0IGhhbmRsZUF3YWl0aW5nUHJvbWlzZSA9IGluc3RhbmNlID0+IHsKICAgIGlmIChpbnN0YW5jZS5pc0F3YWl0aW5nUHJvbWlzZSgpKSB7CiAgICAgIHByaXZhdGVQcm9wcy5hd2FpdGluZ1Byb21pc2UuZGVsZXRlKGluc3RhbmNlKTsKICAgICAgLy8gVGhlIGluc3RhbmNlIG1pZ2h0IGhhdmUgYmVlbiBwcmV2aW91c2x5IHBhcnRseSBkZXN0cm95ZWQsIHdlIG11c3QgcmVzdW1lIHRoZSBkZXN0cm95IHByb2Nlc3MgaW4gdGhpcyBjYXNlICMyMzM1CiAgICAgIGlmICghcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSkpIHsKICAgICAgICBpbnN0YW5jZS5fZGVzdHJveSgpOwogICAgICB9CiAgICB9CiAgfTsKICBjb25zdCBwcmVwYXJlUmVzb2x2ZVZhbHVlID0gcmVzb2x2ZVZhbHVlID0+IHsKICAgIC8vIFdoZW4gdXNlciBjYWxscyBTd2FsLmNsb3NlKCkKICAgIGlmICh0eXBlb2YgcmVzb2x2ZVZhbHVlID09PSAndW5kZWZpbmVkJykgewogICAgICByZXR1cm4gewogICAgICAgIGlzQ29uZmlybWVkOiBmYWxzZSwKICAgICAgICBpc0RlbmllZDogZmFsc2UsCiAgICAgICAgaXNEaXNtaXNzZWQ6IHRydWUKICAgICAgfTsKICAgIH0KICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsKICAgICAgaXNDb25maXJtZWQ6IGZhbHNlLAogICAgICBpc0RlbmllZDogZmFsc2UsCiAgICAgIGlzRGlzbWlzc2VkOiBmYWxzZQogICAgfSwgcmVzb2x2ZVZhbHVlKTsKICB9OwogIGNvbnN0IGhhbmRsZVBvcHVwQW5pbWF0aW9uID0gKGluc3RhbmNlLCBwb3B1cCwgaW5uZXJQYXJhbXMpID0+IHsKICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpOwogICAgLy8gSWYgYW5pbWF0aW9uIGlzIHN1cHBvcnRlZCwgYW5pbWF0ZQogICAgY29uc3QgYW5pbWF0aW9uSXNTdXBwb3J0ZWQgPSBhbmltYXRpb25FbmRFdmVudCAmJiBoYXNDc3NBbmltYXRpb24ocG9wdXApOwogICAgaWYgKHR5cGVvZiBpbm5lclBhcmFtcy53aWxsQ2xvc2UgPT09ICdmdW5jdGlvbicpIHsKICAgICAgaW5uZXJQYXJhbXMud2lsbENsb3NlKHBvcHVwKTsKICAgIH0KICAgIGlmIChhbmltYXRpb25Jc1N1cHBvcnRlZCkgewogICAgICBhbmltYXRlUG9wdXAoaW5zdGFuY2UsIHBvcHVwLCBjb250YWluZXIsIGlubmVyUGFyYW1zLnJldHVybkZvY3VzLCBpbm5lclBhcmFtcy5kaWRDbG9zZSk7CiAgICB9IGVsc2UgewogICAgICAvLyBPdGhlcndpc2UsIHJlbW92ZSBpbW1lZGlhdGVseQogICAgICByZW1vdmVQb3B1cEFuZFJlc2V0U3RhdGUoaW5zdGFuY2UsIGNvbnRhaW5lciwgaW5uZXJQYXJhbXMucmV0dXJuRm9jdXMsIGlubmVyUGFyYW1zLmRpZENsb3NlKTsKICAgIH0KICB9OwogIGNvbnN0IGFuaW1hdGVQb3B1cCA9IChpbnN0YW5jZSwgcG9wdXAsIGNvbnRhaW5lciwgcmV0dXJuRm9jdXMsIGRpZENsb3NlKSA9PiB7CiAgICBnbG9iYWxTdGF0ZS5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2sgPSByZW1vdmVQb3B1cEFuZFJlc2V0U3RhdGUuYmluZChudWxsLCBpbnN0YW5jZSwgY29udGFpbmVyLCByZXR1cm5Gb2N1cywgZGlkQ2xvc2UpOwogICAgcG9wdXAuYWRkRXZlbnRMaXN0ZW5lcihhbmltYXRpb25FbmRFdmVudCwgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKGUudGFyZ2V0ID09PSBwb3B1cCkgewogICAgICAgIGdsb2JhbFN0YXRlLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjaygpOwogICAgICAgIGRlbGV0ZSBnbG9iYWxTdGF0ZS5zd2FsQ2xvc2VFdmVudEZpbmlzaGVkQ2FsbGJhY2s7CiAgICAgIH0KICAgIH0pOwogIH07CiAgY29uc3QgdHJpZ2dlckRpZENsb3NlQW5kRGlzcG9zZSA9IChpbnN0YW5jZSwgZGlkQ2xvc2UpID0+IHsKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICBpZiAodHlwZW9mIGRpZENsb3NlID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgZGlkQ2xvc2UuYmluZChpbnN0YW5jZS5wYXJhbXMpKCk7CiAgICAgIH0KICAgICAgaW5zdGFuY2UuX2Rlc3Ryb3koKTsKICAgIH0pOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYnV0dG9ucwogICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGlzYWJsZWQKICAgKi8KICBmdW5jdGlvbiBzZXRCdXR0b25zRGlzYWJsZWQoaW5zdGFuY2UsIGJ1dHRvbnMsIGRpc2FibGVkKSB7CiAgICBjb25zdCBkb21DYWNoZSA9IHByaXZhdGVQcm9wcy5kb21DYWNoZS5nZXQoaW5zdGFuY2UpOwogICAgYnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7CiAgICAgIGRvbUNhY2hlW2J1dHRvbl0uZGlzYWJsZWQgPSBkaXNhYmxlZDsKICAgIH0pOwogIH0KCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MSW5wdXRFbGVtZW50fSBpbnB1dAogICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGlzYWJsZWQKICAgKi8KICBmdW5jdGlvbiBzZXRJbnB1dERpc2FibGVkKGlucHV0LCBkaXNhYmxlZCkgewogICAgaWYgKCFpbnB1dCkgewogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoaW5wdXQudHlwZSA9PT0gJ3JhZGlvJykgewogICAgICBjb25zdCByYWRpb3NDb250YWluZXIgPSBpbnB1dC5wYXJlbnROb2RlLnBhcmVudE5vZGU7CiAgICAgIGNvbnN0IHJhZGlvcyA9IHJhZGlvc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhZGlvcy5sZW5ndGg7IGkrKykgewogICAgICAgIHJhZGlvc1tpXS5kaXNhYmxlZCA9IGRpc2FibGVkOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpbnB1dC5kaXNhYmxlZCA9IGRpc2FibGVkOwogICAgfQogIH0KICBmdW5jdGlvbiBlbmFibGVCdXR0b25zKCkgewogICAgc2V0QnV0dG9uc0Rpc2FibGVkKHRoaXMsIFsnY29uZmlybUJ1dHRvbicsICdkZW55QnV0dG9uJywgJ2NhbmNlbEJ1dHRvbiddLCBmYWxzZSk7CiAgfQogIGZ1bmN0aW9uIGRpc2FibGVCdXR0b25zKCkgewogICAgc2V0QnV0dG9uc0Rpc2FibGVkKHRoaXMsIFsnY29uZmlybUJ1dHRvbicsICdkZW55QnV0dG9uJywgJ2NhbmNlbEJ1dHRvbiddLCB0cnVlKTsKICB9CiAgZnVuY3Rpb24gZW5hYmxlSW5wdXQoKSB7CiAgICBzZXRJbnB1dERpc2FibGVkKHRoaXMuZ2V0SW5wdXQoKSwgZmFsc2UpOwogIH0KICBmdW5jdGlvbiBkaXNhYmxlSW5wdXQoKSB7CiAgICBzZXRJbnB1dERpc2FibGVkKHRoaXMuZ2V0SW5wdXQoKSwgdHJ1ZSk7CiAgfQoKICAvKioKICAgKiBTaG93IGJsb2NrIHdpdGggdmFsaWRhdGlvbiBtZXNzYWdlCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gZXJyb3IKICAgKi8KICBmdW5jdGlvbiBzaG93VmFsaWRhdGlvbk1lc3NhZ2UoZXJyb3IpIHsKICAgIGNvbnN0IGRvbUNhY2hlID0gcHJpdmF0ZVByb3BzLmRvbUNhY2hlLmdldCh0aGlzKTsKICAgIGNvbnN0IHBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQodGhpcyk7CiAgICBzZXRJbm5lckh0bWwoZG9tQ2FjaGUudmFsaWRhdGlvbk1lc3NhZ2UsIGVycm9yKTsKICAgIGRvbUNhY2hlLnZhbGlkYXRpb25NZXNzYWdlLmNsYXNzTmFtZSA9IHN3YWxDbGFzc2VzWyd2YWxpZGF0aW9uLW1lc3NhZ2UnXTsKICAgIGlmIChwYXJhbXMuY3VzdG9tQ2xhc3MgJiYgcGFyYW1zLmN1c3RvbUNsYXNzLnZhbGlkYXRpb25NZXNzYWdlKSB7CiAgICAgIGFkZENsYXNzKGRvbUNhY2hlLnZhbGlkYXRpb25NZXNzYWdlLCBwYXJhbXMuY3VzdG9tQ2xhc3MudmFsaWRhdGlvbk1lc3NhZ2UpOwogICAgfQogICAgc2hvdyhkb21DYWNoZS52YWxpZGF0aW9uTWVzc2FnZSk7CiAgICBjb25zdCBpbnB1dCA9IHRoaXMuZ2V0SW5wdXQoKTsKICAgIGlmIChpbnB1dCkgewogICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcsIHRydWUpOwogICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCBzd2FsQ2xhc3Nlc1sndmFsaWRhdGlvbi1tZXNzYWdlJ10pOwogICAgICBmb2N1c0lucHV0KGlucHV0KTsKICAgICAgYWRkQ2xhc3MoaW5wdXQsIHN3YWxDbGFzc2VzLmlucHV0ZXJyb3IpOwogICAgfQogIH0KCiAgLyoqCiAgICogSGlkZSBibG9jayB3aXRoIHZhbGlkYXRpb24gbWVzc2FnZQogICAqLwogIGZ1bmN0aW9uIHJlc2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSB7CiAgICBjb25zdCBkb21DYWNoZSA9IHByaXZhdGVQcm9wcy5kb21DYWNoZS5nZXQodGhpcyk7CiAgICBpZiAoZG9tQ2FjaGUudmFsaWRhdGlvbk1lc3NhZ2UpIHsKICAgICAgaGlkZShkb21DYWNoZS52YWxpZGF0aW9uTWVzc2FnZSk7CiAgICB9CiAgICBjb25zdCBpbnB1dCA9IHRoaXMuZ2V0SW5wdXQoKTsKICAgIGlmIChpbnB1dCkgewogICAgICBpbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcpOwogICAgICBpbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTsKICAgICAgcmVtb3ZlQ2xhc3MoaW5wdXQsIHN3YWxDbGFzc2VzLmlucHV0ZXJyb3IpOwogICAgfQogIH0KCiAgY29uc3QgZGVmYXVsdFBhcmFtcyA9IHsKICAgIHRpdGxlOiAnJywKICAgIHRpdGxlVGV4dDogJycsCiAgICB0ZXh0OiAnJywKICAgIGh0bWw6ICcnLAogICAgZm9vdGVyOiAnJywKICAgIGljb246IHVuZGVmaW5lZCwKICAgIGljb25Db2xvcjogdW5kZWZpbmVkLAogICAgaWNvbkh0bWw6IHVuZGVmaW5lZCwKICAgIHRlbXBsYXRlOiB1bmRlZmluZWQsCiAgICB0b2FzdDogZmFsc2UsCiAgICBzaG93Q2xhc3M6IHsKICAgICAgcG9wdXA6ICdzd2FsMi1zaG93JywKICAgICAgYmFja2Ryb3A6ICdzd2FsMi1iYWNrZHJvcC1zaG93JywKICAgICAgaWNvbjogJ3N3YWwyLWljb24tc2hvdycKICAgIH0sCiAgICBoaWRlQ2xhc3M6IHsKICAgICAgcG9wdXA6ICdzd2FsMi1oaWRlJywKICAgICAgYmFja2Ryb3A6ICdzd2FsMi1iYWNrZHJvcC1oaWRlJywKICAgICAgaWNvbjogJ3N3YWwyLWljb24taGlkZScKICAgIH0sCiAgICBjdXN0b21DbGFzczoge30sCiAgICB0YXJnZXQ6ICdib2R5JywKICAgIGNvbG9yOiB1bmRlZmluZWQsCiAgICBiYWNrZHJvcDogdHJ1ZSwKICAgIGhlaWdodEF1dG86IHRydWUsCiAgICBhbGxvd091dHNpZGVDbGljazogdHJ1ZSwKICAgIGFsbG93RXNjYXBlS2V5OiB0cnVlLAogICAgYWxsb3dFbnRlcktleTogdHJ1ZSwKICAgIHN0b3BLZXlkb3duUHJvcGFnYXRpb246IHRydWUsCiAgICBrZXlkb3duTGlzdGVuZXJDYXB0dXJlOiBmYWxzZSwKICAgIHNob3dDb25maXJtQnV0dG9uOiB0cnVlLAogICAgc2hvd0RlbnlCdXR0b246IGZhbHNlLAogICAgc2hvd0NhbmNlbEJ1dHRvbjogZmFsc2UsCiAgICBwcmVDb25maXJtOiB1bmRlZmluZWQsCiAgICBwcmVEZW55OiB1bmRlZmluZWQsCiAgICBjb25maXJtQnV0dG9uVGV4dDogJ09LJywKICAgIGNvbmZpcm1CdXR0b25BcmlhTGFiZWw6ICcnLAogICAgY29uZmlybUJ1dHRvbkNvbG9yOiB1bmRlZmluZWQsCiAgICBkZW55QnV0dG9uVGV4dDogJ05vJywKICAgIGRlbnlCdXR0b25BcmlhTGFiZWw6ICcnLAogICAgZGVueUJ1dHRvbkNvbG9yOiB1bmRlZmluZWQsCiAgICBjYW5jZWxCdXR0b25UZXh0OiAnQ2FuY2VsJywKICAgIGNhbmNlbEJ1dHRvbkFyaWFMYWJlbDogJycsCiAgICBjYW5jZWxCdXR0b25Db2xvcjogdW5kZWZpbmVkLAogICAgYnV0dG9uc1N0eWxpbmc6IHRydWUsCiAgICByZXZlcnNlQnV0dG9uczogZmFsc2UsCiAgICBmb2N1c0NvbmZpcm06IHRydWUsCiAgICBmb2N1c0Rlbnk6IGZhbHNlLAogICAgZm9jdXNDYW5jZWw6IGZhbHNlLAogICAgcmV0dXJuRm9jdXM6IHRydWUsCiAgICBzaG93Q2xvc2VCdXR0b246IGZhbHNlLAogICAgY2xvc2VCdXR0b25IdG1sOiAnJnRpbWVzOycsCiAgICBjbG9zZUJ1dHRvbkFyaWFMYWJlbDogJ0Nsb3NlIHRoaXMgZGlhbG9nJywKICAgIGxvYWRlckh0bWw6ICcnLAogICAgc2hvd0xvYWRlck9uQ29uZmlybTogZmFsc2UsCiAgICBzaG93TG9hZGVyT25EZW55OiBmYWxzZSwKICAgIGltYWdlVXJsOiB1bmRlZmluZWQsCiAgICBpbWFnZVdpZHRoOiB1bmRlZmluZWQsCiAgICBpbWFnZUhlaWdodDogdW5kZWZpbmVkLAogICAgaW1hZ2VBbHQ6ICcnLAogICAgdGltZXI6IHVuZGVmaW5lZCwKICAgIHRpbWVyUHJvZ3Jlc3NCYXI6IGZhbHNlLAogICAgd2lkdGg6IHVuZGVmaW5lZCwKICAgIHBhZGRpbmc6IHVuZGVmaW5lZCwKICAgIGJhY2tncm91bmQ6IHVuZGVmaW5lZCwKICAgIGlucHV0OiB1bmRlZmluZWQsCiAgICBpbnB1dFBsYWNlaG9sZGVyOiAnJywKICAgIGlucHV0TGFiZWw6ICcnLAogICAgaW5wdXRWYWx1ZTogJycsCiAgICBpbnB1dE9wdGlvbnM6IHt9LAogICAgaW5wdXRBdXRvRm9jdXM6IHRydWUsCiAgICBpbnB1dEF1dG9UcmltOiB0cnVlLAogICAgaW5wdXRBdHRyaWJ1dGVzOiB7fSwKICAgIGlucHV0VmFsaWRhdG9yOiB1bmRlZmluZWQsCiAgICByZXR1cm5JbnB1dFZhbHVlT25EZW55OiBmYWxzZSwKICAgIHZhbGlkYXRpb25NZXNzYWdlOiB1bmRlZmluZWQsCiAgICBncm93OiBmYWxzZSwKICAgIHBvc2l0aW9uOiAnY2VudGVyJywKICAgIHByb2dyZXNzU3RlcHM6IFtdLAogICAgY3VycmVudFByb2dyZXNzU3RlcDogdW5kZWZpbmVkLAogICAgcHJvZ3Jlc3NTdGVwc0Rpc3RhbmNlOiB1bmRlZmluZWQsCiAgICB3aWxsT3BlbjogdW5kZWZpbmVkLAogICAgZGlkT3BlbjogdW5kZWZpbmVkLAogICAgZGlkUmVuZGVyOiB1bmRlZmluZWQsCiAgICB3aWxsQ2xvc2U6IHVuZGVmaW5lZCwKICAgIGRpZENsb3NlOiB1bmRlZmluZWQsCiAgICBkaWREZXN0cm95OiB1bmRlZmluZWQsCiAgICBzY3JvbGxiYXJQYWRkaW5nOiB0cnVlCiAgfTsKICBjb25zdCB1cGRhdGFibGVQYXJhbXMgPSBbJ2FsbG93RXNjYXBlS2V5JywgJ2FsbG93T3V0c2lkZUNsaWNrJywgJ2JhY2tncm91bmQnLCAnYnV0dG9uc1N0eWxpbmcnLCAnY2FuY2VsQnV0dG9uQXJpYUxhYmVsJywgJ2NhbmNlbEJ1dHRvbkNvbG9yJywgJ2NhbmNlbEJ1dHRvblRleHQnLCAnY2xvc2VCdXR0b25BcmlhTGFiZWwnLCAnY2xvc2VCdXR0b25IdG1sJywgJ2NvbG9yJywgJ2NvbmZpcm1CdXR0b25BcmlhTGFiZWwnLCAnY29uZmlybUJ1dHRvbkNvbG9yJywgJ2NvbmZpcm1CdXR0b25UZXh0JywgJ2N1cnJlbnRQcm9ncmVzc1N0ZXAnLCAnY3VzdG9tQ2xhc3MnLCAnZGVueUJ1dHRvbkFyaWFMYWJlbCcsICdkZW55QnV0dG9uQ29sb3InLCAnZGVueUJ1dHRvblRleHQnLCAnZGlkQ2xvc2UnLCAnZGlkRGVzdHJveScsICdmb290ZXInLCAnaGlkZUNsYXNzJywgJ2h0bWwnLCAnaWNvbicsICdpY29uQ29sb3InLCAnaWNvbkh0bWwnLCAnaW1hZ2VBbHQnLCAnaW1hZ2VIZWlnaHQnLCAnaW1hZ2VVcmwnLCAnaW1hZ2VXaWR0aCcsICdwcmVDb25maXJtJywgJ3ByZURlbnknLCAncHJvZ3Jlc3NTdGVwcycsICdyZXR1cm5Gb2N1cycsICdyZXZlcnNlQnV0dG9ucycsICdzaG93Q2FuY2VsQnV0dG9uJywgJ3Nob3dDbG9zZUJ1dHRvbicsICdzaG93Q29uZmlybUJ1dHRvbicsICdzaG93RGVueUJ1dHRvbicsICd0ZXh0JywgJ3RpdGxlJywgJ3RpdGxlVGV4dCcsICd3aWxsQ2xvc2UnXTsKICBjb25zdCBkZXByZWNhdGVkUGFyYW1zID0ge307CiAgY29uc3QgdG9hc3RJbmNvbXBhdGlibGVQYXJhbXMgPSBbJ2FsbG93T3V0c2lkZUNsaWNrJywgJ2FsbG93RW50ZXJLZXknLCAnYmFja2Ryb3AnLCAnZm9jdXNDb25maXJtJywgJ2ZvY3VzRGVueScsICdmb2N1c0NhbmNlbCcsICdyZXR1cm5Gb2N1cycsICdoZWlnaHRBdXRvJywgJ2tleWRvd25MaXN0ZW5lckNhcHR1cmUnXTsKCiAgLyoqCiAgICogSXMgdmFsaWQgcGFyYW1ldGVyCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lCiAgICogQHJldHVybnMge2Jvb2xlYW59CiAgICovCiAgY29uc3QgaXNWYWxpZFBhcmFtZXRlciA9IHBhcmFtTmFtZSA9PiB7CiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRlZmF1bHRQYXJhbXMsIHBhcmFtTmFtZSk7CiAgfTsKCiAgLyoqCiAgICogSXMgdmFsaWQgcGFyYW1ldGVyIGZvciBTd2FsLnVwZGF0ZSgpIG1ldGhvZAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZQogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwogIGNvbnN0IGlzVXBkYXRhYmxlUGFyYW1ldGVyID0gcGFyYW1OYW1lID0+IHsKICAgIHJldHVybiB1cGRhdGFibGVQYXJhbXMuaW5kZXhPZihwYXJhbU5hbWUpICE9PSAtMTsKICB9OwoKICAvKioKICAgKiBJcyBkZXByZWNhdGVkIHBhcmFtZXRlcgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZQogICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9CiAgICovCiAgY29uc3QgaXNEZXByZWNhdGVkUGFyYW1ldGVyID0gcGFyYW1OYW1lID0+IHsKICAgIHJldHVybiBkZXByZWNhdGVkUGFyYW1zW3BhcmFtTmFtZV07CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtCiAgICovCiAgY29uc3QgY2hlY2tJZlBhcmFtSXNWYWxpZCA9IHBhcmFtID0+IHsKICAgIGlmICghaXNWYWxpZFBhcmFtZXRlcihwYXJhbSkpIHsKICAgICAgd2FybihgVW5rbm93biBwYXJhbWV0ZXIgIiR7cGFyYW19ImApOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbQogICAqLwogIGNvbnN0IGNoZWNrSWZUb2FzdFBhcmFtSXNWYWxpZCA9IHBhcmFtID0+IHsKICAgIGlmICh0b2FzdEluY29tcGF0aWJsZVBhcmFtcy5pbmNsdWRlcyhwYXJhbSkpIHsKICAgICAgd2FybihgVGhlIHBhcmFtZXRlciAiJHtwYXJhbX0iIGlzIGluY29tcGF0aWJsZSB3aXRoIHRvYXN0c2ApOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbQogICAqLwogIGNvbnN0IGNoZWNrSWZQYXJhbUlzRGVwcmVjYXRlZCA9IHBhcmFtID0+IHsKICAgIGlmIChpc0RlcHJlY2F0ZWRQYXJhbWV0ZXIocGFyYW0pKSB7CiAgICAgIHdhcm5BYm91dERlcHJlY2F0aW9uKHBhcmFtLCBpc0RlcHJlY2F0ZWRQYXJhbWV0ZXIocGFyYW0pKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBTaG93IHJlbGV2YW50IHdhcm5pbmdzIGZvciBnaXZlbiBwYXJhbXMKICAgKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwogIGNvbnN0IHNob3dXYXJuaW5nc0ZvclBhcmFtcyA9IHBhcmFtcyA9PiB7CiAgICBpZiAocGFyYW1zLmJhY2tkcm9wID09PSBmYWxzZSAmJiBwYXJhbXMuYWxsb3dPdXRzaWRlQ2xpY2spIHsKICAgICAgd2FybignImFsbG93T3V0c2lkZUNsaWNrIiBwYXJhbWV0ZXIgcmVxdWlyZXMgYGJhY2tkcm9wYCBwYXJhbWV0ZXIgdG8gYmUgc2V0IHRvIGB0cnVlYCcpOwogICAgfQogICAgZm9yIChjb25zdCBwYXJhbSBpbiBwYXJhbXMpIHsKICAgICAgY2hlY2tJZlBhcmFtSXNWYWxpZChwYXJhbSk7CiAgICAgIGlmIChwYXJhbXMudG9hc3QpIHsKICAgICAgICBjaGVja0lmVG9hc3RQYXJhbUlzVmFsaWQocGFyYW0pOwogICAgICB9CiAgICAgIGNoZWNrSWZQYXJhbUlzRGVwcmVjYXRlZChwYXJhbSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogVXBkYXRlcyBwb3B1cCBwYXJhbWV0ZXJzLgogICAqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgZnVuY3Rpb24gdXBkYXRlKHBhcmFtcykgewogICAgY29uc3QgcG9wdXAgPSBnZXRQb3B1cCgpOwogICAgY29uc3QgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpOwogICAgaWYgKCFwb3B1cCB8fCBoYXNDbGFzcyhwb3B1cCwgaW5uZXJQYXJhbXMuaGlkZUNsYXNzLnBvcHVwKSkgewogICAgICB3YXJuKGBZb3UncmUgdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgY2xvc2VkIG9yIGNsb3NpbmcgcG9wdXAsIHRoYXQgd29uJ3Qgd29yay4gVXNlIHRoZSB1cGRhdGUoKSBtZXRob2QgaW4gcHJlQ29uZmlybSBwYXJhbWV0ZXIgb3Igc2hvdyBhIG5ldyBwb3B1cC5gKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgdmFsaWRVcGRhdGFibGVQYXJhbXMgPSBmaWx0ZXJWYWxpZFBhcmFtcyhwYXJhbXMpOwogICAgY29uc3QgdXBkYXRlZFBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe30sIGlubmVyUGFyYW1zLCB2YWxpZFVwZGF0YWJsZVBhcmFtcyk7CiAgICByZW5kZXIodGhpcywgdXBkYXRlZFBhcmFtcyk7CiAgICBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuc2V0KHRoaXMsIHVwZGF0ZWRQYXJhbXMpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgewogICAgICBwYXJhbXM6IHsKICAgICAgICB2YWx1ZTogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wYXJhbXMsIHBhcmFtcyksCiAgICAgICAgd3JpdGFibGU6IGZhbHNlLAogICAgICAgIGVudW1lcmFibGU6IHRydWUKICAgICAgfQogICAgfSk7CiAgfQoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKiBAcmV0dXJucyB7U3dlZXRBbGVydE9wdGlvbnN9CiAgICovCiAgY29uc3QgZmlsdGVyVmFsaWRQYXJhbXMgPSBwYXJhbXMgPT4gewogICAgY29uc3QgdmFsaWRVcGRhdGFibGVQYXJhbXMgPSB7fTsKICAgIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaChwYXJhbSA9PiB7CiAgICAgIGlmIChpc1VwZGF0YWJsZVBhcmFtZXRlcihwYXJhbSkpIHsKICAgICAgICB2YWxpZFVwZGF0YWJsZVBhcmFtc1twYXJhbV0gPSBwYXJhbXNbcGFyYW1dOwogICAgICB9IGVsc2UgewogICAgICAgIHdhcm4oYEludmFsaWQgcGFyYW1ldGVyIHRvIHVwZGF0ZTogJHtwYXJhbX1gKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gdmFsaWRVcGRhdGFibGVQYXJhbXM7CiAgfTsKCiAgLyoqCiAgICogRGlzcG9zZSB0aGUgY3VycmVudCBTd2VldEFsZXJ0MiBpbnN0YW5jZQogICAqLwogIGZ1bmN0aW9uIF9kZXN0cm95KCkgewogICAgY29uc3QgZG9tQ2FjaGUgPSBwcml2YXRlUHJvcHMuZG9tQ2FjaGUuZ2V0KHRoaXMpOwogICAgY29uc3QgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KHRoaXMpOwogICAgaWYgKCFpbm5lclBhcmFtcykgewogICAgICBkaXNwb3NlV2Vha01hcHModGhpcyk7IC8vIFRoZSBXZWFrTWFwcyBtaWdodCBoYXZlIGJlZW4gcGFydGx5IGRlc3Ryb3llZCwgd2UgbXVzdCByZWNhbGwgaXQgdG8gZGlzcG9zZSBhbnkgcmVtYWluaW5nIFdlYWtNYXBzICMyMzM1CiAgICAgIHJldHVybjsgLy8gVGhpcyBpbnN0YW5jZSBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZAogICAgfQoKICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIgU3dhbCBjbG9zaW5nCiAgICBpZiAoZG9tQ2FjaGUucG9wdXAgJiYgZ2xvYmFsU3RhdGUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrKSB7CiAgICAgIGdsb2JhbFN0YXRlLnN3YWxDbG9zZUV2ZW50RmluaXNoZWRDYWxsYmFjaygpOwogICAgICBkZWxldGUgZ2xvYmFsU3RhdGUuc3dhbENsb3NlRXZlbnRGaW5pc2hlZENhbGxiYWNrOwogICAgfQogICAgaWYgKHR5cGVvZiBpbm5lclBhcmFtcy5kaWREZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIGlubmVyUGFyYW1zLmRpZERlc3Ryb3koKTsKICAgIH0KICAgIGRpc3Bvc2VTd2FsKHRoaXMpOwogIH0KCiAgLyoqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKi8KICBjb25zdCBkaXNwb3NlU3dhbCA9IGluc3RhbmNlID0+IHsKICAgIGRpc3Bvc2VXZWFrTWFwcyhpbnN0YW5jZSk7CiAgICAvLyBVbnNldCB0aGlzLnBhcmFtcyBzbyBHQyB3aWxsIGRpc3Bvc2UgaXQgKCMxNTY5KQogICAgLy8gQHRzLWlnbm9yZQogICAgZGVsZXRlIGluc3RhbmNlLnBhcmFtczsKICAgIC8vIFVuc2V0IGdsb2JhbFN0YXRlIHByb3BzIHNvIEdDIHdpbGwgZGlzcG9zZSBnbG9iYWxTdGF0ZSAoIzE1NjkpCiAgICBkZWxldGUgZ2xvYmFsU3RhdGUua2V5ZG93bkhhbmRsZXI7CiAgICBkZWxldGUgZ2xvYmFsU3RhdGUua2V5ZG93blRhcmdldDsKICAgIC8vIFVuc2V0IGN1cnJlbnRJbnN0YW5jZQogICAgZGVsZXRlIGdsb2JhbFN0YXRlLmN1cnJlbnRJbnN0YW5jZTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqLwogIGNvbnN0IGRpc3Bvc2VXZWFrTWFwcyA9IGluc3RhbmNlID0+IHsKICAgIC8vIElmIHRoZSBjdXJyZW50IGluc3RhbmNlIGlzIGF3YWl0aW5nIGEgcHJvbWlzZSByZXN1bHQsIHdlIGtlZXAgdGhlIHByaXZhdGVNZXRob2RzIHRvIGNhbGwgdGhlbSBvbmNlIHRoZSBwcm9taXNlIHJlc3VsdCBpcyByZXRyaWV2ZWQgIzIzMzUKICAgIC8vIEB0cy1pZ25vcmUKICAgIGlmIChpbnN0YW5jZS5pc0F3YWl0aW5nUHJvbWlzZSgpKSB7CiAgICAgIHVuc2V0V2Vha01hcHMocHJpdmF0ZVByb3BzLCBpbnN0YW5jZSk7CiAgICAgIHByaXZhdGVQcm9wcy5hd2FpdGluZ1Byb21pc2Uuc2V0KGluc3RhbmNlLCB0cnVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHVuc2V0V2Vha01hcHMocHJpdmF0ZU1ldGhvZHMsIGluc3RhbmNlKTsKICAgICAgdW5zZXRXZWFrTWFwcyhwcml2YXRlUHJvcHMsIGluc3RhbmNlKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge29iamVjdH0gb2JqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKi8KICBjb25zdCB1bnNldFdlYWtNYXBzID0gKG9iaiwgaW5zdGFuY2UpID0+IHsKICAgIGZvciAoY29uc3QgaSBpbiBvYmopIHsKICAgICAgb2JqW2ldLmRlbGV0ZShpbnN0YW5jZSk7CiAgICB9CiAgfTsKCiAgdmFyIGluc3RhbmNlTWV0aG9kcyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIGhpZGVMb2FkaW5nOiBoaWRlTG9hZGluZywKICAgIGRpc2FibGVMb2FkaW5nOiBoaWRlTG9hZGluZywKICAgIGdldElucHV0OiBnZXRJbnB1dCwKICAgIGNsb3NlOiBjbG9zZSwKICAgIGlzQXdhaXRpbmdQcm9taXNlOiBpc0F3YWl0aW5nUHJvbWlzZSwKICAgIHJlamVjdFByb21pc2U6IHJlamVjdFByb21pc2UsCiAgICBoYW5kbGVBd2FpdGluZ1Byb21pc2U6IGhhbmRsZUF3YWl0aW5nUHJvbWlzZSwKICAgIGNsb3NlUG9wdXA6IGNsb3NlLAogICAgY2xvc2VNb2RhbDogY2xvc2UsCiAgICBjbG9zZVRvYXN0OiBjbG9zZSwKICAgIGVuYWJsZUJ1dHRvbnM6IGVuYWJsZUJ1dHRvbnMsCiAgICBkaXNhYmxlQnV0dG9uczogZGlzYWJsZUJ1dHRvbnMsCiAgICBlbmFibGVJbnB1dDogZW5hYmxlSW5wdXQsCiAgICBkaXNhYmxlSW5wdXQ6IGRpc2FibGVJbnB1dCwKICAgIHNob3dWYWxpZGF0aW9uTWVzc2FnZTogc2hvd1ZhbGlkYXRpb25NZXNzYWdlLAogICAgcmVzZXRWYWxpZGF0aW9uTWVzc2FnZTogcmVzZXRWYWxpZGF0aW9uTWVzc2FnZSwKICAgIHVwZGF0ZTogdXBkYXRlLAogICAgX2Rlc3Ryb3k6IF9kZXN0cm95CiAgfSk7CgogIC8qKgogICAqIFNob3dzIGxvYWRlciAoc3Bpbm5lciksIHRoaXMgaXMgdXNlZnVsIHdpdGggQUpBWCByZXF1ZXN0cy4KICAgKiBCeSBkZWZhdWx0IHRoZSBsb2FkZXIgYmUgc2hvd24gaW5zdGVhZCBvZiB0aGUgIkNvbmZpcm0iIGJ1dHRvbi4KICAgKgogICAqIEBwYXJhbSB7SFRNTEJ1dHRvbkVsZW1lbnR9IFtidXR0b25Ub1JlcGxhY2VdCiAgICovCiAgY29uc3Qgc2hvd0xvYWRpbmcgPSBidXR0b25Ub1JlcGxhY2UgPT4gewogICAgbGV0IHBvcHVwID0gZ2V0UG9wdXAoKTsKICAgIGlmICghcG9wdXApIHsKICAgICAgbmV3IFN3YWwoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXcKICAgIH0KCiAgICBwb3B1cCA9IGdldFBvcHVwKCk7CiAgICBjb25zdCBsb2FkZXIgPSBnZXRMb2FkZXIoKTsKICAgIGlmIChpc1RvYXN0KCkpIHsKICAgICAgaGlkZShnZXRJY29uKCkpOwogICAgfSBlbHNlIHsKICAgICAgcmVwbGFjZUJ1dHRvbihwb3B1cCwgYnV0dG9uVG9SZXBsYWNlKTsKICAgIH0KICAgIHNob3cobG9hZGVyKTsKICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnZGF0YS1sb2FkaW5nJywgJ3RydWUnKTsKICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgnYXJpYS1idXN5JywgJ3RydWUnKTsKICAgIHBvcHVwLmZvY3VzKCk7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wdXAKICAgKiBAcGFyYW0ge0hUTUxCdXR0b25FbGVtZW50fSBbYnV0dG9uVG9SZXBsYWNlXQogICAqLwogIGNvbnN0IHJlcGxhY2VCdXR0b24gPSAocG9wdXAsIGJ1dHRvblRvUmVwbGFjZSkgPT4gewogICAgY29uc3QgYWN0aW9ucyA9IGdldEFjdGlvbnMoKTsKICAgIGNvbnN0IGxvYWRlciA9IGdldExvYWRlcigpOwogICAgaWYgKCFidXR0b25Ub1JlcGxhY2UgJiYgaXNWaXNpYmxlJDEoZ2V0Q29uZmlybUJ1dHRvbigpKSkgewogICAgICBidXR0b25Ub1JlcGxhY2UgPSBnZXRDb25maXJtQnV0dG9uKCk7CiAgICB9CiAgICBzaG93KGFjdGlvbnMpOwogICAgaWYgKGJ1dHRvblRvUmVwbGFjZSkgewogICAgICBoaWRlKGJ1dHRvblRvUmVwbGFjZSk7CiAgICAgIGxvYWRlci5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnV0dG9uLXRvLXJlcGxhY2UnLCBidXR0b25Ub1JlcGxhY2UuY2xhc3NOYW1lKTsKICAgIH0KICAgIGxvYWRlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShsb2FkZXIsIGJ1dHRvblRvUmVwbGFjZSk7CiAgICBhZGRDbGFzcyhbcG9wdXAsIGFjdGlvbnNdLCBzd2FsQ2xhc3Nlcy5sb2FkaW5nKTsKICB9OwoKICAvKioKICAgKiBAdHlwZWRlZiB7IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfSBJbnB1dFZhbHVlCiAgICovCgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgY29uc3QgaGFuZGxlSW5wdXRPcHRpb25zQW5kVmFsdWUgPSAoaW5zdGFuY2UsIHBhcmFtcykgPT4gewogICAgaWYgKHBhcmFtcy5pbnB1dCA9PT0gJ3NlbGVjdCcgfHwgcGFyYW1zLmlucHV0ID09PSAncmFkaW8nKSB7CiAgICAgIGhhbmRsZUlucHV0T3B0aW9ucyhpbnN0YW5jZSwgcGFyYW1zKTsKICAgIH0gZWxzZSBpZiAoWyd0ZXh0JywgJ2VtYWlsJywgJ251bWJlcicsICd0ZWwnLCAndGV4dGFyZWEnXS5pbmNsdWRlcyhwYXJhbXMuaW5wdXQpICYmIChoYXNUb1Byb21pc2VGbihwYXJhbXMuaW5wdXRWYWx1ZSkgfHwgaXNQcm9taXNlKHBhcmFtcy5pbnB1dFZhbHVlKSkpIHsKICAgICAgc2hvd0xvYWRpbmcoZ2V0Q29uZmlybUJ1dHRvbigpKTsKICAgICAgaGFuZGxlSW5wdXRWYWx1ZShpbnN0YW5jZSwgcGFyYW1zKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IGlubmVyUGFyYW1zCiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlciB8IEZpbGUgfCBGaWxlTGlzdCB8IG51bGx9CiAgICovCiAgY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChpbnN0YW5jZSwgaW5uZXJQYXJhbXMpID0+IHsKICAgIGNvbnN0IGlucHV0ID0gaW5zdGFuY2UuZ2V0SW5wdXQoKTsKICAgIGlmICghaW5wdXQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBzd2l0Y2ggKGlubmVyUGFyYW1zLmlucHV0KSB7CiAgICAgIGNhc2UgJ2NoZWNrYm94JzoKICAgICAgICByZXR1cm4gZ2V0Q2hlY2tib3hWYWx1ZShpbnB1dCk7CiAgICAgIGNhc2UgJ3JhZGlvJzoKICAgICAgICByZXR1cm4gZ2V0UmFkaW9WYWx1ZShpbnB1dCk7CiAgICAgIGNhc2UgJ2ZpbGUnOgogICAgICAgIHJldHVybiBnZXRGaWxlVmFsdWUoaW5wdXQpOwogICAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiBpbm5lclBhcmFtcy5pbnB1dEF1dG9UcmltID8gaW5wdXQudmFsdWUudHJpbSgpIDogaW5wdXQudmFsdWU7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MSW5wdXRFbGVtZW50fSBpbnB1dAogICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICovCiAgY29uc3QgZ2V0Q2hlY2tib3hWYWx1ZSA9IGlucHV0ID0+IGlucHV0LmNoZWNrZWQgPyAxIDogMDsKCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MSW5wdXRFbGVtZW50fSBpbnB1dAogICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfQogICAqLwogIGNvbnN0IGdldFJhZGlvVmFsdWUgPSBpbnB1dCA9PiBpbnB1dC5jaGVja2VkID8gaW5wdXQudmFsdWUgOiBudWxsOwoKICAvKioKICAgKiBAcGFyYW0ge0hUTUxJbnB1dEVsZW1lbnR9IGlucHV0CiAgICogQHJldHVybnMge0ZpbGVMaXN0IHwgRmlsZSB8IG51bGx9CiAgICovCiAgY29uc3QgZ2V0RmlsZVZhbHVlID0gaW5wdXQgPT4gaW5wdXQuZmlsZXMubGVuZ3RoID8gaW5wdXQuZ2V0QXR0cmlidXRlKCdtdWx0aXBsZScpICE9PSBudWxsID8gaW5wdXQuZmlsZXMgOiBpbnB1dC5maWxlc1swXSA6IG51bGw7CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgY29uc3QgaGFuZGxlSW5wdXRPcHRpb25zID0gKGluc3RhbmNlLCBwYXJhbXMpID0+IHsKICAgIGNvbnN0IHBvcHVwID0gZ2V0UG9wdXAoKTsKICAgIC8qKgogICAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBpbnB1dE9wdGlvbnMKICAgICAqLwogICAgY29uc3QgcHJvY2Vzc0lucHV0T3B0aW9ucyA9IGlucHV0T3B0aW9ucyA9PiB7CiAgICAgIHBvcHVsYXRlSW5wdXRPcHRpb25zW3BhcmFtcy5pbnB1dF0ocG9wdXAsIGZvcm1hdElucHV0T3B0aW9ucyhpbnB1dE9wdGlvbnMpLCBwYXJhbXMpOwogICAgfTsKICAgIGlmIChoYXNUb1Byb21pc2VGbihwYXJhbXMuaW5wdXRPcHRpb25zKSB8fCBpc1Byb21pc2UocGFyYW1zLmlucHV0T3B0aW9ucykpIHsKICAgICAgc2hvd0xvYWRpbmcoZ2V0Q29uZmlybUJ1dHRvbigpKTsKICAgICAgYXNQcm9taXNlKHBhcmFtcy5pbnB1dE9wdGlvbnMpLnRoZW4oaW5wdXRPcHRpb25zID0+IHsKICAgICAgICBpbnN0YW5jZS5oaWRlTG9hZGluZygpOwogICAgICAgIHByb2Nlc3NJbnB1dE9wdGlvbnMoaW5wdXRPcHRpb25zKTsKICAgICAgfSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbXMuaW5wdXRPcHRpb25zID09PSAnb2JqZWN0JykgewogICAgICBwcm9jZXNzSW5wdXRPcHRpb25zKHBhcmFtcy5pbnB1dE9wdGlvbnMpOwogICAgfSBlbHNlIHsKICAgICAgZXJyb3IoYFVuZXhwZWN0ZWQgdHlwZSBvZiBpbnB1dE9wdGlvbnMhIEV4cGVjdGVkIG9iamVjdCwgTWFwIG9yIFByb21pc2UsIGdvdCAke3R5cGVvZiBwYXJhbXMuaW5wdXRPcHRpb25zfWApOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICovCiAgY29uc3QgaGFuZGxlSW5wdXRWYWx1ZSA9IChpbnN0YW5jZSwgcGFyYW1zKSA9PiB7CiAgICBjb25zdCBpbnB1dCA9IGluc3RhbmNlLmdldElucHV0KCk7CiAgICBoaWRlKGlucHV0KTsKICAgIGFzUHJvbWlzZShwYXJhbXMuaW5wdXRWYWx1ZSkudGhlbihpbnB1dFZhbHVlID0+IHsKICAgICAgaW5wdXQudmFsdWUgPSBwYXJhbXMuaW5wdXQgPT09ICdudW1iZXInID8gYCR7cGFyc2VGbG9hdChpbnB1dFZhbHVlKSB8fCAwfWAgOiBgJHtpbnB1dFZhbHVlfWA7CiAgICAgIHNob3coaW5wdXQpOwogICAgICBpbnB1dC5mb2N1cygpOwogICAgICBpbnN0YW5jZS5oaWRlTG9hZGluZygpOwogICAgfSkuY2F0Y2goZXJyID0+IHsKICAgICAgZXJyb3IoYEVycm9yIGluIGlucHV0VmFsdWUgcHJvbWlzZTogJHtlcnJ9YCk7CiAgICAgIGlucHV0LnZhbHVlID0gJyc7CiAgICAgIHNob3coaW5wdXQpOwogICAgICBpbnB1dC5mb2N1cygpOwogICAgICBpbnN0YW5jZS5oaWRlTG9hZGluZygpOwogICAgfSk7CiAgfTsKICBjb25zdCBwb3B1bGF0ZUlucHV0T3B0aW9ucyA9IHsKICAgIC8qKgogICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wdXAKICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gaW5wdXRPcHRpb25zCiAgICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgICAqLwogICAgc2VsZWN0OiAocG9wdXAsIGlucHV0T3B0aW9ucywgcGFyYW1zKSA9PiB7CiAgICAgIGNvbnN0IHNlbGVjdCA9IGdldERpcmVjdENoaWxkQnlDbGFzcyhwb3B1cCwgc3dhbENsYXNzZXMuc2VsZWN0KTsKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhcmVudAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTGFiZWwKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvblZhbHVlCiAgICAgICAqLwogICAgICBjb25zdCByZW5kZXJPcHRpb24gPSAocGFyZW50LCBvcHRpb25MYWJlbCwgb3B0aW9uVmFsdWUpID0+IHsKICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsKICAgICAgICBvcHRpb24udmFsdWUgPSBvcHRpb25WYWx1ZTsKICAgICAgICBzZXRJbm5lckh0bWwob3B0aW9uLCBvcHRpb25MYWJlbCk7CiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gaXNTZWxlY3RlZChvcHRpb25WYWx1ZSwgcGFyYW1zLmlucHV0VmFsdWUpOwogICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChvcHRpb24pOwogICAgICB9OwogICAgICBpbnB1dE9wdGlvbnMuZm9yRWFjaChpbnB1dE9wdGlvbiA9PiB7CiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBpbnB1dE9wdGlvblswXTsKICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IGlucHV0T3B0aW9uWzFdOwogICAgICAgIC8vIDxvcHRncm91cD4gc3BlYzoKICAgICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDQwMS9pbnRlcmFjdC9mb3Jtcy5odG1sI2gtMTcuNgogICAgICAgIC8vICIuLi5hbGwgT1BUR1JPVVAgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgd2l0aGluIGEgU0VMRUNUIGVsZW1lbnQgKGkuZS4sIGdyb3VwcyBtYXkgbm90IGJlIG5lc3RlZCkuLi4iCiAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGlzIGlzIGEgPG9wdGdyb3VwPgogICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbkxhYmVsKSkgewogICAgICAgICAgLy8gaWYgaXQgaXMgYW4gYXJyYXksIHRoZW4gaXQgaXMgYW4gPG9wdGdyb3VwPgogICAgICAgICAgY29uc3Qgb3B0Z3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRncm91cCcpOwogICAgICAgICAgb3B0Z3JvdXAubGFiZWwgPSBvcHRpb25WYWx1ZTsKICAgICAgICAgIG9wdGdyb3VwLmRpc2FibGVkID0gZmFsc2U7IC8vIG5vdCBjb25maWd1cmFibGUgZm9yIG5vdwogICAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKG9wdGdyb3VwKTsKICAgICAgICAgIG9wdGlvbkxhYmVsLmZvckVhY2gobyA9PiByZW5kZXJPcHRpb24ob3B0Z3JvdXAsIG9bMV0sIG9bMF0pKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gY2FzZSBvZiA8b3B0aW9uPgogICAgICAgICAgcmVuZGVyT3B0aW9uKHNlbGVjdCwgb3B0aW9uTGFiZWwsIG9wdGlvblZhbHVlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBzZWxlY3QuZm9jdXMoKTsKICAgIH0sCiAgICAvKioKICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBvcHVwCiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGlucHV0T3B0aW9ucwogICAgICogQHBhcmFtIHtTd2VldEFsZXJ0T3B0aW9uc30gcGFyYW1zCiAgICAgKi8KICAgIHJhZGlvOiAocG9wdXAsIGlucHV0T3B0aW9ucywgcGFyYW1zKSA9PiB7CiAgICAgIGNvbnN0IHJhZGlvID0gZ2V0RGlyZWN0Q2hpbGRCeUNsYXNzKHBvcHVwLCBzd2FsQ2xhc3Nlcy5yYWRpbyk7CiAgICAgIGlucHV0T3B0aW9ucy5mb3JFYWNoKGlucHV0T3B0aW9uID0+IHsKICAgICAgICBjb25zdCByYWRpb1ZhbHVlID0gaW5wdXRPcHRpb25bMF07CiAgICAgICAgY29uc3QgcmFkaW9MYWJlbCA9IGlucHV0T3B0aW9uWzFdOwogICAgICAgIGNvbnN0IHJhZGlvSW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOwogICAgICAgIGNvbnN0IHJhZGlvTGFiZWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTsKICAgICAgICByYWRpb0lucHV0LnR5cGUgPSAncmFkaW8nOwogICAgICAgIHJhZGlvSW5wdXQubmFtZSA9IHN3YWxDbGFzc2VzLnJhZGlvOwogICAgICAgIHJhZGlvSW5wdXQudmFsdWUgPSByYWRpb1ZhbHVlOwogICAgICAgIGlmIChpc1NlbGVjdGVkKHJhZGlvVmFsdWUsIHBhcmFtcy5pbnB1dFZhbHVlKSkgewogICAgICAgICAgcmFkaW9JbnB1dC5jaGVja2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgICAgICAgc2V0SW5uZXJIdG1sKGxhYmVsLCByYWRpb0xhYmVsKTsKICAgICAgICBsYWJlbC5jbGFzc05hbWUgPSBzd2FsQ2xhc3Nlcy5sYWJlbDsKICAgICAgICByYWRpb0xhYmVsRWxlbWVudC5hcHBlbmRDaGlsZChyYWRpb0lucHV0KTsKICAgICAgICByYWRpb0xhYmVsRWxlbWVudC5hcHBlbmRDaGlsZChsYWJlbCk7CiAgICAgICAgcmFkaW8uYXBwZW5kQ2hpbGQocmFkaW9MYWJlbEVsZW1lbnQpOwogICAgICB9KTsKICAgICAgY29uc3QgcmFkaW9zID0gcmFkaW8ucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQnKTsKICAgICAgaWYgKHJhZGlvcy5sZW5ndGgpIHsKICAgICAgICByYWRpb3NbMF0uZm9jdXMoKTsKICAgICAgfQogICAgfQogIH07CgogIC8qKgogICAqIENvbnZlcnRzIGBpbnB1dE9wdGlvbnNgIGludG8gYW4gYXJyYXkgb2YgYFt2YWx1ZSwgbGFiZWxdYHMKICAgKgogICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gaW5wdXRPcHRpb25zCiAgICogQHJldHVybnMge0FycmF5PEFycmF5PHN0cmluZz4+fQogICAqLwogIGNvbnN0IGZvcm1hdElucHV0T3B0aW9ucyA9IGlucHV0T3B0aW9ucyA9PiB7CiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIGlmICh0eXBlb2YgTWFwICE9PSAndW5kZWZpbmVkJyAmJiBpbnB1dE9wdGlvbnMgaW5zdGFuY2VvZiBNYXApIHsKICAgICAgaW5wdXRPcHRpb25zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHsKICAgICAgICBsZXQgdmFsdWVGb3JtYXR0ZWQgPSB2YWx1ZTsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlRm9ybWF0dGVkID09PSAnb2JqZWN0JykgewogICAgICAgICAgLy8gY2FzZSBvZiA8b3B0Z3JvdXA+CiAgICAgICAgICB2YWx1ZUZvcm1hdHRlZCA9IGZvcm1hdElucHV0T3B0aW9ucyh2YWx1ZUZvcm1hdHRlZCk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5wdXNoKFtrZXksIHZhbHVlRm9ybWF0dGVkXSk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgT2JqZWN0LmtleXMoaW5wdXRPcHRpb25zKS5mb3JFYWNoKGtleSA9PiB7CiAgICAgICAgbGV0IHZhbHVlRm9ybWF0dGVkID0gaW5wdXRPcHRpb25zW2tleV07CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZUZvcm1hdHRlZCA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgIC8vIGNhc2Ugb2YgPG9wdGdyb3VwPgogICAgICAgICAgdmFsdWVGb3JtYXR0ZWQgPSBmb3JtYXRJbnB1dE9wdGlvbnModmFsdWVGb3JtYXR0ZWQpOwogICAgICAgIH0KICAgICAgICByZXN1bHQucHVzaChba2V5LCB2YWx1ZUZvcm1hdHRlZF0pOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvblZhbHVlCiAgICogQHBhcmFtIHtJbnB1dFZhbHVlIHwgUHJvbWlzZTxJbnB1dFZhbHVlPiB8IHsgdG9Qcm9taXNlOiAoKSA9PiBJbnB1dFZhbHVlIH19IGlucHV0VmFsdWUKICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0KICAgKi8KICBjb25zdCBpc1NlbGVjdGVkID0gKG9wdGlvblZhbHVlLCBpbnB1dFZhbHVlKSA9PiB7CiAgICByZXR1cm4gaW5wdXRWYWx1ZSAmJiBpbnB1dFZhbHVlLnRvU3RyaW5nKCkgPT09IG9wdGlvblZhbHVlLnRvU3RyaW5nKCk7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKi8KICBjb25zdCBoYW5kbGVDb25maXJtQnV0dG9uQ2xpY2sgPSBpbnN0YW5jZSA9PiB7CiAgICBjb25zdCBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UpOwogICAgaW5zdGFuY2UuZGlzYWJsZUJ1dHRvbnMoKTsKICAgIGlmIChpbm5lclBhcmFtcy5pbnB1dCkgewogICAgICBoYW5kbGVDb25maXJtT3JEZW55V2l0aElucHV0KGluc3RhbmNlLCAnY29uZmlybScpOwogICAgfSBlbHNlIHsKICAgICAgY29uZmlybShpbnN0YW5jZSwgdHJ1ZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKi8KICBjb25zdCBoYW5kbGVEZW55QnV0dG9uQ2xpY2sgPSBpbnN0YW5jZSA9PiB7CiAgICBjb25zdCBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UpOwogICAgaW5zdGFuY2UuZGlzYWJsZUJ1dHRvbnMoKTsKICAgIGlmIChpbm5lclBhcmFtcy5yZXR1cm5JbnB1dFZhbHVlT25EZW55KSB7CiAgICAgIGhhbmRsZUNvbmZpcm1PckRlbnlXaXRoSW5wdXQoaW5zdGFuY2UsICdkZW55Jyk7CiAgICB9IGVsc2UgewogICAgICBkZW55KGluc3RhbmNlLCBmYWxzZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkaXNtaXNzV2l0aAogICAqLwogIGNvbnN0IGhhbmRsZUNhbmNlbEJ1dHRvbkNsaWNrID0gKGluc3RhbmNlLCBkaXNtaXNzV2l0aCkgPT4gewogICAgaW5zdGFuY2UuZGlzYWJsZUJ1dHRvbnMoKTsKICAgIGRpc21pc3NXaXRoKERpc21pc3NSZWFzb24uY2FuY2VsKTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7J2NvbmZpcm0nIHwgJ2RlbnknfSB0eXBlCiAgICovCiAgY29uc3QgaGFuZGxlQ29uZmlybU9yRGVueVdpdGhJbnB1dCA9IChpbnN0YW5jZSwgdHlwZSkgPT4gewogICAgY29uc3QgaW5uZXJQYXJhbXMgPSBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuZ2V0KGluc3RhbmNlKTsKICAgIGlmICghaW5uZXJQYXJhbXMuaW5wdXQpIHsKICAgICAgZXJyb3IoYFRoZSAiaW5wdXQiIHBhcmFtZXRlciBpcyBuZWVkZWQgdG8gYmUgc2V0IHdoZW4gdXNpbmcgcmV0dXJuSW5wdXRWYWx1ZU9uJHtjYXBpdGFsaXplRmlyc3RMZXR0ZXIodHlwZSl9YCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IGlucHV0VmFsdWUgPSBnZXRJbnB1dFZhbHVlKGluc3RhbmNlLCBpbm5lclBhcmFtcyk7CiAgICBpZiAoaW5uZXJQYXJhbXMuaW5wdXRWYWxpZGF0b3IpIHsKICAgICAgaGFuZGxlSW5wdXRWYWxpZGF0b3IoaW5zdGFuY2UsIGlucHV0VmFsdWUsIHR5cGUpOwogICAgfSBlbHNlIGlmICghaW5zdGFuY2UuZ2V0SW5wdXQoKS5jaGVja1ZhbGlkaXR5KCkpIHsKICAgICAgaW5zdGFuY2UuZW5hYmxlQnV0dG9ucygpOwogICAgICBpbnN0YW5jZS5zaG93VmFsaWRhdGlvbk1lc3NhZ2UoaW5uZXJQYXJhbXMudmFsaWRhdGlvbk1lc3NhZ2UpOwogICAgfSBlbHNlIGlmICh0eXBlID09PSAnZGVueScpIHsKICAgICAgZGVueShpbnN0YW5jZSwgaW5wdXRWYWx1ZSk7CiAgICB9IGVsc2UgewogICAgICBjb25maXJtKGluc3RhbmNlLCBpbnB1dFZhbHVlKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgRmlsZSB8IEZpbGVMaXN0IHwgbnVsbH0gaW5wdXRWYWx1ZQogICAqIEBwYXJhbSB7J2NvbmZpcm0nIHwgJ2RlbnknfSB0eXBlCiAgICovCiAgY29uc3QgaGFuZGxlSW5wdXRWYWxpZGF0b3IgPSAoaW5zdGFuY2UsIGlucHV0VmFsdWUsIHR5cGUpID0+IHsKICAgIGNvbnN0IGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSk7CiAgICBpbnN0YW5jZS5kaXNhYmxlSW5wdXQoKTsKICAgIGNvbnN0IHZhbGlkYXRpb25Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBhc1Byb21pc2UoaW5uZXJQYXJhbXMuaW5wdXRWYWxpZGF0b3IoaW5wdXRWYWx1ZSwgaW5uZXJQYXJhbXMudmFsaWRhdGlvbk1lc3NhZ2UpKSk7CiAgICB2YWxpZGF0aW9uUHJvbWlzZS50aGVuKHZhbGlkYXRpb25NZXNzYWdlID0+IHsKICAgICAgaW5zdGFuY2UuZW5hYmxlQnV0dG9ucygpOwogICAgICBpbnN0YW5jZS5lbmFibGVJbnB1dCgpOwogICAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2UpIHsKICAgICAgICBpbnN0YW5jZS5zaG93VmFsaWRhdGlvbk1lc3NhZ2UodmFsaWRhdGlvbk1lc3NhZ2UpOwogICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdkZW55JykgewogICAgICAgIGRlbnkoaW5zdGFuY2UsIGlucHV0VmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbmZpcm0oaW5zdGFuY2UsIGlucHV0VmFsdWUpOwogICAgICB9CiAgICB9KTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7YW55fSB2YWx1ZQogICAqLwogIGNvbnN0IGRlbnkgPSAoaW5zdGFuY2UsIHZhbHVlKSA9PiB7CiAgICBjb25zdCBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UgfHwgdW5kZWZpbmVkKTsKICAgIGlmIChpbm5lclBhcmFtcy5zaG93TG9hZGVyT25EZW55KSB7CiAgICAgIHNob3dMb2FkaW5nKGdldERlbnlCdXR0b24oKSk7CiAgICB9CiAgICBpZiAoaW5uZXJQYXJhbXMucHJlRGVueSkgewogICAgICBwcml2YXRlUHJvcHMuYXdhaXRpbmdQcm9taXNlLnNldChpbnN0YW5jZSB8fCB1bmRlZmluZWQsIHRydWUpOyAvLyBGbGFnZ2luZyB0aGUgaW5zdGFuY2UgYXMgYXdhaXRpbmcgYSBwcm9taXNlIHNvIGl0J3Mgb3duIHByb21pc2UncyByZWplY3QvcmVzb2x2ZSBtZXRob2RzIGRvZXNuJ3QgZ2V0IGRlc3Ryb3llZCB1bnRpbCB0aGUgcmVzdWx0IGZyb20gdGhpcyBwcmVEZW55J3MgcHJvbWlzZSBpcyByZWNlaXZlZAogICAgICBjb25zdCBwcmVEZW55UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gYXNQcm9taXNlKGlubmVyUGFyYW1zLnByZURlbnkodmFsdWUsIGlubmVyUGFyYW1zLnZhbGlkYXRpb25NZXNzYWdlKSkpOwogICAgICBwcmVEZW55UHJvbWlzZS50aGVuKHByZURlbnlWYWx1ZSA9PiB7CiAgICAgICAgaWYgKHByZURlbnlWYWx1ZSA9PT0gZmFsc2UpIHsKICAgICAgICAgIGluc3RhbmNlLmhpZGVMb2FkaW5nKCk7CiAgICAgICAgICBoYW5kbGVBd2FpdGluZ1Byb21pc2UoaW5zdGFuY2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbnN0YW5jZS5jbG9zZSh7CiAgICAgICAgICAgIGlzRGVuaWVkOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogdHlwZW9mIHByZURlbnlWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyB2YWx1ZSA6IHByZURlbnlWYWx1ZQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KS5jYXRjaChlcnJvciA9PiByZWplY3RXaXRoKGluc3RhbmNlIHx8IHVuZGVmaW5lZCwgZXJyb3IpKTsKICAgIH0gZWxzZSB7CiAgICAgIGluc3RhbmNlLmNsb3NlKHsKICAgICAgICBpc0RlbmllZDogdHJ1ZSwKICAgICAgICB2YWx1ZQogICAgICB9KTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7YW55fSB2YWx1ZQogICAqLwogIGNvbnN0IHN1Y2NlZWRXaXRoID0gKGluc3RhbmNlLCB2YWx1ZSkgPT4gewogICAgaW5zdGFuY2UuY2xvc2UoewogICAgICBpc0NvbmZpcm1lZDogdHJ1ZSwKICAgICAgdmFsdWUKICAgIH0pOwogIH07CgogIC8qKgogICAqCiAgICogQHBhcmFtIHtTd2VldEFsZXJ0Mn0gaW5zdGFuY2UKICAgKiBAcGFyYW0ge3N0cmluZ30gZXJyb3IKICAgKi8KICBjb25zdCByZWplY3RXaXRoID0gKGluc3RhbmNlLCBlcnJvcikgPT4gewogICAgLy8gQHRzLWlnbm9yZQogICAgaW5zdGFuY2UucmVqZWN0UHJvbWlzZShlcnJvcik7CiAgfTsKCiAgLyoqCiAgICoKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEBwYXJhbSB7YW55fSB2YWx1ZQogICAqLwogIGNvbnN0IGNvbmZpcm0gPSAoaW5zdGFuY2UsIHZhbHVlKSA9PiB7CiAgICBjb25zdCBpbm5lclBhcmFtcyA9IHByaXZhdGVQcm9wcy5pbm5lclBhcmFtcy5nZXQoaW5zdGFuY2UgfHwgdW5kZWZpbmVkKTsKICAgIGlmIChpbm5lclBhcmFtcy5zaG93TG9hZGVyT25Db25maXJtKSB7CiAgICAgIHNob3dMb2FkaW5nKCk7CiAgICB9CiAgICBpZiAoaW5uZXJQYXJhbXMucHJlQ29uZmlybSkgewogICAgICBpbnN0YW5jZS5yZXNldFZhbGlkYXRpb25NZXNzYWdlKCk7CiAgICAgIHByaXZhdGVQcm9wcy5hd2FpdGluZ1Byb21pc2Uuc2V0KGluc3RhbmNlIHx8IHVuZGVmaW5lZCwgdHJ1ZSk7IC8vIEZsYWdnaW5nIHRoZSBpbnN0YW5jZSBhcyBhd2FpdGluZyBhIHByb21pc2Ugc28gaXQncyBvd24gcHJvbWlzZSdzIHJlamVjdC9yZXNvbHZlIG1ldGhvZHMgZG9lc24ndCBnZXQgZGVzdHJveWVkIHVudGlsIHRoZSByZXN1bHQgZnJvbSB0aGlzIHByZUNvbmZpcm0ncyBwcm9taXNlIGlzIHJlY2VpdmVkCiAgICAgIGNvbnN0IHByZUNvbmZpcm1Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBhc1Byb21pc2UoaW5uZXJQYXJhbXMucHJlQ29uZmlybSh2YWx1ZSwgaW5uZXJQYXJhbXMudmFsaWRhdGlvbk1lc3NhZ2UpKSk7CiAgICAgIHByZUNvbmZpcm1Qcm9taXNlLnRoZW4ocHJlQ29uZmlybVZhbHVlID0+IHsKICAgICAgICBpZiAoaXNWaXNpYmxlJDEoZ2V0VmFsaWRhdGlvbk1lc3NhZ2UoKSkgfHwgcHJlQ29uZmlybVZhbHVlID09PSBmYWxzZSkgewogICAgICAgICAgaW5zdGFuY2UuaGlkZUxvYWRpbmcoKTsKICAgICAgICAgIGhhbmRsZUF3YWl0aW5nUHJvbWlzZShpbnN0YW5jZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN1Y2NlZWRXaXRoKGluc3RhbmNlLCB0eXBlb2YgcHJlQ29uZmlybVZhbHVlID09PSAndW5kZWZpbmVkJyA/IHZhbHVlIDogcHJlQ29uZmlybVZhbHVlKTsKICAgICAgICB9CiAgICAgIH0pLmNhdGNoKGVycm9yID0+IHJlamVjdFdpdGgoaW5zdGFuY2UgfHwgdW5kZWZpbmVkLCBlcnJvcikpOwogICAgfSBlbHNlIHsKICAgICAgc3VjY2VlZFdpdGgoaW5zdGFuY2UsIHZhbHVlKTsKICAgIH0KICB9OwoKICBjb25zdCBoYW5kbGVQb3B1cENsaWNrID0gKGluc3RhbmNlLCBkb21DYWNoZSwgZGlzbWlzc1dpdGgpID0+IHsKICAgIGNvbnN0IGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSk7CiAgICBpZiAoaW5uZXJQYXJhbXMudG9hc3QpIHsKICAgICAgaGFuZGxlVG9hc3RDbGljayhpbnN0YW5jZSwgZG9tQ2FjaGUsIGRpc21pc3NXaXRoKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIElnbm9yZSBjbGljayBldmVudHMgdGhhdCBoYWQgbW91c2Vkb3duIG9uIHRoZSBwb3B1cCBidXQgbW91c2V1cCBvbiB0aGUgY29udGFpbmVyCiAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSB1c2VyIGRyYWdzIGEgc2xpZGVyCiAgICAgIGhhbmRsZU1vZGFsTW91c2Vkb3duKGRvbUNhY2hlKTsKCiAgICAgIC8vIElnbm9yZSBjbGljayBldmVudHMgdGhhdCBoYWQgbW91c2Vkb3duIG9uIHRoZSBjb250YWluZXIgYnV0IG1vdXNldXAgb24gdGhlIHBvcHVwCiAgICAgIGhhbmRsZUNvbnRhaW5lck1vdXNlZG93bihkb21DYWNoZSk7CiAgICAgIGhhbmRsZU1vZGFsQ2xpY2soaW5zdGFuY2UsIGRvbUNhY2hlLCBkaXNtaXNzV2l0aCk7CiAgICB9CiAgfTsKICBjb25zdCBoYW5kbGVUb2FzdENsaWNrID0gKGluc3RhbmNlLCBkb21DYWNoZSwgZGlzbWlzc1dpdGgpID0+IHsKICAgIC8vIENsb3NpbmcgdG9hc3QgYnkgaW50ZXJuYWwgY2xpY2sKICAgIGRvbUNhY2hlLnBvcHVwLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIGNvbnN0IGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSk7CiAgICAgIGlmIChpbm5lclBhcmFtcyAmJiAoaXNBbnlCdXR0b25TaG93bihpbm5lclBhcmFtcykgfHwgaW5uZXJQYXJhbXMudGltZXIgfHwgaW5uZXJQYXJhbXMuaW5wdXQpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGRpc21pc3NXaXRoKERpc21pc3NSZWFzb24uY2xvc2UpOwogICAgfTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0geyp9IGlubmVyUGFyYW1zCiAgICogQHJldHVybnMge2Jvb2xlYW59CiAgICovCiAgY29uc3QgaXNBbnlCdXR0b25TaG93biA9IGlubmVyUGFyYW1zID0+IHsKICAgIHJldHVybiBpbm5lclBhcmFtcy5zaG93Q29uZmlybUJ1dHRvbiB8fCBpbm5lclBhcmFtcy5zaG93RGVueUJ1dHRvbiB8fCBpbm5lclBhcmFtcy5zaG93Q2FuY2VsQnV0dG9uIHx8IGlubmVyUGFyYW1zLnNob3dDbG9zZUJ1dHRvbjsKICB9OwogIGxldCBpZ25vcmVPdXRzaWRlQ2xpY2sgPSBmYWxzZTsKICBjb25zdCBoYW5kbGVNb2RhbE1vdXNlZG93biA9IGRvbUNhY2hlID0+IHsKICAgIGRvbUNhY2hlLnBvcHVwLm9ubW91c2Vkb3duID0gKCkgPT4gewogICAgICBkb21DYWNoZS5jb250YWluZXIub25tb3VzZXVwID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICBkb21DYWNoZS5jb250YWluZXIub25tb3VzZXVwID0gdW5kZWZpbmVkOwogICAgICAgIC8vIFdlIG9ubHkgY2hlY2sgaWYgdGhlIG1vdXNldXAgdGFyZ2V0IGlzIHRoZSBjb250YWluZXIgYmVjYXVzZSB1c3VhbGx5IGl0IGRvZXNuJ3QKICAgICAgICAvLyBoYXZlIGFueSBvdGhlciBkaXJlY3QgY2hpbGRyZW4gYXNpZGUgb2YgdGhlIHBvcHVwCiAgICAgICAgaWYgKGUudGFyZ2V0ID09PSBkb21DYWNoZS5jb250YWluZXIpIHsKICAgICAgICAgIGlnbm9yZU91dHNpZGVDbGljayA9IHRydWU7CiAgICAgICAgfQogICAgICB9OwogICAgfTsKICB9OwogIGNvbnN0IGhhbmRsZUNvbnRhaW5lck1vdXNlZG93biA9IGRvbUNhY2hlID0+IHsKICAgIGRvbUNhY2hlLmNvbnRhaW5lci5vbm1vdXNlZG93biA9ICgpID0+IHsKICAgICAgZG9tQ2FjaGUucG9wdXAub25tb3VzZXVwID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICBkb21DYWNoZS5wb3B1cC5vbm1vdXNldXAgPSB1bmRlZmluZWQ7CiAgICAgICAgLy8gV2UgYWxzbyBuZWVkIHRvIGNoZWNrIGlmIHRoZSBtb3VzZXVwIHRhcmdldCBpcyBhIGNoaWxkIG9mIHRoZSBwb3B1cAogICAgICAgIGlmIChlLnRhcmdldCA9PT0gZG9tQ2FjaGUucG9wdXAgfHwgZG9tQ2FjaGUucG9wdXAuY29udGFpbnMoZS50YXJnZXQpKSB7CiAgICAgICAgICBpZ25vcmVPdXRzaWRlQ2xpY2sgPSB0cnVlOwogICAgICAgIH0KICAgICAgfTsKICAgIH07CiAgfTsKICBjb25zdCBoYW5kbGVNb2RhbENsaWNrID0gKGluc3RhbmNlLCBkb21DYWNoZSwgZGlzbWlzc1dpdGgpID0+IHsKICAgIGRvbUNhY2hlLmNvbnRhaW5lci5vbmNsaWNrID0gZSA9PiB7CiAgICAgIGNvbnN0IGlubmVyUGFyYW1zID0gcHJpdmF0ZVByb3BzLmlubmVyUGFyYW1zLmdldChpbnN0YW5jZSk7CiAgICAgIGlmIChpZ25vcmVPdXRzaWRlQ2xpY2spIHsKICAgICAgICBpZ25vcmVPdXRzaWRlQ2xpY2sgPSBmYWxzZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKGUudGFyZ2V0ID09PSBkb21DYWNoZS5jb250YWluZXIgJiYgY2FsbElmRnVuY3Rpb24oaW5uZXJQYXJhbXMuYWxsb3dPdXRzaWRlQ2xpY2spKSB7CiAgICAgICAgZGlzbWlzc1dpdGgoRGlzbWlzc1JlYXNvbi5iYWNrZHJvcCk7CiAgICAgIH0KICAgIH07CiAgfTsKCiAgY29uc3QgaXNKcXVlcnlFbGVtZW50ID0gZWxlbSA9PiB0eXBlb2YgZWxlbSA9PT0gJ29iamVjdCcgJiYgZWxlbS5qcXVlcnk7CiAgY29uc3QgaXNFbGVtZW50ID0gZWxlbSA9PiBlbGVtIGluc3RhbmNlb2YgRWxlbWVudCB8fCBpc0pxdWVyeUVsZW1lbnQoZWxlbSk7CiAgY29uc3QgYXJnc1RvUGFyYW1zID0gYXJncyA9PiB7CiAgICBjb25zdCBwYXJhbXMgPSB7fTsKICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ29iamVjdCcgJiYgIWlzRWxlbWVudChhcmdzWzBdKSkgewogICAgICBPYmplY3QuYXNzaWduKHBhcmFtcywgYXJnc1swXSk7CiAgICB9IGVsc2UgewogICAgICBbJ3RpdGxlJywgJ2h0bWwnLCAnaWNvbiddLmZvckVhY2goKG5hbWUsIGluZGV4KSA9PiB7CiAgICAgICAgY29uc3QgYXJnID0gYXJnc1tpbmRleF07CiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8IGlzRWxlbWVudChhcmcpKSB7CiAgICAgICAgICBwYXJhbXNbbmFtZV0gPSBhcmc7CiAgICAgICAgfSBlbHNlIGlmIChhcmcgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgZXJyb3IoYFVuZXhwZWN0ZWQgdHlwZSBvZiAke25hbWV9ISBFeHBlY3RlZCAic3RyaW5nIiBvciAiRWxlbWVudCIsIGdvdCAke3R5cGVvZiBhcmd9YCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBwYXJhbXM7CiAgfTsKCiAgZnVuY3Rpb24gZmlyZSgpIHsKICAgIGNvbnN0IFN3YWwgPSB0aGlzOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzCiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHsKICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKICAgIH0KICAgIHJldHVybiBuZXcgU3dhbCguLi5hcmdzKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgYW4gZXh0ZW5kZWQgdmVyc2lvbiBvZiBgU3dhbGAgY29udGFpbmluZyBgcGFyYW1zYCBhcyBkZWZhdWx0cy4KICAgKiBVc2VmdWwgZm9yIHJldXNpbmcgU3dhbCBjb25maWd1cmF0aW9uLgogICAqCiAgICogRm9yIGV4YW1wbGU6CiAgICoKICAgKiBCZWZvcmU6CiAgICogY29uc3QgdGV4dFByb21wdE9wdGlvbnMgPSB7IGlucHV0OiAndGV4dCcsIHNob3dDYW5jZWxCdXR0b246IHRydWUgfQogICAqIGNvbnN0IHt2YWx1ZTogZmlyc3ROYW1lfSA9IGF3YWl0IFN3YWwuZmlyZSh7IC4uLnRleHRQcm9tcHRPcHRpb25zLCB0aXRsZTogJ1doYXQgaXMgeW91ciBmaXJzdCBuYW1lPycgfSkKICAgKiBjb25zdCB7dmFsdWU6IGxhc3ROYW1lfSA9IGF3YWl0IFN3YWwuZmlyZSh7IC4uLnRleHRQcm9tcHRPcHRpb25zLCB0aXRsZTogJ1doYXQgaXMgeW91ciBsYXN0IG5hbWU/JyB9KQogICAqCiAgICogQWZ0ZXI6CiAgICogY29uc3QgVGV4dFByb21wdCA9IFN3YWwubWl4aW4oeyBpbnB1dDogJ3RleHQnLCBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlIH0pCiAgICogY29uc3Qge3ZhbHVlOiBmaXJzdE5hbWV9ID0gYXdhaXQgVGV4dFByb21wdCgnV2hhdCBpcyB5b3VyIGZpcnN0IG5hbWU/JykKICAgKiBjb25zdCB7dmFsdWU6IGxhc3ROYW1lfSA9IGF3YWl0IFRleHRQcm9tcHQoJ1doYXQgaXMgeW91ciBsYXN0IG5hbWU/JykKICAgKgogICAqIEBwYXJhbSBtaXhpblBhcmFtcwogICAqLwogIGZ1bmN0aW9uIG1peGluKG1peGluUGFyYW1zKSB7CiAgICBjbGFzcyBNaXhpblN3YWwgZXh0ZW5kcyB0aGlzIHsKICAgICAgX21haW4ocGFyYW1zLCBwcmlvcml0eU1peGluUGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHN1cGVyLl9tYWluKHBhcmFtcywgT2JqZWN0LmFzc2lnbih7fSwgbWl4aW5QYXJhbXMsIHByaW9yaXR5TWl4aW5QYXJhbXMpKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIE1peGluU3dhbDsKICB9CgogIC8qKgogICAqIElmIGB0aW1lcmAgcGFyYW1ldGVyIGlzIHNldCwgcmV0dXJucyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIHRpbWVyIHJlbWFpbmVkLgogICAqIE90aGVyd2lzZSwgcmV0dXJucyB1bmRlZmluZWQuCiAgICoKICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgdW5kZWZpbmVkfQogICAqLwogIGNvbnN0IGdldFRpbWVyTGVmdCA9ICgpID0+IHsKICAgIHJldHVybiBnbG9iYWxTdGF0ZS50aW1lb3V0ICYmIGdsb2JhbFN0YXRlLnRpbWVvdXQuZ2V0VGltZXJMZWZ0KCk7CiAgfTsKCiAgLyoqCiAgICogU3RvcCB0aW1lci4gUmV0dXJucyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIG9mIHRpbWVyIHJlbWFpbmVkLgogICAqIElmIGB0aW1lcmAgcGFyYW1ldGVyIGlzbid0IHNldCwgcmV0dXJucyB1bmRlZmluZWQuCiAgICoKICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgdW5kZWZpbmVkfQogICAqLwogIGNvbnN0IHN0b3BUaW1lciA9ICgpID0+IHsKICAgIGlmIChnbG9iYWxTdGF0ZS50aW1lb3V0KSB7CiAgICAgIHN0b3BUaW1lclByb2dyZXNzQmFyKCk7CiAgICAgIHJldHVybiBnbG9iYWxTdGF0ZS50aW1lb3V0LnN0b3AoKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBSZXN1bWUgdGltZXIuIFJldHVybnMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvZiB0aW1lciByZW1haW5lZC4KICAgKiBJZiBgdGltZXJgIHBhcmFtZXRlciBpc24ndCBzZXQsIHJldHVybnMgdW5kZWZpbmVkLgogICAqCiAgICogQHJldHVybnMge251bWJlciB8IHVuZGVmaW5lZH0KICAgKi8KICBjb25zdCByZXN1bWVUaW1lciA9ICgpID0+IHsKICAgIGlmIChnbG9iYWxTdGF0ZS50aW1lb3V0KSB7CiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGdsb2JhbFN0YXRlLnRpbWVvdXQuc3RhcnQoKTsKICAgICAgYW5pbWF0ZVRpbWVyUHJvZ3Jlc3NCYXIocmVtYWluaW5nKTsKICAgICAgcmV0dXJuIHJlbWFpbmluZzsKICAgIH0KICB9OwoKICAvKioKICAgKiBSZXN1bWUgdGltZXIuIFJldHVybnMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvZiB0aW1lciByZW1haW5lZC4KICAgKiBJZiBgdGltZXJgIHBhcmFtZXRlciBpc24ndCBzZXQsIHJldHVybnMgdW5kZWZpbmVkLgogICAqCiAgICogQHJldHVybnMge251bWJlciB8IHVuZGVmaW5lZH0KICAgKi8KICBjb25zdCB0b2dnbGVUaW1lciA9ICgpID0+IHsKICAgIGNvbnN0IHRpbWVyID0gZ2xvYmFsU3RhdGUudGltZW91dDsKICAgIHJldHVybiB0aW1lciAmJiAodGltZXIucnVubmluZyA/IHN0b3BUaW1lcigpIDogcmVzdW1lVGltZXIoKSk7CiAgfTsKCiAgLyoqCiAgICogSW5jcmVhc2UgdGltZXIuIFJldHVybnMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvZiBhbiB1cGRhdGVkIHRpbWVyLgogICAqIElmIGB0aW1lcmAgcGFyYW1ldGVyIGlzbid0IHNldCwgcmV0dXJucyB1bmRlZmluZWQuCiAgICoKICAgKiBAcGFyYW0ge251bWJlcn0gbgogICAqIEByZXR1cm5zIHtudW1iZXIgfCB1bmRlZmluZWR9CiAgICovCiAgY29uc3QgaW5jcmVhc2VUaW1lciA9IG4gPT4gewogICAgaWYgKGdsb2JhbFN0YXRlLnRpbWVvdXQpIHsKICAgICAgY29uc3QgcmVtYWluaW5nID0gZ2xvYmFsU3RhdGUudGltZW91dC5pbmNyZWFzZShuKTsKICAgICAgYW5pbWF0ZVRpbWVyUHJvZ3Jlc3NCYXIocmVtYWluaW5nLCB0cnVlKTsKICAgICAgcmV0dXJuIHJlbWFpbmluZzsKICAgIH0KICB9OwoKICAvKioKICAgKiBDaGVjayBpZiB0aW1lciBpcyBydW5uaW5nLiBSZXR1cm5zIHRydWUgaWYgdGltZXIgaXMgcnVubmluZwogICAqIG9yIGZhbHNlIGlmIHRpbWVyIGlzIHBhdXNlZCBvciBzdG9wcGVkLgogICAqIElmIGB0aW1lcmAgcGFyYW1ldGVyIGlzbid0IHNldCwgcmV0dXJucyB1bmRlZmluZWQKICAgKgogICAqIEByZXR1cm5zIHtib29sZWFufQogICAqLwogIGNvbnN0IGlzVGltZXJSdW5uaW5nID0gKCkgPT4gewogICAgcmV0dXJuIGdsb2JhbFN0YXRlLnRpbWVvdXQgJiYgZ2xvYmFsU3RhdGUudGltZW91dC5pc1J1bm5pbmcoKTsKICB9OwoKICBsZXQgYm9keUNsaWNrTGlzdGVuZXJBZGRlZCA9IGZhbHNlOwogIGNvbnN0IGNsaWNrSGFuZGxlcnMgPSB7fTsKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIKICAgKi8KICBmdW5jdGlvbiBiaW5kQ2xpY2tIYW5kbGVyKCkgewogICAgbGV0IGF0dHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdkYXRhLXN3YWwtdGVtcGxhdGUnOwogICAgY2xpY2tIYW5kbGVyc1thdHRyXSA9IHRoaXM7CiAgICBpZiAoIWJvZHlDbGlja0xpc3RlbmVyQWRkZWQpIHsKICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGJvZHlDbGlja0xpc3RlbmVyKTsKICAgICAgYm9keUNsaWNrTGlzdGVuZXJBZGRlZCA9IHRydWU7CiAgICB9CiAgfQogIGNvbnN0IGJvZHlDbGlja0xpc3RlbmVyID0gZXZlbnQgPT4gewogICAgZm9yIChsZXQgZWwgPSBldmVudC50YXJnZXQ7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlKSB7CiAgICAgIGZvciAoY29uc3QgYXR0ciBpbiBjbGlja0hhbmRsZXJzKSB7CiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgICAgICBjbGlja0hhbmRsZXJzW2F0dHJdLmZpcmUoewogICAgICAgICAgICB0ZW1wbGF0ZQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKCiAgdmFyIHN0YXRpY01ldGhvZHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICBfX3Byb3RvX186IG51bGwsCiAgICBpc1ZhbGlkUGFyYW1ldGVyOiBpc1ZhbGlkUGFyYW1ldGVyLAogICAgaXNVcGRhdGFibGVQYXJhbWV0ZXI6IGlzVXBkYXRhYmxlUGFyYW1ldGVyLAogICAgaXNEZXByZWNhdGVkUGFyYW1ldGVyOiBpc0RlcHJlY2F0ZWRQYXJhbWV0ZXIsCiAgICBhcmdzVG9QYXJhbXM6IGFyZ3NUb1BhcmFtcywKICAgIGdldENvbnRhaW5lcjogZ2V0Q29udGFpbmVyLAogICAgZ2V0UG9wdXA6IGdldFBvcHVwLAogICAgZ2V0VGl0bGU6IGdldFRpdGxlLAogICAgZ2V0SHRtbENvbnRhaW5lcjogZ2V0SHRtbENvbnRhaW5lciwKICAgIGdldEltYWdlOiBnZXRJbWFnZSwKICAgIGdldEljb246IGdldEljb24sCiAgICBnZXRJY29uQ29udGVudDogZ2V0SWNvbkNvbnRlbnQsCiAgICBnZXRJbnB1dExhYmVsOiBnZXRJbnB1dExhYmVsLAogICAgZ2V0Q2xvc2VCdXR0b246IGdldENsb3NlQnV0dG9uLAogICAgZ2V0QWN0aW9uczogZ2V0QWN0aW9ucywKICAgIGdldENvbmZpcm1CdXR0b246IGdldENvbmZpcm1CdXR0b24sCiAgICBnZXREZW55QnV0dG9uOiBnZXREZW55QnV0dG9uLAogICAgZ2V0Q2FuY2VsQnV0dG9uOiBnZXRDYW5jZWxCdXR0b24sCiAgICBnZXRMb2FkZXI6IGdldExvYWRlciwKICAgIGdldEZvb3RlcjogZ2V0Rm9vdGVyLAogICAgZ2V0VGltZXJQcm9ncmVzc0JhcjogZ2V0VGltZXJQcm9ncmVzc0JhciwKICAgIGdldEZvY3VzYWJsZUVsZW1lbnRzOiBnZXRGb2N1c2FibGVFbGVtZW50cywKICAgIGdldFZhbGlkYXRpb25NZXNzYWdlOiBnZXRWYWxpZGF0aW9uTWVzc2FnZSwKICAgIGdldFByb2dyZXNzU3RlcHM6IGdldFByb2dyZXNzU3RlcHMsCiAgICBpc0xvYWRpbmc6IGlzTG9hZGluZywKICAgIGlzVmlzaWJsZTogaXNWaXNpYmxlLAogICAgY2xpY2tDb25maXJtOiBjbGlja0NvbmZpcm0sCiAgICBjbGlja0Rlbnk6IGNsaWNrRGVueSwKICAgIGNsaWNrQ2FuY2VsOiBjbGlja0NhbmNlbCwKICAgIGZpcmU6IGZpcmUsCiAgICBtaXhpbjogbWl4aW4sCiAgICBzaG93TG9hZGluZzogc2hvd0xvYWRpbmcsCiAgICBlbmFibGVMb2FkaW5nOiBzaG93TG9hZGluZywKICAgIGdldFRpbWVyTGVmdDogZ2V0VGltZXJMZWZ0LAogICAgc3RvcFRpbWVyOiBzdG9wVGltZXIsCiAgICByZXN1bWVUaW1lcjogcmVzdW1lVGltZXIsCiAgICB0b2dnbGVUaW1lcjogdG9nZ2xlVGltZXIsCiAgICBpbmNyZWFzZVRpbWVyOiBpbmNyZWFzZVRpbWVyLAogICAgaXNUaW1lclJ1bm5pbmc6IGlzVGltZXJSdW5uaW5nLAogICAgYmluZENsaWNrSGFuZGxlcjogYmluZENsaWNrSGFuZGxlcgogIH0pOwoKICBjbGFzcyBUaW1lciB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXkKICAgICAqLwogICAgY29uc3RydWN0b3IoY2FsbGJhY2ssIGRlbGF5KSB7CiAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgdGhpcy5yZW1haW5pbmcgPSBkZWxheTsKICAgICAgdGhpcy5ydW5uaW5nID0gZmFsc2U7CiAgICAgIHRoaXMuc3RhcnQoKTsKICAgIH0KICAgIHN0YXJ0KCkgewogICAgICBpZiAoIXRoaXMucnVubmluZykgewogICAgICAgIHRoaXMucnVubmluZyA9IHRydWU7CiAgICAgICAgdGhpcy5zdGFydGVkID0gbmV3IERhdGUoKTsKICAgICAgICB0aGlzLmlkID0gc2V0VGltZW91dCh0aGlzLmNhbGxiYWNrLCB0aGlzLnJlbWFpbmluZyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMucmVtYWluaW5nOwogICAgfQogICAgc3RvcCgpIHsKICAgICAgaWYgKHRoaXMucnVubmluZykgewogICAgICAgIHRoaXMucnVubmluZyA9IGZhbHNlOwogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlkKTsKICAgICAgICB0aGlzLnJlbWFpbmluZyAtPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHRoaXMuc3RhcnRlZC5nZXRUaW1lKCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMucmVtYWluaW5nOwogICAgfQogICAgaW5jcmVhc2UobikgewogICAgICBjb25zdCBydW5uaW5nID0gdGhpcy5ydW5uaW5nOwogICAgICBpZiAocnVubmluZykgewogICAgICAgIHRoaXMuc3RvcCgpOwogICAgICB9CiAgICAgIHRoaXMucmVtYWluaW5nICs9IG47CiAgICAgIGlmIChydW5uaW5nKSB7CiAgICAgICAgdGhpcy5zdGFydCgpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLnJlbWFpbmluZzsKICAgIH0KICAgIGdldFRpbWVyTGVmdCgpIHsKICAgICAgaWYgKHRoaXMucnVubmluZykgewogICAgICAgIHRoaXMuc3RvcCgpOwogICAgICAgIHRoaXMuc3RhcnQoKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5yZW1haW5pbmc7CiAgICB9CiAgICBpc1J1bm5pbmcoKSB7CiAgICAgIHJldHVybiB0aGlzLnJ1bm5pbmc7CiAgICB9CiAgfQoKICBjb25zdCBzd2FsU3RyaW5nUGFyYW1zID0gWydzd2FsLXRpdGxlJywgJ3N3YWwtaHRtbCcsICdzd2FsLWZvb3RlciddOwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKiBAcmV0dXJucyB7U3dlZXRBbGVydE9wdGlvbnN9CiAgICovCiAgY29uc3QgZ2V0VGVtcGxhdGVQYXJhbXMgPSBwYXJhbXMgPT4gewogICAgLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLwogICAgY29uc3QgdGVtcGxhdGUgPSB0eXBlb2YgcGFyYW1zLnRlbXBsYXRlID09PSAnc3RyaW5nJyA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocGFyYW1zLnRlbXBsYXRlKSA6IHBhcmFtcy50ZW1wbGF0ZTsKICAgIGlmICghdGVtcGxhdGUpIHsKICAgICAgcmV0dXJuIHt9OwogICAgfQogICAgLyoqIEB0eXBlIHtEb2N1bWVudEZyYWdtZW50fSAqLwogICAgY29uc3QgdGVtcGxhdGVDb250ZW50ID0gdGVtcGxhdGUuY29udGVudDsKICAgIHNob3dXYXJuaW5nc0ZvckVsZW1lbnRzKHRlbXBsYXRlQ29udGVudCk7CiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuYXNzaWduKGdldFN3YWxQYXJhbXModGVtcGxhdGVDb250ZW50KSwgZ2V0U3dhbEZ1bmN0aW9uUGFyYW1zKHRlbXBsYXRlQ29udGVudCksIGdldFN3YWxCdXR0b25zKHRlbXBsYXRlQ29udGVudCksIGdldFN3YWxJbWFnZSh0ZW1wbGF0ZUNvbnRlbnQpLCBnZXRTd2FsSWNvbih0ZW1wbGF0ZUNvbnRlbnQpLCBnZXRTd2FsSW5wdXQodGVtcGxhdGVDb250ZW50KSwgZ2V0U3dhbFN0cmluZ1BhcmFtcyh0ZW1wbGF0ZUNvbnRlbnQsIHN3YWxTdHJpbmdQYXJhbXMpKTsKICAgIHJldHVybiByZXN1bHQ7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSB0ZW1wbGF0ZUNvbnRlbnQKICAgKiBAcmV0dXJucyB7U3dlZXRBbGVydE9wdGlvbnN9CiAgICovCiAgY29uc3QgZ2V0U3dhbFBhcmFtcyA9IHRlbXBsYXRlQ29udGVudCA9PiB7CiAgICBjb25zdCByZXN1bHQgPSB7fTsKICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnRbXX0gKi8KICAgIGNvbnN0IHN3YWxQYXJhbXMgPSBBcnJheS5mcm9tKHRlbXBsYXRlQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzd2FsLXBhcmFtJykpOwogICAgc3dhbFBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHsKICAgICAgc2hvd1dhcm5pbmdzRm9yQXR0cmlidXRlcyhwYXJhbSwgWyduYW1lJywgJ3ZhbHVlJ10pOwogICAgICBjb25zdCBwYXJhbU5hbWUgPSBwYXJhbS5nZXRBdHRyaWJ1dGUoJ25hbWUnKTsKICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7CiAgICAgIGlmICh0eXBlb2YgZGVmYXVsdFBhcmFtc1twYXJhbU5hbWVdID09PSAnYm9vbGVhbicpIHsKICAgICAgICByZXN1bHRbcGFyYW1OYW1lXSA9IHZhbHVlICE9PSAnZmFsc2UnOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZhdWx0UGFyYW1zW3BhcmFtTmFtZV0gPT09ICdvYmplY3QnKSB7CiAgICAgICAgcmVzdWx0W3BhcmFtTmFtZV0gPSBKU09OLnBhcnNlKHZhbHVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXN1bHRbcGFyYW1OYW1lXSA9IHZhbHVlOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSB0ZW1wbGF0ZUNvbnRlbnQKICAgKiBAcmV0dXJucyB7U3dlZXRBbGVydE9wdGlvbnN9CiAgICovCiAgY29uc3QgZ2V0U3dhbEZ1bmN0aW9uUGFyYW1zID0gdGVtcGxhdGVDb250ZW50ID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IHt9OwogICAgLyoqIEB0eXBlIHtIVE1MRWxlbWVudFtdfSAqLwogICAgY29uc3Qgc3dhbEZ1bmN0aW9ucyA9IEFycmF5LmZyb20odGVtcGxhdGVDb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N3YWwtZnVuY3Rpb24tcGFyYW0nKSk7CiAgICBzd2FsRnVuY3Rpb25zLmZvckVhY2gocGFyYW0gPT4gewogICAgICBjb25zdCBwYXJhbU5hbWUgPSBwYXJhbS5nZXRBdHRyaWJ1dGUoJ25hbWUnKTsKICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7CiAgICAgIHJlc3VsdFtwYXJhbU5hbWVdID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gJHt2YWx1ZX1gKSgpOwogICAgfSk7CiAgICByZXR1cm4gcmVzdWx0OwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gdGVtcGxhdGVDb250ZW50CiAgICogQHJldHVybnMge1N3ZWV0QWxlcnRPcHRpb25zfQogICAqLwogIGNvbnN0IGdldFN3YWxCdXR0b25zID0gdGVtcGxhdGVDb250ZW50ID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IHt9OwogICAgLyoqIEB0eXBlIHtIVE1MRWxlbWVudFtdfSAqLwogICAgY29uc3Qgc3dhbEJ1dHRvbnMgPSBBcnJheS5mcm9tKHRlbXBsYXRlQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzd2FsLWJ1dHRvbicpKTsKICAgIHN3YWxCdXR0b25zLmZvckVhY2goYnV0dG9uID0+IHsKICAgICAgc2hvd1dhcm5pbmdzRm9yQXR0cmlidXRlcyhidXR0b24sIFsndHlwZScsICdjb2xvcicsICdhcmlhLWxhYmVsJ10pOwogICAgICBjb25zdCB0eXBlID0gYnV0dG9uLmdldEF0dHJpYnV0ZSgndHlwZScpOwogICAgICByZXN1bHRbYCR7dHlwZX1CdXR0b25UZXh0YF0gPSBidXR0b24uaW5uZXJIVE1MOwogICAgICByZXN1bHRbYHNob3cke2NhcGl0YWxpemVGaXJzdExldHRlcih0eXBlKX1CdXR0b25gXSA9IHRydWU7CiAgICAgIGlmIChidXR0b24uaGFzQXR0cmlidXRlKCdjb2xvcicpKSB7CiAgICAgICAgcmVzdWx0W2Ake3R5cGV9QnV0dG9uQ29sb3JgXSA9IGJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2NvbG9yJyk7CiAgICAgIH0KICAgICAgaWYgKGJ1dHRvbi5oYXNBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSkgewogICAgICAgIHJlc3VsdFtgJHt0eXBlfUJ1dHRvbkFyaWFMYWJlbGBdID0gYnV0dG9uLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSB0ZW1wbGF0ZUNvbnRlbnQKICAgKiBAcmV0dXJucyB7U3dlZXRBbGVydE9wdGlvbnN9CiAgICovCiAgY29uc3QgZ2V0U3dhbEltYWdlID0gdGVtcGxhdGVDb250ZW50ID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IHt9OwogICAgLyoqIEB0eXBlIHtIVE1MRWxlbWVudH0gKi8KICAgIGNvbnN0IGltYWdlID0gdGVtcGxhdGVDb250ZW50LnF1ZXJ5U2VsZWN0b3IoJ3N3YWwtaW1hZ2UnKTsKICAgIGlmIChpbWFnZSkgewogICAgICBzaG93V2FybmluZ3NGb3JBdHRyaWJ1dGVzKGltYWdlLCBbJ3NyYycsICd3aWR0aCcsICdoZWlnaHQnLCAnYWx0J10pOwogICAgICBpZiAoaW1hZ2UuaGFzQXR0cmlidXRlKCdzcmMnKSkgewogICAgICAgIHJlc3VsdC5pbWFnZVVybCA9IGltYWdlLmdldEF0dHJpYnV0ZSgnc3JjJyk7CiAgICAgIH0KICAgICAgaWYgKGltYWdlLmhhc0F0dHJpYnV0ZSgnd2lkdGgnKSkgewogICAgICAgIHJlc3VsdC5pbWFnZVdpZHRoID0gaW1hZ2UuZ2V0QXR0cmlidXRlKCd3aWR0aCcpOwogICAgICB9CiAgICAgIGlmIChpbWFnZS5oYXNBdHRyaWJ1dGUoJ2hlaWdodCcpKSB7CiAgICAgICAgcmVzdWx0LmltYWdlSGVpZ2h0ID0gaW1hZ2UuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKTsKICAgICAgfQogICAgICBpZiAoaW1hZ2UuaGFzQXR0cmlidXRlKCdhbHQnKSkgewogICAgICAgIHJlc3VsdC5pbWFnZUFsdCA9IGltYWdlLmdldEF0dHJpYnV0ZSgnYWx0Jyk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSB0ZW1wbGF0ZUNvbnRlbnQKICAgKiBAcmV0dXJucyB7U3dlZXRBbGVydE9wdGlvbnN9CiAgICovCiAgY29uc3QgZ2V0U3dhbEljb24gPSB0ZW1wbGF0ZUNvbnRlbnQgPT4gewogICAgY29uc3QgcmVzdWx0ID0ge307CiAgICAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqLwogICAgY29uc3QgaWNvbiA9IHRlbXBsYXRlQ29udGVudC5xdWVyeVNlbGVjdG9yKCdzd2FsLWljb24nKTsKICAgIGlmIChpY29uKSB7CiAgICAgIHNob3dXYXJuaW5nc0ZvckF0dHJpYnV0ZXMoaWNvbiwgWyd0eXBlJywgJ2NvbG9yJ10pOwogICAgICBpZiAoaWNvbi5oYXNBdHRyaWJ1dGUoJ3R5cGUnKSkgewogICAgICAgIC8qKiBAdHlwZSB7U3dlZXRBbGVydEljb259ICovCiAgICAgICAgLy8gQHRzLWlnbm9yZQogICAgICAgIHJlc3VsdC5pY29uID0gaWNvbi5nZXRBdHRyaWJ1dGUoJ3R5cGUnKTsKICAgICAgfQogICAgICBpZiAoaWNvbi5oYXNBdHRyaWJ1dGUoJ2NvbG9yJykpIHsKICAgICAgICByZXN1bHQuaWNvbkNvbG9yID0gaWNvbi5nZXRBdHRyaWJ1dGUoJ2NvbG9yJyk7CiAgICAgIH0KICAgICAgcmVzdWx0Lmljb25IdG1sID0gaWNvbi5pbm5lckhUTUw7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gdGVtcGxhdGVDb250ZW50CiAgICogQHJldHVybnMge1N3ZWV0QWxlcnRPcHRpb25zfQogICAqLwogIGNvbnN0IGdldFN3YWxJbnB1dCA9IHRlbXBsYXRlQ29udGVudCA9PiB7CiAgICBjb25zdCByZXN1bHQgPSB7fTsKICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovCiAgICBjb25zdCBpbnB1dCA9IHRlbXBsYXRlQ29udGVudC5xdWVyeVNlbGVjdG9yKCdzd2FsLWlucHV0Jyk7CiAgICBpZiAoaW5wdXQpIHsKICAgICAgc2hvd1dhcm5pbmdzRm9yQXR0cmlidXRlcyhpbnB1dCwgWyd0eXBlJywgJ2xhYmVsJywgJ3BsYWNlaG9sZGVyJywgJ3ZhbHVlJ10pOwogICAgICAvKiogQHR5cGUge1N3ZWV0QWxlcnRJbnB1dH0gKi8KICAgICAgLy8gQHRzLWlnbm9yZQogICAgICByZXN1bHQuaW5wdXQgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSB8fCAndGV4dCc7CiAgICAgIGlmIChpbnB1dC5oYXNBdHRyaWJ1dGUoJ2xhYmVsJykpIHsKICAgICAgICByZXN1bHQuaW5wdXRMYWJlbCA9IGlucHV0LmdldEF0dHJpYnV0ZSgnbGFiZWwnKTsKICAgICAgfQogICAgICBpZiAoaW5wdXQuaGFzQXR0cmlidXRlKCdwbGFjZWhvbGRlcicpKSB7CiAgICAgICAgcmVzdWx0LmlucHV0UGxhY2Vob2xkZXIgPSBpbnB1dC5nZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJyk7CiAgICAgIH0KICAgICAgaWYgKGlucHV0Lmhhc0F0dHJpYnV0ZSgndmFsdWUnKSkgewogICAgICAgIHJlc3VsdC5pbnB1dFZhbHVlID0gaW5wdXQuZ2V0QXR0cmlidXRlKCd2YWx1ZScpOwogICAgICB9CiAgICB9CiAgICAvKiogQHR5cGUge0hUTUxFbGVtZW50W119ICovCiAgICBjb25zdCBpbnB1dE9wdGlvbnMgPSBBcnJheS5mcm9tKHRlbXBsYXRlQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdzd2FsLWlucHV0LW9wdGlvbicpKTsKICAgIGlmIChpbnB1dE9wdGlvbnMubGVuZ3RoKSB7CiAgICAgIHJlc3VsdC5pbnB1dE9wdGlvbnMgPSB7fTsKICAgICAgaW5wdXRPcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHsKICAgICAgICBzaG93V2FybmluZ3NGb3JBdHRyaWJ1dGVzKG9wdGlvbiwgWyd2YWx1ZSddKTsKICAgICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IG9wdGlvbi5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJyk7CiAgICAgICAgY29uc3Qgb3B0aW9uTmFtZSA9IG9wdGlvbi5pbm5lckhUTUw7CiAgICAgICAgcmVzdWx0LmlucHV0T3B0aW9uc1tvcHRpb25WYWx1ZV0gPSBvcHRpb25OYW1lOwogICAgICB9KTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSB0ZW1wbGF0ZUNvbnRlbnQKICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXJhbU5hbWVzCiAgICogQHJldHVybnMge1N3ZWV0QWxlcnRPcHRpb25zfQogICAqLwogIGNvbnN0IGdldFN3YWxTdHJpbmdQYXJhbXMgPSAodGVtcGxhdGVDb250ZW50LCBwYXJhbU5hbWVzKSA9PiB7CiAgICBjb25zdCByZXN1bHQgPSB7fTsKICAgIGZvciAoY29uc3QgaSBpbiBwYXJhbU5hbWVzKSB7CiAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHBhcmFtTmFtZXNbaV07CiAgICAgIC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovCiAgICAgIGNvbnN0IHRhZyA9IHRlbXBsYXRlQ29udGVudC5xdWVyeVNlbGVjdG9yKHBhcmFtTmFtZSk7CiAgICAgIGlmICh0YWcpIHsKICAgICAgICBzaG93V2FybmluZ3NGb3JBdHRyaWJ1dGVzKHRhZywgW10pOwogICAgICAgIHJlc3VsdFtwYXJhbU5hbWUucmVwbGFjZSgvXnN3YWwtLywgJycpXSA9IHRhZy5pbm5lckhUTUwudHJpbSgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gdGVtcGxhdGVDb250ZW50CiAgICovCiAgY29uc3Qgc2hvd1dhcm5pbmdzRm9yRWxlbWVudHMgPSB0ZW1wbGF0ZUNvbnRlbnQgPT4gewogICAgY29uc3QgYWxsb3dlZEVsZW1lbnRzID0gc3dhbFN0cmluZ1BhcmFtcy5jb25jYXQoWydzd2FsLXBhcmFtJywgJ3N3YWwtZnVuY3Rpb24tcGFyYW0nLCAnc3dhbC1idXR0b24nLCAnc3dhbC1pbWFnZScsICdzd2FsLWljb24nLCAnc3dhbC1pbnB1dCcsICdzd2FsLWlucHV0LW9wdGlvbiddKTsKICAgIEFycmF5LmZyb20odGVtcGxhdGVDb250ZW50LmNoaWxkcmVuKS5mb3JFYWNoKGVsID0+IHsKICAgICAgY29uc3QgdGFnTmFtZSA9IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgaWYgKCFhbGxvd2VkRWxlbWVudHMuaW5jbHVkZXModGFnTmFtZSkpIHsKICAgICAgICB3YXJuKGBVbnJlY29nbml6ZWQgZWxlbWVudCA8JHt0YWdOYW1lfT5gKTsKICAgICAgfQogICAgfSk7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwKICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhbGxvd2VkQXR0cmlidXRlcwogICAqLwogIGNvbnN0IHNob3dXYXJuaW5nc0ZvckF0dHJpYnV0ZXMgPSAoZWwsIGFsbG93ZWRBdHRyaWJ1dGVzKSA9PiB7CiAgICBBcnJheS5mcm9tKGVsLmF0dHJpYnV0ZXMpLmZvckVhY2goYXR0cmlidXRlID0+IHsKICAgICAgaWYgKGFsbG93ZWRBdHRyaWJ1dGVzLmluZGV4T2YoYXR0cmlidXRlLm5hbWUpID09PSAtMSkgewogICAgICAgIHdhcm4oW2BVbnJlY29nbml6ZWQgYXR0cmlidXRlICIke2F0dHJpYnV0ZS5uYW1lfSIgb24gPCR7ZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpfT4uYCwgYCR7YWxsb3dlZEF0dHJpYnV0ZXMubGVuZ3RoID8gYEFsbG93ZWQgYXR0cmlidXRlcyBhcmU6ICR7YWxsb3dlZEF0dHJpYnV0ZXMuam9pbignLCAnKX1gIDogJ1RvIHNldCB0aGUgdmFsdWUsIHVzZSBIVE1MIHdpdGhpbiB0aGUgZWxlbWVudC4nfWBdKTsKICAgICAgfQogICAgfSk7CiAgfTsKCiAgY29uc3QgU0hPV19DTEFTU19USU1FT1VUID0gMTA7CgogIC8qKgogICAqIE9wZW4gcG9wdXAsIGFkZCBuZWNlc3NhcnkgY2xhc3NlcyBhbmQgc3R5bGVzLCBmaXggc2Nyb2xsYmFyCiAgICoKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KICBjb25zdCBvcGVuUG9wdXAgPSBwYXJhbXMgPT4gewogICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7CiAgICBjb25zdCBwb3B1cCA9IGdldFBvcHVwKCk7CiAgICBpZiAodHlwZW9mIHBhcmFtcy53aWxsT3BlbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBwYXJhbXMud2lsbE9wZW4ocG9wdXApOwogICAgfQogICAgY29uc3QgYm9keVN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpOwogICAgY29uc3QgaW5pdGlhbEJvZHlPdmVyZmxvdyA9IGJvZHlTdHlsZXMub3ZlcmZsb3dZOwogICAgYWRkQ2xhc3Nlcyhjb250YWluZXIsIHBvcHVwLCBwYXJhbXMpOwoKICAgIC8vIHNjcm9sbGluZyBpcyAnaGlkZGVuJyB1bnRpbCBhbmltYXRpb24gaXMgZG9uZSwgYWZ0ZXIgdGhhdCAnYXV0bycKICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICBzZXRTY3JvbGxpbmdWaXNpYmlsaXR5KGNvbnRhaW5lciwgcG9wdXApOwogICAgfSwgU0hPV19DTEFTU19USU1FT1VUKTsKICAgIGlmIChpc01vZGFsKCkpIHsKICAgICAgZml4U2Nyb2xsQ29udGFpbmVyKGNvbnRhaW5lciwgcGFyYW1zLnNjcm9sbGJhclBhZGRpbmcsIGluaXRpYWxCb2R5T3ZlcmZsb3cpOwogICAgICBzZXRBcmlhSGlkZGVuKCk7CiAgICB9CiAgICBpZiAoIWlzVG9hc3QoKSAmJiAhZ2xvYmFsU3RhdGUucHJldmlvdXNBY3RpdmVFbGVtZW50KSB7CiAgICAgIGdsb2JhbFN0YXRlLnByZXZpb3VzQWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CiAgICB9CiAgICBpZiAodHlwZW9mIHBhcmFtcy5kaWRPcGVuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gcGFyYW1zLmRpZE9wZW4ocG9wdXApKTsKICAgIH0KICAgIHJlbW92ZUNsYXNzKGNvbnRhaW5lciwgc3dhbENsYXNzZXNbJ25vLXRyYW5zaXRpb24nXSk7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtBbmltYXRpb25FdmVudH0gZXZlbnQKICAgKi8KICBjb25zdCBzd2FsT3BlbkFuaW1hdGlvbkZpbmlzaGVkID0gZXZlbnQgPT4gewogICAgY29uc3QgcG9wdXAgPSBnZXRQb3B1cCgpOwogICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gcG9wdXApIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7CiAgICBwb3B1cC5yZW1vdmVFdmVudExpc3RlbmVyKGFuaW1hdGlvbkVuZEV2ZW50LCBzd2FsT3BlbkFuaW1hdGlvbkZpbmlzaGVkKTsKICAgIGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1kgPSAnYXV0byc7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wdXAKICAgKi8KICBjb25zdCBzZXRTY3JvbGxpbmdWaXNpYmlsaXR5ID0gKGNvbnRhaW5lciwgcG9wdXApID0+IHsKICAgIGlmIChhbmltYXRpb25FbmRFdmVudCAmJiBoYXNDc3NBbmltYXRpb24ocG9wdXApKSB7CiAgICAgIGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvd1kgPSAnaGlkZGVuJzsKICAgICAgcG9wdXAuYWRkRXZlbnRMaXN0ZW5lcihhbmltYXRpb25FbmRFdmVudCwgc3dhbE9wZW5BbmltYXRpb25GaW5pc2hlZCk7CiAgICB9IGVsc2UgewogICAgICBjb250YWluZXIuc3R5bGUub3ZlcmZsb3dZID0gJ2F1dG8nOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lcgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2Nyb2xsYmFyUGFkZGluZwogICAqIEBwYXJhbSB7c3RyaW5nfSBpbml0aWFsQm9keU92ZXJmbG93CiAgICovCiAgY29uc3QgZml4U2Nyb2xsQ29udGFpbmVyID0gKGNvbnRhaW5lciwgc2Nyb2xsYmFyUGFkZGluZywgaW5pdGlhbEJvZHlPdmVyZmxvdykgPT4gewogICAgaU9TZml4KCk7CiAgICBpZiAoc2Nyb2xsYmFyUGFkZGluZyAmJiBpbml0aWFsQm9keU92ZXJmbG93ICE9PSAnaGlkZGVuJykgewogICAgICBmaXhTY3JvbGxiYXIoKTsKICAgIH0KCiAgICAvLyBzd2VldGFsZXJ0Mi9pc3N1ZXMvMTI0NwogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSAwOwogICAgfSk7CiAgfTsKCiAgLyoqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gY29udGFpbmVyCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcG9wdXAKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KICBjb25zdCBhZGRDbGFzc2VzID0gKGNvbnRhaW5lciwgcG9wdXAsIHBhcmFtcykgPT4gewogICAgYWRkQ2xhc3MoY29udGFpbmVyLCBwYXJhbXMuc2hvd0NsYXNzLmJhY2tkcm9wKTsKICAgIC8vIHRoaXMgd29ya2Fyb3VuZCB3aXRoIG9wYWNpdHkgaXMgbmVlZGVkIGZvciBodHRwczovL2dpdGh1Yi5jb20vc3dlZXRhbGVydDIvc3dlZXRhbGVydDIvaXNzdWVzLzIwNTkKICAgIHBvcHVwLnN0eWxlLnNldFByb3BlcnR5KCdvcGFjaXR5JywgJzAnLCAnaW1wb3J0YW50Jyk7CiAgICBzaG93KHBvcHVwLCAnZ3JpZCcpOwogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIC8vIEFuaW1hdGUgcG9wdXAgcmlnaHQgYWZ0ZXIgc2hvd2luZyBpdAogICAgICBhZGRDbGFzcyhwb3B1cCwgcGFyYW1zLnNob3dDbGFzcy5wb3B1cCk7CiAgICAgIC8vIGFuZCByZW1vdmUgdGhlIG9wYWNpdHkgd29ya2Fyb3VuZAogICAgICBwb3B1cC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnb3BhY2l0eScpOwogICAgfSwgU0hPV19DTEFTU19USU1FT1VUKTsgLy8gMTBtcyBpbiBvcmRlciB0byBmaXggIzIwNjIKCiAgICBhZGRDbGFzcyhbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBkb2N1bWVudC5ib2R5XSwgc3dhbENsYXNzZXMuc2hvd24pOwogICAgaWYgKHBhcmFtcy5oZWlnaHRBdXRvICYmIHBhcmFtcy5iYWNrZHJvcCAmJiAhcGFyYW1zLnRvYXN0KSB7CiAgICAgIGFkZENsYXNzKFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLCBzd2FsQ2xhc3Nlc1snaGVpZ2h0LWF1dG8nXSk7CiAgICB9CiAgfTsKCiAgdmFyIGRlZmF1bHRJbnB1dFZhbGlkYXRvcnMgPSB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWxpZGF0aW9uTWVzc2FnZQogICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZCB8IHN0cmluZz59CiAgICAgKi8KICAgIGVtYWlsOiAoc3RyaW5nLCB2YWxpZGF0aW9uTWVzc2FnZSkgPT4gewogICAgICByZXR1cm4gL15bYS16QS1aMC05LitfLV0rQFthLXpBLVowLTkuLV0rXC5bYS16QS1aMC05LV17MiwyNH0kLy50ZXN0KHN0cmluZykgPyBQcm9taXNlLnJlc29sdmUoKSA6IFByb21pc2UucmVzb2x2ZSh2YWxpZGF0aW9uTWVzc2FnZSB8fCAnSW52YWxpZCBlbWFpbCBhZGRyZXNzJyk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsaWRhdGlvbk1lc3NhZ2UKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQgfCBzdHJpbmc+fQogICAgICovCiAgICB1cmw6IChzdHJpbmcsIHZhbGlkYXRpb25NZXNzYWdlKSA9PiB7CiAgICAgIC8vIHRha2VuIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM4MDk0MzUgd2l0aCBhIHNtYWxsIGNoYW5nZSBmcm9tICMxMzA2IGFuZCAjMjAxMwogICAgICByZXR1cm4gL15odHRwcz86XC9cLyh3d3dcLik/Wy1hLXpBLVowLTlAOiUuXyt+Iz1dezEsMjU2fVwuW2Etel17Miw2M31cYihbLWEtekEtWjAtOUA6JV8rLn4jPyYvPV0qKSQvLnRlc3Qoc3RyaW5nKSA/IFByb21pc2UucmVzb2x2ZSgpIDogUHJvbWlzZS5yZXNvbHZlKHZhbGlkYXRpb25NZXNzYWdlIHx8ICdJbnZhbGlkIFVSTCcpOwogICAgfQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwogIGZ1bmN0aW9uIHNldERlZmF1bHRJbnB1dFZhbGlkYXRvcnMocGFyYW1zKSB7CiAgICAvLyBVc2UgZGVmYXVsdCBgaW5wdXRWYWxpZGF0b3JgIGZvciBzdXBwb3J0ZWQgaW5wdXQgdHlwZXMgaWYgbm90IHByb3ZpZGVkCiAgICBpZiAoIXBhcmFtcy5pbnB1dFZhbGlkYXRvcikgewogICAgICBPYmplY3Qua2V5cyhkZWZhdWx0SW5wdXRWYWxpZGF0b3JzKS5mb3JFYWNoKGtleSA9PiB7CiAgICAgICAgaWYgKHBhcmFtcy5pbnB1dCA9PT0ga2V5KSB7CiAgICAgICAgICBwYXJhbXMuaW5wdXRWYWxpZGF0b3IgPSBkZWZhdWx0SW5wdXRWYWxpZGF0b3JzW2tleV07CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHBhcmFtcwogICAqLwogIGZ1bmN0aW9uIHZhbGlkYXRlQ3VzdG9tVGFyZ2V0RWxlbWVudChwYXJhbXMpIHsKICAgIC8vIERldGVybWluZSBpZiB0aGUgY3VzdG9tIHRhcmdldCBlbGVtZW50IGlzIHZhbGlkCiAgICBpZiAoIXBhcmFtcy50YXJnZXQgfHwgdHlwZW9mIHBhcmFtcy50YXJnZXQgPT09ICdzdHJpbmcnICYmICFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHBhcmFtcy50YXJnZXQpIHx8IHR5cGVvZiBwYXJhbXMudGFyZ2V0ICE9PSAnc3RyaW5nJyAmJiAhcGFyYW1zLnRhcmdldC5hcHBlbmRDaGlsZCkgewogICAgICB3YXJuKCdUYXJnZXQgcGFyYW1ldGVyIGlzIG5vdCB2YWxpZCwgZGVmYXVsdGluZyB0byAiYm9keSInKTsKICAgICAgcGFyYW1zLnRhcmdldCA9ICdib2R5JzsKICAgIH0KICB9CgogIC8qKgogICAqIFNldCB0eXBlLCB0ZXh0IGFuZCBhY3Rpb25zIG9uIHBvcHVwCiAgICoKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBwYXJhbXMKICAgKi8KICBmdW5jdGlvbiBzZXRQYXJhbWV0ZXJzKHBhcmFtcykgewogICAgc2V0RGVmYXVsdElucHV0VmFsaWRhdG9ycyhwYXJhbXMpOwoKICAgIC8vIHNob3dMb2FkZXJPbkNvbmZpcm0gJiYgcHJlQ29uZmlybQogICAgaWYgKHBhcmFtcy5zaG93TG9hZGVyT25Db25maXJtICYmICFwYXJhbXMucHJlQ29uZmlybSkgewogICAgICB3YXJuKCdzaG93TG9hZGVyT25Db25maXJtIGlzIHNldCB0byB0cnVlLCBidXQgcHJlQ29uZmlybSBpcyBub3QgZGVmaW5lZC5cbicgKyAnc2hvd0xvYWRlck9uQ29uZmlybSBzaG91bGQgYmUgdXNlZCB0b2dldGhlciB3aXRoIHByZUNvbmZpcm0sIHNlZSB1c2FnZSBleGFtcGxlOlxuJyArICdodHRwczovL3N3ZWV0YWxlcnQyLmdpdGh1Yi5pby8jYWpheC1yZXF1ZXN0Jyk7CiAgICB9CiAgICB2YWxpZGF0ZUN1c3RvbVRhcmdldEVsZW1lbnQocGFyYW1zKTsKCiAgICAvLyBSZXBsYWNlIG5ld2xpbmVzIHdpdGggPGJyPiBpbiB0aXRsZQogICAgaWYgKHR5cGVvZiBwYXJhbXMudGl0bGUgPT09ICdzdHJpbmcnKSB7CiAgICAgIHBhcmFtcy50aXRsZSA9IHBhcmFtcy50aXRsZS5zcGxpdCgnXG4nKS5qb2luKCc8YnIgLz4nKTsKICAgIH0KICAgIGluaXQocGFyYW1zKTsKICB9CgogIGxldCBjdXJyZW50SW5zdGFuY2U7CiAgY2xhc3MgU3dlZXRBbGVydCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgLy8gUHJldmVudCBydW4gaW4gTm9kZSBlbnYKICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGN1cnJlbnRJbnN0YW5jZSA9IHRoaXM7CgogICAgICAvLyBAdHMtaWdub3JlCiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykgewogICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07CiAgICAgIH0KICAgICAgY29uc3Qgb3V0ZXJQYXJhbXMgPSBPYmplY3QuZnJlZXplKHRoaXMuY29uc3RydWN0b3IuYXJnc1RvUGFyYW1zKGFyZ3MpKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywgewogICAgICAgIHBhcmFtczogewogICAgICAgICAgdmFsdWU6IG91dGVyUGFyYW1zLAogICAgICAgICAgd3JpdGFibGU6IGZhbHNlLAogICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgIH0KICAgICAgfSk7CgogICAgICAvLyBAdHMtaWdub3JlCiAgICAgIGNvbnN0IHByb21pc2UgPSBjdXJyZW50SW5zdGFuY2UuX21haW4oY3VycmVudEluc3RhbmNlLnBhcmFtcyk7CiAgICAgIHByaXZhdGVQcm9wcy5wcm9taXNlLnNldCh0aGlzLCBwcm9taXNlKTsKICAgIH0KICAgIF9tYWluKHVzZXJQYXJhbXMpIHsKICAgICAgbGV0IG1peGluUGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTsKICAgICAgc2hvd1dhcm5pbmdzRm9yUGFyYW1zKE9iamVjdC5hc3NpZ24oe30sIG1peGluUGFyYW1zLCB1c2VyUGFyYW1zKSk7CiAgICAgIGlmIChnbG9iYWxTdGF0ZS5jdXJyZW50SW5zdGFuY2UpIHsKICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgZ2xvYmFsU3RhdGUuY3VycmVudEluc3RhbmNlLl9kZXN0cm95KCk7CiAgICAgICAgaWYgKGlzTW9kYWwoKSkgewogICAgICAgICAgdW5zZXRBcmlhSGlkZGVuKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGdsb2JhbFN0YXRlLmN1cnJlbnRJbnN0YW5jZSA9IGN1cnJlbnRJbnN0YW5jZTsKICAgICAgY29uc3QgaW5uZXJQYXJhbXMgPSBwcmVwYXJlUGFyYW1zKHVzZXJQYXJhbXMsIG1peGluUGFyYW1zKTsKICAgICAgc2V0UGFyYW1ldGVycyhpbm5lclBhcmFtcyk7CiAgICAgIE9iamVjdC5mcmVlemUoaW5uZXJQYXJhbXMpOwoKICAgICAgLy8gY2xlYXIgdGhlIHByZXZpb3VzIHRpbWVyCiAgICAgIGlmIChnbG9iYWxTdGF0ZS50aW1lb3V0KSB7CiAgICAgICAgZ2xvYmFsU3RhdGUudGltZW91dC5zdG9wKCk7CiAgICAgICAgZGVsZXRlIGdsb2JhbFN0YXRlLnRpbWVvdXQ7CiAgICAgIH0KCiAgICAgIC8vIGNsZWFyIHRoZSByZXN0b3JlIGZvY3VzIHRpbWVvdXQKICAgICAgY2xlYXJUaW1lb3V0KGdsb2JhbFN0YXRlLnJlc3RvcmVGb2N1c1RpbWVvdXQpOwogICAgICBjb25zdCBkb21DYWNoZSA9IHBvcHVsYXRlRG9tQ2FjaGUoY3VycmVudEluc3RhbmNlKTsKICAgICAgcmVuZGVyKGN1cnJlbnRJbnN0YW5jZSwgaW5uZXJQYXJhbXMpOwogICAgICBwcml2YXRlUHJvcHMuaW5uZXJQYXJhbXMuc2V0KGN1cnJlbnRJbnN0YW5jZSwgaW5uZXJQYXJhbXMpOwogICAgICByZXR1cm4gc3dhbFByb21pc2UoY3VycmVudEluc3RhbmNlLCBkb21DYWNoZSwgaW5uZXJQYXJhbXMpOwogICAgfQoKICAgIC8vIGBjYXRjaGAgY2Fubm90IGJlIHRoZSBuYW1lIG9mIGEgbW9kdWxlIGV4cG9ydCwgc28gd2UgZGVmaW5lIG91ciB0aGVuYWJsZSBtZXRob2RzIGhlcmUgaW5zdGVhZAogICAgdGhlbihvbkZ1bGZpbGxlZCkgewogICAgICBjb25zdCBwcm9taXNlID0gcHJpdmF0ZVByb3BzLnByb21pc2UuZ2V0KHRoaXMpOwogICAgICByZXR1cm4gcHJvbWlzZS50aGVuKG9uRnVsZmlsbGVkKTsKICAgIH0KICAgIGZpbmFsbHkob25GaW5hbGx5KSB7CiAgICAgIGNvbnN0IHByb21pc2UgPSBwcml2YXRlUHJvcHMucHJvbWlzZS5nZXQodGhpcyk7CiAgICAgIHJldHVybiBwcm9taXNlLmZpbmFsbHkob25GaW5hbGx5KTsKICAgIH0KICB9CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydDJ9IGluc3RhbmNlCiAgICogQHBhcmFtIHtEb21DYWNoZX0gZG9tQ2FjaGUKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBpbm5lclBhcmFtcwogICAqIEByZXR1cm5zIHtQcm9taXNlfQogICAqLwogIGNvbnN0IHN3YWxQcm9taXNlID0gKGluc3RhbmNlLCBkb21DYWNoZSwgaW5uZXJQYXJhbXMpID0+IHsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgIC8vIGZ1bmN0aW9ucyB0byBoYW5kbGUgYWxsIGNsb3NpbmdzL2Rpc21pc3NhbHMKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7RGlzbWlzc1JlYXNvbn0gZGlzbWlzcwogICAgICAgKi8KICAgICAgY29uc3QgZGlzbWlzc1dpdGggPSBkaXNtaXNzID0+IHsKICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgaW5zdGFuY2UuY2xvc2UoewogICAgICAgICAgaXNEaXNtaXNzZWQ6IHRydWUsCiAgICAgICAgICBkaXNtaXNzCiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIHByaXZhdGVNZXRob2RzLnN3YWxQcm9taXNlUmVzb2x2ZS5zZXQoaW5zdGFuY2UsIHJlc29sdmUpOwogICAgICBwcml2YXRlTWV0aG9kcy5zd2FsUHJvbWlzZVJlamVjdC5zZXQoaW5zdGFuY2UsIHJlamVjdCk7CiAgICAgIGRvbUNhY2hlLmNvbmZpcm1CdXR0b24ub25jbGljayA9ICgpID0+IHsKICAgICAgICBoYW5kbGVDb25maXJtQnV0dG9uQ2xpY2soaW5zdGFuY2UpOwogICAgICB9OwogICAgICBkb21DYWNoZS5kZW55QnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgICAgaGFuZGxlRGVueUJ1dHRvbkNsaWNrKGluc3RhbmNlKTsKICAgICAgfTsKICAgICAgZG9tQ2FjaGUuY2FuY2VsQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgICAgaGFuZGxlQ2FuY2VsQnV0dG9uQ2xpY2soaW5zdGFuY2UsIGRpc21pc3NXaXRoKTsKICAgICAgfTsKICAgICAgZG9tQ2FjaGUuY2xvc2VCdXR0b24ub25jbGljayA9ICgpID0+IHsKICAgICAgICAvLyBAdHMtaWdub3JlCiAgICAgICAgZGlzbWlzc1dpdGgoRGlzbWlzc1JlYXNvbi5jbG9zZSk7CiAgICAgIH07CiAgICAgIGhhbmRsZVBvcHVwQ2xpY2soaW5zdGFuY2UsIGRvbUNhY2hlLCBkaXNtaXNzV2l0aCk7CiAgICAgIGFkZEtleWRvd25IYW5kbGVyKGluc3RhbmNlLCBnbG9iYWxTdGF0ZSwgaW5uZXJQYXJhbXMsIGRpc21pc3NXaXRoKTsKICAgICAgaGFuZGxlSW5wdXRPcHRpb25zQW5kVmFsdWUoaW5zdGFuY2UsIGlubmVyUGFyYW1zKTsKICAgICAgb3BlblBvcHVwKGlubmVyUGFyYW1zKTsKICAgICAgc2V0dXBUaW1lcihnbG9iYWxTdGF0ZSwgaW5uZXJQYXJhbXMsIGRpc21pc3NXaXRoKTsKICAgICAgaW5pdEZvY3VzKGRvbUNhY2hlLCBpbm5lclBhcmFtcyk7CgogICAgICAvLyBTY3JvbGwgY29udGFpbmVyIHRvIHRvcCBvbiBvcGVuICgjMTI0NywgIzE5NDYpCiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIGRvbUNhY2hlLmNvbnRhaW5lci5zY3JvbGxUb3AgPSAwOwogICAgICB9KTsKICAgIH0pOwogIH07CgogIC8qKgogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IHVzZXJQYXJhbXMKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnRPcHRpb25zfSBtaXhpblBhcmFtcwogICAqIEByZXR1cm5zIHtTd2VldEFsZXJ0T3B0aW9uc30KICAgKi8KICBjb25zdCBwcmVwYXJlUGFyYW1zID0gKHVzZXJQYXJhbXMsIG1peGluUGFyYW1zKSA9PiB7CiAgICBjb25zdCB0ZW1wbGF0ZVBhcmFtcyA9IGdldFRlbXBsYXRlUGFyYW1zKHVzZXJQYXJhbXMpOwogICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFBhcmFtcywgbWl4aW5QYXJhbXMsIHRlbXBsYXRlUGFyYW1zLCB1c2VyUGFyYW1zKTsgLy8gcHJlY2VkZW5jZSBpcyBkZXNjcmliZWQgaW4gIzIxMzEKICAgIHBhcmFtcy5zaG93Q2xhc3MgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UGFyYW1zLnNob3dDbGFzcywgcGFyYW1zLnNob3dDbGFzcyk7CiAgICBwYXJhbXMuaGlkZUNsYXNzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFBhcmFtcy5oaWRlQ2xhc3MsIHBhcmFtcy5oaWRlQ2xhc3MpOwogICAgcmV0dXJuIHBhcmFtczsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge1N3ZWV0QWxlcnQyfSBpbnN0YW5jZQogICAqIEByZXR1cm5zIHtEb21DYWNoZX0KICAgKi8KICBjb25zdCBwb3B1bGF0ZURvbUNhY2hlID0gaW5zdGFuY2UgPT4gewogICAgY29uc3QgZG9tQ2FjaGUgPSB7CiAgICAgIHBvcHVwOiBnZXRQb3B1cCgpLAogICAgICBjb250YWluZXI6IGdldENvbnRhaW5lcigpLAogICAgICBhY3Rpb25zOiBnZXRBY3Rpb25zKCksCiAgICAgIGNvbmZpcm1CdXR0b246IGdldENvbmZpcm1CdXR0b24oKSwKICAgICAgZGVueUJ1dHRvbjogZ2V0RGVueUJ1dHRvbigpLAogICAgICBjYW5jZWxCdXR0b246IGdldENhbmNlbEJ1dHRvbigpLAogICAgICBsb2FkZXI6IGdldExvYWRlcigpLAogICAgICBjbG9zZUJ1dHRvbjogZ2V0Q2xvc2VCdXR0b24oKSwKICAgICAgdmFsaWRhdGlvbk1lc3NhZ2U6IGdldFZhbGlkYXRpb25NZXNzYWdlKCksCiAgICAgIHByb2dyZXNzU3RlcHM6IGdldFByb2dyZXNzU3RlcHMoKQogICAgfTsKICAgIHByaXZhdGVQcm9wcy5kb21DYWNoZS5zZXQoaW5zdGFuY2UsIGRvbUNhY2hlKTsKICAgIHJldHVybiBkb21DYWNoZTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0dsb2JhbFN0YXRlfSBnbG9iYWxTdGF0ZQogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IGlubmVyUGFyYW1zCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZGlzbWlzc1dpdGgKICAgKi8KICBjb25zdCBzZXR1cFRpbWVyID0gKGdsb2JhbFN0YXRlLCBpbm5lclBhcmFtcywgZGlzbWlzc1dpdGgpID0+IHsKICAgIGNvbnN0IHRpbWVyUHJvZ3Jlc3NCYXIgPSBnZXRUaW1lclByb2dyZXNzQmFyKCk7CiAgICBoaWRlKHRpbWVyUHJvZ3Jlc3NCYXIpOwogICAgaWYgKGlubmVyUGFyYW1zLnRpbWVyKSB7CiAgICAgIGdsb2JhbFN0YXRlLnRpbWVvdXQgPSBuZXcgVGltZXIoKCkgPT4gewogICAgICAgIGRpc21pc3NXaXRoKCd0aW1lcicpOwogICAgICAgIGRlbGV0ZSBnbG9iYWxTdGF0ZS50aW1lb3V0OwogICAgICB9LCBpbm5lclBhcmFtcy50aW1lcik7CiAgICAgIGlmIChpbm5lclBhcmFtcy50aW1lclByb2dyZXNzQmFyKSB7CiAgICAgICAgc2hvdyh0aW1lclByb2dyZXNzQmFyKTsKICAgICAgICBhcHBseUN1c3RvbUNsYXNzKHRpbWVyUHJvZ3Jlc3NCYXIsIGlubmVyUGFyYW1zLCAndGltZXJQcm9ncmVzc0JhcicpOwogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgaWYgKGdsb2JhbFN0YXRlLnRpbWVvdXQgJiYgZ2xvYmFsU3RhdGUudGltZW91dC5ydW5uaW5nKSB7CiAgICAgICAgICAgIC8vIHRpbWVyIGNhbiBiZSBhbHJlYWR5IHN0b3BwZWQgb3IgdW5zZXQgYXQgdGhpcyBwb2ludAogICAgICAgICAgICBhbmltYXRlVGltZXJQcm9ncmVzc0Jhcihpbm5lclBhcmFtcy50aW1lcik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0RvbUNhY2hlfSBkb21DYWNoZQogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IGlubmVyUGFyYW1zCiAgICovCiAgY29uc3QgaW5pdEZvY3VzID0gKGRvbUNhY2hlLCBpbm5lclBhcmFtcykgPT4gewogICAgaWYgKGlubmVyUGFyYW1zLnRvYXN0KSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghY2FsbElmRnVuY3Rpb24oaW5uZXJQYXJhbXMuYWxsb3dFbnRlcktleSkpIHsKICAgICAgYmx1ckFjdGl2ZUVsZW1lbnQoKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCFmb2N1c0J1dHRvbihkb21DYWNoZSwgaW5uZXJQYXJhbXMpKSB7CiAgICAgIHNldEZvY3VzKC0xLCAxKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge0RvbUNhY2hlfSBkb21DYWNoZQogICAqIEBwYXJhbSB7U3dlZXRBbGVydE9wdGlvbnN9IGlubmVyUGFyYW1zCiAgICogQHJldHVybnMge2Jvb2xlYW59CiAgICovCiAgY29uc3QgZm9jdXNCdXR0b24gPSAoZG9tQ2FjaGUsIGlubmVyUGFyYW1zKSA9PiB7CiAgICBpZiAoaW5uZXJQYXJhbXMuZm9jdXNEZW55ICYmIGlzVmlzaWJsZSQxKGRvbUNhY2hlLmRlbnlCdXR0b24pKSB7CiAgICAgIGRvbUNhY2hlLmRlbnlCdXR0b24uZm9jdXMoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoaW5uZXJQYXJhbXMuZm9jdXNDYW5jZWwgJiYgaXNWaXNpYmxlJDEoZG9tQ2FjaGUuY2FuY2VsQnV0dG9uKSkgewogICAgICBkb21DYWNoZS5jYW5jZWxCdXR0b24uZm9jdXMoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBpZiAoaW5uZXJQYXJhbXMuZm9jdXNDb25maXJtICYmIGlzVmlzaWJsZSQxKGRvbUNhY2hlLmNvbmZpcm1CdXR0b24pKSB7CiAgICAgIGRvbUNhY2hlLmNvbmZpcm1CdXR0b24uZm9jdXMoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKICBjb25zdCBibHVyQWN0aXZlRWxlbWVudCA9ICgpID0+IHsKICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdHlwZW9mIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1ciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTsKICAgIH0KICB9OwoKICAvLyBBc3NpZ24gaW5zdGFuY2UgbWV0aG9kcyBmcm9tIHNyYy9pbnN0YW5jZU1ldGhvZHMvKi5qcyB0byBwcm90b3R5cGUKICBPYmplY3QuYXNzaWduKFN3ZWV0QWxlcnQucHJvdG90eXBlLCBpbnN0YW5jZU1ldGhvZHMpOwoKICAvLyBBc3NpZ24gc3RhdGljIG1ldGhvZHMgZnJvbSBzcmMvc3RhdGljTWV0aG9kcy8qLmpzIHRvIGNvbnN0cnVjdG9yCiAgT2JqZWN0LmFzc2lnbihTd2VldEFsZXJ0LCBzdGF0aWNNZXRob2RzKTsKCiAgLy8gUHJveHkgdG8gaW5zdGFuY2UgbWV0aG9kcyB0byBjb25zdHJ1Y3RvciwgZm9yIG5vdywgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgT2JqZWN0LmtleXMoaW5zdGFuY2VNZXRob2RzKS5mb3JFYWNoKGtleSA9PiB7CiAgICAvKioKICAgICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzCiAgICAgKiBAcmV0dXJucyB7YW55IHwgdW5kZWZpbmVkfQogICAgICovCiAgICBTd2VldEFsZXJ0W2tleV0gPSBmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChjdXJyZW50SW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gY3VycmVudEluc3RhbmNlW2tleV0oLi4uYXJndW1lbnRzKTsKICAgICAgfQogICAgfTsKICB9KTsKICBTd2VldEFsZXJ0LkRpc21pc3NSZWFzb24gPSBEaXNtaXNzUmVhc29uOwogIFN3ZWV0QWxlcnQudmVyc2lvbiA9ICcxMS43LjEnOwoKICBjb25zdCBTd2FsID0gU3dlZXRBbGVydDsKICAvLyBAdHMtaWdub3JlCiAgU3dhbC5kZWZhdWx0ID0gU3dhbDsKCiAgcmV0dXJuIFN3YWw7Cgp9KSk7CmlmICh0eXBlb2YgdGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5Td2VldGFsZXJ0Mil7dGhpcy5zd2FsID0gdGhpcy5zd2VldEFsZXJ0ID0gdGhpcy5Td2FsID0gdGhpcy5Td2VldEFsZXJ0ID0gdGhpcy5Td2VldGFsZXJ0Mn0KInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7aWYoZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKG4pLG4uc3R5bGVTaGVldCluLnN0eWxlU2hlZXQuZGlzYWJsZWR8fChuLnN0eWxlU2hlZXQuY3NzVGV4dD10KTtlbHNlIHRyeXtuLmlubmVySFRNTD10fWNhdGNoKGUpe24uaW5uZXJUZXh0PXR9fShkb2N1bWVudCwiLnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0e2JveC1zaXppbmc6Ym9yZGVyLWJveDtncmlkLWNvbHVtbjoxLzQgIWltcG9ydGFudDtncmlkLXJvdzoxLzQgIWltcG9ydGFudDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWluLWNvbnRlbnQgYXV0byBtaW4tY29udGVudDtwYWRkaW5nOjFlbTtvdmVyZmxvdy15OmhpZGRlbjtiYWNrZ3JvdW5kOiNmZmY7Ym94LXNoYWRvdzowIDAgMXB4IHJnYmEoMCwwLDAsLjA3NSksMCAxcHggMnB4IHJnYmEoMCwwLDAsLjA3NSksMXB4IDJweCA0cHggcmdiYSgwLDAsMCwuMDc1KSwxcHggM3B4IDhweCByZ2JhKDAsMCwwLC4wNzUpLDJweCA0cHggMTZweCByZ2JhKDAsMCwwLC4wNzUpO3BvaW50ZXItZXZlbnRzOmFsbH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3Q+KntncmlkLWNvbHVtbjoyfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItdGl0bGV7bWFyZ2luOi41ZW0gMWVtO3BhZGRpbmc6MDtmb250LXNpemU6MWVtO3RleHQtYWxpZ246aW5pdGlhbH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWxvYWRpbmd7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWlucHV0e2hlaWdodDoyZW07bWFyZ2luOi41ZW07Zm9udC1zaXplOjFlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZXtmb250LXNpemU6MWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItZm9vdGVye21hcmdpbjouNWVtIDAgMDtwYWRkaW5nOi41ZW0gMCAwO2ZvbnQtc2l6ZTouOGVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItY2xvc2V7Z3JpZC1jb2x1bW46My8zO2dyaWQtcm93OjEvOTk7YWxpZ24tc2VsZjpjZW50ZXI7d2lkdGg6LjhlbTtoZWlnaHQ6LjhlbTttYXJnaW46MDtmb250LXNpemU6MmVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaHRtbC1jb250YWluZXJ7bWFyZ2luOi41ZW0gMWVtO3BhZGRpbmc6MDtvdmVyZmxvdzppbml0aWFsO2ZvbnQtc2l6ZToxZW07dGV4dC1hbGlnbjppbml0aWFsfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaHRtbC1jb250YWluZXI6ZW1wdHl7cGFkZGluZzowfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItbG9hZGVye2dyaWQtY29sdW1uOjE7Z3JpZC1yb3c6MS85OTthbGlnbi1zZWxmOmNlbnRlcjt3aWR0aDoyZW07aGVpZ2h0OjJlbTttYXJnaW46LjI1ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29ue2dyaWQtY29sdW1uOjE7Z3JpZC1yb3c6MS85OTthbGlnbi1zZWxmOmNlbnRlcjt3aWR0aDoyZW07bWluLXdpZHRoOjJlbTtoZWlnaHQ6MmVtO21hcmdpbjowIC41ZW0gMCAwfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbiAuc3dhbDItaWNvbi1jb250ZW50e2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Zm9udC1zaXplOjEuOGVtO2ZvbnQtd2VpZ2h0OmJvbGR9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtcmluZ3t3aWR0aDoyZW07aGVpZ2h0OjJlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV17dG9wOi44NzVlbTt3aWR0aDoxLjM3NWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9bGVmdF17bGVmdDouMzEyNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXVtjbGFzcyQ9cmlnaHRde3JpZ2h0Oi4zMTI1ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1hY3Rpb25ze2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0O2hlaWdodDphdXRvO21hcmdpbjowO21hcmdpbi10b3A6LjVlbTtwYWRkaW5nOjAgLjVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN0eWxlZHttYXJnaW46LjI1ZW0gLjVlbTtwYWRkaW5nOi40ZW0gLjZlbTtmb250LXNpemU6MWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2Vzc3tib3JkZXItY29sb3I6I2E1ZGM4Nn0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVde3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEuNmVtO2hlaWdodDozZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7Ym9yZGVyLXJhZGl1czo1MCV9LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9bGVmdF17dG9wOi0wLjhlbTtsZWZ0Oi0wLjVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtLW9yaWdpbjoyZW0gMmVtO2JvcmRlci1yYWRpdXM6NGVtIDAgMCA0ZW19LnN3YWwyLXBvcHVwLnN3YWwyLXRvYXN0IC5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9cmlnaHRde3RvcDotMC4yNWVtO2xlZnQ6LjkzNzVlbTt0cmFuc2Zvcm0tb3JpZ2luOjAgMS41ZW07Ym9yZGVyLXJhZGl1czowIDRlbSA0ZW0gMH0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtcmluZ3t3aWR0aDoyZW07aGVpZ2h0OjJlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgLnN3YWwyLXN1Y2Nlc3MtZml4e3RvcDowO2xlZnQ6LjQzNzVlbTt3aWR0aDouNDM3NWVtO2hlaWdodDoyLjY4NzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVde2hlaWdodDouMzEyNWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPXRpcF17dG9wOjEuMTI1ZW07bGVmdDouMTg3NWVtO3dpZHRoOi43NWVtfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdCAuc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPWxvbmdde3RvcDouOTM3NWVtO3JpZ2h0Oi4xODc1ZW07d2lkdGg6MS4zNzVlbX0uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtdGlwe2FuaW1hdGlvbjpzd2FsMi10b2FzdC1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXAgLjc1c30uc3dhbDItcG9wdXAuc3dhbDItdG9hc3QgLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtbG9uZ3thbmltYXRpb246c3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZyAuNzVzfS5zd2FsMi1wb3B1cC5zd2FsMi10b2FzdC5zd2FsMi1zaG93e2FuaW1hdGlvbjpzd2FsMi10b2FzdC1zaG93IC41c30uc3dhbDItcG9wdXAuc3dhbDItdG9hc3Quc3dhbDItaGlkZXthbmltYXRpb246c3dhbDItdG9hc3QtaGlkZSAuMXMgZm9yd2FyZHN9LnN3YWwyLWNvbnRhaW5lcntkaXNwbGF5OmdyaWQ7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDYwO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2JveC1zaXppbmc6Ym9yZGVyLWJveDtncmlkLXRlbXBsYXRlLWFyZWFzOlwidG9wLXN0YXJ0ICAgICB0b3AgICAgICAgICAgICB0b3AtZW5kXCIgXCJjZW50ZXItc3RhcnQgIGNlbnRlciAgICAgICAgIGNlbnRlci1lbmRcIiBcImJvdHRvbS1zdGFydCAgYm90dG9tLWNlbnRlciAgYm90dG9tLWVuZFwiO2dyaWQtdGVtcGxhdGUtcm93czptaW5tYXgobWluLWNvbnRlbnQsIGF1dG8pIG1pbm1heChtaW4tY29udGVudCwgYXV0bykgbWlubWF4KG1pbi1jb250ZW50LCBhdXRvKTtoZWlnaHQ6MTAwJTtwYWRkaW5nOi42MjVlbTtvdmVyZmxvdy14OmhpZGRlbjt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjFzOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS5zd2FsMi1jb250YWluZXIuc3dhbDItYmFja2Ryb3Atc2hvdywuc3dhbDItY29udGFpbmVyLnN3YWwyLW5vYW5pbWF0aW9ue2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuNCl9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1iYWNrZHJvcC1oaWRle2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwKSAhaW1wb3J0YW50fS5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLXN0YXJ0LC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXN0YXJ0e2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW5tYXgoMCwgMWZyKSBhdXRvIGF1dG99LnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXIsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b217Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gbWlubWF4KDAsIDFmcikgYXV0b30uc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1lbmQsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItZW5kLC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWVuZHtncmlkLXRlbXBsYXRlLWNvbHVtbnM6YXV0byBhdXRvIG1pbm1heCgwLCAxZnIpfS5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXN0YXJ0Pi5zd2FsMi1wb3B1cHthbGlnbi1zZWxmOnN0YXJ0fS5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wPi5zd2FsMi1wb3B1cHtncmlkLWNvbHVtbjoyO2FsaWduLXNlbGY6c3RhcnQ7anVzdGlmeS1zZWxmOmNlbnRlcn0uc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1lbmQ+LnN3YWwyLXBvcHVwLC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLXJpZ2h0Pi5zd2FsMi1wb3B1cHtncmlkLWNvbHVtbjozO2FsaWduLXNlbGY6c3RhcnQ7anVzdGlmeS1zZWxmOmVuZH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1zdGFydD4uc3dhbDItcG9wdXAsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItbGVmdD4uc3dhbDItcG9wdXB7Z3JpZC1yb3c6MjthbGlnbi1zZWxmOmNlbnRlcn0uc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlcj4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MjtncmlkLXJvdzoyO2FsaWduLXNlbGY6Y2VudGVyO2p1c3RpZnktc2VsZjpjZW50ZXJ9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItZW5kPi5zd2FsMi1wb3B1cCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1yaWdodD4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MztncmlkLXJvdzoyO2FsaWduLXNlbGY6Y2VudGVyO2p1c3RpZnktc2VsZjplbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tc3RhcnQ+LnN3YWwyLXBvcHVwLC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLWxlZnQ+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjE7Z3JpZC1yb3c6MzthbGlnbi1zZWxmOmVuZH0uc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbT4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MjtncmlkLXJvdzozO2p1c3RpZnktc2VsZjpjZW50ZXI7YWxpZ24tc2VsZjplbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tZW5kPi5zd2FsMi1wb3B1cCwuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1yaWdodD4uc3dhbDItcG9wdXB7Z3JpZC1jb2x1bW46MztncmlkLXJvdzozO2FsaWduLXNlbGY6ZW5kO2p1c3RpZnktc2VsZjplbmR9LnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LXJvdz4uc3dhbDItcG9wdXAsLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ncm93LWZ1bGxzY3JlZW4+LnN3YWwyLXBvcHVwe2dyaWQtY29sdW1uOjEvNDt3aWR0aDoxMDAlfS5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1jb2x1bW4+LnN3YWwyLXBvcHVwLC5zd2FsMi1jb250YWluZXIuc3dhbDItZ3Jvdy1mdWxsc2NyZWVuPi5zd2FsMi1wb3B1cHtncmlkLXJvdzoxLzQ7YWxpZ24tc2VsZjpzdHJldGNofS5zd2FsMi1jb250YWluZXIuc3dhbDItbm8tdHJhbnNpdGlvbnt0cmFuc2l0aW9uOm5vbmUgIWltcG9ydGFudH0uc3dhbDItcG9wdXB7ZGlzcGxheTpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWlubWF4KDAsIDEwMCUpO3dpZHRoOjMyZW07bWF4LXdpZHRoOjEwMCU7cGFkZGluZzowIDAgMS4yNWVtO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6NXB4O2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojNTQ1NDU0O2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOjFyZW19LnN3YWwyLXBvcHVwOmZvY3Vze291dGxpbmU6bm9uZX0uc3dhbDItcG9wdXAuc3dhbDItbG9hZGluZ3tvdmVyZmxvdy15OmhpZGRlbn0uc3dhbDItdGl0bGV7cG9zaXRpb246cmVsYXRpdmU7bWF4LXdpZHRoOjEwMCU7bWFyZ2luOjA7cGFkZGluZzouOGVtIDFlbSAwO2NvbG9yOmluaGVyaXQ7Zm9udC1zaXplOjEuODc1ZW07Zm9udC13ZWlnaHQ6NjAwO3RleHQtYWxpZ246Y2VudGVyO3RleHQtdHJhbnNmb3JtOm5vbmU7d29yZC13cmFwOmJyZWFrLXdvcmR9LnN3YWwyLWFjdGlvbnN7ZGlzcGxheTpmbGV4O3otaW5kZXg6MTtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZmxleC13cmFwOndyYXA7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6YXV0bzttYXJnaW46MS4yNWVtIGF1dG8gMDtwYWRkaW5nOjB9LnN3YWwyLWFjdGlvbnM6bm90KC5zd2FsMi1sb2FkaW5nKSAuc3dhbDItc3R5bGVkW2Rpc2FibGVkXXtvcGFjaXR5Oi40fS5zd2FsMi1hY3Rpb25zOm5vdCguc3dhbDItbG9hZGluZykgLnN3YWwyLXN0eWxlZDpob3ZlcntiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudChyZ2JhKDAsIDAsIDAsIDAuMSksIHJnYmEoMCwgMCwgMCwgMC4xKSl9LnN3YWwyLWFjdGlvbnM6bm90KC5zd2FsMi1sb2FkaW5nKSAuc3dhbDItc3R5bGVkOmFjdGl2ZXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudChyZ2JhKDAsIDAsIDAsIDAuMiksIHJnYmEoMCwgMCwgMCwgMC4yKSl9LnN3YWwyLWxvYWRlcntkaXNwbGF5Om5vbmU7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6Mi4yZW07aGVpZ2h0OjIuMmVtO21hcmdpbjowIDEuODc1ZW07YW5pbWF0aW9uOnN3YWwyLXJvdGF0ZS1sb2FkaW5nIDEuNXMgbGluZWFyIDBzIGluZmluaXRlIG5vcm1hbDtib3JkZXItd2lkdGg6LjI1ZW07Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1yYWRpdXM6MTAwJTtib3JkZXItY29sb3I6IzI3NzhjNCByZ2JhKDAsMCwwLDApICMyNzc4YzQgcmdiYSgwLDAsMCwwKX0uc3dhbDItc3R5bGVke21hcmdpbjouMzEyNWVtO3BhZGRpbmc6LjYyNWVtIDEuMWVtO3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMXM7Ym94LXNoYWRvdzowIDAgMCAzcHggcmdiYSgwLDAsMCwwKTtmb250LXdlaWdodDo1MDB9LnN3YWwyLXN0eWxlZDpub3QoW2Rpc2FibGVkXSl7Y3Vyc29yOnBvaW50ZXJ9LnN3YWwyLXN0eWxlZC5zd2FsMi1jb25maXJte2JvcmRlcjowO2JvcmRlci1yYWRpdXM6LjI1ZW07YmFja2dyb3VuZDppbml0aWFsO2JhY2tncm91bmQtY29sb3I6IzcwNjZlMDtjb2xvcjojZmZmO2ZvbnQtc2l6ZToxZW19LnN3YWwyLXN0eWxlZC5zd2FsMi1jb25maXJtOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgM3B4IHJnYmEoMTEyLDEwMiwyMjQsLjUpfS5zd2FsMi1zdHlsZWQuc3dhbDItZGVueXtib3JkZXI6MDtib3JkZXItcmFkaXVzOi4yNWVtO2JhY2tncm91bmQ6aW5pdGlhbDtiYWNrZ3JvdW5kLWNvbG9yOiNkYzM3NDE7Y29sb3I6I2ZmZjtmb250LXNpemU6MWVtfS5zd2FsMi1zdHlsZWQuc3dhbDItZGVueTpmb2N1c3tib3gtc2hhZG93OjAgMCAwIDNweCByZ2JhKDIyMCw1NSw2NSwuNSl9LnN3YWwyLXN0eWxlZC5zd2FsMi1jYW5jZWx7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czouMjVlbTtiYWNrZ3JvdW5kOmluaXRpYWw7YmFja2dyb3VuZC1jb2xvcjojNmU3ODgxO2NvbG9yOiNmZmY7Zm9udC1zaXplOjFlbX0uc3dhbDItc3R5bGVkLnN3YWwyLWNhbmNlbDpmb2N1c3tib3gtc2hhZG93OjAgMCAwIDNweCByZ2JhKDExMCwxMjAsMTI5LC41KX0uc3dhbDItc3R5bGVkLnN3YWwyLWRlZmF1bHQtb3V0bGluZTpmb2N1c3tib3gtc2hhZG93OjAgMCAwIDNweCByZ2JhKDEwMCwxNTAsMjAwLC41KX0uc3dhbDItc3R5bGVkOmZvY3Vze291dGxpbmU6bm9uZX0uc3dhbDItc3R5bGVkOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5zd2FsMi1mb290ZXJ7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW46MWVtIDAgMDtwYWRkaW5nOjFlbSAxZW0gMDtib3JkZXItdG9wOjFweCBzb2xpZCAjZWVlO2NvbG9yOmluaGVyaXQ7Zm9udC1zaXplOjFlbX0uc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFyLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO2JvdHRvbTowO2xlZnQ6MDtncmlkLWNvbHVtbjphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjVweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjVweH0uc3dhbDItdGltZXItcHJvZ3Jlc3MtYmFye3dpZHRoOjEwMCU7aGVpZ2h0Oi4yNWVtO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMil9LnN3YWwyLWltYWdle21heC13aWR0aDoxMDAlO21hcmdpbjoyZW0gYXV0byAxZW19LnN3YWwyLWNsb3Nle3otaW5kZXg6MjthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDoxLjJlbTtoZWlnaHQ6MS4yZW07bWFyZ2luLXRvcDowO21hcmdpbi1yaWdodDowO21hcmdpbi1ib3R0b206LTEuMmVtO3BhZGRpbmc6MDtvdmVyZmxvdzpoaWRkZW47dHJhbnNpdGlvbjpjb2xvciAuMXMsYm94LXNoYWRvdyAuMXM7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDApO2NvbG9yOiNjY2M7Zm9udC1mYW1pbHk6c2VyaWY7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToyLjVlbTtjdXJzb3I6cG9pbnRlcjtqdXN0aWZ5LXNlbGY6ZW5kfS5zd2FsMi1jbG9zZTpob3Zlcnt0cmFuc2Zvcm06bm9uZTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMCk7Y29sb3I6I2YyNzQ3NH0uc3dhbDItY2xvc2U6Zm9jdXN7b3V0bGluZTpub25lO2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgM3B4IHJnYmEoMTAwLDE1MCwyMDAsLjUpfS5zd2FsMi1jbG9zZTo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uc3dhbDItaHRtbC1jb250YWluZXJ7ei1pbmRleDoxO2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luOjFlbSAxLjZlbSAuM2VtO3BhZGRpbmc6MDtvdmVyZmxvdzphdXRvO2NvbG9yOmluaGVyaXQ7Zm9udC1zaXplOjEuMTI1ZW07Zm9udC13ZWlnaHQ6bm9ybWFsO2xpbmUtaGVpZ2h0Om5vcm1hbDt0ZXh0LWFsaWduOmNlbnRlcjt3b3JkLXdyYXA6YnJlYWstd29yZDt3b3JkLWJyZWFrOmJyZWFrLXdvcmR9LnN3YWwyLWlucHV0LC5zd2FsMi1maWxlLC5zd2FsMi10ZXh0YXJlYSwuc3dhbDItc2VsZWN0LC5zd2FsMi1yYWRpbywuc3dhbDItY2hlY2tib3h7bWFyZ2luOjFlbSAyZW0gM3B4fS5zd2FsMi1pbnB1dCwuc3dhbDItZmlsZSwuc3dhbDItdGV4dGFyZWF7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOmF1dG87dHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjFzLGJveC1zaGFkb3cgLjFzO2JvcmRlcjoxcHggc29saWQgI2Q5ZDlkOTtib3JkZXItcmFkaXVzOi4xODc1ZW07YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDApO2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA2KSwwIDAgMCAzcHggcmdiYSgwLDAsMCwwKTtjb2xvcjppbmhlcml0O2ZvbnQtc2l6ZToxLjEyNWVtfS5zd2FsMi1pbnB1dC5zd2FsMi1pbnB1dGVycm9yLC5zd2FsMi1maWxlLnN3YWwyLWlucHV0ZXJyb3IsLnN3YWwyLXRleHRhcmVhLnN3YWwyLWlucHV0ZXJyb3J7Ym9yZGVyLWNvbG9yOiNmMjc0NzQgIWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAycHggI2YyNzQ3NCAhaW1wb3J0YW50fS5zd2FsMi1pbnB1dDpmb2N1cywuc3dhbDItZmlsZTpmb2N1cywuc3dhbDItdGV4dGFyZWE6Zm9jdXN7Ym9yZGVyOjFweCBzb2xpZCAjYjRkYmVkO291dGxpbmU6bm9uZTtib3gtc2hhZG93Omluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNiksMCAwIDAgM3B4IHJnYmEoMTAwLDE1MCwyMDAsLjUpfS5zd2FsMi1pbnB1dDo6cGxhY2Vob2xkZXIsLnN3YWwyLWZpbGU6OnBsYWNlaG9sZGVyLC5zd2FsMi10ZXh0YXJlYTo6cGxhY2Vob2xkZXJ7Y29sb3I6I2NjY30uc3dhbDItcmFuZ2V7bWFyZ2luOjFlbSAyZW0gM3B4O2JhY2tncm91bmQ6I2ZmZn0uc3dhbDItcmFuZ2UgaW5wdXR7d2lkdGg6ODAlfS5zd2FsMi1yYW5nZSBvdXRwdXR7d2lkdGg6MjAlO2NvbG9yOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NjAwO3RleHQtYWxpZ246Y2VudGVyfS5zd2FsMi1yYW5nZSBpbnB1dCwuc3dhbDItcmFuZ2Ugb3V0cHV0e2hlaWdodDoyLjYyNWVtO3BhZGRpbmc6MDtmb250LXNpemU6MS4xMjVlbTtsaW5lLWhlaWdodDoyLjYyNWVtfS5zd2FsMi1pbnB1dHtoZWlnaHQ6Mi42MjVlbTtwYWRkaW5nOjAgLjc1ZW19LnN3YWwyLWZpbGV7d2lkdGg6NzUlO21hcmdpbi1yaWdodDphdXRvO21hcmdpbi1sZWZ0OmF1dG87YmFja2dyb3VuZDpyZ2JhKDAsMCwwLDApO2ZvbnQtc2l6ZToxLjEyNWVtfS5zd2FsMi10ZXh0YXJlYXtoZWlnaHQ6Ni43NWVtO3BhZGRpbmc6Ljc1ZW19LnN3YWwyLXNlbGVjdHttaW4td2lkdGg6NTAlO21heC13aWR0aDoxMDAlO3BhZGRpbmc6LjM3NWVtIC42MjVlbTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsMCk7Y29sb3I6aW5oZXJpdDtmb250LXNpemU6MS4xMjVlbX0uc3dhbDItcmFkaW8sLnN3YWwyLWNoZWNrYm94e2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjppbmhlcml0fS5zd2FsMi1yYWRpbyBsYWJlbCwuc3dhbDItY2hlY2tib3ggbGFiZWx7bWFyZ2luOjAgLjZlbTtmb250LXNpemU6MS4xMjVlbX0uc3dhbDItcmFkaW8gaW5wdXQsLnN3YWwyLWNoZWNrYm94IGlucHV0e2ZsZXgtc2hyaW5rOjA7bWFyZ2luOjAgLjRlbX0uc3dhbDItaW5wdXQtbGFiZWx7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luOjFlbSBhdXRvIDB9LnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZXthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjttYXJnaW46MWVtIDAgMDtwYWRkaW5nOi42MjVlbTtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDojZjBmMGYwO2NvbG9yOiM2NjY7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDozMDB9LnN3YWwyLXZhbGlkYXRpb24tbWVzc2FnZTo6YmVmb3Jle2NvbnRlbnQ6XCIhXCI7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MS41ZW07bWluLXdpZHRoOjEuNWVtO2hlaWdodDoxLjVlbTttYXJnaW46MCAuNjI1ZW07Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZC1jb2xvcjojZjI3NDc0O2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6NjAwO2xpbmUtaGVpZ2h0OjEuNWVtO3RleHQtYWxpZ246Y2VudGVyfS5zd2FsMi1pY29ue3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Y29udGVudC1ib3g7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDo1ZW07aGVpZ2h0OjVlbTttYXJnaW46Mi41ZW0gYXV0byAuNmVtO2JvcmRlcjowLjI1ZW0gc29saWQgcmdiYSgwLDAsMCwwKTtib3JkZXItcmFkaXVzOjUwJTtib3JkZXItY29sb3I6IzAwMDtmb250LWZhbWlseTppbmhlcml0O2xpbmUtaGVpZ2h0OjVlbTtjdXJzb3I6ZGVmYXVsdDt1c2VyLXNlbGVjdDpub25lfS5zd2FsMi1pY29uIC5zd2FsMi1pY29uLWNvbnRlbnR7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6My43NWVtfS5zd2FsMi1pY29uLnN3YWwyLWVycm9ye2JvcmRlci1jb2xvcjojZjI3NDc0O2NvbG9yOiNmMjc0NzR9LnN3YWwyLWljb24uc3dhbDItZXJyb3IgLnN3YWwyLXgtbWFya3twb3NpdGlvbjpyZWxhdGl2ZTtmbGV4LWdyb3c6MX0uc3dhbDItaWNvbi5zd2FsMi1lcnJvciBbY2xhc3NePXN3YWwyLXgtbWFyay1saW5lXXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoyLjMxMjVlbTt3aWR0aDoyLjkzNzVlbTtoZWlnaHQ6LjMxMjVlbTtib3JkZXItcmFkaXVzOi4xMjVlbTtiYWNrZ3JvdW5kLWNvbG9yOiNmMjc0NzR9LnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPWxlZnRde2xlZnQ6MS4wNjI1ZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9LnN3YWwyLWljb24uc3dhbDItZXJyb3IgW2NsYXNzXj1zd2FsMi14LW1hcmstbGluZV1bY2xhc3MkPXJpZ2h0XXtyaWdodDoxZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfS5zd2FsMi1pY29uLnN3YWwyLWVycm9yLnN3YWwyLWljb24tc2hvd3thbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci1pY29uIC41c30uc3dhbDItaWNvbi5zd2FsMi1lcnJvci5zd2FsMi1pY29uLXNob3cgLnN3YWwyLXgtbWFya3thbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci14LW1hcmsgLjVzfS5zd2FsMi1pY29uLnN3YWwyLXdhcm5pbmd7Ym9yZGVyLWNvbG9yOiNmYWNlYTg7Y29sb3I6I2Y4YmI4Nn0uc3dhbDItaWNvbi5zd2FsMi13YXJuaW5nLnN3YWwyLWljb24tc2hvd3thbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci1pY29uIC41c30uc3dhbDItaWNvbi5zd2FsMi13YXJuaW5nLnN3YWwyLWljb24tc2hvdyAuc3dhbDItaWNvbi1jb250ZW50e2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWktbWFyayAuNXN9LnN3YWwyLWljb24uc3dhbDItaW5mb3tib3JkZXItY29sb3I6IzlkZTBmNjtjb2xvcjojM2ZjM2VlfS5zd2FsMi1pY29uLnN3YWwyLWluZm8uc3dhbDItaWNvbi1zaG93e2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLWVycm9yLWljb24gLjVzfS5zd2FsMi1pY29uLnN3YWwyLWluZm8uc3dhbDItaWNvbi1zaG93IC5zd2FsMi1pY29uLWNvbnRlbnR7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtaS1tYXJrIC44c30uc3dhbDItaWNvbi5zd2FsMi1xdWVzdGlvbntib3JkZXItY29sb3I6I2M5ZGFlMTtjb2xvcjojODdhZGJkfS5zd2FsMi1pY29uLnN3YWwyLXF1ZXN0aW9uLnN3YWwyLWljb24tc2hvd3thbmltYXRpb246c3dhbDItYW5pbWF0ZS1lcnJvci1pY29uIC41c30uc3dhbDItaWNvbi5zd2FsMi1xdWVzdGlvbi5zd2FsMi1pY29uLXNob3cgLnN3YWwyLWljb24tY29udGVudHthbmltYXRpb246c3dhbDItYW5pbWF0ZS1xdWVzdGlvbi1tYXJrIC44c30uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNze2JvcmRlci1jb2xvcjojYTVkYzg2O2NvbG9yOiNhNWRjODZ9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtY2lyY3VsYXItbGluZV17cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6My43NWVtO2hlaWdodDo3LjVlbTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTtib3JkZXItcmFkaXVzOjUwJX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lXVtjbGFzcyQ9bGVmdF17dG9wOi0wLjQzNzVlbTtsZWZ0Oi0yLjA2MzVlbTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtLW9yaWdpbjozLjc1ZW0gMy43NWVtO2JvcmRlci1yYWRpdXM6Ny41ZW0gMCAwIDcuNWVtfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWNpcmN1bGFyLWxpbmVdW2NsYXNzJD1yaWdodF17dG9wOi0wLjY4NzVlbTtsZWZ0OjEuODc1ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO3RyYW5zZm9ybS1vcmlnaW46MCAzLjc1ZW07Ym9yZGVyLXJhZGl1czowIDcuNWVtIDcuNWVtIDB9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyAuc3dhbDItc3VjY2Vzcy1yaW5ne3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjt0b3A6LTAuMjVlbTtsZWZ0Oi0wLjI1ZW07Ym94LXNpemluZzpjb250ZW50LWJveDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlcjouMjVlbSBzb2xpZCByZ2JhKDE2NSwyMjAsMTM0LC4zKTtib3JkZXItcmFkaXVzOjUwJX0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIC5zd2FsMi1zdWNjZXNzLWZpeHtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjE7dG9wOi41ZW07bGVmdDoxLjYyNWVtO3dpZHRoOi40Mzc1ZW07aGVpZ2h0OjUuNjI1ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3MgW2NsYXNzXj1zd2FsMi1zdWNjZXNzLWxpbmVde2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoyO2hlaWdodDouMzEyNWVtO2JvcmRlci1yYWRpdXM6LjEyNWVtO2JhY2tncm91bmQtY29sb3I6I2E1ZGM4Nn0uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzIFtjbGFzc149c3dhbDItc3VjY2Vzcy1saW5lXVtjbGFzcyQ9dGlwXXt0b3A6Mi44NzVlbTtsZWZ0Oi44MTI1ZW07d2lkdGg6MS41NjI1ZW07dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9LnN3YWwyLWljb24uc3dhbDItc3VjY2VzcyBbY2xhc3NePXN3YWwyLXN1Y2Nlc3MtbGluZV1bY2xhc3MkPWxvbmdde3RvcDoyLjM3NWVtO3JpZ2h0Oi41ZW07d2lkdGg6Mi45Mzc1ZW07dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfS5zd2FsMi1pY29uLnN3YWwyLXN1Y2Nlc3Muc3dhbDItaWNvbi1zaG93IC5zd2FsMi1zdWNjZXNzLWxpbmUtdGlwe2FuaW1hdGlvbjpzd2FsMi1hbmltYXRlLXN1Y2Nlc3MtbGluZS10aXAgLjc1c30uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1saW5lLWxvbmd7YW5pbWF0aW9uOnN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmcgLjc1c30uc3dhbDItaWNvbi5zd2FsMi1zdWNjZXNzLnN3YWwyLWljb24tc2hvdyAuc3dhbDItc3VjY2Vzcy1jaXJjdWxhci1saW5lLXJpZ2h0e2FuaW1hdGlvbjpzd2FsMi1yb3RhdGUtc3VjY2Vzcy1jaXJjdWxhci1saW5lIDQuMjVzIGVhc2UtaW59LnN3YWwyLXByb2dyZXNzLXN0ZXBze2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjttYXgtd2lkdGg6MTAwJTttYXJnaW46MS4yNWVtIGF1dG87cGFkZGluZzowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwwKTtmb250LXdlaWdodDo2MDB9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIGxpe2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlfS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcHt6LWluZGV4OjIwO2ZsZXgtc2hyaW5rOjA7d2lkdGg6MmVtO2hlaWdodDoyZW07Ym9yZGVyLXJhZGl1czoyZW07YmFja2dyb3VuZDojMjc3OGM0O2NvbG9yOiNmZmY7bGluZS1oZWlnaHQ6MmVtO3RleHQtYWxpZ246Y2VudGVyfS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC5zd2FsMi1hY3RpdmUtcHJvZ3Jlc3Mtc3RlcHtiYWNrZ3JvdW5kOiMyNzc4YzR9LnN3YWwyLXByb2dyZXNzLXN0ZXBzIC5zd2FsMi1wcm9ncmVzcy1zdGVwLnN3YWwyLWFjdGl2ZS1wcm9ncmVzcy1zdGVwfi5zd2FsMi1wcm9ncmVzcy1zdGVwe2JhY2tncm91bmQ6I2FkZDhlNjtjb2xvcjojZmZmfS5zd2FsMi1wcm9ncmVzcy1zdGVwcyAuc3dhbDItcHJvZ3Jlc3Mtc3RlcC5zd2FsMi1hY3RpdmUtcHJvZ3Jlc3Mtc3RlcH4uc3dhbDItcHJvZ3Jlc3Mtc3RlcC1saW5le2JhY2tncm91bmQ6I2FkZDhlNn0uc3dhbDItcHJvZ3Jlc3Mtc3RlcHMgLnN3YWwyLXByb2dyZXNzLXN0ZXAtbGluZXt6LWluZGV4OjEwO2ZsZXgtc2hyaW5rOjA7d2lkdGg6Mi41ZW07aGVpZ2h0Oi40ZW07bWFyZ2luOjAgLTFweDtiYWNrZ3JvdW5kOiMyNzc4YzR9W2NsYXNzXj1zd2FsMl17LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsMCl9LnN3YWwyLXNob3d7YW5pbWF0aW9uOnN3YWwyLXNob3cgLjNzfS5zd2FsMi1oaWRle2FuaW1hdGlvbjpzd2FsMi1oaWRlIC4xNXMgZm9yd2FyZHN9LnN3YWwyLW5vYW5pbWF0aW9ue3RyYW5zaXRpb246bm9uZX0uc3dhbDItc2Nyb2xsYmFyLW1lYXN1cmV7cG9zaXRpb246YWJzb2x1dGU7dG9wOi05OTk5cHg7d2lkdGg6NTBweDtoZWlnaHQ6NTBweDtvdmVyZmxvdzpzY3JvbGx9LnN3YWwyLXJ0bCAuc3dhbDItY2xvc2V7bWFyZ2luLXJpZ2h0OmluaXRpYWw7bWFyZ2luLWxlZnQ6MH0uc3dhbDItcnRsIC5zd2FsMi10aW1lci1wcm9ncmVzcy1iYXJ7cmlnaHQ6MDtsZWZ0OmF1dG99QGtleWZyYW1lcyBzd2FsMi10b2FzdC1zaG93ezAle3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjYyNWVtKSByb3RhdGVaKDJkZWcpfTMzJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSByb3RhdGVaKC0yZGVnKX02NiV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMC4zMTI1ZW0pIHJvdGF0ZVooMmRlZyl9MTAwJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSByb3RhdGVaKDBkZWcpfX1Aa2V5ZnJhbWVzIHN3YWwyLXRvYXN0LWhpZGV7MTAwJXt0cmFuc2Zvcm06cm90YXRlWigxZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtdGlwezAle3RvcDouNTYyNWVtO2xlZnQ6LjA2MjVlbTt3aWR0aDowfTU0JXt0b3A6LjEyNWVtO2xlZnQ6LjEyNWVtO3dpZHRoOjB9NzAle3RvcDouNjI1ZW07bGVmdDotMC4yNWVtO3dpZHRoOjEuNjI1ZW19ODQle3RvcDoxLjA2MjVlbTtsZWZ0Oi43NWVtO3dpZHRoOi41ZW19MTAwJXt0b3A6MS4xMjVlbTtsZWZ0Oi4xODc1ZW07d2lkdGg6Ljc1ZW19fUBrZXlmcmFtZXMgc3dhbDItdG9hc3QtYW5pbWF0ZS1zdWNjZXNzLWxpbmUtbG9uZ3swJXt0b3A6MS42MjVlbTtyaWdodDoxLjM3NWVtO3dpZHRoOjB9NjUle3RvcDoxLjI1ZW07cmlnaHQ6LjkzNzVlbTt3aWR0aDowfTg0JXt0b3A6LjkzNzVlbTtyaWdodDowO3dpZHRoOjEuMTI1ZW19MTAwJXt0b3A6LjkzNzVlbTtyaWdodDouMTg3NWVtO3dpZHRoOjEuMzc1ZW19fUBrZXlmcmFtZXMgc3dhbDItc2hvd3swJXt0cmFuc2Zvcm06c2NhbGUoMC43KX00NSV7dHJhbnNmb3JtOnNjYWxlKDEuMDUpfTgwJXt0cmFuc2Zvcm06c2NhbGUoMC45NSl9MTAwJXt0cmFuc2Zvcm06c2NhbGUoMSl9fUBrZXlmcmFtZXMgc3dhbDItaGlkZXswJXt0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eToxfTEwMCV7dHJhbnNmb3JtOnNjYWxlKDAuNSk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLXRpcHswJXt0b3A6MS4xODc1ZW07bGVmdDouMDYyNWVtO3dpZHRoOjB9NTQle3RvcDoxLjA2MjVlbTtsZWZ0Oi4xMjVlbTt3aWR0aDowfTcwJXt0b3A6Mi4xODc1ZW07bGVmdDotMC4zNzVlbTt3aWR0aDozLjEyNWVtfTg0JXt0b3A6M2VtO2xlZnQ6MS4zMTI1ZW07d2lkdGg6MS4wNjI1ZW19MTAwJXt0b3A6Mi44MTI1ZW07bGVmdDouODEyNWVtO3dpZHRoOjEuNTYyNWVtfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtc3VjY2Vzcy1saW5lLWxvbmd7MCV7dG9wOjMuMzc1ZW07cmlnaHQ6Mi44NzVlbTt3aWR0aDowfTY1JXt0b3A6My4zNzVlbTtyaWdodDoyLjg3NWVtO3dpZHRoOjB9ODQle3RvcDoyLjE4NzVlbTtyaWdodDowO3dpZHRoOjMuNDM3NWVtfTEwMCV7dG9wOjIuMzc1ZW07cmlnaHQ6LjVlbTt3aWR0aDoyLjkzNzVlbX19QGtleWZyYW1lcyBzd2FsMi1yb3RhdGUtc3VjY2Vzcy1jaXJjdWxhci1saW5lezAle3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX01JXt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9MTIle3RyYW5zZm9ybTpyb3RhdGUoLTQwNWRlZyl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKC00MDVkZWcpfX1Aa2V5ZnJhbWVzIHN3YWwyLWFuaW1hdGUtZXJyb3IteC1tYXJrezAle21hcmdpbi10b3A6MS42MjVlbTt0cmFuc2Zvcm06c2NhbGUoMC40KTtvcGFjaXR5OjB9NTAle21hcmdpbi10b3A6MS42MjVlbTt0cmFuc2Zvcm06c2NhbGUoMC40KTtvcGFjaXR5OjB9ODAle21hcmdpbi10b3A6LTAuMzc1ZW07dHJhbnNmb3JtOnNjYWxlKDEuMTUpfTEwMCV7bWFyZ2luLXRvcDowO3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1lcnJvci1pY29uezAle3RyYW5zZm9ybTpyb3RhdGVYKDEwMGRlZyk7b3BhY2l0eTowfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZVgoMGRlZyk7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIHN3YWwyLXJvdGF0ZS1sb2FkaW5nezAle3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9MTAwJXt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1xdWVzdGlvbi1tYXJrezAle3RyYW5zZm9ybTpyb3RhdGVZKC0zNjBkZWcpfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZVkoMCl9fUBrZXlmcmFtZXMgc3dhbDItYW5pbWF0ZS1pLW1hcmt7MCV7dHJhbnNmb3JtOnJvdGF0ZVooNDVkZWcpO29wYWNpdHk6MH0yNSV7dHJhbnNmb3JtOnJvdGF0ZVooLTI1ZGVnKTtvcGFjaXR5Oi40fTUwJXt0cmFuc2Zvcm06cm90YXRlWigxNWRlZyk7b3BhY2l0eTouOH03NSV7dHJhbnNmb3JtOnJvdGF0ZVooLTVkZWcpO29wYWNpdHk6MX0xMDAle3RyYW5zZm9ybTpyb3RhdGVYKDApO29wYWNpdHk6MX19Ym9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wKTpub3QoLnN3YWwyLXRvYXN0LXNob3duKXtvdmVyZmxvdzpoaWRkZW59Ym9keS5zd2FsMi1oZWlnaHQtYXV0b3toZWlnaHQ6YXV0byAhaW1wb3J0YW50fWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMCkgIWltcG9ydGFudDtwb2ludGVyLWV2ZW50czpub25lfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lciAuc3dhbDItcG9wdXB7cG9pbnRlci1ldmVudHM6YWxsfWJvZHkuc3dhbDItbm8tYmFja2Ryb3AgLnN3YWwyLWNvbnRhaW5lciAuc3dhbDItbW9kYWx7Ym94LXNoYWRvdzowIDAgMTBweCByZ2JhKDAsMCwwLC40KX1AbWVkaWEgcHJpbnR7Ym9keS5zd2FsMi1zaG93bjpub3QoLnN3YWwyLW5vLWJhY2tkcm9wKTpub3QoLnN3YWwyLXRvYXN0LXNob3duKXtvdmVyZmxvdy15OnNjcm9sbCAhaW1wb3J0YW50fWJvZHkuc3dhbDItc2hvd246bm90KC5zd2FsMi1uby1iYWNrZHJvcCk6bm90KC5zd2FsMi10b2FzdC1zaG93bik+W2FyaWEtaGlkZGVuPXRydWVde2Rpc3BsYXk6bm9uZX1ib2R5LnN3YWwyLXNob3duOm5vdCguc3dhbDItbm8tYmFja2Ryb3ApOm5vdCguc3dhbDItdG9hc3Qtc2hvd24pIC5zd2FsMi1jb250YWluZXJ7cG9zaXRpb246c3RhdGljICFpbXBvcnRhbnR9fWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lcntib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MzYwcHg7bWF4LXdpZHRoOjEwMCU7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLDApO3BvaW50ZXItZXZlbnRzOm5vbmV9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcHt0b3A6MDtyaWdodDphdXRvO2JvdHRvbTphdXRvO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtZW5kLGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi10b3AtcmlnaHR7dG9wOjA7cmlnaHQ6MDtib3R0b206YXV0bztsZWZ0OmF1dG99Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLXRvcC1zdGFydCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItdG9wLWxlZnR7dG9wOjA7cmlnaHQ6YXV0bztib3R0b206YXV0bztsZWZ0OjB9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWNlbnRlci1zdGFydCxib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVyLWxlZnR7dG9wOjUwJTtyaWdodDphdXRvO2JvdHRvbTphdXRvO2xlZnQ6MDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItY2VudGVye3RvcDo1MCU7cmlnaHQ6YXV0bztib3R0b206YXV0bztsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsIC01MCUpfWJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItZW5kLGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1jZW50ZXItcmlnaHR7dG9wOjUwJTtyaWdodDowO2JvdHRvbTphdXRvO2xlZnQ6YXV0bzt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9tLXN0YXJ0LGJvZHkuc3dhbDItdG9hc3Qtc2hvd24gLnN3YWwyLWNvbnRhaW5lci5zd2FsMi1ib3R0b20tbGVmdHt0b3A6YXV0bztyaWdodDphdXRvO2JvdHRvbTowO2xlZnQ6MH1ib2R5LnN3YWwyLXRvYXN0LXNob3duIC5zd2FsMi1jb250YWluZXIuc3dhbDItYm90dG9te3RvcDphdXRvO3JpZ2h0OmF1dG87Ym90dG9tOjA7bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSl9Ym9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1lbmQsYm9keS5zd2FsMi10b2FzdC1zaG93biAuc3dhbDItY29udGFpbmVyLnN3YWwyLWJvdHRvbS1yaWdodHt0b3A6YXV0bztyaWdodDowO2JvdHRvbTowO2xlZnQ6YXV0b30iKTsKCi8qKiovIH0pLAoKLyoqKi8gNjU6Ci8qKiovICgobW9kdWxlKSA9PiB7Cgptb2R1bGUuZXhwb3J0cyA9ICIubXpmX2J0bnt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6Ljg1ZW07Y29sb3I6IzA5YWFmZjtib3JkZXI6MnB4IHNvbGlkICNjM2VhZmY7Ym9yZGVyLXJhZGl1czo0cHg7bWFyZ2luLWxlZnQ6NXB4O3BhZGRpbmc6MTBweDtwYWRkaW5nLXRvcDo1cHg7cGFkZGluZy1ib3R0b206NXB4O2N1cnNvcjpwb2ludGVyfS5temZfYnRuMnt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojMDlhYWZmO21hcmdpbi1sZWZ0OjVweDtjdXJzb3I6cG9pbnRlcn0ubXpmX2xpbmt7Zm9udC1mYW1pbHk6aW5oZXJpdDtjb2xvcjojMDlhYWZmO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS5temZfdGV4dHtmb250LWZlYXR1cmUtc2V0dGluZ3M6XCJsbnVtXCI7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDtmb250LWZhbWlseTppbmhlcml0O2NvbG9yOiM1NDU0NTQ7Zm9udC13ZWlnaHQ6NDAwO3dvcmQtYnJlYWs6YnJlYWstd29yZDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7bWFyZ2luOjA7cGFkZGluZzowO3dpZHRoOjEwMCU7aGVpZ2h0OjM0cHg7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDozNHB4O3RleHQtYWxpZ246Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcH0ubXpmX2Fycm93e21hcmdpbi1yaWdodDo1cHg7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpO3RyYW5zaXRpb246dHJhbnNmb3JtIC4ycztmaWxsOm5vbmU7c3Ryb2tlOmdyYXl9Lm16Zl9kZXRhaWxze2N1cnNvcjpwb2ludGVyfS5temZfY29udGVudHttYXgtaGVpZ2h0OjA7bWFyZ2luOjA7dHJhbnNpdGlvbjptYXgtaGVpZ2h0IC41cztvdmVyZmxvdzpoaWRkZW59Lm16Zl9kZXRhaWxzW29wZW5dPnN1bW1hcnk+c3Zne3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9Lm16Zl9kZXRhaWxzW29wZW5dKy5temZfY29udGVudHttYXgtaGVpZ2h0OjEwMCV9Lm16Zl9odG1sX2NvbnRhaW5lcntncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWlubWF4KDAsIDEwMCUpO2FsaWduLXNlbGY6Y2VudGVyO2p1c3RpZnktc2VsZjpjZW50ZXI7d2lkdGg6MzJlbTttYXgtd2lkdGg6MTAwJX0ubXpmX3VwZGF0ZUluZm97Ym9yZGVyOjFweCAjMDAwO3dpZHRoOjEwMCU7bWFyZ2luOjAgYXV0b30ubXpmX3VwZGF0ZUluZm8gc3Bhbnt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX0iCgovKioqLyB9KSwKCi8qKiovIDE4NDoKLyoqKi8gKChtb2R1bGUpID0+IHsKCm1vZHVsZS5leHBvcnRzID0gIjxkaXYgY2xhc3M9XCJwYW5lbC1ib2R5XCIgc3R5bGU9XCJoZWlnaHQ6IDIyMHB4O1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJtemZfdXBkYXRlSW5mb1wiPlxyXG4gICAgPHA+5pu05paw5pel5b+XOjwvcD5cclxuICAgIDx1bD5cclxuICAgICAgPGxpPuWujOaIkOS6huaWsOiEmuacrDogPGEgaHJlZj1cImh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvemgtQ04vc2NyaXB0cy80NTk4NjJcIiBjbGFzcz1cIm16Zl9saW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXHJcbiAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+56eS5Lyg6ZO+5o6l5o+Q5Y+WVWx0cmE8L2E+LCDlronoo4XlkI7ml6DpnIDmiZPlvIDnvZHnm5jkuLvpobXljbPlj6/nm7TmjqXovazlrZjpobXpnaLkuIrnmoTnp5LkvKDpk77mjqU8L2xpPlxyXG4gICAgICA8bGk+55Sf5oiQ56eS5Lyg5pe2LCDlr7zlh7rot6/lvoTmlLnkuLrnm7jlr7not6/lvoQsIOmYsuatoui3r+W+hOi/h+mVvzwvbGk+XHJcbiAgICA8L3VsPlxyXG4gICAgPC9icj5cclxuICAgIDx1bD5cclxuICAgICAgPGxpPuWFs+iBlDogPGEgaHJlZj1cImh0dHBzOi8vYWZkaWFuLm5ldC9AbWVuZ3pvbmVmaXJlXCIgY2xhc3M9XCJtemZfbGlua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxyXG4gICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+6LWe5Yqp6aG1PC9hPlxyXG4gICAgICAgIDxhIGhyZWY9XCJodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvNDI0NTc0XCIgY2xhc3M9XCJtemZfbGlua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxyXG4gICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+5Y+N6aaI6aG1PC9hPlxyXG4gICAgICA8L2xpPlxyXG4gICAgICA8bGk+56eS5Lyg5paH5qGjOiA8YSBocmVmPVwiaHR0cHM6Ly9tZW5nem9uZWZpcmUuY29kZS5taXNha2FuZXQuY24vcmFwaWQtdXBsb2FkLXVzZXJzY3JpcHQtZG9jXCIgY2xhc3M9XCJtemZfbGlua1wiXHJcbiAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+6L2954K5MTwvYT5cclxuICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly94dHNhdC5naXRodWIuaW8vcmFwaWQtdXBsb2FkLXVzZXJzY3JpcHQtZG9jXCIgY2xhc3M9XCJtemZfbGlua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxyXG4gICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+6L2954K5MjwvYT5cclxuICAgICAgPC9saT5cclxuICAgICAgPGxpPuiEmuacrOabtOaWsOWOhuWPsjogPGEgaHJlZj1cImh0dHBzOi8vbWVuZ3pvbmVmaXJlLmNvZGUubWlzYWthbmV0LmNuL3JhcGlkLXVwbG9hZC11c2Vyc2NyaXB0LWRvYy9kZXZlbG9wbWVudC/ohJrmnKzmm7TmlrDml6Xlv5dcIlxyXG4gICAgICAgICAgY2xhc3M9XCJtemZfbGlua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiB0YXJnZXQ9XCJfYmxhbmtcIj7ovb3ngrkxPC9hPlxyXG4gICAgICAgIDxhIGhyZWY9XCJodHRwczovL3h0c2F0LmdpdGh1Yi5pby9yYXBpZC11cGxvYWQtdXNlcnNjcmlwdC1kb2MvZGV2ZWxvcG1lbnQv6ISa5pys5pu05paw5pel5b+XXCIgY2xhc3M9XCJtemZfbGlua1wiXHJcbiAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+6L2954K5MjwvYT5cclxuICAgICAgPC9saT5cclxuICAgICAgPGxpPuenkuS8oOe9kemhteeJiOW3peWFtzogPGEgaHJlZj1cImh0dHBzOi8vcmFwaWRhY2cuZ21nYXJkLm1vZS9cIiBjbGFzcz1cIm16Zl9saW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXHJcbiAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIj7ovb3ngrkxPC9hPlxyXG4gICAgICAgIDxhIGhyZWY9XCJodHRwczovL21lbmd6b25lZmlyZS5naXRodWIuaW8vYmFpZHVwYW4tcmFwaWR1cGxvYWRcIiBjbGFzcz1cIm16Zl9saW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXHJcbiAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIj7ovb3ngrkyPC9hPlxyXG4gICAgICAgIDxhIGhyZWY9XCJodHRwczovL21lbmd6b25lZmlyZS5jb2RlLm1pc2FrYW5ldC5jbi9iYWlkdXBhbi1yYXBpZHVwbG9hZFwiIGNsYXNzPVwibXpmX2xpbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcclxuICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPui9veeCuTM8L2E+XHJcbiAgICAgIDwvbGk+XHJcbiAgICAgIDxsaT7pobnnm67mupDnoIE6IDxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vbWVuZ3pvbmVmaXJlL3JhcGlkLXVwbG9hZC11c2Vyc2NyaXB0XCIgY2xhc3M9XCJtemZfbGlua1wiXHJcbiAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+56eS5Lyg6ISa5pysPC9hPlxyXG4gICAgICAgIDxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vWFRzYXQvcmFwaWQtdXBsb2FkLXVzZXJzY3JpcHQtZG9jXCIgY2xhc3M9XCJtemZfbGlua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxyXG4gICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+56eS5Lyg5paH5qGjPC9hPlxyXG4gICAgICAgIDxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vbWVuZ3pvbmVmaXJlL2JhaWR1cGFuLXJhcGlkdXBsb2FkXCIgY2xhc3M9XCJtemZfbGlua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxyXG4gICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCI+56eS5Lyg572R6aG154mI5bel5YW3PC9hPlxyXG4gICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuICA8L2Rpdj5cclxuPC9kaXY+IgoKLyoqKi8gfSksCgovKioqLyAxNDk6Ci8qKiovICgobW9kdWxlKSA9PiB7Cgptb2R1bGUuZXhwb3J0cyA9ICIvKuiHquWumuS5ieWNlemAieahhuagt+W8jyovXG4ubXpmX2NoZWNrIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgYm9yZGVyLXJhZGl1czogNXB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZDNkM2QzO1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICBtYXJnaW4tbGVmdDogMTBweDtcbn1cbi5temZfY2hlY2tfb3JpOmNoZWNrZWQgKyAubXpmX2NoZWNrIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbn1cbi5temZfY2hlY2tfb3JpOmNoZWNrZWQgKyAubXpmX2NoZWNrOjphZnRlciB7XG4gIGNvbnRlbnQ6IFwi4pyTXCI7XG59XG4ubXpmX2NoZWNrX29yaSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8q5paw54mI5bqm55uY6aG16Z2i55qE5oyJ6ZKu5qC35byPKOebtOaOpeaLt+i0nSkqL1xuLm16Zl9uZXdfYnRuIHtcbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlO1xuICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDtcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgZm9udDogaW5oZXJpdDtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICBmb250LWZhbWlseTogU0ZVSVRleHQsIFBpbmdGYW5nU0MtUmVndWxhciwgSGVsdmV0aWNhIE5ldWUsIEhlbHZldGljYSwgQXJpYWwsXG4gICAgc2Fucy1zZXJpZjtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBsaW5lLWhlaWdodDogMTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG91dGxpbmU6IDA7XG4gIG1hcmdpbjogMDtcbiAgdHJhbnNpdGlvbjogMC4xcztcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwNmE3ZmY7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIHBhZGRpbmc6IDhweCAyNHB4O1xuICBoZWlnaHQ6IDMycHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgYm9yZGVyOiBub25lO1xuICBtYXJnaW4tbGVmdDogOHB4O1xufVxuIgoKLyoqKi8gfSkKCi8qKioqKiovIAl9KTsKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gCS8vIFRoZSBtb2R1bGUgY2FjaGUKLyoqKioqKi8gCXZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTsKLyoqKioqKi8gCQovKioqKioqLyAJLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb24KLyoqKioqKi8gCWZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKLyoqKioqKi8gCQkvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGUKLyoqKioqKi8gCQl2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTsKLyoqKioqKi8gCQlpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHsKLyoqKioqKi8gCQkJcmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzOwovKioqKioqLyAJCX0KLyoqKioqKi8gCQkvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0gewovKioqKioqLyAJCQkvLyBubyBtb2R1bGUuaWQgbmVlZGVkCi8qKioqKiovIAkJCS8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkCi8qKioqKiovIAkJCWV4cG9ydHM6IHt9Ci8qKioqKiovIAkJfTsKLyoqKioqKi8gCQovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbgovKioqKioqLyAJCV9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwovKioqKioqLyAJCi8qKioqKiovIAkJLy8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGUKLyoqKioqKi8gCQlyZXR1cm4gbW9kdWxlLmV4cG9ydHM7Ci8qKioqKiovIAl9Ci8qKioqKiovIAkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqKioqKi8gCS8qIHdlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0ICovCi8qKioqKiovIAkoKCkgPT4gewovKioqKioqLyAJCS8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzCi8qKioqKiovIAkJX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4gewovKioqKioqLyAJCQl2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID8KLyoqKioqKi8gCQkJCSgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOgovKioqKioqLyAJCQkJKCkgPT4gKG1vZHVsZSk7Ci8qKioqKiovIAkJCV9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pOwovKioqKioqLyAJCQlyZXR1cm4gZ2V0dGVyOwovKioqKioqLyAJCX07Ci8qKioqKiovIAl9KSgpOwovKioqKioqLyAJCi8qKioqKiovIAkvKiB3ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMgKi8KLyoqKioqKi8gCSgoKSA9PiB7Ci8qKioqKiovIAkJLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0cwovKioqKioqLyAJCV9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7Ci8qKioqKiovIAkJCWZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHsKLyoqKioqKi8gCQkJCWlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkgewovKioqKioqLyAJCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7Ci8qKioqKiovIAkJCQl9Ci8qKioqKiovIAkJCX0KLyoqKioqKi8gCQl9OwovKioqKioqLyAJfSkoKTsKLyoqKioqKi8gCQovKioqKioqLyAJLyogd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCAqLwovKioqKioqLyAJKCgpID0+IHsKLyoqKioqKi8gCQlfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpCi8qKioqKiovIAl9KSgpOwovKioqKioqLyAJCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0ge307Ci8vIFRoaXMgZW50cnkgbmVlZCB0byBiZSB3cmFwcGVkIGluIGFuIElJRkUgYmVjYXVzZSBpdCBuZWVkIHRvIGJlIGluIHN0cmljdCBtb2RlLgooKCkgPT4gewoidXNlIHN0cmljdCI7CgovLyBFWFRFUk5BTCBNT0RVTEU6IC4vc3JjL2Nzcy9hcHAuY3NzCnZhciBhcHAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0OSk7CnZhciBhcHBfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oYXBwKTsKLy8gRVhURVJOQUwgTU9EVUxFOiAuL3NyYy9jc3MvYXBwLnNjc3MKdmFyIGNzc19hcHAgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDY1KTsKdmFyIGNzc19hcHBfZGVmYXVsdCA9IC8qI19fUFVSRV9fKi9fX3dlYnBhY2tfcmVxdWlyZV9fLm4oY3NzX2FwcCk7CjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb21tb24vY29uc3QudHN4Ci8qCiAqIEBBdXRob3I6IG1lbmd6b25lZmlyZQogKiBARGF0ZTogMjAyMS0wNy0yMyAxNzo0MToyOAogKiBATGFzdEVkaXRUaW1lOiAyMDIzLTAyLTE0IDAzOjU4OjMwCiAqIEBMYXN0RWRpdG9yczogbWVuZ3pvbmVmaXJlCiAqIEBEZXNjcmlwdGlvbjog5a2Y5pS+5ZCE56eN5YWo5bGA5bi46YeP5a+56LGhCiAqLwp2YXIgdmVyc2lvbiA9ICIyLjYuMCI7IC8vIOW9k+WJjeeJiOacrOWPtwp2YXIgdXBkYXRlRGF0ZSA9ICIyMy4yLjE0IjsgLy8g5pu05paw5by556qX5pi+56S655qE5pel5pyfCnZhciB1cGRhdGVJbmZvVmVyID0gIjIuNS44IjsgLy8g5pu05paw5by556qX55qE54mI5pysLCDmsqHlv4XopoHmj5DnpLrnmoTpnZ7lip/og73mgKfmm7TmlrDlsLHkuI3lvLnnqpfkuoYKdmFyIHN3YWxDc3NWZXIgPSAiMS43LjQiOyAvLyDnlLHkuo7lhbbku5bkuLvpopjnmoRDc3Pku6PnoIHkvJrnvJPlrZjliLDmnKzlnLAsIOaVheabtOaWsOS4u+mimOWMheeJiOacrCh1cmwp5pe2LCDpnIDopoHlkIzml7bmm7TmlrDor6XlrZfmrrXku6XliLfmlrDnvJPlrZgKdmFyIGRvbmF0ZVZlciA9ICIyLjUuMyI7IC8vIOeUqOS6juajgOa1i+WPr+WFs+mXreeahOi1nuWKqeaPkOekuueahOeJiOacrOWPtwp2YXIgZmVlZGJhY2tWZXIgPSAiMi41LjMiOyAvLyDnlKjkuo7mo4DmtYvlj6/lhbPpl63nmoTlj43ppojmj5DnpLrnmoTniYjmnKzlj7cKdmFyIGxvY1VybCA9IGxvY2F0aW9uLmhyZWY7CnZhciBiYWlkdU5ld1BhZ2UgPSAiYmFpZHUuY29tL2Rpc2svbWFpbiI7IC8vIOWMuemFjeaWsOeJiOW6puebmOeVjOmdogp2YXIgYmFpZHVTeW5jUGFnZSA9ICJiYWlkdS5jb20vZGlzay9zeW5jaHJvbml6YXRpb24iOyAvLyDljLnphY3lkIzmraXnqbrpl7QKdmFyIGJhaWR1U2hhcmVQYWdlID0gImJhaWR1LmNvbS9zLyI7IC8vIOWMuemFjeWIhuS6q+mhtQp2YXIgVEFHID0gIlvnp5LkvKDpk77mjqXmj5Dlj5YgYnkgbWVuZ3pvbmVmaXJlXSI7CnZhciBob21lUGFnZSA9ICJodHRwczovL2dyZWFzeWZvcmsub3JnL3poLUNOL3NjcmlwdHMvNDI0NTc0IjsKdmFyIGRvbmF0ZVBhZ2UgPSAiaHR0cHM6Ly9hZmRpYW4ubmV0L0BtZW5nem9uZWZpcmUiOwp2YXIgYWpheEVycm9yID0gNTE0OyAvLyDoh6rlrprkuYlhamF46K+35rGC5aSx6LSl5pe255qE6ZSZ6K+v56CBKOS4jeiDveS4jmh0dHAgc3RhdHVzQ29kZeWGsueqgSkKdmFyIGJkbGlua1ByZWZpeCA9ICJodHRwczovL3Bhbi5iYWlkdS5jb20vI2JkbGluaz0iOyAvLyDkuIDplK7np5LkvKDpk77mjqXnmoTliY3nvIAKdmFyIGNvbW1hbmRMaXN0ID0gWyJzZXQiLCAiZ2VuIiwgImluZm8iXTsgLy8g6L2s5a2Y6L6T5YWl5qGG5YaF5pSv5oyB6L6T5YWl55qE5ZG95LukCnZhciBVQSA9ICJuZXRkaXNrOzIuMi41MS42O25ldGRpc2s7MTAuMC42MztQQzthbmRyb2lkLWFuZHJvaWQ7UVRQLzEuMC4zMi4yIjsgLy8g6Ieq5a6a5LmJVXNlci1BZ2VudAp2YXIgZXh0Q3NzVXJsID0gewogICAgRGVmYXVsdDogIiIsCiAgICBEYXJrOiAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9Ac3dlZXRhbGVydDIvdGhlbWUtZGFya0A1L2RhcmsubWluLmNzcyIsCiAgICAiV29yZFByZXNzIEFkbWluIjogImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHN3ZWV0YWxlcnQyL3RoZW1lLXdvcmRwcmVzcy1hZG1pbkA1L3dvcmRwcmVzcy1hZG1pbi5taW4uY3NzIiwKICAgICJNYXRlcmlhbCBVSSI6ICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0Bzd2VldGFsZXJ0Mi90aGVtZS1tYXRlcmlhbC11aUA1L21hdGVyaWFsLXVpLm1pbi5jc3MiLAogICAgQnVsbWE6ICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL0Bzd2VldGFsZXJ0Mi90aGVtZS1idWxtYUA1L2J1bG1hLm1pbi5jc3MiLAogICAgIkJvb3RzdHJhcCA0IjogImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vQHN3ZWV0YWxlcnQyL3RoZW1lLWJvb3RzdHJhcC00L2Jvb3RzdHJhcC00Lm1pbi5jc3MiLAp9OyAvLyDlkITkuLvpopjljIXlr7nlupTnmoR1cmwKdmFyIGFwcEVycm9yID0gewogICAgU3dhbENzc0ludmFsaWQ6ICJcdTY4MzdcdTVGMEZcdTUzMDVcdTY1NzBcdTYzNkVcdTk1MTlcdThCRUYsIFx1OEJGN1x1NTI0RFx1NUY4MFx1ODExQVx1NjcyQ1x1OTg3NVx1NTNDRFx1OTk4ODpcbiIgKyBob21lUGFnZSwKICAgIFN3YWxDc3NFcnJSZXE6ICJcdTY4MzdcdTVGMEZcdTUzMDVcdTUyQTBcdThGN0RcdTU5MzFcdThEMjUsIFx1OEJGN1x1NTI0RFx1NUY4MFx1ODExQVx1NjcyQ1x1OTg3NVx1NTNDRFx1OTk4ODpcbiIgKyBob21lUGFnZSArICJcblx1OTUxOVx1OEJFRlx1NEVFM1x1NzgwMTogIiwKICAgIENsaXBib2FyZFByZW1pc3Npb25FcnI6ICfkvb/nlKggIuebkeWQrOWJqui0tOadvyIg5Yqf6IO96ZyA6KaB5YWB6K645Ymq6LS05p2/5p2D6ZmQIVxu6K+l5Yqf6IO95Y+q5pSv5oyBQ2hyb21l57O7L0VkZ2UvT3BlcmHmtY/op4jlmagsIOS4jeaUr+aMgUZpcmVmb3gsIOWQjOaXtuazqOaEj+S9v+eUqGh0dHBz6K6/6Zeu6aG16Z2iIChodHRw6K6/6Zeu5Lya5a+86Ie05rWP6KeI5Zmo55u05o6l56aB5q2i5Ymq6LS05p2/5p2D6ZmQKScsCn07IC8vIOS4u+eoi+W6j+W8guW4uAp2YXIgYXBwV2FybmluZyA9IHsKICAgIGZhc3RHZW5lcmF0ZVdhcm46ICfkvb/nlKggIuaegemAn+eUn+aIkCIg5Yqf6IO96K+35rOo5oSPOlxu5LyY54K5OlxuMS4g5p6B5aSn5bmF5bqm5o+Q6auY56eS5Lyg55Sf5oiQ6YCf5bqmXG4yLiDmnInmlYjpgb/lhY0gIm1kNeiOt+WPluWksei0pSgjOTk2KSIgIuaOpeWPo+mZkOWItuiuv+mXrigjNDAzKSJcbue8uueCuTpcbjEuIOeUn+aIkOWSjOiwkOaWh+S7tuenkuS8oOaXtuWkp+amgueOh+ato+W4uOeUn+aIkCAo6Z2e5p6B6YCf55Sf5oiQ5YiZ5Lya5oql6ZSZIzE5MTkpXG4yLiDnlJ/miJDnmoTnp5LkvKDmoLzlvI/kuLrnroDljJbniYgsIOWPquS/neivgeacgOaWsOeJiOeahCDnp5LkvKDohJrmnKwg5ZKMIOenkuS8oOe9kemhteeJiCDmlK/mjIHovazlrZhcblxuKiDoi6XlvIDlkK/lkI7lh7rnjrDpl67popjor7fmoLnmja7orr7nva7pobXlhoXnmoQgIuivtOaYjuaWh+ahoyIg6L+b6KGM5Y+N6aaIJywKfTsgLy8g5Li756iL5bqP5ZCE5Yqf6IO96K2m5ZGKL+aPkOmGkgp2YXIgZG9jUHJlZml4ID0gImh0dHBzOi8vbWVuZ3pvbmVmaXJlLmNvZGUubWlzYWthbmV0LmNuL3JhcGlkLXVwbG9hZC11c2Vyc2NyaXB0LWRvYy9kb2N1bWVudCI7CnZhciBkb2NQcmVmaXgyID0gImh0dHBzOi8veHRzYXQuZ2l0aHViLmlvL3JhcGlkLXVwbG9hZC11c2Vyc2NyaXB0LWRvYy9kb2N1bWVudCI7CnZhciBkb2MgPSB7CiAgICBzaGFyZURvYzogZG9jUHJlZml4ICsgIi9GQVEvXHU5NTE5XHU4QkVGXHU0RUUzXHU3ODAxIiwKICAgIGxpbmtUeXBlRG9jOiBkb2NQcmVmaXggKyAiL0luZm8vXHU3OUQyXHU0RjIwXHU2ODNDXHU1RjBGIiwKICAgIGJkbGlua0RvYzogZG9jUHJlZml4ICsgIi9cdTc5RDJcdTRGMjBcdTk0RkVcdTYzQTVcdTc1MUZcdTYyMTAvXHU0RTAwXHU5NTJFXHU3OUQyXHU0RjIwIiwKICAgIGZhc3RHZW5Eb2M6IGRvY1ByZWZpeCArICIvXHU3OUQyXHU0RjIwXHU5NEZFXHU2M0E1XHU3NTFGXHU2MjEwL1x1Njc4MVx1OTAxRlx1NzUxRlx1NjIxMCIsCn07IC8vIOaWh+aho+i9veeCuTEKdmFyIGRvYzIgPSB7CiAgICBzaGFyZURvYzogZG9jUHJlZml4MiArICIvRkFRL1x1OTUxOVx1OEJFRlx1NEVFM1x1NzgwMSIsCiAgICBsaW5rVHlwZURvYzogZG9jUHJlZml4MiArICIvSW5mby9cdTc5RDJcdTRGMjBcdTY4M0NcdTVGMEYiLAogICAgYmRsaW5rRG9jOiBkb2NQcmVmaXgyICsgIi9cdTc5RDJcdTRGMjBcdTk0RkVcdTYzQTVcdTc1MUZcdTYyMTAvXHU0RTAwXHU5NTJFXHU3OUQyXHU0RjIwIiwKICAgIGZhc3RHZW5Eb2M6IGRvY1ByZWZpeDIgKyAiL1x1NzlEMlx1NEYyMFx1OTRGRVx1NjNBNVx1NzUxRlx1NjIxMC9cdTY3ODFcdTkwMUZcdTc1MUZcdTYyMTAiLAp9OyAvLyDmlofmoaPovb3ngrkyCnZhciBsaW5rU3R5bGUgPSAnY2xhc3M9Im16Zl9saW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiIHRhcmdldD0iX2JsYW5rIic7CnZhciBidG5TdHlsZSA9ICdjbGFzcz0ibXpmX2J0biIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiB0YXJnZXQ9Il9ibGFuayInOwp2YXIgYmRsaW5rUGF0dGVybiA9IC8jYmRsaW5rPShbXGRhLXpBLVorLz1dKykvOyAvLyBiNjTlj6/og73lh7rnjrDnmoTlrZfnrKY6IOWkp+Wwj+WGmeWtl+avjWEtekEtWiwg5pWw5a2XMC05LCArLCAvLCA9ICg955So5LqO5pyr5bC+6KGl5L2NKQp2YXIgaHRtbERvY3VtZW50ID0gIjxwIGNsYXNzPVwibXpmX3RleHRcIj5cdTc5RDJcdTRGMjBcdTY1RTBcdTY1NDgsXHU5NjMyXHU1NDhDXHU4QzEwXHU3QjQ5IFx1NTNFRlx1NTNDMlx1ODAwM1x1NzlEMlx1NEYyMFx1NjU4N1x1Njg2MzxhIGhyZWY9XCIiICsgZG9jLnNoYXJlRG9jICsgIlwiICIgKyBidG5TdHlsZSArICI+PHNwYW4gY2xhc3M9XCJ0ZXh0XCIgc3R5bGU9XCJ3aWR0aDogYXV0bztcIj5cdThGN0RcdTcwQjkxPC9zcGFuPjwvYT48YSBocmVmPVwiIiArIGRvYzIuc2hhcmVEb2MgKyAiXCIgIiArIGJ0blN0eWxlICsgIj48c3BhbiBjbGFzcz1cInRleHRcIiBzdHlsZT1cIndpZHRoOiBhdXRvO1wiPlx1OEY3RFx1NzBCOTI8L3NwYW4+PC9hPjwvcD4iOwp2YXIgaHRtbERvbmF0ZSA9ICI8cCBpZD1cIm16Zl9kb25hdGVcIiBjbGFzcz1cIm16Zl90ZXh0XCI+XHU4MkU1XHU1NTlDXHU2QjIyXHU4QkU1XHU4MTFBXHU2NzJDLCBcdTUzRUZcdTUyNERcdTVGODAgPGEgaHJlZj1cIiIgKyBkb25hdGVQYWdlICsgIlwiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEQ1RVx1NTJBOVx1OTg3NTwvYT4gXHU2NTJGXHU2MzAxXHU0RjVDXHU4MDA1PGEgaWQ9XCJraWxsX2RvbmF0ZVwiIGNsYXNzPVwibXpmX2J0blwiPlx1NEUwRFx1NTE4RFx1NjYzRVx1NzkzQTwvYT48L3A+IjsKdmFyIGh0bWxGZWVkYmFjayA9ICI8cCBpZD1cIm16Zl9mZWVkYmFja1wiIGNsYXNzPVwibXpmX3RleHRcIj5cdTgyRTVcdTY3MDlcdTRFRkJcdTRGNTVcdTc1OTFcdTk1RUUsIFx1NTNFRlx1NTI0RFx1NUY4MCA8YSBocmVmPVwiIiArIGhvbWVQYWdlICsgIlwiICIgKyBsaW5rU3R5bGUgKyAiPlx1ODExQVx1NjcyQ1x1NEUzQlx1OTg3NTwvYT4gXHU1M0NEXHU5OTg4PGEgaWQ9XCJraWxsX2ZlZWRiYWNrXCIgY2xhc3M9XCJtemZfYnRuXCI+XHU0RTBEXHU1MThEXHU2NjNFXHU3OTNBPC9hPjwvcD4iOwp2YXIgaHRtbEFib3V0QmRsaW5rID0gIlx1NEVDMFx1NEU0OFx1NjYyRlx1NEUwMFx1OTUyRVx1NzlEMlx1NEYyMD86IDxhIGhyZWY9XCIiICsgZG9jLmJkbGlua0RvYyArICJcIiAiICsgbGlua1N0eWxlICsgIj5cdTY1ODdcdTY4NjNcdThGN0RcdTcwQjkxPC9hPiA8YSBocmVmPVwiIiArIGRvYzIuYmRsaW5rRG9jICsgIlwiICIgKyBsaW5rU3R5bGUgKyAiPlx1NjU4N1x1Njg2M1x1OEY3RFx1NzBCOTI8L2E+IjsKdmFyIGNvcHlGYWlsTGlzdCA9ICc8YSBpZD0iY29weV9mYWlsX2xpc3QiIGNsYXNzPSJtemZfYnRuMiI+5aSN5Yi25YiX6KGoPC9hPjwvcD4nOwp2YXIgY29weUZhaWxCcmFuY2hMaXN0ID0gJzxhIGlkPSJjb3B5X2ZhaWxfYnJhbmNoX2xpc3QiIGNsYXNzPSJtemZfYnRuMiI+5aSN5Yi25YiX6KGoPC9hPjwvcD4nOwp2YXIgY29weVN1Y2Nlc3NMaXN0ID0gJzxhIGlkPSJjb3B5X3N1Y2Nlc3NfbGlzdCIgY2xhc3M9Im16Zl9idG4yIj7lpI3liLbliJfooag8L2E+PC9wPic7Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL2R1UGFyc2VyLnRzeAovKgogKiBAQXV0aG9yOiBtZW5nem9uZWZpcmUKICogQERhdGU6IDIwMjEtMDgtMjYgMTI6MDE6MjgKICogQExhc3RFZGl0VGltZTogMjAyMi0wOC0yOSAxMDoyMTowNQogKiBATGFzdEVkaXRvcnM6IG1lbmd6b25lZmlyZQogKiBARGVzY3JpcHRpb246IOWQhOenjeino+aekOWZqAogKi8KCgovKioKICogQGRlc2NyaXB0aW9uOiDku451cmzkuK3op6PmnpDnp5LkvKDpk77mjqUKICovCmZ1bmN0aW9uIHBhcnNlUXVlcnlMaW5rKHVybCkgewogICAgdmFyIGJkbGlua0I2NCA9IHVybC5tYXRjaChiZGxpbmtQYXR0ZXJuKTsKICAgIHJldHVybiBiZGxpbmtCNjQgPyBiZGxpbmtCNjRbMV0uZnJvbUJhc2U2NCgpIDogIiI7Cn0KLyoqCiAqIEBkZXNjcmlwdGlvbjog56eS5Lyg6ZO+5o6l6Kej5p6Q5ZmoCiAqLwpmdW5jdGlvbiBEdVBhcnNlcigpIHsgfQpEdVBhcnNlci5wYXJzZSA9IGZ1bmN0aW9uIGdlbmVyYWxEdUNvZGVQYXJzZShzelVybCkgewogICAgdmFyIHI7CiAgICBpZiAoc3pVcmwuaW5kZXhPZigiYmRwYW4iKSA9PT0gMCkgewogICAgICAgIHIgPSBEdVBhcnNlci5wYXJzZUR1X3YxKHN6VXJsKTsKICAgICAgICByLnZlciA9ICJQYW5ETCI7CiAgICB9CiAgICBlbHNlIGlmIChzelVybC5pbmRleE9mKCJCYWlkdVBDUy1HbyIpID09PSAwKSB7CiAgICAgICAgciA9IER1UGFyc2VyLnBhcnNlRHVfdjIoc3pVcmwpOwogICAgICAgIHIudmVyID0gIlBDUy1HbyI7CiAgICB9CiAgICBlbHNlIGlmIChzelVybC5pbmRleE9mKCJCRExJTksiKSA9PT0gMCkgewogICAgICAgIHIgPSBEdVBhcnNlci5wYXJzZUR1X3YzKHN6VXJsKTsKICAgICAgICByLnZlciA9ICLmuLjkvqAgdjEiOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgciA9IER1UGFyc2VyLnBhcnNlRHVfdjQoc3pVcmwpOwogICAgICAgIHIudmVyID0gIuaipuWnrOagh+WHhiI7CiAgICB9CiAgICByZXR1cm4gcjsKfTsKRHVQYXJzZXIucGFyc2VEdV92MSA9IGZ1bmN0aW9uIHBhcnNlRHVfdjEoc3pVcmwpIHsKICAgIHJldHVybiBzelVybAogICAgICAgIC5yZXBsYWNlKC9ccypiZHBhbjpcL1wvL2csICIgIikKICAgICAgICAudHJpbSgpCiAgICAgICAgLnNwbGl0KCIgIikKICAgICAgICAubWFwKGZ1bmN0aW9uICh6KSB7CiAgICAgICAgcmV0dXJuIHoKICAgICAgICAgICAgLnRyaW0oKQogICAgICAgICAgICAuZnJvbUJhc2U2NCgpCiAgICAgICAgICAgIC5tYXRjaCgvKFtcc1xTXSspXHwoW1xkXXsxLDIwfSlcfChbXGRhLWZdezMyfSlcfChbXGRhLWZdezMyfSkvaSk7CiAgICB9KQogICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHopIHsKICAgICAgICByZXR1cm4gejsKICAgIH0pCiAgICAgICAgLm1hcChmdW5jdGlvbiAoaW5mbykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG1kNTogaW5mb1szXSwKICAgICAgICAgICAgbWQ1czogaW5mb1s0XSwKICAgICAgICAgICAgc2l6ZTogaW5mb1syXSwKICAgICAgICAgICAgcGF0aDogaW5mb1sxXSwKICAgICAgICB9OwogICAgfSk7Cn07CkR1UGFyc2VyLnBhcnNlRHVfdjIgPSBmdW5jdGlvbiBwYXJzZUR1X3YyKHN6VXJsKSB7CiAgICByZXR1cm4gc3pVcmwKICAgICAgICAuc3BsaXQoIlxuIikKICAgICAgICAubWFwKGZ1bmN0aW9uICh6KSB7CiAgICAgICAgLy8gdW5zaWduZWQgbG9uZyBsb25nOiAwfjE4NDQ2NzQ0MDczNzA5NTUxNjE1CiAgICAgICAgcmV0dXJuIHoKICAgICAgICAgICAgLnRyaW0oKQogICAgICAgICAgICAubWF0Y2goLy1sZW5ndGg9KFtcZF17MSwyMH0pIC1tZDU9KFtcZGEtZl17MzJ9KSAtc2xpY2VtZDU9KFtcZGEtZl17MzJ9KVtcc1xTXSsiKFtcc1xTXSspIi9pKTsKICAgIH0pCiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoeikgewogICAgICAgIHJldHVybiB6OwogICAgfSkKICAgICAgICAubWFwKGZ1bmN0aW9uIChpbmZvKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbWQ1OiBpbmZvWzJdLAogICAgICAgICAgICBtZDVzOiBpbmZvWzNdLAogICAgICAgICAgICBzaXplOiBpbmZvWzFdLAogICAgICAgICAgICBwYXRoOiBpbmZvWzRdLAogICAgICAgIH07CiAgICB9KTsKfTsKRHVQYXJzZXIucGFyc2VEdV92MyA9IGZ1bmN0aW9uIHBhcnNlRHVfdjMoc3pVcmwpIHsKICAgIHZhciByYXcgPSBhdG9iKHN6VXJsLnNsaWNlKDYpLnJlcGxhY2UoL1xzL2csICIiKSk7CiAgICBpZiAocmF3LnNsaWNlKDAsIDUpICE9PSAiQkRGU1x4MDAiKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgYnVmID0gbmV3IFNpbXBsZUJ1ZmZlcihyYXcpOwogICAgdmFyIHB0ciA9IDk7CiAgICB2YXIgYXJyRmlsZXMgPSBbXTsKICAgIHZhciBmaWxlSW5mbywgbmFtZVNpemU7CiAgICB2YXIgdG90YWwgPSBidWYucmVhZFVJbnQoNSk7CiAgICB2YXIgaTsKICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7CiAgICAgICAgLy8g5aSn5bCPICg4IGJ5dGVzKQogICAgICAgIC8vIE1ENSArIE1ENVMgKDB4MjApCiAgICAgICAgLy8gbmFtZVNpemUgKDQgYnl0ZXMpCiAgICAgICAgLy8gTmFtZSAodW5pY29kZSkKICAgICAgICBmaWxlSW5mbyA9IHt9OwogICAgICAgIGZpbGVJbmZvLnNpemUgPSBidWYucmVhZFVMb25nKHB0ciArIDApOwogICAgICAgIGZpbGVJbmZvLm1kNSA9IGJ1Zi5yZWFkSGV4KHB0ciArIDgsIDB4MTApOwogICAgICAgIGZpbGVJbmZvLm1kNXMgPSBidWYucmVhZEhleChwdHIgKyAweDE4LCAweDEwKTsKICAgICAgICBuYW1lU2l6ZSA9IGJ1Zi5yZWFkVUludChwdHIgKyAweDI4KSA8PCAxOwogICAgICAgIGZpbGVJbmZvLm5hbWVTaXplID0gbmFtZVNpemU7CiAgICAgICAgcHRyICs9IDB4MmM7CiAgICAgICAgZmlsZUluZm8ucGF0aCA9IGJ1Zi5yZWFkVW5pY29kZShwdHIsIG5hbWVTaXplKTsKICAgICAgICBhcnJGaWxlcy5wdXNoKGZpbGVJbmZvKTsKICAgICAgICBwdHIgKz0gbmFtZVNpemU7CiAgICB9CiAgICByZXR1cm4gYXJyRmlsZXM7Cn07CkR1UGFyc2VyLnBhcnNlRHVfdjQgPSBmdW5jdGlvbiBwYXJzZUR1X3YzKHN6VXJsKSB7CiAgICByZXR1cm4gc3pVcmwKICAgICAgICAuc3BsaXQoIlxuIikKICAgICAgICAubWFwKGZ1bmN0aW9uICh6KSB7CiAgICAgICAgcmV0dXJuIHoKICAgICAgICAgICAgLnRyaW0oKQogICAgICAgICAgICAubWF0Y2goL14oW1xkYS1mXXs5fVtcZGEtel1bXGRhLWZdezIyfSkjKD86KFtcZGEtZl17MzJ9KSMpPyhbXGRdezEsMjB9KSMoW1xzXFNdKykvaSk7IC8vIDIyLjguMjnmlrDlop7mlK/mjIHnrKwxMOS9jeS4umcteueahOWKoOWvhm1kNSwg6L6T5YWl5ZCO6Ieq5Yqo6Kej5a+G6L2s5a2YCiAgICB9KQogICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHopIHsKICAgICAgICByZXR1cm4gejsKICAgIH0pCiAgICAgICAgLm1hcChmdW5jdGlvbiAoaW5mbykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIC8vIOagh+WHhueggSAvIOefreeJiOagh+WHhueggSjml6BtZDVzKQogICAgICAgICAgICBtZDU6IGRlY3J5cHRNZDUoaW5mb1sxXS50b0xvd2VyQ2FzZSgpKSwKICAgICAgICAgICAgbWQ1czogaW5mb1syXSB8fCAiIiwKICAgICAgICAgICAgc2l6ZTogaW5mb1szXSwKICAgICAgICAgICAgcGF0aDogaW5mb1s0XSwKICAgICAgICB9OwogICAgfSk7Cn07Ci8qKgogKiDkuIDkuKrnroDljZXnmoTnsbvkvLzkuo4gTm9kZUpTIEJ1ZmZlciDnmoTlrp7njrAuCiAqIOeUqOS6juino+aekOa4uOS+oOW6puWomOaPkOWPlueggeOAggogKiBAcGFyYW0ge1NpbXBsZUJ1ZmZlcn0KICovCmZ1bmN0aW9uIFNpbXBsZUJ1ZmZlcihzdHIpIHsKICAgIHRoaXMuZnJvbVN0cmluZyhzdHIpOwp9ClNpbXBsZUJ1ZmZlci50b1N0ZEhleCA9IGZ1bmN0aW9uIHRvU3RkSGV4KG4pIHsKICAgIHJldHVybiAoIjAiICsgbi50b1N0cmluZygxNikpLnNsaWNlKC0yKTsKfTsKU2ltcGxlQnVmZmVyLnByb3RvdHlwZS5mcm9tU3RyaW5nID0gZnVuY3Rpb24gZnJvbVN0cmluZyhzdHIpIHsKICAgIHZhciBsZW4gPSBzdHIubGVuZ3RoOwogICAgdGhpcy5idWYgPSBuZXcgVWludDhBcnJheShsZW4pOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgIHRoaXMuYnVmW2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7CiAgICB9Cn07ClNpbXBsZUJ1ZmZlci5wcm90b3R5cGUucmVhZFVuaWNvZGUgPSBmdW5jdGlvbiByZWFkVW5pY29kZShpbmRleCwgc2l6ZSkgewogICAgaWYgKHNpemUgJiAxKSB7CiAgICAgICAgc2l6ZSsrOwogICAgfQogICAgdmFyIGJ1ZlRleHQgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UKICAgICAgICAuY2FsbCh0aGlzLmJ1ZiwgaW5kZXgsIGluZGV4ICsgc2l6ZSkKICAgICAgICAubWFwKFNpbXBsZUJ1ZmZlci50b1N0ZEhleCk7CiAgICB2YXIgYnVmID0gWyIiXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAyKSB7CiAgICAgICAgYnVmLnB1c2goYnVmVGV4dFtpICsgMV0gKyBidWZUZXh0W2ldKTsKICAgIH0KICAgIHJldHVybiBKU09OLnBhcnNlKCciJyArIGJ1Zi5qb2luKCJcXHUiKSArICciJyk7Cn07ClNpbXBsZUJ1ZmZlci5wcm90b3R5cGUucmVhZE51bWJlciA9IGZ1bmN0aW9uIHJlYWROdW1iZXIoaW5kZXgsIHNpemUpIHsKICAgIHZhciByZXQgPSAwOwogICAgZm9yICh2YXIgaSA9IGluZGV4ICsgc2l6ZTsgaSA+IGluZGV4OykgewogICAgICAgIHJldCA9IHRoaXMuYnVmWy0taV0gKyByZXQgKiAyNTY7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9OwpTaW1wbGVCdWZmZXIucHJvdG90eXBlLnJlYWRVSW50ID0gZnVuY3Rpb24gcmVhZFVJbnQoaW5kZXgpIHsKICAgIHJldHVybiB0aGlzLnJlYWROdW1iZXIoaW5kZXgsIDQpOwp9OwpTaW1wbGVCdWZmZXIucHJvdG90eXBlLnJlYWRVTG9uZyA9IGZ1bmN0aW9uIHJlYWRVTG9uZyhpbmRleCkgewogICAgcmV0dXJuIHRoaXMucmVhZE51bWJlcihpbmRleCwgOCk7Cn07ClNpbXBsZUJ1ZmZlci5wcm90b3R5cGUucmVhZEhleCA9IGZ1bmN0aW9uIHJlYWRIZXgoaW5kZXgsIHNpemUpIHsKICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UKICAgICAgICAuY2FsbCh0aGlzLmJ1ZiwgaW5kZXgsIGluZGV4ICsgc2l6ZSkKICAgICAgICAubWFwKFNpbXBsZUJ1ZmZlci50b1N0ZEhleCkKICAgICAgICAuam9pbigiIik7Cn07CgovLyBFWFRFUk5BTCBNT0RVTEU6IC4vc3JjL2NvbXBvbmVudHMvdXBkYXRlSW5mby5odG1sCnZhciB1cGRhdGVJbmZvID0gX193ZWJwYWNrX3JlcXVpcmVfXygxODQpOwp2YXIgdXBkYXRlSW5mb19kZWZhdWx0ID0gLyojX19QVVJFX18qL19fd2VicGFja19yZXF1aXJlX18ubih1cGRhdGVJbmZvKTsKOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvbW1vbi9Td2FsQ29uZmlnLnRzeAovKgogKiBAQXV0aG9yOiBtZW5nem9uZWZpcmUKICogQERhdGU6IDIwMjEtMDgtMjYgMTI6MTY6NTcKICogQExhc3RFZGl0VGltZTogMjAyMy0wMi0xMiAwMzowOTozNAogKiBATGFzdEVkaXRvcnM6IG1lbmd6b25lZmlyZQogKiBARGVzY3JpcHRpb246IOWtmOaUvuWQhFN3YWzlvLnnqpfnmoTlm7rlrprlj4LmlbDphY3nva4KICovCgoKdmFyIFN3YWxDb25maWcgPSB7CiAgICBpbnB1dFZpZXc6IHsKICAgICAgICB0aXRsZTogIuivt+i+k+WFpeenkuS8oCbkv53lrZjot6/lvoQiLAogICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsCiAgICAgICAgaHRtbDogIjx0ZXh0YXJlYSBpZD1cIm16Zi1yYXBpZC1pbnB1dFwiIGNsYXNzPVwic3dhbDItdGV4dGFyZWFcIiBwbGFjZWhvbGRlcj1cIlx1MDBCNyBcdTY1MkZcdTYzMDFcdTYyNzlcdTkxQ0ZcdThGNkNcdTVCNThcdTU5MUFcdTY3NjFcdTc5RDJcdTRGMjAoXHU2MzYyXHU4ODRDXHU1MjA2XHU5Njk0KVxuXHUwMEI3IFx1NjUyRlx1NjMwMVBhbkRML1x1NkUzOFx1NEZBMC9cdTY4MDdcdTUxQzZcdTc4MDEvUENTLUdPXHU2ODNDXHU1RjBGXG5cdTAwQjcgXHU2NTJGXHU2MzAxXHU4RjkzXHU1MTY1XHU0RTAwXHU5NTJFXHU3OUQyXHU0RjIwKFx1ODFFQVx1NTJBOFx1OEY2Q1x1NjM2Mlx1NEUzQVx1NjY2RVx1OTAxQVx1NzlEMlx1NEYyMClcblx1MDBCNyBcdTUzRUZcdTU3MjhcdThCQkVcdTdGNkVcdTk4NzVcdTVGMDBcdTU0MkZcdTc2RDFcdTU0MkNcdTUyNkFcdThEMzRcdTY3N0YsXHU4MUVBXHU1MkE4XHU3Qzk4XHU4RDM0XHU3OUQyXHU0RjIwXG5cdTAwQjcgXHU4RjkzXHU1MTY1c2V0XHU4RkRCXHU1MTY1XHU4QkJFXHU3RjZFXHU5ODc1LGdlblx1OEZEQlx1NTE2NVx1NzUxRlx1NjIxMFx1OTg3NSxpbmZvXHU4RkRCXHU1MTY1XHU3MjQ4XHU2NzJDXHU0RkUxXHU2MDZGXHU5ODc1XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O3BhZGRpbmc6IDAuNGVtO1wiPjwvdGV4dGFyZWE+XG4gICAgPGlucHV0IGlkPVwibXpmLXBhdGgtaW5wdXRcIiBjbGFzcz1cInN3YWwyLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJcdTRGRERcdTVCNThcdThERUZcdTVGODQsIFx1NzkzQVx1NEY4QjogL0dUQTUvLCBcdTc1NTlcdTdBN0FcdTRGRERcdTVCNThcdTU3MjhcdTVGNTNcdTUyNERcdTc2RUVcdTVGNTVcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7bWFyZ2luLXRvcDogMTBweDtcIj4iLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi56Gu5a6aIiwKICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5Y+W5raIIiwKICAgICAgICBjdXN0b21DbGFzczogeyBodG1sQ29udGFpbmVyOiAibXpmX2h0bWxfY29udGFpbmVyIiB9LAogICAgfSwKICAgIHByb2Nlc3NWaWV3OiB7CiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSwKICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICB9LAogICAgZmluaXNoVmlldzogewogICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICB9LAogICAgZ2VuVW5maW5pc2g6IHsKICAgICAgICB0aXRsZTogIuajgOa1i+WIsOS4iuasoeacquWujOaIkOeahOenkuS8oOS7u+WKoSIsCiAgICAgICAgdGV4dDogIuaYr+WQpue7p+e7reivpeS7u+WKoT8iLAogICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsCiAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi5pivIiwKICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5ZCmIiwKICAgIH0sCiAgICBnZW5VbmZpbmlzaDI6IHsKICAgICAgICB0aXRsZTogIuajgOa1i+WIsOS4iuasoeacquato+W4uOmAgOWHuueahOenkuS8oOS7u+WKoSIsCiAgICAgICAgdGV4dDogIuaYr+WQpuaBouWkjeivpeS7u+WKoT8iLAogICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsCiAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi5pivIiwKICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5ZCmIiwKICAgIH0sCiAgICBnZW5WaWV3OiB7CiAgICAgICAgdGl0bGU6ICLor7fovpPlhaXpnIDopoHnlJ/miJDnmoTmlofku7bot6/lvoQiLAogICAgICAgIGlucHV0OiAidGV4dGFyZWEiLAogICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsCiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLAogICAgICAgIGlucHV0UGxhY2Vob2xkZXI6ICJb5pSv5oyB5om56YePKOaNouihjOWIhumalCldIiwKICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIuehruWumiIsCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogIuWPlua2iCIsCiAgICAgICAgaW5wdXRWYWxpZGF0b3I6IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIuaWh+S7tui3r+W+hOS4jeiDveS4uuepuiI7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgfSwKICAgIHVwZGF0ZUluZm86IHsKICAgICAgICB0aXRsZTogIlx1NzlEMlx1NEYyMFx1OTRGRVx1NjNBNVx1NjNEMFx1NTNENiB2IiArIHZlcnNpb24gKyAiICgiICsgdXBkYXRlRGF0ZSArICIpIiwKICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi55+l6YGT5LqGIiwKICAgICAgICBodG1sOiAodXBkYXRlSW5mb19kZWZhdWx0KCkpLAogICAgfSwKICAgIGNoZWNrUmVjdXJzaXZlOiB7CiAgICAgICAgaWNvbjogImluZm8iLAogICAgICAgIHRpdGxlOiAi5YyF5ZCr5paH5Lu25aS5LCDmmK/lkKbpgJLlvZLnlJ/miJA/IiwKICAgICAgICB0ZXh0OiAi6Iul6YCJ5pivLCDlsIblkIzml7bnlJ/miJDlkITnuqflrZDmlofku7blpLnkuIvnmoTmlofku7YiLAogICAgICAgIGFsbG93T3V0c2lkZUNsaWNrOiBmYWxzZSwKICAgICAgICBmb2N1c0NhbmNlbDogdHJ1ZSwKICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLAogICAgICAgIHJldmVyc2VCdXR0b25zOiB0cnVlLAogICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIuaYryIsCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogIuWQpiIsCiAgICB9LAogICAgc2V0dGluZ1ZpZXc6IHsKICAgICAgICB0aXRsZTogIuenkuS8oOmTvuaOpeaPkOWPliDorr7nva7pobUiLAogICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi56Gu5a6aIiwKICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5Y+W5raIIiwKICAgICAgICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsCiAgICAgICAgaHRtbDogIjxzZWxlY3QgY2xhc3M9XCJzd2FsMi1zZWxlY3RcIiBpZD1cIm16Zi10aGVtZVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYm9yZGVyLXdpZHRoOiAxcHg7IGJvcmRlci1zdHlsZTogc29saWRcIiA+IDxvcHRpb24gdmFsdWU9XCJEZWZhdWx0XCI+RGVmYXVsdCBcdTc2N0RcdTgyNzJcdTRFM0JcdTk4OTgoXHU5RUQ4XHU4QkE0KTwvb3B0aW9uPiA8b3B0aW9uIHZhbHVlPVwiQnVsbWFcIj5CdWxtYSBcdTc2N0RcdTgyNzJcdTdCODBcdTdFQTY8L29wdGlvbj4gPG9wdGlvbiB2YWx1ZT1cIkJvb3RzdHJhcCA0XCI+Qm9vdHN0cmFwNCBcdTc2N0RcdTgyNzJcdTdCODBcdTdFQTY8L29wdGlvbj4gPG9wdGlvbiB2YWx1ZT1cIk1hdGVyaWFsIFVJXCI+TWF0ZXJpYWxVSSBcdTc2N0RcdTgyNzJcdTRFM0JcdTk4OTg8L29wdGlvbj4gPG9wdGlvbiB2YWx1ZT1cIkRhcmtcIj5EYXJrIFx1OUVEMVx1ODI3Mlx1NEUzQlx1OTg5ODwvb3B0aW9uPiA8b3B0aW9uIHZhbHVlPVwiV29yZFByZXNzIEFkbWluXCI+V29yZFByZXNzQWRtaW4gXHU3MDcwXHU4MjcyXHU0RTNCXHU5ODk4PC9vcHRpb24+IDwvc2VsZWN0PiA8bGFiZWwgZm9yPVwibXpmLWZhc3QtZ2VuZXJhdGVcIiBjbGFzcz1cInN3YWwyLWNoZWNrYm94XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCIgPjxzcGFuIGNsYXNzPVwic3dhbDItbGFiZWxcIiA+XHU2NzgxXHU5MDFGXHU3NTFGXHU2MjEwIFx1OEJGNFx1NjYwRVx1NjU4N1x1Njg2MzogPGEgaHJlZj1cIiIgKyBkb2MuZmFzdEdlbkRvYyArICJcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkxPC9hPiA8YSBocmVmPVwiIiArIGRvYzIuZmFzdEdlbkRvYyArICJcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkyPC9hPjwvc3BhbiA+PGlucHV0IGNsYXNzPVwibXpmX2NoZWNrX29yaVwiIHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwiMVwiIGlkPVwibXpmLWZhc3QtZ2VuZXJhdGVcIiAvPjxzcGFuIGNsYXNzPVwibXpmX2NoZWNrXCI+PC9zcGFuID48L2xhYmVsPiA8bGFiZWwgZm9yPVwibXpmLWxpc3Rlbi1jbGlwYm9hcmRcIiBjbGFzcz1cInN3YWwyLWNoZWNrYm94XCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4XCIgPjxzcGFuIGNsYXNzPVwic3dhbDItbGFiZWxcIj5cdTc2RDFcdTU0MkNcdTUyNkFcdThEMzRcdTY3N0YgKFx1OTcwMFx1ODk4MVx1NTE0MVx1OEJCOFx1NTI2QVx1OEQzNFx1Njc3Rlx1Njc0M1x1OTY1MCk8L3NwYW4gPjxpbnB1dCBjbGFzcz1cIm16Zl9jaGVja19vcmlcIiB0eXBlPVwiY2hlY2tib3hcIiB2YWx1ZT1cIjFcIiBpZD1cIm16Zi1saXN0ZW4tY2xpcGJvYXJkXCIgLz48c3BhbiBjbGFzcz1cIm16Zl9jaGVja1wiPjwvc3BhbiA+PC9sYWJlbD4iLAogICAgfSwKICAgIHNldHRpbmdXYXJuaW5nOiB7CiAgICAgICAgdGl0bGU6ICLorr7nva7miJDlip8g5Yi35paw6aG16Z2i55Sf5pWIIiwKICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsCiAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLAogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAi55+l6YGT5LqGIiwKICAgIH0sCiAgICBzZWxlY3ROb0ZpbGVXYXJuaW5nOiB7CiAgICAgICAgdGl0bGU6ICLor7fli77pgInopoHnlJ/miJDnp5LkvKDnmoTmlofku7Yv5paH5Lu25aS5IiwKICAgICAgICBpY29uOiAiZXJyb3IiLAogICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSwKICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIuefpemBk+S6hiIsCiAgICB9LAp9OwoKLy8gRVhURVJOQUwgTU9EVUxFOiAuL25vZGVfbW9kdWxlcy9zd2VldGFsZXJ0Mi9kaXN0L3N3ZWV0YWxlcnQyLmFsbC5qcwp2YXIgc3dlZXRhbGVydDJfYWxsID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0NTUpOwp2YXIgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHN3ZWV0YWxlcnQyX2FsbCk7CjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9jb21tb24vc3dhbEJhc2UudHN4Ci8qCiAqIEBBdXRob3I6IG1lbmd6b25lZmlyZQogKiBARGF0ZTogMjAyMS0wOC0yNSAwODozNDo0NgogKiBATGFzdEVkaXRUaW1lOiAyMDIzLTAyLTEyIDAyOjI0OjMyCiAqIEBMYXN0RWRpdG9yczogbWVuZ3pvbmVmaXJlCiAqIEBEZXNjcmlwdGlvbjog5a6a5LmJ5YWo5aWX55qE5YmN5Y+w5by556qX6YC76L6RLCDlnKhTd2Fs55qE5Zue6LCD5Ye95pWw5YaF6LCD55SoKioqVGFza+exu+WGheWumuS5ieeahOS7u+WKoeS7o+eggQogKi8KdmFyIF9fYXNzaWduID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHsKICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7CiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkKICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdDsKICAgIH07CiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfTsKdmFyIF9fYXdhaXRlciA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgewogICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9CiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQogICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9CiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOwogICAgfSk7Cn07CnZhciBfX2dlbmVyYXRvciA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkgewogICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZzsKICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCAidGhyb3ciOiB2ZXJiKDEpLCAicmV0dXJuIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnOwogICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9CiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7CiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTsKICAgICAgICB3aGlsZSAoXykgdHJ5IHsKICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVsicmV0dXJuIl0gOiBvcFswXSA/IHlbInRocm93Il0gfHwgKCh0ID0geVsicmV0dXJuIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0OwogICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07CiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTsKICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTsKICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7CiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfQogICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9OwogICAgfQp9Owp2YXIgX19zcHJlYWRBcnJheSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSkgewogICAgZm9yICh2YXIgaSA9IDAsIGlsID0gZnJvbS5sZW5ndGgsIGogPSB0by5sZW5ndGg7IGkgPCBpbDsgaSsrLCBqKyspCiAgICAgICAgdG9bal0gPSBmcm9tW2ldOwogICAgcmV0dXJuIHRvOwp9OwoKCgoKCgoKdmFyIFN3YWxiYXNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24gU3dhbGJhc2UocmFwaWR1cGxvYWRUYXNrLCBnZW5lcmF0ZWJkbGlua1Rhc2spIHsKICAgICAgICB0aGlzLnJhcGlkdXBsb2FkVGFzayA9IHJhcGlkdXBsb2FkVGFzazsKICAgICAgICB0aGlzLmdlbmVyYXRlYmRsaW5rVGFzayA9IGdlbmVyYXRlYmRsaW5rVGFzazsKICAgIH0KICAgIC8vIOWQiOW5tnN3YWzlj4LmlbAKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5tZXJnZUFyZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgaW5wdXRBcmdzID0gW107CiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgaW5wdXRBcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgfQogICAgICAgIHZhciBvdXRwdXQgPSB7fTsKICAgICAgICB2YXIgc3dhbENmZ0FyZ3MgPSB7CiAgICAgICAgICAgIC8vIOemgeeUqGJhY2tkcm9w5Yqo55S7LCDpmLvmraLlpJrmrKHlvLnnqpfml7bnmoTlsY/pl6oKICAgICAgICAgICAgc2hvd0NsYXNzOiB7IGJhY2tkcm9wOiAic3dhbDItbm9hbmltYXRpb24iIH0sCiAgICAgICAgICAgIGhpZGVDbGFzczogeyBiYWNrZHJvcDogInN3YWwyLW5vYW5pbWF0aW9uIiB9LAogICAgICAgIH07CiAgICAgICAgJC5leHRlbmQuYXBwbHkoJCwgX19zcHJlYWRBcnJheShbb3V0cHV0LCB0aGlzLnN3YWxHbG9iYWxBcmdzLCBzd2FsQ2ZnQXJnc10sIGlucHV0QXJncykpOwogICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICB9OwogICAgLy8g54K55Ye7ICLnp5LkvKDpk77mjqUiIOWQjuaYvuekuueahOW8ueeqlwogICAgU3dhbGJhc2UucHJvdG90eXBlLmlucHV0VmlldyA9IGZ1bmN0aW9uIChpbnB1dFZhbHVlKSB7CiAgICAgICAgaWYgKGlucHV0VmFsdWUgPT09IHZvaWQgMCkgeyBpbnB1dFZhbHVlID0gIiI7IH0KICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBwYXRoVmFsdWUsIHByZUNvbmZpcm0sIHdpbGxPcGVuOwogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShHTV9nZXRWYWx1ZSgibGlzdGVuLWNsaXBib2FyZCIpICYmICFpbnB1dFZhbHVlKSkgcmV0dXJuIFszIC8qYnJlYWsqLywgMl07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHBhcnNlQ2xpcGJvYXJkKCldOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgLy8g5qCH5b+X5L2NdHJ1ZSDkuJQgaW5wdXRWYWx1ZeS4uuepuijpnZ7kuIDplK7np5LkvKDov5vlhaXml7YpIOS7juWJqui0tOadv+ivu+WPluacieaViOeahOenkuS8oOmTvuaOpQogICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gX2Euc2VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICBwYXRoVmFsdWUgPSBHTV9nZXRWYWx1ZSgibGFzdF9kaXIiKSB8fCAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgcHJlQ29uZmlybSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOaJi+WKqOivu+WPlk11bHRpcGxlIGlucHV0c+WGheeahOaVsOaNriwg55Sx5LqO5pyq6K6+572uaW5wdXTlj4LmlbAsIOWOn+eUn1ZhbGlkYXRvcuS4jeeUn+aViCwg6Ieq6KGM5re75YqgVmFsaWRhdG9y6YC76L6RCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID0gJCgiI216Zi1yYXBpZC1pbnB1dCIpWzBdLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFZhbHVlID0gJCgiI216Zi1wYXRoLWlucHV0IilbMF0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0VmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLnNob3dWYWxpZGF0aW9uTWVzc2FnZSgi56eS5Lyg5LiN6IO95Li656m6Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRMaXN0LmluY2x1ZGVzKGlucHV0VmFsdWUudHJpbSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOi+k+WFpeaUr+aMgeeahOWRveS7pCwg6Lez5Ye65qOA5p+lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IGlucHV0VmFsdWUudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRHVQYXJzZXIucGFyc2UoaW5wdXRWYWx1ZSkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5zaG93VmFsaWRhdGlvbk1lc3NhZ2UoIjxwPlx1NjcyQVx1OEJDNlx1NTIyQlx1NTIzMFx1NkI2M1x1Nzg2RVx1NzY4NFx1OTRGRVx1NjNBNSA8YSBocmVmPVwiIiArIGRvYy5saW5rVHlwZURvYyArICJcIiAiICsgbGlua1N0eWxlICsgIj5cdTY3RTVcdTc3MEJcdTY1MkZcdTYzMDFcdTY4M0NcdTVGMEY8L2E+PC9wPiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoVmFsdWUubWF0Y2goaWxsZWdhbFBhdGhQYXR0ZXJuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkuc2hvd1ZhbGlkYXRpb25NZXNzYWdlKCfkv53lrZjot6/lvoTkuI3og73lkKvmnInlrZfnrKZcXCI6Kj88PnwsIOekuuS+i++8mi9HVEE1LycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgd2lsbE9wZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjc3dhbDItaHRtbC1jb250YWluZXIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jc3MoImZvbnQtc2l6ZSIsICIxcmVtIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY3NzKCJkaXNwbGF5IiwgImdyaWQiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jc3MoIm1hcmdpbiIsICIwIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjbXpmLXJhcGlkLWlucHV0IilbMF0udmFsdWUgPSBpbnB1dFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI216Zi1wYXRoLWlucHV0IilbMF0udmFsdWUgPSBwYXRoVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjbXpmLXJhcGlkLWlucHV0Iikub24oImlucHV0IiwgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlUXVlcnlMaW5rKGV2ZW50LnRhcmdldC52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKER1UGFyc2VyLnBhcnNlKHJlc3VsdCkubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSByZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsgLy8g57uR5a6a6L6T5YWl5qGG5LqL5Lu2LCDovpPlhaXkuIDplK7np5LkvKDlkI7lsJ3or5XovazmjaLkuLrmma7pgJrnp5LkvKAKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5maXJlKHRoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy5pbnB1dFZpZXcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZUNvbmZpcm06IHByZUNvbmZpcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsT3Blbjogd2lsbE9wZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRWYWx1ZSA9PT0gInNldCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnNldHRpbmdWaWV3KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5wdXRWYWx1ZSA9PT0gImdlbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmdlblZpZXcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbnB1dFZhbHVlID09PSAiaW5mbyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnVwZGF0ZUluZm8oZnVuY3Rpb24gKCkgeyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucmFwaWR1cGxvYWRUYXNrLnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJhcGlkdXBsb2FkVGFzay5maWxlSW5mb0xpc3QgPSBEdVBhcnNlci5wYXJzZShpbnB1dFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoImxhc3RfZGlyIiwgcGF0aFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXRoVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOi3r+W+hOeVmeepugogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMucmFwaWR1cGxvYWRUYXNrLmlzRGVmYXVsdFBhdGggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vd1BhdGggPSBsb2NhdGlvbi5ocmVmLm1hdGNoKC9wYXRoPSguKz8pKD86JnwkKS8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vd1BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KG5vd1BhdGhbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhWYWx1ZSA9ICIvIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aFZhbHVlLmNoYXJBdCgwKSAhPT0gIi8iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFZhbHVlID0gIi8iICsgcGF0aFZhbHVlOyAvLyDooaXpvZDot6/lvoTliY3nvIDmlpzmnaAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGhWYWx1ZS5jaGFyQXQocGF0aFZhbHVlLmxlbmd0aCAtIDEpICE9PSAiLyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVmFsdWUgKz0gIi8iOyAvLyDooaXlhajot6/lvoTnu5PlsL7nmoTmlpzmnaAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY1VybC5pbmNsdWRlcyhiYWlkdVN5bmNQYWdlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXBhdGhWYWx1ZS5pbmNsdWRlcyhzeW5jUGF0aFByZWZpeCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoVmFsdWUgPSBzeW5jUGF0aFByZWZpeCArIHBhdGhWYWx1ZTsgLy8g6KGl5YWo5ZCM5q2l6aG16Lev5b6E5YmN57yACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJcdTc5RDJcdTRGMjBcdTY1ODdcdTRFRjZcdTRGRERcdTVCNThcdTUyMzA6ICIgKyBwYXRoVmFsdWUpOyAvLyBkZWJ1ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5yYXBpZHVwbG9hZFRhc2suc2F2ZVBhdGggPSBwYXRoVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnByb2Nlc3NWaWV3KGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qL107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfTsKICAgIC8vIOi9rOWtmC/nlJ/miJDov4fnqIvkuK3nmoTlvLnnqpcKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5wcm9jZXNzVmlldyA9IGZ1bmN0aW9uIChpc0dlbikgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIHN3YWxBcmcgPSB7CiAgICAgICAgICAgIHRpdGxlOiBpc0dlbiA/ICLnp5LkvKDnlJ/miJDkuK0iIDogIuaWh+S7tui9rOWtmOS4rSIsCiAgICAgICAgICAgIGh0bWw6IGlzR2VuCiAgICAgICAgICAgICAgICA/ICI8cD7mraPlnKjnlJ/miJDnrKwgPGZpbGVfbnVtPjA8L2ZpbGVfbnVtPiDkuKo8L3A+PHA+PGdlbl9wcm9nPuato+WcqOiOt+WPluaWh+S7tuWIl+ihqC4uLjwvZ2VuX3Byb2c+PC9wPiIKICAgICAgICAgICAgICAgIDogIuato+WcqOi9rOWtmOesrCA8ZmlsZV9udW0+MDwvZmlsZV9udW0+IOS4qiIsCiAgICAgICAgICAgIHdpbGxPcGVuOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLnNob3dMb2FkaW5nKCk7CiAgICAgICAgICAgICAgICBpc0dlbiB8fCBfdGhpcy5zYXZlRmlsZVdvcmsoKTsKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgICAgIHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkuZmlyZSh0aGlzLm1lcmdlQXJnKFN3YWxDb25maWcucHJvY2Vzc1ZpZXcsIHN3YWxBcmcpKTsKICAgIH07CiAgICAvLyDovazlrZgv55Sf5oiQ56eS5Lyg5a6M5oiQ55qE5by556qXCiAgICBTd2FsYmFzZS5wcm90b3R5cGUuZmluaXNoVmlldyA9IGZ1bmN0aW9uIChpc0dlbikgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIGFjdGlvbiA9IGlzR2VuID8gIueUn+aIkCIgOiAi6L2s5a2YIjsKICAgICAgICB2YXIgZmlsZUluZm9MaXN0ID0gaXNHZW4KICAgICAgICAgICAgPyB0aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5maWxlSW5mb0xpc3QKICAgICAgICAgICAgOiB0aGlzLnJhcGlkdXBsb2FkVGFzay5maWxlSW5mb0xpc3Q7CiAgICAgICAgdmFyIHBhcnNlUmVzdWx0ID0gcGFyc2VmaWxlSW5mbyhmaWxlSW5mb0xpc3QpOwogICAgICAgIHRoaXMucGFyc2VSZXN1bHQgPSBwYXJzZVJlc3VsdDsKICAgICAgICB2YXIgY2hlY2tib3hBcmcgPSB7CiAgICAgICAgICAgIGlucHV0OiAiY2hlY2tib3giLAogICAgICAgICAgICBpbnB1dFZhbHVlOiBHTV9nZXRWYWx1ZSgid2l0aF9wYXRoIiksCiAgICAgICAgICAgIGlucHV0UGxhY2Vob2xkZXI6ICLlr7zlh7rmlofku7blpLnnm67lvZXnu5PmnoQiLAogICAgICAgIH07IC8vIOWFqOmDqOWksei0peS4jeaYvuekuuatpGNoZWNrYm94LCAyMi41LjIyOiDlhajpg6jlpLHotKXkuZ/mmL7npLoKICAgICAgICB2YXIgaHRtbCA9IChpc0dlbiA/IGh0bWxEb2N1bWVudCA6ICIiKSArIC8vIOeUn+aIkOaooeW8j+S4i+a3u+WKoOaWh+aho+WFpeWPowogICAgICAgICAgICAocGFyc2VSZXN1bHQuaHRtbEluZm8gJiYgaXNHZW4gPyAiPGJyPiIgOiAiIikgKwogICAgICAgICAgICBwYXJzZVJlc3VsdC5odG1sSW5mbzsgLy8g5re75Yqg5aSx6LSl5YiX6KGoLCDnlJ/miJDmqKHlvI/kuIvmt7vliqDpobbpg6jnqbrooYzliIbpmpQKICAgICAgICB2YXIgaHRtbEZvb3RlciA9ICIiOwogICAgICAgIGlmICghR01fZ2V0VmFsdWUoZG9uYXRlVmVyICsgIl9raWxsX2RvbmF0ZSIpKQogICAgICAgICAgICBodG1sRm9vdGVyICs9IGh0bWxEb25hdGU7IC8vIOa3u+WKoOi1nuWKqeWFpeWPo+aPkOekugogICAgICAgIGlmICghR01fZ2V0VmFsdWUoZmVlZGJhY2tWZXIgKyAiX2tpbGxfZG9uYXRlIikpCiAgICAgICAgICAgIGh0bWxGb290ZXIgKz0gaHRtbEZlZWRiYWNrOyAvLyDmt7vliqDlj43ppojlhaXlj6Pmj5DnpLoKICAgICAgICBpZiAoaHRtbEZvb3RlcikKICAgICAgICAgICAgaHRtbEZvb3RlciA9ICI8YnI+IiArIGh0bWxGb290ZXI7IC8vIOa3u+WKoOW6lemDqOepuuihjOWIhumalAogICAgICAgIHZhciBzd2FsQXJnID0gX19hc3NpZ24oX19hc3NpZ24oeyB0aXRsZTogYWN0aW9uICsgIlx1NUI4Q1x1NkJENSBcdTUxNzEiICsgZmlsZUluZm9MaXN0Lmxlbmd0aCArICJcdTRFMkEsIFx1NTkzMVx1OEQyNSIgKyBwYXJzZVJlc3VsdC5mYWlsTGlzdC5sZW5ndGggKyAiXHU0RTJBISIsIGNvbmZpcm1CdXR0b25UZXh0OiBpc0dlbiA/ICLlpI3liLbnp5LkvKDku6PnoIEiIDogIuehruiupCIsIHNob3dEZW55QnV0dG9uOiBpc0dlbiwgZGVueUJ1dHRvblRleHQ6ICLlpI3liLbkuIDplK7np5LkvKAiLCBkZW55QnV0dG9uQ29sb3I6ICIjZWNhZTNjIiwgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsIGh0bWw6IGh0bWwgKyBodG1sRm9vdGVyIH0sIChpc0dlbiAmJiBjaGVja2JveEFyZykpLCB7IHdpbGxPcGVuOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNHZW4pCiAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoInVuQ2xvc2UiLCB0cnVlKTsgLy8g55Sf5oiQ5qih5byP6K6+572u57uT5p6c56qX5Y+j5pyq5YWz6Zet55qE5qCH6K6wCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgX3RoaXMuYWRkT3BlbkRpckJ0bigpOyAvLyDovazlrZjmqKHlvI/ml7bmt7vliqAgIuaJk+W8gOebruW9lSIg5oyJ6ZKuCiAgICAgICAgICAgIH0sIAogICAgICAgICAgICAvLyDnp5LkvKDnlJ/miJDnmoQgIuWkjeWItuS4gOmUruenkuS8oCIg5oyJ6ZKu5Zue6LCDCiAgICAgICAgICAgIHByZURlbnk6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB3aXRoX3BhdGggPSAkKCIjc3dhbDItY2hlY2tib3giKVswXS5jaGVja2VkOwogICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoIndpdGhfcGF0aCIsIHdpdGhfcGF0aCk7CiAgICAgICAgICAgICAgICBpZiAoIXdpdGhfcGF0aCkKICAgICAgICAgICAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQoYmRsaW5rUHJlZml4ICsgcGFyc2VSZXN1bHQuYmRjb2RlLnJlcGxhY2UoL1wvLitcLy9nLCAiIikudG9CYXNlNjQoKSk7CiAgICAgICAgICAgICAgICAvLyDljrvpmaTnm67lvZXnu5PmnoQsIOW5tui9rOaNouS4uuS4gOmUruenkuS8oAogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIEdNX3NldENsaXBib2FyZChiZGxpbmtQcmVmaXggKyBwYXJzZVJlc3VsdC5iZGNvZGUudG9CYXNlNjQoKSk7IC8vIOi9rOaNouS4uuS4gOmUruenkuS8oAogICAgICAgICAgICAgICAgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5nZXREZW55QnV0dG9uKCkuaW5uZXJUZXh0ID0gIuWkjeWItuaIkOWKnyzngrnlh7vlj7PkuIrlhbPpl60iOwogICAgICAgICAgICAgICAgdmFyIGZvb3RlciA9IHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkuZ2V0Rm9vdGVyKCk7CiAgICAgICAgICAgICAgICBmb290ZXIuaW5uZXJIVE1MID0gaHRtbEFib3V0QmRsaW5rOwogICAgICAgICAgICAgICAgZm9vdGVyLnN0eWxlLmRpc3BsYXkgPSAiZmxleCI7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0sIHByZUNvbmZpcm06IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChpc0dlbikgewogICAgICAgICAgICAgICAgICAgIC8vIOeUn+aIkOaooeW8jywgIuWkjeWItuenkuS8oOS7o+eggSLmjInpkq4KICAgICAgICAgICAgICAgICAgICB2YXIgd2l0aF9wYXRoID0gJCgiI3N3YWwyLWNoZWNrYm94IilbMF0uY2hlY2tlZDsKICAgICAgICAgICAgICAgICAgICBHTV9zZXRWYWx1ZSgid2l0aF9wYXRoIiwgd2l0aF9wYXRoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXdpdGhfcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKHBhcnNlUmVzdWx0LmJkY29kZS5yZXBsYWNlKC8jXC8uK1wvL2csICIjIikpOwogICAgICAgICAgICAgICAgICAgIC8vIOWOu+mZpOenkuS8oOmTvuaOpeS4reeahOebruW9lee7k+aehCjku4Xkv53nlZnmlofku7blkI0pCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbFBhdGhQcmVmaXggPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vd1BhdGggPSBsb2NhdGlvbi5ocmVmLm1hdGNoKC9wYXRoPSguKz8pKD86JnwkKS8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobm93UGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUGF0aFByZWZpeCA9IGRlY29kZVVSSUNvbXBvbmVudChub3dQYXRoWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKHBhcnNlUmVzdWx0LmJkY29kZS5yZXBsYWNlKG5ldyBSZWdFeHAoIiMiICsgbG9jYWxQYXRoUHJlZml4ICsgIi8iLCAiZyIpLCAiIyIpKTsgLy8g5Y676Zmk5YmN572u55qE6Lev5b6E5Lul5Y+K6Lev5b6E5byA5aS055qEJy8nLCDlsIbnu53lr7not6/lvoTovazmjaLkuLrnm7jlr7not6/lvoQKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5nZXRDb25maXJtQnV0dG9uKCkuaW5uZXJUZXh0ID0gIuWkjeWItuaIkOWKnyzngrnlh7vlj7PkuIrlhbPpl60iOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIOi9rOWtmOaooeW8jywgIuehruWumiIg5oyJ6ZKuCiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaExpc3QoKTsgLy8g6LCD55So5Yi35paw5paH5Lu25YiX6KGo55qE5pa55rOVCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB9KTsKICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmZpcmUodGhpcy5tZXJnZUFyZyhTd2FsQ29uZmlnLmZpbmlzaFZpZXcsIHN3YWxBcmcpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0Rpc21pc3NlZCB8fCByZXN1bHQuZGlzbWlzcyA9PT0gKHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkpLkRpc21pc3NSZWFzb24uY2xvc2UpIHsKICAgICAgICAgICAgICAgIEdNX2RlbGV0ZVZhbHVlKCJ1bmZpbmlzaCIpOyAvLyDngrnlh7vkuoblj7PkuIrop5LnmoTlhbPpl63mjInpkq4sIOa4hemZpOS7u+WKoei/m+W6puaVsOaNrgogICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoInVuQ2xvc2UiLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CiAgICAvLyDnlJ/miJDmlofku7blpLnnp5LkvKAsIOaYr+WQpumAkuW9kueUn+aIkOaPkOekugogICAgU3dhbGJhc2UucHJvdG90eXBlLmNoZWNrUmVjdXJzaXZlID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5maXJlKHRoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy5jaGVja1JlY3Vyc2l2ZSkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2sucmVjdXJzaXZlID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuZGlzbWlzcyA9PT0gKHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkpLkRpc21pc3NSZWFzb24uY2FuY2VsKQogICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLnJlY3Vyc2l2ZSA9IGZhbHNlOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIF90aGlzLnByb2Nlc3NWaWV3KHRydWUpOwogICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suc2NhbkZpbGUoMCk7CiAgICAgICAgfSk7CiAgICB9OwogICAgLy8g6K6+572u6aG1CiAgICBTd2FsYmFzZS5wcm90b3R5cGUuc2V0dGluZ1ZpZXcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgd2lsbE9wZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICQoIiNzd2FsMi1odG1sLWNvbnRhaW5lciIpCiAgICAgICAgICAgICAgICAuY3NzKCJmb250LXNpemUiLCAiMXJlbSIpCiAgICAgICAgICAgICAgICAuY3NzKCJkaXNwbGF5IiwgImdyaWQiKQogICAgICAgICAgICAgICAgLmNzcygibWFyZ2luIiwgIjAiKTsKICAgICAgICAgICAgJCgiI216Zi10aGVtZSIpWzBdLnZhbHVlID0gR01fZ2V0VmFsdWUoInN3YWxUaGVtZXMiKSB8fCAiRGVmYXVsdCI7CiAgICAgICAgICAgICQoIiNtemYtbGlzdGVuLWNsaXBib2FyZCIpWzBdLmNoZWNrZWQgPSBCb29sZWFuKEdNX2dldFZhbHVlKCJsaXN0ZW4tY2xpcGJvYXJkIikpOwogICAgICAgICAgICAkKCIjbXpmLWZhc3QtZ2VuZXJhdGUiKVswXS5jaGVja2VkID0gQm9vbGVhbihHTV9nZXRWYWx1ZSgiZmFzdC1nZW5lcmF0ZSIpID09PSB1bmRlZmluZWQKICAgICAgICAgICAgICAgID8gdHJ1ZQogICAgICAgICAgICAgICAgOiBHTV9nZXRWYWx1ZSgiZmFzdC1nZW5lcmF0ZSIpKTsKICAgICAgICB9OwogICAgICAgIHZhciBwcmVDb25maXJtID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZXJyb3JfMTsKICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkgewogICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgLy8g6K6+572u5Li76aKYCiAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJzd2FsVGhlbWVzIiwgJCgiI216Zi10aGVtZSIpWzBdLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkKCIjbXpmLWxpc3Rlbi1jbGlwYm9hcmQiKVswXS5jaGVja2VkKSByZXR1cm4gWzMgLypicmVhayovLCA0XTsKICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAxOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFsxLCAzLCAsIDRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpXTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoImxpc3Rlbi1jbGlwYm9hcmQiLCAkKCIjbXpmLWxpc3Rlbi1jbGlwYm9hcmQiKVswXS5jaGVja2VkKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Euc2VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICBzaG93QWxlcnQoYXBwRXJyb3IuQ2xpcGJvYXJkUHJlbWlzc2lvbkVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOiuvue9ruaegemAn+eUn+aIkCwg6Iul5byA5ZCv5YiZ5by55Ye65paH5pys5o+Q6YaSCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCIjbXpmLWZhc3QtZ2VuZXJhdGUiKVswXS5jaGVja2VkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FsZXJ0KGFwcFdhcm5pbmcuZmFzdEdlbmVyYXRlV2Fybik7CiAgICAgICAgICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKCJmYXN0LWdlbmVyYXRlIiwgJCgiI216Zi1mYXN0LWdlbmVyYXRlIilbMF0uY2hlY2tlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7IH07CiAgICAgICAgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5maXJlKHRoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy5zZXR0aW5nVmlldywgewogICAgICAgICAgICB3aWxsT3Blbjogd2lsbE9wZW4sCiAgICAgICAgICAgIHByZUNvbmZpcm06IHByZUNvbmZpcm0sCiAgICAgICAgfSkpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKQogICAgICAgICAgICAgICAgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5maXJlKF90aGlzLm1lcmdlQXJnKFN3YWxDb25maWcuc2V0dGluZ1dhcm5pbmcpKTsKICAgICAgICB9KTsKICAgIH07CiAgICAvLyDnlJ/miJDpobUgKOi+k+WFpei3r+W+hOWIl+ihqOi/m+ihjOenkuS8oOeUn+aIkCkKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5nZW5WaWV3ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5maXJlKHRoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy5nZW5WaWV3KSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHsKICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5yZXNldCgpOwogICAgICAgICAgICAgICAgcmVzdWx0LnZhbHVlLnNwbGl0KCJcbiIpLmZvckVhY2goZnVuY3Rpb24gKGZpbGVQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVQYXRoLmNoYXJBdCgwKSAhPT0gIi8iKQogICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aCA9ICIvIiArIGZpbGVQYXRoOyAvLyDooaXpvZDot6/lvoTliY3nvIDmlpzmnaAKICAgICAgICAgICAgICAgICAgICBpZiAobG9jVXJsLmluY2x1ZGVzKGJhaWR1U3luY1BhZ2UpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFmaWxlUGF0aC5pbmNsdWRlcyhzeW5jUGF0aFByZWZpeCkpCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gc3luY1BhdGhQcmVmaXggKyBmaWxlUGF0aDsgLy8g6KGl5YWo5ZCM5q2l6aG16Lev5b6E5YmN57yACiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLmZpbGVJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIF90aGlzLnByb2Nlc3NWaWV3KHRydWUpOyAvLyDmmL7npLrov5vluqblvLnnqpcKICAgICAgICAgICAgICAgIF90aGlzLmdlbkZpbGVXb3JrKGZhbHNlLCB0cnVlKTsgLy8g6Lez6L+H6I635Y+W6YCJ5oup5paH5Lu25YiX6KGo5ZKM5omr5o+P5paH5Lu25aS555qE5q2l6aqkCiAgICAgICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suZ2VuZXJhdGVCZGxpbmsoMCk7IC8vIOW8gOWni+eUn+aIkOS7u+WKoQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9OwogICAgLy8g55Sf5oiQ56eS5Lyg5pyq5a6M5oiQ5Lu75Yqh5o+Q56S6CiAgICBTd2FsYmFzZS5wcm90b3R5cGUuZ2VuVW5maW5pc2ggPSBmdW5jdGlvbiAob25Db25maXJtLCBvbkNhbmNlbCkgewogICAgICAgIHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkuZmlyZSh0aGlzLm1lcmdlQXJnKEdNX2dldFZhbHVlKCJ1bkNsb3NlIikKICAgICAgICAgICAgPyBTd2FsQ29uZmlnLmdlblVuZmluaXNoMgogICAgICAgICAgICA6IFN3YWxDb25maWcuZ2VuVW5maW5pc2gpKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkKICAgICAgICAgICAgICAgIG9uQ29uZmlybSgpOwogICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuZGlzbWlzcyA9PT0gKHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkpLkRpc21pc3NSZWFzb24uY2FuY2VsKQogICAgICAgICAgICAgICAgb25DYW5jZWwoKTsKICAgICAgICB9KTsKICAgIH07CiAgICAvLyDnlJ/miJDnp5LkvKAsIOacqumAieaLqeS7u+S9leaWh+S7tueahOaPkOekugogICAgU3dhbGJhc2UucHJvdG90eXBlLnNlbGVjdE5vRmlsZVdhcm5pbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5maXJlKHRoaXMubWVyZ2VBcmcoU3dhbENvbmZpZy5zZWxlY3ROb0ZpbGVXYXJuaW5nKSk7CiAgICB9OwogICAgLy8g5pu05paw5L+h5oGv6aG1CiAgICBTd2FsYmFzZS5wcm90b3R5cGUudXBkYXRlSW5mbyA9IGZ1bmN0aW9uIChvbkNvbmZpcm0pIHsKICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmZpcmUodGhpcy5tZXJnZUFyZyhTd2FsQ29uZmlnLnVwZGF0ZUluZm8pKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkKICAgICAgICAgICAgICAgIG9uQ29uZmlybSgpOwogICAgICAgIH0pOwogICAgfTsKICAgIC8vIOS7peS4i+eahOaWueazlemDveaYr+S7u+WKoeaTjeS9nOmAu+i+kSwg5LiN5piv5by556qX6YC76L6RCiAgICBTd2FsYmFzZS5wcm90b3R5cGUuc2F2ZUZpbGVXb3JrID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdGhpcy5yYXBpZHVwbG9hZFRhc2sub25GaW5pc2ggPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5maW5pc2hWaWV3KGZhbHNlKTsgfTsKICAgICAgICB0aGlzLnJhcGlkdXBsb2FkVGFzay5vblByb2Nlc3MgPSBmdW5jdGlvbiAoaSwgZmlsZUluZm9MaXN0KSB7CiAgICAgICAgICAgIHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkuZ2V0SHRtbENvbnRhaW5lcigpLnF1ZXJ5U2VsZWN0b3IoImZpbGVfbnVtIikudGV4dENvbnRlbnQgPSBpICsgMSArICIgLyAiICsgZmlsZUluZm9MaXN0Lmxlbmd0aDsKICAgICAgICB9OwogICAgICAgIHRoaXMucmFwaWR1cGxvYWRUYXNrLnN0YXJ0KCk7IC8vIOW8gOWni+i9rOWtmOS7u+WKoQogICAgfTsKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5nZW5GaWxlV29yayA9IGZ1bmN0aW9uIChpc1VuZmluaXNoLCBpc0dlblZpZXcpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGlmICh0aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5pc1NoYXJlUGFnZSkKICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suc2VsZWN0TGlzdCA9IGdldFNoYXJlRmlsZUxpc3QoKTsKICAgICAgICBlbHNlIGlmICghaXNHZW5WaWV3KQogICAgICAgICAgICB0aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5zZWxlY3RMaXN0ID0gZ2V0U2VsZWN0ZWRGaWxlTGlzdCgpOwogICAgICAgIGlmICgKICAgICAgICAvLyDmnKrpgInmi6nmlofku7YgKyDml6DmnKrlrozmiJDnmoTnlJ/miJDku7vliqEgKyDkuI3lnKjnlJ/miJDpobUgLT4g5by55Ye65pyq6YCJ5oup55Sf5oiQ5paH5Lu255qE6K2m5ZGK5by55Ye6CiAgICAgICAgIXRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLnNlbGVjdExpc3QubGVuZ3RoICYmCiAgICAgICAgICAgICFpc0dlblZpZXcgJiYKICAgICAgICAgICAgIWlzVW5maW5pc2gpIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3ROb0ZpbGVXYXJuaW5nKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2sub25Qcm9jZXNzID0gZnVuY3Rpb24gKGksIGZpbGVJbmZvTGlzdCkgewogICAgICAgICAgICBzd2VldGFsZXJ0Ml9hbGxfZGVmYXVsdCgpLmdldEh0bWxDb250YWluZXIoKS5xdWVyeVNlbGVjdG9yKCJmaWxlX251bSIpLnRleHRDb250ZW50ID0gaSArIDEgKyAiIC8gIiArIGZpbGVJbmZvTGlzdC5sZW5ndGg7CiAgICAgICAgICAgIHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkuZ2V0SHRtbENvbnRhaW5lcigpLnF1ZXJ5U2VsZWN0b3IoImdlbl9wcm9nIikudGV4dENvbnRlbnQgPSAiMCUiOwogICAgICAgIH07CiAgICAgICAgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2sub25Qcm9ncmVzcyA9IGZ1bmN0aW9uIChlLCB0ZXh0KSB7CiAgICAgICAgICAgIGlmICh0ZXh0ID09PSB2b2lkIDApIHsgdGV4dCA9ICIiOyB9CiAgICAgICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICAgICAgICAvLyDmmL7npLroh6rlrprkuYnmlofmnKwKICAgICAgICAgICAgICAgIHN3ZWV0YWxlcnQyX2FsbF9kZWZhdWx0KCkuZ2V0SHRtbENvbnRhaW5lcigpLnF1ZXJ5U2VsZWN0b3IoImdlbl9wcm9nIikudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghZSB8fCB0eXBlb2YgZS50b3RhbCAhPT0gIm51bWJlciIpCiAgICAgICAgICAgICAgICByZXR1cm47IC8vIOWPguaVsOaVsOaNruS4jeato+ehriDot7Pov4cKICAgICAgICAgICAgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5nZXRIdG1sQ29udGFpbmVyKCkucXVlcnlTZWxlY3RvcigiZ2VuX3Byb2ciKS50ZXh0Q29udGVudCA9ICgoZS5sb2FkZWQgLyBlLnRvdGFsKSAqCiAgICAgICAgICAgICAgICAxMDApLnRvRml4ZWQoKSArICIlIjsKICAgICAgICB9OwogICAgICAgIGlmICh0aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5pc1NoYXJlUGFnZSkgewogICAgICAgICAgICB0aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5vbkhhc05vRGlyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgX3RoaXMucHJvY2Vzc1ZpZXcodHJ1ZSk7CiAgICAgICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suc2NhblNoYXJlRmlsZSgwKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLm9uSGFzTm9EaXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5wcm9jZXNzVmlldyh0cnVlKTsKICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5nZW5lcmF0ZUJkbGluaygwKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2sub25IYXNEaXIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5jaGVja1JlY3Vyc2l2ZSgpOyB9OwogICAgICAgIH0KICAgICAgICB0aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5vbkZpbmlzaCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLmZpbmlzaFZpZXcodHJ1ZSk7IH07CiAgICAgICAgaWYgKCFpc1VuZmluaXNoICYmICFpc0dlblZpZXcpCiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGViZGxpbmtUYXNrLnN0YXJ0KCk7IC8vIOaJp+ihjOaWsOS7u+WKoeWIneWni+WMlgogICAgfTsKICAgIFN3YWxiYXNlLnByb3RvdHlwZS5jaGVja1VuZmluaXNoID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgaWYgKEdNX2dldFZhbHVlKCJ1bmZpbmlzaCIpKSB7CiAgICAgICAgICAgIHRoaXMuZ2VuVW5maW5pc2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgX3RoaXMucHJvY2Vzc1ZpZXcodHJ1ZSk7CiAgICAgICAgICAgICAgICBfdGhpcy5nZW5GaWxlV29yayh0cnVlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB2YXIgdW5maW5pc2hJbmZvID0gR01fZ2V0VmFsdWUoInVuZmluaXNoIik7CiAgICAgICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZWJkbGlua1Rhc2suZmlsZUluZm9MaXN0ID0gdW5maW5pc2hJbmZvLmZpbGVfaW5mb19saXN0OwogICAgICAgICAgICAgICAgdW5maW5pc2hJbmZvLmlzQ2hlY2tNZDUKICAgICAgICAgICAgICAgICAgICA/IF90aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5jaGVja01kNSh1bmZpbmlzaEluZm8uZmlsZV9pZCkKICAgICAgICAgICAgICAgICAgICA6IF90aGlzLmdlbmVyYXRlYmRsaW5rVGFzay5nZW5lcmF0ZUJkbGluayh1bmZpbmlzaEluZm8uZmlsZV9pZCk7CiAgICAgICAgICAgIH0sIC8vIOehruiupOe7p+e7reacquWujOaIkOS7u+WKoQogICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBHTV9kZWxldGVWYWx1ZSgidW5maW5pc2giKTsKICAgICAgICAgICAgICAgIF90aGlzLmdlbkZpbGVXb3JrKGZhbHNlLCBmYWxzZSk7CiAgICAgICAgICAgIH0gLy8g5LiN57un57ut5pyq5a6M5oiQ5Lu75YqhLCDmuIXpmaTmlbDmja4sIOW8gOWQr+aWsOS7u+WKoQogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5nZW5GaWxlV29yayhmYWxzZSwgZmFsc2UpOwogICAgICAgIH0gLy8g5rKh5pyJ5pyq5a6M5oiQ5Lu75YqhLCDnm7TmjqXlvIDlkK/mlrDku7vliqEKICAgIH07CiAgICAvLyDmt7vliqAgIuaJk+W8gOebruW9lSIg5oyJ6ZKuCiAgICBTd2FsYmFzZS5wcm90b3R5cGUuYWRkT3BlbkRpckJ0biA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoIXRoaXMucmFwaWR1cGxvYWRUYXNrLmlzRGVmYXVsdFBhdGgpIHsKICAgICAgICAgICAgdmFyIF9kaXJfMSA9ICh0aGlzLnJhcGlkdXBsb2FkVGFzay5zYXZlUGF0aCB8fCAiIikucmVwbGFjZSgvXC8kLywgIiIpOyAvLyDljrvpmaTot6/lvoTnu5PlsL7nmoQiLyIKICAgICAgICAgICAgaWYgKF9kaXJfMS5jaGFyQXQoMCkgIT09ICIvIikKICAgICAgICAgICAgICAgIF9kaXJfMSA9ICIvIiArIF9kaXJfMTsgLy8g6KGl6b2Q6Lev5b6E5byA5aS055qEIi8iCiAgICAgICAgICAgIHZhciBjQnRuID0gc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5nZXRDb25maXJtQnV0dG9uKCk7CiAgICAgICAgICAgIHZhciBidG4gPSBjQnRuLmNsb25lTm9kZSgpOwogICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAi5omT5byA55uu5b2VIjsKICAgICAgICAgICAgYnRuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICIjZWNhZTNjIjsKICAgICAgICAgICAgdmFyIG5vd1BhdGhfMSA9IGxvY2F0aW9uLmhyZWYubWF0Y2goLyhwYXRoPSguKz8pKSg/OiZ8JCkvKTsKICAgICAgICAgICAgYnRuLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAobm93UGF0aF8xKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IGxvY2F0aW9uLmhyZWYucmVwbGFjZSgKICAgICAgICAgICAgICAgICAgICAvLyDku4Xmm7/mjaJwYXRo5Y+C5pWwLCDkuI3kv67mlLnlhbbku5blj4LmlbAKICAgICAgICAgICAgICAgICAgICBub3dQYXRoXzFbMV0sICJwYXRoPSIgKyBlbmNvZGVVUklDb21wb25lbnQoX2Rpcl8xKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29ubmVjdENoYXIgPSBsb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCI/IikgPyAiJiIgOiAiPyI7IC8vIOehruWumuWPguaVsOeahOi/nuaOpeespgogICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgKz0gY29ubmVjdENoYXIgKyAicGF0aD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KF9kaXJfMSk7CiAgICAgICAgICAgICAgICB9IC8vIOayoeacieaJvuWIsHBhdGjlj4LmlbAsIOebtOaOpea3u+WKoAogICAgICAgICAgICAgICAgc3dlZXRhbGVydDJfYWxsX2RlZmF1bHQoKS5jbG9zZSgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAobm93UGF0aF8xICYmIG5vd1BhdGhfMVsyXSAhPT0gZW5jb2RlVVJJQ29tcG9uZW50KF9kaXJfMSkpCiAgICAgICAgICAgICAgICAvLyDlvZPliY3lt7LlnKjovazlrZjnm67lvZXml7bkuI3mt7vliqDmjInpkq4KICAgICAgICAgICAgICAgIGNCdG4uYmVmb3JlKGJ0bik7CiAgICAgICAgfQogICAgfTsKICAgIHJldHVybiBTd2FsYmFzZTsKfSgpKTsKLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBjb25zdCBzd2FsQmFzZSA9IChTd2FsYmFzZSk7Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL2FqYXgudHN4Ci8qCiAqIEBBdXRob3I6IG1lbmd6b25lZmlyZQogKiBARGF0ZTogMjAyMS0wOC0yNyAxNDo0ODoyNAogKiBATGFzdEVkaXRUaW1lOiAyMDIzLTAyLTE0IDA0OjEwOjA5CiAqIEBMYXN0RWRpdG9yczogbWVuZ3pvbmVmaXJlCiAqIEBEZXNjcmlwdGlvbjog6Ieq5bCB6KOFSlEgYWpheOaWueazlQogKi8KdmFyIGFqYXhfYXNzaWduID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHsKICAgIGFqYXhfYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7CiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkKICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdDsKICAgIH07CiAgICByZXR1cm4gYWpheF9hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfTsKCmZ1bmN0aW9uIGFqYXgoY29uZmlnLCBjYWxsYmFjaywgZmFpbGJhY2spIHsKICAgIEdNX3htbGh0dHBSZXF1ZXN0KGFqYXhfYXNzaWduKGFqYXhfYXNzaWduKHt9LCBjb25maWcpLCB7IG9ubG9hZDogZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocik7IC8vIGRlYnVnCiAgICAgICAgICAgIGlmIChNYXRoLmZsb29yKHIuc3RhdHVzIC8gMTAwKSA9PT0gMikgewogICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCIlcyB2ZXJzaW9uOiAlcyDmjqXlj6Pov5Tlm546ICVzIiwgVEFHLCB2ZXJzaW9uLCBKU09OLnN0cmluZ2lmeShyLnJlc3BvbnNlKSk7IC8vIHVzZXIgZGVidWcKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGZhaWxiYWNrKHIuc3RhdHVzKTsKICAgICAgICB9LCBvbmVycm9yOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGZhaWxiYWNrKGFqYXhFcnJvcik7CiAgICAgICAgfSB9KSk7Cn0KCjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9iYWlkdS9jb21tb24vcmFwaWR1cGxvYWRUYXNrLnRzeAovKgogKiBAQXV0aG9yOiBtZW5nem9uZWZpcmUKICogQERhdGU6IDIwMjEtMDgtMjUgMDE6MzA6MjkKICogQExhc3RFZGl0VGltZTogMjAyMy0wMi0wOSAyMzozMzoxNwogKiBATGFzdEVkaXRvcnM6IG1lbmd6b25lZmlyZQogKiBARGVzY3JpcHRpb246IOeZvuW6pue9keebmCDnp5LkvKDovazlrZjku7vliqHlrp7njrAKICovCgoKCnZhciBSYXBpZHVwbG9hZFRhc2sgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBSYXBpZHVwbG9hZFRhc2soKSB7CiAgICB9CiAgICBSYXBpZHVwbG9hZFRhc2sucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuYmRzdG9rZW4gPSBnZXRCZHN0b2tlbigpOwogICAgICAgIGNvbnNvbGUubG9nKCJiZHN0b2tlblx1NzJCNlx1NjAwMTogIiArICh0aGlzLmJkc3Rva2VuID8gIuiOt+WPluaIkOWKnyIgOiAi6I635Y+W5aSx6LSlIikpOyAvLyBkZWJ1ZwogICAgICAgIHRoaXMuZmlsZUluZm9MaXN0ID0gW107CiAgICAgICAgdGhpcy5zYXZlUGF0aCA9ICIiOwogICAgICAgIHRoaXMuaXNEZWZhdWx0UGF0aCA9IGZhbHNlOwogICAgICAgIHRoaXMub25GaW5pc2ggPSBmdW5jdGlvbiAoKSB7IH07CiAgICAgICAgdGhpcy5vblByb2Nlc3MgPSBmdW5jdGlvbiAoKSB7IH07CiAgICB9OwogICAgUmFwaWR1cGxvYWRUYXNrLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLnNhdmVGaWxlVjIoMCk7CiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVzY3JpcHRpb246IOi9rOWtmOenkuS8oCDmjqXlj6MyCiAgICAgKiBAcGFyYW0ge251bWJlcn0gaQogICAgICovCiAgICBSYXBpZHVwbG9hZFRhc2sucHJvdG90eXBlLnNhdmVGaWxlVjIgPSBmdW5jdGlvbiAoaSkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgaWYgKGkgPj0gdGhpcy5maWxlSW5mb0xpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXMub25GaW5pc2godGhpcy5maWxlSW5mb0xpc3QpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMub25Qcm9jZXNzKGksIHRoaXMuZmlsZUluZm9MaXN0KTsKICAgICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZUluZm9MaXN0W2ldOwogICAgICAgIC8vIOaWh+S7tuWQjeS4uuepugogICAgICAgIGlmIChmaWxlLnBhdGggPT09ICIvIikgewogICAgICAgICAgICBmaWxlLmVycm5vID0gLTc7CiAgICAgICAgICAgIHRoaXMuc2F2ZUZpbGVWMihpICsgMSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIG9uRmFpbGVkID0gZnVuY3Rpb24gKHN0YXR1c0NvZGUpIHsKICAgICAgICAgICAgZmlsZS5lcnJubyA9IHN0YXR1c0NvZGU7CiAgICAgICAgICAgIF90aGlzLnNhdmVGaWxlVjIoaSArIDEpOwogICAgICAgIH07CiAgICAgICAgcHJlY3JlYXRlRmlsZVYyLmNhbGwodGhpcywgZmlsZSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVzcG9uc2U7CiAgICAgICAgICAgIGlmICgwID09PSBkYXRhLmVycm5vKSB7CiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gZGF0YS5ibG9ja19saXN0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUZpbGVWMihmaWxlLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5yZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5lcnJubyA9IDIgPT09IGRhdGEuZXJybm8gPyAxMTQgOiBkYXRhLmVycm5vOwogICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gMzExOTAgPT09IGZpbGUuZXJybm8gPyA0MDQgOiBmaWxlLmVycm5vOwogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zYXZlRmlsZVYyKGkgKyAxKTsKICAgICAgICAgICAgICAgICAgICB9LCBvbkZhaWxlZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gNDA0OwogICAgICAgICAgICAgICAgICAgIF90aGlzLnNhdmVGaWxlVjIoaSArIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZmlsZS5lcnJubyA9IGRhdGEuZXJybm87CiAgICAgICAgICAgICAgICBfdGhpcy5zYXZlRmlsZVYyKGkgKyAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIG9uRmFpbGVkKTsKICAgIH07CiAgICAvLyDmraTmjqXlj6PmtYvor5Xnu5PmnpzlpoLkuIs6IOmUmeivr21kNS0+6L+U5ZueImVycm5vIjogMzExOTAsIOato+ehrm1kNSvplJnor69zaXplLT7ov5Tlm54iZXJybm8iOiAyCiAgICAvLyDmraTlpJYsIOWNs+S9v21kNeWSjHNpemXlnYfmraPnoa4sIOi/nue7reivt+axguaXtuS+neaXp+acieWwj+amgueOh+i/lOWbniJlcnJubyI6IDIsIOaVheW7uuiuruWKoOWFpXJldHJ5562W55WlCiAgICBSYXBpZHVwbG9hZFRhc2sucHJvdG90eXBlLmNyZWF0ZUZpbGVWMiA9IGZ1bmN0aW9uIChmaWxlLCBvblJlc3BvbnNlZCwgb25GYWlsZWQsIHJldHJ5KSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBpZiAocmV0cnkgPT09IHZvaWQgMCkgeyByZXRyeSA9IDA7IH0KICAgICAgICBhamF4KHsKICAgICAgICAgICAgdXJsOiAiIiArIGNyZWF0ZV91cmwgKyAodGhpcy5iZHN0b2tlbiA/ICImYmRzdG9rZW49IiArIHRoaXMuYmRzdG9rZW4gOiAiIiksCiAgICAgICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICAgICAgZGF0YTogY29udmVydERhdGEoewogICAgICAgICAgICAgICAgYmxvY2tfbGlzdDogSlNPTi5zdHJpbmdpZnkoW2ZpbGUubWQ1LnRvTG93ZXJDYXNlKCldKSwKICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMuc2F2ZVBhdGggKyBmaWxlLnBhdGgucmVwbGFjZShpbGxlZ2FsUGF0aFBhdHRlcm4sICJfIiksCiAgICAgICAgICAgICAgICBzaXplOiBmaWxlLnNpemUsCiAgICAgICAgICAgICAgICBpc2RpcjogMCwKICAgICAgICAgICAgICAgIHJ0eXBlOiAwLCAvLyBydHlwZT0z6KaG55uW5paH5Lu2LCBydHlwZT0w5YiZ6L+U5Zue5oql6ZSZLCDkuI3opobnm5bmlofku7YsIOm7mOiupOS4unJ0eXBlPTEo6Ieq5Yqo6YeN5ZG95ZCNKQogICAgICAgICAgICB9KSwKICAgICAgICB9LCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhkYXRhLnJlc3BvbnNlKTsgLy8gZGVidWcKICAgICAgICAgICAgaWYgKDMxMDM5ID09PSBkYXRhLnJlc3BvbnNlLmVycm5vICYmIDMxMDM5ICE9IGZpbGUuZXJybm8pIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJybm8gPSAzMTAzOTsKICAgICAgICAgICAgICAgIGZpbGUucGF0aCA9IHN1ZmZpeENoYW5nZShmaWxlLnBhdGgpOwogICAgICAgICAgICAgICAgX3RoaXMuY3JlYXRlRmlsZVYyKGZpbGUsIG9uUmVzcG9uc2VkLCBvbkZhaWxlZCwgcmV0cnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKDIgPT09IGRhdGEucmVzcG9uc2UuZXJybm8gJiYgcmV0cnkgPCByZXRyeU1heF9hcGlWMikgewogICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYOi9rOWtmOaOpeWPo+mUmeivrywg6YeN6K+VJHtyZXRyeSArIDF95qyhOiAke2ZpbGUucGF0aH1gKTsgLy8gZGVidWcKICAgICAgICAgICAgICAgIF90aGlzLmNyZWF0ZUZpbGVWMihmaWxlLCBvblJlc3BvbnNlZCwgb25GYWlsZWQsICsrcmV0cnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIG9uUmVzcG9uc2VkKGRhdGEpOwogICAgICAgIH0sIG9uRmFpbGVkKTsKICAgIH07CiAgICByZXR1cm4gUmFwaWR1cGxvYWRUYXNrOwp9KCkpOwovKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIGNvbnN0IHJhcGlkdXBsb2FkVGFzayA9IChSYXBpZHVwbG9hZFRhc2spOwovLyDmraTmjqXlj6PmtYvor5Xnu5PmnpzlpoLkuIs6IOmUmeivr21kNS0+6L+U5ZueYmxvY2tfbGlzdDogWzBdLCDmraPnoa5tZDUr5q2j56GuL+mUmeivr3NpemUtPui/lOWbnmJsb2NrX2xpc3Q6IFtdCmZ1bmN0aW9uIHByZWNyZWF0ZUZpbGVWMihmaWxlLCBvblJlc3BvbnNlZCwgb25GYWlsZWQpIHsKICAgIGFqYXgoewogICAgICAgIHVybDogIiIgKyBwcmVjcmVhdGVfdXJsICsgKHRoaXMuYmRzdG9rZW4gJiYgIiZiZHN0b2tlbj0iICsgdGhpcy5iZHN0b2tlbiksCiAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgcmVzcG9uc2VUeXBlOiAianNvbiIsCiAgICAgICAgZGF0YTogY29udmVydERhdGEoewogICAgICAgICAgICBibG9ja19saXN0OiBKU09OLnN0cmluZ2lmeShbZmlsZS5tZDUudG9Mb3dlckNhc2UoKV0pLAogICAgICAgICAgICBwYXRoOiB0aGlzLnNhdmVQYXRoICsgZmlsZS5wYXRoLnJlcGxhY2UoaWxsZWdhbFBhdGhQYXR0ZXJuLCAiXyIpLAogICAgICAgICAgICBzaXplOiBmaWxlLnNpemUsCiAgICAgICAgICAgIGlzZGlyOiAwLAogICAgICAgICAgICBhdXRvaW5pdDogMSwKICAgICAgICB9KSwKICAgIH0sIG9uUmVzcG9uc2VkLCBvbkZhaWxlZCk7Cn0KCi8vIEVYVEVSTkFMIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvc3BhcmstbWQ1L3NwYXJrLW1kNS5qcwp2YXIgc3BhcmtfbWQ1ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMjIpOwp2YXIgc3BhcmtfbWQ1X2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKHNwYXJrX21kNSk7CjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9iYWlkdS9jb21tb24vZ2VuZXJhdGViZGxpbmtUYXNrLnRzeAovKgogKiBAQXV0aG9yOiBtZW5nem9uZWZpcmUKICogQERhdGU6IDIwMjEtMDgtMjUgMDE6MzE6MDEKICogQExhc3RFZGl0VGltZTogMjAyMy0wMi0wOSAyMzozMzoyNgogKiBATGFzdEVkaXRvcnM6IG1lbmd6b25lZmlyZQogKiBARGVzY3JpcHRpb246IOeZvuW6pue9keebmCDnp5LkvKDnlJ/miJDku7vliqHlrp7njrAKICovCgoKCgoKCgovLyDmma7pgJrnlJ/miJA6CnZhciBHZW5lcmF0ZWJkbGlua1Rhc2sgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBHZW5lcmF0ZWJkbGlua1Rhc2soKSB7CiAgICB9CiAgICBHZW5lcmF0ZWJkbGlua1Rhc2sucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuaXNHZW5WaWV3ID0gZmFsc2U7CiAgICAgICAgdGhpcy5pc1NoYXJlUGFnZSA9IGZhbHNlOwogICAgICAgIHRoaXMuaXNGYXN0ID0KICAgICAgICAgICAgR01fZ2V0VmFsdWUoImZhc3QtZ2VuZXJhdGUiKSA9PT0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgICA/IHRydWUKICAgICAgICAgICAgICAgIDogR01fZ2V0VmFsdWUoImZhc3QtZ2VuZXJhdGUiKTsKICAgICAgICB0aGlzLnJlY3Vyc2l2ZSA9IGZhbHNlOwogICAgICAgIHRoaXMuc2F2ZVBhdGggPSAiIjsKICAgICAgICB0aGlzLmJkc3Rva2VuID0gZ2V0QmRzdG9rZW4oKTsgLy8g5q2k5aSEYmRzdG9rZW7kuI3lj6/liKDpmaQsIOS8muWcqOS4i+aWuXByZWNyZWF0ZUZpbGVWMuaWueazleiwg+eUqAogICAgICAgIHRoaXMuZGlyTGlzdCA9IFtdOwogICAgICAgIHRoaXMuc2VsZWN0TGlzdCA9IFtdOwogICAgICAgIHRoaXMuZmlsZUluZm9MaXN0ID0gW107CiAgICAgICAgdGhpcy5vbkZpbmlzaCA9IGZ1bmN0aW9uICgpIHsgfTsKICAgICAgICB0aGlzLm9uUHJvY2VzcyA9IGZ1bmN0aW9uICgpIHsgfTsKICAgICAgICB0aGlzLm9uUHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7IH07CiAgICAgICAgdGhpcy5vbkhhc0RpciA9IGZ1bmN0aW9uICgpIHsgfTsKICAgICAgICB0aGlzLm9uSGFzTm9EaXIgPSBmdW5jdGlvbiAoKSB7IH07CiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVzY3JpcHRpb246IOaJp+ihjOaWsOS7u+WKoeeahOWIneWni+WMluatpemqpCDmiavmj4/pgInmi6nnmoTmlofku7bliJfooagKICAgICAqLwogICAgR2VuZXJhdGViZGxpbmtUYXNrLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAodGhpcy5pc1NoYXJlUGFnZSkgewogICAgICAgICAgICB0aGlzLmxvZ2lkID0gZ2V0TG9naWQoKTsKICAgICAgICAgICAgdGhpcy5zdXJsID0gZ2V0U3VybCgpOwogICAgICAgICAgICBpZiAoIXRoaXMuc3VybCkgewogICAgICAgICAgICAgICAgc2hvd0FsZXJ0KCJzdXJsXHU4M0I3XHU1M0Q2XHU1OTMxXHU4RDI1OiAiICsgbG9jYXRpb24uaHJlZiArICIsIFx1OEJGN1x1NTI0RFx1NUY4MFx1ODExQVx1NjcyQ1x1OTg3NVx1NTNDRFx1OTk4ODpcbiIgKyBob21lUGFnZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5wYXJzZVNoYXJlRmlsZUxpc3QoKTsKICAgICAgICAgICAgdGhpcy5vbkhhc05vRGlyKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLnBhcnNlTWFpbkZpbGVMaXN0KCk7CiAgICAgICAgICAgIGlmICh0aGlzLmRpckxpc3QubGVuZ3RoKQogICAgICAgICAgICAgICAgdGhpcy5vbkhhc0RpcigpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB0aGlzLm9uSGFzTm9EaXIoKTsKICAgICAgICB9CiAgICB9OwogICAgR2VuZXJhdGViZGxpbmtUYXNrLnByb3RvdHlwZS5zY2FuU2hhcmVGaWxlID0gZnVuY3Rpb24gKGksIHBhZ2UpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGlmIChwYWdlID09PSB2b2lkIDApIHsgcGFnZSA9IDE7IH0KICAgICAgICBpZiAoaSA+PSB0aGlzLmRpckxpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVCZGxpbmsoMCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5vblByb2dyZXNzKGZhbHNlLCAiXHU2QjYzXHU1NzI4XHU4M0I3XHU1M0Q2XHU2NTg3XHU0RUY2XHU1MjE3XHU4ODY4LCBcdTdCMkMiICsgKGkgKyAxKSArICJcdTRFMkEiKTsKICAgICAgICBhamF4KHsKICAgICAgICAgICAgdXJsOiBzaGFyZWxpc3RfdXJsICsgIiZkaXI9IiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmRpckxpc3RbaV0pICsgIiZsb2dpZD0iICsgdGhpcy5sb2dpZCArICImc2hhcmVpZD0iICsgdW5zYWZlV2luZG93Lnl1bkRhdGEuc2hhcmVpZCArICImdWs9IiArIHVuc2FmZVdpbmRvdy55dW5EYXRhLnNoYXJlX3VrICsgIiZwYWdlPSIgKyBwYWdlLAogICAgICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICB9LCAvLyBsaXN05o6l5Y+j6Ieq5bim6YCS5b2S5Y+C5pWwcmVjdXJzaW9uCiAgICAgICAgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVzcG9uc2U7CiAgICAgICAgICAgIGlmICghZGF0YS5lcnJubykgewogICAgICAgICAgICAgICAgaWYgKCFkYXRhLmxpc3QubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIF90aGlzLnNjYW5TaGFyZUZpbGUoaSArIDEpOwogICAgICAgICAgICAgICAgLy8g6L+U5Zue5YiX6KGo5Li656m6LCDljbPmraTmlofku7blpLnmlofku7blhajpg6jmiavmj4/lrozmiJAKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIF90aGlzLnBhcnNlU2hhcmVGaWxlTGlzdChkYXRhLmxpc3QpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLnNjYW5TaGFyZUZpbGUoaSwgcGFnZSArIDEpOyAvLyDkuIvkuIDpobUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIF90aGlzLmZpbGVJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBwYXRoOiBfdGhpcy5kaXJMaXN0W2ldLAogICAgICAgICAgICAgICAgICAgIGlzZGlyOiAxLAogICAgICAgICAgICAgICAgICAgIGVycm5vOiBkYXRhLmVycm5vLAogICAgICAgICAgICAgICAgfSk7IC8vIGxpc3TmjqXlj6Porr/pl67lpLHotKUsIOa3u+WKoOWksei0peS/oeaBrwogICAgICAgICAgICAgICAgX3RoaXMuc2NhblNoYXJlRmlsZShpICsgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBmdW5jdGlvbiAoc3RhdHVzQ29kZSkgewogICAgICAgICAgICBfdGhpcy5maWxlSW5mb0xpc3QucHVzaCh7CiAgICAgICAgICAgICAgICBwYXRoOiBfdGhpcy5kaXJMaXN0W2ldLAogICAgICAgICAgICAgICAgZXJybm86IHN0YXR1c0NvZGUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBfdGhpcy5zY2FuU2hhcmVGaWxlKGkgKyAxKTsKICAgICAgICB9KTsKICAgIH07CiAgICAvKioKICAgICAqIEBkZXNjcmlwdGlvbjog6YCJ5oup55qE5YiX6KGo5YyF5ZCr5paH5Lu25aS5LCDojrflj5bmlofku7blpLnkuIvnmoTlrZDmlofku7YKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpIOadoeebrmluZGV4CiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQg5YiX6KGo5o6l5Y+j5qOA57Si6LW354K5CiAgICAgKi8KICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUuc2NhbkZpbGUgPSBmdW5jdGlvbiAoaSwgc3RhcnQpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGlmIChzdGFydCA9PT0gdm9pZCAwKSB7IHN0YXJ0ID0gMDsgfQogICAgICAgIGlmIChpID49IHRoaXMuZGlyTGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUJkbGluaygwKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBhamF4KHsKICAgICAgICAgICAgdXJsOiBsaXN0X3VybCArICImcGF0aD0iICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZGlyTGlzdFtpXSkgKyAiJnJlY3Vyc2lvbj0iICsgKHRoaXMucmVjdXJzaXZlID8gMSA6IDApICsgIiZzdGFydD0iICsgc3RhcnQsCiAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogImpzb24iLAogICAgICAgIH0sIC8vIGxpc3TmjqXlj6Poh6rluKbpgJLlvZLlj4LmlbByZWN1cnNpb24KICAgICAgICBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBkYXRhID0gZGF0YS5yZXNwb25zZTsKICAgICAgICAgICAgaWYgKCFkYXRhLmVycm5vKSB7CiAgICAgICAgICAgICAgICBpZiAoIWRhdGEubGlzdC5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2NhbkZpbGUoaSArIDEpOyAvLyDov5Tlm57liJfooajkuLrnqbosIOWNs+atpOaWh+S7tuWkueaWh+S7tuWFqOmDqOaJq+aPj+WujOaIkAogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5saXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5pc2RpciB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmlsZUluZm9MaXN0LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGl0ZW0ucGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBpdGVtLnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfaWQ6IGl0ZW0uZnNfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWQ1OiBfdGhpcy5pc0Zhc3QgPyBkZWNyeXB0TWQ1KGl0ZW0ubWQ1LnRvTG93ZXJDYXNlKCkpIDogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWQ1czogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsgLy8g562b6YCJ5paH5Lu2KGlzZGlyPTApCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuc2NhbkZpbGUoaSwgc3RhcnQgKyBsaXN0TGltaXQpOyAvLyDku47kuIvkuIDkuKrotbfngrnnu6fnu63mo4DntKLliJfooagKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIF90aGlzLmZpbGVJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBwYXRoOiBfdGhpcy5kaXJMaXN0W2ldLAogICAgICAgICAgICAgICAgICAgIGlzZGlyOiAxLAogICAgICAgICAgICAgICAgICAgIGVycm5vOiBkYXRhLmVycm5vLAogICAgICAgICAgICAgICAgfSk7IC8vIGxpc3TmjqXlj6Porr/pl67lpLHotKUsIOa3u+WKoOWksei0peS/oeaBrwogICAgICAgICAgICAgICAgX3RoaXMuc2NhbkZpbGUoaSArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24gKHN0YXR1c0NvZGUpIHsKICAgICAgICAgICAgX3RoaXMuZmlsZUluZm9MaXN0LnB1c2goewogICAgICAgICAgICAgICAgcGF0aDogX3RoaXMuZGlyTGlzdFtpXSwKICAgICAgICAgICAgICAgIGVycm5vOiBzdGF0dXNDb2RlLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgX3RoaXMuc2NhbkZpbGUoaSArIDEpOwogICAgICAgIH0pOwogICAgfTsKICAgIC8qKgogICAgICogQGRlc2NyaXB0aW9uOiDpobrluo/miafooYznlJ/miJDku7vliqEKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpCiAgICAgKi8KICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUuZ2VuZXJhdGVCZGxpbmsgPSBmdW5jdGlvbiAoaSkgewogICAgICAgIC8vIOS/neWtmOS7u+WKoei/m+W6puaVsOaNriwg5YiG5Lqr6aG155Sf5oiQ5LiN5L+d5a2YCiAgICAgICAgaWYgKCF0aGlzLmlzU2hhcmVQYWdlKQogICAgICAgICAgICBHTV9zZXRWYWx1ZSgidW5maW5pc2giLCB7CiAgICAgICAgICAgICAgICBmaWxlX2luZm9fbGlzdDogdGhpcy5maWxlSW5mb0xpc3QsCiAgICAgICAgICAgICAgICBmaWxlX2lkOiBpLAogICAgICAgICAgICB9KTsKICAgICAgICAvLyDnlJ/miJDlrozmiJAKICAgICAgICBpZiAoaSA+PSB0aGlzLmZpbGVJbmZvTGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNGYXN0KQogICAgICAgICAgICAgICAgdGhpcy5jaGVja01kNSgwKTsgLy8g5bey5byA5ZCvICLmnoHpgJ/nlJ/miJAiLCDmiafooYxtZDXmo4Dmn6UKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdGhpcy5vbkZpbmlzaCh0aGlzLmZpbGVJbmZvTGlzdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8g5pyq5byA5ZCvICLmnoHpgJ/nlJ/miJAiLCDliLfmlrDlvLnnqpflhoXnmoTku7vliqHov5vluqYKICAgICAgICBpZiAoIXRoaXMuaXNGYXN0KQogICAgICAgICAgICB0aGlzLm9uUHJvY2VzcyhpLCB0aGlzLmZpbGVJbmZvTGlzdCk7CiAgICAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVJbmZvTGlzdFtpXTsKICAgICAgICAvLyDot7Pov4fmiavmj4/lpLHotKXnmoTnm67lvZXot6/lvoQKICAgICAgICBpZiAoZmlsZS5lcnJubyAmJiBmaWxlLmlzZGlyKSB7CiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVCZGxpbmsoaSArIDEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIOW3suW8gOWQryAi5p6B6YCf55Sf5oiQIiDkuJTlt7Lojrflj5bliLBtZDUsIOi3s+i/h+aZrumAmueUn+aIkOatpemqpAogICAgICAgIGlmICh0aGlzLmlzRmFzdCAmJiBmaWxlLm1kNSkKICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUJkbGluayhpICsgMSk7CiAgICAgICAgLy8g5pmu6YCa55Sf5oiQ5q2l6aqkCiAgICAgICAgZWxzZQogICAgICAgICAgICB0aGlzLmlzU2hhcmVQYWdlID8gdGhpcy5nZXRTaGFyZURsaW5rKGkpIDogdGhpcy5nZXREbGluayhpKTsKICAgIH07CiAgICAvKioKICAgICAqIEBkZXNjcmlwdGlvbjog6I635Y+W5paH5Lu25L+h5oGvOiBzaXplLCBtZDUo5Y+v6IO96ZSZ6K+vKSwgZnNfaWQKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpCiAgICAgKi8KICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUuZ2V0RmlsZUluZm8gPSBmdW5jdGlvbiAoaSkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIGZpbGUgPSB0aGlzLmZpbGVJbmZvTGlzdFtpXTsKICAgICAgICBhamF4KHsKICAgICAgICAgICAgdXJsOiBtZXRhX3VybCArIGVuY29kZVVSSUNvbXBvbmVudChmaWxlLnBhdGgpLAogICAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICB9LCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBkYXRhID0gZGF0YS5yZXNwb25zZTsKICAgICAgICAgICAgaWYgKCFkYXRhLmVycm5vKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5saXN0WzBdLmlzZGlyKSB7CiAgICAgICAgICAgICAgICAgICAgZmlsZS5lcnJubyA9IDkwMDsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZUJkbGluayhpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZmlsZS5zaXplID0gZGF0YS5saXN0WzBdLnNpemU7CiAgICAgICAgICAgICAgICBmaWxlLmZzX2lkID0gZGF0YS5saXN0WzBdLmZzX2lkOwogICAgICAgICAgICAgICAgLy8g5bey5byA5ZCv5p6B6YCf55Sf5oiQLCDnm7TmjqXlj5ZtZXRh5YaF55qEbWQ1CiAgICAgICAgICAgICAgICBmaWxlLm1kNSA9IF90aGlzLmlzRmFzdAogICAgICAgICAgICAgICAgICAgID8gZGVjcnlwdE1kNShkYXRhLmxpc3RbMF0ubWQ1LnRvTG93ZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAgICAgOiAiIjsKICAgICAgICAgICAgICAgIGZpbGUubWQ1cyA9ICIiOwogICAgICAgICAgICAgICAgX3RoaXMuZ2V0RGxpbmsoaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmaWxlLmVycm5vID0gZGF0YS5lcnJubzsKICAgICAgICAgICAgICAgIF90aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIGZ1bmN0aW9uIChzdGF0dXNDb2RlKSB7CiAgICAgICAgICAgIGZpbGUuZXJybm8gPSBzdGF0dXNDb2RlID09PSA0MDQgPyA5MDkgOiBzdGF0dXNDb2RlOwogICAgICAgICAgICBfdGhpcy5nZW5lcmF0ZUJkbGluayhpICsgMSk7CiAgICAgICAgfSk7CiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVzY3JpcHRpb246IOiOt+WPluWIhuS6q+mhteeahOaWh+S7tmRsaW5rKOS4i+i9veebtOmTvikKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpCiAgICAgKi8KICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUuZ2V0U2hhcmVEbGluayA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgc2lnbiwgdGltZXN0YW1wLCBmaWxlID0gdGhpcy5maWxlSW5mb0xpc3RbaV0sIG9uRmFpbGVkID0gZnVuY3Rpb24gKGVycm5vKSB7CiAgICAgICAgICAgIGZpbGUuZXJybm8gPSBlcnJubzsKICAgICAgICAgICAgX3RoaXMuY2hlY2tNZDUoaSArIDEpOwogICAgICAgICAgICAvLyBtZDXkuLrnqbrlj6rlnKjliIbkuqvljZXkuKrmlofku7bml7blh7rnjrAsIOaVheaXoOmcgOiAg+iZkeiOt+WPluWkmuaWh+S7tm1kNSjot7PovaxnZW5lcmF0ZUJkbGluayksIOebtOaOpei3s+i9rGNoZWNrTWQ15Y2z5Y+vCiAgICAgICAgfTsKICAgICAgICBmdW5jdGlvbiBnZXRUcGxjb25maWcoZmlsZSkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBhamF4KHsKICAgICAgICAgICAgICAgIHVybDogdHBsX3VybCArICImc3VybD0iICsgdGhpcy5zdXJsICsgIiZsb2dpZD0iICsgdGhpcy5sb2dpZCwKICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlc3BvbnNlOwogICAgICAgICAgICAgICAgLy8g6K+35rGC5q2j5bi4CiAgICAgICAgICAgICAgICBpZiAoIWRhdGEuZXJybm8pIHsKICAgICAgICAgICAgICAgICAgICBzaWduID0gZGF0YS5kYXRhLnNpZ247CiAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wID0gZGF0YS5kYXRhLnRpbWVzdGFtcDsKICAgICAgICAgICAgICAgICAgICBnZXREbGluay5jYWxsKF90aGlzLCBmaWxlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyDor7fmsYLmiqXplJkKICAgICAgICAgICAgICAgIG9uRmFpbGVkKGRhdGEuZXJybm8pOwogICAgICAgICAgICB9LCBvbkZhaWxlZCk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGdldERsaW5rKGZpbGUpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgYWpheCh7CiAgICAgICAgICAgICAgICB1cmw6IHNoYXJlZG93bmxvYWRfdXJsICsgIiZzaWduPSIgKyBzaWduICsgIiZ0aW1lc3RhbXA9IiArIHRpbWVzdGFtcCwKICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogImpzb24iLAogICAgICAgICAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgICAgICAgICBkYXRhOiBjb252ZXJ0RGF0YSh7CiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IGdldEV4dHJhKCksCiAgICAgICAgICAgICAgICAgICAgbG9naWQ6IHRoaXMubG9naWQsCiAgICAgICAgICAgICAgICAgICAgZmlkX2xpc3Q6IEpTT04uc3RyaW5naWZ5KFtmaWxlLmZzX2lkXSksCiAgICAgICAgICAgICAgICAgICAgcHJpbWFyeWlkOiB1bnNhZmVXaW5kb3cueXVuRGF0YS5zaGFyZWlkLAogICAgICAgICAgICAgICAgICAgIHVrOiB1bnNhZmVXaW5kb3cueXVuRGF0YS5zaGFyZV91aywKICAgICAgICAgICAgICAgICAgICBwcm9kdWN0OiAic2hhcmUiLAogICAgICAgICAgICAgICAgICAgIGVuY3J5cHQ6IDAsCiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlc3BvbnNlOwogICAgICAgICAgICAgICAgLy8g6K+35rGC5q2j5bi4CiAgICAgICAgICAgICAgICBpZiAoIWRhdGEuZXJybm8pIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5kb3dubG9hZEZpbGVEYXRhKGksIGRhdGEubGlzdFswXS5kbGluayk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8g6K+35rGC5oql6ZSZCiAgICAgICAgICAgICAgICBvbkZhaWxlZChkYXRhLmVycm5vKTsKICAgICAgICAgICAgfSwgb25GYWlsZWQpOwogICAgICAgIH0KICAgICAgICBnZXRUcGxjb25maWcuY2FsbCh0aGlzLCBmaWxlKTsKICAgIH07CiAgICAvKioKICAgICAqIEBkZXNjcmlwdGlvbjog6I635Y+W5paH5Lu2ZGxpbmso5LiL6L2955u06ZO+KQogICAgICogQHBhcmFtIHtudW1iZXJ9IGkKICAgICAqLwogICAgR2VuZXJhdGViZGxpbmtUYXNrLnByb3RvdHlwZS5nZXREbGluayA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZUluZm9MaXN0W2ldOwogICAgICAgIC8vIOS9v+eUqOeUn+aIkOmhteaXtuS7heaciXBhdGjmsqHmnIlmc19pZCwg6Lez6L2s5Yiw6I635Y+WZnNfaWQKICAgICAgICBpZiAoIWZpbGUuZnNfaWQpIHsKICAgICAgICAgICAgdGhpcy5nZXRGaWxlSW5mbyhpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBhamF4KHsKICAgICAgICAgICAgdXJsOiBtZXRhX3VybDIgKyBKU09OLnN0cmluZ2lmeShbZmlsZS5mc19pZF0pLAogICAgICAgICAgICByZXNwb25zZVR5cGU6ICJqc29uIiwKICAgICAgICAgICAgbWV0aG9kOiAiR0VUIiwKICAgICAgICB9LCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBkYXRhID0gZGF0YS5yZXNwb25zZTsKICAgICAgICAgICAgLy8g6K+35rGC5q2j5bi4CiAgICAgICAgICAgIGlmICghZGF0YS5lcnJubykgewogICAgICAgICAgICAgICAgX3RoaXMuZG93bmxvYWRGaWxlRGF0YShpLCBkYXRhLmxpc3RbMF0uZGxpbmspOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIOivt+axguaKpemUmQogICAgICAgICAgICBmaWxlLmVycm5vID0gZGF0YS5lcnJubzsKICAgICAgICAgICAgX3RoaXMuaXNGYXN0ID8gX3RoaXMuY2hlY2tNZDUoaSArIDEpIDogX3RoaXMuZ2VuZXJhdGVCZGxpbmsoaSArIDEpOwogICAgICAgIH0sIGZ1bmN0aW9uIChzdGF0dXNDb2RlKSB7CiAgICAgICAgICAgIGZpbGUuZXJybm8gPSBzdGF0dXNDb2RlOwogICAgICAgICAgICBfdGhpcy5pc0Zhc3QgPyBfdGhpcy5jaGVja01kNShpICsgMSkgOiBfdGhpcy5nZW5lcmF0ZUJkbGluayhpICsgMSk7CiAgICAgICAgfSk7CiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVzY3JpcHRpb246IOiwg+eUqOS4i+i9veebtOmTvgogICAgICogQHBhcmFtIHtudW1iZXJ9IGkKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkbGluawogICAgICovCiAgICBHZW5lcmF0ZWJkbGlua1Rhc2sucHJvdG90eXBlLmRvd25sb2FkRmlsZURhdGEgPSBmdW5jdGlvbiAoaSwgZGxpbmspIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHZhciBkbFNpemUsIGZpbGUgPSB0aGlzLmZpbGVJbmZvTGlzdFtpXTsKICAgICAgICBpZiAodGhpcy5pc0Zhc3QpCiAgICAgICAgICAgIGRsU2l6ZSA9IDE7IC8vICLmnoHpgJ/kuIvovb0iIOS4jemcgOimgeeUn+aIkHNsaWNlLW1kNSwg5pWF5peg6ZyA5LiL6L295paH5Lu25pWw5o2uCiAgICAgICAgZWxzZQogICAgICAgICAgICBkbFNpemUgPSBmaWxlLnNpemUgPCAyNjIxNDQgPyAxIDogMjYyMTQzOyAvL3NsaWNlLW1kNTog5paH5Lu25YmNMjU2S2lC55qEbWQ1LCBzaXplPDI1NktpQuWImeebtOaOpeWPlm1kNeWNs+WPrywg5peg6ZyA5LiL6L295paH5Lu25pWw5o2uCiAgICAgICAgYWpheCh7CiAgICAgICAgICAgIHVybDogZGxpbmssCiAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogImFycmF5YnVmZmVyIiwKICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgUmFuZ2U6ICJieXRlcz0wLSIgKyBkbFNpemUsCiAgICAgICAgICAgICAgICAiVXNlci1BZ2VudCI6IFVBLAogICAgICAgICAgICB9LAogICAgICAgICAgICBvbnByb2dyZXNzOiB0aGlzLmlzRmFzdCA/IGZ1bmN0aW9uICgpIHsgfSA6IHRoaXMub25Qcm9ncmVzcywKICAgICAgICB9LCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoIV90aGlzLmlzRmFzdCkKICAgICAgICAgICAgICAgIF90aGlzLm9uUHJvZ3Jlc3MoeyBsb2FkZWQ6IDEwMCwgdG90YWw6IDEwMCB9KTsgLy8gMTAwJQogICAgICAgICAgICBfdGhpcy5wYXJzZURvd25sb2FkRGF0YShpLCBkYXRhKTsKICAgICAgICB9LCBmdW5jdGlvbiAoc3RhdHVzQ29kZSkgewogICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PT0gNDA0KQogICAgICAgICAgICAgICAgZmlsZS5lcnJubyA9IDkwOTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZmlsZS5lcnJubyA9IHN0YXR1c0NvZGU7CiAgICAgICAgICAgIF90aGlzLmlzRmFzdCA/IF90aGlzLmNoZWNrTWQ1KGkgKyAxKSA6IF90aGlzLmdlbmVyYXRlQmRsaW5rKGkgKyAxKTsKICAgICAgICB9KTsKICAgIH07CiAgICAvKioKICAgICAqIEBkZXNjcmlwdGlvbjog6Kej5p6Q55u06ZO+6K+35rGC6L+U5Zue55qE5pWw5o2uCiAgICAgKiBAcGFyYW0ge251bWJlcn0gaQogICAgICogQHBhcmFtIHthbnl9IGRhdGEKICAgICAqLwogICAgR2VuZXJhdGViZGxpbmtUYXNrLnByb3RvdHlwZS5wYXJzZURvd25sb2FkRGF0YSA9IGZ1bmN0aW9uIChpLCBkYXRhKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZUluZm9MaXN0W2ldOwogICAgICAgIGNvbnNvbGUubG9nKCJkbF91cmw6ICIgKyBkYXRhLmZpbmFsVXJsKTsgLy8gZGVidWcKICAgICAgICAvLyDkuIvovb3nm7Tpk77ph43lrprlkJHliLDmraTln5/lkI0sIOWIpOWumuS4uuaWh+S7tuWSjOiwkAogICAgICAgIGlmIChkYXRhLmZpbmFsVXJsLmluY2x1ZGVzKCJpc3N1ZWNkbi5iYWlkdXBjcy5jb20iKSkgewogICAgICAgICAgICBmaWxlLmVycm5vID0gMTkxOTsKICAgICAgICAgICAgdGhpcy5pc0Zhc3QgPyB0aGlzLmNoZWNrTWQ1KGkgKyAxKSA6IHRoaXMuZ2VuZXJhdGVCZGxpbmsoaSArIDEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIOS7juS4i+i9veaOpeWPo+iOt+WPlm1kNSwg5q2k5q2l6aqk5Y+v56Gu5L+d6I635Y+W5Yiw5q2j56GubWQ1CiAgICAgICAgdmFyIGZpbGVNZDUgPSBkYXRhLnJlc3BvbnNlSGVhZGVycy5tYXRjaCgvY29udGVudC1tZDU6IChbXGRhLWZdezMyfSkvaSk7CiAgICAgICAgaWYgKGZpbGVNZDUpCiAgICAgICAgICAgIGZpbGUubWQ1ID0gZmlsZU1kNVsxXS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGVsc2UgaWYgKGZpbGUuc2l6ZSA8PSAzOTAwMDAwMDAwICYmICFmaWxlLnJldHJ5Xzk5NiAmJiAhdGhpcy5pc1NoYXJlUGFnZSkgewogICAgICAgICAgICAvLyDpu5jorqTkuIvovb3mjqXlj6PmnKrmi7/liLBtZDUsIOWwneivleS9v+eUqOaXp+S4i+i9veaOpeWPoywg5pen5o6l5Y+j6K+35rGC5paH5Lu2c2l6ZeWkp+S6jjMuOUfkvJrov5Tlm540MDMKICAgICAgICAgICAgLy8g5YiG5Lqr6aG155qE55Sf5oiQ5Lu75Yqh5LiN6KaB6LCD55So5pen5o6l5Y+jCiAgICAgICAgICAgIGZpbGUucmV0cnlfOTk2ID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5kb3dubG9hZEZpbGVEYXRhKGksIHBjc191cmwgKyAoIiZwYXRoPSIgKyBlbmNvZGVVUklDb21wb25lbnQoZmlsZS5wYXRoKSkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyDkuKTkuKrkuIvovb3mjqXlj6PlnYfmnKrmi7/liLBtZDUsIOWksei0pei3s+WHugogICAgICAgICAgICBmaWxlLmVycm5vID0gOTk2OwogICAgICAgICAgICB0aGlzLmlzRmFzdCA/IHRoaXMuY2hlY2tNZDUoaSArIDEpIDogdGhpcy5nZW5lcmF0ZUJkbGluayhpICsgMSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8g6I635Y+WbWQ1cywgIuaegemAn+eUn+aIkCIg6Lez6L+H5q2k5q2lCiAgICAgICAgaWYgKCF0aGlzLmlzRmFzdCkgewogICAgICAgICAgICBpZiAoZmlsZS5zaXplIDwgMjYyMTQ0KQogICAgICAgICAgICAgICAgZmlsZS5tZDVzID0gZmlsZS5tZDU7IC8vIOatpOaXtm1kNXM9bWQ1CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8g6K6h566XbWQ1cwogICAgICAgICAgICAgICAgdmFyIHNwYXJrID0gbmV3IChzcGFya19tZDVfZGVmYXVsdCgpKS5BcnJheUJ1ZmZlcigpOwogICAgICAgICAgICAgICAgc3BhcmsuYXBwZW5kKGRhdGEucmVzcG9uc2UpOwogICAgICAgICAgICAgICAgdmFyIHNsaWNlTWQ1ID0gc3BhcmsuZW5kKCk7CiAgICAgICAgICAgICAgICBmaWxlLm1kNXMgPSBzbGljZU1kNTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgaW50ZXJ2YWwgPSB0aGlzLmZpbGVJbmZvTGlzdC5sZW5ndGggPiAxID8gMjAwMCA6IDEwMDA7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgX3RoaXMuZ2VuZXJhdGVCZGxpbmsoaSArIDEpOwogICAgICAgICAgICB9LCBpbnRlcnZhbCk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgdGhpcy5jaGVja01kNShpICsgMSk7CiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVzY3JpcHRpb246ICLmnoHpgJ/nlJ/miJAiIOWPr+iDveW+l+WIsOmUmeivr21kNSwg5pWF5omn6KGM6aqM6K+B5q2l6aqkLCDoi6Xpqozor4HkuI3pgJrov4fliJnmiafooYzmma7pgJrnlJ/miJAKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpCiAgICAgKi8KICAgIEdlbmVyYXRlYmRsaW5rVGFzay5wcm90b3R5cGUuY2hlY2tNZDUgPSBmdW5jdGlvbiAoaSkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgaWYgKGkgPj0gdGhpcy5maWxlSW5mb0xpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgIHRoaXMub25GaW5pc2godGhpcy5maWxlSW5mb0xpc3QpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBmaWxlID0gdGhpcy5maWxlSW5mb0xpc3RbaV07CiAgICAgICAgLy8g6Lez6L+H5omr5o+P5aSx6LSl55qE55uu5b2V6Lev5b6ECiAgICAgICAgaWYgKGZpbGUuZXJybm8gJiYgZmlsZS5pc2RpcikgewogICAgICAgICAgICB0aGlzLmNoZWNrTWQ1KGkgKyAxKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLm9uUHJvY2VzcyhpLCB0aGlzLmZpbGVJbmZvTGlzdCk7CiAgICAgICAgdGhpcy5vblByb2dyZXNzKGZhbHNlLCAi5p6B6YCf55Sf5oiQ5LitLi4uIik7CiAgICAgICAgcHJlY3JlYXRlRmlsZVYyLmNhbGwodGhpcywgZmlsZSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgZGF0YSA9IGRhdGEucmVzcG9uc2U7CiAgICAgICAgICAgIGlmICgwID09PSBkYXRhLmVycm5vKSB7CiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gZGF0YS5ibG9ja19saXN0Lmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICBfdGhpcy5jaGVja01kNShpICsgMSk7IC8vIG1kNemqjOivgeaIkOWKnwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gbWQ16aqM6K+B5aSx6LSlLCDmiafooYzmma7pgJrnlJ/miJAsIOS7heWcqOatpOWkhOS/neWtmOS7u+WKoei/m+W6piwg55Sf5oiQ6aG15LiN5L+d5a2Y6L+b5bqmCiAgICAgICAgICAgICAgICAgICAgaWYgKCFfdGhpcy5pc1NoYXJlUGFnZSkKICAgICAgICAgICAgICAgICAgICAgICAgR01fc2V0VmFsdWUoInVuZmluaXNoIiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9pbmZvX2xpc3Q6IF90aGlzLmZpbGVJbmZvTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfaWQ6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NoZWNrTWQ1OiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5pc1NoYXJlUGFnZSA/IF90aGlzLmdldFNoYXJlRGxpbmsoaSkgOiBfdGhpcy5nZXREbGluayhpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIOaOpeWPo+iuv+mXruWksei0pQogICAgICAgICAgICAgICAgZmlsZS5lcnJubyA9IGRhdGEuZXJybm87CiAgICAgICAgICAgICAgICBfdGhpcy5jaGVja01kNShpICsgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBmdW5jdGlvbiAoc3RhdHVzQ29kZSkgewogICAgICAgICAgICBmaWxlLmVycm5vID0gc3RhdHVzQ29kZTsKICAgICAgICAgICAgX3RoaXMuY2hlY2tNZDUoaSArIDEpOwogICAgICAgIH0pOwogICAgfTsKICAgIC8qKgogICAgICogQGRlc2NyaXB0aW9uOiDnlKjkuo7op6PmnpDluqbnm5jkuLvpobXnmoTmlofku7bliJfooajmlbDmja4KICAgICAqLwogICAgR2VuZXJhdGViZGxpbmtUYXNrLnByb3RvdHlwZS5wYXJzZU1haW5GaWxlTGlzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGhpcy5zZWxlY3RMaXN0OyBfaSA8IF9hLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICB2YXIgaXRlbSA9IF9hW19pXTsKICAgICAgICAgICAgaWYgKGl0ZW0uaXNkaXIpCiAgICAgICAgICAgICAgICB0aGlzLmRpckxpc3QucHVzaChpdGVtLnBhdGgpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB0aGlzLmZpbGVJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBwYXRoOiBpdGVtLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgc2l6ZTogaXRlbS5zaXplLAogICAgICAgICAgICAgICAgICAgIGZzX2lkOiBpdGVtLmZzX2lkLAogICAgICAgICAgICAgICAgICAgIC8vIOW3suW8gOWQr+aegemAn+eUn+aIkCwg55u05o6l5Y+WbWV0YeWGheeahG1kNQogICAgICAgICAgICAgICAgICAgIG1kNTogdGhpcy5pc0Zhc3QgPyBkZWNyeXB0TWQ1KGl0ZW0ubWQ1LnRvTG93ZXJDYXNlKCkpIDogIiIsCiAgICAgICAgICAgICAgICAgICAgbWQ1czogIiIsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVzY3JpcHRpb246IOeUqOS6juino+aekOWIhuS6q+mhteeahOaWh+S7tuWIl+ihqOaVsOaNrgogICAgICovCiAgICBHZW5lcmF0ZWJkbGlua1Rhc2sucHJvdG90eXBlLnBhcnNlU2hhcmVGaWxlTGlzdCA9IGZ1bmN0aW9uIChsaXN0KSB7CiAgICAgICAgaWYgKGxpc3QgPT09IHZvaWQgMCkgeyBsaXN0ID0gdGhpcy5zZWxlY3RMaXN0OyB9CiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBsaXN0XzEgPSBsaXN0OyBfaSA8IGxpc3RfMS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgdmFyIGl0ZW0gPSBsaXN0XzFbX2ldOwogICAgICAgICAgICB2YXIgcGF0aCA9IHZvaWQgMDsKICAgICAgICAgICAgaWYgKCJhcHBfaWQiIGluIGl0ZW0pCiAgICAgICAgICAgICAgICBwYXRoID0gaXRlbS5pc2RpciA/IGl0ZW0ucGF0aCA6IGl0ZW0uc2VydmVyX2ZpbGVuYW1lOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBwYXRoID0gaXRlbS5wYXRoOwogICAgICAgICAgICBpZiAoIi8iICE9PSBwYXRoLmNoYXJBdCgwKSkKICAgICAgICAgICAgICAgIHBhdGggPSAiLyIgKyBwYXRoOyAvLyDooaXpvZDot6/lvoTlvIDlpLTnmoTmlpzmnaAKICAgICAgICAgICAgaWYgKGl0ZW0uaXNkaXIpCiAgICAgICAgICAgICAgICB0aGlzLmRpckxpc3QucHVzaChwYXRoKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdGhpcy5maWxlSW5mb0xpc3QucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgcGF0aDogcGF0aCwKICAgICAgICAgICAgICAgICAgICBzaXplOiBpdGVtLnNpemUsCiAgICAgICAgICAgICAgICAgICAgZnNfaWQ6IGl0ZW0uZnNfaWQsCiAgICAgICAgICAgICAgICAgICAgbWQ1OiBpdGVtLm1kNSAmJiBkZWNyeXB0TWQ1KGl0ZW0ubWQ1LnRvTG93ZXJDYXNlKCkpLAogICAgICAgICAgICAgICAgICAgIG1kNXM6ICIiLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKICAgIHJldHVybiBHZW5lcmF0ZWJkbGlua1Rhc2s7Cn0oKSk7Ci8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gY29uc3QgZ2VuZXJhdGViZGxpbmtUYXNrID0gKEdlbmVyYXRlYmRsaW5rVGFzayk7Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYmFpZHUvY29tbW9uL2NvbnN0LnRzeAovKgogKiBAQXV0aG9yOiBtZW5nem9uZWZpcmUKICogQERhdGU6IDIwMjItMTAtMjAgMTA6MzY6NDMKICogQExhc3RFZGl0VGltZTogMjAyMy0wMi0xNCAwMzowNTowOQogKiBATGFzdEVkaXRvcnM6IG1lbmd6b25lZmlyZQogKiBARGVzY3JpcHRpb246IOWtmOaUvuWQhOenjeWFqOWxgOW4uOmHj+WvueixoQogKi8KCgoKCnZhciBob3N0ID0gbG9jYXRpb24uaG9zdDsKdmFyIGxpc3RMaW1pdCA9IDEwMDAwOwp2YXIgc3luY1BhdGhQcmVmaXggPSAiL19wY3NfLndvcmtzcGFjZSI7CnZhciByZXRyeU1heF9hcGlWMiA9IDQ7IC8vIHYy6L2s5a2Y5o6l5Y+j55qE5pyA5aSn6YeN6K+V5qyh5pWwCnZhciBjcmVhdGVfdXJsID0gImh0dHBzOi8vIiArIGhvc3QgKyAiL3Jlc3QvMi4wL3hwYW4vZmlsZT9tZXRob2Q9Y3JlYXRlIjsKdmFyIHByZWNyZWF0ZV91cmwgPSAiaHR0cHM6Ly8iICsgaG9zdCArICIvcmVzdC8yLjAveHBhbi9maWxlP21ldGhvZD1wcmVjcmVhdGUiOwp2YXIgbGlzdF91cmwgPSAiaHR0cHM6Ly8iICsgaG9zdCArICIvcmVzdC8yLjAveHBhbi9tdWx0aW1lZGlhP21ldGhvZD1saXN0YWxsJm9yZGVyPW5hbWUmbGltaXQ9IiArIGxpc3RMaW1pdDsKLy8g5bey55+l5q2k5o6l5Y+j5pyJ6ZmQ5Yi2OiBsaW1pdOWtl+autSjljbPljZXmrKHojrflj5bnmoTmlofku7bmlbAp5LiN6IO95aSn5LqOMTAwMDAsIOWQpuWImeebtOaOpei/lOWbnumUmeivrywg6LaF6L+HMXfnmoTmlofku7bpgJrov4dzdGFydOWPguaVsOiOt+WPlgp2YXIgbWV0YV91cmwgPSAiaHR0cHM6Ly8iICsgaG9zdCArICIvcmVzdC8yLjAveHBhbi9maWxlP2FwcF9pZD03Nzg3NTAmbWV0aG9kPW1ldGEmcGF0aD0iOwp2YXIgbWV0YV91cmwyID0gImh0dHBzOi8vIiArIGhvc3QgKyAiL3Jlc3QvMi4wL3hwYW4vbXVsdGltZWRpYT9tZXRob2Q9ZmlsZW1ldGFzJmRsaW5rPTEmZnNpZHM9IjsKdmFyIHRwbF91cmwgPSAiaHR0cHM6Ly8iICsgaG9zdCArICIvc2hhcmUvdHBsY29uZmlnP2ZpZWxkcz1zaWduLHRpbWVzdGFtcCZjaGFubmVsPWNodW5sZWkmd2ViPTEmYXBwX2lkPTI1MDUyOCZjbGllbnR0eXBlPTAiOwp2YXIgc2hhcmVkb3dubG9hZF91cmwgPSAiaHR0cHM6Ly8iICsgaG9zdCArICIvYXBpL3NoYXJlZG93bmxvYWQ/Y2hhbm5lbD1jaHVubGVpJmNsaWVudHR5cGU9MTImd2ViPTEmYXBwX2lkPTI1MDUyOCI7CnZhciBzaGFyZWxpc3RfdXJsID0gImh0dHBzOi8vIiArIGhvc3QgKyAiL3NoYXJlL2xpc3Q/c2hvd2VtcHR5PTAmbnVtPSIgKyBsaXN0TGltaXQgKyAiJmNoYW5uZWw9Y2h1bmxlaSZ3ZWI9MSZhcHBfaWQ9MjUwNTI4JmNsaWVudHR5cGU9MCI7CnZhciBzeW5jZG93bmxvYWRfdXJsID0gImh0dHBzOi8vIiArIGhvc3QgKyAiL2FwaS9kb3dubG9hZCI7CnZhciBwY3NfdXJsID0gImh0dHBzOi8vcGNzLmJhaWR1LmNvbS9yZXN0LzIuMC9wY3MvZmlsZT9hcHBfaWQ9Nzc4NzUwJm1ldGhvZD1kb3dubG9hZCI7CnZhciBpbGxlZ2FsUGF0aFBhdHRlcm4gPSAvW1xcIjoqPzw+fF0vZzsgLy8g5Yy56YWN6Lev5b6E5Lit55qE6Z2e5rOV5a2X56ymCnZhciBnZXRCZHN0b2tlbjsgLy8g6I635Y+WYmRzdG9rZW7nmoTlrp7njrAKZnVuY3Rpb24gc2V0R2V0QmRzdG9rZW4oZnVuYykgewogICAgZ2V0QmRzdG9rZW4gPSBmdW5jOwp9CnZhciByZWZyZXNoTGlzdDsgLy8g5Yi35paw5paH5Lu25YiX6KGo55qE5a6e546wCmZ1bmN0aW9uIHNldFJlZnJlc2hMaXN0KGZ1bmMpIHsKICAgIHJlZnJlc2hMaXN0ID0gZnVuYzsKfQp2YXIgZ2V0U2VsZWN0ZWRGaWxlTGlzdDsgLy8g6I635Y+W6YCJ5Lit55qE5paH5Lu25YiX6KGo55qE5a6e546wCmZ1bmN0aW9uIHNldEdldFNlbGVjdGVkRmlsZUxpc3QoZnVuYykgewogICAgZ2V0U2VsZWN0ZWRGaWxlTGlzdCA9IGZ1bmM7Cn0KdmFyIHN3YWxJbnN0YW5jZSA9IG5ldyBzd2FsQmFzZShuZXcgcmFwaWR1cGxvYWRUYXNrKCksIG5ldyBnZW5lcmF0ZWJkbGlua1Rhc2soKSk7CmZ1bmN0aW9uIGJhaWR1RXJybm8oZXJybm8pIHsKICAgIHN3aXRjaCAoZXJybm8pIHsKICAgICAgICBjYXNlIC02OgogICAgICAgICAgICByZXR1cm4gIlx1OEJBNFx1OEJDMVx1NTkzMVx1OEQyNShcdThCRjdcdTc3MEJcdTY1ODdcdTY4NjM6PGEgaHJlZj1cIiIgKyBkb2Muc2hhcmVEb2MgKyAiI1x1OEJBNFx1OEJDMVx1NTkzMVx1OEQyNS02XCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MTwvYT4gPGEgaHJlZj1cIiIgKyBkb2MyLnNoYXJlRG9jICsgIiNcdThCQTRcdThCQzFcdTU5MzFcdThEMjUtNlwiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTI8L2E+KSI7CiAgICAgICAgY2FzZSAtNzoKICAgICAgICAgICAgcmV0dXJuICJcdThGNkNcdTVCNThcdThERUZcdTVGODRcdTU0MkJcdTY3MDlcdTk3NUVcdTZDRDVcdTVCNTdcdTdCMjYoXHU4QkY3XHU3NzBCXHU2NTg3XHU2ODYzOjxhIGhyZWY9XCIiICsgZG9jLnNoYXJlRG9jICsgIiNcdThGNkNcdTVCNThcdThERUZcdTVGODRcdTU0MkJcdTY3MDlcdTk3NUVcdTZDRDVcdTVCNTdcdTdCMjYtN1wiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTE8L2E+IDxhIGhyZWY9XCIiICsgZG9jMi5zaGFyZURvYyArICIjXHU4RjZDXHU1QjU4XHU4REVGXHU1Rjg0XHU1NDJCXHU2NzA5XHU5NzVFXHU2Q0Q1XHU1QjU3XHU3QjI2LTdcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkyPC9hPikiOwogICAgICAgIGNhc2UgLTg6CiAgICAgICAgICAgIHJldHVybiAi6Lev5b6E5LiL5a2Y5Zyo5ZCM5ZCN5paH5Lu2IjsKICAgICAgICBjYXNlIC05OgogICAgICAgICAgICByZXR1cm4gIumqjOivgeW3sui/h+acnywg6K+35Yi35paw6aG16Z2iIjsKICAgICAgICBjYXNlIDQwMDoKICAgICAgICAgICAgcmV0dXJuICJcdThCRjdcdTZDNDJcdTk1MTlcdThCRUYoXHU4QkY3XHU3NzBCXHU2NTg3XHU2ODYzOjxhIGhyZWY9XCIiICsgZG9jLnNoYXJlRG9jICsgIiNcdThCRjdcdTZDNDJcdTk1MTlcdThCRUYtNDAwXCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MTwvYT4gPGEgaHJlZj1cIiIgKyBkb2MyLnNoYXJlRG9jICsgIiNcdThCRjdcdTZDNDJcdTk1MTlcdThCRUYtNDAwXCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MjwvYT4pIjsKICAgICAgICBjYXNlIDQwMzoKICAgICAgICAgICAgcmV0dXJuICJcdTYzQTVcdTUzRTNcdTk2NTBcdTUyMzZcdThCQkZcdTk1RUUoXHU4QkY3XHU3NzBCXHU2NTg3XHU2ODYzOjxhIGhyZWY9XCIiICsgZG9jLnNoYXJlRG9jICsgIiNcdTYzQTVcdTUzRTNcdTk2NTBcdTUyMzZcdThCQkZcdTk1RUUtNDAzXCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MTwvYT4gPGEgaHJlZj1cIiIgKyBkb2MyLnNoYXJlRG9jICsgIiNcdTYzQTVcdTUzRTNcdTk2NTBcdTUyMzZcdThCQkZcdTk1RUUtNDAzXCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MjwvYT4pIjsKICAgICAgICBjYXNlIDQwNDoKICAgICAgICAgICAgcmV0dXJuICJcdTc5RDJcdTRGMjBcdTY3MkFcdTc1MUZcdTY1NDgoXHU4QkY3XHU3NzBCXHU2NTg3XHU2ODYzOjxhIGhyZWY9XCIiICsgZG9jLnNoYXJlRG9jICsgIiNcdTc5RDJcdTRGMjBcdTY3MkFcdTc1MUZcdTY1NDgtNDA0XCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MTwvYT4gPGEgaHJlZj1cIiIgKyBkb2MyLnNoYXJlRG9jICsgIiNcdTc5RDJcdTRGMjBcdTY3MkFcdTc1MUZcdTY1NDgtNDA0XCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MjwvYT4pIjsKICAgICAgICBjYXNlIDExNDoKICAgICAgICAgICAgcmV0dXJuICJcdThGNkNcdTVCNThcdTU5MzFcdThEMjUtdjJcdTYzQTVcdTUzRTMoXHU4QkY3XHU3NzBCXHU2NTg3XHU2ODYzOjxhIGhyZWY9XCIiICsgZG9jLnNoYXJlRG9jICsgIiNcdThGNkNcdTVCNThcdTU5MzFcdThEMjUtdjJcdTYzQTVcdTUzRTMtMTE0XCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MTwvYT4gPGEgaHJlZj1cIiIgKyBkb2MyLnNoYXJlRG9jICsgIiNcdThGNkNcdTVCNThcdTU5MzFcdThEMjUtdjJcdTYzQTVcdTUzRTMtMTE0XCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MjwvYT4pIjsKICAgICAgICBjYXNlIDUxNDoKICAgICAgICAgICAgcmV0dXJuICJcdThCRjdcdTZDNDJcdTU5MzFcdThEMjUoXHU4QkY3XHU3NzBCXHU2NTg3XHU2ODYzOjxhIGhyZWY9XCIiICsgZG9jLnNoYXJlRG9jICsgIiNcdThCRjdcdTZDNDJcdTU5MzFcdThEMjUtNTE0XCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MTwvYT4gPGEgaHJlZj1cIiIgKyBkb2MyLnNoYXJlRG9jICsgIiNcdThCRjdcdTZDNDJcdTU5MzFcdThEMjUtNTE0XCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MjwvYT4pIjsKICAgICAgICBjYXNlIDE5MTk6CiAgICAgICAgICAgIHJldHVybiAiXHU2NTg3XHU0RUY2XHU1REYyXHU4OEFCXHU1NDhDXHU4QzEwKFx1OEJGN1x1NzcwQlx1NjU4N1x1Njg2Mzo8YSBocmVmPVwiIiArIGRvYy5zaGFyZURvYyArICIjXHU2NTg3XHU0RUY2XHU1REYyXHU4OEFCXHU1NDhDXHU4QzEwLTE5MTlcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkxPC9hPiA8YSBocmVmPVwiIiArIGRvYzIuc2hhcmVEb2MgKyAiI1x1NjU4N1x1NEVGNlx1NURGMlx1ODhBQlx1NTQ4Q1x1OEMxMC0xOTE5XCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MjwvYT4pIjsKICAgICAgICBjYXNlIDk5NjoKICAgICAgICAgICAgcmV0dXJuICJtZDVcdTgzQjdcdTUzRDZcdTU5MzFcdThEMjUoXHU4QkY3XHU3NzBCXHU2NTg3XHU2ODYzOjxhIGhyZWY9XCIiICsgZG9jLnNoYXJlRG9jICsgIiNtZDUtXHU4M0I3XHU1M0Q2XHU1OTMxXHU4RDI1LTk5NlwiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTE8L2E+IDxhIGhyZWY9XCIiICsgZG9jMi5zaGFyZURvYyArICIjbWQ1LVx1ODNCN1x1NTNENlx1NTkzMVx1OEQyNS05OTZcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkyPC9hPikiOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgcmV0dXJuICJcdThGNkNcdTVCNThcdTU5MzFcdThEMjUtdjFcdTYzQTVcdTUzRTMoXHU4QkY3XHU3NzBCXHU2NTg3XHU2ODYzOjxhIGhyZWY9XCIiICsgZG9jLnNoYXJlRG9jICsgIiNcdThGNkNcdTVCNThcdTU5MzFcdThEMjUtdjFcdTYzQTVcdTUzRTMtMlwiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTE8L2E+IDxhIGhyZWY9XCIiICsgZG9jMi5zaGFyZURvYyArICIjXHU4RjZDXHU1QjU4XHU1OTMxXHU4RDI1LXYxXHU2M0E1XHU1M0UzLTJcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkyPC9hPikiOwogICAgICAgIGNhc2UgLTEwOgogICAgICAgICAgICByZXR1cm4gIue9keebmOWuuemHj+W3sua7oSI7CiAgICAgICAgY2FzZSA1MDA6CiAgICAgICAgY2FzZSA1MDI6CiAgICAgICAgY2FzZSA1MDM6CiAgICAgICAgICAgIHJldHVybiAiXHU2NzBEXHU1MkExXHU1NjY4XHU5NTE5XHU4QkVGKFx1OEJGN1x1NzcwQlx1NjU4N1x1Njg2Mzo8YSBocmVmPVwiIiArIGRvYy5zaGFyZURvYyArICIjXHU2NzBEXHU1MkExXHU1NjY4XHU5NTE5XHU4QkVGLTUweFwiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTE8L2E+IDxhIGhyZWY9XCIiICsgZG9jMi5zaGFyZURvYyArICIjXHU2NzBEXHU1MkExXHU1NjY4XHU5NTE5XHU4QkVGLTUweFwiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTI8L2E+KSI7CiAgICAgICAgY2FzZSA5MDk6CiAgICAgICAgICAgIHJldHVybiAi6Lev5b6E5LiN5a2Y5ZyoL+S6keerr+aWh+S7tuW3suaNn+WdjyI7CiAgICAgICAgY2FzZSA5MDA6CiAgICAgICAgICAgIHJldHVybiAi6Lev5b6E5Li65paH5Lu25aS5LCDkuI3mlK/mjIHnlJ/miJDnp5LkvKAiOwogICAgICAgIGNhc2UgMzEwMzk6CiAgICAgICAgICAgIHJldHVybiAiXHU2NzBEXHU1MkExXHU1NjY4XHU5NTE5XHU4QkVGKFx1OEJGN1x1NzcwQlx1NjU4N1x1Njg2Mzo8YSBocmVmPVwiIiArIGRvYy5zaGFyZURvYyArICIjXHU2NzBEXHU1MkExXHU1NjY4XHU5NTE5XHU4QkVGLTMxMDM5XCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MTwvYT4gPGEgaHJlZj1cIiIgKyBkb2MyLnNoYXJlRG9jICsgIiNcdTY3MERcdTUyQTFcdTU2NjhcdTk1MTlcdThCRUYtMzEwMzlcIiAiICsgbGlua1N0eWxlICsgIj5cdThGN0RcdTcwQjkyPC9hPikiOwogICAgICAgIGNhc2UgMTEwOgogICAgICAgICAgICByZXR1cm4gIuivt+WFiOeZu+W9leeZvuW6pui0puWPtyI7CiAgICAgICAgY2FzZSA5MDEzOgogICAgICAgICAgICByZXR1cm4gIui0puWPt+iiq+mZkOWItiwg5bCd6K+VIOabtOaNoui0puWPtyDmiJYg562J5b6F5LiA5q615pe26Ze05YaN6YeN6K+VIjsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gIlx1NjcyQVx1NzdFNVx1OTUxOVx1OEJFRihcdThCRjdcdTc3MEJcdTY1ODdcdTY4NjM6PGEgaHJlZj1cIiIgKyBkb2Muc2hhcmVEb2MgKyAiI1x1NjcyQVx1NzdFNVx1OTUxOVx1OEJFRlwiICIgKyBsaW5rU3R5bGUgKyAiPlx1OEY3RFx1NzBCOTE8L2E+IDxhIGhyZWY9XCIiICsgZG9jMi5zaGFyZURvYyArICIjXHU2NzJBXHU3N0U1XHU5NTE5XHU4QkVGXCIgIiArIGxpbmtTdHlsZSArICI+XHU4RjdEXHU3MEI5MjwvYT4pIjsKICAgIH0KfSAvLyDoh6rlrprkuYnnmb7luqZhcGnov5Tlm55lcnJub+eahOaKpemUmQoKOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2NvbW1vbi91dGlscy50c3gKLyoKICogQEF1dGhvcjogbWVuZ3pvbmVmaXJlCiAqIEBEYXRlOiAyMDIxLTA4LTIyIDA0OjAxOjExCiAqIEBMYXN0RWRpdFRpbWU6IDIwMjMtMDItMTEgMDA6NDc6MjkKICogQExhc3RFZGl0b3JzOiBtZW5nem9uZWZpcmUKICogQERlc2NyaXB0aW9uOiDlrZjmlL7lt6Xlhbflh73mlbAKICovCnZhciB1dGlsc19hd2FpdGVyID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7CiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0KICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH0KICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7CiAgICB9KTsKfTsKdmFyIHV0aWxzX2dlbmVyYXRvciA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkgewogICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZzsKICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCAidGhyb3ciOiB2ZXJiKDEpLCAicmV0dXJuIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnOwogICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9CiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7CiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTsKICAgICAgICB3aGlsZSAoXykgdHJ5IHsKICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVsicmV0dXJuIl0gOiBvcFswXSA/IHlbInRocm93Il0gfHwgKCh0ID0geVsicmV0dXJuIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0OwogICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07CiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTsKICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTsKICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7CiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfQogICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9OwogICAgfQp9OwoKCgovKioKICogQGRlc2NyaXB0aW9uOiDlvLnlh7rkuIDkuKrmlofmnKzmj5DnpLrmoYYKICogQHBhcmFtIHtzdHJpbmd9IHRleHQKICovCmZ1bmN0aW9uIHNob3dBbGVydCh0ZXh0KSB7CiAgICBhbGVydChUQUcgKyAiOlxuIiArIHRleHQpOwp9Ci8qKgogKiBAZGVzY3JpcHRpb246IOino+aekOaWh+S7tuS/oeaBrywg6L+U5Zue6L2s5a2Y57uT5p6c5YiX6KGoaHRtbCwg56eS5Lyg6ZO+5o6lLCDlpLHotKXmlofku7bkuKrmlbAsIOaIkOWKn+eahOaWh+S7tuS/oeaBr+WIl+ihqCwg5aSx6LSl55qE5paH5Lu25L+h5oGv5YiX6KGoCiAqIEBwYXJhbSB7QXJyYXl9IGZpbGVJbmZvTGlzdCDmlofku7bkv6Hmga/mlbDmja7liJfooagKICovCmZ1bmN0aW9uIHBhcnNlZmlsZUluZm8oZmlsZUluZm9MaXN0KSB7CiAgICB2YXIgYmRjb2RlID0gIiI7CiAgICB2YXIgc3VjY2Vzc0luZm8gPSAiIjsKICAgIHZhciBmYWlsZWRJbmZvID0gIiI7CiAgICB2YXIgc3VjY2Vzc0xpc3QgPSBbXTsKICAgIHZhciBmYWlsTGlzdCA9IFtdOwogICAgdmFyIGZhaWxDb2RlRGljID0ge307CiAgICBmaWxlSW5mb0xpc3QuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgIGl0ZW0ucGF0aCA9IGl0ZW0ucGF0aC5yZXBsYWNlKHN5bmNQYXRoUHJlZml4LCAiIik7IC8vIOenu+mZpOWQjOatpemhteWJjee8gAogICAgICAgIC8vIOaIkOWKn+aWh+S7tgogICAgICAgIGlmICgwID09PSBpdGVtLmVycm5vIHx8IHVuZGVmaW5lZCA9PT0gaXRlbS5lcnJubykgewogICAgICAgICAgICBzdWNjZXNzSW5mbyArPSAiPHA+IiArIGl0ZW0ucGF0aCArICI8L3A+IjsKICAgICAgICAgICAgYmRjb2RlICs9ICIiICsgaXRlbS5tZDUgKyAoaXRlbS5tZDVzICYmICIjIiArIGl0ZW0ubWQ1cykgKyAiIyIgKyBpdGVtLnNpemUgKyAiIyIgKyBpdGVtLnBhdGggKyAiXG4iOwogICAgICAgICAgICBzdWNjZXNzTGlzdC5wdXNoKGl0ZW0pOwogICAgICAgIH0KICAgICAgICAvLyDlpLHotKXmlofku7YKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZmFpbExpc3QucHVzaChpdGVtKTsKICAgICAgICAgICAgaWYgKFN0cmluZyhpdGVtLmVycm5vKSBpbiBmYWlsQ29kZURpYykKICAgICAgICAgICAgICAgIGZhaWxDb2RlRGljW1N0cmluZyhpdGVtLmVycm5vKV0ucHVzaChpdGVtKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZmFpbENvZGVEaWNbU3RyaW5nKGl0ZW0uZXJybm8pXSA9IFtpdGVtXTsKICAgICAgICB9CiAgICB9KTsKICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGZhaWxDb2RlKSB7CiAgICAgICAgdmFyIGZhaWxCcmFuY2hJbmZvID0gIiI7CiAgICAgICAgdmFyIGZhaWxCcmFuY2hMaXN0ID0gZmFpbENvZGVEaWNbZmFpbENvZGVdOwogICAgICAgIGZhaWxCcmFuY2hMaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgZmFpbEJyYW5jaEluZm8gKz0gIjxwPiIgKyBpdGVtLnBhdGggKyAiPC9wPiI7CiAgICAgICAgfSk7CiAgICAgICAgZmFpbGVkSW5mbyArPSAiPGRldGFpbHMgY2xhc3M9XCJtemZfZGV0YWlscyBtemZfZGV0YWlsc19icmFuY2hcIj48c3VtbWFyeT48c3ZnIGNsYXNzPVwibXpmX2Fycm93XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjdcIj48cG9seWxpbmUgcG9pbnRzPVwiMCwwIDgsNyAxNiwwXCIvPjwvc3ZnPjxiPiIgKyBiYWlkdUVycm5vKE51bWJlcihmYWlsQ29kZSkpICsgIigjIiArIE51bWJlcihmYWlsQ29kZSkgKyAiKTo8L2I+IiArIGNvcHlGYWlsQnJhbmNoTGlzdCArICI8L3N1bW1hcnk+PC9kZXRhaWxzPjxkaXYgY2xhc3M9XCJtemZfY29udGVudFwiPiIgKyBmYWlsQnJhbmNoSW5mbyArICI8L2Rpdj4iOwogICAgfTsKICAgIGZvciAodmFyIGZhaWxDb2RlIGluIGZhaWxDb2RlRGljKSB7CiAgICAgICAgX2xvb3BfMShmYWlsQ29kZSk7CiAgICB9CiAgICBpZiAoZmFpbGVkSW5mbykKICAgICAgICBmYWlsZWRJbmZvID0gIjxkZXRhaWxzIGNsYXNzPVwibXpmX2RldGFpbHNcIj48c3VtbWFyeT48c3ZnIGNsYXNzPVwibXpmX2Fycm93XCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjdcIj48cG9seWxpbmUgcG9pbnRzPVwiMCwwIDgsNyAxNiwwXCIvPjwvc3ZnPjxiPlx1NTkzMVx1OEQyNVx1NjU4N1x1NEVGNlx1NTIxN1x1ODg2OChcdTcwQjlcdTUxRkJcdTVDNTVcdTVGMDApOjwvYj4iICsgY29weUZhaWxMaXN0ICsgIjwvc3VtbWFyeT48L2RldGFpbHM+PGRpdiBjbGFzcz1cIm16Zl9jb250ZW50XCI+IiArIGZhaWxlZEluZm8gKyAiPC9kaXY+IjsKICAgIGlmIChzdWNjZXNzSW5mbykKICAgICAgICBzdWNjZXNzSW5mbyA9ICI8ZGV0YWlscyBjbGFzcz1cIm16Zl9kZXRhaWxzXCI+PHN1bW1hcnk+PHN2ZyBjbGFzcz1cIm16Zl9hcnJvd1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCI3XCI+PHBvbHlsaW5lIHBvaW50cz1cIjAsMCA4LDcgMTYsMFwiLz48L3N2Zz48Yj5cdTYyMTBcdTUyOUZcdTY1ODdcdTRFRjZcdTUyMTdcdTg4NjgoXHU3MEI5XHU1MUZCXHU1QzU1XHU1RjAwKTo8L2I+IiArIGNvcHlTdWNjZXNzTGlzdCArICI8L3N1bW1hcnk+PC9kZXRhaWxzPjxkaXYgY2xhc3M9XCJtemZfY29udGVudFwiPiIgKyBzdWNjZXNzSW5mbyArICI8L2Rpdj4iOwogICAgYmRjb2RlID0gYmRjb2RlLnRyaW0oKTsKICAgIHJldHVybiB7CiAgICAgICAgaHRtbEluZm86IHN1Y2Nlc3NJbmZvICYmIGZhaWxlZEluZm8KICAgICAgICAgICAgPyBzdWNjZXNzSW5mbyArICI8cD48YnIgLz48L3A+IiArIGZhaWxlZEluZm8KICAgICAgICAgICAgOiBzdWNjZXNzSW5mbyArIGZhaWxlZEluZm8sCiAgICAgICAgYmRjb2RlOiBiZGNvZGUsCiAgICAgICAgc3VjY2Vzc0xpc3Q6IHN1Y2Nlc3NMaXN0LAogICAgICAgIGZhaWxMaXN0OiBmYWlsTGlzdCwKICAgIH07Cn0KLyoqCiAqIEBkZXNjcmlwdGlvbjog6I635Y+W5YiG5Lqr6aG155qE5paH5Lu25YiX6KGoCiAqLwpmdW5jdGlvbiBnZXRTaGFyZUZpbGVMaXN0KCkgewogICAgdmFyIGJkTGlzdEluc3RhbmNlID0gdW5zYWZlV2luZG93LnJlcXVpcmUoInN5c3RlbS1jb3JlOmNvbnRleHQvY29udGV4dC5qcyIpCiAgICAgICAgLmluc3RhbmNlRm9yU3lzdGVtLmxpc3Q7CiAgICB2YXIgc2VsZWN0TGlzdCA9IGJkTGlzdEluc3RhbmNlLmdldFNlbGVjdGVkKCk7CiAgICBpZiAoIXNlbGVjdExpc3QubGVuZ3RoKQogICAgICAgIHNlbGVjdExpc3QgPSBiZExpc3RJbnN0YW5jZS5nZXRDdXJyZW50TGlzdCgpOwogICAgcmV0dXJuIHNlbGVjdExpc3Q7Cn0KLyoqCiAqIEBkZXNjcmlwdGlvbjog6I635Y+W6YCJ5oup55qE5paH5Lu25YiX6KGoKOaXp+eJiOeVjOmdoikKICovCmZ1bmN0aW9uIGdldFNlbGVjdGVkRmlsZUxpc3RMZWdhY3koKSB7CiAgICByZXR1cm4gdW5zYWZlV2luZG93CiAgICAgICAgLnJlcXVpcmUoInN5c3RlbS1jb3JlOmNvbnRleHQvY29udGV4dC5qcyIpCiAgICAgICAgLmluc3RhbmNlRm9yU3lzdGVtLmxpc3QuZ2V0U2VsZWN0ZWQoKTsKfQovKioKICogQGRlc2NyaXB0aW9uOiDojrflj5bpgInmi6nnmoTmlofku7bliJfooago5paw54mI55WM6Z2iKQogKiDmiJHku47ov5nph4zmioTnmoQsIOiwouiwouS9oDogaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQzNjQ0NgogKi8KZnVuY3Rpb24gZ2V0U2VsZWN0ZWRGaWxlTGlzdE5ldygpIHsKICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubmQtbWFpbi1saXN0LCAubmQtbmV3LW1haW4tbGlzdCIpLl9fdnVlX18KICAgICAgICAuc2VsZWN0ZWRMaXN0Owp9Ci8qKgogKiBAZGVzY3JpcHRpb246IOWwhmRhdGHplK7lgLzlr7novazmjaLkuLpxdWVyeeWtl+espuS4sgogKiBAcGFyYW0ge2FueX0gZGF0YQogKiBAcmV0dXJuIHtzdHJpbmd9IHF1ZXJ5CiAqLwpmdW5jdGlvbiBjb252ZXJ0RGF0YShkYXRhKSB7CiAgICB2YXIgcXVlcnkgPSAiIjsKICAgIGZvciAodmFyIGtleSBpbiBkYXRhKQogICAgICAgIHF1ZXJ5ICs9ICImIiArIGtleSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudChkYXRhW2tleV0pOwogICAgcmV0dXJuIHF1ZXJ5Owp9Ci8qKgogKiBAZGVzY3JpcHRpb246IOS7juWJqui0tOadv+iOt+WPluWtl+espuS4suaVsOaNrgogKiBAcmV0dXJuIHtzdHJpbmd9IGJkbGluawogKi8KZnVuY3Rpb24gcGFyc2VDbGlwYm9hcmQoKSB7CiAgICByZXR1cm4gdXRpbHNfYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBiZGxpbmssIGVycm9yXzE7CiAgICAgICAgcmV0dXJuIHV0aWxzX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHsKICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkgewogICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgIF9hLnRyeXMucHVzaChbMCwgMiwgLCAzXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpXTsKICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICBiZGxpbmsgPSBfYS5zZW50KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFEdVBhcnNlci5wYXJzZShiZGxpbmspLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sICIiXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgYmRsaW5rXTsKICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICBlcnJvcl8xID0gX2Euc2VudCgpOwogICAgICAgICAgICAgICAgICAgIHNob3dBbGVydChhcHBFcnJvci5DbGlwYm9hcmRQcmVtaXNzaW9uRXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgIiJdOwogICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzIgLypyZXR1cm4qL107CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0pOwp9Ci8qKgogKiBAZGVzY3JpcHRpb246IOino+WvhuW3suWKoOWvhueahG1kNQogKiBAcGFyYW0ge3N0cmluZ30gbWQ1ICjliqDlr4YpCiAqIEByZXR1cm4ge3N0cmluZ30gbWQ1ICjop6Plr4YpCiAqLwpmdW5jdGlvbiBkZWNyeXB0TWQ1KG1kNSkgewogICAgaWYgKCEoKHBhcnNlSW50KG1kNVs5XSkgPj0gMCAmJiBwYXJzZUludChtZDVbOV0pIDw9IDkpIHx8CiAgICAgICAgKG1kNVs5XSA+PSAiYSIgJiYgbWQ1WzldIDw9ICJmIikpKQogICAgICAgIHJldHVybiBkZWNyeXB0KG1kNSk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIG1kNTsKICAgIGZ1bmN0aW9uIGRlY3J5cHQoZW5jcnlwdE1kNSkgewogICAgICAgIHZhciBrZXkgPSAoZW5jcnlwdE1kNVs5XS5jaGFyQ29kZUF0KDApIC0gImciLmNoYXJDb2RlQXQoMCkpLnRvU3RyaW5nKDE2KTsKICAgICAgICB2YXIga2V5MiA9IGVuY3J5cHRNZDUuc2xpY2UoMCwgOSkgKyBrZXkgKyBlbmNyeXB0TWQ1LnNsaWNlKDEwKTsKICAgICAgICB2YXIga2V5MyA9ICIiOwogICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwga2V5Mi5sZW5ndGg7IGErKykKICAgICAgICAgICAga2V5MyArPSAocGFyc2VJbnQoa2V5MlthXSwgMTYpIF4gKDE1ICYgYSkpLnRvU3RyaW5nKDE2KTsKICAgICAgICB2YXIgbWQ1ID0ga2V5My5zbGljZSg4LCAxNikgKwogICAgICAgICAgICBrZXkzLnNsaWNlKDAsIDgpICsKICAgICAgICAgICAga2V5My5zbGljZSgyNCwgMzIpICsKICAgICAgICAgICAga2V5My5zbGljZSgxNiwgMjQpOwogICAgICAgIHJldHVybiBtZDU7CiAgICB9Cn0KLyoqCiAqIEBkZXNjcmlwdGlvbjog55So5LqO6Kej5YazIzMxMDM55oql6ZSZCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIOWOn+aWh+S7tui3r+W+hAogKiBAcmV0dXJuIHtzdHJpbmd9IOS/ruaUueaWh+S7tuWQjue8gOeahOi3r+W+hAogKi8KZnVuY3Rpb24gc3VmZml4Q2hhbmdlKHBhdGgpIHsKICAgIHZhciBzdWZmaXggPSBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8g6I635Y+W5ZCO57yACiAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSArIHJldmVyc2VTdHIoc3VmZml4KTsKfQovKioKICogQGRlc2NyaXB0aW9uOiDpgIbovazlrZfnrKbkuLLlpKflsI/lhpkKICogQHBhcmFtIHtzdHJpbmd9IHN0ciDovpPlhaXlrZfnrKbkuLIKICogQHJldHVybiB7c3RyaW5nfSDlpITnkIblkI7nmoTlrZfnrKbkuLIKICovCmZ1bmN0aW9uIHJldmVyc2VTdHIoc3RyKSB7CiAgICB2YXIgbmV3U3RyID0gIiI7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciByZXZlcnNlQ2hhciA9IHZvaWQgMDsKICAgICAgICBpZiAoc3RyLmNoYXJBdChpKSA+PSAiYSIpCiAgICAgICAgICAgIHJldmVyc2VDaGFyID0gc3RyLmNoYXJBdChpKS50b1VwcGVyQ2FzZSgpOwogICAgICAgIGVsc2UgaWYgKHN0ci5jaGFyQXQoaSkgPj0gIkEiKQogICAgICAgICAgICByZXZlcnNlQ2hhciA9IHN0ci5jaGFyQXQoaSkudG9Mb3dlckNhc2UoKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldmVyc2VDaGFyID0gc3RyLmNoYXJBdChpKTsKICAgICAgICBuZXdTdHIgKz0gcmV2ZXJzZUNoYXI7CiAgICB9CiAgICByZXR1cm4gbmV3U3RyOwp9Ci8vIOS4i+aWueWbm+S4qmZ1bmN0aW9u55So5LqO5YiG5Lqr6aG155Sf5oiQ56eS5LygCi8vIOS+neaXp+aYr+S7jui/memHjOaKhOeahDogaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy96aC1DTi9zY3JpcHRzLzQzNjQ0NgpmdW5jdGlvbiBnZXRDb29raWUobmFtZSkgewogICAgdmFyIGFyciA9IGRvY3VtZW50LmNvb2tpZS5yZXBsYWNlKC9ccy9nLCAiIikuc3BsaXQoIjsiKTsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJyLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgIHZhciB0ZW1wQXJyID0gYXJyW2ldLnNwbGl0KCI9Iik7CiAgICAgICAgaWYgKHRlbXBBcnJbMF0gPT09IG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0ZW1wQXJyWzFdKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gIiI7Cn0KZnVuY3Rpb24gZ2V0TG9naWQoKSB7CiAgICB2YXIgdXQgPSB1bnNhZmVXaW5kb3cucmVxdWlyZSgic3lzdGVtLWNvcmU6Y29udGV4dC9jb250ZXh0LmpzIikKICAgICAgICAuaW5zdGFuY2VGb3JTeXN0ZW0udG9vbHMuYmFzZVNlcnZpY2U7CiAgICByZXR1cm4gdXQuYmFzZTY0RW5jb2RlKGdldENvb2tpZSgiQkFJRFVJRCIpKTsKfQpmdW5jdGlvbiBnZXRTdXJsKCkgewogICAgdmFyIHJlZyA9IC8oc1wvfHN1cmw9KShbYS16QS1aMC05Xy1dKykvOwogICAgaWYgKHJlZy50ZXN0KGxvY2F0aW9uLmhyZWYpKSB7CiAgICAgICAgcmV0dXJuIGxvY2F0aW9uLmhyZWYubWF0Y2gocmVnKVsyXTsKICAgIH0KICAgIHJldHVybiAiIjsKfQpmdW5jdGlvbiBnZXRFeHRyYSgpIHsKICAgIHZhciBzZUtleSA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRDb29raWUoIkJEQ0xORCIpKTsKICAgIHJldHVybiAieyIgKyAnInNla2V5IjoiJyArIHNlS2V5ICsgJyInICsgIn0iOwp9Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYmFpZHUvbmV3UGFnZS9sb2FkZXIudHN4Ci8qCiAqIEBBdXRob3I6IG1lbmd6b25lZmlyZQogKiBARGF0ZTogMjAyMi0xMC0yMCAxMDozNjo0MwogKiBATGFzdEVkaXRUaW1lOiAyMDIzLTAyLTE0IDAzOjUzOjAyCiAqIEBMYXN0RWRpdG9yczogbWVuZ3pvbmVmaXJlCiAqIEBEZXNjcmlwdGlvbjog5paw54mI5bqm55uY55WM6Z2ibG9hZGVy5YWl5Y+jOiBodHRwczovL3Bhbi5iYWlkdS5jb20vZGlzay9tYWluCiAqLwoKCgp2YXIgaHRtbFRhZ05ldyA9ICJkaXYubmQtZmlsZS1saXN0LXRvb2xiYXJfX2FjdGlvbnMiOyAvLyDmlrDniYjnlYzpnaLnp5LkvKDmjInpkq7nmoRodG1s54i25a+56LGhCnZhciBodG1sVGFnTmV3MiA9ICJkaXYud3Atcy1hZ2lsZS10b29sLWJhcl9faGVhZGVyIjsgLy8gMjIuNS4yNDog5paw54mI55WM6Z2i5paw5aKe55qE5LiA5Liq54i25a+56LGhCnZhciBodG1sQnRuUmFwaWROZXcgPSAvLyDmlrDniYjnlYzpnaLnp5LkvKDmjInpkq7nmoRodG1s5YWD57SgCiAnPGJ1dHRvbiBpZD0iYmRsaW5rX2J0biIgY2xhc3M9Im16Zl9uZXdfYnRuIj48L2k+PHNwYW4+56eS5LygPC9zcGFuPjwvYnV0dG9uPic7CnZhciBodG1sQnRuR2VuTmV3ID0gLy8g5paw54mI55WM6Z2i56eS5Lyg55Sf5oiQ5oyJ6ZKu55qEaHRtbOWFg+e0oAogJzxidXR0b24gaWQ9Imdlbl9iZGxpbmtfYnRuIiBjbGFzcz0ibXpmX25ld19idG4iPjwvaT48c3Bhbj7nlJ/miJDnp5LkvKA8L3NwYW4+PC9idXR0b24+JzsKZnVuY3Rpb24gaW5zdGFsbE5ldygpIHsKICAgIGNvbnNvbGUuaW5mbygiJXMgdmVyc2lvbjogJXMgRE9N5pa55byP5a6J6KOFIiwgVEFHLCB2ZXJzaW9uKTsKICAgIHN3YWxJbnN0YW5jZS5zd2FsR2xvYmFsQXJncyA9IHsKICAgICAgICBoZWlnaHRBdXRvOiBmYWxzZSwKICAgICAgICBzY3JvbGxiYXJQYWRkaW5nOiBmYWxzZSwKICAgIH07IC8vIOa3u+WKoHN3YWzlj4LmlbDku6XpmLLmraLmlrDniYjnlYzpnaLkuIvnmoRib2R55qC35byP56qB5Y+YCiAgICBzZXRSZWZyZXNoTGlzdChmdW5jdGlvbiAoKSB7CiAgICAgICAgZG9jdW1lbnQKICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoIi5uZC1tYWluLWxpc3QsIC5uZC1uZXctbWFpbi1saXN0IikKICAgICAgICAgICAgLl9fdnVlX18ucmVsb2FkTGlzdCgpOwogICAgfSk7CiAgICBzZXRHZXRTZWxlY3RlZEZpbGVMaXN0KGdldFNlbGVjdGVkRmlsZUxpc3ROZXcpOwogICAgc2V0R2V0QmRzdG9rZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubmQtbWFpbi1saXN0LCAubmQtbmV3LW1haW4tbGlzdCIpLl9fdnVlX18ueXVuRGF0YQogICAgICAgICAgICAuYmRzdG9rZW47CiAgICB9KTsKICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjYmRsaW5rX2J0biIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzd2FsSW5zdGFuY2UuaW5wdXRWaWV3KCk7CiAgICB9KTsgLy8g57uR5a6a6L2s5a2Y56eS5Lyg5oyJ6ZKu5LqL5Lu2CiAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiI2dlbl9iZGxpbmtfYnRuIiwgZnVuY3Rpb24gKCkgewogICAgICAgIHN3YWxJbnN0YW5jZS5nZW5lcmF0ZWJkbGlua1Rhc2sucmVzZXQoKTsKICAgICAgICBzd2FsSW5zdGFuY2UuY2hlY2tVbmZpbmlzaCgpOwogICAgfSk7IC8vIOe7keWumueUn+aIkOenkuS8oOaMiemSruS6i+S7tgogICAgYWRkQnRuKCk7Cn0KZnVuY3Rpb24gYWRkQnRuKCkgewogICAgLy8g6L2u6K+i5re75Yqg5oyJ6ZKuLCDpmLLmraLmlrDniYjpobXpnaLph43lpI1pbml05pe2LCDlsIbmjInpkq7opobnm5YKICAgIHZhciB0YXJnZXQgPSAkKGh0bWxUYWdOZXcpOwogICAgaWYgKCF0YXJnZXQubGVuZ3RoKQogICAgICAgIHRhcmdldCA9ICQoaHRtbFRhZ05ldzIpOwogICAgaWYgKHRhcmdldC5sZW5ndGggJiYgISQoIiNiZGxpbmtfYnRuIikubGVuZ3RoKQogICAgICAgIHRhcmdldC5hcHBlbmQoaHRtbEJ0blJhcGlkTmV3LCBodG1sQnRuR2VuTmV3KTsKICAgIHNldFRpbWVvdXQoYWRkQnRuLCA1MDApOwp9Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYmFpZHUvbGVnYWN5UGFnZS9sb2FkZXIudHN4Ci8qCiAqIEBBdXRob3I6IG1lbmd6b25lZmlyZQogKiBARGF0ZTogMjAyMi0xMC0yMCAxMDozNjo0MwogKiBATGFzdEVkaXRUaW1lOiAyMDIyLTEyLTI0IDEwOjU3OjIzCiAqIEBMYXN0RWRpdG9yczogbWVuZ3pvbmVmaXJlCiAqIEBEZXNjcmlwdGlvbjog5pen54mI5bqm55uY55WM6Z2ibG9hZGVy5YWl5Y+jOiBodHRwczovL3Bhbi5iYWlkdS5jb20vZGlzay9ob21lP3N0YXlBdEhvbWU9dHJ1ZQogKi8KCgoKdmFyIGh0bWxUYWdMZWdhY3kgPSAiZGl2LnRjdUxBdSI7IC8vIOaXp+eJiOeVjOmdouenkuS8oOaMiemSrueahGh0bWzniLblr7nosaEKdmFyIGh0bWxCdG5SYXBpZExlZ2FjeSA9IC8vIOaXp+eJiOeVjOmdouenkuS8oOaMiemSrueahGh0bWzlhYPntKAKICc8YSBjbGFzcz0iZy1idXR0b24gZy1idXR0b24tYmx1ZSIgaWQ9ImJkbGlua19idG4iIHRpdGxlPSLnp5LkvKDpk77mjqUiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IiI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1kaXNrIiB0aXRsZT0i56eS5Lyg6ZO+5o6l5o+Q5Y+WIj48L2VtPjxzcGFuIGNsYXNzPSJ0ZXh0IiBzdHlsZT0id2lkdGg6IGF1dG87Ij7np5LkvKDpk77mjqU8L3NwYW4+PC9zcGFuPjwvYT4nOwp2YXIgaHRtbEJ0bkdlbkxlZ2FjeSA9IC8vIOaXp+eJiOeVjOmdouenkuS8oOeUn+aIkOaMiemSrueahGh0bWzlhYPntKAKICc8YSBjbGFzcz0iZy1idXR0b24iIGlkPSJnZW5fYmRsaW5rX2J0biI+PHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij48ZW0gY2xhc3M9Imljb24gaWNvbi1zaGFyZSI+PC9lbT48c3BhbiBjbGFzcz0idGV4dCIgc3R5bGU9IndpZHRoOiBhdXRvOyI+55Sf5oiQ56eS5LygPC9zcGFuPjwvc3Bhbj48L2E+JzsKZnVuY3Rpb24gaW5zdGFsbExlZ2FjeSgpIHsKICAgIGNvbnNvbGUuaW5mbygiJXMgdmVyc2lvbjogJXMgRE9N5pa55byP5a6J6KOFIiwgVEFHLCB2ZXJzaW9uKTsKICAgIHNldFJlZnJlc2hMaXN0KGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyDml6fniYjnlYzpnaIsIOiwg+eUqOWOn+eUn+aWueazleWIt+aWsOaWh+S7tuWIl+ihqCwg5peg6ZyA6YeN5paw5Yqg6L296aG16Z2iCiAgICAgICAgdW5zYWZlV2luZG93CiAgICAgICAgICAgIC5yZXF1aXJlKCJzeXN0ZW0tY29yZTpzeXN0ZW0vYmFzZVNlcnZpY2UvbWVzc2FnZS9tZXNzYWdlLmpzIikKICAgICAgICAgICAgLnRyaWdnZXIoInN5c3RlbS1yZWZyZXNoIik7CiAgICB9KTsKICAgIHNldEdldFNlbGVjdGVkRmlsZUxpc3QoZ2V0U2VsZWN0ZWRGaWxlTGlzdExlZ2FjeSk7CiAgICBzZXRHZXRCZHN0b2tlbihmdW5jdGlvbiAoKSB7IHJldHVybiB1bnNhZmVXaW5kb3cubG9jYWxzLmdldCgiYmRzdG9rZW4iKTsgfSk7CiAgICBsb2FkZXJfYWRkQnRuKCk7IC8vIERPTea3u+WKoOenkuS8oOaMiemSrgogICAgYWRkR2VuQnRuKCk7IC8vIERPTea3u+WKoOeUn+aIkOaMiemSrgogICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIiNiZGxpbmtfYnRuIiwgZnVuY3Rpb24gKCkgewogICAgICAgIHN3YWxJbnN0YW5jZS5pbnB1dFZpZXcoKTsKICAgIH0pOyAvLyDnu5Hlrprnp5LkvKDmjInpkq7kuovku7YKICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjZ2VuX2JkbGlua19idG4iLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgc3dhbEluc3RhbmNlLmdlbmVyYXRlYmRsaW5rVGFzay5yZXNldCgpOwogICAgICAgIHN3YWxJbnN0YW5jZS5jaGVja1VuZmluaXNoKCk7CiAgICB9KTsgLy8g57uR5a6a55Sf5oiQ5oyJ6ZKu5LqL5Lu2Cn0KZnVuY3Rpb24gZ2V0U3lzdGVtQ29udGV4dCgpIHsKICAgIHJldHVybiB1bnNhZmVXaW5kb3cucmVxdWlyZSgic3lzdGVtLWNvcmU6Y29udGV4dC9jb250ZXh0LmpzIikKICAgICAgICAuaW5zdGFuY2VGb3JTeXN0ZW07Cn0KZnVuY3Rpb24gYWRkR2VuQnRuKCkgewogICAgdmFyIGxpc3RUb29scyA9IGdldFN5c3RlbUNvbnRleHQoKS5Ccm9rZXIuZ2V0QnV0dG9uQnJva2VyKCJsaXN0VG9vbHMiKTsKICAgIGlmIChsaXN0VG9vbHMgJiYgbGlzdFRvb2xzLiRib3gpCiAgICAgICAgJChsaXN0VG9vbHMuJGJveCkuY2hpbGRyZW4oImRpdiIpLmFmdGVyKGh0bWxCdG5HZW5MZWdhY3kpOwogICAgZWxzZQogICAgICAgIHNldFRpbWVvdXQoYWRkR2VuQnRuLCAzMDApOwp9CmZ1bmN0aW9uIGxvYWRlcl9hZGRCdG4oKSB7CiAgICBpZiAoJChodG1sVGFnTGVnYWN5KS5sZW5ndGgpCiAgICAgICAgJChodG1sVGFnTGVnYWN5KS5hcHBlbmQoaHRtbEJ0blJhcGlkTGVnYWN5KTsKICAgIGVsc2UKICAgICAgICBzZXRUaW1lb3V0KGxvYWRlcl9hZGRCdG4sIDEwMCk7Cn0KCjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9iYWlkdS9zeW5jUGFnZS9sb2FkZXIudHN4Ci8qCiAqIEBBdXRob3I6IG1lbmd6b25lZmlyZQogKiBARGF0ZTogMjAyMi0xMi0xMiAxMDo1ODo1OQogKiBATGFzdEVkaXRUaW1lOiAyMDIyLTEyLTI0IDEwOjU3OjEyCiAqIEBMYXN0RWRpdG9yczogbWVuZ3pvbmVmaXJlCiAqIEBEZXNjcmlwdGlvbjog5ZCM5q2l56m66Ze0bG9hZGVy5YWl5Y+jOiBodHRwczovL3Bhbi5iYWlkdS5jb20vZGlzay9zeW5jaHJvbml6YXRpb24jCiAqLwoKCgp2YXIgbG9hZGVyX2h0bWxUYWdOZXcgPSAiZGl2Lm5kLWJ0bi1ncm91cCA+IHNwYW4iOwp2YXIgbG9hZGVyX2h0bWxCdG5SYXBpZE5ldyA9ICc8YnV0dG9uIGlkPSJiZGxpbmtfYnRuIiB0eXBlPSJidXR0b24iIGNsYXNzPSJ1LWJ1dHRvbiBpcy1yb3VuZCBpcy1oYXMtaWNvbiIgc3R5bGU9ImJhY2tncm91bmQ6ICMwNmE3ZmY7Y29sb3I6ICNmZmY7Ij48c3Bhbj48aSBjbGFzcz0iaWNvbmZvbnQgaWNvbi1jb3B5Ij48L2k+PHNwYW4gY2xhc3M9IiBuZC1maWxlLWxpc3QtdG9vbGJhci1hY3Rpb24taXRlbS10ZXh0Ij7np5LkvKA8L3NwYW4+PC9zcGFuPjwvYnV0dG9uPic7Ci8vIGNvbnN0IGh0bWxCdG5HZW5OZXcgPQovLyAgICc8YnV0dG9uIGlkPSJnZW5fYmRsaW5rX2J0biIgdHlwZT0iYnV0dG9uIiBjbGFzcz0idS1idXR0b24gaXMtcm91bmQgaXMtaGFzLWljb24iIHN0eWxlPSJtYXJnaW4tbGVmdDogOHB4O2JhY2tncm91bmQ6ICMwNmE3ZmY7Y29sb3I6ICNmZmY7Ij48c3Bhbj48aSBjbGFzcz0iaWNvbmZvbnQgaWNvbi1jb3B5Ij48L2k+PHNwYW4gY2xhc3M9IiBuZC1maWxlLWxpc3QtdG9vbGJhci1hY3Rpb24taXRlbS10ZXh0Ij7nlJ/miJDnp5LkvKA8L3NwYW4+PC9zcGFuPjwvYnV0dG9uPic7CmZ1bmN0aW9uIGluc3RhbGxTeW5jKCkgewogICAgY29uc29sZS5pbmZvKCIlcyB2ZXJzaW9uOiAlcyBET03mlrnlvI/lronoo4UiLCBUQUcsIHZlcnNpb24pOwogICAgc3dhbEluc3RhbmNlLnN3YWxHbG9iYWxBcmdzID0gewogICAgICAgIGhlaWdodEF1dG86IGZhbHNlLAogICAgICAgIHNjcm9sbGJhclBhZGRpbmc6IGZhbHNlLAogICAgfTsKICAgIHNldFJlZnJlc2hMaXN0KGZ1bmN0aW9uICgpIHsKICAgICAgICBkb2N1bWVudAogICAgICAgICAgICAucXVlcnlTZWxlY3RvcigiLm5kLW1haW4tbGlzdCwgLm5kLW5ldy1tYWluLWxpc3QiKQogICAgICAgICAgICAuX192dWVfXy5yZWxvYWRMaXN0KCk7CiAgICB9KTsKICAgIHNldEdldFNlbGVjdGVkRmlsZUxpc3QoZ2V0U2VsZWN0ZWRGaWxlTGlzdE5ldyk7CiAgICBzZXRHZXRCZHN0b2tlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5uZC1tYWluLWxpc3QsIC5uZC1uZXctbWFpbi1saXN0IikuX192dWVfXy55dW5EYXRhCiAgICAgICAgICAgIC5iZHN0b2tlbjsKICAgIH0pOwogICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIiNiZGxpbmtfYnRuIiwgZnVuY3Rpb24gKCkgewogICAgICAgIHN3YWxJbnN0YW5jZS5pbnB1dFZpZXcoKTsKICAgIH0pOyAvLyDnu5HlrprovazlrZjnp5LkvKDmjInpkq7kuovku7YKICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIjZ2VuX2JkbGlua19idG4iLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgc3dhbEluc3RhbmNlLmdlbmVyYXRlYmRsaW5rVGFzay5yZXNldCgpOwogICAgICAgIHN3YWxJbnN0YW5jZS5jaGVja1VuZmluaXNoKCk7CiAgICB9KTsgLy8g57uR5a6a55Sf5oiQ56eS5Lyg5oyJ6ZKu5LqL5Lu2CiAgICBzeW5jUGFnZV9sb2FkZXJfYWRkQnRuKCk7Cn0KZnVuY3Rpb24gc3luY1BhZ2VfbG9hZGVyX2FkZEJ0bigpIHsKICAgIC8vIOi9ruivoua3u+WKoOaMiemSriwg6Ziy5q2i5paw54mI6aG16Z2i6YeN5aSNaW5pdOaXtiwg5bCG5oyJ6ZKu6KaG55uWCiAgICB2YXIgdGFyZ2V0ID0gJChsb2FkZXJfaHRtbFRhZ05ldyk7CiAgICBpZiAodGFyZ2V0Lmxlbmd0aCAmJiAhJCgiI2JkbGlua19idG4iKS5sZW5ndGgpCiAgICAgICAgdGFyZ2V0LmFwcGVuZChsb2FkZXJfaHRtbEJ0blJhcGlkTmV3KTsKICAgIC8vIHRhcmdldC5hcHBlbmQoaHRtbEJ0blJhcGlkTmV3LCBodG1sQnRuR2VuTmV3KTsKICAgIC8vIOWQjOatpemhteS4reeahOaWh+S7tuS9v+eUqOWPpuS4gOenjeeahOaOpeWPo+iOt+WPlmRsaW5rLCDmlYXmmoLkuI3mt7vliqDnlJ/miJDlip/og70KICAgIHNldFRpbWVvdXQoc3luY1BhZ2VfbG9hZGVyX2FkZEJ0biwgNTAwKTsKfQoKOy8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vc3JjL2JhaWR1L3NoYXJlUGFnZS9sb2FkZXIudHN4Ci8qCiAqIEBBdXRob3I6IG1lbmd6b25lZmlyZQogKiBARGF0ZTogMjAyMi0xMi0xMiAxMDo1Nzo1OAogKiBATGFzdEVkaXRUaW1lOiAyMDIyLTEyLTI0IDEwOjU3OjE1CiAqIEBMYXN0RWRpdG9yczogbWVuZ3pvbmVmaXJlCiAqIEBEZXNjcmlwdGlvbjog5paH5Lu25YiG5Lqr6aG1bG9hZGVy5YWl5Y+jOiBodHRwczovL3Bhbi5iYWlkdS5jb20vcy94eHgKICovCgoKdmFyIGh0bWxCdG5HZW5TaGFyZSA9IC8vIOWIhuS6q+mhteeahOenkuS8oOeUn+aIkOaMiemSrmh0bWzlhYPntKAKICc8YSBpZD0iZ2VuX2JkbGlua19idG5fc2hhcmVQYWdlIiB0aXRsZT0i55Sf5oiQ56eS5LygIiBjbGFzcz0iZy1idXR0b24gZy1idXR0b24tYmx1ZS1sYXJnZSIgc3R5bGU9Im1hcmdpbi1yaWdodDogNXB4O21hcmdpbi1sZWZ0OiA1cHg7Ij4gPHNwYW4gY2xhc3M9ImctYnV0dG9uLXJpZ2h0Ij4gPGVtIGNsYXNzPSJpY29uIGljb24tc2hhcmUiIHN0eWxlPSJjb2xvcjojZmZmZmZmIiB0aXRsZT0i55Sf5oiQ56eS5LygIj48L2VtPiA8c3BhbiBjbGFzcz0idGV4dCIgc3R5bGU9IndpZHRoOiBhdXRvOyI+55Sf5oiQ56eS5LygPC9zcGFuPiA8L3NwYW4+IDwvYT4nOwp2YXIgaHRtbFRhZ1NhaHJlID0gIltub2RlLXR5cGU9cXJDb2RlXSI7CmZ1bmN0aW9uIGluc3RhbGxTaGFyZSgpIHsKICAgIGNvbnNvbGUuaW5mbygiJXMgdmVyc2lvbjogJXMgRE9N5pa55byP5a6J6KOFIiwgVEFHLCB2ZXJzaW9uKTsKICAgIHNldEdldEJkc3Rva2VuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuc2FmZVdpbmRvdy5sb2NhbHMuZ2V0KCJiZHN0b2tlbiIpOyB9KTsKICAgIHNoYXJlUGFnZV9sb2FkZXJfYWRkQnRuKCk7CiAgICAkKGRvY3VtZW50KS5vbigiY2xpY2siLCAiI2dlbl9iZGxpbmtfYnRuX3NoYXJlUGFnZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICBzd2FsSW5zdGFuY2UuZ2VuZXJhdGViZGxpbmtUYXNrLnJlc2V0KCk7CiAgICAgICAgc3dhbEluc3RhbmNlLmdlbmVyYXRlYmRsaW5rVGFzay5pc1NoYXJlUGFnZSA9IHRydWU7CiAgICAgICAgc3dhbEluc3RhbmNlLmdlbmVyYXRlYmRsaW5rVGFzay5pc0Zhc3QgPSB0cnVlOyAvLyDlvLrliLbkvb/nlKjmnoHpgJ/nlJ/miJAKICAgICAgICBzd2FsSW5zdGFuY2UuZ2VuRmlsZVdvcmsoZmFsc2UsIGZhbHNlKTsKICAgIH0pOyAvLyDnu5HlrprnlJ/miJDmjInpkq7kuovku7YKfQpmdW5jdGlvbiBzaGFyZVBhZ2VfbG9hZGVyX2FkZEJ0bigpIHsKICAgIGlmICgkKGh0bWxUYWdTYWhyZSkubGVuZ3RoKQogICAgICAgICQoaHRtbFRhZ1NhaHJlKS5iZWZvcmUoaHRtbEJ0bkdlblNoYXJlKTsKICAgIGVsc2UKICAgICAgICBzZXRUaW1lb3V0KHNoYXJlUGFnZV9sb2FkZXJfYWRkQnRuLCAxMDApOwp9Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvYmFpZHUvbG9hZGVyLnRzeAovKgogKiBAQXV0aG9yOiBtZW5nem9uZWZpcmUKICogQERhdGU6IDIwMjItMTAtMjAgMTA6MzY6NDMKICogQExhc3RFZGl0VGltZTogMjAyMy0wMS0zMSAyMDo1MzoxMwogKiBATGFzdEVkaXRvcnM6IG1lbmd6b25lZmlyZQogKiBARGVzY3JpcHRpb246IOS4u+WHveaVsOWFpeWPowogKi8KCgoKCgoKCmZ1bmN0aW9uIGxvYWRlckJhaWR1KCkgewogICAgdmFyIGxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKGxvY1VybC5pbmNsdWRlcyhiYWlkdU5ld1BhZ2UpKQogICAgICAgICAgICBpbnN0YWxsTmV3KCk7CiAgICAgICAgZWxzZSBpZiAobG9jVXJsLmluY2x1ZGVzKGJhaWR1U2hhcmVQYWdlKSkKICAgICAgICAgICAgaW5zdGFsbFNoYXJlKCk7CiAgICAgICAgZWxzZSBpZiAobG9jVXJsLmluY2x1ZGVzKGJhaWR1U3luY1BhZ2UpKQogICAgICAgICAgICBpbnN0YWxsU3luYygpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgaW5zdGFsbExlZ2FjeSgpOwogICAgICAgIC8vIOi/m+WFpemhtemdouWQjueahOW8ueeql+S7u+WKoQogICAgICAgIHZhciBiZGxpbmsgPSBwYXJzZVF1ZXJ5TGluayhsb2NVcmwpOyAvLyDop6PmnpB1cmzkuK3nmoTnp5LkvKDpk77mjqUKICAgICAgICBpZiAoYmRsaW5rKSB7CiAgICAgICAgICAgIC8vIOino+aekOWIsOenkuS8oOmTvuaOpSwg5by55Ye66L2s5a2Y56qX5Y+jCiAgICAgICAgICAgIHN3YWxJbnN0YW5jZS5pbnB1dFZpZXcoYmRsaW5rKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoIUdNX2dldFZhbHVlKHVwZGF0ZUluZm9WZXIgKyAiX25vX2ZpcnN0IikpCiAgICAgICAgICAgIC8vIOajgOafpeaYr+WQpummluasoei/kOihjCwg6Iul5piv5YiZ5by55Ye65pu05paw5L+h5oGv56qX5Y+jCiAgICAgICAgICAgIHN3YWxJbnN0YW5jZS51cGRhdGVJbmZvKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIEdNX3NldFZhbHVlKHVwZGF0ZUluZm9WZXIgKyAiX25vX2ZpcnN0IiwgdHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIC8vIOmihOWFiOe7keWumuWlveaMiemSruS6i+S7tgogICAgICAgICQoZG9jdW1lbnQpLm9uKCJjbGljayIsICIja2lsbF9kb25hdGUiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIEdNX3NldFZhbHVlKGZlZWRiYWNrVmVyICsgIl9raWxsX2RvbmF0ZSIsIHRydWUpOwogICAgICAgICAgICAkKCIjbXpmX2RvbmF0ZSIpLnJlbW92ZSgpOwogICAgICAgIH0pOyAvLyDotZ7liqnmj5DnpLogIuS4jeWGjeaYvuekuiIg5oyJ6ZKuCiAgICAgICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIiNraWxsX2ZlZWRiYWNrIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBHTV9zZXRWYWx1ZShkb25hdGVWZXIgKyAiX2tpbGxfZmVlZGJhY2siLCB0cnVlKTsKICAgICAgICAgICAgJCgiI216Zl9mZWVkYmFjayIpLnJlbW92ZSgpOwogICAgICAgIH0pOyAvLyDlj43ppojmj5DnpLogIuS4jeWGjeaYvuekuiIg5oyJ6ZKuCiAgICAgICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIiNjb3B5X2ZhaWxfbGlzdCIsIGZ1bmN0aW9uIChidG4pIHsKICAgICAgICAgICAgdmFyIGxpc3RUZXh0ID0gIiI7CiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBzd2FsSW5zdGFuY2UucGFyc2VSZXN1bHQuZmFpbExpc3Q7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IF9hW19pXTsKICAgICAgICAgICAgICAgIGxpc3RUZXh0ICs9IGl0ZW0ucGF0aCArICJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKGxpc3RUZXh0KTsKICAgICAgICAgICAgYnRuLnRhcmdldC5pbm5lclRleHQgPSAi5aSN5Yi25oiQ5YqfIjsKICAgICAgICB9KTsgLy8g5aSx6LSl5paH5Lu25YiX6KGo5aSN5Yi2CiAgICAgICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIiNjb3B5X3N1Y2Nlc3NfbGlzdCIsIGZ1bmN0aW9uIChidG4pIHsKICAgICAgICAgICAgdmFyIGxpc3RUZXh0ID0gIiI7CiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBzd2FsSW5zdGFuY2UucGFyc2VSZXN1bHQuc3VjY2Vzc0xpc3Q7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IF9hW19pXTsKICAgICAgICAgICAgICAgIGxpc3RUZXh0ICs9IGl0ZW0ucGF0aCArICJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgR01fc2V0Q2xpcGJvYXJkKGxpc3RUZXh0KTsKICAgICAgICAgICAgYnRuLnRhcmdldC5pbm5lclRleHQgPSAi5aSN5Yi25oiQ5YqfIjsKICAgICAgICB9KTsgLy8g5oiQ5Yqf5paH5Lu25YiX6KGo5aSN5Yi2CiAgICAgICAgJChkb2N1bWVudCkub24oImNsaWNrIiwgIiNjb3B5X2ZhaWxfYnJhbmNoX2xpc3QiLCBmdW5jdGlvbiAoYnRuKSB7CiAgICAgICAgICAgIHZhciBlbGUgPSAkKGJ0bi50YXJnZXQpOwogICAgICAgICAgICBHTV9zZXRDbGlwYm9hcmQoZWxlCiAgICAgICAgICAgICAgICAucGFyZW50cygiZGV0YWlscy5temZfZGV0YWlsc19icmFuY2giKQogICAgICAgICAgICAgICAgLm5leHQoKVswXQogICAgICAgICAgICAgICAgLmlubmVyVGV4dC5yZXBsYWNlKC9cblxuL2csICJcbiIpKTsKICAgICAgICAgICAgYnRuLnRhcmdldC5pbm5lclRleHQgPSAi5aSN5Yi25oiQ5YqfIjsKICAgICAgICB9KTsgLy8g5aSx6LSl5paH5Lu25YiG5pSv5YiX6KGo5aSN5Yi2CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8g5re75Yqg5rK554y05o+S5Lu26I+c5Y2V5oyJ6ZKuCiAgICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoIvCfla4g54mI5pys5L+h5oGvIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgc3dhbEluc3RhbmNlLnVwZGF0ZUluZm8oZnVuY3Rpb24gKCkgeyB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoIuKamSDlt6Xlhbforr7nva4iLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBzd2FsSW5zdGFuY2Uuc2V0dGluZ1ZpZXcoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoIuKaoeeUn+aIkOenkuS8oCjovpPlhaXmlofku7bot6/lvoQpIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgc3dhbEluc3RhbmNlLmdlblZpZXcoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChfKSB7CiAgICAgICAgICAgIGNvbnNvbGUuaW5mbygiJXMgdmVyc2lvbjogJXMg5o+S5Lu26I+c5Y2V5re75Yqg5aSx6LSlLCDkvb/nlKjnmoTmj5Lku7bkuI3mlK/mjIFHTV9yZWdpc3Rlck1lbnVDb21tYW5kIiwgVEFHLCB2ZXJzaW9uKTsKICAgICAgICB9CiAgICB9OwogICAgLy8g57uR5a6a5YWl5Y+j5Ye95pWw5YiwZG9t5LqL5Lu2CiAgICBpZiAoWyJpbnRlcmFjdGl2ZSIsICJjb21wbGV0ZSJdLmluY2x1ZGVzKGRvY3VtZW50LnJlYWR5U3RhdGUpKQogICAgICAgIGxvYWQoKTsKICAgIGVsc2UKICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGxvYWQpOwp9Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9zcmMvY29tbW9uL2luamVjdFN0eWxlLnRzeAovKgogKiBAQXV0aG9yOiBtZW5nem9uZWZpcmUKICogQERhdGU6IDIwMjEtMDctMjMgMTc6MzI6MTgKICogQExhc3RFZGl0VGltZTogMjAyMy0wMi0xNCAwMzoyNTowMgogKiBATGFzdEVkaXRvcnM6IG1lbmd6b25lZmlyZQogKiBARGVzY3JpcHRpb246IOagt+W8j+azqOWFpeaooeWdlwogKi8KCgoKCgoKLyoqCiAqIEBkZXNjcmlwdGlvbjog5rOo5YWl6ISa5pys5qC35byPCiAqLwpmdW5jdGlvbiBpbmplY3RTdHlsZSgpIHsKICAgIC8vIOazqOWFpeiHquWumuS5ieagt+W8jwogICAgR01fYWRkU3R5bGUoKGFwcF9kZWZhdWx0KCkpKTsKICAgIEdNX2FkZFN0eWxlKChjc3NfYXBwX2RlZmF1bHQoKSkpOwogICAgdmFyIHN3YWxUaGVtZXMgPSBHTV9nZXRWYWx1ZSgic3dhbFRoZW1lcyIpIHx8ICJEZWZhdWx0IjsgLy8gc3dlZXRBbGVydOeahOS4u+mimChjc3MpLCDpu5jorqTkuLpEZWZhdWx0CiAgICBpZiAoIkRlZmF1bHQiICE9IHN3YWxUaGVtZXMpIHsKICAgICAgICB2YXIgVGhlbWVzQ3NzID0gR01fZ2V0VmFsdWUoIiIgKyBzd2FsQ3NzVmVyICsgc3dhbFRoZW1lcyk7IC8vIOS7jue8k+WtmOiOt+WPlumdnum7mOiupOS4u+mimOeahGNzc+S7o+eggQogICAgICAgIGlmIChUaGVtZXNDc3MpCiAgICAgICAgICAgIEdNX2FkZFN0eWxlKFRoZW1lc0Nzcyk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGdldFRoZW1lc0Nzcyhzd2FsVGhlbWVzKTsgLy8g5pyq5om+5Yiw57yT5a2YLCBmYWxsYmFja+WIsOS4i+i9vWNzc+S7o+eggQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbG9hZGVyQmFpZHUoKTsKfQovKioKICogQGRlc2NyaXB0aW9uOiDkuIvovb3lubbms6jlhaXlr7nlupTkuLvpopjnmoRjc3PmoLflvI/ku6PnoIEsIOS8muWwhmNzc+S7o+eggee8k+WtmOacrOWcsAogKiBAcGFyYW0ge3N0cmluZ30gc3dhbFRoZW1lcyDkuLvpopjljIXlkI0KICovCmZ1bmN0aW9uIGdldFRoZW1lc0Nzcyhzd2FsVGhlbWVzKSB7CiAgICBhamF4KHsKICAgICAgICB1cmw6IGV4dENzc1VybFtzd2FsVGhlbWVzXSwKICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgfSwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICB2YXIgVGhlbWVzQ3NzID0gZGF0YS5yZXNwb25zZVRleHQ7CiAgICAgICAgaWYgKFRoZW1lc0Nzcy5sZW5ndGggPCAxMDApIHsKICAgICAgICAgICAgc2hvd0FsZXJ0KGFwcEVycm9yLlN3YWxDc3NJbnZhbGlkICsKICAgICAgICAgICAgICAgICgiXG5cdTk1MTlcdThCRUZcdTY1NzBcdTYzNkU6IiArIHN3YWxUaGVtZXMgKyAiIEludmFsaWRDc3M6XG4iICsgVGhlbWVzQ3NzKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9IC8vIOi/lOWbnmRhdGHmlbDmja7plb/luqbov4flsI8sIOWIpOWumuS4uuaXoOaViOagt+W8j+S7o+eggQogICAgICAgIEdNX3NldFZhbHVlKCIiICsgc3dhbENzc1ZlciArIHN3YWxUaGVtZXMsIFRoZW1lc0Nzcyk7IC8vIOe8k+WtmGNzc+S7o+eggQogICAgICAgIEdNX2FkZFN0eWxlKFRoZW1lc0Nzcyk7IC8vIOazqOWFpWNzcwogICAgICAgIGxvYWRlckJhaWR1KCk7CiAgICB9LCBmdW5jdGlvbiAoc3RhdHVzQ29kZSkgewogICAgICAgIHNob3dBbGVydChhcHBFcnJvci5Td2FsQ3NzRXJyUmVxICsgKCIjIiArIHN0YXR1c0NvZGUpKTsKICAgIH0pOwp9Cgo7Ly8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvanMtYmFzZTY0L2Jhc2U2NC5tanMKLyoqCiAqICBiYXNlNjQudHMKICoKICogIExpY2Vuc2VkIHVuZGVyIHRoZSBCU0QgMy1DbGF1c2UgTGljZW5zZS4KICogICAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQogKgogKiAgUmVmZXJlbmNlczoKICogICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQKICoKICogQGF1dGhvciBEYW4gS29nYWkgKGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5rb2dhaSkKICovCmNvbnN0IGJhc2U2NF92ZXJzaW9uID0gJzMuNy4yJzsKLyoqCiAqIEBkZXByZWNhdGVkIHVzZSBsb3dlcmNhc2UgYHZlcnNpb25gLgogKi8KY29uc3QgVkVSU0lPTiA9IGJhc2U2NF92ZXJzaW9uOwpjb25zdCBfaGFzYXRvYiA9IHR5cGVvZiBhdG9iID09PSAnZnVuY3Rpb24nOwpjb25zdCBfaGFzYnRvYSA9IHR5cGVvZiBidG9hID09PSAnZnVuY3Rpb24nOwpjb25zdCBfaGFzQnVmZmVyID0gdHlwZW9mIEJ1ZmZlciA9PT0gJ2Z1bmN0aW9uJzsKY29uc3QgX1REID0gdHlwZW9mIFRleHREZWNvZGVyID09PSAnZnVuY3Rpb24nID8gbmV3IFRleHREZWNvZGVyKCkgOiB1bmRlZmluZWQ7CmNvbnN0IF9URSA9IHR5cGVvZiBUZXh0RW5jb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBUZXh0RW5jb2RlcigpIDogdW5kZWZpbmVkOwpjb25zdCBiNjRjaCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7CmNvbnN0IGI2NGNocyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGI2NGNoKTsKY29uc3QgYjY0dGFiID0gKChhKSA9PiB7CiAgICBsZXQgdGFiID0ge307CiAgICBhLmZvckVhY2goKGMsIGkpID0+IHRhYltjXSA9IGkpOwogICAgcmV0dXJuIHRhYjsKfSkoYjY0Y2hzKTsKY29uc3QgYjY0cmUgPSAvXig/OltBLVphLXpcZCtcL117NH0pKj8oPzpbQS1aYS16XGQrXC9dezJ9KD86PT0pP3xbQS1aYS16XGQrXC9dezN9PT8pPyQvOwpjb25zdCBfZnJvbUNDID0gU3RyaW5nLmZyb21DaGFyQ29kZS5iaW5kKFN0cmluZyk7CmNvbnN0IF9VOEFmcm9tID0gdHlwZW9mIFVpbnQ4QXJyYXkuZnJvbSA9PT0gJ2Z1bmN0aW9uJwogICAgPyBVaW50OEFycmF5LmZyb20uYmluZChVaW50OEFycmF5KQogICAgOiAoaXQsIGZuID0gKHgpID0+IHgpID0+IG5ldyBVaW50OEFycmF5KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGl0LCAwKS5tYXAoZm4pKTsKY29uc3QgX21rVXJpU2FmZSA9IChzcmMpID0+IHNyYwogICAgLnJlcGxhY2UoLz0vZywgJycpLnJlcGxhY2UoL1srXC9dL2csIChtMCkgPT4gbTAgPT0gJysnID8gJy0nIDogJ18nKTsKY29uc3QgX3RpZHlCNjQgPSAocykgPT4gcy5yZXBsYWNlKC9bXkEtWmEtejAtOVwrXC9dL2csICcnKTsKLyoqCiAqIHBvbHlmaWxsIHZlcnNpb24gb2YgYGJ0b2FgCiAqLwpjb25zdCBidG9hUG9seWZpbGwgPSAoYmluKSA9PiB7CiAgICAvLyBjb25zb2xlLmxvZygncG9seWZpbGxlZCcpOwogICAgbGV0IHUzMiwgYzAsIGMxLCBjMiwgYXNjID0gJyc7CiAgICBjb25zdCBwYWQgPSBiaW4ubGVuZ3RoICUgMzsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmluLmxlbmd0aDspIHsKICAgICAgICBpZiAoKGMwID0gYmluLmNoYXJDb2RlQXQoaSsrKSkgPiAyNTUgfHwKICAgICAgICAgICAgKGMxID0gYmluLmNoYXJDb2RlQXQoaSsrKSkgPiAyNTUgfHwKICAgICAgICAgICAgKGMyID0gYmluLmNoYXJDb2RlQXQoaSsrKSkgPiAyNTUpCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgY2hhcmFjdGVyIGZvdW5kJyk7CiAgICAgICAgdTMyID0gKGMwIDw8IDE2KSB8IChjMSA8PCA4KSB8IGMyOwogICAgICAgIGFzYyArPSBiNjRjaHNbdTMyID4+IDE4ICYgNjNdCiAgICAgICAgICAgICsgYjY0Y2hzW3UzMiA+PiAxMiAmIDYzXQogICAgICAgICAgICArIGI2NGNoc1t1MzIgPj4gNiAmIDYzXQogICAgICAgICAgICArIGI2NGNoc1t1MzIgJiA2M107CiAgICB9CiAgICByZXR1cm4gcGFkID8gYXNjLnNsaWNlKDAsIHBhZCAtIDMpICsgIj09PSIuc3Vic3RyaW5nKHBhZCkgOiBhc2M7Cn07Ci8qKgogKiBkb2VzIHdoYXQgYHdpbmRvdy5idG9hYCBvZiB3ZWIgYnJvd3NlcnMgZG8uCiAqIEBwYXJhbSB7U3RyaW5nfSBiaW4gYmluYXJ5IHN0cmluZwogKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcKICovCmNvbnN0IF9idG9hID0gX2hhc2J0b2EgPyAoYmluKSA9PiBidG9hKGJpbikKICAgIDogX2hhc0J1ZmZlciA/IChiaW4pID0+IEJ1ZmZlci5mcm9tKGJpbiwgJ2JpbmFyeScpLnRvU3RyaW5nKCdiYXNlNjQnKQogICAgICAgIDogYnRvYVBvbHlmaWxsOwpjb25zdCBfZnJvbVVpbnQ4QXJyYXkgPSBfaGFzQnVmZmVyCiAgICA/ICh1OGEpID0+IEJ1ZmZlci5mcm9tKHU4YSkudG9TdHJpbmcoJ2Jhc2U2NCcpCiAgICA6ICh1OGEpID0+IHsKICAgICAgICAvLyBjZi4gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTI3MTAwMDEvaG93LXRvLWNvbnZlcnQtdWludDgtYXJyYXktdG8tYmFzZTY0LWVuY29kZWQtc3RyaW5nLzEyNzEzMzI2IzEyNzEzMzI2CiAgICAgICAgY29uc3QgbWF4YXJncyA9IDB4MTAwMDsKICAgICAgICBsZXQgc3RycyA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdThhLmxlbmd0aDsgaSA8IGw7IGkgKz0gbWF4YXJncykgewogICAgICAgICAgICBzdHJzLnB1c2goX2Zyb21DQy5hcHBseShudWxsLCB1OGEuc3ViYXJyYXkoaSwgaSArIG1heGFyZ3MpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfYnRvYShzdHJzLmpvaW4oJycpKTsKICAgIH07Ci8qKgogKiBjb252ZXJ0cyBhIFVpbnQ4QXJyYXkgdG8gYSBCYXNlNjQgc3RyaW5nLgogKiBAcGFyYW0ge2Jvb2xlYW59IFt1cmxzYWZlXSBVUkwtYW5kLWZpbGVuYW1lLXNhZmUgYSBsYSBSRkM0NjQ4IMKnNQogKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQgc3RyaW5nCiAqLwpjb25zdCBmcm9tVWludDhBcnJheSA9ICh1OGEsIHVybHNhZmUgPSBmYWxzZSkgPT4gdXJsc2FmZSA/IF9ta1VyaVNhZmUoX2Zyb21VaW50OEFycmF5KHU4YSkpIDogX2Zyb21VaW50OEFycmF5KHU4YSk7Ci8vIFRoaXMgdHJpY2sgaXMgZm91bmQgYnJva2VuIGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5rb2dhaS9qcy1iYXNlNjQvaXNzdWVzLzEzMAovLyBjb25zdCB1dG9iID0gKHNyYzogc3RyaW5nKSA9PiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3JjKSk7Ci8vIHJldmVydGluZyBnb29kIG9sZCBmYXRpb25lZCByZWdleHAKY29uc3QgY2JfdXRvYiA9IChjKSA9PiB7CiAgICBpZiAoYy5sZW5ndGggPCAyKSB7CiAgICAgICAgdmFyIGNjID0gYy5jaGFyQ29kZUF0KDApOwogICAgICAgIHJldHVybiBjYyA8IDB4ODAgPyBjCiAgICAgICAgICAgIDogY2MgPCAweDgwMCA/IChfZnJvbUNDKDB4YzAgfCAoY2MgPj4+IDYpKQogICAgICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoY2MgJiAweDNmKSkpCiAgICAgICAgICAgICAgICA6IChfZnJvbUNDKDB4ZTAgfCAoKGNjID4+PiAxMikgJiAweDBmKSkKICAgICAgICAgICAgICAgICAgICArIF9mcm9tQ0MoMHg4MCB8ICgoY2MgPj4+IDYpICYgMHgzZikpCiAgICAgICAgICAgICAgICAgICAgKyBfZnJvbUNDKDB4ODAgfCAoY2MgJiAweDNmKSkpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgdmFyIGNjID0gMHgxMDAwMAogICAgICAgICAgICArIChjLmNoYXJDb2RlQXQoMCkgLSAweEQ4MDApICogMHg0MDAKICAgICAgICAgICAgKyAoYy5jaGFyQ29kZUF0KDEpIC0gMHhEQzAwKTsKICAgICAgICByZXR1cm4gKF9mcm9tQ0MoMHhmMCB8ICgoY2MgPj4+IDE4KSAmIDB4MDcpKQogICAgICAgICAgICArIF9mcm9tQ0MoMHg4MCB8ICgoY2MgPj4+IDEyKSAmIDB4M2YpKQogICAgICAgICAgICArIF9mcm9tQ0MoMHg4MCB8ICgoY2MgPj4+IDYpICYgMHgzZikpCiAgICAgICAgICAgICsgX2Zyb21DQygweDgwIHwgKGNjICYgMHgzZikpKTsKICAgIH0KfTsKY29uc3QgcmVfdXRvYiA9IC9bXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRkZdfFteXHgwMC1ceDdGXS9nOwovKioKICogQGRlcHJlY2F0ZWQgc2hvdWxkIGhhdmUgYmVlbiBpbnRlcm5hbCB1c2Ugb25seS4KICogQHBhcmFtIHtzdHJpbmd9IHNyYyBVVEYtOCBzdHJpbmcKICogQHJldHVybnMge3N0cmluZ30gVVRGLTE2IHN0cmluZwogKi8KY29uc3QgdXRvYiA9ICh1KSA9PiB1LnJlcGxhY2UocmVfdXRvYiwgY2JfdXRvYik7Ci8vCmNvbnN0IF9lbmNvZGUgPSBfaGFzQnVmZmVyCiAgICA/IChzKSA9PiBCdWZmZXIuZnJvbShzLCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKQogICAgOiBfVEUKICAgICAgICA/IChzKSA9PiBfZnJvbVVpbnQ4QXJyYXkoX1RFLmVuY29kZShzKSkKICAgICAgICA6IChzKSA9PiBfYnRvYSh1dG9iKHMpKTsKLyoqCiAqIGNvbnZlcnRzIGEgVVRGLTgtZW5jb2RlZCBzdHJpbmcgdG8gYSBCYXNlNjQgc3RyaW5nLgogKiBAcGFyYW0ge2Jvb2xlYW59IFt1cmxzYWZlXSBpZiBgdHJ1ZWAgbWFrZSB0aGUgcmVzdWx0IFVSTC1zYWZlCiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NCBzdHJpbmcKICovCmNvbnN0IGVuY29kZSA9IChzcmMsIHVybHNhZmUgPSBmYWxzZSkgPT4gdXJsc2FmZQogICAgPyBfbWtVcmlTYWZlKF9lbmNvZGUoc3JjKSkKICAgIDogX2VuY29kZShzcmMpOwovKioKICogY29udmVydHMgYSBVVEYtOC1lbmNvZGVkIHN0cmluZyB0byBVUkwtc2FmZSBCYXNlNjQgUkZDNDY0OCDCpzUuCiAqIEByZXR1cm5zIHtzdHJpbmd9IEJhc2U2NCBzdHJpbmcKICovCmNvbnN0IGJhc2U2NF9lbmNvZGVVUkkgPSAoc3JjKSA9PiBlbmNvZGUoc3JjLCB0cnVlKTsKLy8gVGhpcyB0cmljayBpcyBmb3VuZCBicm9rZW4gaHR0cHM6Ly9naXRodWIuY29tL2RhbmtvZ2FpL2pzLWJhc2U2NC9pc3N1ZXMvMTMwCi8vIGNvbnN0IGJ0b3UgPSAoc3JjOiBzdHJpbmcpID0+IGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoc3JjKSk7Ci8vIHJldmVydGluZyBnb29kIG9sZCBmYXRpb25lZCByZWdleHAKY29uc3QgcmVfYnRvdSA9IC9bXHhDMC1ceERGXVtceDgwLVx4QkZdfFtceEUwLVx4RUZdW1x4ODAtXHhCRl17Mn18W1x4RjAtXHhGN11bXHg4MC1ceEJGXXszfS9nOwpjb25zdCBjYl9idG91ID0gKGNjY2MpID0+IHsKICAgIHN3aXRjaCAoY2NjYy5sZW5ndGgpIHsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIHZhciBjcCA9ICgoMHgwNyAmIGNjY2MuY2hhckNvZGVBdCgwKSkgPDwgMTgpCiAgICAgICAgICAgICAgICB8ICgoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgxKSkgPDwgMTIpCiAgICAgICAgICAgICAgICB8ICgoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgyKSkgPDwgNikKICAgICAgICAgICAgICAgIHwgKDB4M2YgJiBjY2NjLmNoYXJDb2RlQXQoMykpLCBvZmZzZXQgPSBjcCAtIDB4MTAwMDA7CiAgICAgICAgICAgIHJldHVybiAoX2Zyb21DQygob2Zmc2V0ID4+PiAxMCkgKyAweEQ4MDApCiAgICAgICAgICAgICAgICArIF9mcm9tQ0MoKG9mZnNldCAmIDB4M0ZGKSArIDB4REMwMCkpOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgcmV0dXJuIF9mcm9tQ0MoKCgweDBmICYgY2NjYy5jaGFyQ29kZUF0KDApKSA8PCAxMikKICAgICAgICAgICAgICAgIHwgKCgweDNmICYgY2NjYy5jaGFyQ29kZUF0KDEpKSA8PCA2KQogICAgICAgICAgICAgICAgfCAoMHgzZiAmIGNjY2MuY2hhckNvZGVBdCgyKSkpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBfZnJvbUNDKCgoMHgxZiAmIGNjY2MuY2hhckNvZGVBdCgwKSkgPDwgNikKICAgICAgICAgICAgICAgIHwgKDB4M2YgJiBjY2NjLmNoYXJDb2RlQXQoMSkpKTsKICAgIH0KfTsKLyoqCiAqIEBkZXByZWNhdGVkIHNob3VsZCBoYXZlIGJlZW4gaW50ZXJuYWwgdXNlIG9ubHkuCiAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgVVRGLTE2IHN0cmluZwogKiBAcmV0dXJucyB7c3RyaW5nfSBVVEYtOCBzdHJpbmcKICovCmNvbnN0IGJ0b3UgPSAoYikgPT4gYi5yZXBsYWNlKHJlX2J0b3UsIGNiX2J0b3UpOwovKioKICogcG9seWZpbGwgdmVyc2lvbiBvZiBgYXRvYmAKICovCmNvbnN0IGF0b2JQb2x5ZmlsbCA9IChhc2MpID0+IHsKICAgIC8vIGNvbnNvbGUubG9nKCdwb2x5ZmlsbGVkJyk7CiAgICBhc2MgPSBhc2MucmVwbGFjZSgvXHMrL2csICcnKTsKICAgIGlmICghYjY0cmUudGVzdChhc2MpKQogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ21hbGZvcm1lZCBiYXNlNjQuJyk7CiAgICBhc2MgKz0gJz09Jy5zbGljZSgyIC0gKGFzYy5sZW5ndGggJiAzKSk7CiAgICBsZXQgdTI0LCBiaW4gPSAnJywgcjEsIHIyOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhc2MubGVuZ3RoOykgewogICAgICAgIHUyNCA9IGI2NHRhYlthc2MuY2hhckF0KGkrKyldIDw8IDE4CiAgICAgICAgICAgIHwgYjY0dGFiW2FzYy5jaGFyQXQoaSsrKV0gPDwgMTIKICAgICAgICAgICAgfCAocjEgPSBiNjR0YWJbYXNjLmNoYXJBdChpKyspXSkgPDwgNgogICAgICAgICAgICB8IChyMiA9IGI2NHRhYlthc2MuY2hhckF0KGkrKyldKTsKICAgICAgICBiaW4gKz0gcjEgPT09IDY0ID8gX2Zyb21DQyh1MjQgPj4gMTYgJiAyNTUpCiAgICAgICAgICAgIDogcjIgPT09IDY0ID8gX2Zyb21DQyh1MjQgPj4gMTYgJiAyNTUsIHUyNCA+PiA4ICYgMjU1KQogICAgICAgICAgICAgICAgOiBfZnJvbUNDKHUyNCA+PiAxNiAmIDI1NSwgdTI0ID4+IDggJiAyNTUsIHUyNCAmIDI1NSk7CiAgICB9CiAgICByZXR1cm4gYmluOwp9OwovKioKICogZG9lcyB3aGF0IGB3aW5kb3cuYXRvYmAgb2Ygd2ViIGJyb3dzZXJzIGRvLgogKiBAcGFyYW0ge1N0cmluZ30gYXNjIEJhc2U2NC1lbmNvZGVkIHN0cmluZwogKiBAcmV0dXJucyB7c3RyaW5nfSBiaW5hcnkgc3RyaW5nCiAqLwpjb25zdCBfYXRvYiA9IF9oYXNhdG9iID8gKGFzYykgPT4gYXRvYihfdGlkeUI2NChhc2MpKQogICAgOiBfaGFzQnVmZmVyID8gKGFzYykgPT4gQnVmZmVyLmZyb20oYXNjLCAnYmFzZTY0JykudG9TdHJpbmcoJ2JpbmFyeScpCiAgICAgICAgOiBhdG9iUG9seWZpbGw7Ci8vCmNvbnN0IF90b1VpbnQ4QXJyYXkgPSBfaGFzQnVmZmVyCiAgICA/IChhKSA9PiBfVThBZnJvbShCdWZmZXIuZnJvbShhLCAnYmFzZTY0JykpCiAgICA6IChhKSA9PiBfVThBZnJvbShfYXRvYihhKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpOwovKioKICogY29udmVydHMgYSBCYXNlNjQgc3RyaW5nIHRvIGEgVWludDhBcnJheS4KICovCmNvbnN0IHRvVWludDhBcnJheSA9IChhKSA9PiBfdG9VaW50OEFycmF5KF91blVSSShhKSk7Ci8vCmNvbnN0IF9kZWNvZGUgPSBfaGFzQnVmZmVyCiAgICA/IChhKSA9PiBCdWZmZXIuZnJvbShhLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKQogICAgOiBfVEQKICAgICAgICA/IChhKSA9PiBfVEQuZGVjb2RlKF90b1VpbnQ4QXJyYXkoYSkpCiAgICAgICAgOiAoYSkgPT4gYnRvdShfYXRvYihhKSk7CmNvbnN0IF91blVSSSA9IChhKSA9PiBfdGlkeUI2NChhLnJlcGxhY2UoL1stX10vZywgKG0wKSA9PiBtMCA9PSAnLScgPyAnKycgOiAnLycpKTsKLyoqCiAqIGNvbnZlcnRzIGEgQmFzZTY0IHN0cmluZyB0byBhIFVURi04IHN0cmluZy4KICogQHBhcmFtIHtTdHJpbmd9IHNyYyBCYXNlNjQgc3RyaW5nLiAgQm90aCBub3JtYWwgYW5kIFVSTC1zYWZlIGFyZSBzdXBwb3J0ZWQKICogQHJldHVybnMge3N0cmluZ30gVVRGLTggc3RyaW5nCiAqLwpjb25zdCBkZWNvZGUgPSAoc3JjKSA9PiBfZGVjb2RlKF91blVSSShzcmMpKTsKLyoqCiAqIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBCYXNlNjQgc3RyaW5nCiAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgYSB2YWx1ZSB0byBjaGVjawogICovCmNvbnN0IGlzVmFsaWQgPSAoc3JjKSA9PiB7CiAgICBpZiAodHlwZW9mIHNyYyAhPT0gJ3N0cmluZycpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgcyA9IHNyYy5yZXBsYWNlKC9ccysvZywgJycpLnJlcGxhY2UoLz17MCwyfSQvLCAnJyk7CiAgICByZXR1cm4gIS9bXlxzMC05YS16QS1aXCsvXS8udGVzdChzKSB8fCAhL1teXHMwLTlhLXpBLVpcLV9dLy50ZXN0KHMpOwp9OwovLwpjb25zdCBfbm9FbnVtID0gKHYpID0+IHsKICAgIHJldHVybiB7CiAgICAgICAgdmFsdWU6IHYsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlCiAgICB9Owp9OwovKioKICogZXh0ZW5kIFN0cmluZy5wcm90b3R5cGUgd2l0aCByZWxldmFudCBtZXRob2RzCiAqLwpjb25zdCBleHRlbmRTdHJpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICBjb25zdCBfYWRkID0gKG5hbWUsIGJvZHkpID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLCBuYW1lLCBfbm9FbnVtKGJvZHkpKTsKICAgIF9hZGQoJ2Zyb21CYXNlNjQnLCBmdW5jdGlvbiAoKSB7IHJldHVybiBkZWNvZGUodGhpcyk7IH0pOwogICAgX2FkZCgndG9CYXNlNjQnLCBmdW5jdGlvbiAodXJsc2FmZSkgeyByZXR1cm4gZW5jb2RlKHRoaXMsIHVybHNhZmUpOyB9KTsKICAgIF9hZGQoJ3RvQmFzZTY0VVJJJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZW5jb2RlKHRoaXMsIHRydWUpOyB9KTsKICAgIF9hZGQoJ3RvQmFzZTY0VVJMJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZW5jb2RlKHRoaXMsIHRydWUpOyB9KTsKICAgIF9hZGQoJ3RvVWludDhBcnJheScsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRvVWludDhBcnJheSh0aGlzKTsgfSk7Cn07Ci8qKgogKiBleHRlbmQgVWludDhBcnJheS5wcm90b3R5cGUgd2l0aCByZWxldmFudCBtZXRob2RzCiAqLwpjb25zdCBleHRlbmRVaW50OEFycmF5ID0gZnVuY3Rpb24gKCkgewogICAgY29uc3QgX2FkZCA9IChuYW1lLCBib2R5KSA9PiBPYmplY3QuZGVmaW5lUHJvcGVydHkoVWludDhBcnJheS5wcm90b3R5cGUsIG5hbWUsIF9ub0VudW0oYm9keSkpOwogICAgX2FkZCgndG9CYXNlNjQnLCBmdW5jdGlvbiAodXJsc2FmZSkgeyByZXR1cm4gZnJvbVVpbnQ4QXJyYXkodGhpcywgdXJsc2FmZSk7IH0pOwogICAgX2FkZCgndG9CYXNlNjRVUkknLCBmdW5jdGlvbiAoKSB7IHJldHVybiBmcm9tVWludDhBcnJheSh0aGlzLCB0cnVlKTsgfSk7CiAgICBfYWRkKCd0b0Jhc2U2NFVSTCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZyb21VaW50OEFycmF5KHRoaXMsIHRydWUpOyB9KTsKfTsKLyoqCiAqIGV4dGVuZCBCdWlsdGluIHByb3RvdHlwZXMgd2l0aCByZWxldmFudCBtZXRob2RzCiAqLwpjb25zdCBleHRlbmRCdWlsdGlucyA9ICgpID0+IHsKICAgIGV4dGVuZFN0cmluZygpOwogICAgZXh0ZW5kVWludDhBcnJheSgpOwp9Owpjb25zdCBnQmFzZTY0ID0gewogICAgdmVyc2lvbjogYmFzZTY0X3ZlcnNpb24sCiAgICBWRVJTSU9OOiBWRVJTSU9OLAogICAgYXRvYjogX2F0b2IsCiAgICBhdG9iUG9seWZpbGw6IGF0b2JQb2x5ZmlsbCwKICAgIGJ0b2E6IF9idG9hLAogICAgYnRvYVBvbHlmaWxsOiBidG9hUG9seWZpbGwsCiAgICBmcm9tQmFzZTY0OiBkZWNvZGUsCiAgICB0b0Jhc2U2NDogZW5jb2RlLAogICAgZW5jb2RlOiBlbmNvZGUsCiAgICBlbmNvZGVVUkk6IGJhc2U2NF9lbmNvZGVVUkksCiAgICBlbmNvZGVVUkw6IGJhc2U2NF9lbmNvZGVVUkksCiAgICB1dG9iOiB1dG9iLAogICAgYnRvdTogYnRvdSwKICAgIGRlY29kZTogZGVjb2RlLAogICAgaXNWYWxpZDogaXNWYWxpZCwKICAgIGZyb21VaW50OEFycmF5OiBmcm9tVWludDhBcnJheSwKICAgIHRvVWludDhBcnJheTogdG9VaW50OEFycmF5LAogICAgZXh0ZW5kU3RyaW5nOiBleHRlbmRTdHJpbmcsCiAgICBleHRlbmRVaW50OEFycmF5OiBleHRlbmRVaW50OEFycmF5LAogICAgZXh0ZW5kQnVpbHRpbnM6IGV4dGVuZEJ1aWx0aW5zLAp9OwovLyBtYWtlY2pzOkNVVCAvLwoKCgoKCgoKCgoKCgoKCgoKCgoKCi8vIGFuZCBmaW5hbGx5LAoKCjsvLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3NyYy9hcHAudHN4CgoKLyoqCiAqIEBkZXNjcmlwdGlvbjog5Li75Ye95pWw5YWl5Y+jCiAqLwpmdW5jdGlvbiBhcHBfYXBwKCkgewogICAgZ0Jhc2U2NC5leHRlbmRTdHJpbmcoKTsKICAgIGluamVjdFN0eWxlKCk7Cn0KLy8g5bm/5ZGK5oum5oiq5o+S5Lu25Lya5a+86Ie06ISa5pys5oql6ZSZ6Lez5Ye6LCDnvZHpobXljaHmrbssIOaVheWKoOWFpeW8guW4uOWkhOeQhgp0cnkgewogICAgYXBwX2FwcCgpOwp9CmNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5sb2coZXJyb3IpOwp9Cgp9KSgpOwoKLyoqKioqKi8gfSkoKQo7"}],"settings":{"configMode":50,"enabled":true,"script_blacklist_server":[{"rules":["/https?:\\/\\/userscripts\\.org\\/scripts\\/(source|version)/(102614).*\\.user\\.js/"],"severity":2},{"name":"SaveFrom.net helper","reason":"Shows advertisements","rules":["/https?:\\/\\/sf-addon\\.com\\/.*\\/.*\\.user\\.js/","/https?:\\/\\/.*\\.sf-helper\\.com\\/.*\\.user\\.js/"],"severity":3},{"reasons":{"en":"Used for a phishing compain to compromise users of baon-nutrition.com"},"rules":["/https?:\\/\\/files\\.ulysse\\.travel\\/.*\\.user\\.js/"],"severity":8}],"statistics_enabled":false}}