You are viewing a single comment's thread from:

RE: Test title

in #topic15 years ago (edited)

{
"id": "ssc-00000000000000000002",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "test",
"params": "",
"code": "YWN0aW9ucy5jcmVhdGVTU0MgPSBhc3luYyAocGF5bG9hZCkgPT4gewogICAgICAgICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCd0ZXN0VXBkYXRlVGFibGUnKTsKICAgICAgICB9"
}
}
}

Sort:  

{
"id": "ssc-testnet1",
"json": {
"contractName": "contract",
"contractAction": "update",
"contractPayload": {
"name": "tokens",
"params": "",
"code": "YWN0aW9ucy5jcmVhdGVTU0M9KGFzeW5jKCk9PntsZXQgYT1hd2FpdCBhcGkuZGIudGFibGVFeGlzdHMoInRva2VucyIpO2lmKCExPT09YSl7YXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJ0b2tlbnMiLFsic3ltYm9sIl0pLGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgiYmFsYW5jZXMiLFsiYWNjb3VudCJdKSxhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoImNvbnRyYWN0c0JhbGFuY2VzIixbImFjY291bnQiXSksYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJwYXJhbXMiKTtjb25zdCBhPXt0b2tlbkNyZWF0aW9uRmVlOiIwIn07YXdhaXQgYXBpLmRiLmluc2VydCgicGFyYW1zIixhKX1lbHNle2NvbnN0IGE9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInBhcmFtcyIse30pO2EuZW5hYmxlRGVsZWdhdGlvbkZlZT0iMTAwMCIsYS5lbmFibGVTdGFraW5nRmVlPSIxMDAwIixhd2FpdCBhcGkuZGIudXBkYXRlKCJwYXJhbXMiLGEpfSExPT09KGE9YXdhaXQgYXBpLmRiLnRhYmxlRXhpc3RzKCJwZW5kaW5nVW5zdGFrZXMiKSkmJmF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgicGVuZGluZ1Vuc3Rha2VzIixbImFjY291bnQiLCJ1bnN0YWtlQ29tcGxldGVUaW1lc3RhbXAiXSksITE9PT0oYT1hd2FpdCBhcGkuZGIudGFibGVFeGlzdHMoImRlbGVnYXRpb25zIikpJiYoYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJkZWxlZ2F0aW9ucyIsWyJmcm9tIiwidG8iXSksYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIsWyJhY2NvdW50IiwiY29tcGxldGVUaW1lc3RhbXAiXSkpO2xldCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6IlNURUVNUCJ9KTtlJiZlLnByZWNpc2lvbjw4JiYoZS5wcmVjaXNpb249OCxhd2FpdCBhcGkuZGIudXBkYXRlKCJ0b2tlbnMiLGUpKSx2b2lkIDAhPT0oZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgidG9rZW5zIix7c3ltYm9sOiJTU0MifSkpLnN0YWtpbmdFbmFibGVkJiYhMSE9PWUuc3Rha2luZ0VuYWJsZWR8fChlLnN0YWtpbmdFbmFibGVkPSEwLGUudG90YWxTdGFrZWQ9IjAiLGUudW5zdGFraW5nQ29vbGRvd249NDAsZS5udW1iZXJUcmFuc2FjdGlvbnM9NCxlLmRlbGVnYXRpb25FbmFibGVkPSEwLGUudW5kZWxlZ2F0aW9uQ29vbGRvd249Nyxhd2FpdCBhcGkuZGIudXBkYXRlKCJ0b2tlbnMiLGUpKX0pO2NvbnN0IGJhbGFuY2VUZW1wbGF0ZT17YWNjb3VudDpudWxsLHN5bWJvbDpudWxsLGJhbGFuY2U6IjAiLHN0YWtlOiIwIixwZW5kaW5nVW5zdGFrZToiMCIsZGVsZWdhdGlvbnNJbjoiMCIsZGVsZWdhdGlvbnNPdXQ6IjAiLHBlbmRpbmdVbmRlbGVnYXRpb25zOiIwIn0sY2FsY3VsYXRlQmFsYW5jZT0oYSxlLHQsaSk9Pmk/YXBpLkJpZ051bWJlcihhKS5wbHVzKGUpLnRvRml4ZWQodCk6YXBpLkJpZ051bWJlcihhKS5taW51cyhlKS50b0ZpeGVkKHQpLGNvdW50RGVjaW1hbHM9YT0+YXBpLkJpZ051bWJlcihhKS5kcCgpLGFkZFN0YWtlPWFzeW5jKGEsZSx0KT0+e2xldCBpPWF3YWl0IGFwaS5kYi5maW5kT25lKCJiYWxhbmNlcyIse2FjY291bnQ6YSxzeW1ib2w6ZS5zeW1ib2x9KTtudWxsPT09aSYmKChpPWJhbGFuY2VUZW1wbGF0ZSkuYWNjb3VudD1hLGkuc3ltYm9sPWUuc3ltYm9sLGk9YXdhaXQgYXBpLmRiLmluc2VydCgiYmFsYW5jZXMiLGkpKSx2b2lkIDA9PT1pLnN0YWtlJiYoaS5zdGFrZT0iMCIsaS5wZW5kaW5nVW5zdGFrZT0iMCIpO2NvbnN0IHM9aS5zdGFrZTtyZXR1cm4gaS5zdGFrZT1jYWxjdWxhdGVCYWxhbmNlKGkuc3Rha2UsdCxlLnByZWNpc2lvbiwhMCksISFhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIoaS5zdGFrZSkuZ3QocyksImNhbm5vdCBhZGQiKSYmKGF3YWl0IGFwaS5kYi51cGRhdGUoImJhbGFuY2VzIixpKSx2b2lkIDA9PT1lLnRvdGFsU3Rha2VkJiYoZS50b3RhbFN0YWtlZD0iMCIpLGUudG90YWxTdGFrZWQ9Y2FsY3VsYXRlQmFsYW5jZShlLnRvdGFsU3Rha2VkLHQsZS5wcmVjaXNpb24sITApLGF3YWl0IGFwaS5kYi51cGRhdGUoInRva2VucyIsZSksITApfSxzdWJTdGFrZT1hc3luYyhhLGUsdCk9Pntjb25zdCBpPWF3YWl0IGFwaS5kYi5maW5kT25lKCJiYWxhbmNlcyIse2FjY291bnQ6YSxzeW1ib2w6ZS5zeW1ib2x9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1pLCJiYWxhbmNlIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihpLnN0YWtlKS5ndGUodCksIm92ZXJkcmF3biBzdGFrZSIpKXtjb25zdCBhPWkuc3Rha2Uscz1pLnBlbmRpbmdVbnN0YWtlO2lmKGkuc3Rha2U9Y2FsY3VsYXRlQmFsYW5jZShpLnN0YWtlLHQsZS5wcmVjaXNpb24sITEpLGkucGVuZGluZ1Vuc3Rha2U9Y2FsY3VsYXRlQmFsYW5jZShpLnBlbmRpbmdVbnN0YWtlLHQsZS5wcmVjaXNpb24sITApLGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihpLnN0YWtlKS5sdChhKSYmYXBpLkJpZ051bWJlcihpLnBlbmRpbmdVbnN0YWtlKS5ndChzKSwiY2Fubm90IHN1YnRyYWN0IikpcmV0dXJuIGF3YWl0IGFwaS5kYi51cGRhdGUoImJhbGFuY2VzIixpKSwhMH1yZXR1cm4hMX0sc3ViQmFsYW5jZT1hc3luYyhhLGUsdCxpKT0+e2NvbnN0IHM9YXdhaXQgYXBpLmRiLmZpbmRPbmUoaSx7YWNjb3VudDphLHN5bWJvbDplLnN5bWJvbH0pO2lmKGFwaS5hc3NlcnQobnVsbCE9PXMsImJhbGFuY2UgZG9lcyBub3QgZXhpc3QiKSYmYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHMuYmFsYW5jZSkuZ3RlKHQpLCJvdmVyZHJhd24gYmFsYW5jZSIpKXtjb25zdCBhPXMuYmFsYW5jZTtpZihzLmJhbGFuY2U9Y2FsY3VsYXRlQmFsYW5jZShzLmJhbGFuY2UsdCxlLnByZWNpc2lvbiwhMSksYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHMuYmFsYW5jZSkubHQoYSksImNhbm5vdCBzdWJ0cmFjdCIpKXJldHVybiBhd2FpdCBhcGkuZGIudXBkYXRlKGkscyksITB9cmV0dXJuITF9LGFkZEJhbGFuY2U9YXN5bmMoYSxlLHQsaSk9PntsZXQgcz1hd2FpdCBhcGkuZGIuZmluZE9uZShpLHthY2NvdW50OmEsc3ltYm9sOmUuc3ltYm9sfSk7aWYobnVsbD09PXMpcmV0dXJuKHM9YmFsYW5jZVRlbXBsYXRlKS5hY2NvdW50PWEscy5zeW1ib2w9ZS5zeW1ib2wscy5iYWxhbmNlPXQsYXdhaXQgYXBpLmRiLmluc2VydChpLHMpLCEwO2NvbnN0IG49cy5iYWxhbmNlO3JldHVybiBzLmJhbGFuY2U9Y2FsY3VsYXRlQmFsYW5jZShzLmJhbGFuY2UsdCxlLnByZWNpc2lvbiwhMCksISFhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIocy5iYWxhbmNlKS5ndChuKSwiY2Fubm90IGFkZCIpJiYoYXdhaXQgYXBpLmRiLnVwZGF0ZShpLHMpLCEwKX07YWN0aW9ucy51cGRhdGVQYXJhbXM9KGFzeW5jIGE9PntpZihhcGkuc2VuZGVyIT09YXBpLm93bmVyKXJldHVybjtjb25zdHt0b2tlbkNyZWF0aW9uRmVlOmV9PWEsdD1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSk7dC50b2tlbkNyZWF0aW9uRmVlPWUsYXdhaXQgYXBpLmRiLnVwZGF0ZSgicGFyYW1zIix0KX0pLGFjdGlvbnMudXBkYXRlVXJsPShhc3luYyBhPT57Y29uc3R7dXJsOmUsc3ltYm9sOnR9PWE7aWYoYXBpLmFzc2VydCh0JiYic3RyaW5nIj09dHlwZW9mIHQmJmUmJiJzdHJpbmciPT10eXBlb2YgZSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydChlLmxlbmd0aDw9MjU1LCJpbnZhbGlkIHVybDogbWF4IGxlbmd0aCBvZiAyNTUiKSl7Y29uc3QgYT1hd2FpdCBhcGkuZGIuZmluZE9uZSgidG9rZW5zIix7c3ltYm9sOnR9KTtpZihhJiZhcGkuYXNzZXJ0KGEuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikpdHJ5e2NvbnN0IHQ9SlNPTi5wYXJzZShhLm1ldGFkYXRhKTthcGkuYXNzZXJ0KHQmJnQudXJsLCJhbiBlcnJvciBvY2N1cmVkIHdoZW4gdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgdXJsIikmJih0LnVybD1lLGEubWV0YWRhdGE9SlNPTi5zdHJpbmdpZnkodCksYXdhaXQgYXBpLmRiLnVwZGF0ZSgidG9rZW5zIixhKSl9Y2F0Y2goYSl7fX19KSxhY3Rpb25zLnVwZGF0ZU1ldGFkYXRhPShhc3luYyBhPT57Y29uc3R7bWV0YWRhdGE6ZSxzeW1ib2w6dH09YTtpZihhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmZSYmIm9iamVjdCI9PXR5cGVvZiBlLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6dH0pO2lmKGEmJmFwaS5hc3NlcnQoYS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSl0cnl7Y29uc3QgdD1KU09OLnN0cmluZ2lmeShlKTthcGkuYXNzZXJ0KHQubGVuZ3RoPD0xZTMsImludmFsaWQgbWV0YWRhdGE6IG1heCBsZW5ndGggb2YgMTAwMCIpJiYoYS5tZXRhZGF0YT10LGF3YWl0IGFwaS5kYi51cGRhdGUoInRva2VucyIsYSkpfWNhdGNoKGEpe319fSksYWN0aW9ucy51cGRhdGVQcmVjaXNpb249KGFzeW5jIGE9Pntjb25zdHtzeW1ib2w6ZSxwcmVjaXNpb246dCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aX09YTtpZihhcGkuYXNzZXJ0KCEwPT09aSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoZSYmInN0cmluZyI9PXR5cGVvZiBlKSYmYXBpLmFzc2VydCh0PjAmJnQ8PTgmJk51bWJlci5pc0ludGVnZXIodCksImludmFsaWQgcHJlY2lzaW9uIikpe2NvbnN0IGE9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDplfSk7YSYmYXBpLmFzc2VydChhLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpJiZhcGkuYXNzZXJ0KHQ+YS5wcmVjaXNpb24sInByZWNpc2lvbiBjYW4gb25seSBiZSBpbmNyZWFzZWQiKSYmKGEucHJlY2lzaW9uPXQsYXdhaXQgYXBpLmRiLnVwZGF0ZSgidG9rZW5zIixhKSl9fSksYWN0aW9ucy50cmFuc2Zlck93bmVyc2hpcD0oYXN5bmMgYT0+e2NvbnN0e3N5bWJvbDplLHRvOnQsaXNTaWduZWRXaXRoQWN0aXZlS2V5Oml9PWE7aWYoYXBpLmFzc2VydCghMD09PWksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KGUmJiJzdHJpbmciPT10eXBlb2YgZSYmdCYmInN0cmluZyI9PXR5cGVvZiB0LCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6ZX0pO2lmKGEmJmFwaS5hc3NlcnQoYS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSl7Y29uc3QgZT10LnRyaW0oKTthcGkuYXNzZXJ0KGFwaS5pc1ZhbGlkQWNjb3VudE5hbWUoZSksImludmFsaWQgdG8iKSYmKGEuaXNzdWVyPWUsYXdhaXQgYXBpLmRiLnVwZGF0ZSgidG9rZW5zIixhKSl9fX0pLGFjdGlvbnMuY3JlYXRlPShhc3luYyBhPT57Y29uc3R7bmFtZTplLHN5bWJvbDp0LHVybDppLHByZWNpc2lvbjpzLG1heFN1cHBseTpuLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpvfT1hLGw9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInBhcmFtcyIse30pLHt0b2tlbkNyZWF0aW9uRmVlOnB9PWwsYz1hd2FpdCBhcGkuZGIuZmluZE9uZSgiYmFsYW5jZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOiJTU0MifSkscj0hIWFwaS5CaWdOdW1iZXIocCkubHRlKDApfHxjJiZhcGkuQmlnTnVtYmVyKGMuYmFsYW5jZSkuZ3RlKHApO2lmKGFwaS5hc3NlcnQociwieW91IG11c3QgaGF2ZSBlbm91Z2ggdG9rZW5zIHRvIGNvdmVyIHRoZSBjcmVhdGlvbiBmZWVzIikmJmFwaS5hc3NlcnQoITA9PT1vLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJnQmJiJzdHJpbmciPT10eXBlb2YgdCYmKHZvaWQgMD09PWl8fGkmJiJzdHJpbmciPT10eXBlb2YgaSkmJihzJiYibnVtYmVyIj09dHlwZW9mIHN8fDA9PT1zKSYmbiYmInN0cmluZyI9PXR5cGVvZiBuJiYhYXBpLkJpZ051bWJlcihuKS5pc05hTigpLCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KGFwaS52YWxpZGF0b3IuaXNBbHBoYSh0KSYmYXBpLnZhbGlkYXRvci5pc1VwcGVyY2FzZSh0KSYmdC5sZW5ndGg+MCYmdC5sZW5ndGg8PTEwLCJpbnZhbGlkIHN5bWJvbDogdXBwZXJjYXNlIGxldHRlcnMgb25seSwgbWF4IGxlbmd0aCBvZiAxMCIpJiZhcGkuYXNzZXJ0KGFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMoYXBpLnZhbGlkYXRvci5ibGFja2xpc3QoZSwiICIpKSYmZS5sZW5ndGg+MCYmZS5sZW5ndGg8PTUwLCJpbnZhbGlkIG5hbWU6IGxldHRlcnMsIG51bWJlcnMsIHdoaXRlc3BhY2VzIG9ubHksIG1heCBsZW5ndGggb2YgNTAiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1pfHxpLmxlbmd0aDw9MjU1LCJpbnZhbGlkIHVybDogbWF4IGxlbmd0aCBvZiAyNTUiKSYmYXBpLmFzc2VydChzPj0wJiZzPD04JiZOdW1iZXIuaXNJbnRlZ2VyKHMpLCJpbnZhbGlkIHByZWNpc2lvbiIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIobikuZ3QoMCksIm1heFN1cHBseSBtdXN0IGJlIHBvc2l0aXZlIikmJmFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihuKS5sdGUoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLGBtYXhTdXBwbHkgbXVzdCBiZSBsb3dlciB0aGFuICR7TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJ9YCkpe2NvbnN0IGE9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDp0fSk7aWYoYXBpLmFzc2VydChudWxsPT09YSwic3ltYm9sIGFscmVhZHkgZXhpc3RzIikpe2xldCBhPXt1cmw6dm9pZCAwPT09aT8iIjppfTthPUpTT04uc3RyaW5naWZ5KGEpO2NvbnN0IGw9e2lzc3VlcjphcGkuc2VuZGVyLHN5bWJvbDp0LG5hbWU6ZSxtZXRhZGF0YTphLHByZWNpc2lvbjpzLG1heFN1cHBseTphcGkuQmlnTnVtYmVyKG4pLnRvRml4ZWQocyksc3VwcGx5OiIwIixjaXJjdWxhdGluZ1N1cHBseToiMCIsc3Rha2luZ0VuYWJsZWQ6ITEsdW5zdGFraW5nQ29vbGRvd246MSxkZWxlZ2F0aW9uRW5hYmxlZDohMSx1bmRlbGVnYXRpb25Db29sZG93bjowfTthd2FpdCBhcGkuZGIuaW5zZXJ0KCJ0b2tlbnMiLGwpLGFwaS5CaWdOdW1iZXIocCkuZ3QoMCkmJmF3YWl0IGFjdGlvbnMudHJhbnNmZXIoe3RvOiJudWxsIixzeW1ib2w6IlNTQyIscXVhbnRpdHk6cCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6b30pfX19KSxhY3Rpb25zLmlzc3VlPShhc3luYyBhPT57Y29uc3R7dG86ZSxzeW1ib2w6dCxxdWFudGl0eTppLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpzfT1hO2lmKGFwaS5hc3NlcnQoITA9PT1zLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJnQmJiJzdHJpbmciPT10eXBlb2YgdCYmaSYmInN0cmluZyI9PXR5cGVvZiBpJiYhYXBpLkJpZ051bWJlcihpKS5pc05hTigpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWUudHJpbSgpLHM9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDp0fSk7aWYoYXBpLmFzc2VydChudWxsIT09cywic3ltYm9sIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQocy5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJub3QgYWxsb3dlZCB0byBpc3N1ZSB0b2tlbnMiKSYmYXBpLmFzc2VydChjb3VudERlY2ltYWxzKGkpPD1zLnByZWNpc2lvbiwic3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIoaSkuZ3QoMCksIm11c3QgaXNzdWUgcG9zaXRpdmUgcXVhbnRpdHkiKSYmYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHMubWF4U3VwcGx5KS5taW51cyhzLnN1cHBseSkuZ3RlKGkpLCJxdWFudGl0eSBleGNlZWRzIGF2YWlsYWJsZSBzdXBwbHkiKSYmYXBpLmFzc2VydChhcGkuaXNWYWxpZEFjY291bnROYW1lKGEpLCJpbnZhbGlkIHRvIikpe2xldCBlPWF3YWl0IGFkZEJhbGFuY2Uocy5pc3N1ZXIscyxpLCJiYWxhbmNlcyIpOyEwPT09ZSYmYSE9PXMuaXNzdWVyJiZhd2FpdCBzdWJCYWxhbmNlKHMuaXNzdWVyLHMsaSwiYmFsYW5jZXMiKSYmITE9PT0oZT1hd2FpdCBhZGRCYWxhbmNlKGEscyxpLCJiYWxhbmNlcyIpKSYmYXdhaXQgYWRkQmFsYW5jZShzLmlzc3VlcixzLGksImJhbGFuY2VzIiksITA9PT1lJiYocy5zdXBwbHk9Y2FsY3VsYXRlQmFsYW5jZShzLnN1cHBseSxpLHMucHJlY2lzaW9uLCEwKSwibnVsbCIhPT1hJiYocy5jaXJjdWxhdGluZ1N1cHBseT1jYWxjdWxhdGVCYWxhbmNlKHMuY2lyY3VsYXRpbmdTdXBwbHksaSxzLnByZWNpc2lvbiwhMCkpLGF3YWl0IGFwaS5kYi51cGRhdGUoInRva2VucyIscyksYXBpLmVtaXQoInRyYW5zZmVyRnJvbUNvbnRyYWN0Iix7ZnJvbToidG9rZW5zIix0bzphLHN5bWJvbDp0LHF1YW50aXR5Oml9KSl9fX0pLGFjdGlvbnMuaXNzdWVUb0NvbnRyYWN0PShhc3luYyBhPT57Y29uc3R7dG86ZSxzeW1ib2w6dCxxdWFudGl0eTppLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpzfT1hO2lmKGFwaS5hc3NlcnQoITA9PT1zLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJnQmJiJzdHJpbmciPT10eXBlb2YgdCYmaSYmInN0cmluZyI9PXR5cGVvZiBpJiYhYXBpLkJpZ051bWJlcihpKS5pc05hTigpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWUudHJpbSgpLHM9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDp0fSk7aWYoYXBpLmFzc2VydChudWxsIT09cywic3ltYm9sIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQocy5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJub3QgYWxsb3dlZCB0byBpc3N1ZSB0b2tlbnMiKSYmYXBpLmFzc2VydChjb3VudERlY2ltYWxzKGkpPD1zLnByZWNpc2lvbiwic3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIoaSkuZ3QoMCksIm11c3QgaXNzdWUgcG9zaXRpdmUgcXVhbnRpdHkiKSYmYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHMubWF4U3VwcGx5KS5taW51cyhzLnN1cHBseSkuZ3RlKGkpLCJxdWFudGl0eSBleGNlZWRzIGF2YWlsYWJsZSBzdXBwbHkiKSYmYXBpLmFzc2VydChhLmxlbmd0aD49MyYmYS5sZW5ndGg8PTUwLCJpbnZhbGlkIHRvIikpeyEwPT09YXdhaXQgYWRkQmFsYW5jZShhLHMsaSwiY29udHJhY3RzQmFsYW5jZXMiKSYmKHMuc3VwcGx5PWNhbGN1bGF0ZUJhbGFuY2Uocy5zdXBwbHksaSxzLnByZWNpc2lvbiwhMCksIm51bGwiIT09YSYmKHMuY2lyY3VsYXRpbmdTdXBwbHk9Y2FsY3VsYXRlQmFsYW5jZShzLmNpcmN1bGF0aW5nU3VwcGx5LGkscy5wcmVjaXNpb24sITApKSxhd2FpdCBhcGkuZGIudXBkYXRlKCJ0b2tlbnMiLHMpLGFwaS5lbWl0KCJpc3N1ZVRvQ29udHJhY3QiLHtmcm9tOiJ0b2tlbnMiLHRvOmEsc3ltYm9sOnQscXVhbnRpdHk6aX0pKX19fSksYWN0aW9ucy50cmFuc2Zlcj0oYXN5bmMgYT0+e2NvbnN0e3RvOmUsc3ltYm9sOnQscXVhbnRpdHk6aSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6c309YTtpZihhcGkuYXNzZXJ0KCEwPT09cywieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoZSYmInN0cmluZyI9PXR5cGVvZiBlJiZ0JiYic3RyaW5nIj09dHlwZW9mIHQmJmkmJiJzdHJpbmciPT10eXBlb2YgaSYmIWFwaS5CaWdOdW1iZXIoaSkuaXNOYU4oKSwiaW52YWxpZCBwYXJhbXMiKSl7Y29uc3QgYT1lLnRyaW0oKTtpZihhcGkuYXNzZXJ0KGEhPT1hcGkuc2VuZGVyLCJjYW5ub3QgdHJhbnNmZXIgdG8gc2VsZiIpJiZhcGkuYXNzZXJ0KGFwaS5pc1ZhbGlkQWNjb3VudE5hbWUoYSksImludmFsaWQgdG8iKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgidG9rZW5zIix7c3ltYm9sOnR9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1lLCJzeW1ib2wgZG9lcyBub3QgZXhpc3QiKSYmYXBpLmFzc2VydChjb3VudERlY2ltYWxzKGkpPD1lLnByZWNpc2lvbiwic3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIoaSkuZ3QoMCksIm11c3QgdHJhbnNmZXIgcG9zaXRpdmUgcXVhbnRpdHkiKSYmYXdhaXQgc3ViQmFsYW5jZShhcGkuc2VuZGVyLGUsaSwiYmFsYW5jZXMiKSl7cmV0dXJuITE9PT1hd2FpdCBhZGRCYWxhbmNlKGEsZSxpLCJiYWxhbmNlcyIpPyhhd2FpdCBhZGRCYWxhbmNlKGFwaS5zZW5kZXIsZSxpLCJiYWxhbmNlcyIpLCExKTooIm51bGwiPT09YSYmKGUuY2lyY3VsYXRpbmdTdXBwbHk9Y2FsY3VsYXRlQmFsYW5jZShlLmNpcmN1bGF0aW5nU3VwcGx5LGksZS5wcmVjaXNpb24sITEpLGF3YWl0IGFwaS5kYi51cGRhdGUoInRva2VucyIsZSkpLGFwaS5lbWl0KCJ0cmFuc2ZlciIse2Zyb206YXBpLnNlbmRlcix0bzphLHN5bWJvbDp0LHF1YW50aXR5Oml9KSwhMCl9fX1yZXR1cm4hMX0pLGFjdGlvbnMudHJhbnNmZXJUb0NvbnRyYWN0PShhc3luYyBhPT57Y29uc3R7dG86ZSxzeW1ib2w6dCxxdWFudGl0eTppLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpzfT1hO2lmKGFwaS5hc3NlcnQoITA9PT1zLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJnQmJiJzdHJpbmciPT10eXBlb2YgdCYmaSYmInN0cmluZyI9PXR5cGVvZiBpJiYhYXBpLkJpZ051bWJlcihpKS5pc05hTigpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7aWYoYXBpLmFzc2VydChhIT09YXBpLnNlbmRlciwiY2Fubm90IHRyYW5zZmVyIHRvIHNlbGYiKSYmYXBpLmFzc2VydChhLmxlbmd0aD49MyYmYS5sZW5ndGg8PTUwLCJpbnZhbGlkIHRvIikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDp0fSk7aWYoYXBpLmFzc2VydChudWxsIT09ZSwic3ltYm9sIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoY291bnREZWNpbWFscyhpKTw9ZS5wcmVjaXNpb24sInN5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2giKSYmYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKGkpLmd0KDApLCJtdXN0IHRyYW5zZmVyIHBvc2l0aXZlIHF1YW50aXR5IikmJmF3YWl0IHN1YkJhbGFuY2UoYXBpLnNlbmRlcixlLGksImJhbGFuY2VzIikpeyExPT09YXdhaXQgYWRkQmFsYW5jZShhLGUsaSwiY29udHJhY3RzQmFsYW5jZXMiKT9hd2FpdCBhZGRCYWxhbmNlKGFwaS5zZW5kZXIsZSxpLCJiYWxhbmNlcyIpOigibnVsbCI9PT1hJiYoZS5jaXJjdWxhdGluZ1N1cHBseT1jYWxjdWxhdGVCYWxhbmNlKGUuY2lyY3VsYXRpbmdTdXBwbHksaSxlLnByZWNpc2lvbiwhMSksYXdhaXQgYXBpLmRiLnVwZGF0ZSgidG9rZW5zIixlKSksYXBpLmVtaXQoInRyYW5zZmVyVG9Db250cmFjdCIse2Zyb206YXBpLnNlbmRlcix0bzphLHN5bWJvbDp0LHF1YW50aXR5Oml9KSl9fX19KSxhY3Rpb25zLnRyYW5zZmVyRnJvbUNvbnRyYWN0PShhc3luYyBhPT57aWYoYXBpLmFzc2VydCgibnVsbCI9PT1hcGkuc2VuZGVyLCJub3QgYXV0aG9yaXplZCIpKXtjb25zdHtmcm9tOmUsdG86dCxzeW1ib2w6aSxxdWFudGl0eTpzLHR5cGU6bixpc1NpZ25lZFdpdGhBY3RpdmVLZXk6b309YSxsPVsidXNlciIsImNvbnRyYWN0Il07aWYoYXBpLmFzc2VydCghMD09PW8sInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmZSYmInN0cmluZyI9PXR5cGVvZiBlJiZpJiYic3RyaW5nIj09dHlwZW9mIGkmJm4mJmwuaW5jbHVkZXMobikmJnMmJiJzdHJpbmciPT10eXBlb2YgcyYmIWFwaS5CaWdOdW1iZXIocykuaXNOYU4oKSwiaW52YWxpZCBwYXJhbXMiKSl7Y29uc3QgYT10LnRyaW0oKSxvPSJ1c2VyIj09PW4/ImJhbGFuY2VzIjoiY29udHJhY3RzQmFsYW5jZXMiO2lmKGFwaS5hc3NlcnQoInVzZXIiPT09bnx8ImNvbnRyYWN0Ij09PW4mJmEhPT1lLCJjYW5ub3QgdHJhbnNmZXIgdG8gc2VsZiIpKXtjb25zdCB0PSJ1c2VyIj09PW4/YXBpLmlzVmFsaWRBY2NvdW50TmFtZShhKTphLmxlbmd0aD49MyYmYS5sZW5ndGg8PTUwO2lmKGFwaS5hc3NlcnQoITA9PT10LCJpbnZhbGlkIHRvIikpe2NvbnN0IHQ9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDppfSk7aWYoYXBpLmFzc2VydChudWxsIT09dCwic3ltYm9sIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoY291bnREZWNpbWFscyhzKTw9dC5wcmVjaXNpb24sInN5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2giKSYmYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKHMpLmd0KDApLCJtdXN0IHRyYW5zZmVyIHBvc2l0aXZlIHF1YW50aXR5IikmJmF3YWl0IHN1YkJhbGFuY2UoZSx0LHMsImNvbnRyYWN0c0JhbGFuY2VzIikpeyExPT09YXdhaXQgYWRkQmFsYW5jZShhLHQscyxvKT9hd2FpdCBhZGRCYWxhbmNlKGUsdCxzLCJjb250cmFjdHNCYWxhbmNlcyIpOigibnVsbCI9PT1hJiYodC5jaXJjdWxhdGluZ1N1cHBseT1jYWxjdWxhdGVCYWxhbmNlKHQuY2lyY3VsYXRpbmdTdXBwbHkscyx0LnByZWNpc2lvbiwhMSksYXdhaXQgYXBpLmRiLnVwZGF0ZSgidG9rZW5zIix0KSksYXBpLmVtaXQoInRyYW5zZmVyRnJvbUNvbnRyYWN0Iix7ZnJvbTplLHRvOmEsc3ltYm9sOmkscXVhbnRpdHk6c30pKX19fX19fSk7Y29uc3QgcHJvY2Vzc1Vuc3Rha2U9YXN5bmMgYT0+e2NvbnN0e2FjY291bnQ6ZSxzeW1ib2w6dCxxdWFudGl0eTppLHF1YW50aXR5TGVmdDpzLG51bWJlclRyYW5zYWN0aW9uc0xlZnQ6bn09YSxvPWEsbD1hd2FpdCBhcGkuZGIuZmluZE9uZSgiYmFsYW5jZXMiLHthY2NvdW50OmUsc3ltYm9sOnR9KSxwPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6dH0pO2xldCBjPTA7aWYoYXBpLmFzc2VydChudWxsIT09bCwiYmFsYW5jZSBkb2VzIG5vdCBleGlzdCIpJiYoMT09PW4/KGM9cyxhd2FpdCBhcGkuZGIucmVtb3ZlKCJwZW5kaW5nVW5zdGFrZXMiLGEpKTooYz1hcGkuQmlnTnVtYmVyKGkpLmRpdmlkZWRCeShwLm51bWJlclRyYW5zYWN0aW9ucykudG9GaXhlZChwLnByZWNpc2lvbixhcGkuQmlnTnVtYmVyLlJPVU5EX0RPV04pLG8ucXVhbnRpdHlMZWZ0PWFwaS5CaWdOdW1iZXIoby5xdWFudGl0eUxlZnQpLm1pbnVzKGMpLnRvRml4ZWQocC5wcmVjaXNpb24pLG8ubnVtYmVyVHJhbnNhY3Rpb25zTGVmdC09MSxvLm5leHRUcmFuc2FjdGlvblRpbWVzdGFtcD1hcGkuQmlnTnVtYmVyKG8ubmV4dFRyYW5zYWN0aW9uVGltZXN0YW1wKS5wbHVzKG8ubWlsbGlzZWNQZXJQZXJpb2QpLnRvTnVtYmVyKCksYXdhaXQgYXBpLmRiLnVwZGF0ZSgicGVuZGluZ1Vuc3Rha2VzIixvKSksYXBpLkJpZ051bWJlcihjKS5ndCgwKSkpe2NvbnN0IGE9bC5iYWxhbmNlLGk9bC5wZW5kaW5nVW5zdGFrZTtsLmJhbGFuY2U9Y2FsY3VsYXRlQmFsYW5jZShsLmJhbGFuY2UsYyxwLnByZWNpc2lvbiwhMCksbC5wZW5kaW5nVW5zdGFrZT1jYWxjdWxhdGVCYWxhbmNlKGwucGVuZGluZ1Vuc3Rha2UsYyxwLnByZWNpc2lvbiwhMSksYXBpLmFzc2VydChhcGkuQmlnTnVtYmVyKGwucGVuZGluZ1Vuc3Rha2UpLmx0KGkpJiZhcGkuQmlnTnVtYmVyKGwuYmFsYW5jZSkuZ3QoYSksImNhbm5vdCBzdWJ0cmFjdCIpJiYoYXdhaXQgYXBpLmRiLnVwZGF0ZSgiYmFsYW5jZXMiLGwpLHAudG90YWxTdGFrZWQ9Y2FsY3VsYXRlQmFsYW5jZShwLnRvdGFsU3Rha2VkLGMscC5wcmVjaXNpb24sITEpLGF3YWl0IGFwaS5kYi51cGRhdGUoInRva2VucyIscCksYXBpLmVtaXQoInVuc3Rha2UiLHthY2NvdW50OmUsc3ltYm9sOnQscXVhbnRpdHk6Y30pLCJTU0MiPT09dCYmYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ3aXRuZXNzZXMiLCJ1cGRhdGVXaXRuZXNzZXNBcHByb3ZhbHMiLHthY2NvdW50OmV9KSl9fTthY3Rpb25zLmNoZWNrUGVuZGluZ1Vuc3Rha2VzPShhc3luYygpPT57aWYoYXBpLmFzc2VydCgibnVsbCI9PT1hcGkuc2VuZGVyLCJub3QgYXV0aG9yaXplZCIpKXtjb25zdCBhPW5ldyBEYXRlKGAke2FwaS5zdGVlbUJsb2NrVGltZXN0YW1wfS4wMDBaYCkuZ2V0VGltZSgpO2xldCBlPWF3YWl0IGFwaS5kYi5maW5kKCJwZW5kaW5nVW5zdGFrZXMiLHtuZXh0VHJhbnNhY3Rpb25UaW1lc3RhbXA6eyRsdGU6YX19KSx0PWUubGVuZ3RoO2Zvcig7dD4wOyl7Zm9yKGxldCBhPTA7YTx0O2ErPTEpe2NvbnN0IHQ9ZVthXTthd2FpdCBwcm9jZXNzVW5zdGFrZSh0KX10PShlPWF3YWl0IGFwaS5kYi5maW5kKCJwZW5kaW5nVW5zdGFrZXMiLHtuZXh0VHJhbnNhY3Rpb25UaW1lc3RhbXA6eyRsdGU6YX19KSkubGVuZ3RofX19KSxhY3Rpb25zLmVuYWJsZVN0YWtpbmc9KGFzeW5jIGE9Pntjb25zdHtzeW1ib2w6ZSx1bnN0YWtpbmdDb29sZG93bjp0LG51bWJlclRyYW5zYWN0aW9uczppLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpzfT1hLG49YXdhaXQgYXBpLmRiLmZpbmRPbmUoInBhcmFtcyIse30pLHtlbmFibGVTdGFraW5nRmVlOm99PW4sbD1hd2FpdCBhcGkuZGIuZmluZE9uZSgiYmFsYW5jZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOiJTU0MifSkscD1sJiZhcGkuQmlnTnVtYmVyKGwuYmFsYW5jZSkuZ3RlKG8pLGM9dm9pZCAwPT09b3x8YXBpLkJpZ051bWJlcihvKS5sdGUoMCl8fHA7aWYoYXBpLmFzc2VydChjLCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgIGZlZXMiKSYmYXBpLmFzc2VydCghMD09PXMsInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KGUmJiJzdHJpbmciPT10eXBlb2YgZSwiaW52YWxpZCBzeW1ib2wiKSYmYXBpLmFzc2VydCh0JiZOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0PjAmJnQ8PTE4MjUwLCJ1bnN0YWtpbmdDb29sZG93biBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxODI1MCIpJiZhcGkuYXNzZXJ0KGkmJk51bWJlci5pc0ludGVnZXIoaSkmJmk+MCYmaTw9MTgyNTAsIm51bWJlclRyYW5zYWN0aW9ucyBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxODI1MCIpKXtjb25zdCBhPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6ZX0pO2FwaS5hc3NlcnQobnVsbCE9PWEsInN5bWJvbCBkb2VzIG5vdCBleGlzdCIpJiZhcGkuYXNzZXJ0KGEuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikmJmFwaS5hc3NlcnQodm9pZCAwPT09YS5zdGFraW5nRW5hYmxlZHx8ITE9PT1hLnN0YWtpbmdFbmFibGVkLCJzdGFraW5nIGFscmVhZHkgZW5hYmxlZCIpJiYoYS5zdGFraW5nRW5hYmxlZD0hMCxhLnRvdGFsU3Rha2VkPSIwIixhLnVuc3Rha2luZ0Nvb2xkb3duPXQsYS5udW1iZXJUcmFuc2FjdGlvbnM9aSxhd2FpdCBhcGkuZGIudXBkYXRlKCJ0b2tlbnMiLGEpLGFwaS5CaWdOdW1iZXIobykuZ3QoMCkmJmF3YWl0IGFjdGlvbnMudHJhbnNmZXIoe3RvOiJudWxsIixzeW1ib2w6IlNTQyIscXVhbnRpdHk6byxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6c30pKX19KSxhY3Rpb25zLnN0YWtlPShhc3luYyBhPT57Y29uc3R7c3ltYm9sOmUscXVhbnRpdHk6dCx0bzppLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpzfT1hO2lmKGFwaS5hc3NlcnQoITA9PT1zLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJmkmJiJzdHJpbmciPT10eXBlb2YgaSYmdCYmInN0cmluZyI9PXR5cGVvZiB0JiYhYXBpLkJpZ051bWJlcih0KS5pc05hTigpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6ZX0pLHM9aS50cmltKCk7aWYoYXBpLmFzc2VydChhcGkuaXNWYWxpZEFjY291bnROYW1lKHMpLCJpbnZhbGlkIHRvIikmJmFwaS5hc3NlcnQobnVsbCE9PWEsInN5bWJvbCBkb2VzIG5vdCBleGlzdCIpJiZhcGkuYXNzZXJ0KGNvdW50RGVjaW1hbHModCk8PWEucHJlY2lzaW9uLCJzeW1ib2wgcHJlY2lzaW9uIG1pc21hdGNoIikmJmFwaS5hc3NlcnQoITA9PT1hLnN0YWtpbmdFbmFibGVkLCJzdGFraW5nIG5vdCBlbmFibGVkIikmJmFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcih0KS5ndCgwKSwibXVzdCBzdGFrZSBwb3NpdGl2ZSBxdWFudGl0eSIpJiZhd2FpdCBzdWJCYWxhbmNlKGFwaS5zZW5kZXIsYSx0LCJiYWxhbmNlcyIpKXshMT09PWF3YWl0IGFkZFN0YWtlKHMsYSx0KT9hd2FpdCBhZGRCYWxhbmNlKGFwaS5zZW5kZXIsYSx0LCJiYWxhbmNlcyIpOihhcGkuZW1pdCgic3Rha2UiLHthY2NvdW50OnMsc3ltYm9sOmUscXVhbnRpdHk6dH0pLCJTU0MiPT09ZSYmYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ3aXRuZXNzZXMiLCJ1cGRhdGVXaXRuZXNzZXNBcHByb3ZhbHMiLHthY2NvdW50OmFwaS5zZW5kZXJ9KSl9fX0pLGFjdGlvbnMuc3Rha2VGcm9tQ29udHJhY3Q9KGFzeW5jIGE9Pntjb25zdHtzeW1ib2w6ZSxxdWFudGl0eTp0LHRvOmksY2FsbGluZ0NvbnRyYWN0SW5mbzpzfT1hO2lmKHMmJmFwaS5hc3NlcnQoZSYmInN0cmluZyI9PXR5cGVvZiBlJiZpJiYic3RyaW5nIj09dHlwZW9mIGkmJnQmJiJzdHJpbmciPT10eXBlb2YgdCYmIWFwaS5CaWdOdW1iZXIodCkuaXNOYU4oKSwiaW52YWxpZCBwYXJhbXMiKSl7Y29uc3QgYT1hd2FpdCBhcGkuZGIuZmluZE9uZSgidG9rZW5zIix7c3ltYm9sOmV9KSxuPWkudHJpbSgpO2lmKGFwaS5hc3NlcnQoYXBpLmlzVmFsaWRBY2NvdW50TmFtZShuKSwiaW52YWxpZCB0byIpJiZhcGkuYXNzZXJ0KG51bGwhPT1hLCJzeW1ib2wgZG9lcyBub3QgZXhpc3QiKSYmYXBpLmFzc2VydChjb3VudERlY2ltYWxzKHQpPD1hLnByZWNpc2lvbiwic3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCIpJiZhcGkuYXNzZXJ0KCEwPT09YS5zdGFraW5nRW5hYmxlZCwic3Rha2luZyBub3QgZW5hYmxlZCIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIodCkuZ3QoMCksIm11c3Qgc3Rha2UgcG9zaXRpdmUgcXVhbnRpdHkiKSYmYXdhaXQgc3ViQmFsYW5jZShzLm5hbWUsYSx0LCJjb250cmFjdHNCYWxhbmNlcyIpKXshMT09PWF3YWl0IGFkZFN0YWtlKG4sYSx0KT9hd2FpdCBhZGRCYWxhbmNlKHMubmFtZSxhLHQsImJhbGFuY2VzIik6KGFwaS5lbWl0KCJzdGFrZUZyb21Db250cmFjdCIse2FjY291bnQ6bixzeW1ib2w6ZSxxdWFudGl0eTp0fSksIlNTQyI9PT1lJiZhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoIndpdG5lc3NlcyIsInVwZGF0ZVdpdG5lc3Nlc0FwcHJvdmFscyIse2FjY291bnQ6bn0pKX19fSk7Y29uc3Qgc3RhcnRVbnN0YWtlPWFzeW5jKGEsZSx0KT0+e2NvbnN0IGk9bmV3IERhdGUoYCR7YXBpLnN0ZWVtQmxvY2tUaW1lc3RhbXB9LjAwMFpgKSxzPTI0KmUudW5zdGFraW5nQ29vbGRvd24qMzYwMCoxZTMsbj1hcGkuQmlnTnVtYmVyKHMpLmRpdmlkZWRCeShlLm51bWJlclRyYW5zYWN0aW9ucykuaW50ZWdlclZhbHVlKGFwaS5CaWdOdW1iZXIuUk9VTkRfRE9XTiksbz1hcGkuQmlnTnVtYmVyKGkuZ2V0VGltZSgpKS5wbHVzKG4pLnRvTnVtYmVyKCksbD17YWNjb3VudDphLHN5bWJvbDplLnN5bWJvbCxxdWFudGl0eTp0LHF1YW50aXR5TGVmdDp0LG5leHRUcmFuc2FjdGlvblRpbWVzdGFtcDpvLG51bWJlclRyYW5zYWN0aW9uc0xlZnQ6ZS5udW1iZXJUcmFuc2FjdGlvbnMsbWlsbGlzZWNQZXJQZXJpb2Q6bix0eElEOmFwaS50cmFuc2FjdGlvbklkfTthd2FpdCBhcGkuZGIuaW5zZXJ0KCJwZW5kaW5nVW5zdGFrZXMiLGwpfTthY3Rpb25zLnVuc3Rha2U9KGFzeW5jIGE9Pntjb25zdHtzeW1ib2w6ZSxxdWFudGl0eTp0LGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppfT1hO2lmKGFwaS5hc3NlcnQoITA9PT1pLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJnQmJiJzdHJpbmciPT10eXBlb2YgdCYmIWFwaS5CaWdOdW1iZXIodCkuaXNOYU4oKSwiaW52YWxpZCBwYXJhbXMiKSl7Y29uc3QgYT1hd2FpdCBhcGkuZGIuZmluZE9uZSgidG9rZW5zIix7c3ltYm9sOmV9KTthcGkuYXNzZXJ0KG51bGwhPT1hLCJzeW1ib2wgZG9lcyBub3QgZXhpc3QiKSYmYXBpLmFzc2VydCghMD09PWEuc3Rha2luZ0VuYWJsZWQsInN0YWtpbmcgbm90IGVuYWJsZWQiKSYmYXBpLmFzc2VydChjb3VudERlY2ltYWxzKHQpPD1hLnByZWNpc2lvbiwic3ltYm9sIHByZWNpc2lvbiBtaXNtYXRjaCIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIodCkuZ3QoMCksIm11c3QgdW5zdGFrZSBwb3NpdGl2ZSBxdWFudGl0eSIpJiZhd2FpdCBzdWJTdGFrZShhcGkuc2VuZGVyLGEsdCkmJihhd2FpdCBzdGFydFVuc3Rha2UoYXBpLnNlbmRlcixhLHQpLGFwaS5lbWl0KCJ1bnN0YWtlU3RhcnQiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOmUscXVhbnRpdHk6dH0pKX19KTtjb25zdCBwcm9jZXNzQ2FuY2VsVW5zdGFrZT1hc3luYyBhPT57Y29uc3R7YWNjb3VudDplLHN5bWJvbDp0LHF1YW50aXR5TGVmdDppfT1hLHM9YXdhaXQgYXBpLmRiLmZpbmRPbmUoImJhbGFuY2VzIix7YWNjb3VudDplLHN5bWJvbDp0fSksbj1hd2FpdCBhcGkuZGIuZmluZE9uZSgidG9rZW5zIix7c3ltYm9sOnR9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1zLCJiYWxhbmNlIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihzLnBlbmRpbmdVbnN0YWtlKS5ndGUoaSksIm92ZXJkcmF3biBwZW5kaW5nVW5zdGFrZSIpKXtjb25zdCBhPXMuc3Rha2Usbz1zLnBlbmRpbmdVbnN0YWtlO2lmKHMuc3Rha2U9Y2FsY3VsYXRlQmFsYW5jZShzLnN0YWtlLGksbi5wcmVjaXNpb24sITApLHMucGVuZGluZ1Vuc3Rha2U9Y2FsY3VsYXRlQmFsYW5jZShzLnBlbmRpbmdVbnN0YWtlLGksbi5wcmVjaXNpb24sITEpLGFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihzLnBlbmRpbmdVbnN0YWtlKS5sdChvKSYmYXBpLkJpZ051bWJlcihzLnN0YWtlKS5ndChhKSwiY2Fubm90IHN1YnRyYWN0IikpcmV0dXJuIGF3YWl0IGFwaS5kYi51cGRhdGUoImJhbGFuY2VzIixzKSxhcGkuZW1pdCgidW5zdGFrZSIse2FjY291bnQ6ZSxzeW1ib2w6dCxxdWFudGl0eTppfSksITB9cmV0dXJuITF9O2FjdGlvbnMuY2FuY2VsVW5zdGFrZT0oYXN5bmMgYT0+e2NvbnN0e3R4SUQ6ZSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6dH09YTtpZihhcGkuYXNzZXJ0KCEwPT09dCwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoZSYmInN0cmluZyI9PXR5cGVvZiBlLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWF3YWl0IGFwaS5kYi5maW5kT25lKCJwZW5kaW5nVW5zdGFrZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsdHhJRDplfSk7YXBpLmFzc2VydChhLCJ1bnN0YWtlIGRvZXMgbm90IGV4aXN0IikmJmF3YWl0IHByb2Nlc3NDYW5jZWxVbnN0YWtlKGEpJiZhd2FpdCBhcGkuZGIucmVtb3ZlKCJwZW5kaW5nVW5zdGFrZXMiLGEpfX0pLGFjdGlvbnMuZW5hYmxlRGVsZWdhdGlvbj0oYXN5bmMgYT0+e2NvbnN0e3N5bWJvbDplLHVuZGVsZWdhdGlvbkNvb2xkb3duOnQsaXNTaWduZWRXaXRoQWN0aXZlS2V5Oml9PWEscz1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse2VuYWJsZURlbGVnYXRpb25GZWU6bn09cyxvPWF3YWl0IGFwaS5kYi5maW5kT25lKCJiYWxhbmNlcyIse2FjY291bnQ6YXBpLnNlbmRlcixzeW1ib2w6IlNTQyJ9KSxsPW8mJmFwaS5CaWdOdW1iZXIoby5iYWxhbmNlKS5ndGUobikscD12b2lkIDA9PT1ufHxhcGkuQmlnTnVtYmVyKG4pLmx0ZSgwKXx8bDtpZihhcGkuYXNzZXJ0KHAsInlvdSBtdXN0IGhhdmUgZW5vdWdoIHRva2VucyB0byBjb3ZlciAgZmVlcyIpJiZhcGkuYXNzZXJ0KCEwPT09aSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoZSYmInN0cmluZyI9PXR5cGVvZiBlLCJpbnZhbGlkIHN5bWJvbCIpJiZhcGkuYXNzZXJ0KHQmJk51bWJlci5pc0ludGVnZXIodCkmJnQ+MCYmdDw9MTgyNTAsInVuZGVsZWdhdGlvbkNvb2xkb3duIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDE4MjUwIikpe2NvbnN0IGE9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDplfSk7YXBpLmFzc2VydChudWxsIT09YSwic3ltYm9sIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoYS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSYmYXBpLmFzc2VydCghMD09PWEuc3Rha2luZ0VuYWJsZWQsInN0YWtpbmcgbm90IGVuYWJsZWQiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1hLmRlbGVnYXRpb25FbmFibGVkfHwhMT09PWEuZGVsZWdhdGlvbkVuYWJsZWQsImRlbGVnYXRpb24gYWxyZWFkeSBlbmFibGVkIikmJihhLmRlbGVnYXRpb25FbmFibGVkPSEwLGEudW5kZWxlZ2F0aW9uQ29vbGRvd249dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJ0b2tlbnMiLGEpLGFwaS5CaWdOdW1iZXIobikuZ3QoMCkmJmF3YWl0IGFjdGlvbnMudHJhbnNmZXIoe3RvOiJudWxsIixzeW1ib2w6IlNTQyIscXVhbnRpdHk6bixpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aX0pKX19KSxhY3Rpb25zLmRlbGVnYXRlPShhc3luYyBhPT57Y29uc3R7c3ltYm9sOmUscXVhbnRpdHk6dCx0bzppLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpzfT1hO2lmKGFwaS5hc3NlcnQoITA9PT1zLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJmkmJiJzdHJpbmciPT10eXBlb2YgaSYmdCYmInN0cmluZyI9PXR5cGVvZiB0JiYhYXBpLkJpZ051bWJlcih0KS5pc05hTigpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWkudHJpbSgpO2lmKGFwaS5hc3NlcnQoYXBpLmlzVmFsaWRBY2NvdW50TmFtZShhKSwiaW52YWxpZCB0byIpKXtjb25zdCBpPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6ZX0pO2lmKGFwaS5hc3NlcnQobnVsbCE9PWksInN5bWJvbCBkb2VzIG5vdCBleGlzdCIpJiZhcGkuYXNzZXJ0KGNvdW50RGVjaW1hbHModCk8PWkucHJlY2lzaW9uLCJzeW1ib2wgcHJlY2lzaW9uIG1pc21hdGNoIikmJmFwaS5hc3NlcnQoITA9PT1pLmRlbGVnYXRpb25FbmFibGVkLCJkZWxlZ2F0aW9uIG5vdCBlbmFibGVkIikmJmFwaS5hc3NlcnQoYSE9PWFwaS5zZW5kZXIsImNhbm5vdCBkZWxlZ2F0ZSB0byB5b3Vyc2VsZiIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIodCkuZ3QoMCksIm11c3QgZGVsZWdhdGUgcG9zaXRpdmUgcXVhbnRpdHkiKSl7Y29uc3Qgcz1hd2FpdCBhcGkuZGIuZmluZE9uZSgiYmFsYW5jZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOmV9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1zLCJiYWxhbmNlRnJvbSBkb2VzIG5vdCBleGlzdCIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIocy5zdGFrZSkuZ3RlKHQpLCJvdmVyZHJhd24gc3Rha2UiKSl7dm9pZCAwPT09cy5zdGFrZT8ocy5zdGFrZT0iMCIscy5wZW5kaW5nVW5zdGFrZT0iMCIscy5kZWxlZ2F0aW9uc0luPSIwIixzLmRlbGVnYXRpb25zT3V0PSIwIixzLnBlbmRpbmdVbmRlbGVnYXRpb25zPSIwIik6dm9pZCAwPT09cy5kZWxlZ2F0aW9uc0luJiYocy5kZWxlZ2F0aW9uc0luPSIwIixzLmRlbGVnYXRpb25zT3V0PSIwIixzLnBlbmRpbmdVbmRlbGVnYXRpb25zPSIwIixzLmRlbGVnYXRlZFN0YWtlJiYoZGVsZXRlIHMuZGVsZWdhdGVkU3Rha2UsZGVsZXRlIHMucmVjZWl2ZWRTdGFrZSkpO2xldCBuPWF3YWl0IGFwaS5kYi5maW5kT25lKCJiYWxhbmNlcyIse2FjY291bnQ6YSxzeW1ib2w6ZX0pO251bGw9PT1uPygobj1iYWxhbmNlVGVtcGxhdGUpLmFjY291bnQ9YSxuLnN5bWJvbD1lLG49YXdhaXQgYXBpLmRiLmluc2VydCgiYmFsYW5jZXMiLG4pKTp2b2lkIDA9PT1uLnN0YWtlPyhuLnN0YWtlPSIwIixuLnBlbmRpbmdVbnN0YWtlPSIwIixuLmRlbGVnYXRpb25zSW49IjAiLG4uZGVsZWdhdGlvbnNPdXQ9IjAiLG4ucGVuZGluZ1VuZGVsZWdhdGlvbnM9IjAiKTp2b2lkIDA9PT1uLmRlbGVnYXRpb25zSW4mJihuLmRlbGVnYXRpb25zSW49IjAiLG4uZGVsZWdhdGlvbnNPdXQ9IjAiLG4ucGVuZGluZ1VuZGVsZWdhdGlvbnM9IjAiLG4uZGVsZWdhdGVkU3Rha2UmJihkZWxldGUgbi5kZWxlZ2F0ZWRTdGFrZSxkZWxldGUgbi5yZWNlaXZlZFN0YWtlKSk7bGV0IG89YXdhaXQgYXBpLmRiLmZpbmRPbmUoImRlbGVnYXRpb25zIix7dG86YSxmcm9tOmFwaS5zZW5kZXIsc3ltYm9sOmV9KTtjb25zdCBsPW5ldyBEYXRlKGAke2FwaS5zdGVlbUJsb2NrVGltZXN0YW1wfS4wMDBaYCkuZ2V0VGltZSgpO251bGw9PW8/KHMuc3Rha2U9Y2FsY3VsYXRlQmFsYW5jZShzLnN0YWtlLHQsaS5wcmVjaXNpb24sITEpLHMuZGVsZWdhdGlvbnNPdXQ9Y2FsY3VsYXRlQmFsYW5jZShzLmRlbGVnYXRpb25zT3V0LHQsaS5wcmVjaXNpb24sITApLGF3YWl0IGFwaS5kYi51cGRhdGUoImJhbGFuY2VzIixzKSxuLmRlbGVnYXRpb25zSW49Y2FsY3VsYXRlQmFsYW5jZShuLmRlbGVnYXRpb25zSW4sdCxpLnByZWNpc2lvbiwhMCksYXdhaXQgYXBpLmRiLnVwZGF0ZSgiYmFsYW5jZXMiLG4pLChvPXt9KS5mcm9tPWFwaS5zZW5kZXIsby50bz1hLG8uc3ltYm9sPWUsby5xdWFudGl0eT10LG8uY3JlYXRlZD1sLG8udXBkYXRlZD1sLGF3YWl0IGFwaS5kYi5pbnNlcnQoImRlbGVnYXRpb25zIixvKSxhcGkuZW1pdCgiZGVsZWdhdGUiLHt0bzphLHN5bWJvbDplLHF1YW50aXR5OnR9KSwiU1NDIj09PWUmJihhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoIndpdG5lc3NlcyIsInVwZGF0ZVdpdG5lc3Nlc0FwcHJvdmFscyIse2FjY291bnQ6YXBpLnNlbmRlcn0pLGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgid2l0bmVzc2VzIiwidXBkYXRlV2l0bmVzc2VzQXBwcm92YWxzIix7YWNjb3VudDphfSkpKToocy5zdGFrZT1jYWxjdWxhdGVCYWxhbmNlKHMuc3Rha2UsdCxpLnByZWNpc2lvbiwhMSkscy5kZWxlZ2F0aW9uc091dD1jYWxjdWxhdGVCYWxhbmNlKHMuZGVsZWdhdGlvbnNPdXQsdCxpLnByZWNpc2lvbiwhMCksYXdhaXQgYXBpLmRiLnVwZGF0ZSgiYmFsYW5jZXMiLHMpLG4uZGVsZWdhdGlvbnNJbj1jYWxjdWxhdGVCYWxhbmNlKG4uZGVsZWdhdGlvbnNJbix0LGkucHJlY2lzaW9uLCEwKSxhd2FpdCBhcGkuZGIudXBkYXRlKCJiYWxhbmNlcyIsbiksby5xdWFudGl0eT1jYWxjdWxhdGVCYWxhbmNlKG8ucXVhbnRpdHksdCxpLnByZWNpc2lvbiwhMCksby51cGRhdGVkPWwsYXdhaXQgYXBpLmRiLnVwZGF0ZSgiZGVsZWdhdGlvbnMiLG8pLGFwaS5lbWl0KCJkZWxlZ2F0ZSIse3RvOmEsc3ltYm9sOmUscXVhbnRpdHk6dH0pLCJTU0MiPT09ZSYmKGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgid2l0bmVzc2VzIiwidXBkYXRlV2l0bmVzc2VzQXBwcm92YWxzIix7YWNjb3VudDphcGkuc2VuZGVyfSksYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ3aXRuZXNzZXMiLCJ1cGRhdGVXaXRuZXNzZXNBcHByb3ZhbHMiLHthY2NvdW50OmF9KSkpfX19fX0pLGFjdGlvbnMudW5kZWxlZ2F0ZT0oYXN5bmMgYT0+e2NvbnN0e3N5bWJvbDplLHF1YW50aXR5OnQsZnJvbTppLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpzfT1hO2lmKGFwaS5hc3NlcnQoITA9PT1zLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChlJiYic3RyaW5nIj09dHlwZW9mIGUmJmkmJiJzdHJpbmciPT10eXBlb2YgaSYmdCYmInN0cmluZyI9PXR5cGVvZiB0JiYhYXBpLkJpZ051bWJlcih0KS5pc05hTigpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBhPWkudHJpbSgpO2lmKGFwaS5hc3NlcnQoYXBpLmlzVmFsaWRBY2NvdW50TmFtZShhKSwiaW52YWxpZCBmcm9tIikpe2NvbnN0IGk9YXdhaXQgYXBpLmRiLmZpbmRPbmUoInRva2VucyIse3N5bWJvbDplfSk7aWYoYXBpLmFzc2VydChudWxsIT09aSwic3ltYm9sIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoY291bnREZWNpbWFscyh0KTw9aS5wcmVjaXNpb24sInN5bWJvbCBwcmVjaXNpb24gbWlzbWF0Y2giKSYmYXBpLmFzc2VydCghMD09PWkuZGVsZWdhdGlvbkVuYWJsZWQsImRlbGVnYXRpb24gbm90IGVuYWJsZWQiKSYmYXBpLmFzc2VydChhIT09YXBpLnNlbmRlciwiY2Fubm90IHVuZGVsZWdhdGUgZnJvbSB5b3Vyc2VsZiIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIodCkuZ3QoMCksIm11c3QgdW5kZWxlZ2F0ZSBwb3NpdGl2ZSBxdWFudGl0eSIpKXtjb25zdCBzPWF3YWl0IGFwaS5kYi5maW5kT25lKCJiYWxhbmNlcyIse2FjY291bnQ6YXBpLnNlbmRlcixzeW1ib2w6ZX0pO2lmKGFwaS5hc3NlcnQobnVsbCE9PXMsImJhbGFuY2VUbyBkb2VzIG5vdCBleGlzdCIpJiZhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIocy5kZWxlZ2F0aW9uc091dCkuZ3RlKHQpLCJvdmVyZHJhd24gZGVsZWdhdGlvbiIpKXtjb25zdCBuPWF3YWl0IGFwaS5kYi5maW5kT25lKCJiYWxhbmNlcyIse2FjY291bnQ6YSxzeW1ib2w6ZX0pO2lmKGFwaS5hc3NlcnQobnVsbCE9PW4sImJhbGFuY2VGcm9tIGRvZXMgbm90IGV4aXN0Iikpe2NvbnN0IG89YXdhaXQgYXBpLmRiLmZpbmRPbmUoImRlbGVnYXRpb25zIix7dG86YSxmcm9tOmFwaS5zZW5kZXIsc3ltYm9sOmV9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1vLCJkZWxlZ2F0aW9uIGRvZXMgbm90IGV4aXN0IikmJmFwaS5hc3NlcnQoYXBpLkJpZ051bWJlcihvLnF1YW50aXR5KS5ndGUodCksIm92ZXJkcmF3biBkZWxlZ2F0aW9uIikpe3MucGVuZGluZ1VuZGVsZWdhdGlvbnM9Y2FsY3VsYXRlQmFsYW5jZShuLnBlbmRpbmdVbmRlbGVnYXRpb25zLHQsaS5wcmVjaXNpb24sITApLHMuZGVsZWdhdGlvbnNPdXQ9Y2FsY3VsYXRlQmFsYW5jZShzLmRlbGVnYXRpb25zT3V0LHQsaS5wcmVjaXNpb24sITEpLGF3YWl0IGFwaS5kYi51cGRhdGUoImJhbGFuY2VzIixzKSxuLmRlbGVnYXRpb25zSW49Y2FsY3VsYXRlQmFsYW5jZShuLmRlbGVnYXRpb25zSW4sdCxpLnByZWNpc2lvbiwhMSksYXdhaXQgYXBpLmRiLnVwZGF0ZSgiYmFsYW5jZXMiLG4pLG8ucXVhbnRpdHk9Y2FsY3VsYXRlQmFsYW5jZShvLnF1YW50aXR5LHQsaS5wcmVjaXNpb24sITEpLGFwaS5CaWdOdW1iZXIoby5xdWFudGl0eSkuZ3QoMCk/YXdhaXQgYXBpLmRiLnVwZGF0ZSgiZGVsZWdhdGlvbnMiLG8pOmF3YWl0IGFwaS5kYi5yZW1vdmUoImRlbGVnYXRpb25zIixvKTtjb25zdCBsPW5ldyBEYXRlKGAke2FwaS5zdGVlbUJsb2NrVGltZXN0YW1wfS4wMDBaYCkscD0yNCppLnVuZGVsZWdhdGlvbkNvb2xkb3duKjM2MDAqMWUzLGM9bC5nZXRUaW1lKCkrcCxyPXthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOmkuc3ltYm9sLHF1YW50aXR5OnQsY29tcGxldGVUaW1lc3RhbXA6Yyx0eElEOmFwaS50cmFuc2FjdGlvbklkfTthd2FpdCBhcGkuZGIuaW5zZXJ0KCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIsciksYXBpLmVtaXQoInVuZGVsZWdhdGVTdGFydCIse2Zyb206YSxzeW1ib2w6ZSxxdWFudGl0eTp0fSksIlNTQyI9PT1lJiZhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoIndpdG5lc3NlcyIsInVwZGF0ZVdpdG5lc3Nlc0FwcHJvdmFscyIse2FjY291bnQ6YX0pfX19fX19fSk7Y29uc3QgcHJvY2Vzc1VuZGVsZWdhdGlvbj1hc3luYyBhPT57Y29uc3R7YWNjb3VudDplLHN5bWJvbDp0LHF1YW50aXR5Oml9PWEscz1hd2FpdCBhcGkuZGIuZmluZE9uZSgiYmFsYW5jZXMiLHthY2NvdW50OmUsc3ltYm9sOnR9KSxuPWF3YWl0IGFwaS5kYi5maW5kT25lKCJ0b2tlbnMiLHtzeW1ib2w6dH0pO2lmKGFwaS5hc3NlcnQobnVsbCE9PXMsImJhbGFuY2UgZG9lcyBub3QgZXhpc3QiKSl7Y29uc3Qgbz1zLnN0YWtlLGw9cy5wZW5kaW5nVW5kZWxlZ2F0aW9ucztzLnN0YWtlPWNhbGN1bGF0ZUJhbGFuY2Uocy5zdGFrZSxpLG4ucHJlY2lzaW9uLCEwKSxzLnBlbmRpbmdVbmRlbGVnYXRpb25zPWNhbGN1bGF0ZUJhbGFuY2Uocy5wZW5kaW5nVW5kZWxlZ2F0aW9ucyxpLG4ucHJlY2lzaW9uLCExKSxhcGkuYXNzZXJ0KGFwaS5CaWdOdW1iZXIocy5wZW5kaW5nVW5kZWxlZ2F0aW9ucykubHQobCkmJmFwaS5CaWdOdW1iZXIocy5zdGFrZSkuZ3QobyksImNhbm5vdCBzdWJ0cmFjdCIpJiYoYXdhaXQgYXBpLmRiLnVwZGF0ZSgiYmFsYW5jZXMiLHMpLGF3YWl0IGFwaS5kYi5yZW1vdmUoInBlbmRpbmdVbmRlbGVnYXRpb25zIixhKSxhcGkuZW1pdCgidW5kZWxlZ2F0ZURvbmUiLHthY2NvdW50OmUsc3ltYm9sOnQscXVhbnRpdHk6aX0pLCJTU0MiPT09dCYmYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ3aXRuZXNzZXMiLCJ1cGRhdGVXaXRuZXNzZXNBcHByb3ZhbHMiLHthY2NvdW50OmV9KSl9fTthY3Rpb25zLmNoZWNrUGVuZGluZ1VuZGVsZWdhdGlvbnM9KGFzeW5jKCk9PntpZihhcGkuYXNzZXJ0KCJudWxsIj09PWFwaS5zZW5kZXIsIm5vdCBhdXRob3JpemVkIikpe2NvbnN0IGE9bmV3IERhdGUoYCR7YXBpLnN0ZWVtQmxvY2tUaW1lc3RhbXB9LjAwMFpgKS5nZXRUaW1lKCk7bGV0IGU9YXdhaXQgYXBpLmRiLmZpbmQoInBlbmRpbmdVbmRlbGVnYXRpb25zIix7Y29tcGxldGVUaW1lc3RhbXA6eyRsdGU6YX19KSx0PWUubGVuZ3RoO2Zvcig7dD4wOyl7Zm9yKGxldCBhPTA7YTx0O2ErPTEpe2NvbnN0IHQ9ZVthXTthd2FpdCBwcm9jZXNzVW5kZWxlZ2F0aW9uKHQpfXQ9KGU9YXdhaXQgYXBpLmRiLmZpbmQoInBlbmRpbmdVbmRlbGVnYXRpb25zIix7Y29tcGxldGVUaW1lc3RhbXA6eyRsdGU6YX19KSkubGVuZ3RofX19KTs="
}
}
}

{
"id": "ssc-00000000000000000002",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "test",
"params": "",
"code": "YWN0aW9ucy5jcmVhdGVTU0MgPSBhc3luYyAocGF5bG9hZCkgPT4gewogICAgICAgICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCd0ZXN0VXBkYXRlVGFibGUnKTsKICAgICAgICB9"
}
}
}

{
"id": "ssc-testnet1",
"json": {
"contractName": "contract",
"contractAction": "update",
"contractPayload": {
"name": "witnesses",
"params": "",
"code": "LyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqLwovKiBnbG9iYWwgYWN0aW9ucywgYXBpICovCgpjb25zdCBOQl9BUFBST1ZBTFNfQUxMT1dFRCA9IDMwOwpjb25zdCBOQl9UT1BfV0lUTkVTU0VTID0gNDsKY29uc3QgTkJfQkFDS1VQX1dJVE5FU1NFUyA9IDE7CmNvbnN0IE5CX1dJVE5FU1NFUyA9IE5CX1RPUF9XSVRORVNTRVMgKyBOQl9CQUNLVVBfV0lUTkVTU0VTOwpjb25zdCBOQl9XSVRORVNTRVNfU0lHTkFUVVJFU19SRVFVSVJFRCA9IDM7CmNvbnN0IE1BWF9ST1VORFNfTUlTU0VEX0lOX0FfUk9XID0gMzsgLy8gYWZ0ZXIgdGhhdCB0aGUgd2l0bmVzcyBpcyBkaXNhYmxlZApjb25zdCBNQVhfUk9VTkRfUFJPUE9TSVRJT05fV0FJVElOR19QRVJJT0QgPSA0MDsgLy8gMjAgYmxvY2tzCmNvbnN0IE5CX1RPS0VOU19UT19SRVdBUkQgPSAnMC4wMTkwMjU4Nyc7CmNvbnN0IE5CX1RPS0VOU19ORUVERURfQkVGT1JFX1JFV0FSRElORyA9ICcwLjA5NTEyOTM1JzsKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwpjb25zdCBVVElMSVRZX1RPS0VOX1NZTUJPTCA9ICJTU0MiOwovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nCmNvbnN0IFVUSUxJVFlfVE9LRU5fUFJFQ0lTSU9OID0gODsKLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZwpjb25zdCBVVElMSVRZX1RPS0VOX01JTl9WQUxVRSA9IDAuMDAwMDAwMDE7CgphY3Rpb25zLmNyZWF0ZVNTQyA9IGFzeW5jICgpID0+IHsKICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cygnd2l0bmVzc2VzJyk7CgogIGlmICh0YWJsZUV4aXN0cyA9PT0gZmFsc2UpIHsKICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgnd2l0bmVzc2VzJywgWydhcHByb3ZhbFdlaWdodCddKTsKICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgnYXBwcm92YWxzJywgWydmcm9tJywgJ3RvJ10pOwogICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdhY2NvdW50cycsIFsnYWNjb3VudCddKTsKICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgnc2NoZWR1bGVzJyk7CiAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoJ3BhcmFtcycpOwoKICAgIGNvbnN0IHBhcmFtcyA9IHsKICAgICAgdG90YWxBcHByb3ZhbFdlaWdodDogJzAnLAogICAgICBudW1iZXJPZkFwcHJvdmVkV2l0bmVzc2VzOiAwLAogICAgICBsYXN0VmVyaWZpZWRCbG9ja051bWJlcjogMCwKICAgICAgcm91bmQ6IDAsCiAgICAgIGxhc3RCbG9ja1JvdW5kOiAwLAogICAgICBjdXJyZW50V2l0bmVzczogbnVsbCwKICAgICAgYmxvY2tOdW1iZXJXaXRuZXNzQ2hhbmdlOiAwLAogICAgICBsYXN0V2l0bmVzc2VzOiBbXSwKICAgIH07CgogICAgYXdhaXQgYXBpLmRiLmluc2VydCgncGFyYW1zJywgcGFyYW1zKTsKICB9CgogIC8vIFRPRE86IGNsZWFudXAgd2hlbiBsYXVuY2hpbmcgZm9yIG1haW5uZXQgLyBuZXh0IHVwZGF0ZQogIGNvbnN0IHdpdG5lc3NlcyA9IGF3YWl0IGFwaS5kYi5maW5kKCd3aXRuZXNzZXMnLCB7IH0pOwoKICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgd2l0bmVzc2VzLmxlbmd0aDsgaW5kZXggKz0gMSkgewogICAgY29uc3Qgd2l0bmVzcyA9IHdpdG5lc3Nlc1tpbmRleF07CiAgICB3aXRuZXNzLm1pc3NlZFJvdW5kcyA9IDA7CiAgICB3aXRuZXNzLm1pc3NlZFJvdW5kc0luQVJvdyA9IDA7CiAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd3aXRuZXNzZXMnLCB3aXRuZXNzKTsKICB9CgogIGNvbnN0IHNjaGVkdWxlcyA9IGF3YWl0IGFwaS5kYi5maW5kKCdzY2hlZHVsZXMnLCB7IH0pOwoKICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NoZWR1bGVzLmxlbmd0aDsgaW5kZXggKz0gMSkgewogICAgY29uc3Qgc2NoZWR1bGUgPSBzY2hlZHVsZXNbaW5kZXhdOwogICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgnc2NoZWR1bGVzJywgc2NoZWR1bGUpOwogIH0KCiAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKICBwYXJhbXMuY3VycmVudFdpdG5lc3MgPSBudWxsOwogIHBhcmFtcy5ibG9ja051bWJlcldpdG5lc3NDaGFuZ2UgPSAwOwogIHBhcmFtcy5sYXN0V2l0bmVzc2VzID0gW107CiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncGFyYW1zJywgcGFyYW1zKTsKfTsKCmFjdGlvbnMucmVzZXRTY2hlZHVsZSA9IGFzeW5jICgpID0+IHsKICBpZiAoYXBpLnNlbmRlciAhPT0gYXBpLm93bmVyKSByZXR1cm47CgogIGNvbnN0IHNjaGVkdWxlcyA9IGF3YWl0IGFwaS5kYi5maW5kKCdzY2hlZHVsZXMnLCB7IH0pOwoKICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NoZWR1bGVzLmxlbmd0aDsgaW5kZXggKz0gMSkgewogICAgY29uc3Qgc2NoZWR1bGUgPSBzY2hlZHVsZXNbaW5kZXhdOwogICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgnc2NoZWR1bGVzJywgc2NoZWR1bGUpOwogIH0KCiAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKICBwYXJhbXMuY3VycmVudFdpdG5lc3MgPSBudWxsOwogIHBhcmFtcy5ibG9ja051bWJlcldpdG5lc3NDaGFuZ2UgPSAwOwogIHBhcmFtcy5sYXN0V2l0bmVzc2VzID0gW107CiAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncGFyYW1zJywgcGFyYW1zKTsKfTsKCmFjdGlvbnMuc2V0VGVzdEhwZyA9IGFzeW5jICgpID0+IHsKICBpZiAoYXBpLnNlbmRlciAhPT0gYXBpLm93bmVyKSByZXR1cm47CgogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CiAgcGFyYW1zLmN1cnJlbnRXaXRuZXNzID0gJ3Rlc3QuaHBnJzsKICBhd2FpdCBhcGkuZGIudXBkYXRlKCdwYXJhbXMnLCBwYXJhbXMpOwp9OwoKY29uc3QgdXBkYXRlV2l0bmVzc1JhbmsgPSBhc3luYyAod2l0bmVzcywgYXBwcm92YWxXZWlnaHQpID0+IHsKICAvLyBjaGVjayBpZiB3aXRuZXNzIGV4aXN0cwogIGNvbnN0IHdpdG5lc3NSZWMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnd2l0bmVzc2VzJywgeyBhY2NvdW50OiB3aXRuZXNzIH0pOwoKICBpZiAod2l0bmVzc1JlYykgewogICAgLy8gdXBkYXRlIHdpdG5lc3MgYXBwcm92YWxXZWlnaHQKICAgIGNvbnN0IG9sZEFwcHJvdmFsV2VpZ2h0ID0gd2l0bmVzc1JlYy5hcHByb3ZhbFdlaWdodC4kbnVtYmVyRGVjaW1hbDsKICAgIHdpdG5lc3NSZWMuYXBwcm92YWxXZWlnaHQuJG51bWJlckRlY2ltYWwgPSBhcGkuQmlnTnVtYmVyKAogICAgICB3aXRuZXNzUmVjLmFwcHJvdmFsV2VpZ2h0LiRudW1iZXJEZWNpbWFsLAogICAgKQogICAgICAucGx1cyhhcHByb3ZhbFdlaWdodCkKICAgICAgLnRvRml4ZWQoVVRJTElUWV9UT0tFTl9QUkVDSVNJT04pOwoKICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3dpdG5lc3NlcycsIHdpdG5lc3NSZWMpOwoKICAgIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CgogICAgLy8gdXBkYXRlIHRvdGFsQXBwcm92YWxXZWlnaHQKICAgIHBhcmFtcy50b3RhbEFwcHJvdmFsV2VpZ2h0ID0gYXBpLkJpZ051bWJlcihwYXJhbXMudG90YWxBcHByb3ZhbFdlaWdodCkKICAgICAgLnBsdXMoYXBwcm92YWxXZWlnaHQpCiAgICAgIC50b0ZpeGVkKFVUSUxJVFlfVE9LRU5fUFJFQ0lTSU9OKTsKCiAgICAvLyB1cGRhdGUgbnVtYmVyT2ZBcHByb3ZlZFdpdG5lc3NlcwogICAgaWYgKGFwaS5CaWdOdW1iZXIob2xkQXBwcm92YWxXZWlnaHQpLmVxKDApCiAgICAgICYmIGFwaS5CaWdOdW1iZXIod2l0bmVzc1JlYy5hcHByb3ZhbFdlaWdodC4kbnVtYmVyRGVjaW1hbCkuZ3QoMCkpIHsKICAgICAgcGFyYW1zLm51bWJlck9mQXBwcm92ZWRXaXRuZXNzZXMgKz0gMTsKICAgIH0gZWxzZSBpZiAoYXBpLkJpZ051bWJlcihvbGRBcHByb3ZhbFdlaWdodCkuZ3QoMCkKICAgICAgJiYgYXBpLkJpZ051bWJlcih3aXRuZXNzUmVjLmFwcHJvdmFsV2VpZ2h0LiRudW1iZXJEZWNpbWFsKS5lcSgwKSkgewogICAgICBwYXJhbXMubnVtYmVyT2ZBcHByb3ZlZFdpdG5lc3NlcyAtPSAxOwogICAgfQoKICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3BhcmFtcycsIHBhcmFtcyk7CiAgfQp9OwoKYWN0aW9ucy51cGRhdGVXaXRuZXNzZXNBcHByb3ZhbHMgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsgYWNjb3VudCwgY2FsbGluZ0NvbnRyYWN0SW5mbyB9ID0gcGF5bG9hZDsKCiAgaWYgKGNhbGxpbmdDb250cmFjdEluZm8gPT09IHVuZGVmaW5lZCkgcmV0dXJuOwogIGlmIChjYWxsaW5nQ29udHJhY3RJbmZvLm5hbWUgIT09ICd0b2tlbnMnKSByZXR1cm47CgogIGNvbnN0IGFjY3QgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnYWNjb3VudHMnLCB7IGFjY291bnQgfSk7CiAgaWYgKGFjY3QgIT09IG51bGwpIHsKICAgIC8vIGNhbGN1bGF0ZSBhcHByb3ZhbCB3ZWlnaHQgb2YgdGhlIGFjY291bnQKICAgIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdiYWxhbmNlcycsIHsgYWNjb3VudCwgc3ltYm9sOiBVVElMSVRZX1RPS0VOX1NZTUJPTCB9KTsKICAgIGxldCBhcHByb3ZhbFdlaWdodCA9IDA7CiAgICBpZiAoYmFsYW5jZSAmJiBiYWxhbmNlLnN0YWtlKSB7CiAgICAgIGFwcHJvdmFsV2VpZ2h0ID0gYmFsYW5jZS5zdGFrZTsKICAgIH0KCiAgICBpZiAoYmFsYW5jZSAmJiBiYWxhbmNlLnBlbmRpbmdVbnN0YWtlKSB7CiAgICAgIGFwcHJvdmFsV2VpZ2h0ID0gYXBpLkJpZ051bWJlcihhcHByb3ZhbFdlaWdodCkKICAgICAgICAucGx1cyhiYWxhbmNlLnBlbmRpbmdVbnN0YWtlKQogICAgICAgIC50b0ZpeGVkKFVUSUxJVFlfVE9LRU5fUFJFQ0lTSU9OKTsKICAgIH0KCiAgICBpZiAoYmFsYW5jZSAmJiBiYWxhbmNlLmRlbGVnYXRpb25zSW4pIHsKICAgICAgYXBwcm92YWxXZWlnaHQgPSBhcGkuQmlnTnVtYmVyKGFwcHJvdmFsV2VpZ2h0KQogICAgICAgIC5wbHVzKGJhbGFuY2UuZGVsZWdhdGlvbnNJbikKICAgICAgICAudG9GaXhlZChVVElMSVRZX1RPS0VOX1BSRUNJU0lPTik7CiAgICB9CgogICAgY29uc3Qgb2xkQXBwcm92YWxXZWlnaHQgPSBhY2N0LmFwcHJvdmFsV2VpZ2h0OwoKICAgIGNvbnN0IGRlbHRhQXBwcm92YWxXZWlnaHQgPSBhcGkuQmlnTnVtYmVyKGFwcHJvdmFsV2VpZ2h0KQogICAgICAubWludXMob2xkQXBwcm92YWxXZWlnaHQpCiAgICAgIC50b0ZpeGVkKFVUSUxJVFlfVE9LRU5fUFJFQ0lTSU9OKTsKCiAgICBhY2N0LmFwcHJvdmFsV2VpZ2h0ID0gYXBwcm92YWxXZWlnaHQ7CgogICAgaWYgKCFhcGkuQmlnTnVtYmVyKGRlbHRhQXBwcm92YWxXZWlnaHQpLmVxKDApKSB7CiAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ2FjY291bnRzJywgYWNjdCk7CgogICAgICBjb25zdCBhcHByb3ZhbHMgPSBhd2FpdCBhcGkuZGIuZmluZCgnYXBwcm92YWxzJywgeyBmcm9tOiBhY2NvdW50IH0pOwoKICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFwcHJvdmFscy5sZW5ndGg7IGluZGV4ICs9IDEpIHsKICAgICAgICBjb25zdCBhcHByb3ZhbCA9IGFwcHJvdmFsc1tpbmRleF07CiAgICAgICAgYXdhaXQgdXBkYXRlV2l0bmVzc1JhbmsoYXBwcm92YWwudG8sIGRlbHRhQXBwcm92YWxXZWlnaHQpOwogICAgICB9CiAgICB9CiAgfQp9OwoKYWN0aW9ucy5yZWdpc3RlciA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgewogICAgSVAsIFJQQ1BvcnQsIFAyUFBvcnQsIHNpZ25pbmdLZXksIGVuYWJsZWQsIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAnYWN0aXZlIGtleSByZXF1aXJlZCcpCiAgICAmJiBhcGkuYXNzZXJ0KElQICYmIHR5cGVvZiBJUCA9PT0gJ3N0cmluZycgJiYgYXBpLnZhbGlkYXRvci5pc0lQKElQKSwgJ0lQIGlzIGludmFsaWQnKQogICAgJiYgYXBpLmFzc2VydChSUENQb3J0ICYmIE51bWJlci5pc0ludGVnZXIoUlBDUG9ydCkgJiYgUlBDUG9ydCA+PSAwICYmIFJQQ1BvcnQgPD0gNjU1MzUsICdSUENQb3J0IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDY1NTM1JykKICAgICYmIGFwaS5hc3NlcnQoUDJQUG9ydCAmJiBOdW1iZXIuaXNJbnRlZ2VyKFAyUFBvcnQpICYmIFAyUFBvcnQgPj0gMCAmJiBQMlBQb3J0IDw9IDY1NTM1LCAnUDJQUG9ydCBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA2NTUzNScpCiAgICAmJiBhcGkuYXNzZXJ0KGFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMoc2lnbmluZ0tleSkgJiYgc2lnbmluZ0tleS5sZW5ndGggPT09IDUzLCAnaW52YWxpZCBzaWduaW5nIGtleScpCiAgICAmJiBhcGkuYXNzZXJ0KHR5cGVvZiBlbmFibGVkID09PSAnYm9vbGVhbicsICdlbmFibGVkIG11c3QgYmUgYSBib29sZWFuJykpIHsKICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFscmVhZHkgYSB3aXRuZXNzIHdpdGggdGhlIHNhbWUgc2lnbmluZyBrZXkKICAgIGxldCB3aXRuZXNzID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3dpdG5lc3NlcycsIHsgc2lnbmluZ0tleSB9KTsKCiAgICBpZiAoYXBpLmFzc2VydCh3aXRuZXNzID09PSBudWxsIHx8IHdpdG5lc3MuYWNjb3VudCA9PT0gYXBpLnNlbmRlciwgJ2Egd2l0bmVzcyBpcyBhbHJlYWR5IHVzaW5nIHRoaXMgc2lnbmluZyBrZXknKSkgewogICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgd2l0bmVzcyB3aXRoIHRoZSBzYW1lIElQL1BvcnQKICAgICAgd2l0bmVzcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd3aXRuZXNzZXMnLCB7IElQLCBQMlBQb3J0IH0pOwoKICAgICAgaWYgKGFwaS5hc3NlcnQod2l0bmVzcyA9PT0gbnVsbCB8fCB3aXRuZXNzLmFjY291bnQgPT09IGFwaS5zZW5kZXIsICdhIHdpdG5lc3MgaXMgYWxyZWFkeSB1c2luZyB0aGlzIElQL1BvcnQnKSkgewogICAgICAgIHdpdG5lc3MgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnd2l0bmVzc2VzJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyIH0pOwoKICAgICAgICAvLyBpZiB0aGUgd2l0bmVzcyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQKICAgICAgICBpZiAod2l0bmVzcykgewogICAgICAgICAgd2l0bmVzcy5JUCA9IElQOwogICAgICAgICAgd2l0bmVzcy5SUENQb3J0ID0gUlBDUG9ydDsKICAgICAgICAgIHdpdG5lc3MuUDJQUG9ydCA9IFAyUFBvcnQ7CiAgICAgICAgICB3aXRuZXNzLnNpZ25pbmdLZXkgPSBzaWduaW5nS2V5OwogICAgICAgICAgd2l0bmVzcy5lbmFibGVkID0gZW5hYmxlZDsKICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3dpdG5lc3NlcycsIHdpdG5lc3MpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3aXRuZXNzID0gewogICAgICAgICAgICBhY2NvdW50OiBhcGkuc2VuZGVyLAogICAgICAgICAgICBhcHByb3ZhbFdlaWdodDogeyAkbnVtYmVyRGVjaW1hbDogJzAnIH0sCiAgICAgICAgICAgIHNpZ25pbmdLZXksCiAgICAgICAgICAgIElQLAogICAgICAgICAgICBSUENQb3J0LAogICAgICAgICAgICBQMlBQb3J0LAogICAgICAgICAgICBlbmFibGVkLAogICAgICAgICAgICBtaXNzZWRSb3VuZHM6IDAsCiAgICAgICAgICAgIG1pc3NlZFJvdW5kc0luQVJvdzogMCwKICAgICAgICAgICAgdmVyaWZpZWRSb3VuZHM6IDAsCiAgICAgICAgICAgIGxhc3RSb3VuZFZlcmlmaWVkOiBudWxsLAogICAgICAgICAgICBsYXN0QmxvY2tWZXJpZmllZDogbnVsbCwKICAgICAgICAgIH07CiAgICAgICAgICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCd3aXRuZXNzZXMnLCB3aXRuZXNzKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn07CgphY3Rpb25zLmFwcHJvdmUgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsgd2l0bmVzcyB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQod2l0bmVzcyAmJiB0eXBlb2Ygd2l0bmVzcyA9PT0gJ3N0cmluZycgJiYgd2l0bmVzcy5sZW5ndGggPj0gMyAmJiB3aXRuZXNzLmxlbmd0aCA8PSAxNiwgJ2ludmFsaWQgd2l0bmVzcyBhY2NvdW50JykpIHsKICAgIC8vIGNoZWNrIGlmIHdpdG5lc3MgZXhpc3RzCiAgICBjb25zdCB3aXRuZXNzUmVjID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3dpdG5lc3NlcycsIHsgYWNjb3VudDogd2l0bmVzcyB9KTsKCiAgICBpZiAoYXBpLmFzc2VydCh3aXRuZXNzUmVjLCAnd2l0bmVzcyBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAgIGxldCBhY2N0ID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ2FjY291bnRzJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyIH0pOwoKICAgICAgaWYgKGFjY3QgPT09IG51bGwpIHsKICAgICAgICBhY2N0ID0gewogICAgICAgICAgYWNjb3VudDogYXBpLnNlbmRlciwKICAgICAgICAgIGFwcHJvdmFsczogMCwKICAgICAgICAgIGFwcHJvdmFsV2VpZ2h0OiB7ICRudW1iZXJEZWNpbWFsOiAnMCcgfSwKICAgICAgICB9OwoKICAgICAgICBhY2N0ID0gYXdhaXQgYXBpLmRiLmluc2VydCgnYWNjb3VudHMnLCBhY2N0KTsKICAgICAgfQoKICAgICAgLy8gYSB1c2VyIGNhbiBhcHByb3ZlIE5CX0FQUFJPVkFMU19BTExPV0VEIHdpdG5lc3NlcyBvbmx5CiAgICAgIGlmIChhcGkuYXNzZXJ0KGFjY3QuYXBwcm92YWxzIDwgTkJfQVBQUk9WQUxTX0FMTE9XRUQsIGB5b3UgY2FuIG9ubHkgYXBwcm92ZSAke05CX0FQUFJPVkFMU19BTExPV0VEfSB3aXRuZXNzZXNgKSkgewogICAgICAgIGxldCBhcHByb3ZhbCA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdhcHByb3ZhbHMnLCB7IGZyb206IGFwaS5zZW5kZXIsIHRvOiB3aXRuZXNzIH0pOwoKICAgICAgICBpZiAoYXBpLmFzc2VydChhcHByb3ZhbCA9PT0gbnVsbCwgJ3lvdSBhbHJlYWR5IGFwcHJvdmVkIHRoaXMgd2l0bmVzcycpKSB7CiAgICAgICAgICBhcHByb3ZhbCA9IHsKICAgICAgICAgICAgZnJvbTogYXBpLnNlbmRlciwKICAgICAgICAgICAgdG86IHdpdG5lc3MsCiAgICAgICAgICB9OwogICAgICAgICAgYXdhaXQgYXBpLmRiLmluc2VydCgnYXBwcm92YWxzJywgYXBwcm92YWwpOwoKICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgcmFuayBvZiB0aGUgd2l0bmVzcyB0aGF0IHJlY2VpdmVkIHRoZSBhcHByb3ZhbAogICAgICAgICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgndG9rZW5zJywgJ2JhbGFuY2VzJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyLCBzeW1ib2w6IFVUSUxJVFlfVE9LRU5fU1lNQk9MIH0pOwogICAgICAgICAgbGV0IGFwcHJvdmFsV2VpZ2h0ID0gMDsKICAgICAgICAgIGlmIChiYWxhbmNlICYmIGJhbGFuY2Uuc3Rha2UpIHsKICAgICAgICAgICAgYXBwcm92YWxXZWlnaHQgPSBiYWxhbmNlLnN0YWtlOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChiYWxhbmNlICYmIGJhbGFuY2UucGVuZGluZ1Vuc3Rha2UpIHsKICAgICAgICAgICAgYXBwcm92YWxXZWlnaHQgPSBhcGkuQmlnTnVtYmVyKGFwcHJvdmFsV2VpZ2h0KQogICAgICAgICAgICAgIC5wbHVzKGJhbGFuY2UucGVuZGluZ1Vuc3Rha2UpCiAgICAgICAgICAgICAgLnRvRml4ZWQoVVRJTElUWV9UT0tFTl9QUkVDSVNJT04pOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChiYWxhbmNlICYmIGJhbGFuY2UuZGVsZWdhdGlvbnNJbikgewogICAgICAgICAgICBhcHByb3ZhbFdlaWdodCA9IGFwaS5CaWdOdW1iZXIoYXBwcm92YWxXZWlnaHQpCiAgICAgICAgICAgICAgLnBsdXMoYmFsYW5jZS5kZWxlZ2F0aW9uc0luKQogICAgICAgICAgICAgIC50b0ZpeGVkKFVUSUxJVFlfVE9LRU5fUFJFQ0lTSU9OKTsKICAgICAgICAgIH0KCiAgICAgICAgICBhY2N0LmFwcHJvdmFscyArPSAxOwogICAgICAgICAgYWNjdC5hcHByb3ZhbFdlaWdodCA9IGFwcHJvdmFsV2VpZ2h0OwoKICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ2FjY291bnRzJywgYWNjdCk7CgogICAgICAgICAgYXdhaXQgdXBkYXRlV2l0bmVzc1Jhbmsod2l0bmVzcywgYXBwcm92YWxXZWlnaHQpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCmFjdGlvbnMuZGlzYXBwcm92ZSA9IGFzeW5jIChwYXlsb2FkKSA9PiB7CiAgY29uc3QgeyB3aXRuZXNzIH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydCh3aXRuZXNzICYmIHR5cGVvZiB3aXRuZXNzID09PSAnc3RyaW5nJyAmJiB3aXRuZXNzLmxlbmd0aCA+PSAzICYmIHdpdG5lc3MubGVuZ3RoIDw9IDE2LCAnaW52YWxpZCB3aXRuZXNzIGFjY291bnQnKSkgewogICAgLy8gY2hlY2sgaWYgd2l0bmVzcyBleGlzdHMKICAgIGNvbnN0IHdpdG5lc3NSZWMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnd2l0bmVzc2VzJywgeyBhY2NvdW50OiB3aXRuZXNzIH0pOwoKCiAgICBpZiAoYXBpLmFzc2VydCh3aXRuZXNzUmVjLCAnd2l0bmVzcyBkb2VzIG5vdCBleGlzdCcpKSB7CiAgICAgIGxldCBhY2N0ID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ2FjY291bnRzJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyIH0pOwoKICAgICAgaWYgKGFjY3QgPT09IG51bGwpIHsKICAgICAgICBhY2N0ID0gewogICAgICAgICAgYWNjb3VudDogYXBpLnNlbmRlciwKICAgICAgICAgIGFwcHJvdmFsczogMCwKICAgICAgICAgIGFwcHJvdmFsV2VpZ2h0OiB7ICRudW1iZXJEZWNpbWFsOiAnMCcgfSwKICAgICAgICB9OwoKICAgICAgICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCdhY2NvdW50cycsIGFjY3QpOwogICAgICB9CgogICAgICAvLyBhIHVzZXIgY2FuIG9ubHkgZGlzYXBwcm92ZSBpZiBpdCBhbHJlYWR5IGFwcHJvdmVkIGEgd2l0bmVzcwogICAgICBpZiAoYXBpLmFzc2VydChhY2N0LmFwcHJvdmFscyA+IDAsICdubyBhcHByb3ZhbHMgZm91bmQnKSkgewogICAgICAgIGNvbnN0IGFwcHJvdmFsID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ2FwcHJvdmFscycsIHsgZnJvbTogYXBpLnNlbmRlciwgdG86IHdpdG5lc3MgfSk7CgogICAgICAgIGlmIChhcGkuYXNzZXJ0KGFwcHJvdmFsICE9PSBudWxsLCAneW91IGhhdmUgbm90IGFwcHJvdmVkIHRoaXMgd2l0bmVzcycpKSB7CiAgICAgICAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKCdhcHByb3ZhbHMnLCBhcHByb3ZhbCk7CgogICAgICAgICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgndG9rZW5zJywgJ2JhbGFuY2VzJywgeyBhY2NvdW50OiBhcGkuc2VuZGVyLCBzeW1ib2w6IFVUSUxJVFlfVE9LRU5fU1lNQk9MIH0pOwogICAgICAgICAgbGV0IGFwcHJvdmFsV2VpZ2h0ID0gMDsKICAgICAgICAgIGlmIChiYWxhbmNlICYmIGJhbGFuY2Uuc3Rha2UpIHsKICAgICAgICAgICAgYXBwcm92YWxXZWlnaHQgPSBiYWxhbmNlLnN0YWtlOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChiYWxhbmNlICYmIGJhbGFuY2UuZGVsZWdhdGlvbnNJbikgewogICAgICAgICAgICBhcHByb3ZhbFdlaWdodCA9IGFwaS5CaWdOdW1iZXIoYXBwcm92YWxXZWlnaHQpCiAgICAgICAgICAgICAgLnBsdXMoYmFsYW5jZS5kZWxlZ2F0aW9uc0luKQogICAgICAgICAgICAgIC50b0ZpeGVkKFVUSUxJVFlfVE9LRU5fUFJFQ0lTSU9OKTsKICAgICAgICAgIH0KCiAgICAgICAgICBhY2N0LmFwcHJvdmFscyAtPSAxOwogICAgICAgICAgYWNjdC5hcHByb3ZhbFdlaWdodCA9IGFwcHJvdmFsV2VpZ2h0OwoKICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ2FjY291bnRzJywgYWNjdCk7CgogICAgICAgICAgLy8gdXBkYXRlIHRoZSByYW5rIG9mIHRoZSB3aXRuZXNzIHRoYXQgcmVjZWl2ZWQgdGhlIGRpc2FwcHJvdmFsCiAgICAgICAgICBhd2FpdCB1cGRhdGVXaXRuZXNzUmFuayh3aXRuZXNzLCBgLSR7YXBwcm92YWxXZWlnaHR9YCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9OwoKY29uc3QgY2hhbmdlQ3VycmVudFdpdG5lc3MgPSBhc3luYyAoKSA9PiB7CiAgY29uc3QgcGFyYW1zID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3BhcmFtcycsIHt9KTsKICBjb25zdCB7CiAgICBjdXJyZW50V2l0bmVzcywKICAgIHRvdGFsQXBwcm92YWxXZWlnaHQsCiAgICBsYXN0V2l0bmVzc2VzLAogICAgbGFzdEJsb2NrUm91bmQsCiAgICByb3VuZCwKICB9ID0gcGFyYW1zOwoKICBsZXQgd2l0bmVzc0ZvdW5kID0gZmFsc2U7CiAgLy8gZ2V0IGEgZGV0ZXJtaW5pc3RpYyByYW5kb20gd2VpZ2h0CiAgY29uc3QgcmFuZG9tID0gYXBpLnJhbmRvbSgpOwogIGNvbnN0IHJhbmRvbVdlaWdodCA9IGFwaS5CaWdOdW1iZXIodG90YWxBcHByb3ZhbFdlaWdodCkKICAgIC50aW1lcyhyYW5kb20pCiAgICAudG9GaXhlZChVVElMSVRZX1RPS0VOX1BSRUNJU0lPTik7CgogIGxldCBvZmZzZXQgPSAwOwogIGxldCBhY2NXZWlnaHQgPSAwOwoKICBsZXQgd2l0bmVzc2VzID0gYXdhaXQgYXBpLmRiLmZpbmQoCiAgICAnd2l0bmVzc2VzJywKICAgIHsKICAgICAgYXBwcm92YWxXZWlnaHQ6IHsKICAgICAgICAkZ3Q6IHsKICAgICAgICAgICRudW1iZXJEZWNpbWFsOiAnMCcsCiAgICAgICAgfSwKICAgICAgfSwKICAgIH0sCiAgICAxMDAsIC8vIGxpbWl0CiAgICBvZmZzZXQsIC8vIG9mZnNldAogICAgWwogICAgICB7IGluZGV4OiAnYXBwcm92YWxXZWlnaHQnLCBkZXNjZW5kaW5nOiB0cnVlIH0sCiAgICBdLAogICk7CiAgLy8gZ2V0IHRoZSB3aXRuZXNzZXMgb24gc2NoZWR1bGUKICBjb25zdCBzY2hlZHVsZXMgPSBhd2FpdCBhcGkuZGIuZmluZCgnc2NoZWR1bGVzJywgeyByb3VuZCB9KTsKCiAgY29uc3QgcHJldmlvdXNSb3VuZFdpdG5lc3MgPSBsYXN0V2l0bmVzc2VzLmxlbmd0aCA+IDEgPyBsYXN0V2l0bmVzc2VzW2xhc3RXaXRuZXNzZXMubGVuZ3RoIC0gMl0gOiAnJzsKCiAgLy8gZ2V0IHRoZSBjdXJyZW50IHNjaGVkdWxlCiAgY29uc3Qgc2NoZWR1bGUgPSBhd2FpdCBhcGkuZGIKICAgIC5maW5kT25lKCdzY2hlZHVsZXMnLCB7IHJvdW5kLCB3aXRuZXNzOiBjdXJyZW50V2l0bmVzcywgYmxvY2tOdW1iZXI6IGxhc3RCbG9ja1JvdW5kIH0pOwoKICBkbyB7CiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgd2l0bmVzc2VzLmxlbmd0aDsgaW5kZXggKz0gMSkgewogICAgICBjb25zdCB3aXRuZXNzID0gd2l0bmVzc2VzW2luZGV4XTsKCiAgICAgIGFjY1dlaWdodCA9IGFwaS5CaWdOdW1iZXIoYWNjV2VpZ2h0KQogICAgICAgIC5wbHVzKHdpdG5lc3MuYXBwcm92YWxXZWlnaHQuJG51bWJlckRlY2ltYWwpCiAgICAgICAgLnRvRml4ZWQoVVRJTElUWV9UT0tFTl9QUkVDSVNJT04pOwoKICAgICAgLy8gaWYgdGhlIHdpdG5lc3MgaXMgZW5hYmxlZAogICAgICAvLyBhbmQgZGlmZmVyZW50IGZyb20gdGhlIHNjaGVkdWxlZCBvbmUgZnJvbSB0aGUgcHJldmlvdXMgcm91bmQKICAgICAgLy8gYW5kIGRpZmZlcmVudCBmcm9tIGFuIGFscmVhZHkgc2NoZWR1bGVkIHdpdG5lc3MgZm9yIHRoaXMgcm91bmQKICAgICAgaWYgKHdpdG5lc3MuZW5hYmxlZCA9PT0gdHJ1ZQogICAgICAgICYmIHdpdG5lc3MuYWNjb3VudCAhPT0gcHJldmlvdXNSb3VuZFdpdG5lc3MKICAgICAgICAmJiBzY2hlZHVsZXMuZmluZChzID0+IHMud2l0bmVzcyA9PT0gd2l0bmVzcy5hY2NvdW50KSA9PT0gdW5kZWZpbmVkCiAgICAgICAgJiYgYXBpLkJpZ051bWJlcihyYW5kb21XZWlnaHQpLmx0ZShhY2NXZWlnaHQpKSB7CiAgICAgICAgYXBpLmRlYnVnKGBjaGFuZ2VkIGN1cnJlbnQgd2l0bmVzcyBmcm9tICR7c2NoZWR1bGUud2l0bmVzc30gdG8gJHt3aXRuZXNzLmFjY291bnR9YCk7CiAgICAgICAgc2NoZWR1bGUud2l0bmVzcyA9IHdpdG5lc3MuYWNjb3VudDsKICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdzY2hlZHVsZXMnLCBzY2hlZHVsZSk7CiAgICAgICAgcGFyYW1zLmN1cnJlbnRXaXRuZXNzID0gd2l0bmVzcy5hY2NvdW50OwogICAgICAgIHBhcmFtcy5sYXN0V2l0bmVzc2VzLnB1c2god2l0bmVzcy5hY2NvdW50KTsKICAgICAgICBwYXJhbXMuYmxvY2tOdW1iZXJXaXRuZXNzQ2hhbmdlID0gYXBpLnJlZlN0ZWVtQmxvY2tOdW1iZXIKICAgICAgICAgICsgTUFYX1JPVU5EX1BST1BPU0lUSU9OX1dBSVRJTkdfUEVSSU9EOwogICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3BhcmFtcycsIHBhcmFtcyk7CgogICAgICAgIC8vIHVwZGF0ZSB0aGUgY3VycmVudCB3aXRuZXNzCiAgICAgICAgY29uc3Qgc2NoZWR1bGVkV2l0bmVzcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCd3aXRuZXNzZXMnLCB7IGFjY291bnQ6IGN1cnJlbnRXaXRuZXNzIH0pOwogICAgICAgIHNjaGVkdWxlZFdpdG5lc3MubWlzc2VkUm91bmRzICs9IDE7CiAgICAgICAgc2NoZWR1bGVkV2l0bmVzcy5taXNzZWRSb3VuZHNJbkFSb3cgKz0gMTsKCiAgICAgICAgLy8gZGlzYWJsZSB0aGUgd2l0bmVzcyBpZiBtaXNzZWQgTUFYX1JPVU5EU19NSVNTRURfSU5fQV9ST1cKICAgICAgICBpZiAoc2NoZWR1bGVkV2l0bmVzcy5taXNzZWRSb3VuZHNJbkFSb3cgPj0gTUFYX1JPVU5EU19NSVNTRURfSU5fQV9ST1cpIHsKICAgICAgICAgIHNjaGVkdWxlZFdpdG5lc3MubWlzc2VkUm91bmRzSW5BUm93ID0gMDsKICAgICAgICAgIHNjaGVkdWxlZFdpdG5lc3MuZW5hYmxlZCA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgnd2l0bmVzc2VzJywgc2NoZWR1bGVkV2l0bmVzcyk7CiAgICAgICAgd2l0bmVzc0ZvdW5kID0gdHJ1ZTsKICAgICAgICBhcGkuZW1pdCgnY3VycmVudFdpdG5lc3NDaGFuZ2VkJywgeyB9KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQoKICAgIGlmICh3aXRuZXNzRm91bmQgPT09IGZhbHNlKSB7CiAgICAgIG9mZnNldCArPSAxMDA7CiAgICAgIHdpdG5lc3NlcyA9IGF3YWl0IGFwaS5kYi5maW5kKAogICAgICAgICd3aXRuZXNzZXMnLAogICAgICAgIHsKICAgICAgICAgIGFwcHJvdmFsV2VpZ2h0OiB7CiAgICAgICAgICAgICRndDogewogICAgICAgICAgICAgICRudW1iZXJEZWNpbWFsOiAnMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgMTAwLCAvLyBsaW1pdAogICAgICAgIG9mZnNldCwgLy8gb2Zmc2V0CiAgICAgICAgWwogICAgICAgICAgeyBpbmRleDogJ2FwcHJvdmFsV2VpZ2h0JywgZGVzY2VuZGluZzogdHJ1ZSB9LAogICAgICAgIF0sCiAgICAgICk7CiAgICB9CiAgfSB3aGlsZSAod2l0bmVzc2VzLmxlbmd0aCA+IDAgJiYgd2l0bmVzc0ZvdW5kID09PSBmYWxzZSk7CgogIGlmICh3aXRuZXNzRm91bmQgPT09IGZhbHNlKSB7CiAgICBhcGkuZGVidWcoJ25vIGJhY2t1cCB3aXRuZXNzIHdhcyBmb3VuZCwgaW50ZXJjaGFuZ2luZyB3aXRuZXNzZXMgd2l0aGluIHRoZSBjdXJyZW50IHNjaGVkdWxlJyk7CiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NoZWR1bGVzLmxlbmd0aCAtIDE7IGluZGV4ICs9IDEpIHsKICAgICAgY29uc3Qgc2NoZWQgPSBzY2hlZHVsZXNbaW5kZXhdOwogICAgICBjb25zdCBuZXdXaXRuZXNzID0gc2NoZWQud2l0bmVzczsKICAgICAgaWYgKG5ld1dpdG5lc3MgIT09IHByZXZpb3VzUm91bmRXaXRuZXNzKSB7CiAgICAgICAgYXBpLmRlYnVnKGBjaGFuZ2VkIGN1cnJlbnQgd2l0bmVzcyBmcm9tICR7Y3VycmVudFdpdG5lc3N9IHRvICR7bmV3V2l0bmVzc31gKTsKICAgICAgICBzY2hlZHVsZS53aXRuZXNzID0gbmV3V2l0bmVzczsKICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdzY2hlZHVsZXMnLCBzY2hlZHVsZSk7CiAgICAgICAgc2NoZWQud2l0bmVzcyA9IGN1cnJlbnRXaXRuZXNzOwogICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3NjaGVkdWxlcycsIHNjaGVkKTsKICAgICAgICBwYXJhbXMuY3VycmVudFdpdG5lc3MgPSBuZXdXaXRuZXNzOwogICAgICAgIHBhcmFtcy5sYXN0V2l0bmVzc2VzLnB1c2gobmV3V2l0bmVzcyk7CiAgICAgICAgcGFyYW1zLmJsb2NrTnVtYmVyV2l0bmVzc0NoYW5nZSA9IGFwaS5yZWZTdGVlbUJsb2NrTnVtYmVyCiAgICAgICAgICArIE1BWF9ST1VORF9QUk9QT1NJVElPTl9XQUlUSU5HX1BFUklPRDsKICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCdwYXJhbXMnLCBwYXJhbXMpOwoKICAgICAgICAvLyB1cGRhdGUgdGhlIGN1cnJlbnQgd2l0bmVzcwogICAgICAgIGNvbnN0IHNjaGVkdWxlZFdpdG5lc3MgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnd2l0bmVzc2VzJywgeyBhY2NvdW50OiBjdXJyZW50V2l0bmVzcyB9KTsKICAgICAgICBzY2hlZHVsZWRXaXRuZXNzLm1pc3NlZFJvdW5kcyArPSAxOwogICAgICAgIHNjaGVkdWxlZFdpdG5lc3MubWlzc2VkUm91bmRzSW5BUm93ICs9IDE7CgogICAgICAgIC8vIGRpc2FibGUgdGhlIHdpdG5lc3MgaWYgbWlzc2VkIE1BWF9ST1VORFNfTUlTU0VEX0lOX0FfUk9XCiAgICAgICAgaWYgKHNjaGVkdWxlZFdpdG5lc3MubWlzc2VkUm91bmRzSW5BUm93ID49IE1BWF9ST1VORFNfTUlTU0VEX0lOX0FfUk9XKSB7CiAgICAgICAgICBzY2hlZHVsZWRXaXRuZXNzLm1pc3NlZFJvdW5kc0luQVJvdyA9IDA7CiAgICAgICAgICBzY2hlZHVsZWRXaXRuZXNzLmVuYWJsZWQgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3dpdG5lc3NlcycsIHNjaGVkdWxlZFdpdG5lc3MpOwogICAgICAgIGFwaS5lbWl0KCdjdXJyZW50V2l0bmVzc0NoYW5nZWQnLCB7IH0pOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQp9OwoKY29uc3QgbWFuYWdlV2l0bmVzc2VzU2NoZWR1bGUgPSBhc3luYyAoKSA9PiB7CiAgaWYgKGFwaS5zZW5kZXIgIT09ICdudWxsJykgcmV0dXJuOwoKICBjb25zdCBwYXJhbXMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgncGFyYW1zJywge30pOwogIGNvbnN0IHsKICAgIG51bWJlck9mQXBwcm92ZWRXaXRuZXNzZXMsCiAgICB0b3RhbEFwcHJvdmFsV2VpZ2h0LAogICAgbGFzdFZlcmlmaWVkQmxvY2tOdW1iZXIsCiAgICBibG9ja051bWJlcldpdG5lc3NDaGFuZ2UsCiAgICBsYXN0QmxvY2tSb3VuZCwKICB9ID0gcGFyYW1zOwoKICAvLyBjaGVjayB0aGUgY3VycmVudCBzY2hlZHVsZQogIGNvbnN0IGN1cnJlbnRCbG9jayA9IGxhc3RWZXJpZmllZEJsb2NrTnVtYmVyICsgMTsKICBsZXQgc2NoZWR1bGUgPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnc2NoZWR1bGVzJywgeyBibG9ja051bWJlcjogY3VycmVudEJsb2NrIH0pOwoKICAvLyBpZiB0aGUgY3VycmVudCBibG9jayBoYXMgbm90IGJlZW4gc2NoZWR1bGVkIGFscmVhZHkgd2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgc2NoZWR1bGUKICBpZiAoc2NoZWR1bGUgPT09IG51bGwpIHsKICAgIGFwaS5kZWJ1ZygnY2FsY3VsYXRpbmcgbmV3IHNjaGVkdWxlJyk7CiAgICBzY2hlZHVsZSA9IFtdOwoKICAgIC8vIHRoZXJlIGhhcyB0byBiZSBlbm91Z2ggdG9wIHdpdG5lc3NlcyB0byBzdGFydCBhIHNjaGVkdWxlCiAgICBpZiAobnVtYmVyT2ZBcHByb3ZlZFdpdG5lc3NlcyA+PSBOQl9XSVRORVNTRVMpIHsKICAgICAgLyoKICAgICAgICBleGFtcGxlOgogICAgICAgIC0+IHRvdGFsIGFwcHJvdmFsIHdlaWdodCA9IDEwLDAwMAogICAgICAgIC0+ICBhcHByb3ZhbCB3ZWlnaHRzOgogICAgICAgICAgYWNjdCBBIDogMTAwMCAoZnJvbSAwIHRvIDEwMDApCiAgICAgICAgICBhY2N0IEIgOiA5MDAgKGZyb20gMTAwMC4wMDAwMDAwMSB0byAxOTAwKQogICAgICAgICAgYWNjdCBDIDogODAwIChmcm9tIDE5MDAuMDAwMDAwMDEgdG8gMjcwMCkKICAgICAgICAgIGFjY3QgRCA6IDcwMCAoZnJvbSAyNzAwLjAwMDAwMDAxIHRvIDM0MDApCiAgICAgICAgICAuLi4KICAgICAgICAgIGFjY3QgbiA6IGZyb20gKChuLTEpLnVwcGVyQm91bmQgKyAwLjAwMDAwMDAxKSB0byAxMCwwMDApCgogICAgICAgICAgLT4gdG90YWwgYXBwcm92YWwgd2VpZ2h0IHRvcCB3aXRuZXNzZXMgKEEtRCkgPSAzLDQwMAogICAgICAgICAgLT4gcGljayB1cCBiYWNrdXAgd2l0bmVzc2VzIChFLW4pOiB3ZWlnaHQgcmFuZ2U6CiAgICAgICAgICAgIGZyb20gMyw0MDAuMDAwMDAwMSB0byAxMCwwMDAKICAgICAgKi8KCiAgICAgIC8vIGdldCBhIGRldGVybWluaXN0aWMgcmFuZG9tIHdlaWdodAogICAgICBjb25zdCByYW5kb20gPSBhcGkucmFuZG9tKCk7CiAgICAgIGxldCByYW5kb21XZWlnaHQgPSBudWxsOwoKICAgICAgbGV0IG9mZnNldCA9IDA7CiAgICAgIGxldCBhY2NXZWlnaHQgPSAwOwoKICAgICAgbGV0IHdpdG5lc3NlcyA9IGF3YWl0IGFwaS5kYi5maW5kKAogICAgICAgICd3aXRuZXNzZXMnLAogICAgICAgIHsKICAgICAgICAgIGFwcHJvdmFsV2VpZ2h0OiB7CiAgICAgICAgICAgICRndDogewogICAgICAgICAgICAgICRudW1iZXJEZWNpbWFsOiAnMCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgMTAwLCAvLyBsaW1pdAogICAgICAgIG9mZnNldCwgLy8gb2Zmc2V0CiAgICAgICAgWwogICAgICAgICAgeyBpbmRleDogJ2FwcHJvdmFsV2VpZ2h0JywgZGVzY2VuZGluZzogdHJ1ZSB9LAogICAgICAgIF0sCiAgICAgICk7CgogICAgICBkbyB7CiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHdpdG5lc3Nlcy5sZW5ndGg7IGluZGV4ICs9IDEpIHsKICAgICAgICAgIGNvbnN0IHdpdG5lc3MgPSB3aXRuZXNzZXNbaW5kZXhdOwoKICAgICAgICAgIC8vIGNhbGN1bGF0ZSBhIHJhbmRvbSB3ZWlnaHQgaWYgbm90IGRvbmUgeWV0CiAgICAgICAgICBpZiAoc2NoZWR1bGUubGVuZ3RoID49IE5CX1RPUF9XSVRORVNTRVMKICAgICAgICAgICAgJiYgcmFuZG9tV2VpZ2h0ID09PSBudWxsKSB7CiAgICAgICAgICAgIGNvbnN0IG1pbiA9IGFwaS5CaWdOdW1iZXIoYWNjV2VpZ2h0KQogICAgICAgICAgICAgIC5wbHVzKFVUSUxJVFlfVE9LRU5fTUlOX1ZBTFVFKTsKCiAgICAgICAgICAgIHJhbmRvbVdlaWdodCA9IGFwaS5CaWdOdW1iZXIodG90YWxBcHByb3ZhbFdlaWdodCkKICAgICAgICAgICAgICAubWludXMobWluKQogICAgICAgICAgICAgIC50aW1lcyhyYW5kb20pCiAgICAgICAgICAgICAgLnBsdXMobWluKQogICAgICAgICAgICAgIC50b0ZpeGVkKFVUSUxJVFlfVE9LRU5fUFJFQ0lTSU9OKTsKICAgICAgICAgIH0KCiAgICAgICAgICBhY2NXZWlnaHQgPSBhcGkuQmlnTnVtYmVyKGFjY1dlaWdodCkKICAgICAgICAgICAgLnBsdXMod2l0bmVzcy5hcHByb3ZhbFdlaWdodC4kbnVtYmVyRGVjaW1hbCkKICAgICAgICAgICAgLnRvRml4ZWQoVVRJTElUWV9UT0tFTl9QUkVDSVNJT04pOwoKICAgICAgICAgIC8vIGlmIHRoZSB3aXRuZXNzIGlzIGVuYWJsZWQKICAgICAgICAgIGlmICh3aXRuZXNzLmVuYWJsZWQgPT09IHRydWUpIHsKICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZW4ndCBmb3VuZCBhbGwgdGhlIHRvcCB3aXRuZXNzZXMgeWV0CiAgICAgICAgICAgIGlmIChzY2hlZHVsZS5sZW5ndGggPCBOQl9UT1BfV0lUTkVTU0VTCiAgICAgICAgICAgICAgfHwgYXBpLkJpZ051bWJlcihyYW5kb21XZWlnaHQpLmx0ZShhY2NXZWlnaHQpKSB7CiAgICAgICAgICAgICAgc2NoZWR1bGUucHVzaCh7CiAgICAgICAgICAgICAgICB3aXRuZXNzOiB3aXRuZXNzLmFjY291bnQsCiAgICAgICAgICAgICAgICBibG9ja051bWJlcjogbnVsbCwKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGlmIChzY2hlZHVsZS5sZW5ndGggPj0gTkJfV0lUTkVTU0VTKSB7CiAgICAgICAgICAgIGluZGV4ID0gd2l0bmVzc2VzLmxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChzY2hlZHVsZS5sZW5ndGggPCBOQl9XSVRORVNTRVMpIHsKICAgICAgICAgIG9mZnNldCArPSAxMDA7CiAgICAgICAgICB3aXRuZXNzZXMgPSBhd2FpdCBhcGkuZGIuZmluZCgKICAgICAgICAgICAgJ3dpdG5lc3NlcycsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBhcHByb3ZhbFdlaWdodDogewogICAgICAgICAgICAgICAgJGd0OiB7CiAgICAgICAgICAgICAgICAgICRudW1iZXJEZWNpbWFsOiAnMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDEwMCwgLy8gbGltaXQKICAgICAgICAgICAgb2Zmc2V0LCAvLyBvZmZzZXQKICAgICAgICAgICAgWwogICAgICAgICAgICAgIHsgaW5kZXg6ICdhcHByb3ZhbFdlaWdodCcsIGRlc2NlbmRpbmc6IHRydWUgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9IHdoaWxlICh3aXRuZXNzZXMubGVuZ3RoID4gMCAmJiBzY2hlZHVsZS5sZW5ndGggPCBOQl9XSVRORVNTRVMpOwogICAgfQoKICAgIC8vIGlmIHRoZXJlIGFyZSBlbm91Z2ggd2l0bmVzc2VzIHNjaGVkdWxlZAogICAgaWYgKHNjaGVkdWxlLmxlbmd0aCA9PT0gTkJfV0lUTkVTU0VTKSB7CiAgICAgIC8vIHNodWZmbGUgdGhlIHdpdG5lc3NlcwogICAgICBsZXQgajsgbGV0IHg7CiAgICAgIGZvciAobGV0IGkgPSBzY2hlZHVsZS5sZW5ndGggLSAxOyBpID4gMDsgaSAtPSAxKSB7CiAgICAgICAgY29uc3QgcmFuZG9tID0gYXBpLnJhbmRvbSgpOwogICAgICAgIGogPSBNYXRoLmZsb29yKHJhbmRvbSAqIChpICsgMSkpOwogICAgICAgIHggPSBzY2hlZHVsZVtpXTsKICAgICAgICBzY2hlZHVsZVtpXSA9IHNjaGVkdWxlW2pdOwogICAgICAgIHNjaGVkdWxlW2pdID0geDsKICAgICAgfQoKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lCiAgICAgIGxldCBsYXN0V2l0bmVzc2VzID0gcGFyYW1zLmxhc3RXaXRuZXNzZXM7CiAgICAgIGNvbnN0IHByZXZpb3VzUm91bmRXaXRuZXNzID0gbGFzdFdpdG5lc3Nlcy5sZW5ndGggPiAwID8gbGFzdFdpdG5lc3Nlc1tsYXN0V2l0bmVzc2VzLmxlbmd0aCAtIDFdIDogJyc7CgogICAgICBpZiAobGFzdFdpdG5lc3Nlcy5sZW5ndGggPj0gTkJfV0lUTkVTU0VTKSB7CiAgICAgICAgbGFzdFdpdG5lc3NlcyA9IFtdOwogICAgICB9CgogICAgICAvLyBtYWtlIHN1cmUgdGhlIGxhc3Qgd2l0bmVzcyBvZiB0aGlzIHJvdW5kIGlzIG5vdCBvbmUgb2YgdGhlIGxhc3Qgd2l0bmVzc2VzIHNjaGVkdWxlZAogICAgICBjb25zdCBsYXN0V2l0bmVzcyA9IHNjaGVkdWxlW3NjaGVkdWxlLmxlbmd0aCAtIDFdLndpdG5lc3M7CiAgICAgIGlmIChsYXN0V2l0bmVzc2VzLmluY2x1ZGVzKGxhc3RXaXRuZXNzKSB8fCBwcmV2aW91c1JvdW5kV2l0bmVzcyA9PT0gbGFzdFdpdG5lc3MpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVkdWxlLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICBpZiAoIWxhc3RXaXRuZXNzZXMuaW5jbHVkZXMoc2NoZWR1bGVbaV0ud2l0bmVzcykKICAgICAgICAgICAgJiYgc2NoZWR1bGVbaV0ud2l0bmVzcyAhPT0gcHJldmlvdXNSb3VuZFdpdG5lc3MpIHsKICAgICAgICAgICAgY29uc3QgdGhpc1dpdG5lc3MgPSBzY2hlZHVsZVtpXS53aXRuZXNzOwogICAgICAgICAgICBzY2hlZHVsZVtpXS53aXRuZXNzID0gbGFzdFdpdG5lc3M7CiAgICAgICAgICAgIHNjaGVkdWxlW3NjaGVkdWxlLmxlbmd0aCAtIDFdLndpdG5lc3MgPSB0aGlzV2l0bmVzczsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBtYWtlIHN1cmUgdGhlIHdpdG5lc3Mgb2YgdGhlIHByZXZpb3VzIHJvdW5kIGlzIG5vdCB0aGUgZmlyc3Qgd2l0bmVzcyBvZiB0aGlzIHJvdW5kCiAgICAgIGlmIChzY2hlZHVsZVswXS53aXRuZXNzID09PSBwcmV2aW91c1JvdW5kV2l0bmVzcykgewogICAgICAgIGNvbnN0IGZpcnN0V2l0bmVzcyA9IHNjaGVkdWxlWzBdLndpdG5lc3M7CiAgICAgICAgY29uc3Qgc2Vjb25kV2l0bmVzcyA9IHNjaGVkdWxlWzFdLndpdG5lc3M7CiAgICAgICAgc2NoZWR1bGVbMF0ud2l0bmVzcyA9IHNlY29uZFdpdG5lc3M7CiAgICAgICAgc2NoZWR1bGVbMV0ud2l0bmVzcyA9IGZpcnN0V2l0bmVzczsKICAgICAgfQoKICAgICAgLy8gYmxvY2sgbnVtYmVyIGF0dHJpYnV0aW9uCiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItZGVzdHJ1Y3R1cmluZwogICAgICBsZXQgYmxvY2tOdW1iZXIgPSBsYXN0VmVyaWZpZWRCbG9ja051bWJlciA9PT0gMAogICAgICAgID8gYXBpLmJsb2NrTnVtYmVyCiAgICAgICAgOiBsYXN0VmVyaWZpZWRCbG9ja051bWJlciArIDE7CiAgICAgIHBhcmFtcy5yb3VuZCArPSAxOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVkdWxlLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgLy8gdGhlIGJsb2NrIG51bWJlciB0aGF0IHRoZSB3aXRuZXNzIHdpbGwgaGF2ZSB0byAic2lnbiIKICAgICAgICBzY2hlZHVsZVtpXS5ibG9ja051bWJlciA9IGJsb2NrTnVtYmVyOwogICAgICAgIHNjaGVkdWxlW2ldLnJvdW5kID0gcGFyYW1zLnJvdW5kOwogICAgICAgIGFwaS5kZWJ1Zyhgc2NoZWR1bGVkIHdpdG5lc3MgJHtzY2hlZHVsZVtpXS53aXRuZXNzfSBmb3IgYmxvY2sgJHtibG9ja051bWJlcn0gKHJvdW5kICR7cGFyYW1zLnJvdW5kfSlgKTsKICAgICAgICBhd2FpdCBhcGkuZGIuaW5zZXJ0KCdzY2hlZHVsZXMnLCBzY2hlZHVsZVtpXSk7CiAgICAgICAgYmxvY2tOdW1iZXIgKz0gMTsKICAgICAgfQoKICAgICAgaWYgKGxhc3RWZXJpZmllZEJsb2NrTnVtYmVyID09PSAwKSB7CiAgICAgICAgcGFyYW1zLmxhc3RWZXJpZmllZEJsb2NrTnVtYmVyID0gYXBpLmJsb2NrTnVtYmVyIC0gMTsKICAgICAgfQogICAgICBjb25zdCBsYXN0V2l0bmVzc1JvdW5kU2NoZWR1bGUgPSBzY2hlZHVsZVtzY2hlZHVsZS5sZW5ndGggLSAxXTsKICAgICAgcGFyYW1zLmxhc3RCbG9ja1JvdW5kID0gbGFzdFdpdG5lc3NSb3VuZFNjaGVkdWxlLmJsb2NrTnVtYmVyOwogICAgICBwYXJhbXMuY3VycmVudFdpdG5lc3MgPSBsYXN0V2l0bmVzc1JvdW5kU2NoZWR1bGUud2l0bmVzczsKICAgICAgbGFzdFdpdG5lc3Nlcy5wdXNoKGxhc3RXaXRuZXNzUm91bmRTY2hlZHVsZS53aXRuZXNzKTsKICAgICAgcGFyYW1zLmxhc3RXaXRuZXNzZXMgPSBsYXN0V2l0bmVzc2VzOwogICAgICBwYXJhbXMuYmxvY2tOdW1iZXJXaXRuZXNzQ2hhbmdlID0gYXBpLnJlZlN0ZWVtQmxvY2tOdW1iZXIKICAgICAgICArIE1BWF9ST1VORF9QUk9QT1NJVElPTl9XQUlUSU5HX1BFUklPRDsKICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncGFyYW1zJywgcGFyYW1zKTsKICAgICAgYXBpLmVtaXQoJ25ld1NjaGVkdWxlJywgeyB9KTsKICAgIH0KICB9IGVsc2UgaWYgKGFwaS5yZWZTdGVlbUJsb2NrTnVtYmVyID49IGJsb2NrTnVtYmVyV2l0bmVzc0NoYW5nZSkgewogICAgaWYgKGFwaS5ibG9ja051bWJlciA+IGxhc3RCbG9ja1JvdW5kKSB7CiAgICAgIC8vIG90aGVyd2lzZSB3ZSBjaGFuZ2UgdGhlIGN1cnJlbnQgd2l0bmVzcyBpZiBpdCBoYXMgbm90IHByb3Bvc2VkIHRoZSByb3VuZCBpbiB0aW1lCiAgICAgIGF3YWl0IGNoYW5nZUN1cnJlbnRXaXRuZXNzKCk7CiAgICB9IGVsc2UgewogICAgICBwYXJhbXMuYmxvY2tOdW1iZXJXaXRuZXNzQ2hhbmdlID0gYXBpLnJlZlN0ZWVtQmxvY2tOdW1iZXIKICAgICAgICArIE1BWF9ST1VORF9QUk9QT1NJVElPTl9XQUlUSU5HX1BFUklPRDsKICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZSgncGFyYW1zJywgcGFyYW1zKTsKICAgICAgYXBpLmVtaXQoJ2F3YWl0aW5nUm91bmRFbmQnLCB7IH0pOwogICAgfQogIH0KfTsKCmFjdGlvbnMucHJvcG9zZVJvdW5kID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICByb3VuZEhhc2gsCiAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICBzaWduYXR1cmVzLAogIH0gPSBwYXlsb2FkOwoKICBpZiAoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlCiAgICAmJiByb3VuZEhhc2ggJiYgdHlwZW9mIHJvdW5kSGFzaCA9PT0gJ3N0cmluZycgJiYgcm91bmRIYXNoLmxlbmd0aCA9PT0gNjQKICAgICYmIEFycmF5LmlzQXJyYXkoc2lnbmF0dXJlcykKICAgICYmIHNpZ25hdHVyZXMubGVuZ3RoIDw9IE5CX1dJVE5FU1NFUwogICAgJiYgc2lnbmF0dXJlcy5sZW5ndGggPj0gTkJfV0lUTkVTU0VTX1NJR05BVFVSRVNfUkVRVUlSRUQpIHsKICAgIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CiAgICBjb25zdCB7CiAgICAgIGxhc3RWZXJpZmllZEJsb2NrTnVtYmVyLAogICAgICByb3VuZCwKICAgICAgbGFzdEJsb2NrUm91bmQsCiAgICAgIGN1cnJlbnRXaXRuZXNzLAogICAgfSA9IHBhcmFtczsKICAgIGxldCBjdXJyZW50QmxvY2sgPSBsYXN0VmVyaWZpZWRCbG9ja051bWJlciArIDE7CiAgICBsZXQgY2FsY3VsYXRlZFJvdW5kSGFzaCA9ICcnOwoKICAgIC8vIHRoZSBzZW5kZXIgbXVzdCBiZSB0aGUgY3VycmVudCB3aXRuZXNzIG9mIHRoZSByb3VuZAogICAgaWYgKGFwaS5zZW5kZXIgPT09IGN1cnJlbnRXaXRuZXNzKSB7CiAgICAgIC8vIGNhbGN1bGF0ZSByb3VuZCBoYXNoCiAgICAgIHdoaWxlIChjdXJyZW50QmxvY2sgPD0gbGFzdEJsb2NrUm91bmQpIHsKICAgICAgICBjb25zdCBibG9jayA9IGF3YWl0IGFwaS5kYi5nZXRCbG9ja0luZm8oY3VycmVudEJsb2NrKTsKCiAgICAgICAgaWYgKGJsb2NrICE9PSBudWxsKSB7CiAgICAgICAgICBjYWxjdWxhdGVkUm91bmRIYXNoID0gYXBpLlNIQTI1NihgJHtjYWxjdWxhdGVkUm91bmRIYXNofSR7YmxvY2suaGFzaH1gKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2FsY3VsYXRlZFJvdW5kSGFzaCA9ICcnOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBjdXJyZW50QmxvY2sgKz0gMTsKICAgICAgfQoKICAgICAgaWYgKGNhbGN1bGF0ZWRSb3VuZEhhc2ggIT09ICcnICYmIGNhbGN1bGF0ZWRSb3VuZEhhc2ggPT09IHJvdW5kSGFzaCkgewogICAgICAgIC8vIGdldCB0aGUgd2l0bmVzc2VzIG9uIHNjaGVkdWxlCiAgICAgICAgY29uc3Qgc2NoZWR1bGVzID0gYXdhaXQgYXBpLmRiLmZpbmQoJ3NjaGVkdWxlcycsIHsgcm91bmQgfSk7CgogICAgICAgIC8vIGNoZWNrIHRoZSBzaWduYXR1cmVzCiAgICAgICAgbGV0IHNpZ25hdHVyZXNDaGVja2VkID0gMDsKICAgICAgICBjb25zdCB2ZXJpZmllZEJsb2NrSW5mb3JtYXRpb24gPSBbXTsKICAgICAgICBjb25zdCBjdXJyZW50V2l0bmVzc0luZm8gPSBhd2FpdCBhcGkuZGIuZmluZE9uZSgnd2l0bmVzc2VzJywgeyBhY2NvdW50OiBjdXJyZW50V2l0bmVzcyB9KTsKICAgICAgICBjb25zdCBjdXJyZW50V2l0bmVzc1NpZ25hdHVyZSA9IHNpZ25hdHVyZXMuZmluZChzID0+IHNbMF0gPT09IGN1cnJlbnRXaXRuZXNzKTsKICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NoZWR1bGVzLmxlbmd0aDsgaW5kZXggKz0gMSkgewogICAgICAgICAgY29uc3Qgc2NoZWR1bGVkV2l0bmVzcyA9IHNjaGVkdWxlc1tpbmRleF07CiAgICAgICAgICBjb25zdCB3aXRuZXNzID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3dpdG5lc3NlcycsIHsgYWNjb3VudDogc2NoZWR1bGVkV2l0bmVzcy53aXRuZXNzIH0pOwogICAgICAgICAgaWYgKHdpdG5lc3MgIT09IG51bGwpIHsKICAgICAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gc2lnbmF0dXJlcy5maW5kKHMgPT4gc1swXSA9PT0gd2l0bmVzcy5hY2NvdW50KTsKICAgICAgICAgICAgaWYgKHNpZ25hdHVyZSkgewogICAgICAgICAgICAgIGlmIChhcGkuY2hlY2tTaWduYXR1cmUoCiAgICAgICAgICAgICAgICBjYWxjdWxhdGVkUm91bmRIYXNoLCBzaWduYXR1cmVbMV0sIHdpdG5lc3Muc2lnbmluZ0tleSwgdHJ1ZSwKICAgICAgICAgICAgICApKSB7CiAgICAgICAgICAgICAgICBhcGkuZGVidWcoYHdpdG5lc3MgJHt3aXRuZXNzLmFjY291bnR9IHNpZ25lZCByb3VuZCAke3JvdW5kfWApOwogICAgICAgICAgICAgICAgc2lnbmF0dXJlc0NoZWNrZWQgKz0gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHdpdG5lc3Mgd2lsbCBzaG93IGFzIHRoZSB3aXRuZXNzIHRoYXQgdmVyaWZpZWQgdGhlIGJsb2NrcyBmcm9tIHRoZSByb3VuZAogICAgICAgICAgICB2ZXJpZmllZEJsb2NrSW5mb3JtYXRpb24ucHVzaCgKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBibG9ja051bWJlcjogc2NoZWR1bGVkV2l0bmVzcy5ibG9ja051bWJlciwKICAgICAgICAgICAgICAgIHdpdG5lc3M6IGN1cnJlbnRXaXRuZXNzLAogICAgICAgICAgICAgICAgc2lnbmluZ0tleTogY3VycmVudFdpdG5lc3NJbmZvLnNpZ25pbmdLZXksCiAgICAgICAgICAgICAgICByb3VuZFNpZ25hdHVyZTogY3VycmVudFdpdG5lc3NTaWduYXR1cmVbMV0sCiAgICAgICAgICAgICAgICByb3VuZCwKICAgICAgICAgICAgICAgIHJvdW5kSGFzaCwKICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHNpZ25hdHVyZXNDaGVja2VkID49IE5CX1dJVE5FU1NFU19TSUdOQVRVUkVTX1JFUVVJUkVEKSB7CiAgICAgICAgICAvLyBtYXJrIGJsb2NrcyBvZiB0aGUgdmVyaWZpZWQgcm91bmQgYXMgdmVyaWZpZWQgYnkgdGhlIGN1cnJlbnQgd2l0bmVzcwogICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHZlcmlmaWVkQmxvY2tJbmZvcm1hdGlvbi5sZW5ndGg7IGluZGV4ICs9IDEpIHsKICAgICAgICAgICAgYXdhaXQgYXBpLnZlcmlmeUJsb2NrKHZlcmlmaWVkQmxvY2tJbmZvcm1hdGlvbltpbmRleF0pOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIGdldCBjb250cmFjdCBiYWxhbmNlCiAgICAgICAgICBjb25zdCBjb250cmFjdEJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdjb250cmFjdHNCYWxhbmNlcycsIHsgYWNjb3VudDogJ3dpdG5lc3NlcycsIHN5bWJvbDogVVRJTElUWV9UT0tFTl9TWU1CT0wgfSk7CiAgICAgICAgICBsZXQgcmV3YXJkV2l0bmVzc2VzID0gZmFsc2U7CgogICAgICAgICAgaWYgKGNvbnRyYWN0QmFsYW5jZQogICAgICAgICAgICAmJiBhcGkuQmlnTnVtYmVyKGNvbnRyYWN0QmFsYW5jZS5iYWxhbmNlKS5ndGUoTkJfVE9LRU5TX05FRURFRF9CRUZPUkVfUkVXQVJESU5HKSkgewogICAgICAgICAgICByZXdhcmRXaXRuZXNzZXMgPSB0cnVlOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIHJlbW92ZSB0aGUgc2NoZWR1bGVzCiAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2NoZWR1bGVzLmxlbmd0aDsgaW5kZXggKz0gMSkgewogICAgICAgICAgICBjb25zdCBzY2hlZHVsZSA9IHNjaGVkdWxlc1tpbmRleF07CiAgICAgICAgICAgIC8vIHJld2FyZCB0aGUgd2l0bmVzcyB0aGF0IGhlbHAgdmVyaWZ5aW5nIHRoaXMgcm91bmQKICAgICAgICAgICAgaWYgKHJld2FyZFdpdG5lc3NlcyA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgIGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgndG9rZW5zJywgJ3N0YWtlRnJvbUNvbnRyYWN0JywgeyB0bzogc2NoZWR1bGUud2l0bmVzcywgc3ltYm9sOiBVVElMSVRZX1RPS0VOX1NZTUJPTCwgcXVhbnRpdHk6IE5CX1RPS0VOU19UT19SRVdBUkQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXdhaXQgYXBpLmRiLnJlbW92ZSgnc2NoZWR1bGVzJywgc2NoZWR1bGUpOwogICAgICAgICAgfQoKICAgICAgICAgIHBhcmFtcy5jdXJyZW50V2l0bmVzcyA9IG51bGw7CiAgICAgICAgICBwYXJhbXMubGFzdFZlcmlmaWVkQmxvY2tOdW1iZXIgPSBsYXN0QmxvY2tSb3VuZDsKICAgICAgICAgIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3BhcmFtcycsIHBhcmFtcyk7CgogICAgICAgICAgLy8gdXBkYXRlIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCB3aXRuZXNzCiAgICAgICAgICBjb25zdCB3aXRuZXNzID0gYXdhaXQgYXBpLmRiLmZpbmRPbmUoJ3dpdG5lc3NlcycsIHsgYWNjb3VudDogY3VycmVudFdpdG5lc3MgfSk7CiAgICAgICAgICB3aXRuZXNzLm1pc3NlZFJvdW5kc0luQVJvdyA9IDA7CiAgICAgICAgICB3aXRuZXNzLmxhc3RSb3VuZFZlcmlmaWVkID0gcm91bmQ7CiAgICAgICAgICB3aXRuZXNzLmxhc3RCbG9ja1ZlcmlmaWVkID0gbGFzdEJsb2NrUm91bmQ7CiAgICAgICAgICB3aXRuZXNzLnZlcmlmaWVkUm91bmRzICs9IDE7CiAgICAgICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKCd3aXRuZXNzZXMnLCB3aXRuZXNzKTsKCiAgICAgICAgICAvLyBjYWxjdWxhdGUgbmV3IHNjaGVkdWxlCiAgICAgICAgICBhd2FpdCBtYW5hZ2VXaXRuZXNzZXNTY2hlZHVsZSgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCmFjdGlvbnMuc2NoZWR1bGVXaXRuZXNzZXMgPSBhc3luYyAoKSA9PiB7CiAgaWYgKGFwaS5zZW5kZXIgIT09ICdudWxsJykgcmV0dXJuOwoKICBhd2FpdCBtYW5hZ2VXaXRuZXNzZXNTY2hlZHVsZSgpOwp9Owo="
}
}
}

{
"id": "ssc-testnet1",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "inflation",
"params": "",
"code": "LyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqLwovKiBnbG9iYWwgYWN0aW9ucywgYXBpICovCgovLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nCmNvbnN0IFVUSUxJVFlfVE9LRU5fU1lNQk9MID0gIlNTQyI7CgphY3Rpb25zLmNyZWF0ZVNTQyA9IGFzeW5jICgpID0+IHsKCn07CgphY3Rpb25zLmlzc3VlTmV3VG9rZW5zID0gYXN5bmMgKCkgPT4gewogIGlmIChhcGkuc2VuZGVyICE9PSAnbnVsbCcpIHJldHVybjsKCiAgLy8gaXNzdWUgdG9rZW5zIHRvIHN0ZWVtc2MKICAvLyAxMDBrIHRva2VucyBwZXIgeWVhciA9IDExLjQxNTUyNTExIHRva2VucyBwZXIgaG91ciAoYW4gaG91ciA9IDEyMDAgYmxvY2tzKQogIGxldCBuYlRva2VucyA9ICcxMS40MTU1MjUxMSc7CiAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCd0b2tlbnMnLCAnaXNzdWUnLCB7IHN5bWJvbDogVVRJTElUWV9UT0tFTl9TWU1CT0wsIHF1YW50aXR5OiBuYlRva2VucywgdG86ICdzdGVlbXNjJyB9KTsKCiAgLy8gaXNzdWUgdG9rZW5zIHRvIGVuZ3Bvb2wKICAvLyAxMDBrIHRva2VucyBwZXIgeWVhciA9IDExLjQxNTUyNTExIHRva2VucyBwZXIgaG91ciAoYW4gaG91ciA9IDEyMDAgYmxvY2tzKQogIG5iVG9rZW5zID0gJzExLjQxNTUyNTExJzsKICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICdpc3N1ZScsIHsgc3ltYm9sOiBVVElMSVRZX1RPS0VOX1NZTUJPTCwgcXVhbnRpdHk6IG5iVG9rZW5zLCB0bzogJ2VuZ3Bvb2wnIH0pOwoKICAvLyBpc3N1ZSB0b2tlbnMgdG8gIndpdG5lc3NlcyIgY29udHJhY3QKICAvLyAyMDBrIHRva2VucyBwZXIgeWVhciA9IDIyLjgzMTA1MDIyIHRva2VucyBwZXIgaG91ciAoYW4gaG91ciA9IDEyMDAgYmxvY2tzKQogIG5iVG9rZW5zID0gJzIyLjgzMTA1MDIyJzsKICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICdpc3N1ZVRvQ29udHJhY3QnLCB7IHN5bWJvbDogVVRJTElUWV9UT0tFTl9TWU1CT0wsIHF1YW50aXR5OiBuYlRva2VucywgdG86ICd3aXRuZXNzZXMnIH0pOwp9Owo="
}
}
}

{
"id": "ssc-testnet1",
"json": {
"contractName": "contract",
"contractAction": "update",
"contractPayload": {
"name": "nft",
"params": "",
"code": "Y29uc3QgQ09OVFJBQ1RfTkFNRT0ibmZ0IixVVElMSVRZX1RPS0VOX1NZTUJPTD0iU1NDIixNQVhfTlVNX0FVVEhPUklaRURfSVNTVUVSUz0xMCxNQVhfTlVNX0xPQ0tFRF9UT0tFTl9UWVBFUz0xMCxNQVhfU1lNQk9MX0xFTkdUSD0xMCxNQVhfREFUQV9QUk9QRVJUWV9MRU5HVEg9MTAwLE1BWF9OVU1fTkZUU19JU1NVQUJMRT0xMCxNQVhfTlVNX05GVFNfRURJVEFCTEU9NTAsTUFYX05VTV9ORlRTX09QRVJBQkxFPTUwO2FjdGlvbnMuY3JlYXRlU1NDPShhc3luYygpPT57aWYoITE9PT1hd2FpdCBhcGkuZGIudGFibGVFeGlzdHMoIm5mdHMiKSl7YXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJuZnRzIixbInN5bWJvbCJdKSxhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoInBhcmFtcyIpLGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgicGVuZGluZ1VuZGVsZWdhdGlvbnMiLFsic3ltYm9sIiwiY29tcGxldGVUaW1lc3RhbXAiXSk7Y29uc3QgZT17bmZ0Q3JlYXRpb25GZWU6IjEwMCIsbmZ0SXNzdWFuY2VGZWU6e1NTQzoiMC4wMDEiLFBBTDoiMC4wMDEifSxkYXRhUHJvcGVydHlDcmVhdGlvbkZlZToiMTAwIixlbmFibGVEZWxlZ2F0aW9uRmVlOiIxMDAwIn07YXdhaXQgYXBpLmRiLmluc2VydCgicGFyYW1zIixlKX19KSxhY3Rpb25zLnVwZGF0ZVBhcmFtcz0oYXN5bmMgZT0+e2lmKGFwaS5zZW5kZXIhPT1hcGkub3duZXIpcmV0dXJuO2NvbnN0e25mdENyZWF0aW9uRmVlOnQsbmZ0SXNzdWFuY2VGZWU6YSxkYXRhUHJvcGVydHlDcmVhdGlvbkZlZTppLGVuYWJsZURlbGVnYXRpb25GZWU6c309ZSxuPWF3YWl0IGFwaS5kYi5maW5kT25lKCJwYXJhbXMiLHt9KTt0JiYic3RyaW5nIj09dHlwZW9mIHQmJiFhcGkuQmlnTnVtYmVyKHQpLmlzTmFOKCkmJmFwaS5CaWdOdW1iZXIodCkuZ3RlKDApJiYobi5uZnRDcmVhdGlvbkZlZT10KSxhJiYib2JqZWN0Ij09dHlwZW9mIGEmJihuLm5mdElzc3VhbmNlRmVlPWEpLGkmJiJzdHJpbmciPT10eXBlb2YgaSYmIWFwaS5CaWdOdW1iZXIoaSkuaXNOYU4oKSYmYXBpLkJpZ051bWJlcihpKS5ndGUoMCkmJihuLmRhdGFQcm9wZXJ0eUNyZWF0aW9uRmVlPWkpLHMmJiJzdHJpbmciPT10eXBlb2YgcyYmIWFwaS5CaWdOdW1iZXIocykuaXNOYU4oKSYmYXBpLkJpZ051bWJlcihzKS5ndGUoMCkmJihuLmVuYWJsZURlbGVnYXRpb25GZWU9cyksYXdhaXQgYXBpLmRiLnVwZGF0ZSgicGFyYW1zIixuKX0pO2NvbnN0IGlzVG9rZW5UcmFuc2ZlclZlcmlmaWVkPShlLHQsYSxpLHMsbik9PiEodm9pZCAwIT09ZS5lcnJvcnN8fCFlLmV2ZW50c3x8dm9pZCAwPT09ZS5ldmVudHMuZmluZChlPT4idG9rZW5zIj09PWUuY29udHJhY3QmJmUuZXZlbnQ9PT1uJiZlLmRhdGEuZnJvbT09PXQmJmUuZGF0YS50bz09PWEmJmUuZGF0YS5xdWFudGl0eT09PXMmJmUuZGF0YS5zeW1ib2w9PT1pKSksY2FsY3VsYXRlQmFsYW5jZT0oZSx0LGEsaSk9Pmk/YXBpLkJpZ051bWJlcihlKS5wbHVzKHQpLnRvRml4ZWQoYSk6YXBpLkJpZ051bWJlcihlKS5taW51cyh0KS50b0ZpeGVkKGEpLGNvdW50RGVjaW1hbHM9ZT0+YXBpLkJpZ051bWJlcihlKS5kcCgpLGNvbnRhaW5zRHVwbGljYXRlcz1lPT5uZXcgU2V0KGUpLnNpemUhPT1lLmxlbmd0aCxpc1ZhbGlkU3RlZW1BY2NvdW50TGVuZ3RoPWU9PmUubGVuZ3RoPj0zJiZlLmxlbmd0aDw9MTYsaXNWYWxpZENvbnRyYWN0TGVuZ3RoPWU9PmUubGVuZ3RoPj0zJiZlLmxlbmd0aDw9NTAsaXNWYWxpZEFjY291bnRzQXJyYXk9ZT0+e2xldCB0PSEwO3JldHVybiBlLmZvckVhY2goZT0+eyJzdHJpbmciPT10eXBlb2YgZSYmaXNWYWxpZFN0ZWVtQWNjb3VudExlbmd0aChlKXx8KHQ9ITEpfSksdH0saXNWYWxpZENvbnRyYWN0c0FycmF5PWU9PntsZXQgdD0hMDtyZXR1cm4gZS5mb3JFYWNoKGU9Pnsic3RyaW5nIj09dHlwZW9mIGUmJmlzVmFsaWRDb250cmFjdExlbmd0aChlKXx8KHQ9ITEpfSksdH0saXNWYWxpZERhdGFQcm9wZXJ0aWVzPShlLHQsYSxpKT0+e2NvbnN0IHM9T2JqZWN0LmtleXMoaSkubGVuZ3RoLG49T2JqZWN0LmtleXMoYS5wcm9wZXJ0aWVzKS5sZW5ndGg7aWYoIWFwaS5hc3NlcnQoczw9biwiY2Fubm90IHNldCBtb3JlIGRhdGEgcHJvcGVydGllcyB0aGFuIE5GVCBoYXMiKSlyZXR1cm4hMTtmb3IoY29uc3RbcyxuXW9mIE9iamVjdC5lbnRyaWVzKGkpKXtsZXQgcj0hMTtpZihhcGkuYXNzZXJ0KHMmJiJzdHJpbmciPT10eXBlb2YgcyYmYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhzKSYmcy5sZW5ndGg+MCYmcy5sZW5ndGg8PTI1LCJpbnZhbGlkIGRhdGEgcHJvcGVydHkgbmFtZTogbGV0dGVycyAmIG51bWJlcnMgb25seSwgbWF4IGxlbmd0aCBvZiAyNSIpJiZhcGkuYXNzZXJ0KHMgaW4gYS5wcm9wZXJ0aWVzLCJkYXRhIHByb3BlcnR5IG11c3QgZXhpc3QiKSl7Y29uc3Qgbz1hLnByb3BlcnRpZXNbc107YXBpLmFzc2VydChudWxsIT1uJiYodHlwZW9mIG49PT1vLnR5cGV8fCJudW1iZXIiPT09by50eXBlJiYic3RyaW5nIj09dHlwZW9mIG4mJiFhcGkuQmlnTnVtYmVyKG4pLmlzTmFOKCkpLGBkYXRhIHByb3BlcnR5IHR5cGUgbWlzbWF0Y2g6IGV4cGVjdGVkICR7by50eXBlfSBidXQgZ290ICR7dHlwZW9mIG59IGZvciBwcm9wZXJ0eSAke3N9YCkmJmFwaS5hc3NlcnQoInN0cmluZyIhPXR5cGVvZiBufHxuLmxlbmd0aDw9MTAwLCJzdHJpbmcgcHJvcGVydHkgbWF4IGxlbmd0aCBpcyAxMDAgY2hhcmFjdGVycyIpJiZhcGkuYXNzZXJ0KCJjb250cmFjdCI9PT10JiZvLmF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzLmluY2x1ZGVzKGUpfHwidXNlciI9PT10JiZvLmF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHMuaW5jbHVkZXMoZSksIm5vdCBhbGxvd2VkIHRvIHNldCBkYXRhIHByb3BlcnRpZXMiKSYmKHI9ITAsIm51bWJlciI9PT1vLnR5cGUmJiJzdHJpbmciPT10eXBlb2YgbiYmKGlbc109YXBpLkJpZ051bWJlcihuKS50b051bWJlcigpKSl9aWYoIXIpcmV0dXJuITF9cmV0dXJuITB9LGlzVmFsaWREYXRhUHJvcGVydGllc0FycmF5PShlLHQsYSxpKT0+e3RyeXtmb3IobGV0IHM9MDtzPGkubGVuZ3RoO3MrPTEpe2xldCBuPSExO2NvbnN0e2lkOnIscHJvcGVydGllczpvfT1pW3NdO2lmKGFwaS5hc3NlcnQociYmInN0cmluZyI9PXR5cGVvZiByJiYhYXBpLkJpZ051bWJlcihyKS5pc05hTigpJiZhcGkuQmlnTnVtYmVyKHIpLmd0KDApJiZvJiYib2JqZWN0Ij09dHlwZW9mIG8sImludmFsaWQgZGF0YSBwcm9wZXJ0aWVzIikmJmlzVmFsaWREYXRhUHJvcGVydGllcyhlLHQsYSxvKSYmKG49ITApLCFuKXJldHVybiExfX1jYXRjaChlKXtyZXR1cm4hMX1yZXR1cm4hMH0saXNWYWxpZE5mdElkQXJyYXk9ZT0+e3RyeXtsZXQgdD0wO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSs9MSl7bGV0IGk9ITE7Y29uc3R7c3ltYm9sOnMsaWRzOm59PWVbYV07aWYoYXBpLmFzc2VydChzJiYic3RyaW5nIj09dHlwZW9mIHMmJmFwaS52YWxpZGF0b3IuaXNBbHBoYShzKSYmYXBpLnZhbGlkYXRvci5pc1VwcGVyY2FzZShzKSYmcy5sZW5ndGg+MCYmcy5sZW5ndGg8PTEwJiZuJiYib2JqZWN0Ij09dHlwZW9mIG4mJkFycmF5LmlzQXJyYXkobiksImludmFsaWQgbmZ0IGxpc3QiKSYmKHQrPW4ubGVuZ3RoLGFwaS5hc3NlcnQodDw9NTAsImNhbm5vdCBvcGVyYXRlIG9uIG1vcmUgdGhhbiA1MCBORlQgaW5zdGFuY2VzIGF0IG9uY2UiKSkpe2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSs9MSl7Y29uc3QgdD1uW2VdO2lmKCFhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmIWFwaS5CaWdOdW1iZXIodCkuaXNOYU4oKSYmYXBpLkJpZ051bWJlcih0KS5ndCgwKSwiaW52YWxpZCBuZnQgbGlzdCIpKXJldHVybiExfWk9ITB9aWYoIWkpcmV0dXJuITF9fWNhdGNoKGUpe3JldHVybiExfXJldHVybiEwfSxpc1ZhbGlkVG9rZW5CYXNrZXQ9YXN5bmMoZSx0LGEsaSxzKT0+e3RyeXtpZihPYmplY3Qua2V5cyhlKS5sZW5ndGg+MTApcmV0dXJuITE7Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyhlKSl7bGV0IGU9ITE7aWYoInN0cmluZyI9PXR5cGVvZiBuJiZhcGkudmFsaWRhdG9yLmlzQWxwaGEobikmJmFwaS52YWxpZGF0b3IuaXNVcHBlcmNhc2UobikmJm4ubGVuZ3RoPjAmJm4ubGVuZ3RoPD0xMCl7Y29uc3Qgbz1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsInRva2VucyIse3N5bWJvbDpufSk7aWYobyYmciYmInN0cmluZyI9PXR5cGVvZiByJiYhYXBpLkJpZ051bWJlcihyKS5pc05hTigpJiZhcGkuQmlnTnVtYmVyKHIpLmd0KDApJiZjb3VudERlY2ltYWxzKHIpPD1vLnByZWNpc2lvbil7Y29uc3QgcD1uPT09aT9jYWxjdWxhdGVCYWxhbmNlKHIscyxvLnByZWNpc2lvbiwhMCk6cixjPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIix0LHthY2NvdW50OmEsc3ltYm9sOm59KTtjJiZhcGkuQmlnTnVtYmVyKGMuYmFsYW5jZSkuZ3RlKHApJiYoZT0hMCl9fWlmKCFlKXJldHVybiExfX1jYXRjaChlKXtyZXR1cm4hMX1yZXR1cm4hMH07YWN0aW9ucy51cGRhdGVVcmw9KGFzeW5jIGU9Pntjb25zdHt1cmw6dCxzeW1ib2w6YX09ZTtpZihhcGkuYXNzZXJ0KGEmJiJzdHJpbmciPT10eXBlb2YgYSYmdCYmInN0cmluZyI9PXR5cGVvZiB0LCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KHQubGVuZ3RoPD0yNTUsImludmFsaWQgdXJsOiBtYXggbGVuZ3RoIG9mIDI1NSIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOmF9KTtpZihlJiZhcGkuYXNzZXJ0KGUuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikpdHJ5e2NvbnN0IGE9SlNPTi5wYXJzZShlLm1ldGFkYXRhKTthcGkuYXNzZXJ0KGEmJmEudXJsLCJhbiBlcnJvciBvY2N1cmVkIHdoZW4gdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgdXJsIikmJihhLnVybD10LGUubWV0YWRhdGE9SlNPTi5zdHJpbmdpZnkoYSksYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSkpfWNhdGNoKGUpe319fSksYWN0aW9ucy51cGRhdGVNZXRhZGF0YT0oYXN5bmMgZT0+e2NvbnN0e21ldGFkYXRhOnQsc3ltYm9sOmF9PWU7aWYoYXBpLmFzc2VydChhJiYic3RyaW5nIj09dHlwZW9mIGEmJnQmJiJvYmplY3QiPT10eXBlb2YgdCwiaW52YWxpZCBwYXJhbXMiKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7aWYoZSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXRyeXtjb25zdCBhPUpTT04uc3RyaW5naWZ5KHQpO2FwaS5hc3NlcnQoYS5sZW5ndGg8PTFlMywiaW52YWxpZCBtZXRhZGF0YTogbWF4IGxlbmd0aCBvZiAxMDAwIikmJihlLm1ldGFkYXRhPWEsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSkpfWNhdGNoKGUpe319fSksYWN0aW9ucy51cGRhdGVOYW1lPShhc3luYyBlPT57Y29uc3R7bmFtZTp0LHN5bWJvbDphfT1lO2lmKGFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYic3RyaW5nIj09dHlwZW9mIHQsImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdCh0LCIgIikpJiZ0Lmxlbmd0aD4wJiZ0Lmxlbmd0aDw9NTAsImludmFsaWQgbmFtZTogbGV0dGVycywgbnVtYmVycywgd2hpdGVzcGFjZXMgb25seSwgbWF4IGxlbmd0aCBvZiA1MCIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOmF9KTtlJiZhcGkuYXNzZXJ0KGUuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikmJihlLm5hbWU9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSl9fSksYWN0aW9ucy51cGRhdGVPcmdOYW1lPShhc3luYyBlPT57Y29uc3R7b3JnTmFtZTp0LHN5bWJvbDphfT1lO2lmKGFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYic3RyaW5nIj09dHlwZW9mIHQsImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdCh0LCIgIikpJiZ0Lmxlbmd0aD4wJiZ0Lmxlbmd0aDw9NTAsImludmFsaWQgb3JnIG5hbWU6IGxldHRlcnMsIG51bWJlcnMsIHdoaXRlc3BhY2VzIG9ubHksIG1heCBsZW5ndGggb2YgNTAiKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7ZSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpJiYoZS5vcmdOYW1lPXQsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSkpfX0pLGFjdGlvbnMudXBkYXRlUHJvZHVjdE5hbWU9KGFzeW5jIGU9Pntjb25zdHtwcm9kdWN0TmFtZTp0LHN5bWJvbDphfT1lO2lmKGFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYic3RyaW5nIj09dHlwZW9mIHQsImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdCh0LCIgIikpJiZ0Lmxlbmd0aD4wJiZ0Lmxlbmd0aDw9NTAsImludmFsaWQgcHJvZHVjdCBuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB3aGl0ZXNwYWNlcyBvbmx5LCBtYXggbGVuZ3RoIG9mIDUwIikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6YX0pO2UmJmFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSYmKGUucHJvZHVjdE5hbWU9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSl9fSksYWN0aW9ucy5hZGRBdXRob3JpemVkSXNzdWluZ0FjY291bnRzPShhc3luYyBlPT57Y29uc3R7YWNjb3VudHM6dCxzeW1ib2w6YSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aX09ZTtpZihhcGkuYXNzZXJ0KCEwPT09aSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYib2JqZWN0Ij09dHlwZW9mIHQmJkFycmF5LmlzQXJyYXkodCksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQodC5sZW5ndGg8PTEwLCJjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gMTAgYXV0aG9yaXplZCBpc3N1aW5nIGFjY291bnRzIikpe2NvbnN0IGU9aXNWYWxpZEFjY291bnRzQXJyYXkodCk7aWYoYXBpLmFzc2VydChlLCJpbnZhbGlkIGFjY291bnQgbGlzdCIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOmF9KTtpZihlKXtjb25zdCBhPVtdO2lmKHQuZm9yRWFjaCh0PT57Y29uc3QgaT10LnRyaW0oKS50b0xvd2VyQ2FzZSgpO2xldCBzPSExO2ZvcihsZXQgdD0wO3Q8ZS5hdXRob3JpemVkSXNzdWluZ0FjY291bnRzLmxlbmd0aDt0Kz0xKWlmKGk9PT1lLmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHNbdF0pe3M9ITA7YnJlYWt9c3x8YS5wdXNoKGkpfSksYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpJiZhcGkuYXNzZXJ0KCFjb250YWluc0R1cGxpY2F0ZXMoYSksImNhbm5vdCBhZGQgdGhlIHNhbWUgYWNjb3VudCB0d2ljZSIpJiZhcGkuYXNzZXJ0KGUuYXV0aG9yaXplZElzc3VpbmdBY2NvdW50cy5sZW5ndGgrYS5sZW5ndGg8PTEwLCJjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gMTAgYXV0aG9yaXplZCBpc3N1aW5nIGFjY291bnRzIikpe2NvbnN0IHQ9ZS5hdXRob3JpemVkSXNzdWluZ0FjY291bnRzLmNvbmNhdChhKTtlLmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHM9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKX19fX19KSxhY3Rpb25zLmFkZEF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzPShhc3luYyBlPT57Y29uc3R7Y29udHJhY3RzOnQsc3ltYm9sOmEsaXNTaWduZWRXaXRoQWN0aXZlS2V5Oml9PWU7aWYoYXBpLmFzc2VydCghMD09PWksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KGEmJiJzdHJpbmciPT10eXBlb2YgYSYmdCYmIm9iamVjdCI9PXR5cGVvZiB0JiZBcnJheS5pc0FycmF5KHQpLCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KHQubGVuZ3RoPD0xMCwiY2Fubm90IGhhdmUgbW9yZSB0aGFuIDEwIGF1dGhvcml6ZWQgaXNzdWluZyBjb250cmFjdHMiKSl7Y29uc3QgZT1pc1ZhbGlkQ29udHJhY3RzQXJyYXkodCk7aWYoYXBpLmFzc2VydChlLCJpbnZhbGlkIGNvbnRyYWN0IGxpc3QiKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7aWYoZSl7Y29uc3QgYT1bXTtpZih0LmZvckVhY2godD0+e2NvbnN0IGk9dC50cmltKCk7bGV0IHM9ITE7Zm9yKGxldCB0PTA7dDxlLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzLmxlbmd0aDt0Kz0xKWlmKGk9PT1lLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzW3RdKXtzPSEwO2JyZWFrfXN8fGEucHVzaChpKX0pLGFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSYmYXBpLmFzc2VydCghY29udGFpbnNEdXBsaWNhdGVzKGEpLCJjYW5ub3QgYWRkIHRoZSBzYW1lIGNvbnRyYWN0IHR3aWNlIikmJmFwaS5hc3NlcnQoZS5hdXRob3JpemVkSXNzdWluZ0NvbnRyYWN0cy5sZW5ndGgrYS5sZW5ndGg8PTEwLCJjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gMTAgYXV0aG9yaXplZCBpc3N1aW5nIGNvbnRyYWN0cyIpKXtjb25zdCB0PWUuYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHMuY29uY2F0KGEpO2UuYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHM9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKX19fX19KSxhY3Rpb25zLnJlbW92ZUF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHM9KGFzeW5jIGU9Pntjb25zdHthY2NvdW50czp0LHN5bWJvbDphLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppfT1lO2lmKGFwaS5hc3NlcnQoITA9PT1pLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChhJiYic3RyaW5nIj09dHlwZW9mIGEmJnQmJiJvYmplY3QiPT10eXBlb2YgdCYmQXJyYXkuaXNBcnJheSh0KSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydCh0Lmxlbmd0aDw9MTAsImNhbm5vdCByZW1vdmUgbW9yZSB0aGFuIDEwIGF1dGhvcml6ZWQgaXNzdWluZyBhY2NvdW50cyIpKXtjb25zdCBlPWlzVmFsaWRBY2NvdW50c0FycmF5KHQpO2lmKGFwaS5hc3NlcnQoZSwiaW52YWxpZCBhY2NvdW50IGxpc3QiKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7aWYoZSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXtjb25zdCBhPWUuYXV0aG9yaXplZElzc3VpbmdBY2NvdW50cy5maWx0ZXIoZT0+e2ZvcihsZXQgYT0wO2E8dC5sZW5ndGg7YSs9MSl7aWYoZT09PXRbYV0udHJpbSgpLnRvTG93ZXJDYXNlKCkpcmV0dXJuITF9cmV0dXJuITB9KTtlLmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHM9YSxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKX19fX0pLGFjdGlvbnMucmVtb3ZlQXV0aG9yaXplZElzc3VpbmdDb250cmFjdHM9KGFzeW5jIGU9Pntjb25zdHtjb250cmFjdHM6dCxzeW1ib2w6YSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aX09ZTtpZihhcGkuYXNzZXJ0KCEwPT09aSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYib2JqZWN0Ij09dHlwZW9mIHQmJkFycmF5LmlzQXJyYXkodCksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQodC5sZW5ndGg8PTEwLCJjYW5ub3QgcmVtb3ZlIG1vcmUgdGhhbiAxMCBhdXRob3JpemVkIGlzc3VpbmcgY29udHJhY3RzIikpe2NvbnN0IGU9aXNWYWxpZENvbnRyYWN0c0FycmF5KHQpO2lmKGFwaS5hc3NlcnQoZSwiaW52YWxpZCBjb250cmFjdCBsaXN0Iikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6YX0pO2lmKGUmJmFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSl7Y29uc3QgYT1lLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzLmZpbHRlcihlPT57Zm9yKGxldCBhPTA7YTx0Lmxlbmd0aDthKz0xKXtpZihlPT09dFthXS50cmltKCkpcmV0dXJuITF9cmV0dXJuITB9KTtlLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzPWEsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSl9fX19KSxhY3Rpb25zLnRyYW5zZmVyT3duZXJzaGlwPShhc3luYyBlPT57Y29uc3R7c3ltYm9sOnQsdG86YSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aX09ZTtpZihhcGkuYXNzZXJ0KCEwPT09aSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQodCYmInN0cmluZyI9PXR5cGVvZiB0JiZhJiYic3RyaW5nIj09dHlwZW9mIGEsImludmFsaWQgcGFyYW1zIikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pO2lmKGUmJmFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSl7Y29uc3QgdD1hLnRyaW0oKS50b0xvd2VyQ2FzZSgpO2FwaS5hc3NlcnQoaXNWYWxpZFN0ZWVtQWNjb3VudExlbmd0aCh0KSwiaW52YWxpZCB0byIpJiYoZS5pc3N1ZXI9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSl9fX0pLGFjdGlvbnMuZW5hYmxlRGVsZWdhdGlvbj0oYXN5bmMgZT0+e2NvbnN0e3N5bWJvbDp0LHVuZGVsZWdhdGlvbkNvb2xkb3duOmEsaXNTaWduZWRXaXRoQWN0aXZlS2V5Oml9PWUscz1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse2VuYWJsZURlbGVnYXRpb25GZWU6bn09cyxyPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwiYmFsYW5jZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOiJTU0MifSksbz0hIWFwaS5CaWdOdW1iZXIobikubHRlKDApfHxyJiZhcGkuQmlnTnVtYmVyKHIuYmFsYW5jZSkuZ3RlKG4pO2lmKGFwaS5hc3NlcnQobywieW91IG11c3QgaGF2ZSBlbm91Z2ggdG9rZW5zIHRvIGNvdmVyIGZlZXMiKSYmYXBpLmFzc2VydCghMD09PWksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCwiaW52YWxpZCBzeW1ib2wiKSYmYXBpLmFzc2VydChhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpJiZhPjAmJmE8PTE4MjUwLCJ1bmRlbGVnYXRpb25Db29sZG93biBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxODI1MCIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnR9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1lLCJzeW1ib2wgZG9lcyBub3QgZXhpc3QiKSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWUuZGVsZWdhdGlvbkVuYWJsZWR8fCExPT09ZS5kZWxlZ2F0aW9uRW5hYmxlZCwiZGVsZWdhdGlvbiBhbHJlYWR5IGVuYWJsZWQiKSl7aWYoYXBpLkJpZ051bWJlcihuKS5ndCgwKSl7Y29uc3QgZT1hd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoInRva2VucyIsInRyYW5zZmVyIix7dG86Im51bGwiLHN5bWJvbDoiU1NDIixxdWFudGl0eTpuLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppfSk7aWYoIWlzVG9rZW5UcmFuc2ZlclZlcmlmaWVkKGUsYXBpLnNlbmRlciwibnVsbCIsIlNTQyIsbiwidHJhbnNmZXIiKSlyZXR1cm4hMX1yZXR1cm4gZS5kZWxlZ2F0aW9uRW5hYmxlZD0hMCxlLnVuZGVsZWdhdGlvbkNvb2xkb3duPWEsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSksITB9fXJldHVybiExfSksYWN0aW9ucy51cGRhdGVQcm9wZXJ0eURlZmluaXRpb249KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxuYW1lOmEsbmV3TmFtZTppLHR5cGU6cyxpc1JlYWRPbmx5Om4saXNTaWduZWRXaXRoQWN0aXZlS2V5OnJ9PWU7aWYoYXBpLmFzc2VydCghMD09PXIsInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmYSYmInN0cmluZyI9PXR5cGVvZiBhLCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KGFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMoYSkmJmEubGVuZ3RoPjAmJmEubGVuZ3RoPD0yNSwiaW52YWxpZCBuYW1lOiBsZXR0ZXJzICYgbnVtYmVycyBvbmx5LCBtYXggbGVuZ3RoIG9mIDI1IikmJmFwaS5hc3NlcnQodm9pZCAwPT09aXx8InN0cmluZyI9PXR5cGVvZiBpJiZhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKGkpJiZpLmxlbmd0aD4wJiZpLmxlbmd0aDw9MjUsImludmFsaWQgbmV3IG5hbWU6IGxldHRlcnMgJiBudW1iZXJzIG9ubHksIG1heCBsZW5ndGggb2YgMjUiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1zfHwic3RyaW5nIj09dHlwZW9mIHMmJigibnVtYmVyIj09PXN8fCJzdHJpbmciPT09c3x8ImJvb2xlYW4iPT09cyksImludmFsaWQgdHlwZTogbXVzdCBiZSBudW1iZXIsIHN0cmluZywgb3IgYm9vbGVhbiIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PW58fCJib29sZWFuIj09dHlwZW9mIG4sImludmFsaWQgaXNSZWFkT25seTogbXVzdCBiZSB0cnVlIG9yIGZhbHNlIikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pO2lmKGUmJmFwaS5hc3NlcnQoMD09PWUuc3VwcGx5LCJjYW5ub3QgY2hhbmdlIGRhdGEgcHJvcGVydHkgZGVmaW5pdGlvbjsgdG9rZW5zIGFscmVhZHkgaXNzdWVkIikmJmFwaS5hc3NlcnQoYSBpbiBlLnByb3BlcnRpZXMsInByb3BlcnR5IG11c3QgZXhpc3QiKSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXtpZih2b2lkIDAhPT1pKXtpZih2b2lkIDAhPT1lLmdyb3VwQnkmJmUuZ3JvdXBCeS5sZW5ndGg+MCYmIWFwaS5hc3NlcnQoIWUuZ3JvdXBCeS5pbmNsdWRlcyhhKSwiY2Fubm90IGNoYW5nZSBkYXRhIHByb3BlcnR5IG5hbWU7IHByb3BlcnR5IGlzIHBhcnQgb2YgZ3JvdXBCeSIpKXJldHVybiExO2lmKCFhcGkuYXNzZXJ0KGkhPT1hLCJuZXcgbmFtZSBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIG9sZCBuYW1lIil8fCFhcGkuYXNzZXJ0KCEoaSBpbiBlLnByb3BlcnRpZXMpLCJ0aGVyZSBpcyBhbHJlYWR5IGEgZGF0YSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuZXcgbmFtZSIpKXJldHVybiExfWxldCByPSExO2NvbnN0IG89ZS5wcm9wZXJ0aWVzW2FdLnR5cGUscD1lLnByb3BlcnRpZXNbYV0uaXNSZWFkT25seTtyZXR1cm4gdm9pZCAwIT09cyYmcyE9PW8mJihlLnByb3BlcnRpZXNbYV0udHlwZT1zLHI9ITApLHZvaWQgMCE9PW4mJm4hPT1wJiYoZS5wcm9wZXJ0aWVzW2FdLmlzUmVhZE9ubHk9bixyPSEwKSx2b2lkIDAhPT1pJiZpIT09YSYmKGUucHJvcGVydGllc1tpXT1lLnByb3BlcnRpZXNbYV0sZGVsZXRlIGUucHJvcGVydGllc1thXSxyPSEwKSxyJiYoYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSksYXBpLmVtaXQoInVwZGF0ZVByb3BlcnR5RGVmaW5pdGlvbiIse3N5bWJvbDp0LG9yaWdpbmFsTmFtZTphLG9yaWdpbmFsVHlwZTpvLG9yaWdpbmFsSXNSZWFkT25seTpwLG5ld05hbWU6aSxuZXdUeXBlOnMsbmV3SXNSZWFkT25seTpufSkpLCEwfX1yZXR1cm4hMX0pLGFjdGlvbnMuYWRkUHJvcGVydHk9KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxuYW1lOmEsdHlwZTppLGlzUmVhZE9ubHk6cyxhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOm4sYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6cixpc1NpZ25lZFdpdGhBY3RpdmVLZXk6b309ZSxwPWF3YWl0IGFwaS5kYi5maW5kT25lKCJwYXJhbXMiLHt9KSx7ZGF0YVByb3BlcnR5Q3JlYXRpb25GZWU6Y309cDtpZihhcGkuYXNzZXJ0KCEwPT09bywieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQodCYmInN0cmluZyI9PXR5cGVvZiB0JiZhJiYic3RyaW5nIj09dHlwZW9mIGEmJih2b2lkIDA9PT1zfHwiYm9vbGVhbiI9PXR5cGVvZiBzKSYmKHZvaWQgMD09PW58fG4mJiJvYmplY3QiPT10eXBlb2YgbiYmQXJyYXkuaXNBcnJheShuKSkmJih2b2lkIDA9PT1yfHxyJiYib2JqZWN0Ij09dHlwZW9mIHImJkFycmF5LmlzQXJyYXkocikpJiZpJiYic3RyaW5nIj09dHlwZW9mIGksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhKSYmYS5sZW5ndGg+MCYmYS5sZW5ndGg8PTI1LCJpbnZhbGlkIG5hbWU6IGxldHRlcnMgJiBudW1iZXJzIG9ubHksIG1heCBsZW5ndGggb2YgMjUiKSYmYXBpLmFzc2VydCgibnVtYmVyIj09PWl8fCJzdHJpbmciPT09aXx8ImJvb2xlYW4iPT09aSwiaW52YWxpZCB0eXBlOiBtdXN0IGJlIG51bWJlciwgc3RyaW5nLCBvciBib29sZWFuIikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pO2lmKGUmJmFwaS5hc3NlcnQoIShhIGluIGUucHJvcGVydGllcyksImNhbm5vdCBhZGQgdGhlIHNhbWUgcHJvcGVydHkgdHdpY2UiKSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXtpZihPYmplY3Qua2V5cyhlLnByb3BlcnRpZXMpLmxlbmd0aD49Myl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsImJhbGFuY2VzIix7YWNjb3VudDphcGkuc2VuZGVyLHN5bWJvbDoiU1NDIn0pLHQ9ISFhcGkuQmlnTnVtYmVyKGMpLmx0ZSgwKXx8ZSYmYXBpLkJpZ051bWJlcihlLmJhbGFuY2UpLmd0ZShjKTtpZighYXBpLmFzc2VydCh0LCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgdGhlIGNyZWF0aW9uIGZlZXMiKSlyZXR1cm4hMTtpZihhcGkuQmlnTnVtYmVyKGMpLmd0KDApKXtjb25zdCBlPWF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgidG9rZW5zIiwidHJhbnNmZXIiLHt0bzoibnVsbCIsc3ltYm9sOiJTU0MiLHF1YW50aXR5OmMsaXNTaWduZWRXaXRoQWN0aXZlS2V5Om99KTtpZighaXNUb2tlblRyYW5zZmVyVmVyaWZpZWQoZSxhcGkuc2VuZGVyLCJudWxsIiwiU1NDIixjLCJ0cmFuc2ZlciIpKXJldHVybiExfX1jb25zdCBwPXt0eXBlOmksaXNSZWFkT25seTp2b2lkIDAhPT1zJiZzLGF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHM6dm9pZCAwPT09bj9bYXBpLnNlbmRlcl06W10sYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6W119O3JldHVybiBlLnByb3BlcnRpZXNbYV09cCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSwobnx8cikmJmF3YWl0IGFjdGlvbnMuc2V0UHJvcGVydHlQZXJtaXNzaW9ucyh7c3ltYm9sOnQsbmFtZTphLGFjY291bnRzOm4sY29udHJhY3RzOnIsaXNTaWduZWRXaXRoQWN0aXZlS2V5Om99KSwhMH19cmV0dXJuITF9KSxhY3Rpb25zLnNldFByb3BlcnR5UGVybWlzc2lvbnM9KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxuYW1lOmEsYWNjb3VudHM6aSxjb250cmFjdHM6cyxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6bn09ZTtpZihhcGkuYXNzZXJ0KCEwPT09biwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQodCYmInN0cmluZyI9PXR5cGVvZiB0JiZhJiYic3RyaW5nIj09dHlwZW9mIGEmJih2b2lkIDA9PT1pfHxpJiYib2JqZWN0Ij09dHlwZW9mIGkmJkFycmF5LmlzQXJyYXkoaSkpJiYodm9pZCAwPT09c3x8cyYmIm9iamVjdCI9PXR5cGVvZiBzJiZBcnJheS5pc0FycmF5KHMpKSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKGEpJiZhLmxlbmd0aD4wJiZhLmxlbmd0aDw9MjUsImludmFsaWQgbmFtZTogbGV0dGVycyAmIG51bWJlcnMgb25seSwgbWF4IGxlbmd0aCBvZiAyNSIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWl8fGkubGVuZ3RoPD0xMCwiY2Fubm90IGhhdmUgbW9yZSB0aGFuIDEwIGF1dGhvcml6ZWQgYWNjb3VudHMiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1zfHxzLmxlbmd0aDw9MTAsImNhbm5vdCBoYXZlIG1vcmUgdGhhbiAxMCBhdXRob3JpemVkIGNvbnRyYWN0cyIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWl8fGlzVmFsaWRBY2NvdW50c0FycmF5KGkpLCJpbnZhbGlkIGFjY291bnQgbGlzdCIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PXN8fGlzVmFsaWRDb250cmFjdHNBcnJheShzKSwiaW52YWxpZCBjb250cmFjdCBsaXN0Iikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pO2lmKGUmJmFwaS5hc3NlcnQoYSBpbiBlLnByb3BlcnRpZXMsInByb3BlcnR5IG11c3QgZXhpc3QiKSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXtsZXQgdD1bXSxuPVtdO2lmKGkmJih0PWkubWFwKGU9PmUudHJpbSgpLnRvTG93ZXJDYXNlKCkpKSxzJiYobj1zLm1hcChlPT5lLnRyaW0oKSkpLGFwaS5hc3NlcnQodm9pZCAwPT09aXx8IWNvbnRhaW5zRHVwbGljYXRlcyh0KSwiY2Fubm90IGFkZCB0aGUgc2FtZSBhY2NvdW50IHR3aWNlIikmJmFwaS5hc3NlcnQodm9pZCAwPT09c3x8IWNvbnRhaW5zRHVwbGljYXRlcyhuKSwiY2Fubm90IGFkZCB0aGUgc2FtZSBjb250cmFjdCB0d2ljZSIpKXtsZXQgcj0hMTtpJiYoZS5wcm9wZXJ0aWVzW2FdLmF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHM9dCxyPSEwKSxzJiYoZS5wcm9wZXJ0aWVzW2FdLmF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzPW4scj0hMCksciYmYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSl9fX19KSxhY3Rpb25zLnNldEdyb3VwQnk9KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxwcm9wZXJ0aWVzOmEsaXNTaWduZWRXaXRoQWN0aXZlS2V5Oml9PWU7aWYoYXBpLmFzc2VydCghMD09PWksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZBcnJheS5pc0FycmF5KGEpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnR9KTtpZihlKXtjb25zdCB0PU9iamVjdC5rZXlzKGUucHJvcGVydGllcykubGVuZ3RoO2lmKGFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1lLmdyb3VwQnl8fDA9PT1lLmdyb3VwQnkubGVuZ3RoLCJsaXN0IGlzIGFscmVhZHkgc2V0IikmJmFwaS5hc3NlcnQoYS5sZW5ndGg8PXQsImNhbm5vdCBzZXQgbW9yZSBkYXRhIHByb3BlcnRpZXMgdGhhbiBORlQgaGFzIikmJmFwaS5hc3NlcnQoIWNvbnRhaW5zRHVwbGljYXRlcyhhKSwibGlzdCBjYW5ub3QgY29udGFpbiBkdXBsaWNhdGVzIikpe2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7dCs9MSl7Y29uc3QgaT1hW3RdO2lmKCFhcGkuYXNzZXJ0KGkmJiJzdHJpbmciPT10eXBlb2YgaSYmaSBpbiBlLnByb3BlcnRpZXMsImRhdGEgcHJvcGVydHkgbXVzdCBleGlzdCIpKXJldHVybiExfXJldHVybiBlLmdyb3VwQnk9YSxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSwhMH19fXJldHVybiExfSksYWN0aW9ucy5zZXRQcm9wZXJ0aWVzPShhc3luYyBlPT57Y29uc3R7c3ltYm9sOnQsZnJvbVR5cGU6YSxuZnRzOmksY2FsbGluZ0NvbnRyYWN0SW5mbzpzfT1lLG49dm9pZCAwPT09YT8idXNlciI6YTtpZihhcGkuYXNzZXJ0KGkmJiJvYmplY3QiPT10eXBlb2YgaSYmQXJyYXkuaXNBcnJheShpKSYmbiYmInN0cmluZyI9PXR5cGVvZiBuJiZbInVzZXIiLCJjb250cmFjdCJdLmluY2x1ZGVzKG4pJiZ0JiYic3RyaW5nIj09dHlwZW9mIHQmJihzfHx2b2lkIDA9PT1zJiYidXNlciI9PT1uKSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydChpLmxlbmd0aDw9NTAsImNhbm5vdCBzZXQgcHJvcGVydGllcyBvbiBtb3JlIHRoYW4gNTAgTkZUIGluc3RhbmNlcyBhdCBvbmNlIikpe2NvbnN0IGU9InVzZXIiPT09bj9hcGkuc2VuZGVyOnMubmFtZSxhPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnR9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1hLCJzeW1ib2wgZG9lcyBub3QgZXhpc3QiKSl7aWYoIWlzVmFsaWREYXRhUHJvcGVydGllc0FycmF5KGUsbixhLGkpKXJldHVybiExO2NvbnN0IHM9dCsiaW5zdGFuY2VzIjtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrPTEpe2NvbnN0e2lkOnQscHJvcGVydGllczpufT1pW2VdO2lmKDA9PT1PYmplY3Qua2V5cyhuKS5sZW5ndGgpY29udGludWU7Y29uc3Qgcj1hd2FpdCBhcGkuZGIuZmluZE9uZShzLHtfaWQ6YXBpLkJpZ051bWJlcih0KS50b051bWJlcigpfSk7aWYoYXBpLmFzc2VydChudWxsIT09ciwibmZ0IGluc3RhbmNlIGRvZXMgbm90IGV4aXN0Iikpe2xldCBlPSExO2Zvcihjb25zdFt0LGldb2YgT2JqZWN0LmVudHJpZXMobikpe2EucHJvcGVydGllc1t0XS5pc1JlYWRPbmx5P2FwaS5hc3NlcnQoISh0IGluIHIucHJvcGVydGllcyksImNhbm5vdCBlZGl0IHJlYWQtb25seSBwcm9wZXJ0aWVzIikmJihyLnByb3BlcnRpZXNbdF09aSxlPSEwKTooci5wcm9wZXJ0aWVzW3RdPWksZT0hMCl9ZSYmYXdhaXQgYXBpLmRiLnVwZGF0ZShzLHIpfX1yZXR1cm4hMH19cmV0dXJuITF9KSxhY3Rpb25zLmJ1cm49KGFzeW5jIGU9Pntjb25zdHtmcm9tVHlwZTp0LG5mdHM6YSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aSxjYWxsaW5nQ29udHJhY3RJbmZvOnN9PWUsbj12b2lkIDA9PT10PyJ1c2VyIjp0O2lmKGFwaS5hc3NlcnQoITA9PT1pLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChuJiYic3RyaW5nIj09dHlwZW9mIG4mJlsidXNlciIsImNvbnRyYWN0Il0uaW5jbHVkZXMobikmJihzfHx2b2lkIDA9PT1zJiYidXNlciI9PT1uKSYmYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZBcnJheS5pc0FycmF5KGEpLCJpbnZhbGlkIHBhcmFtcyIpJiZpc1ZhbGlkTmZ0SWRBcnJheShhKSl7Y29uc3QgZT0idXNlciI9PT1uP2FwaS5zZW5kZXI6cy5uYW1lO2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7dCs9MSl7Y29uc3R7c3ltYm9sOmksaWRzOnN9PWFbdF0scj1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDppfSk7aWYocil7Y29uc3QgdD1pKyJpbnN0YW5jZXMiO2ZvcihsZXQgYT0wO2E8cy5sZW5ndGg7YSs9MSl7Y29uc3Qgbz1zW2FdLHA9YXdhaXQgYXBpLmRiLmZpbmRPbmUodCx7X2lkOmFwaS5CaWdOdW1iZXIobykudG9OdW1iZXIoKX0pO2lmKHAmJnAuYWNjb3VudD09PWUmJigidSI9PT1wLm93bmVkQnkmJiJ1c2VyIj09PW58fCJjIj09PXAub3duZWRCeSYmImNvbnRyYWN0Ij09PW4pJiZ2b2lkIDA9PT1wLmRlbGVnYXRlZFRvKXtjb25zdCBhPXt9O2xldCBzPSEwO2Zvcihjb25zdFt0LGldb2YgT2JqZWN0LmVudHJpZXMocC5sb2NrZWRUb2tlbnMpKXtjb25zdCByPWF3YWl0IGFwaS50cmFuc2ZlclRva2VucyhlLHQsaSxuKTtpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChyLCJuZnQiLGUsdCxpLCJ0cmFuc2ZlckZyb21Db250cmFjdCIpfHwoYVt0XT1pLHM9ITEpfWFwaS5hc3NlcnQocyxgdW5hYmxlIHRvIHJlbGVhc2UgbG9ja2VkIHRva2VuczogJHtpfSwgaWQgJHtvfWApO2NvbnN0IGM9cC5vd25lZEJ5LGQ9cC5sb2NrZWRUb2tlbnM7cC5sb2NrZWRUb2tlbnM9YSxzJiYocC5wcmV2aW91c0FjY291bnQ9cC5hY2NvdW50LHAucHJldmlvdXNPd25lZEJ5PXAub3duZWRCeSxwLmFjY291bnQ9Im51bGwiLHAub3duZWRCeT0idSIsci5jaXJjdWxhdGluZ1N1cHBseS09MSksYXdhaXQgYXBpLmRiLnVwZGF0ZSh0LHApLHMmJmFwaS5lbWl0KCJidXJuIix7YWNjb3VudDplLG93bmVkQnk6Yyx1bmxvY2tlZFRva2VuczpkLHN5bWJvbDppLGlkOm99KX19YXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIscil9fX19KSxhY3Rpb25zLnRyYW5zZmVyPShhc3luYyBlPT57Y29uc3R7ZnJvbVR5cGU6dCx0bzphLHRvVHlwZTppLG5mdHM6cyxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6bixjYWxsaW5nQ29udHJhY3RJbmZvOnJ9PWUsbz1bInVzZXIiLCJjb250cmFjdCJdLHA9dm9pZCAwPT09aT8idXNlciI6aSxjPXZvaWQgMD09PXQ/InVzZXIiOnQ7aWYoYXBpLmFzc2VydCghMD09PW4sInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KGMmJiJzdHJpbmciPT10eXBlb2YgYyYmby5pbmNsdWRlcyhjKSYmYSYmInN0cmluZyI9PXR5cGVvZiBhJiZwJiYic3RyaW5nIj09dHlwZW9mIHAmJm8uaW5jbHVkZXMocCkmJihyfHx2b2lkIDA9PT1yJiYidXNlciI9PT1jKSYmcyYmIm9iamVjdCI9PXR5cGVvZiBzJiZBcnJheS5pc0FycmF5KHMpLCJpbnZhbGlkIHBhcmFtcyIpJiZpc1ZhbGlkTmZ0SWRBcnJheShzKSl7Y29uc3QgZT0idXNlciI9PT1wP2EudHJpbSgpLnRvTG93ZXJDYXNlKCk6YS50cmltKCksdD0idXNlciI9PT1wP2lzVmFsaWRTdGVlbUFjY291bnRMZW5ndGgoZSk6aXNWYWxpZENvbnRyYWN0TGVuZ3RoKGUpLGk9InVzZXIiPT09Yz9hcGkuc2VuZGVyOnIubmFtZTtpZihhcGkuYXNzZXJ0KHQsImludmFsaWQgdG8iKSYmYXBpLmFzc2VydCghKHA9PT1jJiZlPT09aSksImNhbm5vdCB0cmFuc2ZlciB0byBzZWxmIikmJmFwaS5hc3NlcnQoISgidXNlciI9PT1wJiYibnVsbCI9PT1lKSwiY2Fubm90IHRyYW5zZmVyIHRvIG51bGw7IHVzZSBidXJuIGFjdGlvbiBpbnN0ZWFkIikpZm9yKGxldCB0PTA7dDxzLmxlbmd0aDt0Kz0xKXtjb25zdHtzeW1ib2w6YSxpZHM6bn09c1t0XTtpZihhd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSkpe2NvbnN0IHQ9YSsiaW5zdGFuY2VzIjtmb3IobGV0IHM9MDtzPG4ubGVuZ3RoO3MrPTEpe2NvbnN0IHI9bltzXSxvPWF3YWl0IGFwaS5kYi5maW5kT25lKHQse19pZDphcGkuQmlnTnVtYmVyKHIpLnRvTnVtYmVyKCl9KTtpZihvJiZvLmFjY291bnQ9PT1pJiYoInUiPT09by5vd25lZEJ5JiYidXNlciI9PT1jfHwiYyI9PT1vLm93bmVkQnkmJiJjb250cmFjdCI9PT1jKSYmdm9pZCAwPT09by5kZWxlZ2F0ZWRUbyl7Y29uc3Qgcz1vLm93bmVkQnksbj0idXNlciI9PT1wPyJ1IjoiYyI7by5wcmV2aW91c0FjY291bnQ9by5hY2NvdW50LG8ucHJldmlvdXNPd25lZEJ5PW8ub3duZWRCeSxvLmFjY291bnQ9ZSxvLm93bmVkQnk9bixhd2FpdCBhcGkuZGIudXBkYXRlKHQsbyksYXBpLmVtaXQoInRyYW5zZmVyIix7ZnJvbTppLGZyb21UeXBlOnMsdG86ZSx0b1R5cGU6bixzeW1ib2w6YSxpZDpyfSl9fX19fX0pLGFjdGlvbnMuZGVsZWdhdGU9KGFzeW5jIGU9Pntjb25zdHtmcm9tVHlwZTp0LHRvOmEsdG9UeXBlOmksbmZ0czpzLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpuLGNhbGxpbmdDb250cmFjdEluZm86cn09ZSxvPVsidXNlciIsImNvbnRyYWN0Il0scD12b2lkIDA9PT1pPyJ1c2VyIjppLGM9dm9pZCAwPT09dD8idXNlciI6dDtpZihhcGkuYXNzZXJ0KCEwPT09biwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoYyYmInN0cmluZyI9PXR5cGVvZiBjJiZvLmluY2x1ZGVzKGMpJiZhJiYic3RyaW5nIj09dHlwZW9mIGEmJnAmJiJzdHJpbmciPT10eXBlb2YgcCYmby5pbmNsdWRlcyhwKSYmKHJ8fHZvaWQgMD09PXImJiJ1c2VyIj09PWMpJiZzJiYib2JqZWN0Ij09dHlwZW9mIHMmJkFycmF5LmlzQXJyYXkocyksImludmFsaWQgcGFyYW1zIikmJmlzVmFsaWROZnRJZEFycmF5KHMpKXtjb25zdCBlPSJ1c2VyIj09PXA/YS50cmltKCkudG9Mb3dlckNhc2UoKTphLnRyaW0oKSx0PSJ1c2VyIj09PXA/aXNWYWxpZFN0ZWVtQWNjb3VudExlbmd0aChlKTppc1ZhbGlkQ29udHJhY3RMZW5ndGgoZSksaT0idXNlciI9PT1jP2FwaS5zZW5kZXI6ci5uYW1lO2lmKGFwaS5hc3NlcnQodCwiaW52YWxpZCB0byIpJiZhcGkuYXNzZXJ0KCEocD09PWMmJmU9PT1pKSwiY2Fubm90IGRlbGVnYXRlIHRvIHNlbGYiKSYmYXBpLmFzc2VydCghKCJ1c2VyIj09PXAmJiJudWxsIj09PWUpLCJjYW5ub3QgZGVsZWdhdGUgdG8gbnVsbCIpKWZvcihsZXQgdD0wO3Q8cy5sZW5ndGg7dCs9MSl7Y29uc3R7c3ltYm9sOmEsaWRzOm59PXNbdF0scj1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7aWYociYmYXBpLmFzc2VydCghMD09PXIuZGVsZWdhdGlvbkVuYWJsZWQsYGRlbGVnYXRpb24gbm90IGVuYWJsZWQgZm9yICR7YX1gKSl7Y29uc3QgdD1hKyJpbnN0YW5jZXMiO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cys9MSl7Y29uc3Qgcj1uW3NdLG89YXdhaXQgYXBpLmRiLmZpbmRPbmUodCx7X2lkOmFwaS5CaWdOdW1iZXIocikudG9OdW1iZXIoKX0pO2lmKG8mJm8uYWNjb3VudD09PWkmJigidSI9PT1vLm93bmVkQnkmJiJ1c2VyIj09PWN8fCJjIj09PW8ub3duZWRCeSYmImNvbnRyYWN0Ij09PWMpJiZ2b2lkIDA9PT1vLmRlbGVnYXRlZFRvKXtjb25zdCBzPSJ1c2VyIj09PXA/InUiOiJjIixuPXthY2NvdW50OmUsb3duZWRCeTpzfTtvLmRlbGVnYXRlZFRvPW4sYXdhaXQgYXBpLmRiLnVwZGF0ZSh0LG8pLGFwaS5lbWl0KCJkZWxlZ2F0ZSIse2Zyb206aSxmcm9tVHlwZTpvLm93bmVkQnksdG86ZSx0b1R5cGU6cyxzeW1ib2w6YSxpZDpyfSl9fX19fX0pLGFjdGlvbnMudW5kZWxlZ2F0ZT0oYXN5bmMgZT0+e2NvbnN0e2Zyb21UeXBlOnQsbmZ0czphLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppLGNhbGxpbmdDb250cmFjdEluZm86c309ZSxuPXZvaWQgMD09PXQ/InVzZXIiOnQ7aWYoYXBpLmFzc2VydCghMD09PWksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KG4mJiJzdHJpbmciPT10eXBlb2YgbiYmWyJ1c2VyIiwiY29udHJhY3QiXS5pbmNsdWRlcyhuKSYmKHN8fHZvaWQgMD09PXMmJiJ1c2VyIj09PW4pJiZhJiYib2JqZWN0Ij09dHlwZW9mIGEmJkFycmF5LmlzQXJyYXkoYSksImludmFsaWQgcGFyYW1zIikmJmlzVmFsaWROZnRJZEFycmF5KGEpKXtjb25zdCBlPSJ1c2VyIj09PW4/YXBpLnNlbmRlcjpzLm5hbWUsdD1uZXcgRGF0ZShgJHthcGkuc3RlZW1CbG9ja1RpbWVzdGFtcH0uMDAwWmApO2ZvcihsZXQgaT0wO2k8YS5sZW5ndGg7aSs9MSl7Y29uc3R7c3ltYm9sOnMsaWRzOnJ9PWFbaV0sbz1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDpzfSk7aWYobyYmYXBpLmFzc2VydCghMD09PW8uZGVsZWdhdGlvbkVuYWJsZWQsYGRlbGVnYXRpb24gbm90IGVuYWJsZWQgZm9yICR7c31gKSl7Y29uc3QgYT0yNCpvLnVuZGVsZWdhdGlvbkNvb2xkb3duKjM2MDAqMWUzLGk9dC5nZXRUaW1lKCkrYSxwPXMrImluc3RhbmNlcyIsYz17c3ltYm9sOnMsaWRzOltdLGNvbXBsZXRlVGltZXN0YW1wOml9O2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCs9MSl7Y29uc3QgYT1yW3RdLG89YXdhaXQgYXBpLmRiLmZpbmRPbmUocCx7X2lkOmFwaS5CaWdOdW1iZXIoYSkudG9OdW1iZXIoKX0pO28mJm8uYWNjb3VudD09PWUmJigidSI9PT1vLm93bmVkQnkmJiJ1c2VyIj09PW58fCJjIj09PW8ub3duZWRCeSYmImNvbnRyYWN0Ij09PW4pJiZvLmRlbGVnYXRlZFRvJiZ2b2lkIDA9PT1vLmRlbGVnYXRlZFRvLnVuZGVsZWdhdGVBdCYmKG8uZGVsZWdhdGVkVG8udW5kZWxlZ2F0ZUF0PWksYy5pZHMucHVzaChvLl9pZCksYXdhaXQgYXBpLmRiLnVwZGF0ZShwLG8pLGFwaS5lbWl0KCJ1bmRlbGVnYXRlU3RhcnQiLHtmcm9tOm8uZGVsZWdhdGVkVG8uYWNjb3VudCxmcm9tVHlwZTpvLmRlbGVnYXRlZFRvLm93bmVkQnksc3ltYm9sOnMsaWQ6YX0pKX1jLmlkcy5sZW5ndGg+MCYmYXdhaXQgYXBpLmRiLmluc2VydCgicGVuZGluZ1VuZGVsZWdhdGlvbnMiLGMpfX19fSk7Y29uc3QgcHJvY2Vzc1VuZGVsZWdhdGlvbj1hc3luYyBlPT57Y29uc3R7c3ltYm9sOnQsaWRzOmF9PWUsaT10KyJpbnN0YW5jZXMiLHM9YXdhaXQgYXBpLmRiLmZpbmQoaSx7X2lkOnskaW46YX19LDUwLDAsW3tpbmRleDoiX2lkIixkZXNjZW5kaW5nOiExfV0pO2ZvcihsZXQgZT0wO2U8cy5sZW5ndGg7ZSs9MSlkZWxldGUgc1tlXS5kZWxlZ2F0ZWRUbyxhd2FpdCBhcGkuZGIudXBkYXRlKGksc1tlXSx7ZGVsZWdhdGVkVG86IiJ9KTthd2FpdCBhcGkuZGIucmVtb3ZlKCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIsZSksYXBpLmVtaXQoInVuZGVsZWdhdGVEb25lIix7c3ltYm9sOnQsaWRzOmF9KX07YWN0aW9ucy5jaGVja1BlbmRpbmdVbmRlbGVnYXRpb25zPShhc3luYygpPT57aWYoYXBpLmFzc2VydCgibnVsbCI9PT1hcGkuc2VuZGVyLCJub3QgYXV0aG9yaXplZCIpKXtjb25zdCBlPW5ldyBEYXRlKGAke2FwaS5zdGVlbUJsb2NrVGltZXN0YW1wfS4wMDBaYCkuZ2V0VGltZSgpO2xldCB0PWF3YWl0IGFwaS5kYi5maW5kKCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIse2NvbXBsZXRlVGltZXN0YW1wOnskbHRlOmV9fSksYT10Lmxlbmd0aDtmb3IoO2E+MDspe2ZvcihsZXQgZT0wO2U8YTtlKz0xKXtjb25zdCBhPXRbZV07YXdhaXQgcHJvY2Vzc1VuZGVsZWdhdGlvbihhKX1hPSh0PWF3YWl0IGFwaS5kYi5maW5kKCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIse2NvbXBsZXRlVGltZXN0YW1wOnskbHRlOmV9fSkpLmxlbmd0aH19fSksYWN0aW9ucy5jcmVhdGU9KGFzeW5jIGU9Pntjb25zdHtuYW1lOnQsb3JnTmFtZTphLHByb2R1Y3ROYW1lOmksc3ltYm9sOnMsdXJsOm4sbWF4U3VwcGx5OnIsYXV0aG9yaXplZElzc3VpbmdBY2NvdW50czpvLGF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzOnAsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmN9PWUsZD1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse25mdENyZWF0aW9uRmVlOmx9PWQsdT1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsImJhbGFuY2VzIix7YWNjb3VudDphcGkuc2VuZGVyLHN5bWJvbDoiU1NDIn0pLHk9ISFhcGkuQmlnTnVtYmVyKGwpLmx0ZSgwKXx8dSYmYXBpLkJpZ051bWJlcih1LmJhbGFuY2UpLmd0ZShsKTtpZihhcGkuYXNzZXJ0KHksInlvdSBtdXN0IGhhdmUgZW5vdWdoIHRva2VucyB0byBjb3ZlciB0aGUgY3JlYXRpb24gZmVlcyIpJiZhcGkuYXNzZXJ0KCEwPT09YywieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQodCYmInN0cmluZyI9PXR5cGVvZiB0JiZzJiYic3RyaW5nIj09dHlwZW9mIHMmJih2b2lkIDA9PT1ufHxuJiYic3RyaW5nIj09dHlwZW9mIG4pJiYodm9pZCAwPT09YXx8YSYmInN0cmluZyI9PXR5cGVvZiBhKSYmKHZvaWQgMD09PWl8fGkmJiJzdHJpbmciPT10eXBlb2YgaSkmJih2b2lkIDA9PT1vfHxvJiYib2JqZWN0Ij09dHlwZW9mIG8mJkFycmF5LmlzQXJyYXkobykpJiYodm9pZCAwPT09cHx8cCYmIm9iamVjdCI9PXR5cGVvZiBwJiZBcnJheS5pc0FycmF5KHApKSYmKHZvaWQgMD09PXJ8fHImJiJzdHJpbmciPT10eXBlb2YgciYmIWFwaS5CaWdOdW1iZXIocikuaXNOYU4oKSksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhKHMpJiZhcGkudmFsaWRhdG9yLmlzVXBwZXJjYXNlKHMpJiZzLmxlbmd0aD4wJiZzLmxlbmd0aDw9MTAsImludmFsaWQgc3ltYm9sOiB1cHBlcmNhc2UgbGV0dGVycyBvbmx5LCBtYXggbGVuZ3RoIG9mIDEwIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdCh0LCIgIikpJiZ0Lmxlbmd0aD4wJiZ0Lmxlbmd0aDw9NTAsImludmFsaWQgbmFtZTogbGV0dGVycywgbnVtYmVycywgd2hpdGVzcGFjZXMgb25seSwgbWF4IGxlbmd0aCBvZiA1MCIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWF8fGFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMoYXBpLnZhbGlkYXRvci5ibGFja2xpc3QoYSwiICIpKSYmYS5sZW5ndGg+MCYmYS5sZW5ndGg8PTUwLCJpbnZhbGlkIG9yZyBuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB3aGl0ZXNwYWNlcyBvbmx5LCBtYXggbGVuZ3RoIG9mIDUwIikmJmFwaS5hc3NlcnQodm9pZCAwPT09aXx8YXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdChpLCIgIikpJiZpLmxlbmd0aD4wJiZpLmxlbmd0aDw9NTAsImludmFsaWQgcHJvZHVjdCBuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB3aGl0ZXNwYWNlcyBvbmx5LCBtYXggbGVuZ3RoIG9mIDUwIikmJmFwaS5hc3NlcnQodm9pZCAwPT09bnx8bi5sZW5ndGg8PTI1NSwiaW52YWxpZCB1cmw6IG1heCBsZW5ndGggb2YgMjU1IikmJmFwaS5hc3NlcnQodm9pZCAwPT09cnx8YXBpLkJpZ051bWJlcihyKS5ndCgwKSwibWF4U3VwcGx5IG11c3QgYmUgcG9zaXRpdmUiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1yfHxhcGkuQmlnTnVtYmVyKHIpLmx0ZShOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksYG1heFN1cHBseSBtdXN0IGJlIGxvd2VyIHRoYW4gJHtOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn1gKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDpzfSk7aWYoYXBpLmFzc2VydChudWxsPT09ZSwic3ltYm9sIGFscmVhZHkgZXhpc3RzIikpe2lmKGFwaS5CaWdOdW1iZXIobCkuZ3QoMCkpe2NvbnN0IGU9YXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ0b2tlbnMiLCJ0cmFuc2ZlciIse3RvOiJudWxsIixzeW1ib2w6IlNTQyIscXVhbnRpdHk6bCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6Y30pO2lmKCFpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChlLGFwaS5zZW5kZXIsIm51bGwiLCJTU0MiLGwsInRyYW5zZmVyIikpcmV0dXJuITF9Y29uc3QgZT12b2lkIDA9PT1yPzA6YXBpLkJpZ051bWJlcihyKS5pbnRlZ2VyVmFsdWUoYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKS50b051bWJlcigpLGQ9dm9pZCAwPT09YT8iIjphLHU9dm9pZCAwPT09aT8iIjppO2xldCB5PXt1cmw6dm9pZCAwPT09bj8iIjpufTt5PUpTT04uc3RyaW5naWZ5KHkpO2NvbnN0IGY9dm9pZCAwPT09bz9bYXBpLnNlbmRlcl06W10sbT17aXNzdWVyOmFwaS5zZW5kZXIsc3ltYm9sOnMsbmFtZTp0LG9yZ05hbWU6ZCxwcm9kdWN0TmFtZTp1LG1ldGFkYXRhOnksbWF4U3VwcGx5OmUsc3VwcGx5OjAsY2lyY3VsYXRpbmdTdXBwbHk6MCxkZWxlZ2F0aW9uRW5hYmxlZDohMSx1bmRlbGVnYXRpb25Db29sZG93bjowLGF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHM6ZixhdXRob3JpemVkSXNzdWluZ0NvbnRyYWN0czpbXSxwcm9wZXJ0aWVzOnt9LGdyb3VwQnk6W119LGc9cysiaW5zdGFuY2VzIjtyZXR1cm4hMT09PWF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cyhnKSYmYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKGcsWyJhY2NvdW50Iiwib3duZWRCeSJdKSxhd2FpdCBhcGkuZGIuaW5zZXJ0KCJuZnRzIixtKSx2b2lkIDAhPT1vJiZhd2FpdCBhY3Rpb25zLmFkZEF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHMoe2FjY291bnRzOm8sc3ltYm9sOnMsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmN9KSx2b2lkIDAhPT1wJiZhd2FpdCBhY3Rpb25zLmFkZEF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzKHtjb250cmFjdHM6cCxzeW1ib2w6cyxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6Y30pLCEwfX1yZXR1cm4hMX0pLGFjdGlvbnMuaXNzdWU9KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxmcm9tVHlwZTphLHRvOmksdG9UeXBlOnMsZmVlU3ltYm9sOm4sbG9ja1Rva2VuczpyLHByb3BlcnRpZXM6byxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6cCxjYWxsaW5nQ29udHJhY3RJbmZvOmN9PWUsZD1bInVzZXIiLCJjb250cmFjdCJdLGw9dm9pZCAwPT09cz8idXNlciI6cyx1PXZvaWQgMD09PWE/InVzZXIiOmEseT1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse25mdElzc3VhbmNlRmVlOmZ9PXk7aWYoYXBpLmFzc2VydCghMD09PXAsInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmdSYmInN0cmluZyI9PXR5cGVvZiB1JiZkLmluY2x1ZGVzKHUpJiYoY3x8dm9pZCAwPT09YyYmInVzZXIiPT09dSkmJmkmJiJzdHJpbmciPT10eXBlb2YgaSYmbCYmInN0cmluZyI9PXR5cGVvZiBsJiZkLmluY2x1ZGVzKGwpJiZuJiYic3RyaW5nIj09dHlwZW9mIG4mJm4gaW4gZiYmKHZvaWQgMD09PW98fG8mJiJvYmplY3QiPT10eXBlb2YgbykmJih2b2lkIDA9PT1yfHxyJiYib2JqZWN0Ij09dHlwZW9mIHIpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBlPSJ1c2VyIj09PWw/aS50cmltKCkudG9Mb3dlckNhc2UoKTppLnRyaW0oKSxhPSJ1c2VyIj09PWw/aXNWYWxpZFN0ZWVtQWNjb3VudExlbmd0aChlKTppc1ZhbGlkQ29udHJhY3RMZW5ndGgoZSkscz0idXNlciI9PT11P2FwaS5zZW5kZXI6Yy5uYW1lLGQ9InVzZXIiPT09dT8iYmFsYW5jZXMiOiJjb250cmFjdHNCYWxhbmNlcyI7aWYoYXBpLmFzc2VydChhLCJpbnZhbGlkIHRvIikpe2NvbnN0IGE9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pLGk9YXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCJ0b2tlbnMiLCJ0b2tlbnMiLHtzeW1ib2w6bn0pO2lmKGFwaS5hc3NlcnQobnVsbCE9PWEsInN5bWJvbCBkb2VzIG5vdCBleGlzdCIpJiZhcGkuYXNzZXJ0KG51bGwhPT1pLCJmZWUgc3ltYm9sIGRvZXMgbm90IGV4aXN0Iikpe2NvbnN0IGM9dCsiaW5zdGFuY2VzIjtpZihhcGkuYXNzZXJ0KCJjb250cmFjdCI9PT11JiZhLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzLmluY2x1ZGVzKHMpfHwidXNlciI9PT11JiZhLmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHMuaW5jbHVkZXMocyksIm5vdCBhbGxvd2VkIHRvIGlzc3VlIHRva2VucyIpJiZhcGkuYXNzZXJ0KDA9PT1hLm1heFN1cHBseXx8YS5zdXBwbHk8YS5tYXhTdXBwbHksIm1heCBzdXBwbHkgbGltaXQgcmVhY2hlZCIpKXtjb25zdCB5PU9iamVjdC5rZXlzKGEucHJvcGVydGllcykubGVuZ3RoLG09YXBpLkJpZ051bWJlcihmW25dKS5tdWx0aXBsaWVkQnkoeSksZz1jYWxjdWxhdGVCYWxhbmNlKGZbbl0sbSxpLnByZWNpc2lvbiwhMCksYj1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsZCx7YWNjb3VudDpzLHN5bWJvbDpufSksaD0hIWFwaS5CaWdOdW1iZXIoZykubHRlKDApfHxiJiZhcGkuQmlnTnVtYmVyKGIuYmFsYW5jZSkuZ3RlKGcpO2lmKHIpe2NvbnN0IGU9YXdhaXQgaXNWYWxpZFRva2VuQmFza2V0KHIsZCxzLG4sZyk7aWYoIWFwaS5hc3NlcnQoZSwiaW52YWxpZCBiYXNrZXQgb2YgdG9rZW5zIHRvIGxvY2sgKGNhbm5vdCBsb2NrIG1vcmUgdGhhbiAxMCB0b2tlbiB0eXBlczsgaXNzdWluZyBhY2NvdW50IG11c3QgaGF2ZSBlbm91Z2ggYmFsYW5jZSkiKSlyZXR1cm4hMX1sZXQgdj17fTtpZih2b2lkIDAhPT1vKXt0cnl7aWYoIWlzVmFsaWREYXRhUHJvcGVydGllcyhzLHUsYSxvKSlyZXR1cm4hMX1jYXRjaChlKXtyZXR1cm4hMX12PW99aWYoYXBpLmFzc2VydChoLCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgdGhlIGlzc3VhbmNlIGZlZXMiKSl7aWYoYXBpLkJpZ051bWJlcihnKS5ndCgwKSlpZigiY29udHJhY3QiPT09dSl7Y29uc3QgZT1hd2FpdCBhcGkudHJhbnNmZXJUb2tlbnNGcm9tQ2FsbGluZ0NvbnRyYWN0KCJudWxsIixuLGcsInVzZXIiKTtpZighYXBpLmFzc2VydChpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChlLHMsIm51bGwiLG4sZywidHJhbnNmZXJGcm9tQ29udHJhY3QiKSwidW5hYmxlIHRvIHRyYW5zZmVyIGlzc3VhbmNlIGZlZSIpKXJldHVybiExfWVsc2V7Y29uc3QgZT1hd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoInRva2VucyIsInRyYW5zZmVyIix7dG86Im51bGwiLHN5bWJvbDpuLHF1YW50aXR5OmcsaXNTaWduZWRXaXRoQWN0aXZlS2V5OnB9KTtpZighYXBpLmFzc2VydChpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChlLHMsIm51bGwiLG4sZywidHJhbnNmZXIiKSwidW5hYmxlIHRvIHRyYW5zZmVyIGlzc3VhbmNlIGZlZSIpKXJldHVybiExfWNvbnN0IGk9e307aWYocilmb3IoY29uc3RbZSx0XW9mIE9iamVjdC5lbnRyaWVzKHIpKWlmKCJjb250cmFjdCI9PT11KXtjb25zdCBhPWF3YWl0IGFwaS50cmFuc2ZlclRva2Vuc0Zyb21DYWxsaW5nQ29udHJhY3QoIm5mdCIsZSx0LCJjb250cmFjdCIpO2lzVG9rZW5UcmFuc2ZlclZlcmlmaWVkKGEscywibmZ0IixlLHQsInRyYW5zZmVyRnJvbUNvbnRyYWN0IikmJihpW2VdPXQpfWVsc2V7Y29uc3QgYT1hd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoInRva2VucyIsInRyYW5zZmVyVG9Db250cmFjdCIse3RvOiJuZnQiLHN5bWJvbDplLHF1YW50aXR5OnQsaXNTaWduZWRXaXRoQWN0aXZlS2V5OnB9KTtpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChhLHMsIm5mdCIsZSx0LCJ0cmFuc2ZlclRvQ29udHJhY3QiKSYmKGlbZV09dCl9Y29uc3Qgbz17YWNjb3VudDplLG93bmVkQnk6InVzZXIiPT09bD8idSI6ImMiLGxvY2tlZFRva2VuczppLHByb3BlcnRpZXM6dn0sZD1hd2FpdCBhcGkuZGIuaW5zZXJ0KGMsbyk7cmV0dXJuIGEuc3VwcGx5Kz0xLCJudWxsIj09PWUmJiJjb250cmFjdCIhPT1sfHwoYS5jaXJjdWxhdGluZ1N1cHBseSs9MSksYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsYSksYXBpLmVtaXQoImlzc3VlIix7ZnJvbTpzLGZyb21UeXBlOnUsdG86ZSx0b1R5cGU6bCxzeW1ib2w6dCxsb2NrZWRUb2tlbnM6aSxwcm9wZXJ0aWVzOnYsaWQ6ZC5faWR9KSwhMH19fX19cmV0dXJuITF9KSxhY3Rpb25zLmlzc3VlTXVsdGlwbGU9KGFzeW5jIGU9Pntjb25zdHtpbnN0YW5jZXM6dCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6YSxjYWxsaW5nQ29udHJhY3RJbmZvOml9PWU7aWYoYXBpLmFzc2VydCghMD09PWEsInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJvYmplY3QiPT10eXBlb2YgdCYmQXJyYXkuaXNBcnJheSh0KSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydCh0Lmxlbmd0aDw9MTAsImNhbm5vdCBpc3N1ZSBtb3JlIHRoYW4gMTAgTkZUIGluc3RhbmNlcyBhdCBvbmNlIikpZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKz0xKXtjb25zdHtzeW1ib2w6cyxmcm9tVHlwZTpuLHRvOnIsdG9UeXBlOm8sZmVlU3ltYm9sOnAsbG9ja1Rva2VuczpjLHByb3BlcnRpZXM6ZH09dFtlXTthd2FpdCBhY3Rpb25zLmlzc3VlKHtzeW1ib2w6cyxmcm9tVHlwZTpuLHRvOnIsdG9UeXBlOm8sZmVlU3ltYm9sOnAsbG9ja1Rva2VuczpjLHByb3BlcnRpZXM6ZCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6YSxjYWxsaW5nQ29udHJhY3RJbmZvOml9KX19KTs="
}
}
}

{
"id": "ssc-testnet1",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "crittermanager",
"params": "",
"code": "LyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqLwovKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCi8qIGdsb2JhbCBhY3Rpb25zLCBhcGkgKi8KCi8vIHRlc3QgY29udHJhY3QgdG8gZGVtb25zdHJhdGUgU3BsaW50ZXJsYW5kcyBzdHlsZQovLyBwYWNrIGlzc3VhbmNlIG9mIGNvbGxlY3RhYmxlIGNyaXR0ZXJzCmNvbnN0IENPTlRSQUNUX05BTUUgPSAnY3JpdHRlcm1hbmFnZXInOwoKLy8gbm9ybWFsbHkgd2Ugd291bGQgdXNlIGFwaS5vd25lciB0byByZWZlciB0byB0aGUgY29udHJhY3QKLy8gb3duZXIgKHRoZSBhY2NvdW50IHRoYXQgZGVwbG95ZWQgdGhlIGNvbnRyYWN0KSwgYnV0IGZvciBub3cKLy8gY29udHJhY3QgZGVwbG95bWVudCBpcyByZXN0cmljdGVkLCBzbyB3ZSBuZWVkIGFub3RoZXIgd2F5Ci8vIHRvIHJlY29nbml6ZSB0aGUgQ3JpdHRlciBhcHAgb3duZXIKY29uc3QgQ1JJVFRFUl9DUkVBVE9SID0gJ2NyeXB0b21hbmNlcic7CgovLyB0aGlzIHBsYWNlaG9sZGVyIHJlcHJlc2VudHMgRU5HIHRva2VucyBvbiB0aGUgbWFpbm5ldCBhbmQgU1NDIG9uIHRoZSB0ZXN0bmV0Ci8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcKY29uc3QgVVRJTElUWV9UT0tFTl9TWU1CT0wgPSAiU1NDIjsKCi8vIHdlIHdpbGwgaXNzdWUgY3JpdHRlcnMgaW4gInBhY2tzIiBvZiA1IGF0IGEgdGltZQpjb25zdCBDUklUVEVSU19QRVJfUEFDSyA9IDU7CgphY3Rpb25zLmNyZWF0ZVNTQyA9IGFzeW5jICgpID0+IHsKICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cygncGFyYW1zJyk7CiAgaWYgKHRhYmxlRXhpc3RzID09PSBmYWxzZSkgewogICAgYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCdwYXJhbXMnKTsKCiAgICAvLyBUaGlzIHRhYmxlIHdpbGwgc3RvcmUgY29udHJhY3QgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KICAgIC8vIEZvciB0aGlzIHRlc3QsIHdlIGhhdmUgMyBDUklUVEVSIGVkaXRpb25zIHRoYXQgeW91IGNhbiBidXkKICAgIC8vIHdpdGggZGlmZmVyZW50IHRva2Vucy4gVGhlIGNvbnRyYWN0IG93bmVyIGNhbiBhZGQgbW9yZQogICAgLy8gZWRpdGlvbnMgdmlhIHRoZSB1cGRhdGVQYXJhbXMgYWN0aW9uLgogICAgY29uc3QgcGFyYW1zID0ge307CiAgICBwYXJhbXMuZWRpdGlvbk1hcHBpbmcgPSB7CiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcKICAgICAgIlNTQyI6IDEsCiAgICAgIEFMUEhBOiAyLAogICAgICBCRVRBOiAzLAogICAgfTsKICAgIGF3YWl0IGFwaS5kYi5pbnNlcnQoJ3BhcmFtcycsIHBhcmFtcyk7CiAgfQp9OwoKLy8gaGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIHRoYXQgdG9rZW4gdHJhbnNmZXJzIHN1Y2NlZWRlZApjb25zdCBpc1Rva2VuVHJhbnNmZXJWZXJpZmllZCA9IChyZXN1bHQsIGZyb20sIHRvLCBzeW1ib2wsIHF1YW50aXR5LCBldmVudFN0cikgPT4gewogIGlmIChyZXN1bHQuZXJyb3JzID09PSB1bmRlZmluZWQKICAgICYmIHJlc3VsdC5ldmVudHMgJiYgcmVzdWx0LmV2ZW50cy5maW5kKGVsID0+IGVsLmNvbnRyYWN0ID09PSAndG9rZW5zJyAmJiBlbC5ldmVudCA9PT0gZXZlbnRTdHIKICAgICYmIGVsLmRhdGEuZnJvbSA9PT0gZnJvbSAmJiBlbC5kYXRhLnRvID09PSB0byAmJiBlbC5kYXRhLnF1YW50aXR5ID09PSBxdWFudGl0eSAmJiBlbC5kYXRhLnN5bWJvbCA9PT0gc3ltYm9sKSAhPT0gdW5kZWZpbmVkKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9OwoKLy8gVGhlIGNvbnRyYWN0IG93bmVyIGNhbiB1c2UgdGhpcyBhY3Rpb24gdG8gdXBkYXRlIHNldHRpbmdzCi8vIHdpdGhvdXQgaGF2aW5nIHRvIGNoYW5nZSAmIHJlZGVwbG95IHRoZSBjb250cmFjdCBzb3VyY2UgY29kZS4KYWN0aW9ucy51cGRhdGVQYXJhbXMgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGlmIChhcGkuc2VuZGVyICE9PSBDUklUVEVSX0NSRUFUT1IpIHJldHVybjsKCiAgY29uc3QgewogICAgZWRpdGlvbk1hcHBpbmcsCiAgfSA9IHBheWxvYWQ7CgogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CgogIGlmIChlZGl0aW9uTWFwcGluZyAmJiB0eXBlb2YgZWRpdGlvbk1hcHBpbmcgPT09ICdvYmplY3QnKSB7CiAgICBwYXJhbXMuZWRpdGlvbk1hcHBpbmcgPSBlZGl0aW9uTWFwcGluZzsKICB9CgogIGF3YWl0IGFwaS5kYi51cGRhdGUoJ3BhcmFtcycsIHBhcmFtcyk7Cn07CgovLyBUaGUgY29udHJhY3Qgb3duZXIgY2FuIGNhbGwgdGhpcyBhY3Rpb24gb25lIHRpbWUgb25seSwgdG8KLy8gY3JlYXRlIHRoZSBDUklUVEVSIE5GVCBkZWZpbml0aW9uLiBOb3JtYWxseSB5b3Ugd291bGQgcHJvYmFibHkKLy8gZG8gdGhpcyB0aHJvdWdoIHRoZSBTdGVlbSBFbmdpbmUgd2ViIHNpdGUsIGJ1dCB3ZSBpbmNsdWRlIGl0Ci8vIGhlcmUgdG8gaWxsdXN0cmF0ZSBwcm9ncmFtbWF0aWMgTkZUIGNyZWF0aW9uLCBhbmQgdG8gbWFrZSBpdAovLyBjbGVhciB3aGF0IGRhdGEgcHJvcGVydGllcyB3ZSBuZWVkLiBOb3RlOiB0aGUgY29udHJhY3Qgb3duZXIKLy8gbXVzdCBoYXZlIGVub3VnaCBFTkcvU1NDIHRvIHBheSB0aGUgY3JlYXRpb24gZmVlcy4gRm9yIHNpbXBsaWNpdHkKLy8gd2UgZG9uJ3QgZG8gY2hlY2tzIG9uIHRoZSBvd25lcidzIGJhbGFuY2UgaGVyZSwgYnV0IGluIGEKLy8gcHJvZHVjdGlvbiByZWFkeSBzbWFydCBjb250cmFjdCB3ZSBkZWZpbml0ZWx5IHNob3VsZCBkbyBzbwovLyBiZWZvcmUgdGFraW5nIGFueSBhY3Rpb24gdGhhdCBzcGVuZHMgdG9rZW5zIGFzIGEgc2lkZSBlZmZlY3QuCmFjdGlvbnMuY3JlYXRlTmZ0ID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBpZiAoYXBpLnNlbmRlciAhPT0gQ1JJVFRFUl9DUkVBVE9SKSByZXR1cm47CgogIC8vIHRoaXMgYWN0aW9uIHJlcXVpcmVzIGFjdGl2ZSBrZXkgYXV0aG9yaXphdGlvbgogIGNvbnN0IHsKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgLy8gdmVyaWZ5IENSSVRURVIgZG9lcyBub3QgZXhpc3QgeWV0CiAgY29uc3QgbmZ0ID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCduZnQnLCAnbmZ0cycsIHsgc3ltYm9sOiAnQ1JJVFRFUicgfSk7CiAgaWYgKGFwaS5hc3NlcnQobmZ0ID09PSBudWxsLCAnQ1JJVFRFUiBhbHJlYWR5IGV4aXN0cycpCiAgICAmJiBhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ3lvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpKSB7CiAgICAvLyBjcmVhdGUgQ1JJVFRFUgogICAgLy8gTm90ZSAxOiB3ZSBkb24ndCBzcGVjaWZ5IG1heFN1cHBseSwgd2hpY2ggbWVhbnMgdGhlIHN1cHBseSBvZiBDUklUVEVSCiAgICAvLyB3aWxsIGJlIHVubGltaXRlZC4gQnV0IGluZGlyZWN0bHkgdGhlIHN1cHBseSBpcyBsaW1pdGVkIGJ5IHRoZQogICAgLy8gc3VwcGx5IG9mIHRoZSB0b2tlbnMgeW91IGNhbiB1c2UgdG8gYnV5IENSSVRURVJTLgogICAgLy8gTm90ZSAyOiB3ZSB3YW50IHRoaXMgY29udHJhY3QgdG8gYmUgdGhlIG9ubHkgYXV0aG9yaXplZCB0b2tlbiBpc3N1ZXIKICAgIGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgnbmZ0JywgJ2NyZWF0ZScsIHsKICAgICAgbmFtZTogJ01pc2NoaWV2b3VzIENyeXB0byBDcml0dGVycycsCiAgICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgICBhdXRob3JpemVkSXNzdWluZ0FjY291bnRzOiBbXSwKICAgICAgYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHM6IFtDT05UUkFDVF9OQU1FXSwKICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CgogICAgLy8gTm93IGFkZCBzb21lIGRhdGEgcHJvcGVydGllcyAobm90ZSB0aGF0IG9ubHkgdGhpcyBjb250cmFjdCBpcwogICAgLy8gYXV0aG9yaXplZCB0byBlZGl0IGRhdGEgcHJvcGVydGllcykuIFdlIGNvdWxkIGhhdmUgY2hvc2VuIGEgbW9yZQogICAgLy8gZWNvbm9taWNhbCBkZXNpZ24gYnkgZm9ybWF0dGluZyB0aGVzZSBpbiBzb21lIGN1c3RvbSB3YXkgdG8gZml0CiAgICAvLyB3aXRoaW4gYSBzaW5nbGUgc3RyaW5nIGRhdGEgcHJvcGVydHksIHdoaWNoIHdvdWxkIGN1dCBkb3duIG9uCiAgICAvLyB0b2tlbiBpc3N1YW5jZSBmZWVzLiBUaGUgZHJhd2JhY2sgaXMgdGhlbiB3ZSBsb3NlIHRoZSBhYmlsaXR5IHRvCiAgICAvLyBlYXNpbHkgcXVlcnkgdG9rZW5zIGJ5IHByb3BlcnRpZXMgKGZvciBleGFtcGxlLCBnZXQgYSBsaXN0IG9mIGFsbAogICAgLy8gcmFyZSBjcml0dGVycyBvciBhbGwgY3JpdHRlcnMgYmVsb25naW5nIHRvIGEgY2VydGFpbiBlZGl0aW9uLCBldGMpLgoKICAgIC8vIEVkaXRpb24gb25seSBnZXRzIHNldCBvbmNlIGF0IGlzc3VhbmNlIGFuZCBuZXZlciBjaGFuZ2VzLCBzbyB3ZQogICAgLy8gY2FuIG1ha2UgaXQgcmVhZCBvbmx5LgogICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAnYWRkUHJvcGVydHknLCB7CiAgICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgICBuYW1lOiAnZWRpdGlvbicsCiAgICAgIHR5cGU6ICdudW1iZXInLAogICAgICBpc1JlYWRPbmx5OiB0cnVlLAogICAgICBhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOiBbXSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6IFtDT05UUkFDVF9OQU1FXSwKICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CgogICAgLy8gVHlwZSAod2hpY2ggYWxzbyBuZXZlciBjaGFuZ2VzIG9uY2Ugc2V0KSByZXByZXNlbnRzIHRoZSBraW5kIG9mCiAgICAvLyBjcml0dGVyIHdpdGhpbiBhbiBlZGl0aW9uLiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyB2YWx1ZSBpcwogICAgLy8gaGFuZGxlZCBieSB3aGF0ZXZlciBhcHAgdXNlcyB0aGVzZSB0b2tlbnM7IGZvciBleGFtcGxlIG1heWJlCiAgICAvLyAwID0gZHJhZ29uLCAxID0gdHJvbGwsIDIgPSBnb2JsaW4sIGV0YwogICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAnYWRkUHJvcGVydHknLCB7CiAgICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgICBuYW1lOiAndHlwZScsCiAgICAgIHR5cGU6ICdudW1iZXInLAogICAgICBpc1JlYWRPbmx5OiB0cnVlLAogICAgICBhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOiBbXSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6IFtDT05UUkFDVF9OQU1FXSwKICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CgogICAgLy8gSG93IHJhcmUgaXMgdGhpcyBjcml0dGVyPyAwID0gY29tbW9uLCAxID0gdW5jb21tb24sCiAgICAvLyAyID0gcmFyZSwgMyA9IGxlZ2VuZGFyeQogICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAnYWRkUHJvcGVydHknLCB7CiAgICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgICBuYW1lOiAncmFyaXR5JywKICAgICAgdHlwZTogJ251bWJlcicsCiAgICAgIGlzUmVhZE9ubHk6IHRydWUsCiAgICAgIGF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHM6IFtdLAogICAgICBhdXRob3JpemVkRWRpdGluZ0NvbnRyYWN0czogW0NPTlRSQUNUX05BTUVdLAogICAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICB9KTsKCiAgICAvLyBEbyB3ZSBoYXZlIGEgc3VwZXIgcmFyZSBnb2xkIGZvaWw/CiAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICdhZGRQcm9wZXJ0eScsIHsKICAgICAgc3ltYm9sOiAnQ1JJVFRFUicsCiAgICAgIG5hbWU6ICdpc0dvbGRGb2lsJywKICAgICAgdHlwZTogJ2Jvb2xlYW4nLAogICAgICBpc1JlYWRPbmx5OiB0cnVlLAogICAgICBhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOiBbXSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6IFtDT05UUkFDVF9OQU1FXSwKICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CgogICAgLy8gV2Ugd2lsbCBhbGxvdyBwZW9wbGUgdG8gY3VzdG9taXplIHRoZWlyIGNyaXR0ZXJzCiAgICAvLyBieSBuYW1pbmcgdGhlbSAobm90ZSB0aGlzIGlzIE5PVCByZWFkIG9ubHkhKQogICAgYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAnYWRkUHJvcGVydHknLCB7CiAgICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgICBuYW1lOiAnbmFtZScsCiAgICAgIHR5cGU6ICdzdHJpbmcnLAogICAgICBhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOiBbXSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6IFtDT05UUkFDVF9OQU1FXSwKICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CgogICAgLy8gYWRkIHNvbWUgb3RoZXIgbWlzY2VsbGFuZW91cyBwcm9wZXJ0aWVzIGZvciB0aGUgc2FrZSBvZgogICAgLy8gY29tcGxldGVuZXNzCiAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICdhZGRQcm9wZXJ0eScsIHsKICAgICAgc3ltYm9sOiAnQ1JJVFRFUicsCiAgICAgIG5hbWU6ICd4cCcsIC8vIGV4cGVyaWVuY2UgcG9pbnRzCiAgICAgIHR5cGU6ICdudW1iZXInLAogICAgICBhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOiBbXSwKICAgICAgYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6IFtDT05UUkFDVF9OQU1FXSwKICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgfSk7CiAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICdhZGRQcm9wZXJ0eScsIHsKICAgICAgc3ltYm9sOiAnQ1JJVFRFUicsCiAgICAgIG5hbWU6ICdocCcsIC8vIGhlYWx0aCBwb2ludHMKICAgICAgdHlwZTogJ251bWJlcicsCiAgICAgIGF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHM6IFtdLAogICAgICBhdXRob3JpemVkRWRpdGluZ0NvbnRyYWN0czogW0NPTlRSQUNUX05BTUVdLAogICAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICB9KTsKICB9Cn07CgovLyBUaGlzIGFjdGlvbiBjYW4gYmUgY2FsbGVkIGJ5IGEgdG9rZW4gaG9sZGVyIHRvIGNoYW5nZQovLyB0aGVpciBjcml0dGVyJ3MgbmFtZS4KYWN0aW9ucy51cGRhdGVOYW1lID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7IGlkLCBuYW1lIH0gPSBwYXlsb2FkOwoKICBpZiAoYXBpLmFzc2VydChpZCAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnCiAgICAmJiAhYXBpLkJpZ051bWJlcihpZCkuaXNOYU4oKSAmJiBhcGkuQmlnTnVtYmVyKGlkKS5ndCgwKQogICAgJiYgbmFtZSAmJiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycsICdpbnZhbGlkIHBhcmFtcycpCiAgICAmJiBhcGkuYXNzZXJ0KGFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMoYXBpLnZhbGlkYXRvci5ibGFja2xpc3QobmFtZSwgJyAnKSkgJiYgbmFtZS5sZW5ndGggPiAwICYmIG5hbWUubGVuZ3RoIDw9IDI1LCAnaW52YWxpZCBuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB3aGl0ZXNwYWNlcyBvbmx5LCBtYXggbGVuZ3RoIG9mIDI1JykpIHsKICAgIC8vIGZldGNoIHRoZSB0b2tlbiB3ZSB3YW50IHRvIGVkaXQKICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCduZnQnLCAnQ1JJVFRFUmluc3RhbmNlcycsIHsgX2lkOiBhcGkuQmlnTnVtYmVyKGlkKS50b051bWJlcigpIH0pOwoKICAgIGlmIChpbnN0YW5jZSkgewogICAgICAvLyBtYWtlIHN1cmUgdGhpcyB0b2tlbiBpcyBvd25lZCBieSB0aGUgY2FsbGVyCiAgICAgIGlmIChhcGkuYXNzZXJ0KGluc3RhbmNlLmFjY291bnQgPT09IGFwaS5zZW5kZXIgJiYgaW5zdGFuY2Uub3duZWRCeSA9PT0gJ3UnLCAnbXVzdCBiZSB0aGUgdG9rZW4gaG9sZGVyJykpIHsKICAgICAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICdzZXRQcm9wZXJ0aWVzJywgewogICAgICAgICAgc3ltYm9sOiAnQ1JJVFRFUicsCiAgICAgICAgICBmcm9tVHlwZTogJ2NvbnRyYWN0JywKICAgICAgICAgIG5mdHM6IFt7CiAgICAgICAgICAgIGlkLCBwcm9wZXJ0aWVzOiB7IG5hbWUgfSwKICAgICAgICAgIH1dLAogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgfQp9OwoKLy8gZ2VuZXJhdGUgaXNzdWFuY2UgZGF0YSBmb3IgYSByYW5kb20gY3JpdHRlciBvZiB0aGUgZ2l2ZW4gZWRpdGlvbgpjb25zdCBnZW5lcmF0ZVJhbmRvbUNyaXR0ZXIgPSAoZWRpdGlvbiwgdG8pID0+IHsKICAvLyBlYWNoIHJhcml0eSBoYXMgMTAgdHlwZXMgb2YgY3JpdHRlcnMKICBjb25zdCB0eXBlID0gTWF0aC5mbG9vcihhcGkucmFuZG9tKCkgKiAxMCkgKyAxOwoKICAvLyBkZXRlcm1pbmUgcmFyaXR5CiAgbGV0IHJhcml0eSA9IDA7CiAgbGV0IHJhcml0eVJvbGwgPSBNYXRoLmZsb29yKGFwaS5yYW5kb20oKSAqIDEwMDApICsgMTsKICBpZiAocmFyaXR5Um9sbCA+IDk5NSkgeyAvLyAwLjUlIGNoYW5jZSBvZiBsZWdlbmRhcnkKICAgIHJhcml0eSA9IDM7CiAgfSBlbHNlIGlmIChyYXJpdHlSb2xsID4gOTAwKSB7IC8vIDEwJSBjaGFuY2Ugb2YgcmFyZSBvciBoaWdoZXIKICAgIHJhcml0eSA9IDI7CiAgfSBlbHNlIGlmIChyYXJpdHlSb2xsID4gNzAwKSB7IC8vIDMwJSBvZiB1bmNvbW1vbiBvciBoaWdoZXIKICAgIHJhcml0eSA9IDE7CiAgfQoKICAvLyBkZXRlcm1pbmUgZ29sZCBmb2lsCiAgbGV0IGlzR29sZEZvaWwgPSBmYWxzZTsKICByYXJpdHlSb2xsID0gTWF0aC5mbG9vcihhcGkucmFuZG9tKCkgKiAxMDApICsgMTsKICBpZiAocmFyaXR5Um9sbCA+IDk1KSB7IC8vIDUlIGNoYW5jZSBvZiBiZWluZyBnb2xkCiAgICBpc0dvbGRGb2lsID0gdHJ1ZTsKICB9CgogIGNvbnN0IHByb3BlcnRpZXMgPSB7CiAgICBlZGl0aW9uLAogICAgdHlwZSwKICAgIHJhcml0eSwKICAgIGlzR29sZEZvaWwsCiAgICBuYW1lOiAnJywKICAgIHhwOiAwLAogICAgaHA6IDEwMCwKICB9OwoKICBjb25zdCBpbnN0YW5jZSA9IHsKICAgIHN5bWJvbDogJ0NSSVRURVInLAogICAgZnJvbVR5cGU6ICdjb250cmFjdCcsCiAgICB0bywKICAgIGZlZVN5bWJvbDogVVRJTElUWV9UT0tFTl9TWU1CT0wsCiAgICBwcm9wZXJ0aWVzLAogIH07CgogIHJldHVybiBpbnN0YW5jZTsKfTsKCi8vIGlzc3VlIHNvbWUgcmFuZG9tIGNyaXR0ZXJzIQphY3Rpb25zLmhhdGNoID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICAvLyB0aGlzIGFjdGlvbiByZXF1aXJlcyBhY3RpdmUga2V5IGF1dGhvcml6YXRpb24KICBjb25zdCB7CiAgICBwYWNrU3ltYm9sLCAvLyB0aGUgdG9rZW4gd2Ugd2FudCB0byBidXkgd2l0aCBkZXRlcm1pbmVzIHdoaWNoIGVkaXRpb24gdG8gaXNzdWUKICAgIHBhY2tzLCAvLyBob3cgbWFueSBjcml0dGVycyB0byBoYXRjaCAoMSBwYWNrID0gNSBjcml0dGVycykKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgLy8gZ2V0IGNvbnRyYWN0IHBhcmFtcwogIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFwaS5kYi5maW5kT25lKCdwYXJhbXMnLCB7fSk7CiAgY29uc3QgeyBlZGl0aW9uTWFwcGluZyB9ID0gcGFyYW1zOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydChwYWNrU3ltYm9sICYmIHR5cGVvZiBwYWNrU3ltYm9sID09PSAnc3RyaW5nJyAmJiBwYWNrU3ltYm9sIGluIGVkaXRpb25NYXBwaW5nLCAnaW52YWxpZCBwYWNrIHN5bWJvbCcpCiAgICAmJiBhcGkuYXNzZXJ0KHBhY2tzICYmIHR5cGVvZiBwYWNrcyA9PT0gJ251bWJlcicgJiYgcGFja3MgPj0gMSAmJiBwYWNrcyA8PSAxMCAmJiBOdW1iZXIuaXNJbnRlZ2VyKHBhY2tzKSwgJ3BhY2tzIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwJykpIHsKICAgIC8vIHZlcmlmeSB1c2VyIGhhcyBlbm91Z2ggYmFsYW5jZSB0byBwYXkgZm9yIGFsbCB0aGUgcGFja3MKICAgIGNvbnN0IHBheW1lbnRUb2tlbkJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdiYWxhbmNlcycsIHsgYWNjb3VudDogYXBpLnNlbmRlciwgc3ltYm9sOiBwYWNrU3ltYm9sIH0pOwogICAgY29uc3QgYXV0aG9yaXplZCA9IHBheW1lbnRUb2tlbkJhbGFuY2UgJiYgYXBpLkJpZ051bWJlcihwYXltZW50VG9rZW5CYWxhbmNlLmJhbGFuY2UpLmd0ZShwYWNrcyk7CiAgICBpZiAoYXBpLmFzc2VydChhdXRob3JpemVkLCAneW91IG11c3QgaGF2ZSBlbm91Z2ggcGFjayB0b2tlbnMnKSkgewogICAgICAvLyB2ZXJpZnkgdGhpcyBjb250cmFjdCBoYXMgZW5vdWdoIGJhbGFuY2UgdG8gcGF5IHRoZSBORlQgaXNzdWFuY2UgZmVlcwogICAgICBjb25zdCBjcml0dGVyc1RvSGF0Y2ggPSBwYWNrcyAqIENSSVRURVJTX1BFUl9QQUNLOwogICAgICBjb25zdCBuZnRQYXJhbXMgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ25mdCcsICdwYXJhbXMnLCB7fSk7CiAgICAgIGNvbnN0IHsgbmZ0SXNzdWFuY2VGZWUgfSA9IG5mdFBhcmFtczsKICAgICAgY29uc3Qgb25lVG9rZW5Jc3N1YW5jZUZlZSA9IGFwaS5CaWdOdW1iZXIobmZ0SXNzdWFuY2VGZWVbVVRJTElUWV9UT0tFTl9TWU1CT0xdKS5tdWx0aXBsaWVkQnkoOCk7IC8vIGJhc2UgZmVlICsgNyBkYXRhIHByb3BlcnRpZXMKICAgICAgY29uc3QgdG90YWxJc3N1YW5jZUZlZSA9IG9uZVRva2VuSXNzdWFuY2VGZWUubXVsdGlwbGllZEJ5KGNyaXR0ZXJzVG9IYXRjaCk7CiAgICAgIGNvbnN0IHV0aWxpdHlUb2tlbkJhbGFuY2UgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ3Rva2VucycsICdjb250cmFjdHNCYWxhbmNlcycsIHsgYWNjb3VudDogQ09OVFJBQ1RfTkFNRSwgc3ltYm9sOiBVVElMSVRZX1RPS0VOX1NZTUJPTCB9KTsKICAgICAgY29uc3QgY2FuQWZmb3JkSXNzdWFuY2UgPSB1dGlsaXR5VG9rZW5CYWxhbmNlICYmIGFwaS5CaWdOdW1iZXIodXRpbGl0eVRva2VuQmFsYW5jZS5iYWxhbmNlKS5ndGUodG90YWxJc3N1YW5jZUZlZSk7CiAgICAgIGlmIChhcGkuYXNzZXJ0KGNhbkFmZm9yZElzc3VhbmNlLCAnY29udHJhY3QgY2Fubm90IGFmZm9yZCBpc3N1YW5jZScpKSB7CiAgICAgICAgLy8gYnVybiB0aGUgcGFjayB0b2tlbnMKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ3Rva2VucycsICd0cmFuc2ZlcicsIHsKICAgICAgICAgIHRvOiAnbnVsbCcsIHN5bWJvbDogcGFja1N5bWJvbCwgcXVhbnRpdHk6IHBhY2tzLnRvU3RyaW5nKCksIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgICAgICB9KTsKICAgICAgICBpZiAoIWFwaS5hc3NlcnQoaXNUb2tlblRyYW5zZmVyVmVyaWZpZWQocmVzLCBhcGkuc2VuZGVyLCAnbnVsbCcsIHBhY2tTeW1ib2wsIHBhY2tzLnRvU3RyaW5nKCksICd0cmFuc2ZlcicpLCAndW5hYmxlIHRvIHRyYW5zZmVyIHBhY2sgdG9rZW5zJykpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8vIHdlIHdpbGwgaXNzdWUgY3JpdHRlcnMgaW4gcGFja3Mgb2YgNSBhdCBvbmNlCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWNrczsgaSArPSAxKSB7CiAgICAgICAgICBjb25zdCBpbnN0YW5jZXMgPSBbXTsKICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgQ1JJVFRFUlNfUEVSX1BBQ0s7IGogKz0gMSkgewogICAgICAgICAgICBpbnN0YW5jZXMucHVzaChnZW5lcmF0ZVJhbmRvbUNyaXR0ZXIoZWRpdGlvbk1hcHBpbmdbcGFja1N5bWJvbF0sIGFwaS5zZW5kZXIpKTsKICAgICAgICAgIH0KCiAgICAgICAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICdpc3N1ZU11bHRpcGxlJywgewogICAgICAgICAgICBpbnN0YW5jZXMsCiAgICAgICAgICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn07Cg=="
}
}
}

{
"id": "ssc-testnet1",
"json": {
"contractName": "contract",
"contractAction": "deploy",
"contractPayload": {
"name": "nftmarket",
"params": "",
"code": "LyogZXNsaW50LWRpc2FibGUgbm8tYXdhaXQtaW4tbG9vcCAqLwovKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovCi8qIGVzbGludC1kaXNhYmxlIHByZWZlci10ZW1wbGF0ZSAqLwovKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqLwovKiBnbG9iYWwgYWN0aW9ucywgYXBpICovCgpjb25zdCBDT05UUkFDVF9OQU1FID0gJ25mdG1hcmtldCc7CgovLyBjYW5ub3QgYnV5IG9yIHNlbGwgbW9yZSB0aGFuIHRoaXMgbnVtYmVyIG9mIE5GVCBpbnN0YW5jZXMgaW4gb25lIGFjdGlvbgpjb25zdCBNQVhfTlVNX1VOSVRTX09QRVJBQkxFID0gNTA7CgphY3Rpb25zLmNyZWF0ZVNTQyA9IGFzeW5jICgpID0+IHsKICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKfTsKCi8vIGNoZWNrIHRoYXQgdG9rZW4gdHJhbnNmZXJzIHN1Y2NlZWRlZApjb25zdCBpc1Rva2VuVHJhbnNmZXJWZXJpZmllZCA9IChyZXN1bHQsIGZyb20sIHRvLCBzeW1ib2wsIHF1YW50aXR5LCBldmVudFN0cikgPT4gewogIGlmIChyZXN1bHQuZXJyb3JzID09PSB1bmRlZmluZWQKICAgICYmIHJlc3VsdC5ldmVudHMgJiYgcmVzdWx0LmV2ZW50cy5maW5kKGVsID0+IGVsLmNvbnRyYWN0ID09PSAndG9rZW5zJyAmJiBlbC5ldmVudCA9PT0gZXZlbnRTdHIKICAgICYmIGVsLmRhdGEuZnJvbSA9PT0gZnJvbSAmJiBlbC5kYXRhLnRvID09PSB0byAmJiBlbC5kYXRhLnF1YW50aXR5ID09PSBxdWFudGl0eSAmJiBlbC5kYXRhLnN5bWJvbCA9PT0gc3ltYm9sKSAhPT0gdW5kZWZpbmVkKSB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgcmV0dXJuIGZhbHNlOwp9OwoKY29uc3QgY291bnREZWNpbWFscyA9IHZhbHVlID0+IGFwaS5CaWdOdW1iZXIodmFsdWUpLmRwKCk7CgovLyBhIHZhbGlkIFN0ZWVtIGFjY291bnQgaXMgYmV0d2VlbiAzIGFuZCAxNiBjaGFyYWN0ZXJzIGluIGxlbmd0aApjb25zdCBpc1ZhbGlkU3RlZW1BY2NvdW50TGVuZ3RoID0gYWNjb3VudCA9PiBhY2NvdW50Lmxlbmd0aCA+PSAzICYmIGFjY291bnQubGVuZ3RoIDw9IDE2OwoKLy8gaGVscGVyIGZvciBidXkgYWN0aW9uCmNvbnN0IG1ha2VNYXBLZXkgPSAoYWNjb3VudCwgdHlwZSkgPT4gYWNjb3VudCArICctJyArIHR5cGU7CgovLyBoZWxwZXIgZm9yIHVwZGF0aW5nIG9wZW4gaW50ZXJlc3QKY29uc3QgbWFrZUdyb3VwaW5nS2V5ID0gKGdyb3VwaW5nLCBncm91cEJ5KSA9PiB7CiAgbGV0IGtleSA9ICcnOwogIGdyb3VwQnkuZm9yRWFjaCgobmFtZSkgPT4gewogICAga2V5ID0ga2V5ICsgJzonICsgbmFtZSArICc6JyArIGdyb3VwaW5nW25hbWVdOwogIH0pOwogIHJldHVybiBrZXk7Cn07Cgpjb25zdCBpc1ZhbGlkSWRBcnJheSA9IChhcnIpID0+IHsKICB0cnkgewogICAgaWYgKCFhcGkuYXNzZXJ0KGFyciAmJiB0eXBlb2YgYXJyID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KGFyciksICdpbnZhbGlkIGlkIGxpc3QnKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKCFhcGkuYXNzZXJ0KGFyci5sZW5ndGggPD0gTUFYX05VTV9VTklUU19PUEVSQUJMRSwgYGNhbm5vdCBhY3Qgb24gbW9yZSB0aGFuICR7TUFYX05VTV9VTklUU19PUEVSQUJMRX0gSURzIGF0IG9uY2VgKSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgY29uc3QgaWQgPSBhcnJbaV07CiAgICAgIGlmICghYXBpLmFzc2VydChpZCAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmICFhcGkuQmlnTnVtYmVyKGlkKS5pc05hTigpICYmIGFwaS5CaWdOdW1iZXIoaWQpLmd0KDApLCAnaW52YWxpZCBpZCBsaXN0JykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICB9IGNhdGNoIChlKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB0cnVlOwp9OwoKYWN0aW9ucy5lbmFibGVNYXJrZXQgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIHN5bWJvbCwKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgaWYgKGFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykKICAgICYmIGFwaS5hc3NlcnQoc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgLy8gbWFrZSBzdXJlIE5GVCBleGlzdHMgYW5kIHZlcmlmeSBvd25lcnNoaXAKICAgIGNvbnN0IG5mdCA9IGF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgnbmZ0JywgJ25mdHMnLCB7IHN5bWJvbCB9KTsKICAgIGlmIChhcGkuYXNzZXJ0KG5mdCAhPT0gbnVsbCwgJ3N5bWJvbCBkb2VzIG5vdCBleGlzdCcpCiAgICAgICYmIGFwaS5hc3NlcnQobmZ0Lmlzc3VlciA9PT0gYXBpLnNlbmRlciwgJ211c3QgYmUgdGhlIGlzc3VlcicpKSB7CiAgICAgIC8vIGNyZWF0ZSBhIG5ldyB0YWJsZSB0byBob2xkIG1hcmtldCBvcmRlcnMgZm9yIHRoaXMgTkZUCiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItdGVtcGxhdGUKICAgICAgY29uc3QgbWFya2V0VGFibGVOYW1lID0gc3ltYm9sICsgJ3NlbGxCb29rJzsKICAgICAgY29uc3QgbWV0cmljc1RhYmxlTmFtZSA9IHN5bWJvbCArICdvcGVuSW50ZXJlc3QnOwogICAgICBjb25zdCBoaXN0b3J5VGFibGVOYW1lID0gc3ltYm9sICsgJ3RyYWRlc0hpc3RvcnknOwogICAgICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cyhtYXJrZXRUYWJsZU5hbWUpOwogICAgICBpZiAoYXBpLmFzc2VydCh0YWJsZUV4aXN0cyA9PT0gZmFsc2UsICdtYXJrZXQgYWxyZWFkeSBlbmFibGVkJykpIHsKICAgICAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUobWFya2V0VGFibGVOYW1lLCBbJ293bmVkQnknLCAnYWNjb3VudCcsICduZnRJZCcsICdncm91cGluZycsICdwcmljZVN5bWJvbCddKTsKICAgICAgICBhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUobWV0cmljc1RhYmxlTmFtZSwgWydzaWRlJywgJ3ByaWNlU3ltYm9sJywgJ2dyb3VwaW5nJ10pOwogICAgICAgIGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZShoaXN0b3J5VGFibGVOYW1lLCBbJ3ByaWNlU3ltYm9sJywgJ3RpbWVzdGFtcCddKTsKCiAgICAgICAgYXBpLmVtaXQoJ2VuYWJsZU1hcmtldCcsIHsgc3ltYm9sIH0pOwogICAgICB9CiAgICB9CiAgfQp9OwoKY29uc3QgdXBkYXRlT3BlbkludGVyZXN0ID0gYXN5bmMgKHNpZGUsIHN5bWJvbCwgcHJpY2VTeW1ib2wsIGdyb3VwcywgZ3JvdXBCeSkgPT4gewogIGNvbnN0IG1ldHJpY3NUYWJsZU5hbWUgPSBzeW1ib2wgKyAnb3BlbkludGVyZXN0JzsKCiAgLy8gY29sbGVjdCBhbGwgdGhlIGdyb3VwaW5ncyB0byBmZXRjaAogIGNvbnN0IGdyb3VwS2V5cyA9IFtdOwogIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheAogIGZvciAoY29uc3QgaW5mbyBvZiBPYmplY3QudmFsdWVzKGdyb3VwcykpIHsKICAgIGdyb3VwS2V5cy5wdXNoKGluZm8uZ3JvdXBpbmcpOwogIH0KCiAgaWYgKGdyb3VwS2V5cy5sZW5ndGggPD0gMCkgewogICAgcmV0dXJuOwogIH0KCiAgY29uc3Qgb3BlbkludGVyZXN0ID0gYXdhaXQgYXBpLmRiLmZpbmQoCiAgICBtZXRyaWNzVGFibGVOYW1lLAogICAgewogICAgICBzaWRlLAogICAgICBwcmljZVN5bWJvbCwKICAgICAgZ3JvdXBpbmc6IHsKICAgICAgICAkaW46IGdyb3VwS2V5cywKICAgICAgfSwKICAgIH0sCiAgICBNQVhfTlVNX1VOSVRTX09QRVJBQkxFLAogICAgMCwKICAgIFt7IGluZGV4OiAnc2lkZScsIGRlc2NlbmRpbmc6IGZhbHNlIH0sIHsgaW5kZXg6ICdwcmljZVN5bWJvbCcsIGRlc2NlbmRpbmc6IGZhbHNlIH0sIHsgaW5kZXg6ICdncm91cGluZycsIGRlc2NlbmRpbmc6IGZhbHNlIH1dLAogICk7CgogIC8vIHVwZGF0ZSBleGlzdGluZyByZWNvcmRzLi4uCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcGVuSW50ZXJlc3QubGVuZ3RoOyBpICs9IDEpIHsKICAgIGNvbnN0IG1ldHJpYyA9IG9wZW5JbnRlcmVzdFtpXTsKICAgIGNvbnN0IGtleSA9IG1ha2VHcm91cGluZ0tleShtZXRyaWMuZ3JvdXBpbmcsIGdyb3VwQnkpOwogICAgaWYgKGtleSBpbiBncm91cHMpIHsKICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduCiAgICAgIGdyb3Vwc1trZXldLmlzSW5Db2xsZWN0aW9uID0gdHJ1ZTsKICAgICAgbWV0cmljLmNvdW50ICs9IGdyb3Vwc1trZXldLmNvdW50OwogICAgICBpZiAobWV0cmljLmNvdW50IDwgMCkgewogICAgICAgIG1ldHJpYy5jb3VudCA9IDA7IC8vIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBuZWVkIHRvIHNhZmVndWFyZAogICAgICB9CgogICAgICBhd2FpdCBhcGkuZGIudXBkYXRlKG1ldHJpY3NUYWJsZU5hbWUsIG1ldHJpYyk7CiAgICB9CiAgfQoKICAvLyAuLi5hbmQgYWRkIG5ldyBvbmVzCiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4CiAgZm9yIChjb25zdCBpbmZvIG9mIE9iamVjdC52YWx1ZXMoZ3JvdXBzKSkgewogICAgaWYgKCFpbmZvLmlzSW5Db2xsZWN0aW9uKSB7CiAgICAgIGNvbnN0IGZpbmFsQ291bnQgPSBpbmZvLmNvdW50ID4gMCA/IGluZm8uY291bnQgOiAwOwogICAgICBjb25zdCBuZXdNZXRyaWMgPSB7CiAgICAgICAgc2lkZSwKICAgICAgICBwcmljZVN5bWJvbCwKICAgICAgICBncm91cGluZzogaW5mby5ncm91cGluZywKICAgICAgICBjb3VudDogZmluYWxDb3VudCwKICAgICAgfTsKCiAgICAgIGF3YWl0IGFwaS5kYi5pbnNlcnQobWV0cmljc1RhYmxlTmFtZSwgbmV3TWV0cmljKTsKICAgIH0KICB9Cn07Cgpjb25zdCB1cGRhdGVUcmFkZXNIaXN0b3J5ID0gYXN5bmMgKHR5cGUsIGFjY291bnQsIG93bmVkQnksIGNvdW50ZXJwYXJ0aWVzLCBzeW1ib2wsIHByaWNlU3ltYm9sLCBwcmljZSwgbWFya2V0QWNjb3VudCwgZmVlLCB2b2x1bWUpID0+IHsKICBjb25zdCBibG9ja0RhdGUgPSBuZXcgRGF0ZShgJHthcGkuc3RlZW1CbG9ja1RpbWVzdGFtcH0uMDAwWmApOwogIGNvbnN0IHRpbWVzdGFtcFNlYyA9IGJsb2NrRGF0ZS5nZXRUaW1lKCkgLyAxMDAwOwogIGNvbnN0IHRpbWVzdGFtcE1pbnVzMjRocnMgPSBibG9ja0RhdGUuc2V0RGF0ZShibG9ja0RhdGUuZ2V0RGF0ZSgpIC0gMSkgLyAxMDAwOwogIGNvbnN0IGhpc3RvcnlUYWJsZU5hbWUgPSBzeW1ib2wgKyAndHJhZGVzSGlzdG9yeSc7CgogIC8vIGNsZWFuIGhpc3RvcnkKICBsZXQgdHJhZGVzVG9EZWxldGUgPSBhd2FpdCBhcGkuZGIuZmluZCgKICAgIGhpc3RvcnlUYWJsZU5hbWUsCiAgICB7CiAgICAgIHByaWNlU3ltYm9sLAogICAgICB0aW1lc3RhbXA6IHsKICAgICAgICAkbHQ6IHRpbWVzdGFtcE1pbnVzMjRocnMsCiAgICAgIH0sCiAgICB9LAogICk7CiAgbGV0IG5iVHJhZGVzVG9EZWxldGUgPSB0cmFkZXNUb0RlbGV0ZS5sZW5ndGg7CgogIHdoaWxlIChuYlRyYWRlc1RvRGVsZXRlID4gMCkgewogICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG5iVHJhZGVzVG9EZWxldGU7IGluZGV4ICs9IDEpIHsKICAgICAgY29uc3QgdHJhZGUgPSB0cmFkZXNUb0RlbGV0ZVtpbmRleF07CiAgICAgIGF3YWl0IGFwaS5kYi5yZW1vdmUoaGlzdG9yeVRhYmxlTmFtZSwgdHJhZGUpOwogICAgfQogICAgdHJhZGVzVG9EZWxldGUgPSBhd2FpdCBhcGkuZGIuZmluZCgKICAgICAgaGlzdG9yeVRhYmxlTmFtZSwKICAgICAgewogICAgICAgIHByaWNlU3ltYm9sLAogICAgICAgIHRpbWVzdGFtcDogewogICAgICAgICAgJGx0OiB0aW1lc3RhbXBNaW51czI0aHJzLAogICAgICAgIH0sCiAgICAgIH0sCiAgICApOwogICAgbmJUcmFkZXNUb0RlbGV0ZSA9IHRyYWRlc1RvRGVsZXRlLmxlbmd0aDsKICB9CiAgLy8gYWRkIG9yZGVyIHRvIHRoZSBoaXN0b3J5CiAgY29uc3QgbmV3VHJhZGUgPSB7fTsKICBuZXdUcmFkZS50eXBlID0gdHlwZTsKICBuZXdUcmFkZS5hY2NvdW50ID0gYWNjb3VudDsKICBuZXdUcmFkZS5vd25lZEJ5ID0gb3duZWRCeTsKICBuZXdUcmFkZS5jb3VudGVycGFydGllcyA9IGNvdW50ZXJwYXJ0aWVzOwogIG5ld1RyYWRlLnByaWNlU3ltYm9sID0gcHJpY2VTeW1ib2w7CiAgbmV3VHJhZGUucHJpY2UgPSBwcmljZTsKICBuZXdUcmFkZS5tYXJrZXRBY2NvdW50ID0gbWFya2V0QWNjb3VudDsKICBuZXdUcmFkZS5mZWUgPSBmZWU7CiAgbmV3VHJhZGUudGltZXN0YW1wID0gdGltZXN0YW1wU2VjOwogIG5ld1RyYWRlLnZvbHVtZSA9IHZvbHVtZTsKICBhd2FpdCBhcGkuZGIuaW5zZXJ0KGhpc3RvcnlUYWJsZU5hbWUsIG5ld1RyYWRlKTsKfTsKCmFjdGlvbnMuY2hhbmdlUHJpY2UgPSBhc3luYyAocGF5bG9hZCkgPT4gewogIGNvbnN0IHsKICAgIHN5bWJvbCwKICAgIG5mdHMsCiAgICBwcmljZSwKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgaWYgKCFhcGkuYXNzZXJ0KHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJywgJ2ludmFsaWQgcGFyYW1zJykpIHsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IG1hcmtldFRhYmxlTmFtZSA9IHN5bWJvbCArICdzZWxsQm9vayc7CiAgY29uc3QgdGFibGVFeGlzdHMgPSBhd2FpdCBhcGkuZGIudGFibGVFeGlzdHMobWFya2V0VGFibGVOYW1lKTsKCiAgaWYgKGFwaS5hc3NlcnQoaXNTaWduZWRXaXRoQWN0aXZlS2V5ID09PSB0cnVlLCAneW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5JykKICAgICYmIGlzVmFsaWRJZEFycmF5KG5mdHMpCiAgICAmJiBhcGkuYXNzZXJ0KHByaWNlICYmIHR5cGVvZiBwcmljZSA9PT0gJ3N0cmluZycgJiYgIWFwaS5CaWdOdW1iZXIocHJpY2UpLmlzTmFOKCksICdpbnZhbGlkIHBhcmFtcycpCiAgICAmJiBhcGkuYXNzZXJ0KHRhYmxlRXhpc3RzLCAnbWFya2V0IG5vdCBlbmFibGVkIGZvciBzeW1ib2wnKSkgewogICAgLy8gbG9vayB1cCBvcmRlciBpbmZvCiAgICBjb25zdCBvcmRlcnMgPSBhd2FpdCBhcGkuZGIuZmluZCgKICAgICAgbWFya2V0VGFibGVOYW1lLAogICAgICB7CiAgICAgICAgbmZ0SWQ6IHsKICAgICAgICAgICRpbjogbmZ0cywKICAgICAgICB9LAogICAgICB9LAogICAgICBNQVhfTlVNX1VOSVRTX09QRVJBQkxFLAogICAgICAwLAogICAgICBbeyBpbmRleDogJ25mdElkJywgZGVzY2VuZGluZzogZmFsc2UgfV0sCiAgICApOwoKICAgIGlmIChvcmRlcnMubGVuZ3RoID4gMCkgewogICAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGNhbGxlciBpcyBhY3R1YWxseSB0aGUgb3duZXIgb2YgZWFjaCBvcmRlcgogICAgICAvLyBhbmQgYWxsIG9yZGVycyBoYXZlIHRoZSBzYW1lIHByaWNlIHN5bWJvbAogICAgICBsZXQgcHJpY2VTeW1ib2wgPSAnJzsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlcnMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICBjb25zdCBvcmRlciA9IG9yZGVyc1tpXTsKICAgICAgICBpZiAocHJpY2VTeW1ib2wgPT09ICcnKSB7CiAgICAgICAgICAoeyBwcmljZVN5bWJvbCB9ID0gb3JkZXIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWFwaS5hc3NlcnQob3JkZXIuYWNjb3VudCA9PT0gYXBpLnNlbmRlcgogICAgICAgICAgJiYgb3JkZXIub3duZWRCeSA9PT0gJ3UnLCAnYWxsIG9yZGVycyBtdXN0IGJlIHlvdXIgb3duJykKICAgICAgICAgIHx8ICFhcGkuYXNzZXJ0KHByaWNlU3ltYm9sID09PSBvcmRlci5wcmljZVN5bWJvbCwgJ2FsbCBvcmRlcnMgbXVzdCBoYXZlIHRoZSBzYW1lIHByaWNlIHN5bWJvbCcpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGdldCB0aGUgcHJpY2UgdG9rZW4gcGFyYW1zCiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2w6IHByaWNlU3ltYm9sIH0pOwogICAgICBpZiAoYXBpLmFzc2VydCh0b2tlbgogICAgICAgICYmIGFwaS5CaWdOdW1iZXIocHJpY2UpLmd0KDApCiAgICAgICAgJiYgY291bnREZWNpbWFscyhwcmljZSkgPD0gdG9rZW4ucHJlY2lzaW9uLCAnaW52YWxpZCBwcmljZScpKSB7CiAgICAgICAgY29uc3QgZmluYWxQcmljZSA9IGFwaS5CaWdOdW1iZXIocHJpY2UpLnRvRml4ZWQodG9rZW4ucHJlY2lzaW9uKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yZGVycy5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgY29uc3Qgb3JkZXIgPSBvcmRlcnNbaV07CiAgICAgICAgICBjb25zdCBvbGRQcmljZSA9IG9yZGVyLnByaWNlOwogICAgICAgICAgb3JkZXIucHJpY2UgPSBmaW5hbFByaWNlOwogICAgICAgICAgb3JkZXIucHJpY2VEZWMgPSB7ICRudW1iZXJEZWNpbWFsOiBmaW5hbFByaWNlIH07CgogICAgICAgICAgYXdhaXQgYXBpLmRiLnVwZGF0ZShtYXJrZXRUYWJsZU5hbWUsIG9yZGVyKTsKCiAgICAgICAgICBhcGkuZW1pdCgnY2hhbmdlUHJpY2UnLCB7CiAgICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgICAgbmZ0SWQ6IG9yZGVyLm5mdElkLAogICAgICAgICAgICBvbGRQcmljZSwKICAgICAgICAgICAgbmV3UHJpY2U6IG9yZGVyLnByaWNlLAogICAgICAgICAgICBwcmljZVN5bWJvbDogb3JkZXIucHJpY2VTeW1ib2wsCiAgICAgICAgICAgIG9yZGVySWQ6IG9yZGVyLl9pZCwKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfTsKCmFjdGlvbnMuY2FuY2VsID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICBzeW1ib2wsCiAgICBuZnRzLAogICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogIH0gPSBwYXlsb2FkOwoKICBpZiAoIWFwaS5hc3NlcnQoc3ltYm9sICYmIHR5cGVvZiBzeW1ib2wgPT09ICdzdHJpbmcnLCAnaW52YWxpZCBwYXJhbXMnKSkgewogICAgcmV0dXJuOwogIH0KCiAgY29uc3QgbWFya2V0VGFibGVOYW1lID0gc3ltYm9sICsgJ3NlbGxCb29rJzsKICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cyhtYXJrZXRUYWJsZU5hbWUpOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgaXNWYWxpZElkQXJyYXkobmZ0cykKICAgICYmIGFwaS5hc3NlcnQodGFibGVFeGlzdHMsICdtYXJrZXQgbm90IGVuYWJsZWQgZm9yIHN5bWJvbCcpKSB7CiAgICBjb25zdCBuZnQgPSBhd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoJ25mdCcsICduZnRzJywgeyBzeW1ib2wgfSk7CiAgICBpZiAoIWFwaS5hc3NlcnQobmZ0ICYmIG5mdC5ncm91cEJ5ICYmIG5mdC5ncm91cEJ5Lmxlbmd0aCA+IDAsICdtYXJrZXQgZ3JvdXBpbmcgbm90IHNldCcpKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBsb29rIHVwIG9yZGVyIGluZm8KICAgIGNvbnN0IG9yZGVycyA9IGF3YWl0IGFwaS5kYi5maW5kKAogICAgICBtYXJrZXRUYWJsZU5hbWUsCiAgICAgIHsKICAgICAgICBuZnRJZDogewogICAgICAgICAgJGluOiBuZnRzLAogICAgICAgIH0sCiAgICAgIH0sCiAgICAgIE1BWF9OVU1fVU5JVFNfT1BFUkFCTEUsCiAgICAgIDAsCiAgICAgIFt7IGluZGV4OiAnbmZ0SWQnLCBkZXNjZW5kaW5nOiBmYWxzZSB9XSwKICAgICk7CgogICAgaWYgKG9yZGVycy5sZW5ndGggPiAwKSB7CiAgICAgIC8vIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgY2FsbGVyIGlzIGFjdHVhbGx5IHRoZSBvd25lciBvZiBlYWNoIG9yZGVyCiAgICAgIGNvbnN0IGlkcyA9IFtdOwogICAgICBjb25zdCBpZE1hcCA9IHt9OwogICAgICBsZXQgcHJpY2VTeW1ib2wgPSAnJzsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlcnMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICBjb25zdCBvcmRlciA9IG9yZGVyc1tpXTsKICAgICAgICBpZiAocHJpY2VTeW1ib2wgPT09ICcnKSB7CiAgICAgICAgICAoeyBwcmljZVN5bWJvbCB9ID0gb3JkZXIpOwogICAgICAgIH0KICAgICAgICBpZiAoIWFwaS5hc3NlcnQob3JkZXIuYWNjb3VudCA9PT0gYXBpLnNlbmRlciAmJiBvcmRlci5vd25lZEJ5ID09PSAndScsICdhbGwgb3JkZXJzIG11c3QgYmUgeW91ciBvd24nKQogICAgICAgICAgfHwgIWFwaS5hc3NlcnQocHJpY2VTeW1ib2wgPT09IG9yZGVyLnByaWNlU3ltYm9sLCAnYWxsIG9yZGVycyBtdXN0IGhhdmUgdGhlIHNhbWUgcHJpY2Ugc3ltYm9sJykpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWRzLnB1c2gob3JkZXIubmZ0SWQpOwogICAgICAgIGlkTWFwW29yZGVyLm5mdElkXSA9IG9yZGVyOwogICAgICB9CgogICAgICAvLyBtb3ZlIHRoZSBsb2NrZWQgTkZUcyBiYWNrIHRvIHRoZWlyIG93bmVyCiAgICAgIGNvbnN0IG5mdEFycmF5ID0gW107CiAgICAgIGNvbnN0IHdyYXBwZWROZnRzID0gewogICAgICAgIHN5bWJvbCwKICAgICAgICBpZHMsCiAgICAgIH07CiAgICAgIG5mdEFycmF5LnB1c2god3JhcHBlZE5mdHMpOwogICAgICBjb25zdCByZXMgPSBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICd0cmFuc2ZlcicsIHsKICAgICAgICBmcm9tVHlwZTogJ2NvbnRyYWN0JywKICAgICAgICB0bzogYXBpLnNlbmRlciwKICAgICAgICB0b1R5cGU6ICd1c2VyJywKICAgICAgICBuZnRzOiBuZnRBcnJheSwKICAgICAgICBpc1NpZ25lZFdpdGhBY3RpdmVLZXksCiAgICAgIH0pOwoKICAgICAgLy8gaXQncyBwb3NzaWJsZSAoYnV0IHVubGlrZWx5KSB0aGF0IHNvbWUgdHJhbnNmZXJzIGNvdWxkIGhhdmUgZmFpbGVkCiAgICAgIC8vIGR1ZSB0byB2YWxpZGF0aW9uIGVycm9ycyAmIHdoYXRub3QsIHNvIHdlIG5lZWQgdG8gbG9vcCBvdmVyIHRoZQogICAgICAvLyB0cmFuc2ZlciByZXN1bHRzIGFuZCBvbmx5IGNhbmNlbCBvcmRlcnMgZm9yIHRoZSB0cmFuc2ZlcnMgdGhhdCBzdWNjZWVkZWQKICAgICAgaWYgKHJlcy5ldmVudHMpIHsKICAgICAgICBjb25zdCBncm91cGluZ01hcCA9IHt9OwogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVzLmV2ZW50cy5sZW5ndGg7IGogKz0gMSkgewogICAgICAgICAgY29uc3QgZXYgPSByZXMuZXZlbnRzW2pdOwogICAgICAgICAgaWYgKGV2LmNvbnRyYWN0ICYmIGV2LmV2ZW50ICYmIGV2LmRhdGEKICAgICAgICAgICAgJiYgZXYuY29udHJhY3QgPT09ICduZnQnCiAgICAgICAgICAgICYmIGV2LmV2ZW50ID09PSAndHJhbnNmZXInCiAgICAgICAgICAgICYmIGV2LmRhdGEuZnJvbSA9PT0gQ09OVFJBQ1RfTkFNRQogICAgICAgICAgICAmJiBldi5kYXRhLmZyb21UeXBlID09PSAnYycKICAgICAgICAgICAgJiYgZXYuZGF0YS50byA9PT0gYXBpLnNlbmRlcgogICAgICAgICAgICAmJiBldi5kYXRhLnRvVHlwZSA9PT0gJ3UnCiAgICAgICAgICAgICYmIGV2LmRhdGEuc3ltYm9sID09PSBzeW1ib2wpIHsKICAgICAgICAgICAgLy8gdHJhbnNmZXIgaXMgdmVyaWZpZWQsIG5vdyB3ZSBjYW4gY2FuY2VsIHRoZSBvcmRlcgogICAgICAgICAgICBjb25zdCBpbnN0YW5jZUlkID0gZXYuZGF0YS5pZDsKICAgICAgICAgICAgaWYgKGluc3RhbmNlSWQgaW4gaWRNYXApIHsKICAgICAgICAgICAgICBjb25zdCBvcmRlciA9IGlkTWFwW2luc3RhbmNlSWRdOwoKICAgICAgICAgICAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKG1hcmtldFRhYmxlTmFtZSwgb3JkZXIpOwoKICAgICAgICAgICAgICBhcGkuZW1pdCgnY2FuY2VsT3JkZXInLCB7CiAgICAgICAgICAgICAgICBhY2NvdW50OiBvcmRlci5hY2NvdW50LAogICAgICAgICAgICAgICAgb3duZWRCeTogb3JkZXIub3duZWRCeSwKICAgICAgICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgICAgICAgIG5mdElkOiBvcmRlci5uZnRJZCwKICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogb3JkZXIudGltZXN0YW1wLAogICAgICAgICAgICAgICAgcHJpY2U6IG9yZGVyLnByaWNlLAogICAgICAgICAgICAgICAgcHJpY2VTeW1ib2w6IG9yZGVyLnByaWNlU3ltYm9sLAogICAgICAgICAgICAgICAgZmVlOiBvcmRlci5mZWUsCiAgICAgICAgICAgICAgICBvcmRlcklkOiBvcmRlci5faWQsCiAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgIGNvbnN0IGtleSA9IG1ha2VHcm91cGluZ0tleShvcmRlci5ncm91cGluZywgbmZ0Lmdyb3VwQnkpOwogICAgICAgICAgICAgIGNvbnN0IGdyb3VwSW5mbyA9IGtleSBpbiBncm91cGluZ01hcAogICAgICAgICAgICAgICAgPyBncm91cGluZ01hcFtrZXldCiAgICAgICAgICAgICAgICA6IHsKICAgICAgICAgICAgICAgICAgZ3JvdXBpbmc6IG9yZGVyLmdyb3VwaW5nLAogICAgICAgICAgICAgICAgICBpc0luQ29sbGVjdGlvbjogZmFsc2UsCiAgICAgICAgICAgICAgICAgIGNvdW50OiAwLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBncm91cEluZm8uY291bnQgLT0gMTsKICAgICAgICAgICAgICBncm91cGluZ01hcFtrZXldID0gZ3JvdXBJbmZvOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyB1cGRhdGUgb3BlbiBpbnRlcmVzdCBtZXRyaWNzCiAgICAgICAgYXdhaXQgdXBkYXRlT3BlbkludGVyZXN0KCdzZWxsJywgc3ltYm9sLCBwcmljZVN5bWJvbCwgZ3JvdXBpbmdNYXAsIG5mdC5ncm91cEJ5KTsKICAgICAgfQogICAgfQogIH0KfTsKCmFjdGlvbnMuYnV5ID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICBzeW1ib2wsCiAgICBuZnRzLAogICAgbWFya2V0QWNjb3VudCwKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgaWYgKCFhcGkuYXNzZXJ0KHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJwogICAgJiYgbWFya2V0QWNjb3VudCAmJiB0eXBlb2YgbWFya2V0QWNjb3VudCA9PT0gJ3N0cmluZycsICdpbnZhbGlkIHBhcmFtcycpKSB7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBtYXJrZXRUYWJsZU5hbWUgPSBzeW1ib2wgKyAnc2VsbEJvb2snOwogIGNvbnN0IHRhYmxlRXhpc3RzID0gYXdhaXQgYXBpLmRiLnRhYmxlRXhpc3RzKG1hcmtldFRhYmxlTmFtZSk7CgogIGlmIChhcGkuYXNzZXJ0KGlzU2lnbmVkV2l0aEFjdGl2ZUtleSA9PT0gdHJ1ZSwgJ3lvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleScpCiAgICAmJiBpc1ZhbGlkSWRBcnJheShuZnRzKQogICAgJiYgYXBpLmFzc2VydCh0YWJsZUV4aXN0cywgJ21hcmtldCBub3QgZW5hYmxlZCBmb3Igc3ltYm9sJykpIHsKICAgIGNvbnN0IGZpbmFsTWFya2V0QWNjb3VudCA9IG1hcmtldEFjY291bnQudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICBpZiAoYXBpLmFzc2VydChpc1ZhbGlkU3RlZW1BY2NvdW50TGVuZ3RoKGZpbmFsTWFya2V0QWNjb3VudCksICdpbnZhbGlkIG1hcmtldCBhY2NvdW50JykpIHsKICAgICAgY29uc3QgbmZ0ID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCduZnQnLCAnbmZ0cycsIHsgc3ltYm9sIH0pOwogICAgICBpZiAoIWFwaS5hc3NlcnQobmZ0ICYmIG5mdC5ncm91cEJ5ICYmIG5mdC5ncm91cEJ5Lmxlbmd0aCA+IDAsICdtYXJrZXQgZ3JvdXBpbmcgbm90IHNldCcpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICAvLyBsb29rIHVwIG9yZGVyIGluZm8KICAgICAgY29uc3Qgb3JkZXJzID0gYXdhaXQgYXBpLmRiLmZpbmQoCiAgICAgICAgbWFya2V0VGFibGVOYW1lLAogICAgICAgIHsKICAgICAgICAgIG5mdElkOiB7CiAgICAgICAgICAgICRpbjogbmZ0cywKICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBNQVhfTlVNX1VOSVRTX09QRVJBQkxFLAogICAgICAgIDAsCiAgICAgICAgW3sgaW5kZXg6ICduZnRJZCcsIGRlc2NlbmRpbmc6IGZhbHNlIH1dLAogICAgICApOwoKICAgICAgaWYgKG9yZGVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgLy8gZG8gYSBjb3VwbGUgbW9yZSBzYW5pdHkgY2hlY2tzCiAgICAgICAgbGV0IHByaWNlU3ltYm9sID0gJyc7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlcnMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgIGNvbnN0IG9yZGVyID0gb3JkZXJzW2ldOwogICAgICAgICAgaWYgKHByaWNlU3ltYm9sID09PSAnJykgewogICAgICAgICAgICAoeyBwcmljZVN5bWJvbCB9ID0gb3JkZXIpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFhcGkuYXNzZXJ0KCEob3JkZXIub3duZWRCeSA9PT0gJ3UnICYmIG9yZGVyLmFjY291bnQgPT09IGFwaS5zZW5kZXIpLCAnY2Fubm90IGZpbGwgeW91ciBvd24gb3JkZXJzJykKICAgICAgICAgICAgfHwgIWFwaS5hc3NlcnQocHJpY2VTeW1ib2wgPT09IG9yZGVyLnByaWNlU3ltYm9sLCAnYWxsIG9yZGVycyBtdXN0IGhhdmUgdGhlIHNhbWUgcHJpY2Ugc3ltYm9sJykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBnZXQgdGhlIHByaWNlIHRva2VuIHBhcmFtcwogICAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2w6IHByaWNlU3ltYm9sIH0pOwogICAgICAgIGlmICghdG9rZW4pIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIGNyZWF0ZSBvcmRlciBtYXBzCiAgICAgICAgbGV0IGZlZVRvdGFsID0gYXBpLkJpZ051bWJlcigwKTsKICAgICAgICBsZXQgcGF5bWVudFRvdGFsID0gYXBpLkJpZ051bWJlcigwKTsKICAgICAgICBsZXQgc29sZE5mdHMgPSBbXTsKICAgICAgICBjb25zdCBzZWxsZXJzID0gW107CiAgICAgICAgY29uc3Qgc2VsbGVyTWFwID0ge307CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlcnMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgIGNvbnN0IG9yZGVyID0gb3JkZXJzW2ldOwogICAgICAgICAgY29uc3QgZmluYWxQcmljZSA9IGFwaS5CaWdOdW1iZXIob3JkZXIucHJpY2UpOwogICAgICAgICAgY29uc3QgZmVlUGVyY2VudCA9IG9yZGVyLmZlZSAvIDEwMDAwOwogICAgICAgICAgbGV0IGZpbmFsRmVlID0gZmluYWxQcmljZS5tdWx0aXBsaWVkQnkoZmVlUGVyY2VudCkuZGVjaW1hbFBsYWNlcyh0b2tlbi5wcmVjaXNpb24pOwogICAgICAgICAgaWYgKGZpbmFsRmVlLmd0KGZpbmFsUHJpY2UpKSB7CiAgICAgICAgICAgIGZpbmFsRmVlID0gZmluYWxQcmljZTsgLy8gdW5saWtlbHkgYnV0IG5lZWQgdG8gYmUgc3VyZQogICAgICAgICAgfQogICAgICAgICAgbGV0IGZpbmFsUGF5bWVudCA9IGZpbmFsUHJpY2UubWludXMoZmluYWxGZWUpLmRlY2ltYWxQbGFjZXModG9rZW4ucHJlY2lzaW9uKTsKICAgICAgICAgIGlmIChmaW5hbFBheW1lbnQubHQoMCkpIHsKICAgICAgICAgICAgZmluYWxQYXltZW50ID0gYXBpLkJpZ051bWJlcigwKTsgLy8gdW5saWtlbHkgYnV0IG5lZWQgdG8gYmUgc3VyZQogICAgICAgICAgfQogICAgICAgICAgcGF5bWVudFRvdGFsID0gcGF5bWVudFRvdGFsLnBsdXMoZmluYWxQYXltZW50KTsKICAgICAgICAgIGZlZVRvdGFsID0gZmVlVG90YWwucGx1cyhmaW5hbEZlZSk7CgogICAgICAgICAgY29uc3Qga2V5ID0gbWFrZU1hcEtleShvcmRlci5hY2NvdW50LCBvcmRlci5vd25lZEJ5KTsKICAgICAgICAgIGNvbnN0IHNlbGxlckluZm8gPSBrZXkgaW4gc2VsbGVyTWFwCiAgICAgICAgICAgID8gc2VsbGVyTWFwW2tleV0KICAgICAgICAgICAgOiB7CiAgICAgICAgICAgICAgYWNjb3VudDogb3JkZXIuYWNjb3VudCwKICAgICAgICAgICAgICBvd25lZEJ5OiBvcmRlci5vd25lZEJ5LAogICAgICAgICAgICAgIG5mdElkczogW10sCiAgICAgICAgICAgICAgcGF5bWVudFRvdGFsOiBhcGkuQmlnTnVtYmVyKDApLAogICAgICAgICAgICB9OwoKICAgICAgICAgIHNlbGxlckluZm8ucGF5bWVudFRvdGFsID0gc2VsbGVySW5mby5wYXltZW50VG90YWwucGx1cyhmaW5hbFBheW1lbnQpOwogICAgICAgICAgc2VsbGVySW5mby5uZnRJZHMucHVzaChvcmRlci5uZnRJZCk7CiAgICAgICAgICBzZWxsZXJNYXBba2V5XSA9IHNlbGxlckluZm87CiAgICAgICAgfQoKICAgICAgICAvLyB2ZXJpZnkgYnV5ZXIgaGFzIGVub3VnaCBmdW5kcyBmb3IgcGF5bWVudAogICAgICAgIGNvbnN0IHJlcXVpcmVkQmFsYW5jZSA9IHBheW1lbnRUb3RhbC5wbHVzKGZlZVRvdGFsKS50b0ZpeGVkKHRva2VuLnByZWNpc2lvbik7CiAgICAgICAgY29uc3QgYnV5ZXJCYWxhbmNlID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAnYmFsYW5jZXMnLCB7IGFjY291bnQ6IGFwaS5zZW5kZXIsIHN5bWJvbDogcHJpY2VTeW1ib2wgfSk7CiAgICAgICAgaWYgKCFhcGkuYXNzZXJ0KGJ1eWVyQmFsYW5jZQogICAgICAgICAgJiYgYXBpLkJpZ051bWJlcihidXllckJhbGFuY2UuYmFsYW5jZSkuZ3RlKHJlcXVpcmVkQmFsYW5jZSksICd5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgZm9yIHBheW1lbnQnKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBwYXltZW50VG90YWwgPSBwYXltZW50VG90YWwudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24pOwoKICAgICAgICAvLyBzZW5kIGZlZXMgdG8gbWFya2V0IGFjY291bnQKICAgICAgICBpZiAoZmVlVG90YWwuZ3QoMCkpIHsKICAgICAgICAgIGZlZVRvdGFsID0gZmVlVG90YWwudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24pOwogICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCd0b2tlbnMnLCAndHJhbnNmZXInLCB7CiAgICAgICAgICAgIHRvOiBmaW5hbE1hcmtldEFjY291bnQsIHN5bWJvbDogcHJpY2VTeW1ib2wsIHF1YW50aXR5OiBmZWVUb3RhbCwgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoIWFwaS5hc3NlcnQoaXNUb2tlblRyYW5zZmVyVmVyaWZpZWQocmVzLCBhcGkuc2VuZGVyLCBmaW5hbE1hcmtldEFjY291bnQsIHByaWNlU3ltYm9sLCBmZWVUb3RhbCwgJ3RyYW5zZmVyJyksICd1bmFibGUgdG8gdHJhbnNmZXIgbWFya2V0IGZlZXMnKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBzZW5kIHBheW1lbnRzIHRvIHNlbGxlcnMKICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXgKICAgICAgICBmb3IgKGNvbnN0IGluZm8gb2YgT2JqZWN0LnZhbHVlcyhzZWxsZXJNYXApKSB7CiAgICAgICAgICBpZiAoaW5mby5wYXltZW50VG90YWwuZ3QoMCkpIHsKICAgICAgICAgICAgY29uc3QgY29udHJhY3RBY3Rpb24gPSBpbmZvLm93bmVkQnkgPT09ICd1JyA/ICd0cmFuc2ZlcicgOiAndHJhbnNmZXJUb0NvbnRyYWN0JzsKICAgICAgICAgICAgaW5mby5wYXltZW50VG90YWwgPSBpbmZvLnBheW1lbnRUb3RhbC50b0ZpeGVkKHRva2VuLnByZWNpc2lvbik7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgndG9rZW5zJywgY29udHJhY3RBY3Rpb24sIHsKICAgICAgICAgICAgICB0bzogaW5mby5hY2NvdW50LCBzeW1ib2w6IHByaWNlU3ltYm9sLCBxdWFudGl0eTogaW5mby5wYXltZW50VG90YWwsIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChhcGkuYXNzZXJ0KGlzVG9rZW5UcmFuc2ZlclZlcmlmaWVkKHJlcywgYXBpLnNlbmRlciwgaW5mby5hY2NvdW50LCBwcmljZVN5bWJvbCwgaW5mby5wYXltZW50VG90YWwsIGNvbnRyYWN0QWN0aW9uKSwgYHVuYWJsZSB0byB0cmFuc2ZlciBwYXltZW50IHRvICR7aW5mby5hY2NvdW50fWApKSB7CiAgICAgICAgICAgICAgc29sZE5mdHMgPSBzb2xkTmZ0cy5jb25jYXQoaW5mby5uZnRJZHMpOwogICAgICAgICAgICAgIHNlbGxlcnMucHVzaChpbmZvKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc29sZE5mdHMgPSBzb2xkTmZ0cy5jb25jYXQoaW5mby5uZnRJZHMpOwogICAgICAgICAgICBzZWxsZXJzLnB1c2goaW5mbyk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyB0cmFuc2ZlciBzb2xkIE5GVCBpbnN0YW5jZXMgdG8gbmV3IG93bmVyCiAgICAgICAgY29uc3QgbmZ0QXJyYXkgPSBbXTsKICAgICAgICBjb25zdCB3cmFwcGVkTmZ0cyA9IHsKICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgIGlkczogc29sZE5mdHMsCiAgICAgICAgfTsKICAgICAgICBuZnRBcnJheS5wdXNoKHdyYXBwZWROZnRzKTsKICAgICAgICBhd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoJ25mdCcsICd0cmFuc2ZlcicsIHsKICAgICAgICAgIGZyb21UeXBlOiAnY29udHJhY3QnLAogICAgICAgICAgdG86IGFwaS5zZW5kZXIsCiAgICAgICAgICB0b1R5cGU6ICd1c2VyJywKICAgICAgICAgIG5mdHM6IG5mdEFycmF5LAogICAgICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgICAgIH0pOwoKICAgICAgICAvLyBkZWxldGUgc29sZCBtYXJrZXQgb3JkZXJzCiAgICAgICAgY29uc3QgZ3JvdXBpbmdNYXAgPSB7fTsKICAgICAgICBjb25zdCBzb2xkU2V0ID0gbmV3IFNldChzb2xkTmZ0cyk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlcnMubGVuZ3RoOyBpICs9IDEpIHsKICAgICAgICAgIGNvbnN0IG9yZGVyID0gb3JkZXJzW2ldOwogICAgICAgICAgaWYgKHNvbGRTZXQuaGFzKG9yZGVyLm5mdElkKSkgewogICAgICAgICAgICBhd2FpdCBhcGkuZGIucmVtb3ZlKG1hcmtldFRhYmxlTmFtZSwgb3JkZXIpOwoKICAgICAgICAgICAgY29uc3Qga2V5ID0gbWFrZUdyb3VwaW5nS2V5KG9yZGVyLmdyb3VwaW5nLCBuZnQuZ3JvdXBCeSk7CiAgICAgICAgICAgIGNvbnN0IGdyb3VwSW5mbyA9IGtleSBpbiBncm91cGluZ01hcAogICAgICAgICAgICAgID8gZ3JvdXBpbmdNYXBba2V5XQogICAgICAgICAgICAgIDogewogICAgICAgICAgICAgICAgZ3JvdXBpbmc6IG9yZGVyLmdyb3VwaW5nLAogICAgICAgICAgICAgICAgaXNJbkNvbGxlY3Rpb246IGZhbHNlLAogICAgICAgICAgICAgICAgY291bnQ6IDAsCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgZ3JvdXBJbmZvLmNvdW50IC09IDE7CiAgICAgICAgICAgIGdyb3VwaW5nTWFwW2tleV0gPSBncm91cEluZm87CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBhZGQgdGhlIHRyYWRlIHRvIHRoZSBoaXN0b3J5CiAgICAgICAgYXdhaXQgdXBkYXRlVHJhZGVzSGlzdG9yeSgnYnV5JywgYXBpLnNlbmRlciwgJ3UnLCBzZWxsZXJzLCBzeW1ib2wsIHByaWNlU3ltYm9sLCByZXF1aXJlZEJhbGFuY2UsIGZpbmFsTWFya2V0QWNjb3VudCwgZmVlVG90YWwsIHNvbGROZnRzLmxlbmd0aCk7CgogICAgICAgIGFwaS5lbWl0KCdoaXRTZWxsT3JkZXInLCB7CiAgICAgICAgICBzeW1ib2wsCiAgICAgICAgICBwcmljZVN5bWJvbCwKICAgICAgICAgIGFjY291bnQ6IGFwaS5zZW5kZXIsCiAgICAgICAgICBvd25lZEJ5OiAndScsCiAgICAgICAgICBzZWxsZXJzLAogICAgICAgICAgcGF5bWVudFRvdGFsLAogICAgICAgICAgZmVlVG90YWwsCiAgICAgICAgfSk7CgogICAgICAgIC8vIHVwZGF0ZSBvcGVuIGludGVyZXN0IG1ldHJpY3MKICAgICAgICBhd2FpdCB1cGRhdGVPcGVuSW50ZXJlc3QoJ3NlbGwnLCBzeW1ib2wsIHByaWNlU3ltYm9sLCBncm91cGluZ01hcCwgbmZ0Lmdyb3VwQnkpOwogICAgICB9CiAgICB9CiAgfQp9OwoKYWN0aW9ucy5zZWxsID0gYXN5bmMgKHBheWxvYWQpID0+IHsKICBjb25zdCB7CiAgICBzeW1ib2wsCiAgICBuZnRzLAogICAgcHJpY2UsCiAgICBwcmljZVN5bWJvbCwKICAgIGZlZSwKICAgIGlzU2lnbmVkV2l0aEFjdGl2ZUtleSwKICB9ID0gcGF5bG9hZDsKCiAgaWYgKCFhcGkuYXNzZXJ0KHN5bWJvbCAmJiB0eXBlb2Ygc3ltYm9sID09PSAnc3RyaW5nJywgJ2ludmFsaWQgcGFyYW1zJykpIHsKICAgIHJldHVybjsKICB9CgogIGNvbnN0IG1hcmtldFRhYmxlTmFtZSA9IHN5bWJvbCArICdzZWxsQm9vayc7CiAgY29uc3QgaW5zdGFuY2VUYWJsZU5hbWUgPSBzeW1ib2wgKyAnaW5zdGFuY2VzJzsKICBjb25zdCB0YWJsZUV4aXN0cyA9IGF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cyhtYXJrZXRUYWJsZU5hbWUpOwoKICBpZiAoYXBpLmFzc2VydChpc1NpZ25lZFdpdGhBY3RpdmVLZXkgPT09IHRydWUsICd5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXknKQogICAgJiYgYXBpLmFzc2VydChuZnRzICYmIHR5cGVvZiBuZnRzID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KG5mdHMpCiAgICAmJiBwcmljZVN5bWJvbCAmJiB0eXBlb2YgcHJpY2VTeW1ib2wgPT09ICdzdHJpbmcnCiAgICAmJiBwcmljZSAmJiB0eXBlb2YgcHJpY2UgPT09ICdzdHJpbmcnICYmICFhcGkuQmlnTnVtYmVyKHByaWNlKS5pc05hTigpCiAgICAmJiBmZWUgJiYgdHlwZW9mIGZlZSA9PT0gJ251bWJlcicgJiYgZmVlID49IDAgJiYgZmVlIDw9IDEwMDAwICYmIE51bWJlci5pc0ludGVnZXIoZmVlKSwgJ2ludmFsaWQgcGFyYW1zJykKICAgICYmIGFwaS5hc3NlcnQobmZ0cy5sZW5ndGggPD0gTUFYX05VTV9VTklUU19PUEVSQUJMRSwgYGNhbm5vdCBzZWxsIG1vcmUgdGhhbiAke01BWF9OVU1fVU5JVFNfT1BFUkFCTEV9IE5GVCBpbnN0YW5jZXMgYXQgb25jZWApCiAgICAmJiBhcGkuYXNzZXJ0KHRhYmxlRXhpc3RzLCAnbWFya2V0IG5vdCBlbmFibGVkIGZvciBzeW1ib2wnKSkgewogICAgY29uc3QgbmZ0ID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCduZnQnLCAnbmZ0cycsIHsgc3ltYm9sIH0pOwogICAgaWYgKCFhcGkuYXNzZXJ0KG5mdCAmJiBuZnQuZ3JvdXBCeSAmJiBuZnQuZ3JvdXBCeS5sZW5ndGggPiAwLCAnbWFya2V0IGdyb3VwaW5nIG5vdCBzZXQnKSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gZ2V0IHRoZSBwcmljZSB0b2tlbiBwYXJhbXMKICAgIGNvbnN0IHRva2VuID0gYXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCd0b2tlbnMnLCAndG9rZW5zJywgeyBzeW1ib2w6IHByaWNlU3ltYm9sIH0pOwogICAgaWYgKGFwaS5hc3NlcnQodG9rZW4KICAgICAgJiYgYXBpLkJpZ051bWJlcihwcmljZSkuZ3QoMCkKICAgICAgJiYgY291bnREZWNpbWFscyhwcmljZSkgPD0gdG9rZW4ucHJlY2lzaW9uLCAnaW52YWxpZCBwcmljZScpKSB7CiAgICAgIC8vIGxvY2sgdGhlIE5GVHMgdG8gc2VsbCBieSBtb3ZpbmcgdGhlbSB0byB0aGlzIGNvbnRyYWN0IGZvciBzYWZla2VlcGluZwogICAgICBjb25zdCBuZnRBcnJheSA9IFtdOwogICAgICBjb25zdCB3cmFwcGVkTmZ0cyA9IHsKICAgICAgICBzeW1ib2wsCiAgICAgICAgaWRzOiBuZnRzLAogICAgICB9OwogICAgICBuZnRBcnJheS5wdXNoKHdyYXBwZWROZnRzKTsKICAgICAgY29uc3QgcmVzID0gYXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCduZnQnLCAndHJhbnNmZXInLCB7CiAgICAgICAgZnJvbVR5cGU6ICd1c2VyJywKICAgICAgICB0bzogQ09OVFJBQ1RfTkFNRSwKICAgICAgICB0b1R5cGU6ICdjb250cmFjdCcsCiAgICAgICAgbmZ0czogbmZ0QXJyYXksCiAgICAgICAgaXNTaWduZWRXaXRoQWN0aXZlS2V5LAogICAgICB9KTsKCiAgICAgIC8vIGl0J3MgcG9zc2libGUgdGhhdCBzb21lIHRyYW5zZmVycyBjb3VsZCBoYXZlIGZhaWxlZCBkdWUgdG8gdmFsaWRhdGlvbgogICAgICAvLyBlcnJvcnMgJiB3aGF0bm90LCBzbyB3ZSBuZWVkIHRvIGxvb3Agb3ZlciB0aGUgdHJhbnNmZXIgcmVzdWx0cyBhbmQKICAgICAgLy8gb25seSBjcmVhdGUgbWFya2V0IG9yZGVycyBmb3IgdGhlIHRyYW5zZmVycyB0aGF0IHN1Y2NlZWRlZAogICAgICBpZiAocmVzLmV2ZW50cykgewogICAgICAgIGNvbnN0IGJsb2NrRGF0ZSA9IG5ldyBEYXRlKGAke2FwaS5zdGVlbUJsb2NrVGltZXN0YW1wfS4wMDBaYCk7CiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gYmxvY2tEYXRlLmdldFRpbWUoKTsKICAgICAgICBjb25zdCBmaW5hbFByaWNlID0gYXBpLkJpZ051bWJlcihwcmljZSkudG9GaXhlZCh0b2tlbi5wcmVjaXNpb24pOwogICAgICAgIGNvbnN0IG5mdEludGVnZXJJZExpc3QgPSBbXTsKICAgICAgICBjb25zdCBvcmRlckRhdGFNYXAgPSB7fTsKCiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMuZXZlbnRzLmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICBjb25zdCBldiA9IHJlcy5ldmVudHNbaV07CiAgICAgICAgICBpZiAoZXYuY29udHJhY3QgJiYgZXYuZXZlbnQgJiYgZXYuZGF0YQogICAgICAgICAgICAmJiBldi5jb250cmFjdCA9PT0gJ25mdCcKICAgICAgICAgICAgJiYgZXYuZXZlbnQgPT09ICd0cmFuc2ZlcicKICAgICAgICAgICAgJiYgZXYuZGF0YS5mcm9tID09PSBhcGkuc2VuZGVyCiAgICAgICAgICAgICYmIGV2LmRhdGEuZnJvbVR5cGUgPT09ICd1JwogICAgICAgICAgICAmJiBldi5kYXRhLnRvID09PSBDT05UUkFDVF9OQU1FCiAgICAgICAgICAgICYmIGV2LmRhdGEudG9UeXBlID09PSAnYycKICAgICAgICAgICAgJiYgZXYuZGF0YS5zeW1ib2wgPT09IHN5bWJvbCkgewogICAgICAgICAgICAvLyB0cmFuc2ZlciBpcyB2ZXJpZmllZCwgbm93IHdlIGNhbiBhZGQgYSBtYXJrZXQgb3JkZXIKICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VJZCA9IGV2LmRhdGEuaWQ7CgogICAgICAgICAgICBjb25zdCBvcmRlckRhdGEgPSB7CiAgICAgICAgICAgICAgbmZ0SWQ6IGluc3RhbmNlSWQsCiAgICAgICAgICAgICAgZ3JvdXBpbmc6IHt9LAogICAgICAgICAgICAgIGdyb3VwaW5nS2V5OiAnJywKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY29uc3QgaW50ZWdlcklkID0gYXBpLkJpZ051bWJlcihpbnN0YW5jZUlkKS50b051bWJlcigpOwogICAgICAgICAgICBuZnRJbnRlZ2VySWRMaXN0LnB1c2goaW50ZWdlcklkKTsKICAgICAgICAgICAgb3JkZXJEYXRhTWFwW2ludGVnZXJJZF0gPSBvcmRlckRhdGE7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBxdWVyeSBORlQgaW5zdGFuY2VzIHRvIGNvbnN0cnVjdCB0aGUgZ3JvdXBpbmcKICAgICAgICBjb25zdCBpbnN0YW5jZXMgPSBhd2FpdCBhcGkuZGIuZmluZEluVGFibGUoCiAgICAgICAgICAnbmZ0JywKICAgICAgICAgIGluc3RhbmNlVGFibGVOYW1lLAogICAgICAgICAgewogICAgICAgICAgICBfaWQ6IHsKICAgICAgICAgICAgICAkaW46IG5mdEludGVnZXJJZExpc3QsCiAgICAgICAgICAgIH0sCiAgICAgICAgICB9LAogICAgICAgICAgTUFYX05VTV9VTklUU19PUEVSQUJMRSwKICAgICAgICAgIDAsCiAgICAgICAgICBbeyBpbmRleDogJ19pZCcsIGRlc2NlbmRpbmc6IGZhbHNlIH1dLAogICAgICAgICk7CgogICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5zdGFuY2VzLmxlbmd0aDsgaiArPSAxKSB7CiAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGluc3RhbmNlc1tqXTsKICAgICAgICAgIGNvbnN0IGdyb3VwaW5nID0ge307CiAgICAgICAgICBsZXQgZ3JvdXBpbmdLZXkgPSAnJzsKICAgICAgICAgIG5mdC5ncm91cEJ5LmZvckVhY2goKG5hbWUpID0+IHsKICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BlcnRpZXNbbmFtZV0gIT09IHVuZGVmaW5lZCAmJiBpbnN0YW5jZS5wcm9wZXJ0aWVzW25hbWVdICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgZ3JvdXBpbmdbbmFtZV0gPSBpbnN0YW5jZS5wcm9wZXJ0aWVzW25hbWVdLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZ3JvdXBpbmdbbmFtZV0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBncm91cGluZ0tleSA9IGdyb3VwaW5nS2V5ICsgJzonICsgbmFtZSArICc6JyArIGdyb3VwaW5nW25hbWVdOwogICAgICAgICAgfSk7CiAgICAgICAgICBvcmRlckRhdGFNYXBbaW5zdGFuY2UuX2lkXS5ncm91cGluZyA9IGdyb3VwaW5nOwogICAgICAgICAgb3JkZXJEYXRhTWFwW2luc3RhbmNlLl9pZF0uZ3JvdXBpbmdLZXkgPSBncm91cGluZ0tleTsKICAgICAgICB9CgogICAgICAgIC8vIGNyZWF0ZSB0aGUgb3JkZXJzCiAgICAgICAgY29uc3QgZ3JvdXBpbmdNYXAgPSB7fTsKICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG5mdEludGVnZXJJZExpc3QubGVuZ3RoOyBrICs9IDEpIHsKICAgICAgICAgIGNvbnN0IGludElkID0gbmZ0SW50ZWdlcklkTGlzdFtrXTsKICAgICAgICAgIGNvbnN0IG9yZGVySW5mbyA9IG9yZGVyRGF0YU1hcFtpbnRJZF07CiAgICAgICAgICBjb25zdCBvcmRlciA9IHsKICAgICAgICAgICAgYWNjb3VudDogYXBpLnNlbmRlciwKICAgICAgICAgICAgb3duZWRCeTogJ3UnLAogICAgICAgICAgICBuZnRJZDogb3JkZXJJbmZvLm5mdElkLAogICAgICAgICAgICBncm91cGluZzogb3JkZXJJbmZvLmdyb3VwaW5nLAogICAgICAgICAgICB0aW1lc3RhbXAsCiAgICAgICAgICAgIHByaWNlOiBmaW5hbFByaWNlLAogICAgICAgICAgICBwcmljZURlYzogeyAkbnVtYmVyRGVjaW1hbDogZmluYWxQcmljZSB9LAogICAgICAgICAgICBwcmljZVN5bWJvbCwKICAgICAgICAgICAgZmVlLAogICAgICAgICAgfTsKCiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhcGkuZGIuaW5zZXJ0KG1hcmtldFRhYmxlTmFtZSwgb3JkZXIpOwoKICAgICAgICAgIGFwaS5lbWl0KCdzZWxsT3JkZXInLCB7CiAgICAgICAgICAgIGFjY291bnQ6IG9yZGVyLmFjY291bnQsCiAgICAgICAgICAgIG93bmVkQnk6IG9yZGVyLm93bmVkQnksCiAgICAgICAgICAgIHN5bWJvbCwKICAgICAgICAgICAgbmZ0SWQ6IG9yZGVyLm5mdElkLAogICAgICAgICAgICB0aW1lc3RhbXAsCiAgICAgICAgICAgIHByaWNlOiBvcmRlci5wcmljZSwKICAgICAgICAgICAgcHJpY2VTeW1ib2w6IG9yZGVyLnByaWNlU3ltYm9sLAogICAgICAgICAgICBmZWUsCiAgICAgICAgICAgIG9yZGVySWQ6IHJlc3VsdC5faWQsCiAgICAgICAgICB9KTsKCiAgICAgICAgICBjb25zdCBncm91cEluZm8gPSBvcmRlckluZm8uZ3JvdXBpbmdLZXkgaW4gZ3JvdXBpbmdNYXAKICAgICAgICAgICAgPyBncm91cGluZ01hcFtvcmRlckluZm8uZ3JvdXBpbmdLZXldCiAgICAgICAgICAgIDogewogICAgICAgICAgICAgIGdyb3VwaW5nOiBvcmRlckluZm8uZ3JvdXBpbmcsCiAgICAgICAgICAgICAgaXNJbkNvbGxlY3Rpb246IGZhbHNlLAogICAgICAgICAgICAgIGNvdW50OiAwLAogICAgICAgICAgICB9OwogICAgICAgICAgZ3JvdXBJbmZvLmNvdW50ICs9IDE7CiAgICAgICAgICBncm91cGluZ01hcFtvcmRlckluZm8uZ3JvdXBpbmdLZXldID0gZ3JvdXBJbmZvOwogICAgICAgIH0KCiAgICAgICAgLy8gdXBkYXRlIG9wZW4gaW50ZXJlc3QgbWV0cmljcwogICAgICAgIGF3YWl0IHVwZGF0ZU9wZW5JbnRlcmVzdCgnc2VsbCcsIHN5bWJvbCwgcHJpY2VTeW1ib2wsIGdyb3VwaW5nTWFwLCBuZnQuZ3JvdXBCeSk7CiAgICAgIH0KICAgIH0KICB9Cn07Cg=="
}
}
}